785 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=i686-unknown-unknown -mattr=avx512f | FileCheck %s --check-prefixes=X86,X86-AVX512F3; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=avx512f | FileCheck %s --check-prefixes=X64,X64-AVX512F4; RUN: llc < %s -mtriple=i686-unknown-unknown -mattr=avx512bw | FileCheck %s --check-prefixes=X86,X86-AVX512BW5; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=avx512bw | FileCheck %s --check-prefixes=X64,X64-AVX512BW6 7define <16 x i32> @select00(i32 %a, <16 x i32> %b) nounwind {8; X86-LABEL: select00:9; X86: # %bb.0:10; X86-NEXT: cmpl $255, {{[0-9]+}}(%esp)11; X86-NEXT: vpxor %xmm1, %xmm1, %xmm112; X86-NEXT: je .LBB0_213; X86-NEXT: # %bb.1:14; X86-NEXT: vmovdqa64 %zmm0, %zmm115; X86-NEXT: .LBB0_2:16; X86-NEXT: vpxord %zmm1, %zmm0, %zmm017; X86-NEXT: retl18;19; X64-LABEL: select00:20; X64: # %bb.0:21; X64-NEXT: cmpl $255, %edi22; X64-NEXT: vpxor %xmm1, %xmm1, %xmm123; X64-NEXT: je .LBB0_224; X64-NEXT: # %bb.1:25; X64-NEXT: vmovdqa64 %zmm0, %zmm126; X64-NEXT: .LBB0_2:27; X64-NEXT: vpxord %zmm1, %zmm0, %zmm028; X64-NEXT: retq29 %cmpres = icmp eq i32 %a, 25530 %selres = select i1 %cmpres, <16 x i32> zeroinitializer, <16 x i32> %b31 %res = xor <16 x i32> %b, %selres32 ret <16 x i32> %res33}34 35define <8 x i64> @select01(i32 %a, <8 x i64> %b) nounwind {36; X86-LABEL: select01:37; X86: # %bb.0:38; X86-NEXT: cmpl $255, {{[0-9]+}}(%esp)39; X86-NEXT: vpxor %xmm1, %xmm1, %xmm140; X86-NEXT: je .LBB1_241; X86-NEXT: # %bb.1:42; X86-NEXT: vmovdqa64 %zmm0, %zmm143; X86-NEXT: .LBB1_2:44; X86-NEXT: vpxorq %zmm1, %zmm0, %zmm045; X86-NEXT: retl46;47; X64-LABEL: select01:48; X64: # %bb.0:49; X64-NEXT: cmpl $255, %edi50; X64-NEXT: vpxor %xmm1, %xmm1, %xmm151; X64-NEXT: je .LBB1_252; X64-NEXT: # %bb.1:53; X64-NEXT: vmovdqa64 %zmm0, %zmm154; X64-NEXT: .LBB1_2:55; X64-NEXT: vpxorq %zmm1, %zmm0, %zmm056; X64-NEXT: retq57 %cmpres = icmp eq i32 %a, 25558 %selres = select i1 %cmpres, <8 x i64> zeroinitializer, <8 x i64> %b59 %res = xor <8 x i64> %b, %selres60 ret <8 x i64> %res61}62 63define float @select02(float %a, float %b, float %c, float %eps) {64; X86-LABEL: select02:65; X86: # %bb.0:66; X86-NEXT: vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero67; X86-NEXT: vucomiss {{[0-9]+}}(%esp), %xmm068; X86-NEXT: leal {{[0-9]+}}(%esp), %eax69; X86-NEXT: leal {{[0-9]+}}(%esp), %ecx70; X86-NEXT: cmovael %eax, %ecx71; X86-NEXT: flds (%ecx)72; X86-NEXT: retl73;74; X64-LABEL: select02:75; X64: # %bb.0:76; X64-NEXT: vcmpless %xmm0, %xmm3, %k177; X64-NEXT: vmovss %xmm2, %xmm1, %xmm1 {%k1}78; X64-NEXT: vmovaps %xmm1, %xmm079; X64-NEXT: retq80 %cmp = fcmp oge float %a, %eps81 %cond = select i1 %cmp, float %c, float %b82 ret float %cond83}84 85define double @select03(double %a, double %b, double %c, double %eps) {86; X86-LABEL: select03:87; X86: # %bb.0:88; X86-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero89; X86-NEXT: vucomisd {{[0-9]+}}(%esp), %xmm090; X86-NEXT: leal {{[0-9]+}}(%esp), %eax91; X86-NEXT: leal {{[0-9]+}}(%esp), %ecx92; X86-NEXT: cmovael %eax, %ecx93; X86-NEXT: fldl (%ecx)94; X86-NEXT: retl95;96; X64-LABEL: select03:97; X64: # %bb.0:98; X64-NEXT: vcmplesd %xmm0, %xmm3, %k199; X64-NEXT: vmovsd %xmm2, %xmm1, %xmm1 {%k1}100; X64-NEXT: vmovapd %xmm1, %xmm0101; X64-NEXT: retq102 %cmp = fcmp oge double %a, %eps103 %cond = select i1 %cmp, double %c, double %b104 ret double %cond105}106 107define <16 x double> @select04(<16 x double> %a, <16 x double> %b) {108; X86-LABEL: select04:109; X86: # %bb.0:110; X86-NEXT: pushl %ebp111; X86-NEXT: .cfi_def_cfa_offset 8112; X86-NEXT: .cfi_offset %ebp, -8113; X86-NEXT: movl %esp, %ebp114; X86-NEXT: .cfi_def_cfa_register %ebp115; X86-NEXT: andl $-64, %esp116; X86-NEXT: subl $64, %esp117; X86-NEXT: vmovaps 8(%ebp), %zmm1118; X86-NEXT: movl %ebp, %esp119; X86-NEXT: popl %ebp120; X86-NEXT: .cfi_def_cfa %esp, 4121; X86-NEXT: retl122;123; X64-LABEL: select04:124; X64: # %bb.0:125; X64-NEXT: vmovaps %zmm3, %zmm1126; X64-NEXT: retq127 %sel = select <16 x i1> <i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false>, <16 x double> %a, <16 x double> %b128 ret <16 x double> %sel129}130 131define i8 @select05(i8 %a.0, i8 %m) {132; X86-LABEL: select05:133; X86: # %bb.0:134; X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax135; X86-NEXT: orb {{[0-9]+}}(%esp), %al136; X86-NEXT: retl137;138; X64-LABEL: select05:139; X64: # %bb.0:140; X64-NEXT: movl %edi, %eax141; X64-NEXT: orl %esi, %eax142; X64-NEXT: # kill: def $al killed $al killed $eax143; X64-NEXT: retq144 %mask = bitcast i8 %m to <8 x i1>145 %a = bitcast i8 %a.0 to <8 x i1>146 %r = select <8 x i1> %mask, <8 x i1> <i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1>, <8 x i1> %a147 %res = bitcast <8 x i1> %r to i8148 ret i8 %res;149}150 151define i8 @select05_mem(ptr %a.0, ptr %m) {152; X86-AVX512F-LABEL: select05_mem:153; X86-AVX512F: # %bb.0:154; X86-AVX512F-NEXT: movl {{[0-9]+}}(%esp), %eax155; X86-AVX512F-NEXT: movl {{[0-9]+}}(%esp), %ecx156; X86-AVX512F-NEXT: movzbl (%ecx), %ecx157; X86-AVX512F-NEXT: kmovw %ecx, %k0158; X86-AVX512F-NEXT: movzbl (%eax), %eax159; X86-AVX512F-NEXT: kmovw %eax, %k1160; X86-AVX512F-NEXT: korw %k1, %k0, %k0161; X86-AVX512F-NEXT: kmovw %k0, %eax162; X86-AVX512F-NEXT: # kill: def $al killed $al killed $eax163; X86-AVX512F-NEXT: retl164;165; X64-AVX512F-LABEL: select05_mem:166; X64-AVX512F: # %bb.0:167; X64-AVX512F-NEXT: movzbl (%rsi), %eax168; X64-AVX512F-NEXT: kmovw %eax, %k0169; X64-AVX512F-NEXT: movzbl (%rdi), %eax170; X64-AVX512F-NEXT: kmovw %eax, %k1171; X64-AVX512F-NEXT: korw %k1, %k0, %k0172; X64-AVX512F-NEXT: kmovw %k0, %eax173; X64-AVX512F-NEXT: # kill: def $al killed $al killed $eax174; X64-AVX512F-NEXT: retq175;176; X86-AVX512BW-LABEL: select05_mem:177; X86-AVX512BW: # %bb.0:178; X86-AVX512BW-NEXT: movl {{[0-9]+}}(%esp), %eax179; X86-AVX512BW-NEXT: movl {{[0-9]+}}(%esp), %ecx180; X86-AVX512BW-NEXT: movzbl (%ecx), %ecx181; X86-AVX512BW-NEXT: kmovd %ecx, %k0182; X86-AVX512BW-NEXT: movzbl (%eax), %eax183; X86-AVX512BW-NEXT: kmovd %eax, %k1184; X86-AVX512BW-NEXT: korw %k1, %k0, %k0185; X86-AVX512BW-NEXT: kmovd %k0, %eax186; X86-AVX512BW-NEXT: # kill: def $al killed $al killed $eax187; X86-AVX512BW-NEXT: retl188;189; X64-AVX512BW-LABEL: select05_mem:190; X64-AVX512BW: # %bb.0:191; X64-AVX512BW-NEXT: movzbl (%rsi), %eax192; X64-AVX512BW-NEXT: kmovd %eax, %k0193; X64-AVX512BW-NEXT: movzbl (%rdi), %eax194; X64-AVX512BW-NEXT: kmovd %eax, %k1195; X64-AVX512BW-NEXT: korw %k1, %k0, %k0196; X64-AVX512BW-NEXT: kmovd %k0, %eax197; X64-AVX512BW-NEXT: # kill: def $al killed $al killed $eax198; X64-AVX512BW-NEXT: retq199 %mask = load <8 x i1> , ptr %m200 %a = load <8 x i1> , ptr %a.0201 %r = select <8 x i1> %mask, <8 x i1> <i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1>, <8 x i1> %a202 %res = bitcast <8 x i1> %r to i8203 ret i8 %res;204}205 206define i8 @select06(i8 %a.0, i8 %m) {207; X86-LABEL: select06:208; X86: # %bb.0:209; X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax210; X86-NEXT: andb {{[0-9]+}}(%esp), %al211; X86-NEXT: retl212;213; X64-LABEL: select06:214; X64: # %bb.0:215; X64-NEXT: movl %edi, %eax216; X64-NEXT: andl %esi, %eax217; X64-NEXT: # kill: def $al killed $al killed $eax218; X64-NEXT: retq219 %mask = bitcast i8 %m to <8 x i1>220 %a = bitcast i8 %a.0 to <8 x i1>221 %r = select <8 x i1> %mask, <8 x i1> %a, <8 x i1> zeroinitializer222 %res = bitcast <8 x i1> %r to i8223 ret i8 %res;224}225 226define i8 @select06_mem(ptr %a.0, ptr %m) {227; X86-AVX512F-LABEL: select06_mem:228; X86-AVX512F: # %bb.0:229; X86-AVX512F-NEXT: movl {{[0-9]+}}(%esp), %eax230; X86-AVX512F-NEXT: movl {{[0-9]+}}(%esp), %ecx231; X86-AVX512F-NEXT: movzbl (%ecx), %ecx232; X86-AVX512F-NEXT: kmovw %ecx, %k0233; X86-AVX512F-NEXT: movzbl (%eax), %eax234; X86-AVX512F-NEXT: kmovw %eax, %k1235; X86-AVX512F-NEXT: kandw %k1, %k0, %k0236; X86-AVX512F-NEXT: kmovw %k0, %eax237; X86-AVX512F-NEXT: # kill: def $al killed $al killed $eax238; X86-AVX512F-NEXT: retl239;240; X64-AVX512F-LABEL: select06_mem:241; X64-AVX512F: # %bb.0:242; X64-AVX512F-NEXT: movzbl (%rsi), %eax243; X64-AVX512F-NEXT: kmovw %eax, %k0244; X64-AVX512F-NEXT: movzbl (%rdi), %eax245; X64-AVX512F-NEXT: kmovw %eax, %k1246; X64-AVX512F-NEXT: kandw %k1, %k0, %k0247; X64-AVX512F-NEXT: kmovw %k0, %eax248; X64-AVX512F-NEXT: # kill: def $al killed $al killed $eax249; X64-AVX512F-NEXT: retq250;251; X86-AVX512BW-LABEL: select06_mem:252; X86-AVX512BW: # %bb.0:253; X86-AVX512BW-NEXT: movl {{[0-9]+}}(%esp), %eax254; X86-AVX512BW-NEXT: movl {{[0-9]+}}(%esp), %ecx255; X86-AVX512BW-NEXT: movzbl (%ecx), %ecx256; X86-AVX512BW-NEXT: kmovd %ecx, %k0257; X86-AVX512BW-NEXT: movzbl (%eax), %eax258; X86-AVX512BW-NEXT: kmovd %eax, %k1259; X86-AVX512BW-NEXT: kandw %k1, %k0, %k0260; X86-AVX512BW-NEXT: kmovd %k0, %eax261; X86-AVX512BW-NEXT: # kill: def $al killed $al killed $eax262; X86-AVX512BW-NEXT: retl263;264; X64-AVX512BW-LABEL: select06_mem:265; X64-AVX512BW: # %bb.0:266; X64-AVX512BW-NEXT: movzbl (%rsi), %eax267; X64-AVX512BW-NEXT: kmovd %eax, %k0268; X64-AVX512BW-NEXT: movzbl (%rdi), %eax269; X64-AVX512BW-NEXT: kmovd %eax, %k1270; X64-AVX512BW-NEXT: kandw %k1, %k0, %k0271; X64-AVX512BW-NEXT: kmovd %k0, %eax272; X64-AVX512BW-NEXT: # kill: def $al killed $al killed $eax273; X64-AVX512BW-NEXT: retq274 %mask = load <8 x i1> , ptr %m275 %a = load <8 x i1> , ptr %a.0276 %r = select <8 x i1> %mask, <8 x i1> %a, <8 x i1> zeroinitializer277 %res = bitcast <8 x i1> %r to i8278 ret i8 %res;279}280define i8 @select07(i8 %a.0, i8 %b.0, i8 %m) {281; X86-AVX512F-LABEL: select07:282; X86-AVX512F: # %bb.0:283; X86-AVX512F-NEXT: movzbl {{[0-9]+}}(%esp), %eax284; X86-AVX512F-NEXT: kmovw %eax, %k0285; X86-AVX512F-NEXT: movzbl {{[0-9]+}}(%esp), %eax286; X86-AVX512F-NEXT: kmovw %eax, %k1287; X86-AVX512F-NEXT: movzbl {{[0-9]+}}(%esp), %eax288; X86-AVX512F-NEXT: kmovw %eax, %k2289; X86-AVX512F-NEXT: kandnw %k2, %k0, %k2290; X86-AVX512F-NEXT: kandw %k0, %k1, %k0291; X86-AVX512F-NEXT: korw %k2, %k0, %k0292; X86-AVX512F-NEXT: kmovw %k0, %eax293; X86-AVX512F-NEXT: # kill: def $al killed $al killed $eax294; X86-AVX512F-NEXT: retl295;296; X64-AVX512F-LABEL: select07:297; X64-AVX512F: # %bb.0:298; X64-AVX512F-NEXT: kmovw %edx, %k0299; X64-AVX512F-NEXT: kmovw %edi, %k1300; X64-AVX512F-NEXT: kmovw %esi, %k2301; X64-AVX512F-NEXT: kandnw %k2, %k0, %k2302; X64-AVX512F-NEXT: kandw %k0, %k1, %k0303; X64-AVX512F-NEXT: korw %k2, %k0, %k0304; X64-AVX512F-NEXT: kmovw %k0, %eax305; X64-AVX512F-NEXT: # kill: def $al killed $al killed $eax306; X64-AVX512F-NEXT: retq307;308; X86-AVX512BW-LABEL: select07:309; X86-AVX512BW: # %bb.0:310; X86-AVX512BW-NEXT: movzbl {{[0-9]+}}(%esp), %eax311; X86-AVX512BW-NEXT: kmovd %eax, %k0312; X86-AVX512BW-NEXT: movzbl {{[0-9]+}}(%esp), %eax313; X86-AVX512BW-NEXT: kmovd %eax, %k1314; X86-AVX512BW-NEXT: movzbl {{[0-9]+}}(%esp), %eax315; X86-AVX512BW-NEXT: kmovd %eax, %k2316; X86-AVX512BW-NEXT: kandnw %k2, %k0, %k2317; X86-AVX512BW-NEXT: kandw %k0, %k1, %k0318; X86-AVX512BW-NEXT: korw %k2, %k0, %k0319; X86-AVX512BW-NEXT: kmovd %k0, %eax320; X86-AVX512BW-NEXT: # kill: def $al killed $al killed $eax321; X86-AVX512BW-NEXT: retl322;323; X64-AVX512BW-LABEL: select07:324; X64-AVX512BW: # %bb.0:325; X64-AVX512BW-NEXT: kmovd %edx, %k0326; X64-AVX512BW-NEXT: kmovd %edi, %k1327; X64-AVX512BW-NEXT: kmovd %esi, %k2328; X64-AVX512BW-NEXT: kandnw %k2, %k0, %k2329; X64-AVX512BW-NEXT: kandw %k0, %k1, %k0330; X64-AVX512BW-NEXT: korw %k2, %k0, %k0331; X64-AVX512BW-NEXT: kmovd %k0, %eax332; X64-AVX512BW-NEXT: # kill: def $al killed $al killed $eax333; X64-AVX512BW-NEXT: retq334 %mask = bitcast i8 %m to <8 x i1>335 %a = bitcast i8 %a.0 to <8 x i1>336 %b = bitcast i8 %b.0 to <8 x i1>337 %r = select <8 x i1> %mask, <8 x i1> %a, <8 x i1> %b338 %res = bitcast <8 x i1> %r to i8339 ret i8 %res;340}341 342define i64 @pr30249() {343; X86-LABEL: pr30249:344; X86: # %bb.0:345; X86-NEXT: movl $1, %eax346; X86-NEXT: xorl %edx, %edx347; X86-NEXT: retl348;349; X64-LABEL: pr30249:350; X64: # %bb.0:351; X64-NEXT: movl $1, %eax352; X64-NEXT: retq353 %v = select i1 undef , i64 1, i64 2354 ret i64 %v355}356 357define double @pr30561_f64(double %b, double %a, i1 %c) {358; X86-LABEL: pr30561_f64:359; X86: # %bb.0:360; X86-NEXT: testb $1, {{[0-9]+}}(%esp)361; X86-NEXT: leal {{[0-9]+}}(%esp), %eax362; X86-NEXT: leal {{[0-9]+}}(%esp), %ecx363; X86-NEXT: cmovnel %eax, %ecx364; X86-NEXT: fldl (%ecx)365; X86-NEXT: retl366;367; X64-AVX512F-LABEL: pr30561_f64:368; X64-AVX512F: # %bb.0:369; X64-AVX512F-NEXT: kmovw %edi, %k1370; X64-AVX512F-NEXT: vmovsd %xmm1, %xmm0, %xmm0 {%k1}371; X64-AVX512F-NEXT: retq372;373; X64-AVX512BW-LABEL: pr30561_f64:374; X64-AVX512BW: # %bb.0:375; X64-AVX512BW-NEXT: kmovd %edi, %k1376; X64-AVX512BW-NEXT: vmovsd %xmm1, %xmm0, %xmm0 {%k1}377; X64-AVX512BW-NEXT: retq378 %cond = select i1 %c, double %a, double %b379 ret double %cond380}381 382define float @pr30561_f32(float %b, float %a, i1 %c) {383; X86-LABEL: pr30561_f32:384; X86: # %bb.0:385; X86-NEXT: testb $1, {{[0-9]+}}(%esp)386; X86-NEXT: leal {{[0-9]+}}(%esp), %eax387; X86-NEXT: leal {{[0-9]+}}(%esp), %ecx388; X86-NEXT: cmovnel %eax, %ecx389; X86-NEXT: flds (%ecx)390; X86-NEXT: retl391;392; X64-AVX512F-LABEL: pr30561_f32:393; X64-AVX512F: # %bb.0:394; X64-AVX512F-NEXT: kmovw %edi, %k1395; X64-AVX512F-NEXT: vmovss %xmm1, %xmm0, %xmm0 {%k1}396; X64-AVX512F-NEXT: retq397;398; X64-AVX512BW-LABEL: pr30561_f32:399; X64-AVX512BW: # %bb.0:400; X64-AVX512BW-NEXT: kmovd %edi, %k1401; X64-AVX512BW-NEXT: vmovss %xmm1, %xmm0, %xmm0 {%k1}402; X64-AVX512BW-NEXT: retq403 %cond = select i1 %c, float %a, float %b404 ret float %cond405}406 407define <16 x i16> @pr31515(<16 x i1> %a, <16 x i1> %b, <16 x i16> %c) nounwind {408; X86-AVX512F-LABEL: pr31515:409; X86-AVX512F: # %bb.0:410; X86-AVX512F-NEXT: vpand %xmm1, %xmm0, %xmm0411; X86-AVX512F-NEXT: vpmovzxbw {{.*#+}} 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,xmm0[8],zero,xmm0[9],zero,xmm0[10],zero,xmm0[11],zero,xmm0[12],zero,xmm0[13],zero,xmm0[14],zero,xmm0[15],zero412; X86-AVX512F-NEXT: vpsllw $15, %ymm0, %ymm0413; X86-AVX512F-NEXT: vpsraw $15, %ymm0, %ymm0414; X86-AVX512F-NEXT: vpandn %ymm2, %ymm0, %ymm0415; X86-AVX512F-NEXT: retl416;417; X64-AVX512F-LABEL: pr31515:418; X64-AVX512F: # %bb.0:419; X64-AVX512F-NEXT: vpand %xmm1, %xmm0, %xmm0420; X64-AVX512F-NEXT: vpmovzxbw {{.*#+}} 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,xmm0[8],zero,xmm0[9],zero,xmm0[10],zero,xmm0[11],zero,xmm0[12],zero,xmm0[13],zero,xmm0[14],zero,xmm0[15],zero421; X64-AVX512F-NEXT: vpsllw $15, %ymm0, %ymm0422; X64-AVX512F-NEXT: vpsraw $15, %ymm0, %ymm0423; X64-AVX512F-NEXT: vpandn %ymm2, %ymm0, %ymm0424; X64-AVX512F-NEXT: retq425;426; X86-AVX512BW-LABEL: pr31515:427; X86-AVX512BW: # %bb.0:428; X86-AVX512BW-NEXT: # kill: def $ymm2 killed $ymm2 def $zmm2429; X86-AVX512BW-NEXT: vpand %xmm1, %xmm0, %xmm0430; X86-AVX512BW-NEXT: vpsllw $7, %xmm0, %xmm0431; X86-AVX512BW-NEXT: vpmovb2m %zmm0, %k0432; X86-AVX512BW-NEXT: knotw %k0, %k1433; X86-AVX512BW-NEXT: vmovdqu16 %zmm2, %zmm0 {%k1} {z}434; X86-AVX512BW-NEXT: # kill: def $ymm0 killed $ymm0 killed $zmm0435; X86-AVX512BW-NEXT: retl436;437; X64-AVX512BW-LABEL: pr31515:438; X64-AVX512BW: # %bb.0:439; X64-AVX512BW-NEXT: # kill: def $ymm2 killed $ymm2 def $zmm2440; X64-AVX512BW-NEXT: vpand %xmm1, %xmm0, %xmm0441; X64-AVX512BW-NEXT: vpsllw $7, %xmm0, %xmm0442; X64-AVX512BW-NEXT: vpmovb2m %zmm0, %k0443; X64-AVX512BW-NEXT: knotw %k0, %k1444; X64-AVX512BW-NEXT: vmovdqu16 %zmm2, %zmm0 {%k1} {z}445; X64-AVX512BW-NEXT: # kill: def $ymm0 killed $ymm0 killed $zmm0446; X64-AVX512BW-NEXT: retq447 %mask = and <16 x i1> %a, %b448 %res = select <16 x i1> %mask, <16 x i16> zeroinitializer, <16 x i16> %c449 ret <16 x i16> %res450}451 452define <32 x i16> @pr42355_v32i16(i1 %c, <32 x i16> %x, <32 x i16> %y) {453; X86-LABEL: pr42355_v32i16:454; X86: # %bb.0:455; X86-NEXT: testb $1, {{[0-9]+}}(%esp)456; X86-NEXT: jne .LBB14_2457; X86-NEXT: # %bb.1:458; X86-NEXT: vmovaps %zmm1, %zmm0459; X86-NEXT: .LBB14_2:460; X86-NEXT: retl461;462; X64-LABEL: pr42355_v32i16:463; X64: # %bb.0:464; X64-NEXT: testb $1, %dil465; X64-NEXT: jne .LBB14_2466; X64-NEXT: # %bb.1:467; X64-NEXT: vmovaps %zmm1, %zmm0468; X64-NEXT: .LBB14_2:469; X64-NEXT: retq470 %a = select i1 %c, <32 x i16> %x, <32 x i16> %y471 ret <32 x i16> %a472}473 474define <64 x i8> @pr42355_v64i8(i1 %c, <64 x i8> %x, <64 x i8> %y) {475; X86-LABEL: pr42355_v64i8:476; X86: # %bb.0:477; X86-NEXT: testb $1, {{[0-9]+}}(%esp)478; X86-NEXT: jne .LBB15_2479; X86-NEXT: # %bb.1:480; X86-NEXT: vmovaps %zmm1, %zmm0481; X86-NEXT: .LBB15_2:482; X86-NEXT: retl483;484; X64-LABEL: pr42355_v64i8:485; X64: # %bb.0:486; X64-NEXT: testb $1, %dil487; X64-NEXT: jne .LBB15_2488; X64-NEXT: # %bb.1:489; X64-NEXT: vmovaps %zmm1, %zmm0490; X64-NEXT: .LBB15_2:491; X64-NEXT: retq492 %a = select i1 %c, <64 x i8> %x, <64 x i8> %y493 ret <64 x i8> %a494}495 496; This would crash because AVX512 has legal vector select497; condition values that are not 256/512-bit vectors.498 499define <16 x i64> @narrowExtractedVectorSelect_crash(<16 x i64> %arg, <16 x i16> %arg1) #0 {500; X86-AVX512F-LABEL: narrowExtractedVectorSelect_crash:501; X86-AVX512F: # %bb.0:502; X86-AVX512F-NEXT: vptestmq %zmm0, %zmm0, %k0503; X86-AVX512F-NEXT: vptestmq %zmm1, %zmm1, %k1504; X86-AVX512F-NEXT: kunpckbw %k0, %k1, %k1505; X86-AVX512F-NEXT: vpternlogd {{.*#+}} zmm0 {%k1} {z} = -1506; X86-AVX512F-NEXT: vpmovdw %zmm0, %ymm0507; X86-AVX512F-NEXT: vpand %ymm2, %ymm0, %ymm1508; X86-AVX512F-NEXT: vpmovzxwq {{.*#+}} zmm0 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero,xmm1[2],zero,zero,zero,xmm1[3],zero,zero,zero,xmm1[4],zero,zero,zero,xmm1[5],zero,zero,zero,xmm1[6],zero,zero,zero,xmm1[7],zero,zero,zero509; X86-AVX512F-NEXT: vextracti128 $1, %ymm1, %xmm1510; X86-AVX512F-NEXT: vpmovzxwq {{.*#+}} zmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero,xmm1[2],zero,zero,zero,xmm1[3],zero,zero,zero,xmm1[4],zero,zero,zero,xmm1[5],zero,zero,zero,xmm1[6],zero,zero,zero,xmm1[7],zero,zero,zero511; X86-AVX512F-NEXT: retl512;513; X64-AVX512F-LABEL: narrowExtractedVectorSelect_crash:514; X64-AVX512F: # %bb.0:515; X64-AVX512F-NEXT: vptestmq %zmm0, %zmm0, %k0516; X64-AVX512F-NEXT: vptestmq %zmm1, %zmm1, %k1517; X64-AVX512F-NEXT: kunpckbw %k0, %k1, %k1518; X64-AVX512F-NEXT: vpternlogd {{.*#+}} zmm0 {%k1} {z} = -1519; X64-AVX512F-NEXT: vpmovdw %zmm0, %ymm0520; X64-AVX512F-NEXT: vpand %ymm2, %ymm0, %ymm1521; X64-AVX512F-NEXT: vpmovzxwq {{.*#+}} zmm0 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero,xmm1[2],zero,zero,zero,xmm1[3],zero,zero,zero,xmm1[4],zero,zero,zero,xmm1[5],zero,zero,zero,xmm1[6],zero,zero,zero,xmm1[7],zero,zero,zero522; X64-AVX512F-NEXT: vextracti128 $1, %ymm1, %xmm1523; X64-AVX512F-NEXT: vpmovzxwq {{.*#+}} zmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero,xmm1[2],zero,zero,zero,xmm1[3],zero,zero,zero,xmm1[4],zero,zero,zero,xmm1[5],zero,zero,zero,xmm1[6],zero,zero,zero,xmm1[7],zero,zero,zero524; X64-AVX512F-NEXT: retq525;526; X86-AVX512BW-LABEL: narrowExtractedVectorSelect_crash:527; X86-AVX512BW: # %bb.0:528; X86-AVX512BW-NEXT: # kill: def $ymm2 killed $ymm2 def $zmm2529; X86-AVX512BW-NEXT: vptestmq %zmm0, %zmm0, %k0530; X86-AVX512BW-NEXT: vptestmq %zmm1, %zmm1, %k1531; X86-AVX512BW-NEXT: kunpckbw %k0, %k1, %k1532; X86-AVX512BW-NEXT: vmovdqu16 %zmm2, %zmm1 {%k1} {z}533; X86-AVX512BW-NEXT: vpmovzxwq {{.*#+}} zmm0 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero,xmm1[2],zero,zero,zero,xmm1[3],zero,zero,zero,xmm1[4],zero,zero,zero,xmm1[5],zero,zero,zero,xmm1[6],zero,zero,zero,xmm1[7],zero,zero,zero534; X86-AVX512BW-NEXT: vextracti128 $1, %ymm1, %xmm1535; X86-AVX512BW-NEXT: vpmovzxwq {{.*#+}} zmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero,xmm1[2],zero,zero,zero,xmm1[3],zero,zero,zero,xmm1[4],zero,zero,zero,xmm1[5],zero,zero,zero,xmm1[6],zero,zero,zero,xmm1[7],zero,zero,zero536; X86-AVX512BW-NEXT: retl537;538; X64-AVX512BW-LABEL: narrowExtractedVectorSelect_crash:539; X64-AVX512BW: # %bb.0:540; X64-AVX512BW-NEXT: # kill: def $ymm2 killed $ymm2 def $zmm2541; X64-AVX512BW-NEXT: vptestmq %zmm0, %zmm0, %k0542; X64-AVX512BW-NEXT: vptestmq %zmm1, %zmm1, %k1543; X64-AVX512BW-NEXT: kunpckbw %k0, %k1, %k1544; X64-AVX512BW-NEXT: vmovdqu16 %zmm2, %zmm1 {%k1} {z}545; X64-AVX512BW-NEXT: vpmovzxwq {{.*#+}} zmm0 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero,xmm1[2],zero,zero,zero,xmm1[3],zero,zero,zero,xmm1[4],zero,zero,zero,xmm1[5],zero,zero,zero,xmm1[6],zero,zero,zero,xmm1[7],zero,zero,zero546; X64-AVX512BW-NEXT: vextracti128 $1, %ymm1, %xmm1547; X64-AVX512BW-NEXT: vpmovzxwq {{.*#+}} zmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero,xmm1[2],zero,zero,zero,xmm1[3],zero,zero,zero,xmm1[4],zero,zero,zero,xmm1[5],zero,zero,zero,xmm1[6],zero,zero,zero,xmm1[7],zero,zero,zero548; X64-AVX512BW-NEXT: retq549 %tmp = icmp ne <16 x i64> %arg, zeroinitializer550 %tmp2 = select <16 x i1> %tmp, <16 x i16> %arg1, <16 x i16> zeroinitializer551 %tmp3 = zext <16 x i16> %tmp2 to <16 x i64>552 ret <16 x i64> %tmp3553}554 555define void @vselect_v1i1(ptr %w, ptr %x, ptr %y) nounwind {556; X86-AVX512F-LABEL: vselect_v1i1:557; X86-AVX512F: # %bb.0:558; X86-AVX512F-NEXT: pushl %esi559; X86-AVX512F-NEXT: movl {{[0-9]+}}(%esp), %ecx560; X86-AVX512F-NEXT: movl {{[0-9]+}}(%esp), %edx561; X86-AVX512F-NEXT: movl {{[0-9]+}}(%esp), %eax562; X86-AVX512F-NEXT: movzbl (%eax), %esi563; X86-AVX512F-NEXT: kmovw %esi, %k0564; X86-AVX512F-NEXT: movzbl (%edx), %edx565; X86-AVX512F-NEXT: kmovw %edx, %k1566; X86-AVX512F-NEXT: movzbl (%ecx), %ecx567; X86-AVX512F-NEXT: kmovw %ecx, %k2568; X86-AVX512F-NEXT: kandnw %k1, %k2, %k1569; X86-AVX512F-NEXT: kandw %k2, %k0, %k0570; X86-AVX512F-NEXT: korw %k1, %k0, %k0571; X86-AVX512F-NEXT: kshiftlw $15, %k0, %k0572; X86-AVX512F-NEXT: kshiftrw $15, %k0, %k0573; X86-AVX512F-NEXT: kmovw %k0, %ecx574; X86-AVX512F-NEXT: movb %cl, (%eax)575; X86-AVX512F-NEXT: popl %esi576; X86-AVX512F-NEXT: retl577;578; X64-AVX512F-LABEL: vselect_v1i1:579; X64-AVX512F: # %bb.0:580; X64-AVX512F-NEXT: movzbl (%rsi), %eax581; X64-AVX512F-NEXT: kmovw %eax, %k0582; X64-AVX512F-NEXT: movzbl (%rdx), %eax583; X64-AVX512F-NEXT: kmovw %eax, %k1584; X64-AVX512F-NEXT: movzbl (%rdi), %eax585; X64-AVX512F-NEXT: kmovw %eax, %k2586; X64-AVX512F-NEXT: kandnw %k1, %k2, %k1587; X64-AVX512F-NEXT: kandw %k2, %k0, %k0588; X64-AVX512F-NEXT: korw %k1, %k0, %k0589; X64-AVX512F-NEXT: kshiftlw $15, %k0, %k0590; X64-AVX512F-NEXT: kshiftrw $15, %k0, %k0591; X64-AVX512F-NEXT: kmovw %k0, %eax592; X64-AVX512F-NEXT: movb %al, (%rsi)593; X64-AVX512F-NEXT: retq594;595; X86-AVX512BW-LABEL: vselect_v1i1:596; X86-AVX512BW: # %bb.0:597; X86-AVX512BW-NEXT: pushl %esi598; X86-AVX512BW-NEXT: movl {{[0-9]+}}(%esp), %ecx599; X86-AVX512BW-NEXT: movl {{[0-9]+}}(%esp), %edx600; X86-AVX512BW-NEXT: movl {{[0-9]+}}(%esp), %eax601; X86-AVX512BW-NEXT: movzbl (%eax), %esi602; X86-AVX512BW-NEXT: kmovd %esi, %k0603; X86-AVX512BW-NEXT: movzbl (%edx), %edx604; X86-AVX512BW-NEXT: kmovd %edx, %k1605; X86-AVX512BW-NEXT: movzbl (%ecx), %ecx606; X86-AVX512BW-NEXT: kmovd %ecx, %k2607; X86-AVX512BW-NEXT: kandnw %k1, %k2, %k1608; X86-AVX512BW-NEXT: kandw %k2, %k0, %k0609; X86-AVX512BW-NEXT: korw %k1, %k0, %k0610; X86-AVX512BW-NEXT: kshiftlw $15, %k0, %k0611; X86-AVX512BW-NEXT: kshiftrw $15, %k0, %k0612; X86-AVX512BW-NEXT: kmovd %k0, %ecx613; X86-AVX512BW-NEXT: movb %cl, (%eax)614; X86-AVX512BW-NEXT: popl %esi615; X86-AVX512BW-NEXT: retl616;617; X64-AVX512BW-LABEL: vselect_v1i1:618; X64-AVX512BW: # %bb.0:619; X64-AVX512BW-NEXT: movzbl (%rsi), %eax620; X64-AVX512BW-NEXT: kmovd %eax, %k0621; X64-AVX512BW-NEXT: movzbl (%rdx), %eax622; X64-AVX512BW-NEXT: kmovd %eax, %k1623; X64-AVX512BW-NEXT: movzbl (%rdi), %eax624; X64-AVX512BW-NEXT: kmovd %eax, %k2625; X64-AVX512BW-NEXT: kandnw %k1, %k2, %k1626; X64-AVX512BW-NEXT: kandw %k2, %k0, %k0627; X64-AVX512BW-NEXT: korw %k1, %k0, %k0628; X64-AVX512BW-NEXT: kshiftlw $15, %k0, %k0629; X64-AVX512BW-NEXT: kshiftrw $15, %k0, %k0630; X64-AVX512BW-NEXT: kmovd %k0, %eax631; X64-AVX512BW-NEXT: movb %al, (%rsi)632; X64-AVX512BW-NEXT: retq633 %a = load <1 x i1>, ptr %x634 %b = load <1 x i1>, ptr %y635 %b2 = load <1 x i1>, ptr %w636 %c = select <1 x i1> %b2, <1 x i1> %a, <1 x i1> %b637 store <1 x i1> %c, ptr %x638 ret void639}640 641; Scalar condition with v1i1 operands642define void @select_v1i1(ptr %w, ptr %x, ptr %y, i1 %z) nounwind {643; X86-AVX512F-LABEL: select_v1i1:644; X86-AVX512F: # %bb.0:645; X86-AVX512F-NEXT: movl {{[0-9]+}}(%esp), %eax646; X86-AVX512F-NEXT: testb $1, {{[0-9]+}}(%esp)647; X86-AVX512F-NEXT: jne .LBB18_1648; X86-AVX512F-NEXT: # %bb.2:649; X86-AVX512F-NEXT: movl {{[0-9]+}}(%esp), %ecx650; X86-AVX512F-NEXT: movl {{[0-9]+}}(%esp), %edx651; X86-AVX512F-NEXT: movzbl (%edx), %edx652; X86-AVX512F-NEXT: kmovw %edx, %k0653; X86-AVX512F-NEXT: movzbl (%ecx), %ecx654; X86-AVX512F-NEXT: kmovw %ecx, %k1655; X86-AVX512F-NEXT: kxorw %k1, %k0, %k0656; X86-AVX512F-NEXT: jmp .LBB18_3657; X86-AVX512F-NEXT: .LBB18_1:658; X86-AVX512F-NEXT: movzbl (%eax), %ecx659; X86-AVX512F-NEXT: kmovw %ecx, %k0660; X86-AVX512F-NEXT: .LBB18_3:661; X86-AVX512F-NEXT: kshiftlw $15, %k0, %k0662; X86-AVX512F-NEXT: kshiftrw $15, %k0, %k0663; X86-AVX512F-NEXT: kmovw %k0, %ecx664; X86-AVX512F-NEXT: movb %cl, (%eax)665; X86-AVX512F-NEXT: retl666;667; X64-AVX512F-LABEL: select_v1i1:668; X64-AVX512F: # %bb.0:669; X64-AVX512F-NEXT: testb $1, %cl670; X64-AVX512F-NEXT: jne .LBB18_1671; X64-AVX512F-NEXT: # %bb.2:672; X64-AVX512F-NEXT: movzbl (%rdx), %eax673; X64-AVX512F-NEXT: kmovw %eax, %k0674; X64-AVX512F-NEXT: movzbl (%rdi), %eax675; X64-AVX512F-NEXT: kmovw %eax, %k1676; X64-AVX512F-NEXT: kxorw %k1, %k0, %k0677; X64-AVX512F-NEXT: jmp .LBB18_3678; X64-AVX512F-NEXT: .LBB18_1:679; X64-AVX512F-NEXT: movzbl (%rsi), %eax680; X64-AVX512F-NEXT: kmovw %eax, %k0681; X64-AVX512F-NEXT: .LBB18_3:682; X64-AVX512F-NEXT: kshiftlw $15, %k0, %k0683; X64-AVX512F-NEXT: kshiftrw $15, %k0, %k0684; X64-AVX512F-NEXT: kmovw %k0, %eax685; X64-AVX512F-NEXT: movb %al, (%rsi)686; X64-AVX512F-NEXT: retq687;688; X86-AVX512BW-LABEL: select_v1i1:689; X86-AVX512BW: # %bb.0:690; X86-AVX512BW-NEXT: movl {{[0-9]+}}(%esp), %eax691; X86-AVX512BW-NEXT: testb $1, {{[0-9]+}}(%esp)692; X86-AVX512BW-NEXT: jne .LBB18_1693; X86-AVX512BW-NEXT: # %bb.2:694; X86-AVX512BW-NEXT: movl {{[0-9]+}}(%esp), %ecx695; X86-AVX512BW-NEXT: movl {{[0-9]+}}(%esp), %edx696; X86-AVX512BW-NEXT: movzbl (%edx), %edx697; X86-AVX512BW-NEXT: kmovd %edx, %k0698; X86-AVX512BW-NEXT: movzbl (%ecx), %ecx699; X86-AVX512BW-NEXT: kmovd %ecx, %k1700; X86-AVX512BW-NEXT: kxorw %k1, %k0, %k0701; X86-AVX512BW-NEXT: jmp .LBB18_3702; X86-AVX512BW-NEXT: .LBB18_1:703; X86-AVX512BW-NEXT: movzbl (%eax), %ecx704; X86-AVX512BW-NEXT: kmovd %ecx, %k0705; X86-AVX512BW-NEXT: .LBB18_3:706; X86-AVX512BW-NEXT: kshiftlw $15, %k0, %k0707; X86-AVX512BW-NEXT: kshiftrw $15, %k0, %k0708; X86-AVX512BW-NEXT: kmovd %k0, %ecx709; X86-AVX512BW-NEXT: movb %cl, (%eax)710; X86-AVX512BW-NEXT: retl711;712; X64-AVX512BW-LABEL: select_v1i1:713; X64-AVX512BW: # %bb.0:714; X64-AVX512BW-NEXT: testb $1, %cl715; X64-AVX512BW-NEXT: jne .LBB18_1716; X64-AVX512BW-NEXT: # %bb.2:717; X64-AVX512BW-NEXT: movzbl (%rdx), %eax718; X64-AVX512BW-NEXT: kmovd %eax, %k0719; X64-AVX512BW-NEXT: movzbl (%rdi), %eax720; X64-AVX512BW-NEXT: kmovd %eax, %k1721; X64-AVX512BW-NEXT: kxorw %k1, %k0, %k0722; X64-AVX512BW-NEXT: jmp .LBB18_3723; X64-AVX512BW-NEXT: .LBB18_1:724; X64-AVX512BW-NEXT: movzbl (%rsi), %eax725; X64-AVX512BW-NEXT: kmovd %eax, %k0726; X64-AVX512BW-NEXT: .LBB18_3:727; X64-AVX512BW-NEXT: kshiftlw $15, %k0, %k0728; X64-AVX512BW-NEXT: kshiftrw $15, %k0, %k0729; X64-AVX512BW-NEXT: kmovd %k0, %eax730; X64-AVX512BW-NEXT: movb %al, (%rsi)731; X64-AVX512BW-NEXT: retq732 %a = load <1 x i1>, ptr %x733 %b = load <1 x i1>, ptr %y734 %b2 = load <1 x i1>, ptr %w735 %b3 = xor <1 x i1> %b, %b2736 %c = select i1 %z, <1 x i1> %a, <1 x i1> %b3737 store <1 x i1> %c, ptr %x738 ret void739}740 741; Regression test from https://github.com/JuliaLang/julia/issues/36955742define i8 @julia_issue36955(<8 x i1> %mask, <8 x double> %a) {743; X86-AVX512F-LABEL: julia_issue36955:744; X86-AVX512F: # %bb.0:745; X86-AVX512F-NEXT: vxorpd %xmm0, %xmm0, %xmm0746; X86-AVX512F-NEXT: vcmplepd %zmm0, %zmm1, %k0747; X86-AVX512F-NEXT: kmovw %k0, %eax748; X86-AVX512F-NEXT: # kill: def $al killed $al killed $eax749; X86-AVX512F-NEXT: vzeroupper750; X86-AVX512F-NEXT: retl751;752; X64-AVX512F-LABEL: julia_issue36955:753; X64-AVX512F: # %bb.0:754; X64-AVX512F-NEXT: vxorpd %xmm0, %xmm0, %xmm0755; X64-AVX512F-NEXT: vcmplepd %zmm0, %zmm1, %k0756; X64-AVX512F-NEXT: kmovw %k0, %eax757; X64-AVX512F-NEXT: # kill: def $al killed $al killed $eax758; X64-AVX512F-NEXT: vzeroupper759; X64-AVX512F-NEXT: retq760;761; X86-AVX512BW-LABEL: julia_issue36955:762; X86-AVX512BW: # %bb.0:763; X86-AVX512BW-NEXT: vxorpd %xmm0, %xmm0, %xmm0764; X86-AVX512BW-NEXT: vcmplepd %zmm0, %zmm1, %k0765; X86-AVX512BW-NEXT: kmovd %k0, %eax766; X86-AVX512BW-NEXT: # kill: def $al killed $al killed $eax767; X86-AVX512BW-NEXT: vzeroupper768; X86-AVX512BW-NEXT: retl769;770; X64-AVX512BW-LABEL: julia_issue36955:771; X64-AVX512BW: # %bb.0:772; X64-AVX512BW-NEXT: vxorpd %xmm0, %xmm0, %xmm0773; X64-AVX512BW-NEXT: vcmplepd %zmm0, %zmm1, %k0774; X64-AVX512BW-NEXT: kmovd %k0, %eax775; X64-AVX512BW-NEXT: # kill: def $al killed $al killed $eax776; X64-AVX512BW-NEXT: vzeroupper777; X64-AVX512BW-NEXT: retq778 %fcmp = fcmp ugt <8 x double> %a, zeroinitializer779 %xor = xor <8 x i1> %fcmp, <i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true>780 %select1 = select <8 x i1> %fcmp, <8 x i1> zeroinitializer, <8 x i1> %mask781 %select2 = select <8 x i1> %xor, <8 x i1> <i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true>, <8 x i1> %select1782 %ret = bitcast <8 x i1> %select2 to i8783 ret i8 %ret784}785