MLIR
20.0.0git
|
Base class for dense forward data-flow analyses. More...
#include "mlir/Analysis/DataFlow/DenseAnalysis.h"
Public Member Functions | |
LogicalResult | initialize (Operation *top) override |
Initialize the analysis by visiting every program point whose execution may modify the program state; that is, every operation and block. More... | |
LogicalResult | visit (ProgramPoint point) override |
Visit a program point that modifies the state of the program. More... | |
DataFlowAnalysis (DataFlowSolver &solver) | |
Create an analysis with a reference to the parent solver. More... | |
Public Member Functions inherited from mlir::DataFlowAnalysis | |
virtual | ~DataFlowAnalysis () |
DataFlowAnalysis (DataFlowSolver &solver) | |
Create an analysis with a reference to the parent solver. More... | |
Protected Member Functions | |
virtual LogicalResult | visitOperationImpl (Operation *op, const AbstractDenseLattice &before, AbstractDenseLattice *after)=0 |
Propagate the dense lattice before the execution of an operation to the lattice after its execution. More... | |
virtual AbstractDenseLattice * | getLattice (LatticeAnchor anchor)=0 |
Get the dense lattice after the execution of the given lattice anchor. More... | |
const AbstractDenseLattice * | getLatticeFor (ProgramPoint dependent, LatticeAnchor anchor) |
Get the dense lattice after the execution of the given program point and add it as a dependency to a lattice anchor. More... | |
virtual void | setToEntryState (AbstractDenseLattice *lattice)=0 |
Set the dense lattice at control flow entry point and propagate an update if it changed. More... | |
void | join (AbstractDenseLattice *lhs, const AbstractDenseLattice &rhs) |
Join a lattice with another and propagate an update if it changed. More... | |
virtual LogicalResult | processOperation (Operation *op) |
Visit an operation. More... | |
virtual void | visitRegionBranchControlFlowTransfer (RegionBranchOpInterface branch, std::optional< unsigned > regionFrom, std::optional< unsigned > regionTo, const AbstractDenseLattice &before, AbstractDenseLattice *after) |
Propagate the dense lattice forward along the control flow edge from regionFrom to regionTo regions of the branch operation. More... | |
virtual void | visitCallControlFlowTransfer (CallOpInterface call, CallControlFlowAction action, const AbstractDenseLattice &before, AbstractDenseLattice *after) |
Propagate the dense lattice forward along the call control flow edge, which can be either entering or exiting the callee. More... | |
void | visitRegionBranchOperation (ProgramPoint point, RegionBranchOpInterface branch, AbstractDenseLattice *after) |
Visit a program point within a region branch operation with predecessors in it. More... | |
Protected Member Functions inherited from mlir::DataFlowAnalysis | |
void | addDependency (AnalysisState *state, ProgramPoint point) |
Create a dependency between the given analysis state and lattice anchor on this analysis. More... | |
void | propagateIfChanged (AnalysisState *state, ChangeResult changed) |
Propagate an update to a state if it changed. More... | |
template<typename AnchorT > | |
void | registerAnchorKind () |
Register a custom lattice anchor class. More... | |
template<typename AnchorT , typename... Args> | |
AnchorT * | getLatticeAnchor (Args &&...args) |
Get or create a custom lattice anchor. More... | |
template<typename StateT , typename AnchorT > | |
StateT * | getOrCreate (AnchorT anchor) |
Get the analysis state associated with the lattice anchor. More... | |
template<typename StateT , typename AnchorT > | |
const StateT * | getOrCreateFor (ProgramPoint dependent, AnchorT anchor) |
Get a read-only analysis state for the given point and create a dependency on dependent . More... | |
const DataFlowConfig & | getSolverConfig () const |
Return the configuration of the solver used for this analysis. More... | |
Base class for dense forward data-flow analyses.
Dense data-flow analysis attaches a lattice between the execution of operations and implements a transfer function from the lattice before each operation to the lattice after. The lattice contains information about the state of the program at that point.
In this implementation, a lattice attached to an operation represents the state of the program after its execution, and a lattice attached to block represents the state of the program right before it starts executing its body.
Definition at line 71 of file DenseAnalysis.h.
|
explicit |
Create an analysis with a reference to the parent solver.
Definition at line 420 of file DataFlowFramework.cpp.
|
protectedpure virtual |
Get the dense lattice after the execution of the given lattice anchor.
Implemented in mlir::dataflow::DenseForwardDataFlowAnalysis< LatticeT >.
|
protected |
Get the dense lattice after the execution of the given program point and add it as a dependency to a lattice anchor.
That is, every time the lattice after anchor is updated, the dependent program point must be visited, and the newly triggered visit might update the lattice after dependent.
Definition at line 247 of file DenseAnalysis.cpp.
|
overridevirtual |
Initialize the analysis by visiting every program point whose execution may modify the program state; that is, every operation and block.
Implements mlir::DataFlowAnalysis.
Definition at line 31 of file DenseAnalysis.cpp.
References mlir::Operation::getRegions(), and processOperation().
|
inlineprotected |
Join a lattice with another and propagate an update if it changed.
Definition at line 110 of file DenseAnalysis.h.
References mlir::dataflow::AbstractDenseLattice::join(), and mlir::DataFlowAnalysis::propagateIfChanged().
Referenced by visitCallControlFlowTransfer(), and visitRegionBranchControlFlowTransfer().
|
protectedvirtual |
Visit an operation.
If this is a call operation or region control-flow operation, then the state after the execution of the operation is set by control-flow or the callgraph. Otherwise, this function invokes the operation transfer function.
Definition at line 97 of file DenseAnalysis.cpp.
Referenced by initialize().
|
protectedpure virtual |
Set the dense lattice at control flow entry point and propagate an update if it changed.
Implemented in mlir::dataflow::DenseForwardDataFlowAnalysis< LatticeT >.
Referenced by visitCallControlFlowTransfer().
|
overridevirtual |
Visit a program point that modifies the state of the program.
If this is a block, then the state is propagated from control-flow predecessors or callsites. If this is a call operation or region control-flow operation, then the state after the execution of the operation is set by control-flow or the callgraph. Otherwise, this function invokes the operation transfer function.
Implements mlir::DataFlowAnalysis.
Definition at line 47 of file DenseAnalysis.cpp.
|
inlineprotectedvirtual |
Propagate the dense lattice forward along the call control flow edge, which can be either entering or exiting the callee.
Default implementation for enter and exit callee actions just meets the states, meaning that operations implementing CallOpInterface
don't have any effect on the lattice that isn't already expressed by the interface itself. Default implementation for the external callee action additionally sets the "after" lattice to the entry state.
Reimplemented in mlir::dataflow::DenseForwardDataFlowAnalysis< LatticeT >.
Definition at line 141 of file DenseAnalysis.h.
References mlir::dataflow::ExternalCallee, join(), and setToEntryState().
Referenced by mlir::dataflow::DenseForwardDataFlowAnalysis< LatticeT >::visitCallControlFlowTransfer().
|
protectedpure virtual |
Propagate the dense lattice before the execution of an operation to the lattice after its execution.
Implemented in mlir::dataflow::DenseForwardDataFlowAnalysis< LatticeT >.
|
inlineprotectedvirtual |
Propagate the dense lattice forward along the control flow edge from regionFrom
to regionTo
regions of the branch
operation.
nullopt
values correspond to control flow branches originating at or targeting the branch
operation itself. Default implementation just joins the states, meaning that operations implementing RegionBranchOpInterface
don't have any effect on the lattice that isn't already expressed by the interface itself.
Reimplemented in mlir::dataflow::DenseForwardDataFlowAnalysis< LatticeT >.
Definition at line 127 of file DenseAnalysis.h.
References join().
Referenced by mlir::dataflow::DenseForwardDataFlowAnalysis< LatticeT >::visitRegionBranchControlFlowTransfer().
|
protected |
Visit a program point within a region branch operation with predecessors in it.
This can either be an entry block of one of the regions of the parent operation itself.
Definition at line 189 of file DenseAnalysis.cpp.