diff options
| author | Bradley Smith <bradley.smith@arm.com> | 2021-07-08 11:28:38 +0000 |
|---|---|---|
| committer | Bradley Smith <bradley.smith@arm.com> | 2021-07-12 15:20:44 +0000 |
| commit | 112c09039bbf111c4fa448a0c84ba68b12fed2d6 (patch) | |
| tree | 560e03b3e11c2010b95d871ff0da786a39b26f38 /llvm/lib | |
| parent | 396f2e9d6d17d4288616218f07aa93daf01fbe5d (diff) | |
| download | llvm-112c09039bbf111c4fa448a0c84ba68b12fed2d6.zip llvm-112c09039bbf111c4fa448a0c84ba68b12fed2d6.tar.gz llvm-112c09039bbf111c4fa448a0c84ba68b12fed2d6.tar.bz2 | |
[SelectionDAG] Simplify PromoteIntRes_INSERT_SUBVECTOR to only handle result
Let other parts of legalization handle the rest of the node, this allows
re-use of existing optimizations elsewhere.
Differential Revision: https://reviews.llvm.org/D105624
Diffstat (limited to 'llvm/lib')
| -rw-r--r-- | llvm/lib/CodeGen/SelectionDAG/LegalizeIntegerTypes.cpp | 35 |
1 files changed, 6 insertions, 29 deletions
diff --git a/llvm/lib/CodeGen/SelectionDAG/LegalizeIntegerTypes.cpp b/llvm/lib/CodeGen/SelectionDAG/LegalizeIntegerTypes.cpp index 7dc0cd0..c48468d 100644 --- a/llvm/lib/CodeGen/SelectionDAG/LegalizeIntegerTypes.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/LegalizeIntegerTypes.cpp @@ -4741,38 +4741,15 @@ SDValue DAGTypeLegalizer::PromoteIntRes_INSERT_SUBVECTOR(SDNode *N) { SDValue SubVec = N->getOperand(1); SDValue Idx = N->getOperand(2); - auto *ConstantIdx = cast<ConstantSDNode>(Idx); - unsigned IdxN = ConstantIdx->getZExtValue(); - - EVT VecVT = Vec.getValueType(); EVT SubVecVT = SubVec.getValueType(); + EVT NSubVT = + EVT::getVectorVT(*DAG.getContext(), NOutVT.getVectorElementType(), + SubVecVT.getVectorElementCount()); - // To insert SubVec into Vec, store the wider vector to memory, overwrite the - // appropriate bits with the narrower vector, and reload. - Align SmallestAlign = DAG.getReducedAlign(SubVecVT, /*UseABI=*/false); - - SDValue StackPtr = - DAG.CreateStackTemporary(VecVT.getStoreSize(), SmallestAlign); - auto StackPtrVT = StackPtr->getValueType(0); - auto &MF = DAG.getMachineFunction(); - auto FrameIndex = cast<FrameIndexSDNode>(StackPtr.getNode())->getIndex(); - auto PtrInfo = MachinePointerInfo::getFixedStack(MF, FrameIndex); - - SDValue Store = DAG.getStore(DAG.getEntryNode(), dl, Vec, StackPtr, PtrInfo, - SmallestAlign); - - SDValue ScaledIdx = Idx; - if (SubVecVT.isScalableVector() && IdxN != 0) { - APInt IdxAPInt = cast<ConstantSDNode>(Idx)->getAPIntValue(); - ScaledIdx = DAG.getVScale(dl, StackPtrVT, - IdxAPInt.sextOrSelf(StackPtrVT.getSizeInBits())); - } + Vec = GetPromotedInteger(Vec); + SubVec = DAG.getNode(ISD::ANY_EXTEND, dl, NSubVT, SubVec); - SDValue SubVecPtr = - TLI.getVectorSubVecPointer(DAG, StackPtr, VecVT, SubVecVT, ScaledIdx); - Store = DAG.getStore(Store, dl, SubVec, SubVecPtr, PtrInfo, SmallestAlign); - return DAG.getExtLoad(ISD::LoadExtType::EXTLOAD, dl, NOutVT, Store, StackPtr, - PtrInfo, OutVT, SmallestAlign); + return DAG.getNode(ISD::INSERT_SUBVECTOR, dl, NOutVT, Vec, SubVec, Idx); } SDValue DAGTypeLegalizer::PromoteIntRes_VECTOR_REVERSE(SDNode *N) { |
