[Mlir-commits] [mlir] a60050c - [mlir][dataflow] Allow re-run all analyses in DataFlowSolver (#120881)

llvmlistbot at llvm.org llvmlistbot at llvm.org
Mon Dec 23 12:33:27 PST 2024


Author: Hongren Zheng
Date: 2024-12-23T12:33:23-08:00
New Revision: a60050cf1966eb8d46253c8da13df52ac8b9ec33

URL: https://github.com/llvm/llvm-project/commit/a60050cf1966eb8d46253c8da13df52ac8b9ec33
DIFF: https://github.com/llvm/llvm-project/commit/a60050cf1966eb8d46253c8da13df52ac8b9ec33.diff

LOG: [mlir][dataflow] Allow re-run all analyses in DataFlowSolver (#120881)

In downstream (check https://github.com/google/heir/pull/1228,
especially [this
commit](https://github.com/ZenithalHourlyRate/heir/commit/fbf0b2733f1f60e852c757602afac65a4364e30c);
also check https://github.com/google/heir/pull/1154) we often need to
re-run the analysis during the transformation pass as IR get changed
based on the analysis result and analysis continuously get invalidated.

There are solutions to it like `getOrCreateState` for newly created
`Value` (`AnchorT`), but warning is that the new state does not
propagate! This is quite unexpected as user of analysis would expect it
to propagate. We downstream used to use `solver->propagateIfChanged` but
that turned out to be not working, see detailed writeup in
https://github.com/google/heir/issues/1153.

Just call `initializeAndRun` repeatedly also does not solve the problem
as `analysisStates` is not cleared and the monotonicity of
`AnalysisState` will make the analysis invalid as `join` will not work
as expected (the first join is no longer `join(uninitialized, init
value)`, instead it becomes `join(higher value, init value)`.

To correctly re-run the analysis, either a new `DataFlowSolver` is
created, or we can just clear the `analysisState`.

Added: 
    

Modified: 
    mlir/include/mlir/Analysis/DataFlowFramework.h

Removed: 
    


################################################################################
diff  --git a/mlir/include/mlir/Analysis/DataFlowFramework.h b/mlir/include/mlir/Analysis/DataFlowFramework.h
index 969664dc7a4fe3..dfd358e7017a4e 100644
--- a/mlir/include/mlir/Analysis/DataFlowFramework.h
+++ b/mlir/include/mlir/Analysis/DataFlowFramework.h
@@ -308,6 +308,10 @@ class DataFlowConfig {
 ///    according to their dependency relations until a fixed point is reached.
 /// 3. Query analysis state results from the solver.
 ///
+/// Steps to re-run a data-flow analysis when IR changes:
+/// 1. Erase all analysis states as they are no longer valid.
+/// 2. Re-run the analysis using `initializeAndRun`.
+///
 /// TODO: Optimize the internal implementation of the solver.
 class DataFlowSolver {
 public:
@@ -346,6 +350,9 @@ class DataFlowSolver {
     }
   }
 
+  // Erase all analysis states
+  void eraseAllStates() { analysisStates.clear(); }
+
   /// Get a uniqued lattice anchor instance. If one is not present, it is
   /// created with the provided arguments.
   template <typename AnchorT, typename... Args>


        


More information about the Mlir-commits mailing list