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 Ricevoid 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 Ricevoid 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 Ricevoid 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 Ricevoid bar() 99*79f661edSMike Rice { 100*79f661edSMike Rice templ_foo<int,2>(8); 101*79f661edSMike Rice } 102*79f661edSMike Rice 103*79f661edSMike Rice #endif // HEADER 104