summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Stubbs <ams@codesourcery.com>2022-04-01 16:12:16 +0100
committerAndrew Stubbs <ams@codesourcery.com>2022-04-02 13:13:15 +0100
commitda61dd848c0721cb2366bcd1197104caff92e145 (patch)
treed73ea27d2bfe2c6ca145a5ca6b94e4440987fcca
parent2e50103f04859f184734ec7b1ad2f18799cb63ef (diff)
openmp: Do USM transform for omp_target_alloc
OpenMP 5.0 says that omp_target_alloc should return USM addresses. gcc/ChangeLog: * omp-low.c (usm_transform): Transform omp_target_alloc and omp_target_free. libgomp/ChangeLog: * testsuite/libgomp.c/usm-6.c: Add omp_target_alloc. gcc/testsuite/ChangeLog: * c-c++-common/gomp/usm-2.c: Add omp_target_alloc. * c-c++-common/gomp/usm-3.c: Add omp_target_alloc.
-rw-r--r--gcc/ChangeLog.omp5
-rw-r--r--gcc/omp-low.c6
-rw-r--r--gcc/testsuite/ChangeLog.omp5
-rw-r--r--gcc/testsuite/c-c++-common/gomp/usm-2.c9
-rw-r--r--gcc/testsuite/c-c++-common/gomp/usm-3.c9
-rw-r--r--libgomp/ChangeLog.omp4
-rw-r--r--libgomp/testsuite/libgomp.c/usm-6.c13
7 files changed, 45 insertions, 6 deletions
diff --git a/gcc/ChangeLog.omp b/gcc/ChangeLog.omp
index ef220fa9796..1141e72ebc5 100644
--- a/gcc/ChangeLog.omp
+++ b/gcc/ChangeLog.omp
@@ -1,3 +1,8 @@
+2022-04-02 Andrew Stubbs <ams@codesourcery.com>
+
+ * omp-low.c (usm_transform): Transform omp_target_alloc and
+ omp_target_free.
+
2022-03-31 Abid Qadeer <abidh@codesourcery.com>
* omp-low.c (lower_omp_allocate): Move allocate declaration
diff --git a/gcc/omp-low.c b/gcc/omp-low.c
index a2fec50192c..4e73a7a4085 100644
--- a/gcc/omp-low.c
+++ b/gcc/omp-low.c
@@ -15884,7 +15884,8 @@ usm_transform (gimple_stmt_iterator *gsi_p, bool *,
if ((strcmp (name, "malloc") == 0)
|| (fndecl_built_in_p (fndecl, BUILT_IN_NORMAL)
&& DECL_FUNCTION_CODE (fndecl) == BUILT_IN_MALLOC)
- || DECL_IS_REPLACEABLE_OPERATOR_NEW_P (fndecl))
+ || DECL_IS_REPLACEABLE_OPERATOR_NEW_P (fndecl)
+ || strcmp (name, "omp_target_alloc") == 0)
{
tree omp_alloc_type
= build_function_type_list (ptr_type_node, size_type_node,
@@ -15956,7 +15957,8 @@ usm_transform (gimple_stmt_iterator *gsi_p, bool *,
|| (fndecl_built_in_p (fndecl, BUILT_IN_NORMAL)
&& DECL_FUNCTION_CODE (fndecl) == BUILT_IN_FREE)
|| (DECL_IS_OPERATOR_DELETE_P (fndecl)
- && DECL_IS_REPLACEABLE_OPERATOR (fndecl)))
+ && DECL_IS_REPLACEABLE_OPERATOR (fndecl))
+ || strcmp (name, "omp_target_free") == 0)
{
tree omp_free_type
= build_function_type_list (void_type_node, ptr_type_node,
diff --git a/gcc/testsuite/ChangeLog.omp b/gcc/testsuite/ChangeLog.omp
index 5d84b27f261..66349b3ceda 100644
--- a/gcc/testsuite/ChangeLog.omp
+++ b/gcc/testsuite/ChangeLog.omp
@@ -1,3 +1,8 @@
+2022-04-02 Andrew Stubbs <ams@codesourcery.com>
+
+ * c-c++-common/gomp/usm-2.c: Add omp_target_alloc.
+ * c-c++-common/gomp/usm-3.c: Add omp_target_alloc.
+
2022-03-11 Andrew Stubbs <ams@codesourcery.com>
Backport of the patch posted at
diff --git a/gcc/testsuite/c-c++-common/gomp/usm-2.c b/gcc/testsuite/c-c++-common/gomp/usm-2.c
index 64dbb6be131..8c20ef94e69 100644
--- a/gcc/testsuite/c-c++-common/gomp/usm-2.c
+++ b/gcc/testsuite/c-c++-common/gomp/usm-2.c
@@ -12,6 +12,8 @@ void *aligned_alloc (__SIZE_TYPE__, __SIZE_TYPE__);
void *calloc(__SIZE_TYPE__, __SIZE_TYPE__);
void *realloc(void *, __SIZE_TYPE__);
void free (void *);
+void *omp_target_alloc (__SIZE_TYPE__, int);
+void omp_target_free (void *, int);
#ifdef __cplusplus
}
@@ -24,16 +26,21 @@ foo ()
void *p2 = realloc(p1, 30);
void *p3 = calloc(4, 15);
void *p4 = aligned_alloc(16, 40);
+ void *p5 = omp_target_alloc(50, 1);
free (p2);
free (p3);
free (p4);
+ omp_target_free (p5, 1);
}
/* { dg-final { scan-tree-dump-times "omp_alloc \\(20, 10\\)" 1 "usm_transform" } } */
/* { dg-final { scan-tree-dump-times "omp_realloc \\(.*, 30, 10, 10\\)" 1 "usm_transform" } } */
/* { dg-final { scan-tree-dump-times "omp_calloc \\(4, 15, 10\\)" 1 "usm_transform" } } */
/* { dg-final { scan-tree-dump-times "omp_aligned_alloc \\(16, 40, 10\\)" 1 "usm_transform" } } */
-/* { dg-final { scan-tree-dump-times "omp_free" 3 "usm_transform" } } */
+/* { dg-final { scan-tree-dump-times "omp_alloc \\(50, 10\\)" 1 "usm_transform" } } */
+/* { dg-final { scan-tree-dump-times "omp_free" 4 "usm_transform" } } */
/* { dg-final { scan-tree-dump-not " free" "usm_transform" } } */
/* { dg-final { scan-tree-dump-not " aligned_alloc" "usm_transform" } } */
/* { dg-final { scan-tree-dump-not " malloc" "usm_transform" } } */
+/* { dg-final { scan-tree-dump-not " omp_target_alloc" "usm_transform" } } */
+/* { dg-final { scan-tree-dump-not " omp_target_free" "usm_transform" } } */
diff --git a/gcc/testsuite/c-c++-common/gomp/usm-3.c b/gcc/testsuite/c-c++-common/gomp/usm-3.c
index 934582ea5fd..2b0cbb45e27 100644
--- a/gcc/testsuite/c-c++-common/gomp/usm-3.c
+++ b/gcc/testsuite/c-c++-common/gomp/usm-3.c
@@ -10,6 +10,8 @@ void *aligned_alloc (__SIZE_TYPE__, __SIZE_TYPE__);
void *calloc(__SIZE_TYPE__, __SIZE_TYPE__);
void *realloc(void *, __SIZE_TYPE__);
void free (void *);
+void *omp_target_alloc (__SIZE_TYPE__, int);
+void omp_target_free (void *, int);
#ifdef __cplusplus
}
@@ -22,16 +24,21 @@ foo ()
void *p2 = realloc(p1, 30);
void *p3 = calloc(4, 15);
void *p4 = aligned_alloc(16, 40);
+ void *p5 = omp_target_alloc(50, 1);
free (p2);
free (p3);
free (p4);
+ omp_target_free (p5, 1);
}
/* { dg-final { scan-tree-dump-times "omp_alloc \\(20, 10\\)" 1 "usm_transform" } } */
/* { dg-final { scan-tree-dump-times "omp_realloc \\(.*, 30, 10, 10\\)" 1 "usm_transform" } } */
/* { dg-final { scan-tree-dump-times "omp_calloc \\(4, 15, 10\\)" 1 "usm_transform" } } */
/* { dg-final { scan-tree-dump-times "omp_aligned_alloc \\(16, 40, 10\\)" 1 "usm_transform" } } */
-/* { dg-final { scan-tree-dump-times "omp_free" 3 "usm_transform" } } */
+/* { dg-final { scan-tree-dump-times "omp_alloc \\(50, 10\\)" 1 "usm_transform" } } */
+/* { dg-final { scan-tree-dump-times "omp_free" 4 "usm_transform" } } */
/* { dg-final { scan-tree-dump-not " free" "usm_transform" } } */
/* { dg-final { scan-tree-dump-not " aligned_alloc" "usm_transform" } } */
/* { dg-final { scan-tree-dump-not " malloc" "usm_transform" } } */
+/* { dg-final { scan-tree-dump-not " omp_target_alloc" "usm_transform" } } */
+/* { dg-final { scan-tree-dump-not " omp_target_free" "usm_transform" } } */
diff --git a/libgomp/ChangeLog.omp b/libgomp/ChangeLog.omp
index 299b8169031..b89a393b1fa 100644
--- a/libgomp/ChangeLog.omp
+++ b/libgomp/ChangeLog.omp
@@ -1,3 +1,7 @@
+2022-04-02 Andrew Stubbs <ams@codesourcery.com>
+
+ * testsuite/libgomp.c/usm-6.c: Add omp_target_alloc.
+
2022-03-31 Abid Qadeer <abidh@codesourcery.com>
* testsuite/libgomp.fortran/allocate-2.f90: Remove commented lines.
diff --git a/libgomp/testsuite/libgomp.c/usm-6.c b/libgomp/testsuite/libgomp.c/usm-6.c
index d2c828fdc9d..c207140092a 100644
--- a/libgomp/testsuite/libgomp.c/usm-6.c
+++ b/libgomp/testsuite/libgomp.c/usm-6.c
@@ -4,6 +4,8 @@
#include <stdint.h>
#include <stdlib.h>
+#include <omp.h>
+
/* On old systems, the declaraition may not be present in stdlib.h which
will generate a warning. This function is going to be replaced with
omp_aligned_alloc so the purpose of this declaration is to avoid that
@@ -19,7 +21,8 @@ main ()
int *b = (int *) calloc(sizeof(int), 3);
int *c = (int *) realloc(NULL, sizeof(int) * 4);
int *d = (int *) aligned_alloc(32, sizeof(int));
- if (!a || !b || !c || !d)
+ int *e = (int *) omp_target_alloc(sizeof(int), 1);
+ if (!a || !b || !c || !d || !e)
__builtin_abort ();
a[0] = 42;
@@ -36,6 +39,7 @@ main ()
uintptr_t b_p = (uintptr_t)b;
uintptr_t c_p = (uintptr_t)c;
uintptr_t d_p = (uintptr_t)d;
+ uintptr_t e_p = (uintptr_t)e;
if (d_p & 31 != 0)
__builtin_abort ();
@@ -52,9 +56,12 @@ main ()
__builtin_abort ();
if (d_p != (uintptr_t)d)
__builtin_abort ();
+ if (e_p != (uintptr_t)e)
+ __builtin_abort ();
a[0] = 72;
b[0] = 82;
c[0] = 92;
+ e[0] = 102;
}
#pragma omp target
@@ -74,10 +81,12 @@ main ()
if (a[0] != 72 || a[1] != 73
|| b[0] != 82 || b[1] != 83
- || c[0] != 92 || c[1] != 93)
+ || c[0] != 92 || c[1] != 93
+ || e[0] != 102)
__builtin_abort ();
free(a);
free(b);
free(c);
+ omp_target_free(e, 1);
return 0;
}