[rtsan] Add fork/execve interceptors (#117198)
[llvm-project.git] / llvm / test / CodeGen / ARM / select-imm.ll
blob6427a3e34cf8e2307f272cebdb27cb93cf0ccfa9
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -mtriple=arm-eabi | FileCheck %s --check-prefix=ARM
3 ; RUN: llc < %s -mtriple=arm-eabi -mcpu=arm1156t2-s -mattr=+thumb2 | FileCheck %s --check-prefix=ARMT2
4 ; RUN: llc < %s -mtriple=thumb-eabi -mcpu=cortex-m0 | FileCheck %s --check-prefix=THUMB1
5 ; RUN: llc < %s -mtriple=thumb-eabi -mcpu=arm1156t2-s -mattr=+thumb2 | FileCheck %s --check-prefix=THUMB2
6 ; RUN: llc < %s -mtriple=thumbv8m.base-eabi | FileCheck %s --check-prefix=V8MBASE
8 define i32 @t1(i32 %c) nounwind readnone {
9 ; ARM-LABEL: t1:
10 ; ARM:       @ %bb.0: @ %entry
11 ; ARM-NEXT:    mov r1, #101
12 ; ARM-NEXT:    cmp r0, #1
13 ; ARM-NEXT:    orr r1, r1, #256
14 ; ARM-NEXT:    movgt r1, #123
15 ; ARM-NEXT:    mov r0, r1
16 ; ARM-NEXT:    mov pc, lr
18 ; ARMT2-LABEL: t1:
19 ; ARMT2:       @ %bb.0: @ %entry
20 ; ARMT2-NEXT:    movw r1, #357
21 ; ARMT2-NEXT:    cmp r0, #1
22 ; ARMT2-NEXT:    movwgt r1, #123
23 ; ARMT2-NEXT:    mov r0, r1
24 ; ARMT2-NEXT:    bx lr
26 ; THUMB1-LABEL: t1:
27 ; THUMB1:       @ %bb.0: @ %entry
28 ; THUMB1-NEXT:    cmp r0, #1
29 ; THUMB1-NEXT:    bgt .LBB0_2
30 ; THUMB1-NEXT:  @ %bb.1: @ %entry
31 ; THUMB1-NEXT:    movs r0, #255
32 ; THUMB1-NEXT:    adds r0, #102
33 ; THUMB1-NEXT:    bx lr
34 ; THUMB1-NEXT:  .LBB0_2:
35 ; THUMB1-NEXT:    movs r0, #123
36 ; THUMB1-NEXT:    bx lr
38 ; THUMB2-LABEL: t1:
39 ; THUMB2:       @ %bb.0: @ %entry
40 ; THUMB2-NEXT:    movw r1, #357
41 ; THUMB2-NEXT:    cmp r0, #1
42 ; THUMB2-NEXT:    it gt
43 ; THUMB2-NEXT:    movgt r1, #123
44 ; THUMB2-NEXT:    mov r0, r1
45 ; THUMB2-NEXT:    bx lr
47 ; V8MBASE-LABEL: t1:
48 ; V8MBASE:       @ %bb.0: @ %entry
49 ; V8MBASE-NEXT:    cmp r0, #1
50 ; V8MBASE-NEXT:    bgt .LBB0_2
51 ; V8MBASE-NEXT:  @ %bb.1: @ %entry
52 ; V8MBASE-NEXT:    movw r0, #357
53 ; V8MBASE-NEXT:    bx lr
54 ; V8MBASE-NEXT:  .LBB0_2:
55 ; V8MBASE-NEXT:    movs r0, #123
56 ; V8MBASE-NEXT:    bx lr
57 entry:
58   %0 = icmp sgt i32 %c, 1
59   %1 = select i1 %0, i32 123, i32 357
60   ret i32 %1
63 define i32 @t2(i32 %c) nounwind readnone {
64 ; ARM-LABEL: t2:
65 ; ARM:       @ %bb.0: @ %entry
66 ; ARM-NEXT:    mov r1, #101
67 ; ARM-NEXT:    cmp r0, #1
68 ; ARM-NEXT:    orr r1, r1, #256
69 ; ARM-NEXT:    movle r1, #123
70 ; ARM-NEXT:    mov r0, r1
71 ; ARM-NEXT:    mov pc, lr
73 ; ARMT2-LABEL: t2:
74 ; ARMT2:       @ %bb.0: @ %entry
75 ; ARMT2-NEXT:    mov r1, #123
76 ; ARMT2-NEXT:    cmp r0, #1
77 ; ARMT2-NEXT:    movwgt r1, #357
78 ; ARMT2-NEXT:    mov r0, r1
79 ; ARMT2-NEXT:    bx lr
81 ; THUMB1-LABEL: t2:
82 ; THUMB1:       @ %bb.0: @ %entry
83 ; THUMB1-NEXT:    cmp r0, #1
84 ; THUMB1-NEXT:    bgt .LBB1_2
85 ; THUMB1-NEXT:  @ %bb.1: @ %entry
86 ; THUMB1-NEXT:    movs r0, #123
87 ; THUMB1-NEXT:    bx lr
88 ; THUMB1-NEXT:  .LBB1_2:
89 ; THUMB1-NEXT:    movs r0, #255
90 ; THUMB1-NEXT:    adds r0, #102
91 ; THUMB1-NEXT:    bx lr
93 ; THUMB2-LABEL: t2:
94 ; THUMB2:       @ %bb.0: @ %entry
95 ; THUMB2-NEXT:    movs r1, #123
96 ; THUMB2-NEXT:    cmp r0, #1
97 ; THUMB2-NEXT:    it gt
98 ; THUMB2-NEXT:    movwgt r1, #357
99 ; THUMB2-NEXT:    mov r0, r1
100 ; THUMB2-NEXT:    bx lr
102 ; V8MBASE-LABEL: t2:
103 ; V8MBASE:       @ %bb.0: @ %entry
104 ; V8MBASE-NEXT:    mov r1, r0
105 ; V8MBASE-NEXT:    movw r0, #357
106 ; V8MBASE-NEXT:    cmp r1, #1
107 ; V8MBASE-NEXT:    bgt .LBB1_2
108 ; V8MBASE-NEXT:  @ %bb.1: @ %entry
109 ; V8MBASE-NEXT:    movs r0, #123
110 ; V8MBASE-NEXT:  .LBB1_2: @ %entry
111 ; V8MBASE-NEXT:    bx lr
112 entry:
113   %0 = icmp sgt i32 %c, 1
114   %1 = select i1 %0, i32 357, i32 123
115   ret i32 %1
118 define i32 @t3(i32 %a) nounwind readnone {
119 ; ARM-LABEL: t3:
120 ; ARM:       @ %bb.0: @ %entry
121 ; ARM-NEXT:    sub r0, r0, #160
122 ; ARM-NEXT:    rsbs r1, r0, #0
123 ; ARM-NEXT:    adc r0, r0, r1
124 ; ARM-NEXT:    mov pc, lr
126 ; ARMT2-LABEL: t3:
127 ; ARMT2:       @ %bb.0: @ %entry
128 ; ARMT2-NEXT:    sub r0, r0, #160
129 ; ARMT2-NEXT:    clz r0, r0
130 ; ARMT2-NEXT:    lsr r0, r0, #5
131 ; ARMT2-NEXT:    bx lr
133 ; THUMB1-LABEL: t3:
134 ; THUMB1:       @ %bb.0: @ %entry
135 ; THUMB1-NEXT:    subs r0, #160
136 ; THUMB1-NEXT:    rsbs r1, r0, #0
137 ; THUMB1-NEXT:    adcs r0, r1
138 ; THUMB1-NEXT:    bx lr
140 ; THUMB2-LABEL: t3:
141 ; THUMB2:       @ %bb.0: @ %entry
142 ; THUMB2-NEXT:    subs r0, #160
143 ; THUMB2-NEXT:    clz r0, r0
144 ; THUMB2-NEXT:    lsrs r0, r0, #5
145 ; THUMB2-NEXT:    bx lr
147 ; V8MBASE-LABEL: t3:
148 ; V8MBASE:       @ %bb.0: @ %entry
149 ; V8MBASE-NEXT:    subs r0, #160
150 ; V8MBASE-NEXT:    rsbs r1, r0, #0
151 ; V8MBASE-NEXT:    adcs r0, r1
152 ; V8MBASE-NEXT:    bx lr
153 entry:
154   %0 = icmp eq i32 %a, 160
155   %1 = zext i1 %0 to i32
156   ret i32 %1
159 define i32 @t4(i32 %a, i32 %b, i32 %x) nounwind {
160 ; ARM-LABEL: t4:
161 ; ARM:       @ %bb.0: @ %entry
162 ; ARM-NEXT:    mvn r3, #170
163 ; ARM-NEXT:    cmp r0, r1
164 ; ARM-NEXT:    sub r3, r3, #11141120
165 ; ARM-NEXT:    movge r3, r2
166 ; ARM-NEXT:    mov r0, r3
167 ; ARM-NEXT:    mov pc, lr
169 ; ARMT2-LABEL: t4:
170 ; ARMT2:       @ %bb.0: @ %entry
171 ; ARMT2-NEXT:    cmp r0, r1
172 ; ARMT2-NEXT:    movwlt r2, #65365
173 ; ARMT2-NEXT:    movtlt r2, #65365
174 ; ARMT2-NEXT:    mov r0, r2
175 ; ARMT2-NEXT:    bx lr
177 ; THUMB1-LABEL: t4:
178 ; THUMB1:       @ %bb.0: @ %entry
179 ; THUMB1-NEXT:    cmp r0, r1
180 ; THUMB1-NEXT:    bge .LBB3_2
181 ; THUMB1-NEXT:  @ %bb.1:
182 ; THUMB1-NEXT:    ldr r2, .LCPI3_0
183 ; THUMB1-NEXT:  .LBB3_2: @ %entry
184 ; THUMB1-NEXT:    mov r0, r2
185 ; THUMB1-NEXT:    bx lr
186 ; THUMB1-NEXT:    .p2align 2
187 ; THUMB1-NEXT:  @ %bb.3:
188 ; THUMB1-NEXT:  .LCPI3_0:
189 ; THUMB1-NEXT:    .long 4283826005 @ 0xff55ff55
191 ; THUMB2-LABEL: t4:
192 ; THUMB2:       @ %bb.0: @ %entry
193 ; THUMB2-NEXT:    cmp r0, r1
194 ; THUMB2-NEXT:    it lt
195 ; THUMB2-NEXT:    mvnlt r2, #11141290
196 ; THUMB2-NEXT:    mov r0, r2
197 ; THUMB2-NEXT:    bx lr
199 ; V8MBASE-LABEL: t4:
200 ; V8MBASE:       @ %bb.0: @ %entry
201 ; V8MBASE-NEXT:    cmp r0, r1
202 ; V8MBASE-NEXT:    bge .LBB3_2
203 ; V8MBASE-NEXT:  @ %bb.1:
204 ; V8MBASE-NEXT:    movw r2, #65365
205 ; V8MBASE-NEXT:    movt r2, #65365
206 ; V8MBASE-NEXT:  .LBB3_2: @ %entry
207 ; V8MBASE-NEXT:    mov r0, r2
208 ; V8MBASE-NEXT:    bx lr
209 entry:
210   %0 = icmp slt i32 %a, %b
211   %1 = select i1 %0, i32 4283826005, i32 %x
212   ret i32 %1
215 ; rdar://9758317
216 define i32 @t5(i32 %a) nounwind {
217 ; ARM-LABEL: t5:
218 ; ARM:       @ %bb.0: @ %entry
219 ; ARM-NEXT:    sub r0, r0, #1
220 ; ARM-NEXT:    rsbs r1, r0, #0
221 ; ARM-NEXT:    adc r0, r0, r1
222 ; ARM-NEXT:    mov pc, lr
224 ; ARMT2-LABEL: t5:
225 ; ARMT2:       @ %bb.0: @ %entry
226 ; ARMT2-NEXT:    sub r0, r0, #1
227 ; ARMT2-NEXT:    clz r0, r0
228 ; ARMT2-NEXT:    lsr r0, r0, #5
229 ; ARMT2-NEXT:    bx lr
231 ; THUMB1-LABEL: t5:
232 ; THUMB1:       @ %bb.0: @ %entry
233 ; THUMB1-NEXT:    subs r1, r0, #1
234 ; THUMB1-NEXT:    rsbs r0, r1, #0
235 ; THUMB1-NEXT:    adcs r0, r1
236 ; THUMB1-NEXT:    bx lr
238 ; THUMB2-LABEL: t5:
239 ; THUMB2:       @ %bb.0: @ %entry
240 ; THUMB2-NEXT:    subs r0, #1
241 ; THUMB2-NEXT:    clz r0, r0
242 ; THUMB2-NEXT:    lsrs r0, r0, #5
243 ; THUMB2-NEXT:    bx lr
245 ; V8MBASE-LABEL: t5:
246 ; V8MBASE:       @ %bb.0: @ %entry
247 ; V8MBASE-NEXT:    subs r1, r0, #1
248 ; V8MBASE-NEXT:    rsbs r0, r1, #0
249 ; V8MBASE-NEXT:    adcs r0, r1
250 ; V8MBASE-NEXT:    bx lr
251 entry:
252   %cmp = icmp eq i32 %a, 1
253   %conv = zext i1 %cmp to i32
254   ret i32 %conv
257 define i32 @t6(i32 %a) nounwind {
258 ; ARM-LABEL: t6:
259 ; ARM:       @ %bb.0: @ %entry
260 ; ARM-NEXT:    cmp r0, #0
261 ; ARM-NEXT:    movne r0, #1
262 ; ARM-NEXT:    mov pc, lr
264 ; ARMT2-LABEL: t6:
265 ; ARMT2:       @ %bb.0: @ %entry
266 ; ARMT2-NEXT:    cmp r0, #0
267 ; ARMT2-NEXT:    movwne r0, #1
268 ; ARMT2-NEXT:    bx lr
270 ; THUMB1-LABEL: t6:
271 ; THUMB1:       @ %bb.0: @ %entry
272 ; THUMB1-NEXT:    subs r1, r0, #1
273 ; THUMB1-NEXT:    sbcs r0, r1
274 ; THUMB1-NEXT:    bx lr
276 ; THUMB2-LABEL: t6:
277 ; THUMB2:       @ %bb.0: @ %entry
278 ; THUMB2-NEXT:    cmp r0, #0
279 ; THUMB2-NEXT:    it ne
280 ; THUMB2-NEXT:    movne r0, #1
281 ; THUMB2-NEXT:    bx lr
283 ; V8MBASE-LABEL: t6:
284 ; V8MBASE:       @ %bb.0: @ %entry
285 ; V8MBASE-NEXT:    subs r1, r0, #1
286 ; V8MBASE-NEXT:    sbcs r0, r1
287 ; V8MBASE-NEXT:    bx lr
288 entry:
289   %tobool = icmp ne i32 %a, 0
290   %lnot.ext = zext i1 %tobool to i32
291   ret i32 %lnot.ext
294 define i32 @t7(i32 %a, i32 %b) nounwind readnone {
295 ; ARM-LABEL: t7:
296 ; ARM:       @ %bb.0: @ %entry
297 ; ARM-NEXT:    subs r0, r0, r1
298 ; ARM-NEXT:    movne r0, #1
299 ; ARM-NEXT:    lsl r0, r0, #2
300 ; ARM-NEXT:    mov pc, lr
302 ; ARMT2-LABEL: t7:
303 ; ARMT2:       @ %bb.0: @ %entry
304 ; ARMT2-NEXT:    subs r0, r0, r1
305 ; ARMT2-NEXT:    movwne r0, #1
306 ; ARMT2-NEXT:    lsl r0, r0, #2
307 ; ARMT2-NEXT:    bx lr
309 ; THUMB1-LABEL: t7:
310 ; THUMB1:       @ %bb.0: @ %entry
311 ; THUMB1-NEXT:    subs r0, r0, r1
312 ; THUMB1-NEXT:    subs r1, r0, #1
313 ; THUMB1-NEXT:    sbcs r0, r1
314 ; THUMB1-NEXT:    lsls r0, r0, #2
315 ; THUMB1-NEXT:    bx lr
317 ; THUMB2-LABEL: t7:
318 ; THUMB2:       @ %bb.0: @ %entry
319 ; THUMB2-NEXT:    subs r0, r0, r1
320 ; THUMB2-NEXT:    it ne
321 ; THUMB2-NEXT:    movne r0, #1
322 ; THUMB2-NEXT:    lsls r0, r0, #2
323 ; THUMB2-NEXT:    bx lr
325 ; V8MBASE-LABEL: t7:
326 ; V8MBASE:       @ %bb.0: @ %entry
327 ; V8MBASE-NEXT:    subs r0, r0, r1
328 ; V8MBASE-NEXT:    subs r1, r0, #1
329 ; V8MBASE-NEXT:    sbcs r0, r1
330 ; V8MBASE-NEXT:    lsls r0, r0, #2
331 ; V8MBASE-NEXT:    bx lr
332 entry:
333   %0 = icmp ne i32 %a, %b
334   %1 = select i1 %0, i32 4, i32 0
335   ret i32 %1
338 ; ARM scheduler emits icmp/zext before both calls, so isn't relevant
339 define void @t8(i32 %a) {
340 ; ARM-LABEL: t8:
341 ; ARM:       @ %bb.0: @ %entry
342 ; ARM-NEXT:    .save {r4, lr}
343 ; ARM-NEXT:    push {r4, lr}
344 ; ARM-NEXT:    mov r1, r0
345 ; ARM-NEXT:    sub r0, r0, #5
346 ; ARM-NEXT:    rsbs r2, r0, #0
347 ; ARM-NEXT:    adc r4, r0, r2
348 ; ARM-NEXT:    mov r0, #9
349 ; ARM-NEXT:    bl t7
350 ; ARM-NEXT:    mov r1, r0
351 ; ARM-NEXT:    mov r0, r4
352 ; ARM-NEXT:    pop {r4, lr}
353 ; ARM-NEXT:    b t7
355 ; ARMT2-LABEL: t8:
356 ; ARMT2:       @ %bb.0: @ %entry
357 ; ARMT2-NEXT:    .save {r4, lr}
358 ; ARMT2-NEXT:    push {r4, lr}
359 ; ARMT2-NEXT:    mov r4, r0
360 ; ARMT2-NEXT:    mov r0, #9
361 ; ARMT2-NEXT:    mov r1, r4
362 ; ARMT2-NEXT:    bl t7
363 ; ARMT2-NEXT:    mov r1, r0
364 ; ARMT2-NEXT:    sub r0, r4, #5
365 ; ARMT2-NEXT:    clz r0, r0
366 ; ARMT2-NEXT:    lsr r0, r0, #5
367 ; ARMT2-NEXT:    pop {r4, lr}
368 ; ARMT2-NEXT:    b t7
370 ; THUMB1-LABEL: t8:
371 ; THUMB1:       @ %bb.0: @ %entry
372 ; THUMB1-NEXT:    .save {r4, lr}
373 ; THUMB1-NEXT:    push {r4, lr}
374 ; THUMB1-NEXT:    mov r4, r0
375 ; THUMB1-NEXT:    movs r0, #9
376 ; THUMB1-NEXT:    mov r1, r4
377 ; THUMB1-NEXT:    bl t7
378 ; THUMB1-NEXT:    mov r1, r0
379 ; THUMB1-NEXT:    subs r2, r4, #5
380 ; THUMB1-NEXT:    rsbs r0, r2, #0
381 ; THUMB1-NEXT:    adcs r0, r2
382 ; THUMB1-NEXT:    bl t7
383 ; THUMB1-NEXT:    pop {r4, pc}
385 ; THUMB2-LABEL: t8:
386 ; THUMB2:       @ %bb.0: @ %entry
387 ; THUMB2-NEXT:    .save {r4, lr}
388 ; THUMB2-NEXT:    push {r4, lr}
389 ; THUMB2-NEXT:    mov r4, r0
390 ; THUMB2-NEXT:    movs r0, #9
391 ; THUMB2-NEXT:    mov r1, r4
392 ; THUMB2-NEXT:    bl t7
393 ; THUMB2-NEXT:    mov r1, r0
394 ; THUMB2-NEXT:    subs r0, r4, #5
395 ; THUMB2-NEXT:    clz r0, r0
396 ; THUMB2-NEXT:    lsrs r0, r0, #5
397 ; THUMB2-NEXT:    pop.w {r4, lr}
398 ; THUMB2-NEXT:    b t7
400 ; V8MBASE-LABEL: t8:
401 ; V8MBASE:       @ %bb.0: @ %entry
402 ; V8MBASE-NEXT:    .save {r4, lr}
403 ; V8MBASE-NEXT:    push {r4, lr}
404 ; V8MBASE-NEXT:    mov r1, r0
405 ; V8MBASE-NEXT:    subs r0, r0, #5
406 ; V8MBASE-NEXT:    rsbs r4, r0, #0
407 ; V8MBASE-NEXT:    adcs r4, r0
408 ; V8MBASE-NEXT:    movs r0, #9
409 ; V8MBASE-NEXT:    bl t7
410 ; V8MBASE-NEXT:    mov r1, r0
411 ; V8MBASE-NEXT:    mov r0, r4
412 ; V8MBASE-NEXT:    pop {r4}
413 ; V8MBASE-NEXT:    pop {r2}
414 ; V8MBASE-NEXT:    mov lr, r2
415 ; V8MBASE-NEXT:    b t7
416 entry:
417   %cmp = icmp eq i32 %a, 5
418   %conv = zext i1 %cmp to i32
419   %call = tail call i32 @t7(i32 9, i32 %a)
420   tail call i32 @t7(i32 %conv, i32 %call)
421   ret void
424 ; ARM scheduler emits icmp/zext before both calls, so isn't relevant
425 define void @t9(ptr %a, i8 %b) {
426 ; ARM-LABEL: t9:
427 ; ARM:       @ %bb.0: @ %entry
428 ; ARM-NEXT:    .save {r4, lr}
429 ; ARM-NEXT:    push {r4, lr}
430 ; ARM-NEXT:    ldrsb r4, [r0]
431 ; ARM-NEXT:    mov r0, #1
432 ; ARM-NEXT:    bl f
433 ; ARM-NEXT:    and r0, r4, #255
434 ; ARM-NEXT:    cmp r0, r0
435 ; ARM-NEXT:    bne .LBB8_3
436 ; ARM-NEXT:  @ %bb.1: @ %while.body.preheader
437 ; ARM-NEXT:    add r1, r4, #1
438 ; ARM-NEXT:    mov r2, r0
439 ; ARM-NEXT:  .LBB8_2: @ %while.body
440 ; ARM-NEXT:    @ =>This Inner Loop Header: Depth=1
441 ; ARM-NEXT:    add r2, r2, #1
442 ; ARM-NEXT:    add r1, r1, #1
443 ; ARM-NEXT:    and r3, r2, #255
444 ; ARM-NEXT:    cmp r3, r0
445 ; ARM-NEXT:    blt .LBB8_2
446 ; ARM-NEXT:  .LBB8_3: @ %while.end
447 ; ARM-NEXT:    pop {r4, lr}
448 ; ARM-NEXT:    mov pc, lr
450 ; ARMT2-LABEL: t9:
451 ; ARMT2:       @ %bb.0: @ %entry
452 ; ARMT2-NEXT:    .save {r4, lr}
453 ; ARMT2-NEXT:    push {r4, lr}
454 ; ARMT2-NEXT:    ldrsb r4, [r0]
455 ; ARMT2-NEXT:    mov r0, #1
456 ; ARMT2-NEXT:    bl f
457 ; ARMT2-NEXT:    uxtb r0, r4
458 ; ARMT2-NEXT:    cmp r0, r0
459 ; ARMT2-NEXT:    popne {r4, pc}
460 ; ARMT2-NEXT:  .LBB8_1: @ %while.body.preheader
461 ; ARMT2-NEXT:    add r1, r4, #1
462 ; ARMT2-NEXT:    mov r2, r0
463 ; ARMT2-NEXT:  .LBB8_2: @ %while.body
464 ; ARMT2-NEXT:    @ =>This Inner Loop Header: Depth=1
465 ; ARMT2-NEXT:    add r2, r2, #1
466 ; ARMT2-NEXT:    add r1, r1, #1
467 ; ARMT2-NEXT:    uxtb r3, r2
468 ; ARMT2-NEXT:    cmp r3, r0
469 ; ARMT2-NEXT:    blt .LBB8_2
470 ; ARMT2-NEXT:  @ %bb.3: @ %while.end
471 ; ARMT2-NEXT:    pop {r4, pc}
473 ; THUMB1-LABEL: t9:
474 ; THUMB1:       @ %bb.0: @ %entry
475 ; THUMB1-NEXT:    .save {r4, lr}
476 ; THUMB1-NEXT:    push {r4, lr}
477 ; THUMB1-NEXT:    movs r1, #0
478 ; THUMB1-NEXT:    ldrsb r4, [r0, r1]
479 ; THUMB1-NEXT:    movs r0, #1
480 ; THUMB1-NEXT:    bl f
481 ; THUMB1-NEXT:    uxtb r0, r4
482 ; THUMB1-NEXT:    cmp r0, r0
483 ; THUMB1-NEXT:    bne .LBB8_3
484 ; THUMB1-NEXT:  @ %bb.1: @ %while.body.preheader
485 ; THUMB1-NEXT:    adds r1, r4, #1
486 ; THUMB1-NEXT:    mov r2, r0
487 ; THUMB1-NEXT:  .LBB8_2: @ %while.body
488 ; THUMB1-NEXT:    @ =>This Inner Loop Header: Depth=1
489 ; THUMB1-NEXT:    adds r1, r1, #1
490 ; THUMB1-NEXT:    adds r2, r2, #1
491 ; THUMB1-NEXT:    uxtb r3, r2
492 ; THUMB1-NEXT:    cmp r3, r0
493 ; THUMB1-NEXT:    blt .LBB8_2
494 ; THUMB1-NEXT:  .LBB8_3: @ %while.end
495 ; THUMB1-NEXT:    pop {r4, pc}
497 ; THUMB2-LABEL: t9:
498 ; THUMB2:       @ %bb.0: @ %entry
499 ; THUMB2-NEXT:    .save {r4, lr}
500 ; THUMB2-NEXT:    push {r4, lr}
501 ; THUMB2-NEXT:    ldrsb.w r4, [r0]
502 ; THUMB2-NEXT:    movs r0, #1
503 ; THUMB2-NEXT:    bl f
504 ; THUMB2-NEXT:    uxtb r0, r4
505 ; THUMB2-NEXT:    cmp r0, r0
506 ; THUMB2-NEXT:    it ne
507 ; THUMB2-NEXT:    popne {r4, pc}
508 ; THUMB2-NEXT:  .LBB8_1: @ %while.body.preheader
509 ; THUMB2-NEXT:    adds r1, r4, #1
510 ; THUMB2-NEXT:    mov r2, r0
511 ; THUMB2-NEXT:  .LBB8_2: @ %while.body
512 ; THUMB2-NEXT:    @ =>This Inner Loop Header: Depth=1
513 ; THUMB2-NEXT:    adds r2, #1
514 ; THUMB2-NEXT:    adds r1, #1
515 ; THUMB2-NEXT:    uxtb r3, r2
516 ; THUMB2-NEXT:    cmp r3, r0
517 ; THUMB2-NEXT:    blt .LBB8_2
518 ; THUMB2-NEXT:  @ %bb.3: @ %while.end
519 ; THUMB2-NEXT:    pop {r4, pc}
521 ; V8MBASE-LABEL: t9:
522 ; V8MBASE:       @ %bb.0: @ %entry
523 ; V8MBASE-NEXT:    .save {r4, lr}
524 ; V8MBASE-NEXT:    push {r4, lr}
525 ; V8MBASE-NEXT:    movs r1, #0
526 ; V8MBASE-NEXT:    ldrsb r4, [r0, r1]
527 ; V8MBASE-NEXT:    movs r0, #1
528 ; V8MBASE-NEXT:    bl f
529 ; V8MBASE-NEXT:    uxtb r0, r4
530 ; V8MBASE-NEXT:    cmp r0, r0
531 ; V8MBASE-NEXT:    bne .LBB8_3
532 ; V8MBASE-NEXT:  @ %bb.1: @ %while.body.preheader
533 ; V8MBASE-NEXT:    adds r1, r4, #1
534 ; V8MBASE-NEXT:    mov r2, r0
535 ; V8MBASE-NEXT:  .LBB8_2: @ %while.body
536 ; V8MBASE-NEXT:    @ =>This Inner Loop Header: Depth=1
537 ; V8MBASE-NEXT:    adds r1, r1, #1
538 ; V8MBASE-NEXT:    adds r2, r2, #1
539 ; V8MBASE-NEXT:    uxtb r3, r2
540 ; V8MBASE-NEXT:    cmp r3, r0
541 ; V8MBASE-NEXT:    blt .LBB8_2
542 ; V8MBASE-NEXT:  .LBB8_3: @ %while.end
543 ; V8MBASE-NEXT:    pop {r4, pc}
544 entry:
545   %0 = load i8, ptr %a
546   %conv = sext i8 %0 to i32
547   %conv119 = zext i8 %0 to i32
548   %conv522 = and i32 %conv, 255
549   %cmp723 = icmp eq i32 %conv522, %conv119
550   tail call void @f(i1 zeroext %cmp723)
551   br i1 %cmp723, label %while.body, label %while.end
553 while.body:                                       ; preds = %entry, %while.body
554   %ref.025 = phi i8 [ %inc9, %while.body ], [ %0, %entry ]
555   %in.024 = phi i32 [ %inc, %while.body ], [ %conv, %entry ]
556   %inc = add i32 %in.024, 1
557   %inc9 = add i8 %ref.025, 1
558   %conv1 = zext i8 %inc9 to i32
559   %cmp = icmp slt i32 %conv1, %conv119
560   %conv5 = and i32 %inc, 255
561   br i1 %cmp, label %while.body, label %while.end
563 while.end:
564   ret void
567 declare void @f(i1 zeroext)
569 define i1 @t10() {
570 ; ARM-LABEL: t10:
571 ; ARM:       @ %bb.0: @ %entry
572 ; ARM-NEXT:    .save {r11, lr}
573 ; ARM-NEXT:    push {r11, lr}
574 ; ARM-NEXT:    .pad #8
575 ; ARM-NEXT:    sub sp, sp, #8
576 ; ARM-NEXT:    mvn r0, #2
577 ; ARM-NEXT:    mvn r1, #7
578 ; ARM-NEXT:    str r0, [sp, #4]
579 ; ARM-NEXT:    mvn r0, #7
580 ; ARM-NEXT:    str r0, [sp]
581 ; ARM-NEXT:    mvn r0, #2
582 ; ARM-NEXT:    bl __aeabi_idivmod
583 ; ARM-NEXT:    sub r0, r1, r0, lsl #3
584 ; ARM-NEXT:    add r0, r0, #3
585 ; ARM-NEXT:    rsbs r1, r0, #0
586 ; ARM-NEXT:    adc r0, r0, r1
587 ; ARM-NEXT:    add sp, sp, #8
588 ; ARM-NEXT:    pop {r11, lr}
589 ; ARM-NEXT:    mov pc, lr
591 ; ARMT2-LABEL: t10:
592 ; ARMT2:       @ %bb.0: @ %entry
593 ; ARMT2-NEXT:    .save {r11, lr}
594 ; ARMT2-NEXT:    push {r11, lr}
595 ; ARMT2-NEXT:    .pad #8
596 ; ARMT2-NEXT:    sub sp, sp, #8
597 ; ARMT2-NEXT:    mvn r0, #2
598 ; ARMT2-NEXT:    str r0, [sp, #4]
599 ; ARMT2-NEXT:    mvn r0, #7
600 ; ARMT2-NEXT:    str r0, [sp]
601 ; ARMT2-NEXT:    mvn r0, #2
602 ; ARMT2-NEXT:    mvn r1, #7
603 ; ARMT2-NEXT:    bl __aeabi_idivmod
604 ; ARMT2-NEXT:    sub r0, r1, r0, lsl #3
605 ; ARMT2-NEXT:    add r0, r0, #3
606 ; ARMT2-NEXT:    clz r0, r0
607 ; ARMT2-NEXT:    lsr r0, r0, #5
608 ; ARMT2-NEXT:    add sp, sp, #8
609 ; ARMT2-NEXT:    pop {r11, pc}
611 ; THUMB1-LABEL: t10:
612 ; THUMB1:       @ %bb.0: @ %entry
613 ; THUMB1-NEXT:    .save {r4, r5, r7, lr}
614 ; THUMB1-NEXT:    push {r4, r5, r7, lr}
615 ; THUMB1-NEXT:    .pad #8
616 ; THUMB1-NEXT:    sub sp, #8
617 ; THUMB1-NEXT:    movs r0, #7
618 ; THUMB1-NEXT:    mvns r4, r0
619 ; THUMB1-NEXT:    str r4, [sp]
620 ; THUMB1-NEXT:    adds r5, r4, #5
621 ; THUMB1-NEXT:    str r5, [sp, #4]
622 ; THUMB1-NEXT:    mov r0, r5
623 ; THUMB1-NEXT:    mov r1, r4
624 ; THUMB1-NEXT:    bl __aeabi_idivmod
625 ; THUMB1-NEXT:    muls r0, r4, r0
626 ; THUMB1-NEXT:    adds r0, r0, r1
627 ; THUMB1-NEXT:    subs r1, r0, r5
628 ; THUMB1-NEXT:    rsbs r0, r1, #0
629 ; THUMB1-NEXT:    adcs r0, r1
630 ; THUMB1-NEXT:    add sp, #8
631 ; THUMB1-NEXT:    pop {r4, r5, r7, pc}
633 ; THUMB2-LABEL: t10:
634 ; THUMB2:       @ %bb.0: @ %entry
635 ; THUMB2-NEXT:    .save {r7, lr}
636 ; THUMB2-NEXT:    push {r7, lr}
637 ; THUMB2-NEXT:    .pad #8
638 ; THUMB2-NEXT:    sub sp, #8
639 ; THUMB2-NEXT:    mvn r0, #2
640 ; THUMB2-NEXT:    str r0, [sp, #4]
641 ; THUMB2-NEXT:    mvn r0, #7
642 ; THUMB2-NEXT:    str r0, [sp]
643 ; THUMB2-NEXT:    mvn r0, #2
644 ; THUMB2-NEXT:    mvn r1, #7
645 ; THUMB2-NEXT:    bl __aeabi_idivmod
646 ; THUMB2-NEXT:    sub.w r0, r1, r0, lsl #3
647 ; THUMB2-NEXT:    adds r0, #3
648 ; THUMB2-NEXT:    clz r0, r0
649 ; THUMB2-NEXT:    lsrs r0, r0, #5
650 ; THUMB2-NEXT:    add sp, #8
651 ; THUMB2-NEXT:    pop {r7, pc}
653 ; V8MBASE-LABEL: t10:
654 ; V8MBASE:       @ %bb.0: @ %entry
655 ; V8MBASE-NEXT:    .pad #8
656 ; V8MBASE-NEXT:    sub sp, #8
657 ; V8MBASE-NEXT:    movs r0, #7
658 ; V8MBASE-NEXT:    mvns r1, r0
659 ; V8MBASE-NEXT:    str r1, [sp]
660 ; V8MBASE-NEXT:    adds r0, r1, #5
661 ; V8MBASE-NEXT:    str r0, [sp, #4]
662 ; V8MBASE-NEXT:    adds r1, #8
663 ; V8MBASE-NEXT:    rsbs r0, r1, #0
664 ; V8MBASE-NEXT:    adcs r0, r1
665 ; V8MBASE-NEXT:    add sp, #8
666 ; V8MBASE-NEXT:    bx lr
667 entry:
668   %q = alloca i32
669   %p = alloca i32
670   store i32 -3, ptr %q
671   store i32 -8, ptr %p
672   %0 = load i32, ptr %q
673   %1 = load i32, ptr %p
674   %div = sdiv i32 %0, %1
675   %mul = mul nsw i32 %div, %1
676   %rem = srem i32 %0, %1
677   %add = add nsw i32 %mul, %rem
678   %cmp = icmp eq i32 %add, %0
679   ret i1 %cmp
682 define i1 @t11() {
683 ; ARM-LABEL: t11:
684 ; ARM:       @ %bb.0: @ %entry
685 ; ARM-NEXT:    .pad #4
686 ; ARM-NEXT:    sub sp, sp, #4
687 ; ARM-NEXT:    ldr r0, [sp]
688 ; ARM-NEXT:    mov r1, #40960
689 ; ARM-NEXT:    orr r1, r1, #-33554432
690 ; ARM-NEXT:    orr r0, r0, #40960
691 ; ARM-NEXT:    and r0, r0, r1
692 ; ARM-NEXT:    orr r0, r0, #3
693 ; ARM-NEXT:    str r0, [sp]
694 ; ARM-NEXT:    mov r0, #1
695 ; ARM-NEXT:    add sp, sp, #4
696 ; ARM-NEXT:    mov pc, lr
698 ; ARMT2-LABEL: t11:
699 ; ARMT2:       @ %bb.0: @ %entry
700 ; ARMT2-NEXT:    .pad #4
701 ; ARMT2-NEXT:    sub sp, sp, #4
702 ; ARMT2-NEXT:    ldr r1, [sp]
703 ; ARMT2-NEXT:    mov r0, #33
704 ; ARMT2-NEXT:    movw r2, #39322
705 ; ARMT2-NEXT:    movt r2, #6553
706 ; ARMT2-NEXT:    bfi r1, r0, #0, #12
707 ; ARMT2-NEXT:    mov r0, #10
708 ; ARMT2-NEXT:    bfi r1, r0, #12, #13
709 ; ARMT2-NEXT:    mov r0, r1
710 ; ARMT2-NEXT:    bfc r0, #12, #20
711 ; ARMT2-NEXT:    umull r2, r3, r0, r2
712 ; ARMT2-NEXT:    add r2, r3, r3, lsl #2
713 ; ARMT2-NEXT:    sub r0, r0, r2, lsl #1
714 ; ARMT2-NEXT:    movw r2, #40960
715 ; ARMT2-NEXT:    movt r2, #65024
716 ; ARMT2-NEXT:    and r1, r1, r2
717 ; ARMT2-NEXT:    orr r0, r1, r0
718 ; ARMT2-NEXT:    str r0, [sp]
719 ; ARMT2-NEXT:    and r0, r0, #15
720 ; ARMT2-NEXT:    sub r0, r0, #3
721 ; ARMT2-NEXT:    clz r0, r0
722 ; ARMT2-NEXT:    lsr r0, r0, #5
723 ; ARMT2-NEXT:    add sp, sp, #4
724 ; ARMT2-NEXT:    bx lr
726 ; THUMB1-LABEL: t11:
727 ; THUMB1:       @ %bb.0: @ %entry
728 ; THUMB1-NEXT:    .save {r4, r5, r7, lr}
729 ; THUMB1-NEXT:    push {r4, r5, r7, lr}
730 ; THUMB1-NEXT:    .pad #8
731 ; THUMB1-NEXT:    sub sp, #8
732 ; THUMB1-NEXT:    movs r4, #33
733 ; THUMB1-NEXT:    ldr r0, [sp, #4]
734 ; THUMB1-NEXT:    orrs r0, r4
735 ; THUMB1-NEXT:    ldr r1, .LCPI10_0
736 ; THUMB1-NEXT:    ands r1, r0
737 ; THUMB1-NEXT:    movs r0, #5
738 ; THUMB1-NEXT:    lsls r0, r0, #13
739 ; THUMB1-NEXT:    adds r5, r1, r0
740 ; THUMB1-NEXT:    movs r1, #10
741 ; THUMB1-NEXT:    mov r0, r4
742 ; THUMB1-NEXT:    bl __aeabi_uidivmod
743 ; THUMB1-NEXT:    bics r5, r4
744 ; THUMB1-NEXT:    orrs r5, r1
745 ; THUMB1-NEXT:    str r5, [sp, #4]
746 ; THUMB1-NEXT:    ldr r0, .LCPI10_1
747 ; THUMB1-NEXT:    ands r0, r5
748 ; THUMB1-NEXT:    subs r1, r0, #3
749 ; THUMB1-NEXT:    rsbs r0, r1, #0
750 ; THUMB1-NEXT:    adcs r0, r1
751 ; THUMB1-NEXT:    add sp, #8
752 ; THUMB1-NEXT:    pop {r4, r5, r7, pc}
753 ; THUMB1-NEXT:    .p2align 2
754 ; THUMB1-NEXT:  @ %bb.1:
755 ; THUMB1-NEXT:  .LCPI10_0:
756 ; THUMB1-NEXT:    .long 4261412897 @ 0xfe000021
757 ; THUMB1-NEXT:  .LCPI10_1:
758 ; THUMB1-NEXT:    .long 4095 @ 0xfff
760 ; THUMB2-LABEL: t11:
761 ; THUMB2:       @ %bb.0: @ %entry
762 ; THUMB2-NEXT:    .pad #4
763 ; THUMB2-NEXT:    sub sp, #4
764 ; THUMB2-NEXT:    ldr r1, [sp]
765 ; THUMB2-NEXT:    movs r0, #33
766 ; THUMB2-NEXT:    movw r2, #39322
767 ; THUMB2-NEXT:    bfi r1, r0, #0, #12
768 ; THUMB2-NEXT:    movs r0, #10
769 ; THUMB2-NEXT:    bfi r1, r0, #12, #13
770 ; THUMB2-NEXT:    mov r0, r1
771 ; THUMB2-NEXT:    movt r2, #6553
772 ; THUMB2-NEXT:    bfc r0, #12, #20
773 ; THUMB2-NEXT:    umull r2, r3, r0, r2
774 ; THUMB2-NEXT:    add.w r2, r3, r3, lsl #2
775 ; THUMB2-NEXT:    sub.w r0, r0, r2, lsl #1
776 ; THUMB2-NEXT:    movw r2, #40960
777 ; THUMB2-NEXT:    movt r2, #65024
778 ; THUMB2-NEXT:    ands r1, r2
779 ; THUMB2-NEXT:    orrs r0, r1
780 ; THUMB2-NEXT:    str r0, [sp]
781 ; THUMB2-NEXT:    and r0, r0, #15
782 ; THUMB2-NEXT:    subs r0, #3
783 ; THUMB2-NEXT:    clz r0, r0
784 ; THUMB2-NEXT:    lsrs r0, r0, #5
785 ; THUMB2-NEXT:    add sp, #4
786 ; THUMB2-NEXT:    bx lr
788 ; V8MBASE-LABEL: t11:
789 ; V8MBASE:       @ %bb.0: @ %entry
790 ; V8MBASE-NEXT:    .pad #4
791 ; V8MBASE-NEXT:    sub sp, #4
792 ; V8MBASE-NEXT:    movs r0, #127
793 ; V8MBASE-NEXT:    lsls r0, r0, #25
794 ; V8MBASE-NEXT:    ldr r1, [sp]
795 ; V8MBASE-NEXT:    ands r1, r0
796 ; V8MBASE-NEXT:    movw r0, #40963
797 ; V8MBASE-NEXT:    adds r0, r1, r0
798 ; V8MBASE-NEXT:    str r0, [sp]
799 ; V8MBASE-NEXT:    movs r1, #0
800 ; V8MBASE-NEXT:    rsbs r0, r1, #0
801 ; V8MBASE-NEXT:    adcs r0, r1
802 ; V8MBASE-NEXT:    add sp, #4
803 ; V8MBASE-NEXT:    bx lr
804 entry:
805   %bit = alloca i32
806   %load = load i32, ptr %bit
807   %clear = and i32 %load, -4096
808   %set = or i32 %clear, 33
809   store i32 %set, ptr %bit
810   %load1 = load i32, ptr %bit
811   %clear2 = and i32 %load1, -33550337
812   %set3 = or i32 %clear2, 40960
813   %clear5 = and i32 %set3, 4095
814   %rem = srem i32 %clear5, 10
815   %clear9 = and i32 %set3, -4096
816   %set10 = or i32 %clear9, %rem
817   store i32 %set10, ptr %bit
818   %clear12 = and i32 %set10, 4095
819   %cmp = icmp eq i32 %clear12, 3
820   ret i1 %cmp
823 define i32 @t12(i32 %a) nounwind {
824 ; ARM-LABEL: t12:
825 ; ARM:       @ %bb.0: @ %entry
826 ; ARM-NEXT:    cmp r0, #0
827 ; ARM-NEXT:    movne r0, #1
828 ; ARM-NEXT:    lsl r0, r0, #1
829 ; ARM-NEXT:    mov pc, lr
831 ; ARMT2-LABEL: t12:
832 ; ARMT2:       @ %bb.0: @ %entry
833 ; ARMT2-NEXT:    cmp r0, #0
834 ; ARMT2-NEXT:    movwne r0, #1
835 ; ARMT2-NEXT:    lsl r0, r0, #1
836 ; ARMT2-NEXT:    bx lr
838 ; THUMB1-LABEL: t12:
839 ; THUMB1:       @ %bb.0: @ %entry
840 ; THUMB1-NEXT:    subs r1, r0, #1
841 ; THUMB1-NEXT:    sbcs r0, r1
842 ; THUMB1-NEXT:    lsls r0, r0, #1
843 ; THUMB1-NEXT:    bx lr
845 ; THUMB2-LABEL: t12:
846 ; THUMB2:       @ %bb.0: @ %entry
847 ; THUMB2-NEXT:    cmp r0, #0
848 ; THUMB2-NEXT:    it ne
849 ; THUMB2-NEXT:    movne r0, #1
850 ; THUMB2-NEXT:    lsls r0, r0, #1
851 ; THUMB2-NEXT:    bx lr
853 ; V8MBASE-LABEL: t12:
854 ; V8MBASE:       @ %bb.0: @ %entry
855 ; V8MBASE-NEXT:    subs r1, r0, #1
856 ; V8MBASE-NEXT:    sbcs r0, r1
857 ; V8MBASE-NEXT:    lsls r0, r0, #1
858 ; V8MBASE-NEXT:    bx lr
859 entry:
860   %tobool = icmp ne i32 %a, 0
861   %lnot.ext = select i1 %tobool, i32 2, i32 0
862   ret i32 %lnot.ext
865 define i32 @t13(i32 %a) nounwind {
866 ; ARM-LABEL: t13:
867 ; ARM:       @ %bb.0: @ %entry
868 ; ARM-NEXT:    cmp r0, #0
869 ; ARM-NEXT:    movne r0, #3
870 ; ARM-NEXT:    mov pc, lr
872 ; ARMT2-LABEL: t13:
873 ; ARMT2:       @ %bb.0: @ %entry
874 ; ARMT2-NEXT:    cmp r0, #0
875 ; ARMT2-NEXT:    movwne r0, #3
876 ; ARMT2-NEXT:    bx lr
878 ; THUMB1-LABEL: t13:
879 ; THUMB1:       @ %bb.0: @ %entry
880 ; THUMB1-NEXT:    cmp r0, #0
881 ; THUMB1-NEXT:    beq .LBB12_2
882 ; THUMB1-NEXT:  @ %bb.1:
883 ; THUMB1-NEXT:    movs r0, #3
884 ; THUMB1-NEXT:  .LBB12_2: @ %entry
885 ; THUMB1-NEXT:    bx lr
887 ; THUMB2-LABEL: t13:
888 ; THUMB2:       @ %bb.0: @ %entry
889 ; THUMB2-NEXT:    cmp r0, #0
890 ; THUMB2-NEXT:    it ne
891 ; THUMB2-NEXT:    movne r0, #3
892 ; THUMB2-NEXT:    bx lr
894 ; V8MBASE-LABEL: t13:
895 ; V8MBASE:       @ %bb.0: @ %entry
896 ; V8MBASE-NEXT:    cbz r0, .LBB12_2
897 ; V8MBASE-NEXT:  @ %bb.1:
898 ; V8MBASE-NEXT:    movs r0, #3
899 ; V8MBASE-NEXT:  .LBB12_2: @ %entry
900 ; V8MBASE-NEXT:    bx lr
901 entry:
902   %tobool = icmp ne i32 %a, 0
903   %lnot.ext = select i1 %tobool, i32 3, i32 0
904   ret i32 %lnot.ext