@@ -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
907914void 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>();
0 commit comments