summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Transforms/Scalar/CorrelatedValuePropagation.cpp
diff options
context:
space:
mode:
authorMichael Zolotukhin <mzolotukhin@apple.com>2018-06-16 18:57:31 +0000
committerMichael Zolotukhin <mzolotukhin@apple.com>2018-06-16 18:57:31 +0000
commit158a7c33231e3072892331d889b8e8bcdae1a1c0 (patch)
treef042e989a5c4c6403889eca4c1fda558ea96608e /llvm/lib/Transforms/Scalar/CorrelatedValuePropagation.cpp
parentb6b7a3bb781ff047fda6ecf3ba23a80806bb526f (diff)
downloadbcm5719-llvm-158a7c33231e3072892331d889b8e8bcdae1a1c0.tar.gz
bcm5719-llvm-158a7c33231e3072892331d889b8e8bcdae1a1c0.zip
CorrelatedValuePropagation: Preserve DT.
Summary: We only modify CFG in a couple of places, and we can preserve DT there with a little effort. Reviewers: davide, vsk Subscribers: hiraditya, llvm-commits Differential Revision: https://reviews.llvm.org/D48059 llvm-svn: 334895
Diffstat (limited to 'llvm/lib/Transforms/Scalar/CorrelatedValuePropagation.cpp')
-rw-r--r--llvm/lib/Transforms/Scalar/CorrelatedValuePropagation.cpp23
1 files changed, 18 insertions, 5 deletions
diff --git a/llvm/lib/Transforms/Scalar/CorrelatedValuePropagation.cpp b/llvm/lib/Transforms/Scalar/CorrelatedValuePropagation.cpp
index c290f89c9f4..ea148b728a1 100644
--- a/llvm/lib/Transforms/Scalar/CorrelatedValuePropagation.cpp
+++ b/llvm/lib/Transforms/Scalar/CorrelatedValuePropagation.cpp
@@ -82,6 +82,7 @@ namespace {
AU.addRequired<DominatorTreeWrapperPass>();
AU.addRequired<LazyValueInfoWrapperPass>();
AU.addPreserved<GlobalsAAWrapperPass>();
+ AU.addPreserved<DominatorTreeWrapperPass>();
}
};
@@ -306,7 +307,7 @@ static bool processCmp(CmpInst *C, LazyValueInfo *LVI) {
/// that cannot fire no matter what the incoming edge can safely be removed. If
/// a case fires on every incoming edge then the entire switch can be removed
/// and replaced with a branch to the case destination.
-static bool processSwitch(SwitchInst *SI, LazyValueInfo *LVI) {
+static bool processSwitch(SwitchInst *SI, LazyValueInfo *LVI, DominatorTree *DT) {
Value *Cond = SI->getCondition();
BasicBlock *BB = SI->getParent();
@@ -321,6 +322,10 @@ static bool processSwitch(SwitchInst *SI, LazyValueInfo *LVI) {
// Analyse each switch case in turn.
bool Changed = false;
+ DenseMap<BasicBlock*, int> SuccessorsCount;
+ for (auto *Succ : successors(BB))
+ SuccessorsCount[Succ]++;
+
for (auto CI = SI->case_begin(), CE = SI->case_end(); CI != CE;) {
ConstantInt *Case = CI->getCaseValue();
@@ -355,7 +360,8 @@ static bool processSwitch(SwitchInst *SI, LazyValueInfo *LVI) {
if (State == LazyValueInfo::False) {
// This case never fires - remove it.
- CI->getCaseSuccessor()->removePredecessor(BB);
+ BasicBlock *Succ = CI->getCaseSuccessor();
+ Succ->removePredecessor(BB);
CI = SI->removeCase(CI);
CE = SI->case_end();
@@ -365,6 +371,8 @@ static bool processSwitch(SwitchInst *SI, LazyValueInfo *LVI) {
++NumDeadCases;
Changed = true;
+ if (--SuccessorsCount[Succ] == 0)
+ DT->deleteEdge(BB, Succ);
continue;
}
if (State == LazyValueInfo::True) {
@@ -381,10 +389,14 @@ static bool processSwitch(SwitchInst *SI, LazyValueInfo *LVI) {
++CI;
}
- if (Changed)
+ if (Changed) {
// If the switch has been simplified to the point where it can be replaced
// by a branch then do so now.
- ConstantFoldTerminator(BB);
+ DeferredDominance DDT(*DT);
+ ConstantFoldTerminator(BB, /*DeleteDeadConditions = */ false,
+ /*TLI = */ nullptr, &DDT);
+ DDT.flush();
+ }
return Changed;
}
@@ -722,7 +734,7 @@ static bool runImpl(Function &F, LazyValueInfo *LVI, DominatorTree *DT,
Instruction *Term = BB->getTerminator();
switch (Term->getOpcode()) {
case Instruction::Switch:
- BBChanged |= processSwitch(cast<SwitchInst>(Term), LVI);
+ BBChanged |= processSwitch(cast<SwitchInst>(Term), LVI, DT);
break;
case Instruction::Ret: {
auto *RI = cast<ReturnInst>(Term);
@@ -767,5 +779,6 @@ CorrelatedValuePropagationPass::run(Function &F, FunctionAnalysisManager &AM) {
return PreservedAnalyses::all();
PreservedAnalyses PA;
PA.preserve<GlobalsAA>();
+ PA.preserve<DominatorTreeAnalysis>();
return PA;
}
OpenPOWER on IntegriCloud