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>
77 using mlir::DataFlowAnalysis::DataFlowAnalysis;
81 mlir::LogicalResult
initialize(mlir::Operation *top)
override;
89 mlir::LogicalResult
visit(mlir::ProgramPoint point)
override;
113 propagateIfChanged(lhs, lhs->join(rhs));
130 mlir::RegionBranchOpInterface branch, std::optional<unsigned> regionFrom,
152 if (action == CallControlFlowAction::ExternalCallee) {
170 void visitBlock(mlir::Block *block);
174 void visitCallOperation(
191template <
typename LatticeT>
194 std::is_base_of<AbstractDenseLattice, LatticeT>::value,
195 "analysis state class expected to subclass AbstractDenseLattice"
199 using AbstractDenseForwardDataFlowAnalysis::AbstractDenseForwardDataFlowAnalysis;
204 virtual void 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
262 LatticeT *
getLattice(mlir::ProgramPoint point)
override {
return getOrCreate<LatticeT>(point); }
276 visitOperation(op,
static_cast<const LatticeT &
>(before),
static_cast<LatticeT *
>(after));
283 call, action,
static_cast<const LatticeT &
>(before),
static_cast<LatticeT *
>(after)
287 mlir::RegionBranchOpInterface branch, std::optional<unsigned> regionFrom,
292 branch, regionFrom, regionTo,
static_cast<const LatticeT &
>(before),
293 static_cast<LatticeT *
>(after)
LLZK: This class has been ported from the MLIR DenseAnalysis utilities to allow for the use of custom...
virtual void 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.
void visitRegionBranchOperation(mlir::ProgramPoint point, mlir::RegionBranchOpInterface branch, AbstractDenseLattice *after)
Visit a program point within a region branch operation with predecessors in it.
void join(AbstractDenseLattice *lhs, const AbstractDenseLattice &rhs)
Join a lattice with another and propagate an update if it changed.
virtual void visitCallControlFlowTransfer(mlir::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...
const AbstractDenseLattice * getLatticeFor(mlir::ProgramPoint dependent, mlir::ProgramPoint point)
Get the dense lattice after the execution of the given program point and add it as a dependency to a ...
mlir::SymbolTableCollection tables
LLZK: Added for use of symbol helper caching.
virtual void processOperation(mlir::Operation *op)
Visit an operation.
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;...
mlir::LogicalResult visit(mlir::ProgramPoint point) override
Visit a program point that modifies the state of the program.
virtual AbstractDenseLattice * getLattice(mlir::ProgramPoint point)=0
Get the dense lattice after the execution of the given program point.
virtual void visitRegionBranchControlFlowTransfer(mlir::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 o...
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...
LatticeT * getLattice(mlir::ProgramPoint point) override
Get the dense lattice after this program point.
void setToEntryState(AbstractDenseLattice *lattice) override
Set the dense lattice at control flow entry point and propagate an update if it changed.
virtual void visitOperation(mlir::Operation *op, const LatticeT &before, LatticeT *after)=0
Visit an operation with the dense lattice before its execution.
void 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 void setToEntryState(LatticeT *lattice)=0
Set the dense lattice at control flow entry point and propagate an update if it changed.
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(mlir::DataFlowSolver &solver, mlir::Operation *top)
LLZK: Added this utility to ensure analysis is performed for all structs in a given module.
mlir::dataflow::AbstractDenseLattice AbstractDenseLattice
mlir::dataflow::CallControlFlowAction CallControlFlowAction