Closed
Description
$ 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
.