Similarly to assumes and guards deoptimize intrinsics are marked as writing to ensure proper control dependencies but they never modify any particular memory location.
In most cases aliasing of deoptimize calls doesn't matter because these calls never return to the compiled code. One case were it does matter is transformations of the deopt operand bundle attached to the deoptimize. According to the lang ref "operand bundles represent an alternate “safe” continuation for the call site they’re attached to". Semantically the deopt bundle values are used after the call. (This is true for any call with deopt operand bundle, not only deoptimize calls). When we rewrite the deopt bundle values we need to take the effects of the call into account.