24 const auto LeftAndOperator = [=](
const BinOp *A) {
25 return implies(A->left(), LNeg, RHS, RNeg) &&
26 implies(A->right(), LNeg, RHS, RNeg);
28 const auto RightAndOperator = [=](
const BinOp *A) {
29 return implies(LHS, LNeg, A->left(), RNeg) &&
30 implies(LHS, LNeg, A->right(), RNeg);
34 const auto LeftOrOperator = [=](
const BinOp *A) {
35 return implies(A->left(), LNeg, RHS, RNeg) ||
36 implies(A->right(), LNeg, RHS, RNeg);
38 const auto RightOrOperator = [=](
const BinOp *A) {
39 return implies(LHS, LNeg, A->left(), RNeg) ||
40 implies(LHS, LNeg, A->right(), RNeg);
44 switch (RHS->
kind()) {
50 return RNeg ? RightOrOperator(cast<And>(RHS))
51 : RightAndOperator(cast<And>(RHS));
57 return RNeg ? RightAndOperator(cast<Or>(RHS))
58 : RightOrOperator(cast<Or>(RHS));
62 return implies(LHS, LNeg, cast<Not>(RHS)->
exp(), !RNeg);
69 switch (LHS->
kind()) {
75 return LNeg ? LeftAndOperator(cast<And>(LHS))
76 : LeftOrOperator(cast<And>(LHS));
82 return LNeg ? LeftOrOperator(cast<Or>(LHS))
83 : LeftAndOperator(cast<Or>(LHS));
87 return implies(cast<Not>(LHS)->
exp(), !LNeg, RHS, RNeg);
99 return cast<Terminal>(LHS)->
expr() == cast<Terminal>(RHS)->
expr();
103 namespace threadSafety {
DominatorTree GraphTraits specialization so the DominatorTree can be iterable by generic graph iterat...
const internal::VariadicDynCastAllOfMatcher< Stmt, Expr > expr
Matches expressions.
static bool implies(const LExpr *LHS, bool LNeg, const LExpr *RHS, bool RNeg)
Dataflow Directional Tag Classes.