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

    <tr>
        <th>Summary</th>
        <td>
            [RISCV] Suboptimal switch code generation
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            new issue
      </td>
    </tr>

    <tr>
      <th>Assignees</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Reporter</th>
      <td>
          WojciechMula
      </td>
    </tr>
</table>

<pre>
    Version `clang version 20.0.0git (https://github.com/llvm/llvm-project.git 5b697ef5dd6b3e29e257e6099014bf8d8e77ac9a)`

Arguments: `-O3`

The following switch is nicely compiled:

```c++
bool one_of(int num) {
    switch (num) {
        case 0:
        case 1:
        case 3:
        case 4:
        case 6:
        case 10:
 return true;
        default:
            return false;
 }
```

```asm
one_of(int):
        sltiu   a1, a0, 11
 li      a2, 1115
        srl     a0, a2, a0
        and     a0, a0, a1
        ret
```

However, changing the return type from `bool` to `int` changes the generated code dramatically.

```c++
int one_of_int(int num) {
    switch (num) {
        case 0:
 case 1:
        case 3:
        case 4:
        case 6:
 case 10:
            return 1;
        default:
            return 0;
    }
}
```

```asm
one_of_int(int):
        li a1, 10
        bltu    a1, a0, .LBB1_2
        slli    a0, a0, 2
.Lpcrel_hi0:
        auipc   a1, %pcrel_hi(.Lswitch.table.one_of_int(int))
        addi    a1, a1, %pcrel_lo(.Lpcrel_hi0)
        add     a0, a0, a1
        lw      a0, 0(a0)
        ret
.LBB1_2:
        li      a0, 0
 ret

.Lswitch.table.one_of_int(int):
        .word   1
 .word   1
        .word   0
        .word   1
        .word   1
 .word   0
        .word   1
        .word   0
        .word 0
        .word   0
        .word   1
```

godbolt: https://godbolt.org/z/jqs1zr385
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJy0Vl1vpDYU_TXmxVpkm-8HHpKNRq2UqlK32j5Gxr4Djgye2iaj7K-vDDMThmGT7qpFiBHX5xxfX449lzun2gGgRtk9yh4iPvrO2Pov8ywUiO63UfOoMfK1_grWKTNglBOh-dDil1OAkZjEpFUeI1Z23h8cSu4Q2yG2a5XvxiYWpkdsp_XL-efTwZpnED4OrKzJqwL2mZR5kwCrgGUF5KSqCE2bfSlLKAouKo5YhXKCyAMid_PzzrZjD4MPE4a8Pv2erBB_doD3RmtzVEOL3VF50WHl8KAE6FcsTH9QGmRIeMEKItMtELsP9xRtjNHYDPBk9oiVavB4GHvEKoyKEwJjfJ4DsXJrNFyCO8DkMuVVmG6Hk-1wuh3Ov6O9mNOCH-2AvR0BJav8JOz5qP2NSLhOvD3XbkFExcOqcJvV5K6fI8sihq-6nslpr0aMMaeIfcachCelJ4xWM4izOUyzFdnqeXyizShOrjF8kEvM_KTXGAv-nUX9Yo7wAjYQRceHNtjLd3Ap7OsB8N6aPtgyGAflBHsT3sKaczKzwE2kFgaw3IPEwkjA0vKeeyW41q_xx74MTpwr-jTV8z-05v_iyRsz3vqL_owpyRXpzZM_Zc63Um4ZVKuTN-nKWI32I145N368v6dPbG3x2cdLB54g8eNBWNBPnbqtER_VQVz0EcvOUMTK-HH-wLHnjYZ4ax2sWslJqRbpXotqM4m-JbPB_nAX6SNeYAhiJb8Vumy1c6k26n2lcjnElp_yX6x_rRsfjQ1rOCe9fl_ByPvsD0R_jL2J_o7E-8qbvm-NbMy0n_DqL3seiI1tEdt9Q2z3_Lej32xSZpGsE1klFY-gpkVCSVaQlEZdTRJapVxQmkApspKXXMK-oQktq6zK8jJSNSMspZSUpKIkpbHgVZ5BxWiaJDkUgFICPVc6Dt1BmDtSzo1QU5qlaRpp3oB2U4vC2ABHPI0ixkLHYuuppWjG1qGUaOW8e5Pxyuupt_nj1y-fv6LsAX8ZG3Pwquf6fCBOh-7pDFZmiEar6x_rYxDbTRk5xHanlF9q9k8AAAD__x5Ocxg">