Enzyme
Enzyme copied to clipboard
Handle Mixed Active/Duplicated Return
declare dso_local double @__enzyme_autodiff(i8*, double)
declare i8* @malloc(i64)
define { i8*, double } @augsquare(double %x) {
entry:
%m = tail call noalias nonnull dereferenceable(64) dereferenceable_or_null(64) i8* @malloc(i64 64)
%.fca.0.insert = insertvalue { i8*, double } undef, i8* %m, 0
%.fca.1.insert = insertvalue { i8*, double } %.fca.0.insert, double %x, 1
ret { i8*, double } %.fca.1.insert
}
define double @square(double %x) {
entry:
%ext = call { i8*, double } @augsquare(double %x)
%o = extractvalue { i8*, double } %ext, 1
%mul = fmul double %o, %o
ret double %mul
}
define double @dsquare(double %x) local_unnamed_addr {
entry:
%call = tail call double @__enzyme_autodiff(i8* bitcast (double (double)* @square to i8*), double %x)
ret double %call
}
https://enzyme.mit.edu/explorer/#z:OYLghAFBqd5TKALEBjA9gEwKYFFMCWALugE4A0BIEAZgQDbYB2AhgLbYgDkAjF%2BTXRMiAZVQtGIHgBYBQogFUAztgAKAD24AGfgCsp5eiyah69AG5tyKxqiIEh1ZpgDC6egFc2TENNnOAGQImbAA5LwAjbFIpADZyAAd0JWIHJjdPb19ZJJT7ISCQ8LYomJ54m2w7NJEiFlIiDK8fP2tsW3ymWvqiQrDI6LjrOoamrNalEd7g/pLB8oBKa3QPUlROLhxUI1JsAGpMJXQAfXp0cXoDlYjGPYABY%2BPmAC8ATw5jlg8SQhoaCAIAA4AFTkK4eG7YBYAUi0AEFYXCtjt9kDgfc2BIzqgAbFpDD4YicHQQntoQB2ABCezRYMw11uFIAIvcvsAlABHDz1bAQekQxkAJgArOoFmSqYjmERSK8QIi9mSRWwyQBmFl1Bh7C6XJjoCQEFhKPZ6phMDxmA7RbA0a1MdYsSEQPHinC7W27e3YR2MY5kY7mszO/E0kEYrHnXHSPYuhVK4UAOho4gTWgTwRUDTVLIz0SI5gkHn2FOptPBkIlLI8TGJYLR8asey0cehIqTKZ46aYmaI2Zp3bzBc8xapodB5cZ5JZrcTyZYqa7PbpDOLIvUYJ4cd2vZLY%2BXApH07bc4TndzDURzMv8OJMwn%2BzunO5uz5K/jYollKlwll8vhipnbB1B3dVtSxT893vStWQ8dkuR5V8D3fAk4QAkV0D7ICZRYOwhyLCCy35CtmXjLCNxbZULT7Gg2CooihWFdAwRndAt2wXt6NXYVaPoS8p2vJEbTvTj7kOeCXxEmcP2xCRjmrVgOEwT5MEwUhP2/GU5Qo4UdT7TVLl0kSHieJg3g%2BL4fgIP4ATDCJiHESY9kQitnMYBZ0UfcT9hIMcligqSUMVbd/JFHU%2BKZREuCWehuGFfgfC4HRyHQbgAgCAA1ABZPYAEkACU9iOVZ1iVVU%2BHIIhtCipYAGtfEBBNpB4clBViVrhS0QFVQATlVQxuGkeKquS7h%2BCUEAtAqqqljgWAUAwNgEgYaJKGoBalsYGJ0ASIgeEFABaF53mwfbMWCAQGCIaJxogCJhrs1hf14fgFo4YQAHkmHoOVEv4HBMRMSRfvIQhdmqcxsHG4GgKqb4NiS4Irpi4H6AICJSHqV43BwYaZQINhuD4JYaCMdl0oIbAAHd3oSZhCf4QRhDECROBkORhGUNRNGB/QeEMYxTAsKxUYicbICWbbOihsb2iqTonBrMYfD5wIZmKUoDFyVIhCVzXkm1pg%2BnV%2BY2g6Gopl1vnKmqIRugaI2BjKYYekt537bVx2pCWIq1lZirdg2In%2Bq4OLyASpKUq4SW9j2pzVRoclsFiPbxQgNKstyvKwXwYgyFKvm9jcRblrU1syoWfhKt%2BmaUAICgqAgbBCBIUgcswAxGdEC5WdkTvOY0YbedNuW0gV1x3GaAxVaKT2%2Ba1zpXfntIHbmJ3rc6O3GgnrIrdlm2uimFeNati3t%2BVt3phn1evei2KhuByP0%2By/K9nJqnoj2aPY4gePE%2BTwUFgQBzi3fOYIi4bQ/mXHgFcprV1qiAYUnZhSAkFOSVUaDpDdXKFockfNkaDTDsNSOY0JqwJ0AsW%2BXBBT8AJsKWIqZBTdVQbEckWhYhaCauSQhD9RpkKiuQWayAQArCIAkb4q0IDrRLlPZuZAO7yGZpINmfcVAD2BjKbAgd%2BCUwxgkemlDQ7h34JHd63wxG9nQDQT%2BO0Y6CjjgnJOKcnLgJLvnGBVdyFLCQN6N01BKEEIJtIVUCZuqsJaqqRhPVkF9SMSNLgJDJoeOqsHVU98I68KSRQ8gENSApEcNIIAA%3D
@tgymnich This appears gets it wrong (without compile erroring) for forward mode:
https://fwd.gymni.ch/YwYWlf
It does, however, hit a compile time error if there's an inner multiply (see below). Notably this following case is precisely the error seen in the Enzyme.jl issue
https://enzyme.mit.edu/explorer/#z:OYLghAFBqd5TKALEBjA9gEwKYFFMCWALugE4A0BIEAZgQDbYB2AhgLbYgDkAjF%2BTXRMiAZVQtGIHgBYBQogFUAztgAKAD24AGfgCsp5eiyah69AG5tyKxqiIEh1ZpgDC6egFc2TA84AyBEzYAHJeAEbYpCAATADs5AAO6ErEDkxunt4GSSn2QgFBoWwRUXHW2LZ5TCJELKREGV4%2BPOWVaTV1RAUh4ZEGSrX1jVktA53dRSVSAJTW6B6kqJxcOKhGpNgA1JhK6AD69Oji9NvzYYybAAJ7e8wAXgCeHHssHiSENDQQBAAcAFTkU4ec7YaYAUi0AEEIZDVustr8/lc2BJDqhvgA2aTgqEwnB0IKbMGxABCm0RgMwZwuxIAIldXsAlABHDx1bAQKnAmnRACs6mmRNJMOYRFIDxAMM2RL5bCJAGZ6bUGJtjicmOgJAQWEpNhqmEwPGZtpFsDRTUwliwQRAsYKcBtzRtLdhrYw9mQ9oazLbseT/sjUUdMdJNnapTLeSwFfSaGwjUCQZH1ICwXz1BG07yAHQ0cTZrTZwIqeox8lMEtEcwSDxbYlkimJmmxekeJj4wGIyNWTZaTN83P5nhFiuRIhl4tj6ueOuk/0Apuz%2BlZwcsAsjyuU6l1vksQE8CMbcf1%2Bdb7lLyOr7PDyf1GF0%2B9Q/GBLZcpOXFlsjac7fJwX1kVhHFSUoWlLNsHUY9FVVVEhQbf4zyTOkGQ8JlWXZH9zz/fteXQMsILFFg7GnWs4NPRchWXPkCP3HD4xOMFoLjBM3x5XDUz5dBD2wcdWJ3Xl6PvFtH1hM0Xwoy4dnQ78%2BL/TY0QkPY21YDhMBeTBMFIODALFCUcLVMtlROAzZOuW4mEeZ5XneAhPm%2BAMwmIcQBk2TCkzcxhpiRD9pK2Eh51mCiswFbjeN/LM1SE2kYS4WZ6G4Xl%2BB8LgdHIdBuD8PwADUAFlNgASQAJU2XYFiWGV5T4cgiG0WLZgAaxAaQfmzaQeFiaIMU63ktB%2BeUAE55UMbhpCS2q0u4fglBALRqtq2Y4FgFAMDYBIGEiShqBWtbGCidAEiIHhogAWnuJ5sGOlFAgEBgiEiaaIDCcbHNYYDeH4FaOGEAB5Jh6AlFL%2BBwFETEkQHyEIDY7AIcxsGm8GIOwVA3mWVLAju%2BLwfoAgwlIOoHjcHBxrFAg2G4PhZhoIwmSyghsAAd2%2BhJmHJ/hBGEMQJE4GQ5GEZQ1E0cH9BaIwTBAMxLEMHHpsgWZ9qqeGpoqJGqicdthmach/BfSY%2BhaHJUiEDXsmSQ2mAmXoolGZXoaEDohncJp%2Bhtqp7a6HXLf6QYGkdkZrG9i3ij12ZSsWbnqo2ZYKeGrhEvIZLUvSrh5c2I7XPlGhYmwDEjsFCBMtygrCsBfBiDICqWk2NxVvWrS00q6Z%2BBqwGFpQAgKCoCBsEIEhSHyzADHZ0Rjm52Qh/5jRxuF1oVbSNXXF9zXtcKT39dNqpjbX3I0kDqZrbaO3vc3mfbeqAOPaDq3/c6Y%2BxnqXfg7ihKxvBpOC7yorNlphnIk2FO04gBnLOOdojTAgKXXuFdATVx2r/euPBG5zRbg1EAvJhy8h%2BHEeUsR5TSH6jwDEWhYgixGi/ROk1rAzSQToaYT8uDRH4GTXkGICzRH6nEDEsQtCELavEBO/Ak5N3muQRayAQDzCIAkN4m0IDbVrr4HuZBB7yE5pIHm48VCT3BmKbAUd%2BD0zxgkVmdC478Imlwb6bwpHjnQDQP%2BB1U7RHTpnbOudXIwNrhXRBzcaGzCQK6B01A6GjXIGTaQ8psz9S4R1eUbCBoYKGmYwRlDZo%2BLqjHeUZCBEULSbQ8gsNSApEcNIIAA%3D
To me, the correct way to remedy this within forward mode is to not have two different shadow conventions like we do for reverse mode since everything is duplicated regardless.
@tgymnich would you have cycles to start investigating this?
@wsmoses this looks to me like the return value of augmentedsquare
of type { i8*, double }
is treated like a pointer since it is contained inside invertedPointers
. This way the diffe does not get set, so when retrieving the derivative we end up with zero (since the diffe was never set for this value).
Related:
%26 = call nonnull {} addrspace(10)* @jl_array_copy({} addrspace(10)* noundef addrspacecast ({}* inttoptr (i64 140545663509344 to {}*) to {} addrspace(10)*)) #10, !dbg !116
julia: /workspace/srcdir/Enzyme/enzyme/Enzyme/GradientUtils.h:1890: llvm::Value* DiffeGradientUtils::diffe(llvm::Value*, llvm::IRBuilder<>&): Assertion `!val->getType()->isPointerTy()' failed.
signal (6): Aborted
in expression starting at /mnt/Data/git/Enzyme.jl/sensitivity_analysis_paper/script/forward_sensitivity_analysis_bench.jl:20
gsignal at /lib/x86_64-linux-gnu/libc.so.6 (unknown line)
abort at /lib/x86_64-linux-gnu/libc.so.6 (unknown line)
unknown function (ip: 0x7fd40bc893f9)
__assert_fail at /lib/x86_64-linux-gnu/libc.so.6 (unknown line)
diffe at /workspace/srcdir/Enzyme/enzyme/Enzyme/GradientUtils.h:1890
diffe at /workspace/srcdir/Enzyme/enzyme/Enzyme/AdjointGenerator.h:1787 [inlined]
visitPHINode at /workspace/srcdir/Enzyme/enzyme/Enzyme/AdjointGenerator.h:1042
visitPHI at /opt/x86_64-linux-gnu/x86_64-linux-gnu/sys-root/usr/local/include/llvm/IR/Instruction.def:208 [inlined]
visit at /opt/x86_64-linux-gnu/x86_64-linux-gnu/sys-root/usr/local/include/llvm/IR/Instruction.def:208
visit at /opt/x86_64-linux-gnu/x86_64-linux-gnu/sys-root/usr/local/include/llvm/IR/InstVisitor.h:112 [inlined]
CreateForwardDiff at /workspace/srcdir/Enzyme/enzyme/Enzyme/EnzymeLogic.cpp:4234