@@ -70,7 +70,10 @@ for (f, pb) in (
7070 # if arg.val == ret, the annotation must be Duplicated or DuplicatedNoNeed
7171 # if arg isa Const, ret may still be modified further down the call graph so we should
7272 # copy it to protect ourselves
73- cache_arg = (arg. val != = ret && arg. val[1 ] != = A. val) || EnzymeRules. overwritten (config)[3 ] ? copy .(ret) : nothing
73+ A_is_arg1 = ! isa (A, Const) && A. val === arg. val[1 ]
74+ A_is_arg2 = ! isa (A, Const) && A. val === arg. val[2 ]
75+ A_is_arg = A_is_arg1 || A_is_arg2
76+ cache_arg = (arg. val != = ret && ! A_is_arg) || EnzymeRules. overwritten (config)[3 ] ? copy .(ret) : nothing
7477 dret = if EnzymeRules. needs_shadow (config) && ((TA == Nothing && TB == Nothing) || isa (arg, Const))
7578 make_zero .(ret)
7679 elseif EnzymeRules. needs_shadow (config)
@@ -96,7 +99,9 @@ for (f, pb) in (
9699 # use A (so that whoever does this is forced to handle caching A
97100 # appropriately here)
98101 Aval = nothing
99- A_is_arg = ! isa (A, Const) && A. dval === arg. dval[1 ]
102+ A_is_arg1 = ! isa (A, Const) && A. dval === arg. dval[1 ]
103+ A_is_arg2 = ! isa (A, Const) && A. dval === arg. dval[2 ]
104+ A_is_arg = A_is_arg1 || A_is_arg2
100105 argval = something (cache_arg, arg. val)
101106 if ! isa (A, Const)
102107 if A_is_arg
@@ -110,8 +115,10 @@ for (f, pb) in (
110115 if ! isa (arg, Const)
111116 if ! A_is_arg
112117 make_zero! (arg. dval)
113- else
118+ elseif A_is_arg1
114119 make_zero! (arg. dval[2 ])
120+ elseif A_is_arg2
121+ make_zero! (arg. dval[1 ])
115122 end
116123 end
117124 return (nothing , nothing , nothing )
0 commit comments