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