From 1e30bf8621cc123a7afba3246a36187c5ce3c836 Mon Sep 17 00:00:00 2001 From: Eli Friedman Date: Mon, 12 Jul 2021 15:11:01 -0700 Subject: [PATCH] [SelectionDAG] Add an overload of getStepVector that assumes step 1. This is mostly a minor convenience, but the pattern seems frequent enough to be worthwhile (and we'll probably add more uses in the future). Differential Revision: https://reviews.llvm.org/D105850 --- llvm/include/llvm/CodeGen/SelectionDAG.h | 4 ++++ llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp | 5 +++++ llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp | 5 +---- llvm/lib/Target/AArch64/AArch64ISelLowering.cpp | 6 ++---- 4 files changed, 12 insertions(+), 8 deletions(-) diff --git a/llvm/include/llvm/CodeGen/SelectionDAG.h b/llvm/include/llvm/CodeGen/SelectionDAG.h index 5e12da6..8cbdf7e 100644 --- a/llvm/include/llvm/CodeGen/SelectionDAG.h +++ b/llvm/include/llvm/CodeGen/SelectionDAG.h @@ -837,6 +837,10 @@ public: /// <0, Step, Step * 2, Step * 3, ...> SDValue getStepVector(const SDLoc &DL, EVT ResVT, SDValue Step); + /// Returns a vector of type ResVT whose elements contain the linear sequence + /// <0, 1, 2, 3, ...> + SDValue getStepVector(const SDLoc &DL, EVT ResVT); + /// Returns an ISD::VECTOR_SHUFFLE node semantically equivalent to /// the shuffle node in input but with swapped operands. /// diff --git a/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp b/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp index 0dbcfef..e194e1b 100644 --- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp @@ -1747,6 +1747,11 @@ SDValue SelectionDAG::getCondCode(ISD::CondCode Cond) { return SDValue(CondCodeNodes[Cond], 0); } +SDValue SelectionDAG::getStepVector(const SDLoc &DL, EVT ResVT) { + EVT OpVT = TLI->getTypeToTransformTo(*getContext(), ResVT.getScalarType()); + return getStepVector(DL, ResVT, getConstant(1, DL, OpVT)); +} + SDValue SelectionDAG::getStepVector(const SDLoc &DL, EVT ResVT, SDValue Step) { if (ResVT.isScalableVector()) return getNode(ISD::STEP_VECTOR, DL, ResVT, Step); diff --git a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp index 58e691a..d56d4bc 100644 --- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp @@ -11074,10 +11074,7 @@ void SelectionDAGBuilder::visitStepVector(const CallInst &I) { const TargetLowering &TLI = DAG.getTargetLoweringInfo(); auto DL = getCurSDLoc(); EVT ResultVT = TLI.getValueType(DAG.getDataLayout(), I.getType()); - EVT OpVT = - TLI.getTypeToTransformTo(*DAG.getContext(), ResultVT.getScalarType()); - SDValue Step = DAG.getConstant(1, DL, OpVT); - setValue(&I, DAG.getStepVector(DL, ResultVT, Step)); + setValue(&I, DAG.getStepVector(DL, ResultVT)); } void SelectionDAGBuilder::visitVectorReverse(const CallInst &I) { diff --git a/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp b/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp index 7bc73a9..8cda50d 100644 --- a/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp +++ b/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp @@ -9503,7 +9503,7 @@ SDValue AArch64TargetLowering::LowerDUPQLane(SDValue Op, SDValue SplatOne = DAG.getNode(ISD::SPLAT_VECTOR, DL, MVT::nxv2i64, One); // create the vector 0,1,0,1,... - SDValue SV = DAG.getNode(ISD::STEP_VECTOR, DL, MVT::nxv2i64, One); + SDValue SV = DAG.getStepVector(DL, MVT::nxv2i64); SV = DAG.getNode(ISD::AND, DL, MVT::nxv2i64, SV, SplatOne); // create the vector idx64,idx64+1,idx64,idx64+1,... @@ -13998,9 +13998,7 @@ static SDValue LowerSVEIntrinsicIndex(SDNode *N, SelectionDAG &DAG) { ScalarTy = MVT::i32; // Lower index_vector(base, step) to mul(step step_vector(1)) + splat(base). - SDValue One = DAG.getConstant(1, DL, ScalarTy); - SDValue StepVector = - DAG.getNode(ISD::STEP_VECTOR, DL, N->getValueType(0), One); + SDValue StepVector = DAG.getStepVector(DL, N->getValueType(0)); SDValue Step = DAG.getNode(ISD::SPLAT_VECTOR, DL, N->getValueType(0), Op2); SDValue Mul = DAG.getNode(ISD::MUL, DL, N->getValueType(0), StepVector, Step); SDValue Base = DAG.getNode(ISD::SPLAT_VECTOR, DL, N->getValueType(0), Op1); -- 2.7.4