Be careful to erase values from all of the appropriate sets when they're not needed...
authorOwen Anderson <resistor@mac.com>
Tue, 19 Jun 2007 05:37:32 +0000 (05:37 +0000)
committerOwen Anderson <resistor@mac.com>
Tue, 19 Jun 2007 05:37:32 +0000 (05:37 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@37647 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Transforms/Scalar/GVNPRE.cpp

index 05a28b3f7db50377c9bee36626bc9967ba9b9510..9b0666494b423cc6245c32f476b4ffdd78cd34c2 100644 (file)
@@ -101,6 +101,7 @@ namespace {
       std::set<Value*>& getMaximalValues() { return maximalValues; }
       Expression create_expression(BinaryOperator* BO);
       Expression create_expression(CmpInst* C);
+      void erase(Value* v);
   };
 }
 
@@ -302,6 +303,15 @@ void ValueTable::clear() {
   nextValueNumber = 1;
 }
 
+void ValueTable::erase(Value* V) {
+  maximalValues.erase(V);
+  valueNumbering.erase(V);
+  if (BinaryOperator* BO = dyn_cast<BinaryOperator>(V))
+    maximalExpressions.erase(create_expression(BO));
+  else if (CmpInst* C = dyn_cast<CmpInst>(V))
+    maximalExpressions.erase(create_expression(C));
+}
+
 namespace {
 
   class VISIBILITY_HIDDEN GVNPRE : public FunctionPass {
@@ -419,7 +429,7 @@ Value* GVNPRE::phi_translate(Value* V, BasicBlock* pred, BasicBlock* succ) {
     if (newOp1 != BO->getOperand(0) || newOp2 != BO->getOperand(1)) {
       Instruction* newVal = BinaryOperator::create(BO->getOpcode(),
                                              newOp1, newOp2,
-                                             BO->getName()+".gvnpre");
+                                             BO->getName()+".expr");
       
       uint32_t v = VN.lookup_or_add(newVal);
       
@@ -428,6 +438,7 @@ Value* GVNPRE::phi_translate(Value* V, BasicBlock* pred, BasicBlock* succ) {
         createdExpressions.push_back(newVal);
         return newVal;
       } else {
+        VN.erase(newVal);
         delete newVal;
         return leader;
       }
@@ -462,7 +473,7 @@ Value* GVNPRE::phi_translate(Value* V, BasicBlock* pred, BasicBlock* succ) {
       Instruction* newVal = CmpInst::create(C->getOpcode(),
                                             C->getPredicate(),
                                              newOp1, newOp2,
-                                             C->getName()+".gvnpre");
+                                             C->getName()+".expr");
       
       uint32_t v = VN.lookup_or_add(newVal);
         
@@ -471,6 +482,7 @@ Value* GVNPRE::phi_translate(Value* V, BasicBlock* pred, BasicBlock* succ) {
         createdExpressions.push_back(newVal);
         return newVal;
       } else {
+        VN.erase(newVal);
         delete newVal;
         return leader;
       }