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'.

Reply via email to