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>
61 using mlir::DataFlowAnalysis::DataFlowAnalysis;
65 mlir::LogicalResult
initialize(mlir::Operation *top)
override;
74 mlir::LogicalResult
visit(mlir::ProgramPoint *point)
override;
91 getLatticeFor(mlir::ProgramPoint *dependent, mlir::LatticeAnchor anchor);
99 propagateIfChanged(lhs, lhs->join(rhs));
116 mlir::RegionBranchOpInterface , std::optional<unsigned> regionFrom,
138 if (action == CallControlFlowAction::ExternalCallee) {
156 void visitBlock(mlir::Block *block);
160 void visitCallOperation(
177template <
typename LatticeT>
180 std::is_base_of<AbstractDenseLattice, LatticeT>::value,
181 "analysis state class expected to subclass AbstractDenseLattice"
185 using AbstractDenseForwardDataFlowAnalysis::AbstractDenseForwardDataFlowAnalysis;
190 virtual mlir::LogicalResult
191 visitOperation(mlir::Operation *op,
const LatticeT &before, LatticeT *after) = 0;
239 mlir::RegionBranchOpInterface branch, std::optional<unsigned> regionFrom,
240 std::optional<unsigned> regionTo,
const LatticeT &before, LatticeT *after
243 branch, regionFrom, regionTo, before, after
250 return getOrCreate<LatticeT>(anchor);
266 op,
static_cast<const LatticeT &
>(before),
static_cast<LatticeT *
>(after)
274 call, action,
static_cast<const LatticeT &
>(before),
static_cast<LatticeT *
>(after)
278 mlir::RegionBranchOpInterface branch, std::optional<unsigned> regionFrom,
283 branch, regionFrom, regionTo,
static_cast<const LatticeT &
>(before),
284 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...
mlir::dataflow::AbstractDenseLattice AbstractDenseLattice
mlir::dataflow::CallControlFlowAction CallControlFlowAction