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