-
Notifications
You must be signed in to change notification settings - Fork 14.3k
[RISCV] Don't create insert/extract subreg during lowering. #109754
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
Create the equivalent INSERT_SUBVECTOR/EXTRACT_SUBVECTOR instead. When we tried porting this to global isel, we noticed that subreg operations are created early. We aren't able to do this until instruction selection in global isel. For SelectionDAG, it makes sense to use insert/extract_subvector as the canonical form for these operations pre-isel. If it had come into SelectionDAG as a insert/extract_subvector we would have kept it in that form.
@llvm/pr-subscribers-backend-risc-v Author: Craig Topper (topperc) ChangesCreate the equivalent INSERT_SUBVECTOR/EXTRACT_SUBVECTOR instead. When we tried porting this to global isel, we noticed that subreg operations are created early. We aren't able to do this until instruction selection in global isel. For SelectionDAG, it makes sense to use insert/extract_subvector as the canonical form for these operations pre-isel. If it had come into SelectionDAG as a insert/extract_subvector we would have kept it in that form. Full diff: https://github.com/llvm/llvm-project/pull/109754.diff 1 Files Affected:
diff --git a/llvm/lib/Target/RISCV/RISCVISelLowering.cpp b/llvm/lib/Target/RISCV/RISCVISelLowering.cpp
index 2aa89aca4c808d..f256e31888a62f 100644
--- a/llvm/lib/Target/RISCV/RISCVISelLowering.cpp
+++ b/llvm/lib/Target/RISCV/RISCVISelLowering.cpp
@@ -10304,8 +10304,11 @@ SDValue RISCVTargetLowering::lowerINSERT_SUBVECTOR(SDValue Op,
return Op;
}
+ // Use a insert_subvector that will resolve to an insert subreg.
+ unsigned Vscale = *VLen / RISCV::RVVBitsPerBlock;
SDValue Insert =
- DAG.getTargetInsertSubreg(SubRegIdx, DL, ContainerVecVT, Vec, SubVec);
+ DAG.getNode(ISD::INSERT_SUBVECTOR, DL, ContainerVecVT, Vec, SubVec,
+ DAG.getConstant(OrigIdx / Vscale, DL, XLenVT));
if (VecVT.isFixedLengthVector())
Insert = convertFromScalableVector(VecVT, Insert, DAG, Subtarget);
return Insert;
@@ -10499,10 +10502,13 @@ SDValue RISCVTargetLowering::lowerEXTRACT_SUBVECTOR(SDValue Op,
// If the Idx has been completely eliminated then this is a subvector extract
// which naturally aligns to a vector register. These can easily be handled
- // using subregister manipulation.
+ // using subregister manipulation. We use an extract_subvector that will
+ // resolve to an extract subreg.
if (RemIdx.isZero()) {
if (SubVecVT.isFixedLengthVector()) {
- Vec = DAG.getTargetExtractSubreg(SubRegIdx, DL, ContainerSubVecVT, Vec);
+ unsigned Vscale = *VLen / RISCV::RVVBitsPerBlock;
+ Vec = DAG.getNode(ISD::EXTRACT_SUBVECTOR, DL, ContainerSubVecVT, Vec,
+ DAG.getConstant(OrigIdx / Vscale, DL, XLenVT));
return convertFromScalableVector(SubVecVT, Vec, DAG, Subtarget);
}
return Op;
@@ -10520,9 +10526,14 @@ SDValue RISCVTargetLowering::lowerEXTRACT_SUBVECTOR(SDValue Op,
if (VecVT.bitsGT(getLMUL1VT(VecVT))) {
// If VecVT has an LMUL > 1, then SubVecVT should have a smaller LMUL, and
// we should have successfully decomposed the extract into a subregister.
+ // We use an extract_subvector that will resolve to a subreg extract.
assert(SubRegIdx != RISCV::NoSubRegister);
+ unsigned Idx = OrigIdx - RemIdx.getKnownMinValue();
+ if (SubVecVT.isFixedLengthVector())
+ Idx /= *VLen / RISCV::RVVBitsPerBlock;
InterSubVT = getLMUL1VT(VecVT);
- Vec = DAG.getTargetExtractSubreg(SubRegIdx, DL, InterSubVT, Vec);
+ Vec = DAG.getNode(ISD::EXTRACT_SUBVECTOR, DL, InterSubVT, Vec,
+ DAG.getConstant(Idx, DL, XLenVT));
}
// Slide this vector register down by the desired number of elements in order
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM
Create the equivalent INSERT_SUBVECTOR/EXTRACT_SUBVECTOR instead.
When we tried porting this to global isel, we noticed that subreg operations are created early. We aren't able to do this until instruction selection in global isel.
For SelectionDAG, it makes sense to use insert/extract_subvector as the canonical form for these operations pre-isel. If it had come into SelectionDAG as a insert/extract_subvector we would have kept it in that form.