<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">