1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc -verify-machineinstrs -mtriple=powerpc64le-unknown-linux-gnu \ 3; RUN: -mcpu=pwr9 < %s | FileCheck %s 4 5define void @foo(double* readonly %0, double* %1, i64 %2, i64 %3, i64 %4, i64 %5, i64 %6, i64 %7) { 6; CHECK-LABEL: foo: 7; CHECK: # %bb.0: 8; CHECK-NEXT: cmpd 5, 7 9; CHECK-NEXT: std 19, -104(1) # 8-byte Folded Spill 10; CHECK-NEXT: std 20, -96(1) # 8-byte Folded Spill 11; CHECK-NEXT: std 21, -88(1) # 8-byte Folded Spill 12; CHECK-NEXT: std 22, -80(1) # 8-byte Folded Spill 13; CHECK-NEXT: std 23, -72(1) # 8-byte Folded Spill 14; CHECK-NEXT: std 24, -64(1) # 8-byte Folded Spill 15; CHECK-NEXT: std 25, -56(1) # 8-byte Folded Spill 16; CHECK-NEXT: std 26, -48(1) # 8-byte Folded Spill 17; CHECK-NEXT: std 27, -40(1) # 8-byte Folded Spill 18; CHECK-NEXT: std 28, -32(1) # 8-byte Folded Spill 19; CHECK-NEXT: std 29, -24(1) # 8-byte Folded Spill 20; CHECK-NEXT: std 30, -16(1) # 8-byte Folded Spill 21; CHECK-NEXT: bge 0, .LBB0_6 22; CHECK-NEXT: # %bb.1: # %.preheader 23; CHECK-NEXT: addi 30, 5, 1 24; CHECK-NEXT: addi 28, 5, 3 25; CHECK-NEXT: addi 27, 5, 2 26; CHECK-NEXT: mulld 12, 8, 5 27; CHECK-NEXT: addi 29, 3, 16 28; CHECK-NEXT: mulld 0, 9, 8 29; CHECK-NEXT: mr 25, 12 30; CHECK-NEXT: mulld 30, 8, 30 31; CHECK-NEXT: mulld 28, 8, 28 32; CHECK-NEXT: mulld 8, 8, 27 33; CHECK-NEXT: sldi 11, 10, 3 34; CHECK-NEXT: li 27, 0 35; CHECK-NEXT: mr 26, 30 36; CHECK-NEXT: b .LBB0_3 37; CHECK-NEXT: .p2align 4 38; CHECK-NEXT: .LBB0_2: 39; CHECK-NEXT: add 5, 5, 9 40; CHECK-NEXT: add 25, 25, 0 41; CHECK-NEXT: add 26, 26, 0 42; CHECK-NEXT: add 28, 28, 0 43; CHECK-NEXT: add 8, 8, 0 44; CHECK-NEXT: addi 27, 27, 1 45; CHECK-NEXT: cmpd 5, 7 46; CHECK-NEXT: bge 0, .LBB0_6 47; CHECK-NEXT: .LBB0_3: # =>This Loop Header: Depth=1 48; CHECK-NEXT: # Child Loop BB0_5 Depth 2 49; CHECK-NEXT: sub 24, 5, 10 50; CHECK-NEXT: cmpd 6, 24 51; CHECK-NEXT: bge 0, .LBB0_2 52; CHECK-NEXT: # %bb.4: 53; CHECK-NEXT: maddld 21, 0, 27, 30 54; CHECK-NEXT: maddld 20, 0, 27, 12 55; CHECK-NEXT: add 23, 6, 28 56; CHECK-NEXT: add 22, 6, 8 57; CHECK-NEXT: add 20, 6, 20 58; CHECK-NEXT: add 19, 6, 21 59; CHECK-NEXT: sldi 23, 23, 3 60; CHECK-NEXT: sldi 22, 22, 3 61; CHECK-NEXT: sldi 21, 6, 3 62; CHECK-NEXT: add 23, 29, 23 63; CHECK-NEXT: add 22, 29, 22 64; CHECK-NEXT: sldi 20, 20, 3 65; CHECK-NEXT: sldi 19, 19, 3 66; CHECK-NEXT: add 21, 4, 21 67; CHECK-NEXT: add 20, 3, 20 68; CHECK-NEXT: add 19, 3, 19 69; CHECK-NEXT: .p2align 5 70; CHECK-NEXT: .LBB0_5: # Parent Loop BB0_3 Depth=1 71; CHECK-NEXT: # => This Inner Loop Header: Depth=2 72; CHECK-NEXT: lfd 0, 0(21) 73; CHECK-NEXT: lfd 1, 0(20) 74; CHECK-NEXT: add 6, 6, 10 75; CHECK-NEXT: cmpd 6, 24 76; CHECK-NEXT: xsadddp 0, 0, 1 77; CHECK-NEXT: lfd 1, 8(20) 78; CHECK-NEXT: xsadddp 0, 0, 1 79; CHECK-NEXT: lfd 1, 16(20) 80; CHECK-NEXT: xsadddp 0, 0, 1 81; CHECK-NEXT: lfd 1, 24(20) 82; CHECK-NEXT: add 20, 20, 11 83; CHECK-NEXT: xsadddp 0, 0, 1 84; CHECK-NEXT: lfd 1, 0(19) 85; CHECK-NEXT: xsadddp 0, 0, 1 86; CHECK-NEXT: lfd 1, 8(19) 87; CHECK-NEXT: xsadddp 0, 0, 1 88; CHECK-NEXT: lfd 1, 16(19) 89; CHECK-NEXT: xsadddp 0, 0, 1 90; CHECK-NEXT: lfd 1, 24(19) 91; CHECK-NEXT: add 19, 19, 11 92; CHECK-NEXT: xsadddp 0, 0, 1 93; CHECK-NEXT: lfd 1, -16(22) 94; CHECK-NEXT: xsadddp 0, 0, 1 95; CHECK-NEXT: lfd 1, -8(22) 96; CHECK-NEXT: xsadddp 0, 0, 1 97; CHECK-NEXT: lfd 1, 0(22) 98; CHECK-NEXT: xsadddp 0, 0, 1 99; CHECK-NEXT: lfd 1, 8(22) 100; CHECK-NEXT: add 22, 22, 11 101; CHECK-NEXT: xsadddp 0, 0, 1 102; CHECK-NEXT: lfd 1, -16(23) 103; CHECK-NEXT: xsadddp 0, 0, 1 104; CHECK-NEXT: lfd 1, -8(23) 105; CHECK-NEXT: xsadddp 0, 0, 1 106; CHECK-NEXT: lfd 1, 0(23) 107; CHECK-NEXT: xsadddp 0, 0, 1 108; CHECK-NEXT: lfd 1, 8(23) 109; CHECK-NEXT: add 23, 23, 11 110; CHECK-NEXT: xsadddp 0, 0, 1 111; CHECK-NEXT: stfd 0, 0(21) 112; CHECK-NEXT: add 21, 21, 11 113; CHECK-NEXT: blt 0, .LBB0_5 114; CHECK-NEXT: b .LBB0_2 115; CHECK-NEXT: .LBB0_6: 116; CHECK-NEXT: ld 30, -16(1) # 8-byte Folded Reload 117; CHECK-NEXT: ld 29, -24(1) # 8-byte Folded Reload 118; CHECK-NEXT: ld 28, -32(1) # 8-byte Folded Reload 119; CHECK-NEXT: ld 27, -40(1) # 8-byte Folded Reload 120; CHECK-NEXT: ld 26, -48(1) # 8-byte Folded Reload 121; CHECK-NEXT: ld 25, -56(1) # 8-byte Folded Reload 122; CHECK-NEXT: ld 24, -64(1) # 8-byte Folded Reload 123; CHECK-NEXT: ld 23, -72(1) # 8-byte Folded Reload 124; CHECK-NEXT: ld 22, -80(1) # 8-byte Folded Reload 125; CHECK-NEXT: ld 21, -88(1) # 8-byte Folded Reload 126; CHECK-NEXT: ld 20, -96(1) # 8-byte Folded Reload 127; CHECK-NEXT: ld 19, -104(1) # 8-byte Folded Reload 128; CHECK-NEXT: blr 129 %9 = icmp slt i64 %2, %4 130 br i1 %9, label %10, label %97 131 13210: ; preds = %8, %93 133 %11 = phi i64 [ %95, %93 ], [ %2, %8 ] 134 %12 = phi i64 [ %94, %93 ], [ %3, %8 ] 135 %13 = sub nsw i64 %11, %7 136 %14 = icmp slt i64 %12, %13 137 br i1 %14, label %15, label %93 138 13915: ; preds = %10 140 %16 = mul nsw i64 %11, %5 141 %17 = add nsw i64 %11, 1 142 %18 = mul nsw i64 %17, %5 143 %19 = add nsw i64 %11, 2 144 %20 = mul nsw i64 %19, %5 145 %21 = add nsw i64 %11, 3 146 %22 = mul nsw i64 %21, %5 147 br label %23 148 14923: ; preds = %15, %23 150 %24 = phi i64 [ %12, %15 ], [ %91, %23 ] 151 %25 = getelementptr inbounds double, double* %1, i64 %24 152 %26 = load double, double* %25, align 8 153 %27 = add nsw i64 %24, %16 154 %28 = getelementptr inbounds double, double* %0, i64 %27 155 %29 = load double, double* %28, align 8 156 %30 = fadd double %26, %29 157 %31 = add nsw i64 %27, 1 158 %32 = getelementptr inbounds double, double* %0, i64 %31 159 %33 = load double, double* %32, align 8 160 %34 = fadd double %30, %33 161 %35 = add nsw i64 %27, 2 162 %36 = getelementptr inbounds double, double* %0, i64 %35 163 %37 = load double, double* %36, align 8 164 %38 = fadd double %34, %37 165 %39 = add nsw i64 %27, 3 166 %40 = getelementptr inbounds double, double* %0, i64 %39 167 %41 = load double, double* %40, align 8 168 %42 = fadd double %38, %41 169 %43 = add nsw i64 %24, %18 170 %44 = getelementptr inbounds double, double* %0, i64 %43 171 %45 = load double, double* %44, align 8 172 %46 = fadd double %42, %45 173 %47 = add nsw i64 %43, 1 174 %48 = getelementptr inbounds double, double* %0, i64 %47 175 %49 = load double, double* %48, align 8 176 %50 = fadd double %46, %49 177 %51 = add nsw i64 %43, 2 178 %52 = getelementptr inbounds double, double* %0, i64 %51 179 %53 = load double, double* %52, align 8 180 %54 = fadd double %50, %53 181 %55 = add nsw i64 %43, 3 182 %56 = getelementptr inbounds double, double* %0, i64 %55 183 %57 = load double, double* %56, align 8 184 %58 = fadd double %54, %57 185 %59 = add nsw i64 %24, %20 186 %60 = getelementptr inbounds double, double* %0, i64 %59 187 %61 = load double, double* %60, align 8 188 %62 = fadd double %58, %61 189 %63 = add nsw i64 %59, 1 190 %64 = getelementptr inbounds double, double* %0, i64 %63 191 %65 = load double, double* %64, align 8 192 %66 = fadd double %62, %65 193 %67 = add nsw i64 %59, 2 194 %68 = getelementptr inbounds double, double* %0, i64 %67 195 %69 = load double, double* %68, align 8 196 %70 = fadd double %66, %69 197 %71 = add nsw i64 %59, 3 198 %72 = getelementptr inbounds double, double* %0, i64 %71 199 %73 = load double, double* %72, align 8 200 %74 = fadd double %70, %73 201 %75 = add nsw i64 %24, %22 202 %76 = getelementptr inbounds double, double* %0, i64 %75 203 %77 = load double, double* %76, align 8 204 %78 = fadd double %74, %77 205 %79 = add nsw i64 %75, 1 206 %80 = getelementptr inbounds double, double* %0, i64 %79 207 %81 = load double, double* %80, align 8 208 %82 = fadd double %78, %81 209 %83 = add nsw i64 %75, 2 210 %84 = getelementptr inbounds double, double* %0, i64 %83 211 %85 = load double, double* %84, align 8 212 %86 = fadd double %82, %85 213 %87 = add nsw i64 %75, 3 214 %88 = getelementptr inbounds double, double* %0, i64 %87 215 %89 = load double, double* %88, align 8 216 %90 = fadd double %86, %89 217 store double %90, double* %25, align 8 218 %91 = add nsw i64 %24, %7 219 %92 = icmp slt i64 %91, %13 220 br i1 %92, label %23, label %93 221 22293: ; preds = %23, %10 223 %94 = phi i64 [ %12, %10 ], [ %91, %23 ] 224 %95 = add nsw i64 %11, %6 225 %96 = icmp slt i64 %95, %4 226 br i1 %96, label %10, label %97 227 22897: ; preds = %93, %8 229 ret void 230} 231