1 ; RUN: opt < %s -instcombine -S | FileCheck %s
3 target datalayout = "e-p:64:64:64-p1:16:16:16-p2:32:32:32-p3:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64"
5 ; CHECK-LABEL: @lshr_eq_msb_low_last_zero
6 ; CHECK-NEXT: icmp ugt i8 %a, 6
7 define i1 @lshr_eq_msb_low_last_zero(i8 %a) {
9 %cmp = icmp eq i8 %shr, 0
13 ; CHECK-LABEL: @ashr_eq_msb_low_second_zero
14 ; CHECK-NEXT: icmp ugt i8 %a, 6
15 define i1 @ashr_eq_msb_low_second_zero(i8 %a) {
16 %shr = ashr i8 127, %a
17 %cmp = icmp eq i8 %shr, 0
21 ; CHECK-LABEL: @lshr_ne_msb_low_last_zero
22 ; CHECK-NEXT: icmp ult i8 %a, 7
23 define i1 @lshr_ne_msb_low_last_zero(i8 %a) {
24 %shr = lshr i8 127, %a
25 %cmp = icmp ne i8 %shr, 0
29 ; CHECK-LABEL: @ashr_ne_msb_low_second_zero
30 ; CHECK-NEXT: icmp ult i8 %a, 7
31 define i1 @ashr_ne_msb_low_second_zero(i8 %a) {
32 %shr = ashr i8 127, %a
33 %cmp = icmp ne i8 %shr, 0
37 ; CHECK-LABEL: @ashr_eq_both_equal
38 ; CHECK-NEXT: icmp eq i8 %a, 0
39 define i1 @ashr_eq_both_equal(i8 %a) {
40 %shr = ashr i8 128, %a
41 %cmp = icmp eq i8 %shr, 128
45 ; CHECK-LABEL: @ashr_ne_both_equal
46 ; CHECK-NEXT: icmp ne i8 %a, 0
47 define i1 @ashr_ne_both_equal(i8 %a) {
48 %shr = ashr i8 128, %a
49 %cmp = icmp ne i8 %shr, 128
53 ; CHECK-LABEL: @lshr_eq_both_equal
54 ; CHECK-NEXT: icmp eq i8 %a, 0
55 define i1 @lshr_eq_both_equal(i8 %a) {
56 %shr = lshr i8 127, %a
57 %cmp = icmp eq i8 %shr, 127
61 ; CHECK-LABEL: @lshr_ne_both_equal
62 ; CHECK-NEXT: icmp ne i8 %a, 0
63 define i1 @lshr_ne_both_equal(i8 %a) {
64 %shr = lshr i8 127, %a
65 %cmp = icmp ne i8 %shr, 127
69 ; CHECK-LABEL: @exact_ashr_eq_both_equal
70 ; CHECK-NEXT: icmp eq i8 %a, 0
71 define i1 @exact_ashr_eq_both_equal(i8 %a) {
72 %shr = ashr exact i8 128, %a
73 %cmp = icmp eq i8 %shr, 128
77 ; CHECK-LABEL: @exact_ashr_ne_both_equal
78 ; CHECK-NEXT: icmp ne i8 %a, 0
79 define i1 @exact_ashr_ne_both_equal(i8 %a) {
80 %shr = ashr exact i8 128, %a
81 %cmp = icmp ne i8 %shr, 128
85 ; CHECK-LABEL: @exact_lshr_eq_both_equal
86 ; CHECK-NEXT: icmp eq i8 %a, 0
87 define i1 @exact_lshr_eq_both_equal(i8 %a) {
88 %shr = lshr exact i8 126, %a
89 %cmp = icmp eq i8 %shr, 126
93 ; CHECK-LABEL: @exact_lshr_ne_both_equal
94 ; CHECK-NEXT: icmp ne i8 %a, 0
95 define i1 @exact_lshr_ne_both_equal(i8 %a) {
96 %shr = lshr exact i8 126, %a
97 %cmp = icmp ne i8 %shr, 126
101 ; CHECK-LABEL: @exact_lshr_eq_opposite_msb
102 ; CHECK-NEXT: icmp eq i8 %a, 7
103 define i1 @exact_lshr_eq_opposite_msb(i8 %a) {
104 %shr = lshr exact i8 -128, %a
105 %cmp = icmp eq i8 %shr, 1
109 ; CHECK-LABEL: @lshr_eq_opposite_msb
110 ; CHECK-NEXT: icmp eq i8 %a, 7
111 define i1 @lshr_eq_opposite_msb(i8 %a) {
112 %shr = lshr i8 -128, %a
113 %cmp = icmp eq i8 %shr, 1
117 ; CHECK-LABEL: @exact_lshr_ne_opposite_msb
118 ; CHECK-NEXT: icmp ne i8 %a, 7
119 define i1 @exact_lshr_ne_opposite_msb(i8 %a) {
120 %shr = lshr exact i8 -128, %a
121 %cmp = icmp ne i8 %shr, 1
125 ; CHECK-LABEL: @lshr_ne_opposite_msb
126 ; CHECK-NEXT: icmp ne i8 %a, 7
127 define i1 @lshr_ne_opposite_msb(i8 %a) {
128 %shr = lshr i8 -128, %a
129 %cmp = icmp ne i8 %shr, 1
133 ; CHECK-LABEL: @exact_ashr_eq
134 ; CHECK-NEXT: icmp eq i8 %a, 7
135 define i1 @exact_ashr_eq(i8 %a) {
136 %shr = ashr exact i8 -128, %a
137 %cmp = icmp eq i8 %shr, -1
141 ; CHECK-LABEL: @exact_ashr_ne
142 ; CHECK-NEXT: icmp ne i8 %a, 7
143 define i1 @exact_ashr_ne(i8 %a) {
144 %shr = ashr exact i8 -128, %a
145 %cmp = icmp ne i8 %shr, -1
149 ; CHECK-LABEL: @exact_lshr_eq
150 ; CHECK-NEXT: icmp eq i8 %a, 2
151 define i1 @exact_lshr_eq(i8 %a) {
152 %shr = lshr exact i8 4, %a
153 %cmp = icmp eq i8 %shr, 1
157 ; CHECK-LABEL: @exact_lshr_ne
158 ; CHECK-NEXT: icmp ne i8 %a, 2
159 define i1 @exact_lshr_ne(i8 %a) {
160 %shr = lshr exact i8 4, %a
161 %cmp = icmp ne i8 %shr, 1
165 ; CHECK-LABEL: @nonexact_ashr_eq
166 ; CHECK-NEXT: icmp eq i8 %a, 7
167 define i1 @nonexact_ashr_eq(i8 %a) {
168 %shr = ashr i8 -128, %a
169 %cmp = icmp eq i8 %shr, -1
173 ; CHECK-LABEL: @nonexact_ashr_ne
174 ; CHECK-NEXT: icmp ne i8 %a, 7
175 define i1 @nonexact_ashr_ne(i8 %a) {
176 %shr = ashr i8 -128, %a
177 %cmp = icmp ne i8 %shr, -1
181 ; CHECK-LABEL: @nonexact_lshr_eq
182 ; CHECK-NEXT: icmp eq i8 %a, 2
183 define i1 @nonexact_lshr_eq(i8 %a) {
185 %cmp = icmp eq i8 %shr, 1
189 ; CHECK-LABEL: @nonexact_lshr_ne
190 ; CHECK-NEXT: icmp ne i8 %a, 2
191 define i1 @nonexact_lshr_ne(i8 %a) {
193 %cmp = icmp ne i8 %shr, 1
197 ; CHECK-LABEL: @exact_lshr_eq_exactdiv
198 ; CHECK-NEXT: icmp eq i8 %a, 4
199 define i1 @exact_lshr_eq_exactdiv(i8 %a) {
200 %shr = lshr exact i8 80, %a
201 %cmp = icmp eq i8 %shr, 5
205 ; CHECK-LABEL: @exact_lshr_ne_exactdiv
206 ; CHECK-NEXT: icmp ne i8 %a, 4
207 define i1 @exact_lshr_ne_exactdiv(i8 %a) {
208 %shr = lshr exact i8 80, %a
209 %cmp = icmp ne i8 %shr, 5
213 ; CHECK-LABEL: @nonexact_lshr_eq_exactdiv
214 ; CHECK-NEXT: icmp eq i8 %a, 4
215 define i1 @nonexact_lshr_eq_exactdiv(i8 %a) {
216 %shr = lshr i8 80, %a
217 %cmp = icmp eq i8 %shr, 5
221 ; CHECK-LABEL: @nonexact_lshr_ne_exactdiv
222 ; CHECK-NEXT: icmp ne i8 %a, 4
223 define i1 @nonexact_lshr_ne_exactdiv(i8 %a) {
224 %shr = lshr i8 80, %a
225 %cmp = icmp ne i8 %shr, 5
229 ; CHECK-LABEL: @exact_ashr_eq_exactdiv
230 ; CHECK-NEXT: icmp eq i8 %a, 4
231 define i1 @exact_ashr_eq_exactdiv(i8 %a) {
232 %shr = ashr exact i8 -80, %a
233 %cmp = icmp eq i8 %shr, -5
237 ; CHECK-LABEL: @exact_ashr_ne_exactdiv
238 ; CHECK-NEXT: icmp ne i8 %a, 4
239 define i1 @exact_ashr_ne_exactdiv(i8 %a) {
240 %shr = ashr exact i8 -80, %a
241 %cmp = icmp ne i8 %shr, -5
245 ; CHECK-LABEL: @nonexact_ashr_eq_exactdiv
246 ; CHECK-NEXT: icmp eq i8 %a, 4
247 define i1 @nonexact_ashr_eq_exactdiv(i8 %a) {
248 %shr = ashr i8 -80, %a
249 %cmp = icmp eq i8 %shr, -5
253 ; CHECK-LABEL: @nonexact_ashr_ne_exactdiv
254 ; CHECK-NEXT: icmp ne i8 %a, 4
255 define i1 @nonexact_ashr_ne_exactdiv(i8 %a) {
256 %shr = ashr i8 -80, %a
257 %cmp = icmp ne i8 %shr, -5
261 ; CHECK-LABEL: @exact_lshr_eq_noexactdiv
262 ; CHECK-NEXT: ret i1 false
263 define i1 @exact_lshr_eq_noexactdiv(i8 %a) {
264 %shr = lshr exact i8 80, %a
265 %cmp = icmp eq i8 %shr, 31
269 ; CHECK-LABEL: @exact_lshr_ne_noexactdiv
270 ; CHECK-NEXT: ret i1 true
271 define i1 @exact_lshr_ne_noexactdiv(i8 %a) {
272 %shr = lshr exact i8 80, %a
273 %cmp = icmp ne i8 %shr, 31
277 ; CHECK-LABEL: @nonexact_lshr_eq_noexactdiv
278 ; CHECK-NEXT: ret i1 false
279 define i1 @nonexact_lshr_eq_noexactdiv(i8 %a) {
280 %shr = lshr i8 80, %a
281 %cmp = icmp eq i8 %shr, 31
285 ; CHECK-LABEL: @nonexact_lshr_ne_noexactdiv
286 ; CHECK-NEXT: ret i1 true
287 define i1 @nonexact_lshr_ne_noexactdiv(i8 %a) {
288 %shr = lshr i8 80, %a
289 %cmp = icmp ne i8 %shr, 31
293 ; CHECK-LABEL: @exact_ashr_eq_noexactdiv
294 ; CHECK-NEXT: ret i1 false
295 define i1 @exact_ashr_eq_noexactdiv(i8 %a) {
296 %shr = ashr exact i8 -80, %a
297 %cmp = icmp eq i8 %shr, -31
301 ; CHECK-LABEL: @exact_ashr_ne_noexactdiv
302 ; CHECK-NEXT: ret i1 true
303 define i1 @exact_ashr_ne_noexactdiv(i8 %a) {
304 %shr = ashr exact i8 -80, %a
305 %cmp = icmp ne i8 %shr, -31
309 ; CHECK-LABEL: @nonexact_ashr_eq_noexactdiv
310 ; CHECK-NEXT: ret i1 false
311 define i1 @nonexact_ashr_eq_noexactdiv(i8 %a) {
312 %shr = ashr i8 -80, %a
313 %cmp = icmp eq i8 %shr, -31
317 ; CHECK-LABEL: @nonexact_ashr_ne_noexactdiv
318 ; CHECK-NEXT: ret i1 true
319 define i1 @nonexact_ashr_ne_noexactdiv(i8 %a) {
320 %shr = ashr i8 -80, %a
321 %cmp = icmp ne i8 %shr, -31
325 ; CHECK-LABEL: @nonexact_lshr_eq_noexactlog
326 ; CHECK-NEXT: ret i1 false
327 define i1 @nonexact_lshr_eq_noexactlog(i8 %a) {
328 %shr = lshr i8 90, %a
329 %cmp = icmp eq i8 %shr, 30
333 ; CHECK-LABEL: @nonexact_lshr_ne_noexactlog
334 ; CHECK-NEXT: ret i1 true
335 define i1 @nonexact_lshr_ne_noexactlog(i8 %a) {
336 %shr = lshr i8 90, %a
337 %cmp = icmp ne i8 %shr, 30
341 ; CHECK-LABEL: @nonexact_ashr_eq_noexactlog
342 ; CHECK-NEXT: ret i1 false
343 define i1 @nonexact_ashr_eq_noexactlog(i8 %a) {
344 %shr = ashr i8 -90, %a
345 %cmp = icmp eq i8 %shr, -30
349 ; CHECK-LABEL: @nonexact_ashr_ne_noexactlog
350 ; CHECK-NEXT: ret i1 true
351 define i1 @nonexact_ashr_ne_noexactlog(i8 %a) {
352 %shr = ashr i8 -90, %a
353 %cmp = icmp ne i8 %shr, -30
357 ; Don't try to fold the entire body of function @PR20945 into a
358 ; single `ret i1 true` statement.
359 ; If %B is equal to 1, then this function would return false.
360 ; As a consequence, the instruction combiner is not allowed to fold %cmp
361 ; to 'true'. Instead, it should replace %cmp with a simpler comparison
364 ; CHECK-LABEL: @PR20945(
365 ; CHECK: icmp ne i32 %B, 1
366 define i1 @PR20945(i32 %B) {
367 %shr = ashr i32 -9, %B
368 %cmp = icmp ne i32 %shr, -5
372 ; CHECK-LABEL: @PR21222
373 ; CHECK: icmp eq i32 %B, 6
374 define i1 @PR21222(i32 %B) {
375 %shr = ashr i32 -93, %B
376 %cmp = icmp eq i32 %shr, -2