xref: /aosp_15_r20/external/clang/test/OpenMP/target_codegen_registration.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // Test host codegen.
2*67e74705SXin Li // RUN: %clang_cc1 -verify -fopenmp -x c++ -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-llvm %s -o - | FileCheck %s
3*67e74705SXin Li // RUN: %clang_cc1 -fopenmp -x c++ -std=c++11 -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-pch -o %t %s
4*67e74705SXin Li // RUN: %clang_cc1 -fopenmp -x c++ -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -std=c++11 -include-pch %t -verify %s -emit-llvm -o - | FileCheck %s
5*67e74705SXin Li // RUN: %clang_cc1 -verify -fopenmp -x c++ -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -emit-llvm %s -o - | FileCheck %s
6*67e74705SXin Li // RUN: %clang_cc1 -fopenmp -x c++ -std=c++11 -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -emit-pch -o %t %s
7*67e74705SXin Li // RUN: %clang_cc1 -fopenmp -x c++ -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -std=c++11 -include-pch %t -verify %s -emit-llvm -o - | FileCheck %s
8*67e74705SXin Li 
9*67e74705SXin Li // Test target codegen - host bc file has to be created first.
10*67e74705SXin Li // RUN: %clang_cc1 -verify -fopenmp -x c++ -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-llvm-bc %s -o %t-ppc-host.bc
11*67e74705SXin Li // RUN: %clang_cc1 -verify -fopenmp -x c++ -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-llvm %s -fopenmp-is-device -fopenmp-host-ir-file-path %t-ppc-host.bc -o - | FileCheck %s -check-prefix=TCHECK
12*67e74705SXin Li // RUN: %clang_cc1 -fopenmp -x c++ -std=c++11 -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-pch -fopenmp-is-device -fopenmp-host-ir-file-path %t-ppc-host.bc -o %t %s
13*67e74705SXin Li // RUN: %clang_cc1 -fopenmp -x c++ -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -std=c++11 -fopenmp-is-device -fopenmp-host-ir-file-path %t-ppc-host.bc -include-pch %t -verify %s -emit-llvm -o - | FileCheck %s -check-prefix=TCHECK
14*67e74705SXin Li // RUN: %clang_cc1 -verify -fopenmp -x c++ -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -emit-llvm-bc %s -o %t-x86-host.bc
15*67e74705SXin Li // RUN: %clang_cc1 -verify -fopenmp -x c++ -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -emit-llvm %s -fopenmp-is-device -fopenmp-host-ir-file-path %t-x86-host.bc -o - | FileCheck %s -check-prefix=TCHECK
16*67e74705SXin Li // RUN: %clang_cc1 -fopenmp -x c++ -std=c++11 -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -emit-pch -fopenmp-is-device -fopenmp-host-ir-file-path %t-x86-host.bc -o %t %s
17*67e74705SXin Li // RUN: %clang_cc1 -fopenmp -x c++ -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -std=c++11 -fopenmp-is-device -fopenmp-host-ir-file-path %t-x86-host.bc -include-pch %t -verify %s -emit-llvm -o - | FileCheck %s -check-prefix=TCHECK
18*67e74705SXin Li 
19*67e74705SXin Li // Check that no target code is emmitted if no omptests flag was provided.
20*67e74705SXin Li // RUN: %clang_cc1 -verify -fopenmp -x c++ -triple powerpc64le-unknown-unknown -emit-llvm %s -o - | FileCheck %s -check-prefix=CHECK-NTARGET
21*67e74705SXin Li 
22*67e74705SXin Li // expected-no-diagnostics
23*67e74705SXin Li #ifndef HEADER
24*67e74705SXin Li #define HEADER
25*67e74705SXin Li 
26*67e74705SXin Li // CHECK-DAG: [[SA:%.+]] = type { [4 x i32] }
27*67e74705SXin Li // CHECK-DAG: [[SB:%.+]] = type { [8 x i32] }
28*67e74705SXin Li // CHECK-DAG: [[SC:%.+]] = type { [16 x i32] }
29*67e74705SXin Li // CHECK-DAG: [[SD:%.+]] = type { [32 x i32] }
30*67e74705SXin Li // CHECK-DAG: [[SE:%.+]] = type { [64 x i32] }
31*67e74705SXin Li // CHECK-DAG: [[ST1:%.+]] = type { [228 x i32] }
32*67e74705SXin Li // CHECK-DAG: [[ST2:%.+]] = type { [1128 x i32] }
33*67e74705SXin Li // CHECK-DAG: [[ENTTY:%.+]] = type { i8*, i8*, i[[SZ:32|64]] }
34*67e74705SXin Li // CHECK-DAG: [[DEVTY:%.+]] = type { i8*, i8*, [[ENTTY]]*, [[ENTTY]]* }
35*67e74705SXin Li // CHECK-DAG: [[DSCTY:%.+]] = type { i32, [[DEVTY]]*, [[ENTTY]]*, [[ENTTY]]* }
36*67e74705SXin Li 
37*67e74705SXin Li // TCHECK:    [[ENTTY:%.+]] = type { i8*, i8*, i[[SZ:32|64]] }
38*67e74705SXin Li 
39*67e74705SXin Li // CHECK-DAG: [[A1:@.+]] = internal global [[SA]]
40*67e74705SXin Li // CHECK-DAG: [[A2:@.+]] = global [[SA]]
41*67e74705SXin Li // CHECK-DAG: [[B1:@.+]] = global [[SB]]
42*67e74705SXin Li // CHECK-DAG: [[B2:@.+]] = global [[SB]]
43*67e74705SXin Li // CHECK-DAG: [[C1:@.+]] = internal global [[SC]]
44*67e74705SXin Li // CHECK-DAG: [[D1:@.+]] = global [[SD]]
45*67e74705SXin Li // CHECK-DAG: [[E1:@.+]] = global [[SE]]
46*67e74705SXin Li // CHECK-DAG: [[T1:@.+]] = global [[ST1]]
47*67e74705SXin Li // CHECK-DAG: [[T2:@.+]] = global [[ST2]]
48*67e74705SXin Li 
49*67e74705SXin Li // CHECK-NTARGET-DAG: [[SA:%.+]] = type { [4 x i32] }
50*67e74705SXin Li // CHECK-NTARGET-DAG: [[SB:%.+]] = type { [8 x i32] }
51*67e74705SXin Li // CHECK-NTARGET-DAG: [[SC:%.+]] = type { [16 x i32] }
52*67e74705SXin Li // CHECK-NTARGET-DAG: [[SD:%.+]] = type { [32 x i32] }
53*67e74705SXin Li // CHECK-NTARGET-DAG: [[SE:%.+]] = type { [64 x i32] }
54*67e74705SXin Li // CHECK-NTARGET-DAG: [[ST1:%.+]] = type { [228 x i32] }
55*67e74705SXin Li // CHECK-NTARGET-DAG: [[ST2:%.+]] = type { [1128 x i32] }
56*67e74705SXin Li // CHECK-NTARGET-NOT: type { i8*,
57*67e74705SXin Li // CHECK-NTARGET-NOT: type { i32,
58*67e74705SXin Li 
59*67e74705SXin Li // We have 7 target regions
60*67e74705SXin Li 
61*67e74705SXin Li // CHECK-DAG: {{@.+}} = private constant i8 0
62*67e74705SXin Li // TCHECK-NOT: {{@.+}} = private constant i8 0
63*67e74705SXin Li // CHECK-DAG: {{@.+}} = private unnamed_addr constant [1 x i[[SZ]]] [i[[SZ]] 4]
64*67e74705SXin Li // CHECK-DAG: {{@.+}} = private unnamed_addr constant [1 x i32] [i32 288]
65*67e74705SXin Li // CHECK-DAG: {{@.+}} = private constant i8 0
66*67e74705SXin Li // CHECK-DAG: {{@.+}} = private unnamed_addr constant [1 x i[[SZ]]] [i[[SZ]] 4]
67*67e74705SXin Li // CHECK-DAG: {{@.+}} = private unnamed_addr constant [1 x i32] [i32 288]
68*67e74705SXin Li // CHECK-DAG: {{@.+}} = private constant i8 0
69*67e74705SXin Li // CHECK-DAG: {{@.+}} = private unnamed_addr constant [1 x i[[SZ]]] [i[[SZ]] 4]
70*67e74705SXin Li // CHECK-DAG: {{@.+}} = private unnamed_addr constant [1 x i32] [i32 288]
71*67e74705SXin Li // CHECK-DAG: {{@.+}} = private constant i8 0
72*67e74705SXin Li // CHECK-DAG: {{@.+}} = private unnamed_addr constant [1 x i[[SZ]]] [i[[SZ]] 4]
73*67e74705SXin Li // CHECK-DAG: {{@.+}} = private unnamed_addr constant [1 x i32] [i32 288]
74*67e74705SXin Li // CHECK-DAG: {{@.+}} = private constant i8 0
75*67e74705SXin Li // CHECK-DAG: {{@.+}} = private unnamed_addr constant [1 x i[[SZ]]] [i[[SZ]] 4]
76*67e74705SXin Li // CHECK-DAG: {{@.+}} = private unnamed_addr constant [1 x i32] [i32 288]
77*67e74705SXin Li // CHECK-DAG: {{@.+}} = private constant i8 0
78*67e74705SXin Li // CHECK-DAG: {{@.+}} = private unnamed_addr constant [1 x i[[SZ]]] [i[[SZ]] 4]
79*67e74705SXin Li // CHECK-DAG: {{@.+}} = private unnamed_addr constant [1 x i32] [i32 288]
80*67e74705SXin Li // CHECK-DAG: {{@.+}} = private constant i8 0
81*67e74705SXin Li // CHECK-DAG: {{@.+}} = private unnamed_addr constant [1 x i[[SZ]]] [i[[SZ]] 4]
82*67e74705SXin Li // CHECK-DAG: {{@.+}} = private unnamed_addr constant [1 x i32] [i32 288]
83*67e74705SXin Li // CHECK-DAG: {{@.+}} = private constant i8 0
84*67e74705SXin Li // CHECK-DAG: {{@.+}} = private unnamed_addr constant [1 x i[[SZ]]] [i[[SZ]] 4]
85*67e74705SXin Li // CHECK-DAG: {{@.+}} = private unnamed_addr constant [1 x i32] [i32 288]
86*67e74705SXin Li // CHECK-DAG: {{@.+}} = private constant i8 0
87*67e74705SXin Li // CHECK-DAG: {{@.+}} = private unnamed_addr constant [1 x i[[SZ]]] [i[[SZ]] 4]
88*67e74705SXin Li // CHECK-DAG: {{@.+}} = private unnamed_addr constant [1 x i32] [i32 288]
89*67e74705SXin Li // CHECK-DAG: {{@.+}} = private constant i8 0
90*67e74705SXin Li // CHECK-DAG: {{@.+}} = private unnamed_addr constant [1 x i[[SZ]]] [i[[SZ]] 4]
91*67e74705SXin Li // CHECK-DAG: {{@.+}} = private unnamed_addr constant [1 x i32] [i32 288]
92*67e74705SXin Li // CHECK-DAG: {{@.+}} = private constant i8 0
93*67e74705SXin Li // CHECK-DAG: {{@.+}} = private unnamed_addr constant [1 x i[[SZ]]] [i[[SZ]] 4]
94*67e74705SXin Li // CHECK-DAG: {{@.+}} = private unnamed_addr constant [1 x i32] [i32 288]
95*67e74705SXin Li // CHECK-DAG: {{@.+}} = private constant i8 0
96*67e74705SXin Li // CHECK-DAG: {{@.+}} = private unnamed_addr constant [1 x i[[SZ]]] [i[[SZ]] 4]
97*67e74705SXin Li // CHECK-DAG: {{@.+}} = private unnamed_addr constant [1 x i32] [i32 288]
98*67e74705SXin Li 
99*67e74705SXin Li // CHECK-NTARGET-NOT: private constant i8 0
100*67e74705SXin Li // CHECK-NTARGET-NOT: private unnamed_addr constant [1 x i
101*67e74705SXin Li 
102*67e74705SXin Li // CHECK-DAG: [[NAMEPTR1:@.+]] = internal unnamed_addr constant [{{.*}} x i8] c"[[NAME1:__omp_offloading_[0-9a-f]+_[0-9a-f]+__Z.+_l[0-9]+]]\00"
103*67e74705SXin Li // CHECK-DAG: [[ENTRY1:@.+]] = constant [[ENTTY]] { i8* @{{.*}}, i8* getelementptr inbounds ([{{.*}} x i8], [{{.*}} x i8]* [[NAMEPTR1]], i32 0, i32 0), i[[SZ]] 0 }, section ".omp_offloading.entries", align 1
104*67e74705SXin Li // CHECK-DAG: [[NAMEPTR2:@.+]] = internal unnamed_addr constant [{{.*}} x i8] c"[[NAME2:.+]]\00"
105*67e74705SXin Li // CHECK-DAG: [[ENTRY2:@.+]] = constant [[ENTTY]] { i8* @{{.*}}, i8* getelementptr inbounds ([{{.*}} x i8], [{{.*}} x i8]* [[NAMEPTR2]], i32 0, i32 0), i[[SZ]] 0 }, section ".omp_offloading.entries", align 1
106*67e74705SXin Li // CHECK-DAG: [[NAMEPTR3:@.+]] = internal unnamed_addr constant [{{.*}} x i8] c"[[NAME3:.+]]\00"
107*67e74705SXin Li // CHECK-DAG: [[ENTRY3:@.+]] = constant [[ENTTY]] { i8* @{{.*}}, i8* getelementptr inbounds ([{{.*}} x i8], [{{.*}} x i8]* [[NAMEPTR3]], i32 0, i32 0), i[[SZ]] 0 }, section ".omp_offloading.entries", align 1
108*67e74705SXin Li // CHECK-DAG: [[NAMEPTR4:@.+]] = internal unnamed_addr constant [{{.*}} x i8] c"[[NAME4:.+]]\00"
109*67e74705SXin Li // CHECK-DAG: [[ENTRY4:@.+]] = constant [[ENTTY]] { i8* @{{.*}}, i8* getelementptr inbounds ([{{.*}} x i8], [{{.*}} x i8]* [[NAMEPTR4]], i32 0, i32 0), i[[SZ]] 0 }, section ".omp_offloading.entries", align 1
110*67e74705SXin Li // CHECK-DAG: [[NAMEPTR5:@.+]] = internal unnamed_addr constant [{{.*}} x i8] c"[[NAME5:.+]]\00"
111*67e74705SXin Li // CHECK-DAG: [[ENTRY5:@.+]] = constant [[ENTTY]] { i8* @{{.*}}, i8* getelementptr inbounds ([{{.*}} x i8], [{{.*}} x i8]* [[NAMEPTR5]], i32 0, i32 0), i[[SZ]] 0 }, section ".omp_offloading.entries", align 1
112*67e74705SXin Li // CHECK-DAG: [[NAMEPTR6:@.+]] = internal unnamed_addr constant [{{.*}} x i8] c"[[NAME6:.+]]\00"
113*67e74705SXin Li // CHECK-DAG: [[ENTRY6:@.+]] = constant [[ENTTY]] { i8* @{{.*}}, i8* getelementptr inbounds ([{{.*}} x i8], [{{.*}} x i8]* [[NAMEPTR6]], i32 0, i32 0), i[[SZ]] 0 }, section ".omp_offloading.entries", align 1
114*67e74705SXin Li // CHECK-DAG: [[NAMEPTR7:@.+]] = internal unnamed_addr constant [{{.*}} x i8] c"[[NAME7:.+]]\00"
115*67e74705SXin Li // CHECK-DAG: [[ENTRY7:@.+]] = constant [[ENTTY]] { i8* @{{.*}}, i8* getelementptr inbounds ([{{.*}} x i8], [{{.*}} x i8]* [[NAMEPTR7]], i32 0, i32 0), i[[SZ]] 0 }, section ".omp_offloading.entries", align 1
116*67e74705SXin Li // CHECK-DAG: [[NAMEPTR8:@.+]] = internal unnamed_addr constant [{{.*}} x i8] c"[[NAME8:.+]]\00"
117*67e74705SXin Li // CHECK-DAG: [[ENTRY8:@.+]] = constant [[ENTTY]] { i8* @{{.*}}, i8* getelementptr inbounds ([{{.*}} x i8], [{{.*}} x i8]* [[NAMEPTR8]], i32 0, i32 0), i[[SZ]] 0 }, section ".omp_offloading.entries", align 1
118*67e74705SXin Li // CHECK-DAG: [[NAMEPTR9:@.+]] = internal unnamed_addr constant [{{.*}} x i8] c"[[NAME9:.+]]\00"
119*67e74705SXin Li // CHECK-DAG: [[ENTRY9:@.+]] = constant [[ENTTY]] { i8* @{{.*}}, i8* getelementptr inbounds ([{{.*}} x i8], [{{.*}} x i8]* [[NAMEPTR9]], i32 0, i32 0), i[[SZ]] 0 }, section ".omp_offloading.entries", align 1
120*67e74705SXin Li // CHECK-DAG: [[NAMEPTR10:@.+]] = internal unnamed_addr constant [{{.*}} x i8] c"[[NAME10:.+]]\00"
121*67e74705SXin Li // CHECK-DAG: [[ENTRY10:@.+]] = constant [[ENTTY]] { i8* @{{.*}}, i8* getelementptr inbounds ([{{.*}} x i8], [{{.*}} x i8]* [[NAMEPTR10]], i32 0, i32 0), i[[SZ]] 0 }, section ".omp_offloading.entries", align 1
122*67e74705SXin Li // CHECK-DAG: [[NAMEPTR11:@.+]] = internal unnamed_addr constant [{{.*}} x i8] c"[[NAME11:.+]]\00"
123*67e74705SXin Li // CHECK-DAG: [[ENTRY11:@.+]] = constant [[ENTTY]] { i8* @{{.*}}, i8* getelementptr inbounds ([{{.*}} x i8], [{{.*}} x i8]* [[NAMEPTR11]], i32 0, i32 0), i[[SZ]] 0 }, section ".omp_offloading.entries", align 1
124*67e74705SXin Li // CHECK-DAG: [[NAMEPTR12:@.+]] = internal unnamed_addr constant [{{.*}} x i8] c"[[NAME12:.+]]\00"
125*67e74705SXin Li // CHECK-DAG: [[ENTRY12:@.+]] = constant [[ENTTY]] { i8* @{{.*}}, i8* getelementptr inbounds ([{{.*}} x i8], [{{.*}} x i8]* [[NAMEPTR12]], i32 0, i32 0), i[[SZ]] 0 }, section ".omp_offloading.entries", align 1
126*67e74705SXin Li 
127*67e74705SXin Li // TCHECK-DAG: [[NAMEPTR1:@.+]] = internal unnamed_addr constant [{{.*}} x i8] c"[[NAME1:__omp_offloading_[0-9a-f]+_[0-9a-f]+__Z.+_l[0-9]+]]\00"
128*67e74705SXin Li // TCHECK-DAG: [[ENTRY1:@.+]] = constant [[ENTTY]] { i8* bitcast (void (i[[SZ]])* @{{.*}} to i8*), i8* getelementptr inbounds ([{{.*}} x i8], [{{.*}} x i8]* [[NAMEPTR1]], i32 0, i32 0), i[[SZ]] 0 }, section ".omp_offloading.entries", align 1
129*67e74705SXin Li // TCHECK-DAG: [[NAMEPTR2:@.+]] = internal unnamed_addr constant [{{.*}} x i8] c"[[NAME2:.+]]\00"
130*67e74705SXin Li // TCHECK-DAG: [[ENTRY2:@.+]] = constant [[ENTTY]] { i8* bitcast (void (i[[SZ]])* @{{.*}} to i8*), i8* getelementptr inbounds ([{{.*}} x i8], [{{.*}} x i8]* [[NAMEPTR2]], i32 0, i32 0), i[[SZ]] 0 }, section ".omp_offloading.entries", align 1
131*67e74705SXin Li // TCHECK-DAG: [[NAMEPTR3:@.+]] = internal unnamed_addr constant [{{.*}} x i8] c"[[NAME3:.+]]\00"
132*67e74705SXin Li // TCHECK-DAG: [[ENTRY3:@.+]] = constant [[ENTTY]] { i8* bitcast (void (i[[SZ]])* @{{.*}} to i8*), i8* getelementptr inbounds ([{{.*}} x i8], [{{.*}} x i8]* [[NAMEPTR3]], i32 0, i32 0), i[[SZ]] 0 }, section ".omp_offloading.entries", align 1
133*67e74705SXin Li // TCHECK-DAG: [[NAMEPTR4:@.+]] = internal unnamed_addr constant [{{.*}} x i8] c"[[NAME4:.+]]\00"
134*67e74705SXin Li // TCHECK-DAG: [[ENTRY4:@.+]] = constant [[ENTTY]] { i8* bitcast (void (i[[SZ]])* @{{.*}} to i8*), i8* getelementptr inbounds ([{{.*}} x i8], [{{.*}} x i8]* [[NAMEPTR4]], i32 0, i32 0), i[[SZ]] 0 }, section ".omp_offloading.entries", align 1
135*67e74705SXin Li // TCHECK-DAG: [[NAMEPTR5:@.+]] = internal unnamed_addr constant [{{.*}} x i8] c"[[NAME5:.+]]\00"
136*67e74705SXin Li // TCHECK-DAG: [[ENTRY5:@.+]] = constant [[ENTTY]] { i8* bitcast (void (i[[SZ]])* @{{.*}} to i8*), i8* getelementptr inbounds ([{{.*}} x i8], [{{.*}} x i8]* [[NAMEPTR5]], i32 0, i32 0), i[[SZ]] 0 }, section ".omp_offloading.entries", align 1
137*67e74705SXin Li // TCHECK-DAG: [[NAMEPTR6:@.+]] = internal unnamed_addr constant [{{.*}} x i8] c"[[NAME6:.+]]\00"
138*67e74705SXin Li // TCHECK-DAG: [[ENTRY6:@.+]] = constant [[ENTTY]] { i8* bitcast (void (i[[SZ]])* @{{.*}} to i8*), i8* getelementptr inbounds ([{{.*}} x i8], [{{.*}} x i8]* [[NAMEPTR6]], i32 0, i32 0), i[[SZ]] 0 }, section ".omp_offloading.entries", align 1
139*67e74705SXin Li // TCHECK-DAG: [[NAMEPTR7:@.+]] = internal unnamed_addr constant [{{.*}} x i8] c"[[NAME7:.+]]\00"
140*67e74705SXin Li // TCHECK-DAG: [[ENTRY7:@.+]] = constant [[ENTTY]] { i8* bitcast (void (i[[SZ]])* @{{.*}} to i8*), i8* getelementptr inbounds ([{{.*}} x i8], [{{.*}} x i8]* [[NAMEPTR7]], i32 0, i32 0), i[[SZ]] 0 }, section ".omp_offloading.entries", align 1
141*67e74705SXin Li // TCHECK-DAG: [[NAMEPTR8:@.+]] = internal unnamed_addr constant [{{.*}} x i8] c"[[NAME8:.+]]\00"
142*67e74705SXin Li // TCHECK-DAG: [[ENTRY8:@.+]] = constant [[ENTTY]] { i8* bitcast (void (i[[SZ]])* @{{.*}} to i8*), i8* getelementptr inbounds ([{{.*}} x i8], [{{.*}} x i8]* [[NAMEPTR8]], i32 0, i32 0), i[[SZ]] 0 }, section ".omp_offloading.entries", align 1
143*67e74705SXin Li // TCHECK-DAG: [[NAMEPTR9:@.+]] = internal unnamed_addr constant [{{.*}} x i8] c"[[NAME9:.+]]\00"
144*67e74705SXin Li // TCHECK-DAG: [[ENTRY9:@.+]] = constant [[ENTTY]] { i8* bitcast (void (i[[SZ]])* @{{.*}} to i8*), i8* getelementptr inbounds ([{{.*}} x i8], [{{.*}} x i8]* [[NAMEPTR9]], i32 0, i32 0), i[[SZ]] 0 }, section ".omp_offloading.entries", align 1
145*67e74705SXin Li // TCHECK-DAG: [[NAMEPTR10:@.+]] = internal unnamed_addr constant [{{.*}} x i8] c"[[NAME10:.+]]\00"
146*67e74705SXin Li // TCHECK-DAG: [[ENTRY10:@.+]] = constant [[ENTTY]] { i8* bitcast (void (i[[SZ]])* @{{.*}} to i8*), i8* getelementptr inbounds ([{{.*}} x i8], [{{.*}} x i8]* [[NAMEPTR10]], i32 0, i32 0), i[[SZ]] 0 }, section ".omp_offloading.entries", align 1
147*67e74705SXin Li // TCHECK-DAG: [[NAMEPTR11:@.+]] = internal unnamed_addr constant [{{.*}} x i8] c"[[NAME11:.+]]\00"
148*67e74705SXin Li // TCHECK-DAG: [[ENTRY11:@.+]] = constant [[ENTTY]] { i8* bitcast (void (i[[SZ]])* @{{.*}} to i8*), i8* getelementptr inbounds ([{{.*}} x i8], [{{.*}} x i8]* [[NAMEPTR11]], i32 0, i32 0), i[[SZ]] 0 }, section ".omp_offloading.entries", align 1
149*67e74705SXin Li // TCHECK-DAG: [[NAMEPTR12:@.+]] = internal unnamed_addr constant [{{.*}} x i8] c"[[NAME12:.+]]\00"
150*67e74705SXin Li // TCHECK-DAG: [[ENTRY12:@.+]] = constant [[ENTTY]] { i8* bitcast (void (i[[SZ]])* @{{.*}} to i8*), i8* getelementptr inbounds ([{{.*}} x i8], [{{.*}} x i8]* [[NAMEPTR12]], i32 0, i32 0), i[[SZ]] 0 }, section ".omp_offloading.entries", align 1
151*67e74705SXin Li 
152*67e74705SXin Li // CHECK: [[ENTBEGIN:@.+]] = external constant [[ENTTY]]
153*67e74705SXin Li // CHECK: [[ENTEND:@.+]] = external constant [[ENTTY]]
154*67e74705SXin Li // CHECK: [[DEVBEGIN:@.+]] = external constant i8
155*67e74705SXin Li // CHECK: [[DEVEND:@.+]] = external constant i8
156*67e74705SXin Li // CHECK: [[IMAGES:@.+]] = internal unnamed_addr constant [1 x [[DEVTY]]] [{{.+}} { i8* [[DEVBEGIN]], i8* [[DEVEND]], [[ENTTY]]* [[ENTBEGIN]], [[ENTTY]]* [[ENTEND]] }]
157*67e74705SXin Li // CHECK: [[DESC:@.+]] = internal constant [[DSCTY]] { i32 1, [[DEVTY]]* getelementptr inbounds ([1 x [[DEVTY]]], [1 x [[DEVTY]]]* [[IMAGES]], i32 0, i32 0), [[ENTTY]]* [[ENTBEGIN]], [[ENTTY]]* [[ENTEND]] }
158*67e74705SXin Li 
159*67e74705SXin Li // We have 4 initializers, one for the 500 priority, another one for 501, or more for the default priority, and the last one for the offloading registration function.
160*67e74705SXin Li // CHECK: @llvm.global_ctors = appending global [4 x { i32, void ()*, i8* }] [
161*67e74705SXin Li // CHECK-SAME: { i32, void ()*, i8* } { i32 500, void ()* [[P500:@[^,]+]], i8* null },
162*67e74705SXin Li // CHECK-SAME: { i32, void ()*, i8* } { i32 501, void ()* [[P501:@[^,]+]], i8* null },
163*67e74705SXin Li // CHECK-SAME: { i32, void ()*, i8* } { i32 65535, void ()* [[PMAX:@[^,]+]], i8* null },
164*67e74705SXin Li // CHECK-SAME: { i32, void ()*, i8* } { i32 0, void ()* bitcast (void (i8*)* [[REGFN:@.+]] to void ()*), i8* null }]
165*67e74705SXin Li 
166*67e74705SXin Li // CHECK-NTARGET: @llvm.global_ctors = appending global [3   x { i32, void ()*, i8* }] [
167*67e74705SXin Li 
168*67e74705SXin Li extern int *R;
169*67e74705SXin Li 
170*67e74705SXin Li struct SA {
171*67e74705SXin Li   int arr[4];
fooSA172*67e74705SXin Li   void foo() {
173*67e74705SXin Li     int a = *R;
174*67e74705SXin Li     a += 1;
175*67e74705SXin Li     *R = a;
176*67e74705SXin Li   }
SASA177*67e74705SXin Li   SA() {
178*67e74705SXin Li     int a = *R;
179*67e74705SXin Li     a += 2;
180*67e74705SXin Li     *R = a;
181*67e74705SXin Li   }
~SASA182*67e74705SXin Li   ~SA() {
183*67e74705SXin Li     int a = *R;
184*67e74705SXin Li     a += 3;
185*67e74705SXin Li     *R = a;
186*67e74705SXin Li   }
187*67e74705SXin Li };
188*67e74705SXin Li 
189*67e74705SXin Li struct SB {
190*67e74705SXin Li   int arr[8];
fooSB191*67e74705SXin Li   void foo() {
192*67e74705SXin Li     int a = *R;
193*67e74705SXin Li     #pragma omp target
194*67e74705SXin Li     a += 4;
195*67e74705SXin Li     *R = a;
196*67e74705SXin Li   }
SBSB197*67e74705SXin Li   SB() {
198*67e74705SXin Li     int a = *R;
199*67e74705SXin Li     a += 5;
200*67e74705SXin Li     *R = a;
201*67e74705SXin Li   }
~SBSB202*67e74705SXin Li   ~SB() {
203*67e74705SXin Li     int a = *R;
204*67e74705SXin Li     a += 6;
205*67e74705SXin Li     *R = a;
206*67e74705SXin Li   }
207*67e74705SXin Li };
208*67e74705SXin Li 
209*67e74705SXin Li struct SC {
210*67e74705SXin Li   int arr[16];
fooSC211*67e74705SXin Li   void foo() {
212*67e74705SXin Li     int a = *R;
213*67e74705SXin Li     a += 7;
214*67e74705SXin Li     *R = a;
215*67e74705SXin Li   }
SCSC216*67e74705SXin Li   SC() {
217*67e74705SXin Li     int a = *R;
218*67e74705SXin Li     #pragma omp target
219*67e74705SXin Li     a += 8;
220*67e74705SXin Li     *R = a;
221*67e74705SXin Li   }
~SCSC222*67e74705SXin Li   ~SC() {
223*67e74705SXin Li     int a = *R;
224*67e74705SXin Li     a += 9;
225*67e74705SXin Li     *R = a;
226*67e74705SXin Li   }
227*67e74705SXin Li };
228*67e74705SXin Li 
229*67e74705SXin Li struct SD {
230*67e74705SXin Li   int arr[32];
fooSD231*67e74705SXin Li   void foo() {
232*67e74705SXin Li     int a = *R;
233*67e74705SXin Li     a += 10;
234*67e74705SXin Li     *R = a;
235*67e74705SXin Li   }
SDSD236*67e74705SXin Li   SD() {
237*67e74705SXin Li     int a = *R;
238*67e74705SXin Li     a += 11;
239*67e74705SXin Li     *R = a;
240*67e74705SXin Li   }
~SDSD241*67e74705SXin Li   ~SD() {
242*67e74705SXin Li     int a = *R;
243*67e74705SXin Li     #pragma omp target
244*67e74705SXin Li     a += 12;
245*67e74705SXin Li     *R = a;
246*67e74705SXin Li   }
247*67e74705SXin Li };
248*67e74705SXin Li 
249*67e74705SXin Li struct SE {
250*67e74705SXin Li   int arr[64];
fooSE251*67e74705SXin Li   void foo() {
252*67e74705SXin Li     int a = *R;
253*67e74705SXin Li     #pragma omp target if(0)
254*67e74705SXin Li     a += 13;
255*67e74705SXin Li     *R = a;
256*67e74705SXin Li   }
SESE257*67e74705SXin Li   SE() {
258*67e74705SXin Li     int a = *R;
259*67e74705SXin Li     #pragma omp target
260*67e74705SXin Li     a += 14;
261*67e74705SXin Li     *R = a;
262*67e74705SXin Li   }
~SESE263*67e74705SXin Li   ~SE() {
264*67e74705SXin Li     int a = *R;
265*67e74705SXin Li     #pragma omp target
266*67e74705SXin Li     a += 15;
267*67e74705SXin Li     *R = a;
268*67e74705SXin Li   }
269*67e74705SXin Li };
270*67e74705SXin Li 
271*67e74705SXin Li template <int x>
272*67e74705SXin Li struct ST {
273*67e74705SXin Li   int arr[128 + x];
fooST274*67e74705SXin Li   void foo() {
275*67e74705SXin Li     int a = *R;
276*67e74705SXin Li     #pragma omp target
277*67e74705SXin Li     a += 16 + x;
278*67e74705SXin Li     *R = a;
279*67e74705SXin Li   }
STST280*67e74705SXin Li   ST() {
281*67e74705SXin Li     int a = *R;
282*67e74705SXin Li     #pragma omp target
283*67e74705SXin Li     a += 17 + x;
284*67e74705SXin Li     *R = a;
285*67e74705SXin Li   }
~STST286*67e74705SXin Li   ~ST() {
287*67e74705SXin Li     int a = *R;
288*67e74705SXin Li     #pragma omp target
289*67e74705SXin Li     a += 18 + x;
290*67e74705SXin Li     *R = a;
291*67e74705SXin Li   }
292*67e74705SXin Li };
293*67e74705SXin Li 
294*67e74705SXin Li // We have to make sure we us all the target regions:
295*67e74705SXin Li //CHECK-DAG: define internal void @[[NAME1]](
296*67e74705SXin Li //CHECK-DAG: call void @[[NAME1]](
297*67e74705SXin Li //CHECK-DAG: define internal void @[[NAME2]](
298*67e74705SXin Li //CHECK-DAG: call void @[[NAME2]](
299*67e74705SXin Li //CHECK-DAG: define internal void @[[NAME3]](
300*67e74705SXin Li //CHECK-DAG: call void @[[NAME3]](
301*67e74705SXin Li //CHECK-DAG: define internal void @[[NAME4]](
302*67e74705SXin Li //CHECK-DAG: call void @[[NAME4]](
303*67e74705SXin Li //CHECK-DAG: define internal void @[[NAME5]](
304*67e74705SXin Li //CHECK-DAG: call void @[[NAME5]](
305*67e74705SXin Li //CHECK-DAG: define internal void @[[NAME6]](
306*67e74705SXin Li //CHECK-DAG: call void @[[NAME6]](
307*67e74705SXin Li //CHECK-DAG: define internal void @[[NAME7]](
308*67e74705SXin Li //CHECK-DAG: call void @[[NAME7]](
309*67e74705SXin Li //CHECK-DAG: define internal void @[[NAME8]](
310*67e74705SXin Li //CHECK-DAG: call void @[[NAME8]](
311*67e74705SXin Li //CHECK-DAG: define internal void @[[NAME9]](
312*67e74705SXin Li //CHECK-DAG: call void @[[NAME9]](
313*67e74705SXin Li //CHECK-DAG: define internal void @[[NAME10]](
314*67e74705SXin Li //CHECK-DAG: call void @[[NAME10]](
315*67e74705SXin Li //CHECK-DAG: define internal void @[[NAME11]](
316*67e74705SXin Li //CHECK-DAG: call void @[[NAME11]](
317*67e74705SXin Li //CHECK-DAG: define internal void @[[NAME12]](
318*67e74705SXin Li //CHECK-DAG: call void @[[NAME12]](
319*67e74705SXin Li 
320*67e74705SXin Li //TCHECK-DAG: define void @[[NAME1]](
321*67e74705SXin Li //TCHECK-DAG: define void @[[NAME2]](
322*67e74705SXin Li //TCHECK-DAG: define void @[[NAME3]](
323*67e74705SXin Li //TCHECK-DAG: define void @[[NAME4]](
324*67e74705SXin Li //TCHECK-DAG: define void @[[NAME5]](
325*67e74705SXin Li //TCHECK-DAG: define void @[[NAME6]](
326*67e74705SXin Li //TCHECK-DAG: define void @[[NAME7]](
327*67e74705SXin Li //TCHECK-DAG: define void @[[NAME8]](
328*67e74705SXin Li //TCHECK-DAG: define void @[[NAME9]](
329*67e74705SXin Li //TCHECK-DAG: define void @[[NAME10]](
330*67e74705SXin Li //TCHECK-DAG: define void @[[NAME11]](
331*67e74705SXin Li //TCHECK-DAG: define void @[[NAME12]](
332*67e74705SXin Li 
333*67e74705SXin Li // CHECK-NTARGET-NOT: __tgt_target
334*67e74705SXin Li // CHECK-NTARGET-NOT: __tgt_register_lib
335*67e74705SXin Li // CHECK-NTARGET-NOT: __tgt_unregister_lib
336*67e74705SXin Li 
337*67e74705SXin Li // TCHECK-NOT: __tgt_target
338*67e74705SXin Li // TCHECK-NOT: __tgt_register_lib
339*67e74705SXin Li // TCHECK-NOT: __tgt_unregister_lib
340*67e74705SXin Li 
341*67e74705SXin Li // We have 2 initializers with priority 500
342*67e74705SXin Li //CHECK: define internal void [[P500]](
343*67e74705SXin Li //CHECK:     call void @{{.+}}()
344*67e74705SXin Li //CHECK:     call void @{{.+}}()
345*67e74705SXin Li //CHECK-NOT: call void @{{.+}}()
346*67e74705SXin Li //CHECK:     ret void
347*67e74705SXin Li 
348*67e74705SXin Li // We have 1 initializers with priority 501
349*67e74705SXin Li //CHECK: define internal void [[P501]](
350*67e74705SXin Li //CHECK:     call void @{{.+}}()
351*67e74705SXin Li //CHECK-NOT: call void @{{.+}}()
352*67e74705SXin Li //CHECK:     ret void
353*67e74705SXin Li 
354*67e74705SXin Li // We have 6 initializers with default priority
355*67e74705SXin Li //CHECK: define internal void [[PMAX]](
356*67e74705SXin Li //CHECK:     call void @{{.+}}()
357*67e74705SXin Li //CHECK:     call void @{{.+}}()
358*67e74705SXin Li //CHECK:     call void @{{.+}}()
359*67e74705SXin Li //CHECK:     call void @{{.+}}()
360*67e74705SXin Li //CHECK:     call void @{{.+}}()
361*67e74705SXin Li //CHECK:     call void @{{.+}}()
362*67e74705SXin Li //CHECK-NOT: call void @{{.+}}()
363*67e74705SXin Li //CHECK:     ret void
364*67e74705SXin Li 
365*67e74705SXin Li // Check registration and unregistration
366*67e74705SXin Li 
367*67e74705SXin Li //CHECK:     define internal void [[UNREGFN:@.+]](i8*)
368*67e74705SXin Li //CHECK:     call i32 @__tgt_unregister_lib([[DSCTY]]* [[DESC]])
369*67e74705SXin Li //CHECK:     ret void
370*67e74705SXin Li //CHECK:     declare i32 @__tgt_unregister_lib([[DSCTY]]*)
371*67e74705SXin Li 
372*67e74705SXin Li //CHECK:     define internal void [[REGFN]](i8*)
373*67e74705SXin Li //CHECK:     call i32 @__tgt_register_lib([[DSCTY]]* [[DESC]])
374*67e74705SXin Li //CHECK:     call i32 @__cxa_atexit(void (i8*)* [[UNREGFN]], i8* bitcast ([[DSCTY]]* [[DESC]] to i8*),
375*67e74705SXin Li //CHECK:     ret void
376*67e74705SXin Li //CHECK:     declare i32 @__tgt_register_lib([[DSCTY]]*)
377*67e74705SXin Li 
378*67e74705SXin Li static __attribute__((init_priority(500))) SA a1;
379*67e74705SXin Li SA a2;
380*67e74705SXin Li SB __attribute__((init_priority(500))) b1;
381*67e74705SXin Li SB __attribute__((init_priority(501))) b2;
382*67e74705SXin Li static SC c1;
383*67e74705SXin Li SD d1;
384*67e74705SXin Li SE e1;
385*67e74705SXin Li ST<100> t1;
386*67e74705SXin Li ST<1000> t2;
387*67e74705SXin Li 
388*67e74705SXin Li 
bar(int a)389*67e74705SXin Li int bar(int a){
390*67e74705SXin Li   int r = a;
391*67e74705SXin Li 
392*67e74705SXin Li   a1.foo();
393*67e74705SXin Li   a2.foo();
394*67e74705SXin Li   b1.foo();
395*67e74705SXin Li   b2.foo();
396*67e74705SXin Li   c1.foo();
397*67e74705SXin Li   d1.foo();
398*67e74705SXin Li   e1.foo();
399*67e74705SXin Li   t1.foo();
400*67e74705SXin Li   t2.foo();
401*67e74705SXin Li 
402*67e74705SXin Li   #pragma omp target
403*67e74705SXin Li   ++r;
404*67e74705SXin Li 
405*67e74705SXin Li   return r + *R;
406*67e74705SXin Li }
407*67e74705SXin Li 
408*67e74705SXin Li // Check metadata is properly generated:
409*67e74705SXin Li // CHECK:     !omp_offload.info = !{!{{[0-9]+}}, !{{[0-9]+}}, !{{[0-9]+}}, !{{[0-9]+}}, !{{[0-9]+}}, !{{[0-9]+}}, !{{[0-9]+}}, !{{[0-9]+}}, !{{[0-9]+}}, !{{[0-9]+}}, !{{[0-9]+}}, !{{[0-9]+}}}
410*67e74705SXin Li // CHECK-DAG: = !{i32 0, i32 [[DEVID:-?[0-9]+]], i32 [[FILEID:-?[0-9]+]], !"_ZN2SB3fooEv", i32 193, i32 {{[0-9]+}}}
411*67e74705SXin Li // CHECK-DAG: = !{i32 0, i32 [[DEVID]], i32 [[FILEID]], !"_ZN2SDD1Ev", i32 243, i32 {{[0-9]+}}}
412*67e74705SXin Li // CHECK-DAG: = !{i32 0, i32 [[DEVID]], i32 [[FILEID]], !"_ZN2SEC1Ev", i32 259, i32 {{[0-9]+}}}
413*67e74705SXin Li // CHECK-DAG: = !{i32 0, i32 [[DEVID]], i32 [[FILEID]], !"_ZN2SED1Ev", i32 265, i32 {{[0-9]+}}}
414*67e74705SXin Li // CHECK-DAG: = !{i32 0, i32 [[DEVID]], i32 [[FILEID]], !"_ZN2STILi1000EE3fooEv", i32 276, i32 {{[0-9]+}}}
415*67e74705SXin Li // CHECK-DAG: = !{i32 0, i32 [[DEVID]], i32 [[FILEID]], !"_ZN2STILi100EEC1Ev", i32 282, i32 {{[0-9]+}}}
416*67e74705SXin Li // CHECK-DAG: = !{i32 0, i32 [[DEVID]], i32 [[FILEID]], !"_Z3bari", i32 402, i32 {{[0-9]+}}}
417*67e74705SXin Li // CHECK-DAG: = !{i32 0, i32 [[DEVID]], i32 [[FILEID]], !"_ZN2STILi100EED1Ev", i32 288, i32 {{[0-9]+}}}
418*67e74705SXin Li // CHECK-DAG: = !{i32 0, i32 [[DEVID]], i32 [[FILEID]], !"_ZN2STILi1000EEC1Ev", i32 282, i32 {{[0-9]+}}}
419*67e74705SXin Li // CHECK-DAG: = !{i32 0, i32 [[DEVID]], i32 [[FILEID]], !"_ZN2STILi1000EED1Ev", i32 288, i32 {{[0-9]+}}}
420*67e74705SXin Li // CHECK-DAG: = !{i32 0, i32 [[DEVID]], i32 [[FILEID]], !"_ZN2STILi100EE3fooEv", i32 276, i32 {{[0-9]+}}}
421*67e74705SXin Li // CHECK-DAG: = !{i32 0, i32 [[DEVID]], i32 [[FILEID]], !"_ZN2SCC1Ev", i32 218, i32 {{[0-9]+}}}
422*67e74705SXin Li 
423*67e74705SXin Li // TCHECK:     !omp_offload.info = !{!{{[0-9]+}}, !{{[0-9]+}}, !{{[0-9]+}}, !{{[0-9]+}}, !{{[0-9]+}}, !{{[0-9]+}}, !{{[0-9]+}}, !{{[0-9]+}}, !{{[0-9]+}}, !{{[0-9]+}}, !{{[0-9]+}}, !{{[0-9]+}}}
424*67e74705SXin Li // TCHECK-DAG: = !{i32 0, i32 [[DEVID:-?[0-9]+]], i32 [[FILEID:-?[0-9]+]], !"_ZN2SB3fooEv", i32 193, i32 {{[0-9]+}}}
425*67e74705SXin Li // TCHECK-DAG: = !{i32 0, i32 [[DEVID]], i32 [[FILEID]], !"_ZN2SDD1Ev", i32 243, i32 {{[0-9]+}}}
426*67e74705SXin Li // TCHECK-DAG: = !{i32 0, i32 [[DEVID]], i32 [[FILEID]], !"_ZN2SEC1Ev", i32 259, i32 {{[0-9]+}}}
427*67e74705SXin Li // TCHECK-DAG: = !{i32 0, i32 [[DEVID]], i32 [[FILEID]], !"_ZN2SED1Ev", i32 265, i32 {{[0-9]+}}}
428*67e74705SXin Li // TCHECK-DAG: = !{i32 0, i32 [[DEVID]], i32 [[FILEID]], !"_ZN2STILi1000EE3fooEv", i32 276, i32 {{[0-9]+}}}
429*67e74705SXin Li // TCHECK-DAG: = !{i32 0, i32 [[DEVID]], i32 [[FILEID]], !"_ZN2STILi100EEC1Ev", i32 282, i32 {{[0-9]+}}}
430*67e74705SXin Li // TCHECK-DAG: = !{i32 0, i32 [[DEVID]], i32 [[FILEID]], !"_Z3bari", i32 402, i32 {{[0-9]+}}}
431*67e74705SXin Li // TCHECK-DAG: = !{i32 0, i32 [[DEVID]], i32 [[FILEID]], !"_ZN2STILi100EED1Ev", i32 288, i32 {{[0-9]+}}}
432*67e74705SXin Li // TCHECK-DAG: = !{i32 0, i32 [[DEVID]], i32 [[FILEID]], !"_ZN2STILi1000EEC1Ev", i32 282, i32 {{[0-9]+}}}
433*67e74705SXin Li // TCHECK-DAG: = !{i32 0, i32 [[DEVID]], i32 [[FILEID]], !"_ZN2STILi1000EED1Ev", i32 288, i32 {{[0-9]+}}}
434*67e74705SXin Li // TCHECK-DAG: = !{i32 0, i32 [[DEVID]], i32 [[FILEID]], !"_ZN2STILi100EE3fooEv", i32 276, i32 {{[0-9]+}}}
435*67e74705SXin Li // TCHECK-DAG: = !{i32 0, i32 [[DEVID]], i32 [[FILEID]], !"_ZN2SCC1Ev", i32 218, i32 {{[0-9]+}}}
436*67e74705SXin Li 
437*67e74705SXin Li #endif
438