https://gcc.gnu.org/bugzilla/show_bug.cgi?id=114086
--- Comment #5 from Jan Schultke <janschultke at googlemail dot com> ---
Well, it's not quite equivalent to either of the bit-shifts we've posted. To
account for shifting more than the operand size, it would be:
bool foo (int x)
{
return x > 6 ? 0 : ((85 >> x) & 1);
}
This is exactly what GCC does and the branch can be explained by this range
check.
So I guess GCC already does optimize this to a bit-vector, it just doesn't find
the optimization to:
bool foo(int x)
{
return (x & -7) == 0;
}
This is very specific to this particular switch statement though. You could do
better than having a branch if the hardware supported a saturating shift, but
probably not on x86_64.
Nevermind that; if anything, this isn't middle-end.