Skip to content

Commit 06105f2

Browse files
committed
Pre-commit test cases missing SSHLSAT/USHLSAT folds. NFC
1 parent 7fe4fa9 commit 06105f2

File tree

2 files changed

+365
-0
lines changed

2 files changed

+365
-0
lines changed

llvm/test/CodeGen/AArch64/sshl_sat.ll

Lines changed: 210 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,210 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2+
; RUN: llc < %s -mtriple=aarch64-- | FileCheck %s
3+
4+
declare i16 @llvm.sshl.sat.i16(i16, i16)
5+
declare <4 x i16> @llvm.sshl.sat.v4i16(<4 x i16>, <4 x i16>)
6+
7+
; fold (shlsat undef, x) -> 0
8+
define i16 @combine_shl_undef(i16 %x, i16 %y) nounwind {
9+
; CHECK-LABEL: combine_shl_undef:
10+
; CHECK: // %bb.0:
11+
; CHECK-NEXT: mov w8, wzr
12+
; CHECK-NEXT: mov w9, #-2147483648
13+
; CHECK-NEXT: cmp w8, #0
14+
; CHECK-NEXT: cinv w9, w9, ge
15+
; CHECK-NEXT: csel w8, w9, w8, ne
16+
; CHECK-NEXT: asr w0, w8, #16
17+
; CHECK-NEXT: ret
18+
%tmp = call i16 @llvm.sshl.sat.i16(i16 undef, i16 %y)
19+
ret i16 %tmp
20+
}
21+
22+
; fold (shlsat x, undef) -> undef
23+
define i16 @combine_shl_by_undef(i16 %x, i16 %y) nounwind {
24+
; CHECK-LABEL: combine_shl_by_undef:
25+
; CHECK: // %bb.0:
26+
; CHECK-NEXT: lsl w9, w0, #16
27+
; CHECK-NEXT: mov w8, #-2147483648
28+
; CHECK-NEXT: cmp w9, #0
29+
; CHECK-NEXT: cinv w8, w8, ge
30+
; CHECK-NEXT: cmp w9, w9
31+
; CHECK-NEXT: csel w8, w8, w9, ne
32+
; CHECK-NEXT: asr w0, w8, #16
33+
; CHECK-NEXT: ret
34+
%tmp = call i16 @llvm.sshl.sat.i16(i16 %x, i16 undef)
35+
ret i16 %tmp
36+
}
37+
38+
; fold (shlsat poison, x) -> 0
39+
define i16 @combine_shl_poison(i16 %x, i16 %y) nounwind {
40+
; CHECK-LABEL: combine_shl_poison:
41+
; CHECK: // %bb.0:
42+
; CHECK-NEXT: mov w8, wzr
43+
; CHECK-NEXT: mov w9, #-2147483648
44+
; CHECK-NEXT: cmp w8, #0
45+
; CHECK-NEXT: cinv w9, w9, ge
46+
; CHECK-NEXT: csel w8, w9, w8, ne
47+
; CHECK-NEXT: asr w0, w8, #16
48+
; CHECK-NEXT: ret
49+
%tmp = call i16 @llvm.sshl.sat.i16(i16 poison, i16 %y)
50+
ret i16 %tmp
51+
}
52+
53+
; fold (shlsat x, poison) -> undef
54+
define i16 @combine_shl_by_poison(i16 %x, i16 %y) nounwind {
55+
; CHECK-LABEL: combine_shl_by_poison:
56+
; CHECK: // %bb.0:
57+
; CHECK-NEXT: lsl w9, w0, #16
58+
; CHECK-NEXT: mov w8, #-2147483648
59+
; CHECK-NEXT: cmp w9, #0
60+
; CHECK-NEXT: cinv w8, w8, ge
61+
; CHECK-NEXT: cmp w9, w9
62+
; CHECK-NEXT: csel w8, w8, w9, ne
63+
; CHECK-NEXT: asr w0, w8, #16
64+
; CHECK-NEXT: ret
65+
%tmp = call i16 @llvm.sshl.sat.i16(i16 %x, i16 poison)
66+
ret i16 %tmp
67+
}
68+
69+
; fold (shlsat x, bitwidth) -> undef
70+
define i16 @combine_shl_by_bitwidth(i16 %x, i16 %y) nounwind {
71+
; CHECK-LABEL: combine_shl_by_bitwidth:
72+
; CHECK: // %bb.0:
73+
; CHECK-NEXT: lsl w9, w0, #16
74+
; CHECK-NEXT: mov w8, #-2147483648
75+
; CHECK-NEXT: cmp w9, #0
76+
; CHECK-NEXT: cinv w8, w8, ge
77+
; CHECK-NEXT: csel w8, w8, wzr, ne
78+
; CHECK-NEXT: asr w0, w8, #16
79+
; CHECK-NEXT: ret
80+
%tmp = call i16 @llvm.sshl.sat.i16(i16 %x, i16 16)
81+
ret i16 %tmp
82+
}
83+
84+
; fold (shlsat 0, x) -> 0
85+
define i16 @combine_shl_zero(i16 %x, i16 %y) nounwind {
86+
; CHECK-LABEL: combine_shl_zero:
87+
; CHECK: // %bb.0:
88+
; CHECK-NEXT: mov w8, wzr
89+
; CHECK-NEXT: mov w9, #-2147483648
90+
; CHECK-NEXT: cmp w8, #0
91+
; CHECK-NEXT: cinv w9, w9, ge
92+
; CHECK-NEXT: csel w8, w9, w8, ne
93+
; CHECK-NEXT: asr w0, w8, #16
94+
; CHECK-NEXT: ret
95+
%tmp = call i16 @llvm.sshl.sat.i16(i16 0, i16 %y)
96+
ret i16 %tmp
97+
}
98+
99+
; fold (shlsat x, 0) -> x
100+
define i16 @combine_shlsat_by_zero(i16 %x, i16 %y) nounwind {
101+
; CHECK-LABEL: combine_shlsat_by_zero:
102+
; CHECK: // %bb.0:
103+
; CHECK-NEXT: lsl w9, w0, #16
104+
; CHECK-NEXT: mov w8, #-2147483648
105+
; CHECK-NEXT: cmp w9, #0
106+
; CHECK-NEXT: cinv w8, w8, ge
107+
; CHECK-NEXT: cmp w9, w9
108+
; CHECK-NEXT: csel w8, w8, w9, ne
109+
; CHECK-NEXT: asr w0, w8, #16
110+
; CHECK-NEXT: ret
111+
%tmp = call i16 @llvm.sshl.sat.i16(i16 %x, i16 0)
112+
ret i16 %tmp
113+
}
114+
115+
; fold (shlsat c1, c2) -> c3
116+
define i16 @combine_shlsat_constfold(i16 %x, i16 %y) nounwind {
117+
; CHECK-LABEL: combine_shlsat_constfold:
118+
; CHECK: // %bb.0:
119+
; CHECK-NEXT: mov w8, #524288
120+
; CHECK-NEXT: mov w9, #-2147483648
121+
; CHECK-NEXT: cmp w8, #0
122+
; CHECK-NEXT: cinv w9, w9, ge
123+
; CHECK-NEXT: cmp w8, #128, lsl #12 // =524288
124+
; CHECK-NEXT: mov w8, #2097152
125+
; CHECK-NEXT: csel w8, w9, w8, ne
126+
; CHECK-NEXT: asr w0, w8, #16
127+
; CHECK-NEXT: ret
128+
%tmp = call i16 @llvm.sshl.sat.i16(i16 8, i16 2)
129+
ret i16 %tmp
130+
}
131+
132+
; fold (shlsat c1, c2) -> sat max
133+
define i16 @combine_shlsat_satmax(i16 %x, i16 %y) nounwind {
134+
; CHECK-LABEL: combine_shlsat_satmax:
135+
; CHECK: // %bb.0:
136+
; CHECK-NEXT: mov w8, #524288
137+
; CHECK-NEXT: cmp w8, #0
138+
; CHECK-NEXT: mov w8, #-2147483648
139+
; CHECK-NEXT: cinv w8, w8, ge
140+
; CHECK-NEXT: csel w8, w8, wzr, ne
141+
; CHECK-NEXT: asr w0, w8, #16
142+
; CHECK-NEXT: ret
143+
%tmp = call i16 @llvm.sshl.sat.i16(i16 8, i16 15)
144+
ret i16 %tmp
145+
}
146+
147+
; fold (shlsat c1, c2) -> sat min
148+
define i16 @combine_shlsat_satmin(i16 %x, i16 %y) nounwind {
149+
; CHECK-LABEL: combine_shlsat_satmin:
150+
; CHECK: // %bb.0:
151+
; CHECK-NEXT: mov w8, #-524288
152+
; CHECK-NEXT: cmp w8, #0
153+
; CHECK-NEXT: mov w8, #-2147483648
154+
; CHECK-NEXT: cinv w8, w8, ge
155+
; CHECK-NEXT: csel w8, w8, wzr, ne
156+
; CHECK-NEXT: asr w0, w8, #16
157+
; CHECK-NEXT: ret
158+
%tmp = call i16 @llvm.sshl.sat.i16(i16 -8, i16 15)
159+
ret i16 %tmp
160+
}
161+
162+
declare void @sink4xi16(i16, i16, i16, i16)
163+
164+
; fold (shlsat c1, c2) -> c3 , c1/c2/c3 being vectors
165+
define void @combine_shlsat_vector() nounwind {
166+
; CHECK-LABEL: combine_shlsat_vector:
167+
; CHECK: // %bb.0:
168+
; CHECK-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill
169+
; CHECK-NEXT: mov w8, #524288
170+
; CHECK-NEXT: mov w9, #-2147483648
171+
; CHECK-NEXT: cmp w8, #0
172+
; CHECK-NEXT: cinv w10, w9, ge
173+
; CHECK-NEXT: csel w11, w10, wzr, ne
174+
; CHECK-NEXT: cmp w8, #128, lsl #12 // =524288
175+
; CHECK-NEXT: mov w8, #2097152
176+
; CHECK-NEXT: asr w11, w11, #16
177+
; CHECK-NEXT: csel w8, w10, w8, ne
178+
; CHECK-NEXT: mov w10, #-524288
179+
; CHECK-NEXT: asr w8, w8, #16
180+
; CHECK-NEXT: cmp w10, #0
181+
; CHECK-NEXT: cinv w9, w9, ge
182+
; CHECK-NEXT: fmov s0, w8
183+
; CHECK-NEXT: csel w8, w9, wzr, ne
184+
; CHECK-NEXT: cmn w10, #128, lsl #12 // =524288
185+
; CHECK-NEXT: mov w10, #-2097152
186+
; CHECK-NEXT: csel w9, w9, w10, ne
187+
; CHECK-NEXT: asr w8, w8, #16
188+
; CHECK-NEXT: mov v0.h[1], w11
189+
; CHECK-NEXT: asr w9, w9, #16
190+
; CHECK-NEXT: mov v0.h[2], w9
191+
; CHECK-NEXT: mov v0.h[3], w8
192+
; CHECK-NEXT: umov w0, v0.h[0]
193+
; CHECK-NEXT: umov w1, v0.h[1]
194+
; CHECK-NEXT: umov w2, v0.h[2]
195+
; CHECK-NEXT: umov w3, v0.h[3]
196+
; CHECK-NEXT: bl sink4xi16
197+
; CHECK-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload
198+
; CHECK-NEXT: ret
199+
%tmp = call <4 x i16> @llvm.sshl.sat.v4i16(
200+
<4 x i16><i16 8, i16 8, i16 -8, i16 -8>,
201+
<4 x i16><i16 2, i16 15, i16 2, i16 15>)
202+
; Pass elements as arguments in a call to get CHECK statements that verify
203+
; the constant folding.
204+
%e0 = extractelement <4 x i16> %tmp, i16 0
205+
%e1 = extractelement <4 x i16> %tmp, i16 1
206+
%e2 = extractelement <4 x i16> %tmp, i16 2
207+
%e3 = extractelement <4 x i16> %tmp, i16 3
208+
call void @sink4xi16(i16 %e0, i16 %e1, i16 %e2, i16 %e3)
209+
ret void
210+
}

llvm/test/CodeGen/AArch64/ushl_sat.ll

Lines changed: 155 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,155 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2+
; RUN: llc < %s -mtriple=aarch64-- | FileCheck %s
3+
4+
declare i16 @llvm.ushl.sat.i16(i16, i16)
5+
declare <2 x i16> @llvm.ushl.sat.v2i16(<2 x i16>, <2 x i16>)
6+
7+
; fold (shlsat undef, x) -> 0
8+
define i16 @combine_shl_undef(i16 %x, i16 %y) nounwind {
9+
; CHECK-LABEL: combine_shl_undef:
10+
; CHECK: // %bb.0:
11+
; CHECK-NEXT: mov w8, wzr
12+
; CHECK-NEXT: cmp w8, #0
13+
; CHECK-NEXT: csetm w8, ne
14+
; CHECK-NEXT: lsr w0, w8, #16
15+
; CHECK-NEXT: ret
16+
%tmp = call i16 @llvm.ushl.sat.i16(i16 undef, i16 %y)
17+
ret i16 %tmp
18+
}
19+
20+
; fold (shlsat x, undef) -> undef
21+
define i16 @combine_shl_by_undef(i16 %x, i16 %y) nounwind {
22+
; CHECK-LABEL: combine_shl_by_undef:
23+
; CHECK: // %bb.0:
24+
; CHECK-NEXT: lsl w8, w0, #16
25+
; CHECK-NEXT: cmp w8, w8
26+
; CHECK-NEXT: csinv w8, w8, wzr, eq
27+
; CHECK-NEXT: lsr w0, w8, #16
28+
; CHECK-NEXT: ret
29+
%tmp = call i16 @llvm.ushl.sat.i16(i16 %x, i16 undef)
30+
ret i16 %tmp
31+
}
32+
33+
; fold (shlsat poison, x) -> 0
34+
define i16 @combine_shl_poison(i16 %x, i16 %y) nounwind {
35+
; CHECK-LABEL: combine_shl_poison:
36+
; CHECK: // %bb.0:
37+
; CHECK-NEXT: mov w8, wzr
38+
; CHECK-NEXT: cmp w8, #0
39+
; CHECK-NEXT: csetm w8, ne
40+
; CHECK-NEXT: lsr w0, w8, #16
41+
; CHECK-NEXT: ret
42+
%tmp = call i16 @llvm.ushl.sat.i16(i16 poison, i16 %y)
43+
ret i16 %tmp
44+
}
45+
46+
; fold (shlsat x, poison) -> undef
47+
define i16 @combine_shl_by_poison(i16 %x, i16 %y) nounwind {
48+
; CHECK-LABEL: combine_shl_by_poison:
49+
; CHECK: // %bb.0:
50+
; CHECK-NEXT: lsl w8, w0, #16
51+
; CHECK-NEXT: cmp w8, w8
52+
; CHECK-NEXT: csinv w8, w8, wzr, eq
53+
; CHECK-NEXT: lsr w0, w8, #16
54+
; CHECK-NEXT: ret
55+
%tmp = call i16 @llvm.ushl.sat.i16(i16 %x, i16 poison)
56+
ret i16 %tmp
57+
}
58+
59+
; fold (shlsat x, bitwidth) -> undef
60+
define i16 @combine_shl_by_bitwidth(i16 %x, i16 %y) nounwind {
61+
; CHECK-LABEL: combine_shl_by_bitwidth:
62+
; CHECK: // %bb.0:
63+
; CHECK-NEXT: lsl w8, w0, #16
64+
; CHECK-NEXT: cmp w8, #0
65+
; CHECK-NEXT: csetm w8, ne
66+
; CHECK-NEXT: lsr w0, w8, #16
67+
; CHECK-NEXT: ret
68+
%tmp = call i16 @llvm.ushl.sat.i16(i16 %x, i16 16)
69+
ret i16 %tmp
70+
}
71+
72+
; fold (ushlsat 0, x) -> 0
73+
define i16 @combine_shl_zero(i16 %x, i16 %y) nounwind {
74+
; CHECK-LABEL: combine_shl_zero:
75+
; CHECK: // %bb.0:
76+
; CHECK-NEXT: mov w8, wzr
77+
; CHECK-NEXT: cmp w8, #0
78+
; CHECK-NEXT: csetm w8, ne
79+
; CHECK-NEXT: lsr w0, w8, #16
80+
; CHECK-NEXT: ret
81+
%tmp = call i16 @llvm.ushl.sat.i16(i16 0, i16 %y)
82+
ret i16 %tmp
83+
}
84+
85+
; fold (ushlsat x, 0) -> x
86+
define i16 @combine_shlsat_by_zero(i16 %x, i16 %y) nounwind {
87+
; CHECK-LABEL: combine_shlsat_by_zero:
88+
; CHECK: // %bb.0:
89+
; CHECK-NEXT: lsl w8, w0, #16
90+
; CHECK-NEXT: cmp w8, w8
91+
; CHECK-NEXT: csinv w8, w8, wzr, eq
92+
; CHECK-NEXT: lsr w0, w8, #16
93+
; CHECK-NEXT: ret
94+
%tmp = call i16 @llvm.ushl.sat.i16(i16 %x, i16 0)
95+
ret i16 %tmp
96+
}
97+
98+
; fold (ushlsat c1, c2) -> c3
99+
define i16 @combine_shlsat_constfold(i16 %x, i16 %y) nounwind {
100+
; CHECK-LABEL: combine_shlsat_constfold:
101+
; CHECK: // %bb.0:
102+
; CHECK-NEXT: mov w8, #524288
103+
; CHECK-NEXT: cmp w8, #128, lsl #12 // =524288
104+
; CHECK-NEXT: mov w8, #2097152
105+
; CHECK-NEXT: csinv w8, w8, wzr, eq
106+
; CHECK-NEXT: lsr w0, w8, #16
107+
; CHECK-NEXT: ret
108+
%tmp = call i16 @llvm.ushl.sat.i16(i16 8, i16 2)
109+
ret i16 %tmp
110+
}
111+
112+
; fold (ushlsat c1, c2) -> sat max
113+
define i16 @combine_shlsat_satmax(i16 %x, i16 %y) nounwind {
114+
; CHECK-LABEL: combine_shlsat_satmax:
115+
; CHECK: // %bb.0:
116+
; CHECK-NEXT: mov w8, #524288
117+
; CHECK-NEXT: cmp w8, #0
118+
; CHECK-NEXT: csetm w8, ne
119+
; CHECK-NEXT: lsr w0, w8, #16
120+
; CHECK-NEXT: ret
121+
%tmp = call i16 @llvm.ushl.sat.i16(i16 8, i16 15)
122+
ret i16 %tmp
123+
}
124+
125+
126+
declare void @sink2xi16(i16, i16)
127+
128+
; fold (ushlsat c1, c2) -> c3 , c1/c2/c3 being vectors
129+
define void @combine_shlsat_vector() nounwind {
130+
; CHECK-LABEL: combine_shlsat_vector:
131+
; CHECK: // %bb.0:
132+
; CHECK-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill
133+
; CHECK-NEXT: mov w8, #524288
134+
; CHECK-NEXT: mov w9, #2097152
135+
; CHECK-NEXT: cmp w8, #128, lsl #12 // =524288
136+
; CHECK-NEXT: csinv w9, w9, wzr, eq
137+
; CHECK-NEXT: cmp w8, #0
138+
; CHECK-NEXT: csetm w8, ne
139+
; CHECK-NEXT: fmov s0, w9
140+
; CHECK-NEXT: mov v0.s[1], w8
141+
; CHECK-NEXT: ushr v0.2s, v0.2s, #16
142+
; CHECK-NEXT: mov w1, v0.s[1]
143+
; CHECK-NEXT: fmov w0, s0
144+
; CHECK-NEXT: bl sink2xi16
145+
; CHECK-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload
146+
; CHECK-NEXT: ret
147+
%tmp = call <2 x i16> @llvm.ushl.sat.v2i16(<2 x i16><i16 8, i16 8>,
148+
<2 x i16><i16 2, i16 15>)
149+
; Pass elements as arguments in a call to get CHECK statements that verify
150+
; the constant folding.
151+
%e0 = extractelement <2 x i16> %tmp, i16 0
152+
%e1 = extractelement <2 x i16> %tmp, i16 1
153+
call void @sink2xi16(i16 %e0, i16 %e1)
154+
ret void
155+
}

0 commit comments

Comments
 (0)