1#ifndef ENZYME_MLIR_ANALYSIS_ACTIVITYANNOTATIONS_H
2#define ENZYME_MLIR_ANALYSIS_ACTIVITYANNOTATIONS_H
8#include "mlir/Analysis/DataFlow/DenseAnalysis.h"
9#include "mlir/Analysis/DataFlow/SparseAnalysis.h"
10#include "mlir/Analysis/DataFlowFramework.h"
13class FunctionOpInterface;
32 void print(raw_ostream &os)
const override;
51 void print(raw_ostream &os)
const override;
55 const auto *otherValueOrigins =
68 :
public dataflow::SparseForwardDataFlowAnalysis<ForwardOriginsLattice> {
72 assert(!solver.getConfig().isInterprocedural());
79 ArrayRef<const ForwardOriginsLattice *> operands,
80 ArrayRef<ForwardOriginsLattice *> results)
override;
83 ArrayRef<const ForwardOriginsLattice *> operands,
84 ArrayRef<ForwardOriginsLattice *> results)
override;
87 void processMemoryRead(Operation *op, Value address,
88 ArrayRef<ForwardOriginsLattice *> results);
90 void markResultsUnknown(ArrayRef<ForwardOriginsLattice *> results);
93 processCallToSummarizedFunc(CallOpInterface call,
94 ArrayRef<ValueOriginSet> summary,
95 ArrayRef<const ForwardOriginsLattice *> operands,
96 ArrayRef<ForwardOriginsLattice *> results);
100 :
public dataflow::SparseBackwardDataFlowAnalysis<BackwardOriginsLattice> {
103 SymbolTableCollection &symbolTable)
105 assert(!solver.getConfig().isInterprocedural());
114 ArrayRef<BlockArgument> arguments)
override {}
119 visitOperation(Operation *op, ArrayRef<BackwardOriginsLattice *> operands,
120 ArrayRef<const BackwardOriginsLattice *> results)
override;
124 ArrayRef<BackwardOriginsLattice *> operands,
125 ArrayRef<const BackwardOriginsLattice *> results)
override;
129 processCallToSummarizedFunc(CallOpInterface call,
130 ArrayRef<ValueOriginSet> summary,
131 ArrayRef<BackwardOriginsLattice *> operands,
132 ArrayRef<const BackwardOriginsLattice *> results);
134 void markOperandsUnknown(ArrayRef<BackwardOriginsLattice *> operands);
143 using MapOfSetsLattice::MapOfSetsLattice;
145 void print(raw_ostream &os)
const override;
154 using MapOfSetsLattice::MapOfSetsLattice;
156 void print(raw_ostream &os)
const override;
172 :
public dataflow::DenseForwardDataFlowAnalysis<ForwardOriginsMap> {
174 using DenseForwardDataFlowAnalysis::DenseForwardDataFlowAnalysis;
182 dataflow::CallControlFlowAction action,
187 void processCallToSummarizedFunc(
188 CallOpInterface call,
189 const DenseMap<DistinctAttr, ValueOriginSet> &summary,
192 void processCopy(Operation *op, Value copySource, Value copyDest,
199 :
public dataflow::DenseBackwardDataFlowAnalysis<BackwardOriginsMap> {
201 using DenseBackwardDataFlowAnalysis::DenseBackwardDataFlowAnalysis;
207 dataflow::CallControlFlowAction action,
214 void processCallToSummarizedFunc(
215 CallOpInterface call,
216 const DenseMap<DistinctAttr, ValueOriginSet> &summary,
219 void processCopy(Operation *op, Value copySource, Value copyDest,
242 FunctionOpInterface callee, ArrayRef<enzyme::Activity> argActivities = {},
243 const ActivityPrinterConfig &config = ActivityPrinterConfig());
bool annotate
Annotate the IR with activity information for every operation.
ActivityPrinterConfig()=default
bool inferFromAutodiff
Infer the starting argument state from an __enzyme_autodiff call.
bool verbose
Output extra information for debugging.
bool dataflow
Whether to use the data-flow based algorithm or the classic activity analysis.
bool relative
Use function summaries.
void visitBranchOperand(OpOperand &operand) override
BackwardActivityAnnotationAnalysis(DataFlowSolver &solver, SymbolTableCollection &symbolTable)
void visitExternalCall(CallOpInterface call, ArrayRef< BackwardOriginsLattice * > operands, ArrayRef< const BackwardOriginsLattice * > results) override
void visitCallOperand(OpOperand &operand) override
void setToExitState(BackwardOriginsLattice *lattice) override
LogicalResult visitOperation(Operation *op, ArrayRef< BackwardOriginsLattice * > operands, ArrayRef< const BackwardOriginsLattice * > results) override
void visitNonControlFlowArguments(RegionSuccessor &successor, ArrayRef< BlockArgument > arguments) override
void print(raw_ostream &os) const override
ChangeResult meet(const AbstractSparseLattice &other) override
static BackwardOriginsLattice single(Value point, OriginAttr value)
const DenseSet< OriginAttr > & getOrigins() const
const SetLattice< OriginAttr > & getOriginsObject() const
ChangeResult markAllOriginsUnknown()
ChangeResult meet(const AbstractDenseLattice &other) override
void print(raw_ostream &os) const override
const ValueOriginSet & getOrigins(DistinctAttr id) const
LogicalResult visitOperation(Operation *op, const ForwardOriginsMap &before, ForwardOriginsMap *after) override
void visitCallControlFlowTransfer(CallOpInterface call, dataflow::CallControlFlowAction action, const ForwardOriginsMap &before, ForwardOriginsMap *after) override
void setToEntryState(ForwardOriginsMap *lattice) override
void setToExitState(BackwardOriginsMap *lattice) override
LogicalResult visitOperation(Operation *op, const BackwardOriginsMap &after, BackwardOriginsMap *before) override
void visitCallControlFlowTransfer(CallOpInterface call, dataflow::CallControlFlowAction action, const BackwardOriginsMap &after, BackwardOriginsMap *before) override
void setToEntryState(ForwardOriginsLattice *lattice) override
ForwardActivityAnnotationAnalysis(DataFlowSolver &solver)
void visitExternalCall(CallOpInterface call, ArrayRef< const ForwardOriginsLattice * > operands, ArrayRef< ForwardOriginsLattice * > results) override
LogicalResult visitOperation(Operation *op, ArrayRef< const ForwardOriginsLattice * > operands, ArrayRef< ForwardOriginsLattice * > results) override
ChangeResult join(const AbstractSparseLattice &other) override
const SetLattice< OriginAttr > & getOriginsObject() const
const DenseSet< OriginAttr > & getOrigins() const
void print(raw_ostream &os) const override
static ForwardOriginsLattice single(Value point, OriginAttr value)
const ValueOriginSet & getOrigins(DistinctAttr id) const
ChangeResult markAllOriginsUnknown()
void print(raw_ostream &os) const override
ChangeResult join(const AbstractDenseLattice &other)
ChangeResult markAllUnknown()
const SetLattice< OriginAttr > & lookup(DistinctAttr key) const
Alias classes for freshly created, e.g., allocated values.
DenseSet< ValueT > & getElements()
ChangeResult join(const SetLattice< ValueT > &other)
SparseSetLattice(Value value, SetLattice< ValueT > &&elements)
SetLattice< OriginAttr > elements
void runActivityAnnotations(FunctionOpInterface callee, ArrayRef< enzyme::Activity > argActivities={}, const ActivityPrinterConfig &config=ActivityPrinterConfig())