1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc < %s -mtriple=x86_64-apple-darwin9 -mcpu=knl | FileCheck %s --check-prefix=ALL_X64 --check-prefix=KNL
3; RUN: llc < %s -mtriple=x86_64-apple-darwin9 -mcpu=skx | FileCheck %s --check-prefix=ALL_X64 --check-prefix=SKX
4; RUN: llc < %s -mtriple=i686-apple-darwin9 -mcpu=knl | FileCheck %s --check-prefix=KNL_X32
5
6define <16 x i1> @test1() {
7; KNL-LABEL: test1:
8; KNL:       ## BB#0:
9; KNL-NEXT:    vxorps %xmm0, %xmm0, %xmm0
10; KNL-NEXT:    retq
11;
12; SKX-LABEL: test1:
13; SKX:       ## BB#0:
14; SKX-NEXT:    vpxord %xmm0, %xmm0, %xmm0
15; SKX-NEXT:    retq
16;
17; KNL_X32-LABEL: test1:
18; KNL_X32:       ## BB#0:
19; KNL_X32-NEXT:    vxorps %xmm0, %xmm0, %xmm0
20; KNL_X32-NEXT:    retl
21  ret <16 x i1> zeroinitializer
22}
23
24define <16 x i1> @test2(<16 x i1>%a, <16 x i1>%b) {
25; KNL-LABEL: test2:
26; KNL:       ## BB#0:
27; KNL-NEXT:    vpmovsxbd %xmm1, %zmm1
28; KNL-NEXT:    vpslld $31, %zmm1, %zmm1
29; KNL-NEXT:    vpmovsxbd %xmm0, %zmm0
30; KNL-NEXT:    vpslld $31, %zmm0, %zmm0
31; KNL-NEXT:    vptestmd %zmm0, %zmm0, %k1
32; KNL-NEXT:    vptestmd %zmm1, %zmm1, %k1 {%k1}
33; KNL-NEXT:    vpternlogd $255, %zmm0, %zmm0, %zmm0
34; KNL-NEXT:    vmovdqa32 %zmm0, %zmm0 {%k1} {z}
35; KNL-NEXT:    vpmovdb %zmm0, %xmm0
36; KNL-NEXT:    retq
37;
38; SKX-LABEL: test2:
39; SKX:       ## BB#0:
40; SKX-NEXT:    vpsllw $7, %xmm1, %xmm1
41; SKX-NEXT:    vpmovb2m %xmm1, %k0
42; SKX-NEXT:    vpsllw $7, %xmm0, %xmm0
43; SKX-NEXT:    vpmovb2m %xmm0, %k1
44; SKX-NEXT:    kandw %k0, %k1, %k0
45; SKX-NEXT:    vpmovm2b %k0, %xmm0
46; SKX-NEXT:    retq
47;
48; KNL_X32-LABEL: test2:
49; KNL_X32:       ## BB#0:
50; KNL_X32-NEXT:    vpmovsxbd %xmm1, %zmm1
51; KNL_X32-NEXT:    vpslld $31, %zmm1, %zmm1
52; KNL_X32-NEXT:    vpmovsxbd %xmm0, %zmm0
53; KNL_X32-NEXT:    vpslld $31, %zmm0, %zmm0
54; KNL_X32-NEXT:    vptestmd %zmm0, %zmm0, %k1
55; KNL_X32-NEXT:    vptestmd %zmm1, %zmm1, %k1 {%k1}
56; KNL_X32-NEXT:    vpternlogd $255, %zmm0, %zmm0, %zmm0
57; KNL_X32-NEXT:    vmovdqa32 %zmm0, %zmm0 {%k1} {z}
58; KNL_X32-NEXT:    vpmovdb %zmm0, %xmm0
59; KNL_X32-NEXT:    retl
60  %c = and <16 x i1>%a, %b
61  ret <16 x i1> %c
62}
63
64define <8 x i1> @test3(<8 x i1>%a, <8 x i1>%b) {
65; KNL-LABEL: test3:
66; KNL:       ## BB#0:
67; KNL-NEXT:    vpmovsxwq %xmm1, %zmm1
68; KNL-NEXT:    vpsllq $63, %zmm1, %zmm1
69; KNL-NEXT:    vpmovsxwq %xmm0, %zmm0
70; KNL-NEXT:    vpsllq $63, %zmm0, %zmm0
71; KNL-NEXT:    vptestmq %zmm0, %zmm0, %k1
72; KNL-NEXT:    vptestmq %zmm1, %zmm1, %k1 {%k1}
73; KNL-NEXT:    vpternlogd $255, %zmm0, %zmm0, %zmm0
74; KNL-NEXT:    vmovdqa64 %zmm0, %zmm0 {%k1} {z}
75; KNL-NEXT:    vpmovqw %zmm0, %xmm0
76; KNL-NEXT:    retq
77;
78; SKX-LABEL: test3:
79; SKX:       ## BB#0:
80; SKX-NEXT:    vpsllw $15, %xmm1, %xmm1
81; SKX-NEXT:    vpmovw2m %xmm1, %k0
82; SKX-NEXT:    vpsllw $15, %xmm0, %xmm0
83; SKX-NEXT:    vpmovw2m %xmm0, %k1
84; SKX-NEXT:    kandb %k0, %k1, %k0
85; SKX-NEXT:    vpmovm2w %k0, %xmm0
86; SKX-NEXT:    retq
87;
88; KNL_X32-LABEL: test3:
89; KNL_X32:       ## BB#0:
90; KNL_X32-NEXT:    vpmovsxwq %xmm1, %zmm1
91; KNL_X32-NEXT:    vmovdqa64 {{.*#+}} zmm2 = [63,0,63,0,63,0,63,0,63,0,63,0,63,0,63,0]
92; KNL_X32-NEXT:    vpsllvq %zmm2, %zmm1, %zmm1
93; KNL_X32-NEXT:    vpmovsxwq %xmm0, %zmm0
94; KNL_X32-NEXT:    vpsllvq %zmm2, %zmm0, %zmm0
95; KNL_X32-NEXT:    vptestmq %zmm0, %zmm0, %k1
96; KNL_X32-NEXT:    vptestmq %zmm1, %zmm1, %k1 {%k1}
97; KNL_X32-NEXT:    vpternlogd $255, %zmm0, %zmm0, %zmm0
98; KNL_X32-NEXT:    vmovdqa64 %zmm0, %zmm0 {%k1} {z}
99; KNL_X32-NEXT:    vpmovqw %zmm0, %xmm0
100; KNL_X32-NEXT:    retl
101  %c = and <8 x i1>%a, %b
102  ret <8 x i1> %c
103}
104
105define <4 x i1> @test4(<4 x i1>%a, <4 x i1>%b) {
106; KNL-LABEL: test4:
107; KNL:       ## BB#0:
108; KNL-NEXT:    vandps %xmm1, %xmm0, %xmm0
109; KNL-NEXT:    retq
110;
111; SKX-LABEL: test4:
112; SKX:       ## BB#0:
113; SKX-NEXT:    vpslld $31, %xmm1, %xmm1
114; SKX-NEXT:    vpslld $31, %xmm0, %xmm0
115; SKX-NEXT:    vptestmd %xmm0, %xmm0, %k1
116; SKX-NEXT:    vptestmd %xmm1, %xmm1, %k0 {%k1}
117; SKX-NEXT:    vpmovm2d %k0, %xmm0
118; SKX-NEXT:    retq
119;
120; KNL_X32-LABEL: test4:
121; KNL_X32:       ## BB#0:
122; KNL_X32-NEXT:    vandps %xmm1, %xmm0, %xmm0
123; KNL_X32-NEXT:    retl
124  %c = and <4 x i1>%a, %b
125  ret <4 x i1> %c
126}
127
128declare <8 x i1> @func8xi1(<8 x i1> %a)
129
130define <8 x i32> @test5(<8 x i32>%a, <8 x i32>%b) {
131; KNL-LABEL: test5:
132; KNL:       ## BB#0:
133; KNL-NEXT:    pushq %rax
134; KNL-NEXT:  Ltmp0:
135; KNL-NEXT:    .cfi_def_cfa_offset 16
136; KNL-NEXT:    vpcmpgtd %ymm1, %ymm0, %ymm0
137; KNL-NEXT:    vpmovdw %zmm0, %ymm0
138; KNL-NEXT:    ## kill: %XMM0<def> %XMM0<kill> %YMM0<kill>
139; KNL-NEXT:    callq _func8xi1
140; KNL-NEXT:    vpmovzxwd {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
141; KNL-NEXT:    vpslld $31, %ymm0, %ymm0
142; KNL-NEXT:    vpsrad $31, %ymm0, %ymm0
143; KNL-NEXT:    popq %rax
144; KNL-NEXT:    retq
145;
146; SKX-LABEL: test5:
147; SKX:       ## BB#0:
148; SKX-NEXT:    pushq %rax
149; SKX-NEXT:  Ltmp0:
150; SKX-NEXT:    .cfi_def_cfa_offset 16
151; SKX-NEXT:    vpcmpgtd %ymm1, %ymm0, %k0
152; SKX-NEXT:    vpmovm2w %k0, %xmm0
153; SKX-NEXT:    callq _func8xi1
154; SKX-NEXT:    vpmovzxwd {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
155; SKX-NEXT:    vpslld $31, %ymm0, %ymm0
156; SKX-NEXT:    vpsrad $31, %ymm0, %ymm0
157; SKX-NEXT:    popq %rax
158; SKX-NEXT:    retq
159;
160; KNL_X32-LABEL: test5:
161; KNL_X32:       ## BB#0:
162; KNL_X32-NEXT:    subl $12, %esp
163; KNL_X32-NEXT:  Ltmp0:
164; KNL_X32-NEXT:    .cfi_def_cfa_offset 16
165; KNL_X32-NEXT:    vpcmpgtd %ymm1, %ymm0, %ymm0
166; KNL_X32-NEXT:    vpmovdw %zmm0, %ymm0
167; KNL_X32-NEXT:    ## kill: %XMM0<def> %XMM0<kill> %YMM0<kill>
168; KNL_X32-NEXT:    calll _func8xi1
169; KNL_X32-NEXT:    vpmovzxwd {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
170; KNL_X32-NEXT:    vpslld $31, %ymm0, %ymm0
171; KNL_X32-NEXT:    vpsrad $31, %ymm0, %ymm0
172; KNL_X32-NEXT:    addl $12, %esp
173; KNL_X32-NEXT:    retl
174  %cmpRes = icmp sgt <8 x i32>%a, %b
175  %resi = call <8 x i1> @func8xi1(<8 x i1> %cmpRes)
176  %res = sext <8 x i1>%resi to <8 x i32>
177  ret <8 x i32> %res
178}
179
180declare <16 x i1> @func16xi1(<16 x i1> %a)
181
182define <16 x i32> @test6(<16 x i32>%a, <16 x i32>%b) {
183; KNL-LABEL: test6:
184; KNL:       ## BB#0:
185; KNL-NEXT:    pushq %rax
186; KNL-NEXT:  Ltmp1:
187; KNL-NEXT:    .cfi_def_cfa_offset 16
188; KNL-NEXT:    vpcmpgtd %zmm1, %zmm0, %k1
189; KNL-NEXT:    vpternlogd $255, %zmm0, %zmm0, %zmm0
190; KNL-NEXT:    vmovdqa32 %zmm0, %zmm0 {%k1} {z}
191; KNL-NEXT:    vpmovdb %zmm0, %xmm0
192; KNL-NEXT:    callq _func16xi1
193; KNL-NEXT:    vpmovzxbd {{.*#+}} zmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero,xmm0[4],zero,zero,zero,xmm0[5],zero,zero,zero,xmm0[6],zero,zero,zero,xmm0[7],zero,zero,zero,xmm0[8],zero,zero,zero,xmm0[9],zero,zero,zero,xmm0[10],zero,zero,zero,xmm0[11],zero,zero,zero,xmm0[12],zero,zero,zero,xmm0[13],zero,zero,zero,xmm0[14],zero,zero,zero,xmm0[15],zero,zero,zero
194; KNL-NEXT:    vpslld $31, %zmm0, %zmm0
195; KNL-NEXT:    vpsrad $31, %zmm0, %zmm0
196; KNL-NEXT:    popq %rax
197; KNL-NEXT:    retq
198;
199; SKX-LABEL: test6:
200; SKX:       ## BB#0:
201; SKX-NEXT:    pushq %rax
202; SKX-NEXT:  Ltmp1:
203; SKX-NEXT:    .cfi_def_cfa_offset 16
204; SKX-NEXT:    vpcmpgtd %zmm1, %zmm0, %k0
205; SKX-NEXT:    vpmovm2b %k0, %xmm0
206; SKX-NEXT:    callq _func16xi1
207; SKX-NEXT:    vpmovzxbd {{.*#+}} zmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero,xmm0[4],zero,zero,zero,xmm0[5],zero,zero,zero,xmm0[6],zero,zero,zero,xmm0[7],zero,zero,zero,xmm0[8],zero,zero,zero,xmm0[9],zero,zero,zero,xmm0[10],zero,zero,zero,xmm0[11],zero,zero,zero,xmm0[12],zero,zero,zero,xmm0[13],zero,zero,zero,xmm0[14],zero,zero,zero,xmm0[15],zero,zero,zero
208; SKX-NEXT:    vpslld $31, %zmm0, %zmm0
209; SKX-NEXT:    vpsrad $31, %zmm0, %zmm0
210; SKX-NEXT:    popq %rax
211; SKX-NEXT:    retq
212;
213; KNL_X32-LABEL: test6:
214; KNL_X32:       ## BB#0:
215; KNL_X32-NEXT:    subl $12, %esp
216; KNL_X32-NEXT:  Ltmp1:
217; KNL_X32-NEXT:    .cfi_def_cfa_offset 16
218; KNL_X32-NEXT:    vpcmpgtd %zmm1, %zmm0, %k1
219; KNL_X32-NEXT:    vpternlogd $255, %zmm0, %zmm0, %zmm0
220; KNL_X32-NEXT:    vmovdqa32 %zmm0, %zmm0 {%k1} {z}
221; KNL_X32-NEXT:    vpmovdb %zmm0, %xmm0
222; KNL_X32-NEXT:    calll _func16xi1
223; KNL_X32-NEXT:    vpmovzxbd {{.*#+}} zmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero,xmm0[4],zero,zero,zero,xmm0[5],zero,zero,zero,xmm0[6],zero,zero,zero,xmm0[7],zero,zero,zero,xmm0[8],zero,zero,zero,xmm0[9],zero,zero,zero,xmm0[10],zero,zero,zero,xmm0[11],zero,zero,zero,xmm0[12],zero,zero,zero,xmm0[13],zero,zero,zero,xmm0[14],zero,zero,zero,xmm0[15],zero,zero,zero
224; KNL_X32-NEXT:    vpslld $31, %zmm0, %zmm0
225; KNL_X32-NEXT:    vpsrad $31, %zmm0, %zmm0
226; KNL_X32-NEXT:    addl $12, %esp
227; KNL_X32-NEXT:    retl
228  %cmpRes = icmp sgt <16 x i32>%a, %b
229  %resi = call <16 x i1> @func16xi1(<16 x i1> %cmpRes)
230  %res = sext <16 x i1>%resi to <16 x i32>
231  ret <16 x i32> %res
232}
233
234declare <4 x i1> @func4xi1(<4 x i1> %a)
235
236define <4 x i32> @test7(<4 x i32>%a, <4 x i32>%b) {
237; KNL-LABEL: test7:
238; KNL:       ## BB#0:
239; KNL-NEXT:    pushq %rax
240; KNL-NEXT:  Ltmp2:
241; KNL-NEXT:    .cfi_def_cfa_offset 16
242; KNL-NEXT:    vpcmpgtd %xmm1, %xmm0, %xmm0
243; KNL-NEXT:    callq _func4xi1
244; KNL-NEXT:    vpslld $31, %xmm0, %xmm0
245; KNL-NEXT:    vpsrad $31, %xmm0, %xmm0
246; KNL-NEXT:    popq %rax
247; KNL-NEXT:    retq
248;
249; SKX-LABEL: test7:
250; SKX:       ## BB#0:
251; SKX-NEXT:    pushq %rax
252; SKX-NEXT:  Ltmp2:
253; SKX-NEXT:    .cfi_def_cfa_offset 16
254; SKX-NEXT:    vpcmpgtd %xmm1, %xmm0, %k0
255; SKX-NEXT:    vpmovm2d %k0, %xmm0
256; SKX-NEXT:    callq _func4xi1
257; SKX-NEXT:    vpslld $31, %xmm0, %xmm0
258; SKX-NEXT:    vpsrad $31, %xmm0, %xmm0
259; SKX-NEXT:    popq %rax
260; SKX-NEXT:    retq
261;
262; KNL_X32-LABEL: test7:
263; KNL_X32:       ## BB#0:
264; KNL_X32-NEXT:    subl $12, %esp
265; KNL_X32-NEXT:  Ltmp2:
266; KNL_X32-NEXT:    .cfi_def_cfa_offset 16
267; KNL_X32-NEXT:    vpcmpgtd %xmm1, %xmm0, %xmm0
268; KNL_X32-NEXT:    calll _func4xi1
269; KNL_X32-NEXT:    vpslld $31, %xmm0, %xmm0
270; KNL_X32-NEXT:    vpsrad $31, %xmm0, %xmm0
271; KNL_X32-NEXT:    addl $12, %esp
272; KNL_X32-NEXT:    retl
273  %cmpRes = icmp sgt <4 x i32>%a, %b
274  %resi = call <4 x i1> @func4xi1(<4 x i1> %cmpRes)
275  %res = sext <4 x i1>%resi to <4 x i32>
276  ret <4 x i32> %res
277}
278
279define <8 x i1> @test7a(<8 x i32>%a, <8 x i32>%b) {
280; KNL-LABEL: test7a:
281; KNL:       ## BB#0:
282; KNL-NEXT:    pushq %rax
283; KNL-NEXT:  Ltmp3:
284; KNL-NEXT:    .cfi_def_cfa_offset 16
285; KNL-NEXT:    vpcmpgtd %ymm1, %ymm0, %ymm0
286; KNL-NEXT:    vpmovdw %zmm0, %ymm0
287; KNL-NEXT:    ## kill: %XMM0<def> %XMM0<kill> %YMM0<kill>
288; KNL-NEXT:    callq _func8xi1
289; KNL-NEXT:    vpmovsxwq %xmm0, %zmm0
290; KNL-NEXT:    vpsllq $63, %zmm0, %zmm0
291; KNL-NEXT:    movb $85, %al
292; KNL-NEXT:    kmovw %eax, %k1
293; KNL-NEXT:    vptestmq %zmm0, %zmm0, %k1 {%k1}
294; KNL-NEXT:    vpternlogd $255, %zmm0, %zmm0, %zmm0
295; KNL-NEXT:    vmovdqa64 %zmm0, %zmm0 {%k1} {z}
296; KNL-NEXT:    vpmovqw %zmm0, %xmm0
297; KNL-NEXT:    popq %rax
298; KNL-NEXT:    retq
299;
300; SKX-LABEL: test7a:
301; SKX:       ## BB#0:
302; SKX-NEXT:    pushq %rax
303; SKX-NEXT:  Ltmp3:
304; SKX-NEXT:    .cfi_def_cfa_offset 16
305; SKX-NEXT:    vpcmpgtd %ymm1, %ymm0, %k0
306; SKX-NEXT:    vpmovm2w %k0, %xmm0
307; SKX-NEXT:    callq _func8xi1
308; SKX-NEXT:    vpsllw $15, %xmm0, %xmm0
309; SKX-NEXT:    vpmovw2m %xmm0, %k0
310; SKX-NEXT:    movb $85, %al
311; SKX-NEXT:    kmovb %eax, %k1
312; SKX-NEXT:    kandb %k1, %k0, %k0
313; SKX-NEXT:    vpmovm2w %k0, %xmm0
314; SKX-NEXT:    popq %rax
315; SKX-NEXT:    retq
316;
317; KNL_X32-LABEL: test7a:
318; KNL_X32:       ## BB#0:
319; KNL_X32-NEXT:    subl $12, %esp
320; KNL_X32-NEXT:  Ltmp3:
321; KNL_X32-NEXT:    .cfi_def_cfa_offset 16
322; KNL_X32-NEXT:    vpcmpgtd %ymm1, %ymm0, %ymm0
323; KNL_X32-NEXT:    vpmovdw %zmm0, %ymm0
324; KNL_X32-NEXT:    ## kill: %XMM0<def> %XMM0<kill> %YMM0<kill>
325; KNL_X32-NEXT:    calll _func8xi1
326; KNL_X32-NEXT:    vpmovsxwq %xmm0, %zmm0
327; KNL_X32-NEXT:    vpsllvq LCPI7_0, %zmm0, %zmm0
328; KNL_X32-NEXT:    movb $85, %al
329; KNL_X32-NEXT:    kmovw %eax, %k1
330; KNL_X32-NEXT:    vptestmq %zmm0, %zmm0, %k1 {%k1}
331; KNL_X32-NEXT:    vpternlogd $255, %zmm0, %zmm0, %zmm0
332; KNL_X32-NEXT:    vmovdqa64 %zmm0, %zmm0 {%k1} {z}
333; KNL_X32-NEXT:    vpmovqw %zmm0, %xmm0
334; KNL_X32-NEXT:    addl $12, %esp
335; KNL_X32-NEXT:    retl
336  %cmpRes = icmp sgt <8 x i32>%a, %b
337  %resi = call <8 x i1> @func8xi1(<8 x i1> %cmpRes)
338  %res = and <8 x i1>%resi,  <i1 true, i1 false, i1 true, i1 false, i1 true, i1 false, i1 true, i1 false>
339  ret <8 x i1> %res
340}
341
342define <16 x i8> @test8(<16 x i8> %a1, <16 x i8> %a2, i1 %cond) {
343; ALL_X64-LABEL: test8:
344; ALL_X64:       ## BB#0:
345; ALL_X64-NEXT:    testb $1, %dil
346; ALL_X64-NEXT:    jne LBB8_2
347; ALL_X64-NEXT:  ## BB#1:
348; ALL_X64-NEXT:    vmovaps %zmm1, %zmm0
349; ALL_X64-NEXT:  LBB8_2:
350; ALL_X64-NEXT:    retq
351;
352; KNL_X32-LABEL: test8:
353; KNL_X32:       ## BB#0:
354; KNL_X32-NEXT:    testb $1, {{[0-9]+}}(%esp)
355; KNL_X32-NEXT:    jne LBB8_2
356; KNL_X32-NEXT:  ## BB#1:
357; KNL_X32-NEXT:    vmovaps %zmm1, %zmm0
358; KNL_X32-NEXT:  LBB8_2:
359; KNL_X32-NEXT:    retl
360  %res = select i1 %cond, <16 x i8> %a1, <16 x i8> %a2
361  ret <16 x i8> %res
362}
363
364define i1 @test9(double %a, double %b) {
365; ALL_X64-LABEL: test9:
366; ALL_X64:       ## BB#0:
367; ALL_X64-NEXT:    vucomisd %xmm0, %xmm1
368; ALL_X64-NEXT:    setb %al
369; ALL_X64-NEXT:    retq
370;
371; KNL_X32-LABEL: test9:
372; KNL_X32:       ## BB#0:
373; KNL_X32-NEXT:    vmovsd {{.*#+}} xmm0 = mem[0],zero
374; KNL_X32-NEXT:    vucomisd {{[0-9]+}}(%esp), %xmm0
375; KNL_X32-NEXT:    setb %al
376; KNL_X32-NEXT:    retl
377  %c = fcmp ugt double %a, %b
378  ret i1 %c
379}
380
381define i32 @test10(i32 %a, i32 %b, i1 %cond) {
382; ALL_X64-LABEL: test10:
383; ALL_X64:       ## BB#0:
384; ALL_X64-NEXT:    testb $1, %dl
385; ALL_X64-NEXT:    cmovel %esi, %edi
386; ALL_X64-NEXT:    movl %edi, %eax
387; ALL_X64-NEXT:    retq
388;
389; KNL_X32-LABEL: test10:
390; KNL_X32:       ## BB#0:
391; KNL_X32-NEXT:    testb $1, {{[0-9]+}}(%esp)
392; KNL_X32-NEXT:    leal {{[0-9]+}}(%esp), %eax
393; KNL_X32-NEXT:    leal {{[0-9]+}}(%esp), %ecx
394; KNL_X32-NEXT:    cmovnel %eax, %ecx
395; KNL_X32-NEXT:    movl (%ecx), %eax
396; KNL_X32-NEXT:    retl
397  %c = select i1 %cond, i32 %a, i32 %b
398  ret i32 %c
399}
400
401define i1 @test11(i32 %a, i32 %b) {
402; ALL_X64-LABEL: test11:
403; ALL_X64:       ## BB#0:
404; ALL_X64-NEXT:    cmpl %esi, %edi
405; ALL_X64-NEXT:    setg %al
406; ALL_X64-NEXT:    retq
407;
408; KNL_X32-LABEL: test11:
409; KNL_X32:       ## BB#0:
410; KNL_X32-NEXT:    movl {{[0-9]+}}(%esp), %eax
411; KNL_X32-NEXT:    cmpl {{[0-9]+}}(%esp), %eax
412; KNL_X32-NEXT:    setg %al
413; KNL_X32-NEXT:    retl
414  %c = icmp sgt i32 %a, %b
415  ret i1 %c
416}
417
418define i32 @test12(i32 %a1, i32 %a2, i32 %b1) {
419; ALL_X64-LABEL: test12:
420; ALL_X64:       ## BB#0:
421; ALL_X64-NEXT:    pushq %rbp
422; ALL_X64-NEXT:  Ltmp4:
423; ALL_X64-NEXT:    .cfi_def_cfa_offset 16
424; ALL_X64-NEXT:    pushq %r14
425; ALL_X64-NEXT:  Ltmp5:
426; ALL_X64-NEXT:    .cfi_def_cfa_offset 24
427; ALL_X64-NEXT:    pushq %rbx
428; ALL_X64-NEXT:  Ltmp6:
429; ALL_X64-NEXT:    .cfi_def_cfa_offset 32
430; ALL_X64-NEXT:  Ltmp7:
431; ALL_X64-NEXT:    .cfi_offset %rbx, -32
432; ALL_X64-NEXT:  Ltmp8:
433; ALL_X64-NEXT:    .cfi_offset %r14, -24
434; ALL_X64-NEXT:  Ltmp9:
435; ALL_X64-NEXT:    .cfi_offset %rbp, -16
436; ALL_X64-NEXT:    movl %esi, %r14d
437; ALL_X64-NEXT:    movl %edi, %ebp
438; ALL_X64-NEXT:    movl %edx, %esi
439; ALL_X64-NEXT:    callq _test11
440; ALL_X64-NEXT:    movzbl %al, %ebx
441; ALL_X64-NEXT:    movl %ebp, %edi
442; ALL_X64-NEXT:    movl %r14d, %esi
443; ALL_X64-NEXT:    movl %ebx, %edx
444; ALL_X64-NEXT:    callq _test10
445; ALL_X64-NEXT:    xorl %ecx, %ecx
446; ALL_X64-NEXT:    testb $1, %bl
447; ALL_X64-NEXT:    cmovel %ecx, %eax
448; ALL_X64-NEXT:    popq %rbx
449; ALL_X64-NEXT:    popq %r14
450; ALL_X64-NEXT:    popq %rbp
451; ALL_X64-NEXT:    retq
452;
453; KNL_X32-LABEL: test12:
454; KNL_X32:       ## BB#0:
455; KNL_X32-NEXT:    pushl %ebx
456; KNL_X32-NEXT:  Ltmp4:
457; KNL_X32-NEXT:    .cfi_def_cfa_offset 8
458; KNL_X32-NEXT:    pushl %edi
459; KNL_X32-NEXT:  Ltmp5:
460; KNL_X32-NEXT:    .cfi_def_cfa_offset 12
461; KNL_X32-NEXT:    pushl %esi
462; KNL_X32-NEXT:  Ltmp6:
463; KNL_X32-NEXT:    .cfi_def_cfa_offset 16
464; KNL_X32-NEXT:    subl $16, %esp
465; KNL_X32-NEXT:  Ltmp7:
466; KNL_X32-NEXT:    .cfi_def_cfa_offset 32
467; KNL_X32-NEXT:  Ltmp8:
468; KNL_X32-NEXT:    .cfi_offset %esi, -16
469; KNL_X32-NEXT:  Ltmp9:
470; KNL_X32-NEXT:    .cfi_offset %edi, -12
471; KNL_X32-NEXT:  Ltmp10:
472; KNL_X32-NEXT:    .cfi_offset %ebx, -8
473; KNL_X32-NEXT:    movl {{[0-9]+}}(%esp), %esi
474; KNL_X32-NEXT:    movl {{[0-9]+}}(%esp), %edi
475; KNL_X32-NEXT:    movl {{[0-9]+}}(%esp), %eax
476; KNL_X32-NEXT:    movl %eax, {{[0-9]+}}(%esp)
477; KNL_X32-NEXT:    movl %edi, (%esp)
478; KNL_X32-NEXT:    calll _test11
479; KNL_X32-NEXT:    movl %eax, %ebx
480; KNL_X32-NEXT:    movzbl %bl, %eax
481; KNL_X32-NEXT:    movl %eax, {{[0-9]+}}(%esp)
482; KNL_X32-NEXT:    movl %esi, {{[0-9]+}}(%esp)
483; KNL_X32-NEXT:    movl %edi, (%esp)
484; KNL_X32-NEXT:    calll _test10
485; KNL_X32-NEXT:    xorl %ecx, %ecx
486; KNL_X32-NEXT:    testb $1, %bl
487; KNL_X32-NEXT:    cmovel %ecx, %eax
488; KNL_X32-NEXT:    addl $16, %esp
489; KNL_X32-NEXT:    popl %esi
490; KNL_X32-NEXT:    popl %edi
491; KNL_X32-NEXT:    popl %ebx
492; KNL_X32-NEXT:    retl
493  %cond = call i1 @test11(i32 %a1, i32 %b1)
494  %res = call i32 @test10(i32 %a1, i32 %a2, i1 %cond)
495  %res1 = select i1 %cond, i32 %res, i32 0
496  ret i32 %res1
497}
498