xref: /aosp_15_r20/external/llvm/test/CodeGen/X86/select.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=x86_64-apple-darwin10 -mcpu=generic | FileCheck %s
2*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=x86_64-apple-darwin10 -mcpu=atom | FileCheck -check-prefix=ATOM %s
3*9880d681SAndroid Build Coastguard Worker; PR5757
4*9880d681SAndroid Build Coastguard Worker
5*9880d681SAndroid Build Coastguard Worker%0 = type { i64, i32 }
6*9880d681SAndroid Build Coastguard Worker
7*9880d681SAndroid Build Coastguard Workerdefine i32 @test1(%0* %p, %0* %q, i1 %r) nounwind {
8*9880d681SAndroid Build Coastguard Worker  %t0 = load %0, %0* %p
9*9880d681SAndroid Build Coastguard Worker  %t1 = load %0, %0* %q
10*9880d681SAndroid Build Coastguard Worker  %t4 = select i1 %r, %0 %t0, %0 %t1
11*9880d681SAndroid Build Coastguard Worker  %t5 = extractvalue %0 %t4, 1
12*9880d681SAndroid Build Coastguard Worker  ret i32 %t5
13*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test1:
14*9880d681SAndroid Build Coastguard Worker; CHECK: cmovneq %rdi, %rsi
15*9880d681SAndroid Build Coastguard Worker; CHECK: movl (%rsi), %eax
16*9880d681SAndroid Build Coastguard Worker
17*9880d681SAndroid Build Coastguard Worker; ATOM-LABEL: test1:
18*9880d681SAndroid Build Coastguard Worker; ATOM: cmovneq %rdi, %rsi
19*9880d681SAndroid Build Coastguard Worker; ATOM: movl (%rsi), %eax
20*9880d681SAndroid Build Coastguard Worker}
21*9880d681SAndroid Build Coastguard Worker
22*9880d681SAndroid Build Coastguard Worker
23*9880d681SAndroid Build Coastguard Worker; PR2139
24*9880d681SAndroid Build Coastguard Workerdefine i32 @test2() nounwind {
25*9880d681SAndroid Build Coastguard Workerentry:
26*9880d681SAndroid Build Coastguard Worker	%tmp73 = tail call i1 @return_false()		; <i8> [#uses=1]
27*9880d681SAndroid Build Coastguard Worker	%g.0 = select i1 %tmp73, i16 0, i16 -480		; <i16> [#uses=2]
28*9880d681SAndroid Build Coastguard Worker	%tmp7778 = sext i16 %g.0 to i32		; <i32> [#uses=1]
29*9880d681SAndroid Build Coastguard Worker	%tmp80 = shl i32 %tmp7778, 3		; <i32> [#uses=2]
30*9880d681SAndroid Build Coastguard Worker	%tmp87 = icmp sgt i32 %tmp80, 32767		; <i1> [#uses=1]
31*9880d681SAndroid Build Coastguard Worker	br i1 %tmp87, label %bb90, label %bb91
32*9880d681SAndroid Build Coastguard Workerbb90:		; preds = %bb84, %bb72
33*9880d681SAndroid Build Coastguard Worker	unreachable
34*9880d681SAndroid Build Coastguard Workerbb91:		; preds = %bb84
35*9880d681SAndroid Build Coastguard Worker	ret i32 0
36*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test2:
37*9880d681SAndroid Build Coastguard Worker; CHECK: cmovnew
38*9880d681SAndroid Build Coastguard Worker; CHECK: cwtl
39*9880d681SAndroid Build Coastguard Worker
40*9880d681SAndroid Build Coastguard Worker; ATOM-LABEL: test2:
41*9880d681SAndroid Build Coastguard Worker; ATOM: cmovnew
42*9880d681SAndroid Build Coastguard Worker; ATOM: cwtl
43*9880d681SAndroid Build Coastguard Worker}
44*9880d681SAndroid Build Coastguard Worker
45*9880d681SAndroid Build Coastguard Workerdeclare i1 @return_false()
46*9880d681SAndroid Build Coastguard Worker
47*9880d681SAndroid Build Coastguard Worker
48*9880d681SAndroid Build Coastguard Worker;; Select between two floating point constants.
49*9880d681SAndroid Build Coastguard Workerdefine float @test3(i32 %x) nounwind readnone {
50*9880d681SAndroid Build Coastguard Workerentry:
51*9880d681SAndroid Build Coastguard Worker	%0 = icmp eq i32 %x, 0		; <i1> [#uses=1]
52*9880d681SAndroid Build Coastguard Worker	%iftmp.0.0 = select i1 %0, float 4.200000e+01, float 2.300000e+01		; <float> [#uses=1]
53*9880d681SAndroid Build Coastguard Worker	ret float %iftmp.0.0
54*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test3:
55*9880d681SAndroid Build Coastguard Worker; CHECK: movss	{{.*}},4), %xmm0
56*9880d681SAndroid Build Coastguard Worker
57*9880d681SAndroid Build Coastguard Worker; ATOM-LABEL: test3:
58*9880d681SAndroid Build Coastguard Worker; ATOM: movss  {{.*}},4), %xmm0
59*9880d681SAndroid Build Coastguard Worker}
60*9880d681SAndroid Build Coastguard Worker
61*9880d681SAndroid Build Coastguard Workerdefine signext i8 @test4(i8* nocapture %P, double %F) nounwind readonly {
62*9880d681SAndroid Build Coastguard Workerentry:
63*9880d681SAndroid Build Coastguard Worker	%0 = fcmp olt double %F, 4.200000e+01		; <i1> [#uses=1]
64*9880d681SAndroid Build Coastguard Worker	%iftmp.0.0 = select i1 %0, i32 4, i32 0		; <i32> [#uses=1]
65*9880d681SAndroid Build Coastguard Worker	%1 = getelementptr i8, i8* %P, i32 %iftmp.0.0		; <i8*> [#uses=1]
66*9880d681SAndroid Build Coastguard Worker	%2 = load i8, i8* %1, align 1		; <i8> [#uses=1]
67*9880d681SAndroid Build Coastguard Worker	ret i8 %2
68*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test4:
69*9880d681SAndroid Build Coastguard Worker; CHECK: movsbl	({{.*}},4), %eax
70*9880d681SAndroid Build Coastguard Worker
71*9880d681SAndroid Build Coastguard Worker; ATOM-LABEL: test4:
72*9880d681SAndroid Build Coastguard Worker; ATOM: movsbl ({{.*}},4), %eax
73*9880d681SAndroid Build Coastguard Worker}
74*9880d681SAndroid Build Coastguard Worker
75*9880d681SAndroid Build Coastguard Workerdefine void @test5(i1 %c, <2 x i16> %a, <2 x i16> %b, <2 x i16>* %p) nounwind {
76*9880d681SAndroid Build Coastguard Worker  %x = select i1 %c, <2 x i16> %a, <2 x i16> %b
77*9880d681SAndroid Build Coastguard Worker  store <2 x i16> %x, <2 x i16>* %p
78*9880d681SAndroid Build Coastguard Worker  ret void
79*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test5:
80*9880d681SAndroid Build Coastguard Worker
81*9880d681SAndroid Build Coastguard Worker; ATOM-LABEL: test5:
82*9880d681SAndroid Build Coastguard Worker}
83*9880d681SAndroid Build Coastguard Worker
84*9880d681SAndroid Build Coastguard Workerdefine void @test6(i32 %C, <4 x float>* %A, <4 x float>* %B) nounwind {
85*9880d681SAndroid Build Coastguard Worker        %tmp = load <4 x float>, <4 x float>* %A             ; <<4 x float>> [#uses=1]
86*9880d681SAndroid Build Coastguard Worker        %tmp3 = load <4 x float>, <4 x float>* %B            ; <<4 x float>> [#uses=2]
87*9880d681SAndroid Build Coastguard Worker        %tmp9 = fmul <4 x float> %tmp3, %tmp3            ; <<4 x float>> [#uses=1]
88*9880d681SAndroid Build Coastguard Worker        %tmp.upgrd.1 = icmp eq i32 %C, 0                ; <i1> [#uses=1]
89*9880d681SAndroid Build Coastguard Worker        %iftmp.38.0 = select i1 %tmp.upgrd.1, <4 x float> %tmp9, <4 x float> %tmp               ; <<4 x float>> [#uses=1]
90*9880d681SAndroid Build Coastguard Worker        store <4 x float> %iftmp.38.0, <4 x float>* %A
91*9880d681SAndroid Build Coastguard Worker        ret void
92*9880d681SAndroid Build Coastguard Worker; Verify that the fmul gets sunk into the one part of the diamond where it is
93*9880d681SAndroid Build Coastguard Worker; needed.
94*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test6:
95*9880d681SAndroid Build Coastguard Worker; CHECK: je
96*9880d681SAndroid Build Coastguard Worker; CHECK: ret
97*9880d681SAndroid Build Coastguard Worker; CHECK: mulps
98*9880d681SAndroid Build Coastguard Worker; CHECK: ret
99*9880d681SAndroid Build Coastguard Worker
100*9880d681SAndroid Build Coastguard Worker; ATOM-LABEL: test6:
101*9880d681SAndroid Build Coastguard Worker; ATOM: je
102*9880d681SAndroid Build Coastguard Worker; ATOM: ret
103*9880d681SAndroid Build Coastguard Worker; ATOM: mulps
104*9880d681SAndroid Build Coastguard Worker; ATOM: ret
105*9880d681SAndroid Build Coastguard Worker}
106*9880d681SAndroid Build Coastguard Worker
107*9880d681SAndroid Build Coastguard Worker; Select with fp80's
108*9880d681SAndroid Build Coastguard Workerdefine x86_fp80 @test7(i32 %tmp8) nounwind {
109*9880d681SAndroid Build Coastguard Worker        %tmp9 = icmp sgt i32 %tmp8, -1          ; <i1> [#uses=1]
110*9880d681SAndroid Build Coastguard Worker        %retval = select i1 %tmp9, x86_fp80 0xK4005B400000000000000, x86_fp80 0xK40078700000000000000
111*9880d681SAndroid Build Coastguard Worker        ret x86_fp80 %retval
112*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test7:
113*9880d681SAndroid Build Coastguard Worker; CHECK: leaq
114*9880d681SAndroid Build Coastguard Worker; CHECK: fldt (%r{{.}}x,%r{{.}}x)
115*9880d681SAndroid Build Coastguard Worker
116*9880d681SAndroid Build Coastguard Worker; ATOM-LABEL: test7:
117*9880d681SAndroid Build Coastguard Worker; ATOM: leaq
118*9880d681SAndroid Build Coastguard Worker; ATOM: fldt (%r{{.}}x,%r{{.}}x)
119*9880d681SAndroid Build Coastguard Worker}
120*9880d681SAndroid Build Coastguard Worker
121*9880d681SAndroid Build Coastguard Worker; widening select v6i32 and then a sub
122*9880d681SAndroid Build Coastguard Workerdefine void @test8(i1 %c, <6 x i32>* %dst.addr, <6 x i32> %src1,<6 x i32> %src2) nounwind {
123*9880d681SAndroid Build Coastguard Worker	%x = select i1 %c, <6 x i32> %src1, <6 x i32> %src2
124*9880d681SAndroid Build Coastguard Worker	%val = sub <6 x i32> %x, < i32 1, i32 1, i32 1, i32 1, i32 1, i32 1 >
125*9880d681SAndroid Build Coastguard Worker	store <6 x i32> %val, <6 x i32>* %dst.addr
126*9880d681SAndroid Build Coastguard Worker	ret void
127*9880d681SAndroid Build Coastguard Worker
128*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test8:
129*9880d681SAndroid Build Coastguard Worker
130*9880d681SAndroid Build Coastguard Worker; ATOM-LABEL: test8:
131*9880d681SAndroid Build Coastguard Worker}
132*9880d681SAndroid Build Coastguard Worker
133*9880d681SAndroid Build Coastguard Worker
134*9880d681SAndroid Build Coastguard Worker;; Test integer select between values and constants.
135*9880d681SAndroid Build Coastguard Worker
136*9880d681SAndroid Build Coastguard Workerdefine i64 @test9(i64 %x, i64 %y) nounwind readnone ssp noredzone {
137*9880d681SAndroid Build Coastguard Worker  %cmp = icmp ne i64 %x, 0
138*9880d681SAndroid Build Coastguard Worker  %cond = select i1 %cmp, i64 %y, i64 -1
139*9880d681SAndroid Build Coastguard Worker  ret i64 %cond
140*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test9:
141*9880d681SAndroid Build Coastguard Worker; CHECK: cmpq	$1, %rdi
142*9880d681SAndroid Build Coastguard Worker; CHECK: sbbq	%rax, %rax
143*9880d681SAndroid Build Coastguard Worker; CHECK: orq	%rsi, %rax
144*9880d681SAndroid Build Coastguard Worker; CHECK: ret
145*9880d681SAndroid Build Coastguard Worker
146*9880d681SAndroid Build Coastguard Worker; ATOM-LABEL: test9:
147*9880d681SAndroid Build Coastguard Worker; ATOM: cmpq   $1, %rdi
148*9880d681SAndroid Build Coastguard Worker; ATOM: sbbq   %rax, %rax
149*9880d681SAndroid Build Coastguard Worker; ATOM: orq    %rsi, %rax
150*9880d681SAndroid Build Coastguard Worker; ATOM: ret
151*9880d681SAndroid Build Coastguard Worker}
152*9880d681SAndroid Build Coastguard Worker
153*9880d681SAndroid Build Coastguard Worker;; Same as test9
154*9880d681SAndroid Build Coastguard Workerdefine i64 @test9a(i64 %x, i64 %y) nounwind readnone ssp noredzone {
155*9880d681SAndroid Build Coastguard Worker  %cmp = icmp eq i64 %x, 0
156*9880d681SAndroid Build Coastguard Worker  %cond = select i1 %cmp, i64 -1, i64 %y
157*9880d681SAndroid Build Coastguard Worker  ret i64 %cond
158*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test9a:
159*9880d681SAndroid Build Coastguard Worker; CHECK: cmpq	$1, %rdi
160*9880d681SAndroid Build Coastguard Worker; CHECK: sbbq	%rax, %rax
161*9880d681SAndroid Build Coastguard Worker; CHECK: orq	%rsi, %rax
162*9880d681SAndroid Build Coastguard Worker; CHECK: ret
163*9880d681SAndroid Build Coastguard Worker
164*9880d681SAndroid Build Coastguard Worker; ATOM-LABEL: test9a:
165*9880d681SAndroid Build Coastguard Worker; ATOM: cmpq   $1, %rdi
166*9880d681SAndroid Build Coastguard Worker; ATOM: sbbq   %rax, %rax
167*9880d681SAndroid Build Coastguard Worker; ATOM: orq    %rsi, %rax
168*9880d681SAndroid Build Coastguard Worker; ATOM: ret
169*9880d681SAndroid Build Coastguard Worker}
170*9880d681SAndroid Build Coastguard Worker
171*9880d681SAndroid Build Coastguard Workerdefine i64 @test9b(i64 %x, i64 %y) nounwind readnone ssp noredzone {
172*9880d681SAndroid Build Coastguard Worker  %cmp = icmp eq i64 %x, 0
173*9880d681SAndroid Build Coastguard Worker  %A = sext i1 %cmp to i64
174*9880d681SAndroid Build Coastguard Worker  %cond = or i64 %y, %A
175*9880d681SAndroid Build Coastguard Worker  ret i64 %cond
176*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test9b:
177*9880d681SAndroid Build Coastguard Worker; CHECK: cmpq	$1, %rdi
178*9880d681SAndroid Build Coastguard Worker; CHECK: sbbq	%rax, %rax
179*9880d681SAndroid Build Coastguard Worker; CHECK: orq	%rsi, %rax
180*9880d681SAndroid Build Coastguard Worker; CHECK: ret
181*9880d681SAndroid Build Coastguard Worker
182*9880d681SAndroid Build Coastguard Worker; ATOM-LABEL: test9b:
183*9880d681SAndroid Build Coastguard Worker; ATOM: cmpq   $1, %rdi
184*9880d681SAndroid Build Coastguard Worker; ATOM: sbbq   %rax, %rax
185*9880d681SAndroid Build Coastguard Worker; ATOM: orq    %rsi, %rax
186*9880d681SAndroid Build Coastguard Worker; ATOM: ret
187*9880d681SAndroid Build Coastguard Worker}
188*9880d681SAndroid Build Coastguard Worker
189*9880d681SAndroid Build Coastguard Worker;; Select between -1 and 1.
190*9880d681SAndroid Build Coastguard Workerdefine i64 @test10(i64 %x, i64 %y) nounwind readnone ssp noredzone {
191*9880d681SAndroid Build Coastguard Worker  %cmp = icmp eq i64 %x, 0
192*9880d681SAndroid Build Coastguard Worker  %cond = select i1 %cmp, i64 -1, i64 1
193*9880d681SAndroid Build Coastguard Worker  ret i64 %cond
194*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test10:
195*9880d681SAndroid Build Coastguard Worker; CHECK: cmpq	$1, %rdi
196*9880d681SAndroid Build Coastguard Worker; CHECK: sbbq	%rax, %rax
197*9880d681SAndroid Build Coastguard Worker; CHECK: orq	$1, %rax
198*9880d681SAndroid Build Coastguard Worker; CHECK: ret
199*9880d681SAndroid Build Coastguard Worker
200*9880d681SAndroid Build Coastguard Worker; ATOM-LABEL: test10:
201*9880d681SAndroid Build Coastguard Worker; ATOM: cmpq   $1, %rdi
202*9880d681SAndroid Build Coastguard Worker; ATOM: sbbq   %rax, %rax
203*9880d681SAndroid Build Coastguard Worker; ATOM: orq    $1, %rax
204*9880d681SAndroid Build Coastguard Worker; ATOM: ret
205*9880d681SAndroid Build Coastguard Worker}
206*9880d681SAndroid Build Coastguard Worker
207*9880d681SAndroid Build Coastguard Worker
208*9880d681SAndroid Build Coastguard Worker
209*9880d681SAndroid Build Coastguard Workerdefine i64 @test11(i64 %x, i64 %y) nounwind readnone ssp noredzone {
210*9880d681SAndroid Build Coastguard Worker  %cmp = icmp eq i64 %x, 0
211*9880d681SAndroid Build Coastguard Worker  %cond = select i1 %cmp, i64 %y, i64 -1
212*9880d681SAndroid Build Coastguard Worker  ret i64 %cond
213*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test11:
214*9880d681SAndroid Build Coastguard Worker; CHECK: cmpq	$1, %rdi
215*9880d681SAndroid Build Coastguard Worker; CHECK: sbbq	%rax, %rax
216*9880d681SAndroid Build Coastguard Worker; CHECK: notq %rax
217*9880d681SAndroid Build Coastguard Worker; CHECK: orq	%rsi, %rax
218*9880d681SAndroid Build Coastguard Worker; CHECK: ret
219*9880d681SAndroid Build Coastguard Worker
220*9880d681SAndroid Build Coastguard Worker; ATOM-LABEL: test11:
221*9880d681SAndroid Build Coastguard Worker; ATOM: cmpq   $1, %rdi
222*9880d681SAndroid Build Coastguard Worker; ATOM: sbbq   %rax, %rax
223*9880d681SAndroid Build Coastguard Worker; ATOM: notq %rax
224*9880d681SAndroid Build Coastguard Worker; ATOM: orq    %rsi, %rax
225*9880d681SAndroid Build Coastguard Worker; ATOM: ret
226*9880d681SAndroid Build Coastguard Worker}
227*9880d681SAndroid Build Coastguard Worker
228*9880d681SAndroid Build Coastguard Workerdefine i64 @test11a(i64 %x, i64 %y) nounwind readnone ssp noredzone {
229*9880d681SAndroid Build Coastguard Worker  %cmp = icmp ne i64 %x, 0
230*9880d681SAndroid Build Coastguard Worker  %cond = select i1 %cmp, i64 -1, i64 %y
231*9880d681SAndroid Build Coastguard Worker  ret i64 %cond
232*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test11a:
233*9880d681SAndroid Build Coastguard Worker; CHECK: cmpq	$1, %rdi
234*9880d681SAndroid Build Coastguard Worker; CHECK: sbbq	%rax, %rax
235*9880d681SAndroid Build Coastguard Worker; CHECK: notq %rax
236*9880d681SAndroid Build Coastguard Worker; CHECK: orq	%rsi, %rax
237*9880d681SAndroid Build Coastguard Worker; CHECK: ret
238*9880d681SAndroid Build Coastguard Worker
239*9880d681SAndroid Build Coastguard Worker; ATOM-LABEL: test11a:
240*9880d681SAndroid Build Coastguard Worker; ATOM: cmpq   $1, %rdi
241*9880d681SAndroid Build Coastguard Worker; ATOM: sbbq   %rax, %rax
242*9880d681SAndroid Build Coastguard Worker; ATOM: notq %rax
243*9880d681SAndroid Build Coastguard Worker; ATOM: orq    %rsi, %rax
244*9880d681SAndroid Build Coastguard Worker; ATOM: ret
245*9880d681SAndroid Build Coastguard Worker}
246*9880d681SAndroid Build Coastguard Worker
247*9880d681SAndroid Build Coastguard Worker
248*9880d681SAndroid Build Coastguard Workerdeclare noalias i8* @_Znam(i64) noredzone
249*9880d681SAndroid Build Coastguard Worker
250*9880d681SAndroid Build Coastguard Workerdefine noalias i8* @test12(i64 %count) nounwind ssp noredzone {
251*9880d681SAndroid Build Coastguard Workerentry:
252*9880d681SAndroid Build Coastguard Worker  %A = tail call { i64, i1 } @llvm.umul.with.overflow.i64(i64 %count, i64 4)
253*9880d681SAndroid Build Coastguard Worker  %B = extractvalue { i64, i1 } %A, 1
254*9880d681SAndroid Build Coastguard Worker  %C = extractvalue { i64, i1 } %A, 0
255*9880d681SAndroid Build Coastguard Worker  %D = select i1 %B, i64 -1, i64 %C
256*9880d681SAndroid Build Coastguard Worker  %call = tail call noalias i8* @_Znam(i64 %D) nounwind noredzone
257*9880d681SAndroid Build Coastguard Worker  ret i8* %call
258*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test12:
259*9880d681SAndroid Build Coastguard Worker; CHECK: mulq
260*9880d681SAndroid Build Coastguard Worker; CHECK: movq $-1, %[[R:r..]]
261*9880d681SAndroid Build Coastguard Worker; CHECK: cmovnoq	%rax, %[[R]]
262*9880d681SAndroid Build Coastguard Worker; CHECK: jmp	__Znam
263*9880d681SAndroid Build Coastguard Worker
264*9880d681SAndroid Build Coastguard Worker; ATOM-LABEL: test12:
265*9880d681SAndroid Build Coastguard Worker; ATOM: mulq
266*9880d681SAndroid Build Coastguard Worker; ATOM: movq $-1, %rdi
267*9880d681SAndroid Build Coastguard Worker; ATOM: cmovnoq        %rax, %rdi
268*9880d681SAndroid Build Coastguard Worker; ATOM: jmp    __Znam
269*9880d681SAndroid Build Coastguard Worker}
270*9880d681SAndroid Build Coastguard Worker
271*9880d681SAndroid Build Coastguard Workerdeclare { i64, i1 } @llvm.umul.with.overflow.i64(i64, i64) nounwind readnone
272*9880d681SAndroid Build Coastguard Worker
273*9880d681SAndroid Build Coastguard Workerdefine i32 @test13(i32 %a, i32 %b) nounwind {
274*9880d681SAndroid Build Coastguard Worker  %c = icmp ult i32 %a, %b
275*9880d681SAndroid Build Coastguard Worker  %d = sext i1 %c to i32
276*9880d681SAndroid Build Coastguard Worker  ret i32 %d
277*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test13:
278*9880d681SAndroid Build Coastguard Worker; CHECK: cmpl
279*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: sbbl
280*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
281*9880d681SAndroid Build Coastguard Worker
282*9880d681SAndroid Build Coastguard Worker; ATOM-LABEL: test13:
283*9880d681SAndroid Build Coastguard Worker; ATOM: cmpl
284*9880d681SAndroid Build Coastguard Worker; ATOM-NEXT: sbbl
285*9880d681SAndroid Build Coastguard Worker; ATOM: ret
286*9880d681SAndroid Build Coastguard Worker}
287*9880d681SAndroid Build Coastguard Worker
288*9880d681SAndroid Build Coastguard Workerdefine i32 @test14(i32 %a, i32 %b) nounwind {
289*9880d681SAndroid Build Coastguard Worker  %c = icmp uge i32 %a, %b
290*9880d681SAndroid Build Coastguard Worker  %d = sext i1 %c to i32
291*9880d681SAndroid Build Coastguard Worker  ret i32 %d
292*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test14:
293*9880d681SAndroid Build Coastguard Worker; CHECK: cmpl
294*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: sbbl
295*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: notl
296*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
297*9880d681SAndroid Build Coastguard Worker
298*9880d681SAndroid Build Coastguard Worker; ATOM-LABEL: test14:
299*9880d681SAndroid Build Coastguard Worker; ATOM: cmpl
300*9880d681SAndroid Build Coastguard Worker; ATOM-NEXT: sbbl
301*9880d681SAndroid Build Coastguard Worker; ATOM-NEXT: notl
302*9880d681SAndroid Build Coastguard Worker; ATOM: ret
303*9880d681SAndroid Build Coastguard Worker}
304*9880d681SAndroid Build Coastguard Worker
305*9880d681SAndroid Build Coastguard Worker; rdar://10961709
306*9880d681SAndroid Build Coastguard Workerdefine i32 @test15(i32 %x) nounwind {
307*9880d681SAndroid Build Coastguard Workerentry:
308*9880d681SAndroid Build Coastguard Worker  %cmp = icmp ne i32 %x, 0
309*9880d681SAndroid Build Coastguard Worker  %sub = sext i1 %cmp to i32
310*9880d681SAndroid Build Coastguard Worker  ret i32 %sub
311*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test15:
312*9880d681SAndroid Build Coastguard Worker; CHECK: negl
313*9880d681SAndroid Build Coastguard Worker; CHECK: sbbl
314*9880d681SAndroid Build Coastguard Worker
315*9880d681SAndroid Build Coastguard Worker; ATOM-LABEL: test15:
316*9880d681SAndroid Build Coastguard Worker; ATOM: negl
317*9880d681SAndroid Build Coastguard Worker; ATOM: sbbl
318*9880d681SAndroid Build Coastguard Worker}
319*9880d681SAndroid Build Coastguard Worker
320*9880d681SAndroid Build Coastguard Workerdefine i64 @test16(i64 %x) nounwind uwtable readnone ssp {
321*9880d681SAndroid Build Coastguard Workerentry:
322*9880d681SAndroid Build Coastguard Worker  %cmp = icmp ne i64 %x, 0
323*9880d681SAndroid Build Coastguard Worker  %conv1 = sext i1 %cmp to i64
324*9880d681SAndroid Build Coastguard Worker  ret i64 %conv1
325*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test16:
326*9880d681SAndroid Build Coastguard Worker; CHECK: negq
327*9880d681SAndroid Build Coastguard Worker; CHECK: sbbq
328*9880d681SAndroid Build Coastguard Worker
329*9880d681SAndroid Build Coastguard Worker; ATOM-LABEL: test16:
330*9880d681SAndroid Build Coastguard Worker; ATOM: negq
331*9880d681SAndroid Build Coastguard Worker; ATOM: sbbq
332*9880d681SAndroid Build Coastguard Worker}
333*9880d681SAndroid Build Coastguard Worker
334*9880d681SAndroid Build Coastguard Workerdefine i16 @test17(i16 %x) nounwind {
335*9880d681SAndroid Build Coastguard Workerentry:
336*9880d681SAndroid Build Coastguard Worker  %cmp = icmp ne i16 %x, 0
337*9880d681SAndroid Build Coastguard Worker  %sub = sext i1 %cmp to i16
338*9880d681SAndroid Build Coastguard Worker  ret i16 %sub
339*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test17:
340*9880d681SAndroid Build Coastguard Worker; CHECK: negw
341*9880d681SAndroid Build Coastguard Worker; CHECK: sbbw
342*9880d681SAndroid Build Coastguard Worker
343*9880d681SAndroid Build Coastguard Worker; ATOM-LABEL: test17:
344*9880d681SAndroid Build Coastguard Worker; ATOM: negw
345*9880d681SAndroid Build Coastguard Worker; ATOM: sbbw
346*9880d681SAndroid Build Coastguard Worker}
347*9880d681SAndroid Build Coastguard Worker
348*9880d681SAndroid Build Coastguard Workerdefine i8 @test18(i32 %x, i8 zeroext %a, i8 zeroext %b) nounwind {
349*9880d681SAndroid Build Coastguard Worker  %cmp = icmp slt i32 %x, 15
350*9880d681SAndroid Build Coastguard Worker  %sel = select i1 %cmp, i8 %a, i8 %b
351*9880d681SAndroid Build Coastguard Worker  ret i8 %sel
352*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test18:
353*9880d681SAndroid Build Coastguard Worker; CHECK: cmpl $15, %edi
354*9880d681SAndroid Build Coastguard Worker; CHECK: cmovgel %edx
355*9880d681SAndroid Build Coastguard Worker
356*9880d681SAndroid Build Coastguard Worker; ATOM-LABEL: test18:
357*9880d681SAndroid Build Coastguard Worker; ATOM: cmpl $15, %edi
358*9880d681SAndroid Build Coastguard Worker; ATOM: cmovgel %edx
359*9880d681SAndroid Build Coastguard Worker}
360*9880d681SAndroid Build Coastguard Worker
361*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @trunc_select_miscompile
362*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: sarb
363*9880d681SAndroid Build Coastguard Workerdefine i32 @trunc_select_miscompile(i32 %a, i1 zeroext %cc) {
364*9880d681SAndroid Build Coastguard Worker  %tmp1 = select i1 %cc, i32 3, i32 2
365*9880d681SAndroid Build Coastguard Worker  %tmp2 = shl i32 %a, %tmp1
366*9880d681SAndroid Build Coastguard Worker  ret i32 %tmp2
367*9880d681SAndroid Build Coastguard Worker}
368*9880d681SAndroid Build Coastguard Worker
369*9880d681SAndroid Build Coastguard Workerdefine void @test19() {
370*9880d681SAndroid Build Coastguard Worker; This is a massive reduction of an llvm-stress test case that generates
371*9880d681SAndroid Build Coastguard Worker; interesting chains feeding setcc and eventually a f32 select operation. This
372*9880d681SAndroid Build Coastguard Worker; is intended to exercise the SELECT formation in the DAG combine simplifying
373*9880d681SAndroid Build Coastguard Worker; a simplified select_cc node. If it it regresses and is no longer triggering
374*9880d681SAndroid Build Coastguard Worker; that code path, it can be deleted.
375*9880d681SAndroid Build Coastguard Worker;
376*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test19
377*9880d681SAndroid Build Coastguard Worker; CHECK: testb
378*9880d681SAndroid Build Coastguard Worker; CHECK: cmpl
379*9880d681SAndroid Build Coastguard Worker; CHECK: ucomiss
380*9880d681SAndroid Build Coastguard Worker
381*9880d681SAndroid Build Coastguard WorkerBB:
382*9880d681SAndroid Build Coastguard Worker  br label %CF
383*9880d681SAndroid Build Coastguard Worker
384*9880d681SAndroid Build Coastguard WorkerCF:
385*9880d681SAndroid Build Coastguard Worker  %Cmp10 = icmp ule i8 undef, undef
386*9880d681SAndroid Build Coastguard Worker  br i1 %Cmp10, label %CF, label %CF250
387*9880d681SAndroid Build Coastguard Worker
388*9880d681SAndroid Build Coastguard WorkerCF250:
389*9880d681SAndroid Build Coastguard Worker  %E12 = extractelement <4 x i32> <i32 -1, i32 -1, i32 -1, i32 -1>, i32 2
390*9880d681SAndroid Build Coastguard Worker  %Cmp32 = icmp ugt i1 %Cmp10, false
391*9880d681SAndroid Build Coastguard Worker  br i1 %Cmp32, label %CF, label %CF242
392*9880d681SAndroid Build Coastguard Worker
393*9880d681SAndroid Build Coastguard WorkerCF242:
394*9880d681SAndroid Build Coastguard Worker  %Cmp38 = icmp uge i32 %E12, undef
395*9880d681SAndroid Build Coastguard Worker  %FC = uitofp i1 %Cmp38 to float
396*9880d681SAndroid Build Coastguard Worker  %Sl59 = select i1 %Cmp32, float %FC, float undef
397*9880d681SAndroid Build Coastguard Worker  %Cmp60 = fcmp ugt float undef, undef
398*9880d681SAndroid Build Coastguard Worker  br i1 %Cmp60, label %CF242, label %CF244
399*9880d681SAndroid Build Coastguard Worker
400*9880d681SAndroid Build Coastguard WorkerCF244:
401*9880d681SAndroid Build Coastguard Worker  %B122 = fadd float %Sl59, undef
402*9880d681SAndroid Build Coastguard Worker  ret void
403*9880d681SAndroid Build Coastguard Worker}
404