blob: 9b0f4e9fe501b641a5109deb56a3164c75caa119 [file] [log] [blame]
Sanjay Patel21579bb2016-06-22 14:00:16 +00001; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
David Majnemerd2056022014-10-21 19:51:55 +00002; RUN: opt < %s -instsimplify -S | FileCheck %s
3
David Majnemerd2056022014-10-21 19:51:55 +00004define i32 @foo(i32 %x) {
Sanjay Patel21579bb2016-06-22 14:00:16 +00005; CHECK-LABEL: @foo(
6; CHECK-NEXT: [[O:%.*]] = and i32 %x, 1
7; CHECK-NEXT: [[N:%.*]] = add i32 [[O]], -1
8; CHECK-NEXT: ret i32 [[N]]
9;
10 %o = and i32 %x, 1
11 %n = add i32 %o, -1
12 %t = ashr i32 %n, 17
13 ret i32 %t
David Majnemerd2056022014-10-21 19:51:55 +000014}
15
David Majnemerd2056022014-10-21 19:51:55 +000016define i1 @exact_lshr_eq_both_zero(i8 %a) {
Sanjay Patel21579bb2016-06-22 14:00:16 +000017; CHECK-LABEL: @exact_lshr_eq_both_zero(
18; CHECK-NEXT: ret i1 true
19;
20 %shr = lshr exact i8 0, %a
21 %cmp = icmp eq i8 %shr, 0
22 ret i1 %cmp
David Majnemerd2056022014-10-21 19:51:55 +000023}
24
David Majnemerd2056022014-10-21 19:51:55 +000025define i1 @exact_ashr_eq_both_zero(i8 %a) {
Sanjay Patel21579bb2016-06-22 14:00:16 +000026; CHECK-LABEL: @exact_ashr_eq_both_zero(
27; CHECK-NEXT: ret i1 true
28;
29 %shr = ashr exact i8 0, %a
30 %cmp = icmp eq i8 %shr, 0
31 ret i1 %cmp
David Majnemerd2056022014-10-21 19:51:55 +000032}
33
David Majnemerd2056022014-10-21 19:51:55 +000034define i1 @nonexact_ashr_eq_both_zero(i8 %a) {
Sanjay Patel21579bb2016-06-22 14:00:16 +000035; CHECK-LABEL: @nonexact_ashr_eq_both_zero(
36; CHECK-NEXT: ret i1 true
37;
38 %shr = ashr i8 0, %a
39 %cmp = icmp eq i8 %shr, 0
40 ret i1 %cmp
David Majnemerd2056022014-10-21 19:51:55 +000041}
42
David Majnemerd2056022014-10-21 19:51:55 +000043define i1 @exact_lshr_ne_both_zero(i8 %a) {
Sanjay Patel21579bb2016-06-22 14:00:16 +000044; CHECK-LABEL: @exact_lshr_ne_both_zero(
45; CHECK-NEXT: ret i1 false
46;
47 %shr = lshr exact i8 0, %a
48 %cmp = icmp ne i8 %shr, 0
49 ret i1 %cmp
David Majnemerd2056022014-10-21 19:51:55 +000050}
51
David Majnemerd2056022014-10-21 19:51:55 +000052define i1 @exact_ashr_ne_both_zero(i8 %a) {
Sanjay Patel21579bb2016-06-22 14:00:16 +000053; CHECK-LABEL: @exact_ashr_ne_both_zero(
54; CHECK-NEXT: ret i1 false
55;
56 %shr = ashr exact i8 0, %a
57 %cmp = icmp ne i8 %shr, 0
58 ret i1 %cmp
David Majnemerd2056022014-10-21 19:51:55 +000059}
60
David Majnemerd2056022014-10-21 19:51:55 +000061define i1 @nonexact_lshr_ne_both_zero(i8 %a) {
Sanjay Patel21579bb2016-06-22 14:00:16 +000062; CHECK-LABEL: @nonexact_lshr_ne_both_zero(
63; CHECK-NEXT: ret i1 false
64;
65 %shr = lshr i8 0, %a
66 %cmp = icmp ne i8 %shr, 0
67 ret i1 %cmp
David Majnemerd2056022014-10-21 19:51:55 +000068}
69
David Majnemerd2056022014-10-21 19:51:55 +000070define i1 @nonexact_ashr_ne_both_zero(i8 %a) {
Sanjay Patel21579bb2016-06-22 14:00:16 +000071; CHECK-LABEL: @nonexact_ashr_ne_both_zero(
72; CHECK-NEXT: ret i1 false
73;
74 %shr = ashr i8 0, %a
75 %cmp = icmp ne i8 %shr, 0
76 ret i1 %cmp
David Majnemerd2056022014-10-21 19:51:55 +000077}
78
David Majnemerd2056022014-10-21 19:51:55 +000079define i1 @exact_lshr_eq_last_zero(i8 %a) {
Sanjay Patel21579bb2016-06-22 14:00:16 +000080; CHECK-LABEL: @exact_lshr_eq_last_zero(
81; CHECK-NEXT: ret i1 false
82;
83 %shr = lshr exact i8 128, %a
84 %cmp = icmp eq i8 %shr, 0
85 ret i1 %cmp
David Majnemerd2056022014-10-21 19:51:55 +000086}
87
David Majnemerd2056022014-10-21 19:51:55 +000088define i1 @exact_ashr_eq_last_zero(i8 %a) {
Sanjay Patel21579bb2016-06-22 14:00:16 +000089; CHECK-LABEL: @exact_ashr_eq_last_zero(
90; CHECK-NEXT: ret i1 false
91;
92 %shr = ashr exact i8 -128, %a
93 %cmp = icmp eq i8 %shr, 0
94 ret i1 %cmp
David Majnemerd2056022014-10-21 19:51:55 +000095}
96
David Majnemerd2056022014-10-21 19:51:55 +000097define i1 @nonexact_lshr_eq_both_zero(i8 %a) {
Sanjay Patel21579bb2016-06-22 14:00:16 +000098; CHECK-LABEL: @nonexact_lshr_eq_both_zero(
99; CHECK-NEXT: ret i1 true
100;
101 %shr = lshr i8 0, %a
102 %cmp = icmp eq i8 %shr, 0
103 ret i1 %cmp
David Majnemerd2056022014-10-21 19:51:55 +0000104}
105
David Majnemerd2056022014-10-21 19:51:55 +0000106define i1 @exact_lshr_ne_last_zero(i8 %a) {
Sanjay Patel21579bb2016-06-22 14:00:16 +0000107; CHECK-LABEL: @exact_lshr_ne_last_zero(
108; CHECK-NEXT: ret i1 true
109;
110 %shr = lshr exact i8 128, %a
111 %cmp = icmp ne i8 %shr, 0
112 ret i1 %cmp
David Majnemerd2056022014-10-21 19:51:55 +0000113}
114
David Majnemerd2056022014-10-21 19:51:55 +0000115define i1 @exact_ashr_ne_last_zero(i8 %a) {
Sanjay Patel21579bb2016-06-22 14:00:16 +0000116; CHECK-LABEL: @exact_ashr_ne_last_zero(
117; CHECK-NEXT: ret i1 true
118;
119 %shr = ashr exact i8 -128, %a
120 %cmp = icmp ne i8 %shr, 0
121 ret i1 %cmp
David Majnemerd2056022014-10-21 19:51:55 +0000122}
123
David Majnemerd2056022014-10-21 19:51:55 +0000124define i1 @nonexact_lshr_eq_last_zero(i8 %a) {
Sanjay Patel21579bb2016-06-22 14:00:16 +0000125; CHECK-LABEL: @nonexact_lshr_eq_last_zero(
126; CHECK-NEXT: ret i1 false
127;
128 %shr = lshr i8 128, %a
129 %cmp = icmp eq i8 %shr, 0
130 ret i1 %cmp
David Majnemerd2056022014-10-21 19:51:55 +0000131}
132
David Majnemerd2056022014-10-21 19:51:55 +0000133define i1 @nonexact_ashr_eq_last_zero(i8 %a) {
Sanjay Patel21579bb2016-06-22 14:00:16 +0000134; CHECK-LABEL: @nonexact_ashr_eq_last_zero(
135; CHECK-NEXT: ret i1 false
136;
137 %shr = ashr i8 -128, %a
138 %cmp = icmp eq i8 %shr, 0
139 ret i1 %cmp
David Majnemerd2056022014-10-21 19:51:55 +0000140}
141
David Majnemerd2056022014-10-21 19:51:55 +0000142define i1 @nonexact_lshr_ne_last_zero(i8 %a) {
Sanjay Patel21579bb2016-06-22 14:00:16 +0000143; CHECK-LABEL: @nonexact_lshr_ne_last_zero(
144; CHECK-NEXT: ret i1 true
145;
146 %shr = lshr i8 128, %a
147 %cmp = icmp ne i8 %shr, 0
148 ret i1 %cmp
David Majnemerd2056022014-10-21 19:51:55 +0000149}
150
David Majnemerd2056022014-10-21 19:51:55 +0000151define i1 @nonexact_ashr_ne_last_zero(i8 %a) {
Sanjay Patel21579bb2016-06-22 14:00:16 +0000152; CHECK-LABEL: @nonexact_ashr_ne_last_zero(
153; CHECK-NEXT: ret i1 true
154;
155 %shr = ashr i8 -128, %a
156 %cmp = icmp ne i8 %shr, 0
157 ret i1 %cmp
David Majnemerd2056022014-10-21 19:51:55 +0000158}
159
David Majnemerd2056022014-10-21 19:51:55 +0000160define i1 @lshr_eq_first_zero(i8 %a) {
Sanjay Patel21579bb2016-06-22 14:00:16 +0000161; CHECK-LABEL: @lshr_eq_first_zero(
162; CHECK-NEXT: ret i1 false
163;
164 %shr = lshr i8 0, %a
165 %cmp = icmp eq i8 %shr, 2
166 ret i1 %cmp
David Majnemerd2056022014-10-21 19:51:55 +0000167}
168
David Majnemerd2056022014-10-21 19:51:55 +0000169define i1 @ashr_eq_first_zero(i8 %a) {
Sanjay Patel21579bb2016-06-22 14:00:16 +0000170; CHECK-LABEL: @ashr_eq_first_zero(
171; CHECK-NEXT: ret i1 false
172;
173 %shr = ashr i8 0, %a
174 %cmp = icmp eq i8 %shr, 2
175 ret i1 %cmp
David Majnemerd2056022014-10-21 19:51:55 +0000176}
177
David Majnemerd2056022014-10-21 19:51:55 +0000178define i1 @lshr_ne_first_zero(i8 %a) {
Sanjay Patel21579bb2016-06-22 14:00:16 +0000179; CHECK-LABEL: @lshr_ne_first_zero(
180; CHECK-NEXT: ret i1 true
181;
182 %shr = lshr i8 0, %a
183 %cmp = icmp ne i8 %shr, 2
184 ret i1 %cmp
David Majnemerd2056022014-10-21 19:51:55 +0000185}
186
David Majnemerd2056022014-10-21 19:51:55 +0000187define i1 @ashr_ne_first_zero(i8 %a) {
Sanjay Patel21579bb2016-06-22 14:00:16 +0000188; CHECK-LABEL: @ashr_ne_first_zero(
189; CHECK-NEXT: ret i1 true
190;
191 %shr = ashr i8 0, %a
192 %cmp = icmp ne i8 %shr, 2
193 ret i1 %cmp
David Majnemerd2056022014-10-21 19:51:55 +0000194}
195
David Majnemerd2056022014-10-21 19:51:55 +0000196define i1 @ashr_eq_both_minus1(i8 %a) {
Sanjay Patel21579bb2016-06-22 14:00:16 +0000197; CHECK-LABEL: @ashr_eq_both_minus1(
198; CHECK-NEXT: ret i1 true
199;
200 %shr = ashr i8 -1, %a
201 %cmp = icmp eq i8 %shr, -1
202 ret i1 %cmp
David Majnemerd2056022014-10-21 19:51:55 +0000203}
204
David Majnemerd2056022014-10-21 19:51:55 +0000205define i1 @ashr_ne_both_minus1(i8 %a) {
Sanjay Patel21579bb2016-06-22 14:00:16 +0000206; CHECK-LABEL: @ashr_ne_both_minus1(
207; CHECK-NEXT: ret i1 false
208;
209 %shr = ashr i8 -1, %a
210 %cmp = icmp ne i8 %shr, -1
211 ret i1 %cmp
David Majnemerd2056022014-10-21 19:51:55 +0000212}
213
David Majnemerd2056022014-10-21 19:51:55 +0000214define i1 @exact_ashr_eq_both_minus1(i8 %a) {
Sanjay Patel21579bb2016-06-22 14:00:16 +0000215; CHECK-LABEL: @exact_ashr_eq_both_minus1(
216; CHECK-NEXT: ret i1 true
217;
218 %shr = ashr exact i8 -1, %a
219 %cmp = icmp eq i8 %shr, -1
220 ret i1 %cmp
David Majnemerd2056022014-10-21 19:51:55 +0000221}
222
David Majnemerd2056022014-10-21 19:51:55 +0000223define i1 @exact_ashr_ne_both_minus1(i8 %a) {
Sanjay Patel21579bb2016-06-22 14:00:16 +0000224; CHECK-LABEL: @exact_ashr_ne_both_minus1(
225; CHECK-NEXT: ret i1 false
226;
227 %shr = ashr exact i8 -1, %a
228 %cmp = icmp ne i8 %shr, -1
229 ret i1 %cmp
David Majnemerd2056022014-10-21 19:51:55 +0000230}
231
David Majnemerd2056022014-10-21 19:51:55 +0000232define i1 @exact_ashr_eq_opposite_msb(i8 %a) {
Sanjay Patel21579bb2016-06-22 14:00:16 +0000233; CHECK-LABEL: @exact_ashr_eq_opposite_msb(
234; CHECK-NEXT: ret i1 false
235;
236 %shr = ashr exact i8 -128, %a
237 %cmp = icmp eq i8 %shr, 1
238 ret i1 %cmp
David Majnemerd2056022014-10-21 19:51:55 +0000239}
240
David Majnemerd2056022014-10-21 19:51:55 +0000241define i1 @exact_ashr_eq_noexactlog(i8 %a) {
Sanjay Patel21579bb2016-06-22 14:00:16 +0000242; CHECK-LABEL: @exact_ashr_eq_noexactlog(
243; CHECK-NEXT: ret i1 false
244;
245 %shr = ashr exact i8 -90, %a
246 %cmp = icmp eq i8 %shr, -30
247 ret i1 %cmp
David Majnemerd2056022014-10-21 19:51:55 +0000248}
249
David Majnemerd2056022014-10-21 19:51:55 +0000250define i1 @exact_ashr_ne_opposite_msb(i8 %a) {
Sanjay Patel21579bb2016-06-22 14:00:16 +0000251; CHECK-LABEL: @exact_ashr_ne_opposite_msb(
252; CHECK-NEXT: ret i1 true
253;
254 %shr = ashr exact i8 -128, %a
255 %cmp = icmp ne i8 %shr, 1
256 ret i1 %cmp
David Majnemerd2056022014-10-21 19:51:55 +0000257}
258
David Majnemerd2056022014-10-21 19:51:55 +0000259define i1 @ashr_eq_opposite_msb(i8 %a) {
Sanjay Patel21579bb2016-06-22 14:00:16 +0000260; CHECK-LABEL: @ashr_eq_opposite_msb(
261; CHECK-NEXT: ret i1 false
262;
263 %shr = ashr i8 -128, %a
264 %cmp = icmp eq i8 %shr, 1
265 ret i1 %cmp
David Majnemerd2056022014-10-21 19:51:55 +0000266}
267
David Majnemerd2056022014-10-21 19:51:55 +0000268define i1 @ashr_ne_opposite_msb(i8 %a) {
Sanjay Patel21579bb2016-06-22 14:00:16 +0000269; CHECK-LABEL: @ashr_ne_opposite_msb(
270; CHECK-NEXT: ret i1 true
271;
272 %shr = ashr i8 -128, %a
273 %cmp = icmp ne i8 %shr, 1
274 ret i1 %cmp
David Majnemerd2056022014-10-21 19:51:55 +0000275}
276
David Majnemerd2056022014-10-21 19:51:55 +0000277define i1 @exact_ashr_eq_shift_gt(i8 %a) {
Sanjay Patel21579bb2016-06-22 14:00:16 +0000278; CHECK-LABEL: @exact_ashr_eq_shift_gt(
279; CHECK-NEXT: ret i1 false
280;
281 %shr = ashr exact i8 -2, %a
282 %cmp = icmp eq i8 %shr, -8
283 ret i1 %cmp
David Majnemerd2056022014-10-21 19:51:55 +0000284}
285
David Majnemerd2056022014-10-21 19:51:55 +0000286define i1 @exact_ashr_ne_shift_gt(i8 %a) {
Sanjay Patel21579bb2016-06-22 14:00:16 +0000287; CHECK-LABEL: @exact_ashr_ne_shift_gt(
288; CHECK-NEXT: ret i1 true
289;
290 %shr = ashr exact i8 -2, %a
291 %cmp = icmp ne i8 %shr, -8
292 ret i1 %cmp
David Majnemerd2056022014-10-21 19:51:55 +0000293}
294
David Majnemerd2056022014-10-21 19:51:55 +0000295define i1 @nonexact_ashr_eq_shift_gt(i8 %a) {
Sanjay Patel21579bb2016-06-22 14:00:16 +0000296; CHECK-LABEL: @nonexact_ashr_eq_shift_gt(
297; CHECK-NEXT: ret i1 false
298;
299 %shr = ashr i8 -2, %a
300 %cmp = icmp eq i8 %shr, -8
301 ret i1 %cmp
David Majnemerd2056022014-10-21 19:51:55 +0000302}
303
David Majnemerd2056022014-10-21 19:51:55 +0000304define i1 @nonexact_ashr_ne_shift_gt(i8 %a) {
Sanjay Patel21579bb2016-06-22 14:00:16 +0000305; CHECK-LABEL: @nonexact_ashr_ne_shift_gt(
306; CHECK-NEXT: ret i1 true
307;
308 %shr = ashr i8 -2, %a
309 %cmp = icmp ne i8 %shr, -8
310 ret i1 %cmp
David Majnemerd2056022014-10-21 19:51:55 +0000311}
312
David Majnemerd2056022014-10-21 19:51:55 +0000313define i1 @exact_lshr_eq_shift_gt(i8 %a) {
Sanjay Patel21579bb2016-06-22 14:00:16 +0000314; CHECK-LABEL: @exact_lshr_eq_shift_gt(
315; CHECK-NEXT: ret i1 false
316;
317 %shr = lshr exact i8 2, %a
318 %cmp = icmp eq i8 %shr, 8
319 ret i1 %cmp
David Majnemerd2056022014-10-21 19:51:55 +0000320}
321
David Majnemerd2056022014-10-21 19:51:55 +0000322define i1 @exact_lshr_ne_shift_gt(i8 %a) {
Sanjay Patel21579bb2016-06-22 14:00:16 +0000323; CHECK-LABEL: @exact_lshr_ne_shift_gt(
324; CHECK-NEXT: ret i1 true
325;
326 %shr = lshr exact i8 2, %a
327 %cmp = icmp ne i8 %shr, 8
328 ret i1 %cmp
David Majnemerd2056022014-10-21 19:51:55 +0000329}
330
David Majnemerd2056022014-10-21 19:51:55 +0000331define i1 @nonexact_lshr_eq_shift_gt(i8 %a) {
Sanjay Patel21579bb2016-06-22 14:00:16 +0000332; CHECK-LABEL: @nonexact_lshr_eq_shift_gt(
333; CHECK-NEXT: ret i1 false
334;
335 %shr = lshr i8 2, %a
336 %cmp = icmp eq i8 %shr, 8
337 ret i1 %cmp
David Majnemerd2056022014-10-21 19:51:55 +0000338}
339
David Majnemerd2056022014-10-21 19:51:55 +0000340define i1 @nonexact_lshr_ne_shift_gt(i8 %a) {
Sanjay Patel21579bb2016-06-22 14:00:16 +0000341; CHECK-LABEL: @nonexact_lshr_ne_shift_gt(
342; CHECK-NEXT: ret i1 true
343;
344 %shr = ashr i8 2, %a
345 %cmp = icmp ne i8 %shr, 8
346 ret i1 %cmp
David Majnemerd2056022014-10-21 19:51:55 +0000347}
348
David Majnemerd2056022014-10-21 19:51:55 +0000349define i1 @exact_ashr_ne_noexactlog(i8 %a) {
Sanjay Patel21579bb2016-06-22 14:00:16 +0000350; CHECK-LABEL: @exact_ashr_ne_noexactlog(
351; CHECK-NEXT: ret i1 true
352;
353 %shr = ashr exact i8 -90, %a
354 %cmp = icmp ne i8 %shr, -30
355 ret i1 %cmp
David Majnemerd2056022014-10-21 19:51:55 +0000356}
357
David Majnemerd2056022014-10-21 19:51:55 +0000358define i1 @exact_lshr_eq_noexactlog(i8 %a) {
Sanjay Patel21579bb2016-06-22 14:00:16 +0000359; CHECK-LABEL: @exact_lshr_eq_noexactlog(
360; CHECK-NEXT: ret i1 false
361;
362 %shr = lshr exact i8 90, %a
363 %cmp = icmp eq i8 %shr, 30
364 ret i1 %cmp
David Majnemerd2056022014-10-21 19:51:55 +0000365}
366
David Majnemerd2056022014-10-21 19:51:55 +0000367define i1 @exact_lshr_ne_noexactlog(i8 %a) {
Sanjay Patel21579bb2016-06-22 14:00:16 +0000368; CHECK-LABEL: @exact_lshr_ne_noexactlog(
369; CHECK-NEXT: ret i1 true
370;
371 %shr = lshr exact i8 90, %a
372 %cmp = icmp ne i8 %shr, 30
373 ret i1 %cmp
David Majnemerd2056022014-10-21 19:51:55 +0000374}
David Majnemerbf7550e2014-11-05 00:59:59 +0000375
David Majnemerbf7550e2014-11-05 00:59:59 +0000376define i32 @exact_lshr_lowbit(i32 %shiftval) {
Sanjay Patel21579bb2016-06-22 14:00:16 +0000377; CHECK-LABEL: @exact_lshr_lowbit(
378; CHECK-NEXT: ret i32 7
379;
David Majnemerbf7550e2014-11-05 00:59:59 +0000380 %shr = lshr exact i32 7, %shiftval
381 ret i32 %shr
382}
383
David Majnemerbf7550e2014-11-05 00:59:59 +0000384define i32 @exact_ashr_lowbit(i32 %shiftval) {
Sanjay Patel21579bb2016-06-22 14:00:16 +0000385; CHECK-LABEL: @exact_ashr_lowbit(
386; CHECK-NEXT: ret i32 7
387;
David Majnemerbf7550e2014-11-05 00:59:59 +0000388 %shr = ashr exact i32 7, %shiftval
389 ret i32 %shr
390}
Sanjay Patelc6cacd62016-06-22 14:18:04 +0000391
392define i32 @ashr_zero(i32 %shiftval) {
393; CHECK-LABEL: @ashr_zero(
394; CHECK-NEXT: ret i32 0
395;
396 %shr = ashr i32 0, %shiftval
397 ret i32 %shr
398}
399
400define i257 @ashr_minus1(i257 %shiftval) {
401; CHECK-LABEL: @ashr_minus1(
402; CHECK-NEXT: ret i257 -1
403;
404 %shr = ashr i257 -1, %shiftval
405 ret i257 %shr
406}
407
408define <2 x i4097> @ashr_zero_vec(<2 x i4097> %shiftval) {
409; CHECK-LABEL: @ashr_zero_vec(
410; CHECK-NEXT: ret <2 x i4097> zeroinitializer
411;
412 %shr = ashr <2 x i4097> zeroinitializer, %shiftval
413 ret <2 x i4097> %shr
414}
415
416define <2 x i64> @ashr_minus1_vec(<2 x i64> %shiftval) {
417; CHECK-LABEL: @ashr_minus1_vec(
418; CHECK-NEXT: ret <2 x i64> <i64 -1, i64 -1>
419;
420 %shr = ashr <2 x i64> <i64 -1, i64 -1>, %shiftval
421 ret <2 x i64> %shr
422}
423
424define <2 x i4> @ashr_zero_minus1_vec(<2 x i4> %shiftval) {
425; CHECK-LABEL: @ashr_zero_minus1_vec(
Sanjay Patela06d9892016-06-22 19:20:59 +0000426; CHECK-NEXT: ret <2 x i4> <i4 0, i4 -1>
Sanjay Patelc6cacd62016-06-22 14:18:04 +0000427;
428 %shr = ashr <2 x i4> <i4 0, i4 -1>, %shiftval
429 ret <2 x i4> %shr
430}
431