<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=https://github.com/llvm/llvm-project/issues/85368>85368</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            [DSE] Missed optimization: skip `store(phi)` if the tautological value in phi is assigned 
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            new issue
      </td>
    </tr>

    <tr>
      <th>Assignees</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Reporter</th>
      <td>
          XChy
      </td>
    </tr>
</table>

<pre>
    Alive2 proof: https://alive2.llvm.org/ce/z/JRtC28

### Motivating example 

```llvm
define i32 @src(ptr %outl, i1 %c1, i1 %c2) {
entry:
 store i32 0, ptr %outl, align 4
  br i1 %c1, label %if.then, label %if.end

if.then:                                        ; preds = %entry
  call void @dummy()
  br i1 %c2, label %common.ret, label %if.end

if.end:                                         ; preds = %entry, %if.then
  %storemerge = phi i32 [ 1, %if.then ], [ 0, %entry ]
  store i32 %storemerge, ptr %outl, align 4
  br label %common.ret

common.ret:                                       ; preds = %if.then, %if.end
  ret i32 0
}
```
can be transformed to:
```llvm
define i32 @tgt(ptr %outl, i1 %c1, i1 %c2) {
entry:
 store i32 0, ptr %outl, align 4
  br i1 %c1, label %if.then, label %common.ret

if.then:                                        ; preds = %entry
  call void @dummy()
  br i1 %c2, label %common.ret, label %if.end

if.end:                                        ; preds = %if.then
  store i32 1, ptr %outl, align 4
  br label %common.ret

common.ret:                                       ; preds = %entry, %if.end, %if.then
  ret i32 0
}
```
Notice that #75744 has fixed similar cases, I tag DSE here. But this case would require threading the basicblock.

### Real-world motivation

This snippet of IR is derived from [openssl/crypto/evp/evp_enc.c@EVP_DecryptFinal_ex](https://github.com/openssl/openssl/blob/f08be096517f9bdae8a9d1d837748237db4d13a9/crypto/evp/evp_enc.c#L940) (after O3 pipeline).
The example above is a reduced version. If you're interested in the original suboptimal IR and optimal IR, see also:https://godbolt.org/z/aEbMeM8rP

**Let me know if you can confirm that it's an optimization opportunity, thanks.**
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzcVl1vozgU_TXOy9UgsCHAQx6appFmNd0dzaxW-1YZfAneGpu1TdrMr1_ZpG2Sdmb6ONoKpdhcDsfnfnLn5E4jrkixJsVmwSffG7v6-7o_LBojDqsrJfdIYbTGdIRdQe_96Ai7InRL6JbHp4lS-yExdkfotkVCt98I3f72xV_TiqQbkl4dfymbL7g1Xu65l3oH-MiHUSGcGS7T-Qq485bATmoEySiQPHW2JbQavQVCCzN5Reg1yCys2uzknhJaAynXMwZqbw-BelyB88bOiGl45QKNK7nTkB9tobFn-Io3qMJSdonvUV_uoRanB3qyYlfwzj_C1jBaFA4I2wTQmfyRTcuVgr2RIoghpmE4EFoRWr9mS8-YtWYYjE4s-p8TDjvv5_s9wvT6VKUjPUKLKP6AdofRfuzl7NtiDdn5S0CKTdwp1rOjnrDjgyPiiy_PsN_l17fUOZHiZPfdcrwS4yRMLvQGsOiPUTh_tdxcZMGRB9fQIHjLteuMHVCAN8_R_NOU8Tv_C6fM29L__9Pmu4HyKq6zXyaWLxI7HPjNLH9nXP9uvGwRfM89EMrKosxz6LmDTj6iACcHqbiFljt04UMfwfMdbL7eQI8WE1hPHnwvXbSABzMpARb_naQNoBa5CG3G9wgNd7JtlGnvk7fb0hfk6sODsUrAcOxQRp-a_hm-47QcR_RgOvj4BaQDgVbuUUBnzRDKlBlRO6dCM7SH0RtCt7gf59871G3Skjy9-evz3QajwVZqru7wMRa66rzB7qTvpyZpzUDo9gX45a5RpiF026VVg2m9LLKyqxvBseK1yETFyjKvKCtFk4uM8fpHpCj7VOdpzH9a8c6jhT8YjHJEJTUSWidPKuBz2-aN2WMQgYNFMbUoYI_WSaMT-NjBwUyEliGEtUeLzqMAqaM3jJW7cHBwU2NGLweugp5cC3hZBoc7RODKhVp3oY0RjVH-OHiEmYPfNLd4W9nP5_4N1yf0MCDca_MAMhKDUFFboztphzn8pCe0dMD1zEB-iwEAZhyN9ZOWPoa977m-d8kMuxArJmpW8wWusjJL86rMinzRr5apyDhlRZdTbEtWpyynlNZ5WWZ5saTFQq5oSvOUZUVaZnWWJ01XliVbsrRiy7YuC5KnOHCpnqerhXRuwlVVsGW1iJnu4thGqcYHiA8JpWGKs6vwzodm2jmSp0o6715QvPQqznubrzek2MCtdA7F2ZFDdXD3cgSyTGMJCq2jl6FULtMgX3Cg55M3yuxkyxXsuZqCl-dO7uA4VwpYTFatfhDTsV_N_z6M1vyDrSd0Gw_jCN3Gw_4XAAD__0eaCsA">