diff options
author | Owen Anderson <resistor@mac.com> | 2007-06-19 05:37:32 +0000 |
---|---|---|
committer | Owen Anderson <resistor@mac.com> | 2007-06-19 05:37:32 +0000 |
commit | 20cb51fda48edb2109fb94cd7c04e2774db3bb6c (patch) | |
tree | 176ae551e31e2b5abbb05e6c7496ab6894b46443 | |
parent | 6cae7409b1a108e14de61fe2a0e6b050cff3d8e7 (diff) |
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
-rw-r--r-- | lib/Transforms/Scalar/GVNPRE.cpp | 16 |
1 files changed, 14 insertions, 2 deletions
diff --git a/lib/Transforms/Scalar/GVNPRE.cpp b/lib/Transforms/Scalar/GVNPRE.cpp index 05a28b3f7d..9b0666494b 100644 --- a/lib/Transforms/Scalar/GVNPRE.cpp +++ b/lib/Transforms/Scalar/GVNPRE.cpp @@ -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; } |