| // Check no warnings/errors |
| // RUN: %clang_cc1 -triple x86_64-pc-linux-gnu -fopenmp -fopenmp-version=51 -fsyntax-only -verify %s |
| // expected-no-diagnostics |
| |
| // Check AST and unparsing |
| // RUN: %clang_cc1 -triple x86_64-pc-linux-gnu -fopenmp -fopenmp-version=51 -ast-dump %s | FileCheck %s --check-prefix=DUMP |
| // RUN: %clang_cc1 -triple x86_64-pc-linux-gnu -fopenmp -fopenmp-version=51 -ast-print %s | FileCheck %s --check-prefix=PRINT --match-full-lines |
| |
| // Check same results after serialization round-trip |
| // RUN: %clang_cc1 -triple x86_64-pc-linux-gnu -fopenmp -fopenmp-version=51 -emit-pch -o %t %s |
| // 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 |
| // RUN: %clang_cc1 -triple x86_64-pc-linux-gnu -fopenmp -fopenmp-version=51 -include-pch %t -ast-print %s | FileCheck %s --check-prefix=PRINT --match-full-lines |
| |
| #ifndef HEADER |
| #define HEADER |
| |
| // placeholder for loop body code. |
| void body(...); |
| |
| |
| // PRINT-LABEL: void func_unroll() { |
| // DUMP-LABEL: FunctionDecl {{.*}} func_unroll |
| void func_unroll() { |
| // PRINT: #pragma omp unroll |
| // DUMP: OMPUnrollDirective |
| #pragma omp unroll |
| // PRINT-NEXT: for (int i = 7; i < 17; i += 3) |
| // DUMP-NEXT: ForStmt |
| for (int i = 7; i < 17; i += 3) |
| // PRINT-NEXT: body(i); |
| // DUMP: CallExpr |
| body(i); |
| } |
| |
| |
| // PRINT-LABEL: void func_unroll_full() { |
| // DUMP-LABEL: FunctionDecl {{.*}} func_unroll_full |
| void func_unroll_full() { |
| // PRINT: #pragma omp unroll full |
| // DUMP: OMPUnrollDirective |
| // DUMP-NEXT: OMPFullClause |
| #pragma omp unroll full |
| // PRINT-NEXT: for (int i = 7; i < 17; i += 3) |
| // DUMP-NEXT: ForStmt |
| for (int i = 7; i < 17; i += 3) |
| // PRINT-NEXT: body(i); |
| // DUMP: CallExpr |
| body(i); |
| } |
| |
| |
| // PRINT-LABEL: void func_unroll_partial() { |
| // DUMP-LABEL: FunctionDecl {{.*}} func_unroll_partial |
| void func_unroll_partial() { |
| // PRINT: #pragma omp unroll partial |
| // DUMP: OMPUnrollDirective |
| // DUMP-NEXT: OMPPartialClause |
| // DUMP-NEXT: <<<NULL>>> |
| #pragma omp unroll partial |
| // PRINT-NEXT: for (int i = 7; i < 17; i += 3) |
| // DUMP-NEXT: ForStmt |
| for (int i = 7; i < 17; i += 3) |
| // PRINT: body(i); |
| // DUMP: CallExpr |
| body(i); |
| } |
| |
| |
| // PRINT-LABEL: void func_unroll_partial_factor() { |
| // DUMP-LABEL: FunctionDecl {{.*}} func_unroll_partial_factor |
| void func_unroll_partial_factor() { |
| // PRINT: #pragma omp unroll partial(4) |
| // DUMP: OMPUnrollDirective |
| // DUMP-NEXT: OMPPartialClause |
| // DUMP-NEXT: ConstantExpr |
| // DUMP-NEXT: value: Int 4 |
| // DUMP-NEXT: IntegerLiteral {{.*}} 4 |
| #pragma omp unroll partial(4) |
| // PRINT-NEXT: for (int i = 7; i < 17; i += 3) |
| // DUMP-NEXT: ForStmt |
| for (int i = 7; i < 17; i += 3) |
| // PRINT-NEXT: body(i); |
| // DUMP: CallExpr |
| body(i); |
| } |
| |
| |
| // PRINT-LABEL: void func_unroll_partial_factor_for() { |
| // DUMP-LABEL: FunctionDecl {{.*}} func_unroll_partial_factor_for |
| void func_unroll_partial_factor_for() { |
| // PRINT: #pragma omp for |
| // DUMP: OMPForDirective |
| #pragma omp for |
| // PRINT: #pragma omp unroll partial(2) |
| // DUMP: OMPUnrollDirective |
| // DUMP-NEXT: OMPPartialClause |
| #pragma omp unroll partial(2) |
| // PRINT-NEXT: for (int i = 7; i < 17; i += 3) |
| // DUMP: ForStmt |
| for (int i = 7; i < 17; i += 3) |
| // PRINT-NEXT: body(i); |
| // DUMP: CallExpr |
| body(i); |
| } |
| |
| |
| // PRINT-LABEL: template <typename T, T Start, T End, T Step, int Factor> void unroll_templated() { |
| // DUMP-LABEL: FunctionTemplateDecl {{.*}} unroll_templated |
| template<typename T, T Start, T End, T Step, int Factor> |
| void unroll_templated() { |
| // PRINT: #pragma omp unroll partial(Factor) |
| // DUMP: OMPUnrollDirective |
| // DUMP-NEXT: OMPPartialClause |
| // DUMP-NEXT: DeclRefExpr {{.*}} 'Factor' 'int' |
| #pragma omp unroll partial(Factor) |
| // PRINT-NEXT: for (T i = Start; i < End; i += Step) |
| // DUMP-NEXT: ForStmt |
| for (T i = Start; i < End; i += Step) |
| // PRINT-NEXT: body(i); |
| // DUMP: CallExpr |
| body(i); |
| } |
| void unroll_template() { |
| unroll_templated<int,0,1024,1,4>(); |
| } |
| |
| |
| // PRINT-LABEL: template <int Factor> void unroll_templated_factor(int start, int stop, int step) { |
| // DUMP-LABEL: FunctionTemplateDecl {{.*}} unroll_templated_factor |
| template <int Factor> |
| void unroll_templated_factor(int start, int stop, int step) { |
| // PRINT: #pragma omp unroll partial(Factor) |
| // DUMP: OMPUnrollDirective |
| // DUMP-NEXT: OMPPartialClause |
| // DUMP-NEXT: DeclRefExpr {{.*}} 'Factor' 'int' |
| #pragma omp unroll partial(Factor) |
| // PRINT-NEXT: for (int i = start; i < stop; i += step) |
| // DUMP-NEXT: ForStmt |
| for (int i = start; i < stop; i += step) |
| // PRINT-NEXT: body(i); |
| // DUMP: CallExpr |
| body(i); |
| } |
| void unroll_template_factor() { |
| unroll_templated_factor<4>(0, 42, 2); |
| } |
| |
| |
| #endif |