Skip to content

Commit e55f1a7

Browse files
[SLP] Add test for getSpillCost fix
1 parent 9fac59a commit e55f1a7

File tree

2 files changed

+382
-0
lines changed

2 files changed

+382
-0
lines changed

llvm/test/Transforms/SLPVectorizer/RISCV/math-function.ll

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1736,3 +1736,56 @@ entry:
17361736
%vecins.3 = insertelement <4 x float> %vecins.2, float %4, i32 3
17371737
ret <4 x float> %vecins.3
17381738
}
1739+
1740+
define void @f(i1 %c, ptr %p, ptr %q, ptr %r) {
1741+
; CHECK-LABEL: define void @f
1742+
; CHECK-SAME: (i1 [[C:%.*]], ptr [[P:%.*]], ptr [[Q:%.*]], ptr [[R:%.*]]) #[[ATTR1]] {
1743+
; CHECK-NEXT: [[TMP1:%.*]] = load <2 x i64>, ptr [[P]], align 8
1744+
; CHECK-NEXT: br i1 [[C]], label [[FOO:%.*]], label [[BAR:%.*]]
1745+
; CHECK: foo:
1746+
; CHECK-NEXT: [[Y0:%.*]] = load float, ptr [[R]], align 4
1747+
; CHECK-NEXT: [[Y1:%.*]] = call float @fabsf(float [[Y0]])
1748+
; CHECK-NEXT: br label [[BAZ:%.*]]
1749+
; CHECK: bar:
1750+
; CHECK-NEXT: [[Z0:%.*]] = load float, ptr [[R]], align 4
1751+
; CHECK-NEXT: [[Z1:%.*]] = call float @fabsf(float [[Z0]])
1752+
; CHECK-NEXT: br label [[BAZ]]
1753+
; CHECK: baz:
1754+
; CHECK-NEXT: store <2 x i64> [[TMP1]], ptr [[Q]], align 8
1755+
; CHECK-NEXT: ret void
1756+
;
1757+
; DEFAULT-LABEL: define void @f
1758+
; DEFAULT-SAME: (i1 [[C:%.*]], ptr [[P:%.*]], ptr [[Q:%.*]], ptr [[R:%.*]]) #[[ATTR1]] {
1759+
; DEFAULT-NEXT: [[TMP1:%.*]] = load <2 x i64>, ptr [[P]], align 8
1760+
; DEFAULT-NEXT: br i1 [[C]], label [[FOO:%.*]], label [[BAR:%.*]]
1761+
; DEFAULT: foo:
1762+
; DEFAULT-NEXT: [[Y0:%.*]] = load float, ptr [[R]], align 4
1763+
; DEFAULT-NEXT: [[Y1:%.*]] = call float @fabsf(float [[Y0]])
1764+
; DEFAULT-NEXT: br label [[BAZ:%.*]]
1765+
; DEFAULT: bar:
1766+
; DEFAULT-NEXT: [[Z0:%.*]] = load float, ptr [[R]], align 4
1767+
; DEFAULT-NEXT: [[Z1:%.*]] = call float @fabsf(float [[Z0]])
1768+
; DEFAULT-NEXT: br label [[BAZ]]
1769+
; DEFAULT: baz:
1770+
; DEFAULT-NEXT: store <2 x i64> [[TMP1]], ptr [[Q]], align 8
1771+
; DEFAULT-NEXT: ret void
1772+
;
1773+
%x0 = load i64, ptr %p
1774+
%p1 = getelementptr i64, ptr %p, i64 1
1775+
%x1 = load i64, ptr %p1
1776+
br i1 %c, label %foo, label %bar
1777+
foo:
1778+
%y0 = load float, ptr %r
1779+
%y1 = call float @fabsf(float %y0)
1780+
br label %baz
1781+
bar:
1782+
%z0 = load float, ptr %r
1783+
%z1 = call float @fabsf(float %z0)
1784+
br label %baz
1785+
baz:
1786+
store i64 %x0, ptr %q
1787+
%q1 = getelementptr i64, ptr %q, i64 1
1788+
store i64 %x1, ptr %q1
1789+
1790+
ret void
1791+
}
Lines changed: 329 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,329 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
2+
; RUN: opt -S < %s -passes=slp-vectorizer -mtriple=riscv64 -mattr=+v | FileCheck %s
3+
4+
declare void @g()
5+
6+
; Shouldn't be vectorized
7+
define void @f0(i1 %c, ptr %p, ptr %q) {
8+
; CHECK-LABEL: define void @f0(
9+
; CHECK-SAME: i1 [[C:%.*]], ptr [[P:%.*]], ptr [[Q:%.*]]) #[[ATTR0:[0-9]+]] {
10+
; CHECK-NEXT: [[TMP1:%.*]] = load <2 x i64>, ptr [[P]], align 8
11+
; CHECK-NEXT: br i1 [[C]], label %[[FOO:.*]], label %[[BAR:.*]]
12+
; CHECK: [[FOO]]:
13+
; CHECK-NEXT: call void @g()
14+
; CHECK-NEXT: call void @g()
15+
; CHECK-NEXT: call void @g()
16+
; CHECK-NEXT: br label %[[BAZ:.*]]
17+
; CHECK: [[BAR]]:
18+
; CHECK-NEXT: call void @g()
19+
; CHECK-NEXT: call void @g()
20+
; CHECK-NEXT: call void @g()
21+
; CHECK-NEXT: br label %[[BAZ]]
22+
; CHECK: [[BAZ]]:
23+
; CHECK-NEXT: store <2 x i64> [[TMP1]], ptr [[Q]], align 8
24+
; CHECK-NEXT: ret void
25+
;
26+
%x0 = load i64, ptr %p
27+
%p1 = getelementptr i64, ptr %p, i64 1
28+
%x1 = load i64, ptr %p1
29+
br i1 %c, label %foo, label %bar
30+
foo:
31+
call void @g()
32+
call void @g()
33+
call void @g()
34+
br label %baz
35+
bar:
36+
call void @g()
37+
call void @g()
38+
call void @g()
39+
br label %baz
40+
baz:
41+
store i64 %x0, ptr %q
42+
%q1 = getelementptr i64, ptr %q, i64 1
43+
store i64 %x1, ptr %q1
44+
45+
ret void
46+
}
47+
48+
; Shouldn't be vectorized
49+
define void @f1(i1 %c, ptr %p, ptr %q, ptr %r) {
50+
; CHECK-LABEL: define void @f1(
51+
; CHECK-SAME: i1 [[C:%.*]], ptr [[P:%.*]], ptr [[Q:%.*]], ptr [[R:%.*]]) #[[ATTR0]] {
52+
; CHECK-NEXT: [[ENTRY:.*:]]
53+
; CHECK-NEXT: [[TMP0:%.*]] = load <2 x i64>, ptr [[P]], align 8
54+
; CHECK-NEXT: br i1 [[C]], label %[[FOO:.*]], label %[[BAR:.*]]
55+
; CHECK: [[FOO]]:
56+
; CHECK-NEXT: [[TMP1:%.*]] = add <2 x i64> [[TMP0]], splat (i64 1)
57+
; CHECK-NEXT: br label %[[BAZ:.*]]
58+
; CHECK: [[BAR]]:
59+
; CHECK-NEXT: call void @g()
60+
; CHECK-NEXT: call void @g()
61+
; CHECK-NEXT: call void @g()
62+
; CHECK-NEXT: br label %[[BAZ]]
63+
; CHECK: [[BAZ]]:
64+
; CHECK-NEXT: [[TMP2:%.*]] = phi <2 x i64> [ [[TMP1]], %[[FOO]] ], [ [[TMP0]], %[[BAR]] ]
65+
; CHECK-NEXT: store <2 x i64> [[TMP2]], ptr [[Q]], align 8
66+
; CHECK-NEXT: ret void
67+
;
68+
entry:
69+
%x0 = load i64, ptr %p
70+
%p1 = getelementptr i64, ptr %p, i64 1
71+
%x1 = load i64, ptr %p1
72+
br i1 %c, label %foo, label %bar
73+
foo:
74+
%y0 = add i64 %x0, 1
75+
%y1 = add i64 %x1, 1
76+
br label %baz
77+
bar:
78+
call void @g()
79+
call void @g()
80+
call void @g()
81+
br label %baz
82+
baz:
83+
%phi0 = phi i64 [%y0, %foo], [%x0, %bar]
84+
%phi1 = phi i64 [%y1, %foo], [%x1, %bar]
85+
store i64 %phi0, ptr %q
86+
%q1 = getelementptr i64, ptr %q, i64 1
87+
store i64 %phi1, ptr %q1
88+
89+
ret void
90+
}
91+
92+
; Should be vectorized
93+
define void @f2(i1 %c, ptr %p, ptr %q, ptr %r) {
94+
; CHECK-LABEL: define void @f2(
95+
; CHECK-SAME: i1 [[C:%.*]], ptr [[P:%.*]], ptr [[Q:%.*]], ptr [[R:%.*]]) #[[ATTR0]] {
96+
; CHECK-NEXT: [[ENTRY:.*]]:
97+
; CHECK-NEXT: call void @g()
98+
; CHECK-NEXT: call void @g()
99+
; CHECK-NEXT: call void @g()
100+
; CHECK-NEXT: br i1 [[C]], label %[[FOO:.*]], label %[[BAR:.*]]
101+
; CHECK: [[FOO]]:
102+
; CHECK-NEXT: [[TMP0:%.*]] = load <2 x i64>, ptr [[P]], align 8
103+
; CHECK-NEXT: br label %[[BAR]]
104+
; CHECK: [[BAR]]:
105+
; CHECK-NEXT: [[TMP1:%.*]] = phi <2 x i64> [ zeroinitializer, %[[ENTRY]] ], [ [[TMP0]], %[[FOO]] ]
106+
; CHECK-NEXT: store <2 x i64> [[TMP1]], ptr [[Q]], align 8
107+
; CHECK-NEXT: ret void
108+
;
109+
entry:
110+
call void @g()
111+
call void @g()
112+
call void @g()
113+
br i1 %c, label %foo, label %bar
114+
foo:
115+
%x0 = load i64, ptr %p
116+
%p1 = getelementptr i64, ptr %p, i64 1
117+
%x1 = load i64, ptr %p1
118+
br label %bar
119+
bar:
120+
%phi0 = phi i64 [0, %entry], [%x0, %foo]
121+
%phi1 = phi i64 [0, %entry], [%x1, %foo]
122+
store i64 %phi0, ptr %q
123+
%q1 = getelementptr i64, ptr %q, i64 1
124+
store i64 %phi1, ptr %q1
125+
126+
ret void
127+
}
128+
129+
130+
; Shouldn't be vectorized
131+
define void @f3(i64 %n, double %f0, double %f1, ptr %q) {
132+
; CHECK-LABEL: define void @f3(
133+
; CHECK-SAME: i64 [[N:%.*]], double [[F0:%.*]], double [[F1:%.*]], ptr [[Q:%.*]]) #[[ATTR0]] {
134+
; CHECK-NEXT: [[ENTRY:.*]]:
135+
; CHECK-NEXT: br label %[[LOOP:.*]]
136+
; CHECK: [[LOOP]]:
137+
; CHECK-NEXT: [[IV:%.*]] = phi i64 [ 0, %[[ENTRY]] ], [ [[IV_NEXT:%.*]], %[[LATCH:.*]] ]
138+
; CHECK-NEXT: [[PHI0:%.*]] = phi double [ [[F0]], %[[ENTRY]] ], [ [[X0:%.*]], %[[LATCH]] ]
139+
; CHECK-NEXT: [[PHI1:%.*]] = phi double [ [[F1]], %[[ENTRY]] ], [ [[X1:%.*]], %[[LATCH]] ]
140+
; CHECK-NEXT: call void @g()
141+
; CHECK-NEXT: call void @g()
142+
; CHECK-NEXT: call void @g()
143+
; CHECK-NEXT: br label %[[LATCH]]
144+
; CHECK: [[LATCH]]:
145+
; CHECK-NEXT: [[X0]] = fadd double [[PHI0]], 1.000000e+00
146+
; CHECK-NEXT: [[X1]] = fadd double [[PHI1]], 1.000000e+00
147+
; CHECK-NEXT: [[IV_NEXT]] = add i64 [[IV]], 1
148+
; CHECK-NEXT: [[DONE:%.*]] = icmp eq i64 [[IV_NEXT]], [[N]]
149+
; CHECK-NEXT: br i1 [[DONE]], label %[[EXIT:.*]], label %[[LOOP]]
150+
; CHECK: [[EXIT]]:
151+
; CHECK-NEXT: [[Q_GEP0:%.*]] = getelementptr i64, ptr [[Q]], i64 [[IV]]
152+
; CHECK-NEXT: store double [[X0]], ptr [[Q_GEP0]], align 8
153+
; CHECK-NEXT: [[Q_GEP1:%.*]] = getelementptr i64, ptr [[Q_GEP0]], i64 1
154+
; CHECK-NEXT: store double [[X1]], ptr [[Q_GEP1]], align 8
155+
; CHECK-NEXT: ret void
156+
;
157+
entry:
158+
br label %loop
159+
loop:
160+
%iv = phi i64 [0, %entry], [%iv.next, %latch]
161+
%phi0 = phi double [%f0, %entry], [%x0, %latch]
162+
%phi1 = phi double [%f1, %entry], [%x1, %latch]
163+
call void @g()
164+
call void @g()
165+
call void @g()
166+
br label %latch
167+
latch:
168+
%x0 = fadd double %phi0, 1.0
169+
%x1 = fadd double %phi1, 1.0
170+
171+
%iv.next = add i64 %iv, 1
172+
%done = icmp eq i64 %iv.next, %n
173+
br i1 %done, label %exit, label %loop
174+
exit:
175+
%q.gep0 = getelementptr i64, ptr %q, i64 %iv
176+
store double %x0, ptr %q.gep0
177+
%q.gep1 = getelementptr i64, ptr %q.gep0, i64 1
178+
store double %x1, ptr %q.gep1
179+
ret void
180+
}
181+
182+
; Should be vectorized
183+
define void @f4(ptr %p, ptr %q, i1 %c0, i1 %c1) {
184+
; CHECK-LABEL: define void @f4(
185+
; CHECK-SAME: ptr [[P:%.*]], ptr [[Q:%.*]], i1 [[C0:%.*]], i1 [[C1:%.*]]) #[[ATTR0]] {
186+
; CHECK-NEXT: [[ENTRY:.*:]]
187+
; CHECK-NEXT: br label %[[FOO:.*]]
188+
; CHECK: [[FOO]]:
189+
; CHECK-NEXT: call void @g()
190+
; CHECK-NEXT: call void @g()
191+
; CHECK-NEXT: call void @g()
192+
; CHECK-NEXT: br label %[[BAR:.*]]
193+
; CHECK: [[BAR]]:
194+
; CHECK-NEXT: [[TMP0:%.*]] = load <2 x i64>, ptr [[P]], align 8
195+
; CHECK-NEXT: br i1 [[C0]], label %[[BAZ:.*]], label %[[QUX:.*]]
196+
; CHECK: [[BAZ]]:
197+
; CHECK-NEXT: [[TMP1:%.*]] = add <2 x i64> [[TMP0]], splat (i64 1)
198+
; CHECK-NEXT: br label %[[QUX]]
199+
; CHECK: [[QUX]]:
200+
; CHECK-NEXT: [[TMP2:%.*]] = phi <2 x i64> [ [[TMP0]], %[[BAR]] ], [ [[TMP1]], %[[BAZ]] ]
201+
; CHECK-NEXT: store <2 x i64> [[TMP2]], ptr [[Q]], align 8
202+
; CHECK-NEXT: br i1 [[C1]], label %[[FOO]], label %[[BAR]]
203+
;
204+
entry:
205+
br label %foo
206+
foo:
207+
call void @g()
208+
call void @g()
209+
call void @g()
210+
br label %bar
211+
bar:
212+
%x0 = load i64, ptr %p
213+
%p1 = getelementptr i64, ptr %p, i64 1
214+
%x1 = load i64, ptr %p1
215+
br i1 %c0, label %baz, label %qux
216+
baz:
217+
%y0 = add i64 %x0, 1
218+
%y1 = add i64 %x1, 1
219+
br label %qux
220+
qux:
221+
%z0 = phi i64 [%x0, %bar], [%y0, %baz]
222+
%z1 = phi i64 [%x1, %bar], [%y1, %baz]
223+
store i64 %z0, ptr %q
224+
%q1 = getelementptr i64, ptr %q, i64 1
225+
store i64 %z1, ptr %q1
226+
br i1 %c1, label %foo, label %bar
227+
}
228+
229+
230+
; Should be vectorized
231+
define void @f5(i1 %c0, ptr %p, ptr %q) {
232+
; CHECK-LABEL: define void @f5(
233+
; CHECK-SAME: i1 [[C0:%.*]], ptr [[P:%.*]], ptr [[Q:%.*]]) #[[ATTR0]] {
234+
; CHECK-NEXT: [[ENTRY:.*:]]
235+
; CHECK-NEXT: br label %[[FOO:.*]]
236+
; CHECK: [[FOO]]:
237+
; CHECK-NEXT: call void @g()
238+
; CHECK-NEXT: call void @g()
239+
; CHECK-NEXT: call void @g()
240+
; CHECK-NEXT: [[TMP0:%.*]] = load <2 x i64>, ptr [[P]], align 8
241+
; CHECK-NEXT: br i1 [[C0]], label %[[BAR:.*]], label %[[FOOBAR:.*]]
242+
; CHECK: [[BAR]]:
243+
; CHECK-NEXT: br label %[[BAZ:.*]]
244+
; CHECK: [[BAZ]]:
245+
; CHECK-NEXT: [[TMP1:%.*]] = add <2 x i64> [[TMP0]], splat (i64 1)
246+
; CHECK-NEXT: br label %[[BARFOO:.*]]
247+
; CHECK: [[FOOBAR]]:
248+
; CHECK-NEXT: [[TMP2:%.*]] = add <2 x i64> [[TMP0]], splat (i64 2)
249+
; CHECK-NEXT: br label %[[BARFOO]]
250+
; CHECK: [[BARFOO]]:
251+
; CHECK-NEXT: [[TMP3:%.*]] = phi <2 x i64> [ [[TMP2]], %[[FOOBAR]] ], [ [[TMP1]], %[[BAZ]] ]
252+
; CHECK-NEXT: store <2 x i64> [[TMP3]], ptr [[Q]], align 8
253+
; CHECK-NEXT: br label %[[FOO]]
254+
;
255+
entry:
256+
br label %foo
257+
foo:
258+
call void @g()
259+
call void @g()
260+
call void @g()
261+
%x0 = load i64, ptr %p
262+
%p1 = getelementptr i64, ptr %p, i64 1
263+
%x1 = load i64, ptr %p1
264+
br i1 %c0, label %bar, label %foobar
265+
bar:
266+
br label %baz
267+
baz:
268+
%y0 = add i64 %x0, 1
269+
%y1 = add i64 %x1, 1
270+
br label %barfoo
271+
foobar:
272+
%z0 = add i64 %x0, 2
273+
%z1 = add i64 %x1, 2
274+
br label %barfoo
275+
barfoo:
276+
%phi0 = phi i64 [%z0, %foobar], [%y0, %baz]
277+
%phi1 = phi i64 [%z1, %foobar], [%y1, %baz]
278+
store i64 %phi0, ptr %q
279+
%q1 = getelementptr i64, ptr %q, i64 1
280+
store i64 %phi1, ptr %q1
281+
br label %foo
282+
}
283+
284+
; Shouldn't be vectorized
285+
define void @f6(i1 %c, ptr %p, ptr %q, ptr %r) {
286+
; CHECK-LABEL: define void @f6(
287+
; CHECK-SAME: i1 [[C:%.*]], ptr [[P:%.*]], ptr [[Q:%.*]], ptr [[R:%.*]]) #[[ATTR0]] {
288+
; CHECK-NEXT: [[ENTRY:.*]]:
289+
; CHECK-NEXT: br i1 [[C]], label %[[FOO:.*]], label %[[BAR:.*]]
290+
; CHECK: [[FOO]]:
291+
; CHECK-NEXT: [[X0:%.*]] = load i64, ptr [[P]], align 8
292+
; CHECK-NEXT: [[P1:%.*]] = getelementptr i64, ptr [[P]], i64 1
293+
; CHECK-NEXT: [[X1:%.*]] = load i64, ptr [[P1]], align 8
294+
; CHECK-NEXT: br label %[[BAR]]
295+
; CHECK: [[BAR]]:
296+
; CHECK-NEXT: [[PHI0:%.*]] = phi i64 [ 0, %[[ENTRY]] ], [ [[X0]], %[[FOO]] ]
297+
; CHECK-NEXT: [[PHI1:%.*]] = phi i64 [ 0, %[[ENTRY]] ], [ [[X1]], %[[FOO]] ]
298+
; CHECK-NEXT: call void @g()
299+
; CHECK-NEXT: call void @g()
300+
; CHECK-NEXT: call void @g()
301+
; CHECK-NEXT: br label %[[BAZ:.*]]
302+
; CHECK: [[BAZ]]:
303+
; CHECK-NEXT: store i64 [[PHI0]], ptr [[Q]], align 8
304+
; CHECK-NEXT: [[Q1:%.*]] = getelementptr i64, ptr [[Q]], i64 1
305+
; CHECK-NEXT: store i64 [[PHI1]], ptr [[Q1]], align 8
306+
; CHECK-NEXT: ret void
307+
;
308+
entry:
309+
br i1 %c, label %foo, label %bar
310+
foo:
311+
%x0 = load i64, ptr %p
312+
%p1 = getelementptr i64, ptr %p, i64 1
313+
%x1 = load i64, ptr %p1
314+
br label %bar
315+
bar:
316+
%phi0 = phi i64 [0, %entry], [%x0, %foo]
317+
%phi1 = phi i64 [0, %entry], [%x1, %foo]
318+
call void @g()
319+
call void @g()
320+
call void @g()
321+
br label %baz
322+
baz:
323+
store i64 %phi0, ptr %q
324+
%q1 = getelementptr i64, ptr %q, i64 1
325+
store i64 %phi1, ptr %q1
326+
327+
ret void
328+
}
329+

0 commit comments

Comments
 (0)