summaryrefslogtreecommitdiffstats
path: root/clang/lib/Analysis/LiveVariables.cpp
diff options
context:
space:
mode:
authorPavel Labath <labath@google.com>2013-08-23 07:19:22 +0000
committerPavel Labath <labath@google.com>2013-08-23 07:19:22 +0000
commit02b64d46a0ab8da426dadb1873ead648c8ef70e6 (patch)
tree3d72dea09b68628b42ae0c3c255e575fb181c26d /clang/lib/Analysis/LiveVariables.cpp
parenta9debbfb01140fb0c0bd49bb8f4c119ad93c3aa6 (diff)
downloadbcm5719-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.cpp18
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) {
OpenPOWER on IntegriCloud