diff mbox

[Fortran,pr78780,v1,7,Regression,Coarray] ICE in conv_caf_send, at fortran/trans-intrinsic.c:1936

Message ID 20161214135004.114db87a@vepi2
State New
Headers show

Commit Message

Andre Vehreschild Dec. 14, 2016, 12:50 p.m. UTC
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
diff mbox

Patch

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" } }
+