blob: 53d7ef7083850a7033995234a804d78f5dfbe573 [file] [log] [blame]
Samuel Antaof8b50122015-07-13 22:54:53 +00001// RUN: %clang_cc1 -verify -fopenmp -fnoopenmp-use-tls -DBODY -triple x86_64-unknown-unknown -x c++ -emit-llvm %s -fexceptions -fcxx-exceptions -o - | FileCheck %s
2// RUN: %clang_cc1 -fopenmp -fnoopenmp-use-tls -x c++ -std=c++11 -triple x86_64-unknown-unknown -fexceptions -fcxx-exceptions -emit-pch -o %t %s
Douglas Katzman3459ce22015-10-08 04:24:12 +00003// RUN: %clang_cc1 -fopenmp -fnoopenmp-use-tls -DBODY -x c++ -triple x86_64-unknown-unknown -fexceptions -fcxx-exceptions -debug-info-kind=limited -std=c++11 -include-pch %t -verify %s -emit-llvm -o - | FileCheck --check-prefix=CHECK-DEBUG %s
Samuel Antaof8b50122015-07-13 22:54:53 +00004
5// RUN: %clang_cc1 -verify -fopenmp -DBODY -triple x86_64-unknown-unknown -x c++ -emit-llvm %s -fexceptions -fcxx-exceptions -o - | FileCheck %s --check-prefix=CHECK-TLS
Alexey Bataevdb390212015-05-20 04:24:19 +00006// RUN: %clang_cc1 -fopenmp -x c++ -std=c++11 -triple x86_64-unknown-unknown -fexceptions -fcxx-exceptions -emit-pch -o %t %s
Douglas Katzman3459ce22015-10-08 04:24:12 +00007// RUN: %clang_cc1 -fopenmp -DBODY -x c++ -triple x86_64-unknown-unknown -fexceptions -fcxx-exceptions -debug-info-kind=limited -std=c++11 -include-pch %t -verify %s -emit-llvm -o - | FileCheck --check-prefix=CHECK-TLS %s
Samuel Antaof8b50122015-07-13 22:54:53 +00008
Alexey Bataev97720002014-11-11 04:05:39 +00009// expected-no-diagnostics
Samuel Antao3e1ccbe2015-07-14 00:09:50 +000010// REQUIRES: x86-registered-target
Alexey Bataev97720002014-11-11 04:05:39 +000011#ifndef HEADER
12#define HEADER
13// CHECK-DAG: [[IDENT:%.+]] = type { i32, i32, i32, i32, i8* }
14// CHECK-DAG: [[S1:%.+]] = type { [[INT:i[0-9]+]] }
15// CHECK-DAG: [[S2:%.+]] = type { [[INT]], double }
16// CHECK-DAG: [[S3:%.+]] = type { [[INT]], float }
17// CHECK-DAG: [[S4:%.+]] = type { [[INT]], [[INT]] }
18// CHECK-DAG: [[S5:%.+]] = type { [[INT]], [[INT]], [[INT]] }
19// CHECK-DAG: [[SMAIN:%.+]] = type { [[INT]], double, double }
20// CHECK-DEBUG-DAG: [[IDENT:%.+]] = type { i32, i32, i32, i32, i8* }
21// CHECK-DEBUG-DAG: [[S1:%.+]] = type { [[INT:i[0-9]+]] }
22// CHECK-DEBUG-DAG: [[S2:%.+]] = type { [[INT]], double }
23// CHECK-DEBUG-DAG: [[S3:%.+]] = type { [[INT]], float }
24// CHECK-DEBUG-DAG: [[S4:%.+]] = type { [[INT]], [[INT]] }
25// CHECK-DEBUG-DAG: [[S5:%.+]] = type { [[INT]], [[INT]], [[INT]] }
26// CHECK-DEBUG-DAG: [[SMAIN:%.+]] = type { [[INT]], double, double }
Samuel Antaof8b50122015-07-13 22:54:53 +000027// CHECK-TLS-DAG: [[S1:%.+]] = type { [[INT:i[0-9]+]] }
28// CHECK-TLS-DAG: [[S2:%.+]] = type { [[INT]], double }
29// CHECK-TLS-DAG: [[S3:%.+]] = type { [[INT]], float }
30// CHECK-TLS-DAG: [[S4:%.+]] = type { [[INT]], [[INT]] }
31// CHECK-TLS-DAG: [[S5:%.+]] = type { [[INT]], [[INT]], [[INT]] }
32// CHECK-TLS-DAG: [[SMAIN:%.+]] = type { [[INT]], double, double }
33
Alexey Bataev97720002014-11-11 04:05:39 +000034struct S1 {
35 int a;
36 S1()
37 : a(0) {
38 }
39 S1(int a)
40 : a(a) {
41 }
42 S1(const S1 &s) {
43 a = 12 + s.a;
44 }
45 ~S1() {
46 a = 0;
47 }
48};
49
50struct S2 {
51 int a;
52 double b;
53 S2()
54 : a(0) {
55 }
56 S2(int a)
57 : a(a) {
58 }
59 S2(const S2 &s) {
60 a = 12 + s.a;
61 }
62 ~S2() {
63 a = 0;
64 }
65};
66
67struct S3 {
68 int a;
69 float b;
70 S3()
71 : a(0) {
72 }
73 S3(int a)
74 : a(a) {
75 }
76 S3(const S3 &s) {
77 a = 12 + s.a;
78 }
79 ~S3() {
80 a = 0;
81 }
82};
83
84struct S4 {
85 int a, b;
86 S4()
87 : a(0) {
88 }
89 S4(int a)
90 : a(a) {
91 }
92 S4(const S4 &s) {
93 a = 12 + s.a;
94 }
95 ~S4() {
96 a = 0;
97 }
98};
99
100struct S5 {
101 int a, b, c;
102 S5()
103 : a(0) {
104 }
105 S5(int a)
106 : a(a) {
107 }
108 S5(const S5 &s) {
109 a = 12 + s.a;
110 }
111 ~S5() {
112 a = 0;
113 }
114};
115
116// CHECK-DAG: [[GS1:@.+]] = internal global [[S1]] zeroinitializer
117// CHECK-DAG: [[GS1]].cache. = common global i8** null
David Blaikiebdf40a62015-03-13 18:21:46 +0000118// CHECK-DAG: [[DEFAULT_LOC:@.+]] = private unnamed_addr constant [[IDENT]] { i32 0, i32 2, i32 0, i32 0, i8* getelementptr inbounds ([{{[0-9]+}} x i8], [{{[0-9]+}} x i8]* {{@.+}}, i32 0, i32 0) }
Alexey Bataev97720002014-11-11 04:05:39 +0000119// CHECK-DAG: [[GS2:@.+]] = internal global [[S2]] zeroinitializer
120// CHECK-DAG: [[ARR_X:@.+]] = global [2 x [3 x [[S1]]]] zeroinitializer
121// CHECK-DAG: [[ARR_X]].cache. = common global i8** null
122// CHECK-DAG: [[SM:@.+]] = internal global [[SMAIN]] zeroinitializer
123// CHECK-DAG: [[SM]].cache. = common global i8** null
124// CHECK-DAG: [[STATIC_S:@.+]] = external global [[S3]]
125// CHECK-DAG: [[STATIC_S]].cache. = common global i8** null
126// CHECK-DAG: [[GS3:@.+]] = external global [[S5]]
127// CHECK-DAG: [[GS3]].cache. = common global i8** null
128// CHECK-DAG: [[ST_INT_ST:@.+]] = linkonce_odr global i32 23
129// CHECK-DAG: [[ST_INT_ST]].cache. = common global i8** null
130// CHECK-DAG: [[ST_FLOAT_ST:@.+]] = linkonce_odr global float 2.300000e+01
131// CHECK-DAG: [[ST_FLOAT_ST]].cache. = common global i8** null
132// CHECK-DAG: [[ST_S4_ST:@.+]] = linkonce_odr global %struct.S4 zeroinitializer
133// CHECK-DAG: [[ST_S4_ST]].cache. = common global i8** null
134// CHECK-NOT: .cache. = common global i8** null
135// There is no cache for gs2 - it is not threadprivate. Check that there is only
136// 8 caches created (for Static::s, gs1, gs3, arr_x, main::sm, ST<int>::st,
137// ST<float>::st, ST<S4>::st)
138// CHECK-DEBUG-DAG: [[GS1:@.+]] = internal global [[S1]] zeroinitializer
139// CHECK-DEBUG-DAG: [[GS2:@.+]] = internal global [[S2]] zeroinitializer
140// CHECK-DEBUG-DAG: [[ARR_X:@.+]] = global [2 x [3 x [[S1]]]] zeroinitializer
141// CHECK-DEBUG-DAG: [[SM:@.+]] = internal global [[SMAIN]] zeroinitializer
142// CHECK-DEBUG-DAG: [[STATIC_S:@.+]] = external global [[S3]]
143// CHECK-DEBUG-DAG: [[GS3:@.+]] = external global [[S5]]
144// CHECK-DEBUG-DAG: [[ST_INT_ST:@.+]] = linkonce_odr global i32 23
145// CHECK-DEBUG-DAG: [[ST_FLOAT_ST:@.+]] = linkonce_odr global float 2.300000e+01
146// CHECK-DEBUG-DAG: [[ST_S4_ST:@.+]] = linkonce_odr global %struct.S4 zeroinitializer
Samuel Antaof8b50122015-07-13 22:54:53 +0000147// CHECK-DEBUG-DAG: [[LOC1:@.*]] = private unnamed_addr constant [{{[0-9]+}} x i8] c";{{.*}}threadprivate_codegen.cpp;;192;9;;\00"
148// CHECK-DEBUG-DAG: [[LOC2:@.*]] = private unnamed_addr constant [{{[0-9]+}} x i8] c";{{.*}}threadprivate_codegen.cpp;;247;9;;\00"
149// CHECK-DEBUG-DAG: [[LOC3:@.*]] = private unnamed_addr constant [{{[0-9]+}} x i8] c";{{.*}}threadprivate_codegen.cpp;;334;19;;\00"
150// CHECK-DEBUG-DAG: [[LOC4:@.*]] = private unnamed_addr constant [{{[0-9]+}} x i8] c";{{.*}}threadprivate_codegen.cpp;main;371;9;;\00"
151// CHECK-DEBUG-DAG: [[LOC5:@.*]] = private unnamed_addr constant [{{[0-9]+}} x i8] c";{{.*}}threadprivate_codegen.cpp;main;388;9;;\00"
152// CHECK-DEBUG-DAG: [[LOC6:@.*]] = private unnamed_addr constant [{{[0-9]+}} x i8] c";{{.*}}threadprivate_codegen.cpp;main;410;10;;\00"
153// CHECK-DEBUG-DAG: [[LOC7:@.*]] = private unnamed_addr constant [{{[0-9]+}} x i8] c";{{.*}}threadprivate_codegen.cpp;main;433;10;;\00"
154// CHECK-DEBUG-DAG: [[LOC8:@.*]] = private unnamed_addr constant [{{[0-9]+}} x i8] c";{{.*}}threadprivate_codegen.cpp;main;469;10;;\00"
155// CHECK-DEBUG-DAG: [[LOC9:@.*]] = private unnamed_addr constant [{{[0-9]+}} x i8] c";{{.*}}threadprivate_codegen.cpp;main;498;10;;\00"
156// CHECK-DEBUG-DAG: [[LOC10:@.*]] = private unnamed_addr constant [{{[0-9]+}} x i8] c";{{.*}}threadprivate_codegen.cpp;main;518;10;;\00"
157// CHECK-DEBUG-DAG: [[LOC11:@.*]] = private unnamed_addr constant [{{[0-9]+}} x i8] c";{{.*}}threadprivate_codegen.cpp;main;541;27;;\00"
158// CHECK-DEBUG-DAG: [[LOC12:@.*]] = private unnamed_addr constant [{{[0-9]+}} x i8] c";{{.*}}threadprivate_codegen.cpp;main;564;10;;\00"
159// CHECK-DEBUG-DAG: [[LOC13:@.*]] = private unnamed_addr constant [{{[0-9]+}} x i8] c";{{.*}}threadprivate_codegen.cpp;foobar;684;9;;\00"
160// CHECK-DEBUG-DAG: [[LOC14:@.*]] = private unnamed_addr constant [{{[0-9]+}} x i8] c";{{.*}}threadprivate_codegen.cpp;foobar;707;10;;\00"
161// CHECK-DEBUG-DAG: [[LOC15:@.*]] = private unnamed_addr constant [{{[0-9]+}} x i8] c";{{.*}}threadprivate_codegen.cpp;foobar;743;10;;\00"
162// CHECK-DEBUG-DAG: [[LOC16:@.*]] = private unnamed_addr constant [{{[0-9]+}} x i8] c";{{.*}}threadprivate_codegen.cpp;foobar;772;10;;\00"
163// CHECK-DEBUG-DAG: [[LOC17:@.*]] = private unnamed_addr constant [{{[0-9]+}} x i8] c";{{.*}}threadprivate_codegen.cpp;foobar;792;10;;\00"
164// CHECK-DEBUG-DAG: [[LOC18:@.*]] = private unnamed_addr constant [{{[0-9]+}} x i8] c";{{.*}}threadprivate_codegen.cpp;foobar;815;27;;\00"
165// CHECK-DEBUG-DAG: [[LOC19:@.*]] = private unnamed_addr constant [{{[0-9]+}} x i8] c";{{.*}}threadprivate_codegen.cpp;foobar;838;10;;\00"
166// CHECK-DEBUG-DAG: [[LOC20:@.*]] = private unnamed_addr constant [{{[0-9]+}} x i8] c";{{.*}}threadprivate_codegen.cpp;;306;9;;\00"
167// CHECK-TLS-DAG: [[GS1:@.+]] = internal thread_local global [[S1]] zeroinitializer
168// CHECK-TLS-DAG: [[GS2:@.+]] = internal global [[S2]] zeroinitializer
169// CHECK-TLS-DAG: [[ARR_X:@.+]] = thread_local global [2 x [3 x [[S1]]]] zeroinitializer
170// CHECK-TLS-DAG: [[SM:@.+]] = internal thread_local global [[SMAIN]] zeroinitializer
171// CHECK-TLS-DAG: [[SM_GUARD:@_ZGVZ4mainE2sm]] = internal thread_local global i8 0
172// CHECK-TLS-DAG: [[STATIC_S:@.+]] = external thread_local global [[S3]]
173// CHECK-TLS-DAG: [[GS3:@.+]] = external thread_local global [[S5]]
174// CHECK-TLS-DAG: [[ST_INT_ST:@.+]] = linkonce_odr thread_local global i32 23
175// CHECK-TLS-DAG: [[ST_FLOAT_ST:@.+]] = linkonce_odr thread_local global float 2.300000e+01
176// CHECK-TLS-DAG: [[ST_S4_ST:@.+]] = linkonce_odr thread_local global %struct.S4 zeroinitializer
177// CHECK-TLS-DAG: [[ST_S4_ST_GUARD:@_ZGVN2STI2S4E2stE]] = linkonce_odr thread_local global i64 0
178// CHECK-TLS-DAG: @__tls_guard = internal thread_local global i8 0
179// CHECK-TLS-DAG: @__dso_handle = external global i8
David Blaikiefc473552015-09-11 03:22:18 +0000180// CHECK-TLS-DAG: [[GS1_TLS_INIT:@_ZTHL3gs1]] = internal alias void (), void ()* @__tls_init
181// CHECK-TLS-DAG: [[ARR_X_TLS_INIT:@_ZTH5arr_x]] = alias void (), void ()* @__tls_init
182// CHECK-TLS-DAG: [[ST_INT_ST_TLS_INIT:@_ZTHN2STIiE2stE]] = linkonce_odr alias void (), void ()* @__tls_init
183// CHECK-TLS-DAG: [[ST_FLOAT_ST_TLS_INIT:@_ZTHN2STIfE2stE]] = linkonce_odr alias void (), void ()* @__tls_init
184// CHECK-TLS-DAG: [[ST_S4_ST_TLS_INIT:@_ZTHN2STI2S4E2stE]] = linkonce_odr alias void (), void ()* @__tls_init
Alexey Bataev97720002014-11-11 04:05:39 +0000185
186struct Static {
187 static S3 s;
188#pragma omp threadprivate(s)
189};
190
191static S1 gs1(5);
192#pragma omp threadprivate(gs1)
Alexey Bataev7c2ed442015-04-08 12:45:41 +0000193#pragma omp threadprivate(gs1)
Alexey Bataev97720002014-11-11 04:05:39 +0000194// CHECK: define {{.*}} [[S1_CTOR:@.*]]([[S1]]* {{.*}},
195// CHECK: define {{.*}} [[S1_DTOR:@.*]]([[S1]]* {{.*}})
196// CHECK: define internal {{.*}}i8* [[GS1_CTOR:@\.__kmpc_global_ctor_\..*]](i8*)
197// CHECK: store i8* %0, i8** [[ARG_ADDR:%.*]],
David Blaikiea953f282015-02-27 21:19:58 +0000198// CHECK: [[ARG:%.+]] = load i8*, i8** [[ARG_ADDR]]
Alexey Bataev97720002014-11-11 04:05:39 +0000199// CHECK: [[RES:%.*]] = bitcast i8* [[ARG]] to [[S1]]*
200// CHECK-NEXT: call {{.*}} [[S1_CTOR]]([[S1]]* [[RES]], {{.*}} 5)
David Blaikiea953f282015-02-27 21:19:58 +0000201// CHECK: [[ARG:%.+]] = load i8*, i8** [[ARG_ADDR]]
Alexey Bataev97720002014-11-11 04:05:39 +0000202// CHECK: ret i8* [[ARG]]
203// CHECK-NEXT: }
204// CHECK: define internal {{.*}}void [[GS1_DTOR:@\.__kmpc_global_dtor_\..*]](i8*)
205// CHECK: store i8* %0, i8** [[ARG_ADDR:%.*]],
David Blaikiea953f282015-02-27 21:19:58 +0000206// CHECK: [[ARG:%.+]] = load i8*, i8** [[ARG_ADDR]]
Alexey Bataev97720002014-11-11 04:05:39 +0000207// CHECK: [[RES:%.*]] = bitcast i8* [[ARG]] to [[S1]]*
208// CHECK-NEXT: call {{.*}} [[S1_DTOR]]([[S1]]* [[RES]])
209// CHECK-NEXT: ret void
210// CHECK-NEXT: }
211// CHECK: define internal {{.*}}void [[GS1_INIT:@\.__omp_threadprivate_init_\..*]]()
212// CHECK: call {{.*}}void @__kmpc_threadprivate_register([[IDENT]]* [[DEFAULT_LOC]], i8* bitcast ([[S1]]* [[GS1]] to i8*), i8* (i8*)* [[GS1_CTOR]], i8* (i8*, i8*)* null, void (i8*)* [[GS1_DTOR]])
213// CHECK-NEXT: ret void
214// CHECK-NEXT: }
215// CHECK-DEBUG: [[KMPC_LOC_ADDR:%.*]] = alloca [[IDENT]]
David Blaikie218b7832015-02-27 19:18:17 +0000216// CHECK-DEBUG: [[KMPC_LOC_ADDR_PSOURCE:%.*]] = getelementptr inbounds [[IDENT]], [[IDENT]]* [[KMPC_LOC_ADDR]], i{{.*}} 0, i{{.*}} 4
David Blaikiebdf40a62015-03-13 18:21:46 +0000217// CHECK-DEBUG: store i8* getelementptr inbounds ([{{.*}} x i8], [{{.*}} x i8]* [[LOC1]], i{{.*}} 0, i{{.*}} 0), i8** [[KMPC_LOC_ADDR_PSOURCE]]
Alexey Bataev97720002014-11-11 04:05:39 +0000218// CHECK-DEBUG: @__kmpc_global_thread_num
219// CHECK-DEBUG: call {{.*}}void @__kmpc_threadprivate_register([[IDENT]]* [[KMPC_LOC_ADDR]], i8* bitcast ([[S1]]* [[GS1]] to i8*), i8* (i8*)* [[GS1_CTOR:@\.__kmpc_global_ctor_\..*]], i8* (i8*, i8*)* null, void (i8*)* [[GS1_DTOR:@\.__kmpc_global_dtor_\..*]])
220// CHECK-DEBUG: define internal {{.*}}i8* [[GS1_CTOR]](i8*)
221// CHECK-DEBUG: store i8* %0, i8** [[ARG_ADDR:%.*]],
David Blaikiea953f282015-02-27 21:19:58 +0000222// CHECK-DEBUG: [[ARG:%.+]] = load i8*, i8** [[ARG_ADDR]]
Alexey Bataev97720002014-11-11 04:05:39 +0000223// CHECK-DEBUG: [[RES:%.*]] = bitcast i8* [[ARG]] to [[S1]]*
224// CHECK-DEBUG-NEXT: call {{.*}} [[S1_CTOR:@.+]]([[S1]]* [[RES]], {{.*}} 5)
David Blaikiea953f282015-02-27 21:19:58 +0000225// CHECK-DEBUG: [[ARG:%.+]] = load i8*, i8** [[ARG_ADDR]]
Alexey Bataev97720002014-11-11 04:05:39 +0000226// CHECK-DEBUG: ret i8* [[ARG]]
227// CHECK-DEBUG-NEXT: }
228// CHECK-DEBUG: define {{.*}} [[S1_CTOR]]([[S1]]* {{.*}},
229// CHECK-DEBUG: define internal {{.*}}void [[GS1_DTOR]](i8*)
230// CHECK-DEBUG: store i8* %0, i8** [[ARG_ADDR:%.*]],
David Blaikiea953f282015-02-27 21:19:58 +0000231// CHECK-DEBUG: [[ARG:%.+]] = load i8*, i8** [[ARG_ADDR]]
Alexey Bataev97720002014-11-11 04:05:39 +0000232// CHECK-DEBUG: [[RES:%.*]] = bitcast i8* [[ARG]] to [[S1]]*
233// CHECK-DEBUG-NEXT: call {{.*}} [[S1_DTOR:@.+]]([[S1]]* [[RES]])
234// CHECK-DEBUG-NEXT: ret void
235// CHECK-DEBUG-NEXT: }
236// CHECK-DEBUG: define {{.*}} [[S1_DTOR]]([[S1]]* {{.*}})
237static S2 gs2(27);
238// CHECK: define {{.*}} [[S2_CTOR:@.*]]([[S2]]* {{.*}},
239// CHECK: define {{.*}} [[S2_DTOR:@.*]]([[S2]]* {{.*}})
240// No another call for S2 constructor because it is not threadprivate
241// CHECK-NOT: call {{.*}} [[S2_CTOR]]([[S2]]*
242// CHECK-DEBUG: define {{.*}} [[S2_CTOR:@.*]]([[S2]]* {{.*}},
243// CHECK-DEBUG: define {{.*}} [[S2_DTOR:@.*]]([[S2]]* {{.*}})
244// No another call for S2 constructor because it is not threadprivate
245// CHECK-DEBUG-NOT: call {{.*}} [[S2_CTOR]]([[S2]]*
246S1 arr_x[2][3] = { { 1, 2, 3 }, { 4, 5, 6 } };
247#pragma omp threadprivate(arr_x)
248// CHECK: define internal {{.*}}i8* [[ARR_X_CTOR:@\.__kmpc_global_ctor_\..*]](i8*)
249// CHECK: store i8* %0, i8** [[ARG_ADDR:%.*]],
David Blaikiea953f282015-02-27 21:19:58 +0000250// CHECK: [[ARG:%.+]] = load i8*, i8** [[ARG_ADDR]]
Alexey Bataev97720002014-11-11 04:05:39 +0000251// CHECK: [[RES:%.*]] = bitcast i8* [[ARG]] to [2 x [3 x [[S1]]]]*
David Blaikie218b7832015-02-27 19:18:17 +0000252// CHECK: [[ARR1:%.*]] = getelementptr inbounds [2 x [3 x [[S1]]]], [2 x [3 x [[S1]]]]* [[RES]], i{{.*}} 0, i{{.*}} 0
253// CHECK: [[ARR:%.*]] = getelementptr inbounds [3 x [[S1]]], [3 x [[S1]]]* [[ARR1]], i{{.*}} 0, i{{.*}} 0
Alexey Bataev97720002014-11-11 04:05:39 +0000254// CHECK: invoke {{.*}} [[S1_CTOR]]([[S1]]* [[ARR]], [[INT]] {{.*}}1)
David Blaikie218b7832015-02-27 19:18:17 +0000255// CHECK: [[ARR_ELEMENT:%.*]] = getelementptr inbounds [[S1]], [[S1]]* [[ARR]], i{{.*}} 1
Alexey Bataev97720002014-11-11 04:05:39 +0000256// CHECK: invoke {{.*}} [[S1_CTOR]]([[S1]]* [[ARR_ELEMENT]], [[INT]] {{.*}}2)
David Blaikie218b7832015-02-27 19:18:17 +0000257// CHECK: [[ARR_ELEMENT2:%.*]] = getelementptr inbounds [[S1]], [[S1]]* [[ARR_ELEMENT]], i{{.*}} 1
Alexey Bataev97720002014-11-11 04:05:39 +0000258// CHECK: invoke {{.*}} [[S1_CTOR]]([[S1]]* [[ARR_ELEMENT2]], [[INT]] {{.*}}3)
David Blaikie218b7832015-02-27 19:18:17 +0000259// CHECK: [[ARR_ELEMENT3:%.*]] = getelementptr inbounds [3 x [[S1]]], [3 x [[S1]]]* [[ARR1]], i{{.*}} 1
260// CHECK: [[ARR_:%.*]] = getelementptr inbounds [3 x [[S1]]], [3 x [[S1]]]* [[ARR_ELEMENT3]], i{{.*}} 0, i{{.*}} 0
Alexey Bataev97720002014-11-11 04:05:39 +0000261// CHECK: invoke {{.*}} [[S1_CTOR]]([[S1]]* [[ARR_]], [[INT]] {{.*}}4)
David Blaikie218b7832015-02-27 19:18:17 +0000262// CHECK: [[ARR_ELEMENT:%.*]] = getelementptr inbounds [[S1]], [[S1]]* [[ARR_]], i{{.*}} 1
Alexey Bataev97720002014-11-11 04:05:39 +0000263// CHECK: invoke {{.*}} [[S1_CTOR]]([[S1]]* [[ARR_ELEMENT]], [[INT]] {{.*}}5)
David Blaikie218b7832015-02-27 19:18:17 +0000264// CHECK: [[ARR_ELEMENT2:%.*]] = getelementptr inbounds [[S1]], [[S1]]* [[ARR_ELEMENT]], i{{.*}} 1
Alexey Bataev97720002014-11-11 04:05:39 +0000265// CHECK: invoke {{.*}} [[S1_CTOR]]([[S1]]* [[ARR_ELEMENT2]], [[INT]] {{.*}}6)
David Blaikiea953f282015-02-27 21:19:58 +0000266// CHECK: [[ARG:%.+]] = load i8*, i8** [[ARG_ADDR]]
Alexey Bataev97720002014-11-11 04:05:39 +0000267// CHECK: ret i8* [[ARG]]
268// CHECK: }
269// CHECK: define internal {{.*}}void [[ARR_X_DTOR:@\.__kmpc_global_dtor_\..*]](i8*)
270// CHECK: store i8* %0, i8** [[ARG_ADDR:%.*]],
David Blaikiea953f282015-02-27 21:19:58 +0000271// CHECK: [[ARG:%.+]] = load i8*, i8** [[ARG_ADDR]]
Alexey Bataev97720002014-11-11 04:05:39 +0000272// CHECK: [[ARR_BEGIN:%.*]] = bitcast i8* [[ARG]] to [[S1]]*
David Blaikie218b7832015-02-27 19:18:17 +0000273// CHECK-NEXT: [[ARR_CUR:%.*]] = getelementptr inbounds [[S1]], [[S1]]* [[ARR_BEGIN]], i{{.*}} 6
Alexey Bataev97720002014-11-11 04:05:39 +0000274// CHECK-NEXT: br label %[[ARR_LOOP:.*]]
275// CHECK: {{.*}}[[ARR_LOOP]]{{.*}}
276// CHECK-NEXT: [[ARR_ELEMENTPAST:%.*]] = phi [[S1]]* [ [[ARR_CUR]], {{.*}} ], [ [[ARR_ELEMENT:%.*]], {{.*}} ]
David Blaikie218b7832015-02-27 19:18:17 +0000277// CHECK-NEXT: [[ARR_ELEMENT:%.*]] = getelementptr inbounds [[S1]], [[S1]]* [[ARR_ELEMENTPAST]], i{{.*}} -1
Alexey Bataev97720002014-11-11 04:05:39 +0000278// CHECK-NEXT: invoke {{.*}} [[S1_DTOR]]([[S1]]* [[ARR_ELEMENT]])
279// CHECK: [[ARR_DONE:%.*]] = icmp eq [[S1]]* [[ARR_ELEMENT]], [[ARR_BEGIN]]
280// CHECK-NEXT: br i1 [[ARR_DONE]], label %[[ARR_EXIT:.*]], label %[[ARR_LOOP]]
281// CHECK: {{.*}}[[ARR_EXIT]]{{.*}}
282// CHECK-NEXT: ret void
283// CHECK: }
284// CHECK: define internal {{.*}}void [[ARR_X_INIT:@\.__omp_threadprivate_init_\..*]]()
285// CHECK: call {{.*}}void @__kmpc_threadprivate_register([[IDENT]]* [[DEFAULT_LOC]], i8* bitcast ([2 x [3 x [[S1]]]]* [[ARR_X]] to i8*), i8* (i8*)* [[ARR_X_CTOR]], i8* (i8*, i8*)* null, void (i8*)* [[ARR_X_DTOR]])
286// CHECK-NEXT: ret void
287// CHECK-NEXT: }
288// CHECK-DEBUG: [[KMPC_LOC_ADDR:%.*]] = alloca [[IDENT]]
David Blaikie218b7832015-02-27 19:18:17 +0000289// CHECK-DEBUG: [[KMPC_LOC_ADDR_PSOURCE:%.*]] = getelementptr inbounds [[IDENT]], [[IDENT]]* [[KMPC_LOC_ADDR]], i{{.*}} 0, i{{.*}} 4
David Blaikiebdf40a62015-03-13 18:21:46 +0000290// CHECK-DEBUG: store i8* getelementptr inbounds ([{{.*}} x i8], [{{.*}} x i8]* [[LOC2]], i{{.*}} 0, i{{.*}} 0), i8** [[KMPC_LOC_ADDR_PSOURCE]]
Alexey Bataev97720002014-11-11 04:05:39 +0000291// CHECK-DEBUG: @__kmpc_global_thread_num
292// CHECK-DEBUG: call {{.*}}void @__kmpc_threadprivate_register([[IDENT]]* [[KMPC_LOC_ADDR]], i8* bitcast ([2 x [3 x [[S1]]]]* [[ARR_X]] to i8*), i8* (i8*)* [[ARR_X_CTOR:@\.__kmpc_global_ctor_\..*]], i8* (i8*, i8*)* null, void (i8*)* [[ARR_X_DTOR:@\.__kmpc_global_dtor_\..*]])
293// CHECK-DEBUG: define internal {{.*}}i8* [[ARR_X_CTOR]](i8*)
294// CHECK-DEBUG: }
295// CHECK-DEBUG: define internal {{.*}}void [[ARR_X_DTOR]](i8*)
296// CHECK-DEBUG: }
297extern S5 gs3;
298#pragma omp threadprivate(gs3)
299// No call for S5 constructor because gs3 has just declaration, not a definition.
300// CHECK-NOT: call {{.*}}([[S5]]*
301// CHECK-DEBUG-NOT: call {{.*}}([[S5]]*
302
303template <class T>
304struct ST {
305 static T st;
306#pragma omp threadprivate(st)
307};
308
309template <class T>
310T ST<T>::st(23);
311
312// CHECK-LABEL: @main()
313// CHECK-DEBUG-LABEL: @main()
314int main() {
315 // CHECK-DEBUG: [[KMPC_LOC_ADDR:%.*]] = alloca [[IDENT]]
316 int Res;
317 struct Smain {
318 int a;
319 double b, c;
320 Smain()
321 : a(0) {
322 }
323 Smain(int a)
324 : a(a) {
325 }
326 Smain(const Smain &s) {
327 a = 12 + s.a;
328 }
329 ~Smain() {
330 a = 0;
331 }
332 };
333
334 static Smain sm(gs1.a);
335// CHECK: [[THREAD_NUM:%.+]] = call {{.*}}i32 @__kmpc_global_thread_num([[IDENT]]* [[DEFAULT_LOC]])
336// CHECK: call {{.*}}i{{.*}} @__cxa_guard_acquire
337// CHECK: call {{.*}}i32 @__kmpc_global_thread_num([[IDENT]]* [[DEFAULT_LOC]])
338// CHECK: call {{.*}}void @__kmpc_threadprivate_register([[IDENT]]* [[DEFAULT_LOC]], i8* bitcast ([[SMAIN]]* [[SM]] to i8*), i8* (i8*)* [[SM_CTOR:@\.__kmpc_global_ctor_\..+]], i8* (i8*, i8*)* null, void (i8*)* [[SM_DTOR:@\.__kmpc_global_dtor_\..+]])
339// CHECK: [[GS1_TEMP_ADDR:%.*]] = call {{.*}}i8* @__kmpc_threadprivate_cached([[IDENT]]* [[DEFAULT_LOC]], i32 [[THREAD_NUM]], i8* bitcast ([[S1]]* [[GS1]] to i8*), i{{.*}} {{[0-9]+}}, i8*** [[GS1]].cache.)
340// CHECK-NEXT: [[GS1_ADDR:%.*]] = bitcast i8* [[GS1_TEMP_ADDR]] to [[S1]]*
David Blaikie218b7832015-02-27 19:18:17 +0000341// CHECK-NEXT: [[GS1_A_ADDR:%.*]] = getelementptr inbounds [[S1]], [[S1]]* [[GS1_ADDR]], i{{.*}} 0, i{{.*}} 0
David Blaikiea953f282015-02-27 21:19:58 +0000342// CHECK-NEXT: [[GS1_A:%.*]] = load [[INT]], [[INT]]* [[GS1_A_ADDR]]
Alexey Bataev97720002014-11-11 04:05:39 +0000343// CHECK-NEXT: invoke {{.*}} [[SMAIN_CTOR:.*]]([[SMAIN]]* [[SM]], [[INT]] {{.*}}[[GS1_A]])
344// CHECK: call {{.*}}void @__cxa_guard_release
David Blaikie218b7832015-02-27 19:18:17 +0000345// CHECK-DEBUG: [[KMPC_LOC_ADDR_PSOURCE:%.*]] = getelementptr inbounds [[IDENT]], [[IDENT]]* [[KMPC_LOC_ADDR]], i{{.*}} 0, i{{.*}} 4
David Blaikiebdf40a62015-03-13 18:21:46 +0000346// CHECK-DEBUG-NEXT: store i8* getelementptr inbounds ([{{.*}} x i8], [{{.*}} x i8]* [[LOC3]], i{{.*}} 0, i{{.*}} 0), i8** [[KMPC_LOC_ADDR_PSOURCE]]
Alexey Bataev97720002014-11-11 04:05:39 +0000347// CHECK-DEBUG-NEXT: [[THREAD_NUM:%.+]] = call {{.*}}i32 @__kmpc_global_thread_num([[IDENT]]* [[KMPC_LOC_ADDR]])
348// CHECK-DEBUG: call {{.*}}i{{.*}} @__cxa_guard_acquire
349// CHECK-DEBUG: call {{.*}}i32 @__kmpc_global_thread_num([[IDENT]]* [[KMPC_LOC_ADDR]])
350// CHECK-DEBUG: call {{.*}}void @__kmpc_threadprivate_register([[IDENT]]* [[KMPC_LOC_ADDR]], i8* bitcast ([[SMAIN]]* [[SM]] to i8*), i8* (i8*)* [[SM_CTOR:@\.__kmpc_global_ctor_\..+]], i8* (i8*, i8*)* null, void (i8*)* [[SM_DTOR:@\.__kmpc_global_dtor_\..+]])
David Blaikie218b7832015-02-27 19:18:17 +0000351// CHECK-DEBUG: [[KMPC_LOC_ADDR_PSOURCE:%.*]] = getelementptr inbounds [[IDENT]], [[IDENT]]* [[KMPC_LOC_ADDR]], i{{.*}} 0, i{{.*}} 4
David Blaikiebdf40a62015-03-13 18:21:46 +0000352// CHECK-DEBUG-NEXT: store i8* getelementptr inbounds ([{{.*}} x i8], [{{.*}} x i8]* [[LOC3]], i{{.*}} 0, i{{.*}} 0), i8** [[KMPC_LOC_ADDR_PSOURCE]]
Alexey Bataev97720002014-11-11 04:05:39 +0000353// CHECK-DEBUG: [[GS1_TEMP_ADDR:%.*]] = call {{.*}}i8* @__kmpc_threadprivate_cached([[IDENT]]* [[KMPC_LOC_ADDR]], i32 [[THREAD_NUM]], i8* bitcast ([[S1]]* [[GS1]] to i8*), i{{.*}} {{[0-9]+}}, i8***
354// CHECK-DEBUG-NEXT: [[GS1_ADDR:%.*]] = bitcast i8* [[GS1_TEMP_ADDR]] to [[S1]]*
David Blaikie218b7832015-02-27 19:18:17 +0000355// CHECK-DEBUG-NEXT: [[GS1_A_ADDR:%.*]] = getelementptr inbounds [[S1]], [[S1]]* [[GS1_ADDR]], i{{.*}} 0, i{{.*}} 0
David Blaikiea953f282015-02-27 21:19:58 +0000356// CHECK-DEBUG-NEXT: [[GS1_A:%.*]] = load [[INT]], [[INT]]* [[GS1_A_ADDR]]
Alexey Bataev97720002014-11-11 04:05:39 +0000357// CHECK-DEBUG-NEXT: invoke {{.*}} [[SMAIN_CTOR:.*]]([[SMAIN]]* [[SM]], [[INT]] {{.*}}[[GS1_A]])
358// CHECK-DEBUG: call {{.*}}void @__cxa_guard_release
Samuel Antaof8b50122015-07-13 22:54:53 +0000359// CHECK-TLS: [[IS_INIT_INT:%.*]] = load i8, i8* [[SM_GUARD]]
360// CHECK-TLS-NEXT: [[IS_INIT_BOOL:%.*]] = icmp eq i8 [[IS_INIT_INT]], 0
361// CHECK-TLS-NEXT: br i1 [[IS_INIT_BOOL]], label %[[INIT_LABEL:.*]], label %[[INIT_DONE:[^,]+]]{{.*}}
362// CHECK-TLS: [[INIT_LABEL]]
363// CHECK-TLS-NEXT: [[GS1_ADDR:%.*]] = call [[S1]]* [[GS1_TLS_INITD:@[^,]+]]
364// CHECK-TLS-NEXT: [[GS1_A_ADDR:%.*]] = getelementptr inbounds [[S1]], [[S1]]* [[GS1_ADDR]], i32 0, i32 0
365// CHECK-TLS-NEXT: [[GS1_A_VAL:%.*]] = load i32, i32* [[GS1_A_ADDR]]
366// CHECK-TLS-NEXT: call void [[SM_CTOR1:@.*]]([[SMAIN]]* [[SM]], i32 [[GS1_A_VAL]])
367// CHECK-TLS-NEXT: call i32 @__cxa_thread_atexit(void (i8*)* bitcast (void ([[SMAIN]]*)* [[SM_DTOR1:@.*]] to void (i8*)*), i8* bitcast ([[SMAIN]]* [[SM]] to i8*), i8* @__dso_handle)
368// CHECK-TLS-NEXT: store i8 1, i8* [[SM_GUARD]]
369// CHECK-TLS-NEXT: br label %[[INIT_DONE]]
370// CHECK-TLS: [[INIT_DONE]]
Alexey Bataev97720002014-11-11 04:05:39 +0000371#pragma omp threadprivate(sm)
372 // CHECK: [[STATIC_S_TEMP_ADDR:%.*]] = call {{.*}}i8* @__kmpc_threadprivate_cached([[IDENT]]* [[DEFAULT_LOC]], i32 [[THREAD_NUM]], i8* bitcast ([[S3]]* [[STATIC_S]] to i8*), i{{.*}} {{[0-9]+}}, i8*** [[STATIC_S]].cache.)
373 // CHECK-NEXT: [[STATIC_S_ADDR:%.*]] = bitcast i8* [[STATIC_S_TEMP_ADDR]] to [[S3]]*
David Blaikie218b7832015-02-27 19:18:17 +0000374 // CHECK-NEXT: [[STATIC_S_A_ADDR:%.*]] = getelementptr inbounds [[S3]], [[S3]]* [[STATIC_S_ADDR]], i{{.*}} 0, i{{.*}} 0
David Blaikiea953f282015-02-27 21:19:58 +0000375 // CHECK-NEXT: [[STATIC_S_A:%.*]] = load [[INT]], [[INT]]* [[STATIC_S_A_ADDR]]
Alexey Bataev97720002014-11-11 04:05:39 +0000376 // CHECK-NEXT: store [[INT]] [[STATIC_S_A]], [[INT]]* [[RES_ADDR:[^,]+]]
David Blaikie218b7832015-02-27 19:18:17 +0000377 // CHECK-DEBUG: [[KMPC_LOC_ADDR_PSOURCE:%.*]] = getelementptr inbounds [[IDENT]], [[IDENT]]* [[KMPC_LOC_ADDR]], i{{.*}} 0, i{{.*}} 4
David Blaikiebdf40a62015-03-13 18:21:46 +0000378 // CHECK-DEBUG-NEXT: store i8* getelementptr inbounds ([{{.*}} x i8], [{{.*}} x i8]* [[LOC5]], i{{.*}} 0, i{{.*}} 0), i8** [[KMPC_LOC_ADDR_PSOURCE]]
Alexey Bataev97720002014-11-11 04:05:39 +0000379 // CHECK-DEBUG-NEXT: [[STATIC_S_TEMP_ADDR:%.*]] = call {{.*}}i8* @__kmpc_threadprivate_cached([[IDENT]]* [[KMPC_LOC_ADDR]], i32 [[THREAD_NUM]], i8* bitcast ([[S3]]* [[STATIC_S]] to i8*), i{{.*}} {{[0-9]+}}, i8***
380 // CHECK-DEBUG-NEXT: [[STATIC_S_ADDR:%.*]] = bitcast i8* [[STATIC_S_TEMP_ADDR]] to [[S3]]*
David Blaikie218b7832015-02-27 19:18:17 +0000381 // CHECK-DEBUG-NEXT: [[STATIC_S_A_ADDR:%.*]] = getelementptr inbounds [[S3]], [[S3]]* [[STATIC_S_ADDR]], i{{.*}} 0, i{{.*}} 0
David Blaikiea953f282015-02-27 21:19:58 +0000382 // CHECK-DEBUG-NEXT: [[STATIC_S_A:%.*]] = load [[INT]], [[INT]]* [[STATIC_S_A_ADDR]]
Alexey Bataev97720002014-11-11 04:05:39 +0000383 // CHECK-DEBUG-NEXT: store [[INT]] [[STATIC_S_A]], [[INT]]* [[RES_ADDR:[^,]+]]
Samuel Antaof8b50122015-07-13 22:54:53 +0000384 // CHECK-TLS: [[STATIC_S_ADDR:%.*]] = call [[S3]]* [[STATIC_S_TLS_INITD:@[^,]+]]
385 // CHECK-TLS-NEXT: [[STATIC_S_A_ADDR:%.*]] = getelementptr inbounds [[S3]], [[S3]]* [[STATIC_S_ADDR]], i{{.*}} 0, i{{.*}} 0
386 // CHECK-TLS-NEXT: [[STATIC_S_A:%.*]] = load i32, i32* [[STATIC_S_A_ADDR]]
387 // CHECK-TLS-NEXT: store i32 [[STATIC_S_A]], i32* [[RES_ADDR:[^,]+]]
Alexey Bataev97720002014-11-11 04:05:39 +0000388 Res = Static::s.a;
389 // CHECK: [[SM_TEMP_ADDR:%.*]] = call {{.*}}i8* @__kmpc_threadprivate_cached([[IDENT]]* [[DEFAULT_LOC]], i32 [[THREAD_NUM]], i8* bitcast ([[SMAIN]]* [[SM]] to i8*), i{{.*}} {{[0-9]+}}, i8*** [[SM]].cache.)
390 // CHECK-NEXT: [[SM_ADDR:%.*]] = bitcast i8* [[SM_TEMP_ADDR]] to [[SMAIN]]*
David Blaikie218b7832015-02-27 19:18:17 +0000391 // CHECK-NEXT: [[SM_A_ADDR:%.*]] = getelementptr inbounds [[SMAIN]], [[SMAIN]]* [[SM_ADDR]], i{{.*}} 0, i{{.*}} 0
David Blaikiea953f282015-02-27 21:19:58 +0000392 // CHECK-NEXT: [[SM_A:%.*]] = load [[INT]], [[INT]]* [[SM_A_ADDR]]
393 // CHECK-NEXT: [[RES:%.*]] = load [[INT]], [[INT]]* [[RES_ADDR]]
Alexey Bataev97720002014-11-11 04:05:39 +0000394 // CHECK-NEXT: [[ADD:%.*]] = add {{.*}} [[INT]] [[RES]], [[SM_A]]
395 // CHECK-NEXT: store [[INT]] [[ADD]], [[INT]]* [[RES:.+]]
David Blaikie218b7832015-02-27 19:18:17 +0000396 // CHECK-DEBUG: [[KMPC_LOC_ADDR_PSOURCE:%.*]] = getelementptr inbounds [[IDENT]], [[IDENT]]* [[KMPC_LOC_ADDR]], i{{.*}} 0, i{{.*}} 4
David Blaikiebdf40a62015-03-13 18:21:46 +0000397 // CHECK-DEBUG-NEXT: store i8* getelementptr inbounds ([{{.*}} x i8], [{{.*}} x i8]* [[LOC6]], i{{.*}} 0, i{{.*}} 0), i8** [[KMPC_LOC_ADDR_PSOURCE]]
Alexey Bataev97720002014-11-11 04:05:39 +0000398 // CHECK-DEBUG-NEXT: [[SM_TEMP_ADDR:%.*]] = call {{.*}}i8* @__kmpc_threadprivate_cached([[IDENT]]* [[KMPC_LOC_ADDR]], i32 [[THREAD_NUM]], i8* bitcast ([[SMAIN]]* [[SM]] to i8*), i{{.*}} {{[0-9]+}}, i8***
399 // CHECK-DEBUG-NEXT: [[SM_ADDR:%.*]] = bitcast i8* [[SM_TEMP_ADDR]] to [[SMAIN]]*
David Blaikie218b7832015-02-27 19:18:17 +0000400 // CHECK-DEBUG-NEXT: [[SM_A_ADDR:%.*]] = getelementptr inbounds [[SMAIN]], [[SMAIN]]* [[SM_ADDR]], i{{.*}} 0, i{{.*}} 0
David Blaikiea953f282015-02-27 21:19:58 +0000401 // CHECK-DEBUG-NEXT: [[SM_A:%.*]] = load [[INT]], [[INT]]* [[SM_A_ADDR]]
402 // CHECK-DEBUG-NEXT: [[RES:%.*]] = load [[INT]], [[INT]]* [[RES_ADDR]]
Alexey Bataev97720002014-11-11 04:05:39 +0000403 // CHECK-DEBUG-NEXT: [[ADD:%.*]] = add {{.*}} [[INT]] [[RES]], [[SM_A]]
404 // CHECK-DEBUG-NEXT: store [[INT]] [[ADD]], [[INT]]* [[RES:.+]]
Samuel Antaof8b50122015-07-13 22:54:53 +0000405 // [[SM]] was initialized already, so it can be used directly
406 // CHECK-TLS: [[SM_A:%.*]] = load i32, i32* getelementptr inbounds ([[SMAIN]], [[SMAIN]]* [[SM]], i{{.*}} 0, i{{.*}} 0)
407 // CHECK-TLS-NEXT: [[RES:%.*]] = load i32, i32* [[RES_ADDR]]
408 // CHECK-TLS-NEXT: [[ADD:%.*]] = add {{.*}} i32 [[RES]], [[SM_A]]
409 // CHECK-TLS-NEXT: store i32 [[ADD]], i32* [[RES_ADDR]]
Alexey Bataev97720002014-11-11 04:05:39 +0000410 Res += sm.a;
411 // CHECK: [[GS1_TEMP_ADDR:%.*]] = call {{.*}}i8* @__kmpc_threadprivate_cached([[IDENT]]* [[DEFAULT_LOC]], i32 [[THREAD_NUM]], i8* bitcast ([[S1]]* [[GS1]] to i8*), i{{.*}} {{[0-9]+}}, i8*** [[GS1]].cache.)
412 // CHECK-NEXT: [[GS1_ADDR:%.*]] = bitcast i8* [[GS1_TEMP_ADDR]] to [[S1]]*
David Blaikie218b7832015-02-27 19:18:17 +0000413 // CHECK-NEXT: [[GS1_A_ADDR:%.*]] = getelementptr inbounds [[S1]], [[S1]]* [[GS1_ADDR]], i{{.*}} 0, i{{.*}} 0
David Blaikiea953f282015-02-27 21:19:58 +0000414 // CHECK-NEXT: [[GS1_A:%.*]] = load [[INT]], [[INT]]* [[GS1_A_ADDR]]
415 // CHECK-NEXT: [[RES:%.*]] = load [[INT]], [[INT]]* [[RES_ADDR]]
Alexey Bataev97720002014-11-11 04:05:39 +0000416 // CHECK-NEXT: [[ADD:%.*]] = add {{.*}} [[INT]] [[RES]], [[GS1_A]]
417 // CHECK-NEXT: store [[INT]] [[ADD]], [[INT]]* [[RES:.+]]
David Blaikie218b7832015-02-27 19:18:17 +0000418 // CHECK-DEBUG: [[KMPC_LOC_ADDR_PSOURCE:%.*]] = getelementptr inbounds [[IDENT]], [[IDENT]]* [[KMPC_LOC_ADDR]], i{{.*}} 0, i{{.*}} 4
David Blaikiebdf40a62015-03-13 18:21:46 +0000419 // CHECK-DEBUG-NEXT: store i8* getelementptr inbounds ([{{.*}} x i8], [{{.*}} x i8]* [[LOC7]], i{{.*}} 0, i{{.*}} 0), i8** [[KMPC_LOC_ADDR_PSOURCE]]
Alexey Bataev97720002014-11-11 04:05:39 +0000420 // CHECK-DEBUG-NEXT: [[GS1_TEMP_ADDR:%.*]] = call {{.*}}i8* @__kmpc_threadprivate_cached([[IDENT]]* [[KMPC_LOC_ADDR]], i32 [[THREAD_NUM]], i8* bitcast ([[S1]]* [[GS1]] to i8*), i{{.*}} {{[0-9]+}}, i8***
421 // CHECK-DEBUG-NEXT: [[GS1_ADDR:%.*]] = bitcast i8* [[GS1_TEMP_ADDR]] to [[S1]]*
David Blaikie218b7832015-02-27 19:18:17 +0000422 // CHECK-DEBUG-NEXT: [[GS1_A_ADDR:%.*]] = getelementptr inbounds [[S1]], [[S1]]* [[GS1_ADDR]], i{{.*}} 0, i{{.*}} 0
David Blaikiea953f282015-02-27 21:19:58 +0000423 // CHECK-DEBUG-NEXT: [[GS1_A:%.*]] = load [[INT]], [[INT]]* [[GS1_A_ADDR]]
424 // CHECK-DEBUG-NEXT: [[RES:%.*]] = load [[INT]], [[INT]]* [[RES_ADDR]]
Alexey Bataev97720002014-11-11 04:05:39 +0000425 // CHECK-DEBUG-NEXT: [[ADD:%.*]] = add {{.*}} [[INT]] [[RES]], [[GS1_A]]
426 // CHECK-DEBUG-NEXT: store [[INT]] [[ADD]], [[INT]]* [[RES:.+]]
Samuel Antaof8b50122015-07-13 22:54:53 +0000427 // CHECK-TLS: [[GS1_ADDR:%.*]] = call [[S1]]* [[GS1_TLS_INITD]]
428 // CHECK-TLS-NEXT: [[GS1_A_ADDR:%.*]] = getelementptr inbounds [[S1]], [[S1]]* [[GS1_ADDR]], i{{.*}} 0, i{{.*}} 0
429 // CHECK-TLS-NEXT: [[GS1_A:%.*]] = load i32, i32* [[GS1_A_ADDR]]
430 // CHECK-TLS-NEXT: [[RES:%.*]] = load i32, i32* [[RES_ADDR]]
431 // CHECK-TLS-NEXT: [[ADD:%.*]] = add {{.*}} i32 [[RES]], [[GS1_A]]
432 // CHECK-TLS-NEXT: store i32 [[ADD]], i32* [[RES_ADDR]]
Alexey Bataev97720002014-11-11 04:05:39 +0000433 Res += gs1.a;
David Blaikiebdf40a62015-03-13 18:21:46 +0000434 // CHECK: [[GS2_A:%.*]] = load [[INT]], [[INT]]* getelementptr inbounds ([[S2]], [[S2]]* [[GS2]], i{{.*}} 0, i{{.*}} 0)
David Blaikiea953f282015-02-27 21:19:58 +0000435 // CHECK-NEXT: [[RES:%.*]] = load [[INT]], [[INT]]* [[RES_ADDR]]
Alexey Bataev97720002014-11-11 04:05:39 +0000436 // CHECK-NEXT: [[ADD:%.*]] = add {{.*}} [[INT]] [[RES]], [[GS2_A]]
437 // CHECK-NEXT: store [[INT]] [[ADD]], [[INT]]* [[RES:.+]]
David Blaikiebdf40a62015-03-13 18:21:46 +0000438 // CHECK-DEBUG: [[GS2_A:%.*]] = load [[INT]], [[INT]]* getelementptr inbounds ([[S2]], [[S2]]* [[GS2]], i{{.*}} 0, i{{.*}} 0)
David Blaikiea953f282015-02-27 21:19:58 +0000439 // CHECK-DEBUG-NEXT: [[RES:%.*]] = load [[INT]], [[INT]]* [[RES_ADDR]]
Alexey Bataev97720002014-11-11 04:05:39 +0000440 // CHECK-DEBUG-NEXT: [[ADD:%.*]] = add {{.*}} [[INT]] [[RES]], [[GS2_A]]
441 // CHECK-DEBUG-NEXT: store [[INT]] [[ADD]], [[INT]]* [[RES:.+]]
Samuel Antaof8b50122015-07-13 22:54:53 +0000442 // CHECK-TLS: [[GS2_A:%.*]] = load [[INT]], [[INT]]* getelementptr inbounds ([[S2]], [[S2]]* [[GS2]], i{{.*}} 0, i{{.*}} 0)
443 // CHECK-TLS-NEXT: [[RES:%.*]] = load [[INT]], [[INT]]* [[RES_ADDR]]
444 // CHECK-TLS-NEXT: [[ADD:%.*]] = add {{.*}} [[INT]] [[RES]], [[GS2_A]]
445 // CHECK-TLS-NEXT: store [[INT]] [[ADD]], [[INT]]* [[RES:.+]]
Alexey Bataev97720002014-11-11 04:05:39 +0000446 Res += gs2.a;
447 // CHECK: [[GS3_TEMP_ADDR:%.*]] = call {{.*}}i8* @__kmpc_threadprivate_cached([[IDENT]]* [[DEFAULT_LOC]], i32 [[THREAD_NUM]], i8* bitcast ([[S5]]* [[GS3]] to i8*), i{{.*}} {{[0-9]+}}, i8*** [[GS3]].cache.)
448 // CHECK-NEXT: [[GS3_ADDR:%.*]] = bitcast i8* [[GS3_TEMP_ADDR]] to [[S5]]*
David Blaikie218b7832015-02-27 19:18:17 +0000449 // CHECK-NEXT: [[GS3_A_ADDR:%.*]] = getelementptr inbounds [[S5]], [[S5]]* [[GS3_ADDR]], i{{.*}} 0, i{{.*}} 0
David Blaikiea953f282015-02-27 21:19:58 +0000450 // CHECK-NEXT: [[GS3_A:%.*]] = load [[INT]], [[INT]]* [[GS3_A_ADDR]]
451 // CHECK-NEXT: [[RES:%.*]] = load [[INT]], [[INT]]* [[RES_ADDR]]
Alexey Bataev97720002014-11-11 04:05:39 +0000452 // CHECK-NEXT: [[ADD:%.*]] = add {{.*}} [[INT]] [[RES]], [[GS3_A]]
453 // CHECK-NEXT: store [[INT]] [[ADD]], [[INT]]* [[RES:.+]]
David Blaikie218b7832015-02-27 19:18:17 +0000454 // CHECK-DEBUG: [[KMPC_LOC_ADDR_PSOURCE:%.*]] = getelementptr inbounds [[IDENT]], [[IDENT]]* [[KMPC_LOC_ADDR]], i{{.*}} 0, i{{.*}} 4
David Blaikiebdf40a62015-03-13 18:21:46 +0000455 // CHECK-DEBUG-NEXT: store i8* getelementptr inbounds ([{{.*}} x i8], [{{.*}} x i8]* [[LOC8]], i{{.*}} 0, i{{.*}} 0), i8** [[KMPC_LOC_ADDR_PSOURCE]]
Alexey Bataev97720002014-11-11 04:05:39 +0000456 // CHECK-DEBUG-NEXT: [[GS3_TEMP_ADDR:%.*]] = call {{.*}}i8* @__kmpc_threadprivate_cached([[IDENT]]* [[KMPC_LOC_ADDR]], i32 [[THREAD_NUM]], i8* bitcast ([[S5]]* [[GS3]] to i8*), i{{.*}} {{[0-9]+}}, i8***
457 // CHECK-DEBUG-NEXT: [[GS3_ADDR:%.*]] = bitcast i8* [[GS3_TEMP_ADDR]] to [[S5]]*
David Blaikie218b7832015-02-27 19:18:17 +0000458 // CHECK-DEBUG-NEXT: [[GS3_A_ADDR:%.*]] = getelementptr inbounds [[S5]], [[S5]]* [[GS3_ADDR]], i{{.*}} 0, i{{.*}} 0
David Blaikiea953f282015-02-27 21:19:58 +0000459 // CHECK-DEBUG-NEXT: [[GS3_A:%.*]] = load [[INT]], [[INT]]* [[GS3_A_ADDR]]
460 // CHECK-DEBUG-NEXT: [[RES:%.*]] = load [[INT]], [[INT]]* [[RES_ADDR]]
Alexey Bataev97720002014-11-11 04:05:39 +0000461 // CHECK-DEBUG-NEXT: [[ADD:%.*]] = add {{.*}} [[INT]] [[RES]], [[GS3_A]]
462 // CHECK-DEBUG-NEXT: store [[INT]] [[ADD]], [[INT]]* [[RES:.+]]
Samuel Antaof8b50122015-07-13 22:54:53 +0000463 // CHECK-TLS: [[GS3_ADDR:%.*]] = call [[S5]]* [[GS3_TLS_INITD:[^,]+]]
464 // CHECK-TLS-NEXT: [[GS3_A_ADDR:%.*]] = getelementptr inbounds [[S5]], [[S5]]* [[GS3_ADDR]], i{{.*}} 0, i{{.*}} 0
465 // CHECK-TLS-NEXT: [[GS3_A:%.*]] = load i32, i32* [[GS3_A_ADDR]]
466 // CHECK-TLS-NEXT: [[RES:%.*]] = load i32, i32* [[RES_ADDR]]
467 // CHECK-TLS-NEXT: [[ADD:%.*]] = add nsw i32 [[RES]], [[GS3_A]]
468 // CHECK-TLS-NEXT: store i32 [[ADD]], i32* [[RES_ADDR]]
Alexey Bataev97720002014-11-11 04:05:39 +0000469 Res += gs3.a;
470 // CHECK: [[ARR_X_TEMP_ADDR:%.*]] = call {{.*}}i8* @__kmpc_threadprivate_cached([[IDENT]]* [[DEFAULT_LOC]], i32 [[THREAD_NUM]], i8* bitcast ([2 x [3 x [[S1]]]]* [[ARR_X]] to i8*), i{{.*}} {{[0-9]+}}, i8*** [[ARR_X]].cache.)
471 // CHECK-NEXT: [[ARR_X_ADDR:%.*]] = bitcast i8* [[ARR_X_TEMP_ADDR]] to [2 x [3 x [[S1]]]]*
David Blaikie218b7832015-02-27 19:18:17 +0000472 // CHECK-NEXT: [[ARR_X_1_ADDR:%.*]] = getelementptr inbounds [2 x [3 x [[S1]]]], [2 x [3 x [[S1]]]]* [[ARR_X_ADDR]], i{{.*}} 0, i{{.*}} 1
473 // CHECK-NEXT: [[ARR_X_1_1_ADDR:%.*]] = getelementptr inbounds [3 x [[S1]]], [3 x [[S1]]]* [[ARR_X_1_ADDR]], i{{.*}} 0, i{{.*}} 1
474 // CHECK-NEXT: [[ARR_X_1_1_A_ADDR:%.*]] = getelementptr inbounds [[S1]], [[S1]]* [[ARR_X_1_1_ADDR]], i{{.*}} 0, i{{.*}} 0
David Blaikiea953f282015-02-27 21:19:58 +0000475 // CHECK-NEXT: [[ARR_X_1_1_A:%.*]] = load [[INT]], [[INT]]* [[ARR_X_1_1_A_ADDR]]
476 // CHECK-NEXT: [[RES:%.*]] = load [[INT]], [[INT]]* [[RES_ADDR]]
Alexey Bataev97720002014-11-11 04:05:39 +0000477 // CHECK-NEXT: [[ADD:%.*]] = add {{.*}} [[INT]] [[RES]], [[ARR_X_1_1_A]]
478 // CHECK-NEXT: store [[INT]] [[ADD]], [[INT]]* [[RES:.+]]
David Blaikie218b7832015-02-27 19:18:17 +0000479 // CHECK-DEBUG: [[KMPC_LOC_ADDR_PSOURCE:%.*]] = getelementptr inbounds [[IDENT]], [[IDENT]]* [[KMPC_LOC_ADDR]], i{{.*}} 0, i{{.*}} 4
David Blaikiebdf40a62015-03-13 18:21:46 +0000480 // CHECK-DEBUG-NEXT: store i8* getelementptr inbounds ([{{.*}} x i8], [{{.*}} x i8]* [[LOC9]], i{{.*}} 0, i{{.*}} 0), i8** [[KMPC_LOC_ADDR_PSOURCE]]
Alexey Bataev97720002014-11-11 04:05:39 +0000481 // CHECK-DEBUG-NEXT: [[ARR_X_TEMP_ADDR:%.*]] = call {{.*}}i8* @__kmpc_threadprivate_cached([[IDENT]]* [[KMPC_LOC_ADDR]], i32 [[THREAD_NUM]], i8* bitcast ([2 x [3 x [[S1]]]]* [[ARR_X]] to i8*), i{{.*}} {{[0-9]+}}, i8***
482 // CHECK-DEBUG-NEXT: [[ARR_X_ADDR:%.*]] = bitcast i8* [[ARR_X_TEMP_ADDR]] to [2 x [3 x [[S1]]]]*
David Blaikie218b7832015-02-27 19:18:17 +0000483 // CHECK-DEBUG-NEXT: [[ARR_X_1_ADDR:%.*]] = getelementptr inbounds [2 x [3 x [[S1]]]], [2 x [3 x [[S1]]]]* [[ARR_X_ADDR]], i{{.*}} 0, i{{.*}} 1
484 // CHECK-DEBUG-NEXT: [[ARR_X_1_1_ADDR:%.*]] = getelementptr inbounds [3 x [[S1]]], [3 x [[S1]]]* [[ARR_X_1_ADDR]], i{{.*}} 0, i{{.*}} 1
485 // CHECK-DEBUG-NEXT: [[ARR_X_1_1_A_ADDR:%.*]] = getelementptr inbounds [[S1]], [[S1]]* [[ARR_X_1_1_ADDR]], i{{.*}} 0, i{{.*}} 0
David Blaikiea953f282015-02-27 21:19:58 +0000486 // CHECK-DEBUG-NEXT: [[ARR_X_1_1_A:%.*]] = load [[INT]], [[INT]]* [[ARR_X_1_1_A_ADDR]]
487 // CHECK-DEBUG-NEXT: [[RES:%.*]] = load [[INT]], [[INT]]* [[RES_ADDR]]
Alexey Bataev97720002014-11-11 04:05:39 +0000488 // CHECK-DEBUG-NEXT: [[ADD:%.*]] = add {{.*}} [[INT]] [[RES]], [[ARR_X_1_1_A]]
489 // CHECK-DEBUG-NEXT: store [[INT]] [[ADD]], [[INT]]* [[RES:.+]]
Samuel Antaof8b50122015-07-13 22:54:53 +0000490 // CHECK-TLS: [[ARR_X_ADDR:%.*]] = call [2 x [3 x [[S1]]]]* [[ARR_X_TLS_INITD:[^,]+]]
491 // CHECK-TLS-NEXT: [[ARR_X_1_ADDR:%.*]] = getelementptr inbounds [2 x [3 x [[S1]]]], [2 x [3 x [[S1]]]]* [[ARR_X_ADDR]], i{{.*}} 0, i{{.*}} 1
492 // CHECK-TLS-NEXT: [[ARR_X_1_1_ADDR:%.*]] = getelementptr inbounds [3 x [[S1]]], [3 x [[S1]]]* [[ARR_X_1_ADDR]], i{{.*}} 0, i{{.*}} 1
493 // CHECK-TLS-NEXT: [[ARR_X_1_1_A_ADDR:%.*]] = getelementptr inbounds [[S1]], [[S1]]* [[ARR_X_1_1_ADDR]], i{{.*}} 0, i{{.*}} 0
494 // CHECK-TLS-NEXT: [[ARR_X_1_1_A:%.*]] = load i32, i32* [[ARR_X_1_1_A_ADDR]]
495 // CHECK-TLS-NEXT: [[RES:%.*]] = load i32, i32* [[RES_ADDR]]
496 // CHECK-TLS-NEXT: [[ADD:%.*]] = add {{.*}} i32 [[RES]], [[ARR_X_1_1_A]]
497 // CHECK-TLS-NEXT: store i32 [[ADD]], i32* [[RES_ADDR]]
Alexey Bataev97720002014-11-11 04:05:39 +0000498 Res += arr_x[1][1].a;
499 // CHECK: [[ST_INT_ST_TEMP_ADDR:%.*]] = call {{.*}}i8* @__kmpc_threadprivate_cached([[IDENT]]* [[DEFAULT_LOC]], i32 [[THREAD_NUM]], i8* bitcast ([[INT]]* [[ST_INT_ST]] to i8*), i{{.*}} {{[0-9]+}}, i8*** [[ST_INT_ST]].cache.)
500 // CHECK-NEXT: [[ST_INT_ST_ADDR:%.*]] = bitcast i8* [[ST_INT_ST_TEMP_ADDR]] to [[INT]]*
David Blaikiea953f282015-02-27 21:19:58 +0000501 // CHECK-NEXT: [[ST_INT_ST_VAL:%.*]] = load [[INT]], [[INT]]* [[ST_INT_ST_ADDR]]
502 // CHECK-NEXT: [[RES:%.*]] = load [[INT]], [[INT]]* [[RES_ADDR]]
Alexey Bataev97720002014-11-11 04:05:39 +0000503 // CHECK-NEXT: [[ADD:%.*]] = add {{.*}} [[INT]] [[RES]], [[ST_INT_ST_VAL]]
504 // CHECK-NEXT: store [[INT]] [[ADD]], [[INT]]* [[RES:.+]]
David Blaikie218b7832015-02-27 19:18:17 +0000505 // CHECK-DEBUG: [[KMPC_LOC_ADDR_PSOURCE:%.*]] = getelementptr inbounds [[IDENT]], [[IDENT]]* [[KMPC_LOC_ADDR]], i{{.*}} 0, i{{.*}} 4
David Blaikiebdf40a62015-03-13 18:21:46 +0000506 // CHECK-DEBUG-NEXT: store i8* getelementptr inbounds ([{{.*}} x i8], [{{.*}} x i8]* [[LOC10]], i{{.*}} 0, i{{.*}} 0), i8** [[KMPC_LOC_ADDR_PSOURCE]]
Alexey Bataev97720002014-11-11 04:05:39 +0000507 // CHECK-DEBUG-NEXT: [[ST_INT_ST_TEMP_ADDR:%.*]] = call {{.*}}i8* @__kmpc_threadprivate_cached([[IDENT]]* [[KMPC_LOC_ADDR]], i32 [[THREAD_NUM]], i8* bitcast ([[INT]]* [[ST_INT_ST]] to i8*), i{{.*}} {{[0-9]+}}, i8***
508 // CHECK-DEBUG-NEXT: [[ST_INT_ST_ADDR:%.*]] = bitcast i8* [[ST_INT_ST_TEMP_ADDR]] to [[INT]]*
David Blaikiea953f282015-02-27 21:19:58 +0000509 // CHECK-DEBUG-NEXT: [[ST_INT_ST_VAL:%.*]] = load [[INT]], [[INT]]* [[ST_INT_ST_ADDR]]
510 // CHECK-DEBUG-NEXT: [[RES:%.*]] = load [[INT]], [[INT]]* [[RES_ADDR]]
Alexey Bataev97720002014-11-11 04:05:39 +0000511 // CHECK-DEBUG-NEXT: [[ADD:%.*]] = add {{.*}} [[INT]] [[RES]], [[ST_INT_ST_VAL]]
512 // CHECK-DEBUG-NEXT: store [[INT]] [[ADD]], [[INT]]* [[RES:.+]]
Samuel Antaof8b50122015-07-13 22:54:53 +0000513 // CHECK-TLS: [[ST_INT_ST_ADDR:%.*]] = call i32* [[ST_INT_ST_TLS_INITD:[^,]+]]
514 // CHECK-TLS-NEXT: [[ST_INT_ST_VAL:%.*]] = load i32, i32* [[ST_INT_ST_ADDR]]
515 // CHECK-TLS-NEXT: [[RES:%.*]] = load i32, i32* [[RES_ADDR]]
516 // CHECK-TLS-NEXT: [[ADD:%.*]] = add {{.*}} i32 [[RES]], [[ST_INT_ST_VAL]]
517 // CHECK-TLS-NEXT: store i32 [[ADD]], i32* [[RES_ADDR]]
Alexey Bataev97720002014-11-11 04:05:39 +0000518 Res += ST<int>::st;
519 // CHECK: [[ST_FLOAT_ST_TEMP_ADDR:%.*]] = call {{.*}}i8* @__kmpc_threadprivate_cached([[IDENT]]* [[DEFAULT_LOC]], i32 [[THREAD_NUM]], i8* bitcast (float* [[ST_FLOAT_ST]] to i8*), i{{.*}} {{[0-9]+}}, i8*** [[ST_FLOAT_ST]].cache.)
520 // CHECK-NEXT: [[ST_FLOAT_ST_ADDR:%.*]] = bitcast i8* [[ST_FLOAT_ST_TEMP_ADDR]] to float*
David Blaikiea953f282015-02-27 21:19:58 +0000521 // CHECK-NEXT: [[ST_FLOAT_ST_VAL:%.*]] = load float, float* [[ST_FLOAT_ST_ADDR]]
Alexey Bataev97720002014-11-11 04:05:39 +0000522 // CHECK-NEXT: [[FLOAT_TO_INT_CONV:%.*]] = fptosi float [[ST_FLOAT_ST_VAL]] to [[INT]]
David Blaikiea953f282015-02-27 21:19:58 +0000523 // CHECK-NEXT: [[RES:%.*]] = load [[INT]], [[INT]]* [[RES_ADDR]]
Alexey Bataev97720002014-11-11 04:05:39 +0000524 // CHECK-NEXT: [[ADD:%.*]] = add {{.*}} [[INT]] [[RES]], [[FLOAT_TO_INT_CONV]]
525 // CHECK-NEXT: store [[INT]] [[ADD]], [[INT]]* [[RES:.+]]
David Blaikie218b7832015-02-27 19:18:17 +0000526 // CHECK-DEBUG: [[KMPC_LOC_ADDR_PSOURCE:%.*]] = getelementptr inbounds [[IDENT]], [[IDENT]]* [[KMPC_LOC_ADDR]], i{{.*}} 0, i{{.*}} 4
David Blaikiebdf40a62015-03-13 18:21:46 +0000527 // CHECK-DEBUG-NEXT: store i8* getelementptr inbounds ([{{.*}} x i8], [{{.*}} x i8]* [[LOC11]], i{{.*}} 0, i{{.*}} 0), i8** [[KMPC_LOC_ADDR_PSOURCE]]
Alexey Bataev97720002014-11-11 04:05:39 +0000528 // CHECK-DEBUG-NEXT: [[ST_FLOAT_ST_TEMP_ADDR:%.*]] = call {{.*}}i8* @__kmpc_threadprivate_cached([[IDENT]]* [[KMPC_LOC_ADDR]], i32 [[THREAD_NUM]], i8* bitcast (float* [[ST_FLOAT_ST]] to i8*), i{{.*}} {{[0-9]+}}, i8***
529 // CHECK-DEBUG-NEXT: [[ST_FLOAT_ST_ADDR:%.*]] = bitcast i8* [[ST_FLOAT_ST_TEMP_ADDR]] to float*
David Blaikiea953f282015-02-27 21:19:58 +0000530 // CHECK-DEBUG-NEXT: [[ST_FLOAT_ST_VAL:%.*]] = load float, float* [[ST_FLOAT_ST_ADDR]]
Alexey Bataev97720002014-11-11 04:05:39 +0000531 // CHECK-DEBUG-NEXT: [[FLOAT_TO_INT_CONV:%.*]] = fptosi float [[ST_FLOAT_ST_VAL]] to [[INT]]
David Blaikiea953f282015-02-27 21:19:58 +0000532 // CHECK-DEBUG-NEXT: [[RES:%.*]] = load [[INT]], [[INT]]* [[RES_ADDR]]
Alexey Bataev97720002014-11-11 04:05:39 +0000533 // CHECK-DEBUG-NEXT: [[ADD:%.*]] = add {{.*}} [[INT]] [[RES]], [[FLOAT_TO_INT_CONV]]
534 // CHECK-DEBUG-NEXT: store [[INT]] [[ADD]], [[INT]]* [[RES:.+]]
Samuel Antaof8b50122015-07-13 22:54:53 +0000535 // CHECK-TLS: [[ST_FLOAT_ST_ADDR:%.*]] = call float* [[ST_FLOAT_ST_TLS_INITD:[^,]+]]
536 // CHECK-TLS-NEXT: [[ST_FLOAT_ST_VAL:%.*]] = load float, float* [[ST_FLOAT_ST_ADDR]]
537 // CHECK-TLS-NEXT: [[FLOAT_TO_INT_CONV:%.*]] = fptosi float [[ST_FLOAT_ST_VAL]] to i32
538 // CHECK-TLS-NEXT: [[RES:%.*]] = load i32, i32* [[RES_ADDR]]
539 // CHECK-TLS-NEXT: [[ADD:%.*]] = add {{.*}} i32 [[RES]], [[FLOAT_TO_INT_CONV]]
540 // CHECK-TLS-NEXT: store i32 [[ADD]], i32* [[RES_ADDR]]
Alexey Bataev97720002014-11-11 04:05:39 +0000541 Res += static_cast<int>(ST<float>::st);
542 // CHECK: [[ST_S4_ST_TEMP_ADDR:%.*]] = call {{.*}}i8* @__kmpc_threadprivate_cached([[IDENT]]* [[DEFAULT_LOC]], i32 [[THREAD_NUM]], i8* bitcast ([[S4]]* [[ST_S4_ST]] to i8*), i{{.*}} {{[0-9]+}}, i8*** [[ST_S4_ST]].cache.)
543 // CHECK-NEXT: [[ST_S4_ST_ADDR:%.*]] = bitcast i8* [[ST_S4_ST_TEMP_ADDR]] to [[S4]]*
David Blaikie218b7832015-02-27 19:18:17 +0000544 // CHECK-NEXT: [[ST_S4_ST_A_ADDR:%.*]] = getelementptr inbounds [[S4]], [[S4]]* [[ST_S4_ST_ADDR]], i{{.*}} 0, i{{.*}} 0
David Blaikiea953f282015-02-27 21:19:58 +0000545 // CHECK-NEXT: [[ST_S4_ST_A:%.*]] = load [[INT]], [[INT]]* [[ST_S4_ST_A_ADDR]]
546 // CHECK-NEXT: [[RES:%.*]] = load [[INT]], [[INT]]* [[RES_ADDR]]
Alexey Bataev97720002014-11-11 04:05:39 +0000547 // CHECK-NEXT: [[ADD:%.*]] = add {{.*}} [[INT]] [[RES]], [[ST_S4_ST_A]]
548 // CHECK-NEXT: store [[INT]] [[ADD]], [[INT]]* [[RES:.+]]
David Blaikie218b7832015-02-27 19:18:17 +0000549 // CHECK-DEBUG: [[KMPC_LOC_ADDR_PSOURCE:%.*]] = getelementptr inbounds [[IDENT]], [[IDENT]]* [[KMPC_LOC_ADDR]], i{{.*}} 0, i{{.*}} 4
David Blaikiebdf40a62015-03-13 18:21:46 +0000550 // CHECK-DEBUG-NEXT: store i8* getelementptr inbounds ([{{.*}} x i8], [{{.*}} x i8]* [[LOC12]], i{{.*}} 0, i{{.*}} 0), i8** [[KMPC_LOC_ADDR_PSOURCE]]
Alexey Bataev97720002014-11-11 04:05:39 +0000551 // CHECK-DEBUG-NEXT: [[ST_S4_ST_TEMP_ADDR:%.*]] = call {{.*}}i8* @__kmpc_threadprivate_cached([[IDENT]]* [[KMPC_LOC_ADDR]], i32 [[THREAD_NUM]], i8* bitcast ([[S4]]* [[ST_S4_ST]] to i8*), i{{.*}} {{[0-9]+}}, i8***
552 // CHECK-DEBUG-NEXT: [[ST_S4_ST_ADDR:%.*]] = bitcast i8* [[ST_S4_ST_TEMP_ADDR]] to [[S4]]*
David Blaikie218b7832015-02-27 19:18:17 +0000553 // CHECK-DEBUG-NEXT: [[ST_S4_ST_A_ADDR:%.*]] = getelementptr inbounds [[S4]], [[S4]]* [[ST_S4_ST_ADDR]], i{{.*}} 0, i{{.*}} 0
David Blaikiea953f282015-02-27 21:19:58 +0000554 // CHECK-DEBUG-NEXT: [[ST_S4_ST_A:%.*]] = load [[INT]], [[INT]]* [[ST_S4_ST_A_ADDR]]
555 // CHECK-DEBUG-NEXT: [[RES:%.*]] = load [[INT]], [[INT]]* [[RES_ADDR]]
Alexey Bataev97720002014-11-11 04:05:39 +0000556 // CHECK-DEBUG-NEXT: [[ADD:%.*]] = add {{.*}} [[INT]] [[RES]], [[ST_S4_ST_A]]
557 // CHECK-DEBUG-NEXT: store [[INT]] [[ADD]], [[INT]]* [[RES:.+]]
Samuel Antaof8b50122015-07-13 22:54:53 +0000558 // CHECK-TLS: [[ST_S4_ST_ADDR:%.*]] = call [[S4]]* [[ST_S4_ST_TLS_INITD:[^,]+]]
559 // CHECK-TLS-NEXT: [[ST_S4_ST_A_ADDR:%.*]] = getelementptr inbounds [[S4]], [[S4]]* [[ST_S4_ST_ADDR]], i{{.*}} 0, i{{.*}} 0
560 // CHECK-TLS-NEXT: [[ST_S4_ST_A:%.*]] = load i32, i32* [[ST_S4_ST_A_ADDR]]
561 // CHECK-TLS-NEXT: [[RES:%.*]] = load i32, i32* [[RES_ADDR]]
562 // CHECK-TLS-NEXT: [[ADD:%.*]] = add {{.*}} i32 [[RES]], [[ST_S4_ST_A]]
563 // CHECK-TLS-NEXT: store i32 [[ADD]], i32* [[RES_ADDR]]
Alexey Bataev97720002014-11-11 04:05:39 +0000564 Res += ST<S4>::st.a;
David Blaikiea953f282015-02-27 21:19:58 +0000565 // CHECK: [[RES:%.*]] = load [[INT]], [[INT]]* [[RES_ADDR]]
Alexey Bataev97720002014-11-11 04:05:39 +0000566 // CHECK-NEXT: ret [[INT]] [[RES]]
David Blaikiea953f282015-02-27 21:19:58 +0000567 // CHECK-DEBUG: [[RES:%.*]] = load [[INT]], [[INT]]* [[RES_ADDR]]
Alexey Bataev97720002014-11-11 04:05:39 +0000568 // CHECK-DEBUG-NEXT: ret [[INT]] [[RES]]
Samuel Antaof8b50122015-07-13 22:54:53 +0000569 // CHECK-TLS: [[RES:%.*]] = load i32, i32* [[RES_ADDR]]
570 // CHECK-TLS-NEXT: ret i32 [[RES]]
Alexey Bataev97720002014-11-11 04:05:39 +0000571 return Res;
572}
573// CHECK: }
574
575// CHECK: define internal {{.*}}i8* [[SM_CTOR]](i8*)
576// CHECK: [[THREAD_NUM:%.+]] = call {{.*}}i32 @__kmpc_global_thread_num([[IDENT]]* [[DEFAULT_LOC]])
577// CHECK: store i8* %0, i8** [[ARG_ADDR:%.*]],
David Blaikiea953f282015-02-27 21:19:58 +0000578// CHECK: [[ARG:%.+]] = load i8*, i8** [[ARG_ADDR]]
Alexey Bataev97720002014-11-11 04:05:39 +0000579// CHECK: [[RES:%.*]] = bitcast i8* [[ARG]] to [[SMAIN]]*
580// CHECK: [[GS1_TEMP_ADDR:%.*]] = call {{.*}}i8* @__kmpc_threadprivate_cached([[IDENT]]* [[DEFAULT_LOC]], i32 [[THREAD_NUM]], i8* bitcast ([[S1]]* [[GS1]] to i8*), i{{.*}} {{[0-9]+}}, i8*** [[GS1]].cache.)
581// CHECK-NEXT: [[GS1_ADDR:%.*]] = bitcast i8* [[GS1_TEMP_ADDR]] to [[S1]]*
David Blaikie218b7832015-02-27 19:18:17 +0000582// CHECK-NEXT: [[GS1_A_ADDR:%.*]] = getelementptr inbounds [[S1]], [[S1]]* [[GS1_ADDR]], i{{.*}} 0, i{{.*}} 0
David Blaikiea953f282015-02-27 21:19:58 +0000583// CHECK-NEXT: [[GS1_A:%.*]] = load [[INT]], [[INT]]* [[GS1_A_ADDR]]
Alexey Bataev97720002014-11-11 04:05:39 +0000584// CHECK-NEXT: call {{.*}} [[SMAIN_CTOR:@.+]]([[SMAIN]]* [[RES]], [[INT]] {{.*}}[[GS1_A]])
David Blaikiea953f282015-02-27 21:19:58 +0000585// CHECK: [[ARG:%.+]] = load i8*, i8** [[ARG_ADDR]]
Alexey Bataev97720002014-11-11 04:05:39 +0000586// CHECK-NEXT: ret i8* [[ARG]]
587// CHECK-NEXT: }
588// CHECK: define {{.*}} [[SMAIN_CTOR]]([[SMAIN]]* {{.*}},
589// CHECK: define internal {{.*}}void [[SM_DTOR]](i8*)
590// CHECK: store i8* %0, i8** [[ARG_ADDR:%.*]],
David Blaikiea953f282015-02-27 21:19:58 +0000591// CHECK: [[ARG:%.+]] = load i8*, i8** [[ARG_ADDR]]
Alexey Bataev97720002014-11-11 04:05:39 +0000592// CHECK: [[RES:%.*]] = bitcast i8* [[ARG]] to [[SMAIN]]*
593// CHECK-NEXT: call {{.*}} [[SMAIN_DTOR:@.+]]([[SMAIN]]* [[RES]])
594// CHECK-NEXT: ret void
595// CHECK-NEXT: }
596// CHECK: define {{.*}} [[SMAIN_DTOR]]([[SMAIN]]* {{.*}})
597// CHECK-DEBUG: define internal {{.*}}i8* [[SM_CTOR]](i8*)
598// CHECK-DEBUG: [[KMPC_LOC_ADDR:%.*]] = alloca [[IDENT]]
David Blaikie218b7832015-02-27 19:18:17 +0000599// CHECK-DEBUG: [[KMPC_LOC_ADDR_PSOURCE:%.*]] = getelementptr inbounds [[IDENT]], [[IDENT]]* [[KMPC_LOC_ADDR]], i{{.*}} 0, i{{.*}} 4
David Blaikiebdf40a62015-03-13 18:21:46 +0000600// CHECK-DEBUG-NEXT: store i8* getelementptr inbounds ([{{.*}} x i8], [{{.*}} x i8]* [[LOC3]], i{{.*}} 0, i{{.*}} 0), i8** [[KMPC_LOC_ADDR_PSOURCE]]
Alexey Bataev97720002014-11-11 04:05:39 +0000601// CHECK-DEBUG-NEXT: [[THREAD_NUM:%.+]] = call {{.*}}i32 @__kmpc_global_thread_num([[IDENT]]* [[KMPC_LOC_ADDR]])
602// CHECK-DEBUG: store i8* %0, i8** [[ARG_ADDR:%.*]],
David Blaikiea953f282015-02-27 21:19:58 +0000603// CHECK-DEBUG: [[ARG:%.+]] = load i8*, i8** [[ARG_ADDR]]
Alexey Bataev97720002014-11-11 04:05:39 +0000604// CHECK-DEBUG: [[RES:%.*]] = bitcast i8* [[ARG]] to [[SMAIN]]*
David Blaikie218b7832015-02-27 19:18:17 +0000605// CHECK-DEBUG: [[KMPC_LOC_ADDR_PSOURCE:%.*]] = getelementptr inbounds [[IDENT]], [[IDENT]]* [[KMPC_LOC_ADDR]], i{{.*}} 0, i{{.*}} 4
David Blaikiebdf40a62015-03-13 18:21:46 +0000606// CHECK-DEBUG-NEXT: store i8* getelementptr inbounds ([{{.*}} x i8], [{{.*}} x i8]* [[LOC3]], i{{.*}} 0, i{{.*}} 0), i8** [[KMPC_LOC_ADDR_PSOURCE]]
Alexey Bataev97720002014-11-11 04:05:39 +0000607// CHECK-DEBUG: [[GS1_TEMP_ADDR:%.*]] = call {{.*}}i8* @__kmpc_threadprivate_cached([[IDENT]]* [[KMPC_LOC_ADDR]], i32 [[THREAD_NUM]], i8* bitcast ([[S1]]* [[GS1]] to i8*), i{{.*}} {{[0-9]+}}, i8***
608// CHECK-DEBUG-NEXT: [[GS1_ADDR:%.*]] = bitcast i8* [[GS1_TEMP_ADDR]] to [[S1]]*
David Blaikie218b7832015-02-27 19:18:17 +0000609// CHECK-DEBUG-NEXT: [[GS1_A_ADDR:%.*]] = getelementptr inbounds [[S1]], [[S1]]* [[GS1_ADDR]], i{{.*}} 0, i{{.*}} 0
David Blaikiea953f282015-02-27 21:19:58 +0000610// CHECK-DEBUG-NEXT: [[GS1_A:%.*]] = load [[INT]], [[INT]]* [[GS1_A_ADDR]]
Alexey Bataev97720002014-11-11 04:05:39 +0000611// CHECK-DEBUG-NEXT: call {{.*}} [[SMAIN_CTOR:@.+]]([[SMAIN]]* [[RES]], [[INT]] {{.*}}[[GS1_A]])
David Blaikiea953f282015-02-27 21:19:58 +0000612// CHECK-DEBUG: [[ARG:%.+]] = load i8*, i8** [[ARG_ADDR]]
Alexey Bataev97720002014-11-11 04:05:39 +0000613// CHECK-DEBUG-NEXT: ret i8* [[ARG]]
614// CHECK-DEBUG-NEXT: }
615// CHECK-DEBUG: define {{.*}} [[SMAIN_CTOR]]([[SMAIN]]* {{.*}},
616// CHECK-DEBUG: define internal {{.*}} [[SM_DTOR:@.+]](i8*)
617// CHECK-DEBUG: call {{.*}} [[SMAIN_DTOR:@.+]]([[SMAIN]]*
618// CHECK-DEBUG: }
619// CHECK-DEBUG: define {{.*}} [[SMAIN_DTOR]]([[SMAIN]]* {{.*}})
Samuel Antaof8b50122015-07-13 22:54:53 +0000620// CHECK-TLS: define internal [[S1]]* [[GS1_TLS_INITD]] {
621// CHECK-TLS-NEXT: call void [[GS1_TLS_INIT]]
622// CHECK-TLS-NEXT: ret [[S1]]* [[GS1]]
623// CHECK-TLS-NEXT: }
624// CHECK-TLS: define internal void [[SM_CTOR1]]([[SMAIN]]* %this, i32 {{.*}}) {{.*}} {
625// CHECK-TLS: void [[SM_CTOR2:@.*]]([[SMAIN]]* {{.*}}, i32 {{.*}})
626// CHECK-TLS: }
627// CHECK-TLS: define internal void [[SM_DTOR1]]([[SMAIN]]* %this) {{.*}} {
628// CHECK-TLS: void [[SM_DTOR2:@.*]]([[SMAIN]]* {{.*}})
629// CHECK-TLS: }
630// CHECK-TLS: define {{.*}} [[S3]]* [[STATIC_S_TLS_INITD]]
631// CHECK-TLS: call void [[STATIC_S_TLS_INIT:[^,]+]]
632// CHECK-TLS: ret [[S3]]* [[STATIC_S]]
633// CHECK-TLS: }
634// CHECK-TLS: define {{.*}} [[S5]]* [[GS3_TLS_INITD]]
635// CHECK-TLS: call void [[GS3_TLS_INIT:@[^,]+]]
636// CHECK-TLS: ret [[S5]]* [[GS3]]
637// CHECK-TLS: }
638// CHECK-TLS: define {{.*}} [2 x [3 x [[S1]]]]* [[ARR_X_TLS_INITD]]
639// CHECK-TLS: call void [[ARR_X_TLS_INIT]]
640// CHECK-TLS: ret [2 x [3 x [[S1]]]]* [[ARR_X]]
641// CHECK-TLS: }
642// CHECK-TLS: define {{.*}} i32* [[ST_INT_ST_TLS_INITD]] {
643// CHECK-TLS: call void [[ST_INT_ST_TLS_INIT]]
644// CHECK-TLS: ret i32* [[ST_INT_ST]]
645// CHECK-TLS: }
646// CHECK-TLS: define {{.*}} float* [[ST_FLOAT_ST_TLS_INITD]] {
647// CHECK-TLS: call void [[ST_FLOAT_ST_TLS_INIT]]
648// CHECK-TLS: ret float* [[ST_FLOAT_ST]]
649// CHECK-TLS: }
650// CHECK-TLS: define {{.*}} [[S4]]* [[ST_S4_ST_TLS_INITD]] {
651// CHECK-TLS: call void [[ST_S4_ST_TLS_INIT]]
652// CHECK-TLS: ret [[S4]]* [[ST_S4_ST]]
653// CHECK-TLS: }
Alexey Bataev97720002014-11-11 04:05:39 +0000654
655#endif
656
657#ifdef BODY
658// CHECK-LABEL: @{{.*}}foobar{{.*}}()
659// CHECK-DEBUG-LABEL: @{{.*}}foobar{{.*}}()
Samuel Antaof8b50122015-07-13 22:54:53 +0000660// CHECK-TLS: @{{.*}}foobar{{.*}}()
Alexey Bataev97720002014-11-11 04:05:39 +0000661int foobar() {
662 // CHECK-DEBUG: [[KMPC_LOC_ADDR:%.*]] = alloca [[IDENT]]
663 int Res;
664 // CHECK: [[THREAD_NUM:%.+]] = call {{.*}}i32 @__kmpc_global_thread_num([[IDENT]]* [[DEFAULT_LOC]])
665 // CHECK: [[STATIC_S_TEMP_ADDR:%.*]] = call {{.*}}i8* @__kmpc_threadprivate_cached([[IDENT]]* [[DEFAULT_LOC]], i32 [[THREAD_NUM]], i8* bitcast ([[S3]]* [[STATIC_S]] to i8*), i{{.*}} {{[0-9]+}}, i8*** [[STATIC_S]].cache.)
666 // CHECK-NEXT: [[STATIC_S_ADDR:%.*]] = bitcast i8* [[STATIC_S_TEMP_ADDR]] to [[S3]]*
David Blaikie218b7832015-02-27 19:18:17 +0000667 // CHECK-NEXT: [[STATIC_S_A_ADDR:%.*]] = getelementptr inbounds [[S3]], [[S3]]* [[STATIC_S_ADDR]], i{{.*}} 0, i{{.*}} 0
David Blaikiea953f282015-02-27 21:19:58 +0000668 // CHECK-NEXT: [[STATIC_S_A:%.*]] = load [[INT]], [[INT]]* [[STATIC_S_A_ADDR]]
Alexey Bataev97720002014-11-11 04:05:39 +0000669 // CHECK-NEXT: store [[INT]] [[STATIC_S_A]], [[INT]]* [[RES_ADDR:[^,]+]]
David Blaikie218b7832015-02-27 19:18:17 +0000670 // CHECK-DEBUG: [[KMPC_LOC_ADDR_PSOURCE:%.*]] = getelementptr inbounds [[IDENT]], [[IDENT]]* [[KMPC_LOC_ADDR]], i{{.*}} 0, i{{.*}} 4
David Blaikiebdf40a62015-03-13 18:21:46 +0000671 // CHECK-DEBUG-NEXT: store i8* getelementptr inbounds ([{{.*}} x i8], [{{.*}} x i8]* [[LOC13]], i{{.*}} 0, i{{.*}} 0), i8** [[KMPC_LOC_ADDR_PSOURCE]]
Alexey Bataev97720002014-11-11 04:05:39 +0000672 // CHECK-DEBUG-NEXT: [[THREAD_NUM:%.+]] = call {{.*}}i32 @__kmpc_global_thread_num([[IDENT]]* [[KMPC_LOC_ADDR]])
David Blaikie218b7832015-02-27 19:18:17 +0000673 // CHECK-DEBUG: [[KMPC_LOC_ADDR_PSOURCE:%.*]] = getelementptr inbounds [[IDENT]], [[IDENT]]* [[KMPC_LOC_ADDR]], i{{.*}} 0, i{{.*}} 4
David Blaikiebdf40a62015-03-13 18:21:46 +0000674 // CHECK-DEBUG-NEXT: store i8* getelementptr inbounds ([{{.*}} x i8], [{{.*}} x i8]* [[LOC13]], i{{.*}} 0, i{{.*}} 0), i8** [[KMPC_LOC_ADDR_PSOURCE]]
Alexey Bataev97720002014-11-11 04:05:39 +0000675 // CHECK-DEBUG-NEXT: [[STATIC_S_TEMP_ADDR:%.*]] = call {{.*}}i8* @__kmpc_threadprivate_cached([[IDENT]]* [[KMPC_LOC_ADDR]], i32 [[THREAD_NUM]], i8* bitcast ([[S3]]* [[STATIC_S]] to i8*), i{{.*}} {{[0-9]+}}, i8***
676 // CHECK-DEBUG-NEXT: [[STATIC_S_ADDR:%.*]] = bitcast i8* [[STATIC_S_TEMP_ADDR]] to [[S3]]*
David Blaikie218b7832015-02-27 19:18:17 +0000677 // CHECK-DEBUG-NEXT: [[STATIC_S_A_ADDR:%.*]] = getelementptr inbounds [[S3]], [[S3]]* [[STATIC_S_ADDR]], i{{.*}} 0, i{{.*}} 0
David Blaikiea953f282015-02-27 21:19:58 +0000678 // CHECK-DEBUG-NEXT: [[STATIC_S_A:%.*]] = load [[INT]], [[INT]]* [[STATIC_S_A_ADDR]]
Alexey Bataev97720002014-11-11 04:05:39 +0000679 // CHECK-DEBUG-NEXT: store [[INT]] [[STATIC_S_A]], [[INT]]* [[RES_ADDR:[^,]+]]
Samuel Antaof8b50122015-07-13 22:54:53 +0000680 // CHECK-TLS: [[STATIC_S_ADDR:%.*]] = call [[S3]]* [[STATIC_S_TLS_INITD]]
681 // CHECK-TLS-NEXT: [[STATIC_S_A_ADDR:%.*]] = getelementptr inbounds [[S3]], [[S3]]* [[STATIC_S_ADDR]], i{{.*}} 0, i{{.*}} 0
682 // CHECK-TLS-NEXT: [[STATIC_S_A:%.*]] = load i32, i32* [[STATIC_S_A_ADDR]]
683 // CHECK-TLS-NEXT: store i32 [[STATIC_S_A]], i32* [[RES_ADDR:[^,]+]]
Alexey Bataev97720002014-11-11 04:05:39 +0000684 Res = Static::s.a;
685 // CHECK: [[GS1_TEMP_ADDR:%.*]] = call {{.*}}i8* @__kmpc_threadprivate_cached([[IDENT]]* [[DEFAULT_LOC]], i32 [[THREAD_NUM]], i8* bitcast ([[S1]]* [[GS1]] to i8*), i{{.*}} {{[0-9]+}}, i8*** [[GS1]].cache.)
686 // CHECK-NEXT: [[GS1_ADDR:%.*]] = bitcast i8* [[GS1_TEMP_ADDR]] to [[S1]]*
David Blaikie218b7832015-02-27 19:18:17 +0000687 // CHECK-NEXT: [[GS1_A_ADDR:%.*]] = getelementptr inbounds [[S1]], [[S1]]* [[GS1_ADDR]], i{{.*}} 0, i{{.*}} 0
David Blaikiea953f282015-02-27 21:19:58 +0000688 // CHECK-NEXT: [[GS1_A:%.*]] = load [[INT]], [[INT]]* [[GS1_A_ADDR]]
689 // CHECK-NEXT: [[RES:%.*]] = load [[INT]], [[INT]]* [[RES_ADDR]]
Alexey Bataev97720002014-11-11 04:05:39 +0000690 // CHECK-NEXT: [[ADD:%.*]] = add {{.*}} [[INT]] [[RES]], [[GS1_A]]
691 // CHECK-NEXT: store [[INT]] [[ADD]], [[INT]]* [[RES:.+]]
David Blaikie218b7832015-02-27 19:18:17 +0000692 // CHECK-DEBUG: [[KMPC_LOC_ADDR_PSOURCE:%.*]] = getelementptr inbounds [[IDENT]], [[IDENT]]* [[KMPC_LOC_ADDR]], i{{.*}} 0, i{{.*}} 4
David Blaikiebdf40a62015-03-13 18:21:46 +0000693 // CHECK-DEBUG-NEXT: store i8* getelementptr inbounds ([{{.*}} x i8], [{{.*}} x i8]* [[LOC14]], i{{.*}} 0, i{{.*}} 0), i8** [[KMPC_LOC_ADDR_PSOURCE]]
Alexey Bataev97720002014-11-11 04:05:39 +0000694 // CHECK-DEBUG-NEXT: [[GS1_TEMP_ADDR:%.*]] = call {{.*}}i8* @__kmpc_threadprivate_cached([[IDENT]]* [[KMPC_LOC_ADDR]], i32 [[THREAD_NUM]], i8* bitcast ([[S1]]* [[GS1]] to i8*), i{{.*}} {{[0-9]+}}, i8***
695 // CHECK-DEBUG-NEXT: [[GS1_ADDR:%.*]] = bitcast i8* [[GS1_TEMP_ADDR]] to [[S1]]*
David Blaikie218b7832015-02-27 19:18:17 +0000696 // CHECK-DEBUG-NEXT: [[GS1_A_ADDR:%.*]] = getelementptr inbounds [[S1]], [[S1]]* [[GS1_ADDR]], i{{.*}} 0, i{{.*}} 0
David Blaikiea953f282015-02-27 21:19:58 +0000697 // CHECK-DEBUG-NEXT: [[GS1_A:%.*]] = load [[INT]], [[INT]]* [[GS1_A_ADDR]]
698 // CHECK-DEBUG-NEXT: [[RES:%.*]] = load [[INT]], [[INT]]* [[RES_ADDR]]
Alexey Bataev97720002014-11-11 04:05:39 +0000699 // CHECK-DEBUG-NEXT: [[ADD:%.*]] = add {{.*}} [[INT]] [[RES]], [[GS1_A]]
700 // CHECK-DEBUG-NEXT: store [[INT]] [[ADD]], [[INT]]* [[RES:.+]]
Samuel Antaof8b50122015-07-13 22:54:53 +0000701 // CHECK-TLS: [[GS1_ADDR:%.*]] = call [[S1]]* [[GS1_TLS_INITD]]
702 // CHECK-TLS-NEXT: [[GS1_A_ADDR:%.*]] = getelementptr inbounds [[S1]], [[S1]]* [[GS1_ADDR]], i{{.*}} 0, i{{.*}} 0
703 // CHECK-TLS-NEXT: [[GS1_A:%.*]] = load i32, i32* [[GS1_A_ADDR]]
704 // CHECK-TLS-NEXT: [[RES:%.*]] = load i32, i32* [[RES_ADDR]]
705 // CHECK-TLS-NEXT: [[ADD:%.*]] = add {{.*}} i32 [[RES]], [[GS1_A]]
706 // CHECK-TLS-NEXT: store i32 [[ADD]], i32* [[RES_ADDR]]
Alexey Bataev97720002014-11-11 04:05:39 +0000707 Res += gs1.a;
David Blaikiebdf40a62015-03-13 18:21:46 +0000708 // CHECK: [[GS2_A:%.*]] = load [[INT]], [[INT]]* getelementptr inbounds ([[S2]], [[S2]]* [[GS2]], i{{.*}} 0, i{{.*}} 0)
David Blaikiea953f282015-02-27 21:19:58 +0000709 // CHECK-NEXT: [[RES:%.*]] = load [[INT]], [[INT]]* [[RES_ADDR]]
Alexey Bataev97720002014-11-11 04:05:39 +0000710 // CHECK-NEXT: [[ADD:%.*]] = add {{.*}} [[INT]] [[RES]], [[GS2_A]]
711 // CHECK-NEXT: store [[INT]] [[ADD]], [[INT]]* [[RES:.+]]
David Blaikiebdf40a62015-03-13 18:21:46 +0000712 // CHECK-DEBUG: [[GS2_A:%.*]] = load [[INT]], [[INT]]* getelementptr inbounds ([[S2]], [[S2]]* [[GS2]], i{{.*}} 0, i{{.*}} 0)
David Blaikiea953f282015-02-27 21:19:58 +0000713 // CHECK-DEBUG-NEXT: [[RES:%.*]] = load [[INT]], [[INT]]* [[RES_ADDR]]
Alexey Bataev97720002014-11-11 04:05:39 +0000714 // CHECK-DEBUG-NEXT: [[ADD:%.*]] = add {{.*}} [[INT]] [[RES]], [[GS2_A]]
715 // CHECK-DEBUG-NEXT: store [[INT]] [[ADD]], [[INT]]* [[RES:.+]]
Samuel Antaof8b50122015-07-13 22:54:53 +0000716 // CHECK-TLS: [[GS2_A:%.*]] = load i32, i32* getelementptr inbounds ([[S2]], [[S2]]* [[GS2]], i{{.*}} 0, i{{.*}} 0)
717 // CHECK-TLS-NEXT: [[RES:%.*]] = load i32, i32* [[RES_ADDR]]
718 // CHECK-TLS-NEXT: [[ADD:%.*]] = add {{.*}} i32 [[RES]], [[GS2_A]]
719 // CHECK-TLS-NEXT: store i32 [[ADD]], i32* [[RES:.+]]
Alexey Bataev97720002014-11-11 04:05:39 +0000720 Res += gs2.a;
721 // CHECK: [[GS3_TEMP_ADDR:%.*]] = call {{.*}}i8* @__kmpc_threadprivate_cached([[IDENT]]* [[DEFAULT_LOC]], i32 [[THREAD_NUM]], i8* bitcast ([[S5]]* [[GS3]] to i8*), i{{.*}} {{[0-9]+}}, i8*** [[GS3]].cache.)
722 // CHECK-NEXT: [[GS3_ADDR:%.*]] = bitcast i8* [[GS3_TEMP_ADDR]] to [[S5]]*
David Blaikie218b7832015-02-27 19:18:17 +0000723 // CHECK-NEXT: [[GS3_A_ADDR:%.*]] = getelementptr inbounds [[S5]], [[S5]]* [[GS3_ADDR]], i{{.*}} 0, i{{.*}} 0
David Blaikiea953f282015-02-27 21:19:58 +0000724 // CHECK-NEXT: [[GS3_A:%.*]] = load [[INT]], [[INT]]* [[GS3_A_ADDR]]
725 // CHECK-NEXT: [[RES:%.*]] = load [[INT]], [[INT]]* [[RES_ADDR]]
Alexey Bataev97720002014-11-11 04:05:39 +0000726 // CHECK-NEXT: [[ADD:%.*]] = add {{.*}} [[INT]] [[RES]], [[GS3_A]]
727 // CHECK-NEXT: store [[INT]] [[ADD]], [[INT]]* [[RES:.+]]
David Blaikie218b7832015-02-27 19:18:17 +0000728 // CHECK-DEBUG: [[KMPC_LOC_ADDR_PSOURCE:%.*]] = getelementptr inbounds [[IDENT]], [[IDENT]]* [[KMPC_LOC_ADDR]], i{{.*}} 0, i{{.*}} 4
David Blaikiebdf40a62015-03-13 18:21:46 +0000729 // CHECK-DEBUG-NEXT: store i8* getelementptr inbounds ([{{.*}} x i8], [{{.*}} x i8]* [[LOC15]], i{{.*}} 0, i{{.*}} 0), i8** [[KMPC_LOC_ADDR_PSOURCE]]
Alexey Bataev97720002014-11-11 04:05:39 +0000730 // CHECK-DEBUG-NEXT: [[GS3_TEMP_ADDR:%.*]] = call {{.*}}i8* @__kmpc_threadprivate_cached([[IDENT]]* [[KMPC_LOC_ADDR]], i32 [[THREAD_NUM]], i8* bitcast ([[S5]]* [[GS3]] to i8*), i{{.*}} {{[0-9]+}}, i8***
731 // CHECK-DEBUG-NEXT: [[GS3_ADDR:%.*]] = bitcast i8* [[GS3_TEMP_ADDR]] to [[S5]]*
David Blaikie218b7832015-02-27 19:18:17 +0000732 // CHECK-DEBUG-NEXT: [[GS3_A_ADDR:%.*]] = getelementptr inbounds [[S5]], [[S5]]* [[GS3_ADDR]], i{{.*}} 0, i{{.*}} 0
David Blaikiea953f282015-02-27 21:19:58 +0000733 // CHECK-DEBUG-NEXT: [[GS3_A:%.*]] = load [[INT]], [[INT]]* [[GS3_A_ADDR]]
734 // CHECK-DEBUG-NEXT: [[RES:%.*]] = load [[INT]], [[INT]]* [[RES_ADDR]]
Alexey Bataev97720002014-11-11 04:05:39 +0000735 // CHECK-DEBUG-NEXT: [[ADD:%.*]] = add {{.*}} [[INT]] [[RES]], [[GS3_A]]
736 // CHECK-DEBUG-NEXT: store [[INT]] [[ADD]], [[INT]]* [[RES:.+]]
Samuel Antaof8b50122015-07-13 22:54:53 +0000737 // CHECK-TLS: [[GS3_ADDR:%.*]] = call [[S5]]* [[GS3_TLS_INITD]]
738 // CHECK-TLS-DEBUG: [[GS3_A_ADDR:%.*]] = getelementptr inbounds [[S5]], [[S5]]* [[GS3_ADDR]], i{{.*}} 0, i{{.*}} 0
739 // CHECK-TLS-DEBUG: [[GS3_A:%.*]] = load i32, i32* [[GS3_A_ADDR]]
740 // CHECK-TLS-DEBUG: [[RES:%.*]] = load i32, i32* [[RES_ADDR]]
741 // CHECK-TLS-DEBUG: [[ADD:%.*]]= add nsw i32 [[RES]], [[GS3_A]]
742 // CHECK-TLS-DEBUG: store i32 [[ADD]], i32* [[RES_ADDR]]
Alexey Bataev97720002014-11-11 04:05:39 +0000743 Res += gs3.a;
744 // CHECK: [[ARR_X_TEMP_ADDR:%.*]] = call {{.*}}i8* @__kmpc_threadprivate_cached([[IDENT]]* [[DEFAULT_LOC]], i32 [[THREAD_NUM]], i8* bitcast ([2 x [3 x [[S1]]]]* [[ARR_X]] to i8*), i{{.*}} {{[0-9]+}}, i8*** [[ARR_X]].cache.)
745 // CHECK-NEXT: [[ARR_X_ADDR:%.*]] = bitcast i8* [[ARR_X_TEMP_ADDR]] to [2 x [3 x [[S1]]]]*
David Blaikie218b7832015-02-27 19:18:17 +0000746 // CHECK-NEXT: [[ARR_X_1_ADDR:%.*]] = getelementptr inbounds [2 x [3 x [[S1]]]], [2 x [3 x [[S1]]]]* [[ARR_X_ADDR]], i{{.*}} 0, i{{.*}} 1
747 // CHECK-NEXT: [[ARR_X_1_1_ADDR:%.*]] = getelementptr inbounds [3 x [[S1]]], [3 x [[S1]]]* [[ARR_X_1_ADDR]], i{{.*}} 0, i{{.*}} 1
748 // CHECK-NEXT: [[ARR_X_1_1_A_ADDR:%.*]] = getelementptr inbounds [[S1]], [[S1]]* [[ARR_X_1_1_ADDR]], i{{.*}} 0, i{{.*}} 0
David Blaikiea953f282015-02-27 21:19:58 +0000749 // CHECK-NEXT: [[ARR_X_1_1_A:%.*]] = load [[INT]], [[INT]]* [[ARR_X_1_1_A_ADDR]]
750 // CHECK-NEXT: [[RES:%.*]] = load [[INT]], [[INT]]* [[RES_ADDR]]
Alexey Bataev97720002014-11-11 04:05:39 +0000751 // CHECK-NEXT: [[ADD:%.*]] = add {{.*}} [[INT]] [[RES]], [[ARR_X_1_1_A]]
752 // CHECK-NEXT: store [[INT]] [[ADD]], [[INT]]* [[RES:.+]]
David Blaikie218b7832015-02-27 19:18:17 +0000753 // CHECK-DEBUG: [[KMPC_LOC_ADDR_PSOURCE:%.*]] = getelementptr inbounds [[IDENT]], [[IDENT]]* [[KMPC_LOC_ADDR]], i{{.*}} 0, i{{.*}} 4
David Blaikiebdf40a62015-03-13 18:21:46 +0000754 // CHECK-DEBUG-NEXT: store i8* getelementptr inbounds ([{{.*}} x i8], [{{.*}} x i8]* [[LOC16]], i{{.*}} 0, i{{.*}} 0), i8** [[KMPC_LOC_ADDR_PSOURCE]]
Alexey Bataev97720002014-11-11 04:05:39 +0000755 // CHECK-DEBUG-NEXT: [[ARR_X_TEMP_ADDR:%.*]] = call {{.*}}i8* @__kmpc_threadprivate_cached([[IDENT]]* [[KMPC_LOC_ADDR]], i32 [[THREAD_NUM]], i8* bitcast ([2 x [3 x [[S1]]]]* [[ARR_X]] to i8*), i{{.*}} {{[0-9]+}}, i8***
756 // CHECK-DEBUG-NEXT: [[ARR_X_ADDR:%.*]] = bitcast i8* [[ARR_X_TEMP_ADDR]] to [2 x [3 x [[S1]]]]*
David Blaikie218b7832015-02-27 19:18:17 +0000757 // CHECK-DEBUG-NEXT: [[ARR_X_1_ADDR:%.*]] = getelementptr inbounds [2 x [3 x [[S1]]]], [2 x [3 x [[S1]]]]* [[ARR_X_ADDR]], i{{.*}} 0, i{{.*}} 1
758 // CHECK-DEBUG-NEXT: [[ARR_X_1_1_ADDR:%.*]] = getelementptr inbounds [3 x [[S1]]], [3 x [[S1]]]* [[ARR_X_1_ADDR]], i{{.*}} 0, i{{.*}} 1
759 // CHECK-DEBUG-NEXT: [[ARR_X_1_1_A_ADDR:%.*]] = getelementptr inbounds [[S1]], [[S1]]* [[ARR_X_1_1_ADDR]], i{{.*}} 0, i{{.*}} 0
David Blaikiea953f282015-02-27 21:19:58 +0000760 // CHECK-DEBUG-NEXT: [[ARR_X_1_1_A:%.*]] = load [[INT]], [[INT]]* [[ARR_X_1_1_A_ADDR]]
761 // CHECK-DEBUG-NEXT: [[RES:%.*]] = load [[INT]], [[INT]]* [[RES_ADDR]]
Alexey Bataev97720002014-11-11 04:05:39 +0000762 // CHECK-DEBUG-NEXT: [[ADD:%.*]] = add {{.*}} [[INT]] [[RES]], [[ARR_X_1_1_A]]
763 // CHECK-DEBUG-NEXT: store [[INT]] [[ADD]], [[INT]]* [[RES:.+]]
Samuel Antaof8b50122015-07-13 22:54:53 +0000764 // CHECK-TLS: [[ARR_X_ADDR:%.*]] = call [2 x [3 x [[S1]]]]* [[ARR_X_TLS_INITD]]
765 // CHECK-TLS-NEXT: [[ARR_X_1_ADDR:%.*]] = getelementptr inbounds [2 x [3 x [[S1]]]], [2 x [3 x [[S1]]]]* [[ARR_X_ADDR]], i{{.*}} 0, i{{.*}} 1
766 // CHECK-TLS-NEXT: [[ARR_X_1_1_ADDR:%.*]] = getelementptr inbounds [3 x [[S1]]], [3 x [[S1]]]* [[ARR_X_1_ADDR]], i{{.*}} 0, i{{.*}} 1
767 // CHECK-TLS-NEXT: [[ARR_X_1_1_A_ADDR:%.*]] = getelementptr inbounds [[S1]], [[S1]]* [[ARR_X_1_1_ADDR]], i{{.*}} 0, i{{.*}} 0
768 // CHECK-TLS-NEXT: [[ARR_X_1_1_A:%.*]] = load [[INT]], [[INT]]* [[ARR_X_1_1_A_ADDR]]
769 // CHECK-TLS-NEXT: [[RES:%.*]] = load [[INT]], [[INT]]* [[RES_ADDR]]
770 // CHECK-TLS-NEXT: [[ADD:%.*]] = add {{.*}} [[INT]] [[RES]], [[ARR_X_1_1_A]]
771 // CHECK-TLS-NEXT: store [[INT]] [[ADD]], [[INT]]* [[RES:.+]]
Alexey Bataev97720002014-11-11 04:05:39 +0000772 Res += arr_x[1][1].a;
773 // CHECK: [[ST_INT_ST_TEMP_ADDR:%.*]] = call {{.*}}i8* @__kmpc_threadprivate_cached([[IDENT]]* [[DEFAULT_LOC]], i32 [[THREAD_NUM]], i8* bitcast ([[INT]]* [[ST_INT_ST]] to i8*), i{{.*}} {{[0-9]+}}, i8*** [[ST_INT_ST]].cache.)
774 // CHECK-NEXT: [[ST_INT_ST_ADDR:%.*]] = bitcast i8* [[ST_INT_ST_TEMP_ADDR]] to [[INT]]*
David Blaikiea953f282015-02-27 21:19:58 +0000775 // CHECK-NEXT: [[ST_INT_ST_VAL:%.*]] = load [[INT]], [[INT]]* [[ST_INT_ST_ADDR]]
776 // CHECK-NEXT: [[RES:%.*]] = load [[INT]], [[INT]]* [[RES_ADDR]]
Alexey Bataev97720002014-11-11 04:05:39 +0000777 // CHECK-NEXT: [[ADD:%.*]] = add {{.*}} [[INT]] [[RES]], [[ST_INT_ST_VAL]]
778 // CHECK-NEXT: store [[INT]] [[ADD]], [[INT]]* [[RES:.+]]
David Blaikie218b7832015-02-27 19:18:17 +0000779 // CHECK-DEBUG: [[KMPC_LOC_ADDR_PSOURCE:%.*]] = getelementptr inbounds [[IDENT]], [[IDENT]]* [[KMPC_LOC_ADDR]], i{{.*}} 0, i{{.*}} 4
David Blaikiebdf40a62015-03-13 18:21:46 +0000780 // CHECK-DEBUG-NEXT: store i8* getelementptr inbounds ([{{.*}} x i8], [{{.*}} x i8]* [[LOC17]], i{{.*}} 0, i{{.*}} 0), i8** [[KMPC_LOC_ADDR_PSOURCE]]
Alexey Bataev97720002014-11-11 04:05:39 +0000781 // CHECK-DEBUG-NEXT: [[ST_INT_ST_TEMP_ADDR:%.*]] = call {{.*}}i8* @__kmpc_threadprivate_cached([[IDENT]]* [[KMPC_LOC_ADDR]], i32 [[THREAD_NUM]], i8* bitcast ([[INT]]* [[ST_INT_ST]] to i8*), i{{.*}} {{[0-9]+}}, i8***
782 // CHECK-DEBUG-NEXT: [[ST_INT_ST_ADDR:%.*]] = bitcast i8* [[ST_INT_ST_TEMP_ADDR]] to [[INT]]*
David Blaikiea953f282015-02-27 21:19:58 +0000783 // CHECK-DEBUG-NEXT: [[ST_INT_ST_VAL:%.*]] = load [[INT]], [[INT]]* [[ST_INT_ST_ADDR]]
784 // CHECK-DEBUG-NEXT: [[RES:%.*]] = load [[INT]], [[INT]]* [[RES_ADDR]]
Alexey Bataev97720002014-11-11 04:05:39 +0000785 // CHECK-DEBUG-NEXT: [[ADD:%.*]] = add {{.*}} [[INT]] [[RES]], [[ST_INT_ST_VAL]]
786 // CHECK-DEBUG-NEXT: store [[INT]] [[ADD]], [[INT]]* [[RES:.+]]
Samuel Antaof8b50122015-07-13 22:54:53 +0000787 // CHECK-TLS: [[ST_INT_ST_ADDR:%.*]] = call i32* [[ST_INT_ST_TLS_INITD]]
788 // CHECK-TLS-NEXT: [[ST_INT_ST_VAL:%.*]] = load [[INT]], [[INT]]* [[ST_INT_ST_ADDR]]
789 // CHECK-TLS-NEXT: [[RES:%.*]] = load [[INT]], [[INT]]* [[RES_ADDR]]
790 // CHECK-TLS-NEXT: [[ADD:%.*]] = add {{.*}} [[INT]] [[RES]], [[ST_INT_ST_VAL]]
791 // CHECK-TLS-NEXT: store [[INT]] [[ADD]], [[INT]]* [[RES:.+]]
Alexey Bataev97720002014-11-11 04:05:39 +0000792 Res += ST<int>::st;
793 // CHECK: [[ST_FLOAT_ST_TEMP_ADDR:%.*]] = call {{.*}}i8* @__kmpc_threadprivate_cached([[IDENT]]* [[DEFAULT_LOC]], i32 [[THREAD_NUM]], i8* bitcast (float* [[ST_FLOAT_ST]] to i8*), i{{.*}} {{[0-9]+}}, i8*** [[ST_FLOAT_ST]].cache.)
794 // CHECK-NEXT: [[ST_FLOAT_ST_ADDR:%.*]] = bitcast i8* [[ST_FLOAT_ST_TEMP_ADDR]] to float*
David Blaikiea953f282015-02-27 21:19:58 +0000795 // CHECK-NEXT: [[ST_FLOAT_ST_VAL:%.*]] = load float, float* [[ST_FLOAT_ST_ADDR]]
Alexey Bataev97720002014-11-11 04:05:39 +0000796 // CHECK-NEXT: [[FLOAT_TO_INT_CONV:%.*]] = fptosi float [[ST_FLOAT_ST_VAL]] to [[INT]]
David Blaikiea953f282015-02-27 21:19:58 +0000797 // CHECK-NEXT: [[RES:%.*]] = load [[INT]], [[INT]]* [[RES_ADDR]]
Alexey Bataev97720002014-11-11 04:05:39 +0000798 // CHECK-NEXT: [[ADD:%.*]] = add {{.*}} [[INT]] [[RES]], [[FLOAT_TO_INT_CONV]]
799 // CHECK-NEXT: store [[INT]] [[ADD]], [[INT]]* [[RES:.+]]
David Blaikie218b7832015-02-27 19:18:17 +0000800 // CHECK-DEBUG: [[KMPC_LOC_ADDR_PSOURCE:%.*]] = getelementptr inbounds [[IDENT]], [[IDENT]]* [[KMPC_LOC_ADDR]], i{{.*}} 0, i{{.*}} 4
David Blaikiebdf40a62015-03-13 18:21:46 +0000801 // CHECK-DEBUG-NEXT: store i8* getelementptr inbounds ([{{.*}} x i8], [{{.*}} x i8]* [[LOC18]], i{{.*}} 0, i{{.*}} 0), i8** [[KMPC_LOC_ADDR_PSOURCE]]
Alexey Bataev97720002014-11-11 04:05:39 +0000802 // CHECK-DEBUG-NEXT: [[ST_FLOAT_ST_TEMP_ADDR:%.*]] = call {{.*}}i8* @__kmpc_threadprivate_cached([[IDENT]]* [[KMPC_LOC_ADDR]], i32 [[THREAD_NUM]], i8* bitcast (float* [[ST_FLOAT_ST]] to i8*), i{{.*}} {{[0-9]+}}, i8***
803 // CHECK-DEBUG-NEXT: [[ST_FLOAT_ST_ADDR:%.*]] = bitcast i8* [[ST_FLOAT_ST_TEMP_ADDR]] to float*
David Blaikiea953f282015-02-27 21:19:58 +0000804 // CHECK-DEBUG-NEXT: [[ST_FLOAT_ST_VAL:%.*]] = load float, float* [[ST_FLOAT_ST_ADDR]]
Alexey Bataev97720002014-11-11 04:05:39 +0000805 // CHECK-DEBUG-NEXT: [[FLOAT_TO_INT_CONV:%.*]] = fptosi float [[ST_FLOAT_ST_VAL]] to [[INT]]
David Blaikiea953f282015-02-27 21:19:58 +0000806 // CHECK-DEBUG-NEXT: [[RES:%.*]] = load [[INT]], [[INT]]* [[RES_ADDR]]
Alexey Bataev97720002014-11-11 04:05:39 +0000807 // CHECK-DEBUG-NEXT: [[ADD:%.*]] = add {{.*}} [[INT]] [[RES]], [[FLOAT_TO_INT_CONV]]
808 // CHECK-DEBUG-NEXT: store [[INT]] [[ADD]], [[INT]]* [[RES:.+]]
Samuel Antaof8b50122015-07-13 22:54:53 +0000809 // CHECK-TLS: [[ST_FLOAT_ST_ADDR:%.*]] = call float* [[ST_FLOAT_ST_TLS_INITD]]
810 // CHECK-TLS-NEXT: [[ST_FLOAT_ST_VAL:%.*]] = load float, float* [[ST_FLOAT_ST_ADDR]]
811 // CHECK-TLS-NEXT: [[FLOAT_TO_INT_CONV:%.*]] = fptosi float [[ST_FLOAT_ST_VAL]] to [[INT]]
812 // CHECK-TLS-NEXT: [[RES:%.*]] = load [[INT]], [[INT]]* [[RES_ADDR]]
813 // CHECK-TLS-NEXT: [[ADD:%.*]] = add {{.*}} [[INT]] [[RES]], [[FLOAT_TO_INT_CONV]]
814 // CHECK-TLS-NEXT: store [[INT]] [[ADD]], [[INT]]* [[RES:.+]]
Alexey Bataev97720002014-11-11 04:05:39 +0000815 Res += static_cast<int>(ST<float>::st);
816 // CHECK: [[ST_S4_ST_TEMP_ADDR:%.*]] = call {{.*}}i8* @__kmpc_threadprivate_cached([[IDENT]]* [[DEFAULT_LOC]], i32 [[THREAD_NUM]], i8* bitcast ([[S4]]* [[ST_S4_ST]] to i8*), i{{.*}} {{[0-9]+}}, i8*** [[ST_S4_ST]].cache.)
817 // CHECK-NEXT: [[ST_S4_ST_ADDR:%.*]] = bitcast i8* [[ST_S4_ST_TEMP_ADDR]] to [[S4]]*
David Blaikie218b7832015-02-27 19:18:17 +0000818 // CHECK-NEXT: [[ST_S4_ST_A_ADDR:%.*]] = getelementptr inbounds [[S4]], [[S4]]* [[ST_S4_ST_ADDR]], i{{.*}} 0, i{{.*}} 0
David Blaikiea953f282015-02-27 21:19:58 +0000819 // CHECK-NEXT: [[ST_S4_ST_A:%.*]] = load [[INT]], [[INT]]* [[ST_S4_ST_A_ADDR]]
820 // CHECK-NEXT: [[RES:%.*]] = load [[INT]], [[INT]]* [[RES_ADDR]]
Alexey Bataev97720002014-11-11 04:05:39 +0000821 // CHECK-NEXT: [[ADD:%.*]] = add {{.*}} [[INT]] [[RES]], [[ST_S4_ST_A]]
822 // CHECK-NEXT: store [[INT]] [[ADD]], [[INT]]* [[RES:.+]]
David Blaikie218b7832015-02-27 19:18:17 +0000823 // CHECK-DEBUG: [[KMPC_LOC_ADDR_PSOURCE:%.*]] = getelementptr inbounds [[IDENT]], [[IDENT]]* [[KMPC_LOC_ADDR]], i{{.*}} 0, i{{.*}} 4
David Blaikiebdf40a62015-03-13 18:21:46 +0000824 // CHECK-DEBUG-NEXT: store i8* getelementptr inbounds ([{{.*}} x i8], [{{.*}} x i8]* [[LOC19]], i{{.*}} 0, i{{.*}} 0), i8** [[KMPC_LOC_ADDR_PSOURCE]]
Alexey Bataev97720002014-11-11 04:05:39 +0000825 // CHECK-DEBUG-NEXT: [[ST_S4_ST_TEMP_ADDR:%.*]] = call {{.*}}i8* @__kmpc_threadprivate_cached([[IDENT]]* [[KMPC_LOC_ADDR]], i32 [[THREAD_NUM]], i8* bitcast ([[S4]]* [[ST_S4_ST]] to i8*), i{{.*}} {{[0-9]+}}, i8***
826 // CHECK-DEBUG-NEXT: [[ST_S4_ST_ADDR:%.*]] = bitcast i8* [[ST_S4_ST_TEMP_ADDR]] to [[S4]]*
David Blaikie218b7832015-02-27 19:18:17 +0000827 // CHECK-DEBUG-NEXT: [[ST_S4_ST_A_ADDR:%.*]] = getelementptr inbounds [[S4]], [[S4]]* [[ST_S4_ST_ADDR]], i{{.*}} 0, i{{.*}} 0
David Blaikiea953f282015-02-27 21:19:58 +0000828 // CHECK-DEBUG-NEXT: [[ST_S4_ST_A:%.*]] = load [[INT]], [[INT]]* [[ST_S4_ST_A_ADDR]]
829 // CHECK-DEBUG-NEXT: [[RES:%.*]] = load [[INT]], [[INT]]* [[RES_ADDR]]
Alexey Bataev97720002014-11-11 04:05:39 +0000830 // CHECK-DEBUG-NEXT: [[ADD:%.*]] = add {{.*}} [[INT]] [[RES]], [[ST_S4_ST_A]]
831 // CHECK-DEBUG-NEXT: store [[INT]] [[ADD]], [[INT]]* [[RES:.+]]
Samuel Antaof8b50122015-07-13 22:54:53 +0000832 // CHECK-TLS: [[ST_S4_ST_ADDR:%.*]] = call [[S4]]* [[ST_S4_ST_TLS_INITD]]
833 // CHECK-TLS-NEXT: [[ST_S4_ST_A_ADDR:%.*]] = getelementptr inbounds [[S4]], [[S4]]* [[ST_S4_ST_ADDR]], i{{.*}} 0, i{{.*}} 0
834 // CHECK-TLS-NEXT: [[ST_S4_ST_A:%.*]] = load [[INT]], [[INT]]* [[ST_S4_ST_A_ADDR]]
835 // CHECK-TLS-NEXT: [[RES:%.*]] = load [[INT]], [[INT]]* [[RES_ADDR]]
836 // CHECK-TLS-NEXT: [[ADD:%.*]] = add {{.*}} [[INT]] [[RES]], [[ST_S4_ST_A]]
837 // CHECK-TLS-NEXT: store [[INT]] [[ADD]], [[INT]]* [[RES:.+]]
Alexey Bataev97720002014-11-11 04:05:39 +0000838 Res += ST<S4>::st.a;
David Blaikiea953f282015-02-27 21:19:58 +0000839 // CHECK: [[RES:%.*]] = load [[INT]], [[INT]]* [[RES_ADDR]]
Alexey Bataev97720002014-11-11 04:05:39 +0000840 // CHECK-NEXT: ret [[INT]] [[RES]]
David Blaikiea953f282015-02-27 21:19:58 +0000841 // CHECK-DEBUG: [[RES:%.*]] = load [[INT]], [[INT]]* [[RES_ADDR]]
Alexey Bataev97720002014-11-11 04:05:39 +0000842 // CHECK-DEBUG-NEXT: ret [[INT]] [[RES]]
Samuel Antaof8b50122015-07-13 22:54:53 +0000843 // CHECK-TLS: [[RES:%.*]] = load [[INT]], [[INT]]* [[RES_ADDR]]
844 // CHECK-TLS-NEXT: ret [[INT]] [[RES]]
Alexey Bataev97720002014-11-11 04:05:39 +0000845 return Res;
846}
847#endif
848
849// CHECK: call {{.*}}void @__kmpc_threadprivate_register([[IDENT]]* [[DEFAULT_LOC]], i8* bitcast ([[S4]]* [[ST_S4_ST]] to i8*), i8* (i8*)* [[ST_S4_ST_CTOR:@\.__kmpc_global_ctor_\..+]], i8* (i8*, i8*)* null, void (i8*)* [[ST_S4_ST_DTOR:@\.__kmpc_global_dtor_\..+]])
850// CHECK: define internal {{.*}}i8* [[ST_S4_ST_CTOR]](i8*)
851// CHECK: store i8* %0, i8** [[ARG_ADDR:%.*]],
David Blaikiea953f282015-02-27 21:19:58 +0000852// CHECK: [[ARG:%.+]] = load i8*, i8** [[ARG_ADDR]]
Alexey Bataev97720002014-11-11 04:05:39 +0000853// CHECK: [[RES:%.*]] = bitcast i8* [[ARG]] to [[S4]]*
854// CHECK-NEXT: call {{.*}} [[S4_CTOR:@.+]]([[S4]]* [[RES]], {{.*}} 23)
David Blaikiea953f282015-02-27 21:19:58 +0000855// CHECK: [[ARG:%.+]] = load i8*, i8** [[ARG_ADDR]]
Alexey Bataev97720002014-11-11 04:05:39 +0000856// CHECK-NEXT: ret i8* [[ARG]]
857// CHECK-NEXT: }
858// CHECK: define {{.*}} [[S4_CTOR]]([[S4]]* {{.*}},
859// CHECK: define internal {{.*}}void [[ST_S4_ST_DTOR]](i8*)
860// CHECK: store i8* %0, i8** [[ARG_ADDR:%.*]],
David Blaikiea953f282015-02-27 21:19:58 +0000861// CHECK: [[ARG:%.+]] = load i8*, i8** [[ARG_ADDR]]
Alexey Bataev97720002014-11-11 04:05:39 +0000862// CHECK: [[RES:%.*]] = bitcast i8* [[ARG]] to [[S4]]*
863// CHECK-NEXT: call {{.*}} [[S4_DTOR:@.+]]([[S4]]* [[RES]])
864// CHECK-NEXT: ret void
865// CHECK-NEXT: }
866// CHECK: define {{.*}} [[S4_DTOR]]([[S4]]* {{.*}})
867// CHECK-DEBUG: [[KMPC_LOC_ADDR:%.*]] = alloca [[IDENT]]
David Blaikie218b7832015-02-27 19:18:17 +0000868// CHECK-DEBUG: [[KMPC_LOC_ADDR_PSOURCE:%.*]] = getelementptr inbounds [[IDENT]], [[IDENT]]* [[KMPC_LOC_ADDR]], i{{.*}} 0, i{{.*}} 4
David Blaikiebdf40a62015-03-13 18:21:46 +0000869// CHECK-DEBUG-NEXT: store i8* getelementptr inbounds ([{{.*}} x i8], [{{.*}} x i8]* [[LOC20]], i{{.*}} 0, i{{.*}} 0), i8** [[KMPC_LOC_ADDR_PSOURCE]]
Alexey Bataev97720002014-11-11 04:05:39 +0000870// CHECK-DEBUG: @__kmpc_global_thread_num
871// CHECK-DEBUG: call {{.*}}void @__kmpc_threadprivate_register([[IDENT]]* [[KMPC_LOC_ADDR]], i8* bitcast ([[S4]]* [[ST_S4_ST]] to i8*), i8* (i8*)* [[ST_S4_ST_CTOR:@\.__kmpc_global_ctor_\..+]], i8* (i8*, i8*)* null, void (i8*)* [[ST_S4_ST_DTOR:@\.__kmpc_global_dtor_\..+]])
872// CHECK-DEBUG: define internal {{.*}}i8* [[ST_S4_ST_CTOR]](i8*)
873// CHECK-DEBUG: }
874// CHECK-DEBUG: define {{.*}} [[S4_CTOR:@.*]]([[S4]]* {{.*}},
875// CHECK-DEBUG: define internal {{.*}}void [[ST_S4_ST_DTOR]](i8*)
876// CHECK-DEBUG: }
877// CHECK-DEBUG: define {{.*}} [[S4_DTOR:@.*]]([[S4]]* {{.*}})
878
879// CHECK: define internal {{.*}}void {{@.*}}()
880// CHECK-DAG: call {{.*}}void [[GS1_INIT]]()
881// CHECK-DAG: call {{.*}}void [[ARR_X_INIT]]()
882// CHECK: ret void
883// CHECK-DEBUG: define internal {{.*}}void {{@.*}}()
884// CHECK-DEBUG: ret void
Samuel Antaof8b50122015-07-13 22:54:53 +0000885
886// CHECK-TLS: define internal void [[GS1_CXX_INIT:@.*]]()
887// CHECK-TLS: call void [[GS1_CTOR1:@.*]]([[S1]]* [[GS1]], i32 5)
888// CHECK-TLS: call i32 @__cxa_thread_atexit(void (i8*)* bitcast (void ([[S1]]*)* [[GS1_DTOR1:.*]] to void (i8*)*), i8* bitcast ([[S1]]* [[GS1]] to i8*)
889// CHECK-TLS: }
890// CHECK-TLS: define {{.*}}void [[GS1_CTOR1]]([[S1]]* {{.*}}, i32 {{.*}})
891// CHECK-TLS: call void [[GS1_CTOR2:@.*]]([[S1]]* {{.*}}, i32 {{.*}})
892// CHECK-TLS: }
893// CHECK-TLS: define {{.*}}void [[GS1_DTOR1]]([[S1]]* {{.*}})
894// CHECK-TLS: call void [[GS1_DTOR2:@.*]]([[S1]]* {{.*}})
895// CHECK-TLS: }
896// CHECK-TLS: define {{.*}}void [[GS1_CTOR2]]([[S1]]* {{.*}}, i32 {{.*}})
897// CHECK-TLS: define {{.*}}void [[GS1_DTOR2]]([[S1]]* {{.*}})
898
899// CHECK-TLS: define internal void [[GS2_CXX_INIT:@.*]]()
900// CHECK-TLS: call void [[GS2_CTOR1:@.*]]([[S2]]* [[GS2]], i32 27)
901// CHECK-TLS: call i32 @__cxa_atexit(void (i8*)* bitcast (void ([[S2]]*)* [[GS2_DTOR1:.*]] to void (i8*)*), i8* bitcast ([[S2]]* [[GS2]] to i8*)
902// CHECK-TLS: }
903// CHECK-TLS: define {{.*}}void [[GS2_CTOR1]]([[S2]]* {{.*}}, i32 {{.*}})
904// CHECK-TLS: call void [[GS2_CTOR2:@.*]]([[S2]]* {{.*}}, i32 {{.*}})
905// CHECK-TLS: }
906// CHECK-TLS: define {{.*}}void [[GS2_DTOR1]]([[S2]]* {{.*}})
907// CHECK-TLS: call void [[GS2_DTOR2:@.*]]([[S2]]* {{.*}})
908// CHECK-TLS: }
909// CHECK-TLS: define {{.*}}void [[GS2_CTOR2]]([[S2]]* {{.*}}, i32 {{.*}})
910// CHECK-TLS: define {{.*}}void [[GS2_DTOR2]]([[S2]]* {{.*}})
911
912// CHECK-TLS: define internal void [[ARR_X_CXX_INIT:@.*]]()
913// CHECK-TLS: invoke void [[GS1_CTOR1]]([[S1]]* getelementptr inbounds ([2 x [3 x [[S1]]]], [2 x [3 x [[S1]]]]* [[ARR_X]], i{{.*}} 0, i{{.*}} 0, i{{.*}} 0), i{{.*}} 1)
914// CHECK-TLS: invoke void [[GS1_CTOR1]]([[S1]]* getelementptr inbounds ([2 x [3 x [[S1]]]], [2 x [3 x [[S1]]]]* [[ARR_X]], i{{.*}} 0, i{{.*}} 0, i{{.*}} 1), i{{.*}} 2)
915// CHECK-TLS: invoke void [[GS1_CTOR1]]([[S1]]* getelementptr inbounds ([2 x [3 x [[S1]]]], [2 x [3 x [[S1]]]]* [[ARR_X]], i{{.*}} 0, i{{.*}} 0, i{{.*}} 2), i{{.*}} 3)
916// CHECK-TLS: invoke void [[GS1_CTOR1]]([[S1]]* getelementptr inbounds ([2 x [3 x [[S1]]]], [2 x [3 x [[S1]]]]* [[ARR_X]], i{{.*}} 0, i{{.*}} 1, i{{.*}} 0), i{{.*}} 4)
917// CHECK-TLS: invoke void [[GS1_CTOR1]]([[S1]]* getelementptr inbounds ([2 x [3 x [[S1]]]], [2 x [3 x [[S1]]]]* [[ARR_X]], i{{.*}} 0, i{{.*}} 1, i{{.*}} 1), i{{.*}} 5)
918// CHECK-TLS: invoke void [[GS1_CTOR1]]([[S1]]* getelementptr inbounds ([2 x [3 x [[S1]]]], [2 x [3 x [[S1]]]]* [[ARR_X]], i{{.*}} 0, i{{.*}} 1, i{{.*}} 2), i{{.*}} 6)
919// CHECK-TLS: call i32 @__cxa_thread_atexit(void (i8*)* [[ARR_X_CXX_DTOR:@[^,]+]]
920// CHECK-TLS: define internal void [[ARR_X_CXX_DTOR]](i8*)
921// CHECK-TLS: void [[GS1_DTOR1]]([[S1]]* {{.*}})
922
923// CHECK-TLS: define {{.*}}void [[SM_CTOR2]]([[SMAIN]]* {{.*}}, i32 {{.*}})
924// CHECK-TLS: define {{.*}}void [[SM_DTOR2]]([[SMAIN]]* {{.*}})
925
926// CHECK-TLS: define internal void [[ST_S4_ST_CXX_INIT:@.*]]()
927// CHECK-TLS: call void [[ST_S4_ST_CTOR1:@.*]]([[S4]]* [[ST_S4_ST]], i32 23)
928// CHECK-TLS: call i32 @__cxa_thread_atexit(void (i8*)* bitcast (void ([[S4]]*)* [[ST_S4_ST_DTOR1:.*]] to void (i8*)*), i8* bitcast ([[S4]]* [[ST_S4_ST]] to i8*)
929// CHECK-TLS: }
930// CHECK-TLS: define {{.*}}void [[ST_S4_ST_CTOR1]]([[S4]]* {{.*}}, i32 {{.*}})
931// CHECK-TLS: call void [[ST_S4_ST_CTOR2:@.*]]([[S4]]* {{.*}}, i32 {{.*}})
932// CHECK-TLS: }
933// CHECK-TLS: define {{.*}}void [[ST_S4_ST_DTOR1]]([[S4]]* {{.*}})
934// CHECK-TLS: call void [[ST_S4_ST_DTOR2:@.*]]([[S4]]* {{.*}})
935// CHECK-TLS: }
936// CHECK-TLS: define {{.*}}void [[ST_S4_ST_CTOR2]]([[S4]]* {{.*}}, i32 {{.*}})
937// CHECK-TLS: define {{.*}}void [[ST_S4_ST_DTOR2]]([[S4]]* {{.*}})
938
939// CHECK-TLS: define internal void @__tls_init()
940// CHECK-TLS: [[GRD:%.*]] = load i8, i8* @__tls_guard
941// CHECK-TLS-NEXT: [[IS_INIT:%.*]] = icmp eq i8 [[GRD]], 0
Samuel Antaof8b50122015-07-13 22:54:53 +0000942// CHECK-TLS-NEXT: br i1 [[IS_INIT]], label %[[INIT_LABEL:[^,]+]], label %[[DONE_LABEL:[^,]+]]{{.*}}
943// CHECK-TLS: [[INIT_LABEL]]
Manman Ren14f88152015-11-11 19:19:26 +0000944// CHECK-TLS-NEXT: store i8 1, i8* @__tls_guard
Samuel Antaof8b50122015-07-13 22:54:53 +0000945// CHECK-TLS: call void [[GS1_CXX_INIT]]
Hans Wennborg2151d122015-08-31 21:48:52 +0000946// CHECK-TLS-NOT: call void [[GS2_CXX_INIT]]
Samuel Antaof8b50122015-07-13 22:54:53 +0000947// CHECK-TLS: call void [[ARR_X_CXX_INIT]]
948// CHECK-TLS: call void [[ST_S4_ST_CXX_INIT]]
949// CHECK-TLS: [[DONE_LABEL]]
950
951// CHECK-TLS: declare {{.*}} void [[GS3_TLS_INIT]]
952// CHECK-TLS: declare {{.*}} void [[STATIC_S_TLS_INIT]]