MLIR
18.0.0git
|
The general data-flow analysis solver. More...
#include "mlir/Analysis/DataFlowFramework.h"
Public Types | |
using | WorkItem = std::pair< ProgramPoint, DataFlowAnalysis * > |
A work item on the solver queue is a program point, child analysis pair. More... | |
Public Member Functions | |
template<typename AnalysisT , typename... Args> | |
AnalysisT * | load (Args &&...args) |
Load an analysis into the solver. Return the analysis instance. More... | |
LogicalResult | initializeAndRun (Operation *top) |
Initialize the children analyses starting from the provided top-level operation and run the analysis until fixpoint. More... | |
template<typename StateT , typename PointT > | |
const StateT * | lookupState (PointT point) const |
Lookup an analysis state for the given program point. More... | |
template<typename PointT , typename... Args> | |
PointT * | getProgramPoint (Args &&...args) |
Get a uniqued program point instance. More... | |
void | enqueue (WorkItem item) |
Push a work item onto the worklist. More... | |
template<typename StateT , typename PointT > | |
StateT * | getOrCreateState (PointT point) |
Get the state associated with the given program point. More... | |
void | propagateIfChanged (AnalysisState *state, ChangeResult changed) |
Propagate an update to an analysis state if it changed by pushing dependent work items to the back of the queue. More... | |
Friends | |
class | DataFlowAnalysis |
Allow the base child analysis class to access the internals of the solver. More... | |
The general data-flow analysis solver.
This class is responsible for orchestrating child data-flow analyses, running the fixed-point iteration algorithm, managing analysis state and program point memory, and tracking dependencies between analyses, program points, and analysis states.
Steps to run a data-flow analysis:
TODO: Optimize the internal implementation of the solver.
Definition at line 196 of file DataFlowFramework.h.
using mlir::DataFlowSolver::WorkItem = std::pair<ProgramPoint, DataFlowAnalysis *> |
A work item on the solver queue is a program point, child analysis pair.
Each item is processed by invoking the child analysis at the program point.
Definition at line 226 of file DataFlowFramework.h.
|
inline |
Push a work item onto the worklist.
Definition at line 228 of file DataFlowFramework.h.
Referenced by mlir::AnalysisState::onUpdate(), mlir::dataflow::Executable::onUpdate(), and mlir::dataflow::AbstractSparseLattice::onUpdate().
StateT * mlir::DataFlowSolver::getOrCreateState | ( | PointT | point | ) |
Get the state associated with the given program point.
If it does not exist, create an uninitialized state.
Definition at line 449 of file DataFlowFramework.h.
Referenced by mlir::DataFlowAnalysis::getOrCreate(), and mlir::dataflow::IntegerValueRangeLattice::onUpdate().
|
inline |
Get a uniqued program point instance.
If one is not present, it is created with the provided arguments.
Definition at line 219 of file DataFlowFramework.h.
References mlir::get().
Referenced by mlir::DataFlowAnalysis::getProgramPoint().
LogicalResult DataFlowSolver::initializeAndRun | ( | Operation * | top | ) |
Initialize the children analyses starting from the provided top-level operation and run the analysis until fixpoint.
Definition at line 88 of file DataFlowFramework.cpp.
References DATAFLOW_DEBUG, mlir::failed(), mlir::failure(), and mlir::success().
AnalysisT * mlir::DataFlowSolver::load | ( | Args &&... | args | ) |
Load an analysis into the solver. Return the analysis instance.
Definition at line 440 of file DataFlowFramework.h.
|
inline |
Lookup an analysis state for the given program point.
Returns null if one does not exist.
Definition at line 209 of file DataFlowFramework.h.
Referenced by mlir::dataflow::RunLivenessAnalysis::getLiveness(), replaceWithConstant(), and staticallyNonNegative().
void DataFlowSolver::propagateIfChanged | ( | AnalysisState * | state, |
ChangeResult | changed | ||
) |
Propagate an update to an analysis state if it changed by pushing dependent work items to the back of the queue.
Definition at line 117 of file DataFlowFramework.cpp.
Referenced by mlir::dataflow::IntegerValueRangeLattice::onUpdate().
|
friend |
Allow the base child analysis class to access the internals of the solver.
Definition at line 258 of file DataFlowFramework.h.