[llvm] [AMDGPU] Always Inline preserved analyses (PR #91198)
via llvm-commits
llvm-commits at lists.llvm.org
Mon May 6 05:29:10 PDT 2024
https://github.com/jofrn created https://github.com/llvm/llvm-project/pull/91198
When replacing all uses, the structural-hash of the IR can change, so keep track of changes using Preserved variable and return the correct IR state (changed or not).
>From ac1b079d67b454a24a53a2c815bfbf1ec4697fb2 Mon Sep 17 00:00:00 2001
From: Joe Fernau <joe.fernau at amd.com>
Date: Mon, 6 May 2024 08:23:25 -0400
Subject: [PATCH] [AMDGPU] Always Inline preserved analyses
When replacing all uses, the structural-hash of the IR can change, so keep track of changes using Preserved variable and return the correct IR state (changed or not).
---
.../lib/Target/AMDGPU/AMDGPUAlwaysInlinePass.cpp | 16 ++++++++++------
1 file changed, 10 insertions(+), 6 deletions(-)
diff --git a/llvm/lib/Target/AMDGPU/AMDGPUAlwaysInlinePass.cpp b/llvm/lib/Target/AMDGPU/AMDGPUAlwaysInlinePass.cpp
index b53def912ab618..1ba3669f523352 100644
--- a/llvm/lib/Target/AMDGPU/AMDGPUAlwaysInlinePass.cpp
+++ b/llvm/lib/Target/AMDGPU/AMDGPUAlwaysInlinePass.cpp
@@ -42,7 +42,7 @@ class AMDGPUAlwaysInline : public ModulePass {
void getAnalysisUsage(AnalysisUsage &AU) const override {
AU.setPreservesAll();
- }
+ }
};
} // End anonymous namespace
@@ -54,7 +54,8 @@ char AMDGPUAlwaysInline::ID = 0;
static void
recursivelyVisitUsers(GlobalValue &GV,
- SmallPtrSetImpl<Function *> &FuncsToAlwaysInline) {
+ SmallPtrSetImpl<Function *> &FuncsToAlwaysInline,
+ bool &Preserved) {
SmallVector<User *, 16> Stack(GV.users());
SmallPtrSet<const Value *, 8> Visited;
@@ -73,6 +74,7 @@ recursivelyVisitUsers(GlobalValue &GV,
// Unfortunately, clang adds noinline to all functions at -O0. We have
// to override this here until that's fixed.
F->removeFnAttr(Attribute::NoInline);
+ Preserved = false;
FuncsToAlwaysInline.insert(F);
Stack.push_back(F);
@@ -89,6 +91,7 @@ recursivelyVisitUsers(GlobalValue &GV,
static bool alwaysInlineImpl(Module &M, bool GlobalOpt) {
std::vector<GlobalAlias*> AliasesToRemove;
+ bool Preserved = true;
SmallPtrSet<Function *, 8> FuncsToAlwaysInline;
SmallPtrSet<Function *, 8> FuncsToNoInline;
Triple TT(M.getTargetTriple());
@@ -98,6 +101,7 @@ static bool alwaysInlineImpl(Module &M, bool GlobalOpt) {
if (TT.getArch() == Triple::amdgcn &&
A.getLinkage() != GlobalValue::InternalLinkage)
continue;
+ Preserved = false;
A.replaceAllUsesWith(F);
AliasesToRemove.push_back(&A);
}
@@ -128,7 +132,7 @@ static bool alwaysInlineImpl(Module &M, bool GlobalOpt) {
if ((AS == AMDGPUAS::REGION_ADDRESS) ||
(AS == AMDGPUAS::LOCAL_ADDRESS &&
(!AMDGPUTargetMachine::EnableLowerModuleLDS)))
- recursivelyVisitUsers(GV, FuncsToAlwaysInline);
+ recursivelyVisitUsers(GV, FuncsToAlwaysInline, Preserved);
}
if (!AMDGPUTargetMachine::EnableFunctionCalls || StressCalls) {
@@ -153,7 +157,7 @@ static bool alwaysInlineImpl(Module &M, bool GlobalOpt) {
for (Function *F : FuncsToNoInline)
F->addFnAttr(Attribute::NoInline);
- return !FuncsToAlwaysInline.empty() || !FuncsToNoInline.empty();
+ return !Preserved || !FuncsToAlwaysInline.empty() || !FuncsToNoInline.empty();
}
bool AMDGPUAlwaysInline::runOnModule(Module &M) {
@@ -166,6 +170,6 @@ ModulePass *llvm::createAMDGPUAlwaysInlinePass(bool GlobalOpt) {
PreservedAnalyses AMDGPUAlwaysInlinePass::run(Module &M,
ModuleAnalysisManager &AM) {
- alwaysInlineImpl(M, GlobalOpt);
- return PreservedAnalyses::all();
+ const bool Changed = alwaysInlineImpl(M, GlobalOpt);
+ return Changed ? PreservedAnalyses::none() : PreservedAnalyses::all();
}
More information about the llvm-commits
mailing list