1 // { dg-do compile }
2 // { dg-additional-options "-fdump-tree-gimple" }
3 
4 int v = 6;
5 void bar (int);
6 void bar2 (int, long *, long *);
7 int baz (void);
8 #pragma omp declare target to (bar, baz, v)
9 
10 template <int N>
11 void
foo(int a,int b,long c,long d)12 foo (int a, int b, long c, long d)
13 {
14   /* The OpenMP 4.5 spec says that these expressions are evaluated before
15      target region on combined target teams, so those cases are always
16      fine.  */
17   #pragma omp target
18   bar (0);
19   #pragma omp target
20   #pragma omp teams
21   bar (1);
22   #pragma omp target teams
23   bar (2);
24   #pragma omp target
25   #pragma omp teams num_teams (4)
26   bar (3);
27   #pragma omp target teams num_teams (4)
28   bar (4);
29   #pragma omp target
30   #pragma omp teams thread_limit (7)
31   bar (5);
32   #pragma omp target teams thread_limit (7)
33   bar (6);
34   #pragma omp target
35   #pragma omp teams num_teams (4) thread_limit (8)
36   {
37     {
38       bar (7);
39     }
40   }
41   #pragma omp target teams num_teams (4) thread_limit (8)
42   bar (8);
43   #pragma omp target
44   #pragma omp teams num_teams (a) thread_limit (b)
45   bar (9);
46   #pragma omp target teams num_teams (a) thread_limit (b)
47   bar (10);
48   #pragma omp target
49   #pragma omp teams num_teams (c + 1) thread_limit (d - 1)
50   bar (11);
51   #pragma omp target teams num_teams (c + 1) thread_limit (d - 1)
52   bar (12);
53   #pragma omp target map (always, to: c, d)
54   #pragma omp teams num_teams (c + 1) thread_limit (d - 1)
55   bar (13);
56   #pragma omp target data map (to: c, d)
57   {
58     #pragma omp target defaultmap (tofrom: scalar)
59     bar2 (14, &c, &d);
60     /* This is one of the cases which can't be generally optimized,
61        the c and d are (or could be) already mapped and whether
62        their device and original values match is unclear.  */
63     #pragma omp target map (to: c, d)
64     #pragma omp teams num_teams (c + 1) thread_limit (d - 1)
65     bar (15);
66   }
67   /* This can't be optimized, there are function calls inside of
68      target involved.  */
69   #pragma omp target
70   #pragma omp teams num_teams (baz () + 1) thread_limit (baz () - 1)
71   bar (16);
72   #pragma omp target teams num_teams (baz () + 1) thread_limit (baz () - 1)
73   bar (17);
74   /* This one can't be optimized, as v might have different value between
75      host and target.  */
76   #pragma omp target
77   #pragma omp teams num_teams (v + 1) thread_limit (v - 1)
78   bar (18);
79 }
80 
81 void
foo(int a,int b,long c,long d)82 foo (int a, int b, long c, long d)
83 {
84   foo<0> (a, b, c, d);
85 }
86 
87 /* { dg-final { scan-tree-dump-times "num_teams\\(-1\\)" 3 "gimple" } } */
88 /* { dg-final { scan-tree-dump-times "thread_limit\\(-1\\)" 3 "gimple" } } */
89 /* { dg-final { scan-tree-dump-times "num_teams\\(0\\)" 4 "gimple" } } */
90 /* { dg-final { scan-tree-dump-times "thread_limit\\(0\\)" 6 "gimple" } } */
91 /* { dg-final { scan-tree-dump-times "num_teams\\(1\\)" 2 "gimple" } } */
92 /* { dg-final { scan-tree-dump-times "thread_limit\\(1\\)" 0 "gimple" } } */
93