Skip to content

Commit 504f14c

Browse files
committed
[AArch64][GlobalISel] Pre-Commit Test Update for Legalize G_ABS Large Vector
1 parent bfef161 commit 504f14c

File tree

2 files changed

+346
-1
lines changed

2 files changed

+346
-1
lines changed

llvm/test/CodeGen/AArch64/abs.ll

Lines changed: 339 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,339 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 4
2+
; RUN: llc -mtriple=aarch64-none-linux-gnu %s -o - | FileCheck %s --check-prefixes=CHECK,CHECK-SD
3+
; RUN: llc -mtriple=aarch64-none-linux-gnu -global-isel -global-isel-abort=2 %s -o - 2>&1 | FileCheck %s --check-prefixes=CHECK,CHECK-GI
4+
5+
; CHECK-GI: warning: Instruction selection used fallback path for abs_v4i8
6+
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for abs_v32i8
7+
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for abs_v2i16
8+
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for abs_v16i16
9+
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for abs_v8i32
10+
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for abs_v4i64
11+
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for abs_v3i8
12+
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for abs_v7i8
13+
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for abs_v3i16
14+
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for abs_v7i16
15+
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for abs_v3i32
16+
17+
; ===== Legal Scalars =====
18+
19+
define i8 @abs_i8(i8 %0, i8 %1, i8 %2){
20+
; CHECK-SD-LABEL: abs_i8:
21+
; CHECK-SD: // %bb.0:
22+
; CHECK-SD-NEXT: sxtb w8, w0
23+
; CHECK-SD-NEXT: cmp w8, #0
24+
; CHECK-SD-NEXT: cneg w0, w8, mi
25+
; CHECK-SD-NEXT: ret
26+
;
27+
; CHECK-GI-LABEL: abs_i8:
28+
; CHECK-GI: // %bb.0:
29+
; CHECK-GI-NEXT: sxtb w8, w0
30+
; CHECK-GI-NEXT: asr w8, w8, #7
31+
; CHECK-GI-NEXT: add w9, w0, w8
32+
; CHECK-GI-NEXT: eor w0, w9, w8
33+
; CHECK-GI-NEXT: ret
34+
%4 = call i8 @llvm.abs.i8(i8 %0, i1 0)
35+
ret i8 %4
36+
}
37+
declare i8 @llvm.abs.i8(i8, i1)
38+
39+
define i16 @abs_i16(i16 %0, i16 %1, i16 %2){
40+
; CHECK-SD-LABEL: abs_i16:
41+
; CHECK-SD: // %bb.0:
42+
; CHECK-SD-NEXT: sxth w8, w0
43+
; CHECK-SD-NEXT: cmp w8, #0
44+
; CHECK-SD-NEXT: cneg w0, w8, mi
45+
; CHECK-SD-NEXT: ret
46+
;
47+
; CHECK-GI-LABEL: abs_i16:
48+
; CHECK-GI: // %bb.0:
49+
; CHECK-GI-NEXT: sxth w8, w0
50+
; CHECK-GI-NEXT: asr w8, w8, #15
51+
; CHECK-GI-NEXT: add w9, w0, w8
52+
; CHECK-GI-NEXT: eor w0, w9, w8
53+
; CHECK-GI-NEXT: ret
54+
%4 = call i16 @llvm.abs.i16(i16 %0, i1 0)
55+
ret i16 %4
56+
}
57+
declare i16 @llvm.abs.i16(i16, i1)
58+
59+
define i32 @abs_i32(i32 %0, i32 %1, i32 %2){
60+
; CHECK-SD-LABEL: abs_i32:
61+
; CHECK-SD: // %bb.0:
62+
; CHECK-SD-NEXT: cmp w0, #0
63+
; CHECK-SD-NEXT: cneg w0, w0, mi
64+
; CHECK-SD-NEXT: ret
65+
;
66+
; CHECK-GI-LABEL: abs_i32:
67+
; CHECK-GI: // %bb.0:
68+
; CHECK-GI-NEXT: asr w8, w0, #31
69+
; CHECK-GI-NEXT: add w9, w0, w8
70+
; CHECK-GI-NEXT: eor w0, w9, w8
71+
; CHECK-GI-NEXT: ret
72+
%4 = call i32 @llvm.abs.i32(i32 %0, i1 0)
73+
ret i32 %4
74+
}
75+
declare i32 @llvm.abs.i32(i32, i1)
76+
77+
define i64 @abs_i64(i64 %0, i64 %1, i64 %2){
78+
; CHECK-SD-LABEL: abs_i64:
79+
; CHECK-SD: // %bb.0:
80+
; CHECK-SD-NEXT: cmp x0, #0
81+
; CHECK-SD-NEXT: cneg x0, x0, mi
82+
; CHECK-SD-NEXT: ret
83+
;
84+
; CHECK-GI-LABEL: abs_i64:
85+
; CHECK-GI: // %bb.0:
86+
; CHECK-GI-NEXT: asr x8, x0, #63
87+
; CHECK-GI-NEXT: add x9, x0, x8
88+
; CHECK-GI-NEXT: eor x0, x9, x8
89+
; CHECK-GI-NEXT: ret
90+
%4 = call i64 @llvm.abs.i64(i64 %0, i1 0)
91+
ret i64 %4
92+
}
93+
declare i64 @llvm.abs.i64(i64, i1)
94+
95+
define i128 @abs_i128(i128 %0, i128 %1, i128 %2){
96+
; CHECK-SD-LABEL: abs_i128:
97+
; CHECK-SD: // %bb.0:
98+
; CHECK-SD-NEXT: asr x8, x1, #63
99+
; CHECK-SD-NEXT: eor x9, x0, x8
100+
; CHECK-SD-NEXT: eor x10, x1, x8
101+
; CHECK-SD-NEXT: subs x0, x9, x8
102+
; CHECK-SD-NEXT: sbc x1, x10, x8
103+
; CHECK-SD-NEXT: ret
104+
;
105+
; CHECK-GI-LABEL: abs_i128:
106+
; CHECK-GI: // %bb.0:
107+
; CHECK-GI-NEXT: asr x8, x1, #63
108+
; CHECK-GI-NEXT: adds x9, x0, x8
109+
; CHECK-GI-NEXT: adc x10, x1, x8
110+
; CHECK-GI-NEXT: eor x0, x9, x8
111+
; CHECK-GI-NEXT: eor x1, x10, x8
112+
; CHECK-GI-NEXT: ret
113+
%4 = call i128 @llvm.abs.i128(i128 %0, i1 0)
114+
ret i128 %4
115+
}
116+
declare i128 @llvm.abs.i128(i128, i1)
117+
118+
; ===== Legal Vector Types =====
119+
120+
define <8 x i8> @abs_v8i8(<8 x i8> %0){
121+
; CHECK-LABEL: abs_v8i8:
122+
; CHECK: // %bb.0:
123+
; CHECK-NEXT: abs v0.8b, v0.8b
124+
; CHECK-NEXT: ret
125+
%3 = call <8 x i8> @llvm.abs.v8i8(<8 x i8> %0, i1 0)
126+
ret <8 x i8> %3
127+
}
128+
declare <8 x i8> @llvm.abs.v8i8(<8 x i8>, i1)
129+
130+
define <16 x i8> @abs_v16i8(<16 x i8> %0){
131+
; CHECK-LABEL: abs_v16i8:
132+
; CHECK: // %bb.0:
133+
; CHECK-NEXT: abs v0.16b, v0.16b
134+
; CHECK-NEXT: ret
135+
%3 = call <16 x i8> @llvm.abs.v16i8(<16 x i8> %0, i1 0)
136+
ret <16 x i8> %3
137+
}
138+
declare <16 x i8> @llvm.abs.v16i8(<16 x i8>, i1)
139+
140+
define <4 x i16> @abs_v4i16(<4 x i16> %0){
141+
; CHECK-LABEL: abs_v4i16:
142+
; CHECK: // %bb.0:
143+
; CHECK-NEXT: abs v0.4h, v0.4h
144+
; CHECK-NEXT: ret
145+
%3 = call <4 x i16> @llvm.abs.v4i16(<4 x i16> %0, i1 0)
146+
ret <4 x i16> %3
147+
}
148+
declare <4 x i16> @llvm.abs.v4i16(<4 x i16>, i1)
149+
150+
define <8 x i16> @abs_v8i16(<8 x i16> %0){
151+
; CHECK-LABEL: abs_v8i16:
152+
; CHECK: // %bb.0:
153+
; CHECK-NEXT: abs v0.8h, v0.8h
154+
; CHECK-NEXT: ret
155+
%3 = call <8 x i16> @llvm.abs.v8i16(<8 x i16> %0, i1 0)
156+
ret <8 x i16> %3
157+
}
158+
declare <8 x i16> @llvm.abs.v8i16(<8 x i16>, i1)
159+
160+
define <2 x i32> @abs_v2i32(<2 x i32> %0){
161+
; CHECK-LABEL: abs_v2i32:
162+
; CHECK: // %bb.0:
163+
; CHECK-NEXT: abs v0.2s, v0.2s
164+
; CHECK-NEXT: ret
165+
%3 = call <2 x i32> @llvm.abs.v2i32(<2 x i32> %0, i1 0)
166+
ret <2 x i32> %3
167+
}
168+
declare <2 x i32> @llvm.abs.v2i32(<2 x i32>, i1)
169+
170+
define <4 x i32> @abs_v4i32(<4 x i32> %0){
171+
; CHECK-LABEL: abs_v4i32:
172+
; CHECK: // %bb.0:
173+
; CHECK-NEXT: abs v0.4s, v0.4s
174+
; CHECK-NEXT: ret
175+
%3 = call <4 x i32> @llvm.abs.v4i32(<4 x i32> %0, i1 0)
176+
ret <4 x i32> %3
177+
}
178+
declare <4 x i32> @llvm.abs.v4i32(<4 x i32>, i1)
179+
180+
define <2 x i64> @abs_v2i64(<2 x i64> %0){
181+
; CHECK-LABEL: abs_v2i64:
182+
; CHECK: // %bb.0:
183+
; CHECK-NEXT: abs v0.2d, v0.2d
184+
; CHECK-NEXT: ret
185+
%3 = call <2 x i64> @llvm.abs.v2i64(<2 x i64> %0, i1 0)
186+
ret <2 x i64> %3
187+
}
188+
declare <2 x i64> @llvm.abs.v2i64(<2 x i64>, i1)
189+
190+
; ===== Smaller/Larger Width Vectors with Legal Element Sizes =====
191+
192+
define <4 x i8> @abs_v4i8(<4 x i8> %0){
193+
; CHECK-LABEL: abs_v4i8:
194+
; CHECK: // %bb.0:
195+
; CHECK-NEXT: shl v0.4h, v0.4h, #8
196+
; CHECK-NEXT: sshr v0.4h, v0.4h, #8
197+
; CHECK-NEXT: abs v0.4h, v0.4h
198+
; CHECK-NEXT: ret
199+
%3 = call <4 x i8> @llvm.abs.v4i8(<4 x i8> %0, i1 0)
200+
ret <4 x i8> %3
201+
}
202+
declare <4 x i8> @llvm.abs.v4i8(<4 x i8>, i1)
203+
204+
define <32 x i8> @abs_v32i8(<32 x i8> %0){
205+
; CHECK-LABEL: abs_v32i8:
206+
; CHECK: // %bb.0:
207+
; CHECK-NEXT: abs v0.16b, v0.16b
208+
; CHECK-NEXT: abs v1.16b, v1.16b
209+
; CHECK-NEXT: ret
210+
%3 = call <32 x i8> @llvm.abs.v32i8(<32 x i8> %0, i1 0)
211+
ret <32 x i8> %3
212+
}
213+
declare <32 x i8> @llvm.abs.v32i8(<32 x i8>, i1)
214+
215+
define <2 x i16> @abs_v2i16(<2 x i16> %0){
216+
; CHECK-LABEL: abs_v2i16:
217+
; CHECK: // %bb.0:
218+
; CHECK-NEXT: shl v0.2s, v0.2s, #16
219+
; CHECK-NEXT: sshr v0.2s, v0.2s, #16
220+
; CHECK-NEXT: abs v0.2s, v0.2s
221+
; CHECK-NEXT: ret
222+
%3 = call <2 x i16> @llvm.abs.v2i16(<2 x i16> %0, i1 0)
223+
ret <2 x i16> %3
224+
}
225+
declare <2 x i16> @llvm.abs.v2i16(<2 x i16>, i1)
226+
227+
define <16 x i16> @abs_v16i16(<16 x i16> %0){
228+
; CHECK-LABEL: abs_v16i16:
229+
; CHECK: // %bb.0:
230+
; CHECK-NEXT: abs v0.8h, v0.8h
231+
; CHECK-NEXT: abs v1.8h, v1.8h
232+
; CHECK-NEXT: ret
233+
%3 = call <16 x i16> @llvm.abs.v16i16(<16 x i16> %0, i1 0)
234+
ret <16 x i16> %3
235+
}
236+
declare <16 x i16> @llvm.abs.v16i16(<16 x i16>, i1)
237+
238+
define <1 x i32> @abs_v1i32(<1 x i32> %0){
239+
; CHECK-SD-LABEL: abs_v1i32:
240+
; CHECK-SD: // %bb.0:
241+
; CHECK-SD-NEXT: abs v0.2s, v0.2s
242+
; CHECK-SD-NEXT: ret
243+
;
244+
; CHECK-GI-LABEL: abs_v1i32:
245+
; CHECK-GI: // %bb.0:
246+
; CHECK-GI-NEXT: fmov x8, d0
247+
; CHECK-GI-NEXT: asr w9, w8, #31
248+
; CHECK-GI-NEXT: add w8, w8, w9
249+
; CHECK-GI-NEXT: eor w8, w8, w9
250+
; CHECK-GI-NEXT: fmov s0, w8
251+
; CHECK-GI-NEXT: mov v0.s[1], w8
252+
; CHECK-GI-NEXT: // kill: def $d0 killed $d0 killed $q0
253+
; CHECK-GI-NEXT: ret
254+
%3 = call <1 x i32> @llvm.abs.v1i32(<1 x i32> %0, i1 0)
255+
ret <1 x i32> %3
256+
}
257+
declare <1 x i32> @llvm.abs.v1i32(<1 x i32>, i1)
258+
259+
define <8 x i32> @abs_v8i32(<8 x i32> %0){
260+
; CHECK-LABEL: abs_v8i32:
261+
; CHECK: // %bb.0:
262+
; CHECK-NEXT: abs v0.4s, v0.4s
263+
; CHECK-NEXT: abs v1.4s, v1.4s
264+
; CHECK-NEXT: ret
265+
%3 = call <8 x i32> @llvm.abs.v8i32(<8 x i32> %0, i1 0)
266+
ret <8 x i32> %3
267+
}
268+
declare <8 x i32> @llvm.abs.v8i32(<8 x i32>, i1)
269+
270+
define <4 x i64> @abs_v4i64(<4 x i64> %0){
271+
; CHECK-LABEL: abs_v4i64:
272+
; CHECK: // %bb.0:
273+
; CHECK-NEXT: abs v0.2d, v0.2d
274+
; CHECK-NEXT: abs v1.2d, v1.2d
275+
; CHECK-NEXT: ret
276+
%3 = call <4 x i64> @llvm.abs.v4i64(<4 x i64> %0, i1 0)
277+
ret <4 x i64> %3
278+
}
279+
declare <4 x i64> @llvm.abs.v4i64(<4 x i64>, i1)
280+
281+
; ===== Vectors with Non-Pow 2 Widths =====
282+
283+
define <3 x i8> @abs_v3i8(<3 x i8> %0){
284+
; CHECK-LABEL: abs_v3i8:
285+
; CHECK: // %bb.0:
286+
; CHECK-NEXT: fmov s0, w0
287+
; CHECK-NEXT: mov v0.h[1], w1
288+
; CHECK-NEXT: mov v0.h[2], w2
289+
; CHECK-NEXT: shl v0.4h, v0.4h, #8
290+
; CHECK-NEXT: sshr v0.4h, v0.4h, #8
291+
; CHECK-NEXT: abs v0.4h, v0.4h
292+
; CHECK-NEXT: umov w0, v0.h[0]
293+
; CHECK-NEXT: umov w1, v0.h[1]
294+
; CHECK-NEXT: umov w2, v0.h[2]
295+
; CHECK-NEXT: ret
296+
%3 = call <3 x i8> @llvm.abs.v3i8(<3 x i8> %0, i1 0)
297+
ret <3 x i8> %3
298+
}
299+
declare <3 x i8> @llvm.abs.v3i8(<3 x i8>, i1)
300+
301+
define <7 x i8> @abs_v7i8(<7 x i8> %0){
302+
; CHECK-LABEL: abs_v7i8:
303+
; CHECK: // %bb.0:
304+
; CHECK-NEXT: abs v0.8b, v0.8b
305+
; CHECK-NEXT: ret
306+
%3 = call <7 x i8> @llvm.abs.v7i8(<7 x i8> %0, i1 0)
307+
ret <7 x i8> %3
308+
}
309+
declare <7 x i8> @llvm.abs.v7i8(<7 x i8>, i1)
310+
311+
define <3 x i16> @abs_v3i16(<3 x i16> %0){
312+
; CHECK-LABEL: abs_v3i16:
313+
; CHECK: // %bb.0:
314+
; CHECK-NEXT: abs v0.4h, v0.4h
315+
; CHECK-NEXT: ret
316+
%3 = call <3 x i16> @llvm.abs.v3i16(<3 x i16> %0, i1 0)
317+
ret <3 x i16> %3
318+
}
319+
declare <3 x i16> @llvm.abs.v3i16(<3 x i16>, i1)
320+
321+
define <7 x i16> @abs_v7i16(<7 x i16> %0){
322+
; CHECK-LABEL: abs_v7i16:
323+
; CHECK: // %bb.0:
324+
; CHECK-NEXT: abs v0.8h, v0.8h
325+
; CHECK-NEXT: ret
326+
%3 = call <7 x i16> @llvm.abs.v7i16(<7 x i16> %0, i1 0)
327+
ret <7 x i16> %3
328+
}
329+
declare <7 x i16> @llvm.abs.v7i16(<7 x i16>, i1)
330+
331+
define <3 x i32> @abs_v3i32(<3 x i32> %0){
332+
; CHECK-LABEL: abs_v3i32:
333+
; CHECK: // %bb.0:
334+
; CHECK-NEXT: abs v0.4s, v0.4s
335+
; CHECK-NEXT: ret
336+
%3 = call <3 x i32> @llvm.abs.v3i32(<3 x i32> %0, i1 0)
337+
ret <3 x i32> %3
338+
}
339+
declare <3 x i32> @llvm.abs.v3i32(<3 x i32>, i1)

llvm/test/CodeGen/AArch64/vecreduce-add.ll

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,13 @@
44
; RUN: llc -mtriple=aarch64-none-linux-gnu -global-isel -global-isel-abort=2 %s -o - 2>&1 | FileCheck %s --check-prefixes=CHECK,CHECK-GI,CHECK-GI-BASE
55
; RUN: llc -mtriple=aarch64-none-linux-gnu -global-isel -global-isel-abort=2 %s -o - -mattr=+dotprod 2>&1 | FileCheck %s --check-prefixes=CHECK,CHECK-GI,CHECK-GI-DOT
66

7-
; CHECK-GI-BASE: warning: Instruction selection used fallback path for full
7+
; CHECK-GI-BASE: warning: Instruction selection used fallback path for test_udot_v24i8
8+
; CHECK-GI-BASE-NEXT: warning: Instruction selection used fallback path for test_udot_v48i8
9+
; CHECK-GI-BASE-NEXT: warning: Instruction selection used fallback path for test_sdot_v24i8
10+
; CHECK-GI-BASE-NEXT: warning: Instruction selection used fallback path for test_sdot_v48i8
11+
; CHECK-GI-BASE-NEXT: warning: Instruction selection used fallback path for full
12+
13+
; CHECK-GI-DOT: warning: Instruction selection used fallback path for full
814

915
define i32 @addv_v2i32(<2 x i32> %a) {
1016
; CHECK-LABEL: addv_v2i32:

0 commit comments

Comments
 (0)