diff --git a/include/llvm/ADT/DepthFirstIterator.h b/include/llvm/ADT/DepthFirstIterator.h index b9e5cbdf8c6..3edb5550788 100644 --- a/include/llvm/ADT/DepthFirstIterator.h +++ b/include/llvm/ADT/DepthFirstIterator.h @@ -193,6 +193,15 @@ public: NodeType *getPath(unsigned n) const { return VisitStack[n].first.getPointer(); } + + /// skipChildren - Skip all children of Node, assuming that Node is on the + /// current path. This allows more aggressive pruning than just skipping + /// children of the current node. + _Self& skipChildren(NodeType *Node) { + while (!VisitStack.empty() && **this != Node) + VisitStack.pop_back(); + return skipChildren(); + } }; diff --git a/lib/CodeGen/SplitKit.cpp b/lib/CodeGen/SplitKit.cpp index b081bf37337..dae282dfce6 100644 --- a/lib/CodeGen/SplitKit.cpp +++ b/lib/CodeGen/SplitKit.cpp @@ -446,9 +446,9 @@ VNInfo *LiveIntervalMap::mapValue(const VNInfo *ParentVNI, SlotIndex Idx) { } // No need to search the children, we found a dominating value. - // FIXME: We could prune up to the last phi-def we inserted, need df_iterator - // for that. - IDFI.skipChildren(); + // MBB is either the found dominating value, or the last phi-def we created. + // Either way, the children of MBB would be shadowed, so don't search them. + IDFI.skipChildren(MBB); } // The search should at least find a dominating value for IdxMBB.