[llvm-commits] [llvm] r47989 - /llvm/trunk/include/llvm/Support/CFG.h

Nick Lewycky nicholas at mxc.ca
Wed Mar 5 22:54:53 PST 2008


Author: nicholas
Date: Thu Mar  6 00:54:53 2008
New Revision: 47989

URL: http://llvm.org/viewvc/llvm-project?rev=47989&view=rev
Log:
Treat BBs that use BBs as proper predecessors and successors in the CFG.

Modified:
    llvm/trunk/include/llvm/Support/CFG.h

Modified: llvm/trunk/include/llvm/Support/CFG.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Support/CFG.h?rev=47989&r1=47988&r2=47989&view=diff

==============================================================================
--- llvm/trunk/include/llvm/Support/CFG.h (original)
+++ llvm/trunk/include/llvm/Support/CFG.h Thu Mar  6 00:54:53 2008
@@ -34,14 +34,14 @@
   typedef PredIterator<_Ptr,_USE_iterator> _Self;
   typedef typename super::pointer pointer;
 
-  inline void advancePastNonTerminators() {
-    // Loop to ignore non terminator uses (for example PHI nodes)...
-    while (!It.atEnd() && !isa<TerminatorInst>(*It))
+  inline void advancePastNonPreds() {
+    // Loop to ignore non predecessor uses (for example PHI nodes)...
+    while (!It.atEnd() && !isa<TerminatorInst>(*It) && !isa<BasicBlock>(*It))
       ++It;
   }
 
   inline PredIterator(_Ptr *bb) : It(bb->use_begin()) {
-    advancePastNonTerminators();
+    advancePastNonPreds();
   }
   inline PredIterator(_Ptr *bb, bool) : It(bb->use_end()) {}
 
@@ -50,13 +50,16 @@
 
   inline pointer operator*() const {
     assert(!It.atEnd() && "pred_iterator out of range!");
-    return cast<TerminatorInst>(*It)->getParent();
+    if (isa<TerminatorInst>(*It))      // not dyn_cast due to const-correctness
+      return cast<TerminatorInst>(*It)->getParent();
+
+    return cast<_Ptr>(*It);
   }
   inline pointer *operator->() const { return &(operator*()); }
 
   inline _Self& operator++() {   // Preincrement
     assert(!It.atEnd() && "pred_iterator out of range!");
-    ++It; advancePastNonTerminators();
+    ++It; advancePastNonPreds();
     return *this;
   }
 
@@ -100,6 +103,8 @@
   inline SuccIterator(Term_ T, bool)                       // end iterator
     : Term(T), idx(Term->getNumSuccessors()) {
     assert(T && "getTerminator returned null!");
+    if (Term->getParent()->getUnwindDest())
+      ++idx;
   }
 
   inline const _Self &operator=(const _Self &I) {
@@ -115,7 +120,12 @@
   inline bool operator==(const _Self& x) const { return idx == x.idx; }
   inline bool operator!=(const _Self& x) const { return !operator==(x); }
 
-  inline pointer operator*() const { return Term->getSuccessor(idx); }
+  inline pointer operator*() const {
+    if (idx == Term->getNumSuccessors())
+      return Term->getParent()->getUnwindDest();
+
+    return Term->getSuccessor(idx);
+  }
   inline pointer operator->() const { return operator*(); }
 
   inline _Self& operator++() { ++idx; return *this; } // Preincrement





More information about the llvm-commits mailing list