diff options
author | Roman Lebedev <lebedev.ri@gmail.com> | 2020-07-04 20:04:28 +0300 |
---|---|---|
committer | Roman Lebedev <lebedev.ri@gmail.com> | 2020-07-04 21:06:36 +0300 |
commit | 11a3f040c71020b0247144268570d571858b119c (patch) | |
tree | a76fab99c72109a1b2a159121954ea73f3358fac /llvm/lib/Transforms/Utils/AssumeBundleBuilder.cpp | |
parent | 45b5c79a31d05edb179efeda9305e6c42be4f818 (diff) | |
download | llvm-11a3f040c71020b0247144268570d571858b119c.zip llvm-11a3f040c71020b0247144268570d571858b119c.tar.gz llvm-11a3f040c71020b0247144268570d571858b119c.tar.bz2 |
[Utils] Make -assume-builder/-assume-simplify actually work on Old-PM
clang w/ old-pm currently would simply crash
when -mllvm -enable-knowledge-retention=true is specified.
Clearly, these two passes had no Old-PM test coverage,
which would have shown the problem - not requiring AssumptionCacheTracker,
but then trying to always get it.
Also, why try to get domtree only if it's cached,
but at the same time marking it as required?
Diffstat (limited to 'llvm/lib/Transforms/Utils/AssumeBundleBuilder.cpp')
-rw-r--r-- | llvm/lib/Transforms/Utils/AssumeBundleBuilder.cpp | 45 |
1 files changed, 40 insertions, 5 deletions
diff --git a/llvm/lib/Transforms/Utils/AssumeBundleBuilder.cpp b/llvm/lib/Transforms/Utils/AssumeBundleBuilder.cpp index ad45744..f2208ed 100644 --- a/llvm/lib/Transforms/Utils/AssumeBundleBuilder.cpp +++ b/llvm/lib/Transforms/Utils/AssumeBundleBuilder.cpp @@ -525,14 +525,16 @@ public: bool runOnFunction(Function &F) override { if (skipFunction(F) || !EnableKnowledgeRetention) return false; - DominatorTreeWrapperPass *DT = - getAnalysisIfAvailable<DominatorTreeWrapperPass>(); AssumptionCache &AC = getAnalysis<AssumptionCacheTracker>().getAssumptionCache(F); - return simplifyAssumes(F, &AC, DT ? &DT->getDomTree() : nullptr); + DominatorTreeWrapperPass *DTWP = + getAnalysisIfAvailable<DominatorTreeWrapperPass>(); + return simplifyAssumes(F, &AC, DTWP ? &DTWP->getDomTree() : nullptr); } void getAnalysisUsage(AnalysisUsage &AU) const override { + AU.addRequired<AssumptionCacheTracker>(); + AU.setPreservesAll(); } }; @@ -542,7 +544,6 @@ char AssumeSimplifyPassLegacyPass::ID = 0; INITIALIZE_PASS_BEGIN(AssumeSimplifyPassLegacyPass, "assume-simplify", "Assume Simplify", false, false) -INITIALIZE_PASS_DEPENDENCY(DominatorTreeWrapperPass) INITIALIZE_PASS_DEPENDENCY(AssumptionCacheTracker) INITIALIZE_PASS_END(AssumeSimplifyPassLegacyPass, "assume-simplify", "Assume Simplify", false, false) @@ -553,9 +554,43 @@ FunctionPass *llvm::createAssumeSimplifyPass() { PreservedAnalyses AssumeBuilderPass::run(Function &F, FunctionAnalysisManager &AM) { - AssumptionCache* AC = AM.getCachedResult<AssumptionAnalysis>(F); + AssumptionCache *AC = &AM.getResult<AssumptionAnalysis>(F); DominatorTree* DT = AM.getCachedResult<DominatorTreeAnalysis>(F); for (Instruction &I : instructions(F)) salvageKnowledge(&I, AC, DT); return PreservedAnalyses::all(); } + +namespace { +class AssumeBuilderPassLegacyPass : public FunctionPass { +public: + static char ID; + + AssumeBuilderPassLegacyPass() : FunctionPass(ID) { + initializeAssumeBuilderPassLegacyPassPass(*PassRegistry::getPassRegistry()); + } + bool runOnFunction(Function &F) override { + AssumptionCache &AC = + getAnalysis<AssumptionCacheTracker>().getAssumptionCache(F); + DominatorTreeWrapperPass *DTWP = + getAnalysisIfAvailable<DominatorTreeWrapperPass>(); + for (Instruction &I : instructions(F)) + salvageKnowledge(&I, &AC, DTWP ? &DTWP->getDomTree() : nullptr); + return true; + } + + void getAnalysisUsage(AnalysisUsage &AU) const override { + AU.addRequired<AssumptionCacheTracker>(); + + AU.setPreservesAll(); + } +}; +} // namespace + +char AssumeBuilderPassLegacyPass::ID = 0; + +INITIALIZE_PASS_BEGIN(AssumeBuilderPassLegacyPass, "assume-builder", + "Assume Builder", false, false) +INITIALIZE_PASS_DEPENDENCY(AssumptionCacheTracker) +INITIALIZE_PASS_END(AssumeBuilderPassLegacyPass, "assume-builder", + "Assume Builder", false, false) |