[PATCH] D139757: [RISCV] Use reduction result type for EXTRACT_VECTOR_ELT in lowerReductionSeq.
Craig Topper via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Fri Dec 9 17:13:56 PST 2022
craig.topper created this revision.
craig.topper added reviewers: reames, frasercrmck, rogfer01.
Herald added subscribers: sunshaoce, VincentWu, StephenFan, vkmr, evandro, luismarques, apazos, sameer.abuasal, s.egerton, Jim, benna, psnobl, jocewei, PkmX, the_o, brucehoult, MartinMosbeck, edward-jones, zzheng, jrtc27, shiva0217, kito-cheng, niosHD, sabuasal, simoncook, johnrusso, rbar, asb, hiraditya, arichardson.
Herald added a project: All.
craig.topper requested review of this revision.
Herald added subscribers: pcwang-thead, eopXD, MaskRay.
Herald added a project: LLVM.
Remove the call to getSExtOrTrunc.
Reduction ISD nodes produce a scalar result and that result is
allowed to be larger than the vector element type due to type
legalization. This is the same rule we allow for EXTRACT_VECTOR_ELT
for the same reason.
We can copy the result type over from the reduction node to
EXTRACT_VECTOR_ELT.
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D139757
Files:
llvm/lib/Target/RISCV/RISCVISelLowering.cpp
Index: llvm/lib/Target/RISCV/RISCVISelLowering.cpp
===================================================================
--- llvm/lib/Target/RISCV/RISCVISelLowering.cpp
+++ llvm/lib/Target/RISCV/RISCVISelLowering.cpp
@@ -5805,12 +5805,11 @@
/// Helper to lower a reduction sequence of the form:
/// scalar = reduce_op vec, scalar_start
-static SDValue lowerReductionSeq(unsigned RVVOpcode, SDValue StartValue,
- SDValue Vec, SDValue Mask, SDValue VL,
- SDLoc DL, SelectionDAG &DAG,
+static SDValue lowerReductionSeq(unsigned RVVOpcode, MVT ResVT,
+ SDValue StartValue, SDValue Vec, SDValue Mask,
+ SDValue VL, SDLoc DL, SelectionDAG &DAG,
const RISCVSubtarget &Subtarget) {
const MVT VecVT = Vec.getSimpleValueType();
- const MVT VecEltVT = VecVT.getVectorElementType();
const MVT M1VT = getLMUL1VT(VecVT);
const MVT XLenVT = Subtarget.getXLenVT();
@@ -5820,7 +5819,7 @@
SDValue PassThru = hasNonZeroAVL(VL) ? DAG.getUNDEF(M1VT) : InitialSplat;
SDValue Reduction = DAG.getNode(RVVOpcode, DL, M1VT, PassThru, Vec,
InitialSplat, Mask, VL);
- return DAG.getNode(ISD::EXTRACT_VECTOR_ELT, DL, VecEltVT, Reduction,
+ return DAG.getNode(ISD::EXTRACT_VECTOR_ELT, DL, ResVT, Reduction,
DAG.getConstant(0, DL, XLenVT));
}
@@ -5860,9 +5859,8 @@
SDValue NeutralElem =
DAG.getNeutralElement(BaseOpc, DL, VecEltVT, SDNodeFlags());
- SDValue Elt0 = lowerReductionSeq(RVVOpcode, NeutralElem, Vec, Mask, VL,
- DL, DAG, Subtarget);
- return DAG.getSExtOrTrunc(Elt0, DL, Op.getValueType());
+ return lowerReductionSeq(RVVOpcode, Op.getSimpleValueType(), NeutralElem, Vec,
+ Mask, VL, DL, DAG, Subtarget);
}
// Given a reduction op, this function returns the matching reduction opcode,
@@ -5913,8 +5911,8 @@
}
auto [Mask, VL] = getDefaultVLOps(VecVT, ContainerVT, DL, DAG, Subtarget);
- return lowerReductionSeq(RVVOpcode, ScalarVal, VectorVal, Mask, VL, DL, DAG,
- Subtarget);
+ return lowerReductionSeq(RVVOpcode, Op.getSimpleValueType(), ScalarVal,
+ VectorVal, Mask, VL, DL, DAG, Subtarget);
}
static unsigned getRVVVPReductionOp(unsigned ISDOpcode) {
@@ -5969,11 +5967,8 @@
SDValue VL = Op.getOperand(3);
SDValue Mask = Op.getOperand(2);
- SDValue Elt0 = lowerReductionSeq(RVVOpcode, Op.getOperand(0), Vec, Mask, VL,
- DL, DAG, Subtarget);
- if (!VecVT.isInteger())
- return Elt0;
- return DAG.getSExtOrTrunc(Elt0, DL, Op.getValueType());
+ return lowerReductionSeq(RVVOpcode, Op.getSimpleValueType(), Op.getOperand(0),
+ Vec, Mask, VL, DL, DAG, Subtarget);
}
SDValue RISCVTargetLowering::lowerINSERT_SUBVECTOR(SDValue Op,
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D139757.481796.patch
Type: text/x-patch
Size: 2976 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20221210/21a3ee92/attachment.bin>
More information about the llvm-commits
mailing list