[PATCH] D158407: [clang][dataflow] #llvm #flow-analysis Simplify formula at CNF construction time, and short-cut solving of known contradictory formulas.

Burak Emir via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Mon Aug 28 13:44:36 PDT 2023


burakemir added a comment.

Thanks for the review. PTAL.



================
Comment at: clang/lib/Analysis/FlowSensitive/WatchedLiteralsSolver.cpp:426
+  // considered for the simplification of earlier clauses. Do a final
+  // pass to find more opportunities for simplification.
+  CNFFormula FinalCNF(NextVar - 1, std::move(CNF.Atomics));
----------------
sammccall wrote:
> the issue is that info only propagates forward (earlier to later clauses, right?)
> 
> so by running this again, and sorting units first, we allow simplifications that propagate info backwards *once*, but we still don't have all simplifications.
> 
> ```
> D
> Av!B
> Bv!C
> Cv!D
> 
> // first simplification pass
> 
> Av!B
> Bv!C
> C // hoist new unit
> 
> // second simplification pass
> 
> Av!B
> B // hoist new unit
> 
> // third simplification pass
> A
> ```
> 
> I think this is worth being explicit about: we're going to find some more simplifications, but we won't find them all, because running this to fixed point is too inefficient.
> 
> Is 2 experimentally determined to be the right number of passes? a guess? or am I misunderstanding :-)
You are right that one could do more work but it is better to leave this to the solver algorithm.

We know empirically that there will be a few unit clauses, so might as well spend *linear time* (in number of unit clauses) to save some work.

This won't be enough to determine whether all formulas are satisfiable, but it catches a few obvious contradictions.

Doing this twice (as opposed to once) catches more formulas that are obvious contradictions in our unit tests and some real sources. I picked two simply because when we obtain unit clauses "later", we had no opportunity to apply them to earlier clauses.

Doing full-blow mutations seems more complicated, esp. given that the Clauses data structure has been written for the actual solver algorithm. I think your concern on optimizing for a certain pattern of input formulas, which may well change in the future, is valid; therefore one should leave the "real" solving work to the solver algorithm, which systematically explores all cases.



Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D158407/new/

https://reviews.llvm.org/D158407



More information about the cfe-commits mailing list