1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2; RUN: opt < %s -passes=instcombine -S | FileCheck %s 3define 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]], 1 10; CHECK-NEXT: [[CMP:%.*]] = icmp samesign ult i64 [[I_02]], 999 11; CHECK-NEXT: br i1 [[CMP]], label [[FOR_BODY]], label [[END:%.*]] 12; CHECK: end: 13; CHECK-NEXT: ret double 0.000000e+00 14; 15entry: 16 br label %for.body 17 18for.body: ; preds = %entry, %for.body 19 %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.02 22 %0 = load double, ptr %arrayidx, align 8 23 %mul = fmul fast double %f_prod.01, %0 24 %inc = add i64 %i.02, 1 25 %cmp = icmp ult i64 %inc, 1000 26 br i1 %cmp, label %for.body, label %end 27 28end: ; preds = %for.body 29 %f_prod.0.lcssa = phi double [ %mul, %for.body ] 30 ret double %f_prod.0.lcssa 31} 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]], 1 40; CHECK-NEXT: [[CMP:%.*]] = icmp samesign ult i64 [[I_02]], 999 41; CHECK-NEXT: br i1 [[CMP]], label [[FOR_BODY]], label [[END:%.*]] 42; CHECK: end: 43; CHECK-NEXT: ret double 0.000000e+00 44; 45entry: 46 br label %for.body 47 48for.body: ; preds = %entry, %for.body 49 %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.02 52 %0 = load double, ptr %arrayidx, align 8 53 %mul = fmul nsz nnan double %f_prod.01, %0 54 %inc = add i64 %i.02, 1 55 %cmp = icmp ult i64 %inc, 1000 56 br i1 %cmp, label %for.body, label %end 57 58end: ; preds = %for.body 59 %f_prod.0.lcssa = phi double [ %mul, %for.body ] 60 ret double %f_prod.0.lcssa 61} 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 [1000 x double], ptr [[ARR_D:%.*]], i64 0, i64 [[I_02]] 71; CHECK-NEXT: [[TMP0:%.*]] = load double, ptr [[ARRAYIDX]], align 8 72; CHECK-NEXT: [[MUL]] = fmul nnan double [[F_PROD_01]], [[TMP0]] 73; CHECK-NEXT: [[INC]] = add nuw nsw i64 [[I_02]], 1 74; CHECK-NEXT: [[CMP:%.*]] = icmp samesign ult i64 [[I_02]], 999 75; 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.body 81 82for.body: ; preds = %entry, %for.body 83 %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.02 86 %0 = load double, ptr %arrayidx, align 8 87 %mul = fmul nnan double %f_prod.01, %0 88 %inc = add i64 %i.02, 1 89 %cmp = icmp ult i64 %inc, 1000 90 br i1 %cmp, label %for.body, label %end 91 92end: ; preds = %for.body 93 %f_prod.0.lcssa = phi double [ %mul, %for.body ] 94 ret double %f_prod.0.lcssa 95} 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 [1000 x double], ptr [[ARR_D:%.*]], i64 0, i64 [[I_02]] 105; CHECK-NEXT: [[TMP0:%.*]] = load double, ptr [[ARRAYIDX]], align 8 106; CHECK-NEXT: [[MUL]] = fmul ninf double [[F_PROD_01]], [[TMP0]] 107; CHECK-NEXT: [[INC]] = add nuw nsw i64 [[I_02]], 1 108; CHECK-NEXT: [[CMP:%.*]] = icmp samesign ult i64 [[I_02]], 999 109; 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.body 115 116for.body: ; preds = %entry, %for.body 117 %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.02 120 %0 = load double, ptr %arrayidx, align 8 121 %mul = fmul ninf double %f_prod.01, %0 122 %inc = add i64 %i.02, 1 123 %cmp = icmp ult i64 %inc, 1000 124 br i1 %cmp, label %for.body, label %end 125 126end: ; preds = %for.body 127 %f_prod.0.lcssa = phi double [ %mul, %for.body ] 128 ret double %f_prod.0.lcssa 129} 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 [1000 x double], ptr [[ARR_D:%.*]], i64 0, i64 [[I_02]] 139; CHECK-NEXT: [[TMP0:%.*]] = load double, ptr [[ARRAYIDX]], align 8 140; CHECK-NEXT: [[MUL]] = fmul nsz double [[F_PROD_01]], [[TMP0]] 141; CHECK-NEXT: [[INC]] = add nuw nsw i64 [[I_02]], 1 142; CHECK-NEXT: [[CMP:%.*]] = icmp samesign ult i64 [[I_02]], 999 143; 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.body 149 150for.body: ; preds = %entry, %for.body 151 %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.02 154 %0 = load double, ptr %arrayidx, align 8 155 %mul = fmul nsz double %f_prod.01, %0 156 %inc = add i64 %i.02, 1 157 %cmp = icmp ult i64 %inc, 1000 158 br i1 %cmp, label %for.body, label %end 159 160end: ; preds = %for.body 161 %f_prod.0.lcssa = phi double [ %mul, %for.body ] 162 ret double %f_prod.0.lcssa 163} 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 [1000 x double], ptr [[ARR_D:%.*]], i64 0, i64 [[I_02]] 173; CHECK-NEXT: [[TMP0:%.*]] = load double, ptr [[ARRAYIDX]], align 8 174; CHECK-NEXT: [[MUL]] = fmul fast double [[F_PROD_01]], [[TMP0]] 175; CHECK-NEXT: [[INC]] = add nuw nsw i64 [[I_02]], 1 176; CHECK-NEXT: [[CMP:%.*]] = icmp samesign ult i64 [[I_02]], 999 177; 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.body 183 184for.body: ; preds = %entry, %for.body 185 %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.02 188 %0 = load double, ptr %arrayidx, align 8 189 %mul = fmul fast double %f_prod.01, %0 190 %inc = add i64 %i.02, 1 191 %cmp = icmp ult i64 %inc, 1000 192 br i1 %cmp, label %for.body, label %end 193 194end: ; preds = %for.body 195 %f_prod.0.lcssa = phi double [ %mul, %for.body ] 196 ret double %f_prod.0.lcssa 197} 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 [1000 x double], ptr [[ARR_D:%.*]], i64 0, i64 [[I_02]] 209; CHECK-NEXT: [[TMP0:%.*]] = load double, ptr [[ARRAYIDX]], align 8 210; CHECK-NEXT: [[MUL]] = fmul fast double [[F_PROD_01]], [[TMP0]] 211; CHECK-NEXT: [[INC]] = add nuw nsw i64 [[I_02]], 1 212; CHECK-NEXT: [[CMP:%.*]] = icmp ult i64 [[I_02]], 999 213; 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_2 219 220entry_2: 221 br label %for.body 222 223for.body: ; preds = %entry, %for.body 224 %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.02 227 %0 = load double, ptr %arrayidx, align 8 228 %mul = fmul fast double %f_prod.01, %0 229 %inc = add i64 %i.02, 1 230 %cmp = icmp ult i64 %inc, 1000 231 br i1 %cmp, label %for.body, label %end 232 233end: ; preds = %for.body 234 %f_prod.0.lcssa = phi double [ %mul, %for.body ] 235 ret double %f_prod.0.lcssa 236} 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 [1000 x double], ptr [[ARR_D:%.*]], i64 0, i64 [[I_02]] 248; CHECK-NEXT: [[TMP0:%.*]] = load double, ptr [[ARRAYIDX]], align 8 249; CHECK-NEXT: [[MUL]] = fmul fast double [[F_PROD_01]], [[TMP0]] 250; CHECK-NEXT: [[INC]] = add nuw nsw i64 [[I_02]], 1 251; CHECK-NEXT: [[CMP:%.*]] = icmp ult i64 [[I_02]], 999 252; 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_2 258 259entry_2: 260 br label %for.body 261 262for.body: ; preds = %entry, %for.body 263 %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.02 266 %0 = load double, ptr %arrayidx, align 8 267 %mul = fmul fast double %f_prod.01, %0 268 %inc = add i64 %i.02, 1 269 %cmp = icmp ult i64 %inc, 1000 270 br i1 %cmp, label %for.body, label %end 271 272end: ; preds = %for.body 273 %f_prod.0.lcssa = phi double [ %mul, %for.body ] 274 ret double %f_prod.0.lcssa 275} 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 4 286; CHECK-NEXT: [[MUL]] = mul nsw i32 [[F_PROD_01]], [[TMP0]] 287; CHECK-NEXT: [[INC]] = add nuw nsw i64 [[I_02]], 1 288; CHECK-NEXT: [[CMP:%.*]] = icmp samesign ult i64 [[I_02]], 999 289; 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.body 295 296for.body: ; preds = %entry, %for.body 297 %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.02 300 %0 = load i32, ptr %arrayidx, align 4 301 %mul = mul nsw i32 %f_prod.01, %0 302 %inc = add i64 %i.02, 1 303 %cmp = icmp ult i64 %inc, 1000 304 br i1 %cmp, label %for.body, label %end 305 306end: ; preds = %for.body 307 %f_prod.0.lcssa = phi i32 [ %mul, %for.body ] 308 ret i32 %f_prod.0.lcssa 309} 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 4 320; CHECK-NEXT: [[MUL]] = mul i32 [[F_PROD_01]], [[TMP0]] 321; CHECK-NEXT: [[INC]] = add nuw nsw i64 [[I_02]], 1 322; CHECK-NEXT: [[CMP:%.*]] = icmp samesign ult i64 [[I_02]], 999 323; 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.body 329 330for.body: ; preds = %entry, %for.body 331 %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.02 334 %0 = load i32, ptr %arrayidx, align 4 335 %mul = mul i32 %f_prod.01, %0 336 %inc = add i64 %i.02, 1 337 %cmp = icmp ult i64 %inc, 1000 338 br i1 %cmp, label %for.body, label %end 339 340end: ; preds = %for.body 341 %f_prod.0.lcssa = phi i32 [ %mul, %for.body ] 342 ret i32 %f_prod.0.lcssa 343} 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 4 356; CHECK-NEXT: [[MUL]] = mul i32 [[F_PROD_01]], [[TMP0]] 357; CHECK-NEXT: [[INC]] = add nuw nsw i64 [[I_02]], 1 358; CHECK-NEXT: [[CMP:%.*]] = icmp ult i64 [[I_02]], 999 359; 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_2 365 366entry_2: 367 br label %for.body 368 369for.body: ; preds = %entry, %for.body 370 %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.02 373 %0 = load i32, ptr %arrayidx, align 4 374 %mul = mul i32 %f_prod.01, %0 375 %inc = add i64 %i.02, 1 376 %cmp = icmp ult i64 %inc, 1000 377 br i1 %cmp, label %for.body, label %end 378 379end: ; preds = %for.body 380 %f_prod.0.lcssa = phi i32 [ %mul, %for.body ] 381 ret i32 %f_prod.0.lcssa 382} 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 4 395; CHECK-NEXT: [[MUL]] = mul i32 [[F_PROD_01]], [[TMP0]] 396; CHECK-NEXT: [[INC]] = add nuw nsw i64 [[I_02]], 1 397; CHECK-NEXT: [[CMP:%.*]] = icmp ult i64 [[I_02]], 999 398; 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_2 404 405entry_2: 406 br label %for.body 407 408for.body: ; preds = %entry, %for.body 409 %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.02 412 %0 = load i32, ptr %arrayidx, align 4 413 %mul = mul i32 %f_prod.01, %0 414 %inc = add i64 %i.02, 1 415 %cmp = icmp ult i64 %inc, 1000 416 br i1 %cmp, label %for.body, label %end 417 418end: ; preds = %for.body 419 %f_prod.0.lcssa = phi i32 [ %mul, %for.body ] 420 ret i32 %f_prod.0.lcssa 421} 422