blob: f78a608dc490526777d5bab2ff27e7d5809615bf [file] [log] [blame]
// { 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)
template <int N>
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);
}
void
foo (int a, int b, long c, long d)
{
foo<0> (a, b, c, d);
}
/* { 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" } } */