From 7884cd17aa830bc8d4af1c082cc2d1f7460ccf34 Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Mon, 8 Apr 2002 23:09:07 +0000 Subject: [PATCH] Don't leak memory like a seive git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@2185 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/CodeGen/InstrForest.h | 5 +++- lib/CodeGen/InstrSelection/InstrForest.cpp | 23 ++++--------------- .../SparcV9/InstrSelection/InstrForest.cpp | 23 ++++--------------- 3 files changed, 14 insertions(+), 37 deletions(-) diff --git a/include/llvm/CodeGen/InstrForest.h b/include/llvm/CodeGen/InstrForest.h index ef5e2f9a06a..86b59a6d4f9 100644 --- a/include/llvm/CodeGen/InstrForest.h +++ b/include/llvm/CodeGen/InstrForest.h @@ -136,7 +136,10 @@ public: LeftChild = RightChild = Parent = 0; opLabel = InvalidOp; } - virtual ~InstrTreeNode() {} + virtual ~InstrTreeNode() { + delete LeftChild; + delete RightChild; + } InstrTreeNodeType getNodeType () const { return treeNodeType; } diff --git a/lib/CodeGen/InstrSelection/InstrForest.cpp b/lib/CodeGen/InstrSelection/InstrForest.cpp index 8fa8638a025..0934e7bbd56 100644 --- a/lib/CodeGen/InstrSelection/InstrForest.cpp +++ b/lib/CodeGen/InstrSelection/InstrForest.cpp @@ -17,9 +17,6 @@ // and (2) O and I are part of the same basic block, // and (3) O has only a single use, viz., I. // -// History: -// 6/28/01 - Vikram Adve - Created -// //--------------------------------------------------------------------------- #include "llvm/CodeGen/InstrForest.h" @@ -27,7 +24,6 @@ #include "llvm/Function.h" #include "llvm/iTerminators.h" #include "llvm/iMemory.h" -#include "llvm/iPHINode.h" #include "llvm/ConstantVals.h" #include "llvm/BasicBlock.h" #include "llvm/CodeGen/MachineInstr.h" @@ -192,16 +188,14 @@ InstrForest::InstrForest(Function *F) { for (Function::iterator FI = F->begin(), FE = F->end(); FI != FE; ++FI) { BasicBlock *BB = *FI; - for (BasicBlock::iterator I = BB->begin(), E = BB->end(); I != E; ++I) - buildTreeForInstruction(*I); + for_each(BB->begin(), BB->end(), + bind_obj(this, &InstrForest::buildTreeForInstruction)); } } InstrForest::~InstrForest() { - for (std::hash_map::iterator I=begin(); - I != end(); ++I) - delete I->second; + for_each(treeRoots.begin(), treeRoots.end(), deleter); } void @@ -282,11 +276,8 @@ InstrForest::buildTreeForInstruction(Instruction *instr) // if a fixed array is too small. // int numChildren = 0; - const unsigned int MAX_CHILD = 8; - static InstrTreeNode *fixedChildArray[MAX_CHILD]; InstrTreeNode **childArray = - (instr->getNumOperands() > MAX_CHILD) - ? new (InstrTreeNode*)[instr->getNumOperands()] : fixedChildArray; + (InstrTreeNode **)alloca(instr->getNumOperands()*sizeof(InstrTreeNode *)); // // Walk the operands of the instruction @@ -329,7 +320,7 @@ InstrForest::buildTreeForInstruction(Instruction *instr) InstrTreeNode* opTreeNode; if (isa(operand) && operand->use_size() == 1 && cast(operand)->getParent() == instr->getParent() && - !isa(instr) && + instr->getOpcode() != Instruction::PHINode && instr->getOpcode() != Instruction::Call) { // Recursively create a treeNode for it. @@ -394,9 +385,5 @@ InstrForest::buildTreeForInstruction(Instruction *instr) setRightChild(parent, childArray[numChildren - 1]); } - if (childArray != fixedChildArray) - delete [] childArray; - return treeNode; } - diff --git a/lib/Target/SparcV9/InstrSelection/InstrForest.cpp b/lib/Target/SparcV9/InstrSelection/InstrForest.cpp index 8fa8638a025..0934e7bbd56 100644 --- a/lib/Target/SparcV9/InstrSelection/InstrForest.cpp +++ b/lib/Target/SparcV9/InstrSelection/InstrForest.cpp @@ -17,9 +17,6 @@ // and (2) O and I are part of the same basic block, // and (3) O has only a single use, viz., I. // -// History: -// 6/28/01 - Vikram Adve - Created -// //--------------------------------------------------------------------------- #include "llvm/CodeGen/InstrForest.h" @@ -27,7 +24,6 @@ #include "llvm/Function.h" #include "llvm/iTerminators.h" #include "llvm/iMemory.h" -#include "llvm/iPHINode.h" #include "llvm/ConstantVals.h" #include "llvm/BasicBlock.h" #include "llvm/CodeGen/MachineInstr.h" @@ -192,16 +188,14 @@ InstrForest::InstrForest(Function *F) { for (Function::iterator FI = F->begin(), FE = F->end(); FI != FE; ++FI) { BasicBlock *BB = *FI; - for (BasicBlock::iterator I = BB->begin(), E = BB->end(); I != E; ++I) - buildTreeForInstruction(*I); + for_each(BB->begin(), BB->end(), + bind_obj(this, &InstrForest::buildTreeForInstruction)); } } InstrForest::~InstrForest() { - for (std::hash_map::iterator I=begin(); - I != end(); ++I) - delete I->second; + for_each(treeRoots.begin(), treeRoots.end(), deleter); } void @@ -282,11 +276,8 @@ InstrForest::buildTreeForInstruction(Instruction *instr) // if a fixed array is too small. // int numChildren = 0; - const unsigned int MAX_CHILD = 8; - static InstrTreeNode *fixedChildArray[MAX_CHILD]; InstrTreeNode **childArray = - (instr->getNumOperands() > MAX_CHILD) - ? new (InstrTreeNode*)[instr->getNumOperands()] : fixedChildArray; + (InstrTreeNode **)alloca(instr->getNumOperands()*sizeof(InstrTreeNode *)); // // Walk the operands of the instruction @@ -329,7 +320,7 @@ InstrForest::buildTreeForInstruction(Instruction *instr) InstrTreeNode* opTreeNode; if (isa(operand) && operand->use_size() == 1 && cast(operand)->getParent() == instr->getParent() && - !isa(instr) && + instr->getOpcode() != Instruction::PHINode && instr->getOpcode() != Instruction::Call) { // Recursively create a treeNode for it. @@ -394,9 +385,5 @@ InstrForest::buildTreeForInstruction(Instruction *instr) setRightChild(parent, childArray[numChildren - 1]); } - if (childArray != fixedChildArray) - delete [] childArray; - return treeNode; } -