summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlina Sbirlea <asbirlea@google.com>2019-09-30 17:23:49 +0000
committerAlina Sbirlea <asbirlea@google.com>2019-09-30 17:23:49 +0000
commitad888846585f2b69808fd1d041cf6818c21905da (patch)
tree536b4f6bfd0701ea30c09a6648b41efbce3a9baf
parent299ebacfe93d205532dcdd9e5e4f7828b678242d (diff)
downloadbcm5719-llvm-ad888846585f2b69808fd1d041cf6818c21905da.tar.gz
bcm5719-llvm-ad888846585f2b69808fd1d041cf6818c21905da.zip
[LegacyPassManager] Attempt to fix BasicBlockManager
Temporarily fix BaiscBlockManager based on the code in the other managers. Replacement of all uses of the BasicBlockPass to follow. Resolves PR42264. llvm-svn: 373235
-rw-r--r--llvm/include/llvm/Pass.h2
-rw-r--r--llvm/lib/IR/LegacyPassManager.cpp19
2 files changed, 21 insertions, 0 deletions
diff --git a/llvm/include/llvm/Pass.h b/llvm/include/llvm/Pass.h
index 329f7eaba73..d36555cc7e7 100644
--- a/llvm/include/llvm/Pass.h
+++ b/llvm/include/llvm/Pass.h
@@ -338,6 +338,8 @@ public:
/// do any post processing needed after all passes have run.
virtual bool doFinalization(Function &);
+ void preparePassManager(PMStack &PMS) override;
+
void assignPassManager(PMStack &PMS, PassManagerType T) override;
/// Return what kind of Pass Manager can manage this pass.
diff --git a/llvm/lib/IR/LegacyPassManager.cpp b/llvm/lib/IR/LegacyPassManager.cpp
index f03df2dec7c..3a03c493100 100644
--- a/llvm/lib/IR/LegacyPassManager.cpp
+++ b/llvm/lib/IR/LegacyPassManager.cpp
@@ -1998,10 +1998,28 @@ void FunctionPass::assignPassManager(PMStack &PMS,
FPP->add(this);
}
+void BasicBlockPass::preparePassManager(PMStack &PMS) {
+ // Find BBPassManager
+ while (!PMS.empty() &&
+ PMS.top()->getPassManagerType() > PMT_BasicBlockPassManager)
+ PMS.pop();
+
+ // If this pass is destroying high level information that is used
+ // by other passes that are managed by BBPM then do not insert
+ // this pass in current BBPM. Use new BBPassManager.
+ if (PMS.top()->getPassManagerType() == PMT_BasicBlockPassManager &&
+ !PMS.top()->preserveHigherLevelAnalysis(this))
+ PMS.pop();
+}
+
/// Find appropriate Basic Pass Manager or Call Graph Pass Manager
/// in the PM Stack and add self into that manager.
void BasicBlockPass::assignPassManager(PMStack &PMS,
PassManagerType PreferredType) {
+ while (!PMS.empty() &&
+ PMS.top()->getPassManagerType() > PMT_BasicBlockPassManager)
+ PMS.pop();
+
BBPassManager *BBP;
// Basic Pass Manager is a leaf pass manager. It does not handle
@@ -2017,6 +2035,7 @@ void BasicBlockPass::assignPassManager(PMStack &PMS,
// [1] Create new Basic Block Manager
BBP = new BBPassManager();
+ BBP->populateInheritedAnalysis(PMS);
// [2] Set up new manager's top level manager
// Basic Block Pass Manager does not live by itself
OpenPOWER on IntegriCloud