<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/56189>56189</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
Missing optimization for switch from int to bool
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
majnemer
</td>
</tr>
</table>
<pre>
Consider a function like:
```
extern "C" bool src(int x) {
switch (x) {
case 1:
case 2:
case 4:
case 8:
return true;
default:
return false;
}
}
```
My clang/LLVM build gives back:
```
define dso_local zeroext i1 @src(i32 noundef %0) local_unnamed_addr #0 {
%2 = add i32 %0, -1
%3 = icmp ult i32 %2, 8
%4 = trunc i32 %2 to i8
%5 = lshr i8 -117, %4
%6 = and i8 %5, 1
%7 = icmp ne i8 %6, 0
%8 = select i1 %3, i1 %7, i1 false
ret i1 %8
}
```
This is sort-of like writing:
```
extern "C" bool src(int x) {
--x;
return x < 8u & ((((1 << 0) | (1 << 1) | (1 << 3) | (1 << 7)) >> x) & 1) == 1;
}
```
I think this could be simplified further to:
```
define dso_local zeroext i1 @tgt(i32 noundef %0) local_unnamed_addr #0 {
%2 = icmp ult i32 %0, 9
%3 = lshr i32 278, %0
%4 = and i32 %3, 1
%5 = icmp ne i32 %4, 0
%6 = select i1 %2, i1 %5, i1 false
ret i1 %6
}
```
For clarity, this is as-if we wrote the code initially as:
```
extern "C" bool tgt(int x) {
return x < 9u && ((((1 << 1) | (1 << 2) | (1 << 4) | (1 << 8)) >> x) & 1) == 1;
}
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJytVU1v4yAQ_TXOZZTKxt8HH9pmK63U3lZ7rQjGMS2GCHC_fv0O2E2TJq26u7WIg2cew_jNG7zW7XNzqZUVLTdAoRsVc0IrkOKeR-l5FK-i-Dwq4nmER_7kuFEQEXKJP1hrLcEaFpFKKAdPEakhKi8mLOBlH4VjPeKrY5-_GLUckt1uB2Zy2pydNldHZn8Z7kbM15kRX-nd3i3v6CjdZ-s6Ku3hwqhczcTsJocMTfebZ2CSqk1Erq6vf9_AehSyhY144BbWlN1_xC_mJBSH1upbqRmV8MKNRtJBJBBl8Ux1SkDpUSEYmc1jz2xA345K0YG3t7RtDbrSeJ9xhBKI0hWgF3yMae0lLJM9SBoggg1bQHJeccTjqj1YFmDIq2I7DDgNYh-UB5C0vUE7bpOUPoxfvQcqppxU6zF-kcfsZ1S-ZYTUTKDCg-I9UBVAlkvOJrLwTTxmmpbzdKrnvAprPLurr5T0Vy8s4LDauKXuQpvAoxFOYJm_qV2Wy6cDtc0yfMKXQ_pHDFT4XtqNxDu8L55CeXLfjMkpY3rKiPzUwZ7-wDEnhntNEdKV5zbZZfY5Tz_B9ULd-7sFpkfU_ZqDFcNWik7wFg8a43o8cpz-xy5wG_cNXfBe4qEV6qNOmNSLEFJWs3rjoz4I6p3CpO_lmx_Kd0Jl7_VbHOuXvOk3_1y_xVfqcqWNP5NQsM8-mpvlTO1SdPDopawdRzPHorWYqEJlUymfEfE38p6Lc1LeB3Kug5w_VPRJ8ZJTxuyUsfpPRS_aJm3rtKYLJ5zkzY2wFhsd9NaJQbzQ8KXskNL5C9cZPYB_azwDPQ-L0cimd24byCNXODbC9eP6jOkBH6R8eP1bbo2-w7LjI24ycouTvEiqetE3WUzLvCzSrGBZVrZx15GkzHjFa85yFhcLSddc2ibKL7ACij9CCIHzKF8tRENiQuKCpEmVZoSc8SImvMsYYzypq5RhM_GBCnnm8zjTZrMwTUhpPW4sOqWwzr45KXKwUZyH7TA-HV2vTTPQO8UHbhZh7ybk_gd92ixE">