31#include <mlir/Analysis/DataFlow/DenseAnalysis.h>
32#include <mlir/Analysis/DataFlowFramework.h>
33#include <mlir/IR/SymbolTable.h>
34#include <mlir/Interfaces/CallInterfaces.h>
35#include <mlir/Interfaces/ControlFlowInterfaces.h>
74 using mlir::DataFlowAnalysis::DataFlowAnalysis;
78 mlir::LogicalResult
initialize(mlir::Operation *top)
override;
87 mlir::LogicalResult
visit(mlir::ProgramPoint *point)
override;
104 getLatticeFor(mlir::ProgramPoint *dependent, mlir::LatticeAnchor anchor);
112 propagateIfChanged(lhs, lhs->join(rhs));
129 mlir::RegionBranchOpInterface , std::optional<unsigned> regionFrom,
151 if (action == CallControlFlowAction::ExternalCallee) {
169 void visitBlock(mlir::Block *block);
173 void visitCallOperation(
190template <
typename LatticeT>
193 std::is_base_of<AbstractDenseLattice, LatticeT>::value,
194 "analysis state class expected to subclass AbstractDenseLattice"
198 using AbstractDenseForwardDataFlowAnalysis::AbstractDenseForwardDataFlowAnalysis;
203 virtual mlir::LogicalResult
204 visitOperation(mlir::Operation *op,
const LatticeT &before, LatticeT *after) = 0;
252 mlir::RegionBranchOpInterface branch, std::optional<unsigned> regionFrom,
253 std::optional<unsigned> regionTo,
const LatticeT &before, LatticeT *after
256 branch, regionFrom, regionTo, before, after
263 return getOrCreate<LatticeT>(anchor);
279 op,
static_cast<const LatticeT &
>(before),
static_cast<LatticeT *
>(after)
287 call, action,
static_cast<const LatticeT &
>(before),
static_cast<LatticeT *
>(after)
291 mlir::RegionBranchOpInterface branch, std::optional<unsigned> regionFrom,
296 branch, regionFrom, regionTo,
static_cast<const LatticeT &
>(before),
297 static_cast<LatticeT *
>(after)
LLZK: This class has been ported from the MLIR DenseAnalysis utilities to allow for the use of custom...
void join(AbstractDenseLattice *lhs, const AbstractDenseLattice &rhs)
Join a lattice with another and propagate an update if it changed.
virtual void visitCallControlFlowTransfer(mlir::CallOpInterface, CallControlFlowAction action, const AbstractDenseLattice &before, AbstractDenseLattice *after)
Propagate the dense lattice forward along the call control flow edge, which can be either entering or...
virtual mlir::LogicalResult processOperation(mlir::Operation *op)
Visit an operation.
virtual AbstractDenseLattice * getLattice(mlir::LatticeAnchor anchor)=0
Get the dense lattice on the given lattice anchor.
mlir::LogicalResult visit(mlir::ProgramPoint *point) override
Visit a program point that modifies the state of the program.
void visitRegionBranchOperation(mlir::ProgramPoint *point, mlir::RegionBranchOpInterface branch, AbstractDenseLattice *after)
Visit a program point within a region branch operation with predecessors in it.
mlir::SymbolTableCollection tables
LLZK: Added for use of symbol helper caching.
virtual void setToEntryState(AbstractDenseLattice *lattice)=0
Set the dense lattice at control flow entry point and propagate an update if it changed.
mlir::LogicalResult initialize(mlir::Operation *top) override
Initialize the analysis by visiting every program point whose execution may modify the program state;...
virtual void visitRegionBranchControlFlowTransfer(mlir::RegionBranchOpInterface, 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 o...
const AbstractDenseLattice * getLatticeFor(mlir::ProgramPoint *dependent, mlir::LatticeAnchor anchor)
Get the dense lattice on the given lattice anchor and add dependent as its dependency.
virtual mlir::LogicalResult visitOperationImpl(mlir::Operation *op, const AbstractDenseLattice &before, AbstractDenseLattice *after)=0
Propagate the dense lattice before the execution of an operation to the lattice after its execution.
LLZK: This class has been ported so that it can inherit from our port of the AbstractDenseForwardData...
void visitCallControlFlowTransfer(mlir::CallOpInterface call, CallControlFlowAction action, const AbstractDenseLattice &before, AbstractDenseLattice *after) final
Propagate the dense lattice forward along the call control flow edge, which can be either entering or...
void setToEntryState(AbstractDenseLattice *lattice) override
Set the dense lattice at control flow entry point and propagate an update if it changed.
mlir::LogicalResult visitOperationImpl(mlir::Operation *op, const AbstractDenseLattice &before, AbstractDenseLattice *after) final
Type-erased wrappers that convert the abstract dense lattice to a derived lattice and invoke the virt...
virtual mlir::LogicalResult visitOperation(mlir::Operation *op, const LatticeT &before, LatticeT *after)=0
Visit an operation with the dense lattice before its execution.
virtual void setToEntryState(LatticeT *lattice)=0
Set the dense lattice at control flow entry point and propagate an update if it changed.
LatticeT * getLattice(mlir::LatticeAnchor anchor) override
Get the dense lattice on this lattice anchor.
virtual void visitCallControlFlowTransfer(mlir::CallOpInterface call, CallControlFlowAction action, const LatticeT &before, LatticeT *after)
Hook for customizing the behavior of lattice propagation along the call control flow edges.
virtual void visitRegionBranchControlFlowTransfer(mlir::RegionBranchOpInterface branch, std::optional< unsigned > regionFrom, std::optional< unsigned > regionTo, const LatticeT &before, LatticeT *after)
Hook for customizing the behavior of lattice propagation along the control flow edges between regions...
void visitRegionBranchControlFlowTransfer(mlir::RegionBranchOpInterface branch, std::optional< unsigned > regionFrom, std::optional< unsigned > regionTo, const AbstractDenseLattice &before, AbstractDenseLattice *after) final
Propagate the dense lattice forward along the control flow edge from regionFrom to regionTo regions o...
void markAllOpsAsLive(DataFlowSolver &solver, Operation *top)
mlir::dataflow::AbstractDenseLattice AbstractDenseLattice
mlir::dataflow::CallControlFlowAction CallControlFlowAction