This is the mail archive of the
fortran@gcc.gnu.org
mailing list for the GNU Fortran project.
Re: [PATCH, Fortran, pr78780, v1] [7 Regression] [Coarray] ICE in conv_caf_send, at fortran/trans-intrinsic.c:1936
- From: Andre Vehreschild <vehre at gmx dot de>
- To: Steve Kargl <sgk at troutmask dot apl dot washington dot edu>
- Cc: "janus at gcc dot gnu.org" <gcc-bugzilla at gcc dot gnu dot org>, GCC-Fortran-ML <fortran at gcc dot gnu dot org>, GCC-Patches-ML <gcc-patches at gcc dot gnu dot org>
- Date: Wed, 14 Dec 2016 13:50:04 +0100
- Subject: Re: [PATCH, Fortran, pr78780, v1] [7 Regression] [Coarray] ICE in conv_caf_send, at fortran/trans-intrinsic.c:1936
- Authentication-results: sourceware.org; auth=none
- References: <bug-78780-26035@http.gcc.gnu.org/bugzilla/> <bug-78780-26035-UQmHNquRMX@http.gcc.gnu.org/bugzilla/> <20161213193233.1fdf5013@vepi2> <20161213185208.GA4673@troutmask.apl.washington.edu>
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 <sgk@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 <vehre@gcc.gnu.org>
> >
> > PR fortran/78780
> > * gfortran.dg/coarray/alloc_comp_5.f90: New test.
> >
> > gcc/fortran/ChangeLog:
> >
> > 2016-12-13 Andre Vehreschild <vehre@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 <vehre@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 <vehre@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 <vehre@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 <jakub@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" } }
+