Handle unreachable code in the dominates functions. This changes users when

needed for correctness, but still doesn't clean up code that now unnecessary
checks for reachability.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@153755 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Rafael Espindola
2012-03-30 16:46:21 +00:00
parent 0e4fa5ff36
commit 092c5ccf5b
6 changed files with 239 additions and 11 deletions

View File

@@ -359,8 +359,19 @@ public:
bool dominatedBySlowTreeWalk(const DomTreeNodeBase<NodeT> *A,
const DomTreeNodeBase<NodeT> *B) const {
// A node trivially dominates itself.
if (B == A)
return true;
// An unreachable node is dominated by anything.
if (!isReachableFromEntry(B))
return true;
// And dominates nothing.
if (!isReachableFromEntry(A))
return false;
const DomTreeNodeBase<NodeT> *IDom;
if (A == 0 || B == 0) return false;
while ((IDom = B->getIDom()) != 0 && IDom != A && IDom != B)
B = IDom; // Walk up the tree
return IDom != 0;
@@ -369,10 +380,14 @@ public:
/// isReachableFromEntry - Return true if A is dominated by the entry
/// block of the function containing it.
bool isReachableFromEntry(const NodeT* A) {
bool isReachableFromEntry(const NodeT* A) const {
assert(!this->isPostDominator() &&
"This is not implemented for post dominators");
return dominates(&A->getParent()->front(), A);
return isReachableFromEntry(getNode(const_cast<NodeT *>(A)));
}
inline bool isReachableFromEntry(const DomTreeNodeBase<NodeT> *A) const {
return A;
}
/// dominates - Returns true iff A dominates B. Note that this is not a
@@ -380,10 +395,16 @@ public:
///
inline bool dominates(const DomTreeNodeBase<NodeT> *A,
const DomTreeNodeBase<NodeT> *B) {
// A node trivially dominates itself.
if (B == A)
return true; // A node trivially dominates itself.
return true;
if (A == 0 || B == 0)
// An unreachable node is dominated by anything.
if (!isReachableFromEntry(B))
return true;
// And dominates nothing.
if (!isReachableFromEntry(A))
return false;
// Compare the result of the tree walk and the dfs numbers, if expensive