diff options
author | Arthur Eubanks <aeubanks@google.com> | 2022-03-05 15:06:08 -0800 |
---|---|---|
committer | Arthur Eubanks <aeubanks@google.com> | 2022-03-14 09:42:34 -0700 |
commit | 4fc7c55ffff1bb2b23fc022331b82b086d4b03b4 (patch) | |
tree | 12f4882fc9c0b6f85f6775fc09137a5d703dab80 /llvm/lib/Analysis/GlobalsModRef.cpp | |
parent | b9cf2df3ff73e6f10b9fd50a4e38f3ccc1da502d (diff) | |
download | llvm-4fc7c55ffff1bb2b23fc022331b82b086d4b03b4.zip llvm-4fc7c55ffff1bb2b23fc022331b82b086d4b03b4.tar.gz llvm-4fc7c55ffff1bb2b23fc022331b82b086d4b03b4.tar.bz2 |
[NewPM] Actually recompute GlobalsAA before module optimization pipeline
RequireAnalysis<GlobalsAA> doesn't actually recompute GlobalsAA.
GlobalsAA isn't invalidated (unless specifically invalidated) because
it's self-updating via ValueHandles, but can be imprecise during the
self-updates.
Rather than invalidating GlobalsAA, which would invalidate AAManager and
any analyses that use AAManager, create a new pass that recomputes
GlobalsAA.
Fixes #53131.
Differential Revision: https://reviews.llvm.org/D121167
Diffstat (limited to 'llvm/lib/Analysis/GlobalsModRef.cpp')
-rw-r--r-- | llvm/lib/Analysis/GlobalsModRef.cpp | 19 |
1 files changed, 19 insertions, 0 deletions
diff --git a/llvm/lib/Analysis/GlobalsModRef.cpp b/llvm/lib/Analysis/GlobalsModRef.cpp index 14a191e..80989c2 100644 --- a/llvm/lib/Analysis/GlobalsModRef.cpp +++ b/llvm/lib/Analysis/GlobalsModRef.cpp @@ -25,6 +25,7 @@ #include "llvm/IR/Instructions.h" #include "llvm/IR/IntrinsicInst.h" #include "llvm/IR/Module.h" +#include "llvm/IR/PassManager.h" #include "llvm/InitializePasses.h" #include "llvm/Pass.h" #include "llvm/Support/CommandLine.h" @@ -1009,6 +1010,24 @@ GlobalsAAResult GlobalsAA::run(Module &M, ModuleAnalysisManager &AM) { AM.getResult<CallGraphAnalysis>(M)); } +PreservedAnalyses RecomputeGlobalsAAPass::run(Module &M, + ModuleAnalysisManager &AM) { + if (auto *G = AM.getCachedResult<GlobalsAA>(M)) { + auto &CG = AM.getResult<CallGraphAnalysis>(M); + G->NonAddressTakenGlobals.clear(); + G->UnknownFunctionsWithLocalLinkage = false; + G->IndirectGlobals.clear(); + G->AllocsForIndirectGlobals.clear(); + G->FunctionInfos.clear(); + G->FunctionToSCCMap.clear(); + G->Handles.clear(); + G->CollectSCCMembership(CG); + G->AnalyzeGlobals(M); + G->AnalyzeCallGraph(CG, M); + } + return PreservedAnalyses::all(); +} + char GlobalsAAWrapperPass::ID = 0; INITIALIZE_PASS_BEGIN(GlobalsAAWrapperPass, "globals-aa", "Globals Alias Analysis", false, true) |