diff options
author | Simon Pilgrim <llvm-dev@redking.me.uk> | 2018-07-17 09:45:35 +0000 |
---|---|---|
committer | Simon Pilgrim <llvm-dev@redking.me.uk> | 2018-07-17 09:45:35 +0000 |
commit | ead04a955999bd9e1f471b833f1f58fd5466ddbd (patch) | |
tree | 7eb077b724a2bb540bf978092a4c08e808d8004f /lib/Target/SystemZ | |
parent | 15fa57ae79a42c5fb1d59c25841657049a0404ec (diff) |
[DAGCombiner] Call SimplifyDemandedVectorElts from EXTRACT_VECTOR_ELT
If we are only extracting vector elements via EXTRACT_VECTOR_ELT(s) we may be able to use SimplifyDemandedVectorElts to avoid unnecessary vector ops.
Differential Revision: https://reviews.llvm.org/D49262
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@337258 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Target/SystemZ')
-rw-r--r-- | lib/Target/SystemZ/SystemZISelLowering.cpp | 36 |
1 files changed, 26 insertions, 10 deletions
diff --git a/lib/Target/SystemZ/SystemZISelLowering.cpp b/lib/Target/SystemZ/SystemZISelLowering.cpp index e69afd8a36a..302c7883f97 100644 --- a/lib/Target/SystemZ/SystemZISelLowering.cpp +++ b/lib/Target/SystemZ/SystemZISelLowering.cpp @@ -3893,20 +3893,34 @@ static const Permute *matchDoublePermute(const SmallVectorImpl<int> &Bytes, return nullptr; } -// Convert the mask of the given VECTOR_SHUFFLE into a byte-level mask, +// Convert the mask of the given shuffle op into a byte-level mask, // as if it had type vNi8. -static void getVPermMask(ShuffleVectorSDNode *VSN, +static bool getVPermMask(SDValue ShuffleOp, SmallVectorImpl<int> &Bytes) { - EVT VT = VSN->getValueType(0); + EVT VT = ShuffleOp.getValueType(); unsigned NumElements = VT.getVectorNumElements(); unsigned BytesPerElement = VT.getVectorElementType().getStoreSize(); - Bytes.resize(NumElements * BytesPerElement, -1); - for (unsigned I = 0; I < NumElements; ++I) { - int Index = VSN->getMaskElt(I); - if (Index >= 0) + + if (auto *VSN = dyn_cast<ShuffleVectorSDNode>(ShuffleOp)) { + Bytes.resize(NumElements * BytesPerElement, -1); + for (unsigned I = 0; I < NumElements; ++I) { + int Index = VSN->getMaskElt(I); + if (Index >= 0) + for (unsigned J = 0; J < BytesPerElement; ++J) + Bytes[I * BytesPerElement + J] = Index * BytesPerElement + J; + } + return true; + } + if (SystemZISD::SPLAT == ShuffleOp.getOpcode() && + isa<ConstantSDNode>(ShuffleOp.getOperand(1))) { + unsigned Index = ShuffleOp.getConstantOperandVal(1); + Bytes.resize(NumElements * BytesPerElement, -1); + for (unsigned I = 0; I < NumElements; ++I) for (unsigned J = 0; J < BytesPerElement; ++J) Bytes[I * BytesPerElement + J] = Index * BytesPerElement + J; + return true; } + return false; } // Bytes is a VPERM-like permute vector, except that -1 is used for @@ -4075,7 +4089,8 @@ bool GeneralShuffle::add(SDValue Op, unsigned Elem) { // See whether the bytes we need come from a contiguous part of one // operand. SmallVector<int, SystemZ::VectorBytes> OpBytes; - getVPermMask(cast<ShuffleVectorSDNode>(Op), OpBytes); + if (!getVPermMask(Op, OpBytes)) + break; int NewByte; if (!getShuffleInput(OpBytes, Byte, BytesPerElement, NewByte)) break; @@ -5109,13 +5124,14 @@ SDValue SystemZTargetLowering::combineExtract(const SDLoc &DL, EVT ResVT, if (Opcode == ISD::BITCAST) // Look through bitcasts. Op = Op.getOperand(0); - else if (Opcode == ISD::VECTOR_SHUFFLE && + else if ((Opcode == ISD::VECTOR_SHUFFLE || Opcode == SystemZISD::SPLAT) && canTreatAsByteVector(Op.getValueType())) { // Get a VPERM-like permute mask and see whether the bytes covered // by the extracted element are a contiguous sequence from one // source operand. SmallVector<int, SystemZ::VectorBytes> Bytes; - getVPermMask(cast<ShuffleVectorSDNode>(Op), Bytes); + if (!getVPermMask(Op, Bytes)) + break; int First; if (!getShuffleInput(Bytes, Index * BytesPerElement, BytesPerElement, First)) |