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

    <tr>
        <th>Summary</th>
        <td>
            [InstCombine] Missed optimization : fold `switch(rol(a, c))`
        </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/uPJXhH

### Motivating example 

```llvm
define i64 @src(i64 %a) #0 {
entry:
  %rol = call i64 @llvm.fshl.i64(i64 %a, i64 %a, i64 62)
  switch i64 %rol, label %default [
    i64 0, label %trap.exit
    i64 5, label %trap.exit
 ]

default:
  call void @dummy()
  br label %trap.exit

trap.exit:
  ret i64 0
}
```
can be folded to:
```llvm
define i64 @tgt(i64 %a) #0 {
entry:
  switch i64 %a, label %default [
    i64 0, label %trap.exit
    i64 20, label %trap.exit
  ]

default:
  call void @dummy()
  br label %trap.exit

trap.exit:
  ret i64 0
}
```

### Real-world motivation

This snippet of IR is derived from [ruby/signal.c@sig_trap](https://github.com/ruby/ruby/blob/15dc3aaa311b32203d8ffb414bcf9b8e55ce5691/signal.c#L1354) (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/E7nz88vbP

**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/eJzMVc-PozYU_mucy9NE8AyEHDjMToo61a66WvWwt8rGj-CusZFtMpv56ytDZiYZqbuq1EMlC3jw-eP9_CxC0EdL1LDyAysPGzHHwfnm68Nw3kinzs290SdCmLxzPeP3MMQ4BcbvGbYMW7F83RpzGrfOHxm2HTFsnxm28-ffvg6_suzAsvvLFfm64JOL-iSitkeg72KcDMENsMrWlXjXV4p6bQl0VQArsuA7hvViYCkY7oEhz4DtPqxostGfk5OLBQnlnQHGD9AJY15oFrf7MJitroobwgd4_1whw_0LX3jSsRteMN6ZhDJCkkm2ol7MJkJK6WUDLNjsBha9mLb0XcdbUPlDECsP15m6_Ooq1CW-k9MqBajmcTwzrK9cl_4fydfr28s3Uk_xEsAK3B3eFWo1O2FBEvTOKFIQ3SvDTwsaj_FfFfS2AOI_TD_-BPW_LsD7OftCwtw9OW8UjJeRc_Ya-segAwSrp4kiuB4ev4AOoMjrEynovRtTGv0szwzbpBTCbLs0gPr4Z_IzZQPrW0046jjMctu5kWF72Xq5SeMkwzYvVceFEDzPJUfMuKr7XhZ5Ibt-L2sqy47Kap9f_xP5x5yXxdoategjefidw6QnMtoSw_32JSR6FRUh3YlSRAI8qbkjBSfyQTu7hccezm5muPME2kbyFCIp0BbiQOC8PmorDIRZuinqUZiUHGEVvJmpUwIRCBNSr79Lg1PSmXiRxaSIv-zsc12f5OfbYqX1kSKMBN-sewK9OAZpmDpne-1HiIOIoCPDXQBhVw_081JNcNPkfJytjufkTxyE_Ra2K-1GNVzt-V5sqMl3eZ4VfJ-Vm6GphMRyV6h6J6p9J6jnXalK7Ate5CVH3OgGMywyjnm-K2sstllVZrzIkMu8LnPOWZHRKLR51f6NDmGmpq7yKt8sHR6WQwXR0hMsHxliOmN8k_bcyfkYkgjrEMMbS9TRLKfRow3xwY0yFbc8wCcdAqnb0NN5lMQGWJWtisCwXtS4XiShS2OHe1Zlm9mb5gdtuujSerubvPuLusiwXZwODNslqL8DAAD__8DJFYg">