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