Skip to content

Commit 0ee32c4

Browse files
authored
[AMDGPU] Implement llvm.lrint intrinsic lowering (#98931)
This patch enabled the target-independent lowering of llvm.lrint via GlobalISel. For SelectionDAG, the instrinsic is custom lowered for AMDGPU.
1 parent deb40a2 commit 0ee32c4

File tree

6 files changed

+811
-9
lines changed

6 files changed

+811
-9
lines changed

llvm/lib/CodeGen/GlobalISel/LegalizerHelper.cpp

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3900,6 +3900,17 @@ LegalizerHelper::lower(MachineInstr &MI, unsigned TypeIdx, LLT LowerHintTy) {
39003900
changeOpcode(MI, TargetOpcode::G_INTRINSIC_ROUNDEVEN);
39013901
return Legalized;
39023902
}
3903+
case TargetOpcode::G_INTRINSIC_LRINT:
3904+
case TargetOpcode::G_INTRINSIC_LLRINT: {
3905+
Register DstReg = MI.getOperand(0).getReg();
3906+
Register SrcReg = MI.getOperand(1).getReg();
3907+
LLT SrcTy = MRI.getType(SrcReg);
3908+
auto Round =
3909+
MIRBuilder.buildInstr(TargetOpcode::G_FRINT, {SrcTy}, {SrcReg});
3910+
MIRBuilder.buildFPTOSI(DstReg, Round);
3911+
MI.eraseFromParent();
3912+
return Legalized;
3913+
}
39033914
case TargetOpcode::G_ATOMIC_CMPXCHG_WITH_SUCCESS: {
39043915
auto [OldValRes, SuccessRes, Addr, CmpVal, NewVal] = MI.getFirst5Regs();
39053916
Register NewOldValRes = MRI.cloneVirtualRegister(OldValRes);
@@ -4755,6 +4766,8 @@ LegalizerHelper::fewerElementsVector(MachineInstr &MI, unsigned TypeIdx,
47554766
case G_FCEIL:
47564767
case G_FFLOOR:
47574768
case G_FRINT:
4769+
case G_INTRINSIC_LRINT:
4770+
case G_INTRINSIC_LLRINT:
47584771
case G_INTRINSIC_ROUND:
47594772
case G_INTRINSIC_ROUNDEVEN:
47604773
case G_INTRINSIC_TRUNC:

llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4336,6 +4336,16 @@ bool SelectionDAGLegalize::ExpandNode(SDNode *Node) {
43364336
// targets where it is not needed.
43374337
Results.push_back(Node->getOperand(0));
43384338
break;
4339+
case ISD::LRINT:
4340+
case ISD::LLRINT: {
4341+
SDValue Arg = Node->getOperand(0);
4342+
EVT ArgVT = Arg.getValueType();
4343+
EVT ResVT = Node->getValueType(0);
4344+
SDLoc dl(Node);
4345+
SDValue RoundNode = DAG.getNode(ISD::FRINT, dl, ArgVT, Arg);
4346+
Results.push_back(DAG.getNode(ISD::FP_TO_SINT, dl, ResVT, RoundNode));
4347+
break;
4348+
}
43394349
case ISD::GLOBAL_OFFSET_TABLE:
43404350
case ISD::GlobalAddress:
43414351
case ISD::GlobalTLSAddress:

llvm/lib/CodeGen/TargetLoweringBase.cpp

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -824,15 +824,15 @@ void TargetLoweringBase::initActions() {
824824
Expand);
825825

826826
// These library functions default to expand.
827-
setOperationAction(
828-
{ISD::FCBRT, ISD::FLOG, ISD::FLOG2, ISD::FLOG10, ISD::FEXP,
829-
ISD::FEXP2, ISD::FEXP10, ISD::FFLOOR, ISD::FNEARBYINT, ISD::FCEIL,
830-
ISD::FRINT, ISD::FTRUNC, ISD::LRINT, ISD::LLRINT, ISD::FROUNDEVEN,
831-
ISD::FTAN, ISD::FACOS, ISD::FASIN, ISD::FATAN, ISD::FCOSH,
832-
ISD::FSINH, ISD::FTANH},
833-
{MVT::f32, MVT::f64, MVT::f128}, Expand);
834-
835-
setOperationAction({ISD::LROUND, ISD::LLROUND},
827+
setOperationAction({ISD::FCBRT, ISD::FLOG, ISD::FLOG2, ISD::FLOG10,
828+
ISD::FEXP, ISD::FEXP2, ISD::FEXP10, ISD::FFLOOR,
829+
ISD::FNEARBYINT, ISD::FCEIL, ISD::FRINT, ISD::FTRUNC,
830+
ISD::FROUNDEVEN, ISD::FTAN, ISD::FACOS, ISD::FASIN,
831+
ISD::FATAN, ISD::FCOSH, ISD::FSINH, ISD::FTANH},
832+
{MVT::f32, MVT::f64, MVT::f128}, Expand);
833+
834+
// FIXME: Query RuntimeLibCalls to make the decision.
835+
setOperationAction({ISD::LRINT, ISD::LLRINT, ISD::LROUND, ISD::LLROUND},
836836
{MVT::f32, MVT::f64, MVT::f128}, LibCall);
837837

838838
setOperationAction({ISD::FTAN, ISD::FACOS, ISD::FASIN, ISD::FATAN, ISD::FCOSH,

llvm/lib/Target/AMDGPU/AMDGPUISelLowering.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -408,6 +408,9 @@ AMDGPUTargetLowering::AMDGPUTargetLowering(const TargetMachine &TM,
408408

409409
setOperationAction(ISD::FRINT, {MVT::f16, MVT::f32, MVT::f64}, Custom);
410410

411+
setOperationAction({ISD::LRINT, ISD::LLRINT}, {MVT::f16, MVT::f32, MVT::f64},
412+
Expand);
413+
411414
setOperationAction(ISD::FREM, {MVT::f16, MVT::f32, MVT::f64}, Custom);
412415

413416
if (Subtarget->has16BitInsts())

llvm/lib/Target/AMDGPU/AMDGPULegalizerInfo.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1146,6 +1146,11 @@ AMDGPULegalizerInfo::AMDGPULegalizerInfo(const GCNSubtarget &ST_,
11461146
.scalarize(0)
11471147
.lower();
11481148

1149+
getActionDefinitionsBuilder({G_INTRINSIC_LRINT, G_INTRINSIC_LLRINT})
1150+
.clampScalar(0, S16, S64)
1151+
.scalarize(0)
1152+
.lower();
1153+
11491154
if (ST.has16BitInsts()) {
11501155
getActionDefinitionsBuilder(
11511156
{G_INTRINSIC_TRUNC, G_FCEIL, G_INTRINSIC_ROUNDEVEN})

0 commit comments

Comments
 (0)