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

    <tr>
        <th>Summary</th>
        <td>
            [IPSCCP] Missed optimization: refine range of `select`
        </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>
    Godbolt: https://github.com/Kitware/CMake/blob/3f08812a6bb1673378009393f01eac1a79927165/Utilities/cmzstd/lib/dictBuilder/zdict.c#L653
### Motivating example 

```llvm
define i32 @caller(i32 %1) {
  %cmp = icmp eq i32 %1, 0
  %spec.select = select i1 %cmp, i32 3, i32 %1  ; %spec.select u> 0
  call void @callee(i32 %spec.select)
  unreachable ; resist inliner here
}

define void @callee(i32 %0) {
  %cmp = icmp eq i32 %0, 0
  %select = select i1 %cmp, i32 3, i32 0
  call void @ZSTD_getParams(i32 %select)
  ret void
}

declare void @ZSTD_getParams(i32)
```

can be folded to

```llvm
define void @caller(i32 %1) #0 {
  %cmp = icmp eq i32 %1, 0
  %spec.select = select i1 %cmp, i32 3, i32 %1
  call void @callee(i32 %spec.select)
 ret void
}

define internal void @callee(i32 %0) {
  call void @ZSTD_getParams(0)
  ret void
}
```
And then the dead argument can be eliminated.
Because the original real-world program is inter-procedural, put an inter-procedural example here.

### Real-world motivation

This snippet of IR is derived from [cmake/Utilities/cmzstd/lib/dictBuilder/zdict.c@ZDICT_analyzeEntropy](https://github.com/Kitware/CMake/blob/3f08812a6bb1673378009393f01eac1a79927165/Utilities/cmzstd/lib/dictBuilder/zdict.c#L653) (after O3 pipeline).
The example above is a reduced version. If you're interested in the original suboptimal IR and optimal IR, email me please.

**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/eJzMVsFu4zYQ_Rr6MliBIi1LOvgQ2-si6C4a7KZAsZcFJY4sNhSpkpRT5-sLSo7tJE2a7aEoIFikODOcefP4TOG92hnEJclWJNvMxBBa65a_rdvDrLLysPzJysrqQPgVtCH0nvArwraEbXcqtEOV1LYjbPuzCvfCIWHb9WdxF9-VthVhW97QokiZWFRVusg5zwtKS17yhqYo6lTkZcnydJERtv01KK2CQk_Ytu4efJCEbbWKUaSqw2pQWqIjbPsQp0lNGP-0yDihG0KvCOPTA59tUHsRlNkB_im6XiMcTabfBZ0erffd9EliowyC4gzInNZC67hNMc5ZlhJWAslXky3ET3XXA-EbUHGAf8DZcg30ws73WCceNdZhtD8OVXoMEu2jL38cxCAAhK-eew-EfzyHjinC3ip5yhfP-V64EVY-ugzGoahbUUU4-AoceuUDKKOVQQctOjzik28u4Tpi89pm9N3g0Bfg_AAuf1_5t6-3m-87DDfCic5fIPC8eIdhdHqlwloLh29GPcU6secyQi0MVAiN1RIlBPs-uj2B9AXfGKf_Jen-PbP-AdvpZJmAzojXIz-n0dttpu9o7dM-XRkJoUUTf0CikCDcbujQBDg2D7XqlBEBZTK5rLAWg8fRwzq1UzF_h0J_uLdOS-id3TnRgfJTeR96Z2uUgxM6AtsPAYR5sXSSpHjgkidEOQnYl_Mm3VHLrLk0vW2VB29U32MA28D1l5iFRKf2KKFxtgOSrepuEuIfltU5_ba5Xt9-F0bowwN-NMHZ_kCyDWHF__QvYDwxhWgCOviFQ696jLpGWJk8QoYn6EVl9xgRE-BQDjVK2KPzypoErhs42IGw3B1Ziz6gBGWe8sAPle2D6oSO4Asj4TyN3cdOKA0dQq9R-OeNjs8nDHH9zth7UOOmIxNraxrlOgitCKACYbmPNBqjq4eRCWD73rowGBUOca_QCnPnkynsTC65LHkpZrhM85QtsjLjdNYuq6yqUlnMqaRzzqksKbJcyEbUTTpfNDhTS0bZnM5pmdJ5xmmCVcFruSiqpsyqOq_InI5lJVHJEut2M-X9gMuiSGk-06JC7cdbBGMG72FcJIzFS4VbRp8P1bDzZE618sGfowQV9Hj9uL75ul7fkGwDn5X3KJ9UHe8fblITJ8wOI-_Jgh7VaEFng9PLN9g5yu_0isfx91HDtmOSkWxjEX8FAAD__w5XtMg">