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)