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 | |
| 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')
| -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; |

