diff options
author | Sumanth Gundapaneni <sumanth.gundapaneni@amd.com> | 2024-07-24 14:34:31 -0500 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-07-24 23:34:31 +0400 |
commit | 0ee32c45730c94be1b7d5fa60a0e8dff5751d014 (patch) | |
tree | 98cde74aaf81a52d4807e4103603580bd025a5d3 /llvm/lib/CodeGen | |
parent | deb40a253a5448a7b1f8d9680a0ae512c2d17283 (diff) | |
download | llvm-0ee32c45730c94be1b7d5fa60a0e8dff5751d014.zip llvm-0ee32c45730c94be1b7d5fa60a0e8dff5751d014.tar.gz llvm-0ee32c45730c94be1b7d5fa60a0e8dff5751d014.tar.bz2 |
[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.
Diffstat (limited to 'llvm/lib/CodeGen')
-rw-r--r-- | llvm/lib/CodeGen/GlobalISel/LegalizerHelper.cpp | 13 | ||||
-rw-r--r-- | llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp | 10 | ||||
-rw-r--r-- | llvm/lib/CodeGen/TargetLoweringBase.cpp | 18 |
3 files changed, 32 insertions, 9 deletions
diff --git a/llvm/lib/CodeGen/GlobalISel/LegalizerHelper.cpp b/llvm/lib/CodeGen/GlobalISel/LegalizerHelper.cpp index 6c7885c..b490ab2 100644 --- a/llvm/lib/CodeGen/GlobalISel/LegalizerHelper.cpp +++ b/llvm/lib/CodeGen/GlobalISel/LegalizerHelper.cpp @@ -3900,6 +3900,17 @@ LegalizerHelper::lower(MachineInstr &MI, unsigned TypeIdx, LLT LowerHintTy) { changeOpcode(MI, TargetOpcode::G_INTRINSIC_ROUNDEVEN); return Legalized; } + case TargetOpcode::G_INTRINSIC_LRINT: + case TargetOpcode::G_INTRINSIC_LLRINT: { + Register DstReg = MI.getOperand(0).getReg(); + Register SrcReg = MI.getOperand(1).getReg(); + LLT SrcTy = MRI.getType(SrcReg); + auto Round = + MIRBuilder.buildInstr(TargetOpcode::G_FRINT, {SrcTy}, {SrcReg}); + MIRBuilder.buildFPTOSI(DstReg, Round); + MI.eraseFromParent(); + return Legalized; + } case TargetOpcode::G_ATOMIC_CMPXCHG_WITH_SUCCESS: { auto [OldValRes, SuccessRes, Addr, CmpVal, NewVal] = MI.getFirst5Regs(); Register NewOldValRes = MRI.cloneVirtualRegister(OldValRes); @@ -4755,6 +4766,8 @@ LegalizerHelper::fewerElementsVector(MachineInstr &MI, unsigned TypeIdx, case G_FCEIL: case G_FFLOOR: case G_FRINT: + case G_INTRINSIC_LRINT: + case G_INTRINSIC_LLRINT: case G_INTRINSIC_ROUND: case G_INTRINSIC_ROUNDEVEN: case G_INTRINSIC_TRUNC: diff --git a/llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp b/llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp index 3a39f6a..bdb7917 100644 --- a/llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp @@ -4336,6 +4336,16 @@ bool SelectionDAGLegalize::ExpandNode(SDNode *Node) { // targets where it is not needed. Results.push_back(Node->getOperand(0)); break; + case ISD::LRINT: + case ISD::LLRINT: { + SDValue Arg = Node->getOperand(0); + EVT ArgVT = Arg.getValueType(); + EVT ResVT = Node->getValueType(0); + SDLoc dl(Node); + SDValue RoundNode = DAG.getNode(ISD::FRINT, dl, ArgVT, Arg); + Results.push_back(DAG.getNode(ISD::FP_TO_SINT, dl, ResVT, RoundNode)); + break; + } case ISD::GLOBAL_OFFSET_TABLE: case ISD::GlobalAddress: case ISD::GlobalTLSAddress: diff --git a/llvm/lib/CodeGen/TargetLoweringBase.cpp b/llvm/lib/CodeGen/TargetLoweringBase.cpp index bc5fc96..6ca9955 100644 --- a/llvm/lib/CodeGen/TargetLoweringBase.cpp +++ b/llvm/lib/CodeGen/TargetLoweringBase.cpp @@ -824,15 +824,15 @@ void TargetLoweringBase::initActions() { Expand); // These library functions default to expand. - setOperationAction( - {ISD::FCBRT, ISD::FLOG, ISD::FLOG2, ISD::FLOG10, ISD::FEXP, - ISD::FEXP2, ISD::FEXP10, ISD::FFLOOR, ISD::FNEARBYINT, ISD::FCEIL, - ISD::FRINT, ISD::FTRUNC, ISD::LRINT, ISD::LLRINT, ISD::FROUNDEVEN, - ISD::FTAN, ISD::FACOS, ISD::FASIN, ISD::FATAN, ISD::FCOSH, - ISD::FSINH, ISD::FTANH}, - {MVT::f32, MVT::f64, MVT::f128}, Expand); - - setOperationAction({ISD::LROUND, ISD::LLROUND}, + setOperationAction({ISD::FCBRT, ISD::FLOG, ISD::FLOG2, ISD::FLOG10, + ISD::FEXP, ISD::FEXP2, ISD::FEXP10, ISD::FFLOOR, + ISD::FNEARBYINT, ISD::FCEIL, ISD::FRINT, ISD::FTRUNC, + ISD::FROUNDEVEN, ISD::FTAN, ISD::FACOS, ISD::FASIN, + ISD::FATAN, ISD::FCOSH, ISD::FSINH, ISD::FTANH}, + {MVT::f32, MVT::f64, MVT::f128}, Expand); + + // FIXME: Query RuntimeLibCalls to make the decision. + setOperationAction({ISD::LRINT, ISD::LLRINT, ISD::LROUND, ISD::LLROUND}, {MVT::f32, MVT::f64, MVT::f128}, LibCall); setOperationAction({ISD::FTAN, ISD::FACOS, ISD::FASIN, ISD::FATAN, ISD::FCOSH, |