[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

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@189090 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Analysis/LiveVariables.cpp b/lib/Analysis/LiveVariables.cpp
index b43892a..1583fcb 100644
--- a/lib/Analysis/LiveVariables.cpp
+++ b/lib/Analysis/LiveVariables.cpp
@@ -212,6 +212,8 @@
   LiveVariables::LivenessValues &val;
   LiveVariables::Observer *observer;
   const CFGBlock *currentBlock;
+
+  void markLogicalExprLeaves(const Expr *E);
 public:
   TransferFunctions(LiveVariablesImpl &im,
                     LiveVariables::LivenessValues &Val,
@@ -368,9 +370,25 @@
         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) {
   AnalysisDeclContext::referenced_decls_iterator I, E;
   llvm::tie(I, E) =