<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/140997>140997</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
DSEPass incorrectly eliminates store to captured (and later read) pointer
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
mhjacobson
</td>
</tr>
</table>
<pre>
llvm v20.1.3
macOS "Big Sur" 11.7.10 (20G1427)
I have this code:
```
declare i32 @printf(i8* noalias readonly, ...)
@fmt = constant [6 x i8] c"%hhd\0a\00"
define ptr @makeValue(ptr %p) noinline optnone memory(none) {
ret ptr %p
}
define void @useValue(ptr %value) noinline optnone memory(argmem: read) {
%val = load i8, ptr %value
call i32 @printf(ptr @fmt, i8 %val)
ret void
}
define i32 @main() {
entry:
%1 = alloca i8, align 4
store i8 42, ptr %1
%value = call i64 @makeValue(ptr %1)
call void @useValue(i64 %value)
ret i32 0
}
```
`opt --passes=dse` transforms `@main()` to (<https://godbolt.org/z/rhx1z9K4W>):
```
define i32 @main() {
entry:
%0 = alloca i8, align 4
%value = call i64 @makeValue(ptr %0)
call void @useValue(i64 %value)
ret i32 0
}
```
i.e., it eliminates the store to `%1`, even though `%1` is captured by the call to `@makeValue()` and ultimately read in `@useValue()`.
I believe the `memory` annotations on `@makeValue()` and `@useValue()` are legal. Note that the `noinline optnone` are just to prevent the optimizer from seeing into the contents of the function, equivalent to if the functions were simply `declare`d and implemented in another module.
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJy0VU1v4zYT_jX0ZRCBor4POjjx-sWLAm2BBdozJY0tphSpkiPvOr--IKUkTpoNsIcCQWSKM3w-ZjiS3quzQWxZcc-Kw04uNFrXTuOj7G3nrdl1dri2Wl8muAiepEnG-H6S_W9fgQlxr87wdXFMCEjTpEpSDkzUgv8vzUXFRMP4nvH9_2GUFwQalYfeDsiy_brBSr798f2AvZYOQWUCWM5npwydmKhVzcQejJVaSQ8O5WCNvjLxAEmSbBA5P00ELDtAb40naQhYcV_Cd1A1Kw7QMyGYKMZxYMUDl-EfD68iiQFPyiDM5ALuJP_CP6RekIk6vhLFzEQDxiqjQ5ydyViDMOFk3ZWJOqxCBKvuGd8DOCR4yeR7Vh3e4FysGgLQ4t_jXNblZ1jSnSecWLaPRtyirvnRA23lEISLB3hzcgjrpdb_sniTfpoo5Kh6S1nNXQUF1h-I2U6apDJM1K980JC7rmWO1NJITGpte7lRk1qdDeQxwpMNla8hFzes0xthC67ljfTL_AeVSp8px7gPnI6pr06_yAs6-Ku-m7Zcl3YmuLubpffoWXYYPLKSAzlp_Mm6yUMIvvUhbttwGVj2MBLNPrghjkwcz3borKbEujMTxycmjm78nj41v-R_suxLyP34evyU4fxzw3_GVP6fmKoSTGK3EaBWkzKS0AONuDVDMK_ksabh8QB4QQM02uU83uxAGClypsXhAN01HhB5bvlvFW2FkWaARZOaJKG-xqsEymzxN8LW8OR5iHWoFcY5hiF2u5TxPGNJkrLGgzWf4_4ABMLo03iWOgH41VJAkfQM9X4gPCc8Lp6C0tkFd9ZwO5Oa1BM6ODk7gUdU5gzKkF3NsYbQkAd7iuvTYvrAPFr896IuUseTLKi3AR6-oUPwapr1NZDaBnb4FZWFDZzQEEY3pbE0ooPJDovGZDe02dBkjdxhm1Z5VddFyZvd2J76ZkhLmWGeZjyvqrobcll2aXfK6yoX5U61gouCF0LwLC_zJil60fVZWfdN0VR5HfzESSqdhK9UuFY75f2CbZrzpql2WnaoffzACWHwG8TdMP6Lw87FT9tdt5w9y7lWnvzrMaRIY3v4-uV36T0o01vnsCd9vW3Zl3Z9acMwp80AWhK6lzk9W2UI3W5xun03DxSNS5f0dmLiGLC3x93s7CP2xMQxMvZMHDdJl1b8EwAA__9h1lFi">