150 lines · cpp
1// Check no warnings/errors2// RUN: %clang_cc1 -triple x86_64-pc-linux-gnu -fopenmp -fsyntax-only -verify %s3// expected-no-diagnostics4 5// Check AST and unparsing6// RUN: %clang_cc1 -triple x86_64-pc-linux-gnu -fopenmp -ast-dump %s | FileCheck %s --check-prefix=DUMP7// RUN: %clang_cc1 -triple x86_64-pc-linux-gnu -fopenmp -ast-print %s | FileCheck %s --check-prefix=PRINT --match-full-lines8 9// Check same results after serialization round-trip10// RUN: %clang_cc1 -triple x86_64-pc-linux-gnu -fopenmp -emit-pch -o %t %s11// RUN: %clang_cc1 -triple x86_64-pc-linux-gnu -fopenmp -include-pch %t -ast-dump-all %s | FileCheck %s --check-prefix=DUMP12// RUN: %clang_cc1 -triple x86_64-pc-linux-gnu -fopenmp -include-pch %t -ast-print %s | FileCheck %s --check-prefix=PRINT --match-full-lines13 14#ifndef HEADER15#define HEADER16 17// placeholder for loop body code.18void body(...);19 20 21// PRINT-LABEL: void func_unroll() {22// DUMP-LABEL: FunctionDecl {{.*}} func_unroll23void func_unroll() {24 // PRINT: #pragma omp unroll25 // DUMP: OMPUnrollDirective26 #pragma omp unroll27 // PRINT-NEXT: for (int i = 7; i < 17; i += 3)28 // DUMP-NEXT: ForStmt29 for (int i = 7; i < 17; i += 3)30 // PRINT-NEXT: body(i);31 // DUMP: CallExpr32 body(i);33}34 35 36// PRINT-LABEL: void func_unroll_full() {37// DUMP-LABEL: FunctionDecl {{.*}} func_unroll_full 38void func_unroll_full() {39 // PRINT: #pragma omp unroll full40 // DUMP: OMPUnrollDirective41 // DUMP-NEXT: OMPFullClause42 #pragma omp unroll full43 // PRINT-NEXT: for (int i = 7; i < 17; i += 3)44 // DUMP-NEXT: ForStmt45 for (int i = 7; i < 17; i += 3)46 // PRINT-NEXT: body(i);47 // DUMP: CallExpr48 body(i);49}50 51 52// PRINT-LABEL: void func_unroll_partial() {53// DUMP-LABEL: FunctionDecl {{.*}} func_unroll_partial 54void func_unroll_partial() {55 // PRINT: #pragma omp unroll partial56 // DUMP: OMPUnrollDirective57 // DUMP-NEXT: OMPPartialClause58 // DUMP-NEXT: <<<NULL>>>59 #pragma omp unroll partial60 // PRINT-NEXT: for (int i = 7; i < 17; i += 3)61 // DUMP-NEXT: ForStmt62 for (int i = 7; i < 17; i += 3)63 // PRINT: body(i);64 // DUMP: CallExpr65 body(i);66}67 68 69// PRINT-LABEL: void func_unroll_partial_factor() {70// DUMP-LABEL: FunctionDecl {{.*}} func_unroll_partial_factor 71void func_unroll_partial_factor() {72 // PRINT: #pragma omp unroll partial(4)73 // DUMP: OMPUnrollDirective74 // DUMP-NEXT: OMPPartialClause75 // DUMP-NEXT: ConstantExpr76 // DUMP-NEXT: value: Int 477 // DUMP-NEXT: IntegerLiteral {{.*}} 478 #pragma omp unroll partial(4)79 // PRINT-NEXT: for (int i = 7; i < 17; i += 3)80 // DUMP-NEXT: ForStmt81 for (int i = 7; i < 17; i += 3)82 // PRINT-NEXT: body(i);83 // DUMP: CallExpr84 body(i);85}86 87 88// PRINT-LABEL: void func_unroll_partial_factor_for() {89// DUMP-LABEL: FunctionDecl {{.*}} func_unroll_partial_factor_for 90void func_unroll_partial_factor_for() {91 // PRINT: #pragma omp for92 // DUMP: OMPForDirective93 #pragma omp for94 // PRINT: #pragma omp unroll partial(2)95 // DUMP: OMPUnrollDirective96 // DUMP-NEXT: OMPPartialClause97 #pragma omp unroll partial(2)98 // PRINT-NEXT: for (int i = 7; i < 17; i += 3)99 // DUMP: ForStmt100 for (int i = 7; i < 17; i += 3)101 // PRINT-NEXT: body(i);102 // DUMP: CallExpr103 body(i);104}105 106 107// PRINT-LABEL: template <typename T, T Start, T End, T Step, int Factor> void unroll_templated() {108// DUMP-LABEL: FunctionTemplateDecl {{.*}} unroll_templated109template<typename T, T Start, T End, T Step, int Factor>110void unroll_templated() {111 // PRINT: #pragma omp unroll partial(Factor)112 // DUMP: OMPUnrollDirective113 // DUMP-NEXT: OMPPartialClause114 // DUMP-NEXT: DeclRefExpr {{.*}} 'Factor' 'int'115 #pragma omp unroll partial(Factor)116 // PRINT-NEXT: for (T i = Start; i < End; i += Step)117 // DUMP-NEXT: ForStmt118 for (T i = Start; i < End; i += Step)119 // PRINT-NEXT: body(i);120 // DUMP: CallExpr121 body(i);122}123void unroll_template() {124 unroll_templated<int,0,1024,1,4>();125}126 127 128// PRINT-LABEL: template <int Factor> void unroll_templated_factor(int start, int stop, int step) {129// DUMP-LABEL: FunctionTemplateDecl {{.*}} unroll_templated_factor130template <int Factor>131void unroll_templated_factor(int start, int stop, int step) {132 // PRINT: #pragma omp unroll partial(Factor)133 // DUMP: OMPUnrollDirective134 // DUMP-NEXT: OMPPartialClause135 // DUMP-NEXT: DeclRefExpr {{.*}} 'Factor' 'int'136 #pragma omp unroll partial(Factor)137 // PRINT-NEXT: for (int i = start; i < stop; i += step)138 // DUMP-NEXT: ForStmt139 for (int i = start; i < stop; i += step)140 // PRINT-NEXT: body(i);141 // DUMP: CallExpr142 body(i);143}144void unroll_template_factor() {145 unroll_templated_factor<4>(0, 42, 2);146}147 148 149#endif150