From: Owen Anderson Date: Tue, 19 Jun 2007 05:37:32 +0000 (+0000) Subject: Be careful to erase values from all of the appropriate sets when they're not needed... X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=20cb51fda48edb2109fb94cd7c04e2774db3bb6c;p=oota-llvm.git Be careful to erase values from all of the appropriate sets when they're not needed anymore. This fixes a few more memory-related issues. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@37647 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Transforms/Scalar/GVNPRE.cpp b/lib/Transforms/Scalar/GVNPRE.cpp index 05a28b3f7db..9b0666494b4 100644 --- a/lib/Transforms/Scalar/GVNPRE.cpp +++ b/lib/Transforms/Scalar/GVNPRE.cpp @@ -101,6 +101,7 @@ namespace { std::set& 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(V)) + maximalExpressions.erase(create_expression(BO)); + else if (CmpInst* C = dyn_cast(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; }