brintos

brintos / llvm-project-archived public Read only

0
0
Text · 56.5 KiB · c33776d Raw
1034 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=i686-unknown -mattr=+avx512f | FileCheck %s --check-prefixes=CHECK,X86,X86-AVX512F3; RUN: llc < %s -mtriple=i686-unknown -mattr=+avx512bw | FileCheck %s --check-prefixes=CHECK,X86,X86-AVX512BW4; RUN: llc < %s -mtriple=x86_64-unknown -mattr=+avx512f | FileCheck %s --check-prefixes=CHECK,X64,X64-AVX512F5; RUN: llc < %s -mtriple=x86_64-unknown -mattr=+avx512bw | FileCheck %s --check-prefixes=CHECK,X64,X64-AVX512BW6 7declare <16 x float> @llvm.x86.avx512.mask.vpermilvar.ps.512(<16 x float>, <16 x i32>, <16 x float>, i16)8 9declare <8 x double> @llvm.x86.avx512.permvar.df.512(<8 x double>, <8 x i64>)10declare <8 x i64> @llvm.x86.avx512.permvar.di.512(<8 x i64>, <8 x i64>)11declare <16 x i32> @llvm.x86.avx512.permvar.si.512(<16 x i32>, <16 x i32>)12 13declare <8 x double> @llvm.x86.avx512.maskz.vpermt2var.pd.512(<8 x i64>, <8 x double>, <8 x double>, i8)14declare <16 x float> @llvm.x86.avx512.maskz.vpermt2var.ps.512(<16 x i32>, <16 x float>, <16 x float>, i16)15 16declare <8 x i64> @llvm.x86.avx512.maskz.vpermt2var.q.512(<8 x i64>, <8 x i64>, <8 x i64>, i8)17declare <16 x i32> @llvm.x86.avx512.maskz.vpermt2var.d.512(<16 x i32>, <16 x i32>, <16 x i32>, i16)18 19declare <8 x double> @llvm.x86.avx512.mask.vpermi2var.pd.512(<8 x double>, <8 x i64>, <8 x double>, i8)20declare <16 x float> @llvm.x86.avx512.mask.vpermi2var.ps.512(<16 x float>, <16 x i32>, <16 x float>, i16)21 22declare <8 x i64> @llvm.x86.avx512.mask.vpermi2var.q.512(<8 x i64>, <8 x i64>, <8 x i64>, i8)23declare <16 x i32> @llvm.x86.avx512.mask.vpermi2var.d.512(<16 x i32>, <16 x i32>, <16 x i32>, i16)24 25define <8 x double> @combine_permvar_8f64_identity(<8 x double> %x0, <8 x double> %x1) {26; CHECK-LABEL: combine_permvar_8f64_identity:27; CHECK:       # %bb.0:28; CHECK-NEXT:    ret{{[l|q]}}29  %1 = call <8 x double> @llvm.x86.avx512.permvar.df.512(<8 x double> %x0, <8 x i64> <i64 7, i64 6, i64 5, i64 4, i64 3, i64 2, i64 1, i64 0>)30  %2 = call <8 x double> @llvm.x86.avx512.permvar.df.512(<8 x double> %1, <8 x i64> <i64 7, i64 14, i64 5, i64 12, i64 3, i64 10, i64 1, i64 8>)31  ret <8 x double> %232}33define <8 x double> @combine_permvar_8f64_identity_mask(<8 x double> %x0, <8 x double> %x1, i8 %m) {34; X86-AVX512F-LABEL: combine_permvar_8f64_identity_mask:35; X86-AVX512F:       # %bb.0:36; X86-AVX512F-NEXT:    vpmovsxbq {{.*#+}} zmm2 = [7,6,5,4,3,2,1,0]37; X86-AVX512F-NEXT:    movzbl {{[0-9]+}}(%esp), %eax38; X86-AVX512F-NEXT:    kmovw %eax, %k139; X86-AVX512F-NEXT:    vpermpd %zmm0, %zmm2, %zmm1 {%k1}40; X86-AVX512F-NEXT:    vpmovsxbq {{.*#+}} zmm0 = [7,14,5,12,3,10,1,8]41; X86-AVX512F-NEXT:    vpermpd %zmm1, %zmm0, %zmm1 {%k1}42; X86-AVX512F-NEXT:    vmovapd %zmm1, %zmm043; X86-AVX512F-NEXT:    retl44;45; X86-AVX512BW-LABEL: combine_permvar_8f64_identity_mask:46; X86-AVX512BW:       # %bb.0:47; X86-AVX512BW-NEXT:    vpmovsxbq {{.*#+}} zmm2 = [7,6,5,4,3,2,1,0]48; X86-AVX512BW-NEXT:    movzbl {{[0-9]+}}(%esp), %eax49; X86-AVX512BW-NEXT:    kmovd %eax, %k150; X86-AVX512BW-NEXT:    vpermpd %zmm0, %zmm2, %zmm1 {%k1}51; X86-AVX512BW-NEXT:    vpmovsxbq {{.*#+}} zmm0 = [7,14,5,12,3,10,1,8]52; X86-AVX512BW-NEXT:    vpermpd %zmm1, %zmm0, %zmm1 {%k1}53; X86-AVX512BW-NEXT:    vmovapd %zmm1, %zmm054; X86-AVX512BW-NEXT:    retl55;56; X64-AVX512F-LABEL: combine_permvar_8f64_identity_mask:57; X64-AVX512F:       # %bb.0:58; X64-AVX512F-NEXT:    vpmovsxbq {{.*#+}} zmm2 = [7,6,5,4,3,2,1,0]59; X64-AVX512F-NEXT:    kmovw %edi, %k160; X64-AVX512F-NEXT:    vpermpd %zmm0, %zmm2, %zmm1 {%k1}61; X64-AVX512F-NEXT:    vpmovsxbq {{.*#+}} zmm0 = [7,14,5,12,3,10,1,8]62; X64-AVX512F-NEXT:    vpermpd %zmm1, %zmm0, %zmm1 {%k1}63; X64-AVX512F-NEXT:    vmovapd %zmm1, %zmm064; X64-AVX512F-NEXT:    retq65;66; X64-AVX512BW-LABEL: combine_permvar_8f64_identity_mask:67; X64-AVX512BW:       # %bb.0:68; X64-AVX512BW-NEXT:    vpmovsxbq {{.*#+}} zmm2 = [7,6,5,4,3,2,1,0]69; X64-AVX512BW-NEXT:    kmovd %edi, %k170; X64-AVX512BW-NEXT:    vpermpd %zmm0, %zmm2, %zmm1 {%k1}71; X64-AVX512BW-NEXT:    vpmovsxbq {{.*#+}} zmm0 = [7,14,5,12,3,10,1,8]72; X64-AVX512BW-NEXT:    vpermpd %zmm1, %zmm0, %zmm1 {%k1}73; X64-AVX512BW-NEXT:    vmovapd %zmm1, %zmm074; X64-AVX512BW-NEXT:    retq75  %1 = call <8 x double> @llvm.x86.avx512.permvar.df.512(<8 x double> %x0, <8 x i64> <i64 7, i64 6, i64 5, i64 4, i64 3, i64 2, i64 1, i64 0>)76  %2 = bitcast i8 %m to <8 x i1>77  %3 = select <8 x i1> %2, <8 x double> %1, <8 x double> %x178  %4 = call <8 x double> @llvm.x86.avx512.permvar.df.512(<8 x double> %3, <8 x i64> <i64 7, i64 14, i64 5, i64 12, i64 3, i64 10, i64 1, i64 8>)79  %5 = bitcast i8 %m to <8 x i1>80  %6 = select <8 x i1> %5, <8 x double> %4, <8 x double> %381  ret <8 x double> %682}83 84define <8 x i64> @combine_permvar_8i64_identity(<8 x i64> %x0, <8 x i64> %x1) {85; CHECK-LABEL: combine_permvar_8i64_identity:86; CHECK:       # %bb.0:87; CHECK-NEXT:    ret{{[l|q]}}88  %1 = call <8 x i64> @llvm.x86.avx512.permvar.di.512(<8 x i64> %x0, <8 x i64> <i64 7, i64 6, i64 5, i64 4, i64 3, i64 2, i64 1, i64 0>)89  %2 = call <8 x i64> @llvm.x86.avx512.permvar.di.512(<8 x i64> %1, <8 x i64> <i64 7, i64 14, i64 5, i64 12, i64 3, i64 10, i64 1, i64 8>)90  ret <8 x i64> %291}92define <8 x i64> @combine_permvar_8i64_identity_mask(<8 x i64> %x0, <8 x i64> %x1, i8 %m) {93; X86-AVX512F-LABEL: combine_permvar_8i64_identity_mask:94; X86-AVX512F:       # %bb.0:95; X86-AVX512F-NEXT:    vpmovsxbq {{.*#+}} zmm2 = [7,6,5,4,3,2,1,0]96; X86-AVX512F-NEXT:    movzbl {{[0-9]+}}(%esp), %eax97; X86-AVX512F-NEXT:    kmovw %eax, %k198; X86-AVX512F-NEXT:    vpermq %zmm0, %zmm2, %zmm1 {%k1}99; X86-AVX512F-NEXT:    vpmovsxbq {{.*#+}} zmm0 = [7,14,5,12,3,10,1,8]100; X86-AVX512F-NEXT:    vpermq %zmm1, %zmm0, %zmm1 {%k1}101; X86-AVX512F-NEXT:    vmovdqa64 %zmm1, %zmm0102; X86-AVX512F-NEXT:    retl103;104; X86-AVX512BW-LABEL: combine_permvar_8i64_identity_mask:105; X86-AVX512BW:       # %bb.0:106; X86-AVX512BW-NEXT:    vpmovsxbq {{.*#+}} zmm2 = [7,6,5,4,3,2,1,0]107; X86-AVX512BW-NEXT:    movzbl {{[0-9]+}}(%esp), %eax108; X86-AVX512BW-NEXT:    kmovd %eax, %k1109; X86-AVX512BW-NEXT:    vpermq %zmm0, %zmm2, %zmm1 {%k1}110; X86-AVX512BW-NEXT:    vpmovsxbq {{.*#+}} zmm0 = [7,14,5,12,3,10,1,8]111; X86-AVX512BW-NEXT:    vpermq %zmm1, %zmm0, %zmm1 {%k1}112; X86-AVX512BW-NEXT:    vmovdqa64 %zmm1, %zmm0113; X86-AVX512BW-NEXT:    retl114;115; X64-AVX512F-LABEL: combine_permvar_8i64_identity_mask:116; X64-AVX512F:       # %bb.0:117; X64-AVX512F-NEXT:    vpmovsxbq {{.*#+}} zmm2 = [7,6,5,4,3,2,1,0]118; X64-AVX512F-NEXT:    kmovw %edi, %k1119; X64-AVX512F-NEXT:    vpermq %zmm0, %zmm2, %zmm1 {%k1}120; X64-AVX512F-NEXT:    vpmovsxbq {{.*#+}} zmm0 = [7,14,5,12,3,10,1,8]121; X64-AVX512F-NEXT:    vpermq %zmm1, %zmm0, %zmm1 {%k1}122; X64-AVX512F-NEXT:    vmovdqa64 %zmm1, %zmm0123; X64-AVX512F-NEXT:    retq124;125; X64-AVX512BW-LABEL: combine_permvar_8i64_identity_mask:126; X64-AVX512BW:       # %bb.0:127; X64-AVX512BW-NEXT:    vpmovsxbq {{.*#+}} zmm2 = [7,6,5,4,3,2,1,0]128; X64-AVX512BW-NEXT:    kmovd %edi, %k1129; X64-AVX512BW-NEXT:    vpermq %zmm0, %zmm2, %zmm1 {%k1}130; X64-AVX512BW-NEXT:    vpmovsxbq {{.*#+}} zmm0 = [7,14,5,12,3,10,1,8]131; X64-AVX512BW-NEXT:    vpermq %zmm1, %zmm0, %zmm1 {%k1}132; X64-AVX512BW-NEXT:    vmovdqa64 %zmm1, %zmm0133; X64-AVX512BW-NEXT:    retq134  %1 = call <8 x i64> @llvm.x86.avx512.permvar.di.512(<8 x i64> %x0, <8 x i64> <i64 7, i64 6, i64 5, i64 4, i64 3, i64 2, i64 1, i64 0>)135  %2 = bitcast i8 %m to <8 x i1>136  %3 = select <8 x i1> %2, <8 x i64> %1, <8 x i64> %x1137  %4 = call <8 x i64> @llvm.x86.avx512.permvar.di.512(<8 x i64> %3, <8 x i64> <i64 7, i64 14, i64 5, i64 12, i64 3, i64 10, i64 1, i64 8>)138  %5 = bitcast i8 %m to <8 x i1>139  %6 = select <8 x i1> %5, <8 x i64> %4, <8 x i64> %3140  ret <8 x i64> %6141}142 143define <8 x double> @combine_vpermt2var_8f64_identity(<8 x double> %x0, <8 x double> %x1) {144; CHECK-LABEL: combine_vpermt2var_8f64_identity:145; CHECK:       # %bb.0:146; CHECK-NEXT:    ret{{[l|q]}}147  %res0 = call <8 x double> @llvm.x86.avx512.maskz.vpermt2var.pd.512(<8 x i64> <i64 7, i64 6, i64 5, i64 4, i64 3, i64 2, i64 1, i64 0>, <8 x double> %x0, <8 x double> %x1, i8 -1)148  %res1 = call <8 x double> @llvm.x86.avx512.maskz.vpermt2var.pd.512(<8 x i64> <i64 7, i64 14, i64 5, i64 12, i64 3, i64 10, i64 1, i64 8>, <8 x double> %res0, <8 x double> %res0, i8 -1)149  ret <8 x double> %res1150}151define <8 x double> @combine_vpermt2var_8f64_identity_mask(<8 x double> %x0, <8 x double> %x1, i8 %m) {152; X86-AVX512F-LABEL: combine_vpermt2var_8f64_identity_mask:153; X86-AVX512F:       # %bb.0:154; X86-AVX512F-NEXT:    vpmovsxbq {{.*#+}} zmm1 = [7,6,5,4,3,2,1,0]155; X86-AVX512F-NEXT:    movzbl {{[0-9]+}}(%esp), %eax156; X86-AVX512F-NEXT:    kmovw %eax, %k1157; X86-AVX512F-NEXT:    vpermt2pd %zmm0, %zmm1, %zmm0 {%k1} {z}158; X86-AVX512F-NEXT:    vpermpd %zmm0, %zmm1, %zmm0 {%k1} {z}159; X86-AVX512F-NEXT:    retl160;161; X86-AVX512BW-LABEL: combine_vpermt2var_8f64_identity_mask:162; X86-AVX512BW:       # %bb.0:163; X86-AVX512BW-NEXT:    vpmovsxbq {{.*#+}} zmm1 = [7,6,5,4,3,2,1,0]164; X86-AVX512BW-NEXT:    movzbl {{[0-9]+}}(%esp), %eax165; X86-AVX512BW-NEXT:    kmovd %eax, %k1166; X86-AVX512BW-NEXT:    vpermt2pd %zmm0, %zmm1, %zmm0 {%k1} {z}167; X86-AVX512BW-NEXT:    vpermpd %zmm0, %zmm1, %zmm0 {%k1} {z}168; X86-AVX512BW-NEXT:    retl169;170; X64-AVX512F-LABEL: combine_vpermt2var_8f64_identity_mask:171; X64-AVX512F:       # %bb.0:172; X64-AVX512F-NEXT:    vpmovsxbq {{.*#+}} zmm1 = [7,6,5,4,3,2,1,0]173; X64-AVX512F-NEXT:    kmovw %edi, %k1174; X64-AVX512F-NEXT:    vpermt2pd %zmm0, %zmm1, %zmm0 {%k1} {z}175; X64-AVX512F-NEXT:    vpermpd %zmm0, %zmm1, %zmm0 {%k1} {z}176; X64-AVX512F-NEXT:    retq177;178; X64-AVX512BW-LABEL: combine_vpermt2var_8f64_identity_mask:179; X64-AVX512BW:       # %bb.0:180; X64-AVX512BW-NEXT:    vpmovsxbq {{.*#+}} zmm1 = [7,6,5,4,3,2,1,0]181; X64-AVX512BW-NEXT:    kmovd %edi, %k1182; X64-AVX512BW-NEXT:    vpermt2pd %zmm0, %zmm1, %zmm0 {%k1} {z}183; X64-AVX512BW-NEXT:    vpermpd %zmm0, %zmm1, %zmm0 {%k1} {z}184; X64-AVX512BW-NEXT:    retq185  %res0 = call <8 x double> @llvm.x86.avx512.maskz.vpermt2var.pd.512(<8 x i64> <i64 7, i64 6, i64 5, i64 4, i64 3, i64 2, i64 1, i64 0>, <8 x double> %x0, <8 x double> %x1, i8 %m)186  %res1 = call <8 x double> @llvm.x86.avx512.maskz.vpermt2var.pd.512(<8 x i64> <i64 7, i64 14, i64 5, i64 12, i64 3, i64 10, i64 1, i64 8>, <8 x double> %res0, <8 x double> %res0, i8 %m)187  ret <8 x double> %res1188}189 190define <8 x double> @combine_vpermt2var_8f64_movddup(<8 x double> %x0, <8 x double> %x1) {191; CHECK-LABEL: combine_vpermt2var_8f64_movddup:192; CHECK:       # %bb.0:193; CHECK-NEXT:    vmovddup {{.*#+}} zmm0 = zmm0[0,0,2,2,4,4,6,6]194; CHECK-NEXT:    ret{{[l|q]}}195  %res0 = call <8 x double> @llvm.x86.avx512.maskz.vpermt2var.pd.512(<8 x i64> <i64 0, i64 0, i64 2, i64 2, i64 4, i64 4, i64 undef, i64 undef>, <8 x double> %x0, <8 x double> %x1, i8 -1)196  ret <8 x double> %res0197}198define <8 x double> @combine_vpermt2var_8f64_movddup_load(ptr%p0, <8 x double> %x1) {199; X86-LABEL: combine_vpermt2var_8f64_movddup_load:200; X86:       # %bb.0:201; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax202; X86-NEXT:    vmovddup {{.*#+}} zmm0 = mem[0,0,2,2,4,4,6,6]203; X86-NEXT:    retl204;205; X64-LABEL: combine_vpermt2var_8f64_movddup_load:206; X64:       # %bb.0:207; X64-NEXT:    vmovddup {{.*#+}} zmm0 = mem[0,0,2,2,4,4,6,6]208; X64-NEXT:    retq209  %x0 = load <8 x double>, ptr%p0210  %res0 = call <8 x double> @llvm.x86.avx512.maskz.vpermt2var.pd.512(<8 x i64> <i64 0, i64 0, i64 2, i64 2, i64 4, i64 4, i64 6, i64 6>, <8 x double> %x0, <8 x double> %x1, i8 -1)211  ret <8 x double> %res0212}213define <8 x double> @combine_vpermt2var_8f64_movddup_mask(<8 x double> %x0, <8 x double> %x1, i8 %m) {214; X86-AVX512F-LABEL: combine_vpermt2var_8f64_movddup_mask:215; X86-AVX512F:       # %bb.0:216; X86-AVX512F-NEXT:    movzbl {{[0-9]+}}(%esp), %eax217; X86-AVX512F-NEXT:    kmovw %eax, %k1218; X86-AVX512F-NEXT:    vmovddup {{.*#+}} zmm0 {%k1} {z} = zmm0[0,0,2,2,4,4,6,6]219; X86-AVX512F-NEXT:    retl220;221; X86-AVX512BW-LABEL: combine_vpermt2var_8f64_movddup_mask:222; X86-AVX512BW:       # %bb.0:223; X86-AVX512BW-NEXT:    movzbl {{[0-9]+}}(%esp), %eax224; X86-AVX512BW-NEXT:    kmovd %eax, %k1225; X86-AVX512BW-NEXT:    vmovddup {{.*#+}} zmm0 {%k1} {z} = zmm0[0,0,2,2,4,4,6,6]226; X86-AVX512BW-NEXT:    retl227;228; X64-AVX512F-LABEL: combine_vpermt2var_8f64_movddup_mask:229; X64-AVX512F:       # %bb.0:230; X64-AVX512F-NEXT:    kmovw %edi, %k1231; X64-AVX512F-NEXT:    vmovddup {{.*#+}} zmm0 {%k1} {z} = zmm0[0,0,2,2,4,4,6,6]232; X64-AVX512F-NEXT:    retq233;234; X64-AVX512BW-LABEL: combine_vpermt2var_8f64_movddup_mask:235; X64-AVX512BW:       # %bb.0:236; X64-AVX512BW-NEXT:    kmovd %edi, %k1237; X64-AVX512BW-NEXT:    vmovddup {{.*#+}} zmm0 {%k1} {z} = zmm0[0,0,2,2,4,4,6,6]238; X64-AVX512BW-NEXT:    retq239  %res0 = call <8 x double> @llvm.x86.avx512.maskz.vpermt2var.pd.512(<8 x i64> <i64 0, i64 0, i64 2, i64 2, i64 4, i64 4, i64 6, i64 6>, <8 x double> %x0, <8 x double> %x1, i8 %m)240  ret <8 x double> %res0241}242 243define <8 x i64> @combine_vpermt2var_8i64_identity(<8 x i64> %x0, <8 x i64> %x1) {244; CHECK-LABEL: combine_vpermt2var_8i64_identity:245; CHECK:       # %bb.0:246; CHECK-NEXT:    ret{{[l|q]}}247  %res0 = call <8 x i64> @llvm.x86.avx512.maskz.vpermt2var.q.512(<8 x i64> <i64 undef, i64 6, i64 5, i64 4, i64 3, i64 2, i64 1, i64 0>, <8 x i64> %x0, <8 x i64> %x1, i8 -1)248  %res1 = call <8 x i64> @llvm.x86.avx512.maskz.vpermt2var.q.512(<8 x i64> <i64 undef, i64 14, i64 5, i64 12, i64 3, i64 10, i64 1, i64 8>, <8 x i64> %res0, <8 x i64> %res0, i8 -1)249  ret <8 x i64> %res1250}251define <8 x i64> @combine_vpermt2var_8i64_identity_mask(<8 x i64> %x0, <8 x i64> %x1, i8 %m) {252; X86-AVX512F-LABEL: combine_vpermt2var_8i64_identity_mask:253; X86-AVX512F:       # %bb.0:254; X86-AVX512F-NEXT:    vpmovsxbq {{.*#+}} zmm1 = [7,6,5,4,3,2,1,0]255; X86-AVX512F-NEXT:    movzbl {{[0-9]+}}(%esp), %eax256; X86-AVX512F-NEXT:    kmovw %eax, %k1257; X86-AVX512F-NEXT:    vpermt2q %zmm0, %zmm1, %zmm0 {%k1} {z}258; X86-AVX512F-NEXT:    vpermq %zmm0, %zmm1, %zmm0 {%k1} {z}259; X86-AVX512F-NEXT:    retl260;261; X86-AVX512BW-LABEL: combine_vpermt2var_8i64_identity_mask:262; X86-AVX512BW:       # %bb.0:263; X86-AVX512BW-NEXT:    vpmovsxbq {{.*#+}} zmm1 = [7,6,5,4,3,2,1,0]264; X86-AVX512BW-NEXT:    movzbl {{[0-9]+}}(%esp), %eax265; X86-AVX512BW-NEXT:    kmovd %eax, %k1266; X86-AVX512BW-NEXT:    vpermt2q %zmm0, %zmm1, %zmm0 {%k1} {z}267; X86-AVX512BW-NEXT:    vpermq %zmm0, %zmm1, %zmm0 {%k1} {z}268; X86-AVX512BW-NEXT:    retl269;270; X64-AVX512F-LABEL: combine_vpermt2var_8i64_identity_mask:271; X64-AVX512F:       # %bb.0:272; X64-AVX512F-NEXT:    vpmovsxbq {{.*#+}} zmm1 = [7,6,5,4,3,2,1,0]273; X64-AVX512F-NEXT:    kmovw %edi, %k1274; X64-AVX512F-NEXT:    vpermt2q %zmm0, %zmm1, %zmm0 {%k1} {z}275; X64-AVX512F-NEXT:    vpermq %zmm0, %zmm1, %zmm0 {%k1} {z}276; X64-AVX512F-NEXT:    retq277;278; X64-AVX512BW-LABEL: combine_vpermt2var_8i64_identity_mask:279; X64-AVX512BW:       # %bb.0:280; X64-AVX512BW-NEXT:    vpmovsxbq {{.*#+}} zmm1 = [7,6,5,4,3,2,1,0]281; X64-AVX512BW-NEXT:    kmovd %edi, %k1282; X64-AVX512BW-NEXT:    vpermt2q %zmm0, %zmm1, %zmm0 {%k1} {z}283; X64-AVX512BW-NEXT:    vpermq %zmm0, %zmm1, %zmm0 {%k1} {z}284; X64-AVX512BW-NEXT:    retq285  %res0 = call <8 x i64> @llvm.x86.avx512.maskz.vpermt2var.q.512(<8 x i64> <i64 7, i64 6, i64 5, i64 4, i64 3, i64 2, i64 1, i64 0>, <8 x i64> %x0, <8 x i64> %x1, i8 %m)286  %res1 = call <8 x i64> @llvm.x86.avx512.maskz.vpermt2var.q.512(<8 x i64> <i64 7, i64 14, i64 5, i64 12, i64 3, i64 10, i64 1, i64 8>, <8 x i64> %res0, <8 x i64> %res0, i8 %m)287  ret <8 x i64> %res1288}289 290define <16 x float> @combine_vpermt2var_16f32_identity(<16 x float> %x0, <16 x float> %x1) {291; CHECK-LABEL: combine_vpermt2var_16f32_identity:292; CHECK:       # %bb.0:293; CHECK-NEXT:    ret{{[l|q]}}294  %res0 = call <16 x float> @llvm.x86.avx512.maskz.vpermt2var.ps.512(<16 x i32> <i32 15, i32 14, i32 13, i32 12, i32 11, i32 10, i32 9, i32 8, i32 7, i32 6, i32 5, i32 4, i32 3, i32 2, i32 1, i32 0>, <16 x float> %x0, <16 x float> %x1, i16 -1)295  %res1 = call <16 x float> @llvm.x86.avx512.maskz.vpermt2var.ps.512(<16 x i32> <i32 15, i32 30, i32 13, i32 28, i32 11, i32 26, i32 9, i32 24, i32 7, i32 22, i32 5, i32 20, i32 3, i32 18, i32 1, i32 16>, <16 x float> %res0, <16 x float> %res0, i16 -1)296  ret <16 x float> %res1297}298define <16 x float> @combine_vpermt2var_16f32_identity_mask(<16 x float> %x0, <16 x float> %x1, i16 %m) {299; X86-LABEL: combine_vpermt2var_16f32_identity_mask:300; X86:       # %bb.0:301; X86-NEXT:    vpmovsxbd {{.*#+}} zmm1 = [15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0]302; X86-NEXT:    kmovw {{[0-9]+}}(%esp), %k1303; X86-NEXT:    vpermt2ps %zmm0, %zmm1, %zmm0 {%k1} {z}304; X86-NEXT:    vpermps %zmm0, %zmm1, %zmm0 {%k1} {z}305; X86-NEXT:    retl306;307; X64-AVX512F-LABEL: combine_vpermt2var_16f32_identity_mask:308; X64-AVX512F:       # %bb.0:309; X64-AVX512F-NEXT:    vpmovsxbd {{.*#+}} zmm1 = [15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0]310; X64-AVX512F-NEXT:    kmovw %edi, %k1311; X64-AVX512F-NEXT:    vpermt2ps %zmm0, %zmm1, %zmm0 {%k1} {z}312; X64-AVX512F-NEXT:    vpermps %zmm0, %zmm1, %zmm0 {%k1} {z}313; X64-AVX512F-NEXT:    retq314;315; X64-AVX512BW-LABEL: combine_vpermt2var_16f32_identity_mask:316; X64-AVX512BW:       # %bb.0:317; X64-AVX512BW-NEXT:    vpmovsxbd {{.*#+}} zmm1 = [15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0]318; X64-AVX512BW-NEXT:    kmovd %edi, %k1319; X64-AVX512BW-NEXT:    vpermt2ps %zmm0, %zmm1, %zmm0 {%k1} {z}320; X64-AVX512BW-NEXT:    vpermps %zmm0, %zmm1, %zmm0 {%k1} {z}321; X64-AVX512BW-NEXT:    retq322  %res0 = call <16 x float> @llvm.x86.avx512.maskz.vpermt2var.ps.512(<16 x i32> <i32 15, i32 14, i32 13, i32 12, i32 11, i32 10, i32 9, i32 8, i32 7, i32 6, i32 5, i32 4, i32 3, i32 2, i32 1, i32 0>, <16 x float> %x0, <16 x float> %x1, i16 %m)323  %res1 = call <16 x float> @llvm.x86.avx512.maskz.vpermt2var.ps.512(<16 x i32> <i32 15, i32 30, i32 13, i32 28, i32 11, i32 26, i32 9, i32 24, i32 7, i32 22, i32 5, i32 20, i32 3, i32 18, i32 1, i32 16>, <16 x float> %res0, <16 x float> %res0, i16 %m)324  ret <16 x float> %res1325}326 327define <16 x float> @combine_vpermt2var_16f32_vmovddup(<16 x float> %x0, <16 x float> %x1) {328; CHECK-LABEL: combine_vpermt2var_16f32_vmovddup:329; CHECK:       # %bb.0:330; CHECK-NEXT:    vmovddup {{.*#+}} zmm0 = zmm0[0,0,2,2,4,4,6,6]331; CHECK-NEXT:    ret{{[l|q]}}332  %res0 = call <16 x float> @llvm.x86.avx512.maskz.vpermt2var.ps.512(<16 x i32> <i32 0, i32 1, i32 0, i32 1, i32 4, i32 5, i32 4, i32 5, i32 8, i32 9, i32 8, i32 9, i32 12, i32 13, i32 12, i32 13>, <16 x float> %x0, <16 x float> %x1, i16 -1)333  ret <16 x float> %res0334}335define <16 x float> @combine_vpermt2var_16f32_vmovddup_load(ptr%p0, <16 x float> %x1) {336; X86-LABEL: combine_vpermt2var_16f32_vmovddup_load:337; X86:       # %bb.0:338; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax339; X86-NEXT:    vmovddup {{.*#+}} zmm0 = mem[0,0,2,2,4,4,6,6]340; X86-NEXT:    retl341;342; X64-LABEL: combine_vpermt2var_16f32_vmovddup_load:343; X64:       # %bb.0:344; X64-NEXT:    vmovddup {{.*#+}} zmm0 = mem[0,0,2,2,4,4,6,6]345; X64-NEXT:    retq346  %x0 = load <16 x float>, ptr%p0347  %res0 = call <16 x float> @llvm.x86.avx512.maskz.vpermt2var.ps.512(<16 x i32> <i32 0, i32 1, i32 0, i32 1, i32 4, i32 5, i32 4, i32 5, i32 8, i32 9, i32 8, i32 9, i32 12, i32 13, i32 12, i32 13>, <16 x float> %x0, <16 x float> %x1, i16 -1)348  ret <16 x float> %res0349}350define <16 x float> @combine_vpermt2var_16f32_vmovddup_mask(<16 x float> %x0, <16 x float> %x1, i16 %m) {351; X86-LABEL: combine_vpermt2var_16f32_vmovddup_mask:352; X86:       # %bb.0:353; X86-NEXT:    kmovw {{[0-9]+}}(%esp), %k1354; X86-NEXT:    vshufps {{.*#+}} zmm0 {%k1} {z} = zmm0[0,1,0,1,4,5,4,5,8,9,8,9,12,13,12,13]355; X86-NEXT:    retl356;357; X64-AVX512F-LABEL: combine_vpermt2var_16f32_vmovddup_mask:358; X64-AVX512F:       # %bb.0:359; X64-AVX512F-NEXT:    kmovw %edi, %k1360; X64-AVX512F-NEXT:    vshufps {{.*#+}} zmm0 {%k1} {z} = zmm0[0,1,0,1,4,5,4,5,8,9,8,9,12,13,12,13]361; X64-AVX512F-NEXT:    retq362;363; X64-AVX512BW-LABEL: combine_vpermt2var_16f32_vmovddup_mask:364; X64-AVX512BW:       # %bb.0:365; X64-AVX512BW-NEXT:    kmovd %edi, %k1366; X64-AVX512BW-NEXT:    vshufps {{.*#+}} zmm0 {%k1} {z} = zmm0[0,1,0,1,4,5,4,5,8,9,8,9,12,13,12,13]367; X64-AVX512BW-NEXT:    retq368  %res0 = call <16 x float> @llvm.x86.avx512.maskz.vpermt2var.ps.512(<16 x i32> <i32 0, i32 1, i32 0, i32 1, i32 4, i32 5, i32 4, i32 5, i32 8, i32 9, i32 8, i32 9, i32 12, i32 13, i32 12, i32 13>, <16 x float> %x0, <16 x float> %x1, i16 %m)369  ret <16 x float> %res0370}371define <16 x float> @combine_vpermt2var_16f32_vmovddup_mask_load(ptr%p0, <16 x float> %x1, i16 %m) {372; X86-LABEL: combine_vpermt2var_16f32_vmovddup_mask_load:373; X86:       # %bb.0:374; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax375; X86-NEXT:    kmovw {{[0-9]+}}(%esp), %k1376; X86-NEXT:    vpermilps {{.*#+}} zmm0 {%k1} {z} = mem[0,1,0,1,4,5,4,5,8,9,8,9,12,13,12,13]377; X86-NEXT:    retl378;379; X64-AVX512F-LABEL: combine_vpermt2var_16f32_vmovddup_mask_load:380; X64-AVX512F:       # %bb.0:381; X64-AVX512F-NEXT:    kmovw %esi, %k1382; X64-AVX512F-NEXT:    vpermilps {{.*#+}} zmm0 {%k1} {z} = mem[0,1,0,1,4,5,4,5,8,9,8,9,12,13,12,13]383; X64-AVX512F-NEXT:    retq384;385; X64-AVX512BW-LABEL: combine_vpermt2var_16f32_vmovddup_mask_load:386; X64-AVX512BW:       # %bb.0:387; X64-AVX512BW-NEXT:    kmovd %esi, %k1388; X64-AVX512BW-NEXT:    vpermilps {{.*#+}} zmm0 {%k1} {z} = mem[0,1,0,1,4,5,4,5,8,9,8,9,12,13,12,13]389; X64-AVX512BW-NEXT:    retq390  %x0 = load <16 x float>, ptr%p0391  %res0 = call <16 x float> @llvm.x86.avx512.maskz.vpermt2var.ps.512(<16 x i32> <i32 0, i32 1, i32 0, i32 1, i32 4, i32 5, i32 4, i32 5, i32 8, i32 9, i32 8, i32 9, i32 12, i32 13, i32 12, i32 13>, <16 x float> %x0, <16 x float> %x1, i16 %m)392  ret <16 x float> %res0393}394 395define <16 x float> @combine_vpermt2var_16f32_vmovshdup(<16 x float> %x0, <16 x float> %x1) {396; CHECK-LABEL: combine_vpermt2var_16f32_vmovshdup:397; CHECK:       # %bb.0:398; CHECK-NEXT:    vmovshdup {{.*#+}} zmm0 = zmm0[1,1,3,3,5,5,7,7,9,9,11,11,13,13,15,15]399; CHECK-NEXT:    ret{{[l|q]}}400  %res0 = call <16 x float> @llvm.x86.avx512.maskz.vpermt2var.ps.512(<16 x i32> <i32 1, i32 1, i32 3, i32 3, i32 5, i32 5, i32 7, i32 7, i32 9, i32 9, i32 11, i32 11, i32 13, i32 13, i32 15, i32 15>, <16 x float> %x0, <16 x float> %x1, i16 -1)401  ret <16 x float> %res0402}403define <16 x float> @combine_vpermt2var_16f32_vmovshdup_load(ptr%p0, <16 x float> %x1) {404; X86-LABEL: combine_vpermt2var_16f32_vmovshdup_load:405; X86:       # %bb.0:406; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax407; X86-NEXT:    vmovshdup {{.*#+}} zmm0 = mem[1,1,3,3,5,5,7,7,9,9,11,11,13,13,15,15]408; X86-NEXT:    retl409;410; X64-LABEL: combine_vpermt2var_16f32_vmovshdup_load:411; X64:       # %bb.0:412; X64-NEXT:    vmovshdup {{.*#+}} zmm0 = mem[1,1,3,3,5,5,7,7,9,9,11,11,13,13,15,15]413; X64-NEXT:    retq414  %x0 = load <16 x float>, ptr%p0415  %res0 = call <16 x float> @llvm.x86.avx512.maskz.vpermt2var.ps.512(<16 x i32> <i32 1, i32 1, i32 3, i32 3, i32 5, i32 5, i32 7, i32 7, i32 9, i32 9, i32 11, i32 11, i32 13, i32 13, i32 15, i32 15>, <16 x float> %x0, <16 x float> %x1, i16 -1)416  ret <16 x float> %res0417}418define <16 x float> @combine_vpermt2var_16f32_vmovshdup_mask(<16 x float> %x0, <16 x float> %x1, i16 %m) {419; X86-LABEL: combine_vpermt2var_16f32_vmovshdup_mask:420; X86:       # %bb.0:421; X86-NEXT:    kmovw {{[0-9]+}}(%esp), %k1422; X86-NEXT:    vmovshdup {{.*#+}} zmm0 {%k1} {z} = zmm0[1,1,3,3,5,5,7,7,9,9,11,11,13,13,15,15]423; X86-NEXT:    retl424;425; X64-AVX512F-LABEL: combine_vpermt2var_16f32_vmovshdup_mask:426; X64-AVX512F:       # %bb.0:427; X64-AVX512F-NEXT:    kmovw %edi, %k1428; X64-AVX512F-NEXT:    vmovshdup {{.*#+}} zmm0 {%k1} {z} = zmm0[1,1,3,3,5,5,7,7,9,9,11,11,13,13,15,15]429; X64-AVX512F-NEXT:    retq430;431; X64-AVX512BW-LABEL: combine_vpermt2var_16f32_vmovshdup_mask:432; X64-AVX512BW:       # %bb.0:433; X64-AVX512BW-NEXT:    kmovd %edi, %k1434; X64-AVX512BW-NEXT:    vmovshdup {{.*#+}} zmm0 {%k1} {z} = zmm0[1,1,3,3,5,5,7,7,9,9,11,11,13,13,15,15]435; X64-AVX512BW-NEXT:    retq436  %res0 = call <16 x float> @llvm.x86.avx512.maskz.vpermt2var.ps.512(<16 x i32> <i32 1, i32 1, i32 3, i32 3, i32 5, i32 5, i32 7, i32 7, i32 9, i32 9, i32 11, i32 11, i32 13, i32 13, i32 15, i32 15>, <16 x float> %x0, <16 x float> %x1, i16 %m)437  ret <16 x float> %res0438}439 440define <16 x float> @combine_vpermt2var_16f32_vmovsldup(<16 x float> %x0, <16 x float> %x1) {441; CHECK-LABEL: combine_vpermt2var_16f32_vmovsldup:442; CHECK:       # %bb.0:443; CHECK-NEXT:    vmovsldup {{.*#+}} zmm0 = zmm0[0,0,2,2,4,4,6,6,8,8,10,10,12,12,14,14]444; CHECK-NEXT:    ret{{[l|q]}}445  %res0 = call <16 x float> @llvm.x86.avx512.maskz.vpermt2var.ps.512(<16 x i32> <i32 0, i32 0, i32 2, i32 2, i32 4, i32 4, i32 6, i32 6, i32 8, i32 8, i32 10, i32 10, i32 12, i32 12, i32 14, i32 14>, <16 x float> %x0, <16 x float> %x1, i16 -1)446  ret <16 x float> %res0447}448define <16 x float> @combine_vpermt2var_16f32_vmovsldup_load(ptr%p0, <16 x float> %x1) {449; X86-LABEL: combine_vpermt2var_16f32_vmovsldup_load:450; X86:       # %bb.0:451; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax452; X86-NEXT:    vmovsldup {{.*#+}} zmm0 = mem[0,0,2,2,4,4,6,6,8,8,10,10,12,12,14,14]453; X86-NEXT:    retl454;455; X64-LABEL: combine_vpermt2var_16f32_vmovsldup_load:456; X64:       # %bb.0:457; X64-NEXT:    vmovsldup {{.*#+}} zmm0 = mem[0,0,2,2,4,4,6,6,8,8,10,10,12,12,14,14]458; X64-NEXT:    retq459  %x0 = load <16 x float>, ptr%p0460  %res0 = call <16 x float> @llvm.x86.avx512.maskz.vpermt2var.ps.512(<16 x i32> <i32 0, i32 0, i32 2, i32 2, i32 4, i32 4, i32 6, i32 6, i32 8, i32 8, i32 10, i32 10, i32 12, i32 12, i32 14, i32 14>, <16 x float> %x0, <16 x float> %x1, i16 -1)461  ret <16 x float> %res0462}463define <16 x float> @combine_vpermt2var_16f32_vmovsldup_mask(<16 x float> %x0, <16 x float> %x1, i16 %m) {464; X86-LABEL: combine_vpermt2var_16f32_vmovsldup_mask:465; X86:       # %bb.0:466; X86-NEXT:    kmovw {{[0-9]+}}(%esp), %k1467; X86-NEXT:    vmovsldup {{.*#+}} zmm0 {%k1} {z} = zmm0[0,0,2,2,4,4,6,6,8,8,10,10,12,12,14,14]468; X86-NEXT:    retl469;470; X64-AVX512F-LABEL: combine_vpermt2var_16f32_vmovsldup_mask:471; X64-AVX512F:       # %bb.0:472; X64-AVX512F-NEXT:    kmovw %edi, %k1473; X64-AVX512F-NEXT:    vmovsldup {{.*#+}} zmm0 {%k1} {z} = zmm0[0,0,2,2,4,4,6,6,8,8,10,10,12,12,14,14]474; X64-AVX512F-NEXT:    retq475;476; X64-AVX512BW-LABEL: combine_vpermt2var_16f32_vmovsldup_mask:477; X64-AVX512BW:       # %bb.0:478; X64-AVX512BW-NEXT:    kmovd %edi, %k1479; X64-AVX512BW-NEXT:    vmovsldup {{.*#+}} zmm0 {%k1} {z} = zmm0[0,0,2,2,4,4,6,6,8,8,10,10,12,12,14,14]480; X64-AVX512BW-NEXT:    retq481  %res0 = call <16 x float> @llvm.x86.avx512.maskz.vpermt2var.ps.512(<16 x i32> <i32 undef, i32 0, i32 undef, i32 2, i32 4, i32 4, i32 6, i32 6, i32 8, i32 8, i32 10, i32 10, i32 12, i32 12, i32 14, i32 14>, <16 x float> %x0, <16 x float> %x1, i16 %m)482  ret <16 x float> %res0483}484define <16 x float> @combine_vpermt2var_16f32_vmovsldup_mask_load(ptr%p0, <16 x float> %x1, i16 %m) {485; X86-LABEL: combine_vpermt2var_16f32_vmovsldup_mask_load:486; X86:       # %bb.0:487; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax488; X86-NEXT:    kmovw {{[0-9]+}}(%esp), %k1489; X86-NEXT:    vmovsldup {{.*#+}} zmm0 {%k1} {z} = mem[0,0,2,2,4,4,6,6,8,8,10,10,12,12,14,14]490; X86-NEXT:    retl491;492; X64-AVX512F-LABEL: combine_vpermt2var_16f32_vmovsldup_mask_load:493; X64-AVX512F:       # %bb.0:494; X64-AVX512F-NEXT:    kmovw %esi, %k1495; X64-AVX512F-NEXT:    vmovsldup {{.*#+}} zmm0 {%k1} {z} = mem[0,0,2,2,4,4,6,6,8,8,10,10,12,12,14,14]496; X64-AVX512F-NEXT:    retq497;498; X64-AVX512BW-LABEL: combine_vpermt2var_16f32_vmovsldup_mask_load:499; X64-AVX512BW:       # %bb.0:500; X64-AVX512BW-NEXT:    kmovd %esi, %k1501; X64-AVX512BW-NEXT:    vmovsldup {{.*#+}} zmm0 {%k1} {z} = mem[0,0,2,2,4,4,6,6,8,8,10,10,12,12,14,14]502; X64-AVX512BW-NEXT:    retq503  %x0 = load <16 x float>, ptr%p0504  %res0 = call <16 x float> @llvm.x86.avx512.maskz.vpermt2var.ps.512(<16 x i32> <i32 undef, i32 0, i32 undef, i32 2, i32 4, i32 4, i32 6, i32 6, i32 8, i32 8, i32 10, i32 10, i32 12, i32 12, i32 14, i32 14>, <16 x float> %x0, <16 x float> %x1, i16 %m)505  ret <16 x float> %res0506}507 508define <16 x float> @combine_vpermt2var_16f32_vpermilps(<16 x float> %x0, <16 x float> %x1) {509; CHECK-LABEL: combine_vpermt2var_16f32_vpermilps:510; CHECK:       # %bb.0:511; CHECK-NEXT:    vshufps {{.*#+}} zmm0 = zmm0[3,2,1,0,7,6,5,4,11,10,9,8,15,14,13,12]512; CHECK-NEXT:    ret{{[l|q]}}513  %res0 = call <16 x float> @llvm.x86.avx512.maskz.vpermt2var.ps.512(<16 x i32> <i32 3, i32 2, i32 1, i32 0, i32 7, i32 6, i32 5, i32 4, i32 11, i32 10, i32 9, i32 8, i32 15, i32 14, i32 13, i32 12>, <16 x float> %x0, <16 x float> %x1, i16 -1)514  ret <16 x float> %res0515}516define <16 x float> @combine_vpermt2var_16f32_vpermilps_load(ptr%p0, <16 x float> %x1) {517; X86-LABEL: combine_vpermt2var_16f32_vpermilps_load:518; X86:       # %bb.0:519; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax520; X86-NEXT:    vpermilps {{.*#+}} zmm0 = mem[3,2,1,0,7,6,5,4,11,10,9,8,15,14,13,12]521; X86-NEXT:    retl522;523; X64-LABEL: combine_vpermt2var_16f32_vpermilps_load:524; X64:       # %bb.0:525; X64-NEXT:    vpermilps {{.*#+}} zmm0 = mem[3,2,1,0,7,6,5,4,11,10,9,8,15,14,13,12]526; X64-NEXT:    retq527  %x0 = load <16 x float>, ptr%p0528  %res0 = call <16 x float> @llvm.x86.avx512.maskz.vpermt2var.ps.512(<16 x i32> <i32 3, i32 2, i32 1, i32 0, i32 7, i32 6, i32 5, i32 4, i32 11, i32 10, i32 9, i32 8, i32 15, i32 14, i32 13, i32 12>, <16 x float> %x0, <16 x float> %x1, i16 -1)529  ret <16 x float> %res0530}531define <16 x float> @combine_vpermt2var_16f32_vpermilps_mask(<16 x float> %x0, <16 x float> %x1, i16 %m) {532; X86-LABEL: combine_vpermt2var_16f32_vpermilps_mask:533; X86:       # %bb.0:534; X86-NEXT:    kmovw {{[0-9]+}}(%esp), %k1535; X86-NEXT:    vshufps {{.*#+}} zmm0 {%k1} {z} = zmm0[3,2,1,0,7,6,5,4,11,10,9,8,15,14,13,12]536; X86-NEXT:    retl537;538; X64-AVX512F-LABEL: combine_vpermt2var_16f32_vpermilps_mask:539; X64-AVX512F:       # %bb.0:540; X64-AVX512F-NEXT:    kmovw %edi, %k1541; X64-AVX512F-NEXT:    vshufps {{.*#+}} zmm0 {%k1} {z} = zmm0[3,2,1,0,7,6,5,4,11,10,9,8,15,14,13,12]542; X64-AVX512F-NEXT:    retq543;544; X64-AVX512BW-LABEL: combine_vpermt2var_16f32_vpermilps_mask:545; X64-AVX512BW:       # %bb.0:546; X64-AVX512BW-NEXT:    kmovd %edi, %k1547; X64-AVX512BW-NEXT:    vshufps {{.*#+}} zmm0 {%k1} {z} = zmm0[3,2,1,0,7,6,5,4,11,10,9,8,15,14,13,12]548; X64-AVX512BW-NEXT:    retq549  %res0 = call <16 x float> @llvm.x86.avx512.maskz.vpermt2var.ps.512(<16 x i32> <i32 3, i32 2, i32 1, i32 0, i32 7, i32 6, i32 5, i32 4, i32 11, i32 10, i32 9, i32 8, i32 15, i32 14, i32 13, i32 12>, <16 x float> %x0, <16 x float> %x1, i16 %m)550  ret <16 x float> %res0551}552define <16 x float> @combine_vpermt2var_16f32_vpermilps_mask_load(ptr%p0, <16 x float> %x1, i16 %m) {553; X86-LABEL: combine_vpermt2var_16f32_vpermilps_mask_load:554; X86:       # %bb.0:555; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax556; X86-NEXT:    kmovw {{[0-9]+}}(%esp), %k1557; X86-NEXT:    vpermilps {{.*#+}} zmm0 {%k1} {z} = mem[3,2,1,0,7,6,5,4,11,10,9,8,15,14,13,12]558; X86-NEXT:    retl559;560; X64-AVX512F-LABEL: combine_vpermt2var_16f32_vpermilps_mask_load:561; X64-AVX512F:       # %bb.0:562; X64-AVX512F-NEXT:    kmovw %esi, %k1563; X64-AVX512F-NEXT:    vpermilps {{.*#+}} zmm0 {%k1} {z} = mem[3,2,1,0,7,6,5,4,11,10,9,8,15,14,13,12]564; X64-AVX512F-NEXT:    retq565;566; X64-AVX512BW-LABEL: combine_vpermt2var_16f32_vpermilps_mask_load:567; X64-AVX512BW:       # %bb.0:568; X64-AVX512BW-NEXT:    kmovd %esi, %k1569; X64-AVX512BW-NEXT:    vpermilps {{.*#+}} zmm0 {%k1} {z} = mem[3,2,1,0,7,6,5,4,11,10,9,8,15,14,13,12]570; X64-AVX512BW-NEXT:    retq571  %x0 = load <16 x float>, ptr%p0572  %res0 = call <16 x float> @llvm.x86.avx512.maskz.vpermt2var.ps.512(<16 x i32> <i32 3, i32 2, i32 1, i32 0, i32 7, i32 6, i32 5, i32 4, i32 11, i32 10, i32 9, i32 8, i32 15, i32 14, i32 13, i32 12>, <16 x float> %x0, <16 x float> %x1, i16 %m)573  ret <16 x float> %res0574}575 576define <16 x i32> @combine_vpermt2var_16i32_identity(<16 x i32> %x0, <16 x i32> %x1) {577; CHECK-LABEL: combine_vpermt2var_16i32_identity:578; CHECK:       # %bb.0:579; CHECK-NEXT:    ret{{[l|q]}}580  %res0 = call <16 x i32> @llvm.x86.avx512.maskz.vpermt2var.d.512(<16 x i32> <i32 15, i32 14, i32 13, i32 12, i32 11, i32 10, i32 9, i32 8, i32 7, i32 6, i32 5, i32 4, i32 3, i32 2, i32 1, i32 undef>, <16 x i32> %x0, <16 x i32> %x1, i16 -1)581  %res1 = call <16 x i32> @llvm.x86.avx512.maskz.vpermt2var.d.512(<16 x i32> <i32 15, i32 30, i32 13, i32 28, i32 undef, i32 26, i32 9, i32 24, i32 7, i32 22, i32 5, i32 20, i32 3, i32 18, i32 1, i32 16>, <16 x i32> %res0, <16 x i32> %res0, i16 -1)582  ret <16 x i32> %res1583}584define <16 x i32> @combine_vpermt2var_16i32_identity_mask(<16 x i32> %x0, <16 x i32> %x1, i16 %m) {585; X86-LABEL: combine_vpermt2var_16i32_identity_mask:586; X86:       # %bb.0:587; X86-NEXT:    vpmovsxbd {{.*#+}} zmm1 = [15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0]588; X86-NEXT:    kmovw {{[0-9]+}}(%esp), %k1589; X86-NEXT:    vpermt2d %zmm0, %zmm1, %zmm0 {%k1} {z}590; X86-NEXT:    vpermd %zmm0, %zmm1, %zmm0 {%k1} {z}591; X86-NEXT:    retl592;593; X64-AVX512F-LABEL: combine_vpermt2var_16i32_identity_mask:594; X64-AVX512F:       # %bb.0:595; X64-AVX512F-NEXT:    vpmovsxbd {{.*#+}} zmm1 = [15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0]596; X64-AVX512F-NEXT:    kmovw %edi, %k1597; X64-AVX512F-NEXT:    vpermt2d %zmm0, %zmm1, %zmm0 {%k1} {z}598; X64-AVX512F-NEXT:    vpermd %zmm0, %zmm1, %zmm0 {%k1} {z}599; X64-AVX512F-NEXT:    retq600;601; X64-AVX512BW-LABEL: combine_vpermt2var_16i32_identity_mask:602; X64-AVX512BW:       # %bb.0:603; X64-AVX512BW-NEXT:    vpmovsxbd {{.*#+}} zmm1 = [15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0]604; X64-AVX512BW-NEXT:    kmovd %edi, %k1605; X64-AVX512BW-NEXT:    vpermt2d %zmm0, %zmm1, %zmm0 {%k1} {z}606; X64-AVX512BW-NEXT:    vpermd %zmm0, %zmm1, %zmm0 {%k1} {z}607; X64-AVX512BW-NEXT:    retq608  %res0 = call <16 x i32> @llvm.x86.avx512.maskz.vpermt2var.d.512(<16 x i32> <i32 15, i32 14, i32 13, i32 12, i32 11, i32 10, i32 9, i32 8, i32 7, i32 6, i32 5, i32 4, i32 3, i32 2, i32 1, i32 0>, <16 x i32> %x0, <16 x i32> %x1, i16 %m)609  %res1 = call <16 x i32> @llvm.x86.avx512.maskz.vpermt2var.d.512(<16 x i32> <i32 15, i32 30, i32 13, i32 28, i32 11, i32 26, i32 9, i32 24, i32 7, i32 22, i32 5, i32 20, i32 3, i32 18, i32 1, i32 16>, <16 x i32> %res0, <16 x i32> %res0, i16 %m)610  ret <16 x i32> %res1611}612 613define <16 x i32> @combine_permvar_as_vpbroadcastd512(<16 x i32> %x0) {614; CHECK-LABEL: combine_permvar_as_vpbroadcastd512:615; CHECK:       # %bb.0:616; CHECK-NEXT:    vbroadcastss %xmm0, %zmm0617; CHECK-NEXT:    ret{{[l|q]}}618  %1 = call <16 x i32> @llvm.x86.avx512.permvar.si.512(<16 x i32> %x0, <16 x i32> zeroinitializer)619  ret <16 x i32> %1620}621 622define <8 x i64> @combine_permvar_as_vpbroadcastq512(<8 x i64> %x0) {623; CHECK-LABEL: combine_permvar_as_vpbroadcastq512:624; CHECK:       # %bb.0:625; CHECK-NEXT:    vbroadcastsd %xmm0, %zmm0626; CHECK-NEXT:    ret{{[l|q]}}627  %1 = call <8 x i64> @llvm.x86.avx512.permvar.di.512(<8 x i64> %x0, <8 x i64> zeroinitializer)628  ret <8 x i64> %1629}630 631define <8 x i64> @combine_permvar_8i64_as_permq(<8 x i64> %x0, <8 x i64> %x1) {632; CHECK-LABEL: combine_permvar_8i64_as_permq:633; CHECK:       # %bb.0:634; CHECK-NEXT:    vpermpd {{.*#+}} zmm0 = zmm0[3,2,1,0,7,6,5,4]635; CHECK-NEXT:    ret{{[l|q]}}636  %1 = call <8 x i64> @llvm.x86.avx512.permvar.di.512(<8 x i64> %x0, <8 x i64> <i64 3, i64 2, i64 1, i64 undef, i64 undef, i64 6, i64 5, i64 4>)637  ret <8 x i64> %1638}639define <8 x i64> @combine_permvar_8i64_as_permq_mask(<8 x i64> %x0, <8 x i64> %x1, i8 %m) {640; X86-AVX512F-LABEL: combine_permvar_8i64_as_permq_mask:641; X86-AVX512F:       # %bb.0:642; X86-AVX512F-NEXT:    movzbl {{[0-9]+}}(%esp), %eax643; X86-AVX512F-NEXT:    kmovw %eax, %k1644; X86-AVX512F-NEXT:    vpermq {{.*#+}} zmm1 {%k1} = zmm0[3,2,1,0,7,6,5,4]645; X86-AVX512F-NEXT:    vmovdqa64 %zmm1, %zmm0646; X86-AVX512F-NEXT:    retl647;648; X86-AVX512BW-LABEL: combine_permvar_8i64_as_permq_mask:649; X86-AVX512BW:       # %bb.0:650; X86-AVX512BW-NEXT:    movzbl {{[0-9]+}}(%esp), %eax651; X86-AVX512BW-NEXT:    kmovd %eax, %k1652; X86-AVX512BW-NEXT:    vpermq {{.*#+}} zmm1 {%k1} = zmm0[3,2,1,0,7,6,5,4]653; X86-AVX512BW-NEXT:    vmovdqa64 %zmm1, %zmm0654; X86-AVX512BW-NEXT:    retl655;656; X64-AVX512F-LABEL: combine_permvar_8i64_as_permq_mask:657; X64-AVX512F:       # %bb.0:658; X64-AVX512F-NEXT:    kmovw %edi, %k1659; X64-AVX512F-NEXT:    vpermq {{.*#+}} zmm1 {%k1} = zmm0[3,2,1,0,7,6,5,4]660; X64-AVX512F-NEXT:    vmovdqa64 %zmm1, %zmm0661; X64-AVX512F-NEXT:    retq662;663; X64-AVX512BW-LABEL: combine_permvar_8i64_as_permq_mask:664; X64-AVX512BW:       # %bb.0:665; X64-AVX512BW-NEXT:    kmovd %edi, %k1666; X64-AVX512BW-NEXT:    vpermq {{.*#+}} zmm1 {%k1} = zmm0[3,2,1,0,7,6,5,4]667; X64-AVX512BW-NEXT:    vmovdqa64 %zmm1, %zmm0668; X64-AVX512BW-NEXT:    retq669  %1 = call <8 x i64> @llvm.x86.avx512.permvar.di.512(<8 x i64> %x0, <8 x i64> <i64 3, i64 2, i64 1, i64 undef, i64 undef, i64 6, i64 5, i64 4>)670  %2 = bitcast i8 %m to <8 x i1>671  %3 = select <8 x i1> %2, <8 x i64> %1, <8 x i64> %x1672  ret <8 x i64> %3673}674 675define <8 x double> @combine_permvar_8f64_as_permpd(<8 x double> %x0, <8 x double> %x1) {676; CHECK-LABEL: combine_permvar_8f64_as_permpd:677; CHECK:       # %bb.0:678; CHECK-NEXT:    vpermpd {{.*#+}} zmm0 = zmm0[3,2,1,0,7,6,5,4]679; CHECK-NEXT:    ret{{[l|q]}}680  %1 = call <8 x double> @llvm.x86.avx512.permvar.df.512(<8 x double> %x0, <8 x i64> <i64 3, i64 2, i64 1, i64 undef, i64 undef, i64 6, i64 5, i64 4>)681  ret <8 x double> %1682}683define <8 x double> @combine_permvar_8f64_as_permpd_mask(<8 x double> %x0, <8 x double> %x1, i8 %m) {684; X86-AVX512F-LABEL: combine_permvar_8f64_as_permpd_mask:685; X86-AVX512F:       # %bb.0:686; X86-AVX512F-NEXT:    movzbl {{[0-9]+}}(%esp), %eax687; X86-AVX512F-NEXT:    kmovw %eax, %k1688; X86-AVX512F-NEXT:    vpermpd {{.*#+}} zmm1 {%k1} = zmm0[3,2,1,0,7,6,5,4]689; X86-AVX512F-NEXT:    vmovapd %zmm1, %zmm0690; X86-AVX512F-NEXT:    retl691;692; X86-AVX512BW-LABEL: combine_permvar_8f64_as_permpd_mask:693; X86-AVX512BW:       # %bb.0:694; X86-AVX512BW-NEXT:    movzbl {{[0-9]+}}(%esp), %eax695; X86-AVX512BW-NEXT:    kmovd %eax, %k1696; X86-AVX512BW-NEXT:    vpermpd {{.*#+}} zmm1 {%k1} = zmm0[3,2,1,0,7,6,5,4]697; X86-AVX512BW-NEXT:    vmovapd %zmm1, %zmm0698; X86-AVX512BW-NEXT:    retl699;700; X64-AVX512F-LABEL: combine_permvar_8f64_as_permpd_mask:701; X64-AVX512F:       # %bb.0:702; X64-AVX512F-NEXT:    kmovw %edi, %k1703; X64-AVX512F-NEXT:    vpermpd {{.*#+}} zmm1 {%k1} = zmm0[3,2,1,0,7,6,5,4]704; X64-AVX512F-NEXT:    vmovapd %zmm1, %zmm0705; X64-AVX512F-NEXT:    retq706;707; X64-AVX512BW-LABEL: combine_permvar_8f64_as_permpd_mask:708; X64-AVX512BW:       # %bb.0:709; X64-AVX512BW-NEXT:    kmovd %edi, %k1710; X64-AVX512BW-NEXT:    vpermpd {{.*#+}} zmm1 {%k1} = zmm0[3,2,1,0,7,6,5,4]711; X64-AVX512BW-NEXT:    vmovapd %zmm1, %zmm0712; X64-AVX512BW-NEXT:    retq713  %1 = call <8 x double> @llvm.x86.avx512.permvar.df.512(<8 x double> %x0, <8 x i64> <i64 3, i64 2, i64 1, i64 undef, i64 undef, i64 6, i64 5, i64 4>)714  %2 = bitcast i8 %m to <8 x i1>715  %3 = select <8 x i1> %2, <8 x double> %1, <8 x double> %x1716  ret <8 x double> %3717}718 719define <16 x float> @combine_vpermilvar_16f32_230146759A8BCFDE(<16 x float> %x0) {720; CHECK-LABEL: combine_vpermilvar_16f32_230146759A8BCFDE:721; CHECK:       # %bb.0:722; CHECK-NEXT:    vpermilps {{.*#+}} zmm0 = zmm0[2,3,0,1,4,6,7,5,9,10,8,11,12,15,13,14]723; CHECK-NEXT:    ret{{[l|q]}}724  %res0 = call <16 x float> @llvm.x86.avx512.mask.vpermilvar.ps.512(<16 x float> %x0, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 3, i32 2, i32 1, i32 0, i32 2, i32 3, i32 0, i32 1, i32 1, i32 0, i32 3, i32 2>, <16 x float> undef, i16 -1)725  %res1 = call <16 x float> @llvm.x86.avx512.mask.vpermilvar.ps.512(<16 x float> %res0, <16 x i32> <i32 2, i32 3, i32 0, i32 1, i32 3, i32 1, i32 0, i32 2, i32 3, i32 0, i32 2, i32 1, i32 1, i32 2, i32 0, i32 3>, <16 x float> undef, i16 -1)726  ret <16 x float> %res1727}728 729define <8 x double> @combine_vpermi2var_8f64_identity(<8 x double> %x0, <8 x double> %x1) {730; CHECK-LABEL: combine_vpermi2var_8f64_identity:731; CHECK:       # %bb.0:732; CHECK-NEXT:    ret{{[l|q]}}733  %res0 = call <8 x double> @llvm.x86.avx512.mask.vpermi2var.pd.512(<8 x double> %x0, <8 x i64> <i64 7, i64 6, i64 5, i64 4, i64 3, i64 2, i64 1, i64 0>, <8 x double> %x1, i8 -1)734  %res1 = call <8 x double> @llvm.x86.avx512.mask.vpermi2var.pd.512(<8 x double> %res0, <8 x i64> <i64 7, i64 14, i64 5, i64 12, i64 3, i64 10, i64 1, i64 8>, <8 x double> %res0, i8 -1)735  ret <8 x double> %res1736}737 738define <8 x double> @combine_vpermi2var_8f64_as_shufpd(<8 x double> %x0, <8 x double> %x1) {739; CHECK-LABEL: combine_vpermi2var_8f64_as_shufpd:740; CHECK:       # %bb.0:741; CHECK-NEXT:    vshufpd {{.*#+}} zmm0 = zmm0[1],zmm1[0],zmm0[2],zmm1[2],zmm0[5],zmm1[5],zmm0[6],zmm1[7]742; CHECK-NEXT:    ret{{[l|q]}}743  %1 = call <8 x double> @llvm.x86.avx512.mask.vpermi2var.pd.512(<8 x double> %x0, <8 x i64> <i64 1, i64 8, i64 2, i64 10, i64 5, i64 13, i64 6, i64 15>, <8 x double> %x1, i8 -1)744  ret <8 x double> %1745}746 747define <8 x i64> @combine_vpermi2var_8i64_identity(<8 x i64> %x0, <8 x i64> %x1) {748; CHECK-LABEL: combine_vpermi2var_8i64_identity:749; CHECK:       # %bb.0:750; CHECK-NEXT:    ret{{[l|q]}}751  %res0 = call <8 x i64> @llvm.x86.avx512.mask.vpermi2var.q.512(<8 x i64> %x0, <8 x i64> <i64 undef, i64 6, i64 5, i64 4, i64 3, i64 2, i64 1, i64 0>, <8 x i64> %x1, i8 -1)752  %res1 = call <8 x i64> @llvm.x86.avx512.mask.vpermi2var.q.512(<8 x i64> %res0, <8 x i64> <i64 undef, i64 14, i64 5, i64 12, i64 3, i64 10, i64 1, i64 8>, <8 x i64> %res0, i8 -1)753  ret <8 x i64> %res1754}755 756define <16 x float> @combine_vpermi2var_16f32_identity(<16 x float> %x0, <16 x float> %x1) {757; CHECK-LABEL: combine_vpermi2var_16f32_identity:758; CHECK:       # %bb.0:759; CHECK-NEXT:    ret{{[l|q]}}760  %res0 = call <16 x float> @llvm.x86.avx512.mask.vpermi2var.ps.512(<16 x float> %x0, <16 x i32> <i32 15, i32 14, i32 13, i32 12, i32 11, i32 10, i32 9, i32 8, i32 7, i32 6, i32 5, i32 4, i32 3, i32 2, i32 1, i32 0>, <16 x float> %x1, i16 -1)761  %res1 = call <16 x float> @llvm.x86.avx512.mask.vpermi2var.ps.512(<16 x float> %res0, <16 x i32> <i32 15, i32 30, i32 13, i32 28, i32 11, i32 26, i32 9, i32 24, i32 7, i32 22, i32 5, i32 20, i32 3, i32 18, i32 1, i32 16>, <16 x float> %res0, i16 -1)762  ret <16 x float> %res1763}764 765define <16 x i32> @combine_vpermi2var_16i32_identity(<16 x i32> %x0, <16 x i32> %x1) {766; CHECK-LABEL: combine_vpermi2var_16i32_identity:767; CHECK:       # %bb.0:768; CHECK-NEXT:    ret{{[l|q]}}769  %res0 = call <16 x i32> @llvm.x86.avx512.mask.vpermi2var.d.512(<16 x i32> %x0, <16 x i32> <i32 15, i32 14, i32 13, i32 12, i32 11, i32 10, i32 9, i32 8, i32 7, i32 6, i32 5, i32 4, i32 3, i32 2, i32 1, i32 undef>, <16 x i32> %x1, i16 -1)770  %res1 = call <16 x i32> @llvm.x86.avx512.mask.vpermi2var.d.512(<16 x i32> %res0, <16 x i32> <i32 15, i32 30, i32 13, i32 28, i32 undef, i32 26, i32 9, i32 24, i32 7, i32 22, i32 5, i32 20, i32 3, i32 18, i32 1, i32 16>, <16 x i32> %res0, i16 -1)771  ret <16 x i32> %res1772}773 774define <16 x float> @combine_vpermt2var_vpermi2var_16f32_as_unpckhps(<16 x float> %a0, <16 x float> %a1) {775; CHECK-LABEL: combine_vpermt2var_vpermi2var_16f32_as_unpckhps:776; CHECK:       # %bb.0:777; CHECK-NEXT:    vunpckhps {{.*#+}} zmm0 = zmm1[2],zmm0[2],zmm1[3],zmm0[3],zmm1[6],zmm0[6],zmm1[7],zmm0[7],zmm1[10],zmm0[10],zmm1[11],zmm0[11],zmm1[14],zmm0[14],zmm1[15],zmm0[15]778; CHECK-NEXT:    ret{{[l|q]}}779  %res0 = call <16 x float> @llvm.x86.avx512.mask.vpermi2var.ps.512(<16 x float> %a0, <16 x i32> <i32 18, i32 2, i32 19, i32 3, i32 22, i32 6, i32 23, i32 7, i32 26, i32 10, i32 27, i32 11, i32 30, i32 14, i32 31, i32 15>, <16 x float> %a1, i16 -1)780  ret <16 x float> %res0781}782 783define <16 x i32> @vpermt2var_vpermi2var_16i32_as_unpckldq(<16 x i32> %a0, <16 x i32> %a1) {784; CHECK-LABEL: vpermt2var_vpermi2var_16i32_as_unpckldq:785; CHECK:       # %bb.0:786; CHECK-NEXT:    vunpcklps {{.*#+}} zmm0 = zmm0[0],zmm1[0],zmm0[1],zmm1[1],zmm0[4],zmm1[4],zmm0[5],zmm1[5],zmm0[8],zmm1[8],zmm0[9],zmm1[9],zmm0[12],zmm1[12],zmm0[13],zmm1[13]787; CHECK-NEXT:    ret{{[l|q]}}788  %res0 = call <16 x i32> @llvm.x86.avx512.mask.vpermi2var.d.512(<16 x i32> %a0, <16 x i32> <i32 0, i32 16, i32 1, i32 17, i32 4, i32 20, i32 5, i32 21, i32 8, i32 24, i32 9, i32 25, i32 12, i32 28, i32 13, i32 29>, <16 x i32> %a1, i16 -1)789  ret <16 x i32> %res0790}791 792define <8 x double> @combine_vpermi2var_8f64_as_vpermpd(<8 x double> %x0, <8 x double> %x1) {793; CHECK-LABEL: combine_vpermi2var_8f64_as_vpermpd:794; CHECK:       # %bb.0:795; CHECK-NEXT:    vpmovsxbq {{.*#+}} zmm1 = [7,6,5,4,3,2,1,0]796; CHECK-NEXT:    vpermpd %zmm0, %zmm1, %zmm0797; CHECK-NEXT:    ret{{[l|q]}}798  %res0 = call <8 x double> @llvm.x86.avx512.mask.vpermi2var.pd.512(<8 x double> %x0, <8 x i64> <i64 3, i64 2, i64 1, i64 0, i64 7, i64 6, i64 5, i64 4>, <8 x double> %x1, i8 -1)799  %res1 = call <8 x double> @llvm.x86.avx512.mask.vpermi2var.pd.512(<8 x double> %res0, <8 x i64> <i64 12, i64 5, i64 14, i64 7, i64 8, i64 1, i64 10, i64 3>, <8 x double> %res0, i8 -1)800  ret <8 x double> %res1801}802 803define <8 x i64> @combine_vpermt2var_8i64_as_valignq(<8 x i64> %x0, <8 x i64> %x1) {804; CHECK-LABEL: combine_vpermt2var_8i64_as_valignq:805; CHECK:       # %bb.0:806; CHECK-NEXT:    valignq {{.*#+}} zmm0 = zmm1[7],zmm0[0,1,2,3,4,5,6]807; CHECK-NEXT:    ret{{[l|q]}}808  %res0 = call <8 x i64> @llvm.x86.avx512.maskz.vpermt2var.q.512(<8 x i64> <i64 15, i64 0, i64 1, i64 2, i64 3, i64 4, i64 5, i64 6>, <8 x i64> %x0, <8 x i64> %x1, i8 -1)809  ret <8 x i64> %res0810}811 812define <8 x i64> @combine_vpermt2var_8i64_as_valignq_zero(<8 x i64> %x0) {813; CHECK-LABEL: combine_vpermt2var_8i64_as_valignq_zero:814; CHECK:       # %bb.0:815; CHECK-NEXT:    vpxor %xmm1, %xmm1, %xmm1816; CHECK-NEXT:    valignq {{.*#+}} zmm0 = zmm0[7],zmm1[0,1,2,3,4,5,6]817; CHECK-NEXT:    ret{{[l|q]}}818  %res0 = call <8 x i64> @llvm.x86.avx512.maskz.vpermt2var.q.512(<8 x i64> <i64 15, i64 0, i64 1, i64 2, i64 3, i64 4, i64 5, i64 6>, <8 x i64> zeroinitializer, <8 x i64> %x0, i8 -1)819  ret <8 x i64> %res0820}821 822define <8 x i64> @combine_vpermt2var_8i64_as_zero_valignq(<8 x i64> %x0) {823; CHECK-LABEL: combine_vpermt2var_8i64_as_zero_valignq:824; CHECK:       # %bb.0:825; CHECK-NEXT:    vpxor %xmm1, %xmm1, %xmm1826; CHECK-NEXT:    valignq {{.*#+}} zmm0 = zmm1[7],zmm0[0,1,2,3,4,5,6]827; CHECK-NEXT:    ret{{[l|q]}}828  %res0 = call <8 x i64> @llvm.x86.avx512.maskz.vpermt2var.q.512(<8 x i64> <i64 15, i64 0, i64 1, i64 2, i64 3, i64 4, i64 5, i64 6>, <8 x i64> %x0, <8 x i64> zeroinitializer, i8 -1)829  ret <8 x i64> %res0830}831 832define <8 x i64> @combine_vpermt2var_8i64_as_vpermq(<8 x i64> %x0, <8 x i64> %x1) {833; CHECK-LABEL: combine_vpermt2var_8i64_as_vpermq:834; CHECK:       # %bb.0:835; CHECK-NEXT:    vpmovsxbq {{.*#+}} zmm1 = [7,6,5,4,3,2,1,0]836; CHECK-NEXT:    vpermpd %zmm0, %zmm1, %zmm0837; CHECK-NEXT:    ret{{[l|q]}}838  %res0 = call <8 x i64> @llvm.x86.avx512.maskz.vpermt2var.q.512(<8 x i64> <i64 3, i64 2, i64 1, i64 0, i64 7, i64 6, i64 5, i64 4>, <8 x i64> %x0, <8 x i64> %x1, i8 -1)839  %res1 = call <8 x i64> @llvm.x86.avx512.maskz.vpermt2var.q.512(<8 x i64> <i64 12, i64 5, i64 14, i64 7, i64 8, i64 1, i64 10, i64 3>, <8 x i64> %res0, <8 x i64> %res0, i8 -1)840  ret <8 x i64> %res1841}842 843define <16 x float> @combine_vpermi2var_16f32_as_vpermps(<16 x float> %x0, <16 x float> %x1) {844; CHECK-LABEL: combine_vpermi2var_16f32_as_vpermps:845; CHECK:       # %bb.0:846; CHECK-NEXT:    vpmovsxbd {{.*#+}} zmm1 = [7,7,5,5,3,3,1,1,15,15,13,13,11,11,9,9]847; CHECK-NEXT:    vpermps %zmm0, %zmm1, %zmm0848; CHECK-NEXT:    ret{{[l|q]}}849  %res0 = call <16 x float> @llvm.x86.avx512.mask.vpermi2var.ps.512(<16 x float> %x0, <16 x i32> <i32 7, i32 6, i32 5, i32 4, i32 3, i32 2, i32 1, i32 0, i32 15, i32 14, i32 13, i32 12, i32 11, i32 10, i32 9, i32 8>, <16 x float> %x1, i16 -1)850  %res1 = call <16 x float> @llvm.x86.avx512.mask.vpermi2var.ps.512(<16 x float> %res0, <16 x i32> <i32 0, i32 16, i32 2, i32 18, i32 4, i32 20, i32 6, i32 22, i32 8, i32 24, i32 10, i32 26, i32 12, i32 28, i32 14, i32 30>, <16 x float> %res0, i16 -1)851  ret <16 x float> %res1852}853 854define <16 x i32> @combine_vpermt2var_16i32_as_vpermd(<16 x i32> %x0, <16 x i32> %x1) {855; CHECK-LABEL: combine_vpermt2var_16i32_as_vpermd:856; CHECK:       # %bb.0:857; CHECK-NEXT:    vpmovsxbd {{.*#+}} zmm1 = [7,7,5,5,3,3,1,1,15,15,13,13,11,11,9,9]858; CHECK-NEXT:    vpermps %zmm0, %zmm1, %zmm0859; CHECK-NEXT:    ret{{[l|q]}}860  %res0 = call <16 x i32> @llvm.x86.avx512.maskz.vpermt2var.d.512(<16 x i32> <i32 7, i32 6, i32 5, i32 4, i32 3, i32 2, i32 1, i32 0, i32 15, i32 14, i32 13, i32 12, i32 11, i32 10, i32 9, i32 8>, <16 x i32> %x0, <16 x i32> %x1, i16 -1)861  %res1 = call <16 x i32> @llvm.x86.avx512.maskz.vpermt2var.d.512(<16 x i32> <i32 0, i32 16, i32 2, i32 18, i32 4, i32 20, i32 6, i32 22, i32 8, i32 24, i32 10, i32 26, i32 12, i32 28, i32 14, i32 30>, <16 x i32> %res0, <16 x i32> %res0, i16 -1)862  ret <16 x i32> %res1863}864 865define <16 x i32> @combine_vpermt2var_16i32_as_vpsrlq(<16 x i32> %x0) {866; CHECK-LABEL: combine_vpermt2var_16i32_as_vpsrlq:867; CHECK:       # %bb.0:868; CHECK-NEXT:    vpsrlq $32, %zmm0, %zmm0869; CHECK-NEXT:    ret{{[l|q]}}870  %res0 = call <16 x i32> @llvm.x86.avx512.maskz.vpermt2var.d.512(<16 x i32> <i32 1, i32 16, i32 3, i32 16, i32 5, i32 16, i32 7, i32 16, i32 9, i32 16, i32 11, i32 16, i32 13, i32 16, i32 15, i32 16>, <16 x i32> %x0, <16 x i32> zeroinitializer, i16 -1)871  ret <16 x i32> %res0872}873 874define <16 x i32> @combine_vpermt2var_16i32_as_vpsllq(<16 x i32> %x0) {875; CHECK-LABEL: combine_vpermt2var_16i32_as_vpsllq:876; CHECK:       # %bb.0:877; CHECK-NEXT:    vpsllq $32, %zmm0, %zmm0878; CHECK-NEXT:    ret{{[l|q]}}879  %res0 = call <16 x i32> @llvm.x86.avx512.maskz.vpermt2var.d.512(<16 x i32> <i32 16, i32 0, i32 16, i32 2, i32 16, i32 4, i32 16, i32 6, i32 16, i32 8, i32 16, i32 10, i32 16, i32 12, i32 16, i32 14>, <16 x i32> %x0, <16 x i32> zeroinitializer, i16 -1)880  ret <16 x i32> %res0881}882 883define <8 x double> @combine_vpermi2var_vpermt2var_8f64_as_vperm2(<8 x double> %x0, <8 x double> %x1) {884; CHECK-LABEL: combine_vpermi2var_vpermt2var_8f64_as_vperm2:885; CHECK:       # %bb.0:886; CHECK-NEXT:    vpmovsxbq {{.*#+}} zmm2 = [4,14,3,12,7,8,0,15]887; CHECK-NEXT:    vpermi2pd %zmm0, %zmm1, %zmm2888; CHECK-NEXT:    vmovapd %zmm2, %zmm0889; CHECK-NEXT:    ret{{[l|q]}}890  %res0 = call <8 x double> @llvm.x86.avx512.mask.vpermi2var.pd.512(<8 x double> %x0, <8 x i64> <i64 15, i64 0, i64 8, i64 7, i64 12, i64 6, i64 11, i64 4>, <8 x double> %x1, i8 -1)891  %res1 = call <8 x double> @llvm.x86.avx512.maskz.vpermt2var.pd.512(<8 x i64> <i64 12, i64 5, i64 14, i64 7, i64 8, i64 1, i64 10, i64 3>, <8 x double> %res0, <8 x double> %res0, i8 -1)892  ret <8 x double> %res1893}894 895define <8 x double> @combine_vpermi2var_8f64_as_permpd(<8 x double> %x0, <8 x double> %x1, i64 %a2) {896; X86-LABEL: combine_vpermi2var_8f64_as_permpd:897; X86:       # %bb.0:898; X86-NEXT:    vmovsd {{.*#+}} xmm2 = mem[0],zero899; X86-NEXT:    vunpcklpd {{.*#+}} xmm2 = xmm2[0],mem[0]900; X86-NEXT:    vinsertf128 $1, {{\.?LCPI[0-9]+_[0-9]+}}, %ymm2, %ymm2901; X86-NEXT:    vinsertf64x4 $1, {{\.?LCPI[0-9]+_[0-9]+}}, %zmm2, %zmm2902; X86-NEXT:    vpermi2pd %zmm1, %zmm0, %zmm2903; X86-NEXT:    vpermpd {{.*#+}} zmm0 = zmm2[2,3,1,1,6,7,5,5]904; X86-NEXT:    retl905;906; X64-LABEL: combine_vpermi2var_8f64_as_permpd:907; X64:       # %bb.0:908; X64-NEXT:    vpermpd {{.*#+}} zmm0 = zmm0[1,3,2,2,5,7,6,6]909; X64-NEXT:    retq910  %res0 = insertelement <8 x i64> <i64 0, i64 2, i64 1, i64 3, i64 4, i64 6, i64 5, i64 7>, i64 %a2, i32 0911  %res1 = call <8 x double> @llvm.x86.avx512.mask.vpermi2var.pd.512(<8 x double> %x0, <8 x i64> %res0, <8 x double> %x1, i8 -1)912  %res2 = shufflevector <8 x double> %res1, <8 x double> undef, <8 x i32> <i32 2, i32 3, i32 1, i32 1, i32 6, i32 7, i32 5, i32 5>913  ret <8 x double> %res2914}915 916define <16 x i32> @combine_vpermi2var_vpermt2var_16i32_as_vpermd(<16 x i32> %x0, <16 x i32> %x1) {917; CHECK-LABEL: combine_vpermi2var_vpermt2var_16i32_as_vpermd:918; CHECK:       # %bb.0:919; CHECK-NEXT:    vpmovsxbd {{.*#+}} zmm2 = [0,31,2,2,4,29,6,27,8,25,10,23,12,21,14,19]920; CHECK-NEXT:    vpermt2d %zmm1, %zmm2, %zmm0921; CHECK-NEXT:    ret{{[l|q]}}922  %res0 = call <16 x i32> @llvm.x86.avx512.mask.vpermi2var.d.512(<16 x i32> %x0, <16 x i32> <i32 0, i32 31, i32 2, i32 29, i32 4, i32 27, i32 6, i32 25, i32 8, i32 23, i32 10, i32 21, i32 12, i32 19, i32 14, i32 17>, <16 x i32> %x1, i16 -1)923  %res1 = call <16 x i32> @llvm.x86.avx512.maskz.vpermt2var.d.512(<16 x i32> <i32 0, i32 17, i32 2, i32 18, i32 4, i32 19, i32 6, i32 21, i32 8, i32 23, i32 10, i32 25, i32 12, i32 27, i32 14, i32 29>, <16 x i32> %res0, <16 x i32> %res0, i16 -1)924  ret <16 x i32> %res1925}926 927define <8 x double> @combine_vpermi2var_vpermvar_8f64_as_vperm2_zero(<8 x double> %x0) {928; CHECK-LABEL: combine_vpermi2var_vpermvar_8f64_as_vperm2_zero:929; CHECK:       # %bb.0:930; CHECK-NEXT:    vxorpd %xmm1, %xmm1, %xmm1931; CHECK-NEXT:    vpmovsxbq {{.*#+}} zmm2 = [8,3,10,11,1,7,14,5]932; CHECK-NEXT:    vpermt2pd %zmm1, %zmm2, %zmm0933; CHECK-NEXT:    ret{{[l|q]}}934  %res0 = shufflevector <8 x double> %x0, <8 x double> zeroinitializer, <8 x i32> <i32 1, i32 9, i32 3, i32 11, i32 5, i32 13, i32 7, i32 15>935  %1 = call <8 x double> @llvm.x86.avx512.permvar.df.512(<8 x double> %res0, <8 x i64> <i64 3, i64 2, i64 1, i64 7, i64 0, i64 6, i64 5, i64 4>)936  ret <8 x double> %1937}938 939define <16 x float> @combine_vpermi2var_vpermvar_16f32_as_vperm2_zero(<16 x float> %x0) {940; CHECK-LABEL: combine_vpermi2var_vpermvar_16f32_as_vperm2_zero:941; CHECK:       # %bb.0:942; CHECK-NEXT:    vxorps %xmm1, %xmm1, %xmm1943; CHECK-NEXT:    vpmovsxbd {{.*#+}} zmm2 = [0,13,1,12,4,9,22,12,4,25,26,9,5,29,30,8]944; CHECK-NEXT:    vpermt2ps %zmm1, %zmm2, %zmm0945; CHECK-NEXT:    ret{{[l|q]}}946  %res0 = shufflevector <16 x float> %x0, <16 x float> zeroinitializer, <16 x i32> <i32 0, i32 16, i32 1, i32 17, i32 4, i32 20, i32 5, i32 21, i32 8, i32 24, i32 9, i32 25, i32 12, i32 28, i32 13, i32 29>947  %res1 = call <16 x float> @llvm.x86.avx512.mask.vpermi2var.ps.512(<16 x float> %res0, <16 x i32> <i32 0, i32 14, i32 2, i32 12, i32 4, i32 10, i32 3, i32 12, i32 4, i32 11, i32 5, i32 10, i32 6, i32 9, i32 7, i32 8>, <16 x float> %res0, i16 -1)948  ret <16 x float> %res1949}950 951define <8 x i64> @combine_vpermvar_insertion_as_broadcast_v8i64(i64 %a0) {952; X86-LABEL: combine_vpermvar_insertion_as_broadcast_v8i64:953; X86:       # %bb.0:954; X86-NEXT:    vbroadcastsd {{[0-9]+}}(%esp), %zmm0955; X86-NEXT:    retl956;957; X64-LABEL: combine_vpermvar_insertion_as_broadcast_v8i64:958; X64:       # %bb.0:959; X64-NEXT:    vpbroadcastq %rdi, %zmm0960; X64-NEXT:    retq961  %1 = insertelement <8 x i64> undef, i64 %a0, i32 0962  %2 = call <8 x i64> @llvm.x86.avx512.permvar.di.512(<8 x i64> %1, <8 x i64> zeroinitializer)963  ret <8 x i64> %2964}965 966define <16 x i32> @blend_of_permutes_v16i32(<8 x i64> %a0, <8x i64> %a1) {967; CHECK-LABEL: blend_of_permutes_v16i32:968; CHECK:       # %bb.0:969; CHECK-NEXT:    vpmovsxbd {{.*#+}} zmm2 = [4,21,6,23,16,1,2,19,12,29,14,31,24,9,10,27]970; CHECK-NEXT:    vpermt2d %zmm1, %zmm2, %zmm0971; CHECK-NEXT:    ret{{[l|q]}}972  %s0 = shufflevector <8 x i64> %a0, <8 x i64> undef, <8 x i32> <i32 2, i32 3, i32 0, i32 1, i32 6, i32 7, i32 4, i32 5>973  %s1 = shufflevector <8 x i64> %a1, <8 x i64> undef, <8 x i32> <i32 2, i32 3, i32 0, i32 1, i32 6, i32 7, i32 4, i32 5>974  %x0 = bitcast <8 x i64> %s0 to <16 x i32>975  %x1 = bitcast <8 x i64> %s1 to <16 x i32>976  %r = shufflevector <16 x i32> %x0, <16 x i32> %x1, <16 x i32> <i32 0, i32 17, i32 2, i32 19, i32 20, i32 5, i32 6, i32 23, i32 8, i32 25, i32 10, i32 27, i32 28, i32 13, i32 14, i32 31>977  ret <16 x i32> %r978}979 980define <8 x double> @concat_vpermilvar_v8f64_v2f64(<2 x double> %a0, <2 x double> %a1, <2 x double> %a2, <2 x double> %a3, <8 x i64> %m) nounwind {981; X86-LABEL: concat_vpermilvar_v8f64_v2f64:982; X86:       # %bb.0:983; X86-NEXT:    pushl %ebp984; X86-NEXT:    movl %esp, %ebp985; X86-NEXT:    andl $-64, %esp986; X86-NEXT:    subl $64, %esp987; X86-NEXT:    # kill: def $xmm2 killed $xmm2 def $ymm2988; X86-NEXT:    # kill: def $xmm0 killed $xmm0 def $ymm0989; X86-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0990; X86-NEXT:    vinsertf128 $1, 8(%ebp), %ymm2, %ymm1991; X86-NEXT:    vinsertf64x4 $1, %ymm1, %zmm0, %zmm0992; X86-NEXT:    vpermilpd 72(%ebp), %zmm0, %zmm0993; X86-NEXT:    movl %ebp, %esp994; X86-NEXT:    popl %ebp995; X86-NEXT:    retl996;997; X64-LABEL: concat_vpermilvar_v8f64_v2f64:998; X64:       # %bb.0:999; X64-NEXT:    # kill: def $xmm2 killed $xmm2 def $ymm21000; X64-NEXT:    # kill: def $xmm0 killed $xmm0 def $ymm01001; X64-NEXT:    vinsertf128 $1, %xmm3, %ymm2, %ymm21002; X64-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm01003; X64-NEXT:    vinsertf64x4 $1, %ymm2, %zmm0, %zmm01004; X64-NEXT:    vpermilpd %zmm4, %zmm0, %zmm01005; X64-NEXT:    retq1006  %m0 = shufflevector <8 x i64> %m, <8 x i64> poison, <2 x i32> <i32 0, i32 1>1007  %m1 = shufflevector <8 x i64> %m, <8 x i64> poison, <2 x i32> <i32 2, i32 3>1008  %m2 = shufflevector <8 x i64> %m, <8 x i64> poison, <2 x i32> <i32 4, i32 5>1009  %m3 = shufflevector <8 x i64> %m, <8 x i64> poison, <2 x i32> <i32 6, i32 7>1010  %v0 = tail call noundef <2 x double> @llvm.x86.avx.vpermilvar.pd(<2 x double> %a0, <2 x i64> %m0)1011  %v1 = tail call noundef <2 x double> @llvm.x86.avx.vpermilvar.pd(<2 x double> %a1, <2 x i64> %m1)1012  %v2 = tail call noundef <2 x double> @llvm.x86.avx.vpermilvar.pd(<2 x double> %a2, <2 x i64> %m2)1013  %v3 = tail call noundef <2 x double> @llvm.x86.avx.vpermilvar.pd(<2 x double> %a3, <2 x i64> %m3)1014  %lo = shufflevector <2 x double> %v0, <2 x double> %v1, <4 x i32> <i32 0, i32 1, i32 2, i32 3>1015  %hi = shufflevector <2 x double> %v2, <2 x double> %v3, <4 x i32> <i32 0, i32 1, i32 2, i32 3>1016  %res = shufflevector <4 x double> %lo, <4 x double> %hi, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>1017  ret <8 x double> %res1018}1019 1020define <8 x double> @concat_vpermilvar_v8f64_v4f64(<4 x double> %a0, <4 x double> %a1, <8 x i64> %m) nounwind {1021; CHECK-LABEL: concat_vpermilvar_v8f64_v4f64:1022; CHECK:       # %bb.0:1023; CHECK-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm01024; CHECK-NEXT:    vinsertf64x4 $1, %ymm1, %zmm0, %zmm01025; CHECK-NEXT:    vpermilpd %zmm2, %zmm0, %zmm01026; CHECK-NEXT:    ret{{[l|q]}}1027  %m0 = shufflevector <8 x i64> %m, <8 x i64> poison, <4 x i32> <i32 0, i32 1, i32 2, i32 3>1028  %m1 = shufflevector <8 x i64> %m, <8 x i64> poison, <4 x i32> <i32 4, i32 5, i32 6, i32 7>1029  %v0 = tail call noundef <4 x double> @llvm.x86.avx.vpermilvar.pd.256(<4 x double> %a0, <4 x i64> %m0)1030  %v1 = tail call noundef <4 x double> @llvm.x86.avx.vpermilvar.pd.256(<4 x double> %a1, <4 x i64> %m1)1031  %res = shufflevector <4 x double> %v0, <4 x double> %v1, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>1032  ret <8 x double> %res1033}1034