1 // Check no warnings/errors 2 // RUN: %clang_cc1 -triple x86_64-pc-linux-gnu -fopenmp -fopenmp-version=51 -fsyntax-only -verify %s 3 // expected-no-diagnostics 4 5 // Check AST and unparsing 6 // RUN: %clang_cc1 -triple x86_64-pc-linux-gnu -fopenmp -fopenmp-version=51 -ast-dump %s | FileCheck %s --check-prefix=DUMP 7 // RUN: %clang_cc1 -triple x86_64-pc-linux-gnu -fopenmp -fopenmp-version=51 -ast-print %s | FileCheck %s --check-prefix=PRINT 8 9 // Check same results after serialization round-trip 10 // RUN: %clang_cc1 -triple x86_64-pc-linux-gnu -fopenmp -fopenmp-version=51 -emit-pch -o %t %s 11 // RUN: %clang_cc1 -triple x86_64-pc-linux-gnu -fopenmp -fopenmp-version=51 -include-pch %t -ast-dump-all %s | FileCheck %s --check-prefix=DUMP 12 // RUN: %clang_cc1 -triple x86_64-pc-linux-gnu -fopenmp -fopenmp-version=51 -include-pch %t -ast-print %s | FileCheck %s --check-prefix=PRINT 13 14 #ifndef HEADER 15 #define HEADER 16 17 // placeholder for loop body code. 18 extern "C" void body(...); 19 20 21 // PRINT-LABEL: void foo1( 22 // DUMP-LABEL: FunctionDecl {{.*}} foo1 23 void foo1() { 24 // PRINT: #pragma omp tile sizes(5, 5) 25 // DUMP: OMPTileDirective 26 // DUMP-NEXT: OMPSizesClause 27 // DUMP-NEXT: IntegerLiteral {{.*}} 5 28 // DUMP-NEXT: IntegerLiteral {{.*}} 5 29 #pragma omp tile sizes(5,5) 30 // PRINT: for (int i = 7; i < 17; i += 3) 31 // DUMP-NEXT: ForStmt 32 for (int i = 7; i < 17; i += 3) 33 // PRINT: for (int j = 7; j < 17; j += 3) 34 // DUMP: ForStmt 35 for (int j = 7; j < 17; j += 3) 36 // PRINT: body(i, j); 37 // DUMP: CallExpr 38 body(i, j); 39 } 40 41 42 // PRINT-LABEL: void foo2( 43 // DUMP-LABEL: FunctionDecl {{.*}} foo2 44 void foo2(int start1, int start2, int end1, int end2) { 45 // PRINT: #pragma omp tile sizes(5, 5) 46 // DUMP: OMPTileDirective 47 // DUMP-NEXT: OMPSizesClause 48 // DUMP-NEXT: IntegerLiteral {{.*}} 5 49 // DUMP-NEXT: IntegerLiteral {{.*}} 5 50 #pragma omp tile sizes(5,5) 51 // PRINT: for (int i = start1; i < end1; i += 1) 52 // DUMP-NEXT: ForStmt 53 for (int i = start1; i < end1; i += 1) 54 // PRINT: for (int j = start2; j < end2; j += 1) 55 // DUMP: ForStmt 56 for (int j = start2; j < end2; j += 1) 57 // PRINT: body(i, j); 58 // DUMP: CallExpr 59 body(i, j); 60 } 61 62 63 // PRINT-LABEL: void foo3( 64 // DUMP-LABEL: FunctionDecl {{.*}} foo3 65 void foo3() { 66 // PRINT: #pragma omp for 67 // DUMP: OMPForDirective 68 // DUMP-NEXT: CapturedStmt 69 // DUMP-NEXT: CapturedDecl 70 #pragma omp for 71 // PRINT: #pragma omp tile sizes(5) 72 // DUMP-NEXT: OMPTileDirective 73 // DUMP-NEXT: OMPSizesClause 74 // DUMP-NEXT: IntegerLiteral {{.*}} 5 75 #pragma omp tile sizes(5) 76 for (int i = 7; i < 17; i += 3) 77 // PRINT: body(i); 78 // DUMP: CallExpr 79 body(i); 80 } 81 82 83 // PRINT-LABEL: void foo4( 84 // DUMP-LABEL: FunctionDecl {{.*}} foo4 85 void foo4() { 86 // PRINT: #pragma omp for collapse(3) 87 // DUMP: OMPForDirective 88 // DUMP-NEXT: OMPCollapseClause 89 // DUMP-NEXT: ConstantExpr 90 // DUMP-NEXT: value: Int 3 91 // DUMP-NEXT: IntegerLiteral {{.*}} 3 92 // DUMP-NEXT: CapturedStmt 93 // DUMP-NEXT: CapturedDecl 94 #pragma omp for collapse(3) 95 // PRINT: #pragma omp tile sizes(5, 5) 96 // DUMP: OMPTileDirective 97 // DUMP-NEXT: OMPSizesClause 98 // DUMP-NEXT: IntegerLiteral {{.*}} 5 99 // DUMP-NEXT: IntegerLiteral {{.*}} 5 100 #pragma omp tile sizes(5, 5) 101 // PRINT: for (int i = 7; i < 17; i += 1) 102 // DUMP-NEXT: ForStmt 103 for (int i = 7; i < 17; i += 1) 104 // PRINT: for (int j = 7; j < 17; j += 1) 105 // DUMP: ForStmt 106 for (int j = 7; j < 17; j += 1) 107 // PRINT: body(i, j); 108 // DUMP: CallExpr 109 body(i, j); 110 } 111 112 113 // PRINT-LABEL: void foo5( 114 // DUMP-LABEL: FunctionDecl {{.*}} foo5 115 void foo5(int start, int end, int step) { 116 // PRINT: #pragma omp for collapse(2) 117 // DUMP: OMPForDirective 118 // DUMP-NEXT: OMPCollapseClause 119 // DUMP-NEXT: ConstantExpr 120 // DUMP-NEXT: value: Int 2 121 // DUMP-NEXT: IntegerLiteral {{.*}} 2 122 // DUMP-NEXT: CapturedStmt 123 // DUMP-NEXT: CapturedDecl 124 #pragma omp for collapse(2) 125 // PRINT: for (int i = 7; i < 17; i += 1) 126 // DUMP-NEXT: ForStmt 127 for (int i = 7; i < 17; i += 1) 128 // PRINT: #pragma omp tile sizes(5) 129 // DUMP: OMPTileDirective 130 // DUMP-NEXT: OMPSizesClause 131 // DUMP-NEXT: IntegerLiteral {{.*}} 5 132 #pragma omp tile sizes(5) 133 // PRINT: for (int j = 7; j < 17; j += 1) 134 // DUMP-NEXT: ForStmt 135 for (int j = 7; j < 17; j += 1) 136 // PRINT: body(i, j); 137 // DUMP: CallExpr 138 body(i, j); 139 } 140 141 142 // PRINT-LABEL: void foo6( 143 // DUMP-LABEL: FunctionTemplateDecl {{.*}} foo6 144 template<typename T, T Step, T Tile> 145 void foo6(T start, T end) { 146 // PRINT: #pragma omp tile sizes(Tile) 147 // DUMP: OMPTileDirective 148 // DUMP-NEXT: OMPSizesClause 149 // DUMP-NEXT: DeclRefExpr {{.*}} 'Tile' 'T' 150 #pragma omp tile sizes(Tile) 151 // PRINT-NEXT: for (T i = start; i < end; i += Step) 152 // DUMP-NEXT: ForStmt 153 for (T i = start; i < end; i += Step) 154 // PRINT-NEXT: body(i); 155 // DUMP: CallExpr 156 body(i); 157 } 158 159 // Also test instantiating the template. 160 void tfoo6() { 161 foo6<int,3,5>(0, 42); 162 } 163 164 165 // PRINT-LABEL: template <int Tile> void foo7(int start, int stop, int step) { 166 // DUMP-LABEL: FunctionTemplateDecl {{.*}} foo7 167 template <int Tile> 168 void foo7(int start, int stop, int step) { 169 // PRINT: #pragma omp tile sizes(Tile) 170 // DUMP: OMPTileDirective 171 // DUMP-NEXT: OMPSizesClause 172 // DUMP-NEXT: DeclRefExpr {{.*}} 'Tile' 'int' 173 #pragma omp tile sizes(Tile) 174 // PRINT-NEXT: for (int i = start; i < stop; i += step) 175 // DUMP-NEXT: ForStmt 176 for (int i = start; i < stop; i += step) 177 // PRINT-NEXT: body(i); 178 // DUMP: CallExpr 179 body(i); 180 } 181 void tfoo7() { 182 foo7<5>(0, 42, 2); 183 } 184 185 186 #endif 187