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

    <tr>
        <th>Summary</th>
        <td>
            RISC-V missed optimisation: branch on equal to small constant
        </td>
    </tr>

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

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

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

<pre>
    In this code:

```c
void __attribute__((naked)) f() {asm ("ret");}
void __attribute__((naked)) g() {asm ("ret");}

void h(int a) {
    if (a == 15) {
 f();
    } else {
        g();
    }
}
```

clang trunk on godbolt produces the following at `-Oz`:

```c
h(int):
 li      a1, 15
        bne     a0, a1, .LBB2_2
        tail f()
.LBB2_2:
        tail    g()
```

(Godbolt link: [https://godbolt.org/z/srT6MhG5Y](https://godbolt.org/z/srT6MhG5Y))

However the following is two bytes smaller (because `bnez` compresses) and avoids a register clobber:

```c
h(int):
        addi    a0, a0, -15
 bnez    a0, .LBB2_2
        tail    f()
.LBB2_2:
        tail g()
```

This transform applies when the branch is the final use of the value, and the comparison constant is not -2048 or -32 (due to the sign change). It is useful when the branch is in compressible range, or when avoiding the clobber is profitable.

The same pattern applies to some sparse switch statements, like [here](https://github.com/raspberrypi/armulet/blob/c620715d8ffbc332af012b6b25c7cf888a700419/varmulet/varmulet_armv6m_core.S#L850-L861) in the RP2350 bootrom. That source file has several instances where this pattern saved static code size in handwritten code.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJycVU2P2zYQ_TX0ZWBDoj4sH3SIYzgNkKJFErToyRhSI4tdilRJykb21xekvV5vsUm3FQxZ4nxw5r2nIXqvjoaoZdWWVbsFzmGwrv3dkak3m3whbPet_WggDMqDtB2x4h3Ldix7utfZ5Scv7yerOjgcMASnxBzocGC8Ybwx-EAd4xvGN9CnpQ2w9Rb9COmNOwqM8-hRbNl69_Zsxzdnu8s5MN4oEwCvkRcTAIDqYwoEVuxYsYO8eulxrT2mvYWw9Q5Ie3qZKF7H172v5dwenjC8L1NqNEcIbjYPYA0cbSesDjA5282SPISBoLda27MyR8AArM6WvzzGLD9m6Np6KuvqAlpd6sWc8fex5xddCEMXaxatF5_Vp-2WH_hLx4BK3xBKlie32073nncAfR8HxpsP1961Mg-seAes2g4hTD5m5XvG91dwVtYdGd8_Mr737mv98_Ch-oNVO8abt7snTd3v_5M904ncP_BWHsLZgvgWyIMfUWtyUTeCJM5RCXUmDEU2QNpxcuQ9-agkNB1glKAHBEdH5QM5kNoKQe5_MHe9sOvUHUXpvrzxGEt5tn6fOoD_wN6_U_c1zozg0PjeuhFwmrQiD-eBTIJTODRySFhGcJVBDRE826eFE-qZUjumSwsRSXTKWwPSGh_QhBhsbIAlz8oGrINlwSMP3UwQbIqK8w3kgOZIjG9W8DEFzZ76Wb9WizI3ypTQBO4S-T5mT-6JviiCVNOFuRg4OdurgELT6iUKBB5HgglDIGduOAQL3o4EfkLnCfxZBTmADxhoJBN83FOrB0p6J0evSlmFYRYraUfG9w79JMi5b5NifI9unHUcg3uhrWB8L2uerfOqa_peyKLg2Gc5F7XglVzLvmkaXGdZmW8Y35-eg58eD-jGUz0epHW0-sJ48ampsuWnps6jrNUFxc-_8qLKQFgbnB1X8HXAAN7OTkZ-NcGAHnz8nlCDShTKiyIcXY6YJ5A8nqhLYCiZzh3w6pHiPgOa7uxUCGSSYbXo2qLbFBtcUJuvecmrvM6rxdB2a8q7uqlFVYqmykVWFVIKgSVRVfC6XKiWZ7zMGp7nZVlX1SrfdFnfVZJTVRZds2ZlRiMqvdL6NMZ5sVDez9TmWVUVm4VGQdqno5NzQ2dI1njwVLuFa2PQUsxHz8pMKx_8c5qggqb288cv75e_wai8pw7sFNSoPAZlTRxzV0laA_TXjDrpJU6am_gXs9PtD_QQd7v-LSdn_yQZCU01esb31yZOLf87AAD__1ybWmg">