Added CFGBlock::getTerminatorCondition() to get the Expr* of the condition a block's terminator.
Refactored LiveVariables to use getTerminatorCondition() in VisitTerminator().

Bug fix: CFG now computes Block-level expression numbers using information
from block terminators.  This fixes <rdar://problem/5868189>.


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@49818 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Analysis/LiveVariables.cpp b/lib/Analysis/LiveVariables.cpp
index feba80d..4148d9e 100644
--- a/lib/Analysis/LiveVariables.cpp
+++ b/lib/Analysis/LiveVariables.cpp
@@ -119,7 +119,7 @@
   void VisitDeclStmt(DeclStmt* DS);
   void VisitUnaryOperator(UnaryOperator* U);
   void Visit(Stmt *S);  
-  void VisitTerminator(Stmt* S); 
+  void VisitTerminator(CFGBlock* B); 
   
   void SetTopValue(LiveVariables::ValTy& V) {
     V = AD.AlwaysLive;    
@@ -142,56 +142,13 @@
     LiveState(S,AD) = Alive;
 }
   
-void TransferFuncs::VisitTerminator(Stmt* S) {
-  
-  Expr* E = NULL;
-  
-  switch (S->getStmtClass()) {
-    default:
-      return;
-      
-    case Stmt::ForStmtClass:
-      E = cast<ForStmt>(S)->getCond();
-      break;
-      
-    case Stmt::WhileStmtClass:
-      E = cast<WhileStmt>(S)->getCond();
-      break;
-      
-    case Stmt::DoStmtClass:
-      E = cast<DoStmt>(S)->getCond();
-      break;
-      
-    case Stmt::IfStmtClass:
-      E = cast<IfStmt>(S)->getCond();
-      break;
-      
-    case Stmt::ChooseExprClass:
-      E = cast<ChooseExpr>(S)->getCond();
-      break;
-      
-    case Stmt::IndirectGotoStmtClass:
-      E = cast<IndirectGotoStmt>(S)->getTarget();
-      break;
-      
-    case Stmt::SwitchStmtClass:
-      E = cast<SwitchStmt>(S)->getCond();
-      break;
-      
-    case Stmt::ConditionalOperatorClass:
-      E = cast<ConditionalOperator>(S)->getCond();
-      break;
-      
-    case Stmt::BinaryOperatorClass: // '&&' and '||'
-      E = cast<BinaryOperator>(S)->getLHS();
-      break;      
-  }
-  
+void TransferFuncs::VisitTerminator(CFGBlock* B) {
+    
+  const Expr* E = B->getTerminatorCondition();
+
   if (!E)
     return;
   
-  E = E->IgnoreParens();
-  
   assert (getCFG().isBlkExpr(E));
   LiveState(E, AD) = Alive;
 }