[InstCombine] Signed saturation patterns
[llvm-complete.git] / test / CodeGen / Thumb / cmp-and-fold.ll
blob44c873a5fe25e4fd00ea99c0de0555beb9967e78
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -mtriple=thumbv6-eabi %s -o - | FileCheck %s
4 define void @test1(i32 %x, void ()* %f)  {
5 ; CHECK-LABEL: test1:
6 ; CHECK:       @ %bb.0: @ %entry
7 ; CHECK-NEXT:    .save {r7, lr}
8 ; CHECK-NEXT:    push {r7, lr}
9 ; CHECK-NEXT:    lsls r0, r0, #2
10 ; CHECK-NEXT:    cmp r0, #68
11 ; CHECK-NEXT:    beq .LBB0_2
12 ; CHECK-NEXT:  @ %bb.1: @ %if.then
13 ; CHECK-NEXT:    blx r1
14 ; CHECK-NEXT:  .LBB0_2: @ %if.end
15 ; CHECK-NEXT:    pop {r7, pc}
16 entry:
17   %a = and i32 %x, 1073741823
18   %cmp = icmp eq i32 %a, 17
19   br i1 %cmp, label %if.end, label %if.then
21 if.then:
22   tail call void %f()
23   br label %if.end
25 if.end:
26   ret void
29 define void @test2(i32 %x, void ()* %f)  {
30 ; CHECK-LABEL: test2:
31 ; CHECK:       @ %bb.0: @ %entry
32 ; CHECK-NEXT:    .save {r7, lr}
33 ; CHECK-NEXT:    push {r7, lr}
34 ; CHECK-NEXT:    lsls r0, r0, #8
35 ; CHECK-NEXT:    bhi .LBB1_2
36 ; CHECK-NEXT:  @ %bb.1: @ %if.then
37 ; CHECK-NEXT:    blx r1
38 ; CHECK-NEXT:  .LBB1_2: @ %if.end
39 ; CHECK-NEXT:    pop {r7, pc}
40 entry:
41   %a = shl i32 %x, 7
42   %cmp = icmp ugt i32 %a, 2147483648
43   br i1 %cmp, label %if.end, label %if.then
45 if.then:
46   tail call void %f()
47   br label %if.end
49 if.end:
50   ret void
53 define void @test3(i32 %x, void ()* %f)  {
54 ; CHECK-LABEL: test3:
55 ; CHECK:       @ %bb.0: @ %entry
56 ; CHECK-NEXT:    .save {r7, lr}
57 ; CHECK-NEXT:    push {r7, lr}
58 ; CHECK-NEXT:    lsls r0, r0, #3
59 ; CHECK-NEXT:    bhi .LBB2_2
60 ; CHECK-NEXT:  @ %bb.1: @ %if.then
61 ; CHECK-NEXT:    blx r1
62 ; CHECK-NEXT:  .LBB2_2: @ %if.end
63 ; CHECK-NEXT:    pop {r7, pc}
64 entry:
65   %a = and i32 %x, 1073741823
66   %cmp = icmp ugt i32 %a, 536870912
67   br i1 %cmp, label %if.end, label %if.then
69 if.then:
70   tail call void %f()
71   br label %if.end
73 if.end:
74   ret void
77 define void @test4(i32 %x, void ()* %f)  {
78 ; CHECK-LABEL: test4:
79 ; CHECK:       @ %bb.0: @ %entry
80 ; CHECK-NEXT:    .save {r7, lr}
81 ; CHECK-NEXT:    push {r7, lr}
82 ; CHECK-NEXT:    uxtb r0, r0
83 ; CHECK-NEXT:    cmp r0, #17
84 ; CHECK-NEXT:    beq .LBB3_2
85 ; CHECK-NEXT:  @ %bb.1: @ %if.then
86 ; CHECK-NEXT:    blx r1
87 ; CHECK-NEXT:  .LBB3_2: @ %if.end
88 ; CHECK-NEXT:    pop {r7, pc}
89 entry:
90   %a = and i32 %x, 255
91   %cmp = icmp eq i32 %a, 17
92   br i1 %cmp, label %if.end, label %if.then
94 if.then:
95   tail call void %f()
96   br label %if.end
98 if.end:
99   ret void
102 define void @test5(i32 %x, void ()* %f)  {
103 ; CHECK-LABEL: test5:
104 ; CHECK:       @ %bb.0: @ %entry
105 ; CHECK-NEXT:    .save {r7, lr}
106 ; CHECK-NEXT:    push {r7, lr}
107 ; CHECK-NEXT:    uxth r0, r0
108 ; CHECK-NEXT:    cmp r0, #17
109 ; CHECK-NEXT:    beq .LBB4_2
110 ; CHECK-NEXT:  @ %bb.1: @ %if.then
111 ; CHECK-NEXT:    blx r1
112 ; CHECK-NEXT:  .LBB4_2: @ %if.end
113 ; CHECK-NEXT:    pop {r7, pc}
114 entry:
115   %a = and i32 %x, 65535
116   %cmp = icmp eq i32 %a, 17
117   br i1 %cmp, label %if.end, label %if.then
119 if.then:
120   tail call void %f()
121   br label %if.end
123 if.end:
124   ret void
127 define void @test6(i32 %x, void ()* %f)  {
128 ; CHECK-LABEL: test6:
129 ; CHECK:       @ %bb.0: @ %entry
130 ; CHECK-NEXT:    .save {r7, lr}
131 ; CHECK-NEXT:    push {r7, lr}
132 ; CHECK-NEXT:    movs r2, #32
133 ; CHECK-NEXT:    ands r2, r0
134 ; CHECK-NEXT:    cmp r2, #17
135 ; CHECK-NEXT:    beq .LBB5_2
136 ; CHECK-NEXT:  @ %bb.1: @ %if.then
137 ; CHECK-NEXT:    blx r1
138 ; CHECK-NEXT:  .LBB5_2: @ %if.end
139 ; CHECK-NEXT:    pop {r7, pc}
140 entry:
141   %a = and i32 %x, 32
142   %cmp = icmp eq i32 %a, 17
143   br i1 %cmp, label %if.end, label %if.then
145 if.then:
146   tail call void %f()
147   br label %if.end
149 if.end:
150   ret void
153 define void @test7(i32 %x, void ()* %f)  {
154 ; CHECK-LABEL: test7:
155 ; CHECK:       @ %bb.0: @ %entry
156 ; CHECK-NEXT:    .save {r7, lr}
157 ; CHECK-NEXT:    push {r7, lr}
158 ; CHECK-NEXT:    ldr r2, .LCPI6_0
159 ; CHECK-NEXT:    ands r2, r0
160 ; CHECK-NEXT:    cmp r2, #17
161 ; CHECK-NEXT:    beq .LBB6_2
162 ; CHECK-NEXT:  @ %bb.1: @ %if.then
163 ; CHECK-NEXT:    blx r1
164 ; CHECK-NEXT:  .LBB6_2: @ %if.end
165 ; CHECK-NEXT:    pop {r7, pc}
166 ; CHECK-NEXT:    .p2align 2
167 ; CHECK-NEXT:  @ %bb.3:
168 ; CHECK-NEXT:  .LCPI6_0:
169 ; CHECK-NEXT:    .long 1023 @ 0x3ff
170 entry:
171   %a = and i32 %x, 1023
172   %cmp = icmp eq i32 %a, 17
173   br i1 %cmp, label %if.end, label %if.then
175 if.then:
176   tail call void %f()
177   br label %if.end
179 if.end:
180   ret void
183 define void @test8(i32 %x, void ()* %f)  {
184 ; CHECK-LABEL: test8:
185 ; CHECK:       @ %bb.0: @ %entry
186 ; CHECK-NEXT:    .save {r7, lr}
187 ; CHECK-NEXT:    push {r7, lr}
188 ; CHECK-NEXT:    movs r2, #129
189 ; CHECK-NEXT:    lsls r2, r2, #23
190 ; CHECK-NEXT:    lsls r0, r0, #22
191 ; CHECK-NEXT:    cmp r0, r2
192 ; CHECK-NEXT:    beq .LBB7_2
193 ; CHECK-NEXT:  @ %bb.1: @ %if.then
194 ; CHECK-NEXT:    blx r1
195 ; CHECK-NEXT:  .LBB7_2: @ %if.end
196 ; CHECK-NEXT:    pop {r7, pc}
197 entry:
198   %a = and i32 %x, 1023
199   %cmp = icmp eq i32 %a, 258
200   br i1 %cmp, label %if.end, label %if.then
202 if.then:
203   tail call void %f()
204   br label %if.end
206 if.end:
207   ret void