Skip to content

Commit ec0b332

Browse files
committed
[AArch64] add tests for funnel+or == 0; NFC
These are copied from x86 ( 1074bdf ) to provide more coverage for a potential generic combine.
1 parent 2c6f78d commit ec0b332

File tree

1 file changed

+271
-0
lines changed

1 file changed

+271
-0
lines changed
Lines changed: 271 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,271 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2+
; RUN: llc -mtriple=aarch64-- -o - %s | FileCheck %s
3+
4+
declare i32 @llvm.fshl.i32(i32, i32, i32)
5+
declare i16 @llvm.fshr.i16(i16, i16, i16)
6+
declare i64 @llvm.fshr.i64(i64, i64, i64)
7+
declare <4 x i32> @llvm.fshl.v4i32(<4 x i32>, <4 x i32>, <4 x i32>)
8+
9+
define i1 @fshl_or_eq_0(i32 %x, i32 %y) {
10+
; CHECK-LABEL: fshl_or_eq_0:
11+
; CHECK: // %bb.0:
12+
; CHECK-NEXT: ror w8, w0, #27
13+
; CHECK-NEXT: orr w8, w8, w1, lsl #5
14+
; CHECK-NEXT: cmp w8, #0
15+
; CHECK-NEXT: cset w0, eq
16+
; CHECK-NEXT: ret
17+
%or = or i32 %x, %y
18+
%f = call i32 @llvm.fshl.i32(i32 %or, i32 %x, i32 5)
19+
%r = icmp eq i32 %f, 0
20+
ret i1 %r
21+
}
22+
23+
define i1 @fshl_or_commute_eq_0(i32 %x, i32 %y) {
24+
; CHECK-LABEL: fshl_or_commute_eq_0:
25+
; CHECK: // %bb.0:
26+
; CHECK-NEXT: ror w8, w0, #27
27+
; CHECK-NEXT: orr w8, w8, w1, lsl #5
28+
; CHECK-NEXT: cmp w8, #0
29+
; CHECK-NEXT: cset w0, eq
30+
; CHECK-NEXT: ret
31+
%or = or i32 %y, %x
32+
%f = call i32 @llvm.fshl.i32(i32 %or, i32 %x, i32 5)
33+
%r = icmp eq i32 %f, 0
34+
ret i1 %r
35+
}
36+
37+
define <4 x i1> @fshl_or2_eq_0(<4 x i32> %x, <4 x i32> %y) {
38+
; CHECK-LABEL: fshl_or2_eq_0:
39+
; CHECK: // %bb.0:
40+
; CHECK-NEXT: orr v1.16b, v0.16b, v1.16b
41+
; CHECK-NEXT: shl v0.4s, v0.4s, #25
42+
; CHECK-NEXT: ushr v1.4s, v1.4s, #7
43+
; CHECK-NEXT: orr v0.16b, v0.16b, v1.16b
44+
; CHECK-NEXT: cmeq v0.4s, v0.4s, #0
45+
; CHECK-NEXT: xtn v0.4h, v0.4s
46+
; CHECK-NEXT: ret
47+
%or = or <4 x i32> %x, %y
48+
%f = call <4 x i32> @llvm.fshl.v4i32(<4 x i32> %x, <4 x i32> %or, <4 x i32> <i32 25, i32 25, i32 25, i32 25>)
49+
%r = icmp eq <4 x i32> %f, zeroinitializer
50+
ret <4 x i1> %r
51+
}
52+
53+
define <4 x i1> @fshl_or2_commute_eq_0(<4 x i32> %x, <4 x i32> %y) {
54+
; CHECK-LABEL: fshl_or2_commute_eq_0:
55+
; CHECK: // %bb.0:
56+
; CHECK-NEXT: orr v1.16b, v1.16b, v0.16b
57+
; CHECK-NEXT: shl v0.4s, v0.4s, #25
58+
; CHECK-NEXT: ushr v1.4s, v1.4s, #7
59+
; CHECK-NEXT: orr v0.16b, v0.16b, v1.16b
60+
; CHECK-NEXT: cmeq v0.4s, v0.4s, #0
61+
; CHECK-NEXT: xtn v0.4h, v0.4s
62+
; CHECK-NEXT: ret
63+
%or = or <4 x i32> %y, %x
64+
%f = call <4 x i32> @llvm.fshl.v4i32(<4 x i32> %x, <4 x i32> %or, <4 x i32> <i32 25, i32 25, i32 25, i32 25>)
65+
%r = icmp eq <4 x i32> %f, zeroinitializer
66+
ret <4 x i1> %r
67+
}
68+
69+
define i1 @fshr_or_eq_0(i16 %x, i16 %y) {
70+
; CHECK-LABEL: fshr_or_eq_0:
71+
; CHECK: // %bb.0:
72+
; CHECK-NEXT: lsl w8, w0, #16
73+
; CHECK-NEXT: orr w9, w0, w1
74+
; CHECK-NEXT: extr w8, w9, w8, #24
75+
; CHECK-NEXT: tst w8, #0xffff
76+
; CHECK-NEXT: cset w0, eq
77+
; CHECK-NEXT: ret
78+
%or = or i16 %x, %y
79+
%f = call i16 @llvm.fshr.i16(i16 %or, i16 %x, i16 8)
80+
%r = icmp eq i16 %f, 0
81+
ret i1 %r
82+
}
83+
84+
define i1 @fshr_or_commute_eq_0(i16 %x, i16 %y) {
85+
; CHECK-LABEL: fshr_or_commute_eq_0:
86+
; CHECK: // %bb.0:
87+
; CHECK-NEXT: lsl w8, w0, #16
88+
; CHECK-NEXT: orr w9, w1, w0
89+
; CHECK-NEXT: extr w8, w9, w8, #24
90+
; CHECK-NEXT: tst w8, #0xffff
91+
; CHECK-NEXT: cset w0, eq
92+
; CHECK-NEXT: ret
93+
%or = or i16 %y, %x
94+
%f = call i16 @llvm.fshr.i16(i16 %or, i16 %x, i16 8)
95+
%r = icmp eq i16 %f, 0
96+
ret i1 %r
97+
}
98+
99+
define i1 @fshr_or2_eq_0(i64 %x, i64 %y) {
100+
; CHECK-LABEL: fshr_or2_eq_0:
101+
; CHECK: // %bb.0:
102+
; CHECK-NEXT: ror x8, x0, #3
103+
; CHECK-NEXT: orr x8, x8, x1, lsr #3
104+
; CHECK-NEXT: cmp x8, #0
105+
; CHECK-NEXT: cset w0, eq
106+
; CHECK-NEXT: ret
107+
%or = or i64 %x, %y
108+
%f = call i64 @llvm.fshr.i64(i64 %x, i64 %or, i64 3)
109+
%r = icmp eq i64 %f, 0
110+
ret i1 %r
111+
}
112+
113+
define i1 @fshl_or_ne_0(i32 %x, i32 %y) {
114+
; CHECK-LABEL: fshl_or_ne_0:
115+
; CHECK: // %bb.0:
116+
; CHECK-NEXT: ror w8, w0, #25
117+
; CHECK-NEXT: orr w8, w8, w1, lsl #7
118+
; CHECK-NEXT: cmp w8, #0
119+
; CHECK-NEXT: cset w0, ne
120+
; CHECK-NEXT: ret
121+
%or = or i32 %x, %y
122+
%f = call i32 @llvm.fshl.i32(i32 %or, i32 %x, i32 7)
123+
%r = icmp ne i32 %f, 0
124+
ret i1 %r
125+
}
126+
127+
define i1 @fshl_or_commute_ne_0(i32 %x, i32 %y) {
128+
; CHECK-LABEL: fshl_or_commute_ne_0:
129+
; CHECK: // %bb.0:
130+
; CHECK-NEXT: ror w8, w0, #25
131+
; CHECK-NEXT: orr w8, w8, w1, lsl #7
132+
; CHECK-NEXT: cmp w8, #0
133+
; CHECK-NEXT: cset w0, ne
134+
; CHECK-NEXT: ret
135+
%or = or i32 %y, %x
136+
%f = call i32 @llvm.fshl.i32(i32 %or, i32 %x, i32 7)
137+
%r = icmp ne i32 %f, 0
138+
ret i1 %r
139+
}
140+
141+
define <4 x i1> @fshl_or2_ne_0(<4 x i32> %x, <4 x i32> %y) {
142+
; CHECK-LABEL: fshl_or2_ne_0:
143+
; CHECK: // %bb.0:
144+
; CHECK-NEXT: orr v1.16b, v0.16b, v1.16b
145+
; CHECK-NEXT: shl v0.4s, v0.4s, #5
146+
; CHECK-NEXT: ushr v1.4s, v1.4s, #27
147+
; CHECK-NEXT: orr v0.16b, v0.16b, v1.16b
148+
; CHECK-NEXT: cmtst v0.4s, v0.4s, v0.4s
149+
; CHECK-NEXT: xtn v0.4h, v0.4s
150+
; CHECK-NEXT: ret
151+
%or = or <4 x i32> %x, %y
152+
%f = call <4 x i32> @llvm.fshl.v4i32(<4 x i32> %x, <4 x i32> %or, <4 x i32> <i32 5, i32 5, i32 5, i32 5>)
153+
%r = icmp ne <4 x i32> %f, zeroinitializer
154+
ret <4 x i1> %r
155+
}
156+
157+
define <4 x i1> @fshl_or2_commute_ne_0(<4 x i32> %x, <4 x i32> %y) {
158+
; CHECK-LABEL: fshl_or2_commute_ne_0:
159+
; CHECK: // %bb.0:
160+
; CHECK-NEXT: orr v1.16b, v1.16b, v0.16b
161+
; CHECK-NEXT: shl v0.4s, v0.4s, #5
162+
; CHECK-NEXT: ushr v1.4s, v1.4s, #27
163+
; CHECK-NEXT: orr v0.16b, v0.16b, v1.16b
164+
; CHECK-NEXT: cmtst v0.4s, v0.4s, v0.4s
165+
; CHECK-NEXT: xtn v0.4h, v0.4s
166+
; CHECK-NEXT: ret
167+
%or = or <4 x i32> %y, %x
168+
%f = call <4 x i32> @llvm.fshl.v4i32(<4 x i32> %x, <4 x i32> %or, <4 x i32> <i32 5, i32 5, i32 5, i32 5>)
169+
%r = icmp ne <4 x i32> %f, zeroinitializer
170+
ret <4 x i1> %r
171+
}
172+
173+
define i1 @fshr_or_ne_0(i64 %x, i64 %y) {
174+
; CHECK-LABEL: fshr_or_ne_0:
175+
; CHECK: // %bb.0:
176+
; CHECK-NEXT: orr w8, w0, w1
177+
; CHECK-NEXT: extr x8, x8, x0, #1
178+
; CHECK-NEXT: cmp x8, #0
179+
; CHECK-NEXT: cset w0, ne
180+
; CHECK-NEXT: ret
181+
%or = or i64 %x, %y
182+
%f = call i64 @llvm.fshr.i64(i64 %or, i64 %x, i64 1)
183+
%r = icmp ne i64 %f, 0
184+
ret i1 %r
185+
}
186+
187+
define i1 @fshr_or_commute_ne_0(i64 %x, i64 %y) {
188+
; CHECK-LABEL: fshr_or_commute_ne_0:
189+
; CHECK: // %bb.0:
190+
; CHECK-NEXT: orr w8, w1, w0
191+
; CHECK-NEXT: extr x8, x8, x0, #1
192+
; CHECK-NEXT: cmp x8, #0
193+
; CHECK-NEXT: cset w0, ne
194+
; CHECK-NEXT: ret
195+
%or = or i64 %y, %x
196+
%f = call i64 @llvm.fshr.i64(i64 %or, i64 %x, i64 1)
197+
%r = icmp ne i64 %f, 0
198+
ret i1 %r
199+
}
200+
201+
define i1 @fshr_or2_ne_0(i16 %x, i16 %y) {
202+
; CHECK-LABEL: fshr_or2_ne_0:
203+
; CHECK: // %bb.0:
204+
; CHECK-NEXT: orr w8, w0, w1
205+
; CHECK-NEXT: lsl w8, w8, #16
206+
; CHECK-NEXT: extr w8, w0, w8, #18
207+
; CHECK-NEXT: tst w8, #0xffff
208+
; CHECK-NEXT: cset w0, ne
209+
; CHECK-NEXT: ret
210+
%or = or i16 %x, %y
211+
%f = call i16 @llvm.fshr.i16(i16 %x, i16 %or, i16 2)
212+
%r = icmp ne i16 %f, 0
213+
ret i1 %r
214+
}
215+
216+
define i1 @fshr_or2_commute_ne_0(i16 %x, i16 %y) {
217+
; CHECK-LABEL: fshr_or2_commute_ne_0:
218+
; CHECK: // %bb.0:
219+
; CHECK-NEXT: orr w8, w1, w0
220+
; CHECK-NEXT: lsl w8, w8, #16
221+
; CHECK-NEXT: extr w8, w0, w8, #18
222+
; CHECK-NEXT: tst w8, #0xffff
223+
; CHECK-NEXT: cset w0, ne
224+
; CHECK-NEXT: ret
225+
%or = or i16 %y, %x
226+
%f = call i16 @llvm.fshr.i16(i16 %x, i16 %or, i16 2)
227+
%r = icmp ne i16 %f, 0
228+
ret i1 %r
229+
}
230+
231+
define i1 @fshl_xor_eq_0(i32 %x, i32 %y) {
232+
; CHECK-LABEL: fshl_xor_eq_0:
233+
; CHECK: // %bb.0:
234+
; CHECK-NEXT: eor w8, w0, w1
235+
; CHECK-NEXT: extr w8, w8, w0, #30
236+
; CHECK-NEXT: cmp w8, #0
237+
; CHECK-NEXT: cset w0, eq
238+
; CHECK-NEXT: ret
239+
%or = xor i32 %x, %y
240+
%f = call i32 @llvm.fshl.i32(i32 %or, i32 %x, i32 2)
241+
%r = icmp eq i32 %f, 0
242+
ret i1 %r
243+
}
244+
245+
define i1 @fshl_or_sgt_0(i32 %x, i32 %y) {
246+
; CHECK-LABEL: fshl_or_sgt_0:
247+
; CHECK: // %bb.0:
248+
; CHECK-NEXT: ror w8, w0, #30
249+
; CHECK-NEXT: orr w8, w8, w1, lsl #2
250+
; CHECK-NEXT: cmp w8, #0
251+
; CHECK-NEXT: cset w0, gt
252+
; CHECK-NEXT: ret
253+
%or = or i32 %x, %y
254+
%f = call i32 @llvm.fshl.i32(i32 %or, i32 %x, i32 2)
255+
%r = icmp sgt i32 %f, 0
256+
ret i1 %r
257+
}
258+
259+
define i1 @fshl_or_ne_2(i32 %x, i32 %y) {
260+
; CHECK-LABEL: fshl_or_ne_2:
261+
; CHECK: // %bb.0:
262+
; CHECK-NEXT: ror w8, w0, #30
263+
; CHECK-NEXT: orr w8, w8, w1, lsl #2
264+
; CHECK-NEXT: cmp w8, #2
265+
; CHECK-NEXT: cset w0, ne
266+
; CHECK-NEXT: ret
267+
%or = or i32 %x, %y
268+
%f = call i32 @llvm.fshl.i32(i32 %or, i32 %x, i32 2)
269+
%r = icmp ne i32 %f, 2
270+
ret i1 %r
271+
}

0 commit comments

Comments
 (0)