summaryrefslogtreecommitdiff
path: root/gcc/testsuite/c-c++-common/gomp/target-teams-1.c
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/testsuite/c-c++-common/gomp/target-teams-1.c')
-rw-r--r--gcc/testsuite/c-c++-common/gomp/target-teams-1.c85
1 files changed, 85 insertions, 0 deletions
diff --git a/gcc/testsuite/c-c++-common/gomp/target-teams-1.c b/gcc/testsuite/c-c++-common/gomp/target-teams-1.c
new file mode 100644
index 0000000000..51b8d48856
--- /dev/null
+++ b/gcc/testsuite/c-c++-common/gomp/target-teams-1.c
@@ -0,0 +1,85 @@
+/* { dg-do compile } */
+/* { dg-additional-options "-fdump-tree-gimple" } */
+
+int v = 6;
+void bar (int);
+void bar2 (int, long *, long *);
+int baz (void);
+#pragma omp declare target to (bar, baz, v)
+
+void
+foo (int a, int b, long c, long d)
+{
+ /* The OpenMP 4.5 spec says that these expressions are evaluated before
+ target region on combined target teams, so those cases are always
+ fine. */
+ #pragma omp target
+ bar (0);
+ #pragma omp target
+ #pragma omp teams
+ bar (1);
+ #pragma omp target teams
+ bar (2);
+ #pragma omp target
+ #pragma omp teams num_teams (4)
+ bar (3);
+ #pragma omp target teams num_teams (4)
+ bar (4);
+ #pragma omp target
+ #pragma omp teams thread_limit (7)
+ bar (5);
+ #pragma omp target teams thread_limit (7)
+ bar (6);
+ #pragma omp target
+ #pragma omp teams num_teams (4) thread_limit (8)
+ {
+ {
+ bar (7);
+ }
+ }
+ #pragma omp target teams num_teams (4) thread_limit (8)
+ bar (8);
+ #pragma omp target
+ #pragma omp teams num_teams (a) thread_limit (b)
+ bar (9);
+ #pragma omp target teams num_teams (a) thread_limit (b)
+ bar (10);
+ #pragma omp target
+ #pragma omp teams num_teams (c + 1) thread_limit (d - 1)
+ bar (11);
+ #pragma omp target teams num_teams (c + 1) thread_limit (d - 1)
+ bar (12);
+ #pragma omp target map (always, to: c, d)
+ #pragma omp teams num_teams (c + 1) thread_limit (d - 1)
+ bar (13);
+ #pragma omp target data map (to: c, d)
+ {
+ #pragma omp target defaultmap (tofrom: scalar)
+ bar2 (14, &c, &d);
+ /* This is one of the cases which can't be generally optimized,
+ the c and d are (or could be) already mapped and whether
+ their device and original values match is unclear. */
+ #pragma omp target map (to: c, d)
+ #pragma omp teams num_teams (c + 1) thread_limit (d - 1)
+ bar (15);
+ }
+ /* This can't be optimized, there are function calls inside of
+ target involved. */
+ #pragma omp target
+ #pragma omp teams num_teams (baz () + 1) thread_limit (baz () - 1)
+ bar (16);
+ #pragma omp target teams num_teams (baz () + 1) thread_limit (baz () - 1)
+ bar (17);
+ /* This one can't be optimized, as v might have different value between
+ host and target. */
+ #pragma omp target
+ #pragma omp teams num_teams (v + 1) thread_limit (v - 1)
+ bar (18);
+}
+
+/* { dg-final { scan-tree-dump-times "num_teams\\(-1\\)" 3 "gimple" } } */
+/* { dg-final { scan-tree-dump-times "thread_limit\\(-1\\)" 3 "gimple" } } */
+/* { dg-final { scan-tree-dump-times "num_teams\\(0\\)" 4 "gimple" } } */
+/* { dg-final { scan-tree-dump-times "thread_limit\\(0\\)" 6 "gimple" } } */
+/* { dg-final { scan-tree-dump-times "num_teams\\(1\\)" 2 "gimple" } } */
+/* { dg-final { scan-tree-dump-times "thread_limit\\(1\\)" 0 "gimple" } } */