422 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt < %s -passes=instcombine -S | FileCheck %s3define double @test_mul_fast_flags(ptr %arr_d) {4; CHECK-LABEL: @test_mul_fast_flags(5; CHECK-NEXT: entry:6; CHECK-NEXT: br label [[FOR_BODY:%.*]]7; CHECK: for.body:8; CHECK-NEXT: [[I_02:%.*]] = phi i64 [ 0, [[ENTRY:%.*]] ], [ [[INC:%.*]], [[FOR_BODY]] ]9; CHECK-NEXT: [[INC]] = add nuw nsw i64 [[I_02]], 110; CHECK-NEXT: [[CMP:%.*]] = icmp samesign ult i64 [[I_02]], 99911; CHECK-NEXT: br i1 [[CMP]], label [[FOR_BODY]], label [[END:%.*]]12; CHECK: end:13; CHECK-NEXT: ret double 0.000000e+0014;15entry:16 br label %for.body17 18for.body: ; preds = %entry, %for.body19 %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ]20 %f_prod.01 = phi double [ 0.000000e+00, %entry ], [ %mul, %for.body ]21 %arrayidx = getelementptr inbounds [1000 x double], ptr %arr_d, i64 0, i64 %i.0222 %0 = load double, ptr %arrayidx, align 823 %mul = fmul fast double %f_prod.01, %024 %inc = add i64 %i.02, 125 %cmp = icmp ult i64 %inc, 100026 br i1 %cmp, label %for.body, label %end27 28end: ; preds = %for.body29 %f_prod.0.lcssa = phi double [ %mul, %for.body ]30 ret double %f_prod.0.lcssa31}32 33define double @test_nsz_nnan_flags_enabled(ptr %arr_d) {34; CHECK-LABEL: @test_nsz_nnan_flags_enabled(35; CHECK-NEXT: entry:36; CHECK-NEXT: br label [[FOR_BODY:%.*]]37; CHECK: for.body:38; CHECK-NEXT: [[I_02:%.*]] = phi i64 [ 0, [[ENTRY:%.*]] ], [ [[INC:%.*]], [[FOR_BODY]] ]39; CHECK-NEXT: [[INC]] = add nuw nsw i64 [[I_02]], 140; CHECK-NEXT: [[CMP:%.*]] = icmp samesign ult i64 [[I_02]], 99941; CHECK-NEXT: br i1 [[CMP]], label [[FOR_BODY]], label [[END:%.*]]42; CHECK: end:43; CHECK-NEXT: ret double 0.000000e+0044;45entry:46 br label %for.body47 48for.body: ; preds = %entry, %for.body49 %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ]50 %f_prod.01 = phi double [ 0.000000e+00, %entry ], [ %mul, %for.body ]51 %arrayidx = getelementptr inbounds [1000 x double], ptr %arr_d, i64 0, i64 %i.0252 %0 = load double, ptr %arrayidx, align 853 %mul = fmul nsz nnan double %f_prod.01, %054 %inc = add i64 %i.02, 155 %cmp = icmp ult i64 %inc, 100056 br i1 %cmp, label %for.body, label %end57 58end: ; preds = %for.body59 %f_prod.0.lcssa = phi double [ %mul, %for.body ]60 ret double %f_prod.0.lcssa61}62 63define double @test_nnan_flag_enabled(ptr %arr_d) {64; CHECK-LABEL: @test_nnan_flag_enabled(65; CHECK-NEXT: entry:66; CHECK-NEXT: br label [[FOR_BODY:%.*]]67; CHECK: for.body:68; CHECK-NEXT: [[I_02:%.*]] = phi i64 [ 0, [[ENTRY:%.*]] ], [ [[INC:%.*]], [[FOR_BODY]] ]69; CHECK-NEXT: [[F_PROD_01:%.*]] = phi double [ 0.000000e+00, [[ENTRY]] ], [ [[MUL:%.*]], [[FOR_BODY]] ]70; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds nuw double, ptr [[ARR_D:%.*]], i64 [[I_02]]71; CHECK-NEXT: [[TMP0:%.*]] = load double, ptr [[ARRAYIDX]], align 872; CHECK-NEXT: [[MUL]] = fmul nnan double [[F_PROD_01]], [[TMP0]]73; CHECK-NEXT: [[INC]] = add nuw nsw i64 [[I_02]], 174; CHECK-NEXT: [[CMP:%.*]] = icmp samesign ult i64 [[I_02]], 99975; CHECK-NEXT: br i1 [[CMP]], label [[FOR_BODY]], label [[END:%.*]]76; CHECK: end:77; CHECK-NEXT: ret double [[MUL]]78;79entry:80 br label %for.body81 82for.body: ; preds = %entry, %for.body83 %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ]84 %f_prod.01 = phi double [ 0.000000e+00, %entry ], [ %mul, %for.body ]85 %arrayidx = getelementptr inbounds [1000 x double], ptr %arr_d, i64 0, i64 %i.0286 %0 = load double, ptr %arrayidx, align 887 %mul = fmul nnan double %f_prod.01, %088 %inc = add i64 %i.02, 189 %cmp = icmp ult i64 %inc, 100090 br i1 %cmp, label %for.body, label %end91 92end: ; preds = %for.body93 %f_prod.0.lcssa = phi double [ %mul, %for.body ]94 ret double %f_prod.0.lcssa95}96 97define double @test_ninf_flag_enabled(ptr %arr_d) {98; CHECK-LABEL: @test_ninf_flag_enabled(99; CHECK-NEXT: entry:100; CHECK-NEXT: br label [[FOR_BODY:%.*]]101; CHECK: for.body:102; CHECK-NEXT: [[I_02:%.*]] = phi i64 [ 0, [[ENTRY:%.*]] ], [ [[INC:%.*]], [[FOR_BODY]] ]103; CHECK-NEXT: [[F_PROD_01:%.*]] = phi double [ 0.000000e+00, [[ENTRY]] ], [ [[MUL:%.*]], [[FOR_BODY]] ]104; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds nuw double, ptr [[ARR_D:%.*]], i64 [[I_02]]105; CHECK-NEXT: [[TMP0:%.*]] = load double, ptr [[ARRAYIDX]], align 8106; CHECK-NEXT: [[MUL]] = fmul ninf double [[F_PROD_01]], [[TMP0]]107; CHECK-NEXT: [[INC]] = add nuw nsw i64 [[I_02]], 1108; CHECK-NEXT: [[CMP:%.*]] = icmp samesign ult i64 [[I_02]], 999109; CHECK-NEXT: br i1 [[CMP]], label [[FOR_BODY]], label [[END:%.*]]110; CHECK: end:111; CHECK-NEXT: ret double [[MUL]]112;113entry:114 br label %for.body115 116for.body: ; preds = %entry, %for.body117 %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ]118 %f_prod.01 = phi double [ 0.000000e+00, %entry ], [ %mul, %for.body ]119 %arrayidx = getelementptr inbounds [1000 x double], ptr %arr_d, i64 0, i64 %i.02120 %0 = load double, ptr %arrayidx, align 8121 %mul = fmul ninf double %f_prod.01, %0122 %inc = add i64 %i.02, 1123 %cmp = icmp ult i64 %inc, 1000124 br i1 %cmp, label %for.body, label %end125 126end: ; preds = %for.body127 %f_prod.0.lcssa = phi double [ %mul, %for.body ]128 ret double %f_prod.0.lcssa129}130 131define double @test_nsz_flag_enabled(ptr %arr_d) {132; CHECK-LABEL: @test_nsz_flag_enabled(133; CHECK-NEXT: entry:134; CHECK-NEXT: br label [[FOR_BODY:%.*]]135; CHECK: for.body:136; CHECK-NEXT: [[I_02:%.*]] = phi i64 [ 0, [[ENTRY:%.*]] ], [ [[INC:%.*]], [[FOR_BODY]] ]137; CHECK-NEXT: [[F_PROD_01:%.*]] = phi double [ 0.000000e+00, [[ENTRY]] ], [ [[MUL:%.*]], [[FOR_BODY]] ]138; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds nuw double, ptr [[ARR_D:%.*]], i64 [[I_02]]139; CHECK-NEXT: [[TMP0:%.*]] = load double, ptr [[ARRAYIDX]], align 8140; CHECK-NEXT: [[MUL]] = fmul nsz double [[F_PROD_01]], [[TMP0]]141; CHECK-NEXT: [[INC]] = add nuw nsw i64 [[I_02]], 1142; CHECK-NEXT: [[CMP:%.*]] = icmp samesign ult i64 [[I_02]], 999143; CHECK-NEXT: br i1 [[CMP]], label [[FOR_BODY]], label [[END:%.*]]144; CHECK: end:145; CHECK-NEXT: ret double [[MUL]]146;147entry:148 br label %for.body149 150for.body: ; preds = %entry, %for.body151 %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ]152 %f_prod.01 = phi double [ 0.000000e+00, %entry ], [ %mul, %for.body ]153 %arrayidx = getelementptr inbounds [1000 x double], ptr %arr_d, i64 0, i64 %i.02154 %0 = load double, ptr %arrayidx, align 8155 %mul = fmul nsz double %f_prod.01, %0156 %inc = add i64 %i.02, 1157 %cmp = icmp ult i64 %inc, 1000158 br i1 %cmp, label %for.body, label %end159 160end: ; preds = %for.body161 %f_prod.0.lcssa = phi double [ %mul, %for.body ]162 ret double %f_prod.0.lcssa163}164 165define double @test_phi_initalise_to_non_zero(ptr %arr_d) {166; CHECK-LABEL: @test_phi_initalise_to_non_zero(167; CHECK-NEXT: entry:168; CHECK-NEXT: br label [[FOR_BODY:%.*]]169; CHECK: for.body:170; CHECK-NEXT: [[I_02:%.*]] = phi i64 [ 0, [[ENTRY:%.*]] ], [ [[INC:%.*]], [[FOR_BODY]] ]171; CHECK-NEXT: [[F_PROD_01:%.*]] = phi double [ 1.000000e+00, [[ENTRY]] ], [ [[MUL:%.*]], [[FOR_BODY]] ]172; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds nuw double, ptr [[ARR_D:%.*]], i64 [[I_02]]173; CHECK-NEXT: [[TMP0:%.*]] = load double, ptr [[ARRAYIDX]], align 8174; CHECK-NEXT: [[MUL]] = fmul fast double [[F_PROD_01]], [[TMP0]]175; CHECK-NEXT: [[INC]] = add nuw nsw i64 [[I_02]], 1176; CHECK-NEXT: [[CMP:%.*]] = icmp samesign ult i64 [[I_02]], 999177; CHECK-NEXT: br i1 [[CMP]], label [[FOR_BODY]], label [[END:%.*]]178; CHECK: end:179; CHECK-NEXT: ret double [[MUL]]180;181entry:182 br label %for.body183 184for.body: ; preds = %entry, %for.body185 %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ]186 %f_prod.01 = phi double [ 1.000000e+00, %entry ], [ %mul, %for.body ]187 %arrayidx = getelementptr inbounds [1000 x double], ptr %arr_d, i64 0, i64 %i.02188 %0 = load double, ptr %arrayidx, align 8189 %mul = fmul fast double %f_prod.01, %0190 %inc = add i64 %i.02, 1191 %cmp = icmp ult i64 %inc, 1000192 br i1 %cmp, label %for.body, label %end193 194end: ; preds = %for.body195 %f_prod.0.lcssa = phi double [ %mul, %for.body ]196 ret double %f_prod.0.lcssa197}198 199define double @test_multiple_phi_operands(ptr %arr_d, i1 %entry_cond) {200; CHECK-LABEL: @test_multiple_phi_operands(201; CHECK-NEXT: entry:202; CHECK-NEXT: br i1 [[ENTRY_COND:%.*]], label [[FOR_BODY:%.*]], label [[ENTRY_2:%.*]]203; CHECK: entry_2:204; CHECK-NEXT: br label [[FOR_BODY]]205; CHECK: for.body:206; CHECK-NEXT: [[I_02:%.*]] = phi i64 [ 0, [[ENTRY:%.*]] ], [ 0, [[ENTRY_2]] ], [ [[INC:%.*]], [[FOR_BODY]] ]207; CHECK-NEXT: [[F_PROD_01:%.*]] = phi double [ 0.000000e+00, [[ENTRY]] ], [ 0.000000e+00, [[ENTRY_2]] ], [ [[MUL:%.*]], [[FOR_BODY]] ]208; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds nuw double, ptr [[ARR_D:%.*]], i64 [[I_02]]209; CHECK-NEXT: [[TMP0:%.*]] = load double, ptr [[ARRAYIDX]], align 8210; CHECK-NEXT: [[MUL]] = fmul fast double [[F_PROD_01]], [[TMP0]]211; CHECK-NEXT: [[INC]] = add nuw nsw i64 [[I_02]], 1212; CHECK-NEXT: [[CMP:%.*]] = icmp ult i64 [[I_02]], 999213; CHECK-NEXT: br i1 [[CMP]], label [[FOR_BODY]], label [[END:%.*]]214; CHECK: end:215; CHECK-NEXT: ret double [[MUL]]216;217entry:218 br i1 %entry_cond, label %for.body, label %entry_2219 220entry_2:221 br label %for.body222 223for.body: ; preds = %entry, %for.body224 %i.02 = phi i64 [ 0, %entry ], [0, %entry_2], [ %inc, %for.body ]225 %f_prod.01 = phi double [ 0.0, %entry ], [0.0, %entry_2], [ %mul, %for.body ]226 %arrayidx = getelementptr inbounds [1000 x double], ptr %arr_d, i64 0, i64 %i.02227 %0 = load double, ptr %arrayidx, align 8228 %mul = fmul fast double %f_prod.01, %0229 %inc = add i64 %i.02, 1230 %cmp = icmp ult i64 %inc, 1000231 br i1 %cmp, label %for.body, label %end232 233end: ; preds = %for.body234 %f_prod.0.lcssa = phi double [ %mul, %for.body ]235 ret double %f_prod.0.lcssa236}237 238define double @test_multiple_phi_operands_with_non_zero(ptr %arr_d, i1 %entry_cond) {239; CHECK-LABEL: @test_multiple_phi_operands_with_non_zero(240; CHECK-NEXT: entry:241; CHECK-NEXT: br i1 [[ENTRY_COND:%.*]], label [[FOR_BODY:%.*]], label [[ENTRY_2:%.*]]242; CHECK: entry_2:243; CHECK-NEXT: br label [[FOR_BODY]]244; CHECK: for.body:245; CHECK-NEXT: [[I_02:%.*]] = phi i64 [ 0, [[ENTRY:%.*]] ], [ 0, [[ENTRY_2]] ], [ [[INC:%.*]], [[FOR_BODY]] ]246; CHECK-NEXT: [[F_PROD_01:%.*]] = phi double [ 1.000000e+00, [[ENTRY]] ], [ 0.000000e+00, [[ENTRY_2]] ], [ [[MUL:%.*]], [[FOR_BODY]] ]247; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds nuw double, ptr [[ARR_D:%.*]], i64 [[I_02]]248; CHECK-NEXT: [[TMP0:%.*]] = load double, ptr [[ARRAYIDX]], align 8249; CHECK-NEXT: [[MUL]] = fmul fast double [[F_PROD_01]], [[TMP0]]250; CHECK-NEXT: [[INC]] = add nuw nsw i64 [[I_02]], 1251; CHECK-NEXT: [[CMP:%.*]] = icmp ult i64 [[I_02]], 999252; CHECK-NEXT: br i1 [[CMP]], label [[FOR_BODY]], label [[END:%.*]]253; CHECK: end:254; CHECK-NEXT: ret double [[MUL]]255;256entry:257 br i1 %entry_cond, label %for.body, label %entry_2258 259entry_2:260 br label %for.body261 262for.body: ; preds = %entry, %for.body263 %i.02 = phi i64 [ 0, %entry ], [0, %entry_2], [ %inc, %for.body ]264 %f_prod.01 = phi double [ 1.0, %entry ], [0.0, %entry_2], [ %mul, %for.body ]265 %arrayidx = getelementptr inbounds [1000 x double], ptr %arr_d, i64 0, i64 %i.02266 %0 = load double, ptr %arrayidx, align 8267 %mul = fmul fast double %f_prod.01, %0268 %inc = add i64 %i.02, 1269 %cmp = icmp ult i64 %inc, 1000270 br i1 %cmp, label %for.body, label %end271 272end: ; preds = %for.body273 %f_prod.0.lcssa = phi double [ %mul, %for.body ]274 ret double %f_prod.0.lcssa275}276 277define i32 @test_int_phi_operands(ptr %arr_d) {278; CHECK-LABEL: @test_int_phi_operands(279; CHECK-NEXT: entry:280; CHECK-NEXT: br label [[FOR_BODY:%.*]]281; CHECK: for.body:282; CHECK-NEXT: [[I_02:%.*]] = phi i64 [ 0, [[ENTRY:%.*]] ], [ [[INC:%.*]], [[FOR_BODY]] ]283; CHECK-NEXT: [[F_PROD_01:%.*]] = phi i32 [ 0, [[ENTRY]] ], [ [[MUL:%.*]], [[FOR_BODY]] ]284; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds nuw i32, ptr [[ARR_D:%.*]], i64 [[I_02]]285; CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr [[ARRAYIDX]], align 4286; CHECK-NEXT: [[MUL]] = mul nsw i32 [[F_PROD_01]], [[TMP0]]287; CHECK-NEXT: [[INC]] = add nuw nsw i64 [[I_02]], 1288; CHECK-NEXT: [[CMP:%.*]] = icmp samesign ult i64 [[I_02]], 999289; CHECK-NEXT: br i1 [[CMP]], label [[FOR_BODY]], label [[END:%.*]]290; CHECK: end:291; CHECK-NEXT: ret i32 [[MUL]]292;293entry:294 br label %for.body295 296for.body: ; preds = %entry, %for.body297 %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ]298 %f_prod.01 = phi i32 [ 0, %entry ], [ %mul, %for.body ]299 %arrayidx = getelementptr inbounds i32, ptr %arr_d, i64 %i.02300 %0 = load i32, ptr %arrayidx, align 4301 %mul = mul nsw i32 %f_prod.01, %0302 %inc = add i64 %i.02, 1303 %cmp = icmp ult i64 %inc, 1000304 br i1 %cmp, label %for.body, label %end305 306end: ; preds = %for.body307 %f_prod.0.lcssa = phi i32 [ %mul, %for.body ]308 ret i32 %f_prod.0.lcssa309}310 311define i32 @test_int_phi_operands_initalise_to_non_zero(ptr %arr_d) {312; CHECK-LABEL: @test_int_phi_operands_initalise_to_non_zero(313; CHECK-NEXT: entry:314; CHECK-NEXT: br label [[FOR_BODY:%.*]]315; CHECK: for.body:316; CHECK-NEXT: [[I_02:%.*]] = phi i64 [ 0, [[ENTRY:%.*]] ], [ [[INC:%.*]], [[FOR_BODY]] ]317; CHECK-NEXT: [[F_PROD_01:%.*]] = phi i32 [ 1, [[ENTRY]] ], [ [[MUL:%.*]], [[FOR_BODY]] ]318; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds nuw i32, ptr [[ARR_D:%.*]], i64 [[I_02]]319; CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr [[ARRAYIDX]], align 4320; CHECK-NEXT: [[MUL]] = mul i32 [[F_PROD_01]], [[TMP0]]321; CHECK-NEXT: [[INC]] = add nuw nsw i64 [[I_02]], 1322; CHECK-NEXT: [[CMP:%.*]] = icmp samesign ult i64 [[I_02]], 999323; CHECK-NEXT: br i1 [[CMP]], label [[FOR_BODY]], label [[END:%.*]]324; CHECK: end:325; CHECK-NEXT: ret i32 [[MUL]]326;327entry:328 br label %for.body329 330for.body: ; preds = %entry, %for.body331 %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ]332 %f_prod.01 = phi i32 [ 1, %entry ], [ %mul, %for.body ]333 %arrayidx = getelementptr inbounds i32, ptr %arr_d, i64 %i.02334 %0 = load i32, ptr %arrayidx, align 4335 %mul = mul i32 %f_prod.01, %0336 %inc = add i64 %i.02, 1337 %cmp = icmp ult i64 %inc, 1000338 br i1 %cmp, label %for.body, label %end339 340end: ; preds = %for.body341 %f_prod.0.lcssa = phi i32 [ %mul, %for.body ]342 ret i32 %f_prod.0.lcssa343}344 345define i32 @test_multiple_int_phi_operands(ptr %arr_d, i1 %entry_cond) {346; CHECK-LABEL: @test_multiple_int_phi_operands(347; CHECK-NEXT: entry:348; CHECK-NEXT: br i1 [[ENTRY_COND:%.*]], label [[FOR_BODY:%.*]], label [[ENTRY_2:%.*]]349; CHECK: entry_2:350; CHECK-NEXT: br label [[FOR_BODY]]351; CHECK: for.body:352; CHECK-NEXT: [[I_02:%.*]] = phi i64 [ 0, [[ENTRY:%.*]] ], [ 0, [[ENTRY_2]] ], [ [[INC:%.*]], [[FOR_BODY]] ]353; CHECK-NEXT: [[F_PROD_01:%.*]] = phi i32 [ 0, [[ENTRY]] ], [ 0, [[ENTRY_2]] ], [ [[MUL:%.*]], [[FOR_BODY]] ]354; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds nuw i32, ptr [[ARR_D:%.*]], i64 [[I_02]]355; CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr [[ARRAYIDX]], align 4356; CHECK-NEXT: [[MUL]] = mul i32 [[F_PROD_01]], [[TMP0]]357; CHECK-NEXT: [[INC]] = add nuw nsw i64 [[I_02]], 1358; CHECK-NEXT: [[CMP:%.*]] = icmp ult i64 [[I_02]], 999359; CHECK-NEXT: br i1 [[CMP]], label [[FOR_BODY]], label [[END:%.*]]360; CHECK: end:361; CHECK-NEXT: ret i32 [[MUL]]362;363entry:364 br i1 %entry_cond, label %for.body, label %entry_2365 366entry_2:367 br label %for.body368 369for.body: ; preds = %entry, %for.body370 %i.02 = phi i64 [ 0, %entry ], [0, %entry_2], [ %inc, %for.body ]371 %f_prod.01 = phi i32 [ 0, %entry ], [0, %entry_2], [ %mul, %for.body ]372 %arrayidx = getelementptr inbounds i32, ptr %arr_d, i64 %i.02373 %0 = load i32, ptr %arrayidx, align 4374 %mul = mul i32 %f_prod.01, %0375 %inc = add i64 %i.02, 1376 %cmp = icmp ult i64 %inc, 1000377 br i1 %cmp, label %for.body, label %end378 379end: ; preds = %for.body380 %f_prod.0.lcssa = phi i32 [ %mul, %for.body ]381 ret i32 %f_prod.0.lcssa382}383 384define i32 @test_multiple_int_phi_operands_initalise_to_non_zero(ptr %arr_d, i1 %entry_cond) {385; CHECK-LABEL: @test_multiple_int_phi_operands_initalise_to_non_zero(386; CHECK-NEXT: entry:387; CHECK-NEXT: br i1 [[ENTRY_COND:%.*]], label [[FOR_BODY:%.*]], label [[ENTRY_2:%.*]]388; CHECK: entry_2:389; CHECK-NEXT: br label [[FOR_BODY]]390; CHECK: for.body:391; CHECK-NEXT: [[I_02:%.*]] = phi i64 [ 0, [[ENTRY:%.*]] ], [ 0, [[ENTRY_2]] ], [ [[INC:%.*]], [[FOR_BODY]] ]392; CHECK-NEXT: [[F_PROD_01:%.*]] = phi i32 [ 0, [[ENTRY]] ], [ 1, [[ENTRY_2]] ], [ [[MUL:%.*]], [[FOR_BODY]] ]393; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds nuw i32, ptr [[ARR_D:%.*]], i64 [[I_02]]394; CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr [[ARRAYIDX]], align 4395; CHECK-NEXT: [[MUL]] = mul i32 [[F_PROD_01]], [[TMP0]]396; CHECK-NEXT: [[INC]] = add nuw nsw i64 [[I_02]], 1397; CHECK-NEXT: [[CMP:%.*]] = icmp ult i64 [[I_02]], 999398; CHECK-NEXT: br i1 [[CMP]], label [[FOR_BODY]], label [[END:%.*]]399; CHECK: end:400; CHECK-NEXT: ret i32 [[MUL]]401;402entry:403 br i1 %entry_cond, label %for.body, label %entry_2404 405entry_2:406 br label %for.body407 408for.body: ; preds = %entry, %for.body409 %i.02 = phi i64 [ 0, %entry ], [0, %entry_2], [ %inc, %for.body ]410 %f_prod.01 = phi i32 [ 0, %entry ], [1, %entry_2], [ %mul, %for.body ]411 %arrayidx = getelementptr inbounds i32, ptr %arr_d, i64 %i.02412 %0 = load i32, ptr %arrayidx, align 4413 %mul = mul i32 %f_prod.01, %0414 %inc = add i64 %i.02, 1415 %cmp = icmp ult i64 %inc, 1000416 br i1 %cmp, label %for.body, label %end417 418end: ; preds = %for.body419 %f_prod.0.lcssa = phi i32 [ %mul, %for.body ]420 ret i32 %f_prod.0.lcssa421}422