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.