Commit ffaf9305 by Andre Vehreschild

re PR fortran/78505 ([F08] Coarray source allocation not synchronizing on oversubscribed cores)

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
parent 39da5866
2016-12-09 Andre Vehreschild <vehre@gcc.gnu.org> 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. * trans-array.c (gfc_array_deallocate): Remove wrapper.
(gfc_trans_dealloc_allocated): Same. (gfc_trans_dealloc_allocated): Same.
(structure_alloc_comps): Restructure deallocation of (nested) (structure_alloc_comps): Restructure deallocation of (nested)
......
...@@ -5506,7 +5506,7 @@ gfc_trans_allocate (gfc_code * code) ...@@ -5506,7 +5506,7 @@ gfc_trans_allocate (gfc_code * code)
stmtblock_t block; stmtblock_t block;
stmtblock_t post; stmtblock_t post;
tree nelems; 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; gfc_symtree *newsym = NULL;
if (!code->ext.alloc.list) if (!code->ext.alloc.list)
...@@ -5516,6 +5516,7 @@ gfc_trans_allocate (gfc_code * code) ...@@ -5516,6 +5516,7 @@ gfc_trans_allocate (gfc_code * code)
expr3 = expr3_vptr = expr3_len = expr3_esize = NULL_TREE; expr3 = expr3_vptr = expr3_len = expr3_esize = NULL_TREE;
label_errmsg = label_finish = errmsg = errlen = NULL_TREE; label_errmsg = label_finish = errmsg = errlen = NULL_TREE;
e3_is = E3_UNSET; e3_is = E3_UNSET;
is_coarray = false;
gfc_init_block (&block); gfc_init_block (&block);
gfc_init_block (&post); gfc_init_block (&post);
...@@ -5555,8 +5556,9 @@ gfc_trans_allocate (gfc_code * code) ...@@ -5555,8 +5556,9 @@ gfc_trans_allocate (gfc_code * code)
expression. */ expression. */
if (code->expr3) if (code->expr3)
{ {
bool vtab_needed = false, temp_var_needed = false, bool vtab_needed = false, temp_var_needed = false;
is_coarray = gfc_is_coarray (code->expr3);
is_coarray = gfc_is_coarray (code->expr3);
/* Figure whether we need the vtab from expr3. */ /* Figure whether we need the vtab from expr3. */
for (al = code->ext.alloc.list; !vtab_needed && al != NULL; for (al = code->ext.alloc.list; !vtab_needed && al != NULL;
...@@ -6093,6 +6095,9 @@ gfc_trans_allocate (gfc_code * code) ...@@ -6093,6 +6095,9 @@ gfc_trans_allocate (gfc_code * code)
tree caf_decl, token; tree caf_decl, token;
gfc_se caf_se; gfc_se caf_se;
/* Set flag, to add synchronize after the allocate. */
is_coarray = true;
gfc_init_se (&caf_se, NULL); gfc_init_se (&caf_se, NULL);
caf_decl = gfc_get_tree_for_caf_expr (expr); caf_decl = gfc_get_tree_for_caf_expr (expr);
...@@ -6114,6 +6119,11 @@ gfc_trans_allocate (gfc_code * code) ...@@ -6114,6 +6119,11 @@ gfc_trans_allocate (gfc_code * code)
} }
else 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 if (expr->ts.type == BT_CHARACTER && al_len != NULL_TREE
&& expr3_len != NULL_TREE) && expr3_len != NULL_TREE)
{ {
...@@ -6357,6 +6367,15 @@ gfc_trans_allocate (gfc_code * code) ...@@ -6357,6 +6367,15 @@ gfc_trans_allocate (gfc_code * code)
gfc_add_modify (&block, se.expr, tmp); 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, &se.post);
gfc_add_block_to_block (&block, &post); gfc_add_block_to_block (&block, &post);
......
2016-12-09 Andre Vehreschild <vehre@gcc.gnu.org> 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. * gfortran.dg/coarray_alloc_comp_3.f08: New test.
* gfortran.dg/coarray_alloc_comp_4.f08: New test. * gfortran.dg/coarray_alloc_comp_4.f08: New test.
* gfortran.dg/finalize_18.f90: Add count for additional guard against * gfortran.dg/finalize_18.f90: Add count for additional guard against
......
! { 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" } }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment