https://github.com/arsenm created https://github.com/llvm/llvm-project/pull/141945
None >From dc0d24948146621e6ba5e39c21ea7f4494a14ed1 Mon Sep 17 00:00:00 2001 From: Matt Arsenault <matthew.arsena...@amd.com> Date: Thu, 29 May 2025 11:16:22 +0200 Subject: [PATCH] AMDGPU: Move fpenvIEEEMode into TTI --- .../AMDGPU/AMDGPUInstCombineIntrinsic.cpp | 28 ++----------------- .../AMDGPU/AMDGPUTargetTransformInfo.cpp | 17 +++++++++++ .../Target/AMDGPU/AMDGPUTargetTransformInfo.h | 7 +++++ 3 files changed, 27 insertions(+), 25 deletions(-) diff --git a/llvm/lib/Target/AMDGPU/AMDGPUInstCombineIntrinsic.cpp b/llvm/lib/Target/AMDGPU/AMDGPUInstCombineIntrinsic.cpp index 5f6ab24182d5e..b0774385547c6 100644 --- a/llvm/lib/Target/AMDGPU/AMDGPUInstCombineIntrinsic.cpp +++ b/llvm/lib/Target/AMDGPU/AMDGPUInstCombineIntrinsic.cpp @@ -60,28 +60,6 @@ static APFloat fmed3AMDGCN(const APFloat &Src0, const APFloat &Src1, return maxnum(Src0, Src1); } -enum class KnownIEEEMode { Unknown, On, Off }; - -/// Return KnownIEEEMode::On if we know if the use context can assume -/// "amdgpu-ieee"="true" and KnownIEEEMode::Off if we can assume -/// "amdgpu-ieee"="false". -static KnownIEEEMode fpenvIEEEMode(const Instruction &I, - const GCNSubtarget &ST) { - if (!ST.hasIEEEMode()) // Only mode on gfx12 - return KnownIEEEMode::On; - - const Function *F = I.getFunction(); - if (!F) - return KnownIEEEMode::Unknown; - - Attribute IEEEAttr = F->getFnAttribute("amdgpu-ieee"); - if (IEEEAttr.isValid()) - return IEEEAttr.getValueAsBool() ? KnownIEEEMode::On : KnownIEEEMode::Off; - - return AMDGPU::isShader(F->getCallingConv()) ? KnownIEEEMode::Off - : KnownIEEEMode::On; -} - // Check if a value can be converted to a 16-bit value without losing // precision. // The value is expected to be either a float (IsFloat = true) or an unsigned @@ -1003,7 +981,7 @@ GCNTTIImpl::instCombineIntrinsic(InstCombiner &IC, IntrinsicInst &II) const { // TODO: Also can fold to 2 operands with infinities. if ((match(Src0, m_APFloat(ConstSrc0)) && ConstSrc0->isNaN()) || isa<UndefValue>(Src0)) { - switch (fpenvIEEEMode(II, *ST)) { + switch (fpenvIEEEMode(II)) { case KnownIEEEMode::On: // TODO: If Src2 is snan, does it need quieting? if (ConstSrc0 && ConstSrc0->isSignaling()) @@ -1018,7 +996,7 @@ GCNTTIImpl::instCombineIntrinsic(InstCombiner &IC, IntrinsicInst &II) const { } } else if ((match(Src1, m_APFloat(ConstSrc1)) && ConstSrc1->isNaN()) || isa<UndefValue>(Src1)) { - switch (fpenvIEEEMode(II, *ST)) { + switch (fpenvIEEEMode(II)) { case KnownIEEEMode::On: // TODO: If Src2 is snan, does it need quieting? if (ConstSrc1 && ConstSrc1->isSignaling()) @@ -1034,7 +1012,7 @@ GCNTTIImpl::instCombineIntrinsic(InstCombiner &IC, IntrinsicInst &II) const { } } else if ((match(Src2, m_APFloat(ConstSrc2)) && ConstSrc2->isNaN()) || isa<UndefValue>(Src2)) { - switch (fpenvIEEEMode(II, *ST)) { + switch (fpenvIEEEMode(II)) { case KnownIEEEMode::On: if (ConstSrc2 && ConstSrc2->isSignaling()) { auto *Quieted = ConstantFP::get(II.getType(), ConstSrc2->makeQuiet()); diff --git a/llvm/lib/Target/AMDGPU/AMDGPUTargetTransformInfo.cpp b/llvm/lib/Target/AMDGPU/AMDGPUTargetTransformInfo.cpp index c1ccc8f6798a6..563c46f57dfa5 100644 --- a/llvm/lib/Target/AMDGPU/AMDGPUTargetTransformInfo.cpp +++ b/llvm/lib/Target/AMDGPU/AMDGPUTargetTransformInfo.cpp @@ -1445,3 +1445,20 @@ void GCNTTIImpl::collectKernelLaunchBounds( LB.push_back({"amdgpu-waves-per-eu[0]", WavesPerEU.first}); LB.push_back({"amdgpu-waves-per-eu[1]", WavesPerEU.second}); } + +GCNTTIImpl::KnownIEEEMode +GCNTTIImpl::fpenvIEEEMode(const Instruction &I) const { + if (!ST->hasIEEEMode()) // Only mode on gfx12 + return KnownIEEEMode::On; + + const Function *F = I.getFunction(); + if (!F) + return KnownIEEEMode::Unknown; + + Attribute IEEEAttr = F->getFnAttribute("amdgpu-ieee"); + if (IEEEAttr.isValid()) + return IEEEAttr.getValueAsBool() ? KnownIEEEMode::On : KnownIEEEMode::Off; + + return AMDGPU::isShader(F->getCallingConv()) ? KnownIEEEMode::Off + : KnownIEEEMode::On; +} diff --git a/llvm/lib/Target/AMDGPU/AMDGPUTargetTransformInfo.h b/llvm/lib/Target/AMDGPU/AMDGPUTargetTransformInfo.h index ec298c7e9631a..0fae301abf532 100644 --- a/llvm/lib/Target/AMDGPU/AMDGPUTargetTransformInfo.h +++ b/llvm/lib/Target/AMDGPU/AMDGPUTargetTransformInfo.h @@ -281,6 +281,13 @@ class GCNTTIImpl final : public BasicTTIImplBase<GCNTTIImpl> { void collectKernelLaunchBounds( const Function &F, SmallVectorImpl<std::pair<StringRef, int64_t>> &LB) const override; + + enum class KnownIEEEMode { Unknown, On, Off }; + + /// Return KnownIEEEMode::On if we know if the use context can assume + /// "amdgpu-ieee"="true" and KnownIEEEMode::Off if we can assume + /// "amdgpu-ieee"="false". + KnownIEEEMode fpenvIEEEMode(const Instruction &I) const; }; } // end namespace llvm _______________________________________________ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits