13 #include "llvm/ADT/ScopeExit.h"
14 #include "llvm/ADT/iterator.h"
15 #include "llvm/Config/abi-breaking.h"
16 #include "llvm/Support/Casting.h"
17 #include "llvm/Support/DebugLog.h"
18 #include "llvm/Support/raw_ostream.h"
20 #define DEBUG_TYPE "dataflow"
21 #if LLVM_ENABLE_ABI_BREAKING_CHECKS
22 #define DATAFLOW_DEBUG(X) LLVM_DEBUG(X)
24 #define DATAFLOW_DEBUG(X)
43 auto inserted = dependents.insert({dependent,
analysis});
47 LDBG() <<
"Creating dependency between " << debugName <<
" of " <<
anchor
48 <<
"\nand " << debugName <<
" on " << *dependent;
65 os <<
"<after operation>:"
69 os <<
"<before operation>:"
82 if (
auto *latticeAnchor = llvm::dyn_cast<GenericLatticeAnchor *>(*
this))
83 return latticeAnchor->print(os);
84 if (
auto value = llvm::dyn_cast<Value>(*
this)) {
88 return llvm::cast<ProgramPoint *>(*this)->print(os);
92 if (
auto *latticeAnchor = llvm::dyn_cast<GenericLatticeAnchor *>(*
this))
93 return latticeAnchor->getLoc();
94 if (
auto value = llvm::dyn_cast<Value>(*
this))
95 return value.getLoc();
110 auto guard = llvm::make_scope_exit([&]() { isRunning =
false; });
114 analysis.initializeEquivalentLatticeAnchor(top);
127 while (!worklist.empty()) {
128 auto [point,
analysis] = worklist.front();
132 <<
"' on: " << *point);
143 "DataFlowSolver is not running, should not use propagateIfChanged");
145 DATAFLOW_DEBUG(LDBG() <<
"Propagating update to " << state->debugName
146 <<
" of " << state->anchor <<
"\n"
147 <<
"Value: " << *state);
148 state->onUpdate(
this);
162 state->addDependency(point,
this);
#define DATAFLOW_DEBUG(X)
Base class for generic analysis states.
LLVM_DUMP_METHOD void dump() const
void addDependency(ProgramPoint *point, DataFlowAnalysis *analysis)
Add a dependency to this analysis state on a lattice anchor and an analysis.
virtual void print(raw_ostream &os) const =0
Print the contents of the analysis state.
LatticeAnchor anchor
The lattice anchor to which the state belongs.
Region * getParent() const
Provide a 'getParent' method for ilist_node_with_parent methods.
Base class for all data-flow analyses.
void addDependency(AnalysisState *state, ProgramPoint *point)
Create a dependency between the given analysis state and lattice anchor on this analysis.
void propagateIfChanged(AnalysisState *state, ChangeResult changed)
Propagate an update to a state if it changed.
virtual ~DataFlowAnalysis()
DataFlowAnalysis(DataFlowSolver &solver)
Create an analysis with a reference to the parent solver.
The general data-flow analysis solver.
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...
LogicalResult initializeAndRun(Operation *top)
Initialize the children analyses starting from the provided top-level operation and run the analysis ...
virtual ~GenericLatticeAnchor()
This class defines the main interface for locations in MLIR and acts as a non-nullable wrapper around...
Set of flags used to control the behavior of the various IR print methods (e.g.
A wrapper class that allows for printing an operation with a set of flags, useful to act as a "stream...
Operation is the basic unit of execution within MLIR.
Location getLoc()
The source location the operation was defined or derived from.
Location getLoc()
Return a location for this region.
Include the generated interface declarations.
const FrozenRewritePatternSet GreedyRewriteConfig bool * changed
ChangeResult
A result type used to indicate if a change happened.
Location getLoc() const
Get the source location of the lattice anchor.
void print(raw_ostream &os) const
Print the lattice anchor.
Program point represents a specific location in the execution of a program.
bool isNull() const
Returns true if this program point is set.
bool isBlockStart() const
Operation * getPrevOp() const
Get the previous operation of this program point.
void print(raw_ostream &os) const
Print the program point.
Operation * getNextOp() const
Get the next operation of this program point.
Block * getBlock() const
Get the block contains this program point.