diff options
author | Nick Lewycky <nicholas@mxc.ca> | 2013-08-13 00:03:47 +0000 |
---|---|---|
committer | Nick Lewycky <nicholas@mxc.ca> | 2013-08-13 00:03:47 +0000 |
commit | 72dba254ae65b06062106910a70d46f21e19d55a (patch) | |
tree | f9661eefd40f085d815cb903a19940f4f3d76515 /include | |
parent | b58bddf258e9fb0e087c7acfa7946126c63d5a86 (diff) | |
download | external_llvm-72dba254ae65b06062106910a70d46f21e19d55a.zip external_llvm-72dba254ae65b06062106910a70d46f21e19d55a.tar.gz external_llvm-72dba254ae65b06062106910a70d46f21e19d55a.tar.bz2 |
Fix an oversight in isPotentiallyReachable where we wouldn't do any CFG-walking
to find loops if the From and To instructions were in the same block.
Refactor the code a little now that we need to fill to start the CFG-walking
algorithm with more than one starting basic block sometimes.
Special thanks to Andrew Trick for catching an error in my understanding of
natural loops in code review.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@188236 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'include')
-rw-r--r-- | include/llvm/Analysis/CFG.h | 12 |
1 files changed, 12 insertions, 0 deletions
diff --git a/include/llvm/Analysis/CFG.h b/include/llvm/Analysis/CFG.h index 08fdc26..979926b 100644 --- a/include/llvm/Analysis/CFG.h +++ b/include/llvm/Analysis/CFG.h @@ -49,6 +49,9 @@ unsigned GetSuccessorNumber(BasicBlock *BB, BasicBlock *Succ); bool isCriticalEdge(const TerminatorInst *TI, unsigned SuccNum, bool AllowIdenticalEdges = false); +/// \brief Determine whether instruction 'To' is reachable from 'From', +/// returning true if uncertain. +/// /// Determine whether there is a path from From to To within a single function. /// Returns false only if we can prove that once 'From' has been executed then /// 'To' can not be executed. Conservatively returns true. @@ -64,6 +67,15 @@ bool isCriticalEdge(const TerminatorInst *TI, unsigned SuccNum, bool isPotentiallyReachable(const Instruction *From, const Instruction *To, DominatorTree *DT = 0, LoopInfo *LI = 0); +/// \brief Determine whether block 'To' is reachable from 'From', returning +/// true if uncertain. +/// +/// Determine whether there is a path from From to To within a single function. +/// Returns false only if we can prove that once 'From' has been reached then +/// 'To' can not be executed. Conservatively returns true. +bool isPotentiallyReachable(const BasicBlock *From, const BasicBlock *To, + DominatorTree *DT = 0, LoopInfo *LI = 0); + } // End llvm namespace #endif |