[PATCH] D128145: [GlobalOpt] Preserve CFG analyses
Arthur Eubanks via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Sun Jun 19 16:13:25 PDT 2022
This revision was landed with ongoing or failed builds.
This revision was automatically updated to reflect the committed changes.
Closed by commit rGcc65f3e16714: [GlobalOpt] Preserve CFG analyses (authored by aeubanks).
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D128145/new/
https://reviews.llvm.org/D128145
Files:
llvm/lib/Transforms/IPO/GlobalOpt.cpp
Index: llvm/lib/Transforms/IPO/GlobalOpt.cpp
===================================================================
--- llvm/lib/Transforms/IPO/GlobalOpt.cpp
+++ llvm/lib/Transforms/IPO/GlobalOpt.cpp
@@ -1941,7 +1941,8 @@
function_ref<TargetTransformInfo &(Function &)> GetTTI,
function_ref<BlockFrequencyInfo &(Function &)> GetBFI,
function_ref<DominatorTree &(Function &)> LookupDomTree,
- SmallPtrSetImpl<const Comdat *> &NotDiscardableComdats) {
+ SmallPtrSetImpl<const Comdat *> &NotDiscardableComdats,
+ function_ref<void(Function &F)> ChangedCFGCallback) {
bool Changed = false;
@@ -1974,13 +1975,11 @@
// So, remove unreachable blocks from the function, because a) there's
// no point in analyzing them and b) GlobalOpt should otherwise grow
// some more complicated logic to break these cycles.
- // Removing unreachable blocks might invalidate the dominator so we
- // recalculate it.
+ // Notify the analysis manager that we've modified the function's CFG.
if (!F.isDeclaration()) {
if (removeUnreachableBlocks(F)) {
- auto &DT = LookupDomTree(F);
- DT.recalculate(F);
Changed = true;
+ ChangedCFGCallback(F);
}
}
@@ -2443,12 +2442,13 @@
return Changed;
}
-static bool optimizeGlobalsInModule(
- Module &M, const DataLayout &DL,
- function_ref<TargetLibraryInfo &(Function &)> GetTLI,
- function_ref<TargetTransformInfo &(Function &)> GetTTI,
- function_ref<BlockFrequencyInfo &(Function &)> GetBFI,
- function_ref<DominatorTree &(Function &)> LookupDomTree) {
+static bool
+optimizeGlobalsInModule(Module &M, const DataLayout &DL,
+ function_ref<TargetLibraryInfo &(Function &)> GetTLI,
+ function_ref<TargetTransformInfo &(Function &)> GetTTI,
+ function_ref<BlockFrequencyInfo &(Function &)> GetBFI,
+ function_ref<DominatorTree &(Function &)> LookupDomTree,
+ function_ref<void(Function &F)> ChangedCFGCallback) {
SmallPtrSet<const Comdat *, 8> NotDiscardableComdats;
bool Changed = false;
bool LocalChange = true;
@@ -2473,7 +2473,7 @@
// Delete functions that are trivially dead, ccc -> fastcc
LocalChange |= OptimizeFunctions(M, GetTLI, GetTTI, GetBFI, LookupDomTree,
- NotDiscardableComdats);
+ NotDiscardableComdats, ChangedCFGCallback);
// Optimize global_ctors list.
LocalChange |=
@@ -2526,10 +2526,22 @@
auto GetBFI = [&FAM](Function &F) -> BlockFrequencyInfo & {
return FAM.getResult<BlockFrequencyAnalysis>(F);
};
+ auto ChangedCFGCallback = [&FAM](Function &F) {
+ FAM.invalidate(F, PreservedAnalyses::none());
+ };
- if (!optimizeGlobalsInModule(M, DL, GetTLI, GetTTI, GetBFI, LookupDomTree))
+ if (!optimizeGlobalsInModule(M, DL, GetTLI, GetTTI, GetBFI, LookupDomTree,
+ ChangedCFGCallback))
return PreservedAnalyses::all();
- return PreservedAnalyses::none();
+
+ PreservedAnalyses PA = PreservedAnalyses::none();
+ // We have not removed or replaced any functions.
+ PA.preserve<FunctionAnalysisManagerModuleProxy>();
+ // The only place we modify the CFG is when calling
+ // removeUnreachableBlocks(), but there we make sure to invalidate analyses
+ // for modified functions.
+ PA.preserveSet<CFGAnalyses>();
+ return PA;
}
namespace {
@@ -2560,8 +2572,13 @@
return this->getAnalysis<BlockFrequencyInfoWrapperPass>(F).getBFI();
};
- return optimizeGlobalsInModule(M, DL, GetTLI, GetTTI, GetBFI,
- LookupDomTree);
+ auto ChangedCFGCallback = [&LookupDomTree](Function &F) {
+ auto &DT = LookupDomTree(F);
+ DT.recalculate(F);
+ };
+
+ return optimizeGlobalsInModule(M, DL, GetTLI, GetTTI, GetBFI, LookupDomTree,
+ ChangedCFGCallback);
}
void getAnalysisUsage(AnalysisUsage &AU) const override {
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D128145.438224.patch
Type: text/x-patch
Size: 4179 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20220619/182b53c7/attachment.bin>
More information about the llvm-commits
mailing list