brintos

brintos / llvm-project-archived public Read only

0
0
Text · 45.1 KiB · 8283e7b Raw
1183 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -ppc-asm-full-reg-names -verify-machineinstrs -ppc-formprep-chain-commoning \3; RUN:   -mtriple=powerpc64le-unknown-linux-gnu -mcpu=pwr9 < %s | FileCheck %s4 5; addresses:6; 1: base1 + offset7; 2: + offset8; 3: + offset9; 4: + offset10;11; chains:12; 1: base: base1 + offset, offsets: (0, offset)13; 2: base: base1 + 3*offset, offsets: (0, offset)14;15; long long two_chain_same_offset_succ(char *p, long long offset, long long base1, long long n) {16;   long long o1 = base1 + offset;17;   long long o2 = base1 + 2 * offset;18;   long long o3 = base1 + 3 * offset;19;   long long o4 = base1 + 4 * offset;20;   char *p1 = p + o1;21;   char *p2 = p + o2;22;   char *p3 = p + o3;23;   char *p4 = p + o4;24;   long long sum = 0;25;   for (long long i = 0; i < n; ++i) {26;     unsigned long x1 = *(unsigned long *)(p1 + i);27;     unsigned long x2 = *(unsigned long *)(p2 + i);28;     unsigned long x3 = *(unsigned long *)(p3 + i);29;     unsigned long x4 = *(unsigned long *)(p4 + i);30;     sum += x1 * x2 * x3 * x4;31;   }32;   return sum;33; }34;35define i64 @two_chain_same_offset_succ(ptr %p, i64 %offset, i64 %base1, i64 %n) {36; CHECK-LABEL: two_chain_same_offset_succ:37; CHECK:       # %bb.0: # %entry38; CHECK-NEXT:    cmpdi r6, 039; CHECK-NEXT:    ble cr0, .LBB0_440; CHECK-NEXT:  # %bb.1: # %for.body.preheader41; CHECK-NEXT:    sldi r7, r4, 142; CHECK-NEXT:    mtctr r643; CHECK-NEXT:    add r8, r4, r744; CHECK-NEXT:    add r7, r5, r445; CHECK-NEXT:    add r5, r5, r846; CHECK-NEXT:    add r7, r3, r747; CHECK-NEXT:    add r5, r3, r548; CHECK-NEXT:    li r3, 049; CHECK-NEXT:    .p2align 450; CHECK-NEXT:  .LBB0_2: # %for.body51; CHECK-NEXT:    #52; CHECK-NEXT:    ld r6, 0(r7)53; CHECK-NEXT:    ldx r8, r7, r454; CHECK-NEXT:    ld r9, 0(r5)55; CHECK-NEXT:    ldx r10, r5, r456; CHECK-NEXT:    addi r7, r7, 157; CHECK-NEXT:    addi r5, r5, 158; CHECK-NEXT:    mulld r6, r8, r659; CHECK-NEXT:    mulld r6, r6, r960; CHECK-NEXT:    maddld r3, r6, r10, r361; CHECK-NEXT:    bdnz .LBB0_262; CHECK-NEXT:  # %bb.3: # %for.cond.cleanup63; CHECK-NEXT:    blr64; CHECK-NEXT:  .LBB0_4:65; CHECK-NEXT:    li r3, 066; CHECK-NEXT:    blr67entry:68  %mul = shl nsw i64 %offset, 169  %mul2 = mul nsw i64 %offset, 370  %mul4 = shl nsw i64 %offset, 271  %cmp46 = icmp sgt i64 %n, 072  br i1 %cmp46, label %for.body, label %for.cond.cleanup73 74for.cond.cleanup:                                 ; preds = %for.body, %entry75  %sum.0.lcssa = phi i64 [ 0, %entry ], [ %add16, %for.body ]76  ret i64 %sum.0.lcssa77 78for.body:                                         ; preds = %entry, %for.body79  %sum.048 = phi i64 [ %add16, %for.body ], [ 0, %entry ]80  %i.047 = phi i64 [ %inc, %for.body ], [ 0, %entry ]81  %add = add i64 %i.047, %base182  %add.ptr9.idx = add i64 %add, %offset83  %add.ptr9 = getelementptr inbounds i8, ptr %p, i64 %add.ptr9.idx84  %0 = load i64, ptr %add.ptr9, align 885  %add.ptr10.idx = add i64 %add, %mul86  %add.ptr10 = getelementptr inbounds i8, ptr %p, i64 %add.ptr10.idx87  %1 = load i64, ptr %add.ptr10, align 888  %add.ptr11.idx = add i64 %add, %mul289  %add.ptr11 = getelementptr inbounds i8, ptr %p, i64 %add.ptr11.idx90  %2 = load i64, ptr %add.ptr11, align 891  %add.ptr12.idx = add i64 %add, %mul492  %add.ptr12 = getelementptr inbounds i8, ptr %p, i64 %add.ptr12.idx93  %3 = load i64, ptr %add.ptr12, align 894  %mul13 = mul i64 %1, %095  %mul14 = mul i64 %mul13, %296  %mul15 = mul i64 %mul14, %397  %add16 = add i64 %mul15, %sum.04898  %inc = add nuw nsw i64 %i.047, 199  %exitcond.not = icmp eq i64 %inc, %n100  br i1 %exitcond.not, label %for.cond.cleanup, label %for.body101}102 103; addresses:104; 1: base1 + offset105; 2: + offset106; 3: + offset107; 4: + offset108; 5: + offset109;110; It can not be commoned to chains because we need a chain for a single address.111; It is not profitable to common chains if not all addresses are in chains.112;113; long long not_perfect_chain_all_same_offset_fail(char *p, long long offset, long long base1, long long n) {114;   long long o1 = base1 + offset;115;   long long o2 = base1 + 2 * offset;116;   long long o3 = base1 + 3 * offset;117;   long long o4 = base1 + 4 * offset;118;   long long o5 = base1 + 5 * offset;119;   char *p1 = p + o1;120;   char *p2 = p + o2;121;   char *p3 = p + o3;122;   char *p4 = p + o4;123;   char *p5 = p + o5;124;   long long sum = 0;125;   for (long long i = 0; i < n; ++i) {126;     unsigned long x1 = *(unsigned long *)(p1 + i);127;     unsigned long x2 = *(unsigned long *)(p2 + i);128;     unsigned long x3 = *(unsigned long *)(p3 + i);129;     unsigned long x4 = *(unsigned long *)(p4 + i);130;     unsigned long x5 = *(unsigned long *)(p5 + i);131;     sum += x1 * x2 * x3 * x4 * x5;132;   }133;   return sum;134; }135;136define i64 @not_perfect_chain_all_same_offset_fail(ptr %p, i64 %offset, i64 %base1, i64 %n) {137; CHECK-LABEL: not_perfect_chain_all_same_offset_fail:138; CHECK:       # %bb.0: # %entry139; CHECK-NEXT:    cmpdi r6, 0140; CHECK-NEXT:    ble cr0, .LBB1_4141; CHECK-NEXT:  # %bb.1: # %for.body.preheader142; CHECK-NEXT:    std r30, -16(r1) # 8-byte Folded Spill143; CHECK-NEXT:    sldi r7, r4, 1144; CHECK-NEXT:    add r5, r3, r5145; CHECK-NEXT:    li r3, 0146; CHECK-NEXT:    add r8, r4, r7147; CHECK-NEXT:    sldi r9, r4, 2148; CHECK-NEXT:    mtctr r6149; CHECK-NEXT:    add r10, r4, r9150; CHECK-NEXT:    .p2align 4151; CHECK-NEXT:  .LBB1_2: # %for.body152; CHECK-NEXT:    #153; CHECK-NEXT:    ldx r6, r5, r4154; CHECK-NEXT:    ldx r11, r5, r7155; CHECK-NEXT:    ldx r12, r5, r8156; CHECK-NEXT:    ldx r0, r5, r9157; CHECK-NEXT:    mulld r6, r11, r6158; CHECK-NEXT:    ldx r30, r5, r10159; CHECK-NEXT:    addi r5, r5, 1160; CHECK-NEXT:    mulld r6, r6, r12161; CHECK-NEXT:    mulld r6, r6, r0162; CHECK-NEXT:    maddld r3, r6, r30, r3163; CHECK-NEXT:    bdnz .LBB1_2164; CHECK-NEXT:  # %bb.3:165; CHECK-NEXT:    ld r30, -16(r1) # 8-byte Folded Reload166; CHECK-NEXT:    blr167; CHECK-NEXT:  .LBB1_4:168; CHECK-NEXT:    li r3, 0169; CHECK-NEXT:    blr170entry:171  %mul = shl nsw i64 %offset, 1172  %mul2 = mul nsw i64 %offset, 3173  %mul4 = shl nsw i64 %offset, 2174  %mul6 = mul nsw i64 %offset, 5175  %cmp58 = icmp sgt i64 %n, 0176  br i1 %cmp58, label %for.body, label %for.cond.cleanup177 178for.cond.cleanup:                                 ; preds = %for.body, %entry179  %sum.0.lcssa = phi i64 [ 0, %entry ], [ %add21, %for.body ]180  ret i64 %sum.0.lcssa181 182for.body:                                         ; preds = %entry, %for.body183  %sum.060 = phi i64 [ %add21, %for.body ], [ 0, %entry ]184  %i.059 = phi i64 [ %inc, %for.body ], [ 0, %entry ]185  %add = add i64 %i.059, %base1186  %add.ptr12.idx = add i64 %add, %offset187  %add.ptr12 = getelementptr inbounds i8, ptr %p, i64 %add.ptr12.idx188  %0 = load i64, ptr %add.ptr12, align 8189  %add.ptr13.idx = add i64 %add, %mul190  %add.ptr13 = getelementptr inbounds i8, ptr %p, i64 %add.ptr13.idx191  %1 = load i64, ptr %add.ptr13, align 8192  %add.ptr14.idx = add i64 %add, %mul2193  %add.ptr14 = getelementptr inbounds i8, ptr %p, i64 %add.ptr14.idx194  %2 = load i64, ptr %add.ptr14, align 8195  %add.ptr15.idx = add i64 %add, %mul4196  %add.ptr15 = getelementptr inbounds i8, ptr %p, i64 %add.ptr15.idx197  %3 = load i64, ptr %add.ptr15, align 8198  %add.ptr16.idx = add i64 %add, %mul6199  %add.ptr16 = getelementptr inbounds i8, ptr %p, i64 %add.ptr16.idx200  %4 = load i64, ptr %add.ptr16, align 8201  %mul17 = mul i64 %1, %0202  %mul18 = mul i64 %mul17, %2203  %mul19 = mul i64 %mul18, %3204  %mul20 = mul i64 %mul19, %4205  %add21 = add i64 %mul20, %sum.060206  %inc = add nuw nsw i64 %i.059, 1207  %exitcond.not = icmp eq i64 %inc, %n208  br i1 %exitcond.not, label %for.cond.cleanup, label %for.body209}210 211; addresses:212; 1: base1213; 2: + 2*offset214; 3: + offset215;216; We need at least 4 addresses to common 2 chains to reuse at least 1 offset.217;218; long long no_enough_elements_fail(char *p, long long offset, long long base1, long long n) {219;   long long o1 = base1;220;   long long o2 = base1 + 2 * offset;221;   long long o3 = base1 + 3 * offset;222;   char *p1 = p + o1;223;   char *p2 = p + o2;224;   char *p3 = p + o3;225;   long long sum = 0;226;   for (long long i = 0; i < n; ++i) {227;     unsigned long x1 = *(unsigned long *)(p1 + i);228;     unsigned long x2 = *(unsigned long *)(p2 + i);229;     unsigned long x3 = *(unsigned long *)(p3 + i);230;     sum += x1 * x2 * x3;231;   }232;   return sum;233; }234;235define i64 @no_enough_elements_fail(ptr %p, i64 %offset, i64 %base1, i64 %n) {236; CHECK-LABEL: no_enough_elements_fail:237; CHECK:       # %bb.0: # %entry238; CHECK-NEXT:    cmpdi r6, 0239; CHECK-NEXT:    ble cr0, .LBB2_4240; CHECK-NEXT:  # %bb.1: # %for.body.preheader241; CHECK-NEXT:    sldi r7, r4, 1242; CHECK-NEXT:    mtctr r6243; CHECK-NEXT:    add r5, r3, r5244; CHECK-NEXT:    li r3, 0245; CHECK-NEXT:    add r4, r4, r7246; CHECK-NEXT:    .p2align 5247; CHECK-NEXT:  .LBB2_2: # %for.body248; CHECK-NEXT:    #249; CHECK-NEXT:    ld r6, 0(r5)250; CHECK-NEXT:    ldx r8, r5, r7251; CHECK-NEXT:    ldx r9, r5, r4252; CHECK-NEXT:    addi r5, r5, 1253; CHECK-NEXT:    mulld r6, r8, r6254; CHECK-NEXT:    maddld r3, r6, r9, r3255; CHECK-NEXT:    bdnz .LBB2_2256; CHECK-NEXT:  # %bb.3: # %for.cond.cleanup257; CHECK-NEXT:    blr258; CHECK-NEXT:  .LBB2_4:259; CHECK-NEXT:    li r3, 0260; CHECK-NEXT:    blr261entry:262  %mul = shl nsw i64 %offset, 1263  %mul1 = mul nsw i64 %offset, 3264  %cmp32 = icmp sgt i64 %n, 0265  br i1 %cmp32, label %for.body, label %for.cond.cleanup266 267for.cond.cleanup:                                 ; preds = %for.body, %entry268  %sum.0.lcssa = phi i64 [ 0, %entry ], [ %add10, %for.body ]269  ret i64 %sum.0.lcssa270 271for.body:                                         ; preds = %entry, %for.body272  %sum.034 = phi i64 [ %add10, %for.body ], [ 0, %entry ]273  %i.033 = phi i64 [ %inc, %for.body ], [ 0, %entry ]274  %add.ptr5.idx = add i64 %i.033, %base1275  %add.ptr5 = getelementptr inbounds i8, ptr %p, i64 %add.ptr5.idx276  %0 = load i64, ptr %add.ptr5, align 8277  %add.ptr6.idx = add i64 %add.ptr5.idx, %mul278  %add.ptr6 = getelementptr inbounds i8, ptr %p, i64 %add.ptr6.idx279  %1 = load i64, ptr %add.ptr6, align 8280  %add.ptr7.idx = add i64 %add.ptr5.idx, %mul1281  %add.ptr7 = getelementptr inbounds i8, ptr %p, i64 %add.ptr7.idx282  %2 = load i64, ptr %add.ptr7, align 8283  %mul8 = mul i64 %1, %0284  %mul9 = mul i64 %mul8, %2285  %add10 = add i64 %mul9, %sum.034286  %inc = add nuw nsw i64 %i.033, 1287  %exitcond.not = icmp eq i64 %inc, %n288  br i1 %exitcond.not, label %for.cond.cleanup, label %for.body289}290 291; addresses:292; 1: base1293; 2: + 2*offset294; 3: + 2*offset295; 4: + 3*offset296;297; The diff between address 2 and address 1 is 2*offset, and this offset is not reused among other chains,298; so we can not common any chains.299;300; long long no_reuseable_offset_fail(char *p, long long offset, long long base1, long long n) {301;   long long o1 = base1;302;   long long o2 = base1 + 2 * offset;303;   long long o3 = base1 + 4 * offset;304;   long long o4 = base1 + 7 * offset;305;   char *p1 = p + o1;306;   char *p2 = p + o2;307;   char *p3 = p + o3;308;   char *p4 = p + o4;309;   long long sum = 0;310;   for (long long i = 0; i < n; ++i) {311;     unsigned long x1 = *(unsigned long *)(p1 + i);312;     unsigned long x2 = *(unsigned long *)(p2 + i);313;     unsigned long x3 = *(unsigned long *)(p3 + i);314;     unsigned long x4 = *(unsigned long *)(p4 + i);315;     sum += x1 * x2 * x3 * x4;316;   }317;   return sum;318; }319;320define i64 @no_reuseable_offset_fail(ptr %p, i64 %offset, i64 %base1, i64 %n) {321; CHECK-LABEL: no_reuseable_offset_fail:322; CHECK:       # %bb.0: # %entry323; CHECK-NEXT:    cmpdi r6, 0324; CHECK-NEXT:    ble cr0, .LBB3_4325; CHECK-NEXT:  # %bb.1: # %for.body.preheader326; CHECK-NEXT:    sldi r9, r4, 3327; CHECK-NEXT:    mtctr r6328; CHECK-NEXT:    add r5, r3, r5329; CHECK-NEXT:    li r3, 0330; CHECK-NEXT:    sldi r7, r4, 1331; CHECK-NEXT:    sldi r8, r4, 2332; CHECK-NEXT:    sub r4, r9, r4333; CHECK-NEXT:    .p2align 4334; CHECK-NEXT:  .LBB3_2: # %for.body335; CHECK-NEXT:    #336; CHECK-NEXT:    ld r6, 0(r5)337; CHECK-NEXT:    ldx r9, r5, r7338; CHECK-NEXT:    ldx r10, r5, r8339; CHECK-NEXT:    ldx r11, r5, r4340; CHECK-NEXT:    addi r5, r5, 1341; CHECK-NEXT:    mulld r6, r9, r6342; CHECK-NEXT:    mulld r6, r6, r10343; CHECK-NEXT:    maddld r3, r6, r11, r3344; CHECK-NEXT:    bdnz .LBB3_2345; CHECK-NEXT:  # %bb.3: # %for.cond.cleanup346; CHECK-NEXT:    blr347; CHECK-NEXT:  .LBB3_4:348; CHECK-NEXT:    li r3, 0349; CHECK-NEXT:    blr350entry:351  %mul = shl nsw i64 %offset, 1352  %mul1 = shl nsw i64 %offset, 2353  %mul3 = mul nsw i64 %offset, 7354  %cmp44 = icmp sgt i64 %n, 0355  br i1 %cmp44, label %for.body, label %for.cond.cleanup356 357for.cond.cleanup:                                 ; preds = %for.body, %entry358  %sum.0.lcssa = phi i64 [ 0, %entry ], [ %add15, %for.body ]359  ret i64 %sum.0.lcssa360 361for.body:                                         ; preds = %entry, %for.body362  %sum.046 = phi i64 [ %add15, %for.body ], [ 0, %entry ]363  %i.045 = phi i64 [ %inc, %for.body ], [ 0, %entry ]364  %add.ptr8.idx = add i64 %i.045, %base1365  %add.ptr8 = getelementptr inbounds i8, ptr %p, i64 %add.ptr8.idx366  %0 = load i64, ptr %add.ptr8, align 8367  %add.ptr9.idx = add i64 %add.ptr8.idx, %mul368  %add.ptr9 = getelementptr inbounds i8, ptr %p, i64 %add.ptr9.idx369  %1 = load i64, ptr %add.ptr9, align 8370  %add.ptr10.idx = add i64 %add.ptr8.idx, %mul1371  %add.ptr10 = getelementptr inbounds i8, ptr %p, i64 %add.ptr10.idx372  %2 = load i64, ptr %add.ptr10, align 8373  %add.ptr11.idx = add i64 %add.ptr8.idx, %mul3374  %add.ptr11 = getelementptr inbounds i8, ptr %p, i64 %add.ptr11.idx375  %3 = load i64, ptr %add.ptr11, align 8376  %mul12 = mul i64 %1, %0377  %mul13 = mul i64 %mul12, %2378  %mul14 = mul i64 %mul13, %3379  %add15 = add i64 %mul14, %sum.046380  %inc = add nuw nsw i64 %i.045, 1381  %exitcond.not = icmp eq i64 %inc, %n382  br i1 %exitcond.not, label %for.cond.cleanup, label %for.body383}384 385; addresses:386; 1: base1 + offset387; 2: + offset388; 3: + 3*offset389; 4: + 2*offset390; 5: + 1*offset391; 6: + 2*offset392;393; The diff between address 2 and address 1 is 1*offset, and this offset is reused between address 4 and address 5.394; but the diff between address 3 and address 2 (3*offset) is not the same with the diff between address 6395; and address 5(2*offset), so we can not common chains for these addresses.396;397; long long not_same_offset_fail(char *p, long long offset, long long base1, long long n) {398;   long long o1 = base1 + offset;399;   long long o2 = base1 + 2 * offset;400;   long long o3 = base1 + 5 * offset;401;   long long o4 = base1 + 7 * offset;402;   long long o5 = base1 + 8 * offset;403;   long long o6 = base1 + 10 * offset;404;   char *p1 = p + o1;405;   char *p2 = p + o2;406;   char *p3 = p + o3;407;   char *p4 = p + o4;408;   char *p5 = p + o5;409;   char *p6 = p + o6;410;   long long sum = 0;411;   for (long long i = 0; i < n; ++i) {412;     unsigned long x1 = *(unsigned long *)(p1 + i);413;     unsigned long x2 = *(unsigned long *)(p2 + i);414;     unsigned long x3 = *(unsigned long *)(p3 + i);415;     unsigned long x4 = *(unsigned long *)(p4 + i);416;     unsigned long x5 = *(unsigned long *)(p5 + i);417;     unsigned long x6 = *(unsigned long *)(p6 + i);418;     sum += x1 * x2 * x3 * x4 * x5 * x6;419;   }420;   return sum;421; }422;423define i64 @not_same_offset_fail(ptr %p, i64 %offset, i64 %base1, i64 %n) {424; CHECK-LABEL: not_same_offset_fail:425; CHECK:       # %bb.0: # %entry426; CHECK-NEXT:    cmpdi r6, 0427; CHECK-NEXT:    ble cr0, .LBB4_4428; CHECK-NEXT:  # %bb.1: # %for.body.preheader429; CHECK-NEXT:    std r28, -32(r1) # 8-byte Folded Spill430; CHECK-NEXT:    std r29, -24(r1) # 8-byte Folded Spill431; CHECK-NEXT:    add r5, r3, r5432; CHECK-NEXT:    li r3, 0433; CHECK-NEXT:    std r30, -16(r1) # 8-byte Folded Spill434; CHECK-NEXT:    mtctr r6435; CHECK-NEXT:    mulli r11, r4, 10436; CHECK-NEXT:    sldi r8, r4, 2437; CHECK-NEXT:    add r8, r4, r8438; CHECK-NEXT:    sldi r9, r4, 3439; CHECK-NEXT:    sub r10, r9, r4440; CHECK-NEXT:    sldi r7, r4, 1441; CHECK-NEXT:    .p2align 4442; CHECK-NEXT:  .LBB4_2: # %for.body443; CHECK-NEXT:    #444; CHECK-NEXT:    ldx r6, r5, r4445; CHECK-NEXT:    ldx r12, r5, r7446; CHECK-NEXT:    ldx r0, r5, r8447; CHECK-NEXT:    ldx r30, r5, r10448; CHECK-NEXT:    mulld r6, r12, r6449; CHECK-NEXT:    ldx r29, r5, r9450; CHECK-NEXT:    ldx r28, r5, r11451; CHECK-NEXT:    addi r5, r5, 1452; CHECK-NEXT:    mulld r6, r6, r0453; CHECK-NEXT:    mulld r6, r6, r30454; CHECK-NEXT:    mulld r6, r6, r29455; CHECK-NEXT:    maddld r3, r6, r28, r3456; CHECK-NEXT:    bdnz .LBB4_2457; CHECK-NEXT:  # %bb.3:458; CHECK-NEXT:    ld r30, -16(r1) # 8-byte Folded Reload459; CHECK-NEXT:    ld r29, -24(r1) # 8-byte Folded Reload460; CHECK-NEXT:    ld r28, -32(r1) # 8-byte Folded Reload461; CHECK-NEXT:    blr462; CHECK-NEXT:  .LBB4_4:463; CHECK-NEXT:    li r3, 0464; CHECK-NEXT:    blr465entry:466  %mul = shl nsw i64 %offset, 1467  %mul2 = mul nsw i64 %offset, 5468  %mul4 = mul nsw i64 %offset, 7469  %mul6 = shl nsw i64 %offset, 3470  %mul8 = mul nsw i64 %offset, 10471  %cmp70 = icmp sgt i64 %n, 0472  br i1 %cmp70, label %for.body, label %for.cond.cleanup473 474for.cond.cleanup:                                 ; preds = %for.body, %entry475  %sum.0.lcssa = phi i64 [ 0, %entry ], [ %add26, %for.body ]476  ret i64 %sum.0.lcssa477 478for.body:                                         ; preds = %entry, %for.body479  %sum.072 = phi i64 [ %add26, %for.body ], [ 0, %entry ]480  %i.071 = phi i64 [ %inc, %for.body ], [ 0, %entry ]481  %add = add i64 %i.071, %base1482  %add.ptr15.idx = add i64 %add, %offset483  %add.ptr15 = getelementptr inbounds i8, ptr %p, i64 %add.ptr15.idx484  %0 = load i64, ptr %add.ptr15, align 8485  %add.ptr16.idx = add i64 %add, %mul486  %add.ptr16 = getelementptr inbounds i8, ptr %p, i64 %add.ptr16.idx487  %1 = load i64, ptr %add.ptr16, align 8488  %add.ptr17.idx = add i64 %add, %mul2489  %add.ptr17 = getelementptr inbounds i8, ptr %p, i64 %add.ptr17.idx490  %2 = load i64, ptr %add.ptr17, align 8491  %add.ptr18.idx = add i64 %add, %mul4492  %add.ptr18 = getelementptr inbounds i8, ptr %p, i64 %add.ptr18.idx493  %3 = load i64, ptr %add.ptr18, align 8494  %add.ptr19.idx = add i64 %add, %mul6495  %add.ptr19 = getelementptr inbounds i8, ptr %p, i64 %add.ptr19.idx496  %4 = load i64, ptr %add.ptr19, align 8497  %add.ptr20.idx = add i64 %add, %mul8498  %add.ptr20 = getelementptr inbounds i8, ptr %p, i64 %add.ptr20.idx499  %5 = load i64, ptr %add.ptr20, align 8500  %mul21 = mul i64 %1, %0501  %mul22 = mul i64 %mul21, %2502  %mul23 = mul i64 %mul22, %3503  %mul24 = mul i64 %mul23, %4504  %mul25 = mul i64 %mul24, %5505  %add26 = add i64 %mul25, %sum.072506  %inc = add nuw nsw i64 %i.071, 1507  %exitcond.not = icmp eq i64 %inc, %n508  br i1 %exitcond.not, label %for.cond.cleanup, label %for.body509}510 511; addresses:512; 1: base1 + offset513; 2: + offset514; 3: + 3*offset515; 4: + 2*offset516;517; chains:518; 1: base1 + offset, offsets: (0, 2*offset)519; 2: base1 + 4*offset, offsets: (0, 2*offset)520;521; long long two_chain_different_offsets_succ(char *p, long long offset, long long base1, long long n) {522;   long long o1 = base1 + offset;523;   long long o2 = base1 + 3 * offset;524;   long long o3 = base1 + 4 * offset;525;   long long o4 = base1 + 6 * offset;526;   char *p1 = p + o1;527;   char *p2 = p + o2;528;   char *p3 = p + o3;529;   char *p4 = p + o4;530;   long long sum = 0;531;   for (long long i = 0; i < n; ++i) {532;     unsigned long x1 = *(unsigned long *)(p1 + i);533;     unsigned long x2 = *(unsigned long *)(p2 + i);534;     unsigned long x3 = *(unsigned long *)(p3 + i);535;     unsigned long x4 = *(unsigned long *)(p4 + i);536;     sum += x1 * x2 * x3 * x4;537;   }538;   return sum;539; }540;541define i64 @two_chain_different_offsets_succ(ptr %p, i64 %offset, i64 %base1, i64 %n) {542; CHECK-LABEL: two_chain_different_offsets_succ:543; CHECK:       # %bb.0: # %entry544; CHECK-NEXT:    cmpdi r6, 0545; CHECK-NEXT:    ble cr0, .LBB5_4546; CHECK-NEXT:  # %bb.1: # %for.body.preheader547; CHECK-NEXT:    sldi r8, r4, 2548; CHECK-NEXT:    add r7, r5, r4549; CHECK-NEXT:    mtctr r6550; CHECK-NEXT:    add r5, r5, r8551; CHECK-NEXT:    add r7, r3, r7552; CHECK-NEXT:    sldi r4, r4, 1553; CHECK-NEXT:    add r5, r3, r5554; CHECK-NEXT:    li r3, 0555; CHECK-NEXT:    .p2align 4556; CHECK-NEXT:  .LBB5_2: # %for.body557; CHECK-NEXT:    #558; CHECK-NEXT:    ld r6, 0(r7)559; CHECK-NEXT:    ldx r8, r7, r4560; CHECK-NEXT:    ld r9, 0(r5)561; CHECK-NEXT:    ldx r10, r5, r4562; CHECK-NEXT:    addi r7, r7, 1563; CHECK-NEXT:    addi r5, r5, 1564; CHECK-NEXT:    mulld r6, r8, r6565; CHECK-NEXT:    mulld r6, r6, r9566; CHECK-NEXT:    maddld r3, r6, r10, r3567; CHECK-NEXT:    bdnz .LBB5_2568; CHECK-NEXT:  # %bb.3: # %for.cond.cleanup569; CHECK-NEXT:    blr570; CHECK-NEXT:  .LBB5_4:571; CHECK-NEXT:    li r3, 0572; CHECK-NEXT:    blr573entry:574  %mul = mul nsw i64 %offset, 3575  %mul2 = shl nsw i64 %offset, 2576  %mul4 = mul nsw i64 %offset, 6577  %cmp46 = icmp sgt i64 %n, 0578  br i1 %cmp46, label %for.body, label %for.cond.cleanup579 580for.cond.cleanup:                                 ; preds = %for.body, %entry581  %sum.0.lcssa = phi i64 [ 0, %entry ], [ %add16, %for.body ]582  ret i64 %sum.0.lcssa583 584for.body:                                         ; preds = %entry, %for.body585  %sum.048 = phi i64 [ %add16, %for.body ], [ 0, %entry ]586  %i.047 = phi i64 [ %inc, %for.body ], [ 0, %entry ]587  %add = add i64 %i.047, %base1588  %add.ptr9.idx = add i64 %add, %offset589  %add.ptr9 = getelementptr inbounds i8, ptr %p, i64 %add.ptr9.idx590  %0 = load i64, ptr %add.ptr9, align 8591  %add.ptr10.idx = add i64 %add, %mul592  %add.ptr10 = getelementptr inbounds i8, ptr %p, i64 %add.ptr10.idx593  %1 = load i64, ptr %add.ptr10, align 8594  %add.ptr11.idx = add i64 %add, %mul2595  %add.ptr11 = getelementptr inbounds i8, ptr %p, i64 %add.ptr11.idx596  %2 = load i64, ptr %add.ptr11, align 8597  %add.ptr12.idx = add i64 %add, %mul4598  %add.ptr12 = getelementptr inbounds i8, ptr %p, i64 %add.ptr12.idx599  %3 = load i64, ptr %add.ptr12, align 8600  %mul13 = mul i64 %1, %0601  %mul14 = mul i64 %mul13, %2602  %mul15 = mul i64 %mul14, %3603  %add16 = add i64 %mul15, %sum.048604  %inc = add nuw nsw i64 %i.047, 1605  %exitcond.not = icmp eq i64 %inc, %n606  br i1 %exitcond.not, label %for.cond.cleanup, label %for.body607}608 609; addresses:610; 1: base1 + offset611; 2: + 2*offset612; 3: + base2 - base1 - 2*offset613; 4: + 2*offset614;615; chains:616; 1: base1 + offset, offsets: (0, 2*offset)617; 2: base2 + offset, offsets: (0, 2*offset)618;619; long long two_chain_two_bases_succ(char *p, long long offset, long long base1, long long base2, long long n) {620;   long long o1 = base1 + offset;621;   long long o2 = base1 + 3 * offset;622;   long long o3 = base2 + offset;623;   long long o4 = base2 + 3 * offset;624;   char *p1 = p + o1;625;   char *p2 = p + o2;626;   char *p3 = p + o3;627;   char *p4 = p + o4;628;   long long sum = 0;629;   for (long long i = 0; i < n; ++i) {630;     unsigned long x1 = *(unsigned long *)(p1 + i);631;     unsigned long x2 = *(unsigned long *)(p2 + i);632;     unsigned long x3 = *(unsigned long *)(p3 + i);633;     unsigned long x4 = *(unsigned long *)(p4 + i);634;     sum += x1 * x2 * x3 * x4;635;   }636;   return sum;637; }638;639define i64 @two_chain_two_bases_succ(ptr %p, i64 %offset, i64 %base1, i64 %base2, i64 %n) {640; CHECK-LABEL: two_chain_two_bases_succ:641; CHECK:       # %bb.0: # %entry642; CHECK-NEXT:    cmpdi r7, 0643; CHECK-NEXT:    ble cr0, .LBB6_4644; CHECK-NEXT:  # %bb.1: # %for.body.preheader645; CHECK-NEXT:    add r5, r5, r4646; CHECK-NEXT:    add r6, r6, r4647; CHECK-NEXT:    mtctr r7648; CHECK-NEXT:    sldi r4, r4, 1649; CHECK-NEXT:    add r5, r3, r5650; CHECK-NEXT:    add r6, r3, r6651; CHECK-NEXT:    li r3, 0652; CHECK-NEXT:    .p2align 4653; CHECK-NEXT:  .LBB6_2: # %for.body654; CHECK-NEXT:    #655; CHECK-NEXT:    ld r7, 0(r5)656; CHECK-NEXT:    ldx r8, r5, r4657; CHECK-NEXT:    ld r9, 0(r6)658; CHECK-NEXT:    ldx r10, r6, r4659; CHECK-NEXT:    addi r5, r5, 1660; CHECK-NEXT:    addi r6, r6, 1661; CHECK-NEXT:    mulld r7, r8, r7662; CHECK-NEXT:    mulld r7, r7, r9663; CHECK-NEXT:    maddld r3, r7, r10, r3664; CHECK-NEXT:    bdnz .LBB6_2665; CHECK-NEXT:  # %bb.3: # %for.cond.cleanup666; CHECK-NEXT:    blr667; CHECK-NEXT:  .LBB6_4:668; CHECK-NEXT:    li r3, 0669; CHECK-NEXT:    blr670entry:671  %mul = mul nsw i64 %offset, 3672  %cmp44 = icmp sgt i64 %n, 0673  br i1 %cmp44, label %for.body, label %for.cond.cleanup674 675for.cond.cleanup:                                 ; preds = %for.body, %entry676  %sum.0.lcssa = phi i64 [ 0, %entry ], [ %add15, %for.body ]677  ret i64 %sum.0.lcssa678 679for.body:                                         ; preds = %entry, %for.body680  %sum.046 = phi i64 [ %add15, %for.body ], [ 0, %entry ]681  %i.045 = phi i64 [ %inc, %for.body ], [ 0, %entry ]682  %add = add i64 %i.045, %base1683  %add.ptr8.idx = add i64 %add, %offset684  %add.ptr8 = getelementptr inbounds i8, ptr %p, i64 %add.ptr8.idx685  %0 = load i64, ptr %add.ptr8, align 8686  %add1 = add i64 %i.045, %mul687  %add.ptr9.idx = add i64 %add1, %base1688  %add.ptr9 = getelementptr inbounds i8, ptr %p, i64 %add.ptr9.idx689  %1 = load i64, ptr %add.ptr9, align 8690  %add2 = add i64 %i.045, %base2691  %add.ptr10.idx = add i64 %add2, %offset692  %add.ptr10 = getelementptr inbounds i8, ptr %p, i64 %add.ptr10.idx693  %2 = load i64, ptr %add.ptr10, align 8694  %add.ptr11.idx = add i64 %add2, %mul695  %add.ptr11 = getelementptr inbounds i8, ptr %p, i64 %add.ptr11.idx696  %3 = load i64, ptr %add.ptr11, align 8697  %mul12 = mul i64 %1, %0698  %mul13 = mul i64 %mul12, %2699  %mul14 = mul i64 %mul13, %3700  %add15 = add i64 %mul14, %sum.046701  %inc = add nuw nsw i64 %i.045, 1702  %exitcond.not = icmp eq i64 %inc, %n703  br i1 %exitcond.not, label %for.cond.cleanup, label %for.body704}705;706; Check chain commoning can reduce register pressure to save register spill/reload.707;708; int spill_reduce_succ(double *input1, double *input2, double *output, long long m, long long inc1, long long inc2, long long inc3, long long inc4, long long inc) {709;   inc = inc4;710; #pragma unroll 4711;   for (long long i = 0; i < 4 * m; i++) {712;     output[inc + inc1] += input1[inc + inc1] * input2[inc + inc1];713;     output[inc + inc2] += input1[inc + inc2] * input2[inc + inc2];714;     output[inc + inc3] += input1[inc + inc3] * input2[inc + inc3];715;     inc =  inc + inc4;716;   }717;   return 0;718; }719;720define signext i32 @spill_reduce_succ(ptr %input1, ptr %input2, ptr %output, i64 %m, i64 %inc1, i64 %inc2, i64 %inc3, i64 %inc4, i64 %inc) {721; CHECK-LABEL: spill_reduce_succ:722; CHECK:       # %bb.0: # %entry723; CHECK-NEXT:    cmpdi r6, 0724; CHECK-NEXT:    ble cr0, .LBB7_9725; CHECK-NEXT:  # %bb.1: # %for.body.preheader726; CHECK-NEXT:    sldi r6, r6, 2727; CHECK-NEXT:    li r11, 1728; CHECK-NEXT:    std r26, -48(r1) # 8-byte Folded Spill729; CHECK-NEXT:    mr r26, r10730; CHECK-NEXT:    cmpdi r6, 1731; CHECK-NEXT:    std r14, -144(r1) # 8-byte Folded Spill732; CHECK-NEXT:    std r15, -136(r1) # 8-byte Folded Spill733; CHECK-NEXT:    std r16, -128(r1) # 8-byte Folded Spill734; CHECK-NEXT:    std r17, -120(r1) # 8-byte Folded Spill735; CHECK-NEXT:    std r18, -112(r1) # 8-byte Folded Spill736; CHECK-NEXT:    std r19, -104(r1) # 8-byte Folded Spill737; CHECK-NEXT:    std r20, -96(r1) # 8-byte Folded Spill738; CHECK-NEXT:    std r21, -88(r1) # 8-byte Folded Spill739; CHECK-NEXT:    std r22, -80(r1) # 8-byte Folded Spill740; CHECK-NEXT:    std r23, -72(r1) # 8-byte Folded Spill741; CHECK-NEXT:    std r24, -64(r1) # 8-byte Folded Spill742; CHECK-NEXT:    std r25, -56(r1) # 8-byte Folded Spill743; CHECK-NEXT:    std r27, -40(r1) # 8-byte Folded Spill744; CHECK-NEXT:    std r28, -32(r1) # 8-byte Folded Spill745; CHECK-NEXT:    std r29, -24(r1) # 8-byte Folded Spill746; CHECK-NEXT:    std r30, -16(r1) # 8-byte Folded Spill747; CHECK-NEXT:    std r31, -8(r1) # 8-byte Folded Spill748; CHECK-NEXT:    std r2, -152(r1) # 8-byte Folded Spill749; CHECK-NEXT:    iselgt r11, r6, r11750; CHECK-NEXT:    addi r12, r11, -1751; CHECK-NEXT:    cmpldi r12, 3752; CHECK-NEXT:    clrldi r6, r11, 63753; CHECK-NEXT:    blt cr0, .LBB7_5754; CHECK-NEXT:  # %bb.2: # %for.body.preheader.new755; CHECK-NEXT:    rldicl r11, r11, 62, 2756; CHECK-NEXT:    sldi r20, r8, 3757; CHECK-NEXT:    mr r14, r7758; CHECK-NEXT:    sldi r7, r7, 3759; CHECK-NEXT:    sldi r21, r9, 3760; CHECK-NEXT:    std r3, -160(r1) # 8-byte Folded Spill761; CHECK-NEXT:    std r9, -208(r1) # 8-byte Folded Spill762; CHECK-NEXT:    std r8, -184(r1) # 8-byte Folded Spill763; CHECK-NEXT:    std r5, -200(r1) # 8-byte Folded Spill764; CHECK-NEXT:    std r4, -168(r1) # 8-byte Folded Spill765; CHECK-NEXT:    std r11, -192(r1) # 8-byte Folded Spill766; CHECK-NEXT:    sldi r11, r10, 5767; CHECK-NEXT:    add r0, r11, r20768; CHECK-NEXT:    add r12, r11, r21769; CHECK-NEXT:    add r30, r5, r0770; CHECK-NEXT:    add r0, r11, r7771; CHECK-NEXT:    std r21, -216(r1) # 8-byte Folded Spill772; CHECK-NEXT:    std r20, -224(r1) # 8-byte Folded Spill773; CHECK-NEXT:    add r12, r5, r12774; CHECK-NEXT:    add r29, r5, r0775; CHECK-NEXT:    add r28, r4, r0776; CHECK-NEXT:    add r27, r3, r0777; CHECK-NEXT:    mulli r0, r10, 24778; CHECK-NEXT:    std r14, -176(r1) # 8-byte Folded Spill779; CHECK-NEXT:    add r26, r0, r21780; CHECK-NEXT:    add r25, r0, r20781; CHECK-NEXT:    add r0, r0, r7782; CHECK-NEXT:    add r24, r5, r0783; CHECK-NEXT:    add r23, r4, r0784; CHECK-NEXT:    add r22, r3, r0785; CHECK-NEXT:    sldi r0, r10, 4786; CHECK-NEXT:    add r26, r5, r26787; CHECK-NEXT:    add r25, r5, r25788; CHECK-NEXT:    add r21, r0, r21789; CHECK-NEXT:    add r20, r0, r20790; CHECK-NEXT:    add r0, r0, r7791; CHECK-NEXT:    add r19, r5, r0792; CHECK-NEXT:    add r18, r4, r0793; CHECK-NEXT:    add r17, r3, r0794; CHECK-NEXT:    add r0, r10, r9795; CHECK-NEXT:    add r21, r5, r21796; CHECK-NEXT:    add r20, r5, r20797; CHECK-NEXT:    sldi r0, r0, 3798; CHECK-NEXT:    add r16, r5, r0799; CHECK-NEXT:    add r0, r10, r8800; CHECK-NEXT:    sldi r0, r0, 3801; CHECK-NEXT:    add r15, r5, r0802; CHECK-NEXT:    add r0, r10, r14803; CHECK-NEXT:    sldi r0, r0, 3804; CHECK-NEXT:    add r2, r3, r0805; CHECK-NEXT:    ld r3, -224(r1) # 8-byte Folded Reload806; CHECK-NEXT:    add r14, r5, r0807; CHECK-NEXT:    add r31, r4, r0808; CHECK-NEXT:    sub r0, r3, r7809; CHECK-NEXT:    ld r3, -192(r1) # 8-byte Folded Reload810; CHECK-NEXT:    rldicl r9, r3, 2, 1811; CHECK-NEXT:    ld r3, -216(r1) # 8-byte Folded Reload812; CHECK-NEXT:    addi r8, r9, -4813; CHECK-NEXT:    rldicl r8, r8, 62, 2814; CHECK-NEXT:    sub r7, r3, r7815; CHECK-NEXT:    ori r3, r9, 1816; CHECK-NEXT:    addi r8, r8, 1817; CHECK-NEXT:    mulld r3, r10, r3818; CHECK-NEXT:    mtctr r8819; CHECK-NEXT:    li r8, 0820; CHECK-NEXT:    std r10, -192(r1) # 8-byte Folded Spill821; CHECK-NEXT:    std r3, -216(r1) # 8-byte Folded Spill822; CHECK-NEXT:    .p2align 4823; CHECK-NEXT:  .LBB7_3: # %for.body824; CHECK-NEXT:    #825; CHECK-NEXT:    lfd f0, 0(r2)826; CHECK-NEXT:    lfd f1, 0(r31)827; CHECK-NEXT:    xsmuldp f0, f0, f1828; CHECK-NEXT:    lfd f1, 0(r14)829; CHECK-NEXT:    xsadddp f0, f1, f0830; CHECK-NEXT:    stfd f0, 0(r14)831; CHECK-NEXT:    add r14, r14, r11832; CHECK-NEXT:    lfdx f0, r2, r0833; CHECK-NEXT:    lfdx f1, r31, r0834; CHECK-NEXT:    xsmuldp f0, f0, f1835; CHECK-NEXT:    lfdx f1, r15, r8836; CHECK-NEXT:    xsadddp f0, f1, f0837; CHECK-NEXT:    stfdx f0, r15, r8838; CHECK-NEXT:    lfdx f0, r2, r7839; CHECK-NEXT:    lfdx f1, r31, r7840; CHECK-NEXT:    add r2, r2, r11841; CHECK-NEXT:    add r31, r31, r11842; CHECK-NEXT:    xsmuldp f0, f0, f1843; CHECK-NEXT:    lfdx f1, r16, r8844; CHECK-NEXT:    xsadddp f0, f1, f0845; CHECK-NEXT:    stfdx f0, r16, r8846; CHECK-NEXT:    lfd f0, 0(r17)847; CHECK-NEXT:    lfd f1, 0(r18)848; CHECK-NEXT:    xsmuldp f0, f0, f1849; CHECK-NEXT:    lfdx f1, r19, r8850; CHECK-NEXT:    xsadddp f0, f1, f0851; CHECK-NEXT:    stfdx f0, r19, r8852; CHECK-NEXT:    lfdx f0, r17, r0853; CHECK-NEXT:    lfdx f1, r18, r0854; CHECK-NEXT:    xsmuldp f0, f0, f1855; CHECK-NEXT:    lfdx f1, r20, r8856; CHECK-NEXT:    xsadddp f0, f1, f0857; CHECK-NEXT:    stfdx f0, r20, r8858; CHECK-NEXT:    lfdx f0, r17, r7859; CHECK-NEXT:    lfdx f1, r18, r7860; CHECK-NEXT:    add r17, r17, r11861; CHECK-NEXT:    add r18, r18, r11862; CHECK-NEXT:    xsmuldp f0, f0, f1863; CHECK-NEXT:    lfdx f1, r21, r8864; CHECK-NEXT:    xsadddp f0, f1, f0865; CHECK-NEXT:    stfdx f0, r21, r8866; CHECK-NEXT:    lfd f0, 0(r22)867; CHECK-NEXT:    lfd f1, 0(r23)868; CHECK-NEXT:    xsmuldp f0, f0, f1869; CHECK-NEXT:    lfdx f1, r24, r8870; CHECK-NEXT:    xsadddp f0, f1, f0871; CHECK-NEXT:    stfdx f0, r24, r8872; CHECK-NEXT:    lfdx f0, r22, r0873; CHECK-NEXT:    lfdx f1, r23, r0874; CHECK-NEXT:    xsmuldp f0, f0, f1875; CHECK-NEXT:    lfdx f1, r25, r8876; CHECK-NEXT:    xsadddp f0, f1, f0877; CHECK-NEXT:    stfdx f0, r25, r8878; CHECK-NEXT:    lfdx f0, r22, r7879; CHECK-NEXT:    lfdx f1, r23, r7880; CHECK-NEXT:    add r22, r22, r11881; CHECK-NEXT:    add r23, r23, r11882; CHECK-NEXT:    xsmuldp f0, f0, f1883; CHECK-NEXT:    lfdx f1, r26, r8884; CHECK-NEXT:    xsadddp f0, f1, f0885; CHECK-NEXT:    stfdx f0, r26, r8886; CHECK-NEXT:    lfd f0, 0(r27)887; CHECK-NEXT:    lfd f1, 0(r28)888; CHECK-NEXT:    xsmuldp f0, f0, f1889; CHECK-NEXT:    lfdx f1, r29, r8890; CHECK-NEXT:    xsadddp f0, f1, f0891; CHECK-NEXT:    stfdx f0, r29, r8892; CHECK-NEXT:    lfdx f0, r27, r0893; CHECK-NEXT:    lfdx f1, r28, r0894; CHECK-NEXT:    xsmuldp f0, f0, f1895; CHECK-NEXT:    lfdx f1, r30, r8896; CHECK-NEXT:    xsadddp f0, f1, f0897; CHECK-NEXT:    stfdx f0, r30, r8898; CHECK-NEXT:    lfdx f0, r27, r7899; CHECK-NEXT:    lfdx f1, r28, r7900; CHECK-NEXT:    add r27, r27, r11901; CHECK-NEXT:    add r28, r28, r11902; CHECK-NEXT:    xsmuldp f0, f0, f1903; CHECK-NEXT:    lfdx f1, r12, r8904; CHECK-NEXT:    xsadddp f0, f1, f0905; CHECK-NEXT:    stfdx f0, r12, r8906; CHECK-NEXT:    add r8, r8, r11907; CHECK-NEXT:    bdnz .LBB7_3908; CHECK-NEXT:  # %bb.4:909; CHECK-NEXT:    ld r3, -160(r1) # 8-byte Folded Reload910; CHECK-NEXT:    ld r4, -168(r1) # 8-byte Folded Reload911; CHECK-NEXT:    ld r7, -176(r1) # 8-byte Folded Reload912; CHECK-NEXT:    ld r8, -184(r1) # 8-byte Folded Reload913; CHECK-NEXT:    ld r10, -192(r1) # 8-byte Folded Reload914; CHECK-NEXT:    ld r5, -200(r1) # 8-byte Folded Reload915; CHECK-NEXT:    ld r9, -208(r1) # 8-byte Folded Reload916; CHECK-NEXT:    ld r26, -216(r1) # 8-byte Folded Reload917; CHECK-NEXT:  .LBB7_5: # %for.cond.cleanup.loopexit.unr-lcssa918; CHECK-NEXT:    cmpldi r6, 0919; CHECK-NEXT:    beq cr0, .LBB7_8920; CHECK-NEXT:  # %bb.6: # %for.body.epil.preheader921; CHECK-NEXT:    add r11, r26, r9922; CHECK-NEXT:    add r12, r26, r8923; CHECK-NEXT:    add r9, r26, r7924; CHECK-NEXT:    sldi r27, r10, 3925; CHECK-NEXT:    sldi r11, r11, 3926; CHECK-NEXT:    sldi r0, r12, 3927; CHECK-NEXT:    sldi r9, r9, 3928; CHECK-NEXT:    add r28, r5, r11929; CHECK-NEXT:    add r10, r4, r11930; CHECK-NEXT:    add r11, r3, r11931; CHECK-NEXT:    add r12, r5, r0932; CHECK-NEXT:    add r30, r4, r0933; CHECK-NEXT:    add r29, r3, r0934; CHECK-NEXT:    add r5, r5, r9935; CHECK-NEXT:    add r4, r4, r9936; CHECK-NEXT:    add r3, r3, r9937; CHECK-NEXT:    li r9, 0938; CHECK-NEXT:    .p2align 4939; CHECK-NEXT:  .LBB7_7: # %for.body.epil940; CHECK-NEXT:    #941; CHECK-NEXT:    lfdx f0, r3, r9942; CHECK-NEXT:    lfdx f1, r4, r9943; CHECK-NEXT:    addi r6, r6, -1944; CHECK-NEXT:    cmpldi r6, 0945; CHECK-NEXT:    xsmuldp f0, f0, f1946; CHECK-NEXT:    lfd f1, 0(r5)947; CHECK-NEXT:    xsadddp f0, f1, f0948; CHECK-NEXT:    stfd f0, 0(r5)949; CHECK-NEXT:    add r5, r5, r27950; CHECK-NEXT:    lfdx f0, r29, r9951; CHECK-NEXT:    lfdx f1, r30, r9952; CHECK-NEXT:    xsmuldp f0, f0, f1953; CHECK-NEXT:    lfdx f1, r12, r9954; CHECK-NEXT:    xsadddp f0, f1, f0955; CHECK-NEXT:    stfdx f0, r12, r9956; CHECK-NEXT:    lfdx f0, r11, r9957; CHECK-NEXT:    lfdx f1, r10, r9958; CHECK-NEXT:    xsmuldp f0, f0, f1959; CHECK-NEXT:    lfdx f1, r28, r9960; CHECK-NEXT:    xsadddp f0, f1, f0961; CHECK-NEXT:    stfdx f0, r28, r9962; CHECK-NEXT:    add r9, r9, r27963; CHECK-NEXT:    bne cr0, .LBB7_7964; CHECK-NEXT:  .LBB7_8:965; CHECK-NEXT:    ld r2, -152(r1) # 8-byte Folded Reload966; CHECK-NEXT:    ld r31, -8(r1) # 8-byte Folded Reload967; CHECK-NEXT:    ld r30, -16(r1) # 8-byte Folded Reload968; CHECK-NEXT:    ld r29, -24(r1) # 8-byte Folded Reload969; CHECK-NEXT:    ld r28, -32(r1) # 8-byte Folded Reload970; CHECK-NEXT:    ld r27, -40(r1) # 8-byte Folded Reload971; CHECK-NEXT:    ld r26, -48(r1) # 8-byte Folded Reload972; CHECK-NEXT:    ld r25, -56(r1) # 8-byte Folded Reload973; CHECK-NEXT:    ld r24, -64(r1) # 8-byte Folded Reload974; CHECK-NEXT:    ld r23, -72(r1) # 8-byte Folded Reload975; CHECK-NEXT:    ld r22, -80(r1) # 8-byte Folded Reload976; CHECK-NEXT:    ld r21, -88(r1) # 8-byte Folded Reload977; CHECK-NEXT:    ld r20, -96(r1) # 8-byte Folded Reload978; CHECK-NEXT:    ld r19, -104(r1) # 8-byte Folded Reload979; CHECK-NEXT:    ld r18, -112(r1) # 8-byte Folded Reload980; CHECK-NEXT:    ld r17, -120(r1) # 8-byte Folded Reload981; CHECK-NEXT:    ld r16, -128(r1) # 8-byte Folded Reload982; CHECK-NEXT:    ld r15, -136(r1) # 8-byte Folded Reload983; CHECK-NEXT:    ld r14, -144(r1) # 8-byte Folded Reload984; CHECK-NEXT:  .LBB7_9: # %for.cond.cleanup985; CHECK-NEXT:    li r3, 0986; CHECK-NEXT:    blr987entry:988  %cmp49 = icmp sgt i64 %m, 0989  br i1 %cmp49, label %for.body.preheader, label %for.cond.cleanup990 991for.body.preheader:                               ; preds = %entry992  %0 = shl i64 %m, 2993  %smax52 = call i64 @llvm.smax.i64(i64 %0, i64 1)994  %1 = add nsw i64 %smax52, -1995  %xtraiter = and i64 %smax52, 1996  %2 = icmp ult i64 %1, 3997  br i1 %2, label %for.cond.cleanup.loopexit.unr-lcssa, label %for.body.preheader.new998 999for.body.preheader.new:                           ; preds = %for.body.preheader1000  %unroll_iter = and i64 %smax52, 92233720368547758041001  br label %for.body1002 1003for.cond.cleanup.loopexit.unr-lcssa:              ; preds = %for.body, %for.body.preheader1004  %inc.addr.050.unr = phi i64 [ %inc4, %for.body.preheader ], [ %add23.3, %for.body ]1005  %lcmp.mod.not = icmp eq i64 %xtraiter, 01006  br i1 %lcmp.mod.not, label %for.cond.cleanup, label %for.body.epil1007 1008for.body.epil:                                    ; preds = %for.cond.cleanup.loopexit.unr-lcssa, %for.body.epil1009  %inc.addr.050.epil = phi i64 [ %add23.epil, %for.body.epil ], [ %inc.addr.050.unr, %for.cond.cleanup.loopexit.unr-lcssa ]1010  %epil.iter = phi i64 [ %epil.iter.sub, %for.body.epil ], [ %xtraiter, %for.cond.cleanup.loopexit.unr-lcssa ]1011  %add.epil = add nsw i64 %inc.addr.050.epil, %inc11012  %arrayidx.epil = getelementptr inbounds double, ptr %input1, i64 %add.epil1013  %3 = load double, ptr %arrayidx.epil, align 81014  %arrayidx2.epil = getelementptr inbounds double, ptr %input2, i64 %add.epil1015  %4 = load double, ptr %arrayidx2.epil, align 81016  %mul3.epil = fmul double %3, %41017  %arrayidx5.epil = getelementptr inbounds double, ptr %output, i64 %add.epil1018  %5 = load double, ptr %arrayidx5.epil, align 81019  %add6.epil = fadd double %5, %mul3.epil1020  store double %add6.epil, ptr %arrayidx5.epil, align 81021  %add7.epil = add nsw i64 %inc.addr.050.epil, %inc21022  %arrayidx8.epil = getelementptr inbounds double, ptr %input1, i64 %add7.epil1023  %6 = load double, ptr %arrayidx8.epil, align 81024  %arrayidx10.epil = getelementptr inbounds double, ptr %input2, i64 %add7.epil1025  %7 = load double, ptr %arrayidx10.epil, align 81026  %mul11.epil = fmul double %6, %71027  %arrayidx13.epil = getelementptr inbounds double, ptr %output, i64 %add7.epil1028  %8 = load double, ptr %arrayidx13.epil, align 81029  %add14.epil = fadd double %8, %mul11.epil1030  store double %add14.epil, ptr %arrayidx13.epil, align 81031  %add15.epil = add nsw i64 %inc.addr.050.epil, %inc31032  %arrayidx16.epil = getelementptr inbounds double, ptr %input1, i64 %add15.epil1033  %9 = load double, ptr %arrayidx16.epil, align 81034  %arrayidx18.epil = getelementptr inbounds double, ptr %input2, i64 %add15.epil1035  %10 = load double, ptr %arrayidx18.epil, align 81036  %mul19.epil = fmul double %9, %101037  %arrayidx21.epil = getelementptr inbounds double, ptr %output, i64 %add15.epil1038  %11 = load double, ptr %arrayidx21.epil, align 81039  %add22.epil = fadd double %11, %mul19.epil1040  store double %add22.epil, ptr %arrayidx21.epil, align 81041  %add23.epil = add nsw i64 %inc.addr.050.epil, %inc41042  %epil.iter.sub = add nsw i64 %epil.iter, -11043  %epil.iter.cmp.not = icmp eq i64 %epil.iter.sub, 01044  br i1 %epil.iter.cmp.not, label %for.cond.cleanup, label %for.body.epil1045 1046for.cond.cleanup:                                 ; preds = %for.body.epil, %for.cond.cleanup.loopexit.unr-lcssa, %entry1047  ret i32 01048 1049for.body:                                         ; preds = %for.body, %for.body.preheader.new1050  %inc.addr.050 = phi i64 [ %inc4, %for.body.preheader.new ], [ %add23.3, %for.body ]1051  %niter = phi i64 [ %unroll_iter, %for.body.preheader.new ], [ %niter.nsub.3, %for.body ]1052  %add = add nsw i64 %inc.addr.050, %inc11053  %arrayidx = getelementptr inbounds double, ptr %input1, i64 %add1054  %12 = load double, ptr %arrayidx, align 81055  %arrayidx2 = getelementptr inbounds double, ptr %input2, i64 %add1056  %13 = load double, ptr %arrayidx2, align 81057  %mul3 = fmul double %12, %131058  %arrayidx5 = getelementptr inbounds double, ptr %output, i64 %add1059  %14 = load double, ptr %arrayidx5, align 81060  %add6 = fadd double %14, %mul31061  store double %add6, ptr %arrayidx5, align 81062  %add7 = add nsw i64 %inc.addr.050, %inc21063  %arrayidx8 = getelementptr inbounds double, ptr %input1, i64 %add71064  %15 = load double, ptr %arrayidx8, align 81065  %arrayidx10 = getelementptr inbounds double, ptr %input2, i64 %add71066  %16 = load double, ptr %arrayidx10, align 81067  %mul11 = fmul double %15, %161068  %arrayidx13 = getelementptr inbounds double, ptr %output, i64 %add71069  %17 = load double, ptr %arrayidx13, align 81070  %add14 = fadd double %17, %mul111071  store double %add14, ptr %arrayidx13, align 81072  %add15 = add nsw i64 %inc.addr.050, %inc31073  %arrayidx16 = getelementptr inbounds double, ptr %input1, i64 %add151074  %18 = load double, ptr %arrayidx16, align 81075  %arrayidx18 = getelementptr inbounds double, ptr %input2, i64 %add151076  %19 = load double, ptr %arrayidx18, align 81077  %mul19 = fmul double %18, %191078  %arrayidx21 = getelementptr inbounds double, ptr %output, i64 %add151079  %20 = load double, ptr %arrayidx21, align 81080  %add22 = fadd double %20, %mul191081  store double %add22, ptr %arrayidx21, align 81082  %add23 = add nsw i64 %inc.addr.050, %inc41083  %add.1 = add nsw i64 %add23, %inc11084  %arrayidx.1 = getelementptr inbounds double, ptr %input1, i64 %add.11085  %21 = load double, ptr %arrayidx.1, align 81086  %arrayidx2.1 = getelementptr inbounds double, ptr %input2, i64 %add.11087  %22 = load double, ptr %arrayidx2.1, align 81088  %mul3.1 = fmul double %21, %221089  %arrayidx5.1 = getelementptr inbounds double, ptr %output, i64 %add.11090  %23 = load double, ptr %arrayidx5.1, align 81091  %add6.1 = fadd double %23, %mul3.11092  store double %add6.1, ptr %arrayidx5.1, align 81093  %add7.1 = add nsw i64 %add23, %inc21094  %arrayidx8.1 = getelementptr inbounds double, ptr %input1, i64 %add7.11095  %24 = load double, ptr %arrayidx8.1, align 81096  %arrayidx10.1 = getelementptr inbounds double, ptr %input2, i64 %add7.11097  %25 = load double, ptr %arrayidx10.1, align 81098  %mul11.1 = fmul double %24, %251099  %arrayidx13.1 = getelementptr inbounds double, ptr %output, i64 %add7.11100  %26 = load double, ptr %arrayidx13.1, align 81101  %add14.1 = fadd double %26, %mul11.11102  store double %add14.1, ptr %arrayidx13.1, align 81103  %add15.1 = add nsw i64 %add23, %inc31104  %arrayidx16.1 = getelementptr inbounds double, ptr %input1, i64 %add15.11105  %27 = load double, ptr %arrayidx16.1, align 81106  %arrayidx18.1 = getelementptr inbounds double, ptr %input2, i64 %add15.11107  %28 = load double, ptr %arrayidx18.1, align 81108  %mul19.1 = fmul double %27, %281109  %arrayidx21.1 = getelementptr inbounds double, ptr %output, i64 %add15.11110  %29 = load double, ptr %arrayidx21.1, align 81111  %add22.1 = fadd double %29, %mul19.11112  store double %add22.1, ptr %arrayidx21.1, align 81113  %add23.1 = add nsw i64 %add23, %inc41114  %add.2 = add nsw i64 %add23.1, %inc11115  %arrayidx.2 = getelementptr inbounds double, ptr %input1, i64 %add.21116  %30 = load double, ptr %arrayidx.2, align 81117  %arrayidx2.2 = getelementptr inbounds double, ptr %input2, i64 %add.21118  %31 = load double, ptr %arrayidx2.2, align 81119  %mul3.2 = fmul double %30, %311120  %arrayidx5.2 = getelementptr inbounds double, ptr %output, i64 %add.21121  %32 = load double, ptr %arrayidx5.2, align 81122  %add6.2 = fadd double %32, %mul3.21123  store double %add6.2, ptr %arrayidx5.2, align 81124  %add7.2 = add nsw i64 %add23.1, %inc21125  %arrayidx8.2 = getelementptr inbounds double, ptr %input1, i64 %add7.21126  %33 = load double, ptr %arrayidx8.2, align 81127  %arrayidx10.2 = getelementptr inbounds double, ptr %input2, i64 %add7.21128  %34 = load double, ptr %arrayidx10.2, align 81129  %mul11.2 = fmul double %33, %341130  %arrayidx13.2 = getelementptr inbounds double, ptr %output, i64 %add7.21131  %35 = load double, ptr %arrayidx13.2, align 81132  %add14.2 = fadd double %35, %mul11.21133  store double %add14.2, ptr %arrayidx13.2, align 81134  %add15.2 = add nsw i64 %add23.1, %inc31135  %arrayidx16.2 = getelementptr inbounds double, ptr %input1, i64 %add15.21136  %36 = load double, ptr %arrayidx16.2, align 81137  %arrayidx18.2 = getelementptr inbounds double, ptr %input2, i64 %add15.21138  %37 = load double, ptr %arrayidx18.2, align 81139  %mul19.2 = fmul double %36, %371140  %arrayidx21.2 = getelementptr inbounds double, ptr %output, i64 %add15.21141  %38 = load double, ptr %arrayidx21.2, align 81142  %add22.2 = fadd double %38, %mul19.21143  store double %add22.2, ptr %arrayidx21.2, align 81144  %add23.2 = add nsw i64 %add23.1, %inc41145  %add.3 = add nsw i64 %add23.2, %inc11146  %arrayidx.3 = getelementptr inbounds double, ptr %input1, i64 %add.31147  %39 = load double, ptr %arrayidx.3, align 81148  %arrayidx2.3 = getelementptr inbounds double, ptr %input2, i64 %add.31149  %40 = load double, ptr %arrayidx2.3, align 81150  %mul3.3 = fmul double %39, %401151  %arrayidx5.3 = getelementptr inbounds double, ptr %output, i64 %add.31152  %41 = load double, ptr %arrayidx5.3, align 81153  %add6.3 = fadd double %41, %mul3.31154  store double %add6.3, ptr %arrayidx5.3, align 81155  %add7.3 = add nsw i64 %add23.2, %inc21156  %arrayidx8.3 = getelementptr inbounds double, ptr %input1, i64 %add7.31157  %42 = load double, ptr %arrayidx8.3, align 81158  %arrayidx10.3 = getelementptr inbounds double, ptr %input2, i64 %add7.31159  %43 = load double, ptr %arrayidx10.3, align 81160  %mul11.3 = fmul double %42, %431161  %arrayidx13.3 = getelementptr inbounds double, ptr %output, i64 %add7.31162  %44 = load double, ptr %arrayidx13.3, align 81163  %add14.3 = fadd double %44, %mul11.31164  store double %add14.3, ptr %arrayidx13.3, align 81165  %add15.3 = add nsw i64 %add23.2, %inc31166  %arrayidx16.3 = getelementptr inbounds double, ptr %input1, i64 %add15.31167  %45 = load double, ptr %arrayidx16.3, align 81168  %arrayidx18.3 = getelementptr inbounds double, ptr %input2, i64 %add15.31169  %46 = load double, ptr %arrayidx18.3, align 81170  %mul19.3 = fmul double %45, %461171  %arrayidx21.3 = getelementptr inbounds double, ptr %output, i64 %add15.31172  %47 = load double, ptr %arrayidx21.3, align 81173  %add22.3 = fadd double %47, %mul19.31174  store double %add22.3, ptr %arrayidx21.3, align 81175  %add23.3 = add nsw i64 %add23.2, %inc41176  %niter.nsub.3 = add i64 %niter, -41177  %niter.ncmp.3.not = icmp eq i64 %niter.nsub.3, 01178  br i1 %niter.ncmp.3.not, label %for.cond.cleanup.loopexit.unr-lcssa, label %for.body1179}1180 1181declare i64 @llvm.smax.i64(i64, i64)1182 1183