diff options
| author | Rafael Espindola <rafael.espindola@gmail.com> | 2012-03-30 16:46:21 +0000 | 
|---|---|---|
| committer | Rafael Espindola <rafael.espindola@gmail.com> | 2012-03-30 16:46:21 +0000 | 
| commit | a53c46aaa3f645f490d75e01a478d673570782a8 (patch) | |
| tree | fdec330e8ad4b3122694149aae2bda145652b8d3 /llvm/lib/VMCore/Dominators.cpp | |
| parent | 70d22ccb22d5ea0d50e6c27536b3073bae896853 (diff) | |
| download | bcm5719-llvm-a53c46aaa3f645f490d75e01a478d673570782a8.tar.gz bcm5719-llvm-a53c46aaa3f645f490d75e01a478d673570782a8.zip | |
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.
llvm-svn: 153755
Diffstat (limited to 'llvm/lib/VMCore/Dominators.cpp')
| -rw-r--r-- | llvm/lib/VMCore/Dominators.cpp | 18 | 
1 files changed, 14 insertions, 4 deletions
| diff --git a/llvm/lib/VMCore/Dominators.cpp b/llvm/lib/VMCore/Dominators.cpp index af51a05c8b5..6f97774fc64 100644 --- a/llvm/lib/VMCore/Dominators.cpp +++ b/llvm/lib/VMCore/Dominators.cpp @@ -88,8 +88,13 @@ bool DominatorTree::dominates(const Instruction *Def,    const BasicBlock *UseBB = User->getParent();    const BasicBlock *DefBB = Def->getParent(); -  assert(isReachableFromEntry(DefBB) && isReachableFromEntry(UseBB) && -         "We only handle reachable blocks"); +  // Any unreachable use is dominated, even if Def == User. +  if (!isReachableFromEntry(UseBB)) +    return true; + +  // Unreachable definitions don't dominate anything. +  if (!isReachableFromEntry(DefBB)) +    return false;    // An instruction doesn't dominate a use in itself.    if (Def == User) @@ -119,8 +124,13 @@ bool DominatorTree::dominates(const Instruction *Def,                                const BasicBlock *UseBB) const {    const BasicBlock *DefBB = Def->getParent(); -  assert(isReachableFromEntry(DefBB) && isReachableFromEntry(UseBB) && -         "We only handle reachable blocks"); +  // Any unreachable use is dominated, even if DefBB == UseBB. +  if (!isReachableFromEntry(UseBB)) +    return true; + +  // Unreachable definitions don't dominate anything. +  if (!isReachableFromEntry(DefBB)) +    return false;    if (DefBB == UseBB)      return false; | 

