diff options
author | Simon Pilgrim <llvm-dev@redking.me.uk> | 2018-10-05 14:41:00 +0000 |
---|---|---|
committer | Simon Pilgrim <llvm-dev@redking.me.uk> | 2018-10-05 14:41:00 +0000 |
commit | 6c5ab48fe7dedc3360a11814a7ad395f77212bf3 (patch) | |
tree | ff1b2bced9c36d8f66db8173fe3811abdc4bb4af /llvm/lib | |
parent | 29d80f07eeb4f5b609e54f5443166b709a3c6ba6 (diff) | |
download | bcm5719-llvm-6c5ab48fe7dedc3360a11814a7ad395f77212bf3.tar.gz bcm5719-llvm-6c5ab48fe7dedc3360a11814a7ad395f77212bf3.zip |
[X86][AVX] getFauxShuffleMask - add support for INSERT_SUBVECTOR subvector shuffles
Decode subvector shuffles from INSERT_SUBVECTOR(SRC0, SHUFFLE(EXTRACT_SUBVECTOR(SRC1))
This was found necessary while investigating PR39161
llvm-svn: 343853
Diffstat (limited to 'llvm/lib')
-rw-r--r-- | llvm/lib/Target/X86/X86ISelLowering.cpp | 36 |
1 files changed, 36 insertions, 0 deletions
diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp index 45f87bbaada..91fa216c053 100644 --- a/llvm/lib/Target/X86/X86ISelLowering.cpp +++ b/llvm/lib/Target/X86/X86ISelLowering.cpp @@ -6380,6 +6380,42 @@ static bool getFauxShuffleMask(SDValue N, SmallVectorImpl<int> &Mask, Ops.push_back(Op); return true; } + case ISD::INSERT_SUBVECTOR: { + // Handle INSERT_SUBVECTOR(SRC0, SHUFFLE(EXTRACT_SUBVECTOR(SRC1)) where + // SRC0/SRC1 are both of the same valuetype VT. + // TODO - add peekThroughOneUseBitcasts support. + SDValue Src = N.getOperand(0); + SDValue Sub = N.getOperand(1); + EVT SubVT = Sub.getValueType(); + unsigned NumSubElts = SubVT.getVectorNumElements(); + if (!isa<ConstantSDNode>(N.getOperand(2)) || + !N->isOnlyUserOf(Sub.getNode())) + return false; + SmallVector<int, 64> SubMask; + SmallVector<SDValue, 2> SubInputs; + if (!resolveTargetShuffleInputs(Sub, SubInputs, SubMask, DAG)) + return false; + 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)); + } + 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); + Mask[i + InsertIdx] = (NumElts * (1 + InputIdx)) + ExtractIdx + M; + } + } + return true; + } case ISD::SCALAR_TO_VECTOR: { // Match against a scalar_to_vector of an extract from a vector, // for PEXTRW/PEXTRB we must handle the implicit zext of the scalar. |