diff --git a/llvm/test/Transforms/LoopUnroll/revert-D110922.ll b/llvm/test/Transforms/LoopUnroll/revert-D110922.ll new file mode 100644 index 00000000000000..e28a4178f0b8e7 --- /dev/null +++ b/llvm/test/Transforms/LoopUnroll/revert-D110922.ll @@ -0,0 +1,141 @@ +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py +; ModuleID = 'reduced.ll' +; RUN: opt < %s -loop-unroll -verify-loop-lcssa -S | FileCheck %s + +source_filename = "reduced.ll" + +%"class.std::__Cr::basic_ostream" = type { i32 (...)**, %"class.std::__Cr::basic_ios" } +%"class.std::__Cr::basic_ios" = type { %"class.std::__Cr::ios_base", %"class.std::__Cr::basic_ostream"*, i32 } +%"class.std::__Cr::ios_base" = type { i32 (...)**, i32, i32, i32, i32, i32, i8*, i8*, void (i32, %"class.std::__Cr::ios_base"*, i32)**, i32*, i32, i32, i32*, i32, i32, i8**, i32, i32 } +%"class.v8::internal::wasm::StructType" = type { i32, i32*, %"class.v8::internal::wasm::ValueType"*, i8* } +%"class.v8::internal::wasm::ValueType" = type { i32 } + +$_ZNK2v88internal4wasm10StructType12field_offsetEj = comdat any + +declare hidden %"class.std::__Cr::basic_ostream"* @_ZNSt4__CrlsINS_11char_traitsIcEEEERNS_13basic_ostreamIcT_EES6_PKc() local_unnamed_addr + +define hidden void @_ZN2v88internal10WasmStruct15WasmStructPrintERNSt4__Cr13basic_ostreamIcNS2_11char_traitsIcEEEE() local_unnamed_addr align 2 { +; CHECK-LABEL: @_ZN2v88internal10WasmStruct15WasmStructPrintERNSt4__Cr13basic_ostreamIcNS2_11char_traitsIcEEEE( +; CHECK-NEXT: entry: +; CHECK-NEXT: [[CALL61:%.*]] = tail call i32 @_ZNK2v88internal4wasm10StructType11field_countEv() +; CHECK-NEXT: [[CMP2_NOT:%.*]] = icmp eq i32 [[CALL61]], 0 +; CHECK-NEXT: br i1 [[CMP2_NOT]], label [[FOR_COND_CLEANUP:%.*]], label [[FOR_BODY_PREHEADER:%.*]] +; CHECK: for.body.preheader: +; CHECK-NEXT: br label [[FOR_BODY_PEEL_BEGIN:%.*]] +; CHECK: for.body.peel.begin: +; CHECK-NEXT: br label [[FOR_BODY_PEEL:%.*]] +; CHECK: for.body.peel: +; CHECK-NEXT: tail call void @llvm.assume(i1 true) +; CHECK-NEXT: [[CALL13_PEEL:%.*]] = tail call i8 @_ZNK2v88internal4wasm9ValueType4kindEv() +; CHECK-NEXT: switch i8 [[CALL13_PEEL]], label [[FOR_INC_PEEL:%.*]] [ +; CHECK-NEXT: i8 5, label [[SW_BB33_PEEL:%.*]] +; CHECK-NEXT: i8 9, label [[SW_BB31:%.*]] +; CHECK-NEXT: i8 8, label [[SW_BB31]] +; CHECK-NEXT: i8 11, label [[SW_BB31]] +; CHECK-NEXT: i8 10, label [[SW_BB31]] +; CHECK-NEXT: ] +; CHECK: sw.bb33.peel: +; CHECK-NEXT: [[CALL34_PEEL:%.*]] = tail call %"class.std::__Cr::basic_ostream"* @_ZNSt4__CrlsINS_11char_traitsIcEEEERNS_13basic_ostreamIcT_EES6_PKc() +; CHECK-NEXT: br label [[FOR_INC_PEEL]] +; CHECK: for.inc.peel: +; CHECK-NEXT: [[CALL6_PEEL:%.*]] = tail call i32 @_ZNK2v88internal4wasm10StructType11field_countEv() +; CHECK-NEXT: [[CMP_PEEL:%.*]] = icmp ugt i32 [[CALL6_PEEL]], 1 +; CHECK-NEXT: br i1 [[CMP_PEEL]], label [[FOR_BODY_PEEL_NEXT:%.*]], label [[FOR_COND_CLEANUP_LOOPEXIT:%.*]] +; CHECK: for.body.peel.next: +; CHECK-NEXT: br label [[FOR_BODY_PEEL_NEXT1:%.*]] +; CHECK: for.body.peel.next1: +; CHECK-NEXT: br label [[FOR_BODY_PREHEADER_PEEL_NEWPH:%.*]] +; CHECK: for.body.preheader.peel.newph: +; CHECK-NEXT: br label [[FOR_BODY:%.*]] +; CHECK: for.cond.cleanup.loopexit.loopexit: +; CHECK-NEXT: br label [[FOR_COND_CLEANUP_LOOPEXIT]] +; CHECK: for.cond.cleanup.loopexit: +; CHECK-NEXT: br label [[FOR_COND_CLEANUP]] +; CHECK: for.cond.cleanup: +; CHECK-NEXT: ret void +; CHECK: for.body: +; CHECK-NEXT: tail call void @llvm.assume(i1 false) +; CHECK-NEXT: [[CALL13:%.*]] = tail call i8 @_ZNK2v88internal4wasm9ValueType4kindEv() +; CHECK-NEXT: switch i8 [[CALL13]], label [[FOR_INC:%.*]] [ +; CHECK-NEXT: i8 5, label [[SW_BB33:%.*]] +; CHECK-NEXT: i8 9, label [[SW_BB31_LOOPEXIT:%.*]] +; CHECK-NEXT: i8 8, label [[SW_BB31_LOOPEXIT]] +; CHECK-NEXT: i8 11, label [[SW_BB31_LOOPEXIT]] +; CHECK-NEXT: i8 10, label [[SW_BB31_LOOPEXIT]] +; CHECK-NEXT: ] +; CHECK: sw.bb31.loopexit: +; CHECK-NEXT: br label [[SW_BB31]] +; CHECK: sw.bb31: +; CHECK-NEXT: tail call void @_ZN2v84baseL18ReadUnalignedValueINS_8internal6ObjectEEET_j() +; CHECK-NEXT: unreachable +; CHECK: sw.bb33: +; CHECK-NEXT: [[CALL34:%.*]] = tail call %"class.std::__Cr::basic_ostream"* @_ZNSt4__CrlsINS_11char_traitsIcEEEERNS_13basic_ostreamIcT_EES6_PKc() +; CHECK-NEXT: br label [[FOR_INC]] +; CHECK: for.inc: +; CHECK-NEXT: [[CALL6:%.*]] = tail call i32 @_ZNK2v88internal4wasm10StructType11field_countEv() +; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i32 [[CALL6]], 1 +; CHECK-NEXT: br i1 [[CMP]], label [[FOR_BODY]], label [[FOR_COND_CLEANUP_LOOPEXIT_LOOPEXIT:%.*]], !llvm.loop [[LOOP0:![0-9]+]] +; +entry: + %call61 = tail call i32 @_ZNK2v88internal4wasm10StructType11field_countEv() + %cmp2.not = icmp eq i32 %call61, 0 + br i1 %cmp2.not, label %for.cond.cleanup, label %for.body.preheader + +for.body.preheader: ; preds = %entry + br label %for.body + +for.cond.cleanup.loopexit: ; preds = %for.inc + br label %for.cond.cleanup + +for.cond.cleanup: ; preds = %for.cond.cleanup.loopexit, %entry + ret void + +for.body: ; preds = %for.body.preheader, %for.inc + %cmp.i3 = phi i1 [ false, %for.inc ], [ true, %for.body.preheader ] + tail call void @llvm.assume(i1 %cmp.i3) + %call13 = tail call i8 @_ZNK2v88internal4wasm9ValueType4kindEv() + switch i8 %call13, label %for.inc [ + i8 5, label %sw.bb33 + i8 9, label %sw.bb31 + i8 8, label %sw.bb31 + i8 11, label %sw.bb31 + i8 10, label %sw.bb31 + ] + +sw.bb31: ; preds = %for.body, %for.body, %for.body, %for.body + tail call void @_ZN2v84baseL18ReadUnalignedValueINS_8internal6ObjectEEET_j() + unreachable + +sw.bb33: ; preds = %for.body + %call34 = tail call %"class.std::__Cr::basic_ostream"* @_ZNSt4__CrlsINS_11char_traitsIcEEEERNS_13basic_ostreamIcT_EES6_PKc() + br label %for.inc + +for.inc: ; preds = %for.body, %sw.bb33 + %call6 = tail call i32 @_ZNK2v88internal4wasm10StructType11field_countEv() + %cmp = icmp ugt i32 %call6, 1 + br i1 %cmp, label %for.body, label %for.cond.cleanup.loopexit +} + +declare hidden i32 @_ZNK2v88internal4wasm10StructType11field_countEv() local_unnamed_addr align 2 + +define linkonce_odr hidden i32 @_ZNK2v88internal4wasm10StructType12field_offsetEj(%"class.v8::internal::wasm::StructType"* %this, i32 %index) local_unnamed_addr comdat align 2 { +; CHECK-LABEL: @_ZNK2v88internal4wasm10StructType12field_offsetEj( +; CHECK-NEXT: entry: +; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[INDEX:%.*]], 0 +; CHECK-NEXT: tail call void @llvm.assume(i1 [[CMP]]) +; CHECK-NEXT: ret i32 undef +; +entry: + %cmp = icmp eq i32 %index, 0 + tail call void @llvm.assume(i1 %cmp) + ret i32 undef +} + +declare hidden i8 @_ZNK2v88internal4wasm9ValueType4kindEv() local_unnamed_addr align 2 + +declare void @_ZN2v84baseL18ReadUnalignedValueINS_8internal6ObjectEEET_j() local_unnamed_addr + +; Function Attrs: inaccessiblememonly nofree nosync nounwind willreturn +declare void @llvm.assume(i1 noundef) #0 + +attributes #0 = { inaccessiblememonly nofree nosync nounwind willreturn }