Hi Steve, hi all, thanks for the review. While going to bed, it came to me that the testcase checks only half of result of this patch. I therefore took the liberty to add another testcase, that checks that the other part of the change is also tested as testsuite/gfortran.dg/coarray_42.f90.
The change bootstrapped and regtested fine on x86_64-linux/f23 therefore committed as r243648. Regards, Andre On Tue, 13 Dec 2016 10:52:08 -0800 Steve Kargl <s...@troutmask.apl.washington.edu> wrote: > On Tue, Dec 13, 2016 at 07:32:33PM +0100, Andre Vehreschild wrote: > > > > attached patch fixes the issue by improving the check whether a call of the > > caf-runtime-routines needs to be generated instead of a regular assignment. > > > > Bootstraps and regtests ok on x86_64-linux/f23. Ok for trunk? > > > > gcc/testsuite/ChangeLog: > > > > 2016-12-13 Andre Vehreschild <ve...@gcc.gnu.org> > > > > PR fortran/78780 > > * gfortran.dg/coarray/alloc_comp_5.f90: New test. > > > > gcc/fortran/ChangeLog: > > > > 2016-12-13 Andre Vehreschild <ve...@gcc.gnu.org> > > > > PR fortran/78780 > > * trans-expr.c (gfc_trans_assignment_1): Improve check whether > > detour caf-runtime routines is needed. > > > > OK. > -- Andre Vehreschild * Email: vehre ad gmx dot de
Index: gcc/fortran/ChangeLog =================================================================== --- gcc/fortran/ChangeLog (Revision 243647) +++ gcc/fortran/ChangeLog (Arbeitskopie) @@ -1,5 +1,11 @@ 2016-12-14 Andre Vehreschild <ve...@gcc.gnu.org> + PR fortran/78780 + * trans-expr.c (gfc_trans_assignment_1): Improve check whether detour + caf-runtime routines is needed. + +2016-12-14 Andre Vehreschild <ve...@gcc.gnu.org> + PR fortran/78672 * array.c (gfc_find_array_ref): Add flag to return NULL when no ref is found instead of erroring out. Index: gcc/fortran/trans-expr.c =================================================================== --- gcc/fortran/trans-expr.c (Revision 243647) +++ gcc/fortran/trans-expr.c (Arbeitskopie) @@ -9718,7 +9718,7 @@ bool scalar_to_array; tree string_length; int n; - bool maybe_workshare = false; + bool maybe_workshare = false, lhs_refs_comp = false, rhs_refs_comp = false; symbol_attribute lhs_caf_attr, rhs_caf_attr, lhs_attr; bool is_poly_assign; @@ -9758,8 +9758,8 @@ mode. */ if (flag_coarray == GFC_FCOARRAY_LIB) { - lhs_caf_attr = gfc_caf_attr (expr1); - rhs_caf_attr = gfc_caf_attr (expr2); + lhs_caf_attr = gfc_caf_attr (expr1, false, &lhs_refs_comp); + rhs_caf_attr = gfc_caf_attr (expr2, false, &rhs_refs_comp); } if (lss != gfc_ss_terminator) @@ -9959,10 +9959,19 @@ } else if (flag_coarray == GFC_FCOARRAY_LIB && lhs_caf_attr.codimension && rhs_caf_attr.codimension - && lhs_caf_attr.alloc_comp && rhs_caf_attr.alloc_comp) + && ((lhs_caf_attr.allocatable && lhs_refs_comp) + || (rhs_caf_attr.allocatable && rhs_refs_comp))) { + /* Only detour to caf_send[get][_by_ref] () when the lhs or rhs is an + allocatable component, because those need to be accessed via the + caf-runtime. No need to check for coindexes here, because resolve + has rewritten those already. */ gfc_code code; gfc_actual_arglist a1, a2; + /* Clear the structures to prevent accessing garbage. */ + memset (&code, '\0', sizeof (gfc_code)); + memset (&a1, '\0', sizeof (gfc_actual_arglist)); + memset (&a2, '\0', sizeof (gfc_actual_arglist)); a1.expr = expr1; a1.next = &a2; a2.expr = expr2; Index: gcc/testsuite/ChangeLog =================================================================== --- gcc/testsuite/ChangeLog (Revision 243647) +++ gcc/testsuite/ChangeLog (Arbeitskopie) @@ -1,3 +1,9 @@ +2016-12-14 Andre Vehreschild <ve...@gcc.gnu.org> + + PR fortran/78780 + * gfortran.dg/coarray/alloc_comp_5.f90: New test. + * gfortran.dg/coarray_42.f90: New test. + 2016-12-14 Jakub Jelinek <ja...@redhat.com> PR target/78796 Index: gcc/testsuite/gfortran.dg/coarray/alloc_comp_5.f90 =================================================================== --- gcc/testsuite/gfortran.dg/coarray/alloc_comp_5.f90 (nicht existent) +++ gcc/testsuite/gfortran.dg/coarray/alloc_comp_5.f90 (Arbeitskopie) @@ -0,0 +1,17 @@ +! { dg-do run } + +program Jac + type Domain + integer :: n=64 + integer,allocatable :: endsi(:) + end type + type(Domain),allocatable :: D[:,:,:] + + allocate(D[2,2,*]) + allocate(D%endsi(2), source = 0) + ! No caf-runtime call needed her. + D%endsi(2) = D%n + if (any(D%endsi /= [ 0, 64])) error stop + deallocate(D) +end program + Index: gcc/testsuite/gfortran.dg/coarray_42.f90 =================================================================== --- gcc/testsuite/gfortran.dg/coarray_42.f90 (nicht existent) +++ gcc/testsuite/gfortran.dg/coarray_42.f90 (Arbeitskopie) @@ -0,0 +1,20 @@ +! { dg-do run } +! { dg-options "-fdump-tree-original -fcoarray=lib -lcaf_single" } + +program Jac + type Domain + integer :: n=64 + integer,allocatable :: endsi(:) + end type + type(Domain),allocatable :: D[:,:,:] + + allocate(D[2,2,*]) + allocate(D%endsi(2), source = 0) + ! Lhs may be reallocate, so caf_send_by_ref needs to be used. + D%endsi = D%n + if (any(D%endsi /= [ 64, 64])) error stop + deallocate(D) +end program + +! { dg-final { scan-tree-dump-times "caf_send_by_ref" 1 "original" } } +