Fix an issue that Chris noticed, where local PRE was not properly instantiating
authorOwen Anderson <resistor@mac.com>
Tue, 2 Dec 2008 04:09:22 +0000 (04:09 +0000)
committerOwen Anderson <resistor@mac.com>
Tue, 2 Dec 2008 04:09:22 +0000 (04:09 +0000)
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.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@60393 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Transforms/Scalar/GVN.cpp

index d1f413eea293db9b319665402b3c360db808bdc2..039d52029aac9d88da399ae802cbf48d6d2a00fd 100644 (file)
@@ -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