https://gcc.gnu.org/bugzilla/show_bug.cgi?id=83832
--- Comment #1 from Oleg Endo <olegendo at gcc dot gnu.org> ---
Another bit test case I ran into (on GCC 8) is something like
unsigned int bleh = (i & 4) == 0 ? 0 : 3;
An optimized result would be something like
tst #4,r1
stz #0,r14
stnz #3,r14
This would take 3 cycles to execute, which is minimal. The same can be done
with a smaller code size:
mov.l #0,r14
tst #4,r1
stnz #3,r14
It seems it kind of works for some cases, but not for all the cases. For
example, inverting the condition in the above example:
unsigned int bleh = (i & 4) != 0 ? 0 : 3;
results in:
66 4e mov.l #4, r14
53 2e and r2, r14
66 3e mov.l #3, r14
fd 74 fe 00 stnz #0, r14
But then swapping the constants to
unsigned int bleh = (i & 4) != 0 ? 3 : 0;
again falls back to cbranch code:
66 4e mov.l #4, r14
53 2e and r2, r14
14 beq.s 0f
66 3e mov.l #3, r14
03 nop
0: