Prevent aliasing between arguments in calls to move_alloc
Steve Kargl
sgk@troutmask.apl.washington.edu
Tue Nov 8 19:44:00 GMT 2016
Yes. I saw Ian's analysis in c.l.f. It seems we both got
caught out on this one. The patch looks fine.
--
steve
On Tue, Nov 08, 2016 at 08:26:37PM +0100, Paul Richard Thomas wrote:
> Hi Steve,
>
> I moved too quickly and caused a regression. See the link in the
> testcase. The attached fixes the problem and bootstraps/regtests.
>
> OK for trunk?
>
> Paul
>
>
> On 5 November 2016 at 16:17, Steve Kargl
> <sgk@troutmask.apl.washington.edu> wrote:
> > On Sat, Nov 05, 2016 at 10:05:30AM +0100, Paul Richard Thomas wrote:
> >>
> >> Bootstraps and regtests on FC21/x86_64 - OK for trunk?
> >
> > OK with minor nit (see below).
> >
> >>
> >> + /* F2003 12.4.1.7 */
> >> + if (to->expr_type == EXPR_VARIABLE && from->expr_type ==EXPR_VARIABLE
> >
> > Need a space after ==.
> >
> > --
> > Steve
>
>
>
> --
> The difference between genius and stupidity is; genius has its limits.
>
> Albert Einstein
> Index: gcc/fortran/check.c
> ===================================================================
> *** gcc/fortran/check.c (revision 241872)
> --- gcc/fortran/check.c (working copy)
> *************** gfc_check_move_alloc (gfc_expr *from, gf
> *** 3343,3355 ****
> }
>
> /* F2003 12.4.1.7 */
> ! if (to->expr_type == EXPR_VARIABLE && from->expr_type ==EXPR_VARIABLE
> && !strcmp (to->symtree->n.sym->name, from->symtree->n.sym->name))
> {
> ! gfc_error ("The FROM and TO arguments at %L are either the same object "
> ! "or subobjects thereof and so violate aliasing restrictions "
> ! "(F2003 12.4.1.7)", &to->where);
> ! return false;
> }
>
> /* CLASS arguments: Make sure the vtab of from is present. */
> --- 3343,3380 ----
> }
>
> /* F2003 12.4.1.7 */
> ! if (to->expr_type == EXPR_VARIABLE && from->expr_type == EXPR_VARIABLE
> && !strcmp (to->symtree->n.sym->name, from->symtree->n.sym->name))
> {
> ! gfc_ref *to_ref, *from_ref;
> ! to_ref = to->ref;
> ! from_ref = from->ref;
> ! bool aliasing = true;
> !
> ! for (; from_ref && to_ref;
> ! from_ref = from_ref->next, to_ref = to_ref->next)
> ! {
> ! if (to_ref->type != from->ref->type)
> ! aliasing = false;
> ! else if (to_ref->type == REF_ARRAY
> ! && to_ref->u.ar.type != AR_FULL
> ! && from_ref->u.ar.type != AR_FULL)
> ! /* Play safe; assume sections and elements are different. */
> ! aliasing = false;
> ! else if (to_ref->type == REF_COMPONENT
> ! && to_ref->u.c.component != from_ref->u.c.component)
> ! aliasing = false;
> !
> ! if (!aliasing)
> ! break;
> ! }
> !
> ! if (aliasing)
> ! {
> ! gfc_error ("The FROM and TO arguments at %L violate aliasing "
> ! "restrictions (F2003 12.4.1.7)", &to->where);
> ! return false;
> ! }
> }
>
> /* CLASS arguments: Make sure the vtab of from is present. */
> Index: gcc/testsuite/gfortran.dg/move_alloc_18.f90
> ===================================================================
> *** gcc/testsuite/gfortran.dg/move_alloc_18.f90 (revision 0)
> --- gcc/testsuite/gfortran.dg/move_alloc_18.f90 (working copy)
> ***************
> *** 0 ****
> --- 1,21 ----
> + ! { dg-do compile }
> + !
> + ! Test that the anti-aliasing restriction does not knock out valid code.
> + !
> + ! Contributed by Andrew Balwin on
> + ! https://groups.google.com/forum/#!topic/comp.lang.fortran/oiXdl1LPb_s
> + !
> + PROGRAM TEST
> + IMPLICIT NONE
> +
> + TYPE FOOBAR
> + INTEGER, ALLOCATABLE :: COMP(:)
> + END TYPE
> +
> + TYPE (FOOBAR) :: MY_ARRAY(6)
> +
> + ALLOCATE (MY_ARRAY(1)%COMP(10))
> +
> + CALL MOVE_ALLOC (MY_ARRAY(1)%COMP, MY_ARRAY(2)%COMP)
> +
> + END PROGRAM TEST
--
Steve
More information about the Fortran
mailing list