diff options
-rw-r--r-- | lib/CodeGen/StrongPHIElimination.cpp | 18 |
1 files changed, 12 insertions, 6 deletions
diff --git a/lib/CodeGen/StrongPHIElimination.cpp b/lib/CodeGen/StrongPHIElimination.cpp index 54c6647f05..dc260af0fc 100644 --- a/lib/CodeGen/StrongPHIElimination.cpp +++ b/lib/CodeGen/StrongPHIElimination.cpp @@ -400,12 +400,18 @@ void StrongPHIElimination::addReg(unsigned Reg) { StrongPHIElimination::Node* StrongPHIElimination::Node::getLeader() { - Node* parentPointer = parent.getPointer(); - if (parentPointer == this) - return this; - Node* newParent = parentPointer->getLeader(); - parent.setPointer(newParent); - return newParent; + Node* N = this; + Node* Parent = parent.getPointer(); + Node* Grandparent = Parent->parent.getPointer(); + + while (Parent != Grandparent) { + N->parent.setPointer(Grandparent); + N = Grandparent; + Parent = Parent->parent.getPointer(); + Grandparent = Parent->parent.getPointer(); + } + + return Parent; } unsigned StrongPHIElimination::getRegColor(unsigned Reg) { |