re PR fortran/78505 ([F08] Coarray source allocation not synchronizing on oversubscri...
authorAndre Vehreschild <vehre@gcc.gnu.org>
Fri, 9 Dec 2016 12:46:57 +0000 (13:46 +0100)
committerAndre Vehreschild <vehre@gcc.gnu.org>
Fri, 9 Dec 2016 12:46:57 +0000 (13:46 +0100)
gcc/fortran/ChangeLog:

2016-12-09  Andre Vehreschild  <vehre@gcc.gnu.org>

PR fortran/78505
* trans-stmt.c (gfc_trans_allocate): Add sync all after the execution
of the whole allocate-statement to adhere to the standard.

gcc/testsuite/ChangeLog:

2016-12-09  Andre Vehreschild  <vehre@gcc.gnu.org>

PR fortran/78505
* gfortran.dg/coarray_alloc_with_implicit_sync_1.f90: New test.

From-SVN: r243482

gcc/fortran/ChangeLog
gcc/fortran/trans-stmt.c
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/coarray_alloc_with_implicit_sync_1.f90 [new file with mode: 0644]

index fe68bf45cfbb39dffedc4f1bd3fb530d5811c221..23421639671f37ecc8f61c852e663a85e0281544 100644 (file)
@@ -1,3 +1,9 @@
+2016-12-09  Andre Vehreschild  <vehre@gcc.gnu.org>
+
+       PR fortran/78505
+       * trans-stmt.c (gfc_trans_allocate): Add sync all after the execution
+       of the whole allocate-statement to adhere to the standard.
+
 2016-12-09  Andre Vehreschild  <vehre@gcc.gnu.org>
 
        * trans-array.c (gfc_array_deallocate): Remove wrapper.
index 5ca716bebebfef02fd57650452037ce9649f2456..d34bdba9628c9f5adf1c594316e5a9d18d80ae89 100644 (file)
@@ -5506,7 +5506,7 @@ gfc_trans_allocate (gfc_code * code)
   stmtblock_t block;
   stmtblock_t post;
   tree nelems;
-  bool upoly_expr, tmp_expr3_len_flag = false, al_len_needs_set;
+  bool upoly_expr, tmp_expr3_len_flag = false, al_len_needs_set, is_coarray ;
   gfc_symtree *newsym = NULL;
 
   if (!code->ext.alloc.list)
@@ -5516,6 +5516,7 @@ gfc_trans_allocate (gfc_code * code)
   expr3 = expr3_vptr = expr3_len = expr3_esize = NULL_TREE;
   label_errmsg = label_finish = errmsg = errlen = NULL_TREE;
   e3_is = E3_UNSET;
+  is_coarray = false;
 
   gfc_init_block (&block);
   gfc_init_block (&post);
@@ -5555,8 +5556,9 @@ gfc_trans_allocate (gfc_code * code)
      expression.  */
   if (code->expr3)
     {
-      bool vtab_needed = false, temp_var_needed = false,
-         is_coarray = gfc_is_coarray (code->expr3);
+      bool vtab_needed = false, temp_var_needed = false;
+
+      is_coarray = gfc_is_coarray (code->expr3);
 
       /* Figure whether we need the vtab from expr3.  */
       for (al = code->ext.alloc.list; !vtab_needed && al != NULL;
@@ -6093,6 +6095,9 @@ gfc_trans_allocate (gfc_code * code)
              tree caf_decl, token;
              gfc_se caf_se;
 
+             /* Set flag, to add synchronize after the allocate.  */
+             is_coarray = true;
+
              gfc_init_se (&caf_se, NULL);
 
              caf_decl = gfc_get_tree_for_caf_expr (expr);
@@ -6114,6 +6119,11 @@ gfc_trans_allocate (gfc_code * code)
        }
       else
        {
+         /* Allocating coarrays needs a sync after the allocate executed.
+            Set the flag to add the sync after all objects are allocated.  */
+         is_coarray = is_coarray || (gfc_caf_attr (expr).codimension
+                                     && flag_coarray == GFC_FCOARRAY_LIB);
+
          if (expr->ts.type == BT_CHARACTER && al_len != NULL_TREE
              && expr3_len != NULL_TREE)
            {
@@ -6357,6 +6367,15 @@ gfc_trans_allocate (gfc_code * code)
       gfc_add_modify (&block, se.expr, tmp);
     }
 
+  if (is_coarray && flag_coarray == GFC_FCOARRAY_LIB)
+    {
+      /* Add a sync all after the allocation has been executed.  */
+      tmp = build_call_expr_loc (input_location, gfor_fndecl_caf_sync_all,
+                                3, null_pointer_node, null_pointer_node,
+                                integer_zero_node);
+      gfc_add_expr_to_block (&post, tmp);
+    }
+
   gfc_add_block_to_block (&block, &se.post);
   gfc_add_block_to_block (&block, &post);
 
index 33e5b378800a0efb5acc0ac80c6d6a7a49c391ba..49146a3b6b34be76f24b61ffc04f133507993888 100644 (file)
@@ -1,3 +1,8 @@
+2016-12-09  Andre Vehreschild  <vehre@gcc.gnu.org>
+
+       PR fortran/78505
+       * gfortran.dg/coarray_alloc_with_implicit_sync_1.f90: New test.
+
 2016-12-09  Andre Vehreschild  <vehre@gcc.gnu.org>
 
        * gfortran.dg/coarray_alloc_comp_3.f08: New test.
diff --git a/gcc/testsuite/gfortran.dg/coarray_alloc_with_implicit_sync_1.f90 b/gcc/testsuite/gfortran.dg/coarray_alloc_with_implicit_sync_1.f90
new file mode 100644 (file)
index 0000000..1dbbcb7
--- /dev/null
@@ -0,0 +1,10 @@
+! { dg-do compile }
+! { dg-options "-fdump-tree-original -fcoarray=lib" }
+! Check that allocating a coarray adds an implicit sync all.
+ implicit none
+ integer, allocatable :: f(:)[:]
+ allocate( f(20)[*], source = 1 )
+end
+
+! { dg-final { scan-tree-dump-times "_gfortran_caf_sync_all \\(" 1 "original" } }