1586 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt < %s -passes=loop-vectorize -mtriple=x86_64-apple-macosx10.8.0 -mcpu=corei7-avx -S | FileCheck %s3 4target triple = "x86_64-apple-macosx10.8.0"5 6; Test case for https://github.com/llvm/llvm-project/issues/156091.7define void @test_replicate_call_chain(float %x, ptr noalias %A, ptr noalias %B, ptr align 4 noalias %C, ptr align 4 noalias %D, ptr noalias %E) #0 {8; CHECK-LABEL: @test_replicate_call_chain(9; CHECK-NEXT: entry:10; CHECK-NEXT: br label [[VECTOR_PH:%.*]]11; CHECK: vector.ph:12; CHECK-NEXT: br label [[VECTOR_BODY:%.*]]13; CHECK: vector.body:14; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ]15; CHECK-NEXT: [[TMP0:%.*]] = add i64 [[INDEX]], 116; CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds float, ptr [[A:%.*]], i64 [[INDEX]]17; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <16 x float>, ptr [[TMP1]], align 418; CHECK-NEXT: [[TMP2:%.*]] = fcmp ogt <16 x float> [[WIDE_LOAD]], zeroinitializer19; CHECK-NEXT: [[TMP3:%.*]] = getelementptr inbounds float, ptr [[B:%.*]], i64 [[INDEX]]20; CHECK-NEXT: [[WIDE_LOAD1:%.*]] = load <16 x float>, ptr [[TMP3]], align 421; CHECK-NEXT: [[TMP4:%.*]] = fcmp ogt <16 x float> [[WIDE_LOAD1]], zeroinitializer22; CHECK-NEXT: [[TMP5:%.*]] = getelementptr float, ptr [[C:%.*]], i64 [[TMP0]]23; CHECK-NEXT: [[TMP6:%.*]] = and <16 x i1> [[TMP2]], [[TMP4]]24; CHECK-NEXT: [[TMP7:%.*]] = xor <16 x i1> [[TMP6]], splat (i1 true)25; CHECK-NEXT: [[TMP8:%.*]] = shl i64 [[INDEX]], 226; CHECK-NEXT: [[TMP9:%.*]] = getelementptr i8, ptr [[D:%.*]], i64 [[TMP8]]27; CHECK-NEXT: [[WIDE_MASKED_LOAD:%.*]] = call <16 x float> @llvm.masked.load.v16f32.p0(ptr align 4 [[TMP9]], <16 x i1> [[TMP7]], <16 x float> poison)28; CHECK-NEXT: [[TMP10:%.*]] = fmul <16 x float> [[WIDE_MASKED_LOAD]], splat (float 2.000000e+00)29; CHECK-NEXT: [[TMP11:%.*]] = extractelement <16 x float> [[TMP10]], i32 030; CHECK-NEXT: [[TMP13:%.*]] = extractelement <16 x float> [[TMP10]], i32 131; CHECK-NEXT: [[TMP15:%.*]] = extractelement <16 x float> [[TMP10]], i32 232; CHECK-NEXT: [[TMP17:%.*]] = extractelement <16 x float> [[TMP10]], i32 333; CHECK-NEXT: [[TMP19:%.*]] = extractelement <16 x float> [[TMP10]], i32 434; CHECK-NEXT: [[TMP21:%.*]] = extractelement <16 x float> [[TMP10]], i32 535; CHECK-NEXT: [[TMP23:%.*]] = extractelement <16 x float> [[TMP10]], i32 636; CHECK-NEXT: [[TMP25:%.*]] = extractelement <16 x float> [[TMP10]], i32 737; CHECK-NEXT: [[TMP27:%.*]] = extractelement <16 x float> [[TMP10]], i32 838; CHECK-NEXT: [[TMP29:%.*]] = extractelement <16 x float> [[TMP10]], i32 939; CHECK-NEXT: [[TMP31:%.*]] = extractelement <16 x float> [[TMP10]], i32 1040; CHECK-NEXT: [[TMP33:%.*]] = extractelement <16 x float> [[TMP10]], i32 1141; CHECK-NEXT: [[TMP35:%.*]] = extractelement <16 x float> [[TMP10]], i32 1242; CHECK-NEXT: [[TMP37:%.*]] = extractelement <16 x float> [[TMP10]], i32 1343; CHECK-NEXT: [[TMP39:%.*]] = extractelement <16 x float> [[TMP10]], i32 1444; CHECK-NEXT: [[TMP41:%.*]] = extractelement <16 x float> [[TMP10]], i32 1545; CHECK-NEXT: [[TMP12:%.*]] = tail call float @llvm.pow.f32(float [[TMP11]], float [[X:%.*]])46; CHECK-NEXT: [[TMP14:%.*]] = tail call float @llvm.pow.f32(float [[TMP13]], float [[X]])47; CHECK-NEXT: [[TMP16:%.*]] = tail call float @llvm.pow.f32(float [[TMP15]], float [[X]])48; CHECK-NEXT: [[TMP18:%.*]] = tail call float @llvm.pow.f32(float [[TMP17]], float [[X]])49; CHECK-NEXT: [[TMP20:%.*]] = tail call float @llvm.pow.f32(float [[TMP19]], float [[X]])50; CHECK-NEXT: [[TMP22:%.*]] = tail call float @llvm.pow.f32(float [[TMP21]], float [[X]])51; CHECK-NEXT: [[TMP24:%.*]] = tail call float @llvm.pow.f32(float [[TMP23]], float [[X]])52; CHECK-NEXT: [[TMP26:%.*]] = tail call float @llvm.pow.f32(float [[TMP25]], float [[X]])53; CHECK-NEXT: [[TMP28:%.*]] = tail call float @llvm.pow.f32(float [[TMP27]], float [[X]])54; CHECK-NEXT: [[TMP30:%.*]] = tail call float @llvm.pow.f32(float [[TMP29]], float [[X]])55; CHECK-NEXT: [[TMP32:%.*]] = tail call float @llvm.pow.f32(float [[TMP31]], float [[X]])56; CHECK-NEXT: [[TMP34:%.*]] = tail call float @llvm.pow.f32(float [[TMP33]], float [[X]])57; CHECK-NEXT: [[TMP36:%.*]] = tail call float @llvm.pow.f32(float [[TMP35]], float [[X]])58; CHECK-NEXT: [[TMP38:%.*]] = tail call float @llvm.pow.f32(float [[TMP37]], float [[X]])59; CHECK-NEXT: [[TMP40:%.*]] = tail call float @llvm.pow.f32(float [[TMP39]], float [[X]])60; CHECK-NEXT: [[TMP42:%.*]] = tail call float @llvm.pow.f32(float [[TMP41]], float [[X]])61; CHECK-NEXT: [[TMP43:%.*]] = tail call float @llvm.pow.f32(float [[TMP12]], float [[X]])62; CHECK-NEXT: [[TMP44:%.*]] = tail call float @llvm.pow.f32(float [[TMP14]], float [[X]])63; CHECK-NEXT: [[TMP45:%.*]] = tail call float @llvm.pow.f32(float [[TMP16]], float [[X]])64; CHECK-NEXT: [[TMP46:%.*]] = tail call float @llvm.pow.f32(float [[TMP18]], float [[X]])65; CHECK-NEXT: [[TMP47:%.*]] = tail call float @llvm.pow.f32(float [[TMP20]], float [[X]])66; CHECK-NEXT: [[TMP48:%.*]] = tail call float @llvm.pow.f32(float [[TMP22]], float [[X]])67; CHECK-NEXT: [[TMP49:%.*]] = tail call float @llvm.pow.f32(float [[TMP24]], float [[X]])68; CHECK-NEXT: [[TMP50:%.*]] = tail call float @llvm.pow.f32(float [[TMP26]], float [[X]])69; CHECK-NEXT: [[TMP51:%.*]] = tail call float @llvm.pow.f32(float [[TMP28]], float [[X]])70; CHECK-NEXT: [[TMP52:%.*]] = tail call float @llvm.pow.f32(float [[TMP30]], float [[X]])71; CHECK-NEXT: [[TMP53:%.*]] = tail call float @llvm.pow.f32(float [[TMP32]], float [[X]])72; CHECK-NEXT: [[TMP54:%.*]] = tail call float @llvm.pow.f32(float [[TMP34]], float [[X]])73; CHECK-NEXT: [[TMP55:%.*]] = tail call float @llvm.pow.f32(float [[TMP36]], float [[X]])74; CHECK-NEXT: [[TMP56:%.*]] = tail call float @llvm.pow.f32(float [[TMP38]], float [[X]])75; CHECK-NEXT: [[TMP57:%.*]] = tail call float @llvm.pow.f32(float [[TMP40]], float [[X]])76; CHECK-NEXT: [[TMP58:%.*]] = tail call float @llvm.pow.f32(float [[TMP42]], float [[X]])77; CHECK-NEXT: [[TMP59:%.*]] = insertelement <16 x float> poison, float [[TMP43]], i32 078; CHECK-NEXT: [[TMP60:%.*]] = insertelement <16 x float> [[TMP59]], float [[TMP44]], i32 179; CHECK-NEXT: [[TMP61:%.*]] = insertelement <16 x float> [[TMP60]], float [[TMP45]], i32 280; CHECK-NEXT: [[TMP62:%.*]] = insertelement <16 x float> [[TMP61]], float [[TMP46]], i32 381; CHECK-NEXT: [[TMP63:%.*]] = insertelement <16 x float> [[TMP62]], float [[TMP47]], i32 482; CHECK-NEXT: [[TMP64:%.*]] = insertelement <16 x float> [[TMP63]], float [[TMP48]], i32 583; CHECK-NEXT: [[TMP65:%.*]] = insertelement <16 x float> [[TMP64]], float [[TMP49]], i32 684; CHECK-NEXT: [[TMP66:%.*]] = insertelement <16 x float> [[TMP65]], float [[TMP50]], i32 785; CHECK-NEXT: [[TMP67:%.*]] = insertelement <16 x float> [[TMP66]], float [[TMP51]], i32 886; CHECK-NEXT: [[TMP68:%.*]] = insertelement <16 x float> [[TMP67]], float [[TMP52]], i32 987; CHECK-NEXT: [[TMP69:%.*]] = insertelement <16 x float> [[TMP68]], float [[TMP53]], i32 1088; CHECK-NEXT: [[TMP70:%.*]] = insertelement <16 x float> [[TMP69]], float [[TMP54]], i32 1189; CHECK-NEXT: [[TMP71:%.*]] = insertelement <16 x float> [[TMP70]], float [[TMP55]], i32 1290; CHECK-NEXT: [[TMP72:%.*]] = insertelement <16 x float> [[TMP71]], float [[TMP56]], i32 1391; CHECK-NEXT: [[TMP73:%.*]] = insertelement <16 x float> [[TMP72]], float [[TMP57]], i32 1492; CHECK-NEXT: [[TMP74:%.*]] = insertelement <16 x float> [[TMP73]], float [[TMP58]], i32 1593; CHECK-NEXT: call void @llvm.masked.store.v16f32.p0(<16 x float> [[TMP74]], ptr align 4 [[TMP5]], <16 x i1> [[TMP7]])94; CHECK-NEXT: call void @llvm.masked.store.v16f32.p0(<16 x float> zeroinitializer, ptr align 4 [[TMP5]], <16 x i1> [[TMP6]])95; CHECK-NEXT: store float 0.000000e+00, ptr [[E:%.*]], align 496; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 1697; CHECK-NEXT: [[TMP75:%.*]] = icmp eq i64 [[INDEX_NEXT]], 9698; CHECK-NEXT: br i1 [[TMP75]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP0:![0-9]+]]99; CHECK: middle.block:100; CHECK-NEXT: br label [[SCALAR_PH:%.*]]101; CHECK: scalar.ph:102; CHECK-NEXT: br label [[LOOP_HEADER:%.*]]103; CHECK: loop.header:104; CHECK-NEXT: [[IV:%.*]] = phi i64 [ 96, [[SCALAR_PH]] ], [ [[IV_NEXT:%.*]], [[LOOP_LATCH:%.*]] ]105; CHECK-NEXT: [[DEC_IV:%.*]] = phi i64 [ 4, [[SCALAR_PH]] ], [ [[DEC_IV_NEXT:%.*]], [[LOOP_LATCH]] ]106; CHECK-NEXT: [[IV_INC:%.*]] = add i64 [[IV]], 1107; CHECK-NEXT: [[GEP_A:%.*]] = getelementptr inbounds float, ptr [[A]], i64 [[IV]]108; CHECK-NEXT: [[L_A:%.*]] = load float, ptr [[GEP_A]], align 4109; CHECK-NEXT: [[C_A:%.*]] = fcmp ogt float [[L_A]], 0.000000e+00110; CHECK-NEXT: [[GEP_B:%.*]] = getelementptr inbounds float, ptr [[B]], i64 [[IV]]111; CHECK-NEXT: [[L_B:%.*]] = load float, ptr [[GEP_B]], align 4112; CHECK-NEXT: [[C_B:%.*]] = fcmp ogt float [[L_B]], 0.000000e+00113; CHECK-NEXT: [[GEP_C:%.*]] = getelementptr float, ptr [[C]], i64 [[IV_INC]]114; CHECK-NEXT: [[AND:%.*]] = and i1 [[C_A]], [[C_B]]115; CHECK-NEXT: br i1 [[AND]], label [[THEN:%.*]], label [[ELSE:%.*]]116; CHECK: then:117; CHECK-NEXT: store float 0.000000e+00, ptr [[GEP_C]], align 4118; CHECK-NEXT: br label [[LOOP_LATCH]]119; CHECK: else:120; CHECK-NEXT: [[IV_MUL_2:%.*]] = shl i64 [[IV]], 2121; CHECK-NEXT: [[GEP_D:%.*]] = getelementptr i8, ptr [[D]], i64 [[IV_MUL_2]]122; CHECK-NEXT: [[L_D:%.*]] = load float, ptr [[GEP_D]], align 4123; CHECK-NEXT: [[MUL:%.*]] = fmul float [[L_D]], 2.000000e+00124; CHECK-NEXT: [[POW_1:%.*]] = tail call float @llvm.pow.f32(float [[MUL]], float [[X]])125; CHECK-NEXT: [[POW_2:%.*]] = tail call float @llvm.pow.f32(float [[POW_1]], float [[X]])126; CHECK-NEXT: store float [[POW_2]], ptr [[GEP_C]], align 4127; CHECK-NEXT: br label [[LOOP_LATCH]]128; CHECK: loop.latch:129; CHECK-NEXT: store float 0.000000e+00, ptr [[E]], align 4130; CHECK-NEXT: [[IV_NEXT]] = add i64 [[IV]], 1131; CHECK-NEXT: [[DEC_IV_NEXT]] = add i64 [[DEC_IV]], -1132; CHECK-NEXT: [[EC:%.*]] = icmp ne i64 [[DEC_IV_NEXT]], 0133; CHECK-NEXT: br i1 [[EC]], label [[LOOP_HEADER]], label [[EXIT:%.*]], !llvm.loop [[LOOP3:![0-9]+]]134; CHECK: exit:135; CHECK-NEXT: ret void136;137entry:138 br label %loop.header139 140loop.header:141 %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop.latch ]142 %dec.iv = phi i64 [ 100, %entry ], [ %dec.iv.next, %loop.latch ]143 %iv.inc = add i64 %iv, 1144 %gep.A = getelementptr inbounds float, ptr %A, i64 %iv145 %l.A = load float, ptr %gep.A, align 4146 %c.A = fcmp ogt float %l.A, 0.0147 %gep.B = getelementptr inbounds float, ptr %B, i64 %iv148 %l.B = load float, ptr %gep.B, align 4149 %c.B = fcmp ogt float %l.B, 0.0150 %gep.C = getelementptr float, ptr %C, i64 %iv.inc151 %and = and i1 %c.A, %c.B152 br i1 %and, label %then, label %else153 154then:155 store float 0.0, ptr %gep.C, align 4156 br label %loop.latch157 158else:159 %iv.mul.2 = shl i64 %iv, 2160 %gep.D = getelementptr i8, ptr %D, i64 %iv.mul.2161 %l.D = load float, ptr %gep.D, align 4162 %mul = fmul float %l.D, 2.0163 %pow.1 = tail call float @llvm.pow.f32(float %mul, float %x)164 %pow.2 = tail call float @llvm.pow.f32(float %pow.1, float %x)165 store float %pow.2, ptr %gep.C, align 4166 br label %loop.latch167 168loop.latch:169 store float 0.000000e+00, ptr %E, align 4170 %iv.next = add i64 %iv, 1171 %dec.iv.next = add i64 %dec.iv, -1172 %ec = icmp ne i64 %dec.iv.next, 0173 br i1 %ec, label %loop.header, label %exit174 175exit:176 ret void177}178 179define i64 @avx512_cond_load_cost(ptr %src, i32 %a, i64 %b, i32 %c, i32 %d) #1 {180; CHECK-LABEL: @avx512_cond_load_cost(181; CHECK-NEXT: entry:182; CHECK-NEXT: [[TMP63:%.*]] = add i32 [[C:%.*]], 1183; CHECK-NEXT: [[MIN_ITERS_CHECK:%.*]] = icmp ult i32 [[TMP63]], 8184; CHECK-NEXT: br i1 [[MIN_ITERS_CHECK]], label [[SCALAR_PH:%.*]], label [[ENTRY:%.*]]185; CHECK: vector.ph:186; CHECK-NEXT: [[N_MOD_VF:%.*]] = urem i32 [[TMP63]], 8187; CHECK-NEXT: [[N_VEC:%.*]] = sub i32 [[TMP63]], [[N_MOD_VF]]188; CHECK-NEXT: [[BROADCAST_SPLATINSERT:%.*]] = insertelement <8 x i64> poison, i64 [[B:%.*]], i64 0189; CHECK-NEXT: [[BROADCAST_SPLAT:%.*]] = shufflevector <8 x i64> [[BROADCAST_SPLATINSERT]], <8 x i64> poison, <8 x i32> zeroinitializer190; CHECK-NEXT: br label [[LOOP_HEADER:%.*]]191; CHECK: vector.body:192; CHECK-NEXT: [[IV:%.*]] = phi i32 [ 0, [[ENTRY]] ], [ [[IV_NEXT:%.*]], [[LOOP_LATCH:%.*]] ]193; CHECK-NEXT: [[VEC_IND:%.*]] = phi <8 x i32> [ <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>, [[ENTRY]] ], [ [[VEC_IND_NEXT:%.*]], [[LOOP_LATCH]] ]194; CHECK-NEXT: [[TMP1:%.*]] = icmp slt <8 x i32> [[VEC_IND]], zeroinitializer195; CHECK-NEXT: [[TMP2:%.*]] = extractelement <8 x i1> [[TMP1]], i32 0196; CHECK-NEXT: br i1 [[TMP2]], label [[PRED_UREM_IF:%.*]], label [[PRED_UREM_CONTINUE:%.*]]197; CHECK: pred.urem.if:198; CHECK-NEXT: [[TMP3:%.*]] = urem i32 [[A:%.*]], [[C]]199; CHECK-NEXT: [[TMP4:%.*]] = insertelement <8 x i32> poison, i32 [[TMP3]], i32 0200; CHECK-NEXT: br label [[PRED_UREM_CONTINUE]]201; CHECK: pred.urem.continue:202; CHECK-NEXT: [[TMP5:%.*]] = phi <8 x i32> [ poison, [[LOOP_HEADER]] ], [ [[TMP4]], [[PRED_UREM_IF]] ]203; CHECK-NEXT: [[TMP6:%.*]] = extractelement <8 x i1> [[TMP1]], i32 1204; CHECK-NEXT: br i1 [[TMP6]], label [[PRED_UREM_IF1:%.*]], label [[PRED_UREM_CONTINUE2:%.*]]205; CHECK: pred.urem.if1:206; CHECK-NEXT: [[TMP7:%.*]] = urem i32 [[A]], [[C]]207; CHECK-NEXT: [[TMP8:%.*]] = insertelement <8 x i32> [[TMP5]], i32 [[TMP7]], i32 1208; CHECK-NEXT: br label [[PRED_UREM_CONTINUE2]]209; CHECK: pred.urem.continue2:210; CHECK-NEXT: [[TMP9:%.*]] = phi <8 x i32> [ [[TMP5]], [[PRED_UREM_CONTINUE]] ], [ [[TMP8]], [[PRED_UREM_IF1]] ]211; CHECK-NEXT: [[TMP10:%.*]] = extractelement <8 x i1> [[TMP1]], i32 2212; CHECK-NEXT: br i1 [[TMP10]], label [[PRED_UREM_IF3:%.*]], label [[PRED_UREM_CONTINUE4:%.*]]213; CHECK: pred.urem.if3:214; CHECK-NEXT: [[TMP11:%.*]] = urem i32 [[A]], [[C]]215; CHECK-NEXT: [[TMP12:%.*]] = insertelement <8 x i32> [[TMP9]], i32 [[TMP11]], i32 2216; CHECK-NEXT: br label [[PRED_UREM_CONTINUE4]]217; CHECK: pred.urem.continue4:218; CHECK-NEXT: [[TMP13:%.*]] = phi <8 x i32> [ [[TMP9]], [[PRED_UREM_CONTINUE2]] ], [ [[TMP12]], [[PRED_UREM_IF3]] ]219; CHECK-NEXT: [[TMP14:%.*]] = extractelement <8 x i1> [[TMP1]], i32 3220; CHECK-NEXT: br i1 [[TMP14]], label [[PRED_UREM_IF5:%.*]], label [[PRED_UREM_CONTINUE6:%.*]]221; CHECK: pred.urem.if5:222; CHECK-NEXT: [[TMP15:%.*]] = urem i32 [[A]], [[C]]223; CHECK-NEXT: [[TMP16:%.*]] = insertelement <8 x i32> [[TMP13]], i32 [[TMP15]], i32 3224; CHECK-NEXT: br label [[PRED_UREM_CONTINUE6]]225; CHECK: pred.urem.continue6:226; CHECK-NEXT: [[TMP17:%.*]] = phi <8 x i32> [ [[TMP13]], [[PRED_UREM_CONTINUE4]] ], [ [[TMP16]], [[PRED_UREM_IF5]] ]227; CHECK-NEXT: [[TMP18:%.*]] = extractelement <8 x i1> [[TMP1]], i32 4228; CHECK-NEXT: br i1 [[TMP18]], label [[PRED_UREM_IF7:%.*]], label [[PRED_UREM_CONTINUE8:%.*]]229; CHECK: pred.urem.if7:230; CHECK-NEXT: [[TMP19:%.*]] = urem i32 [[A]], [[C]]231; CHECK-NEXT: [[TMP20:%.*]] = insertelement <8 x i32> [[TMP17]], i32 [[TMP19]], i32 4232; CHECK-NEXT: br label [[PRED_UREM_CONTINUE8]]233; CHECK: pred.urem.continue8:234; CHECK-NEXT: [[TMP21:%.*]] = phi <8 x i32> [ [[TMP17]], [[PRED_UREM_CONTINUE6]] ], [ [[TMP20]], [[PRED_UREM_IF7]] ]235; CHECK-NEXT: [[TMP22:%.*]] = extractelement <8 x i1> [[TMP1]], i32 5236; CHECK-NEXT: br i1 [[TMP22]], label [[PRED_UREM_IF9:%.*]], label [[PRED_UREM_CONTINUE10:%.*]]237; CHECK: pred.urem.if9:238; CHECK-NEXT: [[TMP23:%.*]] = urem i32 [[A]], [[C]]239; CHECK-NEXT: [[TMP24:%.*]] = insertelement <8 x i32> [[TMP21]], i32 [[TMP23]], i32 5240; CHECK-NEXT: br label [[PRED_UREM_CONTINUE10]]241; CHECK: pred.urem.continue10:242; CHECK-NEXT: [[TMP25:%.*]] = phi <8 x i32> [ [[TMP21]], [[PRED_UREM_CONTINUE8]] ], [ [[TMP24]], [[PRED_UREM_IF9]] ]243; CHECK-NEXT: [[TMP26:%.*]] = extractelement <8 x i1> [[TMP1]], i32 6244; CHECK-NEXT: br i1 [[TMP26]], label [[PRED_UREM_IF11:%.*]], label [[PRED_UREM_CONTINUE12:%.*]]245; CHECK: pred.urem.if11:246; CHECK-NEXT: [[TMP27:%.*]] = urem i32 [[A]], [[C]]247; CHECK-NEXT: [[TMP28:%.*]] = insertelement <8 x i32> [[TMP25]], i32 [[TMP27]], i32 6248; CHECK-NEXT: br label [[PRED_UREM_CONTINUE12]]249; CHECK: pred.urem.continue12:250; CHECK-NEXT: [[TMP29:%.*]] = phi <8 x i32> [ [[TMP25]], [[PRED_UREM_CONTINUE10]] ], [ [[TMP28]], [[PRED_UREM_IF11]] ]251; CHECK-NEXT: [[TMP30:%.*]] = extractelement <8 x i1> [[TMP1]], i32 7252; CHECK-NEXT: br i1 [[TMP30]], label [[PRED_UREM_IF13:%.*]], label [[PRED_UREM_CONTINUE14:%.*]]253; CHECK: pred.urem.if13:254; CHECK-NEXT: [[TMP31:%.*]] = urem i32 [[A]], [[C]]255; CHECK-NEXT: [[TMP32:%.*]] = insertelement <8 x i32> [[TMP29]], i32 [[TMP31]], i32 7256; CHECK-NEXT: br label [[PRED_UREM_CONTINUE14]]257; CHECK: pred.urem.continue14:258; CHECK-NEXT: [[TMP33:%.*]] = phi <8 x i32> [ [[TMP29]], [[PRED_UREM_CONTINUE12]] ], [ [[TMP32]], [[PRED_UREM_IF13]] ]259; CHECK-NEXT: [[TMP34:%.*]] = sub <8 x i32> zeroinitializer, [[TMP33]]260; CHECK-NEXT: [[TMP35:%.*]] = extractelement <8 x i1> [[TMP1]], i32 0261; CHECK-NEXT: br i1 [[TMP35]], label [[PRED_UDIV_IF:%.*]], label [[PRED_UDIV_CONTINUE:%.*]]262; CHECK: pred.udiv.if:263; CHECK-NEXT: [[TMP36:%.*]] = udiv i32 [[C]], [[D:%.*]]264; CHECK-NEXT: [[TMP37:%.*]] = insertelement <8 x i32> poison, i32 [[TMP36]], i32 0265; CHECK-NEXT: br label [[PRED_UDIV_CONTINUE]]266; CHECK: pred.udiv.continue:267; CHECK-NEXT: [[TMP38:%.*]] = phi <8 x i32> [ poison, [[PRED_UREM_CONTINUE14]] ], [ [[TMP37]], [[PRED_UDIV_IF]] ]268; CHECK-NEXT: [[TMP39:%.*]] = extractelement <8 x i1> [[TMP1]], i32 1269; CHECK-NEXT: br i1 [[TMP39]], label [[PRED_UDIV_IF15:%.*]], label [[PRED_UDIV_CONTINUE16:%.*]]270; CHECK: pred.udiv.if15:271; CHECK-NEXT: [[TMP40:%.*]] = udiv i32 [[C]], [[D]]272; CHECK-NEXT: [[TMP41:%.*]] = insertelement <8 x i32> [[TMP38]], i32 [[TMP40]], i32 1273; CHECK-NEXT: br label [[PRED_UDIV_CONTINUE16]]274; CHECK: pred.udiv.continue16:275; CHECK-NEXT: [[TMP42:%.*]] = phi <8 x i32> [ [[TMP38]], [[PRED_UDIV_CONTINUE]] ], [ [[TMP41]], [[PRED_UDIV_IF15]] ]276; CHECK-NEXT: [[TMP43:%.*]] = extractelement <8 x i1> [[TMP1]], i32 2277; CHECK-NEXT: br i1 [[TMP43]], label [[PRED_UDIV_IF17:%.*]], label [[PRED_UDIV_CONTINUE18:%.*]]278; CHECK: pred.udiv.if17:279; CHECK-NEXT: [[TMP44:%.*]] = udiv i32 [[C]], [[D]]280; CHECK-NEXT: [[TMP45:%.*]] = insertelement <8 x i32> [[TMP42]], i32 [[TMP44]], i32 2281; CHECK-NEXT: br label [[PRED_UDIV_CONTINUE18]]282; CHECK: pred.udiv.continue18:283; CHECK-NEXT: [[TMP46:%.*]] = phi <8 x i32> [ [[TMP42]], [[PRED_UDIV_CONTINUE16]] ], [ [[TMP45]], [[PRED_UDIV_IF17]] ]284; CHECK-NEXT: [[TMP47:%.*]] = extractelement <8 x i1> [[TMP1]], i32 3285; CHECK-NEXT: br i1 [[TMP47]], label [[PRED_UDIV_IF19:%.*]], label [[PRED_UDIV_CONTINUE20:%.*]]286; CHECK: pred.udiv.if19:287; CHECK-NEXT: [[TMP48:%.*]] = udiv i32 [[C]], [[D]]288; CHECK-NEXT: [[TMP49:%.*]] = insertelement <8 x i32> [[TMP46]], i32 [[TMP48]], i32 3289; CHECK-NEXT: br label [[PRED_UDIV_CONTINUE20]]290; CHECK: pred.udiv.continue20:291; CHECK-NEXT: [[TMP50:%.*]] = phi <8 x i32> [ [[TMP46]], [[PRED_UDIV_CONTINUE18]] ], [ [[TMP49]], [[PRED_UDIV_IF19]] ]292; CHECK-NEXT: [[TMP51:%.*]] = extractelement <8 x i1> [[TMP1]], i32 4293; CHECK-NEXT: br i1 [[TMP51]], label [[PRED_UDIV_IF21:%.*]], label [[PRED_UDIV_CONTINUE22:%.*]]294; CHECK: pred.udiv.if21:295; CHECK-NEXT: [[TMP52:%.*]] = udiv i32 [[C]], [[D]]296; CHECK-NEXT: [[TMP53:%.*]] = insertelement <8 x i32> [[TMP50]], i32 [[TMP52]], i32 4297; CHECK-NEXT: br label [[PRED_UDIV_CONTINUE22]]298; CHECK: pred.udiv.continue22:299; CHECK-NEXT: [[TMP54:%.*]] = phi <8 x i32> [ [[TMP50]], [[PRED_UDIV_CONTINUE20]] ], [ [[TMP53]], [[PRED_UDIV_IF21]] ]300; CHECK-NEXT: [[TMP55:%.*]] = extractelement <8 x i1> [[TMP1]], i32 5301; CHECK-NEXT: br i1 [[TMP55]], label [[PRED_UDIV_IF23:%.*]], label [[PRED_UDIV_CONTINUE24:%.*]]302; CHECK: pred.udiv.if23:303; CHECK-NEXT: [[TMP56:%.*]] = udiv i32 [[C]], [[D]]304; CHECK-NEXT: [[TMP57:%.*]] = insertelement <8 x i32> [[TMP54]], i32 [[TMP56]], i32 5305; CHECK-NEXT: br label [[PRED_UDIV_CONTINUE24]]306; CHECK: pred.udiv.continue24:307; CHECK-NEXT: [[TMP58:%.*]] = phi <8 x i32> [ [[TMP54]], [[PRED_UDIV_CONTINUE22]] ], [ [[TMP57]], [[PRED_UDIV_IF23]] ]308; CHECK-NEXT: [[TMP59:%.*]] = extractelement <8 x i1> [[TMP1]], i32 6309; CHECK-NEXT: br i1 [[TMP59]], label [[PRED_UDIV_IF25:%.*]], label [[PRED_UDIV_CONTINUE26:%.*]]310; CHECK: pred.udiv.if25:311; CHECK-NEXT: [[TMP60:%.*]] = udiv i32 [[C]], [[D]]312; CHECK-NEXT: [[TMP61:%.*]] = insertelement <8 x i32> [[TMP58]], i32 [[TMP60]], i32 6313; CHECK-NEXT: br label [[PRED_UDIV_CONTINUE26]]314; CHECK: pred.udiv.continue26:315; CHECK-NEXT: [[TMP62:%.*]] = phi <8 x i32> [ [[TMP58]], [[PRED_UDIV_CONTINUE24]] ], [ [[TMP61]], [[PRED_UDIV_IF25]] ]316; CHECK-NEXT: [[C_1:%.*]] = extractelement <8 x i1> [[TMP1]], i32 7317; CHECK-NEXT: br i1 [[C_1]], label [[IF_THEN:%.*]], label [[LOOP_LATCH]]318; CHECK: pred.udiv.if27:319; CHECK-NEXT: [[TMP64:%.*]] = udiv i32 [[C]], [[D]]320; CHECK-NEXT: [[TMP65:%.*]] = insertelement <8 x i32> [[TMP62]], i32 [[TMP64]], i32 7321; CHECK-NEXT: br label [[LOOP_LATCH]]322; CHECK: pred.udiv.continue28:323; CHECK-NEXT: [[TMP66:%.*]] = phi <8 x i32> [ [[TMP62]], [[PRED_UDIV_CONTINUE26]] ], [ [[TMP65]], [[IF_THEN]] ]324; CHECK-NEXT: [[TMP67:%.*]] = or <8 x i32> [[TMP66]], [[TMP34]]325; CHECK-NEXT: [[TMP68:%.*]] = sext <8 x i32> [[TMP67]] to <8 x i64>326; CHECK-NEXT: [[TMP69:%.*]] = getelementptr { i64, i64, i64 }, ptr [[SRC:%.*]], <8 x i64> [[TMP68]], i32 2327; CHECK-NEXT: [[WIDE_MASKED_GATHER:%.*]] = call <8 x i64> @llvm.masked.gather.v8i64.v8p0(<8 x ptr> align 8 [[TMP69]], <8 x i1> [[TMP1]], <8 x i64> poison)328; CHECK-NEXT: [[TMP70:%.*]] = or <8 x i64> [[WIDE_MASKED_GATHER]], [[BROADCAST_SPLAT]]329; CHECK-NEXT: [[PREDPHI:%.*]] = select <8 x i1> [[TMP1]], <8 x i64> [[TMP70]], <8 x i64> zeroinitializer330; CHECK-NEXT: [[IV_NEXT]] = add nuw i32 [[IV]], 8331; CHECK-NEXT: [[VEC_IND_NEXT]] = add <8 x i32> [[VEC_IND]], splat (i32 8)332; CHECK-NEXT: [[TMP71:%.*]] = icmp eq i32 [[IV_NEXT]], [[N_VEC]]333; CHECK-NEXT: br i1 [[TMP71]], label [[MIDDLE_BLOCK:%.*]], label [[LOOP_HEADER]], !llvm.loop [[LOOP4:![0-9]+]]334; CHECK: middle.block:335; CHECK-NEXT: [[TMP72:%.*]] = extractelement <8 x i64> [[PREDPHI]], i32 7336; CHECK-NEXT: [[CMP_N:%.*]] = icmp eq i32 [[TMP63]], [[N_VEC]]337; CHECK-NEXT: br i1 [[CMP_N]], label [[EXIT:%.*]], label [[SCALAR_PH]]338; CHECK: scalar.ph:339; CHECK-NEXT: [[BC_RESUME_VAL:%.*]] = phi i32 [ [[N_VEC]], [[MIDDLE_BLOCK]] ], [ 0, [[ENTRY1:%.*]] ]340; CHECK-NEXT: br label [[LOOP_HEADER1:%.*]]341; CHECK: loop.header:342; CHECK-NEXT: [[IV1:%.*]] = phi i32 [ [[BC_RESUME_VAL]], [[SCALAR_PH]] ], [ [[IV_NEXT1:%.*]], [[LOOP_LATCH1:%.*]] ]343; CHECK-NEXT: [[C_2:%.*]] = icmp slt i32 [[IV1]], 0344; CHECK-NEXT: br i1 [[C_2]], label [[IF_THEN1:%.*]], label [[LOOP_LATCH1]]345; CHECK: if.then:346; CHECK-NEXT: [[TMP0:%.*]] = urem i32 [[A]], [[C]]347; CHECK-NEXT: [[MUL:%.*]] = sub i32 0, [[TMP0]]348; CHECK-NEXT: [[DIV:%.*]] = udiv i32 [[C]], [[D]]349; CHECK-NEXT: [[OR:%.*]] = or i32 [[DIV]], [[MUL]]350; CHECK-NEXT: [[EXT:%.*]] = sext i32 [[OR]] to i64351; CHECK-NEXT: [[GEP:%.*]] = getelementptr { i64, i64, i64 }, ptr [[SRC]], i64 [[EXT]], i32 2352; CHECK-NEXT: [[L:%.*]] = load i64, ptr [[GEP]], align 8353; CHECK-NEXT: [[OR_2:%.*]] = or i64 [[L]], [[B]]354; CHECK-NEXT: br label [[LOOP_LATCH1]]355; CHECK: loop.latch:356; CHECK-NEXT: [[RES:%.*]] = phi i64 [ 0, [[LOOP_HEADER1]] ], [ [[OR_2]], [[IF_THEN1]] ]357; CHECK-NEXT: [[IV_NEXT1]] = add i32 [[IV1]], 1358; CHECK-NEXT: [[EC:%.*]] = icmp ult i32 [[IV1]], [[C]]359; CHECK-NEXT: br i1 [[EC]], label [[LOOP_HEADER1]], label [[EXIT]], !llvm.loop [[LOOP5:![0-9]+]]360; CHECK: exit:361; CHECK-NEXT: [[RES_LCSSA:%.*]] = phi i64 [ [[RES]], [[LOOP_LATCH1]] ], [ [[TMP72]], [[MIDDLE_BLOCK]] ]362; CHECK-NEXT: ret i64 [[RES_LCSSA]]363;364entry:365 br label %loop.header366 367loop.header:368 %iv = phi i32 [ 0, %entry ], [ %iv.next, %loop.latch ]369 %c.1 = icmp slt i32 %iv, 0370 br i1 %c.1, label %if.then, label %loop.latch371 372if.then:373 %1 = urem i32 %a, %c374 %mul = sub i32 0, %1375 %div = udiv i32 %c, %d376 %or = or i32 %div, %mul377 %ext = sext i32 %or to i64378 %gep = getelementptr { i64, i64, i64 }, ptr %src, i64 %ext, i32 2379 %l = load i64, ptr %gep, align 8380 %or.2 = or i64 %l, %b381 br label %loop.latch382 383loop.latch:384 %res = phi i64 [ 0, %loop.header ], [ %or.2, %if.then ]385 %iv.next = add i32 %iv, 1386 %ec = icmp ult i32 %iv, %c387 br i1 %ec, label %loop.header, label %exit388 389exit:390 ret i64 %res391}392 393define void @cost_duplicate_recipe_for_sinking(ptr %A, i64 %N) #2 {394; CHECK-LABEL: @cost_duplicate_recipe_for_sinking(395; CHECK-NEXT: iter.check:396; CHECK-NEXT: [[TMP0:%.*]] = add i64 [[N:%.*]], 1397; CHECK-NEXT: [[MIN_ITERS_CHECK:%.*]] = icmp ule i64 [[TMP0]], 4398; CHECK-NEXT: br i1 [[MIN_ITERS_CHECK]], label [[VEC_EPILOG_SCALAR_PH:%.*]], label [[VECTOR_MAIN_LOOP_ITER_CHECK:%.*]]399; CHECK: vector.main.loop.iter.check:400; CHECK-NEXT: [[MIN_ITERS_CHECK1:%.*]] = icmp ule i64 [[TMP0]], 16401; CHECK-NEXT: br i1 [[MIN_ITERS_CHECK1]], label [[VEC_EPILOG_PH:%.*]], label [[VECTOR_PH:%.*]]402; CHECK: vector.ph:403; CHECK-NEXT: [[N_MOD_VF:%.*]] = urem i64 [[TMP0]], 16404; CHECK-NEXT: [[TMP1:%.*]] = icmp eq i64 [[N_MOD_VF]], 0405; CHECK-NEXT: [[TMP2:%.*]] = select i1 [[TMP1]], i64 16, i64 [[N_MOD_VF]]406; CHECK-NEXT: [[N_VEC:%.*]] = sub i64 [[TMP0]], [[TMP2]]407; CHECK-NEXT: br label [[VECTOR_BODY:%.*]]408; CHECK: vector.body:409; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[PRED_STORE_CONTINUE37:%.*]] ]410; CHECK-NEXT: [[TMP4:%.*]] = add i64 [[INDEX]], 4411; CHECK-NEXT: [[TMP5:%.*]] = add i64 [[INDEX]], 8412; CHECK-NEXT: [[TMP6:%.*]] = add i64 [[INDEX]], 12413; CHECK-NEXT: [[TMP7:%.*]] = shl nsw i64 [[INDEX]], 2414; CHECK-NEXT: [[TMP8:%.*]] = shl nsw i64 [[TMP4]], 2415; CHECK-NEXT: [[TMP9:%.*]] = shl nsw i64 [[TMP5]], 2416; CHECK-NEXT: [[TMP10:%.*]] = shl nsw i64 [[TMP6]], 2417; CHECK-NEXT: [[TMP11:%.*]] = getelementptr nusw double, ptr [[A:%.*]], i64 [[TMP7]]418; CHECK-NEXT: [[TMP12:%.*]] = getelementptr nusw double, ptr [[A]], i64 [[TMP8]]419; CHECK-NEXT: [[TMP13:%.*]] = getelementptr nusw double, ptr [[A]], i64 [[TMP9]]420; CHECK-NEXT: [[TMP14:%.*]] = getelementptr nusw double, ptr [[A]], i64 [[TMP10]]421; CHECK-NEXT: [[WIDE_VEC:%.*]] = load <16 x double>, ptr [[TMP11]], align 8422; CHECK-NEXT: [[STRIDED_VEC:%.*]] = shufflevector <16 x double> [[WIDE_VEC]], <16 x double> poison, <4 x i32> <i32 0, i32 4, i32 8, i32 12>423; CHECK-NEXT: [[WIDE_VEC1:%.*]] = load <16 x double>, ptr [[TMP12]], align 8424; CHECK-NEXT: [[STRIDED_VEC4:%.*]] = shufflevector <16 x double> [[WIDE_VEC1]], <16 x double> poison, <4 x i32> <i32 0, i32 4, i32 8, i32 12>425; CHECK-NEXT: [[WIDE_VEC2:%.*]] = load <16 x double>, ptr [[TMP13]], align 8426; CHECK-NEXT: [[STRIDED_VEC5:%.*]] = shufflevector <16 x double> [[WIDE_VEC2]], <16 x double> poison, <4 x i32> <i32 0, i32 4, i32 8, i32 12>427; CHECK-NEXT: [[WIDE_VEC3:%.*]] = load <16 x double>, ptr [[TMP14]], align 8428; CHECK-NEXT: [[STRIDED_VEC6:%.*]] = shufflevector <16 x double> [[WIDE_VEC3]], <16 x double> poison, <4 x i32> <i32 0, i32 4, i32 8, i32 12>429; CHECK-NEXT: [[TMP19:%.*]] = fcmp oeq <4 x double> [[STRIDED_VEC]], zeroinitializer430; CHECK-NEXT: [[TMP20:%.*]] = fcmp oeq <4 x double> [[STRIDED_VEC4]], zeroinitializer431; CHECK-NEXT: [[TMP21:%.*]] = fcmp oeq <4 x double> [[STRIDED_VEC5]], zeroinitializer432; CHECK-NEXT: [[TMP22:%.*]] = fcmp oeq <4 x double> [[STRIDED_VEC6]], zeroinitializer433; CHECK-NEXT: [[TMP23:%.*]] = extractelement <4 x i1> [[TMP19]], i32 0434; CHECK-NEXT: br i1 [[TMP23]], label [[PRED_STORE_IF:%.*]], label [[PRED_STORE_CONTINUE:%.*]]435; CHECK: pred.store.if:436; CHECK-NEXT: [[TMP3:%.*]] = add i64 [[INDEX]], 0437; CHECK-NEXT: [[TMP24:%.*]] = shl nsw i64 [[TMP3]], 2438; CHECK-NEXT: [[TMP25:%.*]] = getelementptr double, ptr [[A]], i64 [[TMP24]]439; CHECK-NEXT: store double 0.000000e+00, ptr [[TMP25]], align 8440; CHECK-NEXT: br label [[PRED_STORE_CONTINUE]]441; CHECK: pred.store.continue:442; CHECK-NEXT: [[TMP26:%.*]] = extractelement <4 x i1> [[TMP19]], i32 1443; CHECK-NEXT: br i1 [[TMP26]], label [[PRED_STORE_IF8:%.*]], label [[PRED_STORE_CONTINUE9:%.*]]444; CHECK: pred.store.if8:445; CHECK-NEXT: [[TMP27:%.*]] = add i64 [[INDEX]], 1446; CHECK-NEXT: [[TMP28:%.*]] = shl nsw i64 [[TMP27]], 2447; CHECK-NEXT: [[TMP29:%.*]] = getelementptr double, ptr [[A]], i64 [[TMP28]]448; CHECK-NEXT: store double 0.000000e+00, ptr [[TMP29]], align 8449; CHECK-NEXT: br label [[PRED_STORE_CONTINUE9]]450; CHECK: pred.store.continue9:451; CHECK-NEXT: [[TMP30:%.*]] = extractelement <4 x i1> [[TMP19]], i32 2452; CHECK-NEXT: br i1 [[TMP30]], label [[PRED_STORE_IF10:%.*]], label [[PRED_STORE_CONTINUE11:%.*]]453; CHECK: pred.store.if10:454; CHECK-NEXT: [[TMP31:%.*]] = add i64 [[INDEX]], 2455; CHECK-NEXT: [[TMP32:%.*]] = shl nsw i64 [[TMP31]], 2456; CHECK-NEXT: [[TMP33:%.*]] = getelementptr double, ptr [[A]], i64 [[TMP32]]457; CHECK-NEXT: store double 0.000000e+00, ptr [[TMP33]], align 8458; CHECK-NEXT: br label [[PRED_STORE_CONTINUE11]]459; CHECK: pred.store.continue11:460; CHECK-NEXT: [[TMP34:%.*]] = extractelement <4 x i1> [[TMP19]], i32 3461; CHECK-NEXT: br i1 [[TMP34]], label [[PRED_STORE_IF12:%.*]], label [[PRED_STORE_CONTINUE13:%.*]]462; CHECK: pred.store.if12:463; CHECK-NEXT: [[TMP35:%.*]] = add i64 [[INDEX]], 3464; CHECK-NEXT: [[TMP36:%.*]] = shl nsw i64 [[TMP35]], 2465; CHECK-NEXT: [[TMP37:%.*]] = getelementptr double, ptr [[A]], i64 [[TMP36]]466; CHECK-NEXT: store double 0.000000e+00, ptr [[TMP37]], align 8467; CHECK-NEXT: br label [[PRED_STORE_CONTINUE13]]468; CHECK: pred.store.continue13:469; CHECK-NEXT: [[TMP38:%.*]] = extractelement <4 x i1> [[TMP20]], i32 0470; CHECK-NEXT: br i1 [[TMP38]], label [[PRED_STORE_IF14:%.*]], label [[PRED_STORE_CONTINUE15:%.*]]471; CHECK: pred.store.if14:472; CHECK-NEXT: [[TMP88:%.*]] = add i64 [[INDEX]], 4473; CHECK-NEXT: [[TMP39:%.*]] = shl nsw i64 [[TMP88]], 2474; CHECK-NEXT: [[TMP40:%.*]] = getelementptr double, ptr [[A]], i64 [[TMP39]]475; CHECK-NEXT: store double 0.000000e+00, ptr [[TMP40]], align 8476; CHECK-NEXT: br label [[PRED_STORE_CONTINUE15]]477; CHECK: pred.store.continue15:478; CHECK-NEXT: [[TMP41:%.*]] = extractelement <4 x i1> [[TMP20]], i32 1479; CHECK-NEXT: br i1 [[TMP41]], label [[PRED_STORE_IF16:%.*]], label [[PRED_STORE_CONTINUE17:%.*]]480; CHECK: pred.store.if16:481; CHECK-NEXT: [[TMP42:%.*]] = add i64 [[INDEX]], 5482; CHECK-NEXT: [[TMP43:%.*]] = shl nsw i64 [[TMP42]], 2483; CHECK-NEXT: [[TMP44:%.*]] = getelementptr double, ptr [[A]], i64 [[TMP43]]484; CHECK-NEXT: store double 0.000000e+00, ptr [[TMP44]], align 8485; CHECK-NEXT: br label [[PRED_STORE_CONTINUE17]]486; CHECK: pred.store.continue17:487; CHECK-NEXT: [[TMP45:%.*]] = extractelement <4 x i1> [[TMP20]], i32 2488; CHECK-NEXT: br i1 [[TMP45]], label [[PRED_STORE_IF18:%.*]], label [[PRED_STORE_CONTINUE19:%.*]]489; CHECK: pred.store.if18:490; CHECK-NEXT: [[TMP46:%.*]] = add i64 [[INDEX]], 6491; CHECK-NEXT: [[TMP47:%.*]] = shl nsw i64 [[TMP46]], 2492; CHECK-NEXT: [[TMP48:%.*]] = getelementptr double, ptr [[A]], i64 [[TMP47]]493; CHECK-NEXT: store double 0.000000e+00, ptr [[TMP48]], align 8494; CHECK-NEXT: br label [[PRED_STORE_CONTINUE19]]495; CHECK: pred.store.continue19:496; CHECK-NEXT: [[TMP49:%.*]] = extractelement <4 x i1> [[TMP20]], i32 3497; CHECK-NEXT: br i1 [[TMP49]], label [[PRED_STORE_IF20:%.*]], label [[PRED_STORE_CONTINUE21:%.*]]498; CHECK: pred.store.if20:499; CHECK-NEXT: [[TMP50:%.*]] = add i64 [[INDEX]], 7500; CHECK-NEXT: [[TMP51:%.*]] = shl nsw i64 [[TMP50]], 2501; CHECK-NEXT: [[TMP52:%.*]] = getelementptr double, ptr [[A]], i64 [[TMP51]]502; CHECK-NEXT: store double 0.000000e+00, ptr [[TMP52]], align 8503; CHECK-NEXT: br label [[PRED_STORE_CONTINUE21]]504; CHECK: pred.store.continue21:505; CHECK-NEXT: [[TMP53:%.*]] = extractelement <4 x i1> [[TMP21]], i32 0506; CHECK-NEXT: br i1 [[TMP53]], label [[PRED_STORE_IF22:%.*]], label [[PRED_STORE_CONTINUE23:%.*]]507; CHECK: pred.store.if22:508; CHECK-NEXT: [[TMP107:%.*]] = add i64 [[INDEX]], 8509; CHECK-NEXT: [[TMP54:%.*]] = shl nsw i64 [[TMP107]], 2510; CHECK-NEXT: [[TMP55:%.*]] = getelementptr double, ptr [[A]], i64 [[TMP54]]511; CHECK-NEXT: store double 0.000000e+00, ptr [[TMP55]], align 8512; CHECK-NEXT: br label [[PRED_STORE_CONTINUE23]]513; CHECK: pred.store.continue23:514; CHECK-NEXT: [[TMP56:%.*]] = extractelement <4 x i1> [[TMP21]], i32 1515; CHECK-NEXT: br i1 [[TMP56]], label [[PRED_STORE_IF24:%.*]], label [[PRED_STORE_CONTINUE25:%.*]]516; CHECK: pred.store.if24:517; CHECK-NEXT: [[TMP57:%.*]] = add i64 [[INDEX]], 9518; CHECK-NEXT: [[TMP58:%.*]] = shl nsw i64 [[TMP57]], 2519; CHECK-NEXT: [[TMP59:%.*]] = getelementptr double, ptr [[A]], i64 [[TMP58]]520; CHECK-NEXT: store double 0.000000e+00, ptr [[TMP59]], align 8521; CHECK-NEXT: br label [[PRED_STORE_CONTINUE25]]522; CHECK: pred.store.continue25:523; CHECK-NEXT: [[TMP60:%.*]] = extractelement <4 x i1> [[TMP21]], i32 2524; CHECK-NEXT: br i1 [[TMP60]], label [[PRED_STORE_IF26:%.*]], label [[PRED_STORE_CONTINUE27:%.*]]525; CHECK: pred.store.if26:526; CHECK-NEXT: [[TMP61:%.*]] = add i64 [[INDEX]], 10527; CHECK-NEXT: [[TMP62:%.*]] = shl nsw i64 [[TMP61]], 2528; CHECK-NEXT: [[TMP63:%.*]] = getelementptr double, ptr [[A]], i64 [[TMP62]]529; CHECK-NEXT: store double 0.000000e+00, ptr [[TMP63]], align 8530; CHECK-NEXT: br label [[PRED_STORE_CONTINUE27]]531; CHECK: pred.store.continue27:532; CHECK-NEXT: [[TMP64:%.*]] = extractelement <4 x i1> [[TMP21]], i32 3533; CHECK-NEXT: br i1 [[TMP64]], label [[PRED_STORE_IF28:%.*]], label [[PRED_STORE_CONTINUE29:%.*]]534; CHECK: pred.store.if28:535; CHECK-NEXT: [[TMP65:%.*]] = add i64 [[INDEX]], 11536; CHECK-NEXT: [[TMP66:%.*]] = shl nsw i64 [[TMP65]], 2537; CHECK-NEXT: [[TMP67:%.*]] = getelementptr double, ptr [[A]], i64 [[TMP66]]538; CHECK-NEXT: store double 0.000000e+00, ptr [[TMP67]], align 8539; CHECK-NEXT: br label [[PRED_STORE_CONTINUE29]]540; CHECK: pred.store.continue29:541; CHECK-NEXT: [[TMP68:%.*]] = extractelement <4 x i1> [[TMP22]], i32 0542; CHECK-NEXT: br i1 [[TMP68]], label [[PRED_STORE_IF30:%.*]], label [[PRED_STORE_CONTINUE31:%.*]]543; CHECK: pred.store.if30:544; CHECK-NEXT: [[TMP108:%.*]] = add i64 [[INDEX]], 12545; CHECK-NEXT: [[TMP69:%.*]] = shl nsw i64 [[TMP108]], 2546; CHECK-NEXT: [[TMP70:%.*]] = getelementptr double, ptr [[A]], i64 [[TMP69]]547; CHECK-NEXT: store double 0.000000e+00, ptr [[TMP70]], align 8548; CHECK-NEXT: br label [[PRED_STORE_CONTINUE31]]549; CHECK: pred.store.continue31:550; CHECK-NEXT: [[TMP71:%.*]] = extractelement <4 x i1> [[TMP22]], i32 1551; CHECK-NEXT: br i1 [[TMP71]], label [[PRED_STORE_IF32:%.*]], label [[PRED_STORE_CONTINUE33:%.*]]552; CHECK: pred.store.if32:553; CHECK-NEXT: [[TMP72:%.*]] = add i64 [[INDEX]], 13554; CHECK-NEXT: [[TMP73:%.*]] = shl nsw i64 [[TMP72]], 2555; CHECK-NEXT: [[TMP74:%.*]] = getelementptr double, ptr [[A]], i64 [[TMP73]]556; CHECK-NEXT: store double 0.000000e+00, ptr [[TMP74]], align 8557; CHECK-NEXT: br label [[PRED_STORE_CONTINUE33]]558; CHECK: pred.store.continue33:559; CHECK-NEXT: [[TMP75:%.*]] = extractelement <4 x i1> [[TMP22]], i32 2560; CHECK-NEXT: br i1 [[TMP75]], label [[PRED_STORE_IF34:%.*]], label [[PRED_STORE_CONTINUE35:%.*]]561; CHECK: pred.store.if34:562; CHECK-NEXT: [[TMP76:%.*]] = add i64 [[INDEX]], 14563; CHECK-NEXT: [[TMP77:%.*]] = shl nsw i64 [[TMP76]], 2564; CHECK-NEXT: [[TMP78:%.*]] = getelementptr double, ptr [[A]], i64 [[TMP77]]565; CHECK-NEXT: store double 0.000000e+00, ptr [[TMP78]], align 8566; CHECK-NEXT: br label [[PRED_STORE_CONTINUE35]]567; CHECK: pred.store.continue35:568; CHECK-NEXT: [[TMP79:%.*]] = extractelement <4 x i1> [[TMP22]], i32 3569; CHECK-NEXT: br i1 [[TMP79]], label [[PRED_STORE_IF36:%.*]], label [[PRED_STORE_CONTINUE37]]570; CHECK: pred.store.if36:571; CHECK-NEXT: [[TMP80:%.*]] = add i64 [[INDEX]], 15572; CHECK-NEXT: [[TMP81:%.*]] = shl nsw i64 [[TMP80]], 2573; CHECK-NEXT: [[TMP82:%.*]] = getelementptr double, ptr [[A]], i64 [[TMP81]]574; CHECK-NEXT: store double 0.000000e+00, ptr [[TMP82]], align 8575; CHECK-NEXT: br label [[PRED_STORE_CONTINUE37]]576; CHECK: pred.store.continue37:577; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 16578; CHECK-NEXT: [[TMP83:%.*]] = icmp eq i64 [[INDEX_NEXT]], [[N_VEC]]579; CHECK-NEXT: br i1 [[TMP83]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP6:![0-9]+]]580; CHECK: middle.block:581; CHECK-NEXT: br label [[VEC_EPILOG_ITER_CHECK:%.*]]582; CHECK: vec.epilog.iter.check:583; CHECK-NEXT: [[MIN_EPILOG_ITERS_CHECK:%.*]] = icmp ule i64 [[TMP2]], 4584; CHECK-NEXT: br i1 [[MIN_EPILOG_ITERS_CHECK]], label [[VEC_EPILOG_SCALAR_PH]], label [[VEC_EPILOG_PH]], !prof [[PROF7:![0-9]+]]585; CHECK: vec.epilog.ph:586; CHECK-NEXT: [[VEC_EPILOG_RESUME_VAL1:%.*]] = phi i64 [ [[N_VEC]], [[VEC_EPILOG_ITER_CHECK]] ], [ 0, [[VECTOR_MAIN_LOOP_ITER_CHECK]] ]587; CHECK-NEXT: [[N_MOD_VF38:%.*]] = urem i64 [[TMP0]], 4588; CHECK-NEXT: [[TMP84:%.*]] = icmp eq i64 [[N_MOD_VF38]], 0589; CHECK-NEXT: [[TMP85:%.*]] = select i1 [[TMP84]], i64 4, i64 [[N_MOD_VF38]]590; CHECK-NEXT: [[N_VEC39:%.*]] = sub i64 [[TMP0]], [[TMP85]]591; CHECK-NEXT: br label [[VEC_EPILOG_VECTOR_BODY:%.*]]592; CHECK: vec.epilog.vector.body:593; CHECK-NEXT: [[INDEX40:%.*]] = phi i64 [ [[VEC_EPILOG_RESUME_VAL1]], [[VEC_EPILOG_PH]] ], [ [[INDEX_NEXT51:%.*]], [[PRED_STORE_CONTINUE50:%.*]] ]594; CHECK-NEXT: [[TMP87:%.*]] = shl nsw i64 [[INDEX40]], 2595; CHECK-NEXT: [[TMP89:%.*]] = getelementptr nusw double, ptr [[A]], i64 [[TMP87]]596; CHECK-NEXT: [[WIDE_VEC41:%.*]] = load <16 x double>, ptr [[TMP89]], align 8597; CHECK-NEXT: [[STRIDED_VEC42:%.*]] = shufflevector <16 x double> [[WIDE_VEC41]], <16 x double> poison, <4 x i32> <i32 0, i32 4, i32 8, i32 12>598; CHECK-NEXT: [[TMP90:%.*]] = fcmp oeq <4 x double> [[STRIDED_VEC42]], zeroinitializer599; CHECK-NEXT: [[TMP91:%.*]] = extractelement <4 x i1> [[TMP90]], i32 0600; CHECK-NEXT: br i1 [[TMP91]], label [[PRED_STORE_IF43:%.*]], label [[PRED_STORE_CONTINUE44:%.*]]601; CHECK: pred.store.if43:602; CHECK-NEXT: [[TMP86:%.*]] = add i64 [[INDEX40]], 0603; CHECK-NEXT: [[TMP92:%.*]] = shl nsw i64 [[TMP86]], 2604; CHECK-NEXT: [[TMP93:%.*]] = getelementptr double, ptr [[A]], i64 [[TMP92]]605; CHECK-NEXT: store double 0.000000e+00, ptr [[TMP93]], align 8606; CHECK-NEXT: br label [[PRED_STORE_CONTINUE44]]607; CHECK: pred.store.continue44:608; CHECK-NEXT: [[TMP94:%.*]] = extractelement <4 x i1> [[TMP90]], i32 1609; CHECK-NEXT: br i1 [[TMP94]], label [[PRED_STORE_IF45:%.*]], label [[PRED_STORE_CONTINUE46:%.*]]610; CHECK: pred.store.if45:611; CHECK-NEXT: [[TMP95:%.*]] = add i64 [[INDEX40]], 1612; CHECK-NEXT: [[TMP96:%.*]] = shl nsw i64 [[TMP95]], 2613; CHECK-NEXT: [[TMP97:%.*]] = getelementptr double, ptr [[A]], i64 [[TMP96]]614; CHECK-NEXT: store double 0.000000e+00, ptr [[TMP97]], align 8615; CHECK-NEXT: br label [[PRED_STORE_CONTINUE46]]616; CHECK: pred.store.continue46:617; CHECK-NEXT: [[TMP98:%.*]] = extractelement <4 x i1> [[TMP90]], i32 2618; CHECK-NEXT: br i1 [[TMP98]], label [[PRED_STORE_IF47:%.*]], label [[PRED_STORE_CONTINUE48:%.*]]619; CHECK: pred.store.if47:620; CHECK-NEXT: [[TMP99:%.*]] = add i64 [[INDEX40]], 2621; CHECK-NEXT: [[TMP100:%.*]] = shl nsw i64 [[TMP99]], 2622; CHECK-NEXT: [[TMP101:%.*]] = getelementptr double, ptr [[A]], i64 [[TMP100]]623; CHECK-NEXT: store double 0.000000e+00, ptr [[TMP101]], align 8624; CHECK-NEXT: br label [[PRED_STORE_CONTINUE48]]625; CHECK: pred.store.continue48:626; CHECK-NEXT: [[TMP102:%.*]] = extractelement <4 x i1> [[TMP90]], i32 3627; CHECK-NEXT: br i1 [[TMP102]], label [[PRED_STORE_IF49:%.*]], label [[PRED_STORE_CONTINUE50]]628; CHECK: pred.store.if49:629; CHECK-NEXT: [[TMP103:%.*]] = add i64 [[INDEX40]], 3630; CHECK-NEXT: [[TMP104:%.*]] = shl nsw i64 [[TMP103]], 2631; CHECK-NEXT: [[TMP105:%.*]] = getelementptr double, ptr [[A]], i64 [[TMP104]]632; CHECK-NEXT: store double 0.000000e+00, ptr [[TMP105]], align 8633; CHECK-NEXT: br label [[PRED_STORE_CONTINUE50]]634; CHECK: pred.store.continue50:635; CHECK-NEXT: [[INDEX_NEXT51]] = add nuw i64 [[INDEX40]], 4636; CHECK-NEXT: [[TMP106:%.*]] = icmp eq i64 [[INDEX_NEXT51]], [[N_VEC39]]637; CHECK-NEXT: br i1 [[TMP106]], label [[VEC_EPILOG_MIDDLE_BLOCK:%.*]], label [[VEC_EPILOG_VECTOR_BODY]], !llvm.loop [[LOOP8:![0-9]+]]638; CHECK: vec.epilog.middle.block:639; CHECK-NEXT: br label [[VEC_EPILOG_SCALAR_PH]]640; CHECK: vec.epilog.scalar.ph:641; CHECK-NEXT: [[BC_RESUME_VAL:%.*]] = phi i64 [ [[N_VEC39]], [[VEC_EPILOG_MIDDLE_BLOCK]] ], [ [[N_VEC]], [[VEC_EPILOG_ITER_CHECK]] ], [ 0, [[ITER_CHECK:%.*]] ]642; CHECK-NEXT: br label [[LOOP_HEADER:%.*]]643; CHECK: loop.header:644; CHECK-NEXT: [[IV:%.*]] = phi i64 [ [[BC_RESUME_VAL]], [[VEC_EPILOG_SCALAR_PH]] ], [ [[IV_NEXT:%.*]], [[LOOP_LATCH:%.*]] ]645; CHECK-NEXT: [[IV_SHL:%.*]] = shl nsw i64 [[IV]], 2646; CHECK-NEXT: [[GEP_0:%.*]] = getelementptr nusw double, ptr [[A]], i64 [[IV_SHL]]647; CHECK-NEXT: [[L:%.*]] = load double, ptr [[GEP_0]], align 8648; CHECK-NEXT: [[C:%.*]] = fcmp oeq double [[L]], 0.000000e+00649; CHECK-NEXT: br i1 [[C]], label [[IF_THEN:%.*]], label [[LOOP_LATCH]]650; CHECK: if.then:651; CHECK-NEXT: [[GEP_1:%.*]] = getelementptr double, ptr [[A]], i64 [[IV_SHL]]652; CHECK-NEXT: store double 0.000000e+00, ptr [[GEP_1]], align 8653; CHECK-NEXT: br label [[LOOP_LATCH]]654; CHECK: loop.latch:655; CHECK-NEXT: [[IV_NEXT]] = add nsw i64 [[IV]], 1656; CHECK-NEXT: [[EC:%.*]] = icmp eq i64 [[IV]], [[N]]657; CHECK-NEXT: br i1 [[EC]], label [[EXIT:%.*]], label [[LOOP_HEADER]], !llvm.loop [[LOOP9:![0-9]+]]658; CHECK: exit:659; CHECK-NEXT: ret void660;661entry:662 br label %loop.header663 664loop.header:665 %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop.latch ]666 %iv.shl = shl nsw i64 %iv, 2667 %gep.0 = getelementptr nusw double, ptr %A, i64 %iv.shl668 %l = load double, ptr %gep.0, align 8669 %c = fcmp oeq double %l, 0.000000e+00670 br i1 %c, label %if.then, label %loop.latch671 672if.then:673 %gep.1 = getelementptr double, ptr %A, i64 %iv.shl674 store double 0.000000e+00, ptr %gep.1, align 8675 br label %loop.latch676 677loop.latch:678 %iv.next = add nsw i64 %iv, 1679 %ec = icmp eq i64 %iv, %N680 br i1 %ec, label %exit, label %loop.header681 682exit:683 ret void684}685 686; Test for https://github.com/llvm/llvm-project/issues/129236.687define i32 @cost_ashr_with_op_known_invariant_via_scev(i8 %a) {688; CHECK-LABEL: @cost_ashr_with_op_known_invariant_via_scev(689; CHECK-NEXT: iter.check:690; CHECK-NEXT: [[CMP_I:%.*]] = icmp eq i16 0, 0691; CHECK-NEXT: [[CONV_I:%.*]] = sext i16 0 to i32692; CHECK-NEXT: [[CONV5_I:%.*]] = sext i8 [[A:%.*]] to i32693; CHECK-NEXT: br i1 false, label [[VEC_EPILOG_SCALAR_PH:%.*]], label [[VECTOR_MAIN_LOOP_ITER_CHECK:%.*]]694; CHECK: vector.main.loop.iter.check:695; CHECK-NEXT: br i1 false, label [[VEC_EPILOG_PH:%.*]], label [[VECTOR_PH:%.*]]696; CHECK: vector.ph:697; CHECK-NEXT: [[BROADCAST_SPLATINSERT:%.*]] = insertelement <32 x i1> poison, i1 [[CMP_I]], i64 0698; CHECK-NEXT: [[BROADCAST_SPLAT:%.*]] = shufflevector <32 x i1> [[BROADCAST_SPLATINSERT]], <32 x i1> poison, <32 x i32> zeroinitializer699; CHECK-NEXT: [[TMP60:%.*]] = xor <32 x i1> [[BROADCAST_SPLAT]], splat (i1 true)700; CHECK-NEXT: br label [[LOOP_HEADER:%.*]]701; CHECK: vector.body:702; CHECK-NEXT: [[INDEX:%.*]] = phi i32 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[PRED_UREM_CONTINUE62:%.*]] ]703; CHECK-NEXT: [[TMP61:%.*]] = extractelement <32 x i1> [[TMP60]], i32 0704; CHECK-NEXT: br i1 [[TMP61]], label [[PRED_UREM_IF:%.*]], label [[PRED_UREM_CONTINUE:%.*]]705; CHECK: pred.urem.if:706; CHECK-NEXT: br label [[PRED_UREM_CONTINUE]]707; CHECK: pred.urem.continue:708; CHECK-NEXT: [[TMP2:%.*]] = extractelement <32 x i1> [[TMP60]], i32 1709; CHECK-NEXT: br i1 [[TMP2]], label [[PRED_UREM_IF1:%.*]], label [[PRED_UREM_CONTINUE2:%.*]]710; CHECK: pred.urem.if1:711; CHECK-NEXT: br label [[PRED_UREM_CONTINUE2]]712; CHECK: pred.urem.continue2:713; CHECK-NEXT: [[TMP3:%.*]] = extractelement <32 x i1> [[TMP60]], i32 2714; CHECK-NEXT: br i1 [[TMP3]], label [[PRED_UREM_IF3:%.*]], label [[PRED_UREM_CONTINUE4:%.*]]715; CHECK: pred.urem.if3:716; CHECK-NEXT: br label [[PRED_UREM_CONTINUE4]]717; CHECK: pred.urem.continue4:718; CHECK-NEXT: [[TMP4:%.*]] = extractelement <32 x i1> [[TMP60]], i32 3719; CHECK-NEXT: br i1 [[TMP4]], label [[PRED_UREM_IF5:%.*]], label [[PRED_UREM_CONTINUE6:%.*]]720; CHECK: pred.urem.if5:721; CHECK-NEXT: br label [[PRED_UREM_CONTINUE6]]722; CHECK: pred.urem.continue6:723; CHECK-NEXT: [[TMP5:%.*]] = extractelement <32 x i1> [[TMP60]], i32 4724; CHECK-NEXT: br i1 [[TMP5]], label [[PRED_UREM_IF7:%.*]], label [[PRED_UREM_CONTINUE8:%.*]]725; CHECK: pred.urem.if7:726; CHECK-NEXT: br label [[PRED_UREM_CONTINUE8]]727; CHECK: pred.urem.continue8:728; CHECK-NEXT: [[TMP6:%.*]] = extractelement <32 x i1> [[TMP60]], i32 5729; CHECK-NEXT: br i1 [[TMP6]], label [[PRED_UREM_IF9:%.*]], label [[PRED_UREM_CONTINUE10:%.*]]730; CHECK: pred.urem.if9:731; CHECK-NEXT: br label [[PRED_UREM_CONTINUE10]]732; CHECK: pred.urem.continue10:733; CHECK-NEXT: [[TMP7:%.*]] = extractelement <32 x i1> [[TMP60]], i32 6734; CHECK-NEXT: br i1 [[TMP7]], label [[PRED_UREM_IF11:%.*]], label [[PRED_UREM_CONTINUE12:%.*]]735; CHECK: pred.urem.if11:736; CHECK-NEXT: br label [[PRED_UREM_CONTINUE12]]737; CHECK: pred.urem.continue12:738; CHECK-NEXT: [[TMP8:%.*]] = extractelement <32 x i1> [[TMP60]], i32 7739; CHECK-NEXT: br i1 [[TMP8]], label [[PRED_UREM_IF13:%.*]], label [[PRED_UREM_CONTINUE14:%.*]]740; CHECK: pred.urem.if13:741; CHECK-NEXT: br label [[PRED_UREM_CONTINUE14]]742; CHECK: pred.urem.continue14:743; CHECK-NEXT: [[TMP9:%.*]] = extractelement <32 x i1> [[TMP60]], i32 8744; CHECK-NEXT: br i1 [[TMP9]], label [[PRED_UREM_IF15:%.*]], label [[PRED_UREM_CONTINUE16:%.*]]745; CHECK: pred.urem.if15:746; CHECK-NEXT: br label [[PRED_UREM_CONTINUE16]]747; CHECK: pred.urem.continue16:748; CHECK-NEXT: [[TMP10:%.*]] = extractelement <32 x i1> [[TMP60]], i32 9749; CHECK-NEXT: br i1 [[TMP10]], label [[PRED_UREM_IF17:%.*]], label [[PRED_UREM_CONTINUE18:%.*]]750; CHECK: pred.urem.if17:751; CHECK-NEXT: br label [[PRED_UREM_CONTINUE18]]752; CHECK: pred.urem.continue18:753; CHECK-NEXT: [[TMP11:%.*]] = extractelement <32 x i1> [[TMP60]], i32 10754; CHECK-NEXT: br i1 [[TMP11]], label [[PRED_UREM_IF19:%.*]], label [[PRED_UREM_CONTINUE20:%.*]]755; CHECK: pred.urem.if19:756; CHECK-NEXT: br label [[PRED_UREM_CONTINUE20]]757; CHECK: pred.urem.continue20:758; CHECK-NEXT: [[TMP12:%.*]] = extractelement <32 x i1> [[TMP60]], i32 11759; CHECK-NEXT: br i1 [[TMP12]], label [[PRED_UREM_IF21:%.*]], label [[PRED_UREM_CONTINUE22:%.*]]760; CHECK: pred.urem.if21:761; CHECK-NEXT: br label [[PRED_UREM_CONTINUE22]]762; CHECK: pred.urem.continue22:763; CHECK-NEXT: [[TMP13:%.*]] = extractelement <32 x i1> [[TMP60]], i32 12764; CHECK-NEXT: br i1 [[TMP13]], label [[PRED_UREM_IF23:%.*]], label [[PRED_UREM_CONTINUE24:%.*]]765; CHECK: pred.urem.if23:766; CHECK-NEXT: br label [[PRED_UREM_CONTINUE24]]767; CHECK: pred.urem.continue24:768; CHECK-NEXT: [[TMP14:%.*]] = extractelement <32 x i1> [[TMP60]], i32 13769; CHECK-NEXT: br i1 [[TMP14]], label [[PRED_UREM_IF25:%.*]], label [[PRED_UREM_CONTINUE26:%.*]]770; CHECK: pred.urem.if25:771; CHECK-NEXT: br label [[PRED_UREM_CONTINUE26]]772; CHECK: pred.urem.continue26:773; CHECK-NEXT: [[TMP15:%.*]] = extractelement <32 x i1> [[TMP60]], i32 14774; CHECK-NEXT: br i1 [[TMP15]], label [[PRED_UREM_IF27:%.*]], label [[PRED_UREM_CONTINUE28:%.*]]775; CHECK: pred.urem.if27:776; CHECK-NEXT: br label [[PRED_UREM_CONTINUE28]]777; CHECK: pred.urem.continue28:778; CHECK-NEXT: [[TMP16:%.*]] = extractelement <32 x i1> [[TMP60]], i32 15779; CHECK-NEXT: br i1 [[TMP16]], label [[PRED_UREM_IF29:%.*]], label [[PRED_UREM_CONTINUE30:%.*]]780; CHECK: pred.urem.if29:781; CHECK-NEXT: br label [[PRED_UREM_CONTINUE30]]782; CHECK: pred.urem.continue30:783; CHECK-NEXT: [[TMP17:%.*]] = extractelement <32 x i1> [[TMP60]], i32 16784; CHECK-NEXT: br i1 [[TMP17]], label [[PRED_UREM_IF31:%.*]], label [[PRED_UREM_CONTINUE32:%.*]]785; CHECK: pred.urem.if31:786; CHECK-NEXT: br label [[PRED_UREM_CONTINUE32]]787; CHECK: pred.urem.continue32:788; CHECK-NEXT: [[TMP18:%.*]] = extractelement <32 x i1> [[TMP60]], i32 17789; CHECK-NEXT: br i1 [[TMP18]], label [[PRED_UREM_IF33:%.*]], label [[PRED_UREM_CONTINUE34:%.*]]790; CHECK: pred.urem.if33:791; CHECK-NEXT: br label [[PRED_UREM_CONTINUE34]]792; CHECK: pred.urem.continue34:793; CHECK-NEXT: [[TMP19:%.*]] = extractelement <32 x i1> [[TMP60]], i32 18794; CHECK-NEXT: br i1 [[TMP19]], label [[PRED_UREM_IF35:%.*]], label [[PRED_UREM_CONTINUE36:%.*]]795; CHECK: pred.urem.if35:796; CHECK-NEXT: br label [[PRED_UREM_CONTINUE36]]797; CHECK: pred.urem.continue36:798; CHECK-NEXT: [[TMP20:%.*]] = extractelement <32 x i1> [[TMP60]], i32 19799; CHECK-NEXT: br i1 [[TMP20]], label [[PRED_UREM_IF37:%.*]], label [[PRED_UREM_CONTINUE38:%.*]]800; CHECK: pred.urem.if37:801; CHECK-NEXT: br label [[PRED_UREM_CONTINUE38]]802; CHECK: pred.urem.continue38:803; CHECK-NEXT: [[TMP21:%.*]] = extractelement <32 x i1> [[TMP60]], i32 20804; CHECK-NEXT: br i1 [[TMP21]], label [[PRED_UREM_IF39:%.*]], label [[PRED_UREM_CONTINUE40:%.*]]805; CHECK: pred.urem.if39:806; CHECK-NEXT: br label [[PRED_UREM_CONTINUE40]]807; CHECK: pred.urem.continue40:808; CHECK-NEXT: [[TMP22:%.*]] = extractelement <32 x i1> [[TMP60]], i32 21809; CHECK-NEXT: br i1 [[TMP22]], label [[PRED_UREM_IF41:%.*]], label [[PRED_UREM_CONTINUE42:%.*]]810; CHECK: pred.urem.if41:811; CHECK-NEXT: br label [[PRED_UREM_CONTINUE42]]812; CHECK: pred.urem.continue42:813; CHECK-NEXT: [[TMP23:%.*]] = extractelement <32 x i1> [[TMP60]], i32 22814; CHECK-NEXT: br i1 [[TMP23]], label [[PRED_UREM_IF43:%.*]], label [[PRED_UREM_CONTINUE44:%.*]]815; CHECK: pred.urem.if43:816; CHECK-NEXT: br label [[PRED_UREM_CONTINUE44]]817; CHECK: pred.urem.continue44:818; CHECK-NEXT: [[TMP24:%.*]] = extractelement <32 x i1> [[TMP60]], i32 23819; CHECK-NEXT: br i1 [[TMP24]], label [[PRED_UREM_IF45:%.*]], label [[PRED_UREM_CONTINUE46:%.*]]820; CHECK: pred.urem.if45:821; CHECK-NEXT: br label [[PRED_UREM_CONTINUE46]]822; CHECK: pred.urem.continue46:823; CHECK-NEXT: [[TMP25:%.*]] = extractelement <32 x i1> [[TMP60]], i32 24824; CHECK-NEXT: br i1 [[TMP25]], label [[PRED_UREM_IF47:%.*]], label [[PRED_UREM_CONTINUE48:%.*]]825; CHECK: pred.urem.if47:826; CHECK-NEXT: br label [[PRED_UREM_CONTINUE48]]827; CHECK: pred.urem.continue48:828; CHECK-NEXT: [[TMP26:%.*]] = extractelement <32 x i1> [[TMP60]], i32 25829; CHECK-NEXT: br i1 [[TMP26]], label [[PRED_UREM_IF49:%.*]], label [[PRED_UREM_CONTINUE50:%.*]]830; CHECK: pred.urem.if49:831; CHECK-NEXT: br label [[PRED_UREM_CONTINUE50]]832; CHECK: pred.urem.continue50:833; CHECK-NEXT: [[TMP27:%.*]] = extractelement <32 x i1> [[TMP60]], i32 26834; CHECK-NEXT: br i1 [[TMP27]], label [[PRED_UREM_IF51:%.*]], label [[PRED_UREM_CONTINUE52:%.*]]835; CHECK: pred.urem.if51:836; CHECK-NEXT: br label [[PRED_UREM_CONTINUE52]]837; CHECK: pred.urem.continue52:838; CHECK-NEXT: [[TMP28:%.*]] = extractelement <32 x i1> [[TMP60]], i32 27839; CHECK-NEXT: br i1 [[TMP28]], label [[PRED_UREM_IF53:%.*]], label [[PRED_UREM_CONTINUE54:%.*]]840; CHECK: pred.urem.if53:841; CHECK-NEXT: br label [[PRED_UREM_CONTINUE54]]842; CHECK: pred.urem.continue54:843; CHECK-NEXT: [[TMP29:%.*]] = extractelement <32 x i1> [[TMP60]], i32 28844; CHECK-NEXT: br i1 [[TMP29]], label [[PRED_UREM_IF55:%.*]], label [[PRED_UREM_CONTINUE56:%.*]]845; CHECK: pred.urem.if55:846; CHECK-NEXT: br label [[PRED_UREM_CONTINUE56]]847; CHECK: pred.urem.continue56:848; CHECK-NEXT: [[TMP30:%.*]] = extractelement <32 x i1> [[TMP60]], i32 29849; CHECK-NEXT: br i1 [[TMP30]], label [[PRED_UREM_IF57:%.*]], label [[PRED_UREM_CONTINUE58:%.*]]850; CHECK: pred.urem.if57:851; CHECK-NEXT: br label [[PRED_UREM_CONTINUE58]]852; CHECK: pred.urem.continue58:853; CHECK-NEXT: [[TMP31:%.*]] = extractelement <32 x i1> [[TMP60]], i32 30854; CHECK-NEXT: br i1 [[TMP31]], label [[PRED_UREM_IF59:%.*]], label [[PRED_UREM_CONTINUE60:%.*]]855; CHECK: pred.urem.if59:856; CHECK-NEXT: br label [[PRED_UREM_CONTINUE60]]857; CHECK: pred.urem.continue60:858; CHECK-NEXT: [[TMP32:%.*]] = extractelement <32 x i1> [[TMP60]], i32 31859; CHECK-NEXT: br i1 [[TMP32]], label [[PRED_UREM_IF61:%.*]], label [[PRED_UREM_CONTINUE62]]860; CHECK: pred.urem.if61:861; CHECK-NEXT: br label [[PRED_UREM_CONTINUE62]]862; CHECK: pred.urem.continue62:863; CHECK-NEXT: [[TMP33:%.*]] = select <32 x i1> [[TMP60]], <32 x i1> poison, <32 x i1> zeroinitializer864; CHECK-NEXT: [[TMP34:%.*]] = or <32 x i1> [[TMP33]], [[BROADCAST_SPLAT]]865; CHECK-NEXT: [[PREDPHI:%.*]] = select i1 [[CMP_I]], <32 x i32> zeroinitializer, <32 x i32> poison866; CHECK-NEXT: [[TMP35:%.*]] = extractelement <32 x i32> [[PREDPHI]], i32 0867; CHECK-NEXT: [[TMP36:%.*]] = ashr i32 [[CONV5_I]], [[TMP35]]868; CHECK-NEXT: [[BROADCAST_SPLATINSERT63:%.*]] = insertelement <32 x i32> poison, i32 [[TMP36]], i64 0869; CHECK-NEXT: [[BROADCAST_SPLAT64:%.*]] = shufflevector <32 x i32> [[BROADCAST_SPLATINSERT63]], <32 x i32> poison, <32 x i32> zeroinitializer870; CHECK-NEXT: [[TMP37:%.*]] = icmp eq <32 x i32> [[BROADCAST_SPLAT64]], zeroinitializer871; CHECK-NEXT: [[TMP38:%.*]] = shl <32 x i32> [[PREDPHI]], splat (i32 24)872; CHECK-NEXT: [[TMP39:%.*]] = ashr exact <32 x i32> [[TMP38]], splat (i32 24)873; CHECK-NEXT: [[TMP40:%.*]] = extractelement <32 x i1> [[TMP37]], i32 0874; CHECK-NEXT: [[TMP41:%.*]] = select i1 [[TMP40]], <32 x i32> [[TMP39]], <32 x i32> zeroinitializer875; CHECK-NEXT: [[PREDPHI65:%.*]] = select <32 x i1> [[TMP34]], <32 x i32> [[TMP41]], <32 x i32> zeroinitializer876; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i32 [[INDEX]], 32877; CHECK-NEXT: [[TMP42:%.*]] = icmp eq i32 [[INDEX_NEXT]], 96878; CHECK-NEXT: br i1 [[TMP42]], label [[MIDDLE_BLOCK:%.*]], label [[LOOP_HEADER]], !llvm.loop [[LOOP10:![0-9]+]]879; CHECK: middle.block:880; CHECK-NEXT: [[TMP43:%.*]] = extractelement <32 x i32> [[PREDPHI65]], i32 31881; CHECK-NEXT: br i1 false, label [[EXIT:%.*]], label [[VEC_EPILOG_ITER_CHECK:%.*]]882; CHECK: vec.epilog.iter.check:883; CHECK-NEXT: br i1 false, label [[VEC_EPILOG_SCALAR_PH]], label [[VEC_EPILOG_PH]], !prof [[PROF11:![0-9]+]]884; CHECK: vec.epilog.ph:885; CHECK-NEXT: [[VEC_EPILOG_RESUME_VAL:%.*]] = phi i32 [ 96, [[VEC_EPILOG_ITER_CHECK]] ], [ 0, [[VECTOR_MAIN_LOOP_ITER_CHECK]] ]886; CHECK-NEXT: [[BROADCAST_SPLATINSERT66:%.*]] = insertelement <4 x i1> poison, i1 [[CMP_I]], i64 0887; CHECK-NEXT: [[BROADCAST_SPLAT67:%.*]] = shufflevector <4 x i1> [[BROADCAST_SPLATINSERT66]], <4 x i1> poison, <4 x i32> zeroinitializer888; CHECK-NEXT: [[TMP44:%.*]] = xor <4 x i1> [[BROADCAST_SPLAT67]], splat (i1 true)889; CHECK-NEXT: br label [[VEC_EPILOG_VECTOR_BODY:%.*]]890; CHECK: vec.epilog.vector.body:891; CHECK-NEXT: [[INDEX68:%.*]] = phi i32 [ [[VEC_EPILOG_RESUME_VAL]], [[VEC_EPILOG_PH]] ], [ [[INDEX_NEXT81:%.*]], [[PRED_UREM_CONTINUE76:%.*]] ]892; CHECK-NEXT: [[TMP45:%.*]] = extractelement <4 x i1> [[TMP44]], i32 0893; CHECK-NEXT: br i1 [[TMP45]], label [[PRED_UREM_IF69:%.*]], label [[PRED_UREM_CONTINUE70:%.*]]894; CHECK: pred.urem.if69:895; CHECK-NEXT: br label [[PRED_UREM_CONTINUE70]]896; CHECK: pred.urem.continue70:897; CHECK-NEXT: [[TMP46:%.*]] = extractelement <4 x i1> [[TMP44]], i32 1898; CHECK-NEXT: br i1 [[TMP46]], label [[PRED_UREM_IF71:%.*]], label [[PRED_UREM_CONTINUE72:%.*]]899; CHECK: pred.urem.if71:900; CHECK-NEXT: br label [[PRED_UREM_CONTINUE72]]901; CHECK: pred.urem.continue72:902; CHECK-NEXT: [[TMP47:%.*]] = extractelement <4 x i1> [[TMP44]], i32 2903; CHECK-NEXT: br i1 [[TMP47]], label [[PRED_UREM_IF73:%.*]], label [[PRED_UREM_CONTINUE74:%.*]]904; CHECK: pred.urem.if73:905; CHECK-NEXT: br label [[PRED_UREM_CONTINUE74]]906; CHECK: pred.urem.continue74:907; CHECK-NEXT: [[TMP48:%.*]] = extractelement <4 x i1> [[TMP44]], i32 3908; CHECK-NEXT: br i1 [[TMP48]], label [[PRED_UREM_IF75:%.*]], label [[PRED_UREM_CONTINUE76]]909; CHECK: pred.urem.if75:910; CHECK-NEXT: br label [[PRED_UREM_CONTINUE76]]911; CHECK: pred.urem.continue76:912; CHECK-NEXT: [[TMP49:%.*]] = select <4 x i1> [[TMP44]], <4 x i1> poison, <4 x i1> zeroinitializer913; CHECK-NEXT: [[TMP50:%.*]] = or <4 x i1> [[TMP49]], [[BROADCAST_SPLAT67]]914; CHECK-NEXT: [[PREDPHI77:%.*]] = select i1 [[CMP_I]], <4 x i32> zeroinitializer, <4 x i32> poison915; CHECK-NEXT: [[TMP51:%.*]] = extractelement <4 x i32> [[PREDPHI77]], i32 0916; CHECK-NEXT: [[TMP52:%.*]] = ashr i32 [[CONV5_I]], [[TMP51]]917; CHECK-NEXT: [[BROADCAST_SPLATINSERT78:%.*]] = insertelement <4 x i32> poison, i32 [[TMP52]], i64 0918; CHECK-NEXT: [[BROADCAST_SPLAT79:%.*]] = shufflevector <4 x i32> [[BROADCAST_SPLATINSERT78]], <4 x i32> poison, <4 x i32> zeroinitializer919; CHECK-NEXT: [[TMP53:%.*]] = icmp eq <4 x i32> [[BROADCAST_SPLAT79]], zeroinitializer920; CHECK-NEXT: [[TMP54:%.*]] = shl <4 x i32> [[PREDPHI77]], splat (i32 24)921; CHECK-NEXT: [[TMP55:%.*]] = ashr exact <4 x i32> [[TMP54]], splat (i32 24)922; CHECK-NEXT: [[TMP56:%.*]] = extractelement <4 x i1> [[TMP53]], i32 0923; CHECK-NEXT: [[TMP57:%.*]] = select i1 [[TMP56]], <4 x i32> [[TMP55]], <4 x i32> zeroinitializer924; CHECK-NEXT: [[PREDPHI80:%.*]] = select <4 x i1> [[TMP50]], <4 x i32> [[TMP57]], <4 x i32> zeroinitializer925; CHECK-NEXT: [[INDEX_NEXT81]] = add nuw i32 [[INDEX68]], 4926; CHECK-NEXT: [[TMP58:%.*]] = icmp eq i32 [[INDEX_NEXT81]], 100927; CHECK-NEXT: br i1 [[TMP58]], label [[VEC_EPILOG_MIDDLE_BLOCK:%.*]], label [[VEC_EPILOG_VECTOR_BODY]], !llvm.loop [[LOOP12:![0-9]+]]928; CHECK: vec.epilog.middle.block:929; CHECK-NEXT: [[TMP59:%.*]] = extractelement <4 x i32> [[PREDPHI80]], i32 3930; CHECK-NEXT: br i1 true, label [[EXIT]], label [[VEC_EPILOG_SCALAR_PH]]931; CHECK: vec.epilog.scalar.ph:932; CHECK-NEXT: [[BC_RESUME_VAL:%.*]] = phi i8 [ 0, [[VEC_EPILOG_MIDDLE_BLOCK]] ], [ 4, [[VEC_EPILOG_ITER_CHECK]] ], [ 100, [[ITER_CHECK:%.*]] ]933; CHECK-NEXT: br label [[LOOP_HEADER1:%.*]]934; CHECK: loop.header:935; CHECK-NEXT: [[IV:%.*]] = phi i8 [ [[BC_RESUME_VAL]], [[VEC_EPILOG_SCALAR_PH]] ], [ [[IV_NEXT:%.*]], [[LOOP_LATCH:%.*]] ]936; CHECK-NEXT: br i1 [[CMP_I]], label [[THEN:%.*]], label [[ELSE:%.*]]937; CHECK: then:938; CHECK-NEXT: [[P_1:%.*]] = phi i32 [ [[REM_I:%.*]], [[ELSE]] ], [ 0, [[LOOP_HEADER1]] ]939; CHECK-NEXT: [[SHR_I:%.*]] = ashr i32 [[CONV5_I]], [[P_1]]940; CHECK-NEXT: [[TOBOOL6_NOT_I:%.*]] = icmp eq i32 [[SHR_I]], 0941; CHECK-NEXT: [[SEXT_I:%.*]] = shl i32 [[P_1]], 24942; CHECK-NEXT: [[TMP0:%.*]] = ashr exact i32 [[SEXT_I]], 24943; CHECK-NEXT: [[TMP1:%.*]] = select i1 [[TOBOOL6_NOT_I]], i32 [[TMP0]], i32 0944; CHECK-NEXT: br label [[LOOP_LATCH]]945; CHECK: else:946; CHECK-NEXT: [[REM_I]] = urem i32 -1, [[CONV_I]]947; CHECK-NEXT: [[CMP3_I:%.*]] = icmp sgt i32 [[REM_I]], 1948; CHECK-NEXT: br i1 [[CMP3_I]], label [[LOOP_LATCH]], label [[THEN]]949; CHECK: loop.latch:950; CHECK-NEXT: [[P_2:%.*]] = phi i32 [ 0, [[ELSE]] ], [ [[TMP1]], [[THEN]] ]951; CHECK-NEXT: [[IV_NEXT]] = add i8 [[IV]], -1952; CHECK-NEXT: [[EC:%.*]] = icmp eq i8 [[IV_NEXT]], 0953; CHECK-NEXT: br i1 [[EC]], label [[EXIT]], label [[LOOP_HEADER1]], !llvm.loop [[LOOP13:![0-9]+]]954; CHECK: exit:955; CHECK-NEXT: [[P_2_LCSSA:%.*]] = phi i32 [ [[P_2]], [[LOOP_LATCH]] ], [ [[TMP43]], [[MIDDLE_BLOCK]] ], [ [[TMP59]], [[VEC_EPILOG_MIDDLE_BLOCK]] ]956; CHECK-NEXT: ret i32 [[P_2_LCSSA]]957;958entry:959 %cmp.i = icmp eq i16 0, 0960 %conv.i = sext i16 0 to i32961 %conv5.i = sext i8 %a to i32962 br label %loop.header963 964loop.header:965 %iv = phi i8 [ 100, %entry ], [ %iv.next, %loop.latch ]966 br i1 %cmp.i, label %then, label %else967 968then:969 %p.1 = phi i32 [ %rem.i, %else ], [ 0, %loop.header ]970 %shr.i = ashr i32 %conv5.i, %p.1971 %tobool6.not.i = icmp eq i32 %shr.i, 0972 %sext.i = shl i32 %p.1, 24973 %2 = ashr exact i32 %sext.i, 24974 %3 = select i1 %tobool6.not.i, i32 %2, i32 0975 br label %loop.latch976 977else:978 %rem.i = urem i32 -1, %conv.i979 %cmp3.i = icmp sgt i32 %rem.i, 1980 br i1 %cmp3.i, label %loop.latch, label %then981 982loop.latch:983 %p.2 = phi i32 [ 0, %else ], [ %3, %then ]984 %iv.next = add i8 %iv, -1985 %ec = icmp eq i8 %iv.next, 0986 br i1 %ec, label %exit, label %loop.header987 988exit:989 ret i32 %p.2990}991 992; Test case for https://github.com/llvm/llvm-project/issues/156066.993define void @sdiv_by_zero(ptr noalias %src, ptr noalias %dst, i32 %d) #2 {994; CHECK-LABEL: @sdiv_by_zero(995; CHECK-NEXT: bb:996; CHECK-NEXT: br label [[VECTOR_PH:%.*]]997; CHECK: vector.ph:998; CHECK-NEXT: br label [[VECTOR_BODY:%.*]]999; CHECK: vector.body:1000; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[PRED_SDIV_CONTINUE14:%.*]] ]1001; CHECK-NEXT: [[TMP0:%.*]] = getelementptr inbounds i32, ptr [[SRC:%.*]], i64 [[INDEX]]1002; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <8 x i32>, ptr [[TMP0]], align 41003; CHECK-NEXT: [[TMP1:%.*]] = icmp ne <8 x i32> [[WIDE_LOAD]], zeroinitializer1004; CHECK-NEXT: [[TMP2:%.*]] = extractelement <8 x i1> [[TMP1]], i32 01005; CHECK-NEXT: br i1 [[TMP2]], label [[PRED_SDIV_IF:%.*]], label [[PRED_SDIV_CONTINUE:%.*]]1006; CHECK: pred.sdiv.if:1007; CHECK-NEXT: [[TMP3:%.*]] = extractelement <8 x i32> [[WIDE_LOAD]], i32 01008; CHECK-NEXT: [[TMP4:%.*]] = sdiv i32 [[TMP3]], 01009; CHECK-NEXT: [[TMP5:%.*]] = insertelement <8 x i32> poison, i32 [[TMP4]], i32 01010; CHECK-NEXT: br label [[PRED_SDIV_CONTINUE]]1011; CHECK: pred.sdiv.continue:1012; CHECK-NEXT: [[TMP6:%.*]] = phi <8 x i32> [ poison, [[VECTOR_BODY]] ], [ [[TMP5]], [[PRED_SDIV_IF]] ]1013; CHECK-NEXT: [[TMP7:%.*]] = extractelement <8 x i1> [[TMP1]], i32 11014; CHECK-NEXT: br i1 [[TMP7]], label [[PRED_SDIV_IF1:%.*]], label [[PRED_SDIV_CONTINUE2:%.*]]1015; CHECK: pred.sdiv.if1:1016; CHECK-NEXT: [[TMP8:%.*]] = extractelement <8 x i32> [[WIDE_LOAD]], i32 11017; CHECK-NEXT: [[TMP9:%.*]] = sdiv i32 [[TMP8]], 01018; CHECK-NEXT: [[TMP10:%.*]] = insertelement <8 x i32> [[TMP6]], i32 [[TMP9]], i32 11019; CHECK-NEXT: br label [[PRED_SDIV_CONTINUE2]]1020; CHECK: pred.sdiv.continue2:1021; CHECK-NEXT: [[TMP11:%.*]] = phi <8 x i32> [ [[TMP6]], [[PRED_SDIV_CONTINUE]] ], [ [[TMP10]], [[PRED_SDIV_IF1]] ]1022; CHECK-NEXT: [[TMP12:%.*]] = extractelement <8 x i1> [[TMP1]], i32 21023; CHECK-NEXT: br i1 [[TMP12]], label [[PRED_SDIV_IF3:%.*]], label [[PRED_SDIV_CONTINUE4:%.*]]1024; CHECK: pred.sdiv.if3:1025; CHECK-NEXT: [[TMP13:%.*]] = extractelement <8 x i32> [[WIDE_LOAD]], i32 21026; CHECK-NEXT: [[TMP14:%.*]] = sdiv i32 [[TMP13]], 01027; CHECK-NEXT: [[TMP15:%.*]] = insertelement <8 x i32> [[TMP11]], i32 [[TMP14]], i32 21028; CHECK-NEXT: br label [[PRED_SDIV_CONTINUE4]]1029; CHECK: pred.sdiv.continue4:1030; CHECK-NEXT: [[TMP16:%.*]] = phi <8 x i32> [ [[TMP11]], [[PRED_SDIV_CONTINUE2]] ], [ [[TMP15]], [[PRED_SDIV_IF3]] ]1031; CHECK-NEXT: [[TMP17:%.*]] = extractelement <8 x i1> [[TMP1]], i32 31032; CHECK-NEXT: br i1 [[TMP17]], label [[PRED_SDIV_IF5:%.*]], label [[PRED_SDIV_CONTINUE6:%.*]]1033; CHECK: pred.sdiv.if5:1034; CHECK-NEXT: [[TMP18:%.*]] = extractelement <8 x i32> [[WIDE_LOAD]], i32 31035; CHECK-NEXT: [[TMP19:%.*]] = sdiv i32 [[TMP18]], 01036; CHECK-NEXT: [[TMP20:%.*]] = insertelement <8 x i32> [[TMP16]], i32 [[TMP19]], i32 31037; CHECK-NEXT: br label [[PRED_SDIV_CONTINUE6]]1038; CHECK: pred.sdiv.continue6:1039; CHECK-NEXT: [[TMP21:%.*]] = phi <8 x i32> [ [[TMP16]], [[PRED_SDIV_CONTINUE4]] ], [ [[TMP20]], [[PRED_SDIV_IF5]] ]1040; CHECK-NEXT: [[TMP22:%.*]] = extractelement <8 x i1> [[TMP1]], i32 41041; CHECK-NEXT: br i1 [[TMP22]], label [[PRED_SDIV_IF7:%.*]], label [[PRED_SDIV_CONTINUE8:%.*]]1042; CHECK: pred.sdiv.if7:1043; CHECK-NEXT: [[TMP23:%.*]] = extractelement <8 x i32> [[WIDE_LOAD]], i32 41044; CHECK-NEXT: [[TMP24:%.*]] = sdiv i32 [[TMP23]], 01045; CHECK-NEXT: [[TMP25:%.*]] = insertelement <8 x i32> [[TMP21]], i32 [[TMP24]], i32 41046; CHECK-NEXT: br label [[PRED_SDIV_CONTINUE8]]1047; CHECK: pred.sdiv.continue8:1048; CHECK-NEXT: [[TMP26:%.*]] = phi <8 x i32> [ [[TMP21]], [[PRED_SDIV_CONTINUE6]] ], [ [[TMP25]], [[PRED_SDIV_IF7]] ]1049; CHECK-NEXT: [[TMP27:%.*]] = extractelement <8 x i1> [[TMP1]], i32 51050; CHECK-NEXT: br i1 [[TMP27]], label [[PRED_SDIV_IF9:%.*]], label [[PRED_SDIV_CONTINUE10:%.*]]1051; CHECK: pred.sdiv.if9:1052; CHECK-NEXT: [[TMP28:%.*]] = extractelement <8 x i32> [[WIDE_LOAD]], i32 51053; CHECK-NEXT: [[TMP29:%.*]] = sdiv i32 [[TMP28]], 01054; CHECK-NEXT: [[TMP30:%.*]] = insertelement <8 x i32> [[TMP26]], i32 [[TMP29]], i32 51055; CHECK-NEXT: br label [[PRED_SDIV_CONTINUE10]]1056; CHECK: pred.sdiv.continue10:1057; CHECK-NEXT: [[TMP31:%.*]] = phi <8 x i32> [ [[TMP26]], [[PRED_SDIV_CONTINUE8]] ], [ [[TMP30]], [[PRED_SDIV_IF9]] ]1058; CHECK-NEXT: [[TMP32:%.*]] = extractelement <8 x i1> [[TMP1]], i32 61059; CHECK-NEXT: br i1 [[TMP32]], label [[PRED_SDIV_IF11:%.*]], label [[PRED_SDIV_CONTINUE12:%.*]]1060; CHECK: pred.sdiv.if11:1061; CHECK-NEXT: [[TMP33:%.*]] = extractelement <8 x i32> [[WIDE_LOAD]], i32 61062; CHECK-NEXT: [[TMP34:%.*]] = sdiv i32 [[TMP33]], 01063; CHECK-NEXT: [[TMP35:%.*]] = insertelement <8 x i32> [[TMP31]], i32 [[TMP34]], i32 61064; CHECK-NEXT: br label [[PRED_SDIV_CONTINUE12]]1065; CHECK: pred.sdiv.continue12:1066; CHECK-NEXT: [[TMP36:%.*]] = phi <8 x i32> [ [[TMP31]], [[PRED_SDIV_CONTINUE10]] ], [ [[TMP35]], [[PRED_SDIV_IF11]] ]1067; CHECK-NEXT: [[TMP37:%.*]] = extractelement <8 x i1> [[TMP1]], i32 71068; CHECK-NEXT: br i1 [[TMP37]], label [[PRED_SDIV_IF13:%.*]], label [[PRED_SDIV_CONTINUE14]]1069; CHECK: pred.sdiv.if13:1070; CHECK-NEXT: [[TMP38:%.*]] = extractelement <8 x i32> [[WIDE_LOAD]], i32 71071; CHECK-NEXT: [[TMP39:%.*]] = sdiv i32 [[TMP38]], 01072; CHECK-NEXT: [[TMP40:%.*]] = insertelement <8 x i32> [[TMP36]], i32 [[TMP39]], i32 71073; CHECK-NEXT: br label [[PRED_SDIV_CONTINUE14]]1074; CHECK: pred.sdiv.continue14:1075; CHECK-NEXT: [[TMP41:%.*]] = phi <8 x i32> [ [[TMP36]], [[PRED_SDIV_CONTINUE12]] ], [ [[TMP40]], [[PRED_SDIV_IF13]] ]1076; CHECK-NEXT: [[PREDPHI:%.*]] = select <8 x i1> [[TMP1]], <8 x i32> [[TMP41]], <8 x i32> zeroinitializer1077; CHECK-NEXT: [[TMP42:%.*]] = getelementptr inbounds i32, ptr [[DST:%.*]], i64 [[INDEX]]1078; CHECK-NEXT: store <8 x i32> [[PREDPHI]], ptr [[TMP42]], align 41079; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 81080; CHECK-NEXT: [[TMP43:%.*]] = icmp eq i64 [[INDEX_NEXT]], 161081; CHECK-NEXT: br i1 [[TMP43]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP14:![0-9]+]]1082; CHECK: middle.block:1083; CHECK-NEXT: br label [[SCALAR_PH:%.*]]1084; CHECK: scalar.ph:1085; CHECK-NEXT: br label [[LOOP_HEADER:%.*]]1086; CHECK: loop.header:1087; CHECK-NEXT: [[IV:%.*]] = phi i64 [ [[IV_NEXT:%.*]], [[LOOP_LATCH:%.*]] ], [ 16, [[SCALAR_PH]] ]1088; CHECK-NEXT: [[GEP_SRC:%.*]] = getelementptr inbounds i32, ptr [[SRC]], i64 [[IV]]1089; CHECK-NEXT: [[L:%.*]] = load i32, ptr [[GEP_SRC]], align 41090; CHECK-NEXT: [[ICMP:%.*]] = icmp eq i32 [[L]], 01091; CHECK-NEXT: br i1 [[ICMP]], label [[LOOP_LATCH]], label [[THEN:%.*]]1092; CHECK: then:1093; CHECK-NEXT: [[SDIV:%.*]] = sdiv i32 [[L]], 01094; CHECK-NEXT: br label [[LOOP_LATCH]]1095; CHECK: loop.latch:1096; CHECK-NEXT: [[MERGE:%.*]] = phi i32 [ [[SDIV]], [[THEN]] ], [ 0, [[LOOP_HEADER]] ]1097; CHECK-NEXT: [[GEP_DST:%.*]] = getelementptr inbounds i32, ptr [[DST]], i64 [[IV]]1098; CHECK-NEXT: store i32 [[MERGE]], ptr [[GEP_DST]], align 41099; CHECK-NEXT: [[IV_NEXT]] = add i64 [[IV]], 11100; CHECK-NEXT: [[EC:%.*]] = icmp ult i64 [[IV]], 161101; CHECK-NEXT: br i1 [[EC]], label [[LOOP_HEADER]], label [[EXIT:%.*]], !llvm.loop [[LOOP15:![0-9]+]]1102; CHECK: exit:1103; CHECK-NEXT: ret void1104;1105bb:1106 br label %loop.header1107 1108loop.header:1109 %iv = phi i64 [ %iv.next, %loop.latch ], [ 0, %bb ]1110 %gep.src = getelementptr inbounds i32, ptr %src, i64 %iv1111 %l = load i32, ptr %gep.src, align 41112 %icmp = icmp eq i32 %l, 01113 br i1 %icmp, label %loop.latch, label %then1114 1115then:1116 %sdiv = sdiv i32 %l, 01117 br label %loop.latch1118 1119loop.latch:1120 %merge = phi i32 [ %sdiv, %then ], [ 0, %loop.header ]1121 %gep.dst = getelementptr inbounds i32, ptr %dst, i64 %iv1122 store i32 %merge, ptr %gep.dst, align 41123 %iv.next = add i64 %iv, 11124 %ec = icmp ult i64 %iv, 161125 br i1 %ec, label %loop.header, label %exit1126 1127exit:1128 ret void1129}1130 1131; Test case for https://github.com/llvm/llvm-project/issues/158660.1132define i64 @test_predicated_udiv(i32 %d, i1 %c) #2 {1133; CHECK-LABEL: @test_predicated_udiv(1134; CHECK-NEXT: iter.check:1135; CHECK-NEXT: br i1 false, label [[VEC_EPILOG_SCALAR_PH:%.*]], label [[VECTOR_MAIN_LOOP_ITER_CHECK:%.*]]1136; CHECK: vector.main.loop.iter.check:1137; CHECK-NEXT: br i1 false, label [[VEC_EPILOG_PH:%.*]], label [[VECTOR_PH:%.*]]1138; CHECK: vector.ph:1139; CHECK-NEXT: [[BROADCAST_SPLATINSERT:%.*]] = insertelement <32 x i1> poison, i1 [[C:%.*]], i64 01140; CHECK-NEXT: [[BROADCAST_SPLAT:%.*]] = shufflevector <32 x i1> [[BROADCAST_SPLATINSERT]], <32 x i1> poison, <32 x i32> zeroinitializer1141; CHECK-NEXT: [[TMP0:%.*]] = xor <32 x i1> [[BROADCAST_SPLAT]], splat (i1 true)1142; CHECK-NEXT: br label [[VECTOR_BODY:%.*]]1143; CHECK: vector.body:1144; CHECK-NEXT: [[INDEX:%.*]] = phi i32 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[PRED_UDIV_CONTINUE62:%.*]] ]1145; CHECK-NEXT: [[VEC_IND:%.*]] = phi <32 x i32> [ <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23, i32 24, i32 25, i32 26, i32 27, i32 28, i32 29, i32 30, i32 31>, [[VECTOR_PH]] ], [ [[VEC_IND_NEXT:%.*]], [[PRED_UDIV_CONTINUE62]] ]1146; CHECK-NEXT: [[TMP1:%.*]] = call <32 x i32> @llvm.usub.sat.v32i32(<32 x i32> [[VEC_IND]], <32 x i32> splat (i32 1))1147; CHECK-NEXT: [[TMP2:%.*]] = extractelement <32 x i1> [[TMP0]], i32 01148; CHECK-NEXT: br i1 [[TMP2]], label [[PRED_UDIV_IF:%.*]], label [[PRED_UDIV_CONTINUE:%.*]]1149; CHECK: pred.udiv.if:1150; CHECK-NEXT: [[TMP3:%.*]] = extractelement <32 x i32> [[TMP1]], i32 01151; CHECK-NEXT: [[TMP4:%.*]] = udiv i32 [[TMP3]], [[D:%.*]]1152; CHECK-NEXT: [[TMP5:%.*]] = insertelement <32 x i32> poison, i32 [[TMP4]], i32 01153; CHECK-NEXT: br label [[PRED_UDIV_CONTINUE]]1154; CHECK: pred.udiv.continue:1155; CHECK-NEXT: [[TMP6:%.*]] = phi <32 x i32> [ poison, [[VECTOR_BODY]] ], [ [[TMP5]], [[PRED_UDIV_IF]] ]1156; CHECK-NEXT: [[TMP7:%.*]] = extractelement <32 x i1> [[TMP0]], i32 11157; CHECK-NEXT: br i1 [[TMP7]], label [[PRED_UDIV_IF1:%.*]], label [[PRED_UDIV_CONTINUE2:%.*]]1158; CHECK: pred.udiv.if1:1159; CHECK-NEXT: [[TMP8:%.*]] = extractelement <32 x i32> [[TMP1]], i32 11160; CHECK-NEXT: [[TMP9:%.*]] = udiv i32 [[TMP8]], [[D]]1161; CHECK-NEXT: [[TMP10:%.*]] = insertelement <32 x i32> [[TMP6]], i32 [[TMP9]], i32 11162; CHECK-NEXT: br label [[PRED_UDIV_CONTINUE2]]1163; CHECK: pred.udiv.continue2:1164; CHECK-NEXT: [[TMP11:%.*]] = phi <32 x i32> [ [[TMP6]], [[PRED_UDIV_CONTINUE]] ], [ [[TMP10]], [[PRED_UDIV_IF1]] ]1165; CHECK-NEXT: [[TMP12:%.*]] = extractelement <32 x i1> [[TMP0]], i32 21166; CHECK-NEXT: br i1 [[TMP12]], label [[PRED_UDIV_IF3:%.*]], label [[PRED_UDIV_CONTINUE4:%.*]]1167; CHECK: pred.udiv.if3:1168; CHECK-NEXT: [[TMP13:%.*]] = extractelement <32 x i32> [[TMP1]], i32 21169; CHECK-NEXT: [[TMP14:%.*]] = udiv i32 [[TMP13]], [[D]]1170; CHECK-NEXT: [[TMP15:%.*]] = insertelement <32 x i32> [[TMP11]], i32 [[TMP14]], i32 21171; CHECK-NEXT: br label [[PRED_UDIV_CONTINUE4]]1172; CHECK: pred.udiv.continue4:1173; CHECK-NEXT: [[TMP16:%.*]] = phi <32 x i32> [ [[TMP11]], [[PRED_UDIV_CONTINUE2]] ], [ [[TMP15]], [[PRED_UDIV_IF3]] ]1174; CHECK-NEXT: [[TMP17:%.*]] = extractelement <32 x i1> [[TMP0]], i32 31175; CHECK-NEXT: br i1 [[TMP17]], label [[PRED_UDIV_IF5:%.*]], label [[PRED_UDIV_CONTINUE6:%.*]]1176; CHECK: pred.udiv.if5:1177; CHECK-NEXT: [[TMP18:%.*]] = extractelement <32 x i32> [[TMP1]], i32 31178; CHECK-NEXT: [[TMP19:%.*]] = udiv i32 [[TMP18]], [[D]]1179; CHECK-NEXT: [[TMP20:%.*]] = insertelement <32 x i32> [[TMP16]], i32 [[TMP19]], i32 31180; CHECK-NEXT: br label [[PRED_UDIV_CONTINUE6]]1181; CHECK: pred.udiv.continue6:1182; CHECK-NEXT: [[TMP21:%.*]] = phi <32 x i32> [ [[TMP16]], [[PRED_UDIV_CONTINUE4]] ], [ [[TMP20]], [[PRED_UDIV_IF5]] ]1183; CHECK-NEXT: [[TMP22:%.*]] = extractelement <32 x i1> [[TMP0]], i32 41184; CHECK-NEXT: br i1 [[TMP22]], label [[PRED_UDIV_IF7:%.*]], label [[PRED_UDIV_CONTINUE8:%.*]]1185; CHECK: pred.udiv.if7:1186; CHECK-NEXT: [[TMP23:%.*]] = extractelement <32 x i32> [[TMP1]], i32 41187; CHECK-NEXT: [[TMP24:%.*]] = udiv i32 [[TMP23]], [[D]]1188; CHECK-NEXT: [[TMP25:%.*]] = insertelement <32 x i32> [[TMP21]], i32 [[TMP24]], i32 41189; CHECK-NEXT: br label [[PRED_UDIV_CONTINUE8]]1190; CHECK: pred.udiv.continue8:1191; CHECK-NEXT: [[TMP26:%.*]] = phi <32 x i32> [ [[TMP21]], [[PRED_UDIV_CONTINUE6]] ], [ [[TMP25]], [[PRED_UDIV_IF7]] ]1192; CHECK-NEXT: [[TMP27:%.*]] = extractelement <32 x i1> [[TMP0]], i32 51193; CHECK-NEXT: br i1 [[TMP27]], label [[PRED_UDIV_IF9:%.*]], label [[PRED_UDIV_CONTINUE10:%.*]]1194; CHECK: pred.udiv.if9:1195; CHECK-NEXT: [[TMP28:%.*]] = extractelement <32 x i32> [[TMP1]], i32 51196; CHECK-NEXT: [[TMP29:%.*]] = udiv i32 [[TMP28]], [[D]]1197; CHECK-NEXT: [[TMP30:%.*]] = insertelement <32 x i32> [[TMP26]], i32 [[TMP29]], i32 51198; CHECK-NEXT: br label [[PRED_UDIV_CONTINUE10]]1199; CHECK: pred.udiv.continue10:1200; CHECK-NEXT: [[TMP31:%.*]] = phi <32 x i32> [ [[TMP26]], [[PRED_UDIV_CONTINUE8]] ], [ [[TMP30]], [[PRED_UDIV_IF9]] ]1201; CHECK-NEXT: [[TMP32:%.*]] = extractelement <32 x i1> [[TMP0]], i32 61202; CHECK-NEXT: br i1 [[TMP32]], label [[PRED_UDIV_IF11:%.*]], label [[PRED_UDIV_CONTINUE12:%.*]]1203; CHECK: pred.udiv.if11:1204; CHECK-NEXT: [[TMP33:%.*]] = extractelement <32 x i32> [[TMP1]], i32 61205; CHECK-NEXT: [[TMP34:%.*]] = udiv i32 [[TMP33]], [[D]]1206; CHECK-NEXT: [[TMP35:%.*]] = insertelement <32 x i32> [[TMP31]], i32 [[TMP34]], i32 61207; CHECK-NEXT: br label [[PRED_UDIV_CONTINUE12]]1208; CHECK: pred.udiv.continue12:1209; CHECK-NEXT: [[TMP36:%.*]] = phi <32 x i32> [ [[TMP31]], [[PRED_UDIV_CONTINUE10]] ], [ [[TMP35]], [[PRED_UDIV_IF11]] ]1210; CHECK-NEXT: [[TMP37:%.*]] = extractelement <32 x i1> [[TMP0]], i32 71211; CHECK-NEXT: br i1 [[TMP37]], label [[PRED_UDIV_IF13:%.*]], label [[PRED_UDIV_CONTINUE14:%.*]]1212; CHECK: pred.udiv.if13:1213; CHECK-NEXT: [[TMP38:%.*]] = extractelement <32 x i32> [[TMP1]], i32 71214; CHECK-NEXT: [[TMP39:%.*]] = udiv i32 [[TMP38]], [[D]]1215; CHECK-NEXT: [[TMP40:%.*]] = insertelement <32 x i32> [[TMP36]], i32 [[TMP39]], i32 71216; CHECK-NEXT: br label [[PRED_UDIV_CONTINUE14]]1217; CHECK: pred.udiv.continue14:1218; CHECK-NEXT: [[TMP41:%.*]] = phi <32 x i32> [ [[TMP36]], [[PRED_UDIV_CONTINUE12]] ], [ [[TMP40]], [[PRED_UDIV_IF13]] ]1219; CHECK-NEXT: [[TMP42:%.*]] = extractelement <32 x i1> [[TMP0]], i32 81220; CHECK-NEXT: br i1 [[TMP42]], label [[PRED_UDIV_IF15:%.*]], label [[PRED_UDIV_CONTINUE16:%.*]]1221; CHECK: pred.udiv.if15:1222; CHECK-NEXT: [[TMP43:%.*]] = extractelement <32 x i32> [[TMP1]], i32 81223; CHECK-NEXT: [[TMP44:%.*]] = udiv i32 [[TMP43]], [[D]]1224; CHECK-NEXT: [[TMP45:%.*]] = insertelement <32 x i32> [[TMP41]], i32 [[TMP44]], i32 81225; CHECK-NEXT: br label [[PRED_UDIV_CONTINUE16]]1226; CHECK: pred.udiv.continue16:1227; CHECK-NEXT: [[TMP46:%.*]] = phi <32 x i32> [ [[TMP41]], [[PRED_UDIV_CONTINUE14]] ], [ [[TMP45]], [[PRED_UDIV_IF15]] ]1228; CHECK-NEXT: [[TMP47:%.*]] = extractelement <32 x i1> [[TMP0]], i32 91229; CHECK-NEXT: br i1 [[TMP47]], label [[PRED_UDIV_IF17:%.*]], label [[PRED_UDIV_CONTINUE18:%.*]]1230; CHECK: pred.udiv.if17:1231; CHECK-NEXT: [[TMP48:%.*]] = extractelement <32 x i32> [[TMP1]], i32 91232; CHECK-NEXT: [[TMP49:%.*]] = udiv i32 [[TMP48]], [[D]]1233; CHECK-NEXT: [[TMP50:%.*]] = insertelement <32 x i32> [[TMP46]], i32 [[TMP49]], i32 91234; CHECK-NEXT: br label [[PRED_UDIV_CONTINUE18]]1235; CHECK: pred.udiv.continue18:1236; CHECK-NEXT: [[TMP51:%.*]] = phi <32 x i32> [ [[TMP46]], [[PRED_UDIV_CONTINUE16]] ], [ [[TMP50]], [[PRED_UDIV_IF17]] ]1237; CHECK-NEXT: [[TMP52:%.*]] = extractelement <32 x i1> [[TMP0]], i32 101238; CHECK-NEXT: br i1 [[TMP52]], label [[PRED_UDIV_IF19:%.*]], label [[PRED_UDIV_CONTINUE20:%.*]]1239; CHECK: pred.udiv.if19:1240; CHECK-NEXT: [[TMP53:%.*]] = extractelement <32 x i32> [[TMP1]], i32 101241; CHECK-NEXT: [[TMP54:%.*]] = udiv i32 [[TMP53]], [[D]]1242; CHECK-NEXT: [[TMP55:%.*]] = insertelement <32 x i32> [[TMP51]], i32 [[TMP54]], i32 101243; CHECK-NEXT: br label [[PRED_UDIV_CONTINUE20]]1244; CHECK: pred.udiv.continue20:1245; CHECK-NEXT: [[TMP56:%.*]] = phi <32 x i32> [ [[TMP51]], [[PRED_UDIV_CONTINUE18]] ], [ [[TMP55]], [[PRED_UDIV_IF19]] ]1246; CHECK-NEXT: [[TMP57:%.*]] = extractelement <32 x i1> [[TMP0]], i32 111247; CHECK-NEXT: br i1 [[TMP57]], label [[PRED_UDIV_IF21:%.*]], label [[PRED_UDIV_CONTINUE22:%.*]]1248; CHECK: pred.udiv.if21:1249; CHECK-NEXT: [[TMP58:%.*]] = extractelement <32 x i32> [[TMP1]], i32 111250; CHECK-NEXT: [[TMP59:%.*]] = udiv i32 [[TMP58]], [[D]]1251; CHECK-NEXT: [[TMP60:%.*]] = insertelement <32 x i32> [[TMP56]], i32 [[TMP59]], i32 111252; CHECK-NEXT: br label [[PRED_UDIV_CONTINUE22]]1253; CHECK: pred.udiv.continue22:1254; CHECK-NEXT: [[TMP61:%.*]] = phi <32 x i32> [ [[TMP56]], [[PRED_UDIV_CONTINUE20]] ], [ [[TMP60]], [[PRED_UDIV_IF21]] ]1255; CHECK-NEXT: [[TMP62:%.*]] = extractelement <32 x i1> [[TMP0]], i32 121256; CHECK-NEXT: br i1 [[TMP62]], label [[PRED_UDIV_IF23:%.*]], label [[PRED_UDIV_CONTINUE24:%.*]]1257; CHECK: pred.udiv.if23:1258; CHECK-NEXT: [[TMP63:%.*]] = extractelement <32 x i32> [[TMP1]], i32 121259; CHECK-NEXT: [[TMP64:%.*]] = udiv i32 [[TMP63]], [[D]]1260; CHECK-NEXT: [[TMP65:%.*]] = insertelement <32 x i32> [[TMP61]], i32 [[TMP64]], i32 121261; CHECK-NEXT: br label [[PRED_UDIV_CONTINUE24]]1262; CHECK: pred.udiv.continue24:1263; CHECK-NEXT: [[TMP66:%.*]] = phi <32 x i32> [ [[TMP61]], [[PRED_UDIV_CONTINUE22]] ], [ [[TMP65]], [[PRED_UDIV_IF23]] ]1264; CHECK-NEXT: [[TMP67:%.*]] = extractelement <32 x i1> [[TMP0]], i32 131265; CHECK-NEXT: br i1 [[TMP67]], label [[PRED_UDIV_IF25:%.*]], label [[PRED_UDIV_CONTINUE26:%.*]]1266; CHECK: pred.udiv.if25:1267; CHECK-NEXT: [[TMP68:%.*]] = extractelement <32 x i32> [[TMP1]], i32 131268; CHECK-NEXT: [[TMP69:%.*]] = udiv i32 [[TMP68]], [[D]]1269; CHECK-NEXT: [[TMP70:%.*]] = insertelement <32 x i32> [[TMP66]], i32 [[TMP69]], i32 131270; CHECK-NEXT: br label [[PRED_UDIV_CONTINUE26]]1271; CHECK: pred.udiv.continue26:1272; CHECK-NEXT: [[TMP71:%.*]] = phi <32 x i32> [ [[TMP66]], [[PRED_UDIV_CONTINUE24]] ], [ [[TMP70]], [[PRED_UDIV_IF25]] ]1273; CHECK-NEXT: [[TMP72:%.*]] = extractelement <32 x i1> [[TMP0]], i32 141274; CHECK-NEXT: br i1 [[TMP72]], label [[PRED_UDIV_IF27:%.*]], label [[PRED_UDIV_CONTINUE28:%.*]]1275; CHECK: pred.udiv.if27:1276; CHECK-NEXT: [[TMP73:%.*]] = extractelement <32 x i32> [[TMP1]], i32 141277; CHECK-NEXT: [[TMP74:%.*]] = udiv i32 [[TMP73]], [[D]]1278; CHECK-NEXT: [[TMP75:%.*]] = insertelement <32 x i32> [[TMP71]], i32 [[TMP74]], i32 141279; CHECK-NEXT: br label [[PRED_UDIV_CONTINUE28]]1280; CHECK: pred.udiv.continue28:1281; CHECK-NEXT: [[TMP76:%.*]] = phi <32 x i32> [ [[TMP71]], [[PRED_UDIV_CONTINUE26]] ], [ [[TMP75]], [[PRED_UDIV_IF27]] ]1282; CHECK-NEXT: [[TMP77:%.*]] = extractelement <32 x i1> [[TMP0]], i32 151283; CHECK-NEXT: br i1 [[TMP77]], label [[PRED_UDIV_IF29:%.*]], label [[PRED_UDIV_CONTINUE30:%.*]]1284; CHECK: pred.udiv.if29:1285; CHECK-NEXT: [[TMP78:%.*]] = extractelement <32 x i32> [[TMP1]], i32 151286; CHECK-NEXT: [[TMP79:%.*]] = udiv i32 [[TMP78]], [[D]]1287; CHECK-NEXT: [[TMP80:%.*]] = insertelement <32 x i32> [[TMP76]], i32 [[TMP79]], i32 151288; CHECK-NEXT: br label [[PRED_UDIV_CONTINUE30]]1289; CHECK: pred.udiv.continue30:1290; CHECK-NEXT: [[TMP81:%.*]] = phi <32 x i32> [ [[TMP76]], [[PRED_UDIV_CONTINUE28]] ], [ [[TMP80]], [[PRED_UDIV_IF29]] ]1291; CHECK-NEXT: [[TMP82:%.*]] = extractelement <32 x i1> [[TMP0]], i32 161292; CHECK-NEXT: br i1 [[TMP82]], label [[PRED_UDIV_IF31:%.*]], label [[PRED_UDIV_CONTINUE32:%.*]]1293; CHECK: pred.udiv.if31:1294; CHECK-NEXT: [[TMP83:%.*]] = extractelement <32 x i32> [[TMP1]], i32 161295; CHECK-NEXT: [[TMP84:%.*]] = udiv i32 [[TMP83]], [[D]]1296; CHECK-NEXT: [[TMP85:%.*]] = insertelement <32 x i32> [[TMP81]], i32 [[TMP84]], i32 161297; CHECK-NEXT: br label [[PRED_UDIV_CONTINUE32]]1298; CHECK: pred.udiv.continue32:1299; CHECK-NEXT: [[TMP86:%.*]] = phi <32 x i32> [ [[TMP81]], [[PRED_UDIV_CONTINUE30]] ], [ [[TMP85]], [[PRED_UDIV_IF31]] ]1300; CHECK-NEXT: [[TMP87:%.*]] = extractelement <32 x i1> [[TMP0]], i32 171301; CHECK-NEXT: br i1 [[TMP87]], label [[PRED_UDIV_IF33:%.*]], label [[PRED_UDIV_CONTINUE34:%.*]]1302; CHECK: pred.udiv.if33:1303; CHECK-NEXT: [[TMP88:%.*]] = extractelement <32 x i32> [[TMP1]], i32 171304; CHECK-NEXT: [[TMP89:%.*]] = udiv i32 [[TMP88]], [[D]]1305; CHECK-NEXT: [[TMP90:%.*]] = insertelement <32 x i32> [[TMP86]], i32 [[TMP89]], i32 171306; CHECK-NEXT: br label [[PRED_UDIV_CONTINUE34]]1307; CHECK: pred.udiv.continue34:1308; CHECK-NEXT: [[TMP91:%.*]] = phi <32 x i32> [ [[TMP86]], [[PRED_UDIV_CONTINUE32]] ], [ [[TMP90]], [[PRED_UDIV_IF33]] ]1309; CHECK-NEXT: [[TMP92:%.*]] = extractelement <32 x i1> [[TMP0]], i32 181310; CHECK-NEXT: br i1 [[TMP92]], label [[PRED_UDIV_IF35:%.*]], label [[PRED_UDIV_CONTINUE36:%.*]]1311; CHECK: pred.udiv.if35:1312; CHECK-NEXT: [[TMP93:%.*]] = extractelement <32 x i32> [[TMP1]], i32 181313; CHECK-NEXT: [[TMP94:%.*]] = udiv i32 [[TMP93]], [[D]]1314; CHECK-NEXT: [[TMP95:%.*]] = insertelement <32 x i32> [[TMP91]], i32 [[TMP94]], i32 181315; CHECK-NEXT: br label [[PRED_UDIV_CONTINUE36]]1316; CHECK: pred.udiv.continue36:1317; CHECK-NEXT: [[TMP96:%.*]] = phi <32 x i32> [ [[TMP91]], [[PRED_UDIV_CONTINUE34]] ], [ [[TMP95]], [[PRED_UDIV_IF35]] ]1318; CHECK-NEXT: [[TMP97:%.*]] = extractelement <32 x i1> [[TMP0]], i32 191319; CHECK-NEXT: br i1 [[TMP97]], label [[PRED_UDIV_IF37:%.*]], label [[PRED_UDIV_CONTINUE38:%.*]]1320; CHECK: pred.udiv.if37:1321; CHECK-NEXT: [[TMP98:%.*]] = extractelement <32 x i32> [[TMP1]], i32 191322; CHECK-NEXT: [[TMP99:%.*]] = udiv i32 [[TMP98]], [[D]]1323; CHECK-NEXT: [[TMP100:%.*]] = insertelement <32 x i32> [[TMP96]], i32 [[TMP99]], i32 191324; CHECK-NEXT: br label [[PRED_UDIV_CONTINUE38]]1325; CHECK: pred.udiv.continue38:1326; CHECK-NEXT: [[TMP101:%.*]] = phi <32 x i32> [ [[TMP96]], [[PRED_UDIV_CONTINUE36]] ], [ [[TMP100]], [[PRED_UDIV_IF37]] ]1327; CHECK-NEXT: [[TMP102:%.*]] = extractelement <32 x i1> [[TMP0]], i32 201328; CHECK-NEXT: br i1 [[TMP102]], label [[PRED_UDIV_IF39:%.*]], label [[PRED_UDIV_CONTINUE40:%.*]]1329; CHECK: pred.udiv.if39:1330; CHECK-NEXT: [[TMP103:%.*]] = extractelement <32 x i32> [[TMP1]], i32 201331; CHECK-NEXT: [[TMP104:%.*]] = udiv i32 [[TMP103]], [[D]]1332; CHECK-NEXT: [[TMP105:%.*]] = insertelement <32 x i32> [[TMP101]], i32 [[TMP104]], i32 201333; CHECK-NEXT: br label [[PRED_UDIV_CONTINUE40]]1334; CHECK: pred.udiv.continue40:1335; CHECK-NEXT: [[TMP106:%.*]] = phi <32 x i32> [ [[TMP101]], [[PRED_UDIV_CONTINUE38]] ], [ [[TMP105]], [[PRED_UDIV_IF39]] ]1336; CHECK-NEXT: [[TMP107:%.*]] = extractelement <32 x i1> [[TMP0]], i32 211337; CHECK-NEXT: br i1 [[TMP107]], label [[PRED_UDIV_IF41:%.*]], label [[PRED_UDIV_CONTINUE42:%.*]]1338; CHECK: pred.udiv.if41:1339; CHECK-NEXT: [[TMP108:%.*]] = extractelement <32 x i32> [[TMP1]], i32 211340; CHECK-NEXT: [[TMP109:%.*]] = udiv i32 [[TMP108]], [[D]]1341; CHECK-NEXT: [[TMP110:%.*]] = insertelement <32 x i32> [[TMP106]], i32 [[TMP109]], i32 211342; CHECK-NEXT: br label [[PRED_UDIV_CONTINUE42]]1343; CHECK: pred.udiv.continue42:1344; CHECK-NEXT: [[TMP111:%.*]] = phi <32 x i32> [ [[TMP106]], [[PRED_UDIV_CONTINUE40]] ], [ [[TMP110]], [[PRED_UDIV_IF41]] ]1345; CHECK-NEXT: [[TMP112:%.*]] = extractelement <32 x i1> [[TMP0]], i32 221346; CHECK-NEXT: br i1 [[TMP112]], label [[PRED_UDIV_IF43:%.*]], label [[PRED_UDIV_CONTINUE44:%.*]]1347; CHECK: pred.udiv.if43:1348; CHECK-NEXT: [[TMP113:%.*]] = extractelement <32 x i32> [[TMP1]], i32 221349; CHECK-NEXT: [[TMP114:%.*]] = udiv i32 [[TMP113]], [[D]]1350; CHECK-NEXT: [[TMP115:%.*]] = insertelement <32 x i32> [[TMP111]], i32 [[TMP114]], i32 221351; CHECK-NEXT: br label [[PRED_UDIV_CONTINUE44]]1352; CHECK: pred.udiv.continue44:1353; CHECK-NEXT: [[TMP116:%.*]] = phi <32 x i32> [ [[TMP111]], [[PRED_UDIV_CONTINUE42]] ], [ [[TMP115]], [[PRED_UDIV_IF43]] ]1354; CHECK-NEXT: [[TMP117:%.*]] = extractelement <32 x i1> [[TMP0]], i32 231355; CHECK-NEXT: br i1 [[TMP117]], label [[PRED_UDIV_IF45:%.*]], label [[PRED_UDIV_CONTINUE46:%.*]]1356; CHECK: pred.udiv.if45:1357; CHECK-NEXT: [[TMP118:%.*]] = extractelement <32 x i32> [[TMP1]], i32 231358; CHECK-NEXT: [[TMP119:%.*]] = udiv i32 [[TMP118]], [[D]]1359; CHECK-NEXT: [[TMP120:%.*]] = insertelement <32 x i32> [[TMP116]], i32 [[TMP119]], i32 231360; CHECK-NEXT: br label [[PRED_UDIV_CONTINUE46]]1361; CHECK: pred.udiv.continue46:1362; CHECK-NEXT: [[TMP121:%.*]] = phi <32 x i32> [ [[TMP116]], [[PRED_UDIV_CONTINUE44]] ], [ [[TMP120]], [[PRED_UDIV_IF45]] ]1363; CHECK-NEXT: [[TMP122:%.*]] = extractelement <32 x i1> [[TMP0]], i32 241364; CHECK-NEXT: br i1 [[TMP122]], label [[PRED_UDIV_IF47:%.*]], label [[PRED_UDIV_CONTINUE48:%.*]]1365; CHECK: pred.udiv.if47:1366; CHECK-NEXT: [[TMP123:%.*]] = extractelement <32 x i32> [[TMP1]], i32 241367; CHECK-NEXT: [[TMP124:%.*]] = udiv i32 [[TMP123]], [[D]]1368; CHECK-NEXT: [[TMP125:%.*]] = insertelement <32 x i32> [[TMP121]], i32 [[TMP124]], i32 241369; CHECK-NEXT: br label [[PRED_UDIV_CONTINUE48]]1370; CHECK: pred.udiv.continue48:1371; CHECK-NEXT: [[TMP126:%.*]] = phi <32 x i32> [ [[TMP121]], [[PRED_UDIV_CONTINUE46]] ], [ [[TMP125]], [[PRED_UDIV_IF47]] ]1372; CHECK-NEXT: [[TMP127:%.*]] = extractelement <32 x i1> [[TMP0]], i32 251373; CHECK-NEXT: br i1 [[TMP127]], label [[PRED_UDIV_IF49:%.*]], label [[PRED_UDIV_CONTINUE50:%.*]]1374; CHECK: pred.udiv.if49:1375; CHECK-NEXT: [[TMP128:%.*]] = extractelement <32 x i32> [[TMP1]], i32 251376; CHECK-NEXT: [[TMP129:%.*]] = udiv i32 [[TMP128]], [[D]]1377; CHECK-NEXT: [[TMP130:%.*]] = insertelement <32 x i32> [[TMP126]], i32 [[TMP129]], i32 251378; CHECK-NEXT: br label [[PRED_UDIV_CONTINUE50]]1379; CHECK: pred.udiv.continue50:1380; CHECK-NEXT: [[TMP131:%.*]] = phi <32 x i32> [ [[TMP126]], [[PRED_UDIV_CONTINUE48]] ], [ [[TMP130]], [[PRED_UDIV_IF49]] ]1381; CHECK-NEXT: [[TMP132:%.*]] = extractelement <32 x i1> [[TMP0]], i32 261382; CHECK-NEXT: br i1 [[TMP132]], label [[PRED_UDIV_IF51:%.*]], label [[PRED_UDIV_CONTINUE52:%.*]]1383; CHECK: pred.udiv.if51:1384; CHECK-NEXT: [[TMP133:%.*]] = extractelement <32 x i32> [[TMP1]], i32 261385; CHECK-NEXT: [[TMP134:%.*]] = udiv i32 [[TMP133]], [[D]]1386; CHECK-NEXT: [[TMP135:%.*]] = insertelement <32 x i32> [[TMP131]], i32 [[TMP134]], i32 261387; CHECK-NEXT: br label [[PRED_UDIV_CONTINUE52]]1388; CHECK: pred.udiv.continue52:1389; CHECK-NEXT: [[TMP136:%.*]] = phi <32 x i32> [ [[TMP131]], [[PRED_UDIV_CONTINUE50]] ], [ [[TMP135]], [[PRED_UDIV_IF51]] ]1390; CHECK-NEXT: [[TMP137:%.*]] = extractelement <32 x i1> [[TMP0]], i32 271391; CHECK-NEXT: br i1 [[TMP137]], label [[PRED_UDIV_IF53:%.*]], label [[PRED_UDIV_CONTINUE54:%.*]]1392; CHECK: pred.udiv.if53:1393; CHECK-NEXT: [[TMP138:%.*]] = extractelement <32 x i32> [[TMP1]], i32 271394; CHECK-NEXT: [[TMP139:%.*]] = udiv i32 [[TMP138]], [[D]]1395; CHECK-NEXT: [[TMP140:%.*]] = insertelement <32 x i32> [[TMP136]], i32 [[TMP139]], i32 271396; CHECK-NEXT: br label [[PRED_UDIV_CONTINUE54]]1397; CHECK: pred.udiv.continue54:1398; CHECK-NEXT: [[TMP141:%.*]] = phi <32 x i32> [ [[TMP136]], [[PRED_UDIV_CONTINUE52]] ], [ [[TMP140]], [[PRED_UDIV_IF53]] ]1399; CHECK-NEXT: [[TMP142:%.*]] = extractelement <32 x i1> [[TMP0]], i32 281400; CHECK-NEXT: br i1 [[TMP142]], label [[PRED_UDIV_IF55:%.*]], label [[PRED_UDIV_CONTINUE56:%.*]]1401; CHECK: pred.udiv.if55:1402; CHECK-NEXT: [[TMP143:%.*]] = extractelement <32 x i32> [[TMP1]], i32 281403; CHECK-NEXT: [[TMP144:%.*]] = udiv i32 [[TMP143]], [[D]]1404; CHECK-NEXT: [[TMP145:%.*]] = insertelement <32 x i32> [[TMP141]], i32 [[TMP144]], i32 281405; CHECK-NEXT: br label [[PRED_UDIV_CONTINUE56]]1406; CHECK: pred.udiv.continue56:1407; CHECK-NEXT: [[TMP146:%.*]] = phi <32 x i32> [ [[TMP141]], [[PRED_UDIV_CONTINUE54]] ], [ [[TMP145]], [[PRED_UDIV_IF55]] ]1408; CHECK-NEXT: [[TMP147:%.*]] = extractelement <32 x i1> [[TMP0]], i32 291409; CHECK-NEXT: br i1 [[TMP147]], label [[PRED_UDIV_IF57:%.*]], label [[PRED_UDIV_CONTINUE58:%.*]]1410; CHECK: pred.udiv.if57:1411; CHECK-NEXT: [[TMP148:%.*]] = extractelement <32 x i32> [[TMP1]], i32 291412; CHECK-NEXT: [[TMP149:%.*]] = udiv i32 [[TMP148]], [[D]]1413; CHECK-NEXT: [[TMP150:%.*]] = insertelement <32 x i32> [[TMP146]], i32 [[TMP149]], i32 291414; CHECK-NEXT: br label [[PRED_UDIV_CONTINUE58]]1415; CHECK: pred.udiv.continue58:1416; CHECK-NEXT: [[TMP151:%.*]] = phi <32 x i32> [ [[TMP146]], [[PRED_UDIV_CONTINUE56]] ], [ [[TMP150]], [[PRED_UDIV_IF57]] ]1417; CHECK-NEXT: [[TMP152:%.*]] = extractelement <32 x i1> [[TMP0]], i32 301418; CHECK-NEXT: br i1 [[TMP152]], label [[PRED_UDIV_IF59:%.*]], label [[PRED_UDIV_CONTINUE60:%.*]]1419; CHECK: pred.udiv.if59:1420; CHECK-NEXT: [[TMP153:%.*]] = extractelement <32 x i32> [[TMP1]], i32 301421; CHECK-NEXT: [[TMP154:%.*]] = udiv i32 [[TMP153]], [[D]]1422; CHECK-NEXT: [[TMP155:%.*]] = insertelement <32 x i32> [[TMP151]], i32 [[TMP154]], i32 301423; CHECK-NEXT: br label [[PRED_UDIV_CONTINUE60]]1424; CHECK: pred.udiv.continue60:1425; CHECK-NEXT: [[TMP156:%.*]] = phi <32 x i32> [ [[TMP151]], [[PRED_UDIV_CONTINUE58]] ], [ [[TMP155]], [[PRED_UDIV_IF59]] ]1426; CHECK-NEXT: [[TMP157:%.*]] = extractelement <32 x i1> [[TMP0]], i32 311427; CHECK-NEXT: br i1 [[TMP157]], label [[PRED_UDIV_IF61:%.*]], label [[PRED_UDIV_CONTINUE62]]1428; CHECK: pred.udiv.if61:1429; CHECK-NEXT: [[TMP158:%.*]] = extractelement <32 x i32> [[TMP1]], i32 311430; CHECK-NEXT: [[TMP159:%.*]] = udiv i32 [[TMP158]], [[D]]1431; CHECK-NEXT: [[TMP160:%.*]] = insertelement <32 x i32> [[TMP156]], i32 [[TMP159]], i32 311432; CHECK-NEXT: br label [[PRED_UDIV_CONTINUE62]]1433; CHECK: pred.udiv.continue62:1434; CHECK-NEXT: [[TMP161:%.*]] = phi <32 x i32> [ [[TMP156]], [[PRED_UDIV_CONTINUE60]] ], [ [[TMP160]], [[PRED_UDIV_IF61]] ]1435; CHECK-NEXT: [[TMP162:%.*]] = zext <32 x i32> [[TMP161]] to <32 x i64>1436; CHECK-NEXT: [[PREDPHI:%.*]] = select i1 [[C]], <32 x i64> zeroinitializer, <32 x i64> [[TMP162]]1437; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i32 [[INDEX]], 321438; CHECK-NEXT: [[VEC_IND_NEXT]] = add <32 x i32> [[VEC_IND]], splat (i32 32)1439; CHECK-NEXT: [[TMP163:%.*]] = icmp eq i32 [[INDEX_NEXT]], 9921440; CHECK-NEXT: br i1 [[TMP163]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP16:![0-9]+]]1441; CHECK: middle.block:1442; CHECK-NEXT: [[TMP164:%.*]] = extractelement <32 x i64> [[PREDPHI]], i32 311443; CHECK-NEXT: br i1 false, label [[EXIT:%.*]], label [[VEC_EPILOG_ITER_CHECK:%.*]]1444; CHECK: vec.epilog.iter.check:1445; CHECK-NEXT: br i1 false, label [[VEC_EPILOG_SCALAR_PH]], label [[VEC_EPILOG_PH]], !prof [[PROF17:![0-9]+]]1446; CHECK: vec.epilog.ph:1447; CHECK-NEXT: [[BC_RESUME_VAL:%.*]] = phi i32 [ 992, [[VEC_EPILOG_ITER_CHECK]] ], [ 0, [[VECTOR_MAIN_LOOP_ITER_CHECK]] ]1448; CHECK-NEXT: [[BROADCAST_SPLATINSERT63:%.*]] = insertelement <8 x i1> poison, i1 [[C]], i64 01449; CHECK-NEXT: [[BROADCAST_SPLAT64:%.*]] = shufflevector <8 x i1> [[BROADCAST_SPLATINSERT63]], <8 x i1> poison, <8 x i32> zeroinitializer1450; CHECK-NEXT: [[TMP165:%.*]] = xor <8 x i1> [[BROADCAST_SPLAT64]], splat (i1 true)1451; CHECK-NEXT: [[BROADCAST_SPLATINSERT65:%.*]] = insertelement <8 x i32> poison, i32 [[BC_RESUME_VAL]], i64 01452; CHECK-NEXT: [[BROADCAST_SPLAT66:%.*]] = shufflevector <8 x i32> [[BROADCAST_SPLATINSERT65]], <8 x i32> poison, <8 x i32> zeroinitializer1453; CHECK-NEXT: [[INDUCTION:%.*]] = add <8 x i32> [[BROADCAST_SPLAT66]], <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>1454; CHECK-NEXT: br label [[VEC_EPILOG_VECTOR_BODY:%.*]]1455; CHECK: vec.epilog.vector.body:1456; CHECK-NEXT: [[INDEX67:%.*]] = phi i32 [ [[BC_RESUME_VAL]], [[VEC_EPILOG_PH]] ], [ [[INDEX_NEXT86:%.*]], [[PRED_UDIV_CONTINUE84:%.*]] ]1457; CHECK-NEXT: [[VEC_IND68:%.*]] = phi <8 x i32> [ [[INDUCTION]], [[VEC_EPILOG_PH]] ], [ [[VEC_IND_NEXT87:%.*]], [[PRED_UDIV_CONTINUE84]] ]1458; CHECK-NEXT: [[TMP166:%.*]] = call <8 x i32> @llvm.usub.sat.v8i32(<8 x i32> [[VEC_IND68]], <8 x i32> splat (i32 1))1459; CHECK-NEXT: [[TMP167:%.*]] = extractelement <8 x i1> [[TMP165]], i32 01460; CHECK-NEXT: br i1 [[TMP167]], label [[PRED_UDIV_IF69:%.*]], label [[PRED_UDIV_CONTINUE70:%.*]]1461; CHECK: pred.udiv.if69:1462; CHECK-NEXT: [[TMP168:%.*]] = extractelement <8 x i32> [[TMP166]], i32 01463; CHECK-NEXT: [[TMP169:%.*]] = udiv i32 [[TMP168]], [[D]]1464; CHECK-NEXT: [[TMP170:%.*]] = insertelement <8 x i32> poison, i32 [[TMP169]], i32 01465; CHECK-NEXT: br label [[PRED_UDIV_CONTINUE70]]1466; CHECK: pred.udiv.continue70:1467; CHECK-NEXT: [[TMP171:%.*]] = phi <8 x i32> [ poison, [[VEC_EPILOG_VECTOR_BODY]] ], [ [[TMP170]], [[PRED_UDIV_IF69]] ]1468; CHECK-NEXT: [[TMP172:%.*]] = extractelement <8 x i1> [[TMP165]], i32 11469; CHECK-NEXT: br i1 [[TMP172]], label [[PRED_UDIV_IF71:%.*]], label [[PRED_UDIV_CONTINUE72:%.*]]1470; CHECK: pred.udiv.if71:1471; CHECK-NEXT: [[TMP173:%.*]] = extractelement <8 x i32> [[TMP166]], i32 11472; CHECK-NEXT: [[TMP174:%.*]] = udiv i32 [[TMP173]], [[D]]1473; CHECK-NEXT: [[TMP175:%.*]] = insertelement <8 x i32> [[TMP171]], i32 [[TMP174]], i32 11474; CHECK-NEXT: br label [[PRED_UDIV_CONTINUE72]]1475; CHECK: pred.udiv.continue72:1476; CHECK-NEXT: [[TMP176:%.*]] = phi <8 x i32> [ [[TMP171]], [[PRED_UDIV_CONTINUE70]] ], [ [[TMP175]], [[PRED_UDIV_IF71]] ]1477; CHECK-NEXT: [[TMP177:%.*]] = extractelement <8 x i1> [[TMP165]], i32 21478; CHECK-NEXT: br i1 [[TMP177]], label [[PRED_UDIV_IF73:%.*]], label [[PRED_UDIV_CONTINUE74:%.*]]1479; CHECK: pred.udiv.if73:1480; CHECK-NEXT: [[TMP178:%.*]] = extractelement <8 x i32> [[TMP166]], i32 21481; CHECK-NEXT: [[TMP179:%.*]] = udiv i32 [[TMP178]], [[D]]1482; CHECK-NEXT: [[TMP180:%.*]] = insertelement <8 x i32> [[TMP176]], i32 [[TMP179]], i32 21483; CHECK-NEXT: br label [[PRED_UDIV_CONTINUE74]]1484; CHECK: pred.udiv.continue74:1485; CHECK-NEXT: [[TMP181:%.*]] = phi <8 x i32> [ [[TMP176]], [[PRED_UDIV_CONTINUE72]] ], [ [[TMP180]], [[PRED_UDIV_IF73]] ]1486; CHECK-NEXT: [[TMP182:%.*]] = extractelement <8 x i1> [[TMP165]], i32 31487; CHECK-NEXT: br i1 [[TMP182]], label [[PRED_UDIV_IF75:%.*]], label [[PRED_UDIV_CONTINUE76:%.*]]1488; CHECK: pred.udiv.if75:1489; CHECK-NEXT: [[TMP183:%.*]] = extractelement <8 x i32> [[TMP166]], i32 31490; CHECK-NEXT: [[TMP184:%.*]] = udiv i32 [[TMP183]], [[D]]1491; CHECK-NEXT: [[TMP185:%.*]] = insertelement <8 x i32> [[TMP181]], i32 [[TMP184]], i32 31492; CHECK-NEXT: br label [[PRED_UDIV_CONTINUE76]]1493; CHECK: pred.udiv.continue76:1494; CHECK-NEXT: [[TMP186:%.*]] = phi <8 x i32> [ [[TMP181]], [[PRED_UDIV_CONTINUE74]] ], [ [[TMP185]], [[PRED_UDIV_IF75]] ]1495; CHECK-NEXT: [[TMP187:%.*]] = extractelement <8 x i1> [[TMP165]], i32 41496; CHECK-NEXT: br i1 [[TMP187]], label [[PRED_UDIV_IF77:%.*]], label [[PRED_UDIV_CONTINUE78:%.*]]1497; CHECK: pred.udiv.if77:1498; CHECK-NEXT: [[TMP188:%.*]] = extractelement <8 x i32> [[TMP166]], i32 41499; CHECK-NEXT: [[TMP189:%.*]] = udiv i32 [[TMP188]], [[D]]1500; CHECK-NEXT: [[TMP190:%.*]] = insertelement <8 x i32> [[TMP186]], i32 [[TMP189]], i32 41501; CHECK-NEXT: br label [[PRED_UDIV_CONTINUE78]]1502; CHECK: pred.udiv.continue78:1503; CHECK-NEXT: [[TMP191:%.*]] = phi <8 x i32> [ [[TMP186]], [[PRED_UDIV_CONTINUE76]] ], [ [[TMP190]], [[PRED_UDIV_IF77]] ]1504; CHECK-NEXT: [[TMP192:%.*]] = extractelement <8 x i1> [[TMP165]], i32 51505; CHECK-NEXT: br i1 [[TMP192]], label [[PRED_UDIV_IF79:%.*]], label [[PRED_UDIV_CONTINUE80:%.*]]1506; CHECK: pred.udiv.if79:1507; CHECK-NEXT: [[TMP193:%.*]] = extractelement <8 x i32> [[TMP166]], i32 51508; CHECK-NEXT: [[TMP194:%.*]] = udiv i32 [[TMP193]], [[D]]1509; CHECK-NEXT: [[TMP195:%.*]] = insertelement <8 x i32> [[TMP191]], i32 [[TMP194]], i32 51510; CHECK-NEXT: br label [[PRED_UDIV_CONTINUE80]]1511; CHECK: pred.udiv.continue80:1512; CHECK-NEXT: [[TMP196:%.*]] = phi <8 x i32> [ [[TMP191]], [[PRED_UDIV_CONTINUE78]] ], [ [[TMP195]], [[PRED_UDIV_IF79]] ]1513; CHECK-NEXT: [[TMP197:%.*]] = extractelement <8 x i1> [[TMP165]], i32 61514; CHECK-NEXT: br i1 [[TMP197]], label [[PRED_UDIV_IF81:%.*]], label [[PRED_UDIV_CONTINUE82:%.*]]1515; CHECK: pred.udiv.if81:1516; CHECK-NEXT: [[TMP198:%.*]] = extractelement <8 x i32> [[TMP166]], i32 61517; CHECK-NEXT: [[TMP199:%.*]] = udiv i32 [[TMP198]], [[D]]1518; CHECK-NEXT: [[TMP200:%.*]] = insertelement <8 x i32> [[TMP196]], i32 [[TMP199]], i32 61519; CHECK-NEXT: br label [[PRED_UDIV_CONTINUE82]]1520; CHECK: pred.udiv.continue82:1521; CHECK-NEXT: [[TMP201:%.*]] = phi <8 x i32> [ [[TMP196]], [[PRED_UDIV_CONTINUE80]] ], [ [[TMP200]], [[PRED_UDIV_IF81]] ]1522; CHECK-NEXT: [[TMP202:%.*]] = extractelement <8 x i1> [[TMP165]], i32 71523; CHECK-NEXT: br i1 [[TMP202]], label [[PRED_UDIV_IF83:%.*]], label [[PRED_UDIV_CONTINUE84]]1524; CHECK: pred.udiv.if83:1525; CHECK-NEXT: [[TMP203:%.*]] = extractelement <8 x i32> [[TMP166]], i32 71526; CHECK-NEXT: [[TMP204:%.*]] = udiv i32 [[TMP203]], [[D]]1527; CHECK-NEXT: [[TMP205:%.*]] = insertelement <8 x i32> [[TMP201]], i32 [[TMP204]], i32 71528; CHECK-NEXT: br label [[PRED_UDIV_CONTINUE84]]1529; CHECK: pred.udiv.continue84:1530; CHECK-NEXT: [[TMP206:%.*]] = phi <8 x i32> [ [[TMP201]], [[PRED_UDIV_CONTINUE82]] ], [ [[TMP205]], [[PRED_UDIV_IF83]] ]1531; CHECK-NEXT: [[TMP207:%.*]] = zext <8 x i32> [[TMP206]] to <8 x i64>1532; CHECK-NEXT: [[PREDPHI85:%.*]] = select i1 [[C]], <8 x i64> zeroinitializer, <8 x i64> [[TMP207]]1533; CHECK-NEXT: [[INDEX_NEXT86]] = add nuw i32 [[INDEX67]], 81534; CHECK-NEXT: [[VEC_IND_NEXT87]] = add <8 x i32> [[VEC_IND68]], splat (i32 8)1535; CHECK-NEXT: [[TMP208:%.*]] = icmp eq i32 [[INDEX_NEXT86]], 10001536; CHECK-NEXT: br i1 [[TMP208]], label [[VEC_EPILOG_MIDDLE_BLOCK:%.*]], label [[VEC_EPILOG_VECTOR_BODY]], !llvm.loop [[LOOP18:![0-9]+]]1537; CHECK: vec.epilog.middle.block:1538; CHECK-NEXT: [[TMP209:%.*]] = extractelement <8 x i64> [[PREDPHI85]], i32 71539; CHECK-NEXT: br i1 false, label [[EXIT]], label [[VEC_EPILOG_SCALAR_PH]]1540; CHECK: vec.epilog.scalar.ph:1541; CHECK-NEXT: [[BC_RESUME_VAL88:%.*]] = phi i32 [ 1000, [[VEC_EPILOG_MIDDLE_BLOCK]] ], [ 992, [[VEC_EPILOG_ITER_CHECK]] ], [ 0, [[ITER_CHECK:%.*]] ]1542; CHECK-NEXT: br label [[LOOP_HEADER:%.*]]1543; CHECK: loop.header:1544; CHECK-NEXT: [[IV:%.*]] = phi i32 [ [[BC_RESUME_VAL88]], [[VEC_EPILOG_SCALAR_PH]] ], [ [[IV_NEXT:%.*]], [[LOOP_LATCH:%.*]] ]1545; CHECK-NEXT: br i1 [[C]], label [[LOOP_LATCH]], label [[THEN:%.*]]1546; CHECK: then:1547; CHECK-NEXT: [[CALL:%.*]] = tail call i32 @llvm.usub.sat.i32(i32 [[IV]], i32 1)1548; CHECK-NEXT: [[UDIV:%.*]] = udiv i32 [[CALL]], [[D]]1549; CHECK-NEXT: [[ZEXT:%.*]] = zext i32 [[UDIV]] to i641550; CHECK-NEXT: br label [[LOOP_LATCH]]1551; CHECK: loop.latch:1552; CHECK-NEXT: [[MERGE:%.*]] = phi i64 [ [[ZEXT]], [[THEN]] ], [ 0, [[LOOP_HEADER]] ]1553; CHECK-NEXT: [[IV_NEXT]] = add i32 [[IV]], 11554; CHECK-NEXT: [[EC:%.*]] = icmp eq i32 [[IV]], 10001555; CHECK-NEXT: br i1 [[EC]], label [[EXIT]], label [[LOOP_HEADER]], !llvm.loop [[LOOP19:![0-9]+]]1556; CHECK: exit:1557; CHECK-NEXT: [[MERGE_LCSSA:%.*]] = phi i64 [ [[MERGE]], [[LOOP_LATCH]] ], [ [[TMP164]], [[MIDDLE_BLOCK]] ], [ [[TMP209]], [[VEC_EPILOG_MIDDLE_BLOCK]] ]1558; CHECK-NEXT: ret i64 [[MERGE_LCSSA]]1559;1560entry:1561 br label %loop.header1562 1563loop.header:1564 %iv = phi i32 [ 0, %entry ], [ %iv.next, %loop.latch ]1565 br i1 %c, label %loop.latch, label %then1566 1567then:1568 %call = tail call i32 @llvm.usub.sat.i32(i32 %iv, i32 1)1569 %udiv = udiv i32 %call, %d1570 %zext = zext i32 %udiv to i641571 br label %loop.latch1572 1573loop.latch:1574 %merge = phi i64 [ %zext, %then ], [ 0, %loop.header ]1575 %iv.next = add i32 %iv, 11576 %ec = icmp eq i32 %iv, 10001577 br i1 %ec, label %exit, label %loop.header1578 1579exit:1580 ret i64 %merge1581}1582 1583attributes #0 = { "target-cpu"="znver4" }1584attributes #1 = { "target-features"="+avx512bw,+avx512cd,+avx512dq,+avx512f,+avx512vl" }1585attributes #2 = { "target-cpu"="znver3" }1586