On Thu, 8 Oct 2015, Jan Hubicka wrote:

> > 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.
> 
> Hmm, I see.  I wonder how complex the expressions are and if we can't simply
> compare AO properties of MEM_REF at toplevel and then dispatch to
> operand_equal_p (..., OEP_ADDRESS_OF)
> which would make more sense to me.

I can't see how we can do that comparison conservatively without resorting
to exact equality.  The reason is that the two MEM_EXPRs e1 and e2 have
to behave equal TBAA-wise when compared against arbitrary e3.  We
can be sure this is the case if e1 and e2 have alias-set zero or if
they are structurally equivalent.  But that's all I think.

> I would basically expect decls and mem_refs here.  Reason why I started 
> to look into that is that I added sanity check that operand_equal_p 
> (...,0) is not called on things that do not have value (function types 
> and incomplete types) and this is one of places that fires.

MEM_EXPR can be arbitrarily complex (including array-refs with
variable index SSA name use for example).

> > 
> > > 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.
> 
> Yep, that was my feeling from looking into that yesterday....

So the experiment to carry out is (same for all other callers)

Index: gcc/alias.c
===================================================================
--- gcc/alias.c (revision 228597)
+++ gcc/alias.c (working copy)
@@ -2710,10 +2710,10 @@ true_dependence_1 (const_rtx mem, machin
   if (mems_in_disjoint_alias_sets_p (x, mem))
     return 0;
 
-  if (nonoverlapping_memrefs_p (mem, x, false))
-    return 0;
-
-  return rtx_refs_may_alias_p (x, mem, true);
+  int tem = rtx_refs_may_alias_p (x, mem, true);
+  if (tem)
+    gcc_assert (!nonoverlapping_memrefs_p (mem, x, false));
+  return tem;
 }
 
 /* True dependence: X is read after store in MEM takes place.  */

and analyze what fires (or hope nothing does).

Richard.

> Honza
> 
> 

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

Reply via email to