aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/llvm/ADT/DepthFirstIterator.h9
-rw-r--r--lib/CodeGen/SplitKit.cpp6
2 files changed, 12 insertions, 3 deletions
diff --git a/include/llvm/ADT/DepthFirstIterator.h b/include/llvm/ADT/DepthFirstIterator.h
index b9e5cbd..3edb555 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 b081bf3..dae282d 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.