> > + bool in_symtab1 = decl_in_symtab_p (base1);
> > + bool in_symtab2 = decl_in_symtab_p (base2);
> > +
> > + /* Declarations of non-automatic variables may have aliases. All other
> > + decls are unique. */
> > + if (in_symtab1 != in_symtab2 || !in_symtab1)
> > + return 0;
> > + ret = symtab_node::get_create (base1)->equal_address_to
> > + (symtab_node::get_create (base2), true);
>
> And I don't like ::get_create too much, why's ::get not enough here?
> Predicates really shouldn't end up changing global state.
I will re-test with ::get here. I think I only copied the code from folding.
One case we can get decls w/o corresponding symbol table entries during late
compilation is when we introduce a new builtin call. We may just revisit
all those place and be sure we inser that to symbol table, but that is for next
stage1.
>
> please refactor to avoid doing this twice WRT !x_decl / !y_decl
>
> Ok with these changes.
Thanks!
I think I also need to update IPA-PTA code to work on alias targets same way as
I did for ipa-reference (need to construct a testcase) and we sould be down to
missed optimizations and not wrongcodes with extra aliases
(GVN/CSE/operand_equal_p should know about aliases to make them completely
no-op)
Honza
>
> Thanks,
> Richard.
>
> > + /* If decls are different or we know by offsets that there is no
> > overlap,
> > + we win. */
> > + if (!cmp || !offset_overlap_p (c, xsize, ysize))
> > + return 0;
> > + /* Decls may or may not be different and offsets overlap....*/
> > + return -1;
> > + }
> > + else if (rtx_equal_for_memref_p (x, y))
> > {
> > return offset_overlap_p (c, xsize, ysize);
> > }
> >
> > /* This code used to check for conflicts involving stack references and
> > globals but the base address alias code now handles these cases. */
> >
> > @@ -2636,7 +2703,7 @@ nonoverlapping_memrefs_p (const_rtx x, c
> > are constants or if one is a constant and the other a pointer into the
> > stack frame. Otherwise a different base means we can't tell if they
> > overlap or not. */
> > - if (! rtx_equal_p (basex, basey))
> > + if (! compare_base_decls (exprx, expry))
> > return ((CONSTANT_P (basex) && CONSTANT_P (basey))
> > || (CONSTANT_P (basex) && REG_P (basey)
> > && REGNO_PTR_FRAME_P (REGNO (basey)))
> > @@ -2647,6 +2714,10 @@ nonoverlapping_memrefs_p (const_rtx x, c
> > if (loop_invariant)
> > return 0;
> >
> > + /* Offset based disambiguation is OK even if we do not know that the
> > + declarations are necessarily different
> > + (i.e. compare_base_decls (exprx, expry) == 2) */
> > +
> > sizex = (!MEM_P (rtlx) ? (int) GET_MODE_SIZE (GET_MODE (rtlx))
> > : MEM_SIZE_KNOWN_P (rtlx) ? MEM_SIZE (rtlx)
> > : -1);
> > Index: alias.h
> > ===================================================================
> > --- alias.h (revision 231438)
> > +++ alias.h (working copy)
> > @@ -36,6 +36,7 @@ extern int nonoverlapping_memrefs_p (con
> > extern void dump_alias_stats_in_alias_c (FILE *s);
> > tree reference_alias_ptr_type (tree);
> > bool alias_ptr_types_compatible_p (tree, tree);
> > +int compare_base_decls (tree, tree);
> >
> > /* This alias set can be used to force a memory to conflict with all
> > other memories, creating a barrier across which no memory reference
> >
> >
>
> --
> Richard Biener <[email protected]>
> SUSE LINUX GmbH, GF: Felix Imendoerffer, Jane Smithard, Graham Norton, HRB
> 21284 (AG Nuernberg)