Skip to content

Commit e625eb9

Browse files
[NFC] Added tests for D64285
llvm-svn: 365501
1 parent d36e130 commit e625eb9

File tree

1 file changed

+240
-0
lines changed

1 file changed

+240
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,240 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2+
; RUN: opt < %s -instcombine -S | FileCheck %s
3+
4+
define i32 @ashr_lshr_abs(i32 %x, i32 %y) {
5+
; CHECK-LABEL: @ashr_lshr_abs(
6+
; CHECK-NEXT: [[R:%.*]] = ashr i32 [[X:%.*]], [[Y:%.*]]
7+
; CHECK-NEXT: ret i32 [[R]]
8+
;
9+
%cmp = icmp sge i32 %x, 0
10+
%l = lshr i32 %x, %y
11+
%r = ashr i32 %x, %y
12+
%ret = select i1 %cmp, i32 %l, i32 %r
13+
ret i32 %ret
14+
}
15+
16+
define i32 @ashr_lshr_abs_both_exact(i32 %x, i32 %y) {
17+
; CHECK-LABEL: @ashr_lshr_abs(
18+
; CHECK-NEXT: [[R:%.*]] = ashr i32 [[X:%.*]], [[Y:%.*]]
19+
; CHECK-NEXT: ret i32 [[R]]
20+
;
21+
%cmp = icmp sge i32 %x, 0
22+
%l = lshr exact i32 %x, %y
23+
%r = ashr exact i32 %x, %y
24+
%ret = select i1 %cmp, i32 %l, i32 %r
25+
ret i32 %ret
26+
}
27+
28+
define i32 @ashr_lshr_abs2(i32 %x, i32 %y) {
29+
; CHECK-LABEL: @ashr_lshr_abs2(
30+
; CHECK-NEXT: [[R:%.*]] = ashr i32 [[X:%.*]], [[Y:%.*]]
31+
; CHECK-NEXT: ret i32 [[R]]
32+
;
33+
%cmp = icmp sgt i32 %x, -1
34+
%l = lshr i32 %x, %y
35+
%r = ashr i32 %x, %y
36+
%ret = select i1 %cmp, i32 %l, i32 %r
37+
ret i32 %ret
38+
}
39+
40+
define <2 x i32> @ashr_lshr_abs_vec(<2 x i32> %x, <2 x i32> %y) {
41+
; CHECK-LABEL: @ashr_lshr_abs_vec(
42+
; CHECK-NEXT: [[R:%.*]] = ashr <2 x i32> [[X:%.*]], [[Y:%.*]]
43+
; CHECK-NEXT: ret <2 x i32> [[R]]
44+
;
45+
%cmp = icmp sge <2 x i32> %x, zeroinitializer
46+
%l = lshr <2 x i32> %x, %y
47+
%r = ashr <2 x i32> %x, %y
48+
%ret = select <2 x i1> %cmp, <2 x i32> %l, <2 x i32> %r
49+
ret <2 x i32> %ret
50+
}
51+
52+
define i32 @ashr_lshr_nabs2(i32 %x, i32 %y) {
53+
; CHECK-LABEL: @ashr_lshr_nabs2(
54+
; CHECK-NEXT: [[R:%.*]] = ashr i32 [[X:%.*]], [[Y:%.*]]
55+
; CHECK-NEXT: ret i32 [[R]]
56+
;
57+
%cmp = icmp sle i32 %x, 0
58+
%l = lshr i32 %x, %y
59+
%r = ashr i32 %x, %y
60+
%ret = select i1 %cmp, i32 %r, i32 %l
61+
ret i32 %ret
62+
}
63+
64+
define i32 @ashr_lshr_nabs(i32 %x, i32 %y) {
65+
; CHECK-LABEL: @ashr_lshr_nabs(
66+
; CHECK-NEXT: [[R:%.*]] = ashr i32 [[X:%.*]], [[Y:%.*]]
67+
; CHECK-NEXT: ret i32 [[R]]
68+
;
69+
%cmp = icmp slt i32 %x, 1
70+
%l = lshr i32 %x, %y
71+
%r = ashr i32 %x, %y
72+
%ret = select i1 %cmp, i32 %r, i32 %l
73+
ret i32 %ret
74+
}
75+
76+
define <2 x i32> @ashr_lshr_nabs_vec(<2 x i32> %x, <2 x i32> %y) {
77+
; CHECK-LABEL: @ashr_lshr_nabs_vec(
78+
; CHECK-NEXT: [[R:%.*]] = ashr <2 x i32> [[X:%.*]], [[Y:%.*]]
79+
; CHECK-NEXT: ret <2 x i32> [[R]]
80+
;
81+
%cmp = icmp sle <2 x i32> %x, zeroinitializer
82+
%l = lshr <2 x i32> %x, %y
83+
%r = ashr <2 x i32> %x, %y
84+
%ret = select <2 x i1> %cmp, <2 x i32> %r, <2 x i32> %l
85+
ret <2 x i32> %ret
86+
}
87+
88+
89+
; Negative tests
90+
91+
define i32 @ashr_lshr_wrong_abs(i32 %x, i32 %y) {
92+
; CHECK-LABEL: @ashr_lshr_wrong_abs(
93+
; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i32 [[X:%.*]], -2
94+
; CHECK-NEXT: [[L:%.*]] = lshr i32 [[X]], [[Y:%.*]]
95+
; CHECK-NEXT: [[R:%.*]] = ashr i32 [[X]], [[Y]]
96+
; CHECK-NEXT: [[RET:%.*]] = select i1 [[CMP]], i32 [[L]], i32 [[R]]
97+
; CHECK-NEXT: ret i32 [[RET]]
98+
;
99+
%cmp = icmp sge i32 %x, -1
100+
%l = lshr i32 %x, %y
101+
%r = ashr i32 %x, %y
102+
%ret = select i1 %cmp, i32 %l, i32 %r
103+
ret i32 %ret
104+
}
105+
106+
define i32 @ashr_lshr_abs_shift_wrong_pred(i32 %x, i32 %y, i32 %z) {
107+
; CHECK-LABEL: @ashr_lshr_abs_shift_wrong_pred(
108+
; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[X:%.*]], 1
109+
; CHECK-NEXT: [[L:%.*]] = lshr i32 [[X]], [[Y:%.*]]
110+
; CHECK-NEXT: [[R:%.*]] = ashr i32 [[X]], [[Y]]
111+
; CHECK-NEXT: [[RET:%.*]] = select i1 [[CMP]], i32 [[L]], i32 [[R]]
112+
; CHECK-NEXT: ret i32 [[RET]]
113+
;
114+
%cmp = icmp sle i32 %x, 0
115+
%l = lshr i32 %x, %y
116+
%r = ashr i32 %x, %y
117+
%ret = select i1 %cmp, i32 %l, i32 %r
118+
ret i32 %ret
119+
}
120+
121+
define i32 @ashr_lshr_abs_shift_wrong_pred2(i32 %x, i32 %y, i32 %z) {
122+
; CHECK-LABEL: @ashr_lshr_abs_shift_wrong_pred2(
123+
; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i32 [[Z:%.*]], -1
124+
; CHECK-NEXT: [[L:%.*]] = lshr i32 [[X:%.*]], [[Y:%.*]]
125+
; CHECK-NEXT: [[R:%.*]] = ashr i32 [[X]], [[Y]]
126+
; CHECK-NEXT: [[RET:%.*]] = select i1 [[CMP]], i32 [[L]], i32 [[R]]
127+
; CHECK-NEXT: ret i32 [[RET]]
128+
;
129+
%cmp = icmp sge i32 %z, 0
130+
%l = lshr i32 %x, %y
131+
%r = ashr i32 %x, %y
132+
%ret = select i1 %cmp, i32 %l, i32 %r
133+
ret i32 %ret
134+
}
135+
136+
define i32 @ashr_lshr_abs_wrong_operands(i32 %x, i32 %y) {
137+
; CHECK-LABEL: @ashr_lshr_abs_wrong_operands(
138+
; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i32 [[X:%.*]], -1
139+
; CHECK-NEXT: [[L:%.*]] = lshr i32 [[X]], [[Y:%.*]]
140+
; CHECK-NEXT: [[R:%.*]] = ashr i32 [[X]], [[Y]]
141+
; CHECK-NEXT: [[RET:%.*]] = select i1 [[CMP]], i32 [[R]], i32 [[L]]
142+
; CHECK-NEXT: ret i32 [[RET]]
143+
;
144+
%cmp = icmp sge i32 %x, 0
145+
%l = lshr i32 %x, %y
146+
%r = ashr i32 %x, %y
147+
%ret = select i1 %cmp, i32 %r, i32 %l
148+
ret i32 %ret
149+
}
150+
151+
define i32 @ashr_lshr_abs_no_ashr(i32 %x, i32 %y) {
152+
; CHECK-LABEL: @ashr_lshr_abs_no_ashr(
153+
; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i32 [[X:%.*]], -1
154+
; CHECK-NEXT: [[L:%.*]] = lshr i32 [[X]], [[Y:%.*]]
155+
; CHECK-NEXT: [[R:%.*]] = xor i32 [[X]], [[Y]]
156+
; CHECK-NEXT: [[RET:%.*]] = select i1 [[CMP]], i32 [[L]], i32 [[R]]
157+
; CHECK-NEXT: ret i32 [[RET]]
158+
;
159+
%cmp = icmp sge i32 %x, 0
160+
%l = lshr i32 %x, %y
161+
%r = xor i32 %x, %y
162+
%ret = select i1 %cmp, i32 %l, i32 %r
163+
ret i32 %ret
164+
}
165+
166+
define i32 @ashr_lshr_abs_shift_amt_mismatch(i32 %x, i32 %y, i32 %z) {
167+
; CHECK-LABEL: @ashr_lshr_abs_shift_amt_mismatch(
168+
; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i32 [[X:%.*]], -1
169+
; CHECK-NEXT: [[L:%.*]] = lshr i32 [[X]], [[Y:%.*]]
170+
; CHECK-NEXT: [[R:%.*]] = ashr i32 [[X]], [[Z:%.*]]
171+
; CHECK-NEXT: [[RET:%.*]] = select i1 [[CMP]], i32 [[L]], i32 [[R]]
172+
; CHECK-NEXT: ret i32 [[RET]]
173+
;
174+
%cmp = icmp sge i32 %x, 0
175+
%l = lshr i32 %x, %y
176+
%r = ashr i32 %x, %z
177+
%ret = select i1 %cmp, i32 %l, i32 %r
178+
ret i32 %ret
179+
}
180+
181+
define i32 @ashr_lshr_abs_shift_base_mismatch(i32 %x, i32 %y, i32 %z) {
182+
; CHECK-LABEL: @ashr_lshr_abs_shift_base_mismatch(
183+
; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i32 [[X:%.*]], -1
184+
; CHECK-NEXT: [[L:%.*]] = lshr i32 [[X]], [[Y:%.*]]
185+
; CHECK-NEXT: [[R:%.*]] = ashr i32 [[Z:%.*]], [[Y]]
186+
; CHECK-NEXT: [[RET:%.*]] = select i1 [[CMP]], i32 [[L]], i32 [[R]]
187+
; CHECK-NEXT: ret i32 [[RET]]
188+
;
189+
%cmp = icmp sge i32 %x, 0
190+
%l = lshr i32 %x, %y
191+
%r = ashr i32 %z, %y
192+
%ret = select i1 %cmp, i32 %l, i32 %r
193+
ret i32 %ret
194+
}
195+
196+
define i32 @ashr_lshr_abs_no_lshr(i32 %x, i32 %y) {
197+
; CHECK-LABEL: @ashr_lshr_abs_no_lshr(
198+
; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i32 [[X:%.*]], -1
199+
; CHECK-NEXT: [[L:%.*]] = add i32 [[X]], [[Y:%.*]]
200+
; CHECK-NEXT: [[R:%.*]] = ashr i32 [[X]], [[Y]]
201+
; CHECK-NEXT: [[RET:%.*]] = select i1 [[CMP]], i32 [[L]], i32 [[R]]
202+
; CHECK-NEXT: ret i32 [[RET]]
203+
;
204+
%cmp = icmp sge i32 %x, 0
205+
%l = add i32 %x, %y
206+
%r = ashr i32 %x, %y
207+
%ret = select i1 %cmp, i32 %l, i32 %r
208+
ret i32 %ret
209+
}
210+
211+
define <2 x i32> @ashr_lshr_abs_vec_wrong_pred(<2 x i32> %x, <2 x i32> %y) {
212+
; CHECK-LABEL: @ashr_lshr_abs_vec_wrong_pred(
213+
; CHECK-NEXT: [[CMP:%.*]] = icmp slt <2 x i32> [[X:%.*]], <i32 1, i32 1>
214+
; CHECK-NEXT: [[L:%.*]] = lshr <2 x i32> [[X]], [[Y:%.*]]
215+
; CHECK-NEXT: [[R:%.*]] = ashr <2 x i32> [[X]], [[Y]]
216+
; CHECK-NEXT: [[RET:%.*]] = select <2 x i1> [[CMP]], <2 x i32> [[L]], <2 x i32> [[R]]
217+
; CHECK-NEXT: ret <2 x i32> [[RET]]
218+
;
219+
%cmp = icmp sle <2 x i32> %x, zeroinitializer
220+
%l = lshr <2 x i32> %x, %y
221+
%r = ashr <2 x i32> %x, %y
222+
%ret = select <2 x i1> %cmp, <2 x i32> %l, <2 x i32> %r
223+
ret <2 x i32> %ret
224+
}
225+
226+
define <2 x i32> @ashr_lshr_nabs_vec_wrong_pred(<2 x i32> %x, <2 x i32> %y) {
227+
; CHECK-LABEL: @ashr_lshr_nabs_vec_wrong_pred(
228+
; CHECK-NEXT: [[CMP:%.*]] = icmp sgt <2 x i32> [[X:%.*]], <i32 -1, i32 -1>
229+
; CHECK-NEXT: [[L:%.*]] = lshr <2 x i32> [[X]], [[Y:%.*]]
230+
; CHECK-NEXT: [[R:%.*]] = ashr <2 x i32> [[X]], [[Y]]
231+
; CHECK-NEXT: [[RET:%.*]] = select <2 x i1> [[CMP]], <2 x i32> [[R]], <2 x i32> [[L]]
232+
; CHECK-NEXT: ret <2 x i32> [[RET]]
233+
;
234+
%cmp = icmp sge <2 x i32> %x, zeroinitializer
235+
%l = lshr <2 x i32> %x, %y
236+
%r = ashr <2 x i32> %x, %y
237+
%ret = select <2 x i1> %cmp, <2 x i32> %r, <2 x i32> %l
238+
ret <2 x i32> %ret
239+
}
240+

0 commit comments

Comments
 (0)