``` $ cat /tmp/a.ll declare void @g(ptr) define void @f(ptr dead_on_unwind noalias writable writeonly sret(i64) align 8 %0) { %a = alloca i64 call void @g(ptr %a) call void @llvm.memcpy(ptr align 8 %0, ptr align 8 %a, i64 8, i1 false) ret void } $ opt -p memcpyopt -S /tmp/a.ll declare void @g(ptr) define void @f(ptr dead_on_unwind noalias writable writeonly sret(i64) align 8 %0) { %a = alloca i64, align 8 call void @g(ptr %0) ret void } ``` If `@g` is not `writeonly` in regards to the `ptr` param, we may end up reading from `%0` in `@g` which is marked `writeonly`.