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