More fun with aliasing - removing assignments?

Daniel Jacobowitz drow@false.org
Tue Aug 2 13:40:00 GMT 2005


On Tue, Aug 02, 2005 at 09:08:51AM -0400, Diego Novillo wrote:
> On Tue, Aug 02, 2005 at 02:56:50PM +0200, Richard Guenther wrote:
> > Oh, and a workaround and slight correction would be to write
> > 
> >     void nconc (unsigned x, unsigned y) {
> >          unsigned *ptr = &((cons *)x)->cdr;
> >          while(!(*ptr & 3))
> >              ptr = &((cons *)(*ptr))->cdr;
> >          *ptr = y;
> >      }
> > 
> No.  Same problem.  The aliaser would say "yes, ptr points
> anywhere, but it cannot escape the local frame".  The final store
> is dead just the same.
> 
> We only "get it right" because we do not distinguish between
> different degrees of points-anywhere.

Then the alias analyzer's broken.  This isn't pointer arithmetic in the
sense that you mean.  It would be if the line were:

             ptr = &((cons *)(ptr))->cdr;

which is equivalent to some offset plus ptr.  But there's an extra
dereference:

             ptr = &((cons *)(*ptr))->cdr;
                              ^

As far as I can tell, this code doesn't actually violate any of the
aliasing rules.  It just looks funny.

-- 
Daniel Jacobowitz
CodeSourcery, LLC



More information about the Gcc-help mailing list