Skip to content

Commit e9702ce

Browse files
committed
[AArch64] Add some tests for icmp eq chains of loads. NFC
1 parent 808a5f1 commit e9702ce

File tree

1 file changed

+282
-0
lines changed

1 file changed

+282
-0
lines changed
Lines changed: 282 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,282 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2+
; RUN: llc -mtriple=aarch64 %s -o - | FileCheck %s
3+
4+
define i1 @loadzext_i8i8(ptr %p) {
5+
; CHECK-LABEL: loadzext_i8i8:
6+
; CHECK: // %bb.0:
7+
; CHECK-NEXT: ldrb w8, [x0]
8+
; CHECK-NEXT: ldrb w9, [x0, #1]
9+
; CHECK-NEXT: orr w8, w8, w9
10+
; CHECK-NEXT: cmp w8, #0
11+
; CHECK-NEXT: cset w0, eq
12+
; CHECK-NEXT: ret
13+
%a = load i8, ptr %p
14+
%q = getelementptr i8, ptr %p, i64 1
15+
%b = load i8, ptr %q
16+
%az = zext i8 %a to i32
17+
%bz = zext i8 %b to i32
18+
%c = or i32 %az, %bz
19+
%d = icmp eq i32 %c, 0
20+
ret i1 %d
21+
}
22+
23+
define i1 @loadzext_c_i8i8(ptr %p) {
24+
; CHECK-LABEL: loadzext_c_i8i8:
25+
; CHECK: // %bb.0:
26+
; CHECK-NEXT: ldrb w8, [x0]
27+
; CHECK-NEXT: ldrb w9, [x0, #1]
28+
; CHECK-NEXT: orr w8, w9, w8
29+
; CHECK-NEXT: cmp w8, #0
30+
; CHECK-NEXT: cset w0, eq
31+
; CHECK-NEXT: ret
32+
%a = load i8, ptr %p
33+
%q = getelementptr i8, ptr %p, i64 1
34+
%b = load i8, ptr %q
35+
%az = zext i8 %a to i32
36+
%bz = zext i8 %b to i32
37+
%c = or i32 %bz, %az
38+
%d = icmp eq i32 %c, 0
39+
ret i1 %d
40+
}
41+
42+
define i1 @load_i8i8_shift(ptr %p) {
43+
; CHECK-LABEL: load_i8i8_shift:
44+
; CHECK: // %bb.0:
45+
; CHECK-NEXT: ldrh w8, [x0]
46+
; CHECK-NEXT: cmp w8, #0
47+
; CHECK-NEXT: cset w0, eq
48+
; CHECK-NEXT: ret
49+
%a = load i8, ptr %p
50+
%q = getelementptr i8, ptr %p, i64 1
51+
%b = load i8, ptr %q
52+
%az = zext i8 %a to i32
53+
%bz = zext i8 %b to i32
54+
%bs = shl i32 %bz, 8
55+
%c = or i32 %az, %bs
56+
%d = icmp eq i32 %c, 0
57+
ret i1 %d
58+
}
59+
60+
define i1 @loadzext_i8i8i8(ptr %p) {
61+
; CHECK-LABEL: loadzext_i8i8i8:
62+
; CHECK: // %bb.0:
63+
; CHECK-NEXT: ldrb w8, [x0]
64+
; CHECK-NEXT: ldrb w9, [x0, #1]
65+
; CHECK-NEXT: ldrb w10, [x0, #2]
66+
; CHECK-NEXT: orr w8, w8, w9
67+
; CHECK-NEXT: orr w8, w8, w10
68+
; CHECK-NEXT: cmp w8, #0
69+
; CHECK-NEXT: cset w0, eq
70+
; CHECK-NEXT: ret
71+
%a = load i8, ptr %p
72+
%q = getelementptr i8, ptr %p, i64 1
73+
%b = load i8, ptr %q
74+
%r = getelementptr i8, ptr %p, i64 2
75+
%b2 = load i8, ptr %r
76+
%az = zext i8 %a to i32
77+
%bz = zext i8 %b to i32
78+
%b2z = zext i8 %b2 to i32
79+
%c = or i32 %az, %bz
80+
%c2 = or i32 %c, %b2z
81+
%d = icmp eq i32 %c2, 0
82+
ret i1 %d
83+
}
84+
85+
define i1 @loadzext_i8i8i8i8(ptr %p) {
86+
; CHECK-LABEL: loadzext_i8i8i8i8:
87+
; CHECK: // %bb.0:
88+
; CHECK-NEXT: ldrb w8, [x0]
89+
; CHECK-NEXT: ldrb w9, [x0, #1]
90+
; CHECK-NEXT: ldrb w10, [x0, #2]
91+
; CHECK-NEXT: ldrb w11, [x0, #3]
92+
; CHECK-NEXT: orr w8, w8, w9
93+
; CHECK-NEXT: orr w9, w10, w11
94+
; CHECK-NEXT: orr w8, w8, w9
95+
; CHECK-NEXT: cmp w8, #0
96+
; CHECK-NEXT: cset w0, eq
97+
; CHECK-NEXT: ret
98+
%a = load i8, ptr %p
99+
%q = getelementptr i8, ptr %p, i64 1
100+
%b = load i8, ptr %q
101+
%r = getelementptr i8, ptr %p, i64 2
102+
%b2 = load i8, ptr %r
103+
%s = getelementptr i8, ptr %p, i64 3
104+
%b3 = load i8, ptr %s
105+
%az = zext i8 %a to i32
106+
%bz = zext i8 %b to i32
107+
%b2z = zext i8 %b2 to i32
108+
%b3z = zext i8 %b3 to i32
109+
%c = or i32 %az, %bz
110+
%c2 = or i32 %c, %b2z
111+
%c3 = or i32 %c2, %b3z
112+
%d = icmp eq i32 %c3, 0
113+
ret i1 %d
114+
}
115+
116+
define i1 @load_i8i8(ptr %p) {
117+
; CHECK-LABEL: load_i8i8:
118+
; CHECK: // %bb.0:
119+
; CHECK-NEXT: ldrb w8, [x0]
120+
; CHECK-NEXT: ldrb w9, [x0, #1]
121+
; CHECK-NEXT: orr w8, w8, w9
122+
; CHECK-NEXT: cmp w8, #0
123+
; CHECK-NEXT: cset w0, eq
124+
; CHECK-NEXT: ret
125+
%a = load i8, ptr %p
126+
%q = getelementptr i8, ptr %p, i64 1
127+
%b = load i8, ptr %q
128+
%c = or i8 %a, %b
129+
%d = icmp eq i8 %c, 0
130+
ret i1 %d
131+
}
132+
133+
define i1 @load_i16i16(ptr %p) {
134+
; CHECK-LABEL: load_i16i16:
135+
; CHECK: // %bb.0:
136+
; CHECK-NEXT: ldrh w8, [x0]
137+
; CHECK-NEXT: ldrh w9, [x0, #2]
138+
; CHECK-NEXT: orr w8, w8, w9
139+
; CHECK-NEXT: cmp w8, #0
140+
; CHECK-NEXT: cset w0, eq
141+
; CHECK-NEXT: ret
142+
%a = load i16, ptr %p
143+
%q = getelementptr i8, ptr %p, i64 2
144+
%b = load i16, ptr %q
145+
%c = or i16 %a, %b
146+
%d = icmp eq i16 %c, 0
147+
ret i1 %d
148+
}
149+
150+
define i1 @load_i32i32(ptr %p) {
151+
; CHECK-LABEL: load_i32i32:
152+
; CHECK: // %bb.0:
153+
; CHECK-NEXT: ldp w8, w9, [x0]
154+
; CHECK-NEXT: orr w8, w8, w9
155+
; CHECK-NEXT: cmp w8, #0
156+
; CHECK-NEXT: cset w0, eq
157+
; CHECK-NEXT: ret
158+
%a = load i32, ptr %p
159+
%q = getelementptr i8, ptr %p, i64 4
160+
%b = load i32, ptr %q
161+
%c = or i32 %a, %b
162+
%d = icmp eq i32 %c, 0
163+
ret i1 %d
164+
}
165+
166+
define i1 @load_i64i64(ptr %p) {
167+
; CHECK-LABEL: load_i64i64:
168+
; CHECK: // %bb.0:
169+
; CHECK-NEXT: ldp x8, x9, [x0]
170+
; CHECK-NEXT: orr x8, x8, x9
171+
; CHECK-NEXT: cmp x8, #0
172+
; CHECK-NEXT: cset w0, eq
173+
; CHECK-NEXT: ret
174+
%a = load i64, ptr %p
175+
%q = getelementptr i8, ptr %p, i64 8
176+
%b = load i64, ptr %q
177+
%c = or i64 %a, %b
178+
%d = icmp eq i64 %c, 0
179+
ret i1 %d
180+
}
181+
182+
define i1 @load_i8i16i8(ptr %p) {
183+
; CHECK-LABEL: load_i8i16i8:
184+
; CHECK: // %bb.0:
185+
; CHECK-NEXT: ldrb w8, [x0]
186+
; CHECK-NEXT: ldrb w9, [x0, #3]
187+
; CHECK-NEXT: ldurh w10, [x0, #1]
188+
; CHECK-NEXT: orr w8, w8, w9
189+
; CHECK-NEXT: orr w8, w8, w10
190+
; CHECK-NEXT: cmp w8, #0
191+
; CHECK-NEXT: cset w0, eq
192+
; CHECK-NEXT: ret
193+
%l0 = load i8, ptr %p
194+
%q = getelementptr i8, ptr %p, i64 1
195+
%l1 = load i16, ptr %q
196+
%r = getelementptr i8, ptr %p, i64 3
197+
%l3 = load i8, ptr %r
198+
%c = or i8 %l0, %l3
199+
%d = zext i8 %c to i32
200+
%e = zext i16 %l1 to i32
201+
%f = or i32 %d, %e
202+
%g = icmp eq i32 %f, 0
203+
ret i1 %g
204+
}
205+
206+
define i1 @loadzext_i8i8_wrongoff(ptr %p) {
207+
; CHECK-LABEL: loadzext_i8i8_wrongoff:
208+
; CHECK: // %bb.0:
209+
; CHECK-NEXT: ldrb w8, [x0]
210+
; CHECK-NEXT: ldrb w9, [x0, #2]
211+
; CHECK-NEXT: orr w8, w8, w9
212+
; CHECK-NEXT: cmp w8, #0
213+
; CHECK-NEXT: cset w0, eq
214+
; CHECK-NEXT: ret
215+
%a = load i8, ptr %p
216+
%q = getelementptr i8, ptr %p, i64 2
217+
%b = load i8, ptr %q
218+
%az = zext i8 %a to i32
219+
%bz = zext i8 %b to i32
220+
%c = or i32 %az, %bz
221+
%d = icmp eq i32 %c, 0
222+
ret i1 %d
223+
}
224+
225+
define i1 @loadzext_i16i16_wrongoff(ptr %p) {
226+
; CHECK-LABEL: loadzext_i16i16_wrongoff:
227+
; CHECK: // %bb.0:
228+
; CHECK-NEXT: ldrh w8, [x0]
229+
; CHECK-NEXT: ldurh w9, [x0, #1]
230+
; CHECK-NEXT: orr w8, w8, w9
231+
; CHECK-NEXT: cmp w8, #0
232+
; CHECK-NEXT: cset w0, eq
233+
; CHECK-NEXT: ret
234+
%a = load i16, ptr %p
235+
%q = getelementptr i8, ptr %p, i64 1
236+
%b = load i16, ptr %q
237+
%az = zext i16 %a to i32
238+
%bz = zext i16 %b to i32
239+
%c = or i32 %az, %bz
240+
%d = icmp eq i32 %c, 0
241+
ret i1 %d
242+
}
243+
244+
define i1 @loadzext_i16i16_store(ptr %p, ptr %q) {
245+
; CHECK-LABEL: loadzext_i16i16_store:
246+
; CHECK: // %bb.0:
247+
; CHECK-NEXT: ldrh w8, [x0]
248+
; CHECK-NEXT: strb wzr, [x1]
249+
; CHECK-NEXT: ldrh w9, [x0, #2]
250+
; CHECK-NEXT: orr w8, w8, w9
251+
; CHECK-NEXT: cmp w8, #0
252+
; CHECK-NEXT: cset w0, eq
253+
; CHECK-NEXT: ret
254+
%a = load i16, ptr %p
255+
store i8 0, ptr %q
256+
%p2 = getelementptr i8, ptr %p, i64 2
257+
%b = load i16, ptr %p2
258+
%az = zext i16 %a to i32
259+
%bz = zext i16 %b to i32
260+
%c = or i32 %az, %bz
261+
%d = icmp eq i32 %c, 0
262+
ret i1 %d
263+
}
264+
265+
define i1 @loadzext_i16i16_bases(ptr %p, ptr %q) {
266+
; CHECK-LABEL: loadzext_i16i16_bases:
267+
; CHECK: // %bb.0:
268+
; CHECK-NEXT: ldrh w8, [x0]
269+
; CHECK-NEXT: ldrh w9, [x1, #2]
270+
; CHECK-NEXT: orr w8, w8, w9
271+
; CHECK-NEXT: cmp w8, #0
272+
; CHECK-NEXT: cset w0, eq
273+
; CHECK-NEXT: ret
274+
%a = load i16, ptr %p
275+
%p2 = getelementptr i8, ptr %q, i64 2
276+
%b = load i16, ptr %p2
277+
%az = zext i16 %a to i32
278+
%bz = zext i16 %b to i32
279+
%c = or i32 %az, %bz
280+
%d = icmp eq i32 %c, 0
281+
ret i1 %d
282+
}

0 commit comments

Comments
 (0)