<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/63564>63564</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
Instcombine miscompile removing memcpy from constant memory to alloca
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
aeubanks
</td>
</tr>
</table>
<pre>
https://alive2.llvm.org/ce/z/4Qv6c5
```
$ cat /tmp/a.ll
@g = external constant [128 x i8]
define void @f() {
%a = alloca [128 x i8]
call void @bar(ptr %a) readonly
call void @llvm.memcpy.p0.p0.i64(ptr %a, ptr @g, i64 128, i1 false)
ret void
}
declare void @llvm.memcpy.p0.p0.i64(ptr nocapture, ptr nocapture, i64, i1)
declare void @bar(ptr)
$ opt -p instcombine -S /tmp/a.ll
@g = external constant [128 x i8]
define void @f() {
call void @bar(ptr nonnull @g) #1
ret void
}
; Function Attrs: nocallback nofree nounwind willreturn memory(argmem: readwrite)
declare void @llvm.memcpy.p0.p0.i64(ptr noalias nocapture writeonly, ptr noalias nocapture readonly, i64, i1 immarg) #0
declare void @bar(ptr)
attributes #0 = { nocallback nofree nounwind willreturn memory(argmem: readwrite) }
attributes #1 = { memory(read) }
```
I don't understand what UB alive2 claims the optimized function is triggering. But separately this does seem wrong in the context of poison vs undef. Previously we'd hand `bar` an alloca containing undef, but now we pass `bar` `g` which may contain poison.
https://github.com/llvm/llvm-project/blob/3a4e9f7ae50980ce8f103cbe86d24c574c8c6cac/llvm/lib/Transforms/InstCombine/InstCombineLoadStoreAlloca.cpp#L525 is where this happens.
@nunoplopes
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJy8VVuL4zgT_TXKSzFBka958EOnG0PDPHwfs_sDZLlsa0cXI8lxZ379IuXSSTM9zMKyYHyT6lTpnKMS916OBrEhxYEULxu-hMm6huPScfPdbzrbn5ophNmT7ImwlrCWK3lEtlXqqLfWjYS1AglrfxDW5v8_lqIg9IXQp8u9pJfr_MlyEDwAYW3QcwTbKnUZyukIJHsBfAvoDFcgrPGBmwCkOOxYDW8ga1K83MP3OEiDcLSyB5LTgbCasD2Q6nAeByCs4AmWK2UF_ykWgOBK3VA67gir5-BScMRzyHtr1Omn0xMRGrWYT9uZxkuW-QPAM6T3nI7xXZY57GKdzyB3MHDlkbD9FdphSMiXVVYflisUd_hbqY0VfA6Lw2v-hx9pXizglvoj9o2F24x3Ce0c4MsM0vggrO6iBF--_XeifqKWscYsSl2I3gNh2e63aCXZAdrFiCCtgacQXDR74kupjovvYOzgEMHYxazS9LBKpRyGxRnQqK07EVZzN2rUMTC6ZXUy4Kfc_lo3riT373JBwkr2uyn5ccrNoPfSgtSauysV9FdG-kxsHoKT3RLQJ4gkJakO_w43cJPhMc3uluYGEMMeIj72lXR_hd4awqoAi-nRRZ_1sE48wJ8HOLctEIpL7SFMGF0stfyBPQxX8aWH4OQ4opNm3MJhCeBx5o4HVCcIk_TQW_TgETWszpoRpElgwpqAbwHsALOV3ho4-lTGsIX_OTxKu3h1ghUJq3qYYmWkTLyXFLi5tqcIw6WRZjwHRyW7JYCxK6wIM_f-Lo6UdIzPdZJiAs1P1_hLDdt7dh67-CjDtHRbYTVhbfTj5fFldvYvFIGwtlO2I6zNeI77oeJY0H1NBdbDjmaiw7rsWS6KKhe1KAUXdzgyxv3huPGDddoT1r4aH57PreLx66vl_bdgHT4lArZingnLvhasiGKsEzo88z7xeUbjH5ZEcmoWY2dlZ_Sw6Zus32d7vsFmV9bVntIqyzZT05e8K3aUCTqwvqCY7fpBiIKKrhN1j8NGNoyyjJasYrtdXWTbmvWizKp9IXjW031BcoqaS3U79TbS-wWbMivKfKN4h8qnI5QxgyukQcJYPFFdk2jtltHHnS998O8oQQaFzetdH9XSC6tnqeKm1vYYnXDuFDA4q9_753lvQLAX62wWp5p_rHGqNAqUVvJ3AAAA__-JgIIl">