From: Simon Pilgrim Date: Fri, 28 Jun 2019 17:57:32 +0000 (+0000) Subject: [X86] CombineShuffleWithExtract - recurse through EXTRACT_SUBVECTOR chain X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=08a4b34e50b6e2c0b2bdfdcd77025f188dcfb842;p=llvm [X86] CombineShuffleWithExtract - recurse through EXTRACT_SUBVECTOR chain git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@364667 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Target/X86/X86ISelLowering.cpp b/lib/Target/X86/X86ISelLowering.cpp index c31e452ed7f..2aa9f50933c 100644 --- a/lib/Target/X86/X86ISelLowering.cpp +++ b/lib/Target/X86/X86ISelLowering.cpp @@ -32047,15 +32047,15 @@ static SDValue combineX86ShuffleChain(ArrayRef Inputs, SDValue Root, SDValue Src1 = V1, Src2 = V2; unsigned Offset1 = 0, Offset2 = 0; - if (V1.getOpcode() == ISD::EXTRACT_SUBVECTOR && - isa(V1.getOperand(1))) { - Src1 = V1.getOperand(0); - Offset1 = V1.getConstantOperandVal(1); - } - if (V2.getOpcode() == ISD::EXTRACT_SUBVECTOR && - isa(V2.getOperand(1))) { - Src2 = V2.getOperand(0); - Offset2 = V2.getConstantOperandVal(1); + while (Src1.getOpcode() == ISD::EXTRACT_SUBVECTOR && + isa(Src1.getOperand(1))) { + Offset1 += Src1.getConstantOperandVal(1); + Src1 = Src1.getOperand(0); + } + while (Src2.getOpcode() == ISD::EXTRACT_SUBVECTOR && + isa(Src2.getOperand(1))) { + Offset2 += Src2.getConstantOperandVal(1); + Src2 = Src2.getOperand(0); } if (Offset1 == 0 && Offset2 == 0) return false; diff --git a/test/CodeGen/X86/shuffle-vs-trunc-512-widen.ll b/test/CodeGen/X86/shuffle-vs-trunc-512-widen.ll index 246ed3e6f54..d6648da025e 100644 --- a/test/CodeGen/X86/shuffle-vs-trunc-512-widen.ll +++ b/test/CodeGen/X86/shuffle-vs-trunc-512-widen.ll @@ -716,11 +716,8 @@ define <16 x i8> @trunc_shuffle_v64i8_01_05_09_13_17_21_25_29_33_37_41_45_49_53_ ; ; AVX512VBMI-LABEL: trunc_shuffle_v64i8_01_05_09_13_17_21_25_29_33_37_41_45_49_53_57_61: ; AVX512VBMI: # %bb.0: -; AVX512VBMI-NEXT: vextracti128 $1, %ymm0, %xmm1 -; AVX512VBMI-NEXT: vmovdqa {{.*#+}} xmm2 = <1,5,9,13,u,u,u,u,u,u,u,u,u,u,u,u> -; AVX512VBMI-NEXT: vpshufb %xmm2, %xmm1, %xmm1 -; AVX512VBMI-NEXT: vpshufb %xmm2, %xmm0, %xmm2 -; AVX512VBMI-NEXT: vpunpckldq {{.*#+}} xmm1 = xmm2[0],xmm1[0],xmm2[1],xmm1[1] +; AVX512VBMI-NEXT: vpbroadcastq {{.*#+}} zmm1 = [2096730264494998785,2096730264494998785,2096730264494998785,2096730264494998785,2096730264494998785,2096730264494998785,2096730264494998785,2096730264494998785] +; AVX512VBMI-NEXT: vpermb %zmm0, %zmm1, %zmm1 ; AVX512VBMI-NEXT: vpbroadcastq {{.*#+}} zmm2 = [4411615795313452321,4411615795313452321,4411615795313452321,4411615795313452321,4411615795313452321,4411615795313452321,4411615795313452321,4411615795313452321] ; AVX512VBMI-NEXT: vpermb %zmm0, %zmm2, %zmm0 ; AVX512VBMI-NEXT: vpblendd {{.*#+}} xmm0 = xmm1[0,1],xmm0[2,3] @@ -804,11 +801,8 @@ define <16 x i8> @trunc_shuffle_v64i8_01_05_09_13_17_21_25_29_33_37_41_45_49_53_ ; ; AVX512VBMI-LABEL: trunc_shuffle_v64i8_01_05_09_13_17_21_25_29_33_37_41_45_49_53_57_62: ; AVX512VBMI: # %bb.0: -; AVX512VBMI-NEXT: vextracti128 $1, %ymm0, %xmm1 -; AVX512VBMI-NEXT: vmovdqa {{.*#+}} xmm2 = <1,5,9,13,u,u,u,u,u,u,u,u,u,u,u,u> -; AVX512VBMI-NEXT: vpshufb %xmm2, %xmm1, %xmm1 -; AVX512VBMI-NEXT: vpshufb %xmm2, %xmm0, %xmm2 -; AVX512VBMI-NEXT: vpunpckldq {{.*#+}} xmm1 = xmm2[0],xmm1[0],xmm2[1],xmm1[1] +; AVX512VBMI-NEXT: vpbroadcastq {{.*#+}} zmm1 = [2096730264494998785,2096730264494998785,2096730264494998785,2096730264494998785,2096730264494998785,2096730264494998785,2096730264494998785,2096730264494998785] +; AVX512VBMI-NEXT: vpermb %zmm0, %zmm1, %zmm1 ; AVX512VBMI-NEXT: vpbroadcastq {{.*#+}} zmm2 = [4483673389351380257,4483673389351380257,4483673389351380257,4483673389351380257,4483673389351380257,4483673389351380257,4483673389351380257,4483673389351380257] ; AVX512VBMI-NEXT: vpermb %zmm0, %zmm2, %zmm0 ; AVX512VBMI-NEXT: vpblendd {{.*#+}} xmm0 = xmm1[0,1],xmm0[2,3] diff --git a/test/CodeGen/X86/shuffle-vs-trunc-512.ll b/test/CodeGen/X86/shuffle-vs-trunc-512.ll index bf704873d6f..a98dbfd317b 100644 --- a/test/CodeGen/X86/shuffle-vs-trunc-512.ll +++ b/test/CodeGen/X86/shuffle-vs-trunc-512.ll @@ -707,11 +707,8 @@ define <16 x i8> @trunc_shuffle_v64i8_01_05_09_13_17_21_25_29_33_37_41_45_49_53_ ; ; AVX512VBMI-LABEL: trunc_shuffle_v64i8_01_05_09_13_17_21_25_29_33_37_41_45_49_53_57_61: ; AVX512VBMI: # %bb.0: -; AVX512VBMI-NEXT: vextracti128 $1, %ymm0, %xmm1 -; AVX512VBMI-NEXT: vmovdqa {{.*#+}} xmm2 = <1,5,9,13,u,u,u,u,u,u,u,u,u,u,u,u> -; AVX512VBMI-NEXT: vpshufb %xmm2, %xmm1, %xmm1 -; AVX512VBMI-NEXT: vpshufb %xmm2, %xmm0, %xmm2 -; AVX512VBMI-NEXT: vpunpckldq {{.*#+}} xmm1 = xmm2[0],xmm1[0],xmm2[1],xmm1[1] +; AVX512VBMI-NEXT: vpbroadcastq {{.*#+}} zmm1 = [2096730264494998785,2096730264494998785,2096730264494998785,2096730264494998785,2096730264494998785,2096730264494998785,2096730264494998785,2096730264494998785] +; AVX512VBMI-NEXT: vpermb %zmm0, %zmm1, %zmm1 ; AVX512VBMI-NEXT: vpbroadcastq {{.*#+}} zmm2 = [4411615795313452321,4411615795313452321,4411615795313452321,4411615795313452321,4411615795313452321,4411615795313452321,4411615795313452321,4411615795313452321] ; AVX512VBMI-NEXT: vpermb %zmm0, %zmm2, %zmm0 ; AVX512VBMI-NEXT: vpblendd {{.*#+}} xmm0 = xmm1[0,1],xmm0[2,3] @@ -795,11 +792,8 @@ define <16 x i8> @trunc_shuffle_v64i8_01_05_09_13_17_21_25_29_33_37_41_45_49_53_ ; ; AVX512VBMI-LABEL: trunc_shuffle_v64i8_01_05_09_13_17_21_25_29_33_37_41_45_49_53_57_62: ; AVX512VBMI: # %bb.0: -; AVX512VBMI-NEXT: vextracti128 $1, %ymm0, %xmm1 -; AVX512VBMI-NEXT: vmovdqa {{.*#+}} xmm2 = <1,5,9,13,u,u,u,u,u,u,u,u,u,u,u,u> -; AVX512VBMI-NEXT: vpshufb %xmm2, %xmm1, %xmm1 -; AVX512VBMI-NEXT: vpshufb %xmm2, %xmm0, %xmm2 -; AVX512VBMI-NEXT: vpunpckldq {{.*#+}} xmm1 = xmm2[0],xmm1[0],xmm2[1],xmm1[1] +; AVX512VBMI-NEXT: vpbroadcastq {{.*#+}} zmm1 = [2096730264494998785,2096730264494998785,2096730264494998785,2096730264494998785,2096730264494998785,2096730264494998785,2096730264494998785,2096730264494998785] +; AVX512VBMI-NEXT: vpermb %zmm0, %zmm1, %zmm1 ; AVX512VBMI-NEXT: vpbroadcastq {{.*#+}} zmm2 = [4483673389351380257,4483673389351380257,4483673389351380257,4483673389351380257,4483673389351380257,4483673389351380257,4483673389351380257,4483673389351380257] ; AVX512VBMI-NEXT: vpermb %zmm0, %zmm2, %zmm0 ; AVX512VBMI-NEXT: vpblendd {{.*#+}} xmm0 = xmm1[0,1],xmm0[2,3]