xref: /llvm-project/llvm/test/CodeGen/Thumb/cmp-and-fold.ll (revision e6bf3fa05b3706197143414a56be05ce014ebe01)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc -mtriple=thumbv6-eabi %s -o - | FileCheck %s
3
4define void @test1(i32 %x, ptr %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}
16entry:
17  %a = and i32 %x, 1073741823
18  %cmp = icmp eq i32 %a, 17
19  br i1 %cmp, label %if.end, label %if.then
20
21if.then:
22  tail call void %f()
23  br label %if.end
24
25if.end:
26  ret void
27}
28
29define void @test2(i32 %x, ptr %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}
40entry:
41  %a = shl i32 %x, 7
42  %cmp = icmp ugt i32 %a, 2147483648
43  br i1 %cmp, label %if.end, label %if.then
44
45if.then:
46  tail call void %f()
47  br label %if.end
48
49if.end:
50  ret void
51}
52
53define void @test3(i32 %x, ptr %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}
64entry:
65  %a = and i32 %x, 1073741823
66  %cmp = icmp ugt i32 %a, 536870912
67  br i1 %cmp, label %if.end, label %if.then
68
69if.then:
70  tail call void %f()
71  br label %if.end
72
73if.end:
74  ret void
75}
76
77define void @test4(i32 %x, ptr %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}
89entry:
90  %a = and i32 %x, 255
91  %cmp = icmp eq i32 %a, 17
92  br i1 %cmp, label %if.end, label %if.then
93
94if.then:
95  tail call void %f()
96  br label %if.end
97
98if.end:
99  ret void
100}
101
102define void @test5(i32 %x, ptr %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}
114entry:
115  %a = and i32 %x, 65535
116  %cmp = icmp eq i32 %a, 17
117  br i1 %cmp, label %if.end, label %if.then
118
119if.then:
120  tail call void %f()
121  br label %if.end
122
123if.end:
124  ret void
125}
126
127define void @test6(i32 %x, ptr %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}
140entry:
141  %a = and i32 %x, 32
142  %cmp = icmp eq i32 %a, 17
143  br i1 %cmp, label %if.end, label %if.then
144
145if.then:
146  tail call void %f()
147  br label %if.end
148
149if.end:
150  ret void
151}
152
153define void @test7(i32 %x, ptr %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
170entry:
171  %a = and i32 %x, 1023
172  %cmp = icmp eq i32 %a, 17
173  br i1 %cmp, label %if.end, label %if.then
174
175if.then:
176  tail call void %f()
177  br label %if.end
178
179if.end:
180  ret void
181}
182
183define void @test8(i32 %x, ptr %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}
197entry:
198  %a = and i32 %x, 1023
199  %cmp = icmp eq i32 %a, 258
200  br i1 %cmp, label %if.end, label %if.then
201
202if.then:
203  tail call void %f()
204  br label %if.end
205
206if.end:
207  ret void
208}
209