aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib
diff options
context:
space:
mode:
authorBradley Smith <bradley.smith@arm.com>2021-07-08 11:28:38 +0000
committerBradley Smith <bradley.smith@arm.com>2021-07-12 15:20:44 +0000
commit112c09039bbf111c4fa448a0c84ba68b12fed2d6 (patch)
tree560e03b3e11c2010b95d871ff0da786a39b26f38 /llvm/lib
parent396f2e9d6d17d4288616218f07aa93daf01fbe5d (diff)
downloadllvm-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.cpp35
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) {