[InstCombine] Signed saturation patterns
[llvm-core.git] / test / CodeGen / X86 / brcond.ll
blobc7ccfe9f0d5c25387b0e7a0c21c2d6995e2c347c
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -mtriple=i386-apple-darwin10 -mcpu=penryn | FileCheck %s
4 ; rdar://7475489
6 define i32 @test1(i32 %a, i32 %b) nounwind ssp {
7 ; CHECK-LABEL: test1:
8 ; CHECK:       ## %bb.0: ## %entry
9 ; CHECK-NEXT:    movb {{[0-9]+}}(%esp), %al
10 ; CHECK-NEXT:    xorb {{[0-9]+}}(%esp), %al
11 ; CHECK-NEXT:    testb $64, %al
12 ; CHECK-NEXT:    je LBB0_1
13 ; CHECK-NEXT:  ## %bb.2: ## %bb1
14 ; CHECK-NEXT:    jmp _bar ## TAILCALL
15 ; CHECK-NEXT:  LBB0_1: ## %bb
16 ; CHECK-NEXT:    jmp _foo ## TAILCALL
17 entry:
18   %0 = and i32 %a, 16384
19   %1 = icmp ne i32 %0, 0
20   %2 = and i32 %b, 16384
21   %3 = icmp ne i32 %2, 0
22   %4 = xor i1 %1, %3
23   br i1 %4, label %bb1, label %bb
25 bb:                                               ; preds = %entry
26   %5 = tail call i32 (...) @foo() nounwind       ; <i32> [#uses=1]
27   ret i32 %5
29 bb1:                                              ; preds = %entry
30   %6 = tail call i32 (...) @bar() nounwind       ; <i32> [#uses=1]
31   ret i32 %6
34 declare i32 @foo(...)
36 declare i32 @bar(...)
39 ; <rdar://problem/7598384>:
41 ;    jCC  L1
42 ;    jmp  L2
43 ; L1:
44 ;   ...
45 ; L2:
46 ;   ...
48 ; to:
50 ;    jnCC L2
51 ; L1:
52 ;   ...
53 ; L2:
54 ;   ...
55 define float @test4(float %x, float %y) nounwind readnone optsize ssp {
56 ; CHECK-LABEL: test4:
57 ; CHECK:       ## %bb.0: ## %entry
58 ; CHECK-NEXT:    pushl %eax
59 ; CHECK-NEXT:    cvtss2sd {{[0-9]+}}(%esp), %xmm1
60 ; CHECK-NEXT:    cvtss2sd {{[0-9]+}}(%esp), %xmm0
61 ; CHECK-NEXT:    mulsd %xmm1, %xmm0
62 ; CHECK-NEXT:    xorpd %xmm1, %xmm1
63 ; CHECK-NEXT:    ucomisd %xmm1, %xmm0
64 ; CHECK-NEXT:    jne LBB1_1
65 ; CHECK-NEXT:    jnp LBB1_2
66 ; CHECK-NEXT:  LBB1_1: ## %bb1
67 ; CHECK-NEXT:    addsd LCPI1_0, %xmm0
68 ; CHECK-NEXT:  LBB1_2: ## %bb2
69 ; CHECK-NEXT:    cvtsd2ss %xmm0, %xmm0
70 ; CHECK-NEXT:    movss %xmm0, (%esp)
71 ; CHECK-NEXT:    flds (%esp)
72 ; CHECK-NEXT:    popl %eax
73 ; CHECK-NEXT:    retl
74 entry:
75   %0 = fpext float %x to double                   ; <double> [#uses=1]
76   %1 = fpext float %y to double                   ; <double> [#uses=1]
77   %2 = fmul double %0, %1                         ; <double> [#uses=3]
78   %3 = fcmp oeq double %2, 0.000000e+00           ; <i1> [#uses=1]
79   br i1 %3, label %bb2, label %bb1
82 bb1:                                              ; preds = %entry
83   %4 = fadd double %2, -1.000000e+00              ; <double> [#uses=1]
84   br label %bb2
86 bb2:                                              ; preds = %entry, %bb1
87   %.0.in = phi double [ %4, %bb1 ], [ %2, %entry ] ; <double> [#uses=1]
88   %.0 = fptrunc double %.0.in to float            ; <float> [#uses=1]
89   ret float %.0
92 declare i32 @llvm.x86.sse41.ptestz(<4 x float> %p1, <4 x float> %p2) nounwind
93 declare i32 @llvm.x86.sse41.ptestc(<4 x float> %p1, <4 x float> %p2) nounwind
95 define <4 x float> @test5(<4 x float> %a, <4 x float> %b) nounwind {
96 ; CHECK-LABEL: test5:
97 ; CHECK:       ## %bb.0: ## %entry
98 ; CHECK-NEXT:    ptest %xmm0, %xmm0
99 ; CHECK-NEXT:    jne LBB2_2
100 ; CHECK-NEXT:  ## %bb.1: ## %bb1
101 ; CHECK-NEXT:    addps LCPI2_0, %xmm1
102 ; CHECK-NEXT:    movaps %xmm1, %xmm0
103 ; CHECK-NEXT:    retl
104 ; CHECK-NEXT:  LBB2_2: ## %bb2
105 ; CHECK-NEXT:    divps LCPI2_0, %xmm1
106 ; CHECK-NEXT:    movaps %xmm1, %xmm0
107 ; CHECK-NEXT:    retl
108 entry:
110   %res = call i32 @llvm.x86.sse41.ptestz(<4 x float> %a, <4 x float> %a) nounwind
111   %one = icmp ne i32 %res, 0
112   br i1 %one, label %bb1, label %bb2
114 bb1:
115   %c = fadd <4 x float> %b, < float 1.000000e+002, float 2.000000e+002, float 3.000000e+002, float 4.000000e+002 >
116   br label %return
118 bb2:
119         %d = fdiv <4 x float> %b, < float 1.000000e+002, float 2.000000e+002, float 3.000000e+002, float 4.000000e+002 >
120         br label %return
122 return:
123   %e = phi <4 x float> [%c, %bb1], [%d, %bb2]
124   ret <4 x float> %e
127 define <4 x float> @test7(<4 x float> %a, <4 x float> %b) nounwind {
128 ; CHECK-LABEL: test7:
129 ; CHECK:       ## %bb.0: ## %entry
130 ; CHECK-NEXT:    ptest %xmm0, %xmm0
131 ; CHECK-NEXT:    jne LBB3_2
132 ; CHECK-NEXT:  ## %bb.1: ## %bb1
133 ; CHECK-NEXT:    addps LCPI3_0, %xmm1
134 ; CHECK-NEXT:    movaps %xmm1, %xmm0
135 ; CHECK-NEXT:    retl
136 ; CHECK-NEXT:  LBB3_2: ## %bb2
137 ; CHECK-NEXT:    divps LCPI3_0, %xmm1
138 ; CHECK-NEXT:    movaps %xmm1, %xmm0
139 ; CHECK-NEXT:    retl
140 entry:
142   %res = call i32 @llvm.x86.sse41.ptestz(<4 x float> %a, <4 x float> %a) nounwind
143   %one = trunc i32 %res to i1
144   br i1 %one, label %bb1, label %bb2
146 bb1:
147   %c = fadd <4 x float> %b, < float 1.000000e+002, float 2.000000e+002, float 3.000000e+002, float 4.000000e+002 >
148   br label %return
150 bb2:
151         %d = fdiv <4 x float> %b, < float 1.000000e+002, float 2.000000e+002, float 3.000000e+002, float 4.000000e+002 >
152         br label %return
154 return:
155   %e = phi <4 x float> [%c, %bb1], [%d, %bb2]
156   ret <4 x float> %e
159 define <4 x float> @test8(<4 x float> %a, <4 x float> %b) nounwind {
160 ; CHECK-LABEL: test8:
161 ; CHECK:       ## %bb.0: ## %entry
162 ; CHECK-NEXT:    ptest %xmm0, %xmm0
163 ; CHECK-NEXT:    jae LBB4_2
164 ; CHECK-NEXT:  ## %bb.1: ## %bb1
165 ; CHECK-NEXT:    addps LCPI4_0, %xmm1
166 ; CHECK-NEXT:    movaps %xmm1, %xmm0
167 ; CHECK-NEXT:    retl
168 ; CHECK-NEXT:  LBB4_2: ## %bb2
169 ; CHECK-NEXT:    divps LCPI4_0, %xmm1
170 ; CHECK-NEXT:    movaps %xmm1, %xmm0
171 ; CHECK-NEXT:    retl
172 entry:
174   %res = call i32 @llvm.x86.sse41.ptestc(<4 x float> %a, <4 x float> %a) nounwind
175   %one = icmp ne i32 %res, 0
176   br i1 %one, label %bb1, label %bb2
178 bb1:
179   %c = fadd <4 x float> %b, < float 1.000000e+002, float 2.000000e+002, float 3.000000e+002, float 4.000000e+002 >
180   br label %return
182 bb2:
183         %d = fdiv <4 x float> %b, < float 1.000000e+002, float 2.000000e+002, float 3.000000e+002, float 4.000000e+002 >
184         br label %return
186 return:
187   %e = phi <4 x float> [%c, %bb1], [%d, %bb2]
188   ret <4 x float> %e
191 define <4 x float> @test10(<4 x float> %a, <4 x float> %b) nounwind {
192 ; CHECK-LABEL: test10:
193 ; CHECK:       ## %bb.0: ## %entry
194 ; CHECK-NEXT:    ptest %xmm0, %xmm0
195 ; CHECK-NEXT:    jae LBB5_2
196 ; CHECK-NEXT:  ## %bb.1: ## %bb1
197 ; CHECK-NEXT:    addps LCPI5_0, %xmm1
198 ; CHECK-NEXT:    movaps %xmm1, %xmm0
199 ; CHECK-NEXT:    retl
200 ; CHECK-NEXT:  LBB5_2: ## %bb2
201 ; CHECK-NEXT:    divps LCPI5_0, %xmm1
202 ; CHECK-NEXT:    movaps %xmm1, %xmm0
203 ; CHECK-NEXT:    retl
204 entry:
206   %res = call i32 @llvm.x86.sse41.ptestc(<4 x float> %a, <4 x float> %a) nounwind
207   %one = trunc i32 %res to i1
208   br i1 %one, label %bb1, label %bb2
210 bb1:
211   %c = fadd <4 x float> %b, < float 1.000000e+002, float 2.000000e+002, float 3.000000e+002, float 4.000000e+002 >
212   br label %return
214 bb2:
215         %d = fdiv <4 x float> %b, < float 1.000000e+002, float 2.000000e+002, float 3.000000e+002, float 4.000000e+002 >
216         br label %return
218 return:
219   %e = phi <4 x float> [%c, %bb1], [%d, %bb2]
220   ret <4 x float> %e
223 define <4 x float> @test11(<4 x float> %a, <4 x float> %b) nounwind {
224 ; CHECK-LABEL: test11:
225 ; CHECK:       ## %bb.0: ## %entry
226 ; CHECK-NEXT:    ptest %xmm0, %xmm0
227 ; CHECK-NEXT:    jne LBB6_2
228 ; CHECK-NEXT:  ## %bb.1: ## %bb1
229 ; CHECK-NEXT:    addps LCPI6_0, %xmm1
230 ; CHECK-NEXT:    movaps %xmm1, %xmm0
231 ; CHECK-NEXT:    retl
232 ; CHECK-NEXT:  LBB6_2: ## %bb2
233 ; CHECK-NEXT:    divps LCPI6_0, %xmm1
234 ; CHECK-NEXT:    movaps %xmm1, %xmm0
235 ; CHECK-NEXT:    retl
236 entry:
238   %res = call i32 @llvm.x86.sse41.ptestz(<4 x float> %a, <4 x float> %a) nounwind
239   %one = icmp eq i32 %res, 1
240   br i1 %one, label %bb1, label %bb2
242 bb1:
243   %c = fadd <4 x float> %b, < float 1.000000e+002, float 2.000000e+002, float 3.000000e+002, float 4.000000e+002 >
244   br label %return
246 bb2:
247         %d = fdiv <4 x float> %b, < float 1.000000e+002, float 2.000000e+002, float 3.000000e+002, float 4.000000e+002 >
248         br label %return
250 return:
251   %e = phi <4 x float> [%c, %bb1], [%d, %bb2]
252   ret <4 x float> %e
255 define <4 x float> @test12(<4 x float> %a, <4 x float> %b) nounwind {
256 ; CHECK-LABEL: test12:
257 ; CHECK:       ## %bb.0: ## %entry
258 ; CHECK-NEXT:    ptest %xmm0, %xmm0
259 ; CHECK-NEXT:    je LBB7_2
260 ; CHECK-NEXT:  ## %bb.1: ## %bb1
261 ; CHECK-NEXT:    addps LCPI7_0, %xmm1
262 ; CHECK-NEXT:    movaps %xmm1, %xmm0
263 ; CHECK-NEXT:    retl
264 ; CHECK-NEXT:  LBB7_2: ## %bb2
265 ; CHECK-NEXT:    divps LCPI7_0, %xmm1
266 ; CHECK-NEXT:    movaps %xmm1, %xmm0
267 ; CHECK-NEXT:    retl
268 entry:
270   %res = call i32 @llvm.x86.sse41.ptestz(<4 x float> %a, <4 x float> %a) nounwind
271   %one = icmp ne i32 %res, 1
272   br i1 %one, label %bb1, label %bb2
274 bb1:
275   %c = fadd <4 x float> %b, < float 1.000000e+002, float 2.000000e+002, float 3.000000e+002, float 4.000000e+002 >
276   br label %return
278 bb2:
279         %d = fdiv <4 x float> %b, < float 1.000000e+002, float 2.000000e+002, float 3.000000e+002, float 4.000000e+002 >
280         br label %return
282 return:
283   %e = phi <4 x float> [%c, %bb1], [%d, %bb2]
284   ret <4 x float> %e