|  | /* { dg-additional-options "-fdump-tree-original" }  */ | 
|  | /* PR c++/51484  */ | 
|  |  | 
|  | #define TEST(T) { \ | 
|  | int fail = 0, trial; \ | 
|  | for (int trial = 0; trial < TRIALS && fail == 0; trial++) { \ | 
|  | _Pragma("omp target teams num_teams(1) thread_limit(1024)") \ | 
|  | {T} \ | 
|  | } \ | 
|  | } | 
|  |  | 
|  | #define TRIALS (1) | 
|  | #define N (1024*3) | 
|  |  | 
|  | int main(void) { | 
|  |  | 
|  | double C[N], D[N]; | 
|  | double S[N]; | 
|  | double p[2]; | 
|  | int i; | 
|  | for (i = 0; i < N; i++) | 
|  | {C[i] = 1; D[i] = i;} | 
|  |  | 
|  | int max_threads = 224; | 
|  |  | 
|  | #define PARALLEL(X) TEST({ \ | 
|  | _Pragma("omp parallel if(threads[0] > 1) num_threads(threads[0])") \ | 
|  | { \ | 
|  | _Pragma("omp for ordered") \ | 
|  | X  \ | 
|  | _Pragma("omp for schedule(auto) ordered") \ | 
|  | X  \ | 
|  | } \ | 
|  | }) | 
|  |  | 
|  | for (int t = 0; t <= max_threads; t += max_threads) { | 
|  | int threads[1]; threads[0] = t; | 
|  | S[0] = 0; | 
|  | PARALLEL( | 
|  | for (int i = 0; i < N; i++) { \ | 
|  | _Pragma("omp ordered") \ | 
|  | S[0] += C[i] + D[i]; \ | 
|  | }) | 
|  | } | 
|  | return 0; | 
|  | } | 
|  |  | 
|  | /* On expansion, the _Pragma were wrongly placed, ensure the order is now correct: */ | 
|  | /* { dg-final { scan-tree-dump "#pragma omp target.*#pragma omp teams num_teams\\(1\\) thread_limit\\(1024\\).*#pragma omp parallel num_threads\\(threads\\\[0\\\]\\) if\\(threads\\\[0\\\] > 1\\).*#pragma omp for ordered.*#pragma omp ordered.*#pragma omp for ordered schedule\\(auto\\).*#pragma omp ordered" "original" } } */ | 
|  |  |