From: Simon Pilgrim Date: Thu, 27 Jun 2019 12:35:52 +0000 (+0000) Subject: [X86] getFauxShuffle - add DemandedElts as a filter X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=98ce5f9f8c727d96a7f612670733101f55059891;p=llvm [X86] getFauxShuffle - add DemandedElts as a filter This is currently benign but will be used in the future based on the elements referenced by the parent shuffle(s). git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@364530 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Target/X86/X86ISelLowering.cpp b/lib/Target/X86/X86ISelLowering.cpp index b15edb270a9..b63dcd26913 100644 --- a/lib/Target/X86/X86ISelLowering.cpp +++ b/lib/Target/X86/X86ISelLowering.cpp @@ -6620,7 +6620,8 @@ static bool resolveTargetShuffleInputs(SDValue Op, // Attempt to decode ops that could be represented as a shuffle mask. // The decoded shuffle mask may contain a different number of elements to the // destination value type. -static bool getFauxShuffleMask(SDValue N, SmallVectorImpl &Mask, +static bool getFauxShuffleMask(SDValue N, const APInt &DemandedElts, + SmallVectorImpl &Mask, SmallVectorImpl &Ops, SelectionDAG &DAG) { Mask.clear(); @@ -6632,6 +6633,7 @@ static bool getFauxShuffleMask(SDValue N, SmallVectorImpl &Mask, unsigned NumBitsPerElt = VT.getScalarSizeInBits(); if ((NumBitsPerElt % 8) != 0 || (NumSizeInBits % 8) != 0) return false; + assert(NumElts == DemandedElts.getBitWidth() && "Unexpected vector size"); unsigned Opcode = N.getOpcode(); switch (Opcode) { @@ -6673,8 +6675,8 @@ static bool getFauxShuffleMask(SDValue N, SmallVectorImpl &Mask, case ISD::OR: { // Inspect each operand at the byte level. We can merge these into a // blend shuffle mask if for each byte at least one is masked out (zero). - KnownBits Known0 = DAG.computeKnownBits(N.getOperand(0)); - KnownBits Known1 = DAG.computeKnownBits(N.getOperand(1)); + KnownBits Known0 = DAG.computeKnownBits(N.getOperand(0), DemandedElts); + KnownBits Known1 = DAG.computeKnownBits(N.getOperand(1), DemandedElts); if (Known0.One.isNullValue() && Known1.One.isNullValue()) { bool IsByteMask = true; unsigned NumSizeInBytes = NumSizeInBits / 8; @@ -6881,16 +6883,21 @@ static bool getFauxShuffleMask(SDValue N, SmallVectorImpl &Mask, N1.getValueType().getVectorNumElements() == (NumElts / 2) && "Unexpected input value type"); + APInt EltsLHS, EltsRHS; + getPackDemandedElts(VT, DemandedElts, EltsLHS, EltsRHS); + // If we know input saturation won't happen we can treat this // as a truncation shuffle. if (Opcode == X86ISD::PACKSS) { - if ((!N0.isUndef() && DAG.ComputeNumSignBits(N0) <= NumBitsPerElt) || - (!N1.isUndef() && DAG.ComputeNumSignBits(N1) <= NumBitsPerElt)) + if ((!N0.isUndef() && + DAG.ComputeNumSignBits(N0, EltsLHS) <= NumBitsPerElt) || + (!N1.isUndef() && + DAG.ComputeNumSignBits(N1, EltsRHS) <= NumBitsPerElt)) return false; } else { APInt ZeroMask = APInt::getHighBitsSet(2 * NumBitsPerElt, NumBitsPerElt); - if ((!N0.isUndef() && !DAG.MaskedValueIsZero(N0, ZeroMask)) || - (!N1.isUndef() && !DAG.MaskedValueIsZero(N1, ZeroMask))) + if ((!N0.isUndef() && !DAG.MaskedValueIsZero(N0, ZeroMask, EltsLHS)) || + (!N1.isUndef() && !DAG.MaskedValueIsZero(N1, ZeroMask, EltsRHS))) return false; } @@ -7027,8 +7034,10 @@ static bool resolveTargetShuffleInputs(SDValue Op, SmallVectorImpl &Inputs, SmallVectorImpl &Mask, SelectionDAG &DAG) { + unsigned NumElts = Op.getValueType().getVectorNumElements(); + APInt DemandedElts = APInt::getAllOnesValue(NumElts); if (!setTargetShuffleZeroElements(Op, Mask, Inputs)) - if (!getFauxShuffleMask(Op, Mask, Inputs, DAG)) + if (!getFauxShuffleMask(Op, DemandedElts, Mask, Inputs, DAG)) return false; resolveTargetShuffleInputsAndMask(Inputs, Mask);