This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

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.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]