diff options
author | Vikram S. Adve <vadve@cs.uiuc.edu> | 2002-03-24 03:24:00 +0000 |
---|---|---|
committer | Vikram S. Adve <vadve@cs.uiuc.edu> | 2002-03-24 03:24:00 +0000 |
commit | d95919cbd09007f3e363180c3059a63287f4edd1 (patch) | |
tree | 200010703200ceccc4e9b1a01d787a37088923c3 /lib/CodeGen | |
parent | 98d64f8d5131ddb96c4bdf06474af93122cb9f2f (diff) | |
download | external_llvm-d95919cbd09007f3e363180c3059a63287f4edd1.zip external_llvm-d95919cbd09007f3e363180c3059a63287f4edd1.tar.gz external_llvm-d95919cbd09007f3e363180c3059a63287f4edd1.tar.bz2 |
Change treeRoots data structure to make enumeration deterministic.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@1962 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen')
-rw-r--r-- | lib/CodeGen/InstrSelection/InstrForest.cpp | 39 |
1 files changed, 24 insertions, 15 deletions
diff --git a/lib/CodeGen/InstrSelection/InstrForest.cpp b/lib/CodeGen/InstrSelection/InstrForest.cpp index b11d71e..660f311 100644 --- a/lib/CodeGen/InstrSelection/InstrForest.cpp +++ b/lib/CodeGen/InstrSelection/InstrForest.cpp @@ -56,7 +56,8 @@ InstrTreeNode::dump(int dumpChildren, int indent) const InstructionNode::InstructionNode(Instruction* I) - : InstrTreeNode(NTInstructionNode, I) + : InstrTreeNode(NTInstructionNode, I), + codeIsFoldedIntoParent(false) { opLabel = I->getOpcode(); @@ -198,7 +199,7 @@ InstrForest::InstrForest(Method *M) InstrForest::~InstrForest() { - for (std::hash_map<const Instruction*,InstructionNode*>::iterator I = begin(); + for (std::hash_map<const Instruction*,InstructionNode*>::iterator I=begin(); I != end(); ++I) delete I->second; } @@ -206,37 +207,45 @@ InstrForest::~InstrForest() void InstrForest::dump() const { - for (std::hash_set<InstructionNode*>::const_iterator I = treeRoots.begin(); - I != treeRoots.end(); ++I) + for (const_root_iterator I = roots_begin(); I != roots_end(); ++I) (*I)->dump(/*dumpChildren*/ 1, /*indent*/ 0); } inline void +InstrForest::eraseRoot(InstructionNode* node) +{ + for (RootSet::reverse_iterator RI=treeRoots.rbegin(), RE=treeRoots.rend(); + RI != RE; ++RI) + if (*RI == node) + treeRoots.erase(RI.base()-1); +} + +inline void InstrForest::noteTreeNodeForInstr(Instruction *instr, InstructionNode *treeNode) { assert(treeNode->getNodeType() == InstrTreeNode::NTInstructionNode); (*this)[instr] = treeNode; - treeRoots.insert(treeNode); // mark node as root of a new tree + treeRoots.push_back(treeNode); // mark node as root of a new tree } inline void -InstrForest::setLeftChild(InstrTreeNode *Par, InstrTreeNode *Chld) +InstrForest::setLeftChild(InstrTreeNode *parent, InstrTreeNode *child) { - Par->LeftChild = Chld; - Chld->Parent = Par; - if (Chld->getNodeType() == InstrTreeNode::NTInstructionNode) - treeRoots.erase((InstructionNode*)Chld); // no longer a tree root + parent->LeftChild = child; + child->Parent = parent; + if (child->getNodeType() == InstrTreeNode::NTInstructionNode) + eraseRoot((InstructionNode*) child); // no longer a tree root } inline void -InstrForest::setRightChild(InstrTreeNode *Par, InstrTreeNode *Chld) +InstrForest::setRightChild(InstrTreeNode *parent, InstrTreeNode *child) { - Par->RightChild = Chld; - Chld->Parent = Par; - if (Chld->getNodeType() == InstrTreeNode::NTInstructionNode) - treeRoots.erase((InstructionNode*)Chld); // no longer a tree root + parent->RightChild = child; + child->Parent = parent; + if (child->getNodeType() == InstrTreeNode::NTInstructionNode) + eraseRoot((InstructionNode*) child); // no longer a tree root } |