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

    <tr>
        <th>Summary</th>
        <td>
            Missed optimization: while (len > 1) len -= 2;
        </td>
    </tr>

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

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

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

<pre>
    ```c
unsigned foo(char* buf, unsigned len)
{
        while (len > 1)
                len -= 2;
        if (len)
                *buf = 42;
        return len;
}
unsigned bar(char* buf, unsigned len)
{
        len %= 2;
        if (len)
                *buf = 42;
        return len;
}
```
-O2

Result:
```asm
foo(char*, unsigned int):
        mov eax, esi
        cmp     esi, 1
        mov     ecx, esi
        adc ecx, -1
        inc     ecx
        and     ecx, -2
        sub     eax, ecx
        je      .LBB0_2
        mov     byte ptr [rdi], 42
.LBB0_2:
 ret

bar(char*, unsigned int):
        mov     eax, esi
        and eax, 1
        je      .LBB1_2
        mov     byte ptr [rdi], 42
.LBB1_2:
        ret
```
Expected: Same for both

Reduced from an implementation of [this idea](https://github.com/llvm/llvm-project/blob/main/libcxx/include/__charconv/tables.h#L143).

All three major compilers get confused by that code. https://godbolt.org/z/1W1hroc67
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJyslE-PozgQxT9NcbESmYKQcOBApofTrFbaPeyxZewiuGXsyDY93fPpVyZ_hox6pe3VoiiW_F65fjxjixD0yRI1sDvC7ikTcxydb1ojhXdZ79R7AxW__CTwdraLX7HBOcCDHIUHbFk_D4Bf2F01ZAFr4C3sj-mf199HbYgBHgxZBsVXll8NvAZep8kNFE8MobgW6OHqXvsA234eWHKWP62e4uzt0vQytX9ao_aJ8ROoCyHu_mece4zA283vuFjbPyjMJkLRrg0iTMDbh4AfiLWNCWIpYtdncq-MxFvyUdArQU7nZUyz-IXlv9QskvygTih5EzbrIm3lvWjltmq91AZXWpj7i3bFeyh8ocu4_XY88mf8gK5_j8TO0TPYHb3SsHtKq5TJeiu6JOEpXkJ92O9_ldwa7zEFq25C_g_U-X-hzu_U1-cKv_pGvr6dSUZSULTsTzERG5xnvYvj7ctRs0zn0LuJCcv0dDY0kY0iameZG1LnOOrAtCKx9D-MMZ5D6osdYHfScZz7rXQTYGfM623YnL17IRkBu964HrCbhLZJ1L18ewPstJVmVgTYPT-nmKWzr4BdFL2hsB0Bi295WQDW2wtrawyLoydik3hxnkk3nbUhH9iJIpPODnNI5_SdxVGkCUVb9gusU70zcev8CbD7Adjlf-Wjd7LaZ6opVF3UIqMm3xcV8pJXdTY2VMma8-GQF3m9V3RQIq9K3peEtarzush0gxx3POcV4q7EeluIYS_qfVUTHkjJCkpOk9Bmm3JJvTMdwkxNjvlhV2RG9GTCcnUiWvrOFhUQ003qmyXMfj4FKLnRIYafy0QdDTW_6ZDe252jnvSPZePSbn94VbKHKzKbvWk-vZ0LXkjZXfhfG_w7AAD__wXGsBs">