re PR fortran/78780 ([Coarray] ICE in conv_caf_send, at fortran/trans-intrinsic.c...
authorAndre Vehreschild <vehre@gcc.gnu.org>
Wed, 14 Dec 2016 12:49:45 +0000 (13:49 +0100)
committerAndre Vehreschild <vehre@gcc.gnu.org>
Wed, 14 Dec 2016 12:49:45 +0000 (13:49 +0100)
gcc/testsuite/ChangeLog:

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.

gcc/fortran/ChangeLog:

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.

From-SVN: r243648

gcc/fortran/ChangeLog
gcc/fortran/trans-expr.c
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/coarray/alloc_comp_5.f90 [new file with mode: 0644]
gcc/testsuite/gfortran.dg/coarray_42.f90 [new file with mode: 0644]

index 3b6cefcb371eb4b1862ef6e551a3857e50c2f154..c7acf44c88458a74a4cc5055eab351316ecb5a44 100644 (file)
@@ -1,3 +1,9 @@
+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
index 2f45d40bec72350b0768a24a1a6e2061f3f97be0..f908c25b9cb36b86ba4081a3af877e96d479818e 100644 (file)
@@ -9718,7 +9718,7 @@ gfc_trans_assignment_1 (gfc_expr * expr1, gfc_expr * expr2, bool init_flag,
   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 @@ gfc_trans_assignment_1 (gfc_expr * expr1, gfc_expr * expr2, bool init_flag,
      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 @@ gfc_trans_assignment_1 (gfc_expr * expr1, gfc_expr * expr2, bool init_flag,
     }
   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 ba53564764852f86189d295d0bf96edbd4618cd9..e353ee051ec06715812cffaa82350074a29f0acc 100644 (file)
@@ -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
diff --git a/gcc/testsuite/gfortran.dg/coarray/alloc_comp_5.f90 b/gcc/testsuite/gfortran.dg/coarray/alloc_comp_5.f90
new file mode 100644 (file)
index 0000000..bf4fd55
--- /dev/null
@@ -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
+
diff --git a/gcc/testsuite/gfortran.dg/coarray_42.f90 b/gcc/testsuite/gfortran.dg/coarray_42.f90
new file mode 100644 (file)
index 0000000..e8db60d
--- /dev/null
@@ -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" } }
+