diff options
author | Simon Pilgrim <llvm-dev@redking.me.uk> | 2019-02-02 18:08:04 +0000 |
---|---|---|
committer | Simon Pilgrim <llvm-dev@redking.me.uk> | 2019-02-02 18:08:04 +0000 |
commit | dbf302c9f1512a19cfbe1bbb2a74b99e23b9d96d (patch) | |
tree | f133218262f17072543c958bf68dd1bdc424c3ab /llvm/lib | |
parent | bd42f9794655a29745612a07a236fac742736dea (diff) | |
download | bcm5719-llvm-dbf302c9f1512a19cfbe1bbb2a74b99e23b9d96d.tar.gz bcm5719-llvm-dbf302c9f1512a19cfbe1bbb2a74b99e23b9d96d.zip |
[X86][AVX] Enable INSERT_SUBVECTOR(SRC0, SHUFFLE(SRC1)) shuffle combining
Push the insert_subvector up through the shuffle operands to help find more cross-lane shuffles.
The is exposes a couple of minor issues that will be fixed shortly:
Missed broadcast folds - we have a mixture of vzext_load lengths that need cleaning up
combine-sdiv.ll - AVX1 SimplifyDemandedVectorElts failure (hits max depth due to a couple of extra bitcasts).
llvm-svn: 352963
Diffstat (limited to 'llvm/lib')
-rw-r--r-- | llvm/lib/Target/X86/X86ISelLowering.cpp | 42 |
1 files changed, 27 insertions, 15 deletions
diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp index 2fc4d2c2907..b15fac7129e 100644 --- a/llvm/lib/Target/X86/X86ISelLowering.cpp +++ b/llvm/lib/Target/X86/X86ISelLowering.cpp @@ -6500,14 +6500,14 @@ static bool setTargetShuffleZeroElements(SDValue N, static bool resolveTargetShuffleInputs(SDValue Op, SmallVectorImpl<SDValue> &Inputs, SmallVectorImpl<int> &Mask, - const SelectionDAG &DAG); + SelectionDAG &DAG); // 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<int> &Mask, SmallVectorImpl<SDValue> &Ops, - const SelectionDAG &DAG) { + SelectionDAG &DAG) { Mask.clear(); Ops.clear(); @@ -6590,8 +6590,7 @@ static bool getFauxShuffleMask(SDValue N, SmallVectorImpl<int> &Mask, return true; } case ISD::INSERT_SUBVECTOR: { - // Handle INSERT_SUBVECTOR(SRC0, SHUFFLE(EXTRACT_SUBVECTOR(SRC1)) where - // SRC0/SRC1 are both of the same valuetype VT. + // Handle INSERT_SUBVECTOR(SRC0, SHUFFLE(SRC1)). SDValue Src = N.getOperand(0); SDValue Sub = N.getOperand(1); EVT SubVT = Sub.getValueType(); @@ -6604,25 +6603,38 @@ static bool getFauxShuffleMask(SDValue N, SmallVectorImpl<int> &Mask, if (!resolveTargetShuffleInputs(peekThroughOneUseBitcasts(Sub), SubInputs, SubMask, DAG)) return false; - if (SubMask.size() != NumSubElts) - return false; + int InsertIdx = N.getConstantOperandVal(2); + if (SubMask.size() != NumSubElts) { + assert(((SubMask.size() % NumSubElts) == 0 || + (NumSubElts % SubMask.size()) == 0) && "Illegal submask scale"); + if ((NumSubElts % SubMask.size()) == 0) { + int Scale = NumSubElts / SubMask.size(); + SmallVector<int,64> ScaledSubMask; + scaleShuffleMask<int>(Scale, SubMask, ScaledSubMask); + SubMask = ScaledSubMask; + } else { + int Scale = SubMask.size() / NumSubElts; + NumSubElts = SubMask.size(); + NumElts *= Scale; + InsertIdx *= Scale; + } + } Ops.push_back(Src); for (SDValue &SubInput : SubInputs) { - if (SubInput.getOpcode() != ISD::EXTRACT_SUBVECTOR || - SubInput.getOperand(0).getValueType() != VT || - !isa<ConstantSDNode>(SubInput.getOperand(1))) - return false; - Ops.push_back(SubInput.getOperand(0)); + EVT SubSVT = SubInput.getValueType().getScalarType(); + EVT AltVT = EVT::getVectorVT(*DAG.getContext(), SubSVT, + NumSizeInBits / SubSVT.getSizeInBits()); + Ops.push_back(DAG.getNode(ISD::INSERT_SUBVECTOR, SDLoc(N), AltVT, + DAG.getUNDEF(AltVT), SubInput, + DAG.getIntPtrConstant(0, SDLoc(N)))); } - int InsertIdx = N.getConstantOperandVal(2); for (int i = 0; i != (int)NumElts; ++i) Mask.push_back(i); for (int i = 0; i != (int)NumSubElts; ++i) { int M = SubMask[i]; if (0 <= M) { int InputIdx = M / NumSubElts; - int ExtractIdx = SubInputs[InputIdx].getConstantOperandVal(1); - M = (NumElts * (1 + InputIdx)) + ExtractIdx + (M % NumSubElts); + M = (NumElts * (1 + InputIdx)) + (M % NumSubElts); } Mask[i + InsertIdx] = M; } @@ -6813,7 +6825,7 @@ static void resolveTargetShuffleInputsAndMask(SmallVectorImpl<SDValue> &Inputs, static bool resolveTargetShuffleInputs(SDValue Op, SmallVectorImpl<SDValue> &Inputs, SmallVectorImpl<int> &Mask, - const SelectionDAG &DAG) { + SelectionDAG &DAG) { if (!setTargetShuffleZeroElements(Op, Mask, Inputs)) if (!getFauxShuffleMask(Op, Mask, Inputs, DAG)) return false; |