<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">