1*79f661edSMike Rice // RUN: %clang_cc1 -triple x86_64-pc-linux-gnu -fopenmp -fopenmp-version=51 \
2*79f661edSMike Rice // RUN:   -fsyntax-only -verify %s
3*79f661edSMike Rice 
4*79f661edSMike Rice // RUN: %clang_cc1 -triple x86_64-pc-linux-gnu -fopenmp -fopenmp-version=51 \
5*79f661edSMike Rice // RUN:   -ast-print %s | FileCheck %s
6*79f661edSMike Rice 
7*79f661edSMike Rice // RUN: %clang_cc1 -triple x86_64-pc-linux-gnu -fopenmp -fopenmp-version=51 \
8*79f661edSMike Rice // RUN:   -emit-pch -o %t %s
9*79f661edSMike Rice 
10*79f661edSMike Rice // RUN: %clang_cc1 -triple x86_64-pc-linux-gnu -fopenmp -fopenmp-version=51 \
11*79f661edSMike Rice // RUN:   -include-pch %t -ast-print %s | FileCheck %s
12*79f661edSMike Rice 
13*79f661edSMike Rice // expected-no-diagnostics
14*79f661edSMike Rice 
15*79f661edSMike Rice #ifndef HEADER
16*79f661edSMike Rice #define HEADER
17*79f661edSMike Rice 
18*79f661edSMike Rice //CHECK: template <typename T, int C> void templ_foo(T t) {
19*79f661edSMike Rice //CHECK:   T j, z;
20*79f661edSMike Rice //CHECK:   #pragma omp teams loop collapse(C) reduction(+: z) lastprivate(j) bind(thread) num_teams(C + 2)
21*79f661edSMike Rice //CHECK:   for (T i = 0; i < t; ++i)
22*79f661edSMike Rice //CHECK:       for (j = 0; j < t; ++j)
23*79f661edSMike Rice //CHECK:           z += i + j;
24*79f661edSMike Rice //CHECK: }
25*79f661edSMike Rice 
26*79f661edSMike Rice //CHECK: template<> void templ_foo<int, 2>(int t) {
27*79f661edSMike Rice //CHECK:     int j, z;
28*79f661edSMike Rice //CHECK:     #pragma omp teams loop collapse(2) reduction(+: z) lastprivate(j) bind(thread) num_teams(2 + 2)
29*79f661edSMike Rice //CHECK:         for (int i = 0; i < t; ++i)
30*79f661edSMike Rice //CHECK:             for (j = 0; j < t; ++j)
31*79f661edSMike Rice //CHECK:                 z += i + j;
32*79f661edSMike Rice //CHECK: }
33*79f661edSMike Rice template <typename T, int C>
templ_foo(T t)34*79f661edSMike Rice void templ_foo(T t) {
35*79f661edSMike Rice 
36*79f661edSMike Rice   T j,z;
37*79f661edSMike Rice   #pragma omp teams loop collapse(C) reduction(+:z) lastprivate(j) bind(thread) num_teams(C+2)
38*79f661edSMike Rice   for (T i = 0; i<t; ++i)
39*79f661edSMike Rice     for (j = 0; j<t; ++j)
40*79f661edSMike Rice       z += i+j;
41*79f661edSMike Rice }
42*79f661edSMike Rice 
43*79f661edSMike Rice 
44*79f661edSMike Rice //CHECK: void test() {
test()45*79f661edSMike Rice void test() {
46*79f661edSMike Rice   constexpr int N = 100;
47*79f661edSMike Rice   float MTX[N][N];
48*79f661edSMike Rice   int aaa[1000];
49*79f661edSMike Rice 
50*79f661edSMike Rice   //CHECK: #pragma omp target map(tofrom: MTX)
51*79f661edSMike Rice   //CHECK: #pragma omp teams loop
52*79f661edSMike Rice   #pragma omp target map(MTX)
53*79f661edSMike Rice   #pragma omp teams loop
54*79f661edSMike Rice   for (auto j = 0; j < N; ++j) {
55*79f661edSMike Rice     MTX[0][j] = 0;
56*79f661edSMike Rice   }
57*79f661edSMike Rice 
58*79f661edSMike Rice   int j, z, z1;
59*79f661edSMike Rice   //CHECK: #pragma omp teams loop collapse(2) private(z) lastprivate(j) order(concurrent) reduction(+: z1) bind(parallel)
60*79f661edSMike Rice   #pragma omp teams loop collapse(2) private(z) lastprivate(j) \
61*79f661edSMike Rice                          order(concurrent) reduction(+:z1) bind(parallel)
62*79f661edSMike Rice   for (auto i = 0; i < N; ++i) {
63*79f661edSMike Rice     for (j = 0; j < N; ++j) {
64*79f661edSMike Rice       z = i+j;
65*79f661edSMike Rice       MTX[i][j] = z;
66*79f661edSMike Rice       z1 += z;
67*79f661edSMike Rice     }
68*79f661edSMike Rice   }
69*79f661edSMike Rice 
70*79f661edSMike Rice   //CHECK: #pragma omp target
71*79f661edSMike Rice   //CHECK: #pragma omp teams loop bind(teams) num_teams(16) thread_limit(8) default(none)
72*79f661edSMike Rice   #pragma omp target
73*79f661edSMike Rice   #pragma omp teams loop bind(teams) num_teams(16) thread_limit(8) default(none)
74*79f661edSMike Rice   for (auto i = 0; i < N; ++i) { }
75*79f661edSMike Rice 
76*79f661edSMike Rice   int pr;
77*79f661edSMike Rice   int fpr = 10;
78*79f661edSMike Rice   int k;
79*79f661edSMike Rice   int s = 20;
80*79f661edSMike Rice   //CHECK: #pragma omp target
81*79f661edSMike Rice   //CHECK: #pragma omp teams loop bind(teams) private(pr) firstprivate(fpr) shared(s) allocate(k) reduction(+: k)
82*79f661edSMike Rice   #pragma omp target
83*79f661edSMike Rice   #pragma omp teams loop bind(teams) private(pr) firstprivate(fpr) \
84*79f661edSMike Rice                         shared(s) allocate(k)  reduction(+:k)
85*79f661edSMike Rice   for (auto i = 0; i < N; ++i) {
86*79f661edSMike Rice     pr = i + fpr + s;
87*79f661edSMike Rice   }
88*79f661edSMike Rice }
89*79f661edSMike Rice 
90*79f661edSMike Rice //CHECK: void nobindingfunc() {
nobindingfunc()91*79f661edSMike Rice void nobindingfunc()
92*79f661edSMike Rice {
93*79f661edSMike Rice   //CHECK: #pragma omp teams loop
94*79f661edSMike Rice   #pragma omp teams loop
95*79f661edSMike Rice   for (int i=0; i<10; ++i) { }
96*79f661edSMike Rice }
97*79f661edSMike Rice 
bar()98*79f661edSMike Rice void bar()
99*79f661edSMike Rice {
100*79f661edSMike Rice   templ_foo<int,2>(8);
101*79f661edSMike Rice }
102*79f661edSMike Rice 
103*79f661edSMike Rice #endif // HEADER
104