Bump version to 19.1.0-rc3
[llvm-project.git] / llvm / test / CodeGen / ARM / cmp-peephole.ll
blob73888558e6647cd90f939b418e01105c1f9ab07f
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -mtriple=armv7a < %s | FileCheck %s --check-prefix=ARM
3 ; RUN: llc -mtriple=armv6m < %s | FileCheck %s --check-prefix=THUMB
4 ; RUN: llc -mtriple=armv7m < %s | FileCheck %s --check-prefix=THUMB2
6 define i1 @cmp_ne_zero_and_rr(i32 %a, i32 %b) {
7 ; ARM-LABEL: cmp_ne_zero_and_rr:
8 ; ARM:       @ %bb.0:
9 ; ARM-NEXT:    ands r0, r0, r1
10 ; ARM-NEXT:    movwne r0, #1
11 ; ARM-NEXT:    bx lr
13 ; THUMB-LABEL: cmp_ne_zero_and_rr:
14 ; THUMB:       @ %bb.0:
15 ; THUMB-NEXT:    ands r0, r1
16 ; THUMB-NEXT:    subs r1, r0, #1
17 ; THUMB-NEXT:    sbcs r0, r1
18 ; THUMB-NEXT:    bx lr
20 ; THUMB2-LABEL: cmp_ne_zero_and_rr:
21 ; THUMB2:       @ %bb.0:
22 ; THUMB2-NEXT:    ands r0, r1
23 ; THUMB2-NEXT:    it ne
24 ; THUMB2-NEXT:    movne r0, #1
25 ; THUMB2-NEXT:    bx lr
26   %and = and i32 %a, %b
27   %res = icmp ne i32 %and, 0
28   ret i1 %res
31 define i1 @cmp_ne_zero_and_ri(i32 %a) {
32 ; ARM-LABEL: cmp_ne_zero_and_ri:
33 ; ARM:       @ %bb.0:
34 ; ARM-NEXT:    ands r0, r0, #42
35 ; ARM-NEXT:    movwne r0, #1
36 ; ARM-NEXT:    bx lr
38 ; THUMB-LABEL: cmp_ne_zero_and_ri:
39 ; THUMB:       @ %bb.0:
40 ; THUMB-NEXT:    movs r1, #42
41 ; THUMB-NEXT:    ands r0, r1
42 ; THUMB-NEXT:    subs r1, r0, #1
43 ; THUMB-NEXT:    sbcs r0, r1
44 ; THUMB-NEXT:    bx lr
46 ; THUMB2-LABEL: cmp_ne_zero_and_ri:
47 ; THUMB2:       @ %bb.0:
48 ; THUMB2-NEXT:    ands r0, r0, #42
49 ; THUMB2-NEXT:    it ne
50 ; THUMB2-NEXT:    movne r0, #1
51 ; THUMB2-NEXT:    bx lr
52   %and = and i32 %a, 42
53   %res = icmp ne i32 %and, 0
54   ret i1 %res
57 define i1 @cmp_ne_zero_and_rsr(i32 %a, i32 %b, i32 %c) {
58 ; ARM-LABEL: cmp_ne_zero_and_rsr:
59 ; ARM:       @ %bb.0:
60 ; ARM-NEXT:    ands r0, r0, r1, lsl r2
61 ; ARM-NEXT:    movwne r0, #1
62 ; ARM-NEXT:    bx lr
64 ; THUMB-LABEL: cmp_ne_zero_and_rsr:
65 ; THUMB:       @ %bb.0:
66 ; THUMB-NEXT:    lsls r1, r2
67 ; THUMB-NEXT:    ands r0, r1
68 ; THUMB-NEXT:    subs r1, r0, #1
69 ; THUMB-NEXT:    sbcs r0, r1
70 ; THUMB-NEXT:    bx lr
72 ; THUMB2-LABEL: cmp_ne_zero_and_rsr:
73 ; THUMB2:       @ %bb.0:
74 ; THUMB2-NEXT:    lsls r1, r2
75 ; THUMB2-NEXT:    ands r0, r1
76 ; THUMB2-NEXT:    it ne
77 ; THUMB2-NEXT:    movne r0, #1
78 ; THUMB2-NEXT:    bx lr
79   %sh = shl i32 %b, %c
80   %and = and i32 %sh, %a
81   %res = icmp ne i32 %and, 0
82   ret i1 %res
85 define i1 @cmp_ne_zero_and_rsi(i32 %a, i32 %b) {
86 ; ARM-LABEL: cmp_ne_zero_and_rsi:
87 ; ARM:       @ %bb.0:
88 ; ARM-NEXT:    ands r0, r0, r1, lsr #17
89 ; ARM-NEXT:    movwne r0, #1
90 ; ARM-NEXT:    bx lr
92 ; THUMB-LABEL: cmp_ne_zero_and_rsi:
93 ; THUMB:       @ %bb.0:
94 ; THUMB-NEXT:    lsrs r1, r1, #17
95 ; THUMB-NEXT:    ands r0, r1
96 ; THUMB-NEXT:    subs r1, r0, #1
97 ; THUMB-NEXT:    sbcs r0, r1
98 ; THUMB-NEXT:    bx lr
100 ; THUMB2-LABEL: cmp_ne_zero_and_rsi:
101 ; THUMB2:       @ %bb.0:
102 ; THUMB2-NEXT:    ands.w r0, r0, r1, lsr #17
103 ; THUMB2-NEXT:    it ne
104 ; THUMB2-NEXT:    movne r0, #1
105 ; THUMB2-NEXT:    bx lr
106   %sh = lshr i32 %b, 17
107   %and = and i32 %sh, %a
108   %res = icmp ne i32 %and, 0
109   ret i1 %res
112 define i1 @cmp_ne_zero_or_rr(i32 %a, i32 %b) {
113 ; ARM-LABEL: cmp_ne_zero_or_rr:
114 ; ARM:       @ %bb.0:
115 ; ARM-NEXT:    orrs r0, r0, r1
116 ; ARM-NEXT:    movwne r0, #1
117 ; ARM-NEXT:    bx lr
119 ; THUMB-LABEL: cmp_ne_zero_or_rr:
120 ; THUMB:       @ %bb.0:
121 ; THUMB-NEXT:    orrs r0, r1
122 ; THUMB-NEXT:    subs r1, r0, #1
123 ; THUMB-NEXT:    sbcs r0, r1
124 ; THUMB-NEXT:    bx lr
126 ; THUMB2-LABEL: cmp_ne_zero_or_rr:
127 ; THUMB2:       @ %bb.0:
128 ; THUMB2-NEXT:    orrs r0, r1
129 ; THUMB2-NEXT:    it ne
130 ; THUMB2-NEXT:    movne r0, #1
131 ; THUMB2-NEXT:    bx lr
132   %or = or i32 %a, %b
133   %res = icmp ne i32 %or, 0
134   ret i1 %res
137 define i1 @cmp_ne_zero_or_ri(i32 %a) {
138 ; ARM-LABEL: cmp_ne_zero_or_ri:
139 ; ARM:       @ %bb.0:
140 ; ARM-NEXT:    orrs r0, r0, #42
141 ; ARM-NEXT:    movwne r0, #1
142 ; ARM-NEXT:    bx lr
144 ; THUMB-LABEL: cmp_ne_zero_or_ri:
145 ; THUMB:       @ %bb.0:
146 ; THUMB-NEXT:    movs r1, #42
147 ; THUMB-NEXT:    orrs r0, r1
148 ; THUMB-NEXT:    subs r1, r0, #1
149 ; THUMB-NEXT:    sbcs r0, r1
150 ; THUMB-NEXT:    bx lr
152 ; THUMB2-LABEL: cmp_ne_zero_or_ri:
153 ; THUMB2:       @ %bb.0:
154 ; THUMB2-NEXT:    orrs r0, r0, #42
155 ; THUMB2-NEXT:    it ne
156 ; THUMB2-NEXT:    movne r0, #1
157 ; THUMB2-NEXT:    bx lr
158   %or = or i32 %a, 42
159   %res = icmp ne i32 %or, 0
160   ret i1 %res
163 define i1 @cmp_ne_zero_or_rsr(i32 %a, i32 %b, i32 %c) {
164 ; ARM-LABEL: cmp_ne_zero_or_rsr:
165 ; ARM:       @ %bb.0:
166 ; ARM-NEXT:    orrs r0, r0, r1, lsl r2
167 ; ARM-NEXT:    movwne r0, #1
168 ; ARM-NEXT:    bx lr
170 ; THUMB-LABEL: cmp_ne_zero_or_rsr:
171 ; THUMB:       @ %bb.0:
172 ; THUMB-NEXT:    lsls r1, r2
173 ; THUMB-NEXT:    orrs r0, r1
174 ; THUMB-NEXT:    subs r1, r0, #1
175 ; THUMB-NEXT:    sbcs r0, r1
176 ; THUMB-NEXT:    bx lr
178 ; THUMB2-LABEL: cmp_ne_zero_or_rsr:
179 ; THUMB2:       @ %bb.0:
180 ; THUMB2-NEXT:    lsls r1, r2
181 ; THUMB2-NEXT:    orrs r0, r1
182 ; THUMB2-NEXT:    it ne
183 ; THUMB2-NEXT:    movne r0, #1
184 ; THUMB2-NEXT:    bx lr
185   %sh = shl i32 %b, %c
186   %or = or i32 %sh, %a
187   %res = icmp ne i32 %or, 0
188   ret i1 %res
191 define i1 @cmp_ne_zero_or_rsi(i32 %a, i32 %b) {
192 ; ARM-LABEL: cmp_ne_zero_or_rsi:
193 ; ARM:       @ %bb.0:
194 ; ARM-NEXT:    orrs r0, r0, r1, lsr #17
195 ; ARM-NEXT:    movwne r0, #1
196 ; ARM-NEXT:    bx lr
198 ; THUMB-LABEL: cmp_ne_zero_or_rsi:
199 ; THUMB:       @ %bb.0:
200 ; THUMB-NEXT:    lsrs r1, r1, #17
201 ; THUMB-NEXT:    orrs r0, r1
202 ; THUMB-NEXT:    subs r1, r0, #1
203 ; THUMB-NEXT:    sbcs r0, r1
204 ; THUMB-NEXT:    bx lr
206 ; THUMB2-LABEL: cmp_ne_zero_or_rsi:
207 ; THUMB2:       @ %bb.0:
208 ; THUMB2-NEXT:    orrs.w r0, r0, r1, lsr #17
209 ; THUMB2-NEXT:    it ne
210 ; THUMB2-NEXT:    movne r0, #1
211 ; THUMB2-NEXT:    bx lr
212   %sh = lshr i32 %b, 17
213   %or = or i32 %sh, %a
214   %res = icmp ne i32 %or, 0
215   ret i1 %res
218 define i1 @cmp_ne_zero_xor_rr(i32 %a, i32 %b) {
219 ; ARM-LABEL: cmp_ne_zero_xor_rr:
220 ; ARM:       @ %bb.0:
221 ; ARM-NEXT:    eors r0, r0, r1
222 ; ARM-NEXT:    movwne r0, #1
223 ; ARM-NEXT:    bx lr
225 ; THUMB-LABEL: cmp_ne_zero_xor_rr:
226 ; THUMB:       @ %bb.0:
227 ; THUMB-NEXT:    eors r0, r1
228 ; THUMB-NEXT:    subs r1, r0, #1
229 ; THUMB-NEXT:    sbcs r0, r1
230 ; THUMB-NEXT:    bx lr
232 ; THUMB2-LABEL: cmp_ne_zero_xor_rr:
233 ; THUMB2:       @ %bb.0:
234 ; THUMB2-NEXT:    eors r0, r1
235 ; THUMB2-NEXT:    it ne
236 ; THUMB2-NEXT:    movne r0, #1
237 ; THUMB2-NEXT:    bx lr
238   %xor = xor i32 %a, %b
239   %res = icmp ne i32 %xor, 0
240   ret i1 %res
243 define i1 @cmp_ne_zero_xor_ri(i32 %a) {
244 ; ARM-LABEL: cmp_ne_zero_xor_ri:
245 ; ARM:       @ %bb.0:
246 ; ARM-NEXT:    subs r0, r0, #42
247 ; ARM-NEXT:    movwne r0, #1
248 ; ARM-NEXT:    bx lr
250 ; THUMB-LABEL: cmp_ne_zero_xor_ri:
251 ; THUMB:       @ %bb.0:
252 ; THUMB-NEXT:    subs r0, #42
253 ; THUMB-NEXT:    subs r1, r0, #1
254 ; THUMB-NEXT:    sbcs r0, r1
255 ; THUMB-NEXT:    bx lr
257 ; THUMB2-LABEL: cmp_ne_zero_xor_ri:
258 ; THUMB2:       @ %bb.0:
259 ; THUMB2-NEXT:    subs r0, #42
260 ; THUMB2-NEXT:    it ne
261 ; THUMB2-NEXT:    movne r0, #1
262 ; THUMB2-NEXT:    bx lr
263   %xor = xor i32 %a, 42
264   %res = icmp ne i32 %xor, 0
265   ret i1 %res
268 define i1 @cmp_ne_zero_xor_rsr(i32 %a, i32 %b, i32 %c) {
269 ; ARM-LABEL: cmp_ne_zero_xor_rsr:
270 ; ARM:       @ %bb.0:
271 ; ARM-NEXT:    eors r0, r0, r1, lsl r2
272 ; ARM-NEXT:    movwne r0, #1
273 ; ARM-NEXT:    bx lr
275 ; THUMB-LABEL: cmp_ne_zero_xor_rsr:
276 ; THUMB:       @ %bb.0:
277 ; THUMB-NEXT:    lsls r1, r2
278 ; THUMB-NEXT:    eors r0, r1
279 ; THUMB-NEXT:    subs r1, r0, #1
280 ; THUMB-NEXT:    sbcs r0, r1
281 ; THUMB-NEXT:    bx lr
283 ; THUMB2-LABEL: cmp_ne_zero_xor_rsr:
284 ; THUMB2:       @ %bb.0:
285 ; THUMB2-NEXT:    lsls r1, r2
286 ; THUMB2-NEXT:    eors r0, r1
287 ; THUMB2-NEXT:    it ne
288 ; THUMB2-NEXT:    movne r0, #1
289 ; THUMB2-NEXT:    bx lr
290   %sh = shl i32 %b, %c
291   %xor = xor i32 %sh, %a
292   %res = icmp ne i32 %xor, 0
293   ret i1 %res
296 define i1 @cmp_ne_zero_xor_rsi(i32 %a, i32 %b) {
297 ; ARM-LABEL: cmp_ne_zero_xor_rsi:
298 ; ARM:       @ %bb.0:
299 ; ARM-NEXT:    eors r0, r0, r1, lsr #17
300 ; ARM-NEXT:    movwne r0, #1
301 ; ARM-NEXT:    bx lr
303 ; THUMB-LABEL: cmp_ne_zero_xor_rsi:
304 ; THUMB:       @ %bb.0:
305 ; THUMB-NEXT:    lsrs r1, r1, #17
306 ; THUMB-NEXT:    eors r0, r1
307 ; THUMB-NEXT:    subs r1, r0, #1
308 ; THUMB-NEXT:    sbcs r0, r1
309 ; THUMB-NEXT:    bx lr
311 ; THUMB2-LABEL: cmp_ne_zero_xor_rsi:
312 ; THUMB2:       @ %bb.0:
313 ; THUMB2-NEXT:    eors.w r0, r0, r1, lsr #17
314 ; THUMB2-NEXT:    it ne
315 ; THUMB2-NEXT:    movne r0, #1
316 ; THUMB2-NEXT:    bx lr
317   %sh = lshr i32 %b, 17
318   %xor = xor i32 %sh, %a
319   %res = icmp ne i32 %xor, 0
320   ret i1 %res
323 define i1 @cmp_ne_zero_and_not_rr(i32 %a, i32 %b) {
324 ; ARM-LABEL: cmp_ne_zero_and_not_rr:
325 ; ARM:       @ %bb.0:
326 ; ARM-NEXT:    bics r0, r0, r1
327 ; ARM-NEXT:    movwne r0, #1
328 ; ARM-NEXT:    bx lr
330 ; THUMB-LABEL: cmp_ne_zero_and_not_rr:
331 ; THUMB:       @ %bb.0:
332 ; THUMB-NEXT:    bics r0, r1
333 ; THUMB-NEXT:    subs r1, r0, #1
334 ; THUMB-NEXT:    sbcs r0, r1
335 ; THUMB-NEXT:    bx lr
337 ; THUMB2-LABEL: cmp_ne_zero_and_not_rr:
338 ; THUMB2:       @ %bb.0:
339 ; THUMB2-NEXT:    bics r0, r1
340 ; THUMB2-NEXT:    it ne
341 ; THUMB2-NEXT:    movne r0, #1
342 ; THUMB2-NEXT:    bx lr
343   %not = xor i32 %b, -1
344   %and = and i32 %a, %not
345   %res = icmp ne i32 %and, 0
346   ret i1 %res
349 define i1 @cmp_ne_zero_and_not_ri(i32 %a) {
350 ; ARM-LABEL: cmp_ne_zero_and_not_ri:
351 ; ARM:       @ %bb.0:
352 ; ARM-NEXT:    bics r0, r0, #42
353 ; ARM-NEXT:    movwne r0, #1
354 ; ARM-NEXT:    bx lr
356 ; THUMB-LABEL: cmp_ne_zero_and_not_ri:
357 ; THUMB:       @ %bb.0:
358 ; THUMB-NEXT:    movs r1, #42
359 ; THUMB-NEXT:    bics r0, r1
360 ; THUMB-NEXT:    subs r1, r0, #1
361 ; THUMB-NEXT:    sbcs r0, r1
362 ; THUMB-NEXT:    bx lr
364 ; THUMB2-LABEL: cmp_ne_zero_and_not_ri:
365 ; THUMB2:       @ %bb.0:
366 ; THUMB2-NEXT:    bics r0, r0, #42
367 ; THUMB2-NEXT:    it ne
368 ; THUMB2-NEXT:    movne r0, #1
369 ; THUMB2-NEXT:    bx lr
370   %not = xor i32 42, -1
371   %and = and i32 %a, %not
372   %res = icmp ne i32 %and, 0
373   ret i1 %res
376 define i1 @cmp_ne_zero_and_not_rsr(i32 %a, i32 %b, i32 %c) {
377 ; ARM-LABEL: cmp_ne_zero_and_not_rsr:
378 ; ARM:       @ %bb.0:
379 ; ARM-NEXT:    bics r0, r0, r1, lsl r2
380 ; ARM-NEXT:    movwne r0, #1
381 ; ARM-NEXT:    bx lr
383 ; THUMB-LABEL: cmp_ne_zero_and_not_rsr:
384 ; THUMB:       @ %bb.0:
385 ; THUMB-NEXT:    lsls r1, r2
386 ; THUMB-NEXT:    bics r0, r1
387 ; THUMB-NEXT:    subs r1, r0, #1
388 ; THUMB-NEXT:    sbcs r0, r1
389 ; THUMB-NEXT:    bx lr
391 ; THUMB2-LABEL: cmp_ne_zero_and_not_rsr:
392 ; THUMB2:       @ %bb.0:
393 ; THUMB2-NEXT:    lsls r1, r2
394 ; THUMB2-NEXT:    bics r0, r1
395 ; THUMB2-NEXT:    it ne
396 ; THUMB2-NEXT:    movne r0, #1
397 ; THUMB2-NEXT:    bx lr
398   %sh = shl i32 %b, %c
399   %not = xor i32 %sh, -1
400   %and = and i32 %not, %a
401   %res = icmp ne i32 %and, 0
402   ret i1 %res
405 define i1 @cmp_ne_zero_and_not_rsi(i32 %a, i32 %b) {
406 ; ARM-LABEL: cmp_ne_zero_and_not_rsi:
407 ; ARM:       @ %bb.0:
408 ; ARM-NEXT:    bics r0, r0, r1, lsr #17
409 ; ARM-NEXT:    movwne r0, #1
410 ; ARM-NEXT:    bx lr
412 ; THUMB-LABEL: cmp_ne_zero_and_not_rsi:
413 ; THUMB:       @ %bb.0:
414 ; THUMB-NEXT:    lsrs r1, r1, #17
415 ; THUMB-NEXT:    bics r0, r1
416 ; THUMB-NEXT:    subs r1, r0, #1
417 ; THUMB-NEXT:    sbcs r0, r1
418 ; THUMB-NEXT:    bx lr
420 ; THUMB2-LABEL: cmp_ne_zero_and_not_rsi:
421 ; THUMB2:       @ %bb.0:
422 ; THUMB2-NEXT:    bics.w r0, r0, r1, lsr #17
423 ; THUMB2-NEXT:    it ne
424 ; THUMB2-NEXT:    movne r0, #1
425 ; THUMB2-NEXT:    bx lr
426   %sh = lshr i32 %b, 17
427   %not = xor i32 %sh, -1
428   %and = and i32 %not, %a
429   %res = icmp ne i32 %and, 0
430   ret i1 %res
433 define i1 @cmp_ne_zero_shl_rr(i32 %a, i32 %b) {
434 ; ARM-LABEL: cmp_ne_zero_shl_rr:
435 ; ARM:       @ %bb.0:
436 ; ARM-NEXT:    lsls r0, r0, r1
437 ; ARM-NEXT:    movwne r0, #1
438 ; ARM-NEXT:    bx lr
440 ; THUMB-LABEL: cmp_ne_zero_shl_rr:
441 ; THUMB:       @ %bb.0:
442 ; THUMB-NEXT:    lsls r0, r1
443 ; THUMB-NEXT:    subs r1, r0, #1
444 ; THUMB-NEXT:    sbcs r0, r1
445 ; THUMB-NEXT:    bx lr
447 ; THUMB2-LABEL: cmp_ne_zero_shl_rr:
448 ; THUMB2:       @ %bb.0:
449 ; THUMB2-NEXT:    lsls r0, r1
450 ; THUMB2-NEXT:    it ne
451 ; THUMB2-NEXT:    movne r0, #1
452 ; THUMB2-NEXT:    bx lr
453     %sh = shl i32 %a, %b
454     %cmp = icmp ne i32 %sh, 0
455     ret i1 %cmp
458 define i1 @cmp_ne_zero_shl_ri(i32 %a) {
459 ; ARM-LABEL: cmp_ne_zero_shl_ri:
460 ; ARM:       @ %bb.0:
461 ; ARM-NEXT:    lsls r0, r0, #7
462 ; ARM-NEXT:    movwne r0, #1
463 ; ARM-NEXT:    bx lr
465 ; THUMB-LABEL: cmp_ne_zero_shl_ri:
466 ; THUMB:       @ %bb.0:
467 ; THUMB-NEXT:    lsls r0, r0, #7
468 ; THUMB-NEXT:    subs r1, r0, #1
469 ; THUMB-NEXT:    sbcs r0, r1
470 ; THUMB-NEXT:    bx lr
472 ; THUMB2-LABEL: cmp_ne_zero_shl_ri:
473 ; THUMB2:       @ %bb.0:
474 ; THUMB2-NEXT:    lsls r0, r0, #7
475 ; THUMB2-NEXT:    it ne
476 ; THUMB2-NEXT:    movne r0, #1
477 ; THUMB2-NEXT:    bx lr
478     %sh = shl i32 %a, 7
479     %cmp = icmp ne i32 %sh, 0
480     ret i1 %cmp
483 define i1 @cmp_ne_zero_lshr_rr(i32 %a, i32 %b) {
484 ; ARM-LABEL: cmp_ne_zero_lshr_rr:
485 ; ARM:       @ %bb.0:
486 ; ARM-NEXT:    lsrs r0, r0, r1
487 ; ARM-NEXT:    movwne r0, #1
488 ; ARM-NEXT:    bx lr
490 ; THUMB-LABEL: cmp_ne_zero_lshr_rr:
491 ; THUMB:       @ %bb.0:
492 ; THUMB-NEXT:    lsrs r0, r1
493 ; THUMB-NEXT:    subs r1, r0, #1
494 ; THUMB-NEXT:    sbcs r0, r1
495 ; THUMB-NEXT:    bx lr
497 ; THUMB2-LABEL: cmp_ne_zero_lshr_rr:
498 ; THUMB2:       @ %bb.0:
499 ; THUMB2-NEXT:    lsrs r0, r1
500 ; THUMB2-NEXT:    it ne
501 ; THUMB2-NEXT:    movne r0, #1
502 ; THUMB2-NEXT:    bx lr
503     %sh = lshr i32 %a, %b
504     %cmp = icmp ne i32 %sh, 0
505     ret i1 %cmp
508 define i1 @cmp_ne_zero_lshr_ri(i32 %a) {
509 ; ARM-LABEL: cmp_ne_zero_lshr_ri:
510 ; ARM:       @ %bb.0:
511 ; ARM-NEXT:    lsrs r0, r0, #7
512 ; ARM-NEXT:    movwne r0, #1
513 ; ARM-NEXT:    bx lr
515 ; THUMB-LABEL: cmp_ne_zero_lshr_ri:
516 ; THUMB:       @ %bb.0:
517 ; THUMB-NEXT:    lsrs r0, r0, #7
518 ; THUMB-NEXT:    subs r1, r0, #1
519 ; THUMB-NEXT:    sbcs r0, r1
520 ; THUMB-NEXT:    bx lr
522 ; THUMB2-LABEL: cmp_ne_zero_lshr_ri:
523 ; THUMB2:       @ %bb.0:
524 ; THUMB2-NEXT:    lsrs r0, r0, #7
525 ; THUMB2-NEXT:    it ne
526 ; THUMB2-NEXT:    movne r0, #1
527 ; THUMB2-NEXT:    bx lr
528     %sh = lshr i32 %a, 7
529     %cmp = icmp ne i32 %sh, 0
530     ret i1 %cmp
533 define i1 @cmp_ne_zero_ashr_rr(i32 %a, i32 %b) {
534 ; ARM-LABEL: cmp_ne_zero_ashr_rr:
535 ; ARM:       @ %bb.0:
536 ; ARM-NEXT:    asrs r0, r0, r1
537 ; ARM-NEXT:    movwne r0, #1
538 ; ARM-NEXT:    bx lr
540 ; THUMB-LABEL: cmp_ne_zero_ashr_rr:
541 ; THUMB:       @ %bb.0:
542 ; THUMB-NEXT:    asrs r0, r1
543 ; THUMB-NEXT:    subs r1, r0, #1
544 ; THUMB-NEXT:    sbcs r0, r1
545 ; THUMB-NEXT:    bx lr
547 ; THUMB2-LABEL: cmp_ne_zero_ashr_rr:
548 ; THUMB2:       @ %bb.0:
549 ; THUMB2-NEXT:    asrs r0, r1
550 ; THUMB2-NEXT:    cmp r0, #0
551 ; THUMB2-NEXT:    it ne
552 ; THUMB2-NEXT:    movne r0, #1
553 ; THUMB2-NEXT:    bx lr
554     %sh = ashr i32 %a, %b
555     %cmp = icmp ne i32 %sh, 0
556     ret i1 %cmp
559 define i1 @cmp_ne_zero_ashr_ri(i32 %a) {
560 ; ARM-LABEL: cmp_ne_zero_ashr_ri:
561 ; ARM:       @ %bb.0:
562 ; ARM-NEXT:    asrs r0, r0, #7
563 ; ARM-NEXT:    movwne r0, #1
564 ; ARM-NEXT:    bx lr
566 ; THUMB-LABEL: cmp_ne_zero_ashr_ri:
567 ; THUMB:       @ %bb.0:
568 ; THUMB-NEXT:    asrs r0, r0, #7
569 ; THUMB-NEXT:    subs r1, r0, #1
570 ; THUMB-NEXT:    sbcs r0, r1
571 ; THUMB-NEXT:    bx lr
573 ; THUMB2-LABEL: cmp_ne_zero_ashr_ri:
574 ; THUMB2:       @ %bb.0:
575 ; THUMB2-NEXT:    asrs r0, r0, #7
576 ; THUMB2-NEXT:    cmp r0, #0
577 ; THUMB2-NEXT:    it ne
578 ; THUMB2-NEXT:    movne r0, #1
579 ; THUMB2-NEXT:    bx lr
580     %sh = ashr i32 %a, 7
581     %cmp = icmp ne i32 %sh, 0
582     ret i1 %cmp
585 define i1 @cmp_eq_zero_and_rr(i32 %a, i32 %b) {
586 ; ARM-LABEL: cmp_eq_zero_and_rr:
587 ; ARM:       @ %bb.0:
588 ; ARM-NEXT:    and r0, r0, r1
589 ; ARM-NEXT:    clz r0, r0
590 ; ARM-NEXT:    lsr r0, r0, #5
591 ; ARM-NEXT:    bx lr
593 ; THUMB-LABEL: cmp_eq_zero_and_rr:
594 ; THUMB:       @ %bb.0:
595 ; THUMB-NEXT:    ands r0, r1
596 ; THUMB-NEXT:    rsbs r1, r0, #0
597 ; THUMB-NEXT:    adcs r0, r1
598 ; THUMB-NEXT:    bx lr
600 ; THUMB2-LABEL: cmp_eq_zero_and_rr:
601 ; THUMB2:       @ %bb.0:
602 ; THUMB2-NEXT:    ands r0, r1
603 ; THUMB2-NEXT:    clz r0, r0
604 ; THUMB2-NEXT:    lsrs r0, r0, #5
605 ; THUMB2-NEXT:    bx lr
606   %and = and i32 %a, %b
607   %res = icmp eq i32 %and, 0
608   ret i1 %res
611 define i1 @cmp_eq_zero_and_ri(i32 %a) {
612 ; ARM-LABEL: cmp_eq_zero_and_ri:
613 ; ARM:       @ %bb.0:
614 ; ARM-NEXT:    and r0, r0, #42
615 ; ARM-NEXT:    clz r0, r0
616 ; ARM-NEXT:    lsr r0, r0, #5
617 ; ARM-NEXT:    bx lr
619 ; THUMB-LABEL: cmp_eq_zero_and_ri:
620 ; THUMB:       @ %bb.0:
621 ; THUMB-NEXT:    movs r1, #42
622 ; THUMB-NEXT:    ands r0, r1
623 ; THUMB-NEXT:    rsbs r1, r0, #0
624 ; THUMB-NEXT:    adcs r0, r1
625 ; THUMB-NEXT:    bx lr
627 ; THUMB2-LABEL: cmp_eq_zero_and_ri:
628 ; THUMB2:       @ %bb.0:
629 ; THUMB2-NEXT:    and r0, r0, #42
630 ; THUMB2-NEXT:    clz r0, r0
631 ; THUMB2-NEXT:    lsrs r0, r0, #5
632 ; THUMB2-NEXT:    bx lr
633   %and = and i32 %a, 42
634   %res = icmp eq i32 %and, 0
635   ret i1 %res
638 define i1 @cmp_eq_zero_and_rsr(i32 %a, i32 %b, i32 %c) {
639 ; ARM-LABEL: cmp_eq_zero_and_rsr:
640 ; ARM:       @ %bb.0:
641 ; ARM-NEXT:    and r0, r0, r1, lsl r2
642 ; ARM-NEXT:    clz r0, r0
643 ; ARM-NEXT:    lsr r0, r0, #5
644 ; ARM-NEXT:    bx lr
646 ; THUMB-LABEL: cmp_eq_zero_and_rsr:
647 ; THUMB:       @ %bb.0:
648 ; THUMB-NEXT:    lsls r1, r2
649 ; THUMB-NEXT:    ands r0, r1
650 ; THUMB-NEXT:    rsbs r1, r0, #0
651 ; THUMB-NEXT:    adcs r0, r1
652 ; THUMB-NEXT:    bx lr
654 ; THUMB2-LABEL: cmp_eq_zero_and_rsr:
655 ; THUMB2:       @ %bb.0:
656 ; THUMB2-NEXT:    lsls r1, r2
657 ; THUMB2-NEXT:    ands r0, r1
658 ; THUMB2-NEXT:    clz r0, r0
659 ; THUMB2-NEXT:    lsrs r0, r0, #5
660 ; THUMB2-NEXT:    bx lr
661   %sh = shl i32 %b, %c
662   %and = and i32 %sh, %a
663   %res = icmp eq i32 %and, 0
664   ret i1 %res
667 define i1 @cmp_eq_zero_and_rsi(i32 %a, i32 %b) {
668 ; ARM-LABEL: cmp_eq_zero_and_rsi:
669 ; ARM:       @ %bb.0:
670 ; ARM-NEXT:    and r0, r0, r1, lsr #17
671 ; ARM-NEXT:    clz r0, r0
672 ; ARM-NEXT:    lsr r0, r0, #5
673 ; ARM-NEXT:    bx lr
675 ; THUMB-LABEL: cmp_eq_zero_and_rsi:
676 ; THUMB:       @ %bb.0:
677 ; THUMB-NEXT:    lsrs r1, r1, #17
678 ; THUMB-NEXT:    ands r0, r1
679 ; THUMB-NEXT:    rsbs r1, r0, #0
680 ; THUMB-NEXT:    adcs r0, r1
681 ; THUMB-NEXT:    bx lr
683 ; THUMB2-LABEL: cmp_eq_zero_and_rsi:
684 ; THUMB2:       @ %bb.0:
685 ; THUMB2-NEXT:    and.w r0, r0, r1, lsr #17
686 ; THUMB2-NEXT:    clz r0, r0
687 ; THUMB2-NEXT:    lsrs r0, r0, #5
688 ; THUMB2-NEXT:    bx lr
689   %sh = lshr i32 %b, 17
690   %and = and i32 %sh, %a
691   %res = icmp eq i32 %and, 0
692   ret i1 %res
695 define i1 @cmp_eq_zero_or_rr(i32 %a, i32 %b) {
696 ; ARM-LABEL: cmp_eq_zero_or_rr:
697 ; ARM:       @ %bb.0:
698 ; ARM-NEXT:    orr r0, r0, r1
699 ; ARM-NEXT:    clz r0, r0
700 ; ARM-NEXT:    lsr r0, r0, #5
701 ; ARM-NEXT:    bx lr
703 ; THUMB-LABEL: cmp_eq_zero_or_rr:
704 ; THUMB:       @ %bb.0:
705 ; THUMB-NEXT:    orrs r0, r1
706 ; THUMB-NEXT:    rsbs r1, r0, #0
707 ; THUMB-NEXT:    adcs r0, r1
708 ; THUMB-NEXT:    bx lr
710 ; THUMB2-LABEL: cmp_eq_zero_or_rr:
711 ; THUMB2:       @ %bb.0:
712 ; THUMB2-NEXT:    orrs r0, r1
713 ; THUMB2-NEXT:    clz r0, r0
714 ; THUMB2-NEXT:    lsrs r0, r0, #5
715 ; THUMB2-NEXT:    bx lr
716   %or = or i32 %a, %b
717   %res = icmp eq i32 %or, 0
718   ret i1 %res
721 define i1 @cmp_eq_zero_or_ri(i32 %a) {
722 ; ARM-LABEL: cmp_eq_zero_or_ri:
723 ; ARM:       @ %bb.0:
724 ; ARM-NEXT:    mov r0, #0
725 ; ARM-NEXT:    bx lr
727 ; THUMB-LABEL: cmp_eq_zero_or_ri:
728 ; THUMB:       @ %bb.0:
729 ; THUMB-NEXT:    movs r1, #42
730 ; THUMB-NEXT:    orrs r0, r1
731 ; THUMB-NEXT:    rsbs r1, r0, #0
732 ; THUMB-NEXT:    adcs r0, r1
733 ; THUMB-NEXT:    bx lr
735 ; THUMB2-LABEL: cmp_eq_zero_or_ri:
736 ; THUMB2:       @ %bb.0:
737 ; THUMB2-NEXT:    movs r0, #0
738 ; THUMB2-NEXT:    bx lr
739   %or = or i32 %a, 42
740   %res = icmp eq i32 %or, 0
741   ret i1 %res
744 define i1 @cmp_eq_zero_or_rsr(i32 %a, i32 %b, i32 %c) {
745 ; ARM-LABEL: cmp_eq_zero_or_rsr:
746 ; ARM:       @ %bb.0:
747 ; ARM-NEXT:    orr r0, r0, r1, lsl r2
748 ; ARM-NEXT:    clz r0, r0
749 ; ARM-NEXT:    lsr r0, r0, #5
750 ; ARM-NEXT:    bx lr
752 ; THUMB-LABEL: cmp_eq_zero_or_rsr:
753 ; THUMB:       @ %bb.0:
754 ; THUMB-NEXT:    lsls r1, r2
755 ; THUMB-NEXT:    orrs r0, r1
756 ; THUMB-NEXT:    rsbs r1, r0, #0
757 ; THUMB-NEXT:    adcs r0, r1
758 ; THUMB-NEXT:    bx lr
760 ; THUMB2-LABEL: cmp_eq_zero_or_rsr:
761 ; THUMB2:       @ %bb.0:
762 ; THUMB2-NEXT:    lsls r1, r2
763 ; THUMB2-NEXT:    orrs r0, r1
764 ; THUMB2-NEXT:    clz r0, r0
765 ; THUMB2-NEXT:    lsrs r0, r0, #5
766 ; THUMB2-NEXT:    bx lr
767   %sh = shl i32 %b, %c
768   %or = or i32 %sh, %a
769   %res = icmp eq i32 %or, 0
770   ret i1 %res
773 define i1 @cmp_eq_zero_or_rsi(i32 %a, i32 %b) {
774 ; ARM-LABEL: cmp_eq_zero_or_rsi:
775 ; ARM:       @ %bb.0:
776 ; ARM-NEXT:    orr r0, r0, r1, lsr #17
777 ; ARM-NEXT:    clz r0, r0
778 ; ARM-NEXT:    lsr r0, r0, #5
779 ; ARM-NEXT:    bx lr
781 ; THUMB-LABEL: cmp_eq_zero_or_rsi:
782 ; THUMB:       @ %bb.0:
783 ; THUMB-NEXT:    lsrs r1, r1, #17
784 ; THUMB-NEXT:    orrs r0, r1
785 ; THUMB-NEXT:    rsbs r1, r0, #0
786 ; THUMB-NEXT:    adcs r0, r1
787 ; THUMB-NEXT:    bx lr
789 ; THUMB2-LABEL: cmp_eq_zero_or_rsi:
790 ; THUMB2:       @ %bb.0:
791 ; THUMB2-NEXT:    orr.w r0, r0, r1, lsr #17
792 ; THUMB2-NEXT:    clz r0, r0
793 ; THUMB2-NEXT:    lsrs r0, r0, #5
794 ; THUMB2-NEXT:    bx lr
795   %sh = lshr i32 %b, 17
796   %or = or i32 %sh, %a
797   %res = icmp eq i32 %or, 0
798   ret i1 %res
801 define i1 @cmp_eq_zero_xor_rr(i32 %a, i32 %b) {
802 ; ARM-LABEL: cmp_eq_zero_xor_rr:
803 ; ARM:       @ %bb.0:
804 ; ARM-NEXT:    eor r0, r0, r1
805 ; ARM-NEXT:    clz r0, r0
806 ; ARM-NEXT:    lsr r0, r0, #5
807 ; ARM-NEXT:    bx lr
809 ; THUMB-LABEL: cmp_eq_zero_xor_rr:
810 ; THUMB:       @ %bb.0:
811 ; THUMB-NEXT:    eors r0, r1
812 ; THUMB-NEXT:    rsbs r1, r0, #0
813 ; THUMB-NEXT:    adcs r0, r1
814 ; THUMB-NEXT:    bx lr
816 ; THUMB2-LABEL: cmp_eq_zero_xor_rr:
817 ; THUMB2:       @ %bb.0:
818 ; THUMB2-NEXT:    eors r0, r1
819 ; THUMB2-NEXT:    clz r0, r0
820 ; THUMB2-NEXT:    lsrs r0, r0, #5
821 ; THUMB2-NEXT:    bx lr
822   %xor = xor i32 %a, %b
823   %res = icmp eq i32 %xor, 0
824   ret i1 %res
827 define i1 @cmp_eq_zero_xor_ri(i32 %a) {
828 ; ARM-LABEL: cmp_eq_zero_xor_ri:
829 ; ARM:       @ %bb.0:
830 ; ARM-NEXT:    sub r0, r0, #42
831 ; ARM-NEXT:    clz r0, r0
832 ; ARM-NEXT:    lsr r0, r0, #5
833 ; ARM-NEXT:    bx lr
835 ; THUMB-LABEL: cmp_eq_zero_xor_ri:
836 ; THUMB:       @ %bb.0:
837 ; THUMB-NEXT:    subs r0, #42
838 ; THUMB-NEXT:    rsbs r1, r0, #0
839 ; THUMB-NEXT:    adcs r0, r1
840 ; THUMB-NEXT:    bx lr
842 ; THUMB2-LABEL: cmp_eq_zero_xor_ri:
843 ; THUMB2:       @ %bb.0:
844 ; THUMB2-NEXT:    subs r0, #42
845 ; THUMB2-NEXT:    clz r0, r0
846 ; THUMB2-NEXT:    lsrs r0, r0, #5
847 ; THUMB2-NEXT:    bx lr
848   %xor = xor i32 %a, 42
849   %res = icmp eq i32 %xor, 0
850   ret i1 %res
853 define i1 @cmp_eq_zero_xor_rsr(i32 %a, i32 %b, i32 %c) {
854 ; ARM-LABEL: cmp_eq_zero_xor_rsr:
855 ; ARM:       @ %bb.0:
856 ; ARM-NEXT:    eor r0, r0, r1, lsl r2
857 ; ARM-NEXT:    clz r0, r0
858 ; ARM-NEXT:    lsr r0, r0, #5
859 ; ARM-NEXT:    bx lr
861 ; THUMB-LABEL: cmp_eq_zero_xor_rsr:
862 ; THUMB:       @ %bb.0:
863 ; THUMB-NEXT:    lsls r1, r2
864 ; THUMB-NEXT:    eors r0, r1
865 ; THUMB-NEXT:    rsbs r1, r0, #0
866 ; THUMB-NEXT:    adcs r0, r1
867 ; THUMB-NEXT:    bx lr
869 ; THUMB2-LABEL: cmp_eq_zero_xor_rsr:
870 ; THUMB2:       @ %bb.0:
871 ; THUMB2-NEXT:    lsls r1, r2
872 ; THUMB2-NEXT:    eors r0, r1
873 ; THUMB2-NEXT:    clz r0, r0
874 ; THUMB2-NEXT:    lsrs r0, r0, #5
875 ; THUMB2-NEXT:    bx lr
876   %sh = shl i32 %b, %c
877   %xor = xor i32 %sh, %a
878   %res = icmp eq i32 %xor, 0
879   ret i1 %res
882 define i1 @cmp_eq_zero_xor_rsi(i32 %a, i32 %b) {
883 ; ARM-LABEL: cmp_eq_zero_xor_rsi:
884 ; ARM:       @ %bb.0:
885 ; ARM-NEXT:    eor r0, r0, r1, lsr #17
886 ; ARM-NEXT:    clz r0, r0
887 ; ARM-NEXT:    lsr r0, r0, #5
888 ; ARM-NEXT:    bx lr
890 ; THUMB-LABEL: cmp_eq_zero_xor_rsi:
891 ; THUMB:       @ %bb.0:
892 ; THUMB-NEXT:    lsrs r1, r1, #17
893 ; THUMB-NEXT:    eors r0, r1
894 ; THUMB-NEXT:    rsbs r1, r0, #0
895 ; THUMB-NEXT:    adcs r0, r1
896 ; THUMB-NEXT:    bx lr
898 ; THUMB2-LABEL: cmp_eq_zero_xor_rsi:
899 ; THUMB2:       @ %bb.0:
900 ; THUMB2-NEXT:    eor.w r0, r0, r1, lsr #17
901 ; THUMB2-NEXT:    clz r0, r0
902 ; THUMB2-NEXT:    lsrs r0, r0, #5
903 ; THUMB2-NEXT:    bx lr
904   %sh = lshr i32 %b, 17
905   %xor = xor i32 %sh, %a
906   %res = icmp eq i32 %xor, 0
907   ret i1 %res
910 define i1 @cmp_eq_zero_and_not_rr(i32 %a, i32 %b) {
911 ; ARM-LABEL: cmp_eq_zero_and_not_rr:
912 ; ARM:       @ %bb.0:
913 ; ARM-NEXT:    bic r0, r0, r1
914 ; ARM-NEXT:    clz r0, r0
915 ; ARM-NEXT:    lsr r0, r0, #5
916 ; ARM-NEXT:    bx lr
918 ; THUMB-LABEL: cmp_eq_zero_and_not_rr:
919 ; THUMB:       @ %bb.0:
920 ; THUMB-NEXT:    bics r0, r1
921 ; THUMB-NEXT:    rsbs r1, r0, #0
922 ; THUMB-NEXT:    adcs r0, r1
923 ; THUMB-NEXT:    bx lr
925 ; THUMB2-LABEL: cmp_eq_zero_and_not_rr:
926 ; THUMB2:       @ %bb.0:
927 ; THUMB2-NEXT:    bics r0, r1
928 ; THUMB2-NEXT:    clz r0, r0
929 ; THUMB2-NEXT:    lsrs r0, r0, #5
930 ; THUMB2-NEXT:    bx lr
931   %not = xor i32 %b, -1
932   %and = and i32 %a, %not
933   %res = icmp eq i32 %and, 0
934   ret i1 %res
937 define i1 @cmp_eq_zero_and_not_ri(i32 %a) {
938 ; ARM-LABEL: cmp_eq_zero_and_not_ri:
939 ; ARM:       @ %bb.0:
940 ; ARM-NEXT:    bic r0, r0, #42
941 ; ARM-NEXT:    clz r0, r0
942 ; ARM-NEXT:    lsr r0, r0, #5
943 ; ARM-NEXT:    bx lr
945 ; THUMB-LABEL: cmp_eq_zero_and_not_ri:
946 ; THUMB:       @ %bb.0:
947 ; THUMB-NEXT:    movs r1, #42
948 ; THUMB-NEXT:    bics r0, r1
949 ; THUMB-NEXT:    rsbs r1, r0, #0
950 ; THUMB-NEXT:    adcs r0, r1
951 ; THUMB-NEXT:    bx lr
953 ; THUMB2-LABEL: cmp_eq_zero_and_not_ri:
954 ; THUMB2:       @ %bb.0:
955 ; THUMB2-NEXT:    bic r0, r0, #42
956 ; THUMB2-NEXT:    clz r0, r0
957 ; THUMB2-NEXT:    lsrs r0, r0, #5
958 ; THUMB2-NEXT:    bx lr
959   %not = xor i32 42, -1
960   %and = and i32 %a, %not
961   %res = icmp eq i32 %and, 0
962   ret i1 %res
965 define i1 @cmp_eq_zero_and_not_rsr(i32 %a, i32 %b, i32 %c) {
966 ; ARM-LABEL: cmp_eq_zero_and_not_rsr:
967 ; ARM:       @ %bb.0:
968 ; ARM-NEXT:    bic r0, r0, r1, lsl r2
969 ; ARM-NEXT:    clz r0, r0
970 ; ARM-NEXT:    lsr r0, r0, #5
971 ; ARM-NEXT:    bx lr
973 ; THUMB-LABEL: cmp_eq_zero_and_not_rsr:
974 ; THUMB:       @ %bb.0:
975 ; THUMB-NEXT:    lsls r1, r2
976 ; THUMB-NEXT:    bics r0, r1
977 ; THUMB-NEXT:    rsbs r1, r0, #0
978 ; THUMB-NEXT:    adcs r0, r1
979 ; THUMB-NEXT:    bx lr
981 ; THUMB2-LABEL: cmp_eq_zero_and_not_rsr:
982 ; THUMB2:       @ %bb.0:
983 ; THUMB2-NEXT:    lsls r1, r2
984 ; THUMB2-NEXT:    bics r0, r1
985 ; THUMB2-NEXT:    clz r0, r0
986 ; THUMB2-NEXT:    lsrs r0, r0, #5
987 ; THUMB2-NEXT:    bx lr
988   %sh = shl i32 %b, %c
989   %not = xor i32 %sh, -1
990   %and = and i32 %not, %a
991   %res = icmp eq i32 %and, 0
992   ret i1 %res
995 define i1 @cmp_eq_zero_and_not_rsi(i32 %a, i32 %b) {
996 ; ARM-LABEL: cmp_eq_zero_and_not_rsi:
997 ; ARM:       @ %bb.0:
998 ; ARM-NEXT:    bic r0, r0, r1, lsr #17
999 ; ARM-NEXT:    clz r0, r0
1000 ; ARM-NEXT:    lsr r0, r0, #5
1001 ; ARM-NEXT:    bx lr
1003 ; THUMB-LABEL: cmp_eq_zero_and_not_rsi:
1004 ; THUMB:       @ %bb.0:
1005 ; THUMB-NEXT:    lsrs r1, r1, #17
1006 ; THUMB-NEXT:    bics r0, r1
1007 ; THUMB-NEXT:    rsbs r1, r0, #0
1008 ; THUMB-NEXT:    adcs r0, r1
1009 ; THUMB-NEXT:    bx lr
1011 ; THUMB2-LABEL: cmp_eq_zero_and_not_rsi:
1012 ; THUMB2:       @ %bb.0:
1013 ; THUMB2-NEXT:    bic.w r0, r0, r1, lsr #17
1014 ; THUMB2-NEXT:    clz r0, r0
1015 ; THUMB2-NEXT:    lsrs r0, r0, #5
1016 ; THUMB2-NEXT:    bx lr
1017   %sh = lshr i32 %b, 17
1018   %not = xor i32 %sh, -1
1019   %and = and i32 %not, %a
1020   %res = icmp eq i32 %and, 0
1021   ret i1 %res
1024 define i1 @cmp_eq_zero_shl_rr(i32 %a, i32 %b) {
1025 ; ARM-LABEL: cmp_eq_zero_shl_rr:
1026 ; ARM:       @ %bb.0:
1027 ; ARM-NEXT:    lsl r0, r0, r1
1028 ; ARM-NEXT:    clz r0, r0
1029 ; ARM-NEXT:    lsr r0, r0, #5
1030 ; ARM-NEXT:    bx lr
1032 ; THUMB-LABEL: cmp_eq_zero_shl_rr:
1033 ; THUMB:       @ %bb.0:
1034 ; THUMB-NEXT:    lsls r0, r1
1035 ; THUMB-NEXT:    rsbs r1, r0, #0
1036 ; THUMB-NEXT:    adcs r0, r1
1037 ; THUMB-NEXT:    bx lr
1039 ; THUMB2-LABEL: cmp_eq_zero_shl_rr:
1040 ; THUMB2:       @ %bb.0:
1041 ; THUMB2-NEXT:    lsls r0, r1
1042 ; THUMB2-NEXT:    clz r0, r0
1043 ; THUMB2-NEXT:    lsrs r0, r0, #5
1044 ; THUMB2-NEXT:    bx lr
1045     %sh = shl i32 %a, %b
1046     %cmp = icmp eq i32 %sh, 0
1047     ret i1 %cmp
1050 define i1 @cmp_eq_zero_shl_ri(i32 %a) {
1051 ; ARM-LABEL: cmp_eq_zero_shl_ri:
1052 ; ARM:       @ %bb.0:
1053 ; ARM-NEXT:    lsl r0, r0, #7
1054 ; ARM-NEXT:    clz r0, r0
1055 ; ARM-NEXT:    lsr r0, r0, #5
1056 ; ARM-NEXT:    bx lr
1058 ; THUMB-LABEL: cmp_eq_zero_shl_ri:
1059 ; THUMB:       @ %bb.0:
1060 ; THUMB-NEXT:    lsls r1, r0, #7
1061 ; THUMB-NEXT:    rsbs r0, r1, #0
1062 ; THUMB-NEXT:    adcs r0, r1
1063 ; THUMB-NEXT:    bx lr
1065 ; THUMB2-LABEL: cmp_eq_zero_shl_ri:
1066 ; THUMB2:       @ %bb.0:
1067 ; THUMB2-NEXT:    lsls r0, r0, #7
1068 ; THUMB2-NEXT:    clz r0, r0
1069 ; THUMB2-NEXT:    lsrs r0, r0, #5
1070 ; THUMB2-NEXT:    bx lr
1071     %sh = shl i32 %a, 7
1072     %cmp = icmp eq i32 %sh, 0
1073     ret i1 %cmp
1076 define i1 @cmp_eq_zero_lshr_rr(i32 %a, i32 %b) {
1077 ; ARM-LABEL: cmp_eq_zero_lshr_rr:
1078 ; ARM:       @ %bb.0:
1079 ; ARM-NEXT:    lsr r0, r0, r1
1080 ; ARM-NEXT:    clz r0, r0
1081 ; ARM-NEXT:    lsr r0, r0, #5
1082 ; ARM-NEXT:    bx lr
1084 ; THUMB-LABEL: cmp_eq_zero_lshr_rr:
1085 ; THUMB:       @ %bb.0:
1086 ; THUMB-NEXT:    lsrs r0, r1
1087 ; THUMB-NEXT:    rsbs r1, r0, #0
1088 ; THUMB-NEXT:    adcs r0, r1
1089 ; THUMB-NEXT:    bx lr
1091 ; THUMB2-LABEL: cmp_eq_zero_lshr_rr:
1092 ; THUMB2:       @ %bb.0:
1093 ; THUMB2-NEXT:    lsrs r0, r1
1094 ; THUMB2-NEXT:    clz r0, r0
1095 ; THUMB2-NEXT:    lsrs r0, r0, #5
1096 ; THUMB2-NEXT:    bx lr
1097     %sh = lshr i32 %a, %b
1098     %cmp = icmp eq i32 %sh, 0
1099     ret i1 %cmp
1102 define i1 @cmp_eq_zero_lshr_ri(i32 %a) {
1103 ; ARM-LABEL: cmp_eq_zero_lshr_ri:
1104 ; ARM:       @ %bb.0:
1105 ; ARM-NEXT:    lsr r0, r0, #7
1106 ; ARM-NEXT:    clz r0, r0
1107 ; ARM-NEXT:    lsr r0, r0, #5
1108 ; ARM-NEXT:    bx lr
1110 ; THUMB-LABEL: cmp_eq_zero_lshr_ri:
1111 ; THUMB:       @ %bb.0:
1112 ; THUMB-NEXT:    lsrs r1, r0, #7
1113 ; THUMB-NEXT:    rsbs r0, r1, #0
1114 ; THUMB-NEXT:    adcs r0, r1
1115 ; THUMB-NEXT:    bx lr
1117 ; THUMB2-LABEL: cmp_eq_zero_lshr_ri:
1118 ; THUMB2:       @ %bb.0:
1119 ; THUMB2-NEXT:    lsrs r0, r0, #7
1120 ; THUMB2-NEXT:    clz r0, r0
1121 ; THUMB2-NEXT:    lsrs r0, r0, #5
1122 ; THUMB2-NEXT:    bx lr
1123     %sh = lshr i32 %a, 7
1124     %cmp = icmp eq i32 %sh, 0
1125     ret i1 %cmp
1128 define i1 @cmp_eq_zero_ashr_rr(i32 %a, i32 %b) {
1129 ; ARM-LABEL: cmp_eq_zero_ashr_rr:
1130 ; ARM:       @ %bb.0:
1131 ; ARM-NEXT:    asr r0, r0, r1
1132 ; ARM-NEXT:    clz r0, r0
1133 ; ARM-NEXT:    lsr r0, r0, #5
1134 ; ARM-NEXT:    bx lr
1136 ; THUMB-LABEL: cmp_eq_zero_ashr_rr:
1137 ; THUMB:       @ %bb.0:
1138 ; THUMB-NEXT:    asrs r0, r1
1139 ; THUMB-NEXT:    rsbs r1, r0, #0
1140 ; THUMB-NEXT:    adcs r0, r1
1141 ; THUMB-NEXT:    bx lr
1143 ; THUMB2-LABEL: cmp_eq_zero_ashr_rr:
1144 ; THUMB2:       @ %bb.0:
1145 ; THUMB2-NEXT:    asrs r0, r1
1146 ; THUMB2-NEXT:    clz r0, r0
1147 ; THUMB2-NEXT:    lsrs r0, r0, #5
1148 ; THUMB2-NEXT:    bx lr
1149     %sh = ashr i32 %a, %b
1150     %cmp = icmp eq i32 %sh, 0
1151     ret i1 %cmp
1154 define i1 @cmp_eq_zero_ashr_ri(i32 %a) {
1155 ; ARM-LABEL: cmp_eq_zero_ashr_ri:
1156 ; ARM:       @ %bb.0:
1157 ; ARM-NEXT:    asr r0, r0, #7
1158 ; ARM-NEXT:    clz r0, r0
1159 ; ARM-NEXT:    lsr r0, r0, #5
1160 ; ARM-NEXT:    bx lr
1162 ; THUMB-LABEL: cmp_eq_zero_ashr_ri:
1163 ; THUMB:       @ %bb.0:
1164 ; THUMB-NEXT:    asrs r1, r0, #7
1165 ; THUMB-NEXT:    rsbs r0, r1, #0
1166 ; THUMB-NEXT:    adcs r0, r1
1167 ; THUMB-NEXT:    bx lr
1169 ; THUMB2-LABEL: cmp_eq_zero_ashr_ri:
1170 ; THUMB2:       @ %bb.0:
1171 ; THUMB2-NEXT:    asrs r0, r0, #7
1172 ; THUMB2-NEXT:    clz r0, r0
1173 ; THUMB2-NEXT:    lsrs r0, r0, #5
1174 ; THUMB2-NEXT:    bx lr
1175     %sh = ashr i32 %a, 7
1176     %cmp = icmp eq i32 %sh, 0
1177     ret i1 %cmp
1180 declare void @consume(i32 %0);
1182 define void @br_on_binop_eq_zero(i32 %a, i32 %b) {
1183 ; ARM-LABEL: br_on_binop_eq_zero:
1184 ; ARM:       @ %bb.0:
1185 ; ARM-NEXT:    orrs r1, r0, r1
1186 ; ARM-NEXT:    bxne lr
1187 ; ARM-NEXT:  .LBB44_1: @ %true_br
1188 ; ARM-NEXT:    push {r11, lr}
1189 ; ARM-NEXT:    bl consume
1190 ; ARM-NEXT:    pop {r11, lr}
1191 ; ARM-NEXT:    bx lr
1193 ; THUMB-LABEL: br_on_binop_eq_zero:
1194 ; THUMB:       @ %bb.0:
1195 ; THUMB-NEXT:    push {r7, lr}
1196 ; THUMB-NEXT:    orrs r1, r0
1197 ; THUMB-NEXT:    beq .LBB44_2
1198 ; THUMB-NEXT:  @ %bb.1: @ %exit
1199 ; THUMB-NEXT:    pop {r7, pc}
1200 ; THUMB-NEXT:  .LBB44_2: @ %true_br
1201 ; THUMB-NEXT:    bl consume
1202 ; THUMB-NEXT:    pop {r7, pc}
1204 ; THUMB2-LABEL: br_on_binop_eq_zero:
1205 ; THUMB2:       @ %bb.0:
1206 ; THUMB2-NEXT:    orrs r1, r0
1207 ; THUMB2-NEXT:    it ne
1208 ; THUMB2-NEXT:    bxne lr
1209 ; THUMB2-NEXT:  .LBB44_1: @ %true_br
1210 ; THUMB2-NEXT:    push {r7, lr}
1211 ; THUMB2-NEXT:    bl consume
1212 ; THUMB2-NEXT:    pop.w {r7, lr}
1213 ; THUMB2-NEXT:    bx lr
1214     %or = or i32 %a, %b
1215     %cmp = icmp eq i32 %or, 0
1216     br i1 %cmp, label %true_br, label %exit
1217 true_br:
1218     call void @consume(i32 %a)
1219     br label %exit
1220 exit:
1221     ret void
1224 define void @br_on_binop_ne_zero(i32 %a, i32 %b) {
1225 ; ARM-LABEL: br_on_binop_ne_zero:
1226 ; ARM:       @ %bb.0:
1227 ; ARM-NEXT:    orrs r1, r0, r1
1228 ; ARM-NEXT:    bxeq lr
1229 ; ARM-NEXT:  .LBB45_1: @ %true_br
1230 ; ARM-NEXT:    push {r11, lr}
1231 ; ARM-NEXT:    bl consume
1232 ; ARM-NEXT:    pop {r11, lr}
1233 ; ARM-NEXT:    bx lr
1235 ; THUMB-LABEL: br_on_binop_ne_zero:
1236 ; THUMB:       @ %bb.0:
1237 ; THUMB-NEXT:    push {r7, lr}
1238 ; THUMB-NEXT:    orrs r1, r0
1239 ; THUMB-NEXT:    beq .LBB45_2
1240 ; THUMB-NEXT:  @ %bb.1: @ %true_br
1241 ; THUMB-NEXT:    bl consume
1242 ; THUMB-NEXT:  .LBB45_2: @ %exit
1243 ; THUMB-NEXT:    pop {r7, pc}
1245 ; THUMB2-LABEL: br_on_binop_ne_zero:
1246 ; THUMB2:       @ %bb.0:
1247 ; THUMB2-NEXT:    orrs r1, r0
1248 ; THUMB2-NEXT:    it eq
1249 ; THUMB2-NEXT:    bxeq lr
1250 ; THUMB2-NEXT:  .LBB45_1: @ %true_br
1251 ; THUMB2-NEXT:    push {r7, lr}
1252 ; THUMB2-NEXT:    bl consume
1253 ; THUMB2-NEXT:    pop.w {r7, lr}
1254 ; THUMB2-NEXT:    bx lr
1255     %or = or i32 %a, %b
1256     %cmp = icmp ne i32 %or, 0
1257     br i1 %cmp, label %true_br, label %exit
1258 true_br:
1259     call void @consume(i32 %a)
1260     br label %exit
1261 exit:
1262     ret void
1265 define void @br_on_binop_lt_zero(i32 %a, i32 %b) {
1266 ; ARM-LABEL: br_on_binop_lt_zero:
1267 ; ARM:       @ %bb.0:
1268 ; ARM-NEXT:    orr r1, r0, r1
1269 ; ARM-NEXT:    cmp r1, #0
1270 ; ARM-NEXT:    bxhs lr
1271 ; ARM-NEXT:  .LBB46_1: @ %true_br
1272 ; ARM-NEXT:    push {r11, lr}
1273 ; ARM-NEXT:    bl consume
1274 ; ARM-NEXT:    pop {r11, lr}
1275 ; ARM-NEXT:    bx lr
1277 ; THUMB-LABEL: br_on_binop_lt_zero:
1278 ; THUMB:       @ %bb.0:
1279 ; THUMB-NEXT:    push {r7, lr}
1280 ; THUMB-NEXT:    orrs r1, r0
1281 ; THUMB-NEXT:    cmp r1, #0
1282 ; THUMB-NEXT:    bhs .LBB46_2
1283 ; THUMB-NEXT:  @ %bb.1: @ %true_br
1284 ; THUMB-NEXT:    bl consume
1285 ; THUMB-NEXT:  .LBB46_2: @ %exit
1286 ; THUMB-NEXT:    pop {r7, pc}
1288 ; THUMB2-LABEL: br_on_binop_lt_zero:
1289 ; THUMB2:       @ %bb.0:
1290 ; THUMB2-NEXT:    orrs r1, r0
1291 ; THUMB2-NEXT:    cmp r1, #0
1292 ; THUMB2-NEXT:    it hs
1293 ; THUMB2-NEXT:    bxhs lr
1294 ; THUMB2-NEXT:  .LBB46_1: @ %true_br
1295 ; THUMB2-NEXT:    push {r7, lr}
1296 ; THUMB2-NEXT:    bl consume
1297 ; THUMB2-NEXT:    pop.w {r7, lr}
1298 ; THUMB2-NEXT:    bx lr
1299     %or = or i32 %a, %b
1300     %cmp = icmp ult i32 %or, 0
1301     br i1 %cmp, label %true_br, label %exit
1302 true_br:
1303     call void @consume(i32 %a)
1304     br label %exit
1305 exit:
1306     ret void
1309 define void @br_on_binop_eq_imm(i32 %a, i32 %b) {
1310 ; ARM-LABEL: br_on_binop_eq_imm:
1311 ; ARM:       @ %bb.0:
1312 ; ARM-NEXT:    orr r1, r0, r1
1313 ; ARM-NEXT:    cmp r1, #42
1314 ; ARM-NEXT:    bxne lr
1315 ; ARM-NEXT:  .LBB47_1: @ %true_br
1316 ; ARM-NEXT:    push {r11, lr}
1317 ; ARM-NEXT:    bl consume
1318 ; ARM-NEXT:    pop {r11, lr}
1319 ; ARM-NEXT:    bx lr
1321 ; THUMB-LABEL: br_on_binop_eq_imm:
1322 ; THUMB:       @ %bb.0:
1323 ; THUMB-NEXT:    push {r7, lr}
1324 ; THUMB-NEXT:    orrs r1, r0
1325 ; THUMB-NEXT:    cmp r1, #42
1326 ; THUMB-NEXT:    bne .LBB47_2
1327 ; THUMB-NEXT:  @ %bb.1: @ %true_br
1328 ; THUMB-NEXT:    bl consume
1329 ; THUMB-NEXT:  .LBB47_2: @ %exit
1330 ; THUMB-NEXT:    pop {r7, pc}
1332 ; THUMB2-LABEL: br_on_binop_eq_imm:
1333 ; THUMB2:       @ %bb.0:
1334 ; THUMB2-NEXT:    orrs r1, r0
1335 ; THUMB2-NEXT:    cmp r1, #42
1336 ; THUMB2-NEXT:    it ne
1337 ; THUMB2-NEXT:    bxne lr
1338 ; THUMB2-NEXT:  .LBB47_1: @ %true_br
1339 ; THUMB2-NEXT:    push {r7, lr}
1340 ; THUMB2-NEXT:    bl consume
1341 ; THUMB2-NEXT:    pop.w {r7, lr}
1342 ; THUMB2-NEXT:    bx lr
1343     %or = or i32 %a, %b
1344     %cmp = icmp eq i32 %or, 42
1345     br i1 %cmp, label %true_br, label %exit
1346 true_br:
1347     call void @consume(i32 %a)
1348     br label %exit
1349 exit:
1350     ret void
1353 define void @br_on_binop_ne_imm(i32 %a, i32 %b) {
1354 ; ARM-LABEL: br_on_binop_ne_imm:
1355 ; ARM:       @ %bb.0:
1356 ; ARM-NEXT:    orr r1, r0, r1
1357 ; ARM-NEXT:    cmp r1, #42
1358 ; ARM-NEXT:    bxeq lr
1359 ; ARM-NEXT:  .LBB48_1: @ %true_br
1360 ; ARM-NEXT:    push {r11, lr}
1361 ; ARM-NEXT:    bl consume
1362 ; ARM-NEXT:    pop {r11, lr}
1363 ; ARM-NEXT:    bx lr
1365 ; THUMB-LABEL: br_on_binop_ne_imm:
1366 ; THUMB:       @ %bb.0:
1367 ; THUMB-NEXT:    push {r7, lr}
1368 ; THUMB-NEXT:    orrs r1, r0
1369 ; THUMB-NEXT:    cmp r1, #42
1370 ; THUMB-NEXT:    beq .LBB48_2
1371 ; THUMB-NEXT:  @ %bb.1: @ %true_br
1372 ; THUMB-NEXT:    bl consume
1373 ; THUMB-NEXT:  .LBB48_2: @ %exit
1374 ; THUMB-NEXT:    pop {r7, pc}
1376 ; THUMB2-LABEL: br_on_binop_ne_imm:
1377 ; THUMB2:       @ %bb.0:
1378 ; THUMB2-NEXT:    orrs r1, r0
1379 ; THUMB2-NEXT:    cmp r1, #42
1380 ; THUMB2-NEXT:    it eq
1381 ; THUMB2-NEXT:    bxeq lr
1382 ; THUMB2-NEXT:  .LBB48_1: @ %true_br
1383 ; THUMB2-NEXT:    push {r7, lr}
1384 ; THUMB2-NEXT:    bl consume
1385 ; THUMB2-NEXT:    pop.w {r7, lr}
1386 ; THUMB2-NEXT:    bx lr
1387     %or = or i32 %a, %b
1388     %cmp = icmp ne i32 %or, 42
1389     br i1 %cmp, label %true_br, label %exit
1390 true_br:
1391     call void @consume(i32 %a)
1392     br label %exit
1393 exit:
1394     ret void
1397 define void @br_on_binop_eq_reg(i32 %a, i32 %b, i32 %c) {
1398 ; ARM-LABEL: br_on_binop_eq_reg:
1399 ; ARM:       @ %bb.0:
1400 ; ARM-NEXT:    eor r1, r0, r1
1401 ; ARM-NEXT:    cmp r1, r2
1402 ; ARM-NEXT:    bxne lr
1403 ; ARM-NEXT:  .LBB49_1: @ %true_br
1404 ; ARM-NEXT:    push {r11, lr}
1405 ; ARM-NEXT:    bl consume
1406 ; ARM-NEXT:    pop {r11, lr}
1407 ; ARM-NEXT:    bx lr
1409 ; THUMB-LABEL: br_on_binop_eq_reg:
1410 ; THUMB:       @ %bb.0:
1411 ; THUMB-NEXT:    push {r7, lr}
1412 ; THUMB-NEXT:    eors r1, r0
1413 ; THUMB-NEXT:    cmp r1, r2
1414 ; THUMB-NEXT:    bne .LBB49_2
1415 ; THUMB-NEXT:  @ %bb.1: @ %true_br
1416 ; THUMB-NEXT:    bl consume
1417 ; THUMB-NEXT:  .LBB49_2: @ %exit
1418 ; THUMB-NEXT:    pop {r7, pc}
1420 ; THUMB2-LABEL: br_on_binop_eq_reg:
1421 ; THUMB2:       @ %bb.0:
1422 ; THUMB2-NEXT:    eors r1, r0
1423 ; THUMB2-NEXT:    cmp r1, r2
1424 ; THUMB2-NEXT:    it ne
1425 ; THUMB2-NEXT:    bxne lr
1426 ; THUMB2-NEXT:  .LBB49_1: @ %true_br
1427 ; THUMB2-NEXT:    push {r7, lr}
1428 ; THUMB2-NEXT:    bl consume
1429 ; THUMB2-NEXT:    pop.w {r7, lr}
1430 ; THUMB2-NEXT:    bx lr
1431     %xor = xor i32 %a, %b
1432     %cmp = icmp eq i32 %xor, %c
1433     br i1 %cmp, label %true_br, label %exit
1434 true_br:
1435     call void @consume(i32 %a)
1436     br label %exit
1437 exit:
1438     ret void
1441 define void @br_on_binop_ne_reg(i32 %a, i32 %b, i32 %c) {
1442 ; ARM-LABEL: br_on_binop_ne_reg:
1443 ; ARM:       @ %bb.0:
1444 ; ARM-NEXT:    and r1, r0, r1
1445 ; ARM-NEXT:    cmp r1, r2
1446 ; ARM-NEXT:    bxeq lr
1447 ; ARM-NEXT:  .LBB50_1: @ %true_br
1448 ; ARM-NEXT:    push {r11, lr}
1449 ; ARM-NEXT:    bl consume
1450 ; ARM-NEXT:    pop {r11, lr}
1451 ; ARM-NEXT:    bx lr
1453 ; THUMB-LABEL: br_on_binop_ne_reg:
1454 ; THUMB:       @ %bb.0:
1455 ; THUMB-NEXT:    push {r7, lr}
1456 ; THUMB-NEXT:    ands r1, r0
1457 ; THUMB-NEXT:    cmp r1, r2
1458 ; THUMB-NEXT:    beq .LBB50_2
1459 ; THUMB-NEXT:  @ %bb.1: @ %true_br
1460 ; THUMB-NEXT:    bl consume
1461 ; THUMB-NEXT:  .LBB50_2: @ %exit
1462 ; THUMB-NEXT:    pop {r7, pc}
1464 ; THUMB2-LABEL: br_on_binop_ne_reg:
1465 ; THUMB2:       @ %bb.0:
1466 ; THUMB2-NEXT:    ands r1, r0
1467 ; THUMB2-NEXT:    cmp r1, r2
1468 ; THUMB2-NEXT:    it eq
1469 ; THUMB2-NEXT:    bxeq lr
1470 ; THUMB2-NEXT:  .LBB50_1: @ %true_br
1471 ; THUMB2-NEXT:    push {r7, lr}
1472 ; THUMB2-NEXT:    bl consume
1473 ; THUMB2-NEXT:    pop.w {r7, lr}
1474 ; THUMB2-NEXT:    bx lr
1475     %and = and i32 %a, %b
1476     %cmp = icmp ne i32 %and, %c
1477     br i1 %cmp, label %true_br, label %exit
1478 true_br:
1479     call void @consume(i32 %a)
1480     br label %exit
1481 exit:
1482     ret void
1485 define void @br_on_shift_eq_zero(i32 %a, i32 %b) {
1486 ; ARM-LABEL: br_on_shift_eq_zero:
1487 ; ARM:       @ %bb.0:
1488 ; ARM-NEXT:    lsls r1, r0, r1
1489 ; ARM-NEXT:    bxne lr
1490 ; ARM-NEXT:  .LBB51_1: @ %true_br
1491 ; ARM-NEXT:    push {r11, lr}
1492 ; ARM-NEXT:    bl consume
1493 ; ARM-NEXT:    pop {r11, lr}
1494 ; ARM-NEXT:    bx lr
1496 ; THUMB-LABEL: br_on_shift_eq_zero:
1497 ; THUMB:       @ %bb.0:
1498 ; THUMB-NEXT:    push {r7, lr}
1499 ; THUMB-NEXT:    mov r2, r0
1500 ; THUMB-NEXT:    lsls r2, r1
1501 ; THUMB-NEXT:    beq .LBB51_2
1502 ; THUMB-NEXT:  @ %bb.1: @ %exit
1503 ; THUMB-NEXT:    pop {r7, pc}
1504 ; THUMB-NEXT:  .LBB51_2: @ %true_br
1505 ; THUMB-NEXT:    bl consume
1506 ; THUMB-NEXT:    pop {r7, pc}
1508 ; THUMB2-LABEL: br_on_shift_eq_zero:
1509 ; THUMB2:       @ %bb.0:
1510 ; THUMB2-NEXT:    lsls.w r1, r0, r1
1511 ; THUMB2-NEXT:    it ne
1512 ; THUMB2-NEXT:    bxne lr
1513 ; THUMB2-NEXT:  .LBB51_1: @ %true_br
1514 ; THUMB2-NEXT:    push {r7, lr}
1515 ; THUMB2-NEXT:    bl consume
1516 ; THUMB2-NEXT:    pop.w {r7, lr}
1517 ; THUMB2-NEXT:    bx lr
1518     %sh = shl i32 %a, %b
1519     %cmp = icmp eq i32 %sh, 0
1520     br i1 %cmp, label %true_br, label %exit
1521 true_br:
1522     call void @consume(i32 %a)
1523     br label %exit
1524 exit:
1525     ret void
1528 define void @br_on_shift_ne_zero(i32 %a, i32 %b) {
1529 ; ARM-LABEL: br_on_shift_ne_zero:
1530 ; ARM:       @ %bb.0:
1531 ; ARM-NEXT:    lsrs r1, r0, r1
1532 ; ARM-NEXT:    bxeq lr
1533 ; ARM-NEXT:  .LBB52_1: @ %true_br
1534 ; ARM-NEXT:    push {r11, lr}
1535 ; ARM-NEXT:    bl consume
1536 ; ARM-NEXT:    pop {r11, lr}
1537 ; ARM-NEXT:    bx lr
1539 ; THUMB-LABEL: br_on_shift_ne_zero:
1540 ; THUMB:       @ %bb.0:
1541 ; THUMB-NEXT:    push {r7, lr}
1542 ; THUMB-NEXT:    mov r2, r0
1543 ; THUMB-NEXT:    lsrs r2, r1
1544 ; THUMB-NEXT:    beq .LBB52_2
1545 ; THUMB-NEXT:  @ %bb.1: @ %true_br
1546 ; THUMB-NEXT:    bl consume
1547 ; THUMB-NEXT:  .LBB52_2: @ %exit
1548 ; THUMB-NEXT:    pop {r7, pc}
1550 ; THUMB2-LABEL: br_on_shift_ne_zero:
1551 ; THUMB2:       @ %bb.0:
1552 ; THUMB2-NEXT:    lsrs.w r1, r0, r1
1553 ; THUMB2-NEXT:    it eq
1554 ; THUMB2-NEXT:    bxeq lr
1555 ; THUMB2-NEXT:  .LBB52_1: @ %true_br
1556 ; THUMB2-NEXT:    push {r7, lr}
1557 ; THUMB2-NEXT:    bl consume
1558 ; THUMB2-NEXT:    pop.w {r7, lr}
1559 ; THUMB2-NEXT:    bx lr
1560     %sh = lshr i32 %a, %b
1561     %cmp = icmp ne i32 %sh, 0
1562     br i1 %cmp, label %true_br, label %exit
1563 true_br:
1564     call void @consume(i32 %a)
1565     br label %exit
1566 exit:
1567     ret void
1570 define void @br_on_shift_lt_zero(i32 %a, i32 %b) {
1571 ; ARM-LABEL: br_on_shift_lt_zero:
1572 ; ARM:       @ %bb.0:
1573 ; ARM-NEXT:    asr r1, r0, r1
1574 ; ARM-NEXT:    cmp r1, #0
1575 ; ARM-NEXT:    bxhs lr
1576 ; ARM-NEXT:  .LBB53_1: @ %true_br
1577 ; ARM-NEXT:    push {r11, lr}
1578 ; ARM-NEXT:    bl consume
1579 ; ARM-NEXT:    pop {r11, lr}
1580 ; ARM-NEXT:    bx lr
1582 ; THUMB-LABEL: br_on_shift_lt_zero:
1583 ; THUMB:       @ %bb.0:
1584 ; THUMB-NEXT:    push {r7, lr}
1585 ; THUMB-NEXT:    mov r2, r0
1586 ; THUMB-NEXT:    asrs r2, r1
1587 ; THUMB-NEXT:    cmp r2, #0
1588 ; THUMB-NEXT:    bhs .LBB53_2
1589 ; THUMB-NEXT:  @ %bb.1: @ %true_br
1590 ; THUMB-NEXT:    bl consume
1591 ; THUMB-NEXT:  .LBB53_2: @ %exit
1592 ; THUMB-NEXT:    pop {r7, pc}
1594 ; THUMB2-LABEL: br_on_shift_lt_zero:
1595 ; THUMB2:       @ %bb.0:
1596 ; THUMB2-NEXT:    asr.w r1, r0, r1
1597 ; THUMB2-NEXT:    cmp r1, #0
1598 ; THUMB2-NEXT:    it hs
1599 ; THUMB2-NEXT:    bxhs lr
1600 ; THUMB2-NEXT:  .LBB53_1: @ %true_br
1601 ; THUMB2-NEXT:    push {r7, lr}
1602 ; THUMB2-NEXT:    bl consume
1603 ; THUMB2-NEXT:    pop.w {r7, lr}
1604 ; THUMB2-NEXT:    bx lr
1605     %sh = ashr i32 %a, %b
1606     %cmp = icmp ult i32 %sh, 0
1607     br i1 %cmp, label %true_br, label %exit
1608 true_br:
1609     call void @consume(i32 %a)
1610     br label %exit
1611 exit:
1612     ret void
1615 define void @br_on_shift_eq_imm(i32 %a, i32 %b) {
1616 ; ARM-LABEL: br_on_shift_eq_imm:
1617 ; ARM:       @ %bb.0:
1618 ; ARM-NEXT:    mov r2, #42
1619 ; ARM-NEXT:    cmp r2, r0, lsl r1
1620 ; ARM-NEXT:    bxne lr
1621 ; ARM-NEXT:  .LBB54_1: @ %true_br
1622 ; ARM-NEXT:    push {r11, lr}
1623 ; ARM-NEXT:    bl consume
1624 ; ARM-NEXT:    pop {r11, lr}
1625 ; ARM-NEXT:    bx lr
1627 ; THUMB-LABEL: br_on_shift_eq_imm:
1628 ; THUMB:       @ %bb.0:
1629 ; THUMB-NEXT:    push {r7, lr}
1630 ; THUMB-NEXT:    mov r2, r0
1631 ; THUMB-NEXT:    lsls r2, r1
1632 ; THUMB-NEXT:    cmp r2, #42
1633 ; THUMB-NEXT:    bne .LBB54_2
1634 ; THUMB-NEXT:  @ %bb.1: @ %true_br
1635 ; THUMB-NEXT:    bl consume
1636 ; THUMB-NEXT:  .LBB54_2: @ %exit
1637 ; THUMB-NEXT:    pop {r7, pc}
1639 ; THUMB2-LABEL: br_on_shift_eq_imm:
1640 ; THUMB2:       @ %bb.0:
1641 ; THUMB2-NEXT:    lsl.w r1, r0, r1
1642 ; THUMB2-NEXT:    cmp r1, #42
1643 ; THUMB2-NEXT:    it ne
1644 ; THUMB2-NEXT:    bxne lr
1645 ; THUMB2-NEXT:  .LBB54_1: @ %true_br
1646 ; THUMB2-NEXT:    push {r7, lr}
1647 ; THUMB2-NEXT:    bl consume
1648 ; THUMB2-NEXT:    pop.w {r7, lr}
1649 ; THUMB2-NEXT:    bx lr
1650     %sh = shl i32 %a, %b
1651     %cmp = icmp eq i32 %sh, 42
1652     br i1 %cmp, label %true_br, label %exit
1653 true_br:
1654     call void @consume(i32 %a)
1655     br label %exit
1656 exit:
1657     ret void
1660 define void @br_on_shift_ne_imm(i32 %a, i32 %b) {
1661 ; ARM-LABEL: br_on_shift_ne_imm:
1662 ; ARM:       @ %bb.0:
1663 ; ARM-NEXT:    mov r2, #42
1664 ; ARM-NEXT:    cmp r2, r0, lsr r1
1665 ; ARM-NEXT:    bxeq lr
1666 ; ARM-NEXT:  .LBB55_1: @ %true_br
1667 ; ARM-NEXT:    push {r11, lr}
1668 ; ARM-NEXT:    bl consume
1669 ; ARM-NEXT:    pop {r11, lr}
1670 ; ARM-NEXT:    bx lr
1672 ; THUMB-LABEL: br_on_shift_ne_imm:
1673 ; THUMB:       @ %bb.0:
1674 ; THUMB-NEXT:    push {r7, lr}
1675 ; THUMB-NEXT:    mov r2, r0
1676 ; THUMB-NEXT:    lsrs r2, r1
1677 ; THUMB-NEXT:    cmp r2, #42
1678 ; THUMB-NEXT:    beq .LBB55_2
1679 ; THUMB-NEXT:  @ %bb.1: @ %true_br
1680 ; THUMB-NEXT:    bl consume
1681 ; THUMB-NEXT:  .LBB55_2: @ %exit
1682 ; THUMB-NEXT:    pop {r7, pc}
1684 ; THUMB2-LABEL: br_on_shift_ne_imm:
1685 ; THUMB2:       @ %bb.0:
1686 ; THUMB2-NEXT:    lsr.w r1, r0, r1
1687 ; THUMB2-NEXT:    cmp r1, #42
1688 ; THUMB2-NEXT:    it eq
1689 ; THUMB2-NEXT:    bxeq lr
1690 ; THUMB2-NEXT:  .LBB55_1: @ %true_br
1691 ; THUMB2-NEXT:    push {r7, lr}
1692 ; THUMB2-NEXT:    bl consume
1693 ; THUMB2-NEXT:    pop.w {r7, lr}
1694 ; THUMB2-NEXT:    bx lr
1695     %sh = lshr i32 %a, %b
1696     %cmp = icmp ne i32 %sh, 42
1697     br i1 %cmp, label %true_br, label %exit
1698 true_br:
1699     call void @consume(i32 %a)
1700     br label %exit
1701 exit:
1702     ret void
1705 define void @br_on_shift_eq_reg(i32 %a, i32 %b, i32 %c) {
1706 ; ARM-LABEL: br_on_shift_eq_reg:
1707 ; ARM:       @ %bb.0:
1708 ; ARM-NEXT:    cmp r2, r0, asr r1
1709 ; ARM-NEXT:    bxne lr
1710 ; ARM-NEXT:  .LBB56_1: @ %true_br
1711 ; ARM-NEXT:    push {r11, lr}
1712 ; ARM-NEXT:    bl consume
1713 ; ARM-NEXT:    pop {r11, lr}
1714 ; ARM-NEXT:    bx lr
1716 ; THUMB-LABEL: br_on_shift_eq_reg:
1717 ; THUMB:       @ %bb.0:
1718 ; THUMB-NEXT:    push {r7, lr}
1719 ; THUMB-NEXT:    mov r3, r0
1720 ; THUMB-NEXT:    asrs r3, r1
1721 ; THUMB-NEXT:    cmp r2, r3
1722 ; THUMB-NEXT:    bne .LBB56_2
1723 ; THUMB-NEXT:  @ %bb.1: @ %true_br
1724 ; THUMB-NEXT:    bl consume
1725 ; THUMB-NEXT:  .LBB56_2: @ %exit
1726 ; THUMB-NEXT:    pop {r7, pc}
1728 ; THUMB2-LABEL: br_on_shift_eq_reg:
1729 ; THUMB2:       @ %bb.0:
1730 ; THUMB2-NEXT:    asr.w r1, r0, r1
1731 ; THUMB2-NEXT:    cmp r2, r1
1732 ; THUMB2-NEXT:    it ne
1733 ; THUMB2-NEXT:    bxne lr
1734 ; THUMB2-NEXT:  .LBB56_1: @ %true_br
1735 ; THUMB2-NEXT:    push {r7, lr}
1736 ; THUMB2-NEXT:    bl consume
1737 ; THUMB2-NEXT:    pop.w {r7, lr}
1738 ; THUMB2-NEXT:    bx lr
1739     %sh = ashr i32 %a, %b
1740     %cmp = icmp eq i32 %sh, %c
1741     br i1 %cmp, label %true_br, label %exit
1742 true_br:
1743     call void @consume(i32 %a)
1744     br label %exit
1745 exit:
1746     ret void
1749 define void @br_on_shift_ne_reg(i32 %a, i32 %b, i32 %c) {
1750 ; ARM-LABEL: br_on_shift_ne_reg:
1751 ; ARM:       @ %bb.0:
1752 ; ARM-NEXT:    cmp r2, r0, lsl r1
1753 ; ARM-NEXT:    bxeq lr
1754 ; ARM-NEXT:  .LBB57_1: @ %true_br
1755 ; ARM-NEXT:    push {r11, lr}
1756 ; ARM-NEXT:    bl consume
1757 ; ARM-NEXT:    pop {r11, lr}
1758 ; ARM-NEXT:    bx lr
1760 ; THUMB-LABEL: br_on_shift_ne_reg:
1761 ; THUMB:       @ %bb.0:
1762 ; THUMB-NEXT:    push {r7, lr}
1763 ; THUMB-NEXT:    mov r3, r0
1764 ; THUMB-NEXT:    lsls r3, r1
1765 ; THUMB-NEXT:    cmp r2, r3
1766 ; THUMB-NEXT:    beq .LBB57_2
1767 ; THUMB-NEXT:  @ %bb.1: @ %true_br
1768 ; THUMB-NEXT:    bl consume
1769 ; THUMB-NEXT:  .LBB57_2: @ %exit
1770 ; THUMB-NEXT:    pop {r7, pc}
1772 ; THUMB2-LABEL: br_on_shift_ne_reg:
1773 ; THUMB2:       @ %bb.0:
1774 ; THUMB2-NEXT:    lsl.w r1, r0, r1
1775 ; THUMB2-NEXT:    cmp r2, r1
1776 ; THUMB2-NEXT:    it eq
1777 ; THUMB2-NEXT:    bxeq lr
1778 ; THUMB2-NEXT:  .LBB57_1: @ %true_br
1779 ; THUMB2-NEXT:    push {r7, lr}
1780 ; THUMB2-NEXT:    bl consume
1781 ; THUMB2-NEXT:    pop.w {r7, lr}
1782 ; THUMB2-NEXT:    bx lr
1783     %sh = shl i32 %a, %b
1784     %cmp = icmp ne i32 %sh, %c
1785     br i1 %cmp, label %true_br, label %exit
1786 true_br:
1787     call void @consume(i32 %a)
1788     br label %exit
1789 exit:
1790     ret void