xref: /llvm-project/llvm/test/CodeGen/X86/brcond.ll (revision ee5585ed09aff2e54cb540fad4c33f0c93626b1b)
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
3
4; rdar://7475489
5
6define i32 @test1(i32 %a, i32 %b) nounwind ssp {
7; CHECK-LABEL: test1:
8; CHECK:       ## %bb.0: ## %entry
9; CHECK-NEXT:    movzbl {{[0-9]+}}(%esp), %eax
10; CHECK-NEXT:    xorb {{[0-9]+}}(%esp), %al
11; CHECK-NEXT:    testb $64, %al
12; CHECK-NEXT:    jne _bar ## TAILCALL
13; CHECK-NEXT:  ## %bb.1: ## %bb
14; CHECK-NEXT:    jmp _foo ## TAILCALL
15entry:
16  %0 = and i32 %a, 16384
17  %1 = icmp ne i32 %0, 0
18  %2 = and i32 %b, 16384
19  %3 = icmp ne i32 %2, 0
20  %4 = xor i1 %1, %3
21  br i1 %4, label %bb1, label %bb
22
23bb:                                               ; preds = %entry
24  %5 = tail call i32 (...) @foo() nounwind       ; <i32> [#uses=1]
25  ret i32 %5
26
27bb1:                                              ; preds = %entry
28  %6 = tail call i32 (...) @bar() nounwind       ; <i32> [#uses=1]
29  ret i32 %6
30}
31
32declare i32 @foo(...)
33
34declare i32 @bar(...)
35
36
37; <rdar://problem/7598384>:
38;
39;    jCC  L1
40;    jmp  L2
41; L1:
42;   ...
43; L2:
44;   ...
45;
46; to:
47;
48;    jnCC L2
49; L1:
50;   ...
51; L2:
52;   ...
53define float @test4(float %x, float %y) nounwind readnone optsize ssp {
54; CHECK-LABEL: test4:
55; CHECK:       ## %bb.0: ## %entry
56; CHECK-NEXT:    pushl %eax
57; CHECK-NEXT:    cvtss2sd {{[0-9]+}}(%esp), %xmm1
58; CHECK-NEXT:    cvtss2sd {{[0-9]+}}(%esp), %xmm0
59; CHECK-NEXT:    mulsd %xmm1, %xmm0
60; CHECK-NEXT:    xorpd %xmm1, %xmm1
61; CHECK-NEXT:    ucomisd %xmm1, %xmm0
62; CHECK-NEXT:    jne LBB1_1
63; CHECK-NEXT:    jnp LBB1_2
64; CHECK-NEXT:  LBB1_1: ## %bb1
65; CHECK-NEXT:    addsd {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
66; CHECK-NEXT:  LBB1_2: ## %bb2
67; CHECK-NEXT:    cvtsd2ss %xmm0, %xmm0
68; CHECK-NEXT:    movss %xmm0, (%esp)
69; CHECK-NEXT:    flds (%esp)
70; CHECK-NEXT:    popl %eax
71; CHECK-NEXT:    retl
72entry:
73  %0 = fpext float %x to double                   ; <double> [#uses=1]
74  %1 = fpext float %y to double                   ; <double> [#uses=1]
75  %2 = fmul double %0, %1                         ; <double> [#uses=3]
76  %3 = fcmp oeq double %2, 0.000000e+00           ; <i1> [#uses=1]
77  br i1 %3, label %bb2, label %bb1
78
79
80bb1:                                              ; preds = %entry
81  %4 = fadd double %2, -1.000000e+00              ; <double> [#uses=1]
82  br label %bb2
83
84bb2:                                              ; preds = %entry, %bb1
85  %.0.in = phi double [ %4, %bb1 ], [ %2, %entry ] ; <double> [#uses=1]
86  %.0 = fptrunc double %.0.in to float            ; <float> [#uses=1]
87  ret float %.0
88}
89
90declare i32 @llvm.x86.sse41.ptestz(<4 x float> %p1, <4 x float> %p2) nounwind
91declare i32 @llvm.x86.sse41.ptestc(<4 x float> %p1, <4 x float> %p2) nounwind
92
93define <4 x float> @test5(<4 x float> %a, <4 x float> %b) nounwind {
94; CHECK-LABEL: test5:
95; CHECK:       ## %bb.0: ## %entry
96; CHECK-NEXT:    ptest %xmm0, %xmm0
97; CHECK-NEXT:    jne LBB2_2
98; CHECK-NEXT:  ## %bb.1: ## %bb1
99; CHECK-NEXT:    addps {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1
100; CHECK-NEXT:    movaps %xmm1, %xmm0
101; CHECK-NEXT:    retl
102; CHECK-NEXT:  LBB2_2: ## %bb2
103; CHECK-NEXT:    divps {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1
104; CHECK-NEXT:    movaps %xmm1, %xmm0
105; CHECK-NEXT:    retl
106entry:
107
108  %res = call i32 @llvm.x86.sse41.ptestz(<4 x float> %a, <4 x float> %a) nounwind
109  %one = icmp ne i32 %res, 0
110  br i1 %one, label %bb1, label %bb2
111
112bb1:
113  %c = fadd <4 x float> %b, < float 1.000000e+002, float 2.000000e+002, float 3.000000e+002, float 4.000000e+002 >
114  br label %return
115
116bb2:
117	%d = fdiv <4 x float> %b, < float 1.000000e+002, float 2.000000e+002, float 3.000000e+002, float 4.000000e+002 >
118	br label %return
119
120return:
121  %e = phi <4 x float> [%c, %bb1], [%d, %bb2]
122  ret <4 x float> %e
123}
124
125define <4 x float> @test7(<4 x float> %a, <4 x float> %b) nounwind {
126; CHECK-LABEL: test7:
127; CHECK:       ## %bb.0: ## %entry
128; CHECK-NEXT:    ptest %xmm0, %xmm0
129; CHECK-NEXT:    jne LBB3_2
130; CHECK-NEXT:  ## %bb.1: ## %bb1
131; CHECK-NEXT:    addps {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1
132; CHECK-NEXT:    movaps %xmm1, %xmm0
133; CHECK-NEXT:    retl
134; CHECK-NEXT:  LBB3_2: ## %bb2
135; CHECK-NEXT:    divps {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1
136; CHECK-NEXT:    movaps %xmm1, %xmm0
137; CHECK-NEXT:    retl
138entry:
139
140  %res = call i32 @llvm.x86.sse41.ptestz(<4 x float> %a, <4 x float> %a) nounwind
141  %one = trunc i32 %res to i1
142  br i1 %one, label %bb1, label %bb2
143
144bb1:
145  %c = fadd <4 x float> %b, < float 1.000000e+002, float 2.000000e+002, float 3.000000e+002, float 4.000000e+002 >
146  br label %return
147
148bb2:
149	%d = fdiv <4 x float> %b, < float 1.000000e+002, float 2.000000e+002, float 3.000000e+002, float 4.000000e+002 >
150	br label %return
151
152return:
153  %e = phi <4 x float> [%c, %bb1], [%d, %bb2]
154  ret <4 x float> %e
155}
156
157define <4 x float> @test8(<4 x float> %a, <4 x float> %b) nounwind {
158; CHECK-LABEL: test8:
159; CHECK:       ## %bb.0: ## %entry
160; CHECK-NEXT:    ptest %xmm0, %xmm0
161; CHECK-NEXT:    jae LBB4_2
162; CHECK-NEXT:  ## %bb.1: ## %bb1
163; CHECK-NEXT:    addps {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1
164; CHECK-NEXT:    movaps %xmm1, %xmm0
165; CHECK-NEXT:    retl
166; CHECK-NEXT:  LBB4_2: ## %bb2
167; CHECK-NEXT:    divps {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1
168; CHECK-NEXT:    movaps %xmm1, %xmm0
169; CHECK-NEXT:    retl
170entry:
171
172  %res = call i32 @llvm.x86.sse41.ptestc(<4 x float> %a, <4 x float> %a) nounwind
173  %one = icmp ne i32 %res, 0
174  br i1 %one, label %bb1, label %bb2
175
176bb1:
177  %c = fadd <4 x float> %b, < float 1.000000e+002, float 2.000000e+002, float 3.000000e+002, float 4.000000e+002 >
178  br label %return
179
180bb2:
181	%d = fdiv <4 x float> %b, < float 1.000000e+002, float 2.000000e+002, float 3.000000e+002, float 4.000000e+002 >
182	br label %return
183
184return:
185  %e = phi <4 x float> [%c, %bb1], [%d, %bb2]
186  ret <4 x float> %e
187}
188
189define <4 x float> @test10(<4 x float> %a, <4 x float> %b) nounwind {
190; CHECK-LABEL: test10:
191; CHECK:       ## %bb.0: ## %entry
192; CHECK-NEXT:    ptest %xmm0, %xmm0
193; CHECK-NEXT:    jae LBB5_2
194; CHECK-NEXT:  ## %bb.1: ## %bb1
195; CHECK-NEXT:    addps {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1
196; CHECK-NEXT:    movaps %xmm1, %xmm0
197; CHECK-NEXT:    retl
198; CHECK-NEXT:  LBB5_2: ## %bb2
199; CHECK-NEXT:    divps {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1
200; CHECK-NEXT:    movaps %xmm1, %xmm0
201; CHECK-NEXT:    retl
202entry:
203
204  %res = call i32 @llvm.x86.sse41.ptestc(<4 x float> %a, <4 x float> %a) nounwind
205  %one = trunc i32 %res to i1
206  br i1 %one, label %bb1, label %bb2
207
208bb1:
209  %c = fadd <4 x float> %b, < float 1.000000e+002, float 2.000000e+002, float 3.000000e+002, float 4.000000e+002 >
210  br label %return
211
212bb2:
213	%d = fdiv <4 x float> %b, < float 1.000000e+002, float 2.000000e+002, float 3.000000e+002, float 4.000000e+002 >
214	br label %return
215
216return:
217  %e = phi <4 x float> [%c, %bb1], [%d, %bb2]
218  ret <4 x float> %e
219}
220
221define <4 x float> @test11(<4 x float> %a, <4 x float> %b) nounwind {
222; CHECK-LABEL: test11:
223; CHECK:       ## %bb.0: ## %entry
224; CHECK-NEXT:    ptest %xmm0, %xmm0
225; CHECK-NEXT:    jne LBB6_2
226; CHECK-NEXT:  ## %bb.1: ## %bb1
227; CHECK-NEXT:    addps {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1
228; CHECK-NEXT:    movaps %xmm1, %xmm0
229; CHECK-NEXT:    retl
230; CHECK-NEXT:  LBB6_2: ## %bb2
231; CHECK-NEXT:    divps {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1
232; CHECK-NEXT:    movaps %xmm1, %xmm0
233; CHECK-NEXT:    retl
234entry:
235
236  %res = call i32 @llvm.x86.sse41.ptestz(<4 x float> %a, <4 x float> %a) nounwind
237  %one = icmp eq i32 %res, 1
238  br i1 %one, label %bb1, label %bb2
239
240bb1:
241  %c = fadd <4 x float> %b, < float 1.000000e+002, float 2.000000e+002, float 3.000000e+002, float 4.000000e+002 >
242  br label %return
243
244bb2:
245	%d = fdiv <4 x float> %b, < float 1.000000e+002, float 2.000000e+002, float 3.000000e+002, float 4.000000e+002 >
246	br label %return
247
248return:
249  %e = phi <4 x float> [%c, %bb1], [%d, %bb2]
250  ret <4 x float> %e
251}
252
253define <4 x float> @test12(<4 x float> %a, <4 x float> %b) nounwind {
254; CHECK-LABEL: test12:
255; CHECK:       ## %bb.0: ## %entry
256; CHECK-NEXT:    ptest %xmm0, %xmm0
257; CHECK-NEXT:    je LBB7_2
258; CHECK-NEXT:  ## %bb.1: ## %bb1
259; CHECK-NEXT:    addps {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1
260; CHECK-NEXT:    movaps %xmm1, %xmm0
261; CHECK-NEXT:    retl
262; CHECK-NEXT:  LBB7_2: ## %bb2
263; CHECK-NEXT:    divps {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1
264; CHECK-NEXT:    movaps %xmm1, %xmm0
265; CHECK-NEXT:    retl
266entry:
267
268  %res = call i32 @llvm.x86.sse41.ptestz(<4 x float> %a, <4 x float> %a) nounwind
269  %one = icmp ne i32 %res, 1
270  br i1 %one, label %bb1, label %bb2
271
272bb1:
273  %c = fadd <4 x float> %b, < float 1.000000e+002, float 2.000000e+002, float 3.000000e+002, float 4.000000e+002 >
274  br label %return
275
276bb2:
277	%d = fdiv <4 x float> %b, < float 1.000000e+002, float 2.000000e+002, float 3.000000e+002, float 4.000000e+002 >
278	br label %return
279
280return:
281  %e = phi <4 x float> [%c, %bb1], [%d, %bb2]
282  ret <4 x float> %e
283}
284
285