aboutsummaryrefslogtreecommitdiffstats
path: root/lib/Transforms/Scalar/GVN.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'lib/Transforms/Scalar/GVN.cpp')
-rw-r--r--lib/Transforms/Scalar/GVN.cpp19
1 files changed, 14 insertions, 5 deletions
diff --git a/lib/Transforms/Scalar/GVN.cpp b/lib/Transforms/Scalar/GVN.cpp
index 3d04fc4..e39e2eb 100644
--- a/lib/Transforms/Scalar/GVN.cpp
+++ b/lib/Transforms/Scalar/GVN.cpp
@@ -721,8 +721,9 @@ Value *GVN::GetValueForBlock(BasicBlock *BB, LoadInst* orig,
Value *&V = Phis[BB];
if (V) return V;
- if (std::distance(pred_begin(BB), pred_end(BB)) == 1)
- return V = GetValueForBlock(*pred_begin(BB), orig, Phis);
+ BasicBlock* singlePred = BB->getSinglePredecessor();
+ if (singlePred)
+ return V = GetValueForBlock(singlePred, orig, Phis);
// Otherwise, the idom is the loop, so we need to insert a PHI node. Do so
// now, then get values to fill in the incoming values for the PHI.
@@ -750,6 +751,16 @@ Value *GVN::GetValueForBlock(BasicBlock *BB, LoadInst* orig,
MD.removeInstruction(PN);
PN->replaceAllUsesWith(first);
+
+ SmallVector<BasicBlock*, 4> toRemove;
+ for (DenseMap<BasicBlock*, Value*>::iterator I = Phis.begin(),
+ E = Phis.end(); I != E; ++I)
+ if (I->second == PN)
+ toRemove.push_back(I->first);
+ for (SmallVector<BasicBlock*, 4>::iterator I = toRemove.begin(),
+ E= toRemove.end(); I != E; ++I)
+ Phis[*I] = first;
+
PN->eraseFromParent();
Phis[BB] = first;
@@ -764,9 +775,7 @@ bool GVN::processNonLocalLoad(LoadInst* L, SmallVector<Instruction*, 4>& toErase
MemoryDependenceAnalysis& MD = getAnalysis<MemoryDependenceAnalysis>();
DenseMap<BasicBlock*, Value*> deps;
- bool ret = MD.getNonLocalDependency(L, deps);
- if (!ret)
- return false;
+ MD.getNonLocalDependency(L, deps);
DenseMap<BasicBlock*, Value*> repl;
for (DenseMap<BasicBlock*, Value*>::iterator I = deps.begin(), E = deps.end();