summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Transforms
diff options
context:
space:
mode:
authorOwen Anderson <resistor@mac.com>2007-06-19 05:37:32 +0000
committerOwen Anderson <resistor@mac.com>2007-06-19 05:37:32 +0000
commit91c54950b329d651a65aae3f745154f10d279c35 (patch)
treef1f0c0ace968d8fa3f5d226e19db27ff4fe8e907 /llvm/lib/Transforms
parentb9cbaed6239cdc23f2fca3f02eebd450244670d0 (diff)
downloadbcm5719-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.cpp16
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;
}
OpenPOWER on IntegriCloud