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:    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
17entry:
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
24
25bb:                                               ; preds = %entry
26  %5 = tail call i32 (...) @foo() nounwind       ; <i32> [#uses=1]
27  ret i32 %5
28
29bb1:                                              ; preds = %entry
30  %6 = tail call i32 (...) @bar() nounwind       ; <i32> [#uses=1]
31  ret i32 %6
32}
33
34declare i32 @foo(...)
35
36declare i32 @bar(...)
37
38
39; <rdar://problem/7598384>:
40;
41;    jCC  L1
42;    jmp  L2
43; L1:
44;   ...
45; L2:
46;   ...
47;
48; to:
49;
50;    jnCC L2
51; L1:
52;   ...
53; L2:
54;   ...
55define 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
74entry:
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
80
81
82bb1:                                              ; preds = %entry
83  %4 = fadd double %2, -1.000000e+00              ; <double> [#uses=1]
84  br label %bb2
85
86bb2:                                              ; 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
90}
91
92declare i32 @llvm.x86.sse41.ptestz(<4 x float> %p1, <4 x float> %p2) nounwind
93declare i32 @llvm.x86.sse41.ptestc(<4 x float> %p1, <4 x float> %p2) nounwind
94
95define <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
108entry:
109
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
113
114bb1:
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
117
118bb2:
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
121
122return:
123  %e = phi <4 x float> [%c, %bb1], [%d, %bb2]
124  ret <4 x float> %e
125}
126
127define <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
140entry:
141
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
145
146bb1:
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
149
150bb2:
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
153
154return:
155  %e = phi <4 x float> [%c, %bb1], [%d, %bb2]
156  ret <4 x float> %e
157}
158
159define <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
172entry:
173
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
177
178bb1:
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
181
182bb2:
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
185
186return:
187  %e = phi <4 x float> [%c, %bb1], [%d, %bb2]
188  ret <4 x float> %e
189}
190
191define <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
204entry:
205
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
209
210bb1:
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
213
214bb2:
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
217
218return:
219  %e = phi <4 x float> [%c, %bb1], [%d, %bb2]
220  ret <4 x float> %e
221}
222
223define <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
236entry:
237
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
241
242bb1:
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
245
246bb2:
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
249
250return:
251  %e = phi <4 x float> [%c, %bb1], [%d, %bb2]
252  ret <4 x float> %e
253}
254
255define <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
268entry:
269
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
273
274bb1:
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
277
278bb2:
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
281
282return:
283  %e = phi <4 x float> [%c, %bb1], [%d, %bb2]
284  ret <4 x float> %e
285}
286
287