Skip to content

Commit b191cfd

Browse files
authored
Initialize DenseBackwardActivityAnalysis with ret_activity (#2874)
1 parent 7c0141f commit b191cfd

3 files changed

Lines changed: 30 additions & 18 deletions

File tree

enzyme/Enzyme/MLIR/Analysis/DataFlowActivityAnalysis.cpp

Lines changed: 24 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -582,21 +582,28 @@ LogicalResult enzyme::DenseBackwardActivityAnalysis::visitOperation(
582582
propagateIfChanged(before, changed);
583583
}
584584

585+
assert(op->getNumOperands() == returnActivity.size() &&
586+
"the number of returned arguments must match the number of return "
587+
"activity entries");
588+
585589
// Initialize the return activity of the operands
586-
for (Value operand : op->getOperands()) {
587-
if (isa<MemRefType, LLVM::LLVMPointerType>(operand.getType())) {
588-
auto *retAliasClasses = getOrCreateFor<AliasClassLattice>(
589-
getProgramPointBefore(op), operand);
590-
ChangeResult changed =
591-
retAliasClasses->getAliasClassesObject().foreachElement(
592-
[before](DistinctAttr retAliasClass,
593-
enzyme::AliasClassSet::State state) {
594-
if (state == enzyme::AliasClassSet::State::Undefined)
595-
return ChangeResult::NoChange;
596-
return before->setActiveOut(retAliasClass);
597-
});
598-
propagateIfChanged(before, changed);
599-
}
590+
for (const auto &[operand, operandActivity] :
591+
llvm::zip(op->getOperands(), returnActivity)) {
592+
if (operandActivity != enzyme::Activity::enzyme_dup &&
593+
operandActivity != enzyme::Activity::enzyme_dupnoneed)
594+
continue;
595+
596+
auto *retAliasClasses =
597+
getOrCreateFor<AliasClassLattice>(getProgramPointBefore(op), operand);
598+
ChangeResult changed =
599+
retAliasClasses->getAliasClassesObject().foreachElement(
600+
[before](DistinctAttr retAliasClass,
601+
enzyme::AliasClassSet::State state) {
602+
if (state == enzyme::AliasClassSet::State::Undefined)
603+
return ChangeResult::NoChange;
604+
return before->setActiveOut(retAliasClass);
605+
});
606+
propagateIfChanged(before, changed);
600607
}
601608
}
602609

@@ -906,7 +913,8 @@ void printActivityAnalysisResults(DataFlowSolver &solver,
906913

907914
void enzyme::runDataFlowActivityAnalysis(
908915
FunctionOpInterface callee, ArrayRef<enzyme::Activity> argumentActivity,
909-
bool print, bool verbose, bool annotate) {
916+
ArrayRef<enzyme::Activity> returnActivity, bool print, bool verbose,
917+
bool annotate) {
910918
SymbolTableCollection symbolTable;
911919
DataFlowSolver solver;
912920

@@ -917,7 +925,7 @@ void enzyme::runDataFlowActivityAnalysis(
917925
argumentActivity);
918926
solver.load<SparseBackwardActivityAnalysis>(symbolTable);
919927
solver.load<DenseBackwardActivityAnalysis>(symbolTable, callee,
920-
argumentActivity);
928+
argumentActivity, returnActivity);
921929

922930
// Required for the dataflow framework to traverse region-based control flow
923931
solver.load<DeadCodeAnalysis>();

enzyme/Enzyme/MLIR/Analysis/DataFlowActivityAnalysis.h

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -299,9 +299,10 @@ class DenseBackwardActivityAnalysis
299299
DenseBackwardActivityAnalysis(DataFlowSolver &solver,
300300
SymbolTableCollection &symbolTable,
301301
FunctionOpInterface parentOp,
302-
ArrayRef<enzyme::Activity> argumentActivity)
302+
ArrayRef<enzyme::Activity> argumentActivity,
303+
ArrayRef<enzyme::Activity> returnActivity)
303304
: DenseBackwardDataFlowAnalysis(solver, symbolTable), parentOp(parentOp),
304-
argumentActivity(argumentActivity) {}
305+
argumentActivity(argumentActivity), returnActivity(returnActivity) {}
305306

306307
LogicalResult visitOperation(Operation *op,
307308
const BackwardMemoryActivity &after,
@@ -319,10 +320,12 @@ class DenseBackwardActivityAnalysis
319320
private:
320321
FunctionOpInterface parentOp;
321322
SmallVector<enzyme::Activity> argumentActivity;
323+
SmallVector<enzyme::Activity> returnActivity;
322324
};
323325

324326
void runDataFlowActivityAnalysis(FunctionOpInterface callee,
325327
ArrayRef<enzyme::Activity> argumentActivity,
328+
ArrayRef<enzyme::Activity> returnActivity,
326329
bool print = false, bool verbose = false,
327330
bool annotate = false);
328331

enzyme/Enzyme/MLIR/Passes/PrintActivityAnalysis.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,7 @@ struct PrintActivityAnalysisPass
145145
enzyme::runActivityAnnotations(callee, argActivities, config);
146146
} else if (config.dataflow) {
147147
enzyme::runDataFlowActivityAnalysis(callee, argActivities,
148+
resultActivities,
148149
/*print=*/true, verbose, annotate);
149150
} else {
150151

0 commit comments

Comments
 (0)