mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-07-25 13:24:46 +00:00
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:
@@ -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
|
||||
|
@@ -762,7 +762,8 @@ public:
|
||||
InvBlockTraits::child_begin(BB), E = InvBlockTraits::child_end(BB);
|
||||
I != E; ++I) {
|
||||
typename InvBlockTraits::NodeType *N = *I;
|
||||
if (DT.dominates(BB, N)) // If BB dominates its predecessor...
|
||||
// If BB dominates its predecessor...
|
||||
if (DT.dominates(BB, N) && DT.isReachableFromEntry(N))
|
||||
TodoStack.push_back(N);
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user