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