https://gcc.gnu.org/bugzilla/show_bug.cgi?id=64309
Bug ID: 64309
Summary: if (1 & (1 << n)) not simplified to if (n == 0)
Product: gcc
Version: 5.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: rtl-optimization
Assignee: unassigned at gcc dot gnu.org
Reporter: olegendo at gcc dot gnu.org
Target: sh*-*-*
The SH specific test case gcc/testsuite/gcc.target/sh/pr51244-8.c has been
failing for a while now. Originally I've added some combine patterns to handle
the special case
if (1 & (1 << n)) -> if (n == 0)
I could fix this by modifying the SH combine patterns so that they match again.
However, it would fail to handle all the other cases such as
if ((1 << 1) & (1 << n)) -> if (n == 1)
if ((1 << 2) & (1 << n)) -> if (n == 2)
if ((3 << 0) & (3 << n)) -> if (n == 0)
etc
I think it should be handled in a target independent way either at the tree
level or by combine, but I'm not sure what is easier/makes more sense.
Taking it a bit further...
On SH it's better to avoid dynamic shifts (e.g. on SH2 dynamic shifts are
library calls). Thus, in cases of something like
int test (int n)
{
return ((1 << 1) & (1 << n));
}
it's often better to do a comparison and a cstore instead. Here again, I could
add SH specific patterns, but maybe it makes more sense to do it in a target
independent way at tree level or in combine. RTX costs can/should be used to
check whether a 'shift,and' is more expensive than a 'cmp,cstore'.