- Modify assert in PromoteIntRes_STEP_VECTOR.
- Add promote step_vector test for RISCV.
Details
Diff Detail
- Repository
- rG LLVM Github Monorepo
Event Timeline
llvm/lib/CodeGen/SelectionDAG/LegalizeIntegerTypes.cpp | ||
---|---|---|
5280–5281 | Why this change? llvm.stepvector intrinsic works for fixed vectors. | |
llvm/test/CodeGen/RISCV/rvv/vreductions-fp-vp.ll | ||
318 ↗ | (On Diff #437432) | The rest of this patch involve stepvector, but this doesn't. Unless I'm missing something this should be a different patch. |
llvm/lib/CodeGen/SelectionDAG/LegalizeIntegerTypes.cpp | ||
---|---|---|
5280–5281 | 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? |
llvm/test/CodeGen/RISCV/rvv/vreductions-fp-vp.ll | ||
---|---|---|
318 ↗ | (On Diff #437432) | Removed this change. |
llvm/lib/CodeGen/SelectionDAG/LegalizeIntegerTypes.cpp | ||
---|---|---|
5280–5281 | 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. |
llvm/lib/CodeGen/SelectionDAG/LegalizeIntegerTypes.cpp | ||
---|---|---|
5280–5281 | If call <vscale x 4 x i15> @llvm.experimental.stepvector.nxv4i15(), it generated nxv4i15 = step_vector node. My understand is that fixed vectors cann't generate node like v4i15 = step_vector. |
llvm/lib/CodeGen/SelectionDAG/LegalizeIntegerTypes.cpp | ||
---|---|---|
5280–5281 | 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. |
llvm/lib/CodeGen/SelectionDAG/LegalizeIntegerTypes.cpp | ||
---|---|---|
5280–5281 | 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, |
Why this change? llvm.stepvector intrinsic works for fixed vectors.