brintos

brintos / llvm-project-archived public Read only

0
0
Text · 5.8 KiB · 6065f4f Raw
224 lines · cpp
1// RUN: %clang_cc1 -triple=x86_64-pc-win32 -fopenmp     \2// RUN:   -fsyntax-only -verify %s3 4// RUN: %clang_cc1 -triple x86_64-pc-linux-gnu -fopenmp \5// RUN:   -fsyntax-only -verify %s6 7// expected-no-diagnostics8 9// RUN: %clang_cc1 -triple x86_64-pc-linux-gnu -fopenmp \10// RUN:   -ast-print %s | FileCheck %s --check-prefix=PRINT11 12// RUN: %clang_cc1 -triple x86_64-pc-linux-gnu -fopenmp \13// RUN:   -ast-dump  %s | FileCheck %s --check-prefix=DUMP14 15// RUN: %clang_cc1 -triple x86_64-pc-linux-gnu -fopenmp \16// RUN:   -emit-pch -o %t %s17 18// RUN: %clang_cc1 -triple x86_64-pc-linux-gnu -fopenmp \19// RUN:   -include-pch %t -ast-dump-all %s | FileCheck %s --check-prefix=DUMP20 21// RUN: %clang_cc1 -triple x86_64-pc-linux-gnu -fopenmp \22// RUN:   -include-pch %t -ast-print %s | FileCheck %s --check-prefix=PRINT23 24#ifndef HEADER25#define HEADER26 27int foo_gpu(int A, int *B) { return 0;}28//PRINT: #pragma omp declare variant(foo_gpu)29//DUMP: FunctionDecl{{.*}} foo30//DUMP: OMPDeclareVariantAttr {{.*}}Implicit construct{{.*}}31#pragma omp declare variant(foo_gpu) \32    match(construct={dispatch}, device={arch(arm)})33int foo(int, int*);34 35template <typename T, typename TP>36void fooTemp() {37  T a;38  TP b;39  //PRINT: #pragma omp dispatch nowait40  //DUMP: OMPDispatchDirective41  //DUMP: OMPNowaitClause42  #pragma omp dispatch nowait43  foo(a, b);44}45 46int *get_device_ptr();47int get_device();48int other();49 50//DUMP: FunctionDecl{{.*}} test_one51void test_one()52{53  int aaa, bbb, var;54  //PRINT: #pragma omp dispatch depend(in : var) nowait novariants(aaa > 5) nocontext(bbb > 5)55  //DUMP: OMPDispatchDirective56  //DUMP: OMPDependClause57  //DUMP: OMPNowaitClause58  //DUMP: OMPNovariantsClause59  //DUMP: DeclRefExpr {{.*}} 'bool' lvalue OMPCapturedExpr60  //DUMP: OMPNocontextClause61  //DUMP: DeclRefExpr {{.*}} 'bool' lvalue OMPCapturedExpr62  #pragma omp dispatch depend(in:var) nowait novariants(aaa > 5) nocontext(bbb > 5)63  foo(aaa, &bbb);64 65  int *dp = get_device_ptr();66  int dev = get_device();67  //PRINT: #pragma omp dispatch device(dev) is_device_ptr(dp) novariants(dev > 10) nocontext(dev > 5)68  //DUMP: OMPDispatchDirective69  //DUMP: OMPDeviceClause70  //DUMP: OMPIs_device_ptrClause71  //DUMP: OMPNovariantsClause72  //DUMP: DeclRefExpr {{.*}} 'bool' lvalue OMPCapturedExpr73  //DUMP: OMPNocontextClause74  //DUMP: DeclRefExpr {{.*}} 'bool' lvalue OMPCapturedExpr75  #pragma omp dispatch device(dev) is_device_ptr(dp) novariants(dev > 10) nocontext(dev > 5)76  foo(aaa, dp);77 78  //PRINT: #pragma omp dispatch79  //PRINT: foo(other(), &bbb);80  //DUMP: OMPDispatchDirective81  #pragma omp dispatch82  foo(other(), &bbb);83 84  fooTemp<int, int*>();85}86 87struct Obj {88  Obj();89  ~Obj();90  int disp_method_variant1();91  #pragma omp declare variant(disp_method_variant1)                            \92    match(construct={dispatch}, device={arch(arm)})93  int disp_method1();94 95  static int disp_method_variant2() { return 1; }96  #pragma omp declare variant(disp_method_variant2)                            \97    match(construct={dispatch}, device={arch(arm)})98  static int disp_method2() { return 2; }99};100 101Obj foo_vari();102#pragma omp declare variant(foo_vari) \103  match(construct={dispatch}, device={arch(arm)})104Obj foo_obj();105 106//DUMP: FunctionDecl{{.*}} test_two107void test_two(Obj o1, Obj &o2, Obj *o3)108{109  //PRINT: #pragma omp dispatch110  //PRINT: o1.disp_method1();111  //DUMP: OMPDispatchDirective112  #pragma omp dispatch113  o1.disp_method1();114 115  //PRINT: #pragma omp dispatch116  //PRINT: o2.disp_method1();117  //DUMP: OMPDispatchDirective118  #pragma omp dispatch119  o2.disp_method1();120 121  //PRINT: #pragma omp dispatch122  //PRINT: o3->disp_method1();123  //DUMP: OMPDispatchDirective124  #pragma omp dispatch125  o3->disp_method1();126 127  //PRINT: #pragma omp dispatch128  //PRINT: Obj::disp_method2();129  //DUMP: OMPDispatchDirective130  #pragma omp dispatch131  Obj::disp_method2();132 133  int ret;134  //PRINT: #pragma omp dispatch135  //PRINT: ret = o1.disp_method1();136  //DUMP: OMPDispatchDirective137  #pragma omp dispatch138  ret = o1.disp_method1();139 140  //PRINT: #pragma omp dispatch141  //PRINT: ret = o2.disp_method1();142  //DUMP: OMPDispatchDirective143  #pragma omp dispatch144  ret = o2.disp_method1();145 146  //PRINT: #pragma omp dispatch147  //PRINT: ret = o3->disp_method1();148  //DUMP: OMPDispatchDirective149  #pragma omp dispatch150  ret = o3->disp_method1();151 152  //PRINT: #pragma omp dispatch153  //PRINT: ret = Obj::disp_method2();154  //DUMP: OMPDispatchDirective155  #pragma omp dispatch156  ret = Obj::disp_method2();157 158  //PRINT: #pragma omp dispatch159  //PRINT: (void)Obj::disp_method2();160  //DUMP: OMPDispatchDirective161  #pragma omp dispatch162  (void)Obj::disp_method2();163 164  // Full C++ operator= case with temps and EH.165  Obj o;166  //PRINT: #pragma omp dispatch167  //PRINT: o = foo_obj();168  //DUMP: OMPDispatchDirective169  #pragma omp dispatch170  o = foo_obj();171}172 173struct A {174  A& disp_operator(A other);175  #pragma omp declare variant(disp_operator)                            \176    match(construct={dispatch}, device={arch(arm)})177  A& operator=(A other);178};179 180struct Obj2 {181  A xx;182  Obj2& disp_operator(Obj2 other);183  #pragma omp declare variant(disp_operator)                            \184    match(construct={dispatch}, device={arch(arm)})185  Obj2& operator=(Obj2 other);186 187  void foo() {188    Obj2 z;189    //PRINT: #pragma omp dispatch190    //PRINT: z = z;191    //DUMP: OMPDispatchDirective192    #pragma omp dispatch193    z = z;194    //PRINT: #pragma omp dispatch195    //PRINT: z.operator=(z);196    //DUMP: OMPDispatchDirective197    #pragma omp dispatch198    z.operator=(z);199  }200  void bar() {201    Obj2 j;202    //PRINT: #pragma omp dispatch203    //PRINT: j = {this->xx};204    //DUMP: OMPDispatchDirective205    #pragma omp dispatch206    j = {this->xx};207    //PRINT: #pragma omp dispatch208    //PRINT: j.operator=({this->xx});209    //DUMP: OMPDispatchDirective210    #pragma omp dispatch211    j.operator=({this->xx});212  }213};214 215void test_three()216{217  Obj2 z1, z;218  #pragma omp dispatch219  z1 = z;220  #pragma omp dispatch221  z1.operator=(z);222}223#endif // HEADER224