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

    <tr>
        <th>Summary</th>
        <td>
            [clang] Missed optimization for isalnum implementation
        </td>
    </tr>

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

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

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

<pre>
    Given the following source code:

```cpp
bool isalnum_if(char c)
{
    if ((c >= '0' && c <= '9') || (c >= 'a' && c <= 'z') ||
        (c >= 'A' && c <= 'Z'))
    {
        return true;
    }

    return false;
}

bool isalnum_if_one_line(char c)
{
    return (c >= '0' && c <= '9') || (c >= 'a' && c <= 'z') ||
              (c >= 'A' && c <= 'Z');
}

bool isalnum_bl(char c)
{
    return (c >= '0' && c <= '9') | (c >= 'a' && c <= 'z') |
              (c >= 'A' && c <= 'Z');
}
```

compiling with `-O3` produces the following assembly:
```asm
isalnum_if(char):                        # @isalnum_if(char)
        lea     eax, [rdi - 48]
        cmp     al, 10
        setb    cl
        and     dil, -33
        add     dil, -65
        cmp     dil, 26
        setb    al
        or      al, cl
        ret
isalnum_if_one_line(char):               # @isalnum_if_one_line(char)
        lea     ecx, [rdi - 48]
        mov     al, 1
        cmp     cl, 10
        jb      .LBB1_3
        lea     ecx, [rdi - 97]
        cmp     cl, 26
        jb      .LBB1_3
        add     dil, -65
        cmp     dil, 26
        setb    al
.LBB1_3:
        ret
isalnum_bl(char):                        # @isalnum_bl(char)
        lea     eax, [rdi - 48]
        cmp     al, 10
        setb    cl
        and     dil, -33
        add     dil, -65
        cmp     dil, 26
        setb    al
        or      al, cl
        ret
```

I would expect all there versions to compile to the branch-less version. But the second function is actually not branch-less, although it could.
GCC on the other hand does exactly that.

[godbolt link](https://godbolt.org/z/d33183nbh)
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJztVs1vmzAU_2vI5SkRYBKSA4d8rNWkVTvstktkjAnuDEbYJG3_-j1DsgCla1et2mXI2Njv-2e_Z2KVPEa34sgLMBmHVEmpTqI4gFZ1xTgwlXCHrB1357iXfuG2jZVluxIrJUFoKos634vU8ZcsoxUwx1-dRcJN-wH4iBSQwzKBQz45ZIfT0MUXxwU2sOvb8_oKX1QDTrjFBgMp-oLUU0_qato-AxXrF1R8b1X8CqER7YZhn4qbukLkqhpB2nQZd13EOqwplfrKO-Ab4LhXBd9LUfBXAD2r_meIvgvXt0AQy4-K_D1hf0TMl1TqQsBUXgppc_AkTAZInX4l2ENZqaRmXA8ylWrN81g-XtP0opXqvF15lpuNN4NgumERcAJ3VKqHguS0GTl9cHwEdb6pEgFTCJbOfNdnZXnZjFRaTs_tUzU3ccMl--u0SJoxEY3YlJABPenTF_Nxq2c6bs2oWTowqyroODt0Ck_dENZhqo7i-wzWMalxfNmr-Obq2MV3HAY2Cv593I6zL5uNtydvc2EVvrjFbBTr31r5y_t4sUHWr-zcrwrzRwnRk_qfEFdYR-vZZzipWibAH0rODKqQtoBVHI680kIVWM8UtEWP209b3eKKFiybSq71hW0Gm9o0RM2ZQhjSumAGCXhdAGWmRsWPUCjTFbbeUmkyVR8yEAbNoCez1q_b7RZU-9ujrEOQWXAThQWWP6BC1GYyama9f5_55qCSWEkDmLc_7Kb6y8yYUtuz5t9gO9NnqjrgDC-Qm4QQb0mKOMPjMkkikqzIik6MMJJHqJBJWhxQE9wJrOQJqNKIXDzRJrYUkT8fOxB5KXnOC9OQJnUlo4FpvC_qeIZY4kTK42WY4s1xj9jjFE3UHGG5mQeLpTvJIi9x52Hq0dD3fcaDBeUBY-kycINFwJfEnUgac6mto47vF_wEjQr8RpcnIvJd33cxQC_EjsyCeDFPQ4-7hLmhlywwa3hOhZxZPywmkypqXIrrg0aiFNroKxHvMnEoeIOL1U9r3LsqWt99871JYzhqHP8JBYy-kQ">