; 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 }