https://gcc.gnu.org/bugzilla/show_bug.cgi?id=87104
--- Comment #5 from Andrew Pinski <pinskia at gcc dot gnu.org> ---
(In reply to eggert from comment #3)
> (In reply to Andrew Pinski from comment #2)
> > This seems like a target issue ...
>
> Although the code generated is target-dependent, the performance problem is
> not limited to x86-64. x86 has the same problem, and I suspect other
> platforms do too. I'll attach the x86 assembler code, where 'f' has one more
> insn than 'g' does even though the two functions have identical behavior.
x86 and x86_64 uses the same back-end so yes it does seem target secific.
AARCH64 produces:
f:
and x2, x0, 7
and w1, w0, 1
cmp x2, 6
csel w0, w0, w1, ne
ret
.size f, .-f
.align 2
.p2align 3,,7
.global g
.type g, %function
g:
sub x2, x0, #6
and w1, w0, 1
tst x2, 7
csel w0, w0, w1, ne
ret
.size g, .-g
Both are similar in terms of performance.