Skip to content

Commit 652630b

Browse files
authored
[ISel/RISCV] Fix fixed-vector [l]lrint lowering (#145898)
Make the fixed-vector lowering of ISD::[L]LRINT use the custom-lowering routine, lowerVectorXRINT, and fix issues in lowerVectorXRINT related to this new functionality.
1 parent b9e4679 commit 652630b

File tree

3 files changed

+127
-1631
lines changed

3 files changed

+127
-1631
lines changed

llvm/lib/Target/RISCV/RISCVISelLowering.cpp

Lines changed: 30 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1505,7 +1505,8 @@ RISCVTargetLowering::RISCVTargetLowering(const TargetMachine &TM,
15051505
VT, Custom);
15061506

15071507
setOperationAction({ISD::FTRUNC, ISD::FCEIL, ISD::FFLOOR, ISD::FROUND,
1508-
ISD::FROUNDEVEN, ISD::FRINT, ISD::FNEARBYINT},
1508+
ISD::FROUNDEVEN, ISD::FRINT, ISD::LRINT,
1509+
ISD::LLRINT, ISD::FNEARBYINT},
15091510
VT, Custom);
15101511

15111512
setCondCodeAction(VFPCCToExpand, VT, Expand);
@@ -3208,7 +3209,14 @@ static RISCVFPRndMode::RoundingMode matchRoundingOp(unsigned Opc) {
32083209
case ISD::VP_FROUND:
32093210
return RISCVFPRndMode::RMM;
32103211
case ISD::FRINT:
3212+
case ISD::LRINT:
3213+
case ISD::LLRINT:
3214+
case ISD::STRICT_FRINT:
3215+
case ISD::STRICT_LRINT:
3216+
case ISD::STRICT_LLRINT:
32113217
case ISD::VP_FRINT:
3218+
case ISD::VP_LRINT:
3219+
case ISD::VP_LLRINT:
32123220
return RISCVFPRndMode::DYN;
32133221
}
32143222

@@ -3458,28 +3466,34 @@ lowerFTRUNC_FCEIL_FFLOOR_FROUND(SDValue Op, SelectionDAG &DAG,
34583466
// Expand vector LRINT and LLRINT by converting to the integer domain.
34593467
static SDValue lowerVectorXRINT(SDValue Op, SelectionDAG &DAG,
34603468
const RISCVSubtarget &Subtarget) {
3461-
MVT VT = Op.getSimpleValueType();
3462-
assert(VT.isVector() && "Unexpected type");
3463-
34643469
SDLoc DL(Op);
3470+
MVT DstVT = Op.getSimpleValueType();
34653471
SDValue Src = Op.getOperand(0);
3466-
MVT ContainerVT = VT;
3472+
MVT SrcVT = Src.getSimpleValueType();
3473+
assert(SrcVT.isVector() && DstVT.isVector() &&
3474+
!(SrcVT.isFixedLengthVector() ^ DstVT.isFixedLengthVector()) &&
3475+
"Unexpected type");
34673476

3468-
if (VT.isFixedLengthVector()) {
3469-
ContainerVT = getContainerForFixedLengthVector(DAG, VT, Subtarget);
3470-
Src = convertToScalableVector(ContainerVT, Src, DAG, Subtarget);
3477+
MVT DstContainerVT = DstVT;
3478+
MVT SrcContainerVT = SrcVT;
3479+
3480+
if (DstVT.isFixedLengthVector()) {
3481+
DstContainerVT = getContainerForFixedLengthVector(DAG, DstVT, Subtarget);
3482+
SrcContainerVT = getContainerForFixedLengthVector(DAG, SrcVT, Subtarget);
3483+
Src = convertToScalableVector(SrcContainerVT, Src, DAG, Subtarget);
34713484
}
34723485

3473-
auto [Mask, VL] = getDefaultVLOps(VT, ContainerVT, DL, DAG, Subtarget);
3474-
SDValue Truncated = DAG.getNode(
3475-
RISCVISD::VFCVT_RM_X_F_VL, DL, ContainerVT, Src, Mask,
3476-
DAG.getTargetConstant(RISCVFPRndMode::DYN, DL, Subtarget.getXLenVT()),
3477-
VL);
3486+
auto [Mask, VL] = getDefaultVLOps(SrcVT, SrcContainerVT, DL, DAG, Subtarget);
3487+
SDValue Res =
3488+
DAG.getNode(RISCVISD::VFCVT_RM_X_F_VL, DL, DstContainerVT, Src, Mask,
3489+
DAG.getTargetConstant(matchRoundingOp(Op.getOpcode()), DL,
3490+
Subtarget.getXLenVT()),
3491+
VL);
34783492

3479-
if (!VT.isFixedLengthVector())
3480-
return Truncated;
3493+
if (!DstVT.isFixedLengthVector())
3494+
return Res;
34813495

3482-
return convertFromScalableVector(VT, Truncated, DAG, Subtarget);
3496+
return convertFromScalableVector(DstVT, Res, DAG, Subtarget);
34833497
}
34843498

34853499
static SDValue

0 commit comments

Comments
 (0)