This is consistent with what is currently implemented in LLVM, as far as I know.
There's an alternative model where "dereferenceable" only applies at the point of the call/load. That might be more generally useful? But it doesn't match the implementation of Value::getPointerDereferenceableBytes.
DeadArgElim transforms
to
Given this semantic this transform is wrong, right?