[fast-isel] Address Eli's comments for r152847. Specifically, add a test case
[oota-llvm.git] / test / CodeGen / ARM / fast-isel-cmp-imm.ll
1 ; RUN: llc < %s -O0 -fast-isel-abort -relocation-model=dynamic-no-pic -mtriple=armv7-apple-ios | FileCheck %s --check-prefix=ARM
2 ; RUN: llc < %s -O0 -fast-isel-abort -relocation-model=dynamic-no-pic -mtriple=thumbv7-apple-ios | FileCheck %s --check-prefix=THUMB
3
4 define void @t1a(float %a) uwtable ssp {
5 entry:
6 ; ARM: t1a
7 ; THUMB: t1a
8   %cmp = fcmp oeq float %a, 0.000000e+00
9 ; ARM: vcmpe.f32 s{{[0-9]+}}, #0
10 ; THUMB: vcmpe.f32 s{{[0-9]+}}, #0
11   br i1 %cmp, label %if.then, label %if.end
12
13 if.then:                                          ; preds = %entry
14   tail call void @foo()
15   br label %if.end
16
17 if.end:                                           ; preds = %if.then, %entry
18   ret void
19 }
20
21 declare void @foo()
22
23 ; Shouldn't be able to encode -0.0 imm.
24 define void @t1b(float %a) uwtable ssp {
25 entry:
26 ; ARM: t1b
27 ; THUMB: t1b
28   %cmp = fcmp oeq float %a, -0.000000e+00
29 ; ARM: vldr
30 ; ARM: vcmpe.f32 s{{[0-9]+}}, s{{[0-9]+}}
31 ; THUMB: vldr
32 ; THUMB: vcmpe.f32 s{{[0-9]+}}, s{{[0-9]+}}
33   br i1 %cmp, label %if.then, label %if.end
34
35 if.then:                                          ; preds = %entry
36   tail call void @foo()
37   br label %if.end
38
39 if.end:                                           ; preds = %if.then, %entry
40   ret void
41 }
42
43 define void @t2a(double %a) uwtable ssp {
44 entry:
45 ; ARM: t2a
46 ; THUMB: t2a
47   %cmp = fcmp oeq double %a, 0.000000e+00
48 ; ARM: vcmpe.f64 d{{[0-9]+}}, #0
49 ; THUMB: vcmpe.f64 d{{[0-9]+}}, #0
50   br i1 %cmp, label %if.then, label %if.end
51
52 if.then:                                          ; preds = %entry
53   tail call void @foo()
54   br label %if.end
55
56 if.end:                                           ; preds = %if.then, %entry
57   ret void
58 }
59
60 ; Shouldn't be able to encode -0.0 imm.
61 define void @t2b(double %a) uwtable ssp {
62 entry:
63 ; ARM: t2b
64 ; THUMB: t2b
65   %cmp = fcmp oeq double %a, -0.000000e+00
66 ; ARM: vldr
67 ; ARM: vcmpe.f64 d{{[0-9]+}}, d{{[0-9]+}}
68 ; THUMB: vldr
69 ; THUMB: vcmpe.f64 d{{[0-9]+}}, d{{[0-9]+}}
70   br i1 %cmp, label %if.then, label %if.end
71
72 if.then:                                          ; preds = %entry
73   tail call void @foo()
74   br label %if.end
75
76 if.end:                                           ; preds = %if.then, %entry
77   ret void
78 }
79
80 define void @t4(i8 signext %a) uwtable ssp {
81 entry:
82 ; ARM: t4
83 ; THUMB: t4
84   %cmp = icmp eq i8 %a, -1
85 ; ARM: cmn r{{[0-9]}}, #1
86 ; THUMB: cmn.w r{{[0-9]}}, #1
87   br i1 %cmp, label %if.then, label %if.end
88
89 if.then:                                          ; preds = %entry
90   tail call void @foo()
91   br label %if.end
92
93 if.end:                                           ; preds = %if.then, %entry
94   ret void
95 }
96
97 define void @t5(i8 zeroext %a) uwtable ssp {
98 entry:
99 ; ARM: t5
100 ; THUMB: t5
101   %cmp = icmp eq i8 %a, 1
102 ; ARM: cmp r{{[0-9]}}, #1
103 ; THUMB: cmp r{{[0-9]}}, #1
104   br i1 %cmp, label %if.then, label %if.end
105
106 if.then:                                          ; preds = %entry
107   tail call void @foo()
108   br label %if.end
109
110 if.end:                                           ; preds = %if.then, %entry
111   ret void
112 }
113
114 define void @t6(i16 signext %a) uwtable ssp {
115 entry:
116 ; ARM: t6
117 ; THUMB: t6
118   %cmp = icmp eq i16 %a, -1
119 ; ARM: cmn r{{[0-9]}}, #1
120 ; THUMB: cmn.w r{{[0-9]}}, #1
121   br i1 %cmp, label %if.then, label %if.end
122
123 if.then:                                          ; preds = %entry
124   tail call void @foo()
125   br label %if.end
126
127 if.end:                                           ; preds = %if.then, %entry
128   ret void
129 }
130
131 define void @t7(i16 zeroext %a) uwtable ssp {
132 entry:
133 ; ARM: t7
134 ; THUMB: t7
135   %cmp = icmp eq i16 %a, 1
136 ; ARM: cmp r{{[0-9]}}, #1
137 ; THUMB: cmp r{{[0-9]}}, #1
138   br i1 %cmp, label %if.then, label %if.end
139
140 if.then:                                          ; preds = %entry
141   tail call void @foo()
142   br label %if.end
143
144 if.end:                                           ; preds = %if.then, %entry
145   ret void
146 }
147
148 define void @t8(i32 %a) uwtable ssp {
149 entry:
150 ; ARM: t8
151 ; THUMB: t8
152   %cmp = icmp eq i32 %a, -1
153 ; ARM: cmn r{{[0-9]}}, #1
154 ; THUMB: cmn.w r{{[0-9]}}, #1
155   br i1 %cmp, label %if.then, label %if.end
156
157 if.then:                                          ; preds = %entry
158   tail call void @foo()
159   br label %if.end
160
161 if.end:                                           ; preds = %if.then, %entry
162   ret void
163 }
164
165 define void @t9(i32 %a) uwtable ssp {
166 entry:
167 ; ARM: t9
168 ; THUMB: t9
169   %cmp = icmp eq i32 %a, 1
170 ; ARM: cmp r{{[0-9]}}, #1
171 ; THUMB: cmp r{{[0-9]}}, #1
172   br i1 %cmp, label %if.then, label %if.end
173
174 if.then:                                          ; preds = %entry
175   tail call void @foo()
176   br label %if.end
177
178 if.end:                                           ; preds = %if.then, %entry
179   ret void
180 }
181
182 define void @t10(i32 %a) uwtable ssp {
183 entry:
184 ; ARM: t10
185 ; THUMB: t10
186   %cmp = icmp eq i32 %a, 384
187 ; ARM: cmp r{{[0-9]}}, #384
188 ; THUMB: cmp.w r{{[0-9]}}, #384
189   br i1 %cmp, label %if.then, label %if.end
190
191 if.then:                                          ; preds = %entry
192   tail call void @foo()
193   br label %if.end
194
195 if.end:                                           ; preds = %if.then, %entry
196   ret void
197 }
198
199 define void @t11(i32 %a) uwtable ssp {
200 entry:
201 ; ARM: t11
202 ; THUMB: t11
203   %cmp = icmp eq i32 %a, 4096
204 ; ARM: cmp r{{[0-9]}}, #4096
205 ; THUMB: cmp.w r{{[0-9]}}, #4096
206   br i1 %cmp, label %if.then, label %if.end
207
208 if.then:                                          ; preds = %entry
209   tail call void @foo()
210   br label %if.end
211
212 if.end:                                           ; preds = %if.then, %entry
213   ret void
214 }
215
216 define void @t12(i8 %a) uwtable ssp {
217 entry:
218 ; ARM: t12
219 ; THUMB: t12
220   %cmp = icmp ugt i8 %a, -113
221 ; ARM: cmp r{{[0-9]}}, #143
222 ; THUMB: cmp r{{[0-9]}}, #143
223   br i1 %cmp, label %if.then, label %if.end
224
225 if.then:                                          ; preds = %entry
226   tail call void @foo()
227   br label %if.end
228
229 if.end:                                           ; preds = %if.then, %entry
230   ret void
231 }
232
233 ; rdar://11038907
234 ; When comparing LONG_MIN/INT_MIN use a cmp instruction.
235 define void @t13() nounwind ssp {
236 entry:
237 ; ARM: t13
238 ; THUMB: t13
239   %cmp = icmp slt i32 -123, -2147483648
240 ; ARM: cmp r{{[0-9]}}, #-2147483648
241 ; THUMB: cmp.w r{{[0-9]}}, #-2147483648
242   br i1 %cmp, label %if.then, label %if.end
243
244 if.then:                                          ; preds = %entry
245   ret void
246
247 if.end:                                           ; preds = %entry
248   ret void
249 }
250