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
