253 lines · cpp
1// RUN: %clang_cc1 -verify -fopenmp -ast-print %s | FileCheck -check-prefixes CHECK,OMP51 %s2// RUN: %clang_cc1 -fopenmp -x c++ -std=c++11 -emit-pch -o %t %s3// RUN: %clang_cc1 -fopenmp -std=c++11 -include-pch %t -verify %s -ast-print | FileCheck -check-prefixes CHECK,OMP51 %s4 5// RUN: %clang_cc1 -verify -fopenmp-version=52 -fopenmp -ast-print %s | FileCheck -check-prefixes CHECK,OMP52 %s6// RUN: %clang_cc1 -fopenmp -fopenmp-version=52 -x c++ -std=c++11 -emit-pch -o %t %s7// RUN: %clang_cc1 -fopenmp -fopenmp-version=52 -std=c++11 -include-pch %t -verify %s -ast-print | FileCheck -check-prefixes CHECK,OMP52 %s8 9// RUN: %clang_cc1 -verify -fopenmp-simd -ast-print %s | FileCheck -check-prefixes CHECK,OMP51 %s10// RUN: %clang_cc1 -fopenmp-simd -x c++ -std=c++11 -emit-pch -o %t %s11// RUN: %clang_cc1 -fopenmp-simd -std=c++11 -include-pch %t -verify %s -ast-print | FileCheck -check-prefixes CHECK,OMP51 %s12// expected-no-diagnostics13 14#ifndef HEADER15#define HEADER16 17void foo() {}18 19template <class T, int N>20T tmain (T argc) {21 T b = argc, c, d, e, f, g;22 static T a;23 #pragma omp for ordered24 for (int i =0 ; i < argc; ++i)25 #pragma omp ordered26 {27 a=2;28 }29 #pragma omp for ordered30 for (int i =0 ; i < argc; ++i)31 #pragma omp ordered threads32 {33 a=2;34 }35 #pragma omp simd36 for (int i =0 ; i < argc; ++i)37 #pragma omp ordered simd38 {39 a=2;40 }41 #pragma omp for simd42 for (int i =0 ; i < argc; ++i)43 #pragma omp ordered simd44 {45 a=2;46 }47 #pragma omp parallel for simd48 for (int i =0 ; i < argc; ++i)49 #pragma omp ordered simd50 {51 a=2;52 }53 #pragma omp parallel for ordered(1)54 for (int i =0 ; i < argc; ++i) {55#if _OPENMP >= 20211156 #pragma omp ordered doacross(source:)57 #pragma omp ordered doacross(sink:i+N)58 #pragma omp ordered doacross(sink: omp_cur_iteration - 1)59 #pragma omp ordered doacross(source: omp_cur_iteration)60#else61 #pragma omp ordered depend(source)62 #pragma omp ordered depend(sink:i+N)63#endif64 a = 2;65 }66 return (0);67}68 69// CHECK: static T a;70// CHECK-NEXT: #pragma omp for ordered71// CHECK-NEXT: for (int i = 0; i < argc; ++i)72// CHECK-NEXT: #pragma omp ordered{{$}}73// CHECK-NEXT: {74// CHECK-NEXT: a = 2;75// CHECK-NEXT: }76// CHECK-NEXT: #pragma omp for ordered77// CHECK-NEXT: for (int i = 0; i < argc; ++i)78// CHECK-NEXT: #pragma omp ordered threads79// CHECK-NEXT: {80// CHECK-NEXT: a = 2;81// CHECK-NEXT: }82// CHECK-NEXT: #pragma omp simd83// CHECK-NEXT: for (int i = 0; i < argc; ++i)84// CHECK-NEXT: #pragma omp ordered simd85// CHECK-NEXT: {86// CHECK-NEXT: a = 2;87// CHECK-NEXT: }88// CHECK-NEXT: #pragma omp for simd89// CHECK-NEXT: for (int i = 0; i < argc; ++i)90// CHECK-NEXT: #pragma omp ordered simd91// CHECK-NEXT: {92// CHECK-NEXT: a = 2;93// CHECK-NEXT: }94// CHECK-NEXT: #pragma omp parallel for simd95// CHECK-NEXT: for (int i = 0; i < argc; ++i)96// CHECK-NEXT: #pragma omp ordered simd97// CHECK-NEXT: {98// CHECK-NEXT: a = 2;99// CHECK-NEXT: }100// CHECK-NEXT: #pragma omp parallel for ordered(1)101// CHECK-NEXT: for (int i = 0; i < argc; ++i) {102#if _OPENMP >= 202111103// OMP52: #pragma omp ordered doacross(source:)104// OMP52-NEXT: #pragma omp ordered doacross(sink: i + N)105// OMP52-NEXT: #pragma omp ordered doacross(sink: omp_cur_iteration - 1)106// OMP52-NEXT: #pragma omp ordered doacross(source: omp_cur_iteration)107#else108// OMP51: #pragma omp ordered depend(source)109// OMP51-NEXT: #pragma omp ordered depend(sink : i + N)110#endif111// CHECK-NEXT: a = 2;112// CHECK-NEXT: }113// CHECK: static int a;114// CHECK-NEXT: #pragma omp for ordered115// CHECK-NEXT: for (int i = 0; i < argc; ++i)116// CHECK-NEXT: #pragma omp ordered117// CHECK-NEXT: {118// CHECK-NEXT: a = 2;119// CHECK-NEXT: }120// CHECK-NEXT: #pragma omp for ordered121// CHECK-NEXT: for (int i = 0; i < argc; ++i)122// CHECK-NEXT: #pragma omp ordered threads123// CHECK-NEXT: {124// CHECK-NEXT: a = 2;125// CHECK-NEXT: }126// CHECK-NEXT: #pragma omp simd127// CHECK-NEXT: for (int i = 0; i < argc; ++i)128// CHECK-NEXT: #pragma omp ordered simd129// CHECK-NEXT: {130// CHECK-NEXT: a = 2;131// CHECK-NEXT: }132// CHECK-NEXT: #pragma omp for simd133// CHECK-NEXT: for (int i = 0; i < argc; ++i)134// CHECK-NEXT: #pragma omp ordered simd135// CHECK-NEXT: {136// CHECK-NEXT: a = 2;137// CHECK-NEXT: }138// CHECK-NEXT: #pragma omp parallel for simd139// CHECK-NEXT: for (int i = 0; i < argc; ++i)140// CHECK-NEXT: #pragma omp ordered simd141// CHECK-NEXT: {142// CHECK-NEXT: a = 2;143// CHECK-NEXT: }144// CHECK-NEXT: #pragma omp parallel for ordered(1)145// CHECK-NEXT: for (int i = 0; i < argc; ++i) {146#if _OPENMP >= 202111147// OMP52: #pragma omp ordered doacross(source:)148// OMP52-NEXT: #pragma omp ordered doacross(sink: i + 3)149// OMP52-NEXT: #pragma omp ordered doacross(sink: omp_cur_iteration - 1)150// OMP52-NEXT: #pragma omp ordered doacross(source: omp_cur_iteration)151#else152// OMP51: #pragma omp ordered depend(source)153// OMP51-NEXT: #pragma omp ordered depend(sink : i + 3)154#endif155// CHECK-NEXT: a = 2;156// CHECK-NEXT: }157 158// CHECK-LABEL: int main(159int main (int argc, char **argv) {160 int b = argc, c, d, e, f, g;161 static int a;162// CHECK: static int a;163 #pragma omp for ordered164 for (int i =0 ; i < argc; ++i)165 #pragma omp ordered166 {167 a=2;168 }169 #pragma omp for ordered170 for (int i =0 ; i < argc; ++i)171 #pragma omp ordered threads172 {173 a=2;174 }175 #pragma omp simd176 for (int i =0 ; i < argc; ++i)177 #pragma omp ordered simd178 {179 a=2;180 }181 #pragma omp for simd182 for (int i =0 ; i < argc; ++i)183 #pragma omp ordered simd184 {185 a=2;186 }187 #pragma omp parallel for simd188 for (int i =0 ; i < argc; ++i)189 #pragma omp ordered simd190 {191 a=2;192 }193 #pragma omp parallel for ordered(1)194 for (int i =0 ; i < argc; ++i) {195#if _OPENMP >= 202111196 #pragma omp ordered doacross(source:)197 #pragma omp ordered doacross(sink: i - 5)198 #pragma omp ordered doacross(sink: omp_cur_iteration - 1)199 #pragma omp ordered doacross(source: omp_cur_iteration)200#else201 #pragma omp ordered depend(source)202 #pragma omp ordered depend(sink: i - 5)203#endif204 a = 2;205 }206// CHECK-NEXT: #pragma omp for ordered207// CHECK-NEXT: for (int i = 0; i < argc; ++i)208// CHECK-NEXT: #pragma omp ordered209// CHECK-NEXT: {210// CHECK-NEXT: a = 2;211// CHECK-NEXT: }212// CHECK-NEXT: #pragma omp for ordered213// CHECK-NEXT: for (int i = 0; i < argc; ++i)214// CHECK-NEXT: #pragma omp ordered threads215// CHECK-NEXT: {216// CHECK-NEXT: a = 2;217// CHECK-NEXT: }218// CHECK-NEXT: #pragma omp simd219// CHECK-NEXT: for (int i = 0; i < argc; ++i)220// CHECK-NEXT: #pragma omp ordered simd221// CHECK-NEXT: {222// CHECK-NEXT: a = 2;223// CHECK-NEXT: }224// CHECK-NEXT: #pragma omp for simd225// CHECK-NEXT: for (int i = 0; i < argc; ++i)226// CHECK-NEXT: #pragma omp ordered simd227// CHECK-NEXT: {228// CHECK-NEXT: a = 2;229// CHECK-NEXT: }230// CHECK-NEXT: #pragma omp parallel for simd231// CHECK-NEXT: for (int i = 0; i < argc; ++i)232// CHECK-NEXT: #pragma omp ordered simd233// CHECK-NEXT: {234// CHECK-NEXT: a = 2;235// CHECK-NEXT: }236// CHECK-NEXT: #pragma omp parallel for ordered(1)237// CHECK-NEXT: for (int i = 0; i < argc; ++i) {238#if _OPENMP >= 202111239// OMP52: #pragma omp ordered doacross(source:)240// OMP52-NEXT: #pragma omp ordered doacross(sink: i - 5)241// OMP52-NEXT: #pragma omp ordered doacross(sink: omp_cur_iteration - 1)242// OMP52-NEXT: #pragma omp ordered doacross(source: omp_cur_iteration)243#else244// OMP51: #pragma omp ordered depend(source)245// OMP51-NEXT: #pragma omp ordered depend(sink : i - 5)246#endif247// CHECK-NEXT: a = 2;248// CHECK-NEXT: }249 return tmain<int, 3>(argc);250}251 252#endif253