mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-10-03 12:18:00 +00:00
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
This commit is contained in:
@@ -101,6 +101,7 @@ namespace {
|
|||||||
std::set<Value*>& getMaximalValues() { return maximalValues; }
|
std::set<Value*>& getMaximalValues() { return maximalValues; }
|
||||||
Expression create_expression(BinaryOperator* BO);
|
Expression create_expression(BinaryOperator* BO);
|
||||||
Expression create_expression(CmpInst* C);
|
Expression create_expression(CmpInst* C);
|
||||||
|
void erase(Value* v);
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -302,6 +303,15 @@ void ValueTable::clear() {
|
|||||||
nextValueNumber = 1;
|
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 {
|
namespace {
|
||||||
|
|
||||||
class VISIBILITY_HIDDEN GVNPRE : public FunctionPass {
|
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)) {
|
if (newOp1 != BO->getOperand(0) || newOp2 != BO->getOperand(1)) {
|
||||||
Instruction* newVal = BinaryOperator::create(BO->getOpcode(),
|
Instruction* newVal = BinaryOperator::create(BO->getOpcode(),
|
||||||
newOp1, newOp2,
|
newOp1, newOp2,
|
||||||
BO->getName()+".gvnpre");
|
BO->getName()+".expr");
|
||||||
|
|
||||||
uint32_t v = VN.lookup_or_add(newVal);
|
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);
|
createdExpressions.push_back(newVal);
|
||||||
return newVal;
|
return newVal;
|
||||||
} else {
|
} else {
|
||||||
|
VN.erase(newVal);
|
||||||
delete newVal;
|
delete newVal;
|
||||||
return leader;
|
return leader;
|
||||||
}
|
}
|
||||||
@@ -462,7 +473,7 @@ Value* GVNPRE::phi_translate(Value* V, BasicBlock* pred, BasicBlock* succ) {
|
|||||||
Instruction* newVal = CmpInst::create(C->getOpcode(),
|
Instruction* newVal = CmpInst::create(C->getOpcode(),
|
||||||
C->getPredicate(),
|
C->getPredicate(),
|
||||||
newOp1, newOp2,
|
newOp1, newOp2,
|
||||||
C->getName()+".gvnpre");
|
C->getName()+".expr");
|
||||||
|
|
||||||
uint32_t v = VN.lookup_or_add(newVal);
|
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);
|
createdExpressions.push_back(newVal);
|
||||||
return newVal;
|
return newVal;
|
||||||
} else {
|
} else {
|
||||||
|
VN.erase(newVal);
|
||||||
delete newVal;
|
delete newVal;
|
||||||
return leader;
|
return leader;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user