aboutsummaryrefslogtreecommitdiff
path: root/gcc/fortran/trans-openmp.cc
diff options
context:
space:
mode:
authorTobias Burnus <tobias@codesourcery.com>2022-05-13 20:00:34 +0200
committerTobias Burnus <tobias@codesourcery.com>2022-05-13 20:00:34 +0200
commita46d6268371c446566f656858aada8775a0c988e (patch)
treed8a936caa2c14b43489d72edb77c5be0e1981c8e /gcc/fortran/trans-openmp.cc
parentbc25483c055d62f94f8c289f80843dda3c4a6ff4 (diff)
downloadgcc-a46d6268371c446566f656858aada8775a0c988e.zip
gcc-a46d6268371c446566f656858aada8775a0c988e.tar.gz
gcc-a46d6268371c446566f656858aada8775a0c988e.tar.bz2
OpenMP/Fortran: Use firstprivat not alloc for ptr attach for arrays
For a non-descriptor array, map(A(n:m)) was mapped as map(tofrom:A[n-1] [len: ...]) map(alloc:A [pointer assign, bias: ...]) with this patch, it is changed to map(tofrom:A[n-1] [len: ...]) map(firstprivate:A [pointer assign, bias: ...]) The latter avoids an alloc - and also avoids the race condition with nowait in the enclosed testcase. (Note: predantically, the testcase is invalid since OpenMP 5.1, violating the map clause restriction at [354:10-13]. gcc/fortran/ChangeLog: * trans-openmp.cc (gfc_trans_omp_clauses): When mapping nondescriptor array sections, use GOMP_MAP_FIRSTPRIVATE_POINTER instead of GOMP_MAP_POINTER for the pointer attachment. libgomp/ChangeLog: * testsuite/libgomp.fortran/target-nowait-array-section.f90: New test.
Diffstat (limited to 'gcc/fortran/trans-openmp.cc')
-rw-r--r--gcc/fortran/trans-openmp.cc12
1 files changed, 9 insertions, 3 deletions
diff --git a/gcc/fortran/trans-openmp.cc b/gcc/fortran/trans-openmp.cc
index baa45f7..eb5870c 100644
--- a/gcc/fortran/trans-openmp.cc
+++ b/gcc/fortran/trans-openmp.cc
@@ -3312,9 +3312,15 @@ gfc_trans_omp_clauses (stmtblock_t *block, gfc_omp_clauses *clauses,
/* An array element or array section which is not part of a
derived type, etc. */
bool element = n->expr->ref->u.ar.type == AR_ELEMENT;
- gfc_trans_omp_array_section (block, n, decl, element,
- GOMP_MAP_POINTER, node, node2,
- node3, node4);
+ tree type = TREE_TYPE (decl);
+ gomp_map_kind k = GOMP_MAP_POINTER;
+ if (!openacc
+ && !GFC_DESCRIPTOR_TYPE_P (type)
+ && !(POINTER_TYPE_P (type)
+ && GFC_DESCRIPTOR_TYPE_P (TREE_TYPE (type))))
+ k = GOMP_MAP_FIRSTPRIVATE_POINTER;
+ gfc_trans_omp_array_section (block, n, decl, element, k,
+ node, node2, node3, node4);
}
else if (n->expr
&& n->expr->expr_type == EXPR_VARIABLE