On Mon, 9 May 2016, Dominik Vogt wrote:

This turns out to be quite difficult.  A small test function
effectively just returns the argument:

 unsigned long bar (unsigned long in)
 {
   if ((in & 1) == 0)
     in = (in & ~(unsigned long)1);

   return in;
 }

However, Gcc does not notice that the AND is a no-op.  As far as I
understand, zero bit tracking is only done in "combine", so when
folding the assignment statement the information that the lowest
bit is zero is not available and therefore the no-op is not
detected?

VRP is also supposed to track bits that may/must be non-zero. It may be possible to enhance it to handle this case.

--
Marc Glisse

Reply via email to