diff options
author | Pavel Labath <labath@google.com> | 2013-08-23 07:19:22 +0000 |
---|---|---|
committer | Pavel Labath <labath@google.com> | 2013-08-23 07:19:22 +0000 |
commit | 02b64d46a0ab8da426dadb1873ead648c8ef70e6 (patch) | |
tree | 3d72dea09b68628b42ae0c3c255e575fb181c26d /clang/lib/Analysis/LiveVariables.cpp | |
parent | a9debbfb01140fb0c0bd49bb8f4c119ad93c3aa6 (diff) | |
download | bcm5719-llvm-02b64d46a0ab8da426dadb1873ead648c8ef70e6.tar.gz bcm5719-llvm-02b64d46a0ab8da426dadb1873ead648c8ef70e6.zip |
[analyzer] Refactor conditional expression evaluating code
Summary:
Instead of digging through the ExplodedGraph, to figure out which edge brought
us here, I compute the value of conditional expression by looking at the
sub-expression values.
To do this, I needed to change the liveness algorithm a bit -- now, the full
conditional expression also depends on all atomic sub-expressions, not only the
outermost ones.
Reviewers: jordan_rose
CC: cfe-commits
Differential Revision: http://llvm-reviews.chandlerc.com/D1340
llvm-svn: 189090
Diffstat (limited to 'clang/lib/Analysis/LiveVariables.cpp')
-rw-r--r-- | clang/lib/Analysis/LiveVariables.cpp | 18 |
1 files changed, 18 insertions, 0 deletions
diff --git a/clang/lib/Analysis/LiveVariables.cpp b/clang/lib/Analysis/LiveVariables.cpp index b43892a3093..1583fcb3de0 100644 --- a/clang/lib/Analysis/LiveVariables.cpp +++ b/clang/lib/Analysis/LiveVariables.cpp @@ -212,6 +212,8 @@ class TransferFunctions : public StmtVisitor<TransferFunctions> { LiveVariables::LivenessValues &val; LiveVariables::Observer *observer; const CFGBlock *currentBlock; + + void markLogicalExprLeaves(const Expr *E); public: TransferFunctions(LiveVariablesImpl &im, LiveVariables::LivenessValues &Val, @@ -368,7 +370,23 @@ void TransferFunctions::VisitBinaryOperator(BinaryOperator *B) { if (observer) observer->observerKill(DR); } + } else if (B->isLogicalOp()) { + // Leaf expressions in the logical operator tree are live until we reach the + // outermost logical operator. Static analyzer relies on this behaviour. + markLogicalExprLeaves(B->getLHS()->IgnoreParens()); + markLogicalExprLeaves(B->getRHS()->IgnoreParens()); + } +} + +void TransferFunctions::markLogicalExprLeaves(const Expr *E) { + const BinaryOperator *B = dyn_cast<BinaryOperator>(E); + if (!B || !B->isLogicalOp()) { + val.liveStmts = LV.SSetFact.add(val.liveStmts, E); + return; } + + markLogicalExprLeaves(B->getLHS()->IgnoreParens()); + markLogicalExprLeaves(B->getRHS()->IgnoreParens()); } void TransferFunctions::VisitBlockExpr(BlockExpr *BE) { |