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

--- Comment #9 from Paolo Bonzini <bonzini at gnu dot org> 2012-04-25 20:00:57 
UTC ---
The handling of this code sequence in fold-const changed back and forth many
times, and this is likely the reason why GCC 4.1 produced straight-line code
while GCC 4.3 produced branchy code.

I think the best fix is to add support for expanding "x != 0" using the cntlzw
trick---either in the cstore expander or in emit_store_flag.

In fact, emit_store_flag already has code for a similar trick:

      /* For EQ or NE, one way to do the comparison is to apply an operation
         that converts the operand into a positive number if it is nonzero
         or zero if it was originally zero.  Then, for EQ, we subtract 1 and
         for NE we negate.  This puts the result in the sign bit.  Then we
         normalize with a shift, if needed.

         Two operations that can do the above actions are ABS and FFS, so try
         them.  If that doesn't work, and MODE is smaller than a full word,
         we can use zero-extension to the wider mode (an unsigned conversion)
         as the operation.  */

So another thing to do is to investigate why this doesn't work.

Reply via email to