[PATCH] D116370: [clang][dataflow] Add multi-variable constant propagation example.

Stanislav Gatev via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Thu Dec 30 08:45:30 PST 2021


sgatev added inline comments.


================
Comment at: clang/unittests/Analysis/FlowSensitive/MultiVarConstantPropagationTest.cpp:9
+//
+// This file defines a simplistic version of Constant Propagation as an example
+// of a forward, monotonic dataflow analysis. The analysis tracks all
----------------
Indent two spaces.


================
Comment at: clang/unittests/Analysis/FlowSensitive/MultiVarConstantPropagationTest.cpp:160
+                        : ValueLattice::top();
+        return Vars;
+      }
----------------
Consider removing this `return` and moving the assignment that follows in an `else` block. I think this way the two cases (with and without initializer) will be more apparent.


================
Comment at: clang/unittests/Analysis/FlowSensitive/MultiVarConstantPropagationTest.cpp:162
+      }
+      Vars[Var] = ValueLattice::top();
+      return Vars;
----------------
I believe this should be `bottom` as `ValueLattice::bottom` models an undefined value.


================
Comment at: clang/unittests/Analysis/FlowSensitive/MultiVarConstantPropagationTest.cpp:171-173
+      Vars[Var] = (E->EvaluateAsInt(R, Context) && R.Val.isInt())
+                      ? ValueLattice(R.Val.getInt().getExtValue())
+                      : ValueLattice::top();
----------------
I think this makes the transfer function non-monotonic. Concretely, `Vars[var]` can be `top` and the right-hand side can be something else. The transfer function must be monotonic to guarantee termination. Perhaps this should be `Vars[Var].join(...)`?


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D116370



More information about the cfe-commits mailing list