1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc -ppc-asm-full-reg-names -verify-machineinstrs -mtriple=powerpc64le-unknown-linux-gnu -mcpu=pwr9 < %s | FileCheck %s 3 4; test_no_prep: 5; unsigned long test_no_prep(char *p, int count) { 6; unsigned long i=0, res=0; 7; int DISP1 = 4001; 8; int DISP2 = 4002; 9; int DISP3 = 4003; 10; int DISP4 = 4004; 11; for (; i < count ; i++) { 12; unsigned long x1 = *(unsigned long *)(p + i + DISP1); 13; unsigned long x2 = *(unsigned long *)(p + i + DISP2); 14; unsigned long x3 = *(unsigned long *)(p + i + DISP3); 15; unsigned long x4 = *(unsigned long *)(p + i + DISP4); 16; res += x1*x2*x3*x4; 17; } 18; return res + count; 19; } 20 21define i64 @test_no_prep(ptr %arg, i32 signext %arg1) { 22; CHECK-LABEL: test_no_prep: 23; CHECK: # %bb.0: # %bb 24; CHECK-NEXT: cmplwi r4, 0 25; CHECK-NEXT: beq cr0, .LBB0_4 26; CHECK-NEXT: # %bb.1: # %bb3.preheader 27; CHECK-NEXT: mtctr r4 28; CHECK-NEXT: addi r5, r3, 4004 29; CHECK-NEXT: li r3, 0 30; CHECK-NEXT: li r6, -3 31; CHECK-NEXT: li r7, -2 32; CHECK-NEXT: li r8, -1 33; CHECK-NEXT: .p2align 4 34; CHECK-NEXT: .LBB0_2: # %bb3 35; CHECK-NEXT: # 36; CHECK-NEXT: ldx r9, r5, r6 37; CHECK-NEXT: ldx r10, r5, r7 38; CHECK-NEXT: ldx r11, r5, r8 39; CHECK-NEXT: ld r12, 0(r5) 40; CHECK-NEXT: addi r5, r5, 1 41; CHECK-NEXT: mulld r9, r10, r9 42; CHECK-NEXT: mulld r9, r9, r11 43; CHECK-NEXT: maddld r3, r9, r12, r3 44; CHECK-NEXT: bdnz .LBB0_2 45; CHECK-NEXT: # %bb.3: # %bb25 46; CHECK-NEXT: add r3, r3, r4 47; CHECK-NEXT: blr 48; CHECK-NEXT: .LBB0_4: 49; CHECK-NEXT: addi r3, r4, 0 50; CHECK-NEXT: blr 51bb: 52 %i = sext i32 %arg1 to i64 53 %i2 = icmp eq i32 %arg1, 0 54 br i1 %i2, label %bb25, label %bb3 55 56bb3: ; preds = %bb3, %bb 57 %i4 = phi i64 [ %i23, %bb3 ], [ 0, %bb ] 58 %i5 = phi i64 [ %i22, %bb3 ], [ 0, %bb ] 59 %i6 = getelementptr inbounds i8, ptr %arg, i64 %i4 60 %i7 = getelementptr inbounds i8, ptr %i6, i64 4001 61 %i9 = load i64, ptr %i7, align 8 62 %i10 = getelementptr inbounds i8, ptr %i6, i64 4002 63 %i12 = load i64, ptr %i10, align 8 64 %i13 = getelementptr inbounds i8, ptr %i6, i64 4003 65 %i15 = load i64, ptr %i13, align 8 66 %i16 = getelementptr inbounds i8, ptr %i6, i64 4004 67 %i18 = load i64, ptr %i16, align 8 68 %i19 = mul i64 %i12, %i9 69 %i20 = mul i64 %i19, %i15 70 %i21 = mul i64 %i20, %i18 71 %i22 = add i64 %i21, %i5 72 %i23 = add nuw i64 %i4, 1 73 %i24 = icmp ult i64 %i23, %i 74 br i1 %i24, label %bb3, label %bb25 75 76bb25: ; preds = %bb3, %bb 77 %i26 = phi i64 [ 0, %bb ], [ %i22, %bb3 ] 78 %i27 = add i64 %i26, %i 79 ret i64 %i27 80} 81 82; test_ds_prep: 83; unsigned long test_ds_prep(char *p, int count) { 84; unsigned long i=0, res=0; 85; int DISP1 = 4001; 86; int DISP2 = 4002; 87; int DISP3 = 4003; 88; int DISP4 = 4006; 89; for (; i < count ; i++) { 90; unsigned long x1 = *(unsigned long *)(p + i + DISP1); 91; unsigned long x2 = *(unsigned long *)(p + i + DISP2); 92; unsigned long x3 = *(unsigned long *)(p + i + DISP3); 93; unsigned long x4 = *(unsigned long *)(p + i + DISP4); 94; res += x1*x2*x3*x4; 95; } 96; return res + count; 97; } 98 99define i64 @test_ds_prep(ptr %arg, i32 signext %arg1) { 100; CHECK-LABEL: test_ds_prep: 101; CHECK: # %bb.0: # %bb 102; CHECK-NEXT: cmplwi r4, 0 103; CHECK-NEXT: beq cr0, .LBB1_4 104; CHECK-NEXT: # %bb.1: # %bb3.preheader 105; CHECK-NEXT: mtctr r4 106; CHECK-NEXT: addi r7, r3, 4002 107; CHECK-NEXT: li r3, 0 108; CHECK-NEXT: li r5, -1 109; CHECK-NEXT: li r6, 1 110; CHECK-NEXT: .p2align 4 111; CHECK-NEXT: .LBB1_2: # %bb3 112; CHECK-NEXT: # 113; CHECK-NEXT: ldx r8, r7, r5 114; CHECK-NEXT: ld r9, 0(r7) 115; CHECK-NEXT: ldx r10, r7, r6 116; CHECK-NEXT: ld r11, 4(r7) 117; CHECK-NEXT: addi r7, r7, 1 118; CHECK-NEXT: mulld r8, r9, r8 119; CHECK-NEXT: mulld r8, r8, r10 120; CHECK-NEXT: maddld r3, r8, r11, r3 121; CHECK-NEXT: bdnz .LBB1_2 122; CHECK-NEXT: # %bb.3: # %bb25 123; CHECK-NEXT: add r3, r3, r4 124; CHECK-NEXT: blr 125; CHECK-NEXT: .LBB1_4: 126; CHECK-NEXT: addi r3, r4, 0 127; CHECK-NEXT: blr 128bb: 129 %i = sext i32 %arg1 to i64 130 %i2 = icmp eq i32 %arg1, 0 131 br i1 %i2, label %bb25, label %bb3 132 133bb3: ; preds = %bb3, %bb 134 %i4 = phi i64 [ %i23, %bb3 ], [ 0, %bb ] 135 %i5 = phi i64 [ %i22, %bb3 ], [ 0, %bb ] 136 %i6 = getelementptr inbounds i8, ptr %arg, i64 %i4 137 %i7 = getelementptr inbounds i8, ptr %i6, i64 4001 138 %i9 = load i64, ptr %i7, align 8 139 %i10 = getelementptr inbounds i8, ptr %i6, i64 4002 140 %i12 = load i64, ptr %i10, align 8 141 %i13 = getelementptr inbounds i8, ptr %i6, i64 4003 142 %i15 = load i64, ptr %i13, align 8 143 %i16 = getelementptr inbounds i8, ptr %i6, i64 4006 144 %i18 = load i64, ptr %i16, align 8 145 %i19 = mul i64 %i12, %i9 146 %i20 = mul i64 %i19, %i15 147 %i21 = mul i64 %i20, %i18 148 %i22 = add i64 %i21, %i5 149 %i23 = add nuw i64 %i4, 1 150 %i24 = icmp ult i64 %i23, %i 151 br i1 %i24, label %bb3, label %bb25 152 153bb25: ; preds = %bb3, %bb 154 %i26 = phi i64 [ 0, %bb ], [ %i22, %bb3 ] 155 %i27 = add i64 %i26, %i 156 ret i64 %i27 157} 158 159; test_max_number_reminder: 160; unsigned long test_max_number_reminder(char *p, int count) { 161; unsigned long i=0, res=0; 162; int DISP1 = 4001; 163; int DISP2 = 4002; 164; int DISP3 = 4003; 165; int DISP4 = 4005; 166; int DISP5 = 4006; 167; int DISP6 = 4007; 168; int DISP7 = 4014; 169; int DISP8 = 4010; 170; int DISP9 = 4011; 171; for (; i < count ; i++) { 172; unsigned long x1 = *(unsigned long *)(p + i + DISP1); 173; unsigned long x2 = *(unsigned long *)(p + i + DISP2); 174; unsigned long x3 = *(unsigned long *)(p + i + DISP3); 175; unsigned long x4 = *(unsigned long *)(p + i + DISP4); 176; unsigned long x5 = *(unsigned long *)(p + i + DISP5); 177; unsigned long x6 = *(unsigned long *)(p + i + DISP6); 178; unsigned long x7 = *(unsigned long *)(p + i + DISP7); 179; unsigned long x8 = *(unsigned long *)(p + i + DISP8); 180; unsigned long x9 = *(unsigned long *)(p + i + DISP9); 181; res += x1*x2*x3*x4*x5*x6*x7*x8*x9; 182; } 183; return res + count; 184;} 185 186define i64 @test_max_number_reminder(ptr %arg, i32 signext %arg1) { 187; CHECK-LABEL: test_max_number_reminder: 188; CHECK: # %bb.0: # %bb 189; CHECK-NEXT: cmplwi r4, 0 190; CHECK-NEXT: beq cr0, .LBB2_4 191; CHECK-NEXT: # %bb.1: # %bb3.preheader 192; CHECK-NEXT: std r25, -56(r1) # 8-byte Folded Spill 193; CHECK-NEXT: std r26, -48(r1) # 8-byte Folded Spill 194; CHECK-NEXT: addi r10, r3, 4002 195; CHECK-NEXT: li r3, 0 196; CHECK-NEXT: li r5, -1 197; CHECK-NEXT: li r6, 1 198; CHECK-NEXT: li r7, 3 199; CHECK-NEXT: li r8, 5 200; CHECK-NEXT: li r9, 9 201; CHECK-NEXT: std r27, -40(r1) # 8-byte Folded Spill 202; CHECK-NEXT: std r28, -32(r1) # 8-byte Folded Spill 203; CHECK-NEXT: std r29, -24(r1) # 8-byte Folded Spill 204; CHECK-NEXT: std r30, -16(r1) # 8-byte Folded Spill 205; CHECK-NEXT: mtctr r4 206; CHECK-NEXT: .p2align 4 207; CHECK-NEXT: .LBB2_2: # %bb3 208; CHECK-NEXT: # 209; CHECK-NEXT: ldx r11, r10, r5 210; CHECK-NEXT: ld r12, 0(r10) 211; CHECK-NEXT: ldx r0, r10, r6 212; CHECK-NEXT: ldx r30, r10, r7 213; CHECK-NEXT: mulld r11, r12, r11 214; CHECK-NEXT: ld r29, 4(r10) 215; CHECK-NEXT: ldx r28, r10, r8 216; CHECK-NEXT: ld r27, 12(r10) 217; CHECK-NEXT: ld r26, 8(r10) 218; CHECK-NEXT: ldx r25, r10, r9 219; CHECK-NEXT: addi r10, r10, 1 220; CHECK-NEXT: mulld r11, r11, r0 221; CHECK-NEXT: mulld r11, r11, r30 222; CHECK-NEXT: mulld r11, r11, r29 223; CHECK-NEXT: mulld r11, r11, r28 224; CHECK-NEXT: mulld r11, r11, r27 225; CHECK-NEXT: mulld r11, r11, r26 226; CHECK-NEXT: maddld r3, r11, r25, r3 227; CHECK-NEXT: bdnz .LBB2_2 228; CHECK-NEXT: # %bb.3: 229; CHECK-NEXT: ld r30, -16(r1) # 8-byte Folded Reload 230; CHECK-NEXT: ld r29, -24(r1) # 8-byte Folded Reload 231; CHECK-NEXT: ld r28, -32(r1) # 8-byte Folded Reload 232; CHECK-NEXT: ld r27, -40(r1) # 8-byte Folded Reload 233; CHECK-NEXT: add r3, r3, r4 234; CHECK-NEXT: ld r26, -48(r1) # 8-byte Folded Reload 235; CHECK-NEXT: ld r25, -56(r1) # 8-byte Folded Reload 236; CHECK-NEXT: blr 237; CHECK-NEXT: .LBB2_4: 238; CHECK-NEXT: addi r3, r4, 0 239; CHECK-NEXT: blr 240bb: 241 %i = sext i32 %arg1 to i64 242 %i2 = icmp eq i32 %arg1, 0 243 br i1 %i2, label %bb45, label %bb3 244 245bb3: ; preds = %bb3, %bb 246 %i4 = phi i64 [ %i43, %bb3 ], [ 0, %bb ] 247 %i5 = phi i64 [ %i42, %bb3 ], [ 0, %bb ] 248 %i6 = getelementptr inbounds i8, ptr %arg, i64 %i4 249 %i7 = getelementptr inbounds i8, ptr %i6, i64 4001 250 %i9 = load i64, ptr %i7, align 8 251 %i10 = getelementptr inbounds i8, ptr %i6, i64 4002 252 %i12 = load i64, ptr %i10, align 8 253 %i13 = getelementptr inbounds i8, ptr %i6, i64 4003 254 %i15 = load i64, ptr %i13, align 8 255 %i16 = getelementptr inbounds i8, ptr %i6, i64 4005 256 %i18 = load i64, ptr %i16, align 8 257 %i19 = getelementptr inbounds i8, ptr %i6, i64 4006 258 %i21 = load i64, ptr %i19, align 8 259 %i22 = getelementptr inbounds i8, ptr %i6, i64 4007 260 %i24 = load i64, ptr %i22, align 8 261 %i25 = getelementptr inbounds i8, ptr %i6, i64 4014 262 %i27 = load i64, ptr %i25, align 8 263 %i28 = getelementptr inbounds i8, ptr %i6, i64 4010 264 %i30 = load i64, ptr %i28, align 8 265 %i31 = getelementptr inbounds i8, ptr %i6, i64 4011 266 %i33 = load i64, ptr %i31, align 8 267 %i34 = mul i64 %i12, %i9 268 %i35 = mul i64 %i34, %i15 269 %i36 = mul i64 %i35, %i18 270 %i37 = mul i64 %i36, %i21 271 %i38 = mul i64 %i37, %i24 272 %i39 = mul i64 %i38, %i27 273 %i40 = mul i64 %i39, %i30 274 %i41 = mul i64 %i40, %i33 275 %i42 = add i64 %i41, %i5 276 %i43 = add nuw i64 %i4, 1 277 %i44 = icmp ult i64 %i43, %i 278 br i1 %i44, label %bb3, label %bb45 279 280bb45: ; preds = %bb3, %bb 281 %i46 = phi i64 [ 0, %bb ], [ %i42, %bb3 ] 282 %i47 = add i64 %i46, %i 283 ret i64 %i47 284} 285 286; test_update_ds_prep_interact: 287; unsigned long test_update_ds_prep_interact(char *p, int count) { 288; unsigned long i=0, res=0; 289; int DISP1 = 4001; 290; int DISP2 = 4002; 291; int DISP3 = 4003; 292; int DISP4 = 4006; 293; for (; i < count ; i++) { 294; unsigned long x1 = *(unsigned long *)(p + 4 * i + DISP1); 295; unsigned long x2 = *(unsigned long *)(p + 4 * i + DISP2); 296; unsigned long x3 = *(unsigned long *)(p + 4 * i + DISP3); 297; unsigned long x4 = *(unsigned long *)(p + 4 * i + DISP4); 298; res += x1*x2*x3*x4; 299; } 300; return res + count; 301; } 302 303define dso_local i64 @test_update_ds_prep_interact(ptr %arg, i32 signext %arg1) { 304; CHECK-LABEL: test_update_ds_prep_interact: 305; CHECK: # %bb.0: # %bb 306; CHECK-NEXT: cmplwi r4, 0 307; CHECK-NEXT: beq cr0, .LBB3_4 308; CHECK-NEXT: # %bb.1: # %bb3.preheader 309; CHECK-NEXT: mtctr r4 310; CHECK-NEXT: addi r5, r3, 3998 311; CHECK-NEXT: li r3, 0 312; CHECK-NEXT: li r6, -1 313; CHECK-NEXT: li r7, 1 314; CHECK-NEXT: .p2align 5 315; CHECK-NEXT: .LBB3_2: # %bb3 316; CHECK-NEXT: # 317; CHECK-NEXT: ldu r8, 4(r5) 318; CHECK-NEXT: ldx r9, r5, r6 319; CHECK-NEXT: ldx r10, r5, r7 320; CHECK-NEXT: ld r11, 4(r5) 321; CHECK-NEXT: mulld r8, r8, r9 322; CHECK-NEXT: mulld r8, r8, r10 323; CHECK-NEXT: maddld r3, r8, r11, r3 324; CHECK-NEXT: bdnz .LBB3_2 325; CHECK-NEXT: # %bb.3: # %bb26 326; CHECK-NEXT: add r3, r3, r4 327; CHECK-NEXT: blr 328; CHECK-NEXT: .LBB3_4: 329; CHECK-NEXT: addi r3, r4, 0 330; CHECK-NEXT: blr 331bb: 332 %i = sext i32 %arg1 to i64 333 %i2 = icmp eq i32 %arg1, 0 334 br i1 %i2, label %bb26, label %bb3 335 336bb3: ; preds = %bb3, %bb 337 %i4 = phi i64 [ %i24, %bb3 ], [ 0, %bb ] 338 %i5 = phi i64 [ %i23, %bb3 ], [ 0, %bb ] 339 %i6 = shl i64 %i4, 2 340 %i7 = getelementptr inbounds i8, ptr %arg, i64 %i6 341 %i8 = getelementptr inbounds i8, ptr %i7, i64 4001 342 %i10 = load i64, ptr %i8, align 8 343 %i11 = getelementptr inbounds i8, ptr %i7, i64 4002 344 %i13 = load i64, ptr %i11, align 8 345 %i14 = getelementptr inbounds i8, ptr %i7, i64 4003 346 %i16 = load i64, ptr %i14, align 8 347 %i17 = getelementptr inbounds i8, ptr %i7, i64 4006 348 %i19 = load i64, ptr %i17, align 8 349 %i20 = mul i64 %i13, %i10 350 %i21 = mul i64 %i20, %i16 351 %i22 = mul i64 %i21, %i19 352 %i23 = add i64 %i22, %i5 353 %i24 = add nuw i64 %i4, 1 354 %i25 = icmp ult i64 %i24, %i 355 br i1 %i25, label %bb3, label %bb26 356 357bb26: ; preds = %bb3, %bb 358 %i27 = phi i64 [ 0, %bb ], [ %i23, %bb3 ] 359 %i28 = add i64 %i27, %i 360 ret i64 %i28 361} 362 363; test_update_ds_prep_nointeract: 364; unsigned long test_update_ds_prep_nointeract(char *p, int count) { 365; unsigned long i=0, res=0; 366; int DISP1 = 4001; 367; int DISP2 = 4002; 368; int DISP3 = 4003; 369; int DISP4 = 4007; 370; for (; i < count ; i++) { 371; char x1 = *(p + i + DISP1); 372; unsigned long x2 = *(unsigned long *)(p + i + DISP2); 373; unsigned long x3 = *(unsigned long *)(p + i + DISP3); 374; unsigned long x4 = *(unsigned long *)(p + i + DISP4); 375; res += (unsigned long)x1*x2*x3*x4; 376; } 377; return res + count; 378; } 379 380define i64 @test_update_ds_prep_nointeract(ptr %arg, i32 signext %arg1) { 381; CHECK-LABEL: test_update_ds_prep_nointeract: 382; CHECK: # %bb.0: # %bb 383; CHECK-NEXT: cmplwi r4, 0 384; CHECK-NEXT: beq cr0, .LBB4_4 385; CHECK-NEXT: # %bb.1: # %bb3.preheader 386; CHECK-NEXT: mtctr r4 387; CHECK-NEXT: addi r5, r3, 4000 388; CHECK-NEXT: addi r6, r3, 4003 389; CHECK-NEXT: li r3, 0 390; CHECK-NEXT: li r7, -1 391; CHECK-NEXT: .p2align 4 392; CHECK-NEXT: .LBB4_2: # %bb3 393; CHECK-NEXT: # 394; CHECK-NEXT: lbzu r8, 1(r5) 395; CHECK-NEXT: ldx r9, r6, r7 396; CHECK-NEXT: ld r10, 0(r6) 397; CHECK-NEXT: ld r11, 4(r6) 398; CHECK-NEXT: addi r6, r6, 1 399; CHECK-NEXT: mulld r8, r9, r8 400; CHECK-NEXT: mulld r8, r8, r10 401; CHECK-NEXT: maddld r3, r8, r11, r3 402; CHECK-NEXT: bdnz .LBB4_2 403; CHECK-NEXT: # %bb.3: # %bb25 404; CHECK-NEXT: add r3, r3, r4 405; CHECK-NEXT: blr 406; CHECK-NEXT: .LBB4_4: 407; CHECK-NEXT: addi r3, r4, 0 408; CHECK-NEXT: blr 409bb: 410 %i = sext i32 %arg1 to i64 411 %i2 = icmp eq i32 %arg1, 0 412 br i1 %i2, label %bb25, label %bb3 413 414bb3: ; preds = %bb3, %bb 415 %i4 = phi i64 [ %i23, %bb3 ], [ 0, %bb ] 416 %i5 = phi i64 [ %i22, %bb3 ], [ 0, %bb ] 417 %i6 = getelementptr inbounds i8, ptr %arg, i64 %i4 418 %i7 = getelementptr inbounds i8, ptr %i6, i64 4001 419 %i8 = load i8, ptr %i7, align 1 420 %i9 = getelementptr inbounds i8, ptr %i6, i64 4002 421 %i11 = load i64, ptr %i9, align 8 422 %i12 = getelementptr inbounds i8, ptr %i6, i64 4003 423 %i14 = load i64, ptr %i12, align 8 424 %i15 = getelementptr inbounds i8, ptr %i6, i64 4007 425 %i17 = load i64, ptr %i15, align 8 426 %i18 = zext i8 %i8 to i64 427 %i19 = mul i64 %i11, %i18 428 %i20 = mul i64 %i19, %i14 429 %i21 = mul i64 %i20, %i17 430 %i22 = add i64 %i21, %i5 431 %i23 = add nuw i64 %i4, 1 432 %i24 = icmp ult i64 %i23, %i 433 br i1 %i24, label %bb3, label %bb25 434 435bb25: ; preds = %bb3, %bb 436 %i26 = phi i64 [ 0, %bb ], [ %i22, %bb3 ] 437 %i27 = add i64 %i26, %i 438 ret i64 %i27 439} 440 441; test_ds_multiple_chains: 442; unsigned long test_ds_multiple_chains(char *p, char *q, int count) { 443; unsigned long i=0, res=0; 444; int DISP1 = 4001; 445; int DISP2 = 4010; 446; int DISP3 = 4005; 447; int DISP4 = 4009; 448; for (; i < count ; i++) { 449; unsigned long x1 = *(unsigned long *)(p + i + DISP1); 450; unsigned long x2 = *(unsigned long *)(p + i + DISP2); 451; unsigned long x3 = *(unsigned long *)(p + i + DISP3); 452; unsigned long x4 = *(unsigned long *)(p + i + DISP4); 453; unsigned long x5 = *(unsigned long *)(q + i + DISP1); 454; unsigned long x6 = *(unsigned long *)(q + i + DISP2); 455; unsigned long x7 = *(unsigned long *)(q + i + DISP3); 456; unsigned long x8 = *(unsigned long *)(q + i + DISP4); 457; res += x1*x2*x3*x4*x5*x6*x7*x8; 458; } 459; return res + count; 460; } 461 462define dso_local i64 @test_ds_multiple_chains(ptr %arg, ptr %arg1, i32 signext %arg2) { 463; CHECK-LABEL: test_ds_multiple_chains: 464; CHECK: # %bb.0: # %bb 465; CHECK-NEXT: cmplwi r5, 0 466; CHECK-NEXT: beq cr0, .LBB5_4 467; CHECK-NEXT: # %bb.1: # %bb4.preheader 468; CHECK-NEXT: std r30, -16(r1) # 8-byte Folded Spill 469; CHECK-NEXT: addi r6, r3, 4001 470; CHECK-NEXT: addi r4, r4, 4001 471; CHECK-NEXT: li r3, 0 472; CHECK-NEXT: li r7, 9 473; CHECK-NEXT: mtctr r5 474; CHECK-NEXT: .p2align 4 475; CHECK-NEXT: .LBB5_2: # %bb4 476; CHECK-NEXT: # 477; CHECK-NEXT: ld r8, 0(r6) 478; CHECK-NEXT: ldx r9, r6, r7 479; CHECK-NEXT: ld r10, 4(r6) 480; CHECK-NEXT: ld r11, 8(r6) 481; CHECK-NEXT: addi r6, r6, 1 482; CHECK-NEXT: mulld r8, r9, r8 483; CHECK-NEXT: ld r12, 0(r4) 484; CHECK-NEXT: ldx r0, r4, r7 485; CHECK-NEXT: ld r30, 4(r4) 486; CHECK-NEXT: ld r9, 8(r4) 487; CHECK-NEXT: addi r4, r4, 1 488; CHECK-NEXT: mulld r8, r8, r10 489; CHECK-NEXT: mulld r8, r8, r11 490; CHECK-NEXT: mulld r8, r8, r12 491; CHECK-NEXT: mulld r8, r8, r0 492; CHECK-NEXT: mulld r8, r8, r30 493; CHECK-NEXT: maddld r3, r8, r9, r3 494; CHECK-NEXT: bdnz .LBB5_2 495; CHECK-NEXT: # %bb.3: 496; CHECK-NEXT: ld r30, -16(r1) # 8-byte Folded Reload 497; CHECK-NEXT: add r3, r3, r5 498; CHECK-NEXT: blr 499; CHECK-NEXT: .LBB5_4: 500; CHECK-NEXT: addi r3, r5, 0 501; CHECK-NEXT: blr 502bb: 503 %i = sext i32 %arg2 to i64 504 %i3 = icmp eq i32 %arg2, 0 505 br i1 %i3, label %bb43, label %bb4 506 507bb4: ; preds = %bb4, %bb 508 %i5 = phi i64 [ %i41, %bb4 ], [ 0, %bb ] 509 %i6 = phi i64 [ %i40, %bb4 ], [ 0, %bb ] 510 %i7 = getelementptr inbounds i8, ptr %arg, i64 %i5 511 %i8 = getelementptr inbounds i8, ptr %i7, i64 4001 512 %i10 = load i64, ptr %i8, align 8 513 %i11 = getelementptr inbounds i8, ptr %i7, i64 4010 514 %i13 = load i64, ptr %i11, align 8 515 %i14 = getelementptr inbounds i8, ptr %i7, i64 4005 516 %i16 = load i64, ptr %i14, align 8 517 %i17 = getelementptr inbounds i8, ptr %i7, i64 4009 518 %i19 = load i64, ptr %i17, align 8 519 %i20 = getelementptr inbounds i8, ptr %arg1, i64 %i5 520 %i21 = getelementptr inbounds i8, ptr %i20, i64 4001 521 %i23 = load i64, ptr %i21, align 8 522 %i24 = getelementptr inbounds i8, ptr %i20, i64 4010 523 %i26 = load i64, ptr %i24, align 8 524 %i27 = getelementptr inbounds i8, ptr %i20, i64 4005 525 %i29 = load i64, ptr %i27, align 8 526 %i30 = getelementptr inbounds i8, ptr %i20, i64 4009 527 %i32 = load i64, ptr %i30, align 8 528 %i33 = mul i64 %i13, %i10 529 %i34 = mul i64 %i33, %i16 530 %i35 = mul i64 %i34, %i19 531 %i36 = mul i64 %i35, %i23 532 %i37 = mul i64 %i36, %i26 533 %i38 = mul i64 %i37, %i29 534 %i39 = mul i64 %i38, %i32 535 %i40 = add i64 %i39, %i6 536 %i41 = add nuw i64 %i5, 1 537 %i42 = icmp ult i64 %i41, %i 538 br i1 %i42, label %bb4, label %bb43 539 540bb43: ; preds = %bb4, %bb 541 %i44 = phi i64 [ 0, %bb ], [ %i40, %bb4 ] 542 %i45 = add i64 %i44, %i 543 ret i64 %i45 544} 545 546; test_ds_cross_basic_blocks: 547;extern char *arr; 548;unsigned long foo(char *p, int count) 549;{ 550; unsigned long i=0, res=0; 551; int DISP1 = 4000; 552; int DISP2 = 4001; 553; int DISP3 = 4002; 554; int DISP4 = 4003; 555; int DISP5 = 4005; 556; int DISP6 = 4009; 557; unsigned long x1, x2, x3, x4, x5, x6; 558; x1=x2=x3=x4=x5=x6=1; 559; for (; i < count ; i++) { 560; if (arr[i] % 3 == 1) { 561; x1 += *(unsigned long *)(p + i + DISP1); 562; x2 += *(unsigned long *)(p + i + DISP2); 563; } 564; else if (arr[i] % 3 == 2) { 565; x3 += *(unsigned long *)(p + i + DISP3); 566; x4 += *(unsigned long *)(p + i + DISP5); 567; } 568; else { 569; x5 += *(unsigned long *)(p + i + DISP4); 570; x6 += *(unsigned long *)(p + i + DISP6); 571; } 572; res += x1*x2*x3*x4*x5*x6; 573; } 574; return res; 575;} 576 577@arr = external local_unnamed_addr global ptr, align 8 578 579define i64 @test_ds_cross_basic_blocks(ptr %arg, i32 signext %arg1) { 580; CHECK-LABEL: test_ds_cross_basic_blocks: 581; CHECK: # %bb.0: # %bb 582; CHECK-NEXT: cmplwi r4, 0 583; CHECK-NEXT: beq cr0, .LBB6_9 584; CHECK-NEXT: # %bb.1: # %bb3 585; CHECK-NEXT: addis r5, r2, .LC0@toc@ha 586; CHECK-NEXT: std r28, -32(r1) # 8-byte Folded Spill 587; CHECK-NEXT: std r29, -24(r1) # 8-byte Folded Spill 588; CHECK-NEXT: ld r5, .LC0@toc@l(r5) 589; CHECK-NEXT: std r30, -16(r1) # 8-byte Folded Spill 590; CHECK-NEXT: addi r6, r3, 4009 591; CHECK-NEXT: li r3, 0 592; CHECK-NEXT: li r7, -7 593; CHECK-NEXT: li r8, -6 594; CHECK-NEXT: li r9, 1 595; CHECK-NEXT: li r10, 1 596; CHECK-NEXT: li r11, 1 597; CHECK-NEXT: li r12, 1 598; CHECK-NEXT: li r0, 1 599; CHECK-NEXT: ld r5, 0(r5) 600; CHECK-NEXT: mtctr r4 601; CHECK-NEXT: li r4, 1 602; CHECK-NEXT: addi r5, r5, -1 603; CHECK-NEXT: b .LBB6_4 604; CHECK-NEXT: .p2align 4 605; CHECK-NEXT: .LBB6_2: # %bb18 606; CHECK-NEXT: # 607; CHECK-NEXT: addi r30, r6, -9 608; CHECK-NEXT: ld r30, 0(r30) 609; CHECK-NEXT: add r0, r30, r0 610; CHECK-NEXT: ld r30, -8(r6) 611; CHECK-NEXT: add r12, r30, r12 612; CHECK-NEXT: .LBB6_3: # %bb49 613; CHECK-NEXT: # 614; CHECK-NEXT: mulld r30, r12, r0 615; CHECK-NEXT: addi r6, r6, 1 616; CHECK-NEXT: mulld r30, r30, r11 617; CHECK-NEXT: mulld r30, r30, r10 618; CHECK-NEXT: mulld r30, r30, r9 619; CHECK-NEXT: maddld r3, r30, r4, r3 620; CHECK-NEXT: bdz .LBB6_8 621; CHECK-NEXT: .LBB6_4: # %bb5 622; CHECK-NEXT: # 623; CHECK-NEXT: lbzu r30, 1(r5) 624; CHECK-NEXT: mulli r29, r30, 171 625; CHECK-NEXT: rlwinm r28, r29, 24, 8, 30 626; CHECK-NEXT: srwi r29, r29, 9 627; CHECK-NEXT: add r29, r29, r28 628; CHECK-NEXT: sub r30, r30, r29 629; CHECK-NEXT: clrlwi r30, r30, 24 630; CHECK-NEXT: cmplwi r30, 1 631; CHECK-NEXT: beq cr0, .LBB6_2 632; CHECK-NEXT: # %bb.5: # %bb28 633; CHECK-NEXT: # 634; CHECK-NEXT: cmplwi r30, 2 635; CHECK-NEXT: bne cr0, .LBB6_7 636; CHECK-NEXT: # %bb.6: # %bb31 637; CHECK-NEXT: # 638; CHECK-NEXT: ldx r30, r6, r7 639; CHECK-NEXT: add r11, r30, r11 640; CHECK-NEXT: ld r30, -4(r6) 641; CHECK-NEXT: add r10, r30, r10 642; CHECK-NEXT: b .LBB6_3 643; CHECK-NEXT: .p2align 4 644; CHECK-NEXT: .LBB6_7: # %bb40 645; CHECK-NEXT: # 646; CHECK-NEXT: ldx r30, r6, r8 647; CHECK-NEXT: add r9, r30, r9 648; CHECK-NEXT: ld r30, 0(r6) 649; CHECK-NEXT: add r4, r30, r4 650; CHECK-NEXT: b .LBB6_3 651; CHECK-NEXT: .LBB6_8: 652; CHECK-NEXT: ld r30, -16(r1) # 8-byte Folded Reload 653; CHECK-NEXT: ld r29, -24(r1) # 8-byte Folded Reload 654; CHECK-NEXT: ld r28, -32(r1) # 8-byte Folded Reload 655; CHECK-NEXT: blr 656; CHECK-NEXT: .LBB6_9: 657; CHECK-NEXT: li r3, 0 658; CHECK-NEXT: blr 659bb: 660 %i = sext i32 %arg1 to i64 661 %i2 = icmp eq i32 %arg1, 0 662 br i1 %i2, label %bb64, label %bb3 663 664bb3: ; preds = %bb 665 %i4 = load ptr, ptr @arr, align 8 666 br label %bb5 667 668bb5: ; preds = %bb49, %bb3 669 %i6 = phi i64 [ 1, %bb3 ], [ %i55, %bb49 ] 670 %i7 = phi i64 [ 1, %bb3 ], [ %i54, %bb49 ] 671 %i8 = phi i64 [ 1, %bb3 ], [ %i53, %bb49 ] 672 %i9 = phi i64 [ 1, %bb3 ], [ %i52, %bb49 ] 673 %i10 = phi i64 [ 1, %bb3 ], [ %i51, %bb49 ] 674 %i11 = phi i64 [ 1, %bb3 ], [ %i50, %bb49 ] 675 %i12 = phi i64 [ 0, %bb3 ], [ %i62, %bb49 ] 676 %i13 = phi i64 [ 0, %bb3 ], [ %i61, %bb49 ] 677 %i14 = getelementptr inbounds i8, ptr %i4, i64 %i12 678 %i15 = load i8, ptr %i14, align 1 679 %i16 = urem i8 %i15, 3 680 %i17 = icmp eq i8 %i16, 1 681 br i1 %i17, label %bb18, label %bb28 682 683bb18: ; preds = %bb5 684 %i19 = getelementptr inbounds i8, ptr %arg, i64 %i12 685 %i20 = getelementptr inbounds i8, ptr %i19, i64 4000 686 %i22 = load i64, ptr %i20, align 8 687 %i23 = add i64 %i22, %i11 688 %i24 = getelementptr inbounds i8, ptr %i19, i64 4001 689 %i26 = load i64, ptr %i24, align 8 690 %i27 = add i64 %i26, %i10 691 br label %bb49 692 693bb28: ; preds = %bb5 694 %i29 = icmp eq i8 %i16, 2 695 %i30 = getelementptr inbounds i8, ptr %arg, i64 %i12 696 br i1 %i29, label %bb31, label %bb40 697 698bb31: ; preds = %bb28 699 %i32 = getelementptr inbounds i8, ptr %i30, i64 4002 700 %i34 = load i64, ptr %i32, align 8 701 %i35 = add i64 %i34, %i9 702 %i36 = getelementptr inbounds i8, ptr %i30, i64 4005 703 %i38 = load i64, ptr %i36, align 8 704 %i39 = add i64 %i38, %i8 705 br label %bb49 706 707bb40: ; preds = %bb28 708 %i41 = getelementptr inbounds i8, ptr %i30, i64 4003 709 %i43 = load i64, ptr %i41, align 8 710 %i44 = add i64 %i43, %i7 711 %i45 = getelementptr inbounds i8, ptr %i30, i64 4009 712 %i47 = load i64, ptr %i45, align 8 713 %i48 = add i64 %i47, %i6 714 br label %bb49 715 716bb49: ; preds = %bb40, %bb31, %bb18 717 %i50 = phi i64 [ %i23, %bb18 ], [ %i11, %bb31 ], [ %i11, %bb40 ] 718 %i51 = phi i64 [ %i27, %bb18 ], [ %i10, %bb31 ], [ %i10, %bb40 ] 719 %i52 = phi i64 [ %i9, %bb18 ], [ %i35, %bb31 ], [ %i9, %bb40 ] 720 %i53 = phi i64 [ %i8, %bb18 ], [ %i39, %bb31 ], [ %i8, %bb40 ] 721 %i54 = phi i64 [ %i7, %bb18 ], [ %i7, %bb31 ], [ %i44, %bb40 ] 722 %i55 = phi i64 [ %i6, %bb18 ], [ %i6, %bb31 ], [ %i48, %bb40 ] 723 %i56 = mul i64 %i51, %i50 724 %i57 = mul i64 %i56, %i52 725 %i58 = mul i64 %i57, %i53 726 %i59 = mul i64 %i58, %i54 727 %i60 = mul i64 %i59, %i55 728 %i61 = add i64 %i60, %i13 729 %i62 = add nuw i64 %i12, 1 730 %i63 = icmp ult i64 %i62, %i 731 br i1 %i63, label %bb5, label %bb64 732 733bb64: ; preds = %bb49, %bb 734 %i65 = phi i64 [ 0, %bb ], [ %i61, %bb49 ] 735 ret i64 %i65 736} 737 738; test_ds_float: 739;float test_ds_float(char *p, int count) { 740; int i=0 ; 741; float res=0; 742; int DISP1 = 4001; 743; int DISP2 = 4002; 744; int DISP3 = 4022; 745; int DISP4 = 4062; 746; for (; i < count ; i++) { 747; float x1 = *(float *)(p + i + DISP1); 748; float x2 = *(float *)(p + i + DISP2); 749; float x3 = *(float *)(p + i + DISP3); 750; float x4 = *(float *)(p + i + DISP4); 751; res += x1*x2*x3*x4; 752; } 753; return res; 754;} 755 756define float @test_ds_float(ptr %arg, i32 signext %arg1) { 757; CHECK-LABEL: test_ds_float: 758; CHECK: # %bb.0: # %bb 759; CHECK-NEXT: cmpwi r4, 0 760; CHECK-NEXT: ble cr0, .LBB7_4 761; CHECK-NEXT: # %bb.1: # %bb2 762; CHECK-NEXT: clrldi r4, r4, 32 763; CHECK-NEXT: addi r3, r3, 4002 764; CHECK-NEXT: xxlxor f1, f1, f1 765; CHECK-NEXT: mtctr r4 766; CHECK-NEXT: li r4, -1 767; CHECK-NEXT: .p2align 4 768; CHECK-NEXT: .LBB7_2: # %bb4 769; CHECK-NEXT: # 770; CHECK-NEXT: lfsx f0, r3, r4 771; CHECK-NEXT: lfs f2, 0(r3) 772; CHECK-NEXT: xsmulsp f0, f0, f2 773; CHECK-NEXT: lfs f3, 20(r3) 774; CHECK-NEXT: xsmulsp f0, f0, f3 775; CHECK-NEXT: lfs f4, 60(r3) 776; CHECK-NEXT: addi r3, r3, 1 777; CHECK-NEXT: xsmulsp f0, f0, f4 778; CHECK-NEXT: xsaddsp f1, f1, f0 779; CHECK-NEXT: bdnz .LBB7_2 780; CHECK-NEXT: # %bb.3: # %bb26 781; CHECK-NEXT: blr 782; CHECK-NEXT: .LBB7_4: 783; CHECK-NEXT: xxlxor f1, f1, f1 784; CHECK-NEXT: blr 785bb: 786 %i = icmp sgt i32 %arg1, 0 787 br i1 %i, label %bb2, label %bb26 788 789bb2: ; preds = %bb 790 %i3 = zext i32 %arg1 to i64 791 br label %bb4 792 793bb4: ; preds = %bb4, %bb2 794 %i5 = phi i64 [ 0, %bb2 ], [ %i24, %bb4 ] 795 %i6 = phi float [ 0.000000e+00, %bb2 ], [ %i23, %bb4 ] 796 %i7 = getelementptr inbounds i8, ptr %arg, i64 %i5 797 %i8 = getelementptr inbounds i8, ptr %i7, i64 4001 798 %i10 = load float, ptr %i8, align 4 799 %i11 = getelementptr inbounds i8, ptr %i7, i64 4002 800 %i13 = load float, ptr %i11, align 4 801 %i14 = getelementptr inbounds i8, ptr %i7, i64 4022 802 %i16 = load float, ptr %i14, align 4 803 %i17 = getelementptr inbounds i8, ptr %i7, i64 4062 804 %i19 = load float, ptr %i17, align 4 805 %i20 = fmul float %i10, %i13 806 %i21 = fmul float %i20, %i16 807 %i22 = fmul float %i21, %i19 808 %i23 = fadd float %i6, %i22 809 %i24 = add nuw nsw i64 %i5, 1 810 %i25 = icmp eq i64 %i24, %i3 811 br i1 %i25, label %bb26, label %bb4 812 813bb26: ; preds = %bb4, %bb 814 %i27 = phi float [ 0.000000e+00, %bb ], [ %i23, %bb4 ] 815 ret float %i27 816} 817 818; test_ds_combine_float_int: 819;float test_ds_combine_float_int(char *p, int count) { 820; int i=0 ; 821; float res=0; 822; int DISP1 = 4001; 823; int DISP2 = 4002; 824; int DISP3 = 4022; 825; int DISP4 = 4062; 826; for (; i < count ; i++) { 827; float x1 = *(float *)(p + i + DISP1); 828; unsigned long x2 = *(unsigned long*)(p + i + DISP2); 829; float x3 = *(float *)(p + i + DISP3); 830; float x4 = *(float *)(p + i + DISP4); 831; res += x1*x2*x3*x4; 832; } 833; return res; 834;} 835 836define float @test_ds_combine_float_int(ptr %arg, i32 signext %arg1) { 837; CHECK-LABEL: test_ds_combine_float_int: 838; CHECK: # %bb.0: # %bb 839; CHECK-NEXT: cmpwi r4, 0 840; CHECK-NEXT: ble cr0, .LBB8_4 841; CHECK-NEXT: # %bb.1: # %bb2 842; CHECK-NEXT: clrldi r4, r4, 32 843; CHECK-NEXT: addi r3, r3, 4002 844; CHECK-NEXT: xxlxor f1, f1, f1 845; CHECK-NEXT: mtctr r4 846; CHECK-NEXT: li r4, -1 847; CHECK-NEXT: .p2align 4 848; CHECK-NEXT: .LBB8_2: # %bb4 849; CHECK-NEXT: # 850; CHECK-NEXT: lfd f4, 0(r3) 851; CHECK-NEXT: lfsx f0, r3, r4 852; CHECK-NEXT: xscvuxdsp f4, f4 853; CHECK-NEXT: lfs f2, 20(r3) 854; CHECK-NEXT: lfs f3, 60(r3) 855; CHECK-NEXT: addi r3, r3, 1 856; CHECK-NEXT: xsmulsp f0, f0, f4 857; CHECK-NEXT: xsmulsp f0, f2, f0 858; CHECK-NEXT: xsmulsp f0, f3, f0 859; CHECK-NEXT: xsaddsp f1, f1, f0 860; CHECK-NEXT: bdnz .LBB8_2 861; CHECK-NEXT: # %bb.3: # %bb27 862; CHECK-NEXT: blr 863; CHECK-NEXT: .LBB8_4: 864; CHECK-NEXT: xxlxor f1, f1, f1 865; CHECK-NEXT: blr 866bb: 867 %i = icmp sgt i32 %arg1, 0 868 br i1 %i, label %bb2, label %bb27 869 870bb2: ; preds = %bb 871 %i3 = zext i32 %arg1 to i64 872 br label %bb4 873 874bb4: ; preds = %bb4, %bb2 875 %i5 = phi i64 [ 0, %bb2 ], [ %i25, %bb4 ] 876 %i6 = phi float [ 0.000000e+00, %bb2 ], [ %i24, %bb4 ] 877 %i7 = getelementptr inbounds i8, ptr %arg, i64 %i5 878 %i8 = getelementptr inbounds i8, ptr %i7, i64 4001 879 %i10 = load float, ptr %i8, align 4 880 %i11 = getelementptr inbounds i8, ptr %i7, i64 4002 881 %i13 = load i64, ptr %i11, align 8 882 %i14 = getelementptr inbounds i8, ptr %i7, i64 4022 883 %i16 = load float, ptr %i14, align 4 884 %i17 = getelementptr inbounds i8, ptr %i7, i64 4062 885 %i19 = load float, ptr %i17, align 4 886 %i20 = uitofp i64 %i13 to float 887 %i21 = fmul float %i10, %i20 888 %i22 = fmul float %i16, %i21 889 %i23 = fmul float %i19, %i22 890 %i24 = fadd float %i6, %i23 891 %i25 = add nuw nsw i64 %i5, 1 892 %i26 = icmp eq i64 %i25, %i3 893 br i1 %i26, label %bb27, label %bb4 894 895bb27: ; preds = %bb4, %bb 896 %i28 = phi float [ 0.000000e+00, %bb ], [ %i24, %bb4 ] 897 ret float %i28 898} 899 900; test_ds_lwa_prep: 901; long long test_ds_lwa_prep(char *p, int count) { 902; long long i=0, res=0; 903; int DISP1 = 4001; 904; int DISP2 = 4002; 905; int DISP3 = 4006; 906; int DISP4 = 4010; 907; for (; i < count ; i++) { 908; long long x1 = *(int *)(p + i + DISP1); 909; long long x2 = *(int *)(p + i + DISP2); 910; long long x3 = *(int *)(p + i + DISP3); 911; long long x4 = *(int *)(p + i + DISP4); 912; res += x1*x2*x3*x4; 913; } 914; return res + count; 915; } 916 917define i64 @test_ds_lwa_prep(ptr %arg, i32 signext %arg1) { 918; CHECK-LABEL: test_ds_lwa_prep: 919; CHECK: # %bb.0: # %bb 920; CHECK-NEXT: cmpwi r4, 0 921; CHECK-NEXT: ble cr0, .LBB9_4 922; CHECK-NEXT: # %bb.1: # %bb3.preheader 923; CHECK-NEXT: mtctr r4 924; CHECK-NEXT: addi r5, r3, 2 925; CHECK-NEXT: li r3, 0 926; CHECK-NEXT: li r6, -1 927; CHECK-NEXT: .p2align 4 928; CHECK-NEXT: .LBB9_2: # %bb3 929; CHECK-NEXT: # 930; CHECK-NEXT: lwax r7, r5, r6 931; CHECK-NEXT: lwa r8, 0(r5) 932; CHECK-NEXT: lwa r9, 4(r5) 933; CHECK-NEXT: lwa r10, 8(r5) 934; CHECK-NEXT: addi r5, r5, 1 935; CHECK-NEXT: mulld r7, r8, r7 936; CHECK-NEXT: mulld r7, r7, r9 937; CHECK-NEXT: maddld r3, r7, r10, r3 938; CHECK-NEXT: bdnz .LBB9_2 939; CHECK-NEXT: # %bb.3: # %bb29 940; CHECK-NEXT: add r3, r3, r4 941; CHECK-NEXT: blr 942; CHECK-NEXT: .LBB9_4: 943; CHECK-NEXT: addi r3, r4, 0 944; CHECK-NEXT: blr 945bb: 946 %i = sext i32 %arg1 to i64 947 %i2 = icmp sgt i32 %arg1, 0 948 br i1 %i2, label %bb3, label %bb29 949 950bb3: ; preds = %bb3, %bb 951 %i4 = phi i64 [ %i27, %bb3 ], [ 0, %bb ] 952 %i5 = phi i64 [ %i26, %bb3 ], [ 0, %bb ] 953 %i6 = getelementptr inbounds i8, ptr %arg, i64 %i4 954 %i7 = getelementptr inbounds i8, ptr %i6, i64 1 955 %i9 = load i32, ptr %i7, align 4 956 %i10 = sext i32 %i9 to i64 957 %i11 = getelementptr inbounds i8, ptr %i6, i64 2 958 %i13 = load i32, ptr %i11, align 4 959 %i14 = sext i32 %i13 to i64 960 %i15 = getelementptr inbounds i8, ptr %i6, i64 6 961 %i17 = load i32, ptr %i15, align 4 962 %i18 = sext i32 %i17 to i64 963 %i19 = getelementptr inbounds i8, ptr %i6, i64 10 964 %i21 = load i32, ptr %i19, align 4 965 %i22 = sext i32 %i21 to i64 966 %i23 = mul nsw i64 %i14, %i10 967 %i24 = mul nsw i64 %i23, %i18 968 %i25 = mul nsw i64 %i24, %i22 969 %i26 = add nsw i64 %i25, %i5 970 %i27 = add nuw nsw i64 %i4, 1 971 %i28 = icmp eq i64 %i27, %i 972 br i1 %i28, label %bb29, label %bb3 973 974bb29: ; preds = %bb3, %bb 975 %i30 = phi i64 [ 0, %bb ], [ %i26, %bb3 ] 976 %i31 = add nsw i64 %i30, %i 977 ret i64 %i31 978} 979 980