[PATCH] D127939: [LegalizeTypes][RISCV][NFC] Modify assert in PromoteIntRes_STEP_VECTOR and add some tests for RISCV
David Sherwood via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Thu Jun 16 02:49:23 PDT 2022
david-arm added inline comments.
================
Comment at: llvm/lib/CodeGen/SelectionDAG/LegalizeIntegerTypes.cpp:5280
EVT NOutVT = TLI.getTypeToTransformTo(*DAG.getContext(), OutVT);
- assert(NOutVT.isVector() && "Type must be promoted to a vector type");
+ assert(NOutVT.isScalableVector() &&
+ "Type must be promoted to a scalable vector type");
----------------
frasercrmck wrote:
> Jimerlife wrote:
> > david-arm wrote:
> > > Jimerlife wrote:
> > > > craig.topper wrote:
> > > > > Why this change? llvm.stepvector intrinsic works for fixed vectors.
> > > > Yes, llvm.stepvector intrinsic works for fixed vectors, but ISD::STEP_VECTOR is only work for scalable vector. I'm not sure my understanding is right?
> > > I agree with @craig.topper. I don't understand why we're changing the assert here. This should work for fixed vectors too so we should be asserting that the result is a vector, i.e. either fixed-width or scalable.
> > If call `<vscale x 4 x i15> @llvm.experimental.stepvector.nxv4i15()`, it generated `nxv4i15 = step_vector` node.
> > But if call `<4 x i15> @llvm.experimental.stepvector.v4i15()`, it generated `v4i15 = build_vector` node.
> >
> > My understand is that fixed vectors cann't generate node like `v4i15 = step_vector`.
> > So, only scalable vector will go through PromoteIntRes_STEP_VECTOR if it need to promote.
> > This is right? @craig.topper @david-arm
> That's my understanding, yes - we don't generate `ISD::STEP_VECTOR` for fixed-length vector types. Take a look at `SelectionDAG::getStepVector`'s implementation. I assume that's done for canonicalization purposes.
My apologies @Jimerlife, you are absolutely right! I was thinking about the SelectionDAG::getStepVector interface, but this only returns STEP_VECTOR for scalable vectors. In fact, the ISD node states:
/// STEP_VECTOR(IMM) - Returns a scalable vector whose lanes are comprised
/// of a linear sequence of unsigned values starting from 0 with a step of
/// IMM, where IMM must be a TargetConstant with type equal to the vector
/// element type. The arithmetic is performed modulo the bitwidth of the
/// element.
///
/// The operation does not support returning fixed-width vectors or
/// non-constant operands.
STEP_VECTOR,
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D127939/new/
https://reviews.llvm.org/D127939
More information about the llvm-commits
mailing list