aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTed Kremenek <kremenek@apple.com>2008-04-16 17:07:59 +0000
committerTed Kremenek <kremenek@apple.com>2008-04-16 17:07:59 +0000
commit5cd24389afe21db6f246c20a1f49461fca0b31cb (patch)
tree95844962e107ec1ea3cbd3de52b700c4815b3d49
parenta760f5f7dc34145aece49b4acc5d65bb63e7941b (diff)
LiveVariables now updates the liveness state of block-level expressions that
are referenced by CFGBlock terminators. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@49798 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--lib/Analysis/LiveVariables.cpp61
1 files changed, 49 insertions, 12 deletions
diff --git a/lib/Analysis/LiveVariables.cpp b/lib/Analysis/LiveVariables.cpp
index 7896bfcfb0..feba80d695 100644
--- a/lib/Analysis/LiveVariables.cpp
+++ b/lib/Analysis/LiveVariables.cpp
@@ -143,22 +143,59 @@ void TransferFuncs::Visit(Stmt *S) {
}
void TransferFuncs::VisitTerminator(Stmt* S) {
- return;
- for (Stmt::child_iterator I = S->child_begin(), E = S->child_end();
- I != E; ++I) {
-
- Stmt* Child = *I;
- if (!Child) continue;
-
- if (getCFG().isBlkExpr(Child)) {
- LiveState(Child, AD) = Alive;
- return; // Only one "condition" expression.
- }
+ 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;
}
+
+ if (!E)
+ return;
+
+ E = E->IgnoreParens();
+
+ assert (getCFG().isBlkExpr(E));
+ LiveState(E, AD) = Alive;
}
-
void TransferFuncs::VisitDeclRefExpr(DeclRefExpr* DR) {
if (VarDecl* V = dyn_cast<VarDecl>(DR->getDecl()))
LiveState(V,AD) = Alive;