Skip to content

Commit e91c3b4

Browse files
committed
[AArch64] Add Tests for CSEL with Common Subexpression after Reassociation; NFC
1 parent 16d19aa commit e91c3b4

File tree

1 file changed

+397
-0
lines changed

1 file changed

+397
-0
lines changed
Lines changed: 397 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,397 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
2+
; RUN: llc -mtriple=aarch64-unknown-unknown < %s | FileCheck %s
3+
4+
declare void @use_i1(i1 %x)
5+
declare void @use_i32(i32 %x)
6+
7+
; Based on the IR generated for the `last` method of the type `slice` in Rust
8+
define ptr @test_last_elem_from_ptr(ptr noundef readnone %x0, i64 noundef %x1) {
9+
; CHECK-LABEL: test_last_elem_from_ptr:
10+
; CHECK: // %bb.0:
11+
; CHECK-NEXT: add x8, x0, x1
12+
; CHECK-NEXT: cmp x1, #0
13+
; CHECK-NEXT: sub x8, x8, #1
14+
; CHECK-NEXT: csel x0, xzr, x8, eq
15+
; CHECK-NEXT: ret
16+
%cmp = icmp eq i64 %x1, 0
17+
%add.ptr = getelementptr inbounds nuw i8, ptr %x0, i64 %x1
18+
%add.ptr1 = getelementptr inbounds i8, ptr %add.ptr, i64 -1
19+
%retval.0 = select i1 %cmp, ptr null, ptr %add.ptr1
20+
ret ptr %retval.0
21+
}
22+
23+
define i32 @test_eq0_sub_add_i32(i32 %x0, i32 %x1) {
24+
; CHECK-LABEL: test_eq0_sub_add_i32:
25+
; CHECK: // %bb.0:
26+
; CHECK-NEXT: add w8, w0, w1
27+
; CHECK-NEXT: cmp w1, #0
28+
; CHECK-NEXT: sub w8, w8, #1
29+
; CHECK-NEXT: csel w0, wzr, w8, eq
30+
; CHECK-NEXT: ret
31+
%cmp = icmp eq i32 %x1, 0
32+
%add = add nuw i32 %x0, %x1
33+
%sub = sub i32 %add, 1
34+
%ret = select i1 %cmp, i32 0, i32 %sub
35+
ret i32 %ret
36+
}
37+
38+
define i32 @test_ule7_sub_add_i32(i32 %x0, i32 %x1) {
39+
; CHECK-LABEL: test_ule7_sub_add_i32:
40+
; CHECK: // %bb.0:
41+
; CHECK-NEXT: add w8, w0, w1
42+
; CHECK-NEXT: cmp w1, #8
43+
; CHECK-NEXT: sub w8, w8, #8
44+
; CHECK-NEXT: csel w0, wzr, w8, lo
45+
; CHECK-NEXT: ret
46+
%cmp = icmp ule i32 %x1, 7
47+
%add = add i32 %x0, %x1
48+
%sub = sub i32 %add, 8
49+
%ret = select i1 %cmp, i32 0, i32 %sub
50+
ret i32 %ret
51+
}
52+
53+
define i32 @test_ule0_sub_add_i32(i32 %x0, i32 %x1) {
54+
; CHECK-LABEL: test_ule0_sub_add_i32:
55+
; CHECK: // %bb.0:
56+
; CHECK-NEXT: add w8, w0, w1
57+
; CHECK-NEXT: cmp w1, #0
58+
; CHECK-NEXT: sub w8, w8, #1
59+
; CHECK-NEXT: csel w0, wzr, w8, eq
60+
; CHECK-NEXT: ret
61+
%cmp = icmp ule i32 %x1, 0
62+
%add = add i32 %x0, %x1
63+
%sub = sub i32 %add, 1
64+
%ret = select i1 %cmp, i32 0, i32 %sub
65+
ret i32 %ret
66+
}
67+
68+
define i32 @test_ultminus2_sub_add_i32(i32 %x0, i32 %x1) {
69+
; CHECK-LABEL: test_ultminus2_sub_add_i32:
70+
; CHECK: // %bb.0:
71+
; CHECK-NEXT: add w8, w0, w1
72+
; CHECK-NEXT: cmn w1, #2
73+
; CHECK-NEXT: add w8, w8, #2
74+
; CHECK-NEXT: csel w0, wzr, w8, lo
75+
; CHECK-NEXT: ret
76+
%cmp = icmp ult i32 %x1, -2
77+
%add = add i32 %x0, %x1
78+
%sub = sub i32 %add, -2
79+
%ret = select i1 %cmp, i32 0, i32 %sub
80+
ret i32 %ret
81+
}
82+
83+
define i32 @test_ne0_sub_add_i32(i32 %x0, i32 %x1) {
84+
; CHECK-LABEL: test_ne0_sub_add_i32:
85+
; CHECK: // %bb.0:
86+
; CHECK-NEXT: add w8, w0, w1
87+
; CHECK-NEXT: cmp w1, #0
88+
; CHECK-NEXT: sub w8, w8, #1
89+
; CHECK-NEXT: csel w0, w8, wzr, ne
90+
; CHECK-NEXT: ret
91+
%cmp = icmp ne i32 %x1, 0
92+
%add = add i32 %x0, %x1
93+
%sub = sub i32 %add, 1
94+
%ret = select i1 %cmp, i32 %sub, i32 0
95+
ret i32 %ret
96+
}
97+
98+
define i32 @test_ugt7_sub_add_i32(i32 %x0, i32 %x1) {
99+
; CHECK-LABEL: test_ugt7_sub_add_i32:
100+
; CHECK: // %bb.0:
101+
; CHECK-NEXT: add w8, w0, w1
102+
; CHECK-NEXT: cmp w1, #7
103+
; CHECK-NEXT: sub w8, w8, #8
104+
; CHECK-NEXT: csel w0, wzr, w8, hi
105+
; CHECK-NEXT: ret
106+
%cmp = icmp ugt i32 %x1, 7
107+
%add = add i32 %x0, %x1
108+
%sub = sub i32 %add, 8
109+
%ret = select i1 %cmp, i32 0, i32 %sub
110+
ret i32 %ret
111+
}
112+
113+
define i32 @test_eq0_sub_addcomm_i32(i32 %x0, i32 %x1) {
114+
; CHECK-LABEL: test_eq0_sub_addcomm_i32:
115+
; CHECK: // %bb.0:
116+
; CHECK-NEXT: add w8, w1, w0
117+
; CHECK-NEXT: cmp w1, #0
118+
; CHECK-NEXT: sub w8, w8, #1
119+
; CHECK-NEXT: csel w0, wzr, w8, eq
120+
; CHECK-NEXT: ret
121+
%cmp = icmp eq i32 %x1, 0
122+
%add = add i32 %x1, %x0
123+
%sub = sub i32 %add, 1
124+
%ret = select i1 %cmp, i32 0, i32 %sub
125+
ret i32 %ret
126+
}
127+
128+
define i32 @test_eq0_subcomm_add_i32(i32 %x0, i32 %x1) {
129+
; CHECK-LABEL: test_eq0_subcomm_add_i32:
130+
; CHECK: // %bb.0:
131+
; CHECK-NEXT: add w8, w0, w1
132+
; CHECK-NEXT: cmp w1, #0
133+
; CHECK-NEXT: sub w8, w8, #1
134+
; CHECK-NEXT: csel w0, wzr, w8, eq
135+
; CHECK-NEXT: ret
136+
%cmp = icmp eq i32 %x1, 0
137+
%add = add i32 %x0, %x1
138+
%sub = add i32 -1, %add
139+
%ret = select i1 %cmp, i32 0, i32 %sub
140+
ret i32 %ret
141+
}
142+
143+
define i32 @test_eq0_multi_use_sub_i32(i32 %x0, i32 %x1) {
144+
; CHECK-LABEL: test_eq0_multi_use_sub_i32:
145+
; CHECK: // %bb.0:
146+
; CHECK-NEXT: str x30, [sp, #-32]! // 8-byte Folded Spill
147+
; CHECK-NEXT: stp x20, x19, [sp, #16] // 16-byte Folded Spill
148+
; CHECK-NEXT: .cfi_def_cfa_offset 32
149+
; CHECK-NEXT: .cfi_offset w19, -8
150+
; CHECK-NEXT: .cfi_offset w20, -16
151+
; CHECK-NEXT: .cfi_offset w30, -32
152+
; CHECK-NEXT: add w8, w0, w1
153+
; CHECK-NEXT: mov w19, w1
154+
; CHECK-NEXT: sub w20, w8, #1
155+
; CHECK-NEXT: mov w0, w20
156+
; CHECK-NEXT: bl use_i32
157+
; CHECK-NEXT: cmp w19, #0
158+
; CHECK-NEXT: csel w0, wzr, w20, eq
159+
; CHECK-NEXT: ldp x20, x19, [sp, #16] // 16-byte Folded Reload
160+
; CHECK-NEXT: ldr x30, [sp], #32 // 8-byte Folded Reload
161+
; CHECK-NEXT: ret
162+
%cmp = icmp eq i32 %x1, 0
163+
%add = add nuw i32 %x0, %x1
164+
%sub = sub i32 %add, 1
165+
tail call void @use_i32(i32 %sub)
166+
%ret = select i1 %cmp, i32 0, i32 %sub
167+
ret i32 %ret
168+
}
169+
170+
; Negative test
171+
define i32 @test_eq0_multi_use_cmp_i32(i32 %x0, i32 %x1) {
172+
; CHECK-LABEL: test_eq0_multi_use_cmp_i32:
173+
; CHECK: // %bb.0:
174+
; CHECK-NEXT: stp x30, x19, [sp, #-16]! // 16-byte Folded Spill
175+
; CHECK-NEXT: .cfi_def_cfa_offset 16
176+
; CHECK-NEXT: .cfi_offset w19, -8
177+
; CHECK-NEXT: .cfi_offset w30, -16
178+
; CHECK-NEXT: add w8, w0, w1
179+
; CHECK-NEXT: cmp w1, #0
180+
; CHECK-NEXT: sub w8, w8, #1
181+
; CHECK-NEXT: cset w0, eq
182+
; CHECK-NEXT: csel w19, wzr, w8, eq
183+
; CHECK-NEXT: bl use_i1
184+
; CHECK-NEXT: mov w0, w19
185+
; CHECK-NEXT: ldp x30, x19, [sp], #16 // 16-byte Folded Reload
186+
; CHECK-NEXT: ret
187+
%cmp = icmp eq i32 %x1, 0
188+
tail call void @use_i1(i1 %cmp)
189+
%add = add nuw i32 %x0, %x1
190+
%sub = sub i32 %add, 1
191+
%ret = select i1 %cmp, i32 0, i32 %sub
192+
ret i32 %ret
193+
}
194+
195+
; Negative test
196+
define i32 @test_eq0_multi_use_add_i32(i32 %x0, i32 %x1) {
197+
; CHECK-LABEL: test_eq0_multi_use_add_i32:
198+
; CHECK: // %bb.0:
199+
; CHECK-NEXT: str x30, [sp, #-32]! // 8-byte Folded Spill
200+
; CHECK-NEXT: stp x20, x19, [sp, #16] // 16-byte Folded Spill
201+
; CHECK-NEXT: .cfi_def_cfa_offset 32
202+
; CHECK-NEXT: .cfi_offset w19, -8
203+
; CHECK-NEXT: .cfi_offset w20, -16
204+
; CHECK-NEXT: .cfi_offset w30, -32
205+
; CHECK-NEXT: add w20, w0, w1
206+
; CHECK-NEXT: mov w19, w1
207+
; CHECK-NEXT: mov w0, w20
208+
; CHECK-NEXT: bl use_i32
209+
; CHECK-NEXT: sub w8, w20, #1
210+
; CHECK-NEXT: cmp w19, #0
211+
; CHECK-NEXT: ldp x20, x19, [sp, #16] // 16-byte Folded Reload
212+
; CHECK-NEXT: csel w0, wzr, w8, eq
213+
; CHECK-NEXT: ldr x30, [sp], #32 // 8-byte Folded Reload
214+
; CHECK-NEXT: ret
215+
%cmp = icmp eq i32 %x1, 0
216+
%add = add nuw i32 %x0, %x1
217+
tail call void @use_i32(i32 %add)
218+
%sub = sub i32 %add, 1
219+
%ret = select i1 %cmp, i32 0, i32 %sub
220+
ret i32 %ret
221+
}
222+
223+
; Negative test
224+
define i32 @test_eq1_sub_add_i32(i32 %x0, i32 %x1) {
225+
; CHECK-LABEL: test_eq1_sub_add_i32:
226+
; CHECK: // %bb.0:
227+
; CHECK-NEXT: add w8, w0, w1
228+
; CHECK-NEXT: cmp w1, #1
229+
; CHECK-NEXT: sub w8, w8, #2
230+
; CHECK-NEXT: csel w0, wzr, w8, eq
231+
; CHECK-NEXT: ret
232+
%cmp = icmp eq i32 %x1, 1
233+
%add = add i32 %x0, %x1
234+
%sub = sub i32 %add, 2
235+
%ret = select i1 %cmp, i32 0, i32 %sub
236+
ret i32 %ret
237+
}
238+
239+
; Negative test
240+
define i32 @test_ultminus1_sub_add_i32(i32 %x0, i32 %x1) {
241+
; CHECK-LABEL: test_ultminus1_sub_add_i32:
242+
; CHECK: // %bb.0:
243+
; CHECK-NEXT: add w8, w0, w1
244+
; CHECK-NEXT: cmn w1, #1
245+
; CHECK-NEXT: csinc w0, wzr, w8, ne
246+
; CHECK-NEXT: ret
247+
%cmp = icmp ult i32 %x1, -1
248+
%add = add i32 %x0, %x1
249+
%sub = sub i32 %add, -1
250+
%ret = select i1 %cmp, i32 0, i32 %sub
251+
ret i32 %ret
252+
}
253+
254+
; Negative test
255+
define i32 @test_ugtsmax_sub_add_i32(i32 %x0, i32 %x1) {
256+
; CHECK-LABEL: test_ugtsmax_sub_add_i32:
257+
; CHECK: // %bb.0:
258+
; CHECK-NEXT: mov w8, #-2147483648 // =0x80000000
259+
; CHECK-NEXT: add w9, w0, w1
260+
; CHECK-NEXT: cmp w1, #0
261+
; CHECK-NEXT: add w8, w9, w8
262+
; CHECK-NEXT: csel w0, wzr, w8, lt
263+
; CHECK-NEXT: ret
264+
%cmp = icmp ugt i32 %x1, 2147483647
265+
%add = add i32 %x0, %x1
266+
%sub = sub i32 %add, 2147483648
267+
%ret = select i1 %cmp, i32 0, i32 %sub
268+
ret i32 %ret
269+
}
270+
271+
; Negative test
272+
define i32 @test_ult_nonconst_i32(i32 %x0, i32 %x1, i32 %x2) {
273+
; CHECK-LABEL: test_ult_nonconst_i32:
274+
; CHECK: // %bb.0:
275+
; CHECK-NEXT: add w8, w0, w1
276+
; CHECK-NEXT: cmp w1, w2
277+
; CHECK-NEXT: sub w8, w8, w2
278+
; CHECK-NEXT: csel w0, wzr, w8, lo
279+
; CHECK-NEXT: ret
280+
%cmp = icmp ult i32 %x1, %x2
281+
%add = add i32 %x0, %x1
282+
%sub = sub i32 %add, %x2
283+
%ret = select i1 %cmp, i32 0, i32 %sub
284+
ret i32 %ret
285+
}
286+
287+
; Negative test
288+
define i32 @test_sle7_i32(i32 %x0, i32 %x1) {
289+
; CHECK-LABEL: test_sle7_i32:
290+
; CHECK: // %bb.0:
291+
; CHECK-NEXT: add w8, w0, w1
292+
; CHECK-NEXT: cmp w1, #8
293+
; CHECK-NEXT: sub w8, w8, #8
294+
; CHECK-NEXT: csel w0, wzr, w8, lt
295+
; CHECK-NEXT: ret
296+
%cmp = icmp sle i32 %x1, 7
297+
%add = add i32 %x0, %x1
298+
%sub = sub i32 %add, 8
299+
%ret = select i1 %cmp, i32 0, i32 %sub
300+
ret i32 %ret
301+
}
302+
303+
; Negative test
304+
define i32 @test_eq_const_mismatch_i32(i32 %x0, i32 %x1) {
305+
; CHECK-LABEL: test_eq_const_mismatch_i32:
306+
; CHECK: // %bb.0:
307+
; CHECK-NEXT: add w8, w0, w1
308+
; CHECK-NEXT: cmp w1, #0
309+
; CHECK-NEXT: sub w8, w8, #2
310+
; CHECK-NEXT: csel w0, wzr, w8, eq
311+
; CHECK-NEXT: ret
312+
%cmp = icmp eq i32 %x1, 0
313+
%add = add i32 %x0, %x1
314+
%sub = sub i32 %add, 2
315+
%ret = select i1 %cmp, i32 0, i32 %sub
316+
ret i32 %ret
317+
}
318+
319+
; Negative test
320+
define i32 @test_ne_const_mismatch_i32(i32 %x0, i32 %x1) {
321+
; CHECK-LABEL: test_ne_const_mismatch_i32:
322+
; CHECK: // %bb.0:
323+
; CHECK-NEXT: add w8, w0, w1
324+
; CHECK-NEXT: cmp w1, #0
325+
; CHECK-NEXT: sub w8, w8, #2
326+
; CHECK-NEXT: csel w0, w8, wzr, ne
327+
; CHECK-NEXT: ret
328+
%cmp = icmp ne i32 %x1, 0
329+
%add = add i32 %x0, %x1
330+
%sub = sub i32 %add, 2
331+
%ret = select i1 %cmp, i32 %sub, i32 0
332+
ret i32 %ret
333+
}
334+
335+
; Negative test
336+
define i32 @test_ule7_const_mismatch_i32(i32 %x0, i32 %x1) {
337+
; CHECK-LABEL: test_ule7_const_mismatch_i32:
338+
; CHECK: // %bb.0:
339+
; CHECK-NEXT: add w8, w0, w1
340+
; CHECK-NEXT: cmp w1, #8
341+
; CHECK-NEXT: sub w8, w8, #7
342+
; CHECK-NEXT: csel w0, wzr, w8, lo
343+
; CHECK-NEXT: ret
344+
%cmp = icmp ule i32 %x1, 7
345+
%add = add i32 %x0, %x1
346+
%sub = sub i32 %add, 7
347+
%ret = select i1 %cmp, i32 0, i32 %sub
348+
ret i32 %ret
349+
}
350+
351+
; Negative test
352+
define i32 @test_ugt7_const_mismatch_i32(i32 %x0, i32 %x1) {
353+
; CHECK-LABEL: test_ugt7_const_mismatch_i32:
354+
; CHECK: // %bb.0:
355+
; CHECK-NEXT: add w8, w0, w1
356+
; CHECK-NEXT: cmp w1, #7
357+
; CHECK-NEXT: sub w8, w8, #7
358+
; CHECK-NEXT: csel w0, wzr, w8, hi
359+
; CHECK-NEXT: ret
360+
%cmp = icmp ugt i32 %x1, 7
361+
%add = add i32 %x0, %x1
362+
%sub = sub i32 %add, 7
363+
%ret = select i1 %cmp, i32 0, i32 %sub
364+
ret i32 %ret
365+
}
366+
367+
; Negative test
368+
define i32 @test_unrelated_add_i32(i32 %x0, i32 %x1, i32 %x2) {
369+
; CHECK-LABEL: test_unrelated_add_i32:
370+
; CHECK: // %bb.0:
371+
; CHECK-NEXT: add w8, w0, w2
372+
; CHECK-NEXT: cmp w1, #0
373+
; CHECK-NEXT: sub w8, w8, #1
374+
; CHECK-NEXT: csel w0, wzr, w8, eq
375+
; CHECK-NEXT: ret
376+
%cmp = icmp eq i32 %x1, 0
377+
%add = add nuw i32 %x0, %x2
378+
%sub = sub i32 %add, 1
379+
%ret = select i1 %cmp, i32 0, i32 %sub
380+
ret i32 %ret
381+
}
382+
383+
; Negative test
384+
define i16 @test_eq0_sub_add_i16(i16 %x0, i16 %x1) {
385+
; CHECK-LABEL: test_eq0_sub_add_i16:
386+
; CHECK: // %bb.0:
387+
; CHECK-NEXT: add w8, w0, w1
388+
; CHECK-NEXT: tst w1, #0xffff
389+
; CHECK-NEXT: sub w8, w8, #1
390+
; CHECK-NEXT: csel w0, wzr, w8, eq
391+
; CHECK-NEXT: ret
392+
%cmp = icmp eq i16 %x1, 0
393+
%add = add nuw i16 %x0, %x1
394+
%sub = sub i16 %add, 1
395+
%ret = select i1 %cmp, i16 0, i16 %sub
396+
ret i16 %ret
397+
}

0 commit comments

Comments
 (0)