diff options
| author | Matt Arsenault <Matthew.Arsenault@amd.com> | 2025-10-26 02:44:00 +0900 |
|---|---|---|
| committer | Matt Arsenault <arsenm2@gmail.com> | 2025-11-05 12:37:54 -0800 |
| commit | 6d5974e8e452a94f138c09e17922459f4e133d26 (patch) | |
| tree | c11cce2b12e8c134df7511d38e1fd538be9dccfd | |
| parent | 85d64c17964fa8c78d9bd3a786bcc759aa7db0e8 (diff) | |
ExpandFp: Require RuntimeLibcallsInfo analysisusers/arsenm/expand-fp/require-runtime-libcalls-info
Not sure I'm doing the new pass manager handling correctly. I do
not like needing to manually check if the cached module pass is
available and manually erroring in every pass.
| -rw-r--r-- | llvm/lib/CodeGen/ExpandFp.cpp | 14 | ||||
| -rw-r--r-- | llvm/test/Transforms/ExpandFp/AMDGPU/frem-inf.ll | 4 | ||||
| -rw-r--r-- | llvm/test/Transforms/ExpandFp/AMDGPU/frem.ll | 2 | ||||
| -rw-r--r-- | llvm/test/Transforms/ExpandFp/AMDGPU/missing-analysis.ll | 6 | ||||
| -rw-r--r-- | llvm/test/Transforms/ExpandFp/AMDGPU/pass-parameters.ll | 8 |
5 files changed, 27 insertions, 7 deletions
diff --git a/llvm/lib/CodeGen/ExpandFp.cpp b/llvm/lib/CodeGen/ExpandFp.cpp index f44eb227133a..9386ffe7791a 100644 --- a/llvm/lib/CodeGen/ExpandFp.cpp +++ b/llvm/lib/CodeGen/ExpandFp.cpp @@ -18,6 +18,7 @@ #include "llvm/ADT/SmallVector.h" #include "llvm/Analysis/AssumptionCache.h" #include "llvm/Analysis/GlobalsModRef.h" +#include "llvm/Analysis/RuntimeLibcallInfo.h" #include "llvm/Analysis/SimplifyQuery.h" #include "llvm/Analysis/ValueTracking.h" #include "llvm/CodeGen/ISDOpcodes.h" @@ -1092,6 +1093,8 @@ public: auto *TM = &getAnalysis<TargetPassConfig>().getTM<TargetMachine>(); auto *TLI = TM->getSubtargetImpl(F)->getTargetLowering(); AssumptionCache *AC = nullptr; + const RTLIB::RuntimeLibcallsInfo *Libcalls = + &getAnalysis<RuntimeLibraryInfoWrapper>().getRTLCI(*F.getParent()); if (OptLevel != CodeGenOptLevel::None && !F.hasOptNone()) AC = &getAnalysis<AssumptionCacheTracker>().getAssumptionCache(F); @@ -1104,6 +1107,7 @@ public: AU.addRequired<AssumptionCacheTracker>(); AU.addPreserved<AAResultsWrapperPass>(); AU.addPreserved<GlobalsAAWrapperPass>(); + AU.addRequired<RuntimeLibraryInfoWrapper>(); } }; } // namespace @@ -1126,6 +1130,15 @@ PreservedAnalyses ExpandFpPass::run(Function &F, FunctionAnalysisManager &FAM) { AssumptionCache *AC = nullptr; if (OptLevel != CodeGenOptLevel::None) AC = &FAM.getResult<AssumptionAnalysis>(F); + + auto &MAMProxy = FAM.getResult<ModuleAnalysisManagerFunctionProxy>(F); + const RTLIB::RuntimeLibcallsInfo *Libcalls = + MAMProxy.getCachedResult<RuntimeLibraryAnalysis>(*F.getParent()); + if (!Libcalls) { + F.getContext().emitError("'runtime-libcall-info' analysis required"); + return PreservedAnalyses::all(); + } + return runImpl(F, TLI, AC) ? PreservedAnalyses::none() : PreservedAnalyses::all(); } @@ -1133,6 +1146,7 @@ PreservedAnalyses ExpandFpPass::run(Function &F, FunctionAnalysisManager &FAM) { char ExpandFpLegacyPass::ID = 0; INITIALIZE_PASS_BEGIN(ExpandFpLegacyPass, "expand-fp", "Expand certain fp instructions", false, false) +INITIALIZE_PASS_DEPENDENCY(RuntimeLibraryInfoWrapper) INITIALIZE_PASS_END(ExpandFpLegacyPass, "expand-fp", "Expand fp", false, false) FunctionPass *llvm::createExpandFpPass(CodeGenOptLevel OptLevel) { diff --git a/llvm/test/Transforms/ExpandFp/AMDGPU/frem-inf.ll b/llvm/test/Transforms/ExpandFp/AMDGPU/frem-inf.ll index f70f0d25f172..4d302f63e1f0 100644 --- a/llvm/test/Transforms/ExpandFp/AMDGPU/frem-inf.ll +++ b/llvm/test/Transforms/ExpandFp/AMDGPU/frem-inf.ll @@ -1,5 +1,5 @@ -; RUN: opt -mtriple=amdgcn -passes="expand-fp<O0>" %s -S -o - | FileCheck --check-prefixes CHECK %s -; RUN: opt -mtriple=amdgcn -passes="expand-fp<O1>" %s -S -o - | FileCheck --check-prefixes CHECK,OPT1 %s +; RUN: opt -mtriple=amdgcn -passes="require<runtime-libcall-info>,expand-fp<O0>" %s -S -o - | FileCheck --check-prefixes CHECK %s +; RUN: opt -mtriple=amdgcn -passes="require<runtime-libcall-info>,expand-fp<O1>" %s -S -o - | FileCheck --check-prefixes CHECK,OPT1 %s ; Check the handling of potentially infinite numerators in the frem ; expansion at different optimization levels and with different diff --git a/llvm/test/Transforms/ExpandFp/AMDGPU/frem.ll b/llvm/test/Transforms/ExpandFp/AMDGPU/frem.ll index 4c0f9db147c9..56ccfb6bf454 100644 --- a/llvm/test/Transforms/ExpandFp/AMDGPU/frem.ll +++ b/llvm/test/Transforms/ExpandFp/AMDGPU/frem.ll @@ -1,5 +1,5 @@ ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5 -; RUN: opt -mtriple=amdgcn -passes="expand-fp<O1>" %s -S -o - | FileCheck %s +; RUN: opt -mtriple=amdgcn -passes="require<runtime-libcall-info>,expand-fp<O1>" %s -S -o - | FileCheck %s define amdgpu_kernel void @frem_f16(ptr addrspace(1) %out, ptr addrspace(1) %in1, ; CHECK-LABEL: define amdgpu_kernel void @frem_f16( diff --git a/llvm/test/Transforms/ExpandFp/AMDGPU/missing-analysis.ll b/llvm/test/Transforms/ExpandFp/AMDGPU/missing-analysis.ll new file mode 100644 index 000000000000..5cad68e66d3e --- /dev/null +++ b/llvm/test/Transforms/ExpandFp/AMDGPU/missing-analysis.ll @@ -0,0 +1,6 @@ +; RUN: not opt -mtriple=amdgcn -passes=expand-fp -disable-output %s 2>&1 | FileCheck %s + +; CHECK: 'runtime-libcall-info' analysis required +define void @empty() { + ret void +} diff --git a/llvm/test/Transforms/ExpandFp/AMDGPU/pass-parameters.ll b/llvm/test/Transforms/ExpandFp/AMDGPU/pass-parameters.ll index 03cafd4ff116..b3ee0a94ed34 100644 --- a/llvm/test/Transforms/ExpandFp/AMDGPU/pass-parameters.ll +++ b/llvm/test/Transforms/ExpandFp/AMDGPU/pass-parameters.ll @@ -1,7 +1,7 @@ -; RUN: opt -mtriple=amdgcn -passes="expand-fp<O0>" %s -S -o /dev/null -; RUN: opt -mtriple=amdgcn -passes="expand-fp<O1>" %s -S -o /dev/null -; RUN: opt -mtriple=amdgcn -passes="expand-fp<O2>" %s -S -o /dev/null -; RUN: opt -mtriple=amdgcn -passes="expand-fp<O3>" %s -S -o /dev/null +; RUN: opt -mtriple=amdgcn -passes="require<runtime-libcall-info>,expand-fp<O0>" -disable-output %s +; RUN: opt -mtriple=amdgcn -passes="require<runtime-libcall-info>,expand-fp<O1>" -disable-output %s +; RUN: opt -mtriple=amdgcn -passes="require<runtime-libcall-info>,expand-fp<O2>" -disable-output %s +; RUN: opt -mtriple=amdgcn -passes="require<runtime-libcall-info>,expand-fp<O3>" -disable-output %s ; RUN: not opt -mtriple=amdgcn -passes="expand-fp<O4>" %s -S -o /dev/null 2>&1 | FileCheck --check-prefix=TOO-LARGE %s ; TOO-LARGE: {{.*}}invalid optimization level for expand-fp pass: 4 |
