blob: 33fd978277d4ce477c78087429944c2c93ec804e [file] [log] [blame]
Sanjay Patela4b052c2016-06-19 21:40:12 +00001; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
Duncan Sandsba286d72011-10-26 20:55:21 +00002; RUN: opt < %s -instsimplify -S | FileCheck %s
3
Sanjay Patel308eb222017-02-18 21:51:14 +00004; add nsw (xor X, signbit), signbit --> X
5
6define <2 x i32> @add_nsw_signbit(<2 x i32> %x) {
7; CHECK-LABEL: @add_nsw_signbit(
Sanjay Patelfe672552017-02-18 21:59:09 +00008; CHECK-NEXT: ret <2 x i32> %x
Sanjay Patel308eb222017-02-18 21:51:14 +00009;
10 %y = xor <2 x i32> %x, <i32 -2147483648, i32 -2147483648>
11 %z = add nsw <2 x i32> %y, <i32 -2147483648, i32 -2147483648>
12 ret <2 x i32> %z
13}
14
15; add nuw (xor X, signbit), signbit --> X
16
17define <2 x i5> @add_nuw_signbit(<2 x i5> %x) {
18; CHECK-LABEL: @add_nuw_signbit(
Sanjay Patelfe672552017-02-18 21:59:09 +000019; CHECK-NEXT: ret <2 x i5> %x
Sanjay Patel308eb222017-02-18 21:51:14 +000020;
21 %y = xor <2 x i5> %x, <i5 -16, i5 -16>
22 %z = add nuw <2 x i5> %y, <i5 -16, i5 -16>
23 ret <2 x i5> %z
24}
25
Duncan Sandsba286d72011-10-26 20:55:21 +000026define i64 @pow2(i32 %x) {
Stephen Linc1c7a132013-07-14 01:42:54 +000027; CHECK-LABEL: @pow2(
Sanjay Patela4b052c2016-06-19 21:40:12 +000028; CHECK-NEXT: [[NEGX:%.*]] = sub i32 0, %x
Sanjay Patel69632442016-03-25 20:12:25 +000029; CHECK-NEXT: [[X2:%.*]] = and i32 %x, [[NEGX]]
30; CHECK-NEXT: [[E:%.*]] = zext i32 [[X2]] to i64
31; CHECK-NEXT: ret i64 [[E]]
32;
Duncan Sandsba286d72011-10-26 20:55:21 +000033 %negx = sub i32 0, %x
34 %x2 = and i32 %x, %negx
35 %e = zext i32 %x2 to i64
36 %nege = sub i64 0, %e
37 %e2 = and i64 %e, %nege
38 ret i64 %e2
Duncan Sandsba286d72011-10-26 20:55:21 +000039}
Duncan Sands985ba632011-10-28 18:30:05 +000040
41define i64 @pow2b(i32 %x) {
Stephen Linc1c7a132013-07-14 01:42:54 +000042; CHECK-LABEL: @pow2b(
Sanjay Patela4b052c2016-06-19 21:40:12 +000043; CHECK-NEXT: [[SH:%.*]] = shl i32 2, %x
Sanjay Patel69632442016-03-25 20:12:25 +000044; CHECK-NEXT: [[E:%.*]] = zext i32 [[SH]] to i64
45; CHECK-NEXT: ret i64 [[E]]
46;
Duncan Sands985ba632011-10-28 18:30:05 +000047 %sh = shl i32 2, %x
48 %e = zext i32 %sh to i64
49 %nege = sub i64 0, %e
50 %e2 = and i64 %e, %nege
51 ret i64 %e2
Duncan Sands985ba632011-10-28 18:30:05 +000052}
David Majnemercd4fbcd2014-07-31 04:49:18 +000053
David Majnemera315bd82014-09-15 08:15:28 +000054define i1 @and_of_icmps0(i32 %b) {
55; CHECK-LABEL: @and_of_icmps0(
Sanjay Patela4b052c2016-06-19 21:40:12 +000056; CHECK-NEXT: ret i1 false
Sanjay Patel69632442016-03-25 20:12:25 +000057;
David Majnemera315bd82014-09-15 08:15:28 +000058 %1 = add i32 %b, 2
59 %2 = icmp ult i32 %1, 4
60 %cmp3 = icmp sgt i32 %b, 2
61 %cmp = and i1 %2, %cmp3
62 ret i1 %cmp
David Majnemera315bd82014-09-15 08:15:28 +000063}
64
Sanjay Patel1b312ad2016-09-28 13:53:13 +000065define <2 x i1> @and_of_icmps0_vec(<2 x i32> %b) {
66; CHECK-LABEL: @and_of_icmps0_vec(
67; CHECK-NEXT: ret <2 x i1> zeroinitializer
68;
69 %1 = add <2 x i32> %b, <i32 2, i32 2>
70 %2 = icmp ult <2 x i32> %1, <i32 4, i32 4>
71 %cmp3 = icmp sgt <2 x i32> %b, <i32 2, i32 2>
72 %cmp = and <2 x i1> %2, %cmp3
73 ret <2 x i1> %cmp
74}
75
David Majnemera315bd82014-09-15 08:15:28 +000076define i1 @and_of_icmps1(i32 %b) {
77; CHECK-LABEL: @and_of_icmps1(
Sanjay Patela4b052c2016-06-19 21:40:12 +000078; CHECK-NEXT: ret i1 false
Sanjay Patel69632442016-03-25 20:12:25 +000079;
David Majnemera315bd82014-09-15 08:15:28 +000080 %1 = add nsw i32 %b, 2
81 %2 = icmp slt i32 %1, 4
82 %cmp3 = icmp sgt i32 %b, 2
83 %cmp = and i1 %2, %cmp3
84 ret i1 %cmp
David Majnemera315bd82014-09-15 08:15:28 +000085}
86
Sanjay Patel1b312ad2016-09-28 13:53:13 +000087define <2 x i1> @and_of_icmps1_vec(<2 x i32> %b) {
88; CHECK-LABEL: @and_of_icmps1_vec(
89; CHECK-NEXT: ret <2 x i1> zeroinitializer
90;
91 %1 = add nsw <2 x i32> %b, <i32 2, i32 2>
92 %2 = icmp slt <2 x i32> %1, <i32 4, i32 4>
93 %cmp3 = icmp sgt <2 x i32> %b, <i32 2, i32 2>
94 %cmp = and <2 x i1> %2, %cmp3
95 ret <2 x i1> %cmp
96}
97
David Majnemera315bd82014-09-15 08:15:28 +000098define i1 @and_of_icmps2(i32 %b) {
99; CHECK-LABEL: @and_of_icmps2(
Sanjay Patela4b052c2016-06-19 21:40:12 +0000100; CHECK-NEXT: ret i1 false
Sanjay Patel69632442016-03-25 20:12:25 +0000101;
David Majnemera315bd82014-09-15 08:15:28 +0000102 %1 = add i32 %b, 2
103 %2 = icmp ule i32 %1, 3
104 %cmp3 = icmp sgt i32 %b, 2
105 %cmp = and i1 %2, %cmp3
106 ret i1 %cmp
David Majnemera315bd82014-09-15 08:15:28 +0000107}
108
Sanjay Patel1b312ad2016-09-28 13:53:13 +0000109define <2 x i1> @and_of_icmps2_vec(<2 x i32> %b) {
110; CHECK-LABEL: @and_of_icmps2_vec(
111; CHECK-NEXT: ret <2 x i1> zeroinitializer
112;
113 %1 = add <2 x i32> %b, <i32 2, i32 2>
114 %2 = icmp ule <2 x i32> %1, <i32 3, i32 3>
115 %cmp3 = icmp sgt <2 x i32> %b, <i32 2, i32 2>
116 %cmp = and <2 x i1> %2, %cmp3
117 ret <2 x i1> %cmp
118}
119
David Majnemera315bd82014-09-15 08:15:28 +0000120define i1 @and_of_icmps3(i32 %b) {
121; CHECK-LABEL: @and_of_icmps3(
Sanjay Patela4b052c2016-06-19 21:40:12 +0000122; CHECK-NEXT: ret i1 false
Sanjay Patel69632442016-03-25 20:12:25 +0000123;
David Majnemera315bd82014-09-15 08:15:28 +0000124 %1 = add nsw i32 %b, 2
125 %2 = icmp sle i32 %1, 3
126 %cmp3 = icmp sgt i32 %b, 2
127 %cmp = and i1 %2, %cmp3
128 ret i1 %cmp
David Majnemera315bd82014-09-15 08:15:28 +0000129}
130
Sanjay Patel1b312ad2016-09-28 13:53:13 +0000131define <2 x i1> @and_of_icmps3_vec(<2 x i32> %b) {
132; CHECK-LABEL: @and_of_icmps3_vec(
133; CHECK-NEXT: ret <2 x i1> zeroinitializer
134;
135 %1 = add nsw <2 x i32> %b, <i32 2, i32 2>
136 %2 = icmp sle <2 x i32> %1, <i32 3, i32 3>
137 %cmp3 = icmp sgt <2 x i32> %b, <i32 2, i32 2>
138 %cmp = and <2 x i1> %2, %cmp3
139 ret <2 x i1> %cmp
140}
141
David Majnemera315bd82014-09-15 08:15:28 +0000142define i1 @and_of_icmps4(i32 %b) {
143; CHECK-LABEL: @and_of_icmps4(
Sanjay Patela4b052c2016-06-19 21:40:12 +0000144; CHECK-NEXT: ret i1 false
Sanjay Patel69632442016-03-25 20:12:25 +0000145;
David Majnemera315bd82014-09-15 08:15:28 +0000146 %1 = add nuw i32 %b, 2
147 %2 = icmp ult i32 %1, 4
148 %cmp3 = icmp ugt i32 %b, 2
149 %cmp = and i1 %2, %cmp3
150 ret i1 %cmp
David Majnemera315bd82014-09-15 08:15:28 +0000151}
152
Sanjay Patel1b312ad2016-09-28 13:53:13 +0000153define <2 x i1> @and_of_icmps4_vec(<2 x i32> %b) {
154; CHECK-LABEL: @and_of_icmps4_vec(
155; CHECK-NEXT: ret <2 x i1> zeroinitializer
156;
157 %1 = add nuw <2 x i32> %b, <i32 2, i32 2>
158 %2 = icmp ult <2 x i32> %1, <i32 4, i32 4>
159 %cmp3 = icmp ugt <2 x i32> %b, <i32 2, i32 2>
160 %cmp = and <2 x i1> %2, %cmp3
161 ret <2 x i1> %cmp
162}
163
David Majnemera315bd82014-09-15 08:15:28 +0000164define i1 @and_of_icmps5(i32 %b) {
165; CHECK-LABEL: @and_of_icmps5(
Sanjay Patela4b052c2016-06-19 21:40:12 +0000166; CHECK-NEXT: ret i1 false
Sanjay Patel69632442016-03-25 20:12:25 +0000167;
David Majnemera315bd82014-09-15 08:15:28 +0000168 %1 = add nuw i32 %b, 2
169 %2 = icmp ule i32 %1, 3
170 %cmp3 = icmp ugt i32 %b, 2
171 %cmp = and i1 %2, %cmp3
172 ret i1 %cmp
David Majnemera315bd82014-09-15 08:15:28 +0000173}
174
Sanjay Patel1b312ad2016-09-28 13:53:13 +0000175define <2 x i1> @and_of_icmps5_vec(<2 x i32> %b) {
176; CHECK-LABEL: @and_of_icmps5_vec(
177; CHECK-NEXT: ret <2 x i1> zeroinitializer
178;
179 %1 = add nuw <2 x i32> %b, <i32 2, i32 2>
180 %2 = icmp ule <2 x i32> %1, <i32 3, i32 3>
181 %cmp3 = icmp ugt <2 x i32> %b, <i32 2, i32 2>
182 %cmp = and <2 x i1> %2, %cmp3
183 ret <2 x i1> %cmp
184}
185
David Majnemera315bd82014-09-15 08:15:28 +0000186define i1 @or_of_icmps0(i32 %b) {
187; CHECK-LABEL: @or_of_icmps0(
Sanjay Patela4b052c2016-06-19 21:40:12 +0000188; CHECK-NEXT: ret i1 true
Sanjay Patel69632442016-03-25 20:12:25 +0000189;
David Majnemera315bd82014-09-15 08:15:28 +0000190 %1 = add i32 %b, 2
191 %2 = icmp uge i32 %1, 4
192 %cmp3 = icmp sle i32 %b, 2
193 %cmp = or i1 %2, %cmp3
194 ret i1 %cmp
David Majnemera315bd82014-09-15 08:15:28 +0000195}
196
Sanjay Patela8f9e572016-09-28 14:17:35 +0000197define <2 x i1> @or_of_icmps0_vec(<2 x i32> %b) {
198; CHECK-LABEL: @or_of_icmps0_vec(
Sanjay Patel220a8732016-09-28 14:27:21 +0000199; CHECK-NEXT: ret <2 x i1> <i1 true, i1 true>
Sanjay Patela8f9e572016-09-28 14:17:35 +0000200;
201 %1 = add <2 x i32> %b, <i32 2, i32 2>
202 %2 = icmp uge <2 x i32> %1, <i32 4, i32 4>
203 %cmp3 = icmp sle <2 x i32> %b, <i32 2, i32 2>
204 %cmp = or <2 x i1> %2, %cmp3
205 ret <2 x i1> %cmp
206}
207
David Majnemera315bd82014-09-15 08:15:28 +0000208define i1 @or_of_icmps1(i32 %b) {
209; CHECK-LABEL: @or_of_icmps1(
Sanjay Patela4b052c2016-06-19 21:40:12 +0000210; CHECK-NEXT: ret i1 true
Sanjay Patel69632442016-03-25 20:12:25 +0000211;
David Majnemera315bd82014-09-15 08:15:28 +0000212 %1 = add nsw i32 %b, 2
213 %2 = icmp sge i32 %1, 4
214 %cmp3 = icmp sle i32 %b, 2
215 %cmp = or i1 %2, %cmp3
216 ret i1 %cmp
David Majnemera315bd82014-09-15 08:15:28 +0000217}
218
Sanjay Patela8f9e572016-09-28 14:17:35 +0000219define <2 x i1> @or_of_icmps1_vec(<2 x i32> %b) {
220; CHECK-LABEL: @or_of_icmps1_vec(
Sanjay Patel220a8732016-09-28 14:27:21 +0000221; CHECK-NEXT: ret <2 x i1> <i1 true, i1 true>
Sanjay Patela8f9e572016-09-28 14:17:35 +0000222;
223 %1 = add nsw <2 x i32> %b, <i32 2, i32 2>
224 %2 = icmp sge <2 x i32> %1, <i32 4, i32 4>
225 %cmp3 = icmp sle <2 x i32> %b, <i32 2, i32 2>
226 %cmp = or <2 x i1> %2, %cmp3
227 ret <2 x i1> %cmp
228}
229
David Majnemera315bd82014-09-15 08:15:28 +0000230define i1 @or_of_icmps2(i32 %b) {
231; CHECK-LABEL: @or_of_icmps2(
Sanjay Patela4b052c2016-06-19 21:40:12 +0000232; CHECK-NEXT: ret i1 true
Sanjay Patel69632442016-03-25 20:12:25 +0000233;
David Majnemera315bd82014-09-15 08:15:28 +0000234 %1 = add i32 %b, 2
235 %2 = icmp ugt i32 %1, 3
236 %cmp3 = icmp sle i32 %b, 2
237 %cmp = or i1 %2, %cmp3
238 ret i1 %cmp
David Majnemera315bd82014-09-15 08:15:28 +0000239}
240
Sanjay Patela8f9e572016-09-28 14:17:35 +0000241define <2 x i1> @or_of_icmps2_vec(<2 x i32> %b) {
242; CHECK-LABEL: @or_of_icmps2_vec(
Sanjay Patel220a8732016-09-28 14:27:21 +0000243; CHECK-NEXT: ret <2 x i1> <i1 true, i1 true>
Sanjay Patela8f9e572016-09-28 14:17:35 +0000244;
245 %1 = add <2 x i32> %b, <i32 2, i32 2>
246 %2 = icmp ugt <2 x i32> %1, <i32 3, i32 3>
247 %cmp3 = icmp sle <2 x i32> %b, <i32 2, i32 2>
248 %cmp = or <2 x i1> %2, %cmp3
249 ret <2 x i1> %cmp
250}
251
David Majnemera315bd82014-09-15 08:15:28 +0000252define i1 @or_of_icmps3(i32 %b) {
253; CHECK-LABEL: @or_of_icmps3(
Sanjay Patela4b052c2016-06-19 21:40:12 +0000254; CHECK-NEXT: ret i1 true
Sanjay Patel69632442016-03-25 20:12:25 +0000255;
David Majnemera315bd82014-09-15 08:15:28 +0000256 %1 = add nsw i32 %b, 2
257 %2 = icmp sgt i32 %1, 3
258 %cmp3 = icmp sle i32 %b, 2
259 %cmp = or i1 %2, %cmp3
260 ret i1 %cmp
David Majnemera315bd82014-09-15 08:15:28 +0000261}
262
Sanjay Patela8f9e572016-09-28 14:17:35 +0000263define <2 x i1> @or_of_icmps3_vec(<2 x i32> %b) {
264; CHECK-LABEL: @or_of_icmps3_vec(
Sanjay Patel220a8732016-09-28 14:27:21 +0000265; CHECK-NEXT: ret <2 x i1> <i1 true, i1 true>
Sanjay Patela8f9e572016-09-28 14:17:35 +0000266;
267 %1 = add nsw <2 x i32> %b, <i32 2, i32 2>
268 %2 = icmp sgt <2 x i32> %1, <i32 3, i32 3>
269 %cmp3 = icmp sle <2 x i32> %b, <i32 2, i32 2>
270 %cmp = or <2 x i1> %2, %cmp3
271 ret <2 x i1> %cmp
272}
273
David Majnemera315bd82014-09-15 08:15:28 +0000274define i1 @or_of_icmps4(i32 %b) {
275; CHECK-LABEL: @or_of_icmps4(
Sanjay Patela4b052c2016-06-19 21:40:12 +0000276; CHECK-NEXT: ret i1 true
Sanjay Patel69632442016-03-25 20:12:25 +0000277;
David Majnemera315bd82014-09-15 08:15:28 +0000278 %1 = add nuw i32 %b, 2
279 %2 = icmp uge i32 %1, 4
280 %cmp3 = icmp ule i32 %b, 2
281 %cmp = or i1 %2, %cmp3
282 ret i1 %cmp
David Majnemera315bd82014-09-15 08:15:28 +0000283}
284
Sanjay Patela8f9e572016-09-28 14:17:35 +0000285define <2 x i1> @or_of_icmps4_vec(<2 x i32> %b) {
286; CHECK-LABEL: @or_of_icmps4_vec(
Sanjay Patel220a8732016-09-28 14:27:21 +0000287; CHECK-NEXT: ret <2 x i1> <i1 true, i1 true>
Sanjay Patela8f9e572016-09-28 14:17:35 +0000288;
289 %1 = add nuw <2 x i32> %b, <i32 2, i32 2>
290 %2 = icmp uge <2 x i32> %1, <i32 4, i32 4>
291 %cmp3 = icmp ule <2 x i32> %b, <i32 2, i32 2>
292 %cmp = or <2 x i1> %2, %cmp3
293 ret <2 x i1> %cmp
294}
295
David Majnemera315bd82014-09-15 08:15:28 +0000296define i1 @or_of_icmps5(i32 %b) {
297; CHECK-LABEL: @or_of_icmps5(
Sanjay Patela4b052c2016-06-19 21:40:12 +0000298; CHECK-NEXT: ret i1 true
Sanjay Patel69632442016-03-25 20:12:25 +0000299;
David Majnemera315bd82014-09-15 08:15:28 +0000300 %1 = add nuw i32 %b, 2
301 %2 = icmp ugt i32 %1, 3
302 %cmp3 = icmp ule i32 %b, 2
303 %cmp = or i1 %2, %cmp3
304 ret i1 %cmp
David Majnemera315bd82014-09-15 08:15:28 +0000305}
David Majnemer4efa9ff2014-11-22 07:15:16 +0000306
Sanjay Patela8f9e572016-09-28 14:17:35 +0000307define <2 x i1> @or_of_icmps5_vec(<2 x i32> %b) {
308; CHECK-LABEL: @or_of_icmps5_vec(
Sanjay Patel220a8732016-09-28 14:27:21 +0000309; CHECK-NEXT: ret <2 x i1> <i1 true, i1 true>
Sanjay Patela8f9e572016-09-28 14:17:35 +0000310;
311 %1 = add nuw <2 x i32> %b, <i32 2, i32 2>
312 %2 = icmp ugt <2 x i32> %1, <i32 3, i32 3>
313 %cmp3 = icmp ule <2 x i32> %b, <i32 2, i32 2>
314 %cmp = or <2 x i1> %2, %cmp3
315 ret <2 x i1> %cmp
316}
317
David Majnemer4efa9ff2014-11-22 07:15:16 +0000318define i32 @neg_nuw(i32 %x) {
319; CHECK-LABEL: @neg_nuw(
Sanjay Patela4b052c2016-06-19 21:40:12 +0000320; CHECK-NEXT: ret i32 0
Sanjay Patel69632442016-03-25 20:12:25 +0000321;
David Majnemer4efa9ff2014-11-22 07:15:16 +0000322 %neg = sub nuw i32 0, %x
323 ret i32 %neg
David Majnemer4efa9ff2014-11-22 07:15:16 +0000324}
David Majnemer1af36e52014-12-06 10:51:40 +0000325
326define i1 @and_icmp1(i32 %x, i32 %y) {
Sanjay Patel69632442016-03-25 20:12:25 +0000327; CHECK-LABEL: @and_icmp1(
Sanjay Patela4b052c2016-06-19 21:40:12 +0000328; CHECK-NEXT: [[TMP1:%.*]] = icmp ult i32 %x, %y
Sanjay Patel69632442016-03-25 20:12:25 +0000329; CHECK-NEXT: ret i1 [[TMP1]]
330;
David Majnemer1af36e52014-12-06 10:51:40 +0000331 %1 = icmp ult i32 %x, %y
332 %2 = icmp ne i32 %y, 0
333 %3 = and i1 %1, %2
334 ret i1 %3
335}
David Majnemer1af36e52014-12-06 10:51:40 +0000336
David Majnemerd5b3aa42014-12-08 18:30:43 +0000337define i1 @and_icmp2(i32 %x, i32 %y) {
Sanjay Patel69632442016-03-25 20:12:25 +0000338; CHECK-LABEL: @and_icmp2(
Sanjay Patela4b052c2016-06-19 21:40:12 +0000339; CHECK-NEXT: ret i1 false
Sanjay Patel69632442016-03-25 20:12:25 +0000340;
David Majnemerd5b3aa42014-12-08 18:30:43 +0000341 %1 = icmp ult i32 %x, %y
342 %2 = icmp eq i32 %y, 0
343 %3 = and i1 %1, %2
344 ret i1 %3
345}
David Majnemerd5b3aa42014-12-08 18:30:43 +0000346
David Majnemer1af36e52014-12-06 10:51:40 +0000347define i1 @or_icmp1(i32 %x, i32 %y) {
Sanjay Patel69632442016-03-25 20:12:25 +0000348; CHECK-LABEL: @or_icmp1(
Sanjay Patela4b052c2016-06-19 21:40:12 +0000349; CHECK-NEXT: [[TMP1:%.*]] = icmp ne i32 %y, 0
Sanjay Patel69632442016-03-25 20:12:25 +0000350; CHECK-NEXT: ret i1 [[TMP1]]
351;
David Majnemer1af36e52014-12-06 10:51:40 +0000352 %1 = icmp ult i32 %x, %y
353 %2 = icmp ne i32 %y, 0
354 %3 = or i1 %1, %2
355 ret i1 %3
356}
David Majnemer1af36e52014-12-06 10:51:40 +0000357
358define i1 @or_icmp2(i32 %x, i32 %y) {
Sanjay Patel69632442016-03-25 20:12:25 +0000359; CHECK-LABEL: @or_icmp2(
Sanjay Patela4b052c2016-06-19 21:40:12 +0000360; CHECK-NEXT: ret i1 true
Sanjay Patel69632442016-03-25 20:12:25 +0000361;
David Majnemer1af36e52014-12-06 10:51:40 +0000362 %1 = icmp uge i32 %x, %y
363 %2 = icmp ne i32 %y, 0
364 %3 = or i1 %1, %2
365 ret i1 %3
366}
David Majnemer1af36e52014-12-06 10:51:40 +0000367
368define i1 @or_icmp3(i32 %x, i32 %y) {
Sanjay Patel69632442016-03-25 20:12:25 +0000369; CHECK-LABEL: @or_icmp3(
Sanjay Patela4b052c2016-06-19 21:40:12 +0000370; CHECK-NEXT: [[TMP1:%.*]] = icmp uge i32 %x, %y
Sanjay Patel69632442016-03-25 20:12:25 +0000371; CHECK-NEXT: ret i1 [[TMP1]]
372;
David Majnemer1af36e52014-12-06 10:51:40 +0000373 %1 = icmp uge i32 %x, %y
374 %2 = icmp eq i32 %y, 0
375 %3 = or i1 %1, %2
376 ret i1 %3
377}
Sanjay Patel69632442016-03-25 20:12:25 +0000378
Sanjay Patel9ad8fb62016-06-20 20:59:59 +0000379define i1 @disjoint_cmps(i32 %A) {
380; CHECK-LABEL: @disjoint_cmps(
381; CHECK-NEXT: ret i1 false
382;
383 %B = icmp eq i32 %A, 1
384 %C = icmp sge i32 %A, 3
385 %D = and i1 %B, %C
386 ret i1 %D
387}
388
389define i1 @disjoint_cmps2(i32 %X) {
390; CHECK-LABEL: @disjoint_cmps2(
391; CHECK-NEXT: ret i1 false
392;
393 %a = icmp ult i32 %X, 31
394 %b = icmp slt i32 %X, 0
395 %c = and i1 %a, %b
396 ret i1 %c
397}
398
399; PR27869 - Look through casts to eliminate cmps and bitwise logic.
400
Sanjay Patela4b052c2016-06-19 21:40:12 +0000401define i32 @and_of_zexted_icmps(i32 %i) {
402; CHECK-LABEL: @and_of_zexted_icmps(
Sanjay Patel9ad8fb62016-06-20 20:59:59 +0000403; CHECK-NEXT: ret i32 0
Sanjay Patela4b052c2016-06-19 21:40:12 +0000404;
Sanjay Patel9ad8fb62016-06-20 20:59:59 +0000405 %cmp0 = icmp eq i32 %i, 0
406 %conv0 = zext i1 %cmp0 to i32
Sanjay Patela4b052c2016-06-19 21:40:12 +0000407 %cmp1 = icmp ugt i32 %i, 4
Sanjay Patel9ad8fb62016-06-20 20:59:59 +0000408 %conv1 = zext i1 %cmp1 to i32
409 %and = and i32 %conv0, %conv1
Sanjay Patela4b052c2016-06-19 21:40:12 +0000410 ret i32 %and
411}
412
Sanjay Patel9ad8fb62016-06-20 20:59:59 +0000413; Make sure vectors work too.
414
Sanjay Patela4b052c2016-06-19 21:40:12 +0000415define <4 x i32> @and_of_zexted_icmps_vec(<4 x i32> %i) {
416; CHECK-LABEL: @and_of_zexted_icmps_vec(
Sanjay Patel9ad8fb62016-06-20 20:59:59 +0000417; CHECK-NEXT: ret <4 x i32> zeroinitializer
Sanjay Patela4b052c2016-06-19 21:40:12 +0000418;
Sanjay Patel9ad8fb62016-06-20 20:59:59 +0000419 %cmp0 = icmp eq <4 x i32> %i, zeroinitializer
420 %conv0 = zext <4 x i1> %cmp0 to <4 x i32>
Sanjay Patela4b052c2016-06-19 21:40:12 +0000421 %cmp1 = icmp slt <4 x i32> %i, zeroinitializer
Sanjay Patel9ad8fb62016-06-20 20:59:59 +0000422 %conv1 = zext <4 x i1> %cmp1 to <4 x i32>
423 %and = and <4 x i32> %conv0, %conv1
Sanjay Patela4b052c2016-06-19 21:40:12 +0000424 ret <4 x i32> %and
425}
426
Sanjay Patel9ad8fb62016-06-20 20:59:59 +0000427; Try a different cast and weird types.
428
429define i5 @and_of_sexted_icmps(i3 %i) {
430; CHECK-LABEL: @and_of_sexted_icmps(
431; CHECK-NEXT: ret i5 0
432;
433 %cmp0 = icmp eq i3 %i, 0
434 %conv0 = sext i1 %cmp0 to i5
435 %cmp1 = icmp ugt i3 %i, 1
436 %conv1 = sext i1 %cmp1 to i5
437 %and = and i5 %conv0, %conv1
438 ret i5 %and
439}
440
441; Try a different cast and weird vector types.
442
443define i3 @and_of_bitcast_icmps_vec(<3 x i65> %i) {
444; CHECK-LABEL: @and_of_bitcast_icmps_vec(
445; CHECK-NEXT: ret i3 0
446;
447 %cmp0 = icmp sgt <3 x i65> %i, zeroinitializer
448 %conv0 = bitcast <3 x i1> %cmp0 to i3
449 %cmp1 = icmp slt <3 x i65> %i, zeroinitializer
450 %conv1 = bitcast <3 x i1> %cmp1 to i3
451 %and = and i3 %conv0, %conv1
452 ret i3 %and
453}
454
455; We can't do this if the casts are different.
456
457define i16 @and_of_different_cast_icmps(i8 %i) {
458; CHECK-LABEL: @and_of_different_cast_icmps(
459; CHECK-NEXT: [[CMP0:%.*]] = icmp eq i8 %i, 0
460; CHECK-NEXT: [[CONV0:%.*]] = zext i1 [[CMP0]] to i16
461; CHECK-NEXT: [[CMP1:%.*]] = icmp eq i8 %i, 1
462; CHECK-NEXT: [[CONV1:%.*]] = sext i1 [[CMP1]] to i16
463; CHECK-NEXT: [[AND:%.*]] = and i16 [[CONV0]], [[CONV1]]
464; CHECK-NEXT: ret i16 [[AND]]
465;
466 %cmp0 = icmp eq i8 %i, 0
467 %conv0 = zext i1 %cmp0 to i16
468 %cmp1 = icmp eq i8 %i, 1
469 %conv1 = sext i1 %cmp1 to i16
470 %and = and i16 %conv0, %conv1
471 ret i16 %and
472}
473
474define <2 x i3> @and_of_different_cast_icmps_vec(<2 x i8> %i, <2 x i16> %j) {
475; CHECK-LABEL: @and_of_different_cast_icmps_vec(
476; CHECK-NEXT: [[CMP0:%.*]] = icmp eq <2 x i8> %i, zeroinitializer
477; CHECK-NEXT: [[CONV0:%.*]] = zext <2 x i1> [[CMP0]] to <2 x i3>
478; CHECK-NEXT: [[CMP1:%.*]] = icmp ugt <2 x i16> %j, <i16 1, i16 1>
479; CHECK-NEXT: [[CONV1:%.*]] = zext <2 x i1> [[CMP1]] to <2 x i3>
480; CHECK-NEXT: [[AND:%.*]] = and <2 x i3> [[CONV0]], [[CONV1]]
481; CHECK-NEXT: ret <2 x i3> [[AND]]
482;
483 %cmp0 = icmp eq <2 x i8> %i, zeroinitializer
484 %conv0 = zext <2 x i1> %cmp0 to <2 x i3>
485 %cmp1 = icmp ugt <2 x i16> %j, <i16 1, i16 1>
486 %conv1 = zext <2 x i1> %cmp1 to <2 x i3>
487 %and = and <2 x i3> %conv0, %conv1
488 ret <2 x i3> %and
489}
490