On Tue, May 10, 2016 at 11:14:35AM +0200, Richard Biener wrote: > On Mon, May 9, 2016 at 3:36 PM, Marc Glisse <marc.gli...@inria.fr> wrote: > > 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. > > Actually VRP only tracks value-ranges, CCP tracks may/must be non-zero bits > but does not have a conditional lattice.
Does it track known *one* bits too? Because the AND doesn't get eliminated here either: in = in | 3; in = in ^ 1; in = (in & ~(unsigned long)1); Ciao Dominik ^_^ ^_^ -- Dominik Vogt IBM Germany