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

    <tr>
        <th>Summary</th>
        <td>
            "Number is within interval" missed optimization when number is from a smaller int type
        </td>
    </tr>

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

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

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

<pre>
    ```c
#include <stdbool.h>
#include <stdint.h>
bool func1(uint8_t x) {
    uint32_t value = x;
    if (value < 0xC2 || value > 0xF4) {
        return false;
    }
 return true;
}

bool func1b(uint8_t x) {
    uint32_t value = x;
    __asm__("" : "+r" (value));
    if (value < 0xC2 || value > 0xF4) {
        return false;
    }
    return true;
}

bool func2(uint8_t x) {
    uint32_t value = x;
 if ((uint8_t)value < 0xC2 || (uint8_t)value > 0xF4) {
        return false;
    }
    return true;
}
```

For x86-64, the expected result is `func1` transformed to `func2`.

For ARM and RISC-V targets, the expected result is both `func1` and `func2` transformed to `func1b`.

When I [reported this missed optimization to GCC](https://gcc.gnu.org/bugzilla/show_bug.cgi?id=115674), I found out Clang's optimization isn't perfect either. While Clang does optimize the code for x86, such optimization can produce worse code (having a redundant bitwise AND instruction) for ARM and RISC-V.

For example, RISC-V (64-bit) clang 18.1.0 with `-Os` option produces:

```text
func1:
    addi a0, a0, 62
    andi    a0, a0, 255
    sltiu   a0, a0, 51
 ret
func1b:
    addiw   a0, a0, -194
    sltiu   a0, a0, 51
 ret
func2:
    addi    a0, a0, 62
    andi    a0, a0, 255
 sltiu   a0, a0, 51
    ret
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJy8VUuP4jgQ_jXFpQRKKu9DDt3QrPqws9KstHNETmyIV46N_GiY-fUrExpoumc02tEuisijqr7PX1W5zJyTOy1EC8UjFKsZC34wtn067pWxwibNrDP8awtlMl09JCtIHoAyqXsVuEDIls7zzhi1GCB7-o5dan9jjt64DbpPgeogta83Ho9ADUL1OLkgIkZLRhuPL0yFiLTCI2Q3DnKLQPWrdYnJcUkI1RKq5SXmCZPjOn-HHX9W-GA1bply4g0uVKvzy9nF23D1uFjvxXS_pmazYW7cbIBqIAIihOwBT4-P9vR6lgrUxOv_TcTV66dyQb-QiknMFQCo-VjZhy7_sczXjXCrem0sHutyXuZAS_SDQHHci94Ljla4oDxKh1AmU8eXCXrLtNsaOwqO3ryaCMpkcY_78Pl3ZJrj5-c_l_O_0DO7E979gKczfnhDFqNvGL5Dnnb37F8GofEZoXi0Ym9sZPGDdDhK5wRHs_dylN-Yl0ZHnN-WSyhWQPXg_d5B9gC0Blrv-n6x02Fh7A5o3YXdN6kUA1q7wRw2Xdgt-p2EbC05ZKs0LcoqP_X3Ep9xa4LmaILHpWJ6B1S5t7TSaaDK417Yreg9CukHYRf4ZZBKTEHIjbhEiVPSesMFbqeaRSIX-uEtbs807q3hoRd4MNadY6I49iL1DhlawYPmTHvspD9IJ_Dh0wqldt6GPoLEDty-K-C7-oojG_dKxHWcSwxUl_m8k7GpsT9pSOtFukjwIKfSzv9wsZBxyeay0FPKb8AvnerF0U-fppZ4dYu9zjiXyJLIPv2XdGPUXJ7uN3YqiquDU16GO4civU7OG9buHe3hLnCeNvm_gab3gu7ifl7TD1mn0XCX3BlvM95kDZuJNq3SJq_yPMlmQ1uxuuZ5xgVP0y1VTZPXXUoFpU1R9ELQTLaUUJ6UVCVVXubZoiFqsqYoWVXXdZo2kCdiZFItlHoZ4_6ZSeeCaJuyLtOZYp1Q7nRsE2lxwJMxnhbFambbGDPvws5BnijpvLuieOmVaIHoUxg7YePMiI0lNUrthX1hKh42H-3yQ5wI-hK1tWZEhm5kSsUv2qP_uhezYFV7NwSkH0K36M0ItI4LOd_me2v-Fr0HWp-W74DWk7yXlv4JAAD__zs_dc4">