This patch adds a missing check to C already present for Fortran,
except that the rules have been further tightened, hence, Fortran
is modified as well.
Comments before I push it later today?
* * *
The following is about the 'omp allocate' directive applied to
static variables, only; for those, only predefined allocators
are permitted in the 'omp allocate' directive. Additionally:
The predefined allocators omp_{cgroup,pteam,thread}_mem_alloc are
special in the sense that their access trait is not the full device
but only something smaller. That's ill-defined for global static
variables and was therefore restricted to local static variables,
where the allocation can be done the first time the procedure is
invoked. For cgroup lifetime/initialization is mostly clear but for
pteam/thread is becomes a bit murkier and if reading the current
wording such that the first tread invoking that function takes
care of it, threads of other teams cannot really access that
variable. [Could be fixed but needs thinking of the fine print
for a not so important feature. Hence, restricting is easier
for now on the specification side - and even more so on the
compiler side.]
Thus, those three predefined allocators are now disallowed also
for local static variables (→ OpenMP spec issue #4665, TR15 +
OpenMP 6.1).
In GCC, as documented, specifying an OpenMP memory allocator on a
static variable has no effect (besides honoring the alignment),
cf. https://gcc.gnu.org/onlinedocs/libgomp/Memory-allocation.html
Future: However, as the data is passed down to the compiler
backend, adding support for it in the future is simple. For instance,
omp_const_mem_alloc could be placed in offload code into special
memory: At least Nvidia's GPUs have memory that can be accessed
from multiple threads without requiring that the hardware ensures
cache consistency; that memory is used by classical GPUs to store
the texture.
Crossref: Instead of using omp_cgroup_mem_alloc, you can use
'omp groupprivate' to achieve a similar effect. (Likely, is is
only supported on offload devices [device_type(nohost)] and no
initializers are permitted, but still. Note that groupprivate
is not yet supported in GCC.)
Thanks,
Tobias
OpenMP: Reject omp_{cgroup,pteam,thread}_mem_alloc for static vars in ALLOCATE directive [PR122892]
Using omp_{cgroup,pteam,thread}_mem_alloc for static variables was not
very useful as currently worded in the spec; hence, OpenMP 6.1 will
disallow it also for for local static variables, OpenMP 6.0 already
disallowed for other static variables. Cf. OpenMP specification
issue #4665.
For Fortran, the check is modified while for C the check was completely
missing. Both has been rectified by this commit. For C++, the allocate
directive still has to be added.
PR c/122892
gcc/c/ChangeLog:
* c-parser.cc (c_parser_omp_allocate): Reject
omp_{cgroup,pteam,thread}_mem_alloc for static variables.
gcc/fortran/ChangeLog:
* openmp.cc (gfc_resolve_omp_allocate): Reject
omp_{cgroup,pteam,thread}_mem_alloc also for local static
variables.
gcc/ChangeLog:
* gimplify.cc (gimplify_scan_omp_clauses): Update for removed
plural -S in GOMP_OMP_PREDEF_ALLOC_THREAD.
include/ChangeLog:
* gomp-constants.h (GOMP_OMP_PREDEF_ALLOC_THREADS): Rename to ...
(GOMP_OMP_PREDEF_ALLOC_THREAD): ... this.
(GOMP_OMP_PREDEF_ALLOC_CGROUP, GOMP_OMP_PREDEF_ALLOC_PTEAM): Define
with the value of omp_{cgroup,pteam}_mem_alloc
libgomp/ChangeLog:
* allocator.c (_Static_assert): Add asserts for the values of
GOMP_OMP_PREDEF_ALLOC_CGROUP and GOMP_OMP_PREDEF_ALLOC_PTEAM.
gcc/testsuite/ChangeLog:
* gfortran.dg/gomp/allocate-static-3.f90: Modify to also
disallow local static variables.
* c-c++-common/gomp/allocate-20.c: New test.
gcc/c/c-parser.cc | 13 +++
gcc/fortran/openmp.cc | 16 ++--
gcc/gimplify.cc | 2 +-
gcc/testsuite/c-c++-common/gomp/allocate-20.c | 99 ++++++++++++++++++++++
.../gfortran.dg/gomp/allocate-static-3.f90 | 71 ++++++++--------
include/gomp-constants.h | 6 +-
libgomp/allocator.c | 8 +-
7 files changed, 167 insertions(+), 48 deletions(-)
diff --git a/gcc/c/c-parser.cc b/gcc/c/c-parser.cc
index e6f7104013b..4ded9661f58 100644
--- a/gcc/c/c-parser.cc
+++ b/gcc/c/c-parser.cc
@@ -23629,6 +23629,19 @@ c_parser_omp_allocate (c_parser *parser)
"%<allocator%> clause requires a predefined allocator as "
"%qD is static", var);
}
+ else if (allocator
+ && (wi::eq_p (wi::to_widest (allocator),
+ GOMP_OMP_PREDEF_ALLOC_CGROUP)
+ || wi::eq_p (wi::to_widest (allocator),
+ GOMP_OMP_PREDEF_ALLOC_PTEAM)
+ || wi::eq_p (wi::to_widest (allocator),
+ GOMP_OMP_PREDEF_ALLOC_THREAD)))
+ {
+ error_at (allocator_loc,
+ "%<allocator%> clause for static variable %qD must not "
+ "be %<omp_cgroup_mem_alloc%>, %<omp_pteam_mem_alloc%>, "
+ "or %<omp_thread_mem_alloc%>", var);
+ }
}
if (allocator)
{
diff --git a/gcc/fortran/openmp.cc b/gcc/fortran/openmp.cc
index 18c67042740..65ec14ebadc 100644
--- a/gcc/fortran/openmp.cc
+++ b/gcc/fortran/openmp.cc
@@ -9063,24 +9063,22 @@ gfc_resolve_omp_allocate (gfc_namespace *ns, gfc_omp_namelist *list)
&n->u2.allocator->where, com ? "/" : "",
com ? n->sym->common_head->name : n->sym->name,
com ? "/" : "", &n->where);
- /* Only local static variables might use omp_cgroup_mem_alloc (6),
+ /* Static variables may not use omp_cgroup_mem_alloc (6),
omp_pteam_mem_alloc (7), or omp_thread_mem_alloc (8). */
- else if ((!ns->proc_name
- || ns->proc_name->attr.flavor == FL_PROGRAM
- || ns->proc_name->attr.flavor == FL_BLOCK_DATA
- || ns->proc_name->attr.flavor == FL_MODULE
- || com)
- && mpz_cmp_si (n->u2.allocator->value.integer,
+ else if (mpz_cmp_si (n->u2.allocator->value.integer,
6 /* cgroup */) >= 0
&& mpz_cmp_si (n->u2.allocator->value.integer,
8 /* thread */) <= 0)
{
+ STATIC_ASSERT (GOMP_OMP_PREDEF_ALLOC_CGROUP == 6);
+ STATIC_ASSERT (GOMP_OMP_PREDEF_ALLOC_PTEAM == 7);
+ STATIC_ASSERT (GOMP_OMP_PREDEF_ALLOC_THREAD == 8);
const char *alloc_name[] = {"omp_cgroup_mem_alloc",
"omp_pteam_mem_alloc",
"omp_thread_mem_alloc" };
gfc_error ("Predefined allocator %qs in ALLOCATOR clause at %L, "
- "used for list item %<%s%s%s%> at %L, may only be used"
- " for local static variables",
+ "used for list item %<%s%s%s%> at %L, may not be used"
+ " for static variables",
alloc_name[mpz_get_ui (n->u2.allocator->value.integer)
- 6 /* cgroup */], &n->u2.allocator->where,
com ? "/" : "",
diff --git a/gcc/gimplify.cc b/gcc/gimplify.cc
index dd5caf5662b..853a759df6b 100644
--- a/gcc/gimplify.cc
+++ b/gcc/gimplify.cc
@@ -14938,7 +14938,7 @@ gimplify_scan_omp_clauses (tree *list_p, gimple_seq *pre_p,
decl = OMP_CLAUSE_ALLOCATE_ALLOCATOR (c);
if (decl
&& TREE_CODE (decl) == INTEGER_CST
- && wi::eq_p (wi::to_widest (decl), GOMP_OMP_PREDEF_ALLOC_THREADS)
+ && wi::eq_p (wi::to_widest (decl), GOMP_OMP_PREDEF_ALLOC_THREAD)
&& (code == OMP_TARGET || code == OMP_TASK || code == OMP_TASKLOOP))
warning_at (OMP_CLAUSE_LOCATION (c), OPT_Wopenmp,
"allocator with access trait set to %<thread%> "
diff --git a/gcc/testsuite/c-c++-common/gomp/allocate-20.c b/gcc/testsuite/c-c++-common/gomp/allocate-20.c
new file mode 100644
index 00000000000..397d29a3599
--- /dev/null
+++ b/gcc/testsuite/c-c++-common/gomp/allocate-20.c
@@ -0,0 +1,99 @@
+// { dg-do compile }
+
+typedef __UINTPTR_TYPE__ omp_uintptr_t;
+
+#if __cplusplus >= 201103L
+# define __GOMP_UINTPTR_T_ENUM : omp_uintptr_t
+#else
+# define __GOMP_UINTPTR_T_ENUM
+#endif
+
+typedef enum omp_allocator_handle_t __GOMP_UINTPTR_T_ENUM
+{
+ omp_null_allocator = 0,
+ omp_default_mem_alloc = 1,
+ omp_large_cap_mem_alloc = 2,
+ omp_const_mem_alloc = 3,
+ omp_high_bw_mem_alloc = 4,
+ omp_low_lat_mem_alloc = 5,
+ omp_cgroup_mem_alloc = 6,
+ omp_pteam_mem_alloc = 7,
+ omp_thread_mem_alloc = 8,
+ ompx_gnu_pinned_mem_alloc = 200,
+ ompx_gnu_managed_mem_alloc = 201,
+ __omp_allocator_handle_t_max__ = __UINTPTR_MAX__
+} omp_allocator_handle_t;
+
+static int g0;
+static int g1;
+static int g2;
+static int g3;
+static int g4;
+static int g5;
+static int g6;
+static int g7;
+static int g8;
+static int g9;
+static int g10;
+
+#pragma omp allocate(g0) allocator(omp_null_allocator) // { dg-error "'allocator' clause requires a predefined allocator as 'g0' is static" "" { target c } }
+#pragma omp allocate(g1) allocator(omp_default_mem_alloc)
+#pragma omp allocate(g2) allocator(omp_large_cap_mem_alloc)
+#pragma omp allocate(g3) allocator(omp_const_mem_alloc)
+#pragma omp allocate(g4) allocator(omp_high_bw_mem_alloc)
+#pragma omp allocate(g5) allocator(omp_low_lat_mem_alloc)
+#pragma omp allocate(g6) allocator(omp_cgroup_mem_alloc) // { dg-error "'allocator' clause for static variable 'g6' must not be 'omp_cgroup_mem_alloc', 'omp_pteam_mem_alloc', or 'omp_thread_mem_alloc'" "" { target c } }
+#pragma omp allocate(g7) allocator(omp_pteam_mem_alloc) // { dg-error "'allocator' clause for static variable 'g7' must not be 'omp_cgroup_mem_alloc', 'omp_pteam_mem_alloc', or 'omp_thread_mem_alloc'" "" { target c } }
+#pragma omp allocate(g8) allocator(omp_thread_mem_alloc) // { dg-error "'allocator' clause for static variable 'g8' must not be 'omp_cgroup_mem_alloc', 'omp_pteam_mem_alloc', or 'omp_thread_mem_alloc'" "" { target c } }
+#pragma omp allocate(g9) allocator(ompx_gnu_pinned_mem_alloc)
+#pragma omp allocate(g10) allocator(ompx_gnu_managed_mem_alloc)
+// { dg-message "sorry, unimplemented: '#pragma omp allocate' not yet supported" "" { target c++ } .-11 }
+// { dg-message "sorry, unimplemented: '#pragma omp allocate' not yet supported" "" { target c++ } .-11 }
+// { dg-message "sorry, unimplemented: '#pragma omp allocate' not yet supported" "" { target c++ } .-11 }
+// { dg-message "sorry, unimplemented: '#pragma omp allocate' not yet supported" "" { target c++ } .-11 }
+// { dg-message "sorry, unimplemented: '#pragma omp allocate' not yet supported" "" { target c++ } .-11 }
+// { dg-message "sorry, unimplemented: '#pragma omp allocate' not yet supported" "" { target c++ } .-11 }
+// { dg-message "sorry, unimplemented: '#pragma omp allocate' not yet supported" "" { target c++ } .-11 }
+// { dg-message "sorry, unimplemented: '#pragma omp allocate' not yet supported" "" { target c++ } .-11 }
+// { dg-message "sorry, unimplemented: '#pragma omp allocate' not yet supported" "" { target c++ } .-11 }
+// { dg-message "sorry, unimplemented: '#pragma omp allocate' not yet supported" "" { target c++ } .-11 }
+// { dg-message "sorry, unimplemented: '#pragma omp allocate' not yet supported" "" { target c++ } .-11 }
+
+
+void local_static ()
+{
+ static int s0;
+ static int s1;
+ static int s2;
+ static int s3;
+ static int s4;
+ static int s5;
+ static int s6;
+ static int s7;
+ static int s8;
+ static int s9;
+ static int s10;
+
+ #pragma omp allocate(s0) allocator(omp_null_allocator) // { dg-error "'allocator' clause requires a predefined allocator as 's0' is static" "" { target c } }
+ #pragma omp allocate(s1) allocator(omp_default_mem_alloc)
+ #pragma omp allocate(s2) allocator(omp_large_cap_mem_alloc)
+ #pragma omp allocate(s3) allocator(omp_const_mem_alloc)
+ #pragma omp allocate(s4) allocator(omp_high_bw_mem_alloc)
+ #pragma omp allocate(s5) allocator(omp_low_lat_mem_alloc)
+ #pragma omp allocate(s6) allocator(omp_cgroup_mem_alloc) // { dg-error "'allocator' clause for static variable 's6' must not be 'omp_cgroup_mem_alloc', 'omp_pteam_mem_alloc', or 'omp_thread_mem_alloc'" "" { target c } }
+ #pragma omp allocate(s7) allocator(omp_pteam_mem_alloc) // { dg-error "'allocator' clause for static variable 's7' must not be 'omp_cgroup_mem_alloc', 'omp_pteam_mem_alloc', or 'omp_thread_mem_alloc'" "" { target c } }
+ #pragma omp allocate(s8) allocator(omp_thread_mem_alloc) // { dg-error "'allocator' clause for static variable 's8' must not be 'omp_cgroup_mem_alloc', 'omp_pteam_mem_alloc', or 'omp_thread_mem_alloc'" "" { target c } }
+ #pragma omp allocate(s9) allocator(ompx_gnu_pinned_mem_alloc)
+ #pragma omp allocate(s10) allocator(ompx_gnu_managed_mem_alloc)
+ // { dg-message "sorry, unimplemented: '#pragma omp allocate' not yet supported" "" { target c++ } .-11 }
+ // { dg-message "sorry, unimplemented: '#pragma omp allocate' not yet supported" "" { target c++ } .-11 }
+ // { dg-message "sorry, unimplemented: '#pragma omp allocate' not yet supported" "" { target c++ } .-11 }
+ // { dg-message "sorry, unimplemented: '#pragma omp allocate' not yet supported" "" { target c++ } .-11 }
+ // { dg-message "sorry, unimplemented: '#pragma omp allocate' not yet supported" "" { target c++ } .-11 }
+ // { dg-message "sorry, unimplemented: '#pragma omp allocate' not yet supported" "" { target c++ } .-11 }
+ // { dg-message "sorry, unimplemented: '#pragma omp allocate' not yet supported" "" { target c++ } .-11 }
+ // { dg-message "sorry, unimplemented: '#pragma omp allocate' not yet supported" "" { target c++ } .-11 }
+ // { dg-message "sorry, unimplemented: '#pragma omp allocate' not yet supported" "" { target c++ } .-11 }
+ // { dg-message "sorry, unimplemented: '#pragma omp allocate' not yet supported" "" { target c++ } .-11 }
+ // { dg-message "sorry, unimplemented: '#pragma omp allocate' not yet supported" "" { target c++ } .-11 }
+}
diff --git a/gcc/testsuite/gfortran.dg/gomp/allocate-static-3.f90 b/gcc/testsuite/gfortran.dg/gomp/allocate-static-3.f90
index 28a638c6f24..ae926688445 100644
--- a/gcc/testsuite/gfortran.dg/gomp/allocate-static-3.f90
+++ b/gcc/testsuite/gfortran.dg/gomp/allocate-static-3.f90
@@ -5,7 +5,10 @@
! OpenMP 6.0 clarified that the omp_{cgroup,pteam,thread}_mem_alloc
! (i.e. those with access trait != device) may only be used for
! static local variables.
-! Check for this!
+!
+! Since OpenMP 6.1, omp_{cgroup,pteam,thread}_mem_alloc may not
+! be used for static variables, local static or not.
+! Cf. OpenMP Spec issue #4665
module omp_lib_kinds
use iso_c_binding, only: c_int, c_intptr_t
@@ -60,9 +63,9 @@ block data
!$omp allocate(/b_i3/) allocator(omp_const_mem_alloc)
!$omp allocate(/b_i4/) allocator(omp_high_bw_mem_alloc)
!$omp allocate(/b_i5/) allocator(omp_low_lat_mem_alloc)
- !$omp allocate(/b_i6/) allocator(omp_cgroup_mem_alloc) ! { dg-error "Predefined allocator 'omp_cgroup_mem_alloc' in ALLOCATOR clause at .1., used for list item '/b_i6/' at .2., may only be used for local static variables" }
- !$omp allocate(/b_i7/) allocator(omp_pteam_mem_alloc) ! { dg-error "Predefined allocator 'omp_pteam_mem_alloc' in ALLOCATOR clause at .1., used for list item '/b_i7/' at .2., may only be used for local static variables" }
- !$omp allocate(/b_i8/) allocator(omp_thread_mem_alloc) ! { dg-error "Predefined allocator 'omp_thread_mem_alloc' in ALLOCATOR clause at .1., used for list item '/b_i8/' at .2., may only be used for local static variables" }
+ !$omp allocate(/b_i6/) allocator(omp_cgroup_mem_alloc) ! { dg-error "Predefined allocator 'omp_cgroup_mem_alloc' in ALLOCATOR clause at .1., used for list item '/b_i6/' at .2., may not be used for static variables" }
+ !$omp allocate(/b_i7/) allocator(omp_pteam_mem_alloc) ! { dg-error "Predefined allocator 'omp_pteam_mem_alloc' in ALLOCATOR clause at .1., used for list item '/b_i7/' at .2., may not be used for static variables" }
+ !$omp allocate(/b_i8/) allocator(omp_thread_mem_alloc) ! { dg-error "Predefined allocator 'omp_thread_mem_alloc' in ALLOCATOR clause at .1., used for list item '/b_i8/' at .2., may not be used for static variables" }
end block data
block data my_block_data
@@ -92,9 +95,9 @@ block data my_block_data
!$omp allocate(/b_j3/) allocator(omp_const_mem_alloc)
!$omp allocate(/b_j4/) allocator(omp_high_bw_mem_alloc)
!$omp allocate(/b_j5/) allocator(omp_low_lat_mem_alloc)
- !$omp allocate(/b_j6/) allocator(omp_cgroup_mem_alloc) ! { dg-error "Predefined allocator 'omp_cgroup_mem_alloc' in ALLOCATOR clause at .1., used for list item '/b_j6/' at .2., may only be used for local static variables" }
- !$omp allocate(/b_j7/) allocator(omp_pteam_mem_alloc) ! { dg-error "Predefined allocator 'omp_pteam_mem_alloc' in ALLOCATOR clause at .1., used for list item '/b_j7/' at .2., may only be used for local static variables" }
- !$omp allocate(/b_j8/) allocator(omp_thread_mem_alloc) ! { dg-error "Predefined allocator 'omp_thread_mem_alloc' in ALLOCATOR clause at .1., used for list item '/b_j8/' at .2., may only be used for local static variables" }
+ !$omp allocate(/b_j6/) allocator(omp_cgroup_mem_alloc) ! { dg-error "Predefined allocator 'omp_cgroup_mem_alloc' in ALLOCATOR clause at .1., used for list item '/b_j6/' at .2., may not be used for static variables" }
+ !$omp allocate(/b_j7/) allocator(omp_pteam_mem_alloc) ! { dg-error "Predefined allocator 'omp_pteam_mem_alloc' in ALLOCATOR clause at .1., used for list item '/b_j7/' at .2., may not be used for static variables" }
+ !$omp allocate(/b_j8/) allocator(omp_thread_mem_alloc) ! { dg-error "Predefined allocator 'omp_thread_mem_alloc' in ALLOCATOR clause at .1., used for list item '/b_j8/' at .2., may not be used for static variables" }
end block data my_block_data
module m
@@ -117,18 +120,18 @@ module m
!$omp allocate(a3) allocator(omp_const_mem_alloc)
!$omp allocate(a4) allocator(omp_high_bw_mem_alloc)
!$omp allocate(a5) allocator(omp_low_lat_mem_alloc)
- !$omp allocate(a6) allocator(omp_cgroup_mem_alloc) ! { dg-error "Predefined allocator 'omp_cgroup_mem_alloc' in ALLOCATOR clause at .1., used for list item 'a6' at .2., may only be used for local static variables" }
- !$omp allocate(a7) allocator(omp_pteam_mem_alloc) ! { dg-error "Predefined allocator 'omp_pteam_mem_alloc' in ALLOCATOR clause at .1., used for list item 'a7' at .2., may only be used for local static variables" }
- !$omp allocate(a8) allocator(omp_thread_mem_alloc) ! { dg-error "Predefined allocator 'omp_thread_mem_alloc' in ALLOCATOR clause at .1., used for list item 'a8' at .2., may only be used for local static variables" }
+ !$omp allocate(a6) allocator(omp_cgroup_mem_alloc) ! { dg-error "Predefined allocator 'omp_cgroup_mem_alloc' in ALLOCATOR clause at .1., used for list item 'a6' at .2., may not be used for static variables" }
+ !$omp allocate(a7) allocator(omp_pteam_mem_alloc) ! { dg-error "Predefined allocator 'omp_pteam_mem_alloc' in ALLOCATOR clause at .1., used for list item 'a7' at .2., may not be used for static variables" }
+ !$omp allocate(a8) allocator(omp_thread_mem_alloc) ! { dg-error "Predefined allocator 'omp_thread_mem_alloc' in ALLOCATOR clause at .1., used for list item 'a8' at .2., may not be used for static variables" }
!$omp allocate(/b_b1/) allocator(omp_default_mem_alloc)
!$omp allocate(/b_b2/) allocator(omp_large_cap_mem_alloc)
!$omp allocate(/b_b3/) allocator(omp_const_mem_alloc)
!$omp allocate(/b_b4/) allocator(omp_high_bw_mem_alloc)
!$omp allocate(/b_b5/) allocator(omp_low_lat_mem_alloc)
- !$omp allocate(/b_b6/) allocator(omp_cgroup_mem_alloc) ! { dg-error "Predefined allocator 'omp_cgroup_mem_alloc' in ALLOCATOR clause at .1., used for list item '/b_b6/' at .2., may only be used for local static variables" }
- !$omp allocate(/b_b7/) allocator(omp_pteam_mem_alloc) ! { dg-error "Predefined allocator 'omp_pteam_mem_alloc' in ALLOCATOR clause at .1., used for list item '/b_b7/' at .2., may only be used for local static variables" }
- !$omp allocate(/b_b8/) allocator(omp_thread_mem_alloc) ! { dg-error "Predefined allocator 'omp_thread_mem_alloc' in ALLOCATOR clause at .1., used for list item '/b_b8/' at .2., may only be used for local static variables" }
+ !$omp allocate(/b_b6/) allocator(omp_cgroup_mem_alloc) ! { dg-error "Predefined allocator 'omp_cgroup_mem_alloc' in ALLOCATOR clause at .1., used for list item '/b_b6/' at .2., may not be used for static variables" }
+ !$omp allocate(/b_b7/) allocator(omp_pteam_mem_alloc) ! { dg-error "Predefined allocator 'omp_pteam_mem_alloc' in ALLOCATOR clause at .1., used for list item '/b_b7/' at .2., may not be used for static variables" }
+ !$omp allocate(/b_b8/) allocator(omp_thread_mem_alloc) ! { dg-error "Predefined allocator 'omp_thread_mem_alloc' in ALLOCATOR clause at .1., used for list item '/b_b8/' at .2., may not be used for static variables" }
end
program main
@@ -151,18 +154,18 @@ program main
!$omp allocate(m3) allocator(omp_const_mem_alloc)
!$omp allocate(m4) allocator(omp_high_bw_mem_alloc)
!$omp allocate(m5) allocator(omp_low_lat_mem_alloc)
- !$omp allocate(m6) allocator(omp_cgroup_mem_alloc) ! { dg-error "Predefined allocator 'omp_cgroup_mem_alloc' in ALLOCATOR clause at .1., used for list item 'm6' at .2., may only be used for local static variables" }
- !$omp allocate(m7) allocator(omp_pteam_mem_alloc) ! { dg-error "Predefined allocator 'omp_pteam_mem_alloc' in ALLOCATOR clause at .1., used for list item 'm7' at .2., may only be used for local static variables" }
- !$omp allocate(m8) allocator(omp_thread_mem_alloc) ! { dg-error "Predefined allocator 'omp_thread_mem_alloc' in ALLOCATOR clause at .1., used for list item 'm8' at .2., may only be used for local static variables" }
+ !$omp allocate(m6) allocator(omp_cgroup_mem_alloc) ! { dg-error "Predefined allocator 'omp_cgroup_mem_alloc' in ALLOCATOR clause at .1., used for list item 'm6' at .2., may not be used for static variables" }
+ !$omp allocate(m7) allocator(omp_pteam_mem_alloc) ! { dg-error "Predefined allocator 'omp_pteam_mem_alloc' in ALLOCATOR clause at .1., used for list item 'm7' at .2., may not be used for static variables" }
+ !$omp allocate(m8) allocator(omp_thread_mem_alloc) ! { dg-error "Predefined allocator 'omp_thread_mem_alloc' in ALLOCATOR clause at .1., used for list item 'm8' at .2., may not be used for static variables" }
!$omp allocate(/b_n1/) allocator(omp_default_mem_alloc)
!$omp allocate(/b_n2/) allocator(omp_large_cap_mem_alloc)
!$omp allocate(/b_n3/) allocator(omp_const_mem_alloc)
!$omp allocate(/b_n4/) allocator(omp_high_bw_mem_alloc)
!$omp allocate(/b_n5/) allocator(omp_low_lat_mem_alloc)
- !$omp allocate(/b_n6/) allocator(omp_cgroup_mem_alloc) ! { dg-error "Predefined allocator 'omp_cgroup_mem_alloc' in ALLOCATOR clause at .1., used for list item '/b_n6/' at .2., may only be used for local static variables" }
- !$omp allocate(/b_n7/) allocator(omp_pteam_mem_alloc) ! { dg-error "Predefined allocator 'omp_pteam_mem_alloc' in ALLOCATOR clause at .1., used for list item '/b_n7/' at .2., may only be used for local static variables" }
- !$omp allocate(/b_n8/) allocator(omp_thread_mem_alloc) ! { dg-error "Predefined allocator 'omp_thread_mem_alloc' in ALLOCATOR clause at .1., used for list item '/b_n8/' at .2., may only be used for local static variables" }
+ !$omp allocate(/b_n6/) allocator(omp_cgroup_mem_alloc) ! { dg-error "Predefined allocator 'omp_cgroup_mem_alloc' in ALLOCATOR clause at .1., used for list item '/b_n6/' at .2., may not be used for static variables" }
+ !$omp allocate(/b_n7/) allocator(omp_pteam_mem_alloc) ! { dg-error "Predefined allocator 'omp_pteam_mem_alloc' in ALLOCATOR clause at .1., used for list item '/b_n7/' at .2., may not be used for static variables" }
+ !$omp allocate(/b_n8/) allocator(omp_thread_mem_alloc) ! { dg-error "Predefined allocator 'omp_thread_mem_alloc' in ALLOCATOR clause at .1., used for list item '/b_n8/' at .2., may not be used for static variables" }
block
integer, save :: o1,o2,o3,o4,o5,o6,o7,o8
@@ -173,9 +176,9 @@ program main
!$omp allocate(o3) allocator(omp_const_mem_alloc)
!$omp allocate(o4) allocator(omp_high_bw_mem_alloc)
!$omp allocate(o5) allocator(omp_low_lat_mem_alloc)
- !$omp allocate(o6) allocator(omp_cgroup_mem_alloc)
- !$omp allocate(o7) allocator(omp_pteam_mem_alloc)
- !$omp allocate(o8) allocator(omp_thread_mem_alloc)
+ !$omp allocate(o6) allocator(omp_cgroup_mem_alloc) ! { dg-error "Predefined allocator 'omp_cgroup_mem_alloc' in ALLOCATOR clause at .1., used for list item 'o6' at .2., may not be used for static variables" }
+ !$omp allocate(o7) allocator(omp_pteam_mem_alloc) ! { dg-error "Predefined allocator 'omp_pteam_mem_alloc' in ALLOCATOR clause at .1., used for list item 'o7' at .2., may not be used for static variables" }
+ !$omp allocate(o8) allocator(omp_thread_mem_alloc) ! { dg-error "Predefined allocator 'omp_thread_mem_alloc' in ALLOCATOR clause at .1., used for list item 'o8' at .2., may not be used for static variables" }
end block
end
@@ -199,18 +202,18 @@ subroutine sub
!$omp allocate(s3) allocator(omp_const_mem_alloc)
!$omp allocate(s4) allocator(omp_high_bw_mem_alloc)
!$omp allocate(s5) allocator(omp_low_lat_mem_alloc)
- !$omp allocate(s6) allocator(omp_cgroup_mem_alloc)
- !$omp allocate(s7) allocator(omp_pteam_mem_alloc)
- !$omp allocate(s8) allocator(omp_thread_mem_alloc)
+ !$omp allocate(s6) allocator(omp_cgroup_mem_alloc) ! { dg-error "Predefined allocator 'omp_cgroup_mem_alloc' in ALLOCATOR clause at .1., used for list item 's6' at .2., may not be used for static variables" }
+ !$omp allocate(s7) allocator(omp_pteam_mem_alloc) ! { dg-error "Predefined allocator 'omp_pteam_mem_alloc' in ALLOCATOR clause at .1., used for list item 's7' at .2., may not be used for static variables" }
+ !$omp allocate(s8) allocator(omp_thread_mem_alloc) ! { dg-error "Predefined allocator 'omp_thread_mem_alloc' in ALLOCATOR clause at .1., used for list item 's8' at .2., may not be used for static variables" }
!$omp allocate(/b_t1/) allocator(omp_default_mem_alloc)
!$omp allocate(/b_t2/) allocator(omp_large_cap_mem_alloc)
!$omp allocate(/b_t3/) allocator(omp_const_mem_alloc)
!$omp allocate(/b_t4/) allocator(omp_high_bw_mem_alloc)
!$omp allocate(/b_t5/) allocator(omp_low_lat_mem_alloc)
- !$omp allocate(/b_t6/) allocator(omp_cgroup_mem_alloc) ! { dg-error "Predefined allocator 'omp_cgroup_mem_alloc' in ALLOCATOR clause at .1., used for list item '/b_t6/' at .2., may only be used for local static variables" }
- !$omp allocate(/b_t7/) allocator(omp_pteam_mem_alloc) ! { dg-error "Predefined allocator 'omp_pteam_mem_alloc' in ALLOCATOR clause at .1., used for list item '/b_t7/' at .2., may only be used for local static variables" }
- !$omp allocate(/b_t8/) allocator(omp_thread_mem_alloc) ! { dg-error "Predefined allocator 'omp_thread_mem_alloc' in ALLOCATOR clause at .1., used for list item '/b_t8/' at .2., may only be used for local static variables" }
+ !$omp allocate(/b_t6/) allocator(omp_cgroup_mem_alloc) ! { dg-error "Predefined allocator 'omp_cgroup_mem_alloc' in ALLOCATOR clause at .1., used for list item '/b_t6/' at .2., may not be used for static variables" }
+ !$omp allocate(/b_t7/) allocator(omp_pteam_mem_alloc) ! { dg-error "Predefined allocator 'omp_pteam_mem_alloc' in ALLOCATOR clause at .1., used for list item '/b_t7/' at .2., may not be used for static variables" }
+ !$omp allocate(/b_t8/) allocator(omp_thread_mem_alloc) ! { dg-error "Predefined allocator 'omp_thread_mem_alloc' in ALLOCATOR clause at .1., used for list item '/b_t8/' at .2., may not be used for static variables" }
contains
integer function func()
integer, save :: q1,q2,q3,q4,q5,q6,q7,q8
@@ -229,17 +232,17 @@ contains
!$omp allocate(q3) allocator(omp_const_mem_alloc)
!$omp allocate(q4) allocator(omp_high_bw_mem_alloc)
!$omp allocate(q5) allocator(omp_low_lat_mem_alloc)
- !$omp allocate(q6) allocator(omp_cgroup_mem_alloc)
- !$omp allocate(q7) allocator(omp_pteam_mem_alloc)
- !$omp allocate(q8) allocator(omp_thread_mem_alloc)
+ !$omp allocate(q6) allocator(omp_cgroup_mem_alloc) ! { dg-error "Predefined allocator 'omp_cgroup_mem_alloc' in ALLOCATOR clause at .1., used for list item 'q6' at .2., may not be used for static variables" }
+ !$omp allocate(q7) allocator(omp_pteam_mem_alloc) ! { dg-error "Predefined allocator 'omp_pteam_mem_alloc' in ALLOCATOR clause at .1., used for list item 'q7' at .2., may not be used for static variables" }
+ !$omp allocate(q8) allocator(omp_thread_mem_alloc) ! { dg-error "Predefined allocator 'omp_thread_mem_alloc' in ALLOCATOR clause at .1., used for list item 'q8' at .2., may not be used for static variables" }
!$omp allocate(/b_r1/) allocator(omp_default_mem_alloc)
!$omp allocate(/b_r2/) allocator(omp_large_cap_mem_alloc)
!$omp allocate(/b_r3/) allocator(omp_const_mem_alloc)
!$omp allocate(/b_r4/) allocator(omp_high_bw_mem_alloc)
!$omp allocate(/b_r5/) allocator(omp_low_lat_mem_alloc)
- !$omp allocate(/b_r6/) allocator(omp_cgroup_mem_alloc) ! { dg-error "Predefined allocator 'omp_cgroup_mem_alloc' in ALLOCATOR clause at .1., used for list item '/b_r6/' at .2., may only be used for local static variables" }
- !$omp allocate(/b_r7/) allocator(omp_pteam_mem_alloc) ! { dg-error "Predefined allocator 'omp_pteam_mem_alloc' in ALLOCATOR clause at .1., used for list item '/b_r7/' at .2., may only be used for local static variables" }
- !$omp allocate(/b_r8/) allocator(omp_thread_mem_alloc) ! { dg-error "Predefined allocator 'omp_thread_mem_alloc' in ALLOCATOR clause at .1., used for list item '/b_r8/' at .2., may only be used for local static variables" }
+ !$omp allocate(/b_r6/) allocator(omp_cgroup_mem_alloc) ! { dg-error "Predefined allocator 'omp_cgroup_mem_alloc' in ALLOCATOR clause at .1., used for list item '/b_r6/' at .2., may not be used for static variables" }
+ !$omp allocate(/b_r7/) allocator(omp_pteam_mem_alloc) ! { dg-error "Predefined allocator 'omp_pteam_mem_alloc' in ALLOCATOR clause at .1., used for list item '/b_r7/' at .2., may not be used for static variables" }
+ !$omp allocate(/b_r8/) allocator(omp_thread_mem_alloc) ! { dg-error "Predefined allocator 'omp_thread_mem_alloc' in ALLOCATOR clause at .1., used for list item '/b_r8/' at .2., may not be used for static variables" }
end function
end subroutine
diff --git a/include/gomp-constants.h b/include/gomp-constants.h
index 0a0761043f9..d0d5ba7f2af 100644
--- a/include/gomp-constants.h
+++ b/include/gomp-constants.h
@@ -402,8 +402,10 @@ enum gomp_map_kind
#define GOMP_OMPX_PREDEF_MEMSPACE_MIN 200
#define GOMP_OMPX_PREDEF_MEMSPACE_MAX 200
-/* Predefined allocator with access == thread. */
-#define GOMP_OMP_PREDEF_ALLOC_THREADS 8
+/* Predefined allocator with access == cgroup, pteam, and thread. */
+#define GOMP_OMP_PREDEF_ALLOC_CGROUP 6
+#define GOMP_OMP_PREDEF_ALLOC_PTEAM 7
+#define GOMP_OMP_PREDEF_ALLOC_THREAD 8
/* Flag values for OpenMP 'requires' directive features. */
// compiler use only: OMP_REQUIRES_ATOMIC_DEFAULT_MEM_ORDER 0xf
diff --git a/libgomp/allocator.c b/libgomp/allocator.c
index 8fdaf9bd198..d2e88d97846 100644
--- a/libgomp/allocator.c
+++ b/libgomp/allocator.c
@@ -108,8 +108,12 @@ _Static_assert (GOMP_OMPX_PREDEF_ALLOC_MIN == ompx_gnu_min_predefined_alloc,
"GOMP_OMPX_PREDEF_ALLOC_MIN == ompx_gnu_min_predefined_alloc");
_Static_assert (GOMP_OMPX_PREDEF_ALLOC_MAX == ompx_gnu_max_predefined_alloc,
"GOMP_OMPX_PREDEF_ALLOC_MAX == ompx_gnu_max_predefined_alloc");
-_Static_assert (GOMP_OMP_PREDEF_ALLOC_THREADS == omp_thread_mem_alloc,
- "GOMP_OMP_PREDEF_ALLOC_THREADS == omp_thread_mem_alloc");
+_Static_assert (GOMP_OMP_PREDEF_ALLOC_CGROUP == omp_cgroup_mem_alloc,
+ "GOMP_OMP_PREDEF_ALLOC_CGROUP == omp_cgroup_mem_alloc");
+_Static_assert (GOMP_OMP_PREDEF_ALLOC_PTEAM == omp_pteam_mem_alloc,
+ "GOMP_OMP_PREDEF_ALLOC_PTEAM == omp_pteam_mem_alloc");
+_Static_assert (GOMP_OMP_PREDEF_ALLOC_THREAD == omp_thread_mem_alloc,
+ "GOMP_OMP_PREDEF_ALLOC_THREAD == omp_thread_mem_alloc");
#define omp_max_predefined_mem_space omp_low_lat_mem_space
#define ompx_gnu_min_predefined_mem_space ompx_gnu_managed_mem_space