aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp
diff options
context:
space:
mode:
authorFraser Cormack <fraser@codeplay.com>2021-05-24 15:24:54 +0100
committerFraser Cormack <fraser@codeplay.com>2021-05-27 15:27:36 +0100
commit5a80dc498818d7f22a04d06986e78d151fb6e103 (patch)
tree30c61ad0ce23267224e4aaf8127a4dce095c8728 /llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp
parent9091ecdae0290d8c425d48a2c86bbdd4876d6507 (diff)
downloadllvm-5a80dc498818d7f22a04d06986e78d151fb6e103.zip
llvm-5a80dc498818d7f22a04d06986e78d151fb6e103.tar.gz
llvm-5a80dc498818d7f22a04d06986e78d151fb6e103.tar.bz2
[VP][SelectionDAG] Add a target-configurable EVL operand type
This patch adds a way for the target to configure the type it uses for the explicit vector length operands of VP SDNodes. The type must be a legal integer type (there is still no target-independent legalization of this operand) and must currently be at least as big as i32, the type used by the IR intrinsics. An implicit zero-extension takes place on targets which choose a larger type. All VP nodes should be created with this type used for the EVL operand. This allows 64-bit RISC-V to avoid custom legalization of all VP nodes, keeping them in their target-independent form for that bit longer. Reviewed By: simoll Differential Revision: https://reviews.llvm.org/D103027
Diffstat (limited to 'llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp')
-rw-r--r--llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp17
1 files changed, 14 insertions, 3 deletions
diff --git a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp
index b581b9a9..08ca62b 100644
--- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp
@@ -7296,6 +7296,7 @@ static unsigned getISDForVPIntrinsic(const VPIntrinsic &VPIntrin) {
void SelectionDAGBuilder::visitVectorPredicationIntrinsic(
const VPIntrinsic &VPIntrin) {
+ SDLoc DL = getCurSDLoc();
unsigned Opcode = getISDForVPIntrinsic(VPIntrin);
SmallVector<EVT, 4> ValueVTs;
@@ -7303,12 +7304,22 @@ void SelectionDAGBuilder::visitVectorPredicationIntrinsic(
ComputeValueVTs(TLI, DAG.getDataLayout(), VPIntrin.getType(), ValueVTs);
SDVTList VTs = DAG.getVTList(ValueVTs);
+ auto EVLParamPos =
+ VPIntrinsic::GetVectorLengthParamPos(VPIntrin.getIntrinsicID());
+
+ MVT EVLParamVT = TLI.getVPExplicitVectorLengthTy();
+ assert(EVLParamVT.isScalarInteger() && EVLParamVT.bitsGE(MVT::i32) &&
+ "Unexpected target EVL type");
+
// Request operands.
SmallVector<SDValue, 7> OpValues;
- for (int i = 0; i < (int)VPIntrin.getNumArgOperands(); ++i)
- OpValues.push_back(getValue(VPIntrin.getArgOperand(i)));
+ for (int I = 0; I < (int)VPIntrin.getNumArgOperands(); ++I) {
+ auto Op = getValue(VPIntrin.getArgOperand(I));
+ if (I == EVLParamPos)
+ Op = DAG.getNode(ISD::ZERO_EXTEND, DL, EVLParamVT, Op);
+ OpValues.push_back(Op);
+ }
- SDLoc DL = getCurSDLoc();
SDValue Result = DAG.getNode(Opcode, DL, VTs, OpValues);
setValue(&VPIntrin, Result);
}