1*ff260ad0SSaiyedul Islam // RUN: %clang_cc1 -verify -fopenmp -fopenmp-version=45 -x c++ -triple powerpc64le-unknown-unknown -fopenmp-targets=nvptx64-nvidia-cuda -emit-llvm-bc %s -o %t-ppc-host.bc -DGPU 2*ff260ad0SSaiyedul Islam // RUN: %clang_cc1 -verify -fopenmp -fopenmp-version=45 -x c++ -triple nvptx64-unknown-unknown -aux-triple powerpc64le-unknown-unknown -emit-llvm %s -fopenmp-is-device -fopenmp-host-ir-file-path %t-ppc-host.bc -o - -DGPU | FileCheck %s --implicit-check-not='ret i32 {{6|7|9|10|12|14|17|18|20|21|22|23|24|26}}' 3*ff260ad0SSaiyedul Islam // RUN: %clang_cc1 -verify -fopenmp -fopenmp-version=45 -x c++ -triple nvptx64-unknown-unknown -aux-triple powerpc64le-unknown-unknown -emit-llvm %s -fopenmp-is-device -fopenmp-host-ir-file-path %t-ppc-host.bc -emit-pch -o %t -DGPU 4*ff260ad0SSaiyedul Islam // RUN: %clang_cc1 -verify -fopenmp -fopenmp-version=45 -x c++ -triple nvptx64-unknown-unknown -aux-triple powerpc64le-unknown-unknown -emit-llvm %s -fopenmp-is-device -fopenmp-host-ir-file-path %t-ppc-host.bc -include-pch %t -o - -DGPU | FileCheck %s --implicit-check-not='ret i32 {{6|7|9|10|12|14|17|18|20|21|22|23|24|26}}' 54e8231b5SAlexey Bataev 6*ff260ad0SSaiyedul Islam // RUN: %clang_cc1 -verify -fopenmp -fopenmp-version=45 -x c++ -triple powerpc64le-unknown-unknown -fopenmp-targets=nvptx64-nvidia-cuda -emit-llvm-bc %s -o %t-ppc-host.bc -DNOHOST 7*ff260ad0SSaiyedul Islam // RUN: %clang_cc1 -verify -fopenmp -fopenmp-version=45 -x c++ -triple nvptx64-unknown-unknown -aux-triple powerpc64le-unknown-unknown -emit-llvm %s -fopenmp-is-device -fopenmp-host-ir-file-path %t-ppc-host.bc -o - -DNOHOST | FileCheck %s --implicit-check-not='ret i32 {{6|7|9|10|12|14|17|18|20|21|22|23|24|26}}' 8*ff260ad0SSaiyedul Islam // RUN: %clang_cc1 -verify -fopenmp -fopenmp-version=45 -x c++ -triple nvptx64-unknown-unknown -aux-triple powerpc64le-unknown-unknown -emit-llvm %s -fopenmp-is-device -fopenmp-host-ir-file-path %t-ppc-host.bc -emit-pch -o %t -DNOHOST 9*ff260ad0SSaiyedul Islam // RUN: %clang_cc1 -verify -fopenmp -fopenmp-version=45 -x c++ -triple nvptx64-unknown-unknown -aux-triple powerpc64le-unknown-unknown -emit-llvm %s -fopenmp-is-device -fopenmp-host-ir-file-path %t-ppc-host.bc -include-pch %t -o - -DNOHOST | FileCheck %s --implicit-check-not='ret i32 {{6|7|9|10|12|14|17|18|20|21|22|23|24|26}}' 10*ff260ad0SSaiyedul Islam 11*ff260ad0SSaiyedul Islam // RUN: %clang_cc1 -verify -fopenmp -x c++ -triple powerpc64le-unknown-unknown -fopenmp-targets=nvptx64-nvidia-cuda -emit-llvm-bc %s -o %t-ppc-host.bc -DGPU 12*ff260ad0SSaiyedul Islam // RUN: %clang_cc1 -verify -fopenmp -x c++ -triple nvptx64-unknown-unknown -aux-triple powerpc64le-unknown-unknown -emit-llvm %s -fopenmp-is-device -fopenmp-host-ir-file-path %t-ppc-host.bc -o - -DGPU | FileCheck %s --implicit-check-not='ret i32 {{6|7|9|10|12|14|17|18|20|21|22|23|24|26}}' 13*ff260ad0SSaiyedul Islam // RUN: %clang_cc1 -verify -fopenmp -x c++ -triple nvptx64-unknown-unknown -aux-triple powerpc64le-unknown-unknown -emit-llvm %s -fopenmp-is-device -fopenmp-host-ir-file-path %t-ppc-host.bc -emit-pch -o %t -DGPU 14*ff260ad0SSaiyedul Islam // RUN: %clang_cc1 -verify -fopenmp -x c++ -triple nvptx64-unknown-unknown -aux-triple powerpc64le-unknown-unknown -emit-llvm %s -fopenmp-is-device -fopenmp-host-ir-file-path %t-ppc-host.bc -include-pch %t -o - -DGPU | FileCheck %s --implicit-check-not='ret i32 {{6|7|9|10|12|14|17|18|20|21|22|23|24|26}}' 15*ff260ad0SSaiyedul Islam 16*ff260ad0SSaiyedul Islam // RUN: %clang_cc1 -verify -fopenmp -x c++ -triple powerpc64le-unknown-unknown -fopenmp-targets=nvptx64-nvidia-cuda -emit-llvm-bc %s -o %t-ppc-host.bc -DNOHOST 17*ff260ad0SSaiyedul Islam // RUN: %clang_cc1 -verify -fopenmp -x c++ -triple nvptx64-unknown-unknown -aux-triple powerpc64le-unknown-unknown -emit-llvm %s -fopenmp-is-device -fopenmp-host-ir-file-path %t-ppc-host.bc -o - -DNOHOST | FileCheck %s --implicit-check-not='ret i32 {{6|7|9|10|12|14|17|18|20|21|22|23|24|26}}' 18*ff260ad0SSaiyedul Islam // RUN: %clang_cc1 -verify -fopenmp -x c++ -triple nvptx64-unknown-unknown -aux-triple powerpc64le-unknown-unknown -emit-llvm %s -fopenmp-is-device -fopenmp-host-ir-file-path %t-ppc-host.bc -emit-pch -o %t -DNOHOST 19*ff260ad0SSaiyedul Islam // RUN: %clang_cc1 -verify -fopenmp -x c++ -triple nvptx64-unknown-unknown -aux-triple powerpc64le-unknown-unknown -emit-llvm %s -fopenmp-is-device -fopenmp-host-ir-file-path %t-ppc-host.bc -include-pch %t -o - -DNOHOST | FileCheck %s --implicit-check-not='ret i32 {{6|7|9|10|12|14|17|18|20|21|22|23|24|26}}' 204e8231b5SAlexey Bataev // expected-no-diagnostics 214e8231b5SAlexey Bataev 224e8231b5SAlexey Bataev // CHECK-DAG: ret i32 2 234e8231b5SAlexey Bataev // CHECK-DAG: ret i32 3 244e8231b5SAlexey Bataev // CHECK-DAG: ret i32 4 254e8231b5SAlexey Bataev // CHECK-DAG: ret i32 5 26befb4be3SJohannes Doerfert // CHECK-DAG: ret i32 8 27befb4be3SJohannes Doerfert // CHECK-DAG: ret i32 11 28befb4be3SJohannes Doerfert // CHECK-DAG: ret i32 13 29befb4be3SJohannes Doerfert // CHECK-DAG: ret i32 15 30befb4be3SJohannes Doerfert // CHECK-DAG: ret i32 16 31befb4be3SJohannes Doerfert // CHECK-DAG: ret i32 19 32befb4be3SJohannes Doerfert // CHECK-DAG: ret i32 25 334e8231b5SAlexey Bataev 34befb4be3SJohannes Doerfert // Outputs for function members checked via implicit filecheck flag 35befb4be3SJohannes Doerfert 364e8231b5SAlexey Bataev 374e8231b5SAlexey Bataev #ifndef HEADER 384e8231b5SAlexey Bataev #define HEADER 394e8231b5SAlexey Bataev 404e8231b5SAlexey Bataev #ifdef GPU 411228d42dSJohannes Doerfert #define SUBSET gpu 421228d42dSJohannes Doerfert #define CORRECT nohost, gpu 434e8231b5SAlexey Bataev #define WRONG cpu, gpu 444e8231b5SAlexey Bataev #endif // GPU 454e8231b5SAlexey Bataev #ifdef NOHOST 461228d42dSJohannes Doerfert #define SUBSET nohost 471228d42dSJohannes Doerfert #define CORRECT nohost, gpu 484e8231b5SAlexey Bataev #define WRONG nohost, host 494e8231b5SAlexey Bataev #endif // NOHOST 504e8231b5SAlexey Bataev foo()514e8231b5SAlexey Bataevint foo() { return 2; } 524e8231b5SAlexey Bataev int bazzz(); 534e8231b5SAlexey Bataev int test(); 544e8231b5SAlexey Bataev static int stat_unused_(); 554e8231b5SAlexey Bataev static int stat_used_(); 564e8231b5SAlexey Bataev 574e8231b5SAlexey Bataev #pragma omp declare target 584e8231b5SAlexey Bataev 594e8231b5SAlexey Bataev #pragma omp declare variant(foo) match(device = {kind(CORRECT)}) bar()60befb4be3SJohannes Doerfertint bar() { return 3; } 614e8231b5SAlexey Bataev 624e8231b5SAlexey Bataev #pragma omp declare variant(bazzz) match(device = {kind(CORRECT)}) baz()63befb4be3SJohannes Doerfertint baz() { return 4; } 644e8231b5SAlexey Bataev 654e8231b5SAlexey Bataev #pragma omp declare variant(test) match(device = {kind(CORRECT)}) call()66befb4be3SJohannes Doerfertint call() { return 5; } 674e8231b5SAlexey Bataev 684e8231b5SAlexey Bataev #pragma omp declare variant(stat_unused_) match(device = {kind(CORRECT)}) stat_unused()69befb4be3SJohannes Doerfertstatic int stat_unused() { return 6; } 704e8231b5SAlexey Bataev 714e8231b5SAlexey Bataev #pragma omp declare variant(stat_used_) match(device = {kind(CORRECT)}) stat_used()72befb4be3SJohannes Doerfertstatic int stat_used() { return 7; } 734e8231b5SAlexey Bataev 744e8231b5SAlexey Bataev #pragma omp end declare target 754e8231b5SAlexey Bataev main()764e8231b5SAlexey Bataevint main() { 774e8231b5SAlexey Bataev int res; 784e8231b5SAlexey Bataev #pragma omp target map(from \ 794e8231b5SAlexey Bataev : res) 804e8231b5SAlexey Bataev res = bar() + baz() + call(); 814e8231b5SAlexey Bataev return res; 824e8231b5SAlexey Bataev } 834e8231b5SAlexey Bataev test()84befb4be3SJohannes Doerfertint test() { return 8; } stat_unused_()85befb4be3SJohannes Doerfertstatic int stat_unused_() { return 9; } stat_used_()86befb4be3SJohannes Doerfertstatic int stat_used_() { return 10; } 874e8231b5SAlexey Bataev 884e8231b5SAlexey Bataev #pragma omp declare target 894e8231b5SAlexey Bataev 904e8231b5SAlexey Bataev struct SpecialFuncs { vdSpecialFuncs914e8231b5SAlexey Bataev void vd() {} 924e8231b5SAlexey Bataev SpecialFuncs(); 934e8231b5SAlexey Bataev ~SpecialFuncs(); method_SpecialFuncs94befb4be3SJohannes Doerfert int method_() { return 11; } 954e8231b5SAlexey Bataev #pragma omp declare variant(SpecialFuncs::method_) \ 964e8231b5SAlexey Bataev match(device = {kind(CORRECT)}) methodSpecialFuncs97befb4be3SJohannes Doerfert int method() { return 12; } 984e8231b5SAlexey Bataev #pragma omp declare variant(SpecialFuncs::method_) \ 994e8231b5SAlexey Bataev match(device = {kind(CORRECT)}) 1004e8231b5SAlexey Bataev int Method(); 1014e8231b5SAlexey Bataev } s; 1024e8231b5SAlexey Bataev Method()103befb4be3SJohannes Doerfertint SpecialFuncs::Method() { return 13; } 1044e8231b5SAlexey Bataev 1054e8231b5SAlexey Bataev struct SpecSpecialFuncs { vdSpecSpecialFuncs1064e8231b5SAlexey Bataev void vd() {} 1074e8231b5SAlexey Bataev SpecSpecialFuncs(); 1084e8231b5SAlexey Bataev ~SpecSpecialFuncs(); 1094e8231b5SAlexey Bataev 1104e8231b5SAlexey Bataev int method_(); 1114e8231b5SAlexey Bataev #pragma omp declare variant(SpecSpecialFuncs::method_) \ 1124e8231b5SAlexey Bataev match(device = {kind(CORRECT)}) methodSpecSpecialFuncs113befb4be3SJohannes Doerfert int method() { return 14; } 1144e8231b5SAlexey Bataev #pragma omp declare variant(SpecSpecialFuncs::method_) \ 1154e8231b5SAlexey Bataev match(device = {kind(CORRECT)}) 1164e8231b5SAlexey Bataev int Method(); 1174e8231b5SAlexey Bataev } s1; 1184e8231b5SAlexey Bataev 1194e8231b5SAlexey Bataev #pragma omp end declare target 1204e8231b5SAlexey Bataev method_()121befb4be3SJohannes Doerfertint SpecSpecialFuncs::method_() { return 15; } Method()122befb4be3SJohannes Doerfertint SpecSpecialFuncs::Method() { return 16; } 1234e8231b5SAlexey Bataev prio()124befb4be3SJohannes Doerfertint prio() { return 17; } prio1()125befb4be3SJohannes Doerfertint prio1() { return 18; } prio2()126befb4be3SJohannes Doerfertstatic int prio2() { return 19; } prio3()127befb4be3SJohannes Doerfertstatic int prio3() { return 20; } prio4()128befb4be3SJohannes Doerfertstatic int prio4() { return 21; } fn_linkage_variant()129befb4be3SJohannes Doerfertint fn_linkage_variant() { return 22; } fn_linkage_variant1()130befb4be3SJohannes Doerfertextern "C" int fn_linkage_variant1() { return 23; } fn_variant2()131befb4be3SJohannes Doerfertint fn_variant2() { return 24; } 1324e8231b5SAlexey Bataev 1334e8231b5SAlexey Bataev #pragma omp declare target 1344e8231b5SAlexey Bataev xxx()1354e8231b5SAlexey Bataevvoid xxx() { 1364e8231b5SAlexey Bataev (void)s.method(); 1374e8231b5SAlexey Bataev (void)s1.method(); 1384e8231b5SAlexey Bataev } 1394e8231b5SAlexey Bataev 1404e8231b5SAlexey Bataev #pragma omp declare variant(prio) match(device = {kind(SUBSET)}) 1414e8231b5SAlexey Bataev #pragma omp declare variant(prio1) match(device = {kind(CORRECT)}) prio_()142befb4be3SJohannes Doerfertint prio_() { return 25; } 1434e8231b5SAlexey Bataev 1444e8231b5SAlexey Bataev #pragma omp declare variant(prio4) match(device = {kind(SUBSET)}) 1454e8231b5SAlexey Bataev #pragma omp declare variant(prio2) match(device = {kind(CORRECT)}) 1464e8231b5SAlexey Bataev #pragma omp declare variant(prio3) match(device = {kind(SUBSET)}) prio1_()147befb4be3SJohannes Doerfertstatic int prio1_() { return 26; } 1484e8231b5SAlexey Bataev int_fn()1494e8231b5SAlexey Bataevint int_fn() { return prio1_(); } 1504e8231b5SAlexey Bataev 1514e8231b5SAlexey Bataev extern "C" { 1524e8231b5SAlexey Bataev #pragma omp declare variant(fn_linkage_variant) match(device = {kind(CORRECT)}) fn_linkage()153befb4be3SJohannes Doerfertint fn_linkage() { return 27; } 1544e8231b5SAlexey Bataev } 1554e8231b5SAlexey Bataev 1564e8231b5SAlexey Bataev #pragma omp declare variant(fn_linkage_variant1) match(device = {kind(CORRECT)}) fn_linkage1()157befb4be3SJohannes Doerfertint fn_linkage1() { return 28; } 1584e8231b5SAlexey Bataev 1594e8231b5SAlexey Bataev #pragma omp declare variant(fn_variant2) match(device = {kind(WRONG)}) fn2()160befb4be3SJohannes Doerfertint fn2() { return 29; } 1614e8231b5SAlexey Bataev 1624e8231b5SAlexey Bataev #pragma omp end declare target 1634e8231b5SAlexey Bataev 1644e8231b5SAlexey Bataev #endif // HEADER 165