1 // RUN: %clang_cc1 -verify -fopenmp -fopenmp-version=50 -ast-print %s | FileCheck %s 2 // RUN: %clang_cc1 -fopenmp -fopenmp-version=50 -x c++ -std=c++11 -emit-pch -o %t %s 3 // RUN: %clang_cc1 -fopenmp -fopenmp-version=50 -std=c++11 -include-pch %t -fsyntax-only -verify %s -ast-print | FileCheck %s 4 5 // RUN: %clang_cc1 -verify -fopenmp-simd -fopenmp-version=50 -ast-print %s | FileCheck %s 6 // RUN: %clang_cc1 -fopenmp-simd -fopenmp-version=50 -x c++ -std=c++11 -emit-pch -o %t %s 7 // RUN: %clang_cc1 -fopenmp-simd -fopenmp-version=50 -std=c++11 -include-pch %t -fsyntax-only -verify %s -ast-print | FileCheck %s 8 9 // RUN: %clang_cc1 -DOMP51 -verify -fopenmp -fopenmp-version=51 -ast-print %s | FileCheck -check-prefixes=CHECK,OMP51 %s 10 // RUN: %clang_cc1 -DOMP51 -fopenmp -fopenmp-version=51 -x c++ -std=c++11 -emit-pch -o %t %s 11 // RUN: %clang_cc1 -DOMP51 -fopenmp -fopenmp-version=51 -std=c++11 -include-pch %t -fsyntax-only -verify %s -ast-print | FileCheck -check-prefixes=CHECK,OMP51 %s 12 13 // RUN: %clang_cc1 -DOMP51 -verify -fopenmp-simd -fopenmp-version=51 -ast-print %s | FileCheck -check-prefixes=CHECK,OMP51 %s 14 // RUN: %clang_cc1 -DOMP51 -fopenmp-simd -fopenmp-version=51 -x c++ -std=c++11 -emit-pch -o %t %s 15 // RUN: %clang_cc1 -DOMP51 -fopenmp-simd -fopenmp-version=51 -std=c++11 -include-pch %t -fsyntax-only -verify %s -ast-print | FileCheck -check-prefixes=CHECK,OMP51 %s 16 // expected-no-diagnostics 17 18 #ifndef HEADER 19 #define HEADER 20 21 void foo() {} 22 23 template <class T, class U> 24 T foo(T targ, U uarg) { 25 static T a, *p; 26 U b; 27 int l; 28 #pragma omp target update to(([a][targ])p, a) if(l>5) device(l) nowait depend(inout:l) 29 30 #pragma omp target update from(b, ([a][targ])p) if(l<5) device(l-1) nowait depend(inout:l) 31 32 U marr[10][10][10]; 33 #pragma omp target update to(marr[2][0:2][0:2]) 34 35 #pragma omp target update from(marr[2][0:2][0:2]) 36 37 #pragma omp target update from(marr[:2][0:2][0:2:1]) 38 39 #pragma omp target update to(marr[:l][:l][l:]) 40 41 #pragma omp target update to(marr[:2][:1][:]) 42 43 #pragma omp target update from(marr[:2][:1][:]) 44 45 #pragma omp target update to(marr[:2][:][:1]) 46 47 #pragma omp target update from(marr[:2][:][:1]) 48 49 #pragma omp target update to(marr[:2][:] [1:]) 50 51 #pragma omp target update from(marr[:2][:][1:]) 52 53 #pragma omp target update to(marr[:1][3:2][:2]) 54 55 #pragma omp target update from(marr[:1][3:2][:2]) 56 57 #pragma omp target update to(marr[:1][:2][0]) 58 59 #pragma omp target update from(marr[:1][:2][0]) 60 61 int arr[100][100]; 62 #pragma omp target update to(arr[2][0:1:2]) 63 64 #pragma omp target update from(arr[2][0:1:2]) 65 66 #ifdef OMP51 67 #pragma omp target update to(present: arr[2][0:1:2]) 68 69 #pragma omp target update from(present: arr[2][0:1:2], a) 70 #endif 71 72 return a + targ + (T)b; 73 } 74 // CHECK: static T a, *p; 75 // CHECK-NEXT: U b; 76 // CHECK-NEXT: int l; 77 // CHECK-NEXT: #pragma omp target update to(([a][targ])p,a) if(l > 5) device(l) nowait depend(inout : l){{$}} 78 // CHECK-NEXT: #pragma omp target update from(b,([a][targ])p) if(l < 5) device(l - 1) nowait depend(inout : l) 79 // CHECK: static int a, *p; 80 // CHECK-NEXT: float b; 81 // CHECK-NEXT: int l; 82 // CHECK-NEXT: #pragma omp target update to(([a][targ])p,a) if(l > 5) device(l) nowait depend(inout : l) 83 // CHECK-NEXT: #pragma omp target update from(b,([a][targ])p) if(l < 5) device(l - 1) nowait depend(inout : l) 84 // CHECK: static char a, *p; 85 // CHECK-NEXT: float b; 86 // CHECK-NEXT: int l; 87 // CHECK-NEXT: #pragma omp target update to(([a][targ])p,a) if(l > 5) device(l) nowait depend(inout : l) 88 // CHECK-NEXT: #pragma omp target update from(b,([a][targ])p) if(l < 5) device(l - 1) nowait depend(inout : l) 89 // CHECK: marr[10][10][10]; 90 // CHECK-NEXT: #pragma omp target update to(marr[2][0:2][0:2]) 91 // CHECK-NEXT: #pragma omp target update from(marr[2][0:2][0:2]) 92 // CHECK-NEXT: #pragma omp target update from(marr[:2][0:2][0:2:1]) 93 // CHECK-NEXT: #pragma omp target update to(marr[:l][:l][l:]) 94 // CHECK-NEXT: #pragma omp target update to(marr[:2][:1][:]) 95 // CHECK-NEXT: #pragma omp target update from(marr[:2][:1][:]) 96 // CHECK-NEXT: #pragma omp target update to(marr[:2][:][:1]) 97 // CHECK-NEXT: #pragma omp target update from(marr[:2][:][:1]) 98 // CHECK-NEXT: #pragma omp target update to(marr[:2][:][1:]) 99 // CHECK-NEXT: #pragma omp target update from(marr[:2][:][1:]) 100 // CHECK-NEXT: #pragma omp target update to(marr[:1][3:2][:2]) 101 // CHECK-NEXT: #pragma omp target update from(marr[:1][3:2][:2]) 102 // CHECK-NEXT: #pragma omp target update to(marr[:1][:2][0]) 103 // CHECK-NEXT: #pragma omp target update from(marr[:1][:2][0]) 104 // CHECK: int arr[100][100]; 105 // CHECK-NEXT: #pragma omp target update to(arr[2][0:1:2]) 106 // CHECK-NEXT: #pragma omp target update from(arr[2][0:1:2]) 107 // OMP5-NEXT: #pragma omp target update to(present: arr[2][0:1:2]) 108 // OMP5-NEXT: #pragma omp target update from(present: arr[2][0:1:2], a) 109 110 int main(int argc, char **argv) { 111 static int a; 112 int n; 113 float f; 114 115 // CHECK: static int a; 116 // CHECK-NEXT: int n; 117 // CHECK-NEXT: float f; 118 #pragma omp target update to(a) if(f>0.0) device(n) nowait depend(in:n) 119 // CHECK-NEXT: #pragma omp target update to(a) if(f > 0.) device(n) nowait depend(in : n) 120 #pragma omp target update from(f) if(f<0.0) device(n+1) nowait depend(in:n) 121 // CHECK-NEXT: #pragma omp target update from(f) if(f < 0.) device(n + 1) nowait depend(in : n) 122 #pragma omp target update to(argv[2][0:1:2]) 123 // CHECK-NEXT: #pragma omp target update to(argv[2][0:1:2]) 124 #pragma omp target update from(argv[2][0:1:2]) 125 // CHECK-NEXT: #pragma omp target update from(argv[2][0:1:2]) 126 #ifdef OMP51 127 #pragma omp target update to(present: argv[2][0:1:2]) 128 // OMP5-NEXT: #pragma omp target update to(present: arr[2][0:1:2]) 129 #pragma omp target update from(argv[2][0:1:2], a) 130 // OMP5-NEXT: #pragma omp target update from(present: arr[2][0:1:2], a) 131 #endif 132 133 float marr[10][10][10]; 134 // CHECK: marr[10][10][10]; 135 #pragma omp target update to(marr[2][0:2][0:2]) 136 // CHECK-NEXT: #pragma omp target update to(marr[2][0:2][0:2]) 137 #pragma omp target update from(marr[2][0:2][0:2]) 138 // CHECK-NEXT: #pragma omp target update from(marr[2][0:2][0:2]) 139 #pragma omp target update to(marr[:n][:n][n:]) 140 // CHECK: #pragma omp target update to(marr[:n][:n][n:]) 141 #pragma omp target update from(marr[:2][:1][:]) 142 // CHECK-NEXT: #pragma omp target update from(marr[:2][:1][:]) 143 #pragma omp target update to(marr[:2][:][:1]) 144 // CHECK-NEXT: #pragma omp target update to(marr[:2][:][:1]) 145 #pragma omp target update from(marr[:2][:][:1]) 146 // CHECK-NEXT: #pragma omp target update from(marr[:2][:][:1]) 147 #pragma omp target update to(marr[:2][:][1:]) 148 // CHECK-NEXT: #pragma omp target update to(marr[:2][:][1:]) 149 #pragma omp target update from(marr[:2][:][1:]) 150 // CHECK-NEXT: #pragma omp target update from(marr[:2][:][1:]) 151 #pragma omp target update to(marr[:1][3:2][:2]) 152 // CHECK-NEXT: #pragma omp target update to(marr[:1][3:2][:2]) 153 #pragma omp target update from(marr[:1][3:2][:2]) 154 // CHECK-NEXT: #pragma omp target update from(marr[:1][3:2][:2]) 155 #pragma omp target update to(marr[:1][:2][0]) 156 // CHECK-NEXT: #pragma omp target update to(marr[:1][:2][0]) 157 #pragma omp target update from(marr[:1][:2][0]) 158 // CHECK-NEXT: #pragma omp target update from(marr[:1][:2][0]) 159 #pragma omp target update to(marr[:2:][0:2][0:2:1]) 160 // CHECK-NEXT: #pragma omp target update to(marr[:2:][0:2][0:2:1]) 161 #pragma omp target update from(marr[:2:][0:2][0:2:1]) 162 // CHECK-NEXT: #pragma omp target update from(marr[:2:][0:2][0:2:1]) 163 #pragma omp target update to(marr[:2:][:2:][0:2:1]) 164 // CHECK-NEXT: #pragma omp target update to(marr[:2:][:2:][0:2:1]) 165 #pragma omp target update from(marr[:2:][:2:][0:2:1]) 166 // CHECK-NEXT: #pragma omp target update from(marr[:2:][:2:][0:2:1]) 167 168 return foo(argc, f) + foo(argv[0][0], f) + a; 169 } 170 171 #endif 172