13 #include "llvm/ADT/iterator.h"
14 #include "llvm/Config/abi-breaking.h"
15 #include "llvm/Support/Casting.h"
16 #include "llvm/Support/Debug.h"
17 #include "llvm/Support/raw_ostream.h"
19 #define DEBUG_TYPE "dataflow"
20 #if LLVM_ENABLE_ABI_BREAKING_CHECKS
21 #define DATAFLOW_DEBUG(X) LLVM_DEBUG(X)
23 #define DATAFLOW_DEBUG(X)
42 auto inserted = dependents.insert({dependent, analysis});
46 llvm::dbgs() <<
"Creating dependency between " << debugName <<
" of "
47 <<
anchor <<
"\nand " << debugName <<
" on " << dependent
65 os <<
"<after operation>:";
68 os <<
"<before operation>:";
81 if (
auto *
LatticeAnchor = llvm::dyn_cast<GenericLatticeAnchor *>(*
this))
83 if (
auto value = llvm::dyn_cast<Value>(*
this)) {
87 return get<ProgramPoint *>()->print(os);
91 if (
auto *
LatticeAnchor = llvm::dyn_cast<GenericLatticeAnchor *>(*
this))
93 if (
auto value = llvm::dyn_cast<Value>(*
this))
94 return value.getLoc();
108 for (
DataFlowAnalysis &analysis : llvm::make_pointee_range(childAnalyses)) {
110 <<
"Priming analysis: " << analysis.debugName <<
"\n");
111 if (failed(analysis.initialize(top)))
118 while (!worklist.empty()) {
119 auto [point, analysis] = worklist.front();
122 DATAFLOW_DEBUG(llvm::dbgs() <<
"Invoking '" << analysis->debugName
123 <<
"' on: " << point <<
"\n");
124 if (failed(analysis->visit(point)))
130 }
while (!worklist.empty());
138 DATAFLOW_DEBUG(llvm::dbgs() <<
"Propagating update to " << state->debugName
139 <<
" of " << state->anchor <<
"\n"
140 <<
"Value: " << *state <<
"\n");
141 state->onUpdate(
this);
155 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.
Operation is the basic unit of execution within MLIR.
void print(raw_ostream &os, const OpPrintingFlags &flags=std::nullopt)
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.
Fundamental IR components are supported as first-class lattice anchor.
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.