summaryrefslogtreecommitdiff
path: root/libgomp
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2020-02-09 08:17:10 +0100
committerJakub Jelinek <jakub@redhat.com>2020-02-09 08:17:10 +0100
commit9bc3b95dfefd37d860c5dc0004f8a53f6290fbb1 (patch)
tree3c52ec4eaaf12982e117be6ae6dd5ed634055cbf /libgomp
parenta5691173e6142b11c5d45bed073ff65bfe1f2d73 (diff)
openmp: Optimize DECL_IN_CONSTANT_POOL vars in target regions
DECL_IN_CONSTANT_POOL are shared and thus don't really get emitted in the BLOCK where they are used, so for OpenMP target regions that have initializers gimplified into copying from them we actually map them at runtime from host to offload devices. This patch instead marks them as "omp declare target", so that they are on the target device from the beginning and don't need to be copied there. 2020-02-09 Jakub Jelinek <jakub@redhat.com> * gimplify.c (gimplify_adjust_omp_clauses_1): Promote DECL_IN_CONSTANT_POOL variables into "omp declare target" to avoid copying them around between host and target. * testsuite/libgomp.c/target-38.c: New test.
Diffstat (limited to 'libgomp')
-rw-r--r--libgomp/ChangeLog4
-rw-r--r--libgomp/testsuite/libgomp.c/target-38.c28
2 files changed, 32 insertions, 0 deletions
diff --git a/libgomp/ChangeLog b/libgomp/ChangeLog
index ba14005c6ea..0740df8b2a1 100644
--- a/libgomp/ChangeLog
+++ b/libgomp/ChangeLog
@@ -1,3 +1,7 @@
+2020-02-09 Jakub Jelinek <jakub@redhat.com>
+
+ * testsuite/libgomp.c/target-38.c: New test.
+
2020-02-06 Jakub Jelinek <jakub@redhat.com>
PR libgomp/93515
diff --git a/libgomp/testsuite/libgomp.c/target-38.c b/libgomp/testsuite/libgomp.c/target-38.c
new file mode 100644
index 00000000000..81699720526
--- /dev/null
+++ b/libgomp/testsuite/libgomp.c/target-38.c
@@ -0,0 +1,28 @@
+#define A(n) n##0, n##1, n##2, n##3, n##4, n##5, n##6, n##7, n##8, n##9
+#define B(n) A(n##0), A(n##1), A(n##2), A(n##3), A(n##4), A(n##5), A(n##6), A(n##7), A(n##8), A(n##9)
+
+int
+foo (int x)
+{
+ int b[] = { B(4), B(5), B(6) };
+ return b[x];
+}
+
+int v[] = { 1, 2, 3, 4, 5, 6 };
+#pragma omp declare target to (foo, v)
+
+int
+main ()
+{
+ int i = 5;
+ asm ("" : "+g" (i));
+ #pragma omp target map(tofrom:i)
+ {
+ int a[] = { B(1), B(2), B(3) };
+ asm ("" : : "m" (a) : "memory");
+ i = a[i] + foo (i) + v[i & 63];
+ }
+ if (i != 105 + 405 + 6)
+ __builtin_abort ();
+ return 0;
+}