brintos

brintos / llvm-project-archived public Read only

0
0
Text · 11.0 KiB · 283f588 Raw
398 lines · cpp
1// Check no warnings/errors2// RUN: %clang_cc1 -triple x86_64-pc-linux-gnu -fopenmp -std=c++20 -fopenmp-version=60 -fsyntax-only -verify %s3// expected-no-diagnostics4 5// Check AST and unparsing 6// RUN: %clang_cc1 -triple x86_64-pc-linux-gnu -fopenmp -std=c++20 -fopenmp-version=60 -ast-dump  %s | FileCheck %s --check-prefix=DUMP7// RUN: %clang_cc1 -triple x86_64-pc-linux-gnu -fopenmp -std=c++20 -fopenmp-version=60 -ast-print %s | FileCheck %s --check-prefix=PRINT8 9// Check same results after serialization round-trip 10// RUN: %clang_cc1 -triple x86_64-pc-linux-gnu -fopenmp -std=c++20 -fopenmp-version=60 -emit-pch -o %t %s11// RUN: %clang_cc1 -triple x86_64-pc-linux-gnu -fopenmp -std=c++20 -fopenmp-version=60 -include-pch %t -ast-dump-all %s | FileCheck %s --check-prefix=DUMP12// RUN: %clang_cc1 -triple x86_64-pc-linux-gnu -fopenmp -std=c++20 -fopenmp-version=60 -include-pch %t -ast-print    %s | FileCheck %s --check-prefix=PRINT13 14#ifndef HEADER15#define HEADER 16 17// placeholder for loop body code18extern "C" void body(...);19 20// PRINT-LABEL: void foo1(21// DUMP-LABEL: FunctionDecl {{.*}} foo122void foo1() {23    // PRINT: #pragma omp fuse24    // DUMP:  OMPFuseDirective25    #pragma omp fuse 26    // PRINT: {27    // DUMP: CompoundStmt       28    {29        // PRINT: for (int i = 0; i < 10; i += 2)30        // DUMP: ForStmt31        for (int i = 0; i < 10; i += 2)32            // PRINT: body(i)33            // DUMP: CallExpr34            body(i);35        // PRINT: for (int j = 10; j > 0; --j)36        // DUMP: ForStmt37        for (int j = 10; j > 0; --j)38            // PRINT: body(j)39            // DUMP: CallExpr40            body(j);41        // PRINT: for (int k = 0; k <= 10; ++k)42        // DUMP: ForStmt43        for (int k = 0; k <= 10; ++k)44            // PRINT: body(k)45            // DUMP: CallExpr46            body(k);47 48    }49 50}51 52// PRINT-LABEL: void foo2(53// DUMP-LABEL: FunctionDecl {{.*}} foo254void foo2() {55    // PRINT: #pragma omp unroll partial(4)56    // DUMP: OMPUnrollDirective57    // DUMP-NEXT: OMPPartialClause58    // DUMP-NEXT: ConstantExpr59    // DUMP-NEXT: value: Int 460    // DUMP-NEXT: IntegerLiteral {{.*}} 461    #pragma omp unroll partial(4)62    // PRINT: #pragma omp fuse63    // DUMP-NEXT: OMPFuseDirective 64    #pragma omp fuse 65    // PRINT: {66    // DUMP: CompoundStmt       67    {68        // PRINT: for (int i = 0; i < 10; i += 2)69        // DUMP: ForStmt70        for (int i = 0; i < 10; i += 2)71            // PRINT: body(i)72            // DUMP: CallExpr73            body(i);74        // PRINT: for (int j = 10; j > 0; --j)75        // DUMP: ForStmt76        for (int j = 10; j > 0; --j)77            // PRINT: body(j)78            // DUMP: CallExpr79            body(j);  80    }    81    82}83 84//PRINT-LABEL: void foo3(85//DUMP-LABEL: FunctionTemplateDecl {{.*}} foo386template<int Factor1, int Factor2> 87void foo3() {88    // PRINT:  #pragma omp fuse89    // DUMP: OMPFuseDirective90    #pragma omp fuse 91    // PRINT: {92    // DUMP: CompoundStmt       93    {94        // PRINT: #pragma omp unroll partial(Factor1)95        // DUMP: OMPUnrollDirective96        #pragma omp unroll partial(Factor1)97        // PRINT: for (int i = 0; i < 12; i += 1)98        // DUMP: ForStmt99        for (int i = 0; i < 12; i += 1)100            // PRINT: body(i)101            // DUMP: CallExpr102            body(i);103        // PRINT: #pragma omp unroll partial(Factor2)104        // DUMP: OMPUnrollDirective105        #pragma omp unroll partial(Factor2)106        // PRINT: for (int k = 0; k <= 10; ++k)107        // DUMP: ForStmt108        for (int k = 0; k <= 10; ++k)109            // PRINT: body(k)110            // DUMP: CallExpr111            body(k);112 113    }114}115 116// Also test instantiating the template.117void tfoo3() {118    foo3<4,2>();119}120 121//PRINT-LABEL: void foo4(122//DUMP-LABEL: FunctionTemplateDecl {{.*}} foo4123template<typename T, T Step> 124void foo4(int start, int end) {125    // PRINT:  #pragma omp fuse126    // DUMP: OMPFuseDirective127    #pragma omp fuse 128    // PRINT: {129    // DUMP: CompoundStmt       130    {131        // PRINT: for (T i = start; i < end; i += Step)132        // DUMP: ForStmt133        for (T i = start; i < end; i += Step)134            // PRINT: body(i)135            // DUMP: CallExpr136            body(i);137 138        // PRINT: for (T j = end; j > start; j -= Step)139        // DUMP: ForStmt 140        for (T j = end; j > start; j -= Step) {141            // PRINT: body(j)142            // DUMP: CallExpr143            body(j);144        }145 146    }147}148 149// Also test instantiating the template.150void tfoo4() {151    foo4<int, 4>(0, 64);152}153 154 155 156// PRINT-LABEL: void foo5(157// DUMP-LABEL: FunctionDecl {{.*}} foo5158void foo5() {159    double arr[128], arr2[128];160    // PRINT: #pragma omp fuse161    // DUMP:  OMPFuseDirective162    #pragma omp fuse 163    // PRINT: {164    // DUMP: CompoundStmt       165    {166        // PRINT-NEXT: for (auto &&a : arr)167        // DUMP-NEXT: CXXForRangeStmt168        for (auto &&a: arr)169            // PRINT: body(a)170            // DUMP: CallExpr171            body(a);172        // PRINT: for (double v = 42; auto &&b : arr)173        // DUMP: CXXForRangeStmt174        for (double v = 42; auto &&b: arr)175            // PRINT: body(b, v);176            // DUMP: CallExpr177            body(b, v);178        // PRINT: for (auto &&c : arr2)179        // DUMP: CXXForRangeStmt180        for (auto &&c: arr2)181            // PRINT: body(c)182            // DUMP: CallExpr183            body(c);184 185    }186 187}188 189// PRINT-LABEL: void foo6(190// DUMP-LABEL: FunctionDecl {{.*}} foo6191void foo6() {192    // PRINT: #pragma omp fuse193    // DUMP: OMPFuseDirective194    #pragma omp fuse 195    // PRINT: {196    // DUMP: CompoundStmt197    {198        // PRINT: #pragma omp fuse199        // DUMP: OMPFuseDirective200        #pragma omp fuse 201        // PRINT: {202        // DUMP: CompoundStmt203        {204            // PRINT: for (int i = 0; i <= 10; ++i)205            // DUMP: ForStmt206            for (int i = 0; i <= 10; ++i)207                body(i);208            // PRINT: for (int j = 0; j < 100; ++j)209            // DUMP: ForStmt210            for(int j = 0; j < 100; ++j)211                body(j);212        }213        // PRINT: #pragma omp unroll partial(4)214        // DUMP: OMPUnrollDirective215        #pragma omp unroll partial(4)216        // PRINT: for (int k = 0; k < 250; ++k)217        // DUMP: ForStmt218        for (int k = 0; k < 250; ++k) 219            body(k);220    }221}222 223// PRINT-LABEL: void foo7(224// DUMP-LABEL: FunctionDecl {{.*}} foo7225void foo7() {226    // PRINT: #pragma omp fuse227    // DUMP:  OMPFuseDirective228    #pragma omp fuse 229    // PRINT: {230    // DUMP: CompoundStmt       231    {232        // PRINT: {233        // DUMP: CompoundStmt   234        {235            // PRINT: {236            // DUMP: CompoundStmt   237            {238                // PRINT: for (int i = 0; i < 10; i += 2)239                // DUMP: ForStmt240                for (int i = 0; i < 10; i += 2)241                    // PRINT: body(i)242                    // DUMP: CallExpr243                    body(i);244                // PRINT: for (int j = 10; j > 0; --j)245                // DUMP: ForStmt246                for (int j = 10; j > 0; --j)247                    // PRINT: body(j)248                    // DUMP: CallExpr249                    body(j);250            }251        }252        // PRINT: {253        // DUMP: CompoundStmt   254        {255            // PRINT: {256            // DUMP: CompoundStmt   257            {258                // PRINT: {259                // DUMP: CompoundStmt   260                {261                    // PRINT: for (int k = 0; k <= 10; ++k)262                    // DUMP: ForStmt263                    for (int k = 0; k <= 10; ++k)264                        // PRINT: body(k)265                        // DUMP: CallExpr266                        body(k);267                }268            }269        }270    }271 272}273 274// PRINT-LABEL: void foo8(275// DUMP-LABEL: FunctionDecl {{.*}} foo8276void foo8() {277    // PRINT: #pragma omp fuse looprange(2,2)278    // DUMP:  OMPFuseDirective279    // DUMP: OMPLooprangeClause280    #pragma omp fuse looprange(2,2)281    // PRINT: {282    // DUMP: CompoundStmt       283    {284        // PRINT: for (int i = 0; i < 10; i += 2)285        // DUMP: ForStmt286        for (int i = 0; i < 10; i += 2)287            // PRINT: body(i)288            // DUMP: CallExpr289            body(i);290        // PRINT: for (int j = 10; j > 0; --j)291        // DUMP: ForStmt292        for (int j = 10; j > 0; --j)293            // PRINT: body(j)294            // DUMP: CallExpr295            body(j);296        // PRINT: for (int k = 0; k <= 10; ++k)297        // DUMP: ForStmt298        for (int k = 0; k <= 10; ++k)299            // PRINT: body(k)300            // DUMP: CallExpr301            body(k);302 303    }304 305}306 307//PRINT-LABEL: void foo9(308//DUMP-LABEL: FunctionTemplateDecl {{.*}} foo9309//DUMP-LABEL: NonTypeTemplateParmDecl {{.*}} F310//DUMP-LABEL: NonTypeTemplateParmDecl {{.*}} C311template<int F, int C> 312void foo9() {313    // PRINT:  #pragma omp fuse looprange(F,C)314    // DUMP: OMPFuseDirective315    // DUMP: OMPLooprangeClause316    #pragma omp fuse looprange(F,C)317    // PRINT: {318    // DUMP: CompoundStmt       319    {320        // PRINT: for (int i = 0; i < 10; i += 2)321        // DUMP: ForStmt322        for (int i = 0; i < 10; i += 2)323            // PRINT: body(i)324            // DUMP: CallExpr325            body(i);326        // PRINT: for (int j = 10; j > 0; --j)327        // DUMP: ForStmt328        for (int j = 10; j > 0; --j)329            // PRINT: body(j)330            // DUMP: CallExpr331            body(j);332 333    }334}335 336// Also test instantiating the template.337void tfoo9() {338    foo9<1, 2>();339}340 341// PRINT-LABEL: void foo10(342// DUMP-LABEL: FunctionDecl {{.*}} foo10343void foo10() {344    // PRINT: #pragma omp fuse looprange(2,2)345    // DUMP:  OMPFuseDirective346    // DUMP: OMPLooprangeClause347    #pragma omp fuse looprange(2,2)348    // PRINT: {349    // DUMP: CompoundStmt       350    {351        // PRINT: for (int i = 0; i < 10; i += 2)352        // DUMP: ForStmt353        for (int i = 0; i < 10; i += 2)354            // PRINT: body(i)355            // DUMP: CallExpr356            body(i);357        // PRINT: for (int ii = 0; ii < 10; ii += 2)358        // DUMP: ForStmt359        for (int ii = 0; ii < 10; ii += 2)360            // PRINT: body(ii)361            // DUMP: CallExpr362            body(ii);363        // PRINT: #pragma omp fuse looprange(2,2)364        // DUMP:  OMPFuseDirective365        // DUMP: OMPLooprangeClause366        #pragma omp fuse looprange(2,2)367        {368            // PRINT: for (int j = 10; j > 0; --j)369            // DUMP: ForStmt370            for (int j = 10; j > 0; --j)371                // PRINT: body(j)372                // DUMP: CallExpr373                body(j);374            // PRINT: for (int jj = 10; jj > 0; --jj)375            // DUMP: ForStmt376            for (int jj = 10; jj > 0; --jj)377                // PRINT: body(jj)378                // DUMP: CallExpr379                body(jj);380            // PRINT: for (int k = 0; k <= 10; ++k)381            // DUMP: ForStmt382            for (int k = 0; k <= 10; ++k)383                // PRINT: body(k)384                // DUMP: CallExpr385                body(k);386            // PRINT: for (int kk = 0; kk <= 10; ++kk)387            // DUMP: ForStmt388            for (int kk = 0; kk <= 10; ++kk)389                // PRINT: body(kk)390                // DUMP: CallExpr391                body(kk);392        }393    }394 395}396 397#endif398