https://gcc.gnu.org/bugzilla/show_bug.cgi?id=118120

--- Comment #9 from anlauf at gcc dot gnu.org ---
(In reply to kargls from comment #8)
> (In reply to anlauf from comment #7)
> > The following patch works and might be a reasonable compromise:
> > 
> > diff --git a/gcc/fortran/trans-array.cc b/gcc/fortran/trans-array.cc
> > index 82a2ae1f747..985a26281ad 100644
> > --- a/gcc/fortran/trans-array.cc
> > +++ b/gcc/fortran/trans-array.cc
> > @@ -5345,7 +5345,10 @@ symbols_could_alias (gfc_symbol *lsym, gfc_symbol
> > *rsym, bool lsym_pointer,
> >                      bool lsym_target, bool rsym_pointer, bool rsym_target)
> >  {
> >    /* Aliasing isn't possible if the symbols have different base types.  */
> > -  if (gfc_compare_types (&lsym->ts, &rsym->ts) == 0)
> > +  if (!gfc_compare_types (&lsym->ts, &rsym->ts)
> > +      && !(((lsym->ts.type == BT_COMPLEX && rsym->ts.type == BT_REAL)
> > +          || (lsym->ts.type == BT_REAL && rsym->ts.type == BT_COMPLEX))
> > +          && lsym->ts.kind == rsym->ts.kind))
> >      return 0;
> >  
> >    /* Pointers can point to other pointers and target objects.  */
> 
> I think it is more complicated in that this involves pointers, which
> have an aliasing issue (due to bounds remapping).  In an ordinary assignment
> one has 'var = expr', and in Slava example that is exactly what we have
> where 'result' and 'temp' are pointers into parts of 'data%re'.  But, 
> 'data%re' could have been any type compatible entity.  The big hammer,
> until the mythical someone shows up, is
> 
> diff --git a/gcc/fortran/trans-array.cc b/gcc/fortran/trans-array.cc
> index 82a2ae1f747..abebf327621 100644
> --- a/gcc/fortran/trans-array.cc
> +++ b/gcc/fortran/trans-array.cc
> @@ -5503,6 +5503,20 @@ gfc_conv_resolve_dependencies (gfc_loopinfo * loop,
> gfc_ss * dest,
>    loop->temp_ss = NULL;
>    dest_expr = dest->info->expr;
>  
> +  /* Before falling into dependency checking of the scalarization, 
> +     check to see if the left-hand variable is an array pointer.  If
> +     it is, simply generate an array temporary for the assignment.
> +     TODO: walk the right-hand-side of 'var = expr' to actually check
> +     for a dependency.  See 118120.  */
> +  if (dest_expr->symtree && dest_expr->symtree->n.sym
> +      && dest_expr->symtree->n.sym->attr.pointer
> +      && dest_expr->symtree->n.sym->attr.dummy
> +      && dest_expr->symtree->n.sym->attr.dimension)
> +    {
> +      nDepend = 1;
> +      goto temporary;
> +    }
> +
>    for (ss = rss; ss != gfc_ss_terminator; ss = ss->next)
>      {
>        ss_info = ss->info;

I doubt that this is a good solution.

It is completely irrelevant that "result" is a dummy.  Just try it.
And creating a temporary for *every lhs pointer* cannot be acceptable.
There must be something more "lightweight".

Reply via email to