[PATCH] D120289: [clang][dataflow] Add SAT solver interface and implementation
Gábor Horváth via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Thu Feb 24 12:18:35 PST 2022
xazax.hun accepted this revision.
xazax.hun added a comment.
Overall, looks good to me. Some nits inline.
Are there plans to get a model/assignment of the variables from the solver? That could be helpful for generating warning messages in the future :)
================
Comment at: clang/include/clang/Analysis/FlowSensitive/Solver.h:39
+
+ virtual ~Solver() {}
+
----------------
`= default`? To make this trivially destructible.
================
Comment at: clang/lib/Analysis/FlowSensitive/WatchedLiteralsSolver.cpp:159
+ /// Adds the 3-literal `L1 v L2 v L3` clause to the formula.
+ void addClause(Literal L1, Literal L2, Literal L3) {
+ // The literals are guaranteed to be distinct from properties of BoolValue
----------------
Shouldn't we make this function variadic (or taking a container) instead of having multiple overloads?
================
Comment at: clang/lib/Analysis/FlowSensitive/WatchedLiteralsSolver.cpp:213
+ // Visit the sub-values of `Val`.
+ if (auto *C = dyn_cast<ConjunctionValue>(Val)) {
+ UnprocessedSubVals.push(&C->getLeftSubValue());
----------------
Switch on the kind instead? That way `DisjunctionValue` and `ConjunctionValue` could be handled by the same case.
================
Comment at: clang/lib/Analysis/FlowSensitive/WatchedLiteralsSolver.cpp:241
+ for (BoolValue *Val : Vals)
+ UnprocessedSubVals.push(Val);
+ while (!UnprocessedSubVals.empty()) {
----------------
While I get that this should be empty before this loop due to the loop condition at the previous use, but I find such code confusing. I'd prefer to either use a separate queue or have at least an assert to remind us that this one should be a clean container before the loop.
================
Comment at: clang/lib/Analysis/FlowSensitive/WatchedLiteralsSolver.cpp:355
+
+ LevelVars.resize(Formula.LargestVar + 1);
+
----------------
Shouldn't we call the right ctor directly in the initialization list instead of resizing a default constructed vector?
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D120289/new/
https://reviews.llvm.org/D120289
More information about the cfe-commits
mailing list