http://gcc.gnu.org/bugzilla/show_bug.cgi?id=55181



Steven Bosscher <steven at gcc dot gnu.org> changed:



           What    |Removed                     |Added

----------------------------------------------------------------------------

             Target|avr                         |

                 CC|                            |steven at gcc dot gnu.org



--- Comment #5 from Steven Bosscher <steven at gcc dot gnu.org> 2013-03-05 
23:45:38 UTC ---

At trunk r196410, the .164t.optimized dump looks like this:



lfsr (long unsigned int number)

{

  unsigned char b;

  long unsigned int _4;

  long unsigned int _5;

  _Bool _8;



  <bb 2>:

  _4 = number_3(D) & 536870912;

  _8 = _4 != 0;

  b_10 = (unsigned char) _8;

  _5 = number_3(D) & 8192;

  if (_5 != 0)

    goto <bb 3>;

  else

    goto <bb 4>;



  <bb 3>:

  b_6 = b_10 + 1;



  <bb 4>:

  # b_2 = PHI <b_10(2), b_6(3)>

  return b_2;



}



and exact_log2 could be used to identify the and-instruction as

a bit test instruction:

(gdb) p exact_log2(536870912)

$1 = 29

(gdb) 



AFAIK there are no named patterns for bit tests, perhaps there should be.

(http://gcc.gnu.org/onlinedocs/gccint/Standard-Names.html#Standard-Names)



So at least on x86_64 the test gets expanded as a shift:



    6: {r65:DI=r64:DI 0>>0x1d;clobber flags:CC;}

    7: {r59:QI=r65:DI#0&0x1;clobber flags:CC;}

    8: {r66:DI=r64:DI&0x2000;clobber flags:CC;}

    9: flags:CCZ=cmp(r66:DI,0)



i.e. also far from optimal.

Reply via email to