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 | 91c54950b329d651a65aae3f745154f10d279c35 (patch) | |
tree | f1f0c0ace968d8fa3f5d226e19db27ff4fe8e907 /llvm/lib/Transforms | |
parent | b9cbaed6239cdc23f2fca3f02eebd450244670d0 (diff) | |
download | bcm5719-llvm-91c54950b329d651a65aae3f745154f10d279c35.tar.gz bcm5719-llvm-91c54950b329d651a65aae3f745154f10d279c35.zip |
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.
llvm-svn: 37647
Diffstat (limited to 'llvm/lib/Transforms')
-rw-r--r-- | llvm/lib/Transforms/Scalar/GVNPRE.cpp | 16 |
1 files changed, 14 insertions, 2 deletions
diff --git a/llvm/lib/Transforms/Scalar/GVNPRE.cpp b/llvm/lib/Transforms/Scalar/GVNPRE.cpp index 05a28b3f7db..9b0666494b4 100644 --- a/llvm/lib/Transforms/Scalar/GVNPRE.cpp +++ b/llvm/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; } |