; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py ; RUN: llc < %s -mtriple=i686-unknown -mattr=+avx512vbmi,+avx512vbmi2,+avx512vl | FileCheck %s --check-prefixes=VLX ; RUN: llc < %s -mtriple=x86_64-unknown -mattr=+avx512vbmi,+avx512vbmi2,+avx512vl | FileCheck %s --check-prefixes=VLX ; RUN: llc < %s -mtriple=i686-unknown -mattr=+avx512vbmi,+avx512vbmi2 | FileCheck %s --check-prefixes=NOVLX ; RUN: llc < %s -mtriple=x86_64-unknown -mattr=+avx512vbmi,+avx512vbmi2 | FileCheck %s --check-prefixes=NOVLX define <16 x i8> @combine_vpshld_vpshufb(<16 x i8> %x, <16 x i8> %y) { ; VLX-LABEL: combine_vpshld_vpshufb: ; VLX: # %bb.0: ; VLX-NEXT: vpshldq $56, %xmm0, %xmm1, %xmm0 ; VLX-NEXT: ret{{[l|q]}} ; ; NOVLX-LABEL: combine_vpshld_vpshufb: ; NOVLX: # %bb.0: ; NOVLX-NEXT: # kill: def $xmm1 killed $xmm1 def $zmm1 ; NOVLX-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0 ; NOVLX-NEXT: vpshldq $56, %zmm0, %zmm1, %zmm0 ; NOVLX-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm0 ; NOVLX-NEXT: vzeroupper ; NOVLX-NEXT: ret{{[l|q]}} %rx = call <16 x i8> @llvm.x86.ssse3.pshuf.b.128(<16 x i8> %x, <16 x i8> ) %ry = call <16 x i8> @llvm.x86.ssse3.pshuf.b.128(<16 x i8> %y, <16 x i8> ) %bx = bitcast <16 x i8> %rx to <2 x i64> %by = bitcast <16 x i8> %ry to <2 x i64> %fsh = call <2 x i64> @llvm.fshl.v2i64(<2 x i64> %bx, <2 x i64> %by, <2 x i64> splat (i64 8)) %bf = bitcast <2 x i64> %fsh to <16 x i8> %r = call <16 x i8> @llvm.x86.ssse3.pshuf.b.128(<16 x i8> %bf, <16 x i8> ) ret <16 x i8> %r } define <16 x i8> @combine_vpshrd_vpshufb(<16 x i8> %x, <16 x i8> %y) { ; VLX-LABEL: combine_vpshrd_vpshufb: ; VLX: # %bb.0: ; VLX-NEXT: vpshldd $8, %xmm0, %xmm1, %xmm0 ; VLX-NEXT: ret{{[l|q]}} ; ; NOVLX-LABEL: combine_vpshrd_vpshufb: ; NOVLX: # %bb.0: ; NOVLX-NEXT: # kill: def $xmm1 killed $xmm1 def $zmm1 ; NOVLX-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0 ; NOVLX-NEXT: vpshldd $8, %zmm0, %zmm1, %zmm0 ; NOVLX-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm0 ; NOVLX-NEXT: vzeroupper ; NOVLX-NEXT: ret{{[l|q]}} %rx = call <16 x i8> @llvm.x86.ssse3.pshuf.b.128(<16 x i8> %x, <16 x i8> ) %ry = call <16 x i8> @llvm.x86.ssse3.pshuf.b.128(<16 x i8> %y, <16 x i8> ) %bx = bitcast <16 x i8> %rx to <4 x i32> %by = bitcast <16 x i8> %ry to <4 x i32> %fsh = call <4 x i32> @llvm.fshr.v4i32(<4 x i32> %bx, <4 x i32> %by, <4 x i32> splat (i32 8)) %bf = bitcast <4 x i32> %fsh to <16 x i8> %r = call <16 x i8> @llvm.x86.ssse3.pshuf.b.128(<16 x i8> %bf, <16 x i8> ) ret <16 x i8> %r } define <16 x i16> @combine_vpshldq_v16i16_shuffle(<16 x i16> %a, <16 x i16> %b) { ; VLX-LABEL: combine_vpshldq_v16i16_shuffle: ; VLX: # %bb.0: ; VLX-NEXT: vpshldq $16, %ymm1, %ymm0, %ymm0 ; VLX-NEXT: ret{{[l|q]}} ; ; NOVLX-LABEL: combine_vpshldq_v16i16_shuffle: ; NOVLX: # %bb.0: ; NOVLX-NEXT: # kill: def $ymm1 killed $ymm1 def $zmm1 ; NOVLX-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0 ; NOVLX-NEXT: vpshldq $16, %zmm1, %zmm0, %zmm0 ; NOVLX-NEXT: # kill: def $ymm0 killed $ymm0 killed $zmm0 ; NOVLX-NEXT: ret{{[l|q]}} %r = shufflevector <16 x i16> %a, <16 x i16> %b, <16 x i32> ret <16 x i16> %r } define <8 x i32> @combine_vpshld_v8i32_shuffle(<8 x i32> %a, <8 x i32> %b) { ; VLX-LABEL: combine_vpshld_v8i32_shuffle: ; VLX: # %bb.0: ; VLX-NEXT: vpshldq $32, %ymm0, %ymm1, %ymm0 ; VLX-NEXT: ret{{[l|q]}} ; ; NOVLX-LABEL: combine_vpshld_v8i32_shuffle: ; NOVLX: # %bb.0: ; NOVLX-NEXT: # kill: def $ymm1 killed $ymm1 def $zmm1 ; NOVLX-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0 ; NOVLX-NEXT: vpshldq $32, %zmm0, %zmm1, %zmm0 ; NOVLX-NEXT: # kill: def $ymm0 killed $ymm0 killed $zmm0 ; NOVLX-NEXT: ret{{[l|q]}} %r = shufflevector <8 x i32> %a, <8 x i32> %b, <8 x i32> ret <8 x i32> %r } define <8 x i8> @PR145276(<8 x i8> %a0, <8 x i8> %a1) { ; VLX-LABEL: PR145276: ; VLX: # %bb.0: ; VLX-NEXT: vpshldq $8, %xmm1, %xmm0, %xmm0 ; VLX-NEXT: ret{{[l|q]}} ; ; NOVLX-LABEL: PR145276: ; NOVLX: # %bb.0: ; NOVLX-NEXT: # kill: def $xmm1 killed $xmm1 def $zmm1 ; NOVLX-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0 ; NOVLX-NEXT: vpshldq $8, %zmm1, %zmm0, %zmm0 ; NOVLX-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm0 ; NOVLX-NEXT: vzeroupper ; NOVLX-NEXT: ret{{[l|q]}} %r = shufflevector <8 x i8> %a0, <8 x i8> %a1, <8 x i32> ret <8 x i8> %r }