diff options
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.c | 85 |
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" } } */ |