forked from OSchip/llvm-project
[AVX-512] Add support for changing VSHUFF64x2 to VSHUFF32x4 when its feeding a vselect with 32-bit element size.
Summary: Shuffle lowering may have widened the element size of a i32 shuffle to i64 before selecting X86ISD::SHUF128. If this shuffle was used by a vselect this can prevent us from selecting masked operations. This patch detects this and changes the element size to match the vselect. I don't handle changing integer to floating point or vice versa as its not clear if its better to push such a bitcast to the inputs of the shuffle or to the user of the vselect. So I'm ignoring that case for now. Reviewers: delena, zvi, RKSimon Subscribers: llvm-commits Differential Revision: https://reviews.llvm.org/D27087 llvm-svn: 287939
This commit is contained in:
parent
f04777527e
commit
88071b37ab
|
@ -27834,11 +27834,24 @@ static bool combineBitcastForMaskedOp(SDValue OrigOp, SelectionDAG &DAG,
|
|||
MVT EltVT = VT.getVectorElementType();
|
||||
SDLoc DL(Op.getNode());
|
||||
|
||||
switch (Op.getOpcode()) {
|
||||
auto BitcastAndCombineShuffle = [&](unsigned Opcode, SDValue Op0, SDValue Op1,
|
||||
SDValue Op2) {
|
||||
Op0 = DAG.getBitcast(VT, Op0);
|
||||
DCI.AddToWorklist(Op0.getNode());
|
||||
Op1 = DAG.getBitcast(VT, Op1);
|
||||
DCI.AddToWorklist(Op1.getNode());
|
||||
DCI.CombineTo(OrigOp.getNode(),
|
||||
DAG.getNode(Opcode, DL, VT, Op0, Op1, Op2));
|
||||
return true;
|
||||
};
|
||||
|
||||
unsigned Opcode = Op.getOpcode();
|
||||
switch (Opcode) {
|
||||
case X86ISD::PALIGNR:
|
||||
// PALIGNR can be converted to VALIGND/Q for 128-bit vectors.
|
||||
if (!VT.is128BitVector())
|
||||
return false;
|
||||
Opcode = X86ISD::VALIGN;
|
||||
LLVM_FALLTHROUGH;
|
||||
case X86ISD::VALIGN: {
|
||||
if (EltVT != MVT::i32 && EltVT != MVT::i64)
|
||||
|
@ -27851,14 +27864,17 @@ static bool combineBitcastForMaskedOp(SDValue OrigOp, SelectionDAG &DAG,
|
|||
if ((ShiftAmt % EltSize) != 0)
|
||||
return false;
|
||||
Imm = ShiftAmt / EltSize;
|
||||
SDValue Op0 = DAG.getBitcast(VT, Op.getOperand(0));
|
||||
DCI.AddToWorklist(Op0.getNode());
|
||||
SDValue Op1 = DAG.getBitcast(VT, Op.getOperand(1));
|
||||
DCI.AddToWorklist(Op1.getNode());
|
||||
DCI.CombineTo(OrigOp.getNode(),
|
||||
DAG.getNode(X86ISD::VALIGN, DL, VT, Op0, Op1,
|
||||
DAG.getConstant(Imm, DL, MVT::i8)));
|
||||
return true;
|
||||
return BitcastAndCombineShuffle(Opcode, Op.getOperand(0), Op.getOperand(1),
|
||||
DAG.getConstant(Imm, DL, MVT::i8));
|
||||
}
|
||||
case X86ISD::SHUF128: {
|
||||
if (EltVT.getSizeInBits() != 32 && EltVT.getSizeInBits() != 64)
|
||||
return false;
|
||||
// Only change element size, not type.
|
||||
if (VT.isInteger() != Op.getSimpleValueType().isInteger())
|
||||
return false;
|
||||
return BitcastAndCombineShuffle(Opcode, Op.getOperand(0), Op.getOperand(1),
|
||||
Op.getOperand(2));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -431,16 +431,16 @@ define <16 x float> @test_vshuff32x4_512_mask(<16 x float> %x, <16 x float> %x1,
|
|||
; AVX512F-NEXT: vpmovsxbd %xmm3, %zmm3
|
||||
; AVX512F-NEXT: vpslld $31, %zmm3, %zmm3
|
||||
; AVX512F-NEXT: vptestmd %zmm3, %zmm3, %k1
|
||||
; AVX512F-NEXT: vshuff64x2 {{.*#+}} zmm0 = zmm0[0,1,2,3],zmm1[2,3,0,1]
|
||||
; AVX512F-NEXT: vblendmps %zmm0, %zmm2, %zmm0 {%k1}
|
||||
; AVX512F-NEXT: vshuff32x4 {{.*#+}} zmm2 {%k1} = zmm0[0,1,2,3,4,5,6,7],zmm1[4,5,6,7,0,1,2,3]
|
||||
; AVX512F-NEXT: vmovaps %zmm2, %zmm0
|
||||
; AVX512F-NEXT: retq
|
||||
;
|
||||
; AVX512BW-LABEL: test_vshuff32x4_512_mask:
|
||||
; AVX512BW: # BB#0:
|
||||
; AVX512BW-NEXT: vpsllw $7, %xmm3, %xmm3
|
||||
; AVX512BW-NEXT: vpmovb2m %zmm3, %k1
|
||||
; AVX512BW-NEXT: vshuff64x2 {{.*#+}} zmm0 = zmm0[0,1,2,3],zmm1[2,3,0,1]
|
||||
; AVX512BW-NEXT: vblendmps %zmm0, %zmm2, %zmm0 {%k1}
|
||||
; AVX512BW-NEXT: vshuff32x4 {{.*#+}} zmm2 {%k1} = zmm0[0,1,2,3,4,5,6,7],zmm1[4,5,6,7,0,1,2,3]
|
||||
; AVX512BW-NEXT: vmovaps %zmm2, %zmm0
|
||||
; AVX512BW-NEXT: retq
|
||||
%x2 = shufflevector <16 x float> %x, <16 x float> %x1, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 20, i32 21, i32 22, i32 23, i32 16, i32 17, i32 18, i32 19>
|
||||
%res = select <16 x i1> %mask, <16 x float> %x2, <16 x float> %y
|
||||
|
@ -453,16 +453,16 @@ define <16 x i32> @test_vshufi32x4_512_mask(<16 x i32> %x, <16 x i32> %x1, <16 x
|
|||
; AVX512F-NEXT: vpmovsxbd %xmm3, %zmm3
|
||||
; AVX512F-NEXT: vpslld $31, %zmm3, %zmm3
|
||||
; AVX512F-NEXT: vptestmd %zmm3, %zmm3, %k1
|
||||
; AVX512F-NEXT: vshufi64x2 {{.*#+}} zmm0 = zmm0[0,1,2,3],zmm1[2,3,0,1]
|
||||
; AVX512F-NEXT: vpblendmd %zmm0, %zmm2, %zmm0 {%k1}
|
||||
; AVX512F-NEXT: vshufi32x4 {{.*#+}} zmm2 {%k1} = zmm0[0,1,2,3,4,5,6,7],zmm1[4,5,6,7,0,1,2,3]
|
||||
; AVX512F-NEXT: vmovdqa64 %zmm2, %zmm0
|
||||
; AVX512F-NEXT: retq
|
||||
;
|
||||
; AVX512BW-LABEL: test_vshufi32x4_512_mask:
|
||||
; AVX512BW: # BB#0:
|
||||
; AVX512BW-NEXT: vpsllw $7, %xmm3, %xmm3
|
||||
; AVX512BW-NEXT: vpmovb2m %zmm3, %k1
|
||||
; AVX512BW-NEXT: vshufi64x2 {{.*#+}} zmm0 = zmm0[0,1,2,3],zmm1[2,3,0,1]
|
||||
; AVX512BW-NEXT: vpblendmd %zmm0, %zmm2, %zmm0 {%k1}
|
||||
; AVX512BW-NEXT: vshufi32x4 {{.*#+}} zmm2 {%k1} = zmm0[0,1,2,3,4,5,6,7],zmm1[4,5,6,7,0,1,2,3]
|
||||
; AVX512BW-NEXT: vmovdqa64 %zmm2, %zmm0
|
||||
; AVX512BW-NEXT: retq
|
||||
%x2 = shufflevector <16 x i32> %x, <16 x i32> %x1, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 20, i32 21, i32 22, i32 23, i32 16, i32 17, i32 18, i32 19>
|
||||
%res = select <16 x i1> %mask, <16 x i32> %x2, <16 x i32> %y
|
||||
|
|
Loading…
Reference in New Issue