On Wed, 7 Oct 2015, Jan Hubicka wrote:

> > 
> > Did you audit all callers of mem_attrs_eq_p to see if they really
> > only care about that?  After all MEM_EXPR, via access paths, encode
> > type-based alias info and thus replacing one with the other (cse.c use
> > or ifcvt.c use) is only valid if that doesn't break dependences.
> 
> Hmm, expr is used by ao_ref_from_mem and nonoverlapping_memrefs_p.
> The alias set of the access is not taken from expr, but from alias set info
> stored in the memory attribute itself (and it is checked by those to match)

But the alias-set is not everything and yes, via ao_ref_from_mem MEM_EXPR
"leaks" to the tree oracle which happily calls 
nonoverlapping_component_refs_of_decl_p or nonoverlapping_component_refs_p
on it.

> I still think it is an address of the expression that matters, not the value.
> I think operand_equal_p may, for example, consider two different VAR_DECL 
> equivalent
> if their constructors are, because the value is (it doesn't do that), but 
> their
> addresses differ.

It's structural equality of the MEM_EXPR that matters.  That neither
operand_equal_p (..., 0) nor operand_equal_p (..., OEP_ADDRESS_OF) is
an exact implementation for this (well, I think with '0' flags it was
designed to be this, at least for memory references) is of course
suspicious.  But that doesn't make using OEP_ADDRESS_OF the correct thing
to do.

> I will look more into nonoverlapping_memrefs_p and ao_ref_from_mem. The first
> one may need some update to tree-alias infrastructure....

I'd rather remove it completely (at least that was my plan eventually).
rtx_refs_may_alias_p is supposed to handle everything it handles.

Richard.

> Honza
> > 
> > So I don't believe this is safe.
> > 
> > Thanks,
> > Richard.
> > 
> > > Honza
> > > 
> > >   * emit-rtl.c (mem_attrs_eq_p, mem_expr_equal_p): Pass OEP_ADDRESS_OF
> > >   to operand_equal_p.
> > > 
> > > Index: emit-rtl.c
> > > ===================================================================
> > > --- emit-rtl.c    (revision 228131)
> > > +++ emit-rtl.c    (working copy)
> > > @@ -334,7 +334,7 @@ mem_attrs_eq_p (const struct mem_attrs *
> > >     && p->addrspace == q->addrspace
> > >     && (p->expr == q->expr
> > >         || (p->expr != NULL_TREE && q->expr != NULL_TREE
> > > -           && operand_equal_p (p->expr, q->expr, 0))));
> > > +           && operand_equal_p (p->expr, q->expr, OEP_ADDRESS_OF))));
> > >  }
> > >  
> > >  /* Set MEM's memory attributes so that they are the same as ATTRS.  */
> > > @@ -1657,7 +1657,7 @@ mem_expr_equal_p (const_tree expr1, cons
> > >    if (TREE_CODE (expr1) != TREE_CODE (expr2))
> > >      return 0;
> > >  
> > > -  return operand_equal_p (expr1, expr2, 0);
> > > +  return operand_equal_p (expr1, expr2, OEP_ADDRESS_OF);
> > >  }
> > >  
> > >  /* Return OFFSET if XEXP (MEM, 0) - OFFSET is known to be ALIGN
> > > 
> > > 
> > 
> > -- 
> > Richard Biener <rguent...@suse.de>
> > SUSE LINUX GmbH, GF: Felix Imendoerffer, Jane Smithard, Graham Norton, HRB 
> > 21284 (AG Nuernberg)
> 
> 

-- 
Richard Biener <rguent...@suse.de>
SUSE LINUX GmbH, GF: Felix Imendoerffer, Jane Smithard, Graham Norton, HRB 
21284 (AG Nuernberg)

Reply via email to