diff options
| author | Simon Pilgrim <llvm-dev@redking.me.uk> | 2019-03-03 14:11:05 +0000 |
|---|---|---|
| committer | Simon Pilgrim <llvm-dev@redking.me.uk> | 2019-03-03 14:11:05 +0000 |
| commit | d8e91a54c05a8627e99ffb26743f865168be8a64 (patch) | |
| tree | e30103fbf4f2da2f74d3dac3a5fc0cadc7821b74 /llvm/lib | |
| parent | 11149ea4337c45505c438cb04b612fa228a0eee5 (diff) | |
| download | bcm5719-llvm-d8e91a54c05a8627e99ffb26743f865168be8a64.tar.gz bcm5719-llvm-d8e91a54c05a8627e99ffb26743f865168be8a64.zip | |
[X86] getShuffleScalarElt - peek through insert/extract subvector nodes.
llvm-svn: 355288
Diffstat (limited to 'llvm/lib')
| -rw-r--r-- | llvm/lib/Target/X86/X86ISelLowering.cpp | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp index 7aff9ab9b87..bf7037f58ea 100644 --- a/llvm/lib/Target/X86/X86ISelLowering.cpp +++ b/llvm/lib/Target/X86/X86ISelLowering.cpp @@ -6884,6 +6884,29 @@ static SDValue getShuffleScalarElt(SDNode *N, unsigned Index, SelectionDAG &DAG, Depth+1); } + // Recurse into insert_subvector base/sub vector to find scalars. + if (Opcode == ISD::INSERT_SUBVECTOR && + isa<ConstantSDNode>(N->getOperand(2))) { + SDValue Vec = N->getOperand(0); + SDValue Sub = N->getOperand(1); + EVT SubVT = Sub.getValueType(); + unsigned NumSubElts = SubVT.getVectorNumElements(); + uint64_t SubIdx = N->getConstantOperandVal(2); + + if (SubIdx <= Index && Index < (SubIdx + NumSubElts)) + return getShuffleScalarElt(Sub.getNode(), Index - SubIdx, DAG, Depth + 1); + return getShuffleScalarElt(Vec.getNode(), Index, DAG, Depth + 1); + } + + // Recurse into extract_subvector src vector to find scalars. + if (Opcode == ISD::EXTRACT_SUBVECTOR && + isa<ConstantSDNode>(N->getOperand(1))) { + SDValue Src = N->getOperand(0); + EVT SrcVT = Src.getValueType(); + uint64_t SrcIdx = N->getConstantOperandVal(1); + return getShuffleScalarElt(Src.getNode(), Index + SrcIdx, DAG, Depth + 1); + } + // Actual nodes that may contain scalar elements if (Opcode == ISD::BITCAST) { V = V.getOperand(0); |

