Enzyme icon indicating copy to clipboard operation
Enzyme copied to clipboard

Handle Mixed Active/Duplicated Return

Open wsmoses opened this issue 2 years ago • 4 comments

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

wsmoses avatar Apr 06 '22 21:04 wsmoses

@tgymnich This appears gets it wrong (without compile erroring) for forward mode:

https://fwd.gymni.ch/YwYWlf

wsmoses avatar Apr 06 '22 21:04 wsmoses

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 avatar Apr 06 '22 21:04 wsmoses

@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).

tgymnich avatar Apr 07 '22 10:04 tgymnich

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

wsmoses avatar Apr 25 '22 01:04 wsmoses