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