blob: 2442e684246f3d9d39cd22de50ea02d7fb202b15 [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
4define i64 @pow2(i32 %x) {
Stephen Linc1c7a132013-07-14 01:42:54 +00005; CHECK-LABEL: @pow2(
Sanjay Patela4b052c2016-06-19 21:40:12 +00006; CHECK-NEXT: [[NEGX:%.*]] = sub i32 0, %x
Sanjay Patel69632442016-03-25 20:12:25 +00007; CHECK-NEXT: [[X2:%.*]] = and i32 %x, [[NEGX]]
8; CHECK-NEXT: [[E:%.*]] = zext i32 [[X2]] to i64
9; CHECK-NEXT: ret i64 [[E]]
10;
Duncan Sandsba286d72011-10-26 20:55:21 +000011 %negx = sub i32 0, %x
12 %x2 = and i32 %x, %negx
13 %e = zext i32 %x2 to i64
14 %nege = sub i64 0, %e
15 %e2 = and i64 %e, %nege
16 ret i64 %e2
Duncan Sandsba286d72011-10-26 20:55:21 +000017}
Duncan Sands985ba632011-10-28 18:30:05 +000018
19define i64 @pow2b(i32 %x) {
Stephen Linc1c7a132013-07-14 01:42:54 +000020; CHECK-LABEL: @pow2b(
Sanjay Patela4b052c2016-06-19 21:40:12 +000021; CHECK-NEXT: [[SH:%.*]] = shl i32 2, %x
Sanjay Patel69632442016-03-25 20:12:25 +000022; CHECK-NEXT: [[E:%.*]] = zext i32 [[SH]] to i64
23; CHECK-NEXT: ret i64 [[E]]
24;
Duncan Sands985ba632011-10-28 18:30:05 +000025 %sh = shl i32 2, %x
26 %e = zext i32 %sh to i64
27 %nege = sub i64 0, %e
28 %e2 = and i64 %e, %nege
29 ret i64 %e2
Duncan Sands985ba632011-10-28 18:30:05 +000030}
David Majnemercd4fbcd2014-07-31 04:49:18 +000031
32define i32 @sub_neg_nuw(i32 %x, i32 %y) {
33; CHECK-LABEL: @sub_neg_nuw(
Sanjay Patela4b052c2016-06-19 21:40:12 +000034; CHECK-NEXT: ret i32 %x
Sanjay Patel69632442016-03-25 20:12:25 +000035;
David Majnemercd4fbcd2014-07-31 04:49:18 +000036 %neg = sub nuw i32 0, %y
37 %sub = sub i32 %x, %neg
38 ret i32 %sub
David Majnemercd4fbcd2014-07-31 04:49:18 +000039}
David Majnemera315bd82014-09-15 08:15:28 +000040
41define i1 @and_of_icmps0(i32 %b) {
42; CHECK-LABEL: @and_of_icmps0(
Sanjay Patela4b052c2016-06-19 21:40:12 +000043; CHECK-NEXT: ret i1 false
Sanjay Patel69632442016-03-25 20:12:25 +000044;
David Majnemera315bd82014-09-15 08:15:28 +000045 %1 = add i32 %b, 2
46 %2 = icmp ult i32 %1, 4
47 %cmp3 = icmp sgt i32 %b, 2
48 %cmp = and i1 %2, %cmp3
49 ret i1 %cmp
David Majnemera315bd82014-09-15 08:15:28 +000050}
51
52define i1 @and_of_icmps1(i32 %b) {
53; CHECK-LABEL: @and_of_icmps1(
Sanjay Patela4b052c2016-06-19 21:40:12 +000054; CHECK-NEXT: ret i1 false
Sanjay Patel69632442016-03-25 20:12:25 +000055;
David Majnemera315bd82014-09-15 08:15:28 +000056 %1 = add nsw i32 %b, 2
57 %2 = icmp slt i32 %1, 4
58 %cmp3 = icmp sgt i32 %b, 2
59 %cmp = and i1 %2, %cmp3
60 ret i1 %cmp
David Majnemera315bd82014-09-15 08:15:28 +000061}
62
63define i1 @and_of_icmps2(i32 %b) {
64; CHECK-LABEL: @and_of_icmps2(
Sanjay Patela4b052c2016-06-19 21:40:12 +000065; CHECK-NEXT: ret i1 false
Sanjay Patel69632442016-03-25 20:12:25 +000066;
David Majnemera315bd82014-09-15 08:15:28 +000067 %1 = add i32 %b, 2
68 %2 = icmp ule i32 %1, 3
69 %cmp3 = icmp sgt i32 %b, 2
70 %cmp = and i1 %2, %cmp3
71 ret i1 %cmp
David Majnemera315bd82014-09-15 08:15:28 +000072}
73
74define i1 @and_of_icmps3(i32 %b) {
75; CHECK-LABEL: @and_of_icmps3(
Sanjay Patela4b052c2016-06-19 21:40:12 +000076; CHECK-NEXT: ret i1 false
Sanjay Patel69632442016-03-25 20:12:25 +000077;
David Majnemera315bd82014-09-15 08:15:28 +000078 %1 = add nsw i32 %b, 2
79 %2 = icmp sle i32 %1, 3
80 %cmp3 = icmp sgt i32 %b, 2
81 %cmp = and i1 %2, %cmp3
82 ret i1 %cmp
David Majnemera315bd82014-09-15 08:15:28 +000083}
84
85define i1 @and_of_icmps4(i32 %b) {
86; CHECK-LABEL: @and_of_icmps4(
Sanjay Patela4b052c2016-06-19 21:40:12 +000087; CHECK-NEXT: ret i1 false
Sanjay Patel69632442016-03-25 20:12:25 +000088;
David Majnemera315bd82014-09-15 08:15:28 +000089 %1 = add nuw i32 %b, 2
90 %2 = icmp ult i32 %1, 4
91 %cmp3 = icmp ugt i32 %b, 2
92 %cmp = and i1 %2, %cmp3
93 ret i1 %cmp
David Majnemera315bd82014-09-15 08:15:28 +000094}
95
96define i1 @and_of_icmps5(i32 %b) {
97; CHECK-LABEL: @and_of_icmps5(
Sanjay Patela4b052c2016-06-19 21:40:12 +000098; CHECK-NEXT: ret i1 false
Sanjay Patel69632442016-03-25 20:12:25 +000099;
David Majnemera315bd82014-09-15 08:15:28 +0000100 %1 = add nuw i32 %b, 2
101 %2 = icmp ule i32 %1, 3
102 %cmp3 = icmp ugt i32 %b, 2
103 %cmp = and i1 %2, %cmp3
104 ret i1 %cmp
David Majnemera315bd82014-09-15 08:15:28 +0000105}
106
107define i1 @or_of_icmps0(i32 %b) {
108; CHECK-LABEL: @or_of_icmps0(
Sanjay Patela4b052c2016-06-19 21:40:12 +0000109; CHECK-NEXT: ret i1 true
Sanjay Patel69632442016-03-25 20:12:25 +0000110;
David Majnemera315bd82014-09-15 08:15:28 +0000111 %1 = add i32 %b, 2
112 %2 = icmp uge i32 %1, 4
113 %cmp3 = icmp sle i32 %b, 2
114 %cmp = or i1 %2, %cmp3
115 ret i1 %cmp
David Majnemera315bd82014-09-15 08:15:28 +0000116}
117
118define i1 @or_of_icmps1(i32 %b) {
119; CHECK-LABEL: @or_of_icmps1(
Sanjay Patela4b052c2016-06-19 21:40:12 +0000120; CHECK-NEXT: ret i1 true
Sanjay Patel69632442016-03-25 20:12:25 +0000121;
David Majnemera315bd82014-09-15 08:15:28 +0000122 %1 = add nsw i32 %b, 2
123 %2 = icmp sge i32 %1, 4
124 %cmp3 = icmp sle i32 %b, 2
125 %cmp = or i1 %2, %cmp3
126 ret i1 %cmp
David Majnemera315bd82014-09-15 08:15:28 +0000127}
128
129define i1 @or_of_icmps2(i32 %b) {
130; CHECK-LABEL: @or_of_icmps2(
Sanjay Patela4b052c2016-06-19 21:40:12 +0000131; CHECK-NEXT: ret i1 true
Sanjay Patel69632442016-03-25 20:12:25 +0000132;
David Majnemera315bd82014-09-15 08:15:28 +0000133 %1 = add i32 %b, 2
134 %2 = icmp ugt i32 %1, 3
135 %cmp3 = icmp sle i32 %b, 2
136 %cmp = or i1 %2, %cmp3
137 ret i1 %cmp
David Majnemera315bd82014-09-15 08:15:28 +0000138}
139
140define i1 @or_of_icmps3(i32 %b) {
141; CHECK-LABEL: @or_of_icmps3(
Sanjay Patela4b052c2016-06-19 21:40:12 +0000142; CHECK-NEXT: ret i1 true
Sanjay Patel69632442016-03-25 20:12:25 +0000143;
David Majnemera315bd82014-09-15 08:15:28 +0000144 %1 = add nsw i32 %b, 2
145 %2 = icmp sgt i32 %1, 3
146 %cmp3 = icmp sle i32 %b, 2
147 %cmp = or i1 %2, %cmp3
148 ret i1 %cmp
David Majnemera315bd82014-09-15 08:15:28 +0000149}
150
151define i1 @or_of_icmps4(i32 %b) {
152; CHECK-LABEL: @or_of_icmps4(
Sanjay Patela4b052c2016-06-19 21:40:12 +0000153; CHECK-NEXT: ret i1 true
Sanjay Patel69632442016-03-25 20:12:25 +0000154;
David Majnemera315bd82014-09-15 08:15:28 +0000155 %1 = add nuw i32 %b, 2
156 %2 = icmp uge i32 %1, 4
157 %cmp3 = icmp ule i32 %b, 2
158 %cmp = or i1 %2, %cmp3
159 ret i1 %cmp
David Majnemera315bd82014-09-15 08:15:28 +0000160}
161
162define i1 @or_of_icmps5(i32 %b) {
163; CHECK-LABEL: @or_of_icmps5(
Sanjay Patela4b052c2016-06-19 21:40:12 +0000164; CHECK-NEXT: ret i1 true
Sanjay Patel69632442016-03-25 20:12:25 +0000165;
David Majnemera315bd82014-09-15 08:15:28 +0000166 %1 = add nuw i32 %b, 2
167 %2 = icmp ugt i32 %1, 3
168 %cmp3 = icmp ule i32 %b, 2
169 %cmp = or i1 %2, %cmp3
170 ret i1 %cmp
David Majnemera315bd82014-09-15 08:15:28 +0000171}
David Majnemer4efa9ff2014-11-22 07:15:16 +0000172
173define i32 @neg_nuw(i32 %x) {
174; CHECK-LABEL: @neg_nuw(
Sanjay Patela4b052c2016-06-19 21:40:12 +0000175; CHECK-NEXT: ret i32 0
Sanjay Patel69632442016-03-25 20:12:25 +0000176;
David Majnemer4efa9ff2014-11-22 07:15:16 +0000177 %neg = sub nuw i32 0, %x
178 ret i32 %neg
David Majnemer4efa9ff2014-11-22 07:15:16 +0000179}
David Majnemer1af36e52014-12-06 10:51:40 +0000180
181define i1 @and_icmp1(i32 %x, i32 %y) {
Sanjay Patel69632442016-03-25 20:12:25 +0000182; CHECK-LABEL: @and_icmp1(
Sanjay Patela4b052c2016-06-19 21:40:12 +0000183; CHECK-NEXT: [[TMP1:%.*]] = icmp ult i32 %x, %y
Sanjay Patel69632442016-03-25 20:12:25 +0000184; CHECK-NEXT: ret i1 [[TMP1]]
185;
David Majnemer1af36e52014-12-06 10:51:40 +0000186 %1 = icmp ult i32 %x, %y
187 %2 = icmp ne i32 %y, 0
188 %3 = and i1 %1, %2
189 ret i1 %3
190}
David Majnemer1af36e52014-12-06 10:51:40 +0000191
David Majnemerd5b3aa42014-12-08 18:30:43 +0000192define i1 @and_icmp2(i32 %x, i32 %y) {
Sanjay Patel69632442016-03-25 20:12:25 +0000193; CHECK-LABEL: @and_icmp2(
Sanjay Patela4b052c2016-06-19 21:40:12 +0000194; CHECK-NEXT: ret i1 false
Sanjay Patel69632442016-03-25 20:12:25 +0000195;
David Majnemerd5b3aa42014-12-08 18:30:43 +0000196 %1 = icmp ult i32 %x, %y
197 %2 = icmp eq i32 %y, 0
198 %3 = and i1 %1, %2
199 ret i1 %3
200}
David Majnemerd5b3aa42014-12-08 18:30:43 +0000201
David Majnemer1af36e52014-12-06 10:51:40 +0000202define i1 @or_icmp1(i32 %x, i32 %y) {
Sanjay Patel69632442016-03-25 20:12:25 +0000203; CHECK-LABEL: @or_icmp1(
Sanjay Patela4b052c2016-06-19 21:40:12 +0000204; CHECK-NEXT: [[TMP1:%.*]] = icmp ne i32 %y, 0
Sanjay Patel69632442016-03-25 20:12:25 +0000205; CHECK-NEXT: ret i1 [[TMP1]]
206;
David Majnemer1af36e52014-12-06 10:51:40 +0000207 %1 = icmp ult i32 %x, %y
208 %2 = icmp ne i32 %y, 0
209 %3 = or i1 %1, %2
210 ret i1 %3
211}
David Majnemer1af36e52014-12-06 10:51:40 +0000212
213define i1 @or_icmp2(i32 %x, i32 %y) {
Sanjay Patel69632442016-03-25 20:12:25 +0000214; CHECK-LABEL: @or_icmp2(
Sanjay Patela4b052c2016-06-19 21:40:12 +0000215; CHECK-NEXT: ret i1 true
Sanjay Patel69632442016-03-25 20:12:25 +0000216;
David Majnemer1af36e52014-12-06 10:51:40 +0000217 %1 = icmp uge i32 %x, %y
218 %2 = icmp ne i32 %y, 0
219 %3 = or i1 %1, %2
220 ret i1 %3
221}
David Majnemer1af36e52014-12-06 10:51:40 +0000222
223define i1 @or_icmp3(i32 %x, i32 %y) {
Sanjay Patel69632442016-03-25 20:12:25 +0000224; CHECK-LABEL: @or_icmp3(
Sanjay Patela4b052c2016-06-19 21:40:12 +0000225; CHECK-NEXT: [[TMP1:%.*]] = icmp uge i32 %x, %y
Sanjay Patel69632442016-03-25 20:12:25 +0000226; CHECK-NEXT: ret i1 [[TMP1]]
227;
David Majnemer1af36e52014-12-06 10:51:40 +0000228 %1 = icmp uge i32 %x, %y
229 %2 = icmp eq i32 %y, 0
230 %3 = or i1 %1, %2
231 ret i1 %3
232}
Sanjay Patel69632442016-03-25 20:12:25 +0000233
Sanjay Patel9ad8fb62016-06-20 20:59:59 +0000234define i1 @disjoint_cmps(i32 %A) {
235; CHECK-LABEL: @disjoint_cmps(
236; CHECK-NEXT: ret i1 false
237;
238 %B = icmp eq i32 %A, 1
239 %C = icmp sge i32 %A, 3
240 %D = and i1 %B, %C
241 ret i1 %D
242}
243
244define i1 @disjoint_cmps2(i32 %X) {
245; CHECK-LABEL: @disjoint_cmps2(
246; CHECK-NEXT: ret i1 false
247;
248 %a = icmp ult i32 %X, 31
249 %b = icmp slt i32 %X, 0
250 %c = and i1 %a, %b
251 ret i1 %c
252}
253
254; PR27869 - Look through casts to eliminate cmps and bitwise logic.
255
Sanjay Patela4b052c2016-06-19 21:40:12 +0000256define i32 @and_of_zexted_icmps(i32 %i) {
257; CHECK-LABEL: @and_of_zexted_icmps(
Sanjay Patel9ad8fb62016-06-20 20:59:59 +0000258; CHECK-NEXT: ret i32 0
Sanjay Patela4b052c2016-06-19 21:40:12 +0000259;
Sanjay Patel9ad8fb62016-06-20 20:59:59 +0000260 %cmp0 = icmp eq i32 %i, 0
261 %conv0 = zext i1 %cmp0 to i32
Sanjay Patela4b052c2016-06-19 21:40:12 +0000262 %cmp1 = icmp ugt i32 %i, 4
Sanjay Patel9ad8fb62016-06-20 20:59:59 +0000263 %conv1 = zext i1 %cmp1 to i32
264 %and = and i32 %conv0, %conv1
Sanjay Patela4b052c2016-06-19 21:40:12 +0000265 ret i32 %and
266}
267
Sanjay Patel9ad8fb62016-06-20 20:59:59 +0000268; Make sure vectors work too.
269
Sanjay Patela4b052c2016-06-19 21:40:12 +0000270define <4 x i32> @and_of_zexted_icmps_vec(<4 x i32> %i) {
271; CHECK-LABEL: @and_of_zexted_icmps_vec(
Sanjay Patel9ad8fb62016-06-20 20:59:59 +0000272; CHECK-NEXT: ret <4 x i32> zeroinitializer
Sanjay Patela4b052c2016-06-19 21:40:12 +0000273;
Sanjay Patel9ad8fb62016-06-20 20:59:59 +0000274 %cmp0 = icmp eq <4 x i32> %i, zeroinitializer
275 %conv0 = zext <4 x i1> %cmp0 to <4 x i32>
Sanjay Patela4b052c2016-06-19 21:40:12 +0000276 %cmp1 = icmp slt <4 x i32> %i, zeroinitializer
Sanjay Patel9ad8fb62016-06-20 20:59:59 +0000277 %conv1 = zext <4 x i1> %cmp1 to <4 x i32>
278 %and = and <4 x i32> %conv0, %conv1
Sanjay Patela4b052c2016-06-19 21:40:12 +0000279 ret <4 x i32> %and
280}
281
Sanjay Patel9ad8fb62016-06-20 20:59:59 +0000282; Try a different cast and weird types.
283
284define i5 @and_of_sexted_icmps(i3 %i) {
285; CHECK-LABEL: @and_of_sexted_icmps(
286; CHECK-NEXT: ret i5 0
287;
288 %cmp0 = icmp eq i3 %i, 0
289 %conv0 = sext i1 %cmp0 to i5
290 %cmp1 = icmp ugt i3 %i, 1
291 %conv1 = sext i1 %cmp1 to i5
292 %and = and i5 %conv0, %conv1
293 ret i5 %and
294}
295
296; Try a different cast and weird vector types.
297
298define i3 @and_of_bitcast_icmps_vec(<3 x i65> %i) {
299; CHECK-LABEL: @and_of_bitcast_icmps_vec(
300; CHECK-NEXT: ret i3 0
301;
302 %cmp0 = icmp sgt <3 x i65> %i, zeroinitializer
303 %conv0 = bitcast <3 x i1> %cmp0 to i3
304 %cmp1 = icmp slt <3 x i65> %i, zeroinitializer
305 %conv1 = bitcast <3 x i1> %cmp1 to i3
306 %and = and i3 %conv0, %conv1
307 ret i3 %and
308}
309
310; We can't do this if the casts are different.
311
312define i16 @and_of_different_cast_icmps(i8 %i) {
313; CHECK-LABEL: @and_of_different_cast_icmps(
314; CHECK-NEXT: [[CMP0:%.*]] = icmp eq i8 %i, 0
315; CHECK-NEXT: [[CONV0:%.*]] = zext i1 [[CMP0]] to i16
316; CHECK-NEXT: [[CMP1:%.*]] = icmp eq i8 %i, 1
317; CHECK-NEXT: [[CONV1:%.*]] = sext i1 [[CMP1]] to i16
318; CHECK-NEXT: [[AND:%.*]] = and i16 [[CONV0]], [[CONV1]]
319; CHECK-NEXT: ret i16 [[AND]]
320;
321 %cmp0 = icmp eq i8 %i, 0
322 %conv0 = zext i1 %cmp0 to i16
323 %cmp1 = icmp eq i8 %i, 1
324 %conv1 = sext i1 %cmp1 to i16
325 %and = and i16 %conv0, %conv1
326 ret i16 %and
327}
328
329define <2 x i3> @and_of_different_cast_icmps_vec(<2 x i8> %i, <2 x i16> %j) {
330; CHECK-LABEL: @and_of_different_cast_icmps_vec(
331; CHECK-NEXT: [[CMP0:%.*]] = icmp eq <2 x i8> %i, zeroinitializer
332; CHECK-NEXT: [[CONV0:%.*]] = zext <2 x i1> [[CMP0]] to <2 x i3>
333; CHECK-NEXT: [[CMP1:%.*]] = icmp ugt <2 x i16> %j, <i16 1, i16 1>
334; CHECK-NEXT: [[CONV1:%.*]] = zext <2 x i1> [[CMP1]] to <2 x i3>
335; CHECK-NEXT: [[AND:%.*]] = and <2 x i3> [[CONV0]], [[CONV1]]
336; CHECK-NEXT: ret <2 x i3> [[AND]]
337;
338 %cmp0 = icmp eq <2 x i8> %i, zeroinitializer
339 %conv0 = zext <2 x i1> %cmp0 to <2 x i3>
340 %cmp1 = icmp ugt <2 x i16> %j, <i16 1, i16 1>
341 %conv1 = zext <2 x i1> %cmp1 to <2 x i3>
342 %and = and <2 x i3> %conv0, %conv1
343 ret <2 x i3> %and
344}
345