aboutsummaryrefslogtreecommitdiffstats
path: root/lib/CodeGen
diff options
context:
space:
mode:
authorVikram S. Adve <vadve@cs.uiuc.edu>2002-03-24 03:24:00 +0000
committerVikram S. Adve <vadve@cs.uiuc.edu>2002-03-24 03:24:00 +0000
commitd95919cbd09007f3e363180c3059a63287f4edd1 (patch)
tree200010703200ceccc4e9b1a01d787a37088923c3 /lib/CodeGen
parent98d64f8d5131ddb96c4bdf06474af93122cb9f2f (diff)
downloadexternal_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.cpp39
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
}