summaryrefslogtreecommitdiffstats
path: root/llvm/lib
diff options
context:
space:
mode:
authorOwen Anderson <resistor@mac.com>2008-12-02 04:09:22 +0000
committerOwen Anderson <resistor@mac.com>2008-12-02 04:09:22 +0000
commitd930420ccf91342cd893701bef67f8c78996e2f2 (patch)
tree3be959ee6174ab4913570b5f70f99feabcbf7a19 /llvm/lib
parent1718fd4375216d808d96661b731434d2969872ea (diff)
downloadbcm5719-llvm-d930420ccf91342cd893701bef67f8c78996e2f2.tar.gz
bcm5719-llvm-d930420ccf91342cd893701bef67f8c78996e2f2.zip
Fix an issue that Chris noticed, where local PRE was not properly instantiating
a new value numbering set after splitting a critical edge. This increases the number of instances of PRE on 403.gcc from ~60 to ~570. llvm-svn: 60393
Diffstat (limited to 'llvm/lib')
-rw-r--r--llvm/lib/Transforms/Scalar/GVN.cpp9
1 files changed, 7 insertions, 2 deletions
diff --git a/llvm/lib/Transforms/Scalar/GVN.cpp b/llvm/lib/Transforms/Scalar/GVN.cpp
index d1f413eea29..039d52029aa 100644
--- a/llvm/lib/Transforms/Scalar/GVN.cpp
+++ b/llvm/lib/Transforms/Scalar/GVN.cpp
@@ -1299,6 +1299,7 @@ bool GVN::performPRE(Function& F) {
if (isCriticalEdge(PREPred->getTerminator(), succNum)) {
toSplit.push_back(std::make_pair(PREPred->getTerminator(), succNum));
+ Changed = true;
continue;
}
@@ -1361,10 +1362,14 @@ bool GVN::performPRE(Function& F) {
}
for (SmallVector<std::pair<TerminatorInst*, unsigned>, 4>::iterator
- I = toSplit.begin(), E = toSplit.end(); I != E; ++I)
+ I = toSplit.begin(), E = toSplit.end(); I != E; ++I) {
SplitCriticalEdge(I->first, I->second, this);
+ BasicBlock* NewBlock = I->first->getSuccessor(I->second);
+ localAvail[NewBlock] =
+ new ValueNumberScope(localAvail[I->first->getParent()]);
+ }
- return Changed || toSplit.size();
+ return Changed;
}
// iterateOnFunction - Executes one iteration of GVN
OpenPOWER on IntegriCloud