This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [RFC] Enable saliasing for structs with arrays
On Thu, 21 Jul 2005, Zdenek Dvorak wrote:
> Hello,
>
> > > this does not suck, this is plain wrong. TMR_SYMBOL has absolutely
> > > nothing to do with alias analysis. The only place from where alias
> > > information for TARGET_MEM_REFs can be taken is TMR_TAG; and
> > > unfortunately the way alias information for subvars is represented
> > > is more or less incompatible with the way alias info is represented
> > > for all other types of memory references, which makes it hard to adapt.
> >
> > Ok, here's what I have now - it miscompiles stage2 though, testing with
> > the stage1 compiler is in progress. Maybe you can see something
> > obviously wrong with my approach.
>
> > static tree
> > ! get_ref_tag (tree ref_)
> > {
> > ! tree var = get_base_address (ref_);
> > ! unsigned HOST_WIDE_INT offset, size;
> > ! tree ref = okay_component_ref_for_subvars (ref_, &offset, &size);
> > tree tag;
> >
> > + if (ref)
> > + {
> > + subvar_t svars = get_subvars_for_var (ref);
> > + subvar_t sv;
> > + for (sv = svars; sv; sv = sv->next)
> > + {
> > + bool exact;
> > + if (overlap_subvar (offset, size, sv, &exact)
> > + && exact)
> > + return sv->var;
> > + }
> > + }
>
> it may happen that more than one subvar must be taken into account here.
> The code as it is here might be more or less OK, because you check
> exact, but I am not really sure about it -- is this correct with unions?
> But in any case you may happen to lose alias info here, which I do not
> want to happen.
For unions we don't create subvars, as is, I'm looking for an exact
match, and else fall back to using the VAR_DECL var. In practice
(all the cases I had to debug), we never get an exact match, as
offset, size are 0, -1 all (most of?) the time (i.e. alias every subvar)
> > if (!var)
> > return NULL_TREE;
> >
> > *************** rewrite_use (struct ivopts_data *data,
> > *** 5745,5750 ****
> > --- 5760,5766 ----
> > gcc_unreachable ();
> > }
> > update_stmt (use->stmt);
> > + mark_new_vars_to_rename (use->stmt);
> > }
>
> This should not be necessary with the correct approach -- the alias info
> should be completely preserved, thus the virtual operands of the
> statement should not change at all.
It's necessary because of the below change.
> > Index: tree-ssa-operands.c
> > ===================================================================
> > RCS file: /cvs/gcc/gcc/gcc/tree-ssa-operands.c,v
> > retrieving revision 2.97
> > diff -c -3 -p -r2.97 tree-ssa-operands.c
> > *** tree-ssa-operands.c 20 Jul 2005 01:18:26 -0000 2.97
> > --- tree-ssa-operands.c 21 Jul 2005 12:24:35 -0000
> > *************** get_tmr_operands (tree stmt, tree expr,
> > *** 1698,1704 ****
> > }
> >
> > if (tag)
> > ! add_stmt_operand (&tag, stmt_ann (stmt), flags);
> > else
> > /* Something weird, so ensure that we will be careful. */
> > stmt_ann (stmt)->has_volatile_ops = true;
> > --- 1698,1709 ----
> > }
> >
> > if (tag)
> > ! {
> > ! if (TREE_CODE (tag) == SSA_NAME)
> > ! add_stmt_operand (&tag, stmt_ann (stmt), flags);
> > ! else
> > ! get_expr_operands (stmt, &tag, flags);
> > ! }
> > else
> > /* Something weird, so ensure that we will be careful. */
> > stmt_ann (stmt)->has_volatile_ops = true;
>
> Why is this change necessary? And, how it can happen that TMR_TAG is an
> SSA name?
We need to call get_expr_operands on the tag, if it is a VAR_DECL
(I reversed the condition - maybe I goofed and should just use != VAR_DECL
here). This is because get_expr_operands takes care inserting all subvars
here, if necessary. Maybe we can do this unconditionally - but I do
understand too little about all the interworkings, so I'm just trying.
Richard.