[DAGCombiner] Eliminate dead stores to stack.
[llvm-complete.git] / test / CodeGen / X86 / fast-isel-select-pseudo-cmov.ll
blob58b378aa20069d92bafa16d40b63c2c116179d68
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -mtriple=x86_64-apple-darwin10                                              | FileCheck %s --check-prefix=CHECK --check-prefix=SSE
3 ; RUN: llc < %s -mtriple=x86_64-apple-darwin10 -fast-isel -fast-isel-abort=1                  | FileCheck %s --check-prefix=CHECK --check-prefix=SSE
4 ; RUN: llc < %s -mtriple=x86_64-apple-darwin10                             -mcpu=corei7-avx | FileCheck %s --check-prefix=CHECK --check-prefix=AVX
5 ; RUN: llc < %s -mtriple=x86_64-apple-darwin10 -fast-isel -fast-isel-abort=1 -mcpu=corei7-avx | FileCheck %s --check-prefix=CHECK --check-prefix=AVX
8 define float @select_fcmp_one_f32(float %a, float %b, float %c, float %d) {
9 ; SSE-LABEL: select_fcmp_one_f32:
10 ; SSE:       ## %bb.0:
11 ; SSE-NEXT:    ucomiss %xmm1, %xmm0
12 ; SSE-NEXT:    jne LBB0_2
13 ; SSE-NEXT:  ## %bb.1:
14 ; SSE-NEXT:    movaps %xmm3, %xmm2
15 ; SSE-NEXT:  LBB0_2:
16 ; SSE-NEXT:    movaps %xmm2, %xmm0
17 ; SSE-NEXT:    retq
19 ; AVX-LABEL: select_fcmp_one_f32:
20 ; AVX:       ## %bb.0:
21 ; AVX-NEXT:    vcmpneq_oqss %xmm1, %xmm0, %xmm0
22 ; AVX-NEXT:    vblendvps %xmm0, %xmm2, %xmm3, %xmm0
23 ; AVX-NEXT:    retq
24   %1 = fcmp one float %a, %b
25   %2 = select i1 %1, float %c, float %d
26   ret float %2
29 define double @select_fcmp_one_f64(double %a, double %b, double %c, double %d) {
30 ; SSE-LABEL: select_fcmp_one_f64:
31 ; SSE:       ## %bb.0:
32 ; SSE-NEXT:    ucomisd %xmm1, %xmm0
33 ; SSE-NEXT:    jne LBB1_2
34 ; SSE-NEXT:  ## %bb.1:
35 ; SSE-NEXT:    movaps %xmm3, %xmm2
36 ; SSE-NEXT:  LBB1_2:
37 ; SSE-NEXT:    movaps %xmm2, %xmm0
38 ; SSE-NEXT:    retq
40 ; AVX-LABEL: select_fcmp_one_f64:
41 ; AVX:       ## %bb.0:
42 ; AVX-NEXT:    vcmpneq_oqsd %xmm1, %xmm0, %xmm0
43 ; AVX-NEXT:    vblendvpd %xmm0, %xmm2, %xmm3, %xmm0
44 ; AVX-NEXT:    retq
45   %1 = fcmp one double %a, %b
46   %2 = select i1 %1, double %c, double %d
47   ret double %2
50 define float @select_icmp_eq_f32(i64 %a, i64 %b, float %c, float %d) {
51 ; SSE-LABEL: select_icmp_eq_f32:
52 ; SSE:       ## %bb.0:
53 ; SSE-NEXT:    cmpq %rsi, %rdi
54 ; SSE-NEXT:    je LBB2_2
55 ; SSE-NEXT:  ## %bb.1:
56 ; SSE-NEXT:    movaps %xmm1, %xmm0
57 ; SSE-NEXT:  LBB2_2:
58 ; SSE-NEXT:    retq
60 ; AVX-LABEL: select_icmp_eq_f32:
61 ; AVX:       ## %bb.0:
62 ; AVX-NEXT:    cmpq %rsi, %rdi
63 ; AVX-NEXT:    je LBB2_2
64 ; AVX-NEXT:  ## %bb.1:
65 ; AVX-NEXT:    vmovaps %xmm1, %xmm0
66 ; AVX-NEXT:  LBB2_2:
67 ; AVX-NEXT:    retq
68   %1 = icmp eq i64 %a, %b
69   %2 = select i1 %1, float %c, float %d
70   ret float %2
73 define float @select_icmp_ne_f32(i64 %a, i64 %b, float %c, float %d) {
74 ; SSE-LABEL: select_icmp_ne_f32:
75 ; SSE:       ## %bb.0:
76 ; SSE-NEXT:    cmpq %rsi, %rdi
77 ; SSE-NEXT:    jne LBB3_2
78 ; SSE-NEXT:  ## %bb.1:
79 ; SSE-NEXT:    movaps %xmm1, %xmm0
80 ; SSE-NEXT:  LBB3_2:
81 ; SSE-NEXT:    retq
83 ; AVX-LABEL: select_icmp_ne_f32:
84 ; AVX:       ## %bb.0:
85 ; AVX-NEXT:    cmpq %rsi, %rdi
86 ; AVX-NEXT:    jne LBB3_2
87 ; AVX-NEXT:  ## %bb.1:
88 ; AVX-NEXT:    vmovaps %xmm1, %xmm0
89 ; AVX-NEXT:  LBB3_2:
90 ; AVX-NEXT:    retq
91   %1 = icmp ne i64 %a, %b
92   %2 = select i1 %1, float %c, float %d
93   ret float %2
96 define float @select_icmp_ugt_f32(i64 %a, i64 %b, float %c, float %d) {
97 ; SSE-LABEL: select_icmp_ugt_f32:
98 ; SSE:       ## %bb.0:
99 ; SSE-NEXT:    cmpq %rsi, %rdi
100 ; SSE-NEXT:    ja LBB4_2
101 ; SSE-NEXT:  ## %bb.1:
102 ; SSE-NEXT:    movaps %xmm1, %xmm0
103 ; SSE-NEXT:  LBB4_2:
104 ; SSE-NEXT:    retq
106 ; AVX-LABEL: select_icmp_ugt_f32:
107 ; AVX:       ## %bb.0:
108 ; AVX-NEXT:    cmpq %rsi, %rdi
109 ; AVX-NEXT:    ja LBB4_2
110 ; AVX-NEXT:  ## %bb.1:
111 ; AVX-NEXT:    vmovaps %xmm1, %xmm0
112 ; AVX-NEXT:  LBB4_2:
113 ; AVX-NEXT:    retq
114   %1 = icmp ugt i64 %a, %b
115   %2 = select i1 %1, float %c, float %d
116   ret float %2
119 define float @select_icmp_uge_f32(i64 %a, i64 %b, float %c, float %d) {
120 ; SSE-LABEL: select_icmp_uge_f32:
121 ; SSE:       ## %bb.0:
122 ; SSE-NEXT:    cmpq %rsi, %rdi
123 ; SSE-NEXT:    jae LBB5_2
124 ; SSE-NEXT:  ## %bb.1:
125 ; SSE-NEXT:    movaps %xmm1, %xmm0
126 ; SSE-NEXT:  LBB5_2:
127 ; SSE-NEXT:    retq
129 ; AVX-LABEL: select_icmp_uge_f32:
130 ; AVX:       ## %bb.0:
131 ; AVX-NEXT:    cmpq %rsi, %rdi
132 ; AVX-NEXT:    jae LBB5_2
133 ; AVX-NEXT:  ## %bb.1:
134 ; AVX-NEXT:    vmovaps %xmm1, %xmm0
135 ; AVX-NEXT:  LBB5_2:
136 ; AVX-NEXT:    retq
137   %1 = icmp uge i64 %a, %b
138   %2 = select i1 %1, float %c, float %d
139   ret float %2
142 define float @select_icmp_ult_f32(i64 %a, i64 %b, float %c, float %d) {
143 ; SSE-LABEL: select_icmp_ult_f32:
144 ; SSE:       ## %bb.0:
145 ; SSE-NEXT:    cmpq %rsi, %rdi
146 ; SSE-NEXT:    jb LBB6_2
147 ; SSE-NEXT:  ## %bb.1:
148 ; SSE-NEXT:    movaps %xmm1, %xmm0
149 ; SSE-NEXT:  LBB6_2:
150 ; SSE-NEXT:    retq
152 ; AVX-LABEL: select_icmp_ult_f32:
153 ; AVX:       ## %bb.0:
154 ; AVX-NEXT:    cmpq %rsi, %rdi
155 ; AVX-NEXT:    jb LBB6_2
156 ; AVX-NEXT:  ## %bb.1:
157 ; AVX-NEXT:    vmovaps %xmm1, %xmm0
158 ; AVX-NEXT:  LBB6_2:
159 ; AVX-NEXT:    retq
160   %1 = icmp ult i64 %a, %b
161   %2 = select i1 %1, float %c, float %d
162   ret float %2
165 define float @select_icmp_ule_f32(i64 %a, i64 %b, float %c, float %d) {
166 ; SSE-LABEL: select_icmp_ule_f32:
167 ; SSE:       ## %bb.0:
168 ; SSE-NEXT:    cmpq %rsi, %rdi
169 ; SSE-NEXT:    jbe LBB7_2
170 ; SSE-NEXT:  ## %bb.1:
171 ; SSE-NEXT:    movaps %xmm1, %xmm0
172 ; SSE-NEXT:  LBB7_2:
173 ; SSE-NEXT:    retq
175 ; AVX-LABEL: select_icmp_ule_f32:
176 ; AVX:       ## %bb.0:
177 ; AVX-NEXT:    cmpq %rsi, %rdi
178 ; AVX-NEXT:    jbe LBB7_2
179 ; AVX-NEXT:  ## %bb.1:
180 ; AVX-NEXT:    vmovaps %xmm1, %xmm0
181 ; AVX-NEXT:  LBB7_2:
182 ; AVX-NEXT:    retq
183   %1 = icmp ule i64 %a, %b
184   %2 = select i1 %1, float %c, float %d
185   ret float %2
188 define float @select_icmp_sgt_f32(i64 %a, i64 %b, float %c, float %d) {
189 ; SSE-LABEL: select_icmp_sgt_f32:
190 ; SSE:       ## %bb.0:
191 ; SSE-NEXT:    cmpq %rsi, %rdi
192 ; SSE-NEXT:    jg LBB8_2
193 ; SSE-NEXT:  ## %bb.1:
194 ; SSE-NEXT:    movaps %xmm1, %xmm0
195 ; SSE-NEXT:  LBB8_2:
196 ; SSE-NEXT:    retq
198 ; AVX-LABEL: select_icmp_sgt_f32:
199 ; AVX:       ## %bb.0:
200 ; AVX-NEXT:    cmpq %rsi, %rdi
201 ; AVX-NEXT:    jg LBB8_2
202 ; AVX-NEXT:  ## %bb.1:
203 ; AVX-NEXT:    vmovaps %xmm1, %xmm0
204 ; AVX-NEXT:  LBB8_2:
205 ; AVX-NEXT:    retq
206   %1 = icmp sgt i64 %a, %b
207   %2 = select i1 %1, float %c, float %d
208   ret float %2
211 define float @select_icmp_sge_f32(i64 %a, i64 %b, float %c, float %d) {
212 ; SSE-LABEL: select_icmp_sge_f32:
213 ; SSE:       ## %bb.0:
214 ; SSE-NEXT:    cmpq %rsi, %rdi
215 ; SSE-NEXT:    jge LBB9_2
216 ; SSE-NEXT:  ## %bb.1:
217 ; SSE-NEXT:    movaps %xmm1, %xmm0
218 ; SSE-NEXT:  LBB9_2:
219 ; SSE-NEXT:    retq
221 ; AVX-LABEL: select_icmp_sge_f32:
222 ; AVX:       ## %bb.0:
223 ; AVX-NEXT:    cmpq %rsi, %rdi
224 ; AVX-NEXT:    jge LBB9_2
225 ; AVX-NEXT:  ## %bb.1:
226 ; AVX-NEXT:    vmovaps %xmm1, %xmm0
227 ; AVX-NEXT:  LBB9_2:
228 ; AVX-NEXT:    retq
229   %1 = icmp sge i64 %a, %b
230   %2 = select i1 %1, float %c, float %d
231   ret float %2
234 define float @select_icmp_slt_f32(i64 %a, i64 %b, float %c, float %d) {
235 ; SSE-LABEL: select_icmp_slt_f32:
236 ; SSE:       ## %bb.0:
237 ; SSE-NEXT:    cmpq %rsi, %rdi
238 ; SSE-NEXT:    jl LBB10_2
239 ; SSE-NEXT:  ## %bb.1:
240 ; SSE-NEXT:    movaps %xmm1, %xmm0
241 ; SSE-NEXT:  LBB10_2:
242 ; SSE-NEXT:    retq
244 ; AVX-LABEL: select_icmp_slt_f32:
245 ; AVX:       ## %bb.0:
246 ; AVX-NEXT:    cmpq %rsi, %rdi
247 ; AVX-NEXT:    jl LBB10_2
248 ; AVX-NEXT:  ## %bb.1:
249 ; AVX-NEXT:    vmovaps %xmm1, %xmm0
250 ; AVX-NEXT:  LBB10_2:
251 ; AVX-NEXT:    retq
252   %1 = icmp slt i64 %a, %b
253   %2 = select i1 %1, float %c, float %d
254   ret float %2
257 define float @select_icmp_sle_f32(i64 %a, i64 %b, float %c, float %d) {
258 ; SSE-LABEL: select_icmp_sle_f32:
259 ; SSE:       ## %bb.0:
260 ; SSE-NEXT:    cmpq %rsi, %rdi
261 ; SSE-NEXT:    jle LBB11_2
262 ; SSE-NEXT:  ## %bb.1:
263 ; SSE-NEXT:    movaps %xmm1, %xmm0
264 ; SSE-NEXT:  LBB11_2:
265 ; SSE-NEXT:    retq
267 ; AVX-LABEL: select_icmp_sle_f32:
268 ; AVX:       ## %bb.0:
269 ; AVX-NEXT:    cmpq %rsi, %rdi
270 ; AVX-NEXT:    jle LBB11_2
271 ; AVX-NEXT:  ## %bb.1:
272 ; AVX-NEXT:    vmovaps %xmm1, %xmm0
273 ; AVX-NEXT:  LBB11_2:
274 ; AVX-NEXT:    retq
275   %1 = icmp sle i64 %a, %b
276   %2 = select i1 %1, float %c, float %d
277   ret float %2
280 define i8 @select_icmp_sle_i8(i64 %a, i64 %b, i8 %c, i8 %d) {
281 ; CHECK-LABEL: select_icmp_sle_i8:
282 ; CHECK:       ## %bb.0:
283 ; CHECK-NEXT:    cmpq %rsi, %rdi
284 ; CHECK-NEXT:    jle LBB12_1
285 ; CHECK-NEXT:  ## %bb.2:
286 ; CHECK-NEXT:    movl %ecx, %eax
287 ; CHECK-NEXT:    ## kill: def $al killed $al killed $eax
288 ; CHECK-NEXT:    retq
289 ; CHECK-NEXT:  LBB12_1:
290 ; CHECK-NEXT:    movl %edx, %eax
291 ; CHECK-NEXT:    ## kill: def $al killed $al killed $eax
292 ; CHECK-NEXT:    retq
293   %1 = icmp sle i64 %a, %b
294   %2 = select i1 %1, i8 %c, i8 %d
295   ret i8 %2