xref: /llvm-project/clang/test/OpenMP/scope_codegen.cpp (revision d7c69c20a799509ffab8b22920c92c6428485f45)
1*d7c69c20SDavid Pagan // NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --function-signature --include-generated-funcs --replace-value-regex "__omp_offloading_[0-9a-z]+_[0-9a-z]+" "reduction_size[.].+[.]" "pl_cond[.].+[.|,]" --prefix-filecheck-ir-name _
2*d7c69c20SDavid Pagan // RUN: %clang_cc1 -verify -Wno-vla -fopenmp -fopenmp-version=52 -fnoopenmp-use-tls -x c++ -std=c++11 -triple x86_64-unknown-unknown -emit-llvm %s -fexceptions -fcxx-exceptions -o - | FileCheck %s --check-prefix=CHECK1
3*d7c69c20SDavid Pagan 
4*d7c69c20SDavid Pagan // RUN: %clang_cc1 -fopenmp -fopenmp-version=52 -fnoopenmp-use-tls -x c++ -std=c++11 -triple x86_64-unknown-unknown -fexceptions -fcxx-exceptions -emit-pch -o %t %s
5*d7c69c20SDavid Pagan // RUN: %clang_cc1 -fopenmp -fopenmp-version=52 -fnoopenmp-use-tls -x c++ -triple x86_64-unknown-unknown -fexceptions -fcxx-exceptions -std=c++11 -include-pch %t -verify -Wno-vla %s -emit-llvm -o - | FileCheck %s --check-prefix=CHECK1
6*d7c69c20SDavid Pagan 
7*d7c69c20SDavid Pagan // RUN: %clang_cc1 -fopenmp -fopenmp-version=52 -fnoopenmp-use-tls -x c++ -std=c++11 -triple x86_64-unknown-unknown -fexceptions -fcxx-exceptions -emit-pch -o %t %s
8*d7c69c20SDavid Pagan // RUN: %clang_cc1 -fopenmp -fopenmp-version=52 -fnoopenmp-use-tls -x c++ -triple x86_64-unknown-unknown -fexceptions -fcxx-exceptions -std=c++11 -include-pch %t -verify -Wno-vla %s -emit-llvm -o - | FileCheck %s --check-prefix=CHECK4
9*d7c69c20SDavid Pagan 
10*d7c69c20SDavid Pagan // RUN: %clang_cc1 -verify -Wno-vla -triple x86_64-apple-darwin10 -std=c++11 -fopenmp -fopenmp-version=52 -fnoopenmp-use-tls -fexceptions -fcxx-exceptions -debug-info-kind=line-tables-only -x c++ -emit-llvm %s -o - | FileCheck %s --check-prefix=CHECK5
11*d7c69c20SDavid Pagan // RUN: %clang_cc1 -verify -Wno-vla -fopenmp -fopenmp-version=52 -fnoopenmp-use-tls -x c++ -std=c++11 -DARRAY -triple x86_64-apple-darwin10 -emit-llvm %s -o - | FileCheck %s --check-prefix=CHECK6
12*d7c69c20SDavid Pagan 
13*d7c69c20SDavid Pagan // RUN: %clang_cc1 -verify -Wno-vla -fopenmp-simd -fopenmp-version=52 -fnoopenmp-use-tls -x c++ -std=c++11 -triple x86_64-unknown-unknown -emit-llvm %s -fexceptions -fcxx-exceptions -o - | FileCheck %s --implicit-check-not="{{__kmpc|__tgt}}"
14*d7c69c20SDavid Pagan // RUN: %clang_cc1 -fopenmp-simd -fopenmp-version=52 -fnoopenmp-use-tls -x c++ -std=c++11 -triple x86_64-unknown-unknown -fexceptions -fcxx-exceptions -emit-pch -o %t %s
15*d7c69c20SDavid Pagan // RUN: %clang_cc1 -fopenmp-simd -fopenmp-version=52 -fnoopenmp-use-tls -x c++ -triple x86_64-unknown-unknown -fexceptions -fcxx-exceptions -std=c++11 -include-pch %t -verify %s -emit-llvm -o - | FileCheck %s --implicit-check-not="{{__kmpc|__tgt}}"
16*d7c69c20SDavid Pagan // RUN: %clang_cc1 -verify -Wno-vla -triple x86_64-apple-darwin10 -std=c++11 -fopenmp-simd -fopenmp-version=52 -fnoopenmp-use-tls -fexceptions -fcxx-exceptions -debug-info-kind=line-tables-only -x c++ -emit-llvm %s -o - | FileCheck %s --implicit-check-not="{{__kmpc|__tgt}}"
17*d7c69c20SDavid Pagan // RUN: %clang_cc1 -verify -Wno-vla -fopenmp-simd -fopenmp-version=52 -fnoopenmp-use-tls -x c++ -std=c++11 -DARRAY -triple x86_64-apple-darwin10 -emit-llvm %s -o - | FileCheck %s --implicit-check-not="{{__kmpc|__tgt}}"
18*d7c69c20SDavid Pagan // expected-no-diagnostics
19*d7c69c20SDavid Pagan 
20*d7c69c20SDavid Pagan typedef void **omp_allocator_handle_t;
21*d7c69c20SDavid Pagan extern const omp_allocator_handle_t omp_null_allocator;
22*d7c69c20SDavid Pagan extern const omp_allocator_handle_t omp_default_mem_alloc;
23*d7c69c20SDavid Pagan extern const omp_allocator_handle_t omp_large_cap_mem_alloc;
24*d7c69c20SDavid Pagan extern const omp_allocator_handle_t omp_const_mem_alloc;
25*d7c69c20SDavid Pagan extern const omp_allocator_handle_t omp_high_bw_mem_alloc;
26*d7c69c20SDavid Pagan extern const omp_allocator_handle_t omp_low_lat_mem_alloc;
27*d7c69c20SDavid Pagan extern const omp_allocator_handle_t omp_cgroup_mem_alloc;
28*d7c69c20SDavid Pagan extern const omp_allocator_handle_t omp_pteam_mem_alloc;
29*d7c69c20SDavid Pagan extern const omp_allocator_handle_t omp_thread_mem_alloc;
30*d7c69c20SDavid Pagan 
31*d7c69c20SDavid Pagan #ifndef ARRAY
32*d7c69c20SDavid Pagan #ifndef HEADER
33*d7c69c20SDavid Pagan #define HEADER
34*d7c69c20SDavid Pagan 
35*d7c69c20SDavid Pagan class TestClass {
36*d7c69c20SDavid Pagan public:
37*d7c69c20SDavid Pagan   int a;
38*d7c69c20SDavid Pagan   TestClass() : a(0) {}
39*d7c69c20SDavid Pagan   TestClass(const TestClass &C) : a(C.a) {}
40*d7c69c20SDavid Pagan   TestClass &operator=(const TestClass &) { return *this;}
41*d7c69c20SDavid Pagan   ~TestClass(){};
42*d7c69c20SDavid Pagan };
43*d7c69c20SDavid Pagan 
44*d7c69c20SDavid Pagan 
45*d7c69c20SDavid Pagan TestClass tc;
46*d7c69c20SDavid Pagan TestClass tc2[2];
47*d7c69c20SDavid Pagan 
48*d7c69c20SDavid Pagan void foo() { extern void mayThrow(); mayThrow(); }
49*d7c69c20SDavid Pagan 
50*d7c69c20SDavid Pagan struct SS {
51*d7c69c20SDavid Pagan   int e;
52*d7c69c20SDavid Pagan   int a;
53*d7c69c20SDavid Pagan   int b : 4;
54*d7c69c20SDavid Pagan   int &c;
55*d7c69c20SDavid Pagan   SS(int &d) : a(0), b(0), c(d) {
56*d7c69c20SDavid Pagan #pragma omp scope private(a, this->b, (this)->c) allocate(omp_default_mem_alloc:b) nowait
57*d7c69c20SDavid Pagan     [&]() {
58*d7c69c20SDavid Pagan       ++this->a, --b, (this)->c /= 1;
59*d7c69c20SDavid Pagan #pragma omp parallel num_threads(b)
60*d7c69c20SDavid Pagan #pragma omp scope firstprivate(a, this->b, (this)->c) reduction(+:e)
61*d7c69c20SDavid Pagan       ++(this)->a, e+=1, this->c /= 1;
62*d7c69c20SDavid Pagan     }();
63*d7c69c20SDavid Pagan   }
64*d7c69c20SDavid Pagan };
65*d7c69c20SDavid Pagan 
66*d7c69c20SDavid Pagan template<typename T>
67*d7c69c20SDavid Pagan struct SST {
68*d7c69c20SDavid Pagan   T a;
69*d7c69c20SDavid Pagan   SST() : a(T()) {
70*d7c69c20SDavid Pagan #pragma omp target teams
71*d7c69c20SDavid Pagan #pragma omp parallel firstprivate(a)
72*d7c69c20SDavid Pagan #pragma omp scope private(this->a)
73*d7c69c20SDavid Pagan     [&]() {
74*d7c69c20SDavid Pagan       [&]() {
75*d7c69c20SDavid Pagan         int c;
76*d7c69c20SDavid Pagan         ++this->a;
77*d7c69c20SDavid Pagan #pragma omp parallel firstprivate(a)
78*d7c69c20SDavid Pagan #pragma omp scope private((this)->a) allocate(omp_cgroup_mem_alloc:a)
79*d7c69c20SDavid Pagan         ++(this)->a;
80*d7c69c20SDavid Pagan       }();
81*d7c69c20SDavid Pagan     }();
82*d7c69c20SDavid Pagan   }
83*d7c69c20SDavid Pagan };
84*d7c69c20SDavid Pagan 
85*d7c69c20SDavid Pagan int main() {
86*d7c69c20SDavid Pagan   char a;
87*d7c69c20SDavid Pagan   char a2[2];
88*d7c69c20SDavid Pagan   TestClass &c = tc;
89*d7c69c20SDavid Pagan   SST<double> sst;
90*d7c69c20SDavid Pagan   SS ss(c.a);
91*d7c69c20SDavid Pagan 
92*d7c69c20SDavid Pagan #pragma omp scope nowait
93*d7c69c20SDavid Pagan   a = 2;
94*d7c69c20SDavid Pagan #pragma omp scope
95*d7c69c20SDavid Pagan   a = 2;
96*d7c69c20SDavid Pagan #pragma omp scope firstprivate(a,c, tc) private(a2, tc2)
97*d7c69c20SDavid Pagan   foo();
98*d7c69c20SDavid Pagan   return a;
99*d7c69c20SDavid Pagan }
100*d7c69c20SDavid Pagan 
101*d7c69c20SDavid Pagan 
102*d7c69c20SDavid Pagan void parallel_single() {
103*d7c69c20SDavid Pagan #pragma omp parallel
104*d7c69c20SDavid Pagan #pragma omp scope
105*d7c69c20SDavid Pagan   foo();
106*d7c69c20SDavid Pagan }
107*d7c69c20SDavid Pagan #endif
108*d7c69c20SDavid Pagan #else
109*d7c69c20SDavid Pagan struct St {
110*d7c69c20SDavid Pagan   int a, b;
111*d7c69c20SDavid Pagan   St() : a(0), b(0) {}
112*d7c69c20SDavid Pagan   St &operator=(const St &) { return *this; };
113*d7c69c20SDavid Pagan   ~St() {}
114*d7c69c20SDavid Pagan };
115*d7c69c20SDavid Pagan 
116*d7c69c20SDavid Pagan void array_func(int n, int a[n], St s[2]) {
117*d7c69c20SDavid Pagan   int b,c;
118*d7c69c20SDavid Pagan #pragma omp scope nowait firstprivate(b) allocate(omp_high_bw_mem_alloc:c) private(a,s) reduction(*:c)
119*d7c69c20SDavid Pagan   ;
120*d7c69c20SDavid Pagan }
121*d7c69c20SDavid Pagan 
122*d7c69c20SDavid Pagan int main() {
123*d7c69c20SDavid Pagan   int n;
124*d7c69c20SDavid Pagan   int a[10];
125*d7c69c20SDavid Pagan   St s[2];
126*d7c69c20SDavid Pagan 
127*d7c69c20SDavid Pagan   array_func(n, a, s);
128*d7c69c20SDavid Pagan   return 0;
129*d7c69c20SDavid Pagan }
130*d7c69c20SDavid Pagan #endif
131*d7c69c20SDavid Pagan // CHECK1-LABEL: define {{[^@]+}}@__cxx_global_var_init
132*d7c69c20SDavid Pagan // CHECK1-SAME: () #[[ATTR0:[0-9]+]] {
133*d7c69c20SDavid Pagan // CHECK1-NEXT:  entry:
134*d7c69c20SDavid Pagan // CHECK1-NEXT:    call void @_ZN9TestClassC1Ev(ptr noundef nonnull align 4 dereferenceable(4) @tc)
135*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[TMP0:%.*]] = call i32 @__cxa_atexit(ptr @_ZN9TestClassD1Ev, ptr @tc, ptr @__dso_handle) #[[ATTR3:[0-9]+]]
136*d7c69c20SDavid Pagan // CHECK1-NEXT:    ret void
137*d7c69c20SDavid Pagan //
138*d7c69c20SDavid Pagan //
139*d7c69c20SDavid Pagan // CHECK1-LABEL: define {{[^@]+}}@_ZN9TestClassC1Ev
140*d7c69c20SDavid Pagan // CHECK1-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[THIS:%.*]]) unnamed_addr #[[ATTR1:[0-9]+]] comdat align 2 {
141*d7c69c20SDavid Pagan // CHECK1-NEXT:  entry:
142*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[THIS_ADDR:%.*]] = alloca ptr, align 8
143*d7c69c20SDavid Pagan // CHECK1-NEXT:    store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
144*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8
145*d7c69c20SDavid Pagan // CHECK1-NEXT:    call void @_ZN9TestClassC2Ev(ptr noundef nonnull align 4 dereferenceable(4) [[THIS1]])
146*d7c69c20SDavid Pagan // CHECK1-NEXT:    ret void
147*d7c69c20SDavid Pagan //
148*d7c69c20SDavid Pagan //
149*d7c69c20SDavid Pagan // CHECK1-LABEL: define {{[^@]+}}@_ZN9TestClassD1Ev
150*d7c69c20SDavid Pagan // CHECK1-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[THIS:%.*]]) unnamed_addr #[[ATTR2:[0-9]+]] comdat align 2 {
151*d7c69c20SDavid Pagan // CHECK1-NEXT:  entry:
152*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[THIS_ADDR:%.*]] = alloca ptr, align 8
153*d7c69c20SDavid Pagan // CHECK1-NEXT:    store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
154*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8
155*d7c69c20SDavid Pagan // CHECK1-NEXT:    call void @_ZN9TestClassD2Ev(ptr noundef nonnull align 4 dereferenceable(4) [[THIS1]]) #[[ATTR3]]
156*d7c69c20SDavid Pagan // CHECK1-NEXT:    ret void
157*d7c69c20SDavid Pagan //
158*d7c69c20SDavid Pagan //
159*d7c69c20SDavid Pagan // CHECK1-LABEL: define {{[^@]+}}@_ZN9TestClassC2Ev
160*d7c69c20SDavid Pagan // CHECK1-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[THIS:%.*]]) unnamed_addr #[[ATTR2]] comdat align 2 {
161*d7c69c20SDavid Pagan // CHECK1-NEXT:  entry:
162*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[THIS_ADDR:%.*]] = alloca ptr, align 8
163*d7c69c20SDavid Pagan // CHECK1-NEXT:    store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
164*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8
165*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[A:%.*]] = getelementptr inbounds nuw [[CLASS_TESTCLASS:%.*]], ptr [[THIS1]], i32 0, i32 0
166*d7c69c20SDavid Pagan // CHECK1-NEXT:    store i32 0, ptr [[A]], align 4
167*d7c69c20SDavid Pagan // CHECK1-NEXT:    ret void
168*d7c69c20SDavid Pagan //
169*d7c69c20SDavid Pagan //
170*d7c69c20SDavid Pagan // CHECK1-LABEL: define {{[^@]+}}@_ZN9TestClassD2Ev
171*d7c69c20SDavid Pagan // CHECK1-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[THIS:%.*]]) unnamed_addr #[[ATTR2]] comdat align 2 {
172*d7c69c20SDavid Pagan // CHECK1-NEXT:  entry:
173*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[THIS_ADDR:%.*]] = alloca ptr, align 8
174*d7c69c20SDavid Pagan // CHECK1-NEXT:    store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
175*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8
176*d7c69c20SDavid Pagan // CHECK1-NEXT:    ret void
177*d7c69c20SDavid Pagan //
178*d7c69c20SDavid Pagan //
179*d7c69c20SDavid Pagan // CHECK1-LABEL: define {{[^@]+}}@__cxx_global_var_init.1
180*d7c69c20SDavid Pagan // CHECK1-SAME: () #[[ATTR0]] personality ptr @__gxx_personality_v0 {
181*d7c69c20SDavid Pagan // CHECK1-NEXT:  entry:
182*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[EXN_SLOT:%.*]] = alloca ptr, align 8
183*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[EHSELECTOR_SLOT:%.*]] = alloca i32, align 4
184*d7c69c20SDavid Pagan // CHECK1-NEXT:    br label [[ARRAYCTOR_LOOP:%.*]]
185*d7c69c20SDavid Pagan // CHECK1:       arrayctor.loop:
186*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[ARRAYCTOR_CUR:%.*]] = phi ptr [ @tc2, [[ENTRY:%.*]] ], [ [[ARRAYCTOR_NEXT:%.*]], [[INVOKE_CONT:%.*]] ]
187*d7c69c20SDavid Pagan // CHECK1-NEXT:    invoke void @_ZN9TestClassC1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[ARRAYCTOR_CUR]])
188*d7c69c20SDavid Pagan // CHECK1-NEXT:            to label [[INVOKE_CONT]] unwind label [[LPAD:%.*]]
189*d7c69c20SDavid Pagan // CHECK1:       invoke.cont:
190*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[ARRAYCTOR_NEXT]] = getelementptr inbounds [[CLASS_TESTCLASS:%.*]], ptr [[ARRAYCTOR_CUR]], i64 1
191*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[ARRAYCTOR_DONE:%.*]] = icmp eq ptr [[ARRAYCTOR_NEXT]], getelementptr inbounds ([[CLASS_TESTCLASS]], ptr @tc2, i64 2)
192*d7c69c20SDavid Pagan // CHECK1-NEXT:    br i1 [[ARRAYCTOR_DONE]], label [[ARRAYCTOR_CONT:%.*]], label [[ARRAYCTOR_LOOP]]
193*d7c69c20SDavid Pagan // CHECK1:       arrayctor.cont:
194*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[TMP0:%.*]] = call i32 @__cxa_atexit(ptr @__cxx_global_array_dtor, ptr null, ptr @__dso_handle) #[[ATTR3]]
195*d7c69c20SDavid Pagan // CHECK1-NEXT:    ret void
196*d7c69c20SDavid Pagan // CHECK1:       lpad:
197*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[TMP1:%.*]] = landingpad { ptr, i32 }
198*d7c69c20SDavid Pagan // CHECK1-NEXT:            cleanup
199*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[TMP2:%.*]] = extractvalue { ptr, i32 } [[TMP1]], 0
200*d7c69c20SDavid Pagan // CHECK1-NEXT:    store ptr [[TMP2]], ptr [[EXN_SLOT]], align 8
201*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[TMP3:%.*]] = extractvalue { ptr, i32 } [[TMP1]], 1
202*d7c69c20SDavid Pagan // CHECK1-NEXT:    store i32 [[TMP3]], ptr [[EHSELECTOR_SLOT]], align 4
203*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[ARRAYDESTROY_ISEMPTY:%.*]] = icmp eq ptr @tc2, [[ARRAYCTOR_CUR]]
204*d7c69c20SDavid Pagan // CHECK1-NEXT:    br i1 [[ARRAYDESTROY_ISEMPTY]], label [[ARRAYDESTROY_DONE1:%.*]], label [[ARRAYDESTROY_BODY:%.*]]
205*d7c69c20SDavid Pagan // CHECK1:       arraydestroy.body:
206*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[ARRAYDESTROY_ELEMENTPAST:%.*]] = phi ptr [ [[ARRAYCTOR_CUR]], [[LPAD]] ], [ [[ARRAYDESTROY_ELEMENT:%.*]], [[ARRAYDESTROY_BODY]] ]
207*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[ARRAYDESTROY_ELEMENT]] = getelementptr inbounds [[CLASS_TESTCLASS]], ptr [[ARRAYDESTROY_ELEMENTPAST]], i64 -1
208*d7c69c20SDavid Pagan // CHECK1-NEXT:    call void @_ZN9TestClassD1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[ARRAYDESTROY_ELEMENT]]) #[[ATTR3]]
209*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[ARRAYDESTROY_DONE:%.*]] = icmp eq ptr [[ARRAYDESTROY_ELEMENT]], @tc2
210*d7c69c20SDavid Pagan // CHECK1-NEXT:    br i1 [[ARRAYDESTROY_DONE]], label [[ARRAYDESTROY_DONE1]], label [[ARRAYDESTROY_BODY]]
211*d7c69c20SDavid Pagan // CHECK1:       arraydestroy.done1:
212*d7c69c20SDavid Pagan // CHECK1-NEXT:    br label [[EH_RESUME:%.*]]
213*d7c69c20SDavid Pagan // CHECK1:       eh.resume:
214*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[EXN:%.*]] = load ptr, ptr [[EXN_SLOT]], align 8
215*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[SEL:%.*]] = load i32, ptr [[EHSELECTOR_SLOT]], align 4
216*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[LPAD_VAL:%.*]] = insertvalue { ptr, i32 } poison, ptr [[EXN]], 0
217*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[LPAD_VAL2:%.*]] = insertvalue { ptr, i32 } [[LPAD_VAL]], i32 [[SEL]], 1
218*d7c69c20SDavid Pagan // CHECK1-NEXT:    resume { ptr, i32 } [[LPAD_VAL2]]
219*d7c69c20SDavid Pagan //
220*d7c69c20SDavid Pagan //
221*d7c69c20SDavid Pagan // CHECK1-LABEL: define {{[^@]+}}@__cxx_global_array_dtor
222*d7c69c20SDavid Pagan // CHECK1-SAME: (ptr noundef [[TMP0:%.*]]) #[[ATTR0]] {
223*d7c69c20SDavid Pagan // CHECK1-NEXT:  entry:
224*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[DOTADDR:%.*]] = alloca ptr, align 8
225*d7c69c20SDavid Pagan // CHECK1-NEXT:    store ptr [[TMP0]], ptr [[DOTADDR]], align 8
226*d7c69c20SDavid Pagan // CHECK1-NEXT:    br label [[ARRAYDESTROY_BODY:%.*]]
227*d7c69c20SDavid Pagan // CHECK1:       arraydestroy.body:
228*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[ARRAYDESTROY_ELEMENTPAST:%.*]] = phi ptr [ getelementptr inbounds ([[CLASS_TESTCLASS:%.*]], ptr @tc2, i64 2), [[ENTRY:%.*]] ], [ [[ARRAYDESTROY_ELEMENT:%.*]], [[ARRAYDESTROY_BODY]] ]
229*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[ARRAYDESTROY_ELEMENT]] = getelementptr inbounds [[CLASS_TESTCLASS]], ptr [[ARRAYDESTROY_ELEMENTPAST]], i64 -1
230*d7c69c20SDavid Pagan // CHECK1-NEXT:    call void @_ZN9TestClassD1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[ARRAYDESTROY_ELEMENT]]) #[[ATTR3]]
231*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[ARRAYDESTROY_DONE:%.*]] = icmp eq ptr [[ARRAYDESTROY_ELEMENT]], @tc2
232*d7c69c20SDavid Pagan // CHECK1-NEXT:    br i1 [[ARRAYDESTROY_DONE]], label [[ARRAYDESTROY_DONE1:%.*]], label [[ARRAYDESTROY_BODY]]
233*d7c69c20SDavid Pagan // CHECK1:       arraydestroy.done1:
234*d7c69c20SDavid Pagan // CHECK1-NEXT:    ret void
235*d7c69c20SDavid Pagan //
236*d7c69c20SDavid Pagan //
237*d7c69c20SDavid Pagan // CHECK1-LABEL: define {{[^@]+}}@_Z3foov
238*d7c69c20SDavid Pagan // CHECK1-SAME: () #[[ATTR1]] {
239*d7c69c20SDavid Pagan // CHECK1-NEXT:  entry:
240*d7c69c20SDavid Pagan // CHECK1-NEXT:    call void @_Z8mayThrowv()
241*d7c69c20SDavid Pagan // CHECK1-NEXT:    ret void
242*d7c69c20SDavid Pagan //
243*d7c69c20SDavid Pagan //
244*d7c69c20SDavid Pagan // CHECK1-LABEL: define {{[^@]+}}@main
245*d7c69c20SDavid Pagan // CHECK1-SAME: () #[[ATTR5:[0-9]+]] personality ptr @__gxx_personality_v0 {
246*d7c69c20SDavid Pagan // CHECK1-NEXT:  entry:
247*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[RETVAL:%.*]] = alloca i32, align 4
248*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[A:%.*]] = alloca i8, align 1
249*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[A2:%.*]] = alloca [2 x i8], align 1
250*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[C:%.*]] = alloca ptr, align 8
251*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[SST:%.*]] = alloca [[STRUCT_SST:%.*]], align 8
252*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[SS:%.*]] = alloca [[STRUCT_SS:%.*]], align 8
253*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[A1:%.*]] = alloca i8, align 1
254*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[C2:%.*]] = alloca [[CLASS_TESTCLASS:%.*]], align 4
255*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[TMP:%.*]] = alloca ptr, align 8
256*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[TC:%.*]] = alloca [[CLASS_TESTCLASS]], align 4
257*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[A24:%.*]] = alloca [2 x i8], align 1
258*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[TC2:%.*]] = alloca [2 x %class.TestClass], align 4
259*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB2:[0-9]+]])
260*d7c69c20SDavid Pagan // CHECK1-NEXT:    store i32 0, ptr [[RETVAL]], align 4
261*d7c69c20SDavid Pagan // CHECK1-NEXT:    store ptr @tc, ptr [[C]], align 8
262*d7c69c20SDavid Pagan // CHECK1-NEXT:    call void @_ZN3SSTIdEC1Ev(ptr noundef nonnull align 8 dereferenceable(8) [[SST]])
263*d7c69c20SDavid Pagan // CHECK1-NEXT:    call void @_ZN2SSC1ERi(ptr noundef nonnull align 8 dereferenceable(24) [[SS]], ptr noundef nonnull align 4 dereferenceable(4) @tc)
264*d7c69c20SDavid Pagan // CHECK1-NEXT:    store i8 2, ptr [[A]], align 1
265*d7c69c20SDavid Pagan // CHECK1-NEXT:    store i8 2, ptr [[A]], align 1
266*d7c69c20SDavid Pagan // CHECK1-NEXT:    call void @__kmpc_barrier(ptr @[[GLOB1:[0-9]+]], i32 [[TMP0]])
267*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[TMP1:%.*]] = load i8, ptr [[A]], align 1
268*d7c69c20SDavid Pagan // CHECK1-NEXT:    store i8 [[TMP1]], ptr [[A1]], align 1
269*d7c69c20SDavid Pagan // CHECK1-NEXT:    invoke void @_ZN9TestClassC1ERKS_(ptr noundef nonnull align 4 dereferenceable(4) [[C2]], ptr noundef nonnull align 4 dereferenceable(4) @tc)
270*d7c69c20SDavid Pagan // CHECK1-NEXT:            to label [[INVOKE_CONT:%.*]] unwind label [[TERMINATE_LPAD:%.*]]
271*d7c69c20SDavid Pagan // CHECK1:       invoke.cont:
272*d7c69c20SDavid Pagan // CHECK1-NEXT:    store ptr [[C2]], ptr [[TMP]], align 8
273*d7c69c20SDavid Pagan // CHECK1-NEXT:    invoke void @_ZN9TestClassC1ERKS_(ptr noundef nonnull align 4 dereferenceable(4) [[TC]], ptr noundef nonnull align 4 dereferenceable(4) @tc)
274*d7c69c20SDavid Pagan // CHECK1-NEXT:            to label [[INVOKE_CONT3:%.*]] unwind label [[TERMINATE_LPAD]]
275*d7c69c20SDavid Pagan // CHECK1:       invoke.cont3:
276*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[ARRAY_BEGIN:%.*]] = getelementptr inbounds [2 x %class.TestClass], ptr [[TC2]], i32 0, i32 0
277*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[ARRAYCTOR_END:%.*]] = getelementptr inbounds [[CLASS_TESTCLASS]], ptr [[ARRAY_BEGIN]], i64 2
278*d7c69c20SDavid Pagan // CHECK1-NEXT:    br label [[ARRAYCTOR_LOOP:%.*]]
279*d7c69c20SDavid Pagan // CHECK1:       arrayctor.loop:
280*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[ARRAYCTOR_CUR:%.*]] = phi ptr [ [[ARRAY_BEGIN]], [[INVOKE_CONT3]] ], [ [[ARRAYCTOR_NEXT:%.*]], [[INVOKE_CONT5:%.*]] ]
281*d7c69c20SDavid Pagan // CHECK1-NEXT:    invoke void @_ZN9TestClassC1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[ARRAYCTOR_CUR]])
282*d7c69c20SDavid Pagan // CHECK1-NEXT:            to label [[INVOKE_CONT5]] unwind label [[TERMINATE_LPAD]]
283*d7c69c20SDavid Pagan // CHECK1:       invoke.cont5:
284*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[ARRAYCTOR_NEXT]] = getelementptr inbounds [[CLASS_TESTCLASS]], ptr [[ARRAYCTOR_CUR]], i64 1
285*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[ARRAYCTOR_DONE:%.*]] = icmp eq ptr [[ARRAYCTOR_NEXT]], [[ARRAYCTOR_END]]
286*d7c69c20SDavid Pagan // CHECK1-NEXT:    br i1 [[ARRAYCTOR_DONE]], label [[ARRAYCTOR_CONT:%.*]], label [[ARRAYCTOR_LOOP]]
287*d7c69c20SDavid Pagan // CHECK1:       arrayctor.cont:
288*d7c69c20SDavid Pagan // CHECK1-NEXT:    invoke void @_Z3foov()
289*d7c69c20SDavid Pagan // CHECK1-NEXT:            to label [[INVOKE_CONT6:%.*]] unwind label [[TERMINATE_LPAD]]
290*d7c69c20SDavid Pagan // CHECK1:       invoke.cont6:
291*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[ARRAY_BEGIN7:%.*]] = getelementptr inbounds [2 x %class.TestClass], ptr [[TC2]], i32 0, i32 0
292*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[TMP2:%.*]] = getelementptr inbounds [[CLASS_TESTCLASS]], ptr [[ARRAY_BEGIN7]], i64 2
293*d7c69c20SDavid Pagan // CHECK1-NEXT:    br label [[ARRAYDESTROY_BODY:%.*]]
294*d7c69c20SDavid Pagan // CHECK1:       arraydestroy.body:
295*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[ARRAYDESTROY_ELEMENTPAST:%.*]] = phi ptr [ [[TMP2]], [[INVOKE_CONT6]] ], [ [[ARRAYDESTROY_ELEMENT:%.*]], [[ARRAYDESTROY_BODY]] ]
296*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[ARRAYDESTROY_ELEMENT]] = getelementptr inbounds [[CLASS_TESTCLASS]], ptr [[ARRAYDESTROY_ELEMENTPAST]], i64 -1
297*d7c69c20SDavid Pagan // CHECK1-NEXT:    call void @_ZN9TestClassD1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[ARRAYDESTROY_ELEMENT]]) #[[ATTR3]]
298*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[ARRAYDESTROY_DONE:%.*]] = icmp eq ptr [[ARRAYDESTROY_ELEMENT]], [[ARRAY_BEGIN7]]
299*d7c69c20SDavid Pagan // CHECK1-NEXT:    br i1 [[ARRAYDESTROY_DONE]], label [[ARRAYDESTROY_DONE8:%.*]], label [[ARRAYDESTROY_BODY]]
300*d7c69c20SDavid Pagan // CHECK1:       arraydestroy.done8:
301*d7c69c20SDavid Pagan // CHECK1-NEXT:    call void @_ZN9TestClassD1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[TC]]) #[[ATTR3]]
302*d7c69c20SDavid Pagan // CHECK1-NEXT:    call void @_ZN9TestClassD1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[C2]]) #[[ATTR3]]
303*d7c69c20SDavid Pagan // CHECK1-NEXT:    call void @__kmpc_barrier(ptr @[[GLOB1]], i32 [[TMP0]])
304*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[TMP3:%.*]] = load i8, ptr [[A]], align 1
305*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[CONV:%.*]] = sext i8 [[TMP3]] to i32
306*d7c69c20SDavid Pagan // CHECK1-NEXT:    ret i32 [[CONV]]
307*d7c69c20SDavid Pagan // CHECK1:       terminate.lpad:
308*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[TMP4:%.*]] = landingpad { ptr, i32 }
309*d7c69c20SDavid Pagan // CHECK1-NEXT:            catch ptr null
310*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[TMP5:%.*]] = extractvalue { ptr, i32 } [[TMP4]], 0
311*d7c69c20SDavid Pagan // CHECK1-NEXT:    call void @__clang_call_terminate(ptr [[TMP5]]) #[[ATTR10:[0-9]+]]
312*d7c69c20SDavid Pagan // CHECK1-NEXT:    unreachable
313*d7c69c20SDavid Pagan //
314*d7c69c20SDavid Pagan //
315*d7c69c20SDavid Pagan // CHECK1-LABEL: define {{[^@]+}}@_ZN3SSTIdEC1Ev
316*d7c69c20SDavid Pagan // CHECK1-SAME: (ptr noundef nonnull align 8 dereferenceable(8) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] comdat align 2 {
317*d7c69c20SDavid Pagan // CHECK1-NEXT:  entry:
318*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[THIS_ADDR:%.*]] = alloca ptr, align 8
319*d7c69c20SDavid Pagan // CHECK1-NEXT:    store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
320*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8
321*d7c69c20SDavid Pagan // CHECK1-NEXT:    call void @_ZN3SSTIdEC2Ev(ptr noundef nonnull align 8 dereferenceable(8) [[THIS1]])
322*d7c69c20SDavid Pagan // CHECK1-NEXT:    ret void
323*d7c69c20SDavid Pagan //
324*d7c69c20SDavid Pagan //
325*d7c69c20SDavid Pagan // CHECK1-LABEL: define {{[^@]+}}@_ZN2SSC1ERi
326*d7c69c20SDavid Pagan // CHECK1-SAME: (ptr noundef nonnull align 8 dereferenceable(24) [[THIS:%.*]], ptr noundef nonnull align 4 dereferenceable(4) [[D:%.*]]) unnamed_addr #[[ATTR1]] comdat align 2 {
327*d7c69c20SDavid Pagan // CHECK1-NEXT:  entry:
328*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[THIS_ADDR:%.*]] = alloca ptr, align 8
329*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[D_ADDR:%.*]] = alloca ptr, align 8
330*d7c69c20SDavid Pagan // CHECK1-NEXT:    store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
331*d7c69c20SDavid Pagan // CHECK1-NEXT:    store ptr [[D]], ptr [[D_ADDR]], align 8
332*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8
333*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[TMP0:%.*]] = load ptr, ptr [[D_ADDR]], align 8
334*d7c69c20SDavid Pagan // CHECK1-NEXT:    call void @_ZN2SSC2ERi(ptr noundef nonnull align 8 dereferenceable(24) [[THIS1]], ptr noundef nonnull align 4 dereferenceable(4) [[TMP0]])
335*d7c69c20SDavid Pagan // CHECK1-NEXT:    ret void
336*d7c69c20SDavid Pagan //
337*d7c69c20SDavid Pagan //
338*d7c69c20SDavid Pagan // CHECK1-LABEL: define {{[^@]+}}@_ZN9TestClassC1ERKS_
339*d7c69c20SDavid Pagan // CHECK1-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[THIS:%.*]], ptr noundef nonnull align 4 dereferenceable(4) [[C:%.*]]) unnamed_addr #[[ATTR1]] comdat align 2 {
340*d7c69c20SDavid Pagan // CHECK1-NEXT:  entry:
341*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[THIS_ADDR:%.*]] = alloca ptr, align 8
342*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[C_ADDR:%.*]] = alloca ptr, align 8
343*d7c69c20SDavid Pagan // CHECK1-NEXT:    store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
344*d7c69c20SDavid Pagan // CHECK1-NEXT:    store ptr [[C]], ptr [[C_ADDR]], align 8
345*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8
346*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[TMP0:%.*]] = load ptr, ptr [[C_ADDR]], align 8
347*d7c69c20SDavid Pagan // CHECK1-NEXT:    call void @_ZN9TestClassC2ERKS_(ptr noundef nonnull align 4 dereferenceable(4) [[THIS1]], ptr noundef nonnull align 4 dereferenceable(4) [[TMP0]])
348*d7c69c20SDavid Pagan // CHECK1-NEXT:    ret void
349*d7c69c20SDavid Pagan //
350*d7c69c20SDavid Pagan //
351*d7c69c20SDavid Pagan // CHECK1-LABEL: define {{[^@]+}}@__clang_call_terminate
352*d7c69c20SDavid Pagan // CHECK1-SAME: (ptr noundef [[TMP0:%.*]]) #[[ATTR7:[0-9]+]] comdat {
353*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[TMP2:%.*]] = call ptr @__cxa_begin_catch(ptr [[TMP0]]) #[[ATTR3]]
354*d7c69c20SDavid Pagan // CHECK1-NEXT:    call void @_ZSt9terminatev() #[[ATTR10]]
355*d7c69c20SDavid Pagan // CHECK1-NEXT:    unreachable
356*d7c69c20SDavid Pagan //
357*d7c69c20SDavid Pagan //
358*d7c69c20SDavid Pagan //
359*d7c69c20SDavid Pagan //
360*d7c69c20SDavid Pagan //
361*d7c69c20SDavid Pagan //
362*d7c69c20SDavid Pagan //
363*d7c69c20SDavid Pagan //
364*d7c69c20SDavid Pagan //
365*d7c69c20SDavid Pagan // CHECK1-LABEL: define {{[^@]+}}@_ZN2SSC2ERi
366*d7c69c20SDavid Pagan // CHECK1-SAME: (ptr noundef nonnull align 8 dereferenceable(24) [[THIS:%.*]], ptr noundef nonnull align 4 dereferenceable(4) [[D:%.*]]) unnamed_addr #[[ATTR2]] comdat align 2 personality ptr @__gxx_personality_v0 {
367*d7c69c20SDavid Pagan // CHECK1-NEXT:  entry:
368*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[THIS_ADDR:%.*]] = alloca ptr, align 8
369*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[D_ADDR:%.*]] = alloca ptr, align 8
370*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[A2:%.*]] = alloca i32, align 4
371*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[TMP:%.*]] = alloca ptr, align 8
372*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[C3:%.*]] = alloca i32, align 4
373*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[_TMP4:%.*]] = alloca ptr, align 8
374*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[REF_TMP:%.*]] = alloca [[CLASS_ANON_1:%.*]], align 8
375*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB2]])
376*d7c69c20SDavid Pagan // CHECK1-NEXT:    store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
377*d7c69c20SDavid Pagan // CHECK1-NEXT:    store ptr [[D]], ptr [[D_ADDR]], align 8
378*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8
379*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[A:%.*]] = getelementptr inbounds nuw [[STRUCT_SS:%.*]], ptr [[THIS1]], i32 0, i32 1
380*d7c69c20SDavid Pagan // CHECK1-NEXT:    store i32 0, ptr [[A]], align 4
381*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[B:%.*]] = getelementptr inbounds nuw [[STRUCT_SS]], ptr [[THIS1]], i32 0, i32 2
382*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[BF_LOAD:%.*]] = load i8, ptr [[B]], align 8
383*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[BF_CLEAR:%.*]] = and i8 [[BF_LOAD]], -16
384*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[BF_SET:%.*]] = or i8 [[BF_CLEAR]], 0
385*d7c69c20SDavid Pagan // CHECK1-NEXT:    store i8 [[BF_SET]], ptr [[B]], align 8
386*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[C:%.*]] = getelementptr inbounds nuw [[STRUCT_SS]], ptr [[THIS1]], i32 0, i32 3
387*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[TMP1:%.*]] = load ptr, ptr [[D_ADDR]], align 8
388*d7c69c20SDavid Pagan // CHECK1-NEXT:    store ptr [[TMP1]], ptr [[C]], align 8
389*d7c69c20SDavid Pagan // CHECK1-NEXT:    store ptr [[A2]], ptr [[TMP]], align 8
390*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[TMP2:%.*]] = load ptr, ptr @omp_default_mem_alloc, align 8
391*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[DOTB__VOID_ADDR:%.*]] = call ptr @__kmpc_alloc(i32 [[TMP0]], i64 4, ptr [[TMP2]])
392*d7c69c20SDavid Pagan // CHECK1-NEXT:    store ptr [[C3]], ptr [[_TMP4]], align 8
393*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[TMP3:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_1]], ptr [[REF_TMP]], i32 0, i32 0
394*d7c69c20SDavid Pagan // CHECK1-NEXT:    store ptr [[THIS1]], ptr [[TMP3]], align 8
395*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[TMP4:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_1]], ptr [[REF_TMP]], i32 0, i32 1
396*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[TMP5:%.*]] = load ptr, ptr [[TMP]], align 8
397*d7c69c20SDavid Pagan // CHECK1-NEXT:    store ptr [[TMP5]], ptr [[TMP4]], align 8
398*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[TMP6:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_1]], ptr [[REF_TMP]], i32 0, i32 2
399*d7c69c20SDavid Pagan // CHECK1-NEXT:    store ptr [[DOTB__VOID_ADDR]], ptr [[TMP6]], align 8
400*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[TMP7:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_1]], ptr [[REF_TMP]], i32 0, i32 3
401*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[TMP8:%.*]] = load ptr, ptr [[_TMP4]], align 8
402*d7c69c20SDavid Pagan // CHECK1-NEXT:    store ptr [[TMP8]], ptr [[TMP7]], align 8
403*d7c69c20SDavid Pagan // CHECK1-NEXT:    invoke void @_ZZN2SSC1ERiENKUlvE_clEv(ptr noundef nonnull align 8 dereferenceable(32) [[REF_TMP]])
404*d7c69c20SDavid Pagan // CHECK1-NEXT:            to label [[INVOKE_CONT:%.*]] unwind label [[TERMINATE_LPAD:%.*]]
405*d7c69c20SDavid Pagan // CHECK1:       invoke.cont:
406*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[TMP9:%.*]] = load ptr, ptr @omp_default_mem_alloc, align 8
407*d7c69c20SDavid Pagan // CHECK1-NEXT:    call void @__kmpc_free(i32 [[TMP0]], ptr [[DOTB__VOID_ADDR]], ptr [[TMP9]])
408*d7c69c20SDavid Pagan // CHECK1-NEXT:    ret void
409*d7c69c20SDavid Pagan // CHECK1:       terminate.lpad:
410*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[TMP10:%.*]] = landingpad { ptr, i32 }
411*d7c69c20SDavid Pagan // CHECK1-NEXT:            catch ptr null
412*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[TMP11:%.*]] = extractvalue { ptr, i32 } [[TMP10]], 0
413*d7c69c20SDavid Pagan // CHECK1-NEXT:    call void @__clang_call_terminate(ptr [[TMP11]]) #[[ATTR10]]
414*d7c69c20SDavid Pagan // CHECK1-NEXT:    unreachable
415*d7c69c20SDavid Pagan //
416*d7c69c20SDavid Pagan //
417*d7c69c20SDavid Pagan // CHECK1-LABEL: define {{[^@]+}}@_ZZN2SSC1ERiENKUlvE_clEv
418*d7c69c20SDavid Pagan // CHECK1-SAME: (ptr noundef nonnull align 8 dereferenceable(32) [[THIS:%.*]]) #[[ATTR2]] align 2 {
419*d7c69c20SDavid Pagan // CHECK1-NEXT:  entry:
420*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[THIS_ADDR:%.*]] = alloca ptr, align 8
421*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB2]])
422*d7c69c20SDavid Pagan // CHECK1-NEXT:    store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
423*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8
424*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[TMP1:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_1:%.*]], ptr [[THIS1]], i32 0, i32 0
425*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[TMP2:%.*]] = load ptr, ptr [[TMP1]], align 8
426*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[TMP3:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_1]], ptr [[THIS1]], i32 0, i32 1
427*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[TMP4:%.*]] = load ptr, ptr [[TMP3]], align 8
428*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[TMP5:%.*]] = load i32, ptr [[TMP4]], align 4
429*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[INC:%.*]] = add nsw i32 [[TMP5]], 1
430*d7c69c20SDavid Pagan // CHECK1-NEXT:    store i32 [[INC]], ptr [[TMP4]], align 4
431*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[TMP6:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_1]], ptr [[THIS1]], i32 0, i32 2
432*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[TMP7:%.*]] = load ptr, ptr [[TMP6]], align 8
433*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[TMP8:%.*]] = load i32, ptr [[TMP7]], align 4
434*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[DEC:%.*]] = add nsw i32 [[TMP8]], -1
435*d7c69c20SDavid Pagan // CHECK1-NEXT:    store i32 [[DEC]], ptr [[TMP7]], align 4
436*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[TMP9:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_1]], ptr [[THIS1]], i32 0, i32 3
437*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[TMP10:%.*]] = load ptr, ptr [[TMP9]], align 8
438*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[TMP11:%.*]] = load i32, ptr [[TMP10]], align 4
439*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[DIV:%.*]] = sdiv i32 [[TMP11]], 1
440*d7c69c20SDavid Pagan // CHECK1-NEXT:    store i32 [[DIV]], ptr [[TMP10]], align 4
441*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[TMP12:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_1]], ptr [[THIS1]], i32 0, i32 2
442*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[TMP13:%.*]] = load ptr, ptr [[TMP12]], align 8
443*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[TMP14:%.*]] = load i32, ptr [[TMP13]], align 4
444*d7c69c20SDavid Pagan // CHECK1-NEXT:    call void @__kmpc_push_num_threads(ptr @[[GLOB2]], i32 [[TMP0]], i32 [[TMP14]])
445*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[TMP15:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_1]], ptr [[THIS1]], i32 0, i32 1
446*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[TMP16:%.*]] = load ptr, ptr [[TMP15]], align 8
447*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[TMP17:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_1]], ptr [[THIS1]], i32 0, i32 2
448*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[TMP18:%.*]] = load ptr, ptr [[TMP17]], align 8
449*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[TMP19:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_1]], ptr [[THIS1]], i32 0, i32 3
450*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[TMP20:%.*]] = load ptr, ptr [[TMP19]], align 8
451*d7c69c20SDavid Pagan // CHECK1-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB2]], i32 4, ptr @_ZZN2SSC1ERiENKUlvE_clEv.omp_outlined, ptr [[TMP2]], ptr [[TMP16]], ptr [[TMP18]], ptr [[TMP20]])
452*d7c69c20SDavid Pagan // CHECK1-NEXT:    ret void
453*d7c69c20SDavid Pagan //
454*d7c69c20SDavid Pagan //
455*d7c69c20SDavid Pagan // CHECK1-LABEL: define {{[^@]+}}@_ZZN2SSC1ERiENKUlvE_clEv.omp_outlined
456*d7c69c20SDavid Pagan // CHECK1-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], ptr noundef [[THIS:%.*]], ptr noundef nonnull align 4 dereferenceable(4) [[A:%.*]], ptr noundef nonnull align 4 dereferenceable(4) [[B:%.*]], ptr noundef nonnull align 4 dereferenceable(4) [[C:%.*]]) #[[ATTR8:[0-9]+]] {
457*d7c69c20SDavid Pagan // CHECK1-NEXT:  entry:
458*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 8
459*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 8
460*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[THIS_ADDR:%.*]] = alloca ptr, align 8
461*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[A_ADDR:%.*]] = alloca ptr, align 8
462*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[B_ADDR:%.*]] = alloca ptr, align 8
463*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[C_ADDR:%.*]] = alloca ptr, align 8
464*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[TMP:%.*]] = alloca ptr, align 8
465*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[_TMP1:%.*]] = alloca ptr, align 8
466*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[E:%.*]] = alloca ptr, align 8
467*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[_TMP3:%.*]] = alloca ptr, align 8
468*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[_TMP4:%.*]] = alloca ptr, align 8
469*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[_TMP5:%.*]] = alloca ptr, align 8
470*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[A6:%.*]] = alloca i32, align 4
471*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[_TMP7:%.*]] = alloca ptr, align 8
472*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[B8:%.*]] = alloca i32, align 4
473*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[C9:%.*]] = alloca i32, align 4
474*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[_TMP10:%.*]] = alloca ptr, align 8
475*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[E11:%.*]] = alloca i32, align 4
476*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[_TMP12:%.*]] = alloca ptr, align 8
477*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[DOTOMP_REDUCTION_RED_LIST:%.*]] = alloca [1 x ptr], align 8
478*d7c69c20SDavid Pagan // CHECK1-NEXT:    store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 8
479*d7c69c20SDavid Pagan // CHECK1-NEXT:    store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 8
480*d7c69c20SDavid Pagan // CHECK1-NEXT:    store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
481*d7c69c20SDavid Pagan // CHECK1-NEXT:    store ptr [[A]], ptr [[A_ADDR]], align 8
482*d7c69c20SDavid Pagan // CHECK1-NEXT:    store ptr [[B]], ptr [[B_ADDR]], align 8
483*d7c69c20SDavid Pagan // CHECK1-NEXT:    store ptr [[C]], ptr [[C_ADDR]], align 8
484*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[TMP0:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8
485*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[TMP1:%.*]] = load ptr, ptr [[A_ADDR]], align 8
486*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[TMP2:%.*]] = load ptr, ptr [[B_ADDR]], align 8
487*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[TMP3:%.*]] = load ptr, ptr [[C_ADDR]], align 8
488*d7c69c20SDavid Pagan // CHECK1-NEXT:    store ptr [[TMP1]], ptr [[TMP]], align 8
489*d7c69c20SDavid Pagan // CHECK1-NEXT:    store ptr [[TMP3]], ptr [[_TMP1]], align 8
490*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[E2:%.*]] = getelementptr inbounds nuw [[STRUCT_SS:%.*]], ptr [[TMP0]], i32 0, i32 0
491*d7c69c20SDavid Pagan // CHECK1-NEXT:    store ptr [[E2]], ptr [[E]], align 8
492*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[TMP4:%.*]] = load ptr, ptr [[TMP]], align 8
493*d7c69c20SDavid Pagan // CHECK1-NEXT:    store ptr [[TMP4]], ptr [[_TMP3]], align 8
494*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[TMP5:%.*]] = load ptr, ptr [[E]], align 8
495*d7c69c20SDavid Pagan // CHECK1-NEXT:    store ptr [[TMP5]], ptr [[_TMP4]], align 8
496*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[TMP6:%.*]] = load ptr, ptr [[_TMP1]], align 8
497*d7c69c20SDavid Pagan // CHECK1-NEXT:    store ptr [[TMP6]], ptr [[_TMP5]], align 8
498*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[TMP7:%.*]] = load ptr, ptr [[_TMP3]], align 8
499*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[TMP8:%.*]] = load i32, ptr [[TMP7]], align 4
500*d7c69c20SDavid Pagan // CHECK1-NEXT:    store i32 [[TMP8]], ptr [[A6]], align 4
501*d7c69c20SDavid Pagan // CHECK1-NEXT:    store ptr [[A6]], ptr [[_TMP7]], align 8
502*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[TMP9:%.*]] = load i32, ptr [[TMP2]], align 4
503*d7c69c20SDavid Pagan // CHECK1-NEXT:    store i32 [[TMP9]], ptr [[B8]], align 4
504*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[TMP10:%.*]] = load ptr, ptr [[_TMP5]], align 8
505*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[TMP11:%.*]] = load i32, ptr [[TMP10]], align 4
506*d7c69c20SDavid Pagan // CHECK1-NEXT:    store i32 [[TMP11]], ptr [[C9]], align 4
507*d7c69c20SDavid Pagan // CHECK1-NEXT:    store ptr [[C9]], ptr [[_TMP10]], align 8
508*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[TMP12:%.*]] = load ptr, ptr [[_TMP4]], align 8
509*d7c69c20SDavid Pagan // CHECK1-NEXT:    store i32 0, ptr [[E11]], align 4
510*d7c69c20SDavid Pagan // CHECK1-NEXT:    store ptr [[E11]], ptr [[_TMP12]], align 8
511*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[TMP13:%.*]] = load ptr, ptr [[_TMP7]], align 8
512*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[TMP14:%.*]] = load i32, ptr [[TMP13]], align 4
513*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[INC:%.*]] = add nsw i32 [[TMP14]], 1
514*d7c69c20SDavid Pagan // CHECK1-NEXT:    store i32 [[INC]], ptr [[TMP13]], align 4
515*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[TMP15:%.*]] = load ptr, ptr [[_TMP12]], align 8
516*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[TMP16:%.*]] = load i32, ptr [[TMP15]], align 4
517*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP16]], 1
518*d7c69c20SDavid Pagan // CHECK1-NEXT:    store i32 [[ADD]], ptr [[TMP15]], align 4
519*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[TMP17:%.*]] = load ptr, ptr [[_TMP10]], align 8
520*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[TMP18:%.*]] = load i32, ptr [[TMP17]], align 4
521*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[DIV:%.*]] = sdiv i32 [[TMP18]], 1
522*d7c69c20SDavid Pagan // CHECK1-NEXT:    store i32 [[DIV]], ptr [[TMP17]], align 4
523*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[TMP19:%.*]] = getelementptr inbounds [1 x ptr], ptr [[DOTOMP_REDUCTION_RED_LIST]], i64 0, i64 0
524*d7c69c20SDavid Pagan // CHECK1-NEXT:    store ptr [[E11]], ptr [[TMP19]], align 8
525*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[TMP20:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8
526*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[TMP21:%.*]] = load i32, ptr [[TMP20]], align 4
527*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[TMP22:%.*]] = call i32 @__kmpc_reduce(ptr @[[GLOB3:[0-9]+]], i32 [[TMP21]], i32 1, i64 8, ptr [[DOTOMP_REDUCTION_RED_LIST]], ptr @_ZZN2SSC1ERiENKUlvE_clEv.omp_outlined.omp.reduction.reduction_func, ptr @.gomp_critical_user_.reduction.var)
528*d7c69c20SDavid Pagan // CHECK1-NEXT:    switch i32 [[TMP22]], label [[DOTOMP_REDUCTION_DEFAULT:%.*]] [
529*d7c69c20SDavid Pagan // CHECK1-NEXT:      i32 1, label [[DOTOMP_REDUCTION_CASE1:%.*]]
530*d7c69c20SDavid Pagan // CHECK1-NEXT:      i32 2, label [[DOTOMP_REDUCTION_CASE2:%.*]]
531*d7c69c20SDavid Pagan // CHECK1-NEXT:    ]
532*d7c69c20SDavid Pagan // CHECK1:       .omp.reduction.case1:
533*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[TMP23:%.*]] = load i32, ptr [[TMP12]], align 4
534*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[TMP24:%.*]] = load i32, ptr [[E11]], align 4
535*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[ADD13:%.*]] = add nsw i32 [[TMP23]], [[TMP24]]
536*d7c69c20SDavid Pagan // CHECK1-NEXT:    store i32 [[ADD13]], ptr [[TMP12]], align 4
537*d7c69c20SDavid Pagan // CHECK1-NEXT:    call void @__kmpc_end_reduce(ptr @[[GLOB3]], i32 [[TMP21]], ptr @.gomp_critical_user_.reduction.var)
538*d7c69c20SDavid Pagan // CHECK1-NEXT:    br label [[DOTOMP_REDUCTION_DEFAULT]]
539*d7c69c20SDavid Pagan // CHECK1:       .omp.reduction.case2:
540*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[TMP25:%.*]] = load i32, ptr [[E11]], align 4
541*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[TMP26:%.*]] = atomicrmw add ptr [[TMP12]], i32 [[TMP25]] monotonic, align 4
542*d7c69c20SDavid Pagan // CHECK1-NEXT:    call void @__kmpc_end_reduce(ptr @[[GLOB3]], i32 [[TMP21]], ptr @.gomp_critical_user_.reduction.var)
543*d7c69c20SDavid Pagan // CHECK1-NEXT:    br label [[DOTOMP_REDUCTION_DEFAULT]]
544*d7c69c20SDavid Pagan // CHECK1:       .omp.reduction.default:
545*d7c69c20SDavid Pagan // CHECK1-NEXT:    call void @__kmpc_barrier(ptr @[[GLOB1]], i32 [[TMP21]])
546*d7c69c20SDavid Pagan // CHECK1-NEXT:    ret void
547*d7c69c20SDavid Pagan //
548*d7c69c20SDavid Pagan //
549*d7c69c20SDavid Pagan // CHECK1-LABEL: define {{[^@]+}}@_ZZN2SSC1ERiENKUlvE_clEv.omp_outlined.omp.reduction.reduction_func
550*d7c69c20SDavid Pagan // CHECK1-SAME: (ptr noundef [[TMP0:%.*]], ptr noundef [[TMP1:%.*]]) #[[ATTR9:[0-9]+]] {
551*d7c69c20SDavid Pagan // CHECK1-NEXT:  entry:
552*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[DOTADDR:%.*]] = alloca ptr, align 8
553*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[DOTADDR1:%.*]] = alloca ptr, align 8
554*d7c69c20SDavid Pagan // CHECK1-NEXT:    store ptr [[TMP0]], ptr [[DOTADDR]], align 8
555*d7c69c20SDavid Pagan // CHECK1-NEXT:    store ptr [[TMP1]], ptr [[DOTADDR1]], align 8
556*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[TMP2:%.*]] = load ptr, ptr [[DOTADDR]], align 8
557*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[TMP3:%.*]] = load ptr, ptr [[DOTADDR1]], align 8
558*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[TMP4:%.*]] = getelementptr inbounds [1 x ptr], ptr [[TMP3]], i64 0, i64 0
559*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[TMP5:%.*]] = load ptr, ptr [[TMP4]], align 8
560*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[TMP6:%.*]] = getelementptr inbounds [1 x ptr], ptr [[TMP2]], i64 0, i64 0
561*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[TMP7:%.*]] = load ptr, ptr [[TMP6]], align 8
562*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[TMP8:%.*]] = load i32, ptr [[TMP7]], align 4
563*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[TMP9:%.*]] = load i32, ptr [[TMP5]], align 4
564*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP8]], [[TMP9]]
565*d7c69c20SDavid Pagan // CHECK1-NEXT:    store i32 [[ADD]], ptr [[TMP7]], align 4
566*d7c69c20SDavid Pagan // CHECK1-NEXT:    ret void
567*d7c69c20SDavid Pagan //
568*d7c69c20SDavid Pagan //
569*d7c69c20SDavid Pagan // CHECK1-LABEL: define {{[^@]+}}@_ZN9TestClassC2ERKS_
570*d7c69c20SDavid Pagan // CHECK1-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[THIS:%.*]], ptr noundef nonnull align 4 dereferenceable(4) [[C:%.*]]) unnamed_addr #[[ATTR2]] comdat align 2 {
571*d7c69c20SDavid Pagan // CHECK1-NEXT:  entry:
572*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[THIS_ADDR:%.*]] = alloca ptr, align 8
573*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[C_ADDR:%.*]] = alloca ptr, align 8
574*d7c69c20SDavid Pagan // CHECK1-NEXT:    store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
575*d7c69c20SDavid Pagan // CHECK1-NEXT:    store ptr [[C]], ptr [[C_ADDR]], align 8
576*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8
577*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[A:%.*]] = getelementptr inbounds nuw [[CLASS_TESTCLASS:%.*]], ptr [[THIS1]], i32 0, i32 0
578*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[TMP0:%.*]] = load ptr, ptr [[C_ADDR]], align 8
579*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[A2:%.*]] = getelementptr inbounds nuw [[CLASS_TESTCLASS]], ptr [[TMP0]], i32 0, i32 0
580*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[TMP1:%.*]] = load i32, ptr [[A2]], align 4
581*d7c69c20SDavid Pagan // CHECK1-NEXT:    store i32 [[TMP1]], ptr [[A]], align 4
582*d7c69c20SDavid Pagan // CHECK1-NEXT:    ret void
583*d7c69c20SDavid Pagan //
584*d7c69c20SDavid Pagan //
585*d7c69c20SDavid Pagan // CHECK1-LABEL: define {{[^@]+}}@_Z15parallel_singlev
586*d7c69c20SDavid Pagan // CHECK1-SAME: () #[[ATTR2]] {
587*d7c69c20SDavid Pagan // CHECK1-NEXT:  entry:
588*d7c69c20SDavid Pagan // CHECK1-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB2]], i32 0, ptr @_Z15parallel_singlev.omp_outlined)
589*d7c69c20SDavid Pagan // CHECK1-NEXT:    ret void
590*d7c69c20SDavid Pagan //
591*d7c69c20SDavid Pagan //
592*d7c69c20SDavid Pagan // CHECK1-LABEL: define {{[^@]+}}@_Z15parallel_singlev.omp_outlined
593*d7c69c20SDavid Pagan // CHECK1-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]]) #[[ATTR8]] personality ptr @__gxx_personality_v0 {
594*d7c69c20SDavid Pagan // CHECK1-NEXT:  entry:
595*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 8
596*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 8
597*d7c69c20SDavid Pagan // CHECK1-NEXT:    store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 8
598*d7c69c20SDavid Pagan // CHECK1-NEXT:    store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 8
599*d7c69c20SDavid Pagan // CHECK1-NEXT:    invoke void @_Z3foov()
600*d7c69c20SDavid Pagan // CHECK1-NEXT:            to label [[INVOKE_CONT:%.*]] unwind label [[TERMINATE_LPAD:%.*]]
601*d7c69c20SDavid Pagan // CHECK1:       invoke.cont:
602*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[TMP0:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8
603*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 4
604*d7c69c20SDavid Pagan // CHECK1-NEXT:    call void @__kmpc_barrier(ptr @[[GLOB1]], i32 [[TMP1]])
605*d7c69c20SDavid Pagan // CHECK1-NEXT:    ret void
606*d7c69c20SDavid Pagan // CHECK1:       terminate.lpad:
607*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[TMP2:%.*]] = landingpad { ptr, i32 }
608*d7c69c20SDavid Pagan // CHECK1-NEXT:            catch ptr null
609*d7c69c20SDavid Pagan // CHECK1-NEXT:    [[TMP3:%.*]] = extractvalue { ptr, i32 } [[TMP2]], 0
610*d7c69c20SDavid Pagan // CHECK1-NEXT:    call void @__clang_call_terminate(ptr [[TMP3]]) #[[ATTR10]]
611*d7c69c20SDavid Pagan // CHECK1-NEXT:    unreachable
612*d7c69c20SDavid Pagan //
613*d7c69c20SDavid Pagan //
614*d7c69c20SDavid Pagan // CHECK1-LABEL: define {{[^@]+}}@_GLOBAL__sub_I_scope_codegen.cpp
615*d7c69c20SDavid Pagan // CHECK1-SAME: () #[[ATTR0]] {
616*d7c69c20SDavid Pagan // CHECK1-NEXT:  entry:
617*d7c69c20SDavid Pagan // CHECK1-NEXT:    call void @__cxx_global_var_init()
618*d7c69c20SDavid Pagan // CHECK1-NEXT:    call void @__cxx_global_var_init.1()
619*d7c69c20SDavid Pagan // CHECK1-NEXT:    ret void
620*d7c69c20SDavid Pagan //
621*d7c69c20SDavid Pagan //
622*d7c69c20SDavid Pagan //
623*d7c69c20SDavid Pagan //
624*d7c69c20SDavid Pagan //
625*d7c69c20SDavid Pagan //
626*d7c69c20SDavid Pagan //
627*d7c69c20SDavid Pagan //
628*d7c69c20SDavid Pagan //
629*d7c69c20SDavid Pagan // CHECK4-LABEL: define {{[^@]+}}@__cxx_global_var_init
630*d7c69c20SDavid Pagan // CHECK4-SAME: () #[[ATTR0:[0-9]+]] {
631*d7c69c20SDavid Pagan // CHECK4-NEXT:  entry:
632*d7c69c20SDavid Pagan // CHECK4-NEXT:    call void @_ZN9TestClassC1Ev(ptr noundef nonnull align 4 dereferenceable(4) @tc)
633*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP0:%.*]] = call i32 @__cxa_atexit(ptr @_ZN9TestClassD1Ev, ptr @tc, ptr @__dso_handle) #[[ATTR3:[0-9]+]]
634*d7c69c20SDavid Pagan // CHECK4-NEXT:    ret void
635*d7c69c20SDavid Pagan //
636*d7c69c20SDavid Pagan //
637*d7c69c20SDavid Pagan // CHECK4-LABEL: define {{[^@]+}}@_ZN9TestClassC1Ev
638*d7c69c20SDavid Pagan // CHECK4-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[THIS:%.*]]) unnamed_addr #[[ATTR1:[0-9]+]] comdat align 2 {
639*d7c69c20SDavid Pagan // CHECK4-NEXT:  entry:
640*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[THIS_ADDR:%.*]] = alloca ptr, align 8
641*d7c69c20SDavid Pagan // CHECK4-NEXT:    store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
642*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8
643*d7c69c20SDavid Pagan // CHECK4-NEXT:    call void @_ZN9TestClassC2Ev(ptr noundef nonnull align 4 dereferenceable(4) [[THIS1]])
644*d7c69c20SDavid Pagan // CHECK4-NEXT:    ret void
645*d7c69c20SDavid Pagan //
646*d7c69c20SDavid Pagan //
647*d7c69c20SDavid Pagan // CHECK4-LABEL: define {{[^@]+}}@_ZN9TestClassD1Ev
648*d7c69c20SDavid Pagan // CHECK4-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[THIS:%.*]]) unnamed_addr #[[ATTR2:[0-9]+]] comdat align 2 {
649*d7c69c20SDavid Pagan // CHECK4-NEXT:  entry:
650*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[THIS_ADDR:%.*]] = alloca ptr, align 8
651*d7c69c20SDavid Pagan // CHECK4-NEXT:    store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
652*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8
653*d7c69c20SDavid Pagan // CHECK4-NEXT:    call void @_ZN9TestClassD2Ev(ptr noundef nonnull align 4 dereferenceable(4) [[THIS1]]) #[[ATTR3]]
654*d7c69c20SDavid Pagan // CHECK4-NEXT:    ret void
655*d7c69c20SDavid Pagan //
656*d7c69c20SDavid Pagan //
657*d7c69c20SDavid Pagan // CHECK4-LABEL: define {{[^@]+}}@_ZN9TestClassC2Ev
658*d7c69c20SDavid Pagan // CHECK4-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[THIS:%.*]]) unnamed_addr #[[ATTR2]] comdat align 2 {
659*d7c69c20SDavid Pagan // CHECK4-NEXT:  entry:
660*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[THIS_ADDR:%.*]] = alloca ptr, align 8
661*d7c69c20SDavid Pagan // CHECK4-NEXT:    store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
662*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8
663*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[A:%.*]] = getelementptr inbounds nuw [[CLASS_TESTCLASS:%.*]], ptr [[THIS1]], i32 0, i32 0
664*d7c69c20SDavid Pagan // CHECK4-NEXT:    store i32 0, ptr [[A]], align 4
665*d7c69c20SDavid Pagan // CHECK4-NEXT:    ret void
666*d7c69c20SDavid Pagan //
667*d7c69c20SDavid Pagan //
668*d7c69c20SDavid Pagan // CHECK4-LABEL: define {{[^@]+}}@_ZN9TestClassD2Ev
669*d7c69c20SDavid Pagan // CHECK4-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[THIS:%.*]]) unnamed_addr #[[ATTR2]] comdat align 2 {
670*d7c69c20SDavid Pagan // CHECK4-NEXT:  entry:
671*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[THIS_ADDR:%.*]] = alloca ptr, align 8
672*d7c69c20SDavid Pagan // CHECK4-NEXT:    store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
673*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8
674*d7c69c20SDavid Pagan // CHECK4-NEXT:    ret void
675*d7c69c20SDavid Pagan //
676*d7c69c20SDavid Pagan //
677*d7c69c20SDavid Pagan // CHECK4-LABEL: define {{[^@]+}}@__cxx_global_var_init.1
678*d7c69c20SDavid Pagan // CHECK4-SAME: () #[[ATTR0]] personality ptr @__gxx_personality_v0 {
679*d7c69c20SDavid Pagan // CHECK4-NEXT:  entry:
680*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[EXN_SLOT:%.*]] = alloca ptr, align 8
681*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[EHSELECTOR_SLOT:%.*]] = alloca i32, align 4
682*d7c69c20SDavid Pagan // CHECK4-NEXT:    br label [[ARRAYCTOR_LOOP:%.*]]
683*d7c69c20SDavid Pagan // CHECK4:       arrayctor.loop:
684*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[ARRAYCTOR_CUR:%.*]] = phi ptr [ @tc2, [[ENTRY:%.*]] ], [ [[ARRAYCTOR_NEXT:%.*]], [[INVOKE_CONT:%.*]] ]
685*d7c69c20SDavid Pagan // CHECK4-NEXT:    invoke void @_ZN9TestClassC1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[ARRAYCTOR_CUR]])
686*d7c69c20SDavid Pagan // CHECK4-NEXT:            to label [[INVOKE_CONT]] unwind label [[LPAD:%.*]]
687*d7c69c20SDavid Pagan // CHECK4:       invoke.cont:
688*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[ARRAYCTOR_NEXT]] = getelementptr inbounds [[CLASS_TESTCLASS:%.*]], ptr [[ARRAYCTOR_CUR]], i64 1
689*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[ARRAYCTOR_DONE:%.*]] = icmp eq ptr [[ARRAYCTOR_NEXT]], getelementptr inbounds ([[CLASS_TESTCLASS]], ptr @tc2, i64 2)
690*d7c69c20SDavid Pagan // CHECK4-NEXT:    br i1 [[ARRAYCTOR_DONE]], label [[ARRAYCTOR_CONT:%.*]], label [[ARRAYCTOR_LOOP]]
691*d7c69c20SDavid Pagan // CHECK4:       arrayctor.cont:
692*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP0:%.*]] = call i32 @__cxa_atexit(ptr @__cxx_global_array_dtor, ptr null, ptr @__dso_handle) #[[ATTR3]]
693*d7c69c20SDavid Pagan // CHECK4-NEXT:    ret void
694*d7c69c20SDavid Pagan // CHECK4:       lpad:
695*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP1:%.*]] = landingpad { ptr, i32 }
696*d7c69c20SDavid Pagan // CHECK4-NEXT:            cleanup
697*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP2:%.*]] = extractvalue { ptr, i32 } [[TMP1]], 0
698*d7c69c20SDavid Pagan // CHECK4-NEXT:    store ptr [[TMP2]], ptr [[EXN_SLOT]], align 8
699*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP3:%.*]] = extractvalue { ptr, i32 } [[TMP1]], 1
700*d7c69c20SDavid Pagan // CHECK4-NEXT:    store i32 [[TMP3]], ptr [[EHSELECTOR_SLOT]], align 4
701*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[ARRAYDESTROY_ISEMPTY:%.*]] = icmp eq ptr @tc2, [[ARRAYCTOR_CUR]]
702*d7c69c20SDavid Pagan // CHECK4-NEXT:    br i1 [[ARRAYDESTROY_ISEMPTY]], label [[ARRAYDESTROY_DONE1:%.*]], label [[ARRAYDESTROY_BODY:%.*]]
703*d7c69c20SDavid Pagan // CHECK4:       arraydestroy.body:
704*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[ARRAYDESTROY_ELEMENTPAST:%.*]] = phi ptr [ [[ARRAYCTOR_CUR]], [[LPAD]] ], [ [[ARRAYDESTROY_ELEMENT:%.*]], [[ARRAYDESTROY_BODY]] ]
705*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[ARRAYDESTROY_ELEMENT]] = getelementptr inbounds [[CLASS_TESTCLASS]], ptr [[ARRAYDESTROY_ELEMENTPAST]], i64 -1
706*d7c69c20SDavid Pagan // CHECK4-NEXT:    call void @_ZN9TestClassD1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[ARRAYDESTROY_ELEMENT]]) #[[ATTR3]]
707*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[ARRAYDESTROY_DONE:%.*]] = icmp eq ptr [[ARRAYDESTROY_ELEMENT]], @tc2
708*d7c69c20SDavid Pagan // CHECK4-NEXT:    br i1 [[ARRAYDESTROY_DONE]], label [[ARRAYDESTROY_DONE1]], label [[ARRAYDESTROY_BODY]]
709*d7c69c20SDavid Pagan // CHECK4:       arraydestroy.done1:
710*d7c69c20SDavid Pagan // CHECK4-NEXT:    br label [[EH_RESUME:%.*]]
711*d7c69c20SDavid Pagan // CHECK4:       eh.resume:
712*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[EXN:%.*]] = load ptr, ptr [[EXN_SLOT]], align 8
713*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[SEL:%.*]] = load i32, ptr [[EHSELECTOR_SLOT]], align 4
714*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[LPAD_VAL:%.*]] = insertvalue { ptr, i32 } poison, ptr [[EXN]], 0
715*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[LPAD_VAL2:%.*]] = insertvalue { ptr, i32 } [[LPAD_VAL]], i32 [[SEL]], 1
716*d7c69c20SDavid Pagan // CHECK4-NEXT:    resume { ptr, i32 } [[LPAD_VAL2]]
717*d7c69c20SDavid Pagan //
718*d7c69c20SDavid Pagan //
719*d7c69c20SDavid Pagan // CHECK4-LABEL: define {{[^@]+}}@__cxx_global_array_dtor
720*d7c69c20SDavid Pagan // CHECK4-SAME: (ptr noundef [[TMP0:%.*]]) #[[ATTR0]] {
721*d7c69c20SDavid Pagan // CHECK4-NEXT:  entry:
722*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[DOTADDR:%.*]] = alloca ptr, align 8
723*d7c69c20SDavid Pagan // CHECK4-NEXT:    store ptr [[TMP0]], ptr [[DOTADDR]], align 8
724*d7c69c20SDavid Pagan // CHECK4-NEXT:    br label [[ARRAYDESTROY_BODY:%.*]]
725*d7c69c20SDavid Pagan // CHECK4:       arraydestroy.body:
726*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[ARRAYDESTROY_ELEMENTPAST:%.*]] = phi ptr [ getelementptr inbounds ([[CLASS_TESTCLASS:%.*]], ptr @tc2, i64 2), [[ENTRY:%.*]] ], [ [[ARRAYDESTROY_ELEMENT:%.*]], [[ARRAYDESTROY_BODY]] ]
727*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[ARRAYDESTROY_ELEMENT]] = getelementptr inbounds [[CLASS_TESTCLASS]], ptr [[ARRAYDESTROY_ELEMENTPAST]], i64 -1
728*d7c69c20SDavid Pagan // CHECK4-NEXT:    call void @_ZN9TestClassD1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[ARRAYDESTROY_ELEMENT]]) #[[ATTR3]]
729*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[ARRAYDESTROY_DONE:%.*]] = icmp eq ptr [[ARRAYDESTROY_ELEMENT]], @tc2
730*d7c69c20SDavid Pagan // CHECK4-NEXT:    br i1 [[ARRAYDESTROY_DONE]], label [[ARRAYDESTROY_DONE1:%.*]], label [[ARRAYDESTROY_BODY]]
731*d7c69c20SDavid Pagan // CHECK4:       arraydestroy.done1:
732*d7c69c20SDavid Pagan // CHECK4-NEXT:    ret void
733*d7c69c20SDavid Pagan //
734*d7c69c20SDavid Pagan //
735*d7c69c20SDavid Pagan // CHECK4-LABEL: define {{[^@]+}}@_Z3foov
736*d7c69c20SDavid Pagan // CHECK4-SAME: () #[[ATTR1]] {
737*d7c69c20SDavid Pagan // CHECK4-NEXT:  entry:
738*d7c69c20SDavid Pagan // CHECK4-NEXT:    call void @_Z8mayThrowv()
739*d7c69c20SDavid Pagan // CHECK4-NEXT:    ret void
740*d7c69c20SDavid Pagan //
741*d7c69c20SDavid Pagan //
742*d7c69c20SDavid Pagan // CHECK4-LABEL: define {{[^@]+}}@main
743*d7c69c20SDavid Pagan // CHECK4-SAME: () #[[ATTR5:[0-9]+]] personality ptr @__gxx_personality_v0 {
744*d7c69c20SDavid Pagan // CHECK4-NEXT:  entry:
745*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[RETVAL:%.*]] = alloca i32, align 4
746*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[A:%.*]] = alloca i8, align 1
747*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[A2:%.*]] = alloca [2 x i8], align 1
748*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[C:%.*]] = alloca ptr, align 8
749*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[SST:%.*]] = alloca [[STRUCT_SST:%.*]], align 8
750*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[SS:%.*]] = alloca [[STRUCT_SS:%.*]], align 8
751*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[A1:%.*]] = alloca i8, align 1
752*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[C2:%.*]] = alloca [[CLASS_TESTCLASS:%.*]], align 4
753*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP:%.*]] = alloca ptr, align 8
754*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TC:%.*]] = alloca [[CLASS_TESTCLASS]], align 4
755*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[A24:%.*]] = alloca [2 x i8], align 1
756*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TC2:%.*]] = alloca [2 x %class.TestClass], align 4
757*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB2:[0-9]+]])
758*d7c69c20SDavid Pagan // CHECK4-NEXT:    store i32 0, ptr [[RETVAL]], align 4
759*d7c69c20SDavid Pagan // CHECK4-NEXT:    store ptr @tc, ptr [[C]], align 8
760*d7c69c20SDavid Pagan // CHECK4-NEXT:    call void @_ZN3SSTIdEC1Ev(ptr noundef nonnull align 8 dereferenceable(8) [[SST]])
761*d7c69c20SDavid Pagan // CHECK4-NEXT:    call void @_ZN2SSC1ERi(ptr noundef nonnull align 8 dereferenceable(24) [[SS]], ptr noundef nonnull align 4 dereferenceable(4) @tc)
762*d7c69c20SDavid Pagan // CHECK4-NEXT:    store i8 2, ptr [[A]], align 1
763*d7c69c20SDavid Pagan // CHECK4-NEXT:    store i8 2, ptr [[A]], align 1
764*d7c69c20SDavid Pagan // CHECK4-NEXT:    call void @__kmpc_barrier(ptr @[[GLOB1:[0-9]+]], i32 [[TMP0]])
765*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP1:%.*]] = load i8, ptr [[A]], align 1
766*d7c69c20SDavid Pagan // CHECK4-NEXT:    store i8 [[TMP1]], ptr [[A1]], align 1
767*d7c69c20SDavid Pagan // CHECK4-NEXT:    invoke void @_ZN9TestClassC1ERKS_(ptr noundef nonnull align 4 dereferenceable(4) [[C2]], ptr noundef nonnull align 4 dereferenceable(4) @tc)
768*d7c69c20SDavid Pagan // CHECK4-NEXT:            to label [[INVOKE_CONT:%.*]] unwind label [[TERMINATE_LPAD:%.*]]
769*d7c69c20SDavid Pagan // CHECK4:       invoke.cont:
770*d7c69c20SDavid Pagan // CHECK4-NEXT:    store ptr [[C2]], ptr [[TMP]], align 8
771*d7c69c20SDavid Pagan // CHECK4-NEXT:    invoke void @_ZN9TestClassC1ERKS_(ptr noundef nonnull align 4 dereferenceable(4) [[TC]], ptr noundef nonnull align 4 dereferenceable(4) @tc)
772*d7c69c20SDavid Pagan // CHECK4-NEXT:            to label [[INVOKE_CONT3:%.*]] unwind label [[TERMINATE_LPAD]]
773*d7c69c20SDavid Pagan // CHECK4:       invoke.cont3:
774*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[ARRAY_BEGIN:%.*]] = getelementptr inbounds [2 x %class.TestClass], ptr [[TC2]], i32 0, i32 0
775*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[ARRAYCTOR_END:%.*]] = getelementptr inbounds [[CLASS_TESTCLASS]], ptr [[ARRAY_BEGIN]], i64 2
776*d7c69c20SDavid Pagan // CHECK4-NEXT:    br label [[ARRAYCTOR_LOOP:%.*]]
777*d7c69c20SDavid Pagan // CHECK4:       arrayctor.loop:
778*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[ARRAYCTOR_CUR:%.*]] = phi ptr [ [[ARRAY_BEGIN]], [[INVOKE_CONT3]] ], [ [[ARRAYCTOR_NEXT:%.*]], [[INVOKE_CONT5:%.*]] ]
779*d7c69c20SDavid Pagan // CHECK4-NEXT:    invoke void @_ZN9TestClassC1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[ARRAYCTOR_CUR]])
780*d7c69c20SDavid Pagan // CHECK4-NEXT:            to label [[INVOKE_CONT5]] unwind label [[TERMINATE_LPAD]]
781*d7c69c20SDavid Pagan // CHECK4:       invoke.cont5:
782*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[ARRAYCTOR_NEXT]] = getelementptr inbounds [[CLASS_TESTCLASS]], ptr [[ARRAYCTOR_CUR]], i64 1
783*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[ARRAYCTOR_DONE:%.*]] = icmp eq ptr [[ARRAYCTOR_NEXT]], [[ARRAYCTOR_END]]
784*d7c69c20SDavid Pagan // CHECK4-NEXT:    br i1 [[ARRAYCTOR_DONE]], label [[ARRAYCTOR_CONT:%.*]], label [[ARRAYCTOR_LOOP]]
785*d7c69c20SDavid Pagan // CHECK4:       arrayctor.cont:
786*d7c69c20SDavid Pagan // CHECK4-NEXT:    invoke void @_Z3foov()
787*d7c69c20SDavid Pagan // CHECK4-NEXT:            to label [[INVOKE_CONT6:%.*]] unwind label [[TERMINATE_LPAD]]
788*d7c69c20SDavid Pagan // CHECK4:       invoke.cont6:
789*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[ARRAY_BEGIN7:%.*]] = getelementptr inbounds [2 x %class.TestClass], ptr [[TC2]], i32 0, i32 0
790*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP2:%.*]] = getelementptr inbounds [[CLASS_TESTCLASS]], ptr [[ARRAY_BEGIN7]], i64 2
791*d7c69c20SDavid Pagan // CHECK4-NEXT:    br label [[ARRAYDESTROY_BODY:%.*]]
792*d7c69c20SDavid Pagan // CHECK4:       arraydestroy.body:
793*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[ARRAYDESTROY_ELEMENTPAST:%.*]] = phi ptr [ [[TMP2]], [[INVOKE_CONT6]] ], [ [[ARRAYDESTROY_ELEMENT:%.*]], [[ARRAYDESTROY_BODY]] ]
794*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[ARRAYDESTROY_ELEMENT]] = getelementptr inbounds [[CLASS_TESTCLASS]], ptr [[ARRAYDESTROY_ELEMENTPAST]], i64 -1
795*d7c69c20SDavid Pagan // CHECK4-NEXT:    call void @_ZN9TestClassD1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[ARRAYDESTROY_ELEMENT]]) #[[ATTR3]]
796*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[ARRAYDESTROY_DONE:%.*]] = icmp eq ptr [[ARRAYDESTROY_ELEMENT]], [[ARRAY_BEGIN7]]
797*d7c69c20SDavid Pagan // CHECK4-NEXT:    br i1 [[ARRAYDESTROY_DONE]], label [[ARRAYDESTROY_DONE8:%.*]], label [[ARRAYDESTROY_BODY]]
798*d7c69c20SDavid Pagan // CHECK4:       arraydestroy.done8:
799*d7c69c20SDavid Pagan // CHECK4-NEXT:    call void @_ZN9TestClassD1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[TC]]) #[[ATTR3]]
800*d7c69c20SDavid Pagan // CHECK4-NEXT:    call void @_ZN9TestClassD1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[C2]]) #[[ATTR3]]
801*d7c69c20SDavid Pagan // CHECK4-NEXT:    call void @__kmpc_barrier(ptr @[[GLOB1]], i32 [[TMP0]])
802*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP3:%.*]] = load i8, ptr [[A]], align 1
803*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[CONV:%.*]] = sext i8 [[TMP3]] to i32
804*d7c69c20SDavid Pagan // CHECK4-NEXT:    ret i32 [[CONV]]
805*d7c69c20SDavid Pagan // CHECK4:       terminate.lpad:
806*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP4:%.*]] = landingpad { ptr, i32 }
807*d7c69c20SDavid Pagan // CHECK4-NEXT:            catch ptr null
808*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP5:%.*]] = extractvalue { ptr, i32 } [[TMP4]], 0
809*d7c69c20SDavid Pagan // CHECK4-NEXT:    call void @__clang_call_terminate(ptr [[TMP5]]) #[[ATTR10:[0-9]+]]
810*d7c69c20SDavid Pagan // CHECK4-NEXT:    unreachable
811*d7c69c20SDavid Pagan //
812*d7c69c20SDavid Pagan //
813*d7c69c20SDavid Pagan // CHECK4-LABEL: define {{[^@]+}}@_ZN3SSTIdEC1Ev
814*d7c69c20SDavid Pagan // CHECK4-SAME: (ptr noundef nonnull align 8 dereferenceable(8) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] comdat align 2 {
815*d7c69c20SDavid Pagan // CHECK4-NEXT:  entry:
816*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[THIS_ADDR:%.*]] = alloca ptr, align 8
817*d7c69c20SDavid Pagan // CHECK4-NEXT:    store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
818*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8
819*d7c69c20SDavid Pagan // CHECK4-NEXT:    call void @_ZN3SSTIdEC2Ev(ptr noundef nonnull align 8 dereferenceable(8) [[THIS1]])
820*d7c69c20SDavid Pagan // CHECK4-NEXT:    ret void
821*d7c69c20SDavid Pagan //
822*d7c69c20SDavid Pagan //
823*d7c69c20SDavid Pagan // CHECK4-LABEL: define {{[^@]+}}@_ZN2SSC1ERi
824*d7c69c20SDavid Pagan // CHECK4-SAME: (ptr noundef nonnull align 8 dereferenceable(24) [[THIS:%.*]], ptr noundef nonnull align 4 dereferenceable(4) [[D:%.*]]) unnamed_addr #[[ATTR1]] comdat align 2 {
825*d7c69c20SDavid Pagan // CHECK4-NEXT:  entry:
826*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[THIS_ADDR:%.*]] = alloca ptr, align 8
827*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[D_ADDR:%.*]] = alloca ptr, align 8
828*d7c69c20SDavid Pagan // CHECK4-NEXT:    store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
829*d7c69c20SDavid Pagan // CHECK4-NEXT:    store ptr [[D]], ptr [[D_ADDR]], align 8
830*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8
831*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP0:%.*]] = load ptr, ptr [[D_ADDR]], align 8
832*d7c69c20SDavid Pagan // CHECK4-NEXT:    call void @_ZN2SSC2ERi(ptr noundef nonnull align 8 dereferenceable(24) [[THIS1]], ptr noundef nonnull align 4 dereferenceable(4) [[TMP0]])
833*d7c69c20SDavid Pagan // CHECK4-NEXT:    ret void
834*d7c69c20SDavid Pagan //
835*d7c69c20SDavid Pagan //
836*d7c69c20SDavid Pagan // CHECK4-LABEL: define {{[^@]+}}@_ZN9TestClassC1ERKS_
837*d7c69c20SDavid Pagan // CHECK4-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[THIS:%.*]], ptr noundef nonnull align 4 dereferenceable(4) [[C:%.*]]) unnamed_addr #[[ATTR1]] comdat align 2 {
838*d7c69c20SDavid Pagan // CHECK4-NEXT:  entry:
839*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[THIS_ADDR:%.*]] = alloca ptr, align 8
840*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[C_ADDR:%.*]] = alloca ptr, align 8
841*d7c69c20SDavid Pagan // CHECK4-NEXT:    store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
842*d7c69c20SDavid Pagan // CHECK4-NEXT:    store ptr [[C]], ptr [[C_ADDR]], align 8
843*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8
844*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP0:%.*]] = load ptr, ptr [[C_ADDR]], align 8
845*d7c69c20SDavid Pagan // CHECK4-NEXT:    call void @_ZN9TestClassC2ERKS_(ptr noundef nonnull align 4 dereferenceable(4) [[THIS1]], ptr noundef nonnull align 4 dereferenceable(4) [[TMP0]])
846*d7c69c20SDavid Pagan // CHECK4-NEXT:    ret void
847*d7c69c20SDavid Pagan //
848*d7c69c20SDavid Pagan //
849*d7c69c20SDavid Pagan // CHECK4-LABEL: define {{[^@]+}}@__clang_call_terminate
850*d7c69c20SDavid Pagan // CHECK4-SAME: (ptr noundef [[TMP0:%.*]]) #[[ATTR7:[0-9]+]] comdat {
851*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP2:%.*]] = call ptr @__cxa_begin_catch(ptr [[TMP0]]) #[[ATTR3]]
852*d7c69c20SDavid Pagan // CHECK4-NEXT:    call void @_ZSt9terminatev() #[[ATTR10]]
853*d7c69c20SDavid Pagan // CHECK4-NEXT:    unreachable
854*d7c69c20SDavid Pagan //
855*d7c69c20SDavid Pagan //
856*d7c69c20SDavid Pagan // CHECK4-LABEL: define {{[^@]+}}@_ZN3SSTIdEC2Ev
857*d7c69c20SDavid Pagan // CHECK4-SAME: (ptr noundef nonnull align 8 dereferenceable(8) [[THIS:%.*]]) unnamed_addr #[[ATTR2]] comdat align 2 {
858*d7c69c20SDavid Pagan // CHECK4-NEXT:  entry:
859*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[THIS_ADDR:%.*]] = alloca ptr, align 8
860*d7c69c20SDavid Pagan // CHECK4-NEXT:    store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
861*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8
862*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[A:%.*]] = getelementptr inbounds nuw [[STRUCT_SST:%.*]], ptr [[THIS1]], i32 0, i32 0
863*d7c69c20SDavid Pagan // CHECK4-NEXT:    store double 0.000000e+00, ptr [[A]], align 8
864*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP0:%.*]] = load ptr, ptr @omp_cgroup_mem_alloc, align 8
865*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP1:%.*]] = load ptr, ptr @omp_null_allocator, align 8
866*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP2:%.*]] = load ptr, ptr @omp_default_mem_alloc, align 8
867*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP3:%.*]] = load ptr, ptr @omp_large_cap_mem_alloc, align 8
868*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP4:%.*]] = load ptr, ptr @omp_const_mem_alloc, align 8
869*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP5:%.*]] = load ptr, ptr @omp_high_bw_mem_alloc, align 8
870*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP6:%.*]] = load ptr, ptr @omp_low_lat_mem_alloc, align 8
871*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP7:%.*]] = load ptr, ptr @omp_pteam_mem_alloc, align 8
872*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP8:%.*]] = load ptr, ptr @omp_thread_mem_alloc, align 8
873*d7c69c20SDavid Pagan // CHECK4-NEXT:    call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN3SSTIdEC1Ev_l70(ptr [[THIS1]], ptr [[TMP0]], ptr [[TMP1]], ptr [[TMP2]], ptr [[TMP3]], ptr [[TMP4]], ptr [[TMP5]], ptr [[TMP6]], ptr [[TMP7]], ptr [[TMP8]]) #[[ATTR3]]
874*d7c69c20SDavid Pagan // CHECK4-NEXT:    ret void
875*d7c69c20SDavid Pagan //
876*d7c69c20SDavid Pagan //
877*d7c69c20SDavid Pagan // CHECK4-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN3SSTIdEC1Ev_l70
878*d7c69c20SDavid Pagan // CHECK4-SAME: (ptr noundef [[THIS:%.*]], ptr noundef [[OMP_CGROUP_MEM_ALLOC:%.*]], ptr noundef [[OMP_NULL_ALLOCATOR:%.*]], ptr noundef [[OMP_DEFAULT_MEM_ALLOC:%.*]], ptr noundef [[OMP_LARGE_CAP_MEM_ALLOC:%.*]], ptr noundef [[OMP_CONST_MEM_ALLOC:%.*]], ptr noundef [[OMP_HIGH_BW_MEM_ALLOC:%.*]], ptr noundef [[OMP_LOW_LAT_MEM_ALLOC:%.*]], ptr noundef [[OMP_PTEAM_MEM_ALLOC:%.*]], ptr noundef [[OMP_THREAD_MEM_ALLOC:%.*]]) #[[ATTR8:[0-9]+]] {
879*d7c69c20SDavid Pagan // CHECK4-NEXT:  entry:
880*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[THIS_ADDR:%.*]] = alloca ptr, align 8
881*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[OMP_CGROUP_MEM_ALLOC_ADDR:%.*]] = alloca ptr, align 8
882*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[OMP_NULL_ALLOCATOR_ADDR:%.*]] = alloca ptr, align 8
883*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[OMP_DEFAULT_MEM_ALLOC_ADDR:%.*]] = alloca ptr, align 8
884*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[OMP_LARGE_CAP_MEM_ALLOC_ADDR:%.*]] = alloca ptr, align 8
885*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[OMP_CONST_MEM_ALLOC_ADDR:%.*]] = alloca ptr, align 8
886*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[OMP_HIGH_BW_MEM_ALLOC_ADDR:%.*]] = alloca ptr, align 8
887*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[OMP_LOW_LAT_MEM_ALLOC_ADDR:%.*]] = alloca ptr, align 8
888*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[OMP_PTEAM_MEM_ALLOC_ADDR:%.*]] = alloca ptr, align 8
889*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[OMP_THREAD_MEM_ALLOC_ADDR:%.*]] = alloca ptr, align 8
890*d7c69c20SDavid Pagan // CHECK4-NEXT:    store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
891*d7c69c20SDavid Pagan // CHECK4-NEXT:    store ptr [[OMP_CGROUP_MEM_ALLOC]], ptr [[OMP_CGROUP_MEM_ALLOC_ADDR]], align 8
892*d7c69c20SDavid Pagan // CHECK4-NEXT:    store ptr [[OMP_NULL_ALLOCATOR]], ptr [[OMP_NULL_ALLOCATOR_ADDR]], align 8
893*d7c69c20SDavid Pagan // CHECK4-NEXT:    store ptr [[OMP_DEFAULT_MEM_ALLOC]], ptr [[OMP_DEFAULT_MEM_ALLOC_ADDR]], align 8
894*d7c69c20SDavid Pagan // CHECK4-NEXT:    store ptr [[OMP_LARGE_CAP_MEM_ALLOC]], ptr [[OMP_LARGE_CAP_MEM_ALLOC_ADDR]], align 8
895*d7c69c20SDavid Pagan // CHECK4-NEXT:    store ptr [[OMP_CONST_MEM_ALLOC]], ptr [[OMP_CONST_MEM_ALLOC_ADDR]], align 8
896*d7c69c20SDavid Pagan // CHECK4-NEXT:    store ptr [[OMP_HIGH_BW_MEM_ALLOC]], ptr [[OMP_HIGH_BW_MEM_ALLOC_ADDR]], align 8
897*d7c69c20SDavid Pagan // CHECK4-NEXT:    store ptr [[OMP_LOW_LAT_MEM_ALLOC]], ptr [[OMP_LOW_LAT_MEM_ALLOC_ADDR]], align 8
898*d7c69c20SDavid Pagan // CHECK4-NEXT:    store ptr [[OMP_PTEAM_MEM_ALLOC]], ptr [[OMP_PTEAM_MEM_ALLOC_ADDR]], align 8
899*d7c69c20SDavid Pagan // CHECK4-NEXT:    store ptr [[OMP_THREAD_MEM_ALLOC]], ptr [[OMP_THREAD_MEM_ALLOC_ADDR]], align 8
900*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP0:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8
901*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP1:%.*]] = load ptr, ptr [[OMP_CGROUP_MEM_ALLOC_ADDR]], align 8
902*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP2:%.*]] = load ptr, ptr [[OMP_NULL_ALLOCATOR_ADDR]], align 8
903*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP3:%.*]] = load ptr, ptr [[OMP_DEFAULT_MEM_ALLOC_ADDR]], align 8
904*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP4:%.*]] = load ptr, ptr [[OMP_LARGE_CAP_MEM_ALLOC_ADDR]], align 8
905*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP5:%.*]] = load ptr, ptr [[OMP_CONST_MEM_ALLOC_ADDR]], align 8
906*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP6:%.*]] = load ptr, ptr [[OMP_HIGH_BW_MEM_ALLOC_ADDR]], align 8
907*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP7:%.*]] = load ptr, ptr [[OMP_LOW_LAT_MEM_ALLOC_ADDR]], align 8
908*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP8:%.*]] = load ptr, ptr [[OMP_PTEAM_MEM_ALLOC_ADDR]], align 8
909*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP9:%.*]] = load ptr, ptr [[OMP_THREAD_MEM_ALLOC_ADDR]], align 8
910*d7c69c20SDavid Pagan // CHECK4-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_teams(ptr @[[GLOB2]], i32 10, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN3SSTIdEC1Ev_l70.omp_outlined, ptr [[TMP0]], ptr [[TMP1]], ptr [[TMP2]], ptr [[TMP3]], ptr [[TMP4]], ptr [[TMP5]], ptr [[TMP6]], ptr [[TMP7]], ptr [[TMP8]], ptr [[TMP9]])
911*d7c69c20SDavid Pagan // CHECK4-NEXT:    ret void
912*d7c69c20SDavid Pagan //
913*d7c69c20SDavid Pagan //
914*d7c69c20SDavid Pagan // CHECK4-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN3SSTIdEC1Ev_l70.omp_outlined
915*d7c69c20SDavid Pagan // CHECK4-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], ptr noundef [[THIS:%.*]], ptr noundef [[OMP_CGROUP_MEM_ALLOC:%.*]], ptr noundef [[OMP_NULL_ALLOCATOR:%.*]], ptr noundef [[OMP_DEFAULT_MEM_ALLOC:%.*]], ptr noundef [[OMP_LARGE_CAP_MEM_ALLOC:%.*]], ptr noundef [[OMP_CONST_MEM_ALLOC:%.*]], ptr noundef [[OMP_HIGH_BW_MEM_ALLOC:%.*]], ptr noundef [[OMP_LOW_LAT_MEM_ALLOC:%.*]], ptr noundef [[OMP_PTEAM_MEM_ALLOC:%.*]], ptr noundef [[OMP_THREAD_MEM_ALLOC:%.*]]) #[[ATTR8]] {
916*d7c69c20SDavid Pagan // CHECK4-NEXT:  entry:
917*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 8
918*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 8
919*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[THIS_ADDR:%.*]] = alloca ptr, align 8
920*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[OMP_CGROUP_MEM_ALLOC_ADDR:%.*]] = alloca ptr, align 8
921*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[OMP_NULL_ALLOCATOR_ADDR:%.*]] = alloca ptr, align 8
922*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[OMP_DEFAULT_MEM_ALLOC_ADDR:%.*]] = alloca ptr, align 8
923*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[OMP_LARGE_CAP_MEM_ALLOC_ADDR:%.*]] = alloca ptr, align 8
924*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[OMP_CONST_MEM_ALLOC_ADDR:%.*]] = alloca ptr, align 8
925*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[OMP_HIGH_BW_MEM_ALLOC_ADDR:%.*]] = alloca ptr, align 8
926*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[OMP_LOW_LAT_MEM_ALLOC_ADDR:%.*]] = alloca ptr, align 8
927*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[OMP_PTEAM_MEM_ALLOC_ADDR:%.*]] = alloca ptr, align 8
928*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[OMP_THREAD_MEM_ALLOC_ADDR:%.*]] = alloca ptr, align 8
929*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[A:%.*]] = alloca ptr, align 8
930*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[A_CASTED:%.*]] = alloca i64, align 8
931*d7c69c20SDavid Pagan // CHECK4-NEXT:    store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 8
932*d7c69c20SDavid Pagan // CHECK4-NEXT:    store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 8
933*d7c69c20SDavid Pagan // CHECK4-NEXT:    store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
934*d7c69c20SDavid Pagan // CHECK4-NEXT:    store ptr [[OMP_CGROUP_MEM_ALLOC]], ptr [[OMP_CGROUP_MEM_ALLOC_ADDR]], align 8
935*d7c69c20SDavid Pagan // CHECK4-NEXT:    store ptr [[OMP_NULL_ALLOCATOR]], ptr [[OMP_NULL_ALLOCATOR_ADDR]], align 8
936*d7c69c20SDavid Pagan // CHECK4-NEXT:    store ptr [[OMP_DEFAULT_MEM_ALLOC]], ptr [[OMP_DEFAULT_MEM_ALLOC_ADDR]], align 8
937*d7c69c20SDavid Pagan // CHECK4-NEXT:    store ptr [[OMP_LARGE_CAP_MEM_ALLOC]], ptr [[OMP_LARGE_CAP_MEM_ALLOC_ADDR]], align 8
938*d7c69c20SDavid Pagan // CHECK4-NEXT:    store ptr [[OMP_CONST_MEM_ALLOC]], ptr [[OMP_CONST_MEM_ALLOC_ADDR]], align 8
939*d7c69c20SDavid Pagan // CHECK4-NEXT:    store ptr [[OMP_HIGH_BW_MEM_ALLOC]], ptr [[OMP_HIGH_BW_MEM_ALLOC_ADDR]], align 8
940*d7c69c20SDavid Pagan // CHECK4-NEXT:    store ptr [[OMP_LOW_LAT_MEM_ALLOC]], ptr [[OMP_LOW_LAT_MEM_ALLOC_ADDR]], align 8
941*d7c69c20SDavid Pagan // CHECK4-NEXT:    store ptr [[OMP_PTEAM_MEM_ALLOC]], ptr [[OMP_PTEAM_MEM_ALLOC_ADDR]], align 8
942*d7c69c20SDavid Pagan // CHECK4-NEXT:    store ptr [[OMP_THREAD_MEM_ALLOC]], ptr [[OMP_THREAD_MEM_ALLOC_ADDR]], align 8
943*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP0:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8
944*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[A1:%.*]] = getelementptr inbounds nuw [[STRUCT_SST:%.*]], ptr [[TMP0]], i32 0, i32 0
945*d7c69c20SDavid Pagan // CHECK4-NEXT:    store ptr [[A1]], ptr [[A]], align 8
946*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP1:%.*]] = load ptr, ptr [[A]], align 8
947*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP2:%.*]] = load double, ptr [[TMP1]], align 8
948*d7c69c20SDavid Pagan // CHECK4-NEXT:    store double [[TMP2]], ptr [[A_CASTED]], align 8
949*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP3:%.*]] = load i64, ptr [[A_CASTED]], align 8
950*d7c69c20SDavid Pagan // CHECK4-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB2]], i32 11, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN3SSTIdEC1Ev_l70.omp_outlined.omp_outlined, ptr [[TMP0]], ptr [[OMP_CGROUP_MEM_ALLOC_ADDR]], ptr [[OMP_NULL_ALLOCATOR_ADDR]], ptr [[OMP_DEFAULT_MEM_ALLOC_ADDR]], ptr [[OMP_LARGE_CAP_MEM_ALLOC_ADDR]], ptr [[OMP_CONST_MEM_ALLOC_ADDR]], ptr [[OMP_HIGH_BW_MEM_ALLOC_ADDR]], ptr [[OMP_LOW_LAT_MEM_ALLOC_ADDR]], ptr [[OMP_PTEAM_MEM_ALLOC_ADDR]], ptr [[OMP_THREAD_MEM_ALLOC_ADDR]], i64 [[TMP3]])
951*d7c69c20SDavid Pagan // CHECK4-NEXT:    ret void
952*d7c69c20SDavid Pagan //
953*d7c69c20SDavid Pagan //
954*d7c69c20SDavid Pagan // CHECK4-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN3SSTIdEC1Ev_l70.omp_outlined.omp_outlined
955*d7c69c20SDavid Pagan // CHECK4-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], ptr noundef [[THIS:%.*]], ptr noundef nonnull align 8 dereferenceable(8) [[OMP_CGROUP_MEM_ALLOC:%.*]], ptr noundef nonnull align 8 dereferenceable(8) [[OMP_NULL_ALLOCATOR:%.*]], ptr noundef nonnull align 8 dereferenceable(8) [[OMP_DEFAULT_MEM_ALLOC:%.*]], ptr noundef nonnull align 8 dereferenceable(8) [[OMP_LARGE_CAP_MEM_ALLOC:%.*]], ptr noundef nonnull align 8 dereferenceable(8) [[OMP_CONST_MEM_ALLOC:%.*]], ptr noundef nonnull align 8 dereferenceable(8) [[OMP_HIGH_BW_MEM_ALLOC:%.*]], ptr noundef nonnull align 8 dereferenceable(8) [[OMP_LOW_LAT_MEM_ALLOC:%.*]], ptr noundef nonnull align 8 dereferenceable(8) [[OMP_PTEAM_MEM_ALLOC:%.*]], ptr noundef nonnull align 8 dereferenceable(8) [[OMP_THREAD_MEM_ALLOC:%.*]], i64 noundef [[A:%.*]]) #[[ATTR8]] personality ptr @__gxx_personality_v0 {
956*d7c69c20SDavid Pagan // CHECK4-NEXT:  entry:
957*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 8
958*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 8
959*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[THIS_ADDR:%.*]] = alloca ptr, align 8
960*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[OMP_CGROUP_MEM_ALLOC_ADDR:%.*]] = alloca ptr, align 8
961*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[OMP_NULL_ALLOCATOR_ADDR:%.*]] = alloca ptr, align 8
962*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[OMP_DEFAULT_MEM_ALLOC_ADDR:%.*]] = alloca ptr, align 8
963*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[OMP_LARGE_CAP_MEM_ALLOC_ADDR:%.*]] = alloca ptr, align 8
964*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[OMP_CONST_MEM_ALLOC_ADDR:%.*]] = alloca ptr, align 8
965*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[OMP_HIGH_BW_MEM_ALLOC_ADDR:%.*]] = alloca ptr, align 8
966*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[OMP_LOW_LAT_MEM_ALLOC_ADDR:%.*]] = alloca ptr, align 8
967*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[OMP_PTEAM_MEM_ALLOC_ADDR:%.*]] = alloca ptr, align 8
968*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[OMP_THREAD_MEM_ALLOC_ADDR:%.*]] = alloca ptr, align 8
969*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[A_ADDR:%.*]] = alloca i64, align 8
970*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP:%.*]] = alloca ptr, align 8
971*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[A1:%.*]] = alloca double, align 8
972*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[_TMP2:%.*]] = alloca ptr, align 8
973*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[REF_TMP:%.*]] = alloca [[CLASS_ANON:%.*]], align 8
974*d7c69c20SDavid Pagan // CHECK4-NEXT:    store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 8
975*d7c69c20SDavid Pagan // CHECK4-NEXT:    store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 8
976*d7c69c20SDavid Pagan // CHECK4-NEXT:    store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
977*d7c69c20SDavid Pagan // CHECK4-NEXT:    store ptr [[OMP_CGROUP_MEM_ALLOC]], ptr [[OMP_CGROUP_MEM_ALLOC_ADDR]], align 8
978*d7c69c20SDavid Pagan // CHECK4-NEXT:    store ptr [[OMP_NULL_ALLOCATOR]], ptr [[OMP_NULL_ALLOCATOR_ADDR]], align 8
979*d7c69c20SDavid Pagan // CHECK4-NEXT:    store ptr [[OMP_DEFAULT_MEM_ALLOC]], ptr [[OMP_DEFAULT_MEM_ALLOC_ADDR]], align 8
980*d7c69c20SDavid Pagan // CHECK4-NEXT:    store ptr [[OMP_LARGE_CAP_MEM_ALLOC]], ptr [[OMP_LARGE_CAP_MEM_ALLOC_ADDR]], align 8
981*d7c69c20SDavid Pagan // CHECK4-NEXT:    store ptr [[OMP_CONST_MEM_ALLOC]], ptr [[OMP_CONST_MEM_ALLOC_ADDR]], align 8
982*d7c69c20SDavid Pagan // CHECK4-NEXT:    store ptr [[OMP_HIGH_BW_MEM_ALLOC]], ptr [[OMP_HIGH_BW_MEM_ALLOC_ADDR]], align 8
983*d7c69c20SDavid Pagan // CHECK4-NEXT:    store ptr [[OMP_LOW_LAT_MEM_ALLOC]], ptr [[OMP_LOW_LAT_MEM_ALLOC_ADDR]], align 8
984*d7c69c20SDavid Pagan // CHECK4-NEXT:    store ptr [[OMP_PTEAM_MEM_ALLOC]], ptr [[OMP_PTEAM_MEM_ALLOC_ADDR]], align 8
985*d7c69c20SDavid Pagan // CHECK4-NEXT:    store ptr [[OMP_THREAD_MEM_ALLOC]], ptr [[OMP_THREAD_MEM_ALLOC_ADDR]], align 8
986*d7c69c20SDavid Pagan // CHECK4-NEXT:    store i64 [[A]], ptr [[A_ADDR]], align 8
987*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP0:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8
988*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP1:%.*]] = load ptr, ptr [[OMP_CGROUP_MEM_ALLOC_ADDR]], align 8
989*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP2:%.*]] = load ptr, ptr [[OMP_NULL_ALLOCATOR_ADDR]], align 8
990*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP3:%.*]] = load ptr, ptr [[OMP_DEFAULT_MEM_ALLOC_ADDR]], align 8
991*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP4:%.*]] = load ptr, ptr [[OMP_LARGE_CAP_MEM_ALLOC_ADDR]], align 8
992*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP5:%.*]] = load ptr, ptr [[OMP_CONST_MEM_ALLOC_ADDR]], align 8
993*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP6:%.*]] = load ptr, ptr [[OMP_HIGH_BW_MEM_ALLOC_ADDR]], align 8
994*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP7:%.*]] = load ptr, ptr [[OMP_LOW_LAT_MEM_ALLOC_ADDR]], align 8
995*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP8:%.*]] = load ptr, ptr [[OMP_PTEAM_MEM_ALLOC_ADDR]], align 8
996*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP9:%.*]] = load ptr, ptr [[OMP_THREAD_MEM_ALLOC_ADDR]], align 8
997*d7c69c20SDavid Pagan // CHECK4-NEXT:    store ptr [[A_ADDR]], ptr [[TMP]], align 8
998*d7c69c20SDavid Pagan // CHECK4-NEXT:    store ptr [[A1]], ptr [[_TMP2]], align 8
999*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP10:%.*]] = getelementptr inbounds nuw [[CLASS_ANON]], ptr [[REF_TMP]], i32 0, i32 0
1000*d7c69c20SDavid Pagan // CHECK4-NEXT:    store ptr [[TMP0]], ptr [[TMP10]], align 8
1001*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP11:%.*]] = getelementptr inbounds nuw [[CLASS_ANON]], ptr [[REF_TMP]], i32 0, i32 1
1002*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP12:%.*]] = load ptr, ptr [[_TMP2]], align 8
1003*d7c69c20SDavid Pagan // CHECK4-NEXT:    store ptr [[TMP12]], ptr [[TMP11]], align 8
1004*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP13:%.*]] = getelementptr inbounds nuw [[CLASS_ANON]], ptr [[REF_TMP]], i32 0, i32 2
1005*d7c69c20SDavid Pagan // CHECK4-NEXT:    store ptr [[TMP1]], ptr [[TMP13]], align 8
1006*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP14:%.*]] = getelementptr inbounds nuw [[CLASS_ANON]], ptr [[REF_TMP]], i32 0, i32 3
1007*d7c69c20SDavid Pagan // CHECK4-NEXT:    store ptr [[TMP2]], ptr [[TMP14]], align 8
1008*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP15:%.*]] = getelementptr inbounds nuw [[CLASS_ANON]], ptr [[REF_TMP]], i32 0, i32 4
1009*d7c69c20SDavid Pagan // CHECK4-NEXT:    store ptr [[TMP3]], ptr [[TMP15]], align 8
1010*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP16:%.*]] = getelementptr inbounds nuw [[CLASS_ANON]], ptr [[REF_TMP]], i32 0, i32 5
1011*d7c69c20SDavid Pagan // CHECK4-NEXT:    store ptr [[TMP4]], ptr [[TMP16]], align 8
1012*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP17:%.*]] = getelementptr inbounds nuw [[CLASS_ANON]], ptr [[REF_TMP]], i32 0, i32 6
1013*d7c69c20SDavid Pagan // CHECK4-NEXT:    store ptr [[TMP5]], ptr [[TMP17]], align 8
1014*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP18:%.*]] = getelementptr inbounds nuw [[CLASS_ANON]], ptr [[REF_TMP]], i32 0, i32 7
1015*d7c69c20SDavid Pagan // CHECK4-NEXT:    store ptr [[TMP6]], ptr [[TMP18]], align 8
1016*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP19:%.*]] = getelementptr inbounds nuw [[CLASS_ANON]], ptr [[REF_TMP]], i32 0, i32 8
1017*d7c69c20SDavid Pagan // CHECK4-NEXT:    store ptr [[TMP7]], ptr [[TMP19]], align 8
1018*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP20:%.*]] = getelementptr inbounds nuw [[CLASS_ANON]], ptr [[REF_TMP]], i32 0, i32 9
1019*d7c69c20SDavid Pagan // CHECK4-NEXT:    store ptr [[TMP8]], ptr [[TMP20]], align 8
1020*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP21:%.*]] = getelementptr inbounds nuw [[CLASS_ANON]], ptr [[REF_TMP]], i32 0, i32 10
1021*d7c69c20SDavid Pagan // CHECK4-NEXT:    store ptr [[TMP9]], ptr [[TMP21]], align 8
1022*d7c69c20SDavid Pagan // CHECK4-NEXT:    invoke void @_ZZN3SSTIdEC1EvENKUlvE_clEv(ptr noundef nonnull align 8 dereferenceable(88) [[REF_TMP]])
1023*d7c69c20SDavid Pagan // CHECK4-NEXT:            to label [[INVOKE_CONT:%.*]] unwind label [[TERMINATE_LPAD:%.*]]
1024*d7c69c20SDavid Pagan // CHECK4:       invoke.cont:
1025*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP22:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8
1026*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP23:%.*]] = load i32, ptr [[TMP22]], align 4
1027*d7c69c20SDavid Pagan // CHECK4-NEXT:    call void @__kmpc_barrier(ptr @[[GLOB1]], i32 [[TMP23]])
1028*d7c69c20SDavid Pagan // CHECK4-NEXT:    ret void
1029*d7c69c20SDavid Pagan // CHECK4:       terminate.lpad:
1030*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP24:%.*]] = landingpad { ptr, i32 }
1031*d7c69c20SDavid Pagan // CHECK4-NEXT:            catch ptr null
1032*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP25:%.*]] = extractvalue { ptr, i32 } [[TMP24]], 0
1033*d7c69c20SDavid Pagan // CHECK4-NEXT:    call void @__clang_call_terminate(ptr [[TMP25]]) #[[ATTR10]]
1034*d7c69c20SDavid Pagan // CHECK4-NEXT:    unreachable
1035*d7c69c20SDavid Pagan //
1036*d7c69c20SDavid Pagan //
1037*d7c69c20SDavid Pagan // CHECK4-LABEL: define {{[^@]+}}@_ZZN3SSTIdEC1EvENKUlvE_clEv
1038*d7c69c20SDavid Pagan // CHECK4-SAME: (ptr noundef nonnull align 8 dereferenceable(88) [[THIS:%.*]]) #[[ATTR1]] align 2 {
1039*d7c69c20SDavid Pagan // CHECK4-NEXT:  entry:
1040*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[THIS_ADDR:%.*]] = alloca ptr, align 8
1041*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[REF_TMP:%.*]] = alloca [[CLASS_ANON_0:%.*]], align 8
1042*d7c69c20SDavid Pagan // CHECK4-NEXT:    store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
1043*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8
1044*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP0:%.*]] = getelementptr inbounds nuw [[CLASS_ANON:%.*]], ptr [[THIS1]], i32 0, i32 0
1045*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP1:%.*]] = load ptr, ptr [[TMP0]], align 8
1046*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP2:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_0]], ptr [[REF_TMP]], i32 0, i32 0
1047*d7c69c20SDavid Pagan // CHECK4-NEXT:    store ptr [[TMP1]], ptr [[TMP2]], align 8
1048*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP3:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_0]], ptr [[REF_TMP]], i32 0, i32 1
1049*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP4:%.*]] = getelementptr inbounds nuw [[CLASS_ANON]], ptr [[THIS1]], i32 0, i32 1
1050*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP5:%.*]] = load ptr, ptr [[TMP4]], align 8
1051*d7c69c20SDavid Pagan // CHECK4-NEXT:    store ptr [[TMP5]], ptr [[TMP3]], align 8
1052*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP6:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_0]], ptr [[REF_TMP]], i32 0, i32 2
1053*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP7:%.*]] = getelementptr inbounds nuw [[CLASS_ANON]], ptr [[THIS1]], i32 0, i32 2
1054*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP8:%.*]] = load ptr, ptr [[TMP7]], align 8
1055*d7c69c20SDavid Pagan // CHECK4-NEXT:    store ptr [[TMP8]], ptr [[TMP6]], align 8
1056*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP9:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_0]], ptr [[REF_TMP]], i32 0, i32 3
1057*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP10:%.*]] = getelementptr inbounds nuw [[CLASS_ANON]], ptr [[THIS1]], i32 0, i32 3
1058*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP11:%.*]] = load ptr, ptr [[TMP10]], align 8
1059*d7c69c20SDavid Pagan // CHECK4-NEXT:    store ptr [[TMP11]], ptr [[TMP9]], align 8
1060*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP12:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_0]], ptr [[REF_TMP]], i32 0, i32 4
1061*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP13:%.*]] = getelementptr inbounds nuw [[CLASS_ANON]], ptr [[THIS1]], i32 0, i32 4
1062*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP14:%.*]] = load ptr, ptr [[TMP13]], align 8
1063*d7c69c20SDavid Pagan // CHECK4-NEXT:    store ptr [[TMP14]], ptr [[TMP12]], align 8
1064*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP15:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_0]], ptr [[REF_TMP]], i32 0, i32 5
1065*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP16:%.*]] = getelementptr inbounds nuw [[CLASS_ANON]], ptr [[THIS1]], i32 0, i32 5
1066*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP17:%.*]] = load ptr, ptr [[TMP16]], align 8
1067*d7c69c20SDavid Pagan // CHECK4-NEXT:    store ptr [[TMP17]], ptr [[TMP15]], align 8
1068*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP18:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_0]], ptr [[REF_TMP]], i32 0, i32 6
1069*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP19:%.*]] = getelementptr inbounds nuw [[CLASS_ANON]], ptr [[THIS1]], i32 0, i32 6
1070*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP20:%.*]] = load ptr, ptr [[TMP19]], align 8
1071*d7c69c20SDavid Pagan // CHECK4-NEXT:    store ptr [[TMP20]], ptr [[TMP18]], align 8
1072*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP21:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_0]], ptr [[REF_TMP]], i32 0, i32 7
1073*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP22:%.*]] = getelementptr inbounds nuw [[CLASS_ANON]], ptr [[THIS1]], i32 0, i32 7
1074*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP23:%.*]] = load ptr, ptr [[TMP22]], align 8
1075*d7c69c20SDavid Pagan // CHECK4-NEXT:    store ptr [[TMP23]], ptr [[TMP21]], align 8
1076*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP24:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_0]], ptr [[REF_TMP]], i32 0, i32 8
1077*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP25:%.*]] = getelementptr inbounds nuw [[CLASS_ANON]], ptr [[THIS1]], i32 0, i32 8
1078*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP26:%.*]] = load ptr, ptr [[TMP25]], align 8
1079*d7c69c20SDavid Pagan // CHECK4-NEXT:    store ptr [[TMP26]], ptr [[TMP24]], align 8
1080*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP27:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_0]], ptr [[REF_TMP]], i32 0, i32 9
1081*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP28:%.*]] = getelementptr inbounds nuw [[CLASS_ANON]], ptr [[THIS1]], i32 0, i32 9
1082*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP29:%.*]] = load ptr, ptr [[TMP28]], align 8
1083*d7c69c20SDavid Pagan // CHECK4-NEXT:    store ptr [[TMP29]], ptr [[TMP27]], align 8
1084*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP30:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_0]], ptr [[REF_TMP]], i32 0, i32 10
1085*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP31:%.*]] = getelementptr inbounds nuw [[CLASS_ANON]], ptr [[THIS1]], i32 0, i32 10
1086*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP32:%.*]] = load ptr, ptr [[TMP31]], align 8
1087*d7c69c20SDavid Pagan // CHECK4-NEXT:    store ptr [[TMP32]], ptr [[TMP30]], align 8
1088*d7c69c20SDavid Pagan // CHECK4-NEXT:    call void @_ZZZN3SSTIdEC1EvENKUlvE_clEvENKUlvE_clEv(ptr noundef nonnull align 8 dereferenceable(88) [[REF_TMP]])
1089*d7c69c20SDavid Pagan // CHECK4-NEXT:    ret void
1090*d7c69c20SDavid Pagan //
1091*d7c69c20SDavid Pagan //
1092*d7c69c20SDavid Pagan // CHECK4-LABEL: define {{[^@]+}}@_ZZZN3SSTIdEC1EvENKUlvE_clEvENKUlvE_clEv
1093*d7c69c20SDavid Pagan // CHECK4-SAME: (ptr noundef nonnull align 8 dereferenceable(88) [[THIS:%.*]]) #[[ATTR2]] align 2 {
1094*d7c69c20SDavid Pagan // CHECK4-NEXT:  entry:
1095*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[THIS_ADDR:%.*]] = alloca ptr, align 8
1096*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[C:%.*]] = alloca i32, align 4
1097*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[A_CASTED:%.*]] = alloca i64, align 8
1098*d7c69c20SDavid Pagan // CHECK4-NEXT:    store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
1099*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8
1100*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP0:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_0:%.*]], ptr [[THIS1]], i32 0, i32 0
1101*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP1:%.*]] = load ptr, ptr [[TMP0]], align 8
1102*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP2:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_0]], ptr [[THIS1]], i32 0, i32 1
1103*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP3:%.*]] = load ptr, ptr [[TMP2]], align 8
1104*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP4:%.*]] = load double, ptr [[TMP3]], align 8
1105*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[INC:%.*]] = fadd double [[TMP4]], 1.000000e+00
1106*d7c69c20SDavid Pagan // CHECK4-NEXT:    store double [[INC]], ptr [[TMP3]], align 8
1107*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP5:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_0]], ptr [[THIS1]], i32 0, i32 2
1108*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP6:%.*]] = load ptr, ptr [[TMP5]], align 8
1109*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP7:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_0]], ptr [[THIS1]], i32 0, i32 1
1110*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP8:%.*]] = load ptr, ptr [[TMP7]], align 8
1111*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP9:%.*]] = load double, ptr [[TMP8]], align 8
1112*d7c69c20SDavid Pagan // CHECK4-NEXT:    store double [[TMP9]], ptr [[A_CASTED]], align 8
1113*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP10:%.*]] = load i64, ptr [[A_CASTED]], align 8
1114*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP11:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_0]], ptr [[THIS1]], i32 0, i32 3
1115*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP12:%.*]] = load ptr, ptr [[TMP11]], align 8
1116*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP13:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_0]], ptr [[THIS1]], i32 0, i32 4
1117*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP14:%.*]] = load ptr, ptr [[TMP13]], align 8
1118*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP15:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_0]], ptr [[THIS1]], i32 0, i32 5
1119*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP16:%.*]] = load ptr, ptr [[TMP15]], align 8
1120*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP17:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_0]], ptr [[THIS1]], i32 0, i32 6
1121*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP18:%.*]] = load ptr, ptr [[TMP17]], align 8
1122*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP19:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_0]], ptr [[THIS1]], i32 0, i32 7
1123*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP20:%.*]] = load ptr, ptr [[TMP19]], align 8
1124*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP21:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_0]], ptr [[THIS1]], i32 0, i32 8
1125*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP22:%.*]] = load ptr, ptr [[TMP21]], align 8
1126*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP23:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_0]], ptr [[THIS1]], i32 0, i32 9
1127*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP24:%.*]] = load ptr, ptr [[TMP23]], align 8
1128*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP25:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_0]], ptr [[THIS1]], i32 0, i32 10
1129*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP26:%.*]] = load ptr, ptr [[TMP25]], align 8
1130*d7c69c20SDavid Pagan // CHECK4-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB2]], i32 11, ptr @_ZZZN3SSTIdEC1EvENKUlvE_clEvENKUlvE_clEv.omp_outlined, ptr [[TMP1]], ptr [[TMP6]], i64 [[TMP10]], ptr [[TMP12]], ptr [[TMP14]], ptr [[TMP16]], ptr [[TMP18]], ptr [[TMP20]], ptr [[TMP22]], ptr [[TMP24]], ptr [[TMP26]])
1131*d7c69c20SDavid Pagan // CHECK4-NEXT:    ret void
1132*d7c69c20SDavid Pagan //
1133*d7c69c20SDavid Pagan //
1134*d7c69c20SDavid Pagan // CHECK4-LABEL: define {{[^@]+}}@_ZZZN3SSTIdEC1EvENKUlvE_clEvENKUlvE_clEv.omp_outlined
1135*d7c69c20SDavid Pagan // CHECK4-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], ptr noundef [[THIS:%.*]], ptr noundef nonnull align 8 dereferenceable(8) [[OMP_CGROUP_MEM_ALLOC:%.*]], i64 noundef [[A:%.*]], ptr noundef nonnull align 8 dereferenceable(8) [[OMP_NULL_ALLOCATOR:%.*]], ptr noundef nonnull align 8 dereferenceable(8) [[OMP_DEFAULT_MEM_ALLOC:%.*]], ptr noundef nonnull align 8 dereferenceable(8) [[OMP_LARGE_CAP_MEM_ALLOC:%.*]], ptr noundef nonnull align 8 dereferenceable(8) [[OMP_CONST_MEM_ALLOC:%.*]], ptr noundef nonnull align 8 dereferenceable(8) [[OMP_HIGH_BW_MEM_ALLOC:%.*]], ptr noundef nonnull align 8 dereferenceable(8) [[OMP_LOW_LAT_MEM_ALLOC:%.*]], ptr noundef nonnull align 8 dereferenceable(8) [[OMP_PTEAM_MEM_ALLOC:%.*]], ptr noundef nonnull align 8 dereferenceable(8) [[OMP_THREAD_MEM_ALLOC:%.*]]) #[[ATTR8]] {
1136*d7c69c20SDavid Pagan // CHECK4-NEXT:  entry:
1137*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 8
1138*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 8
1139*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[THIS_ADDR:%.*]] = alloca ptr, align 8
1140*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[OMP_CGROUP_MEM_ALLOC_ADDR:%.*]] = alloca ptr, align 8
1141*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[A_ADDR:%.*]] = alloca i64, align 8
1142*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[OMP_NULL_ALLOCATOR_ADDR:%.*]] = alloca ptr, align 8
1143*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[OMP_DEFAULT_MEM_ALLOC_ADDR:%.*]] = alloca ptr, align 8
1144*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[OMP_LARGE_CAP_MEM_ALLOC_ADDR:%.*]] = alloca ptr, align 8
1145*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[OMP_CONST_MEM_ALLOC_ADDR:%.*]] = alloca ptr, align 8
1146*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[OMP_HIGH_BW_MEM_ALLOC_ADDR:%.*]] = alloca ptr, align 8
1147*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[OMP_LOW_LAT_MEM_ALLOC_ADDR:%.*]] = alloca ptr, align 8
1148*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[OMP_PTEAM_MEM_ALLOC_ADDR:%.*]] = alloca ptr, align 8
1149*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[OMP_THREAD_MEM_ALLOC_ADDR:%.*]] = alloca ptr, align 8
1150*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP:%.*]] = alloca ptr, align 8
1151*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[_TMP1:%.*]] = alloca ptr, align 8
1152*d7c69c20SDavid Pagan // CHECK4-NEXT:    store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 8
1153*d7c69c20SDavid Pagan // CHECK4-NEXT:    store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 8
1154*d7c69c20SDavid Pagan // CHECK4-NEXT:    store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
1155*d7c69c20SDavid Pagan // CHECK4-NEXT:    store ptr [[OMP_CGROUP_MEM_ALLOC]], ptr [[OMP_CGROUP_MEM_ALLOC_ADDR]], align 8
1156*d7c69c20SDavid Pagan // CHECK4-NEXT:    store i64 [[A]], ptr [[A_ADDR]], align 8
1157*d7c69c20SDavid Pagan // CHECK4-NEXT:    store ptr [[OMP_NULL_ALLOCATOR]], ptr [[OMP_NULL_ALLOCATOR_ADDR]], align 8
1158*d7c69c20SDavid Pagan // CHECK4-NEXT:    store ptr [[OMP_DEFAULT_MEM_ALLOC]], ptr [[OMP_DEFAULT_MEM_ALLOC_ADDR]], align 8
1159*d7c69c20SDavid Pagan // CHECK4-NEXT:    store ptr [[OMP_LARGE_CAP_MEM_ALLOC]], ptr [[OMP_LARGE_CAP_MEM_ALLOC_ADDR]], align 8
1160*d7c69c20SDavid Pagan // CHECK4-NEXT:    store ptr [[OMP_CONST_MEM_ALLOC]], ptr [[OMP_CONST_MEM_ALLOC_ADDR]], align 8
1161*d7c69c20SDavid Pagan // CHECK4-NEXT:    store ptr [[OMP_HIGH_BW_MEM_ALLOC]], ptr [[OMP_HIGH_BW_MEM_ALLOC_ADDR]], align 8
1162*d7c69c20SDavid Pagan // CHECK4-NEXT:    store ptr [[OMP_LOW_LAT_MEM_ALLOC]], ptr [[OMP_LOW_LAT_MEM_ALLOC_ADDR]], align 8
1163*d7c69c20SDavid Pagan // CHECK4-NEXT:    store ptr [[OMP_PTEAM_MEM_ALLOC]], ptr [[OMP_PTEAM_MEM_ALLOC_ADDR]], align 8
1164*d7c69c20SDavid Pagan // CHECK4-NEXT:    store ptr [[OMP_THREAD_MEM_ALLOC]], ptr [[OMP_THREAD_MEM_ALLOC_ADDR]], align 8
1165*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP0:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8
1166*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP1:%.*]] = load ptr, ptr [[OMP_CGROUP_MEM_ALLOC_ADDR]], align 8
1167*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP2:%.*]] = load ptr, ptr [[OMP_NULL_ALLOCATOR_ADDR]], align 8
1168*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP3:%.*]] = load ptr, ptr [[OMP_DEFAULT_MEM_ALLOC_ADDR]], align 8
1169*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP4:%.*]] = load ptr, ptr [[OMP_LARGE_CAP_MEM_ALLOC_ADDR]], align 8
1170*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP5:%.*]] = load ptr, ptr [[OMP_CONST_MEM_ALLOC_ADDR]], align 8
1171*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP6:%.*]] = load ptr, ptr [[OMP_HIGH_BW_MEM_ALLOC_ADDR]], align 8
1172*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP7:%.*]] = load ptr, ptr [[OMP_LOW_LAT_MEM_ALLOC_ADDR]], align 8
1173*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP8:%.*]] = load ptr, ptr [[OMP_PTEAM_MEM_ALLOC_ADDR]], align 8
1174*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP9:%.*]] = load ptr, ptr [[OMP_THREAD_MEM_ALLOC_ADDR]], align 8
1175*d7c69c20SDavid Pagan // CHECK4-NEXT:    store ptr [[A_ADDR]], ptr [[TMP]], align 8
1176*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP10:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8
1177*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP11:%.*]] = load i32, ptr [[TMP10]], align 4
1178*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP12:%.*]] = load ptr, ptr [[TMP1]], align 8
1179*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[DOTA__VOID_ADDR:%.*]] = call ptr @__kmpc_alloc(i32 [[TMP11]], i64 8, ptr [[TMP12]])
1180*d7c69c20SDavid Pagan // CHECK4-NEXT:    store ptr [[DOTA__VOID_ADDR]], ptr [[_TMP1]], align 8
1181*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP13:%.*]] = load ptr, ptr [[_TMP1]], align 8
1182*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP14:%.*]] = load double, ptr [[TMP13]], align 8
1183*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[INC:%.*]] = fadd double [[TMP14]], 1.000000e+00
1184*d7c69c20SDavid Pagan // CHECK4-NEXT:    store double [[INC]], ptr [[TMP13]], align 8
1185*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP15:%.*]] = load ptr, ptr [[TMP1]], align 8
1186*d7c69c20SDavid Pagan // CHECK4-NEXT:    call void @__kmpc_free(i32 [[TMP11]], ptr [[DOTA__VOID_ADDR]], ptr [[TMP15]])
1187*d7c69c20SDavid Pagan // CHECK4-NEXT:    call void @__kmpc_barrier(ptr @[[GLOB1]], i32 [[TMP11]])
1188*d7c69c20SDavid Pagan // CHECK4-NEXT:    ret void
1189*d7c69c20SDavid Pagan //
1190*d7c69c20SDavid Pagan //
1191*d7c69c20SDavid Pagan // CHECK4-LABEL: define {{[^@]+}}@_ZN2SSC2ERi
1192*d7c69c20SDavid Pagan // CHECK4-SAME: (ptr noundef nonnull align 8 dereferenceable(24) [[THIS:%.*]], ptr noundef nonnull align 4 dereferenceable(4) [[D:%.*]]) unnamed_addr #[[ATTR2]] comdat align 2 personality ptr @__gxx_personality_v0 {
1193*d7c69c20SDavid Pagan // CHECK4-NEXT:  entry:
1194*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[THIS_ADDR:%.*]] = alloca ptr, align 8
1195*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[D_ADDR:%.*]] = alloca ptr, align 8
1196*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[A2:%.*]] = alloca i32, align 4
1197*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP:%.*]] = alloca ptr, align 8
1198*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[C3:%.*]] = alloca i32, align 4
1199*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[_TMP4:%.*]] = alloca ptr, align 8
1200*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[REF_TMP:%.*]] = alloca [[CLASS_ANON_1:%.*]], align 8
1201*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB2]])
1202*d7c69c20SDavid Pagan // CHECK4-NEXT:    store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
1203*d7c69c20SDavid Pagan // CHECK4-NEXT:    store ptr [[D]], ptr [[D_ADDR]], align 8
1204*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8
1205*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[A:%.*]] = getelementptr inbounds nuw [[STRUCT_SS:%.*]], ptr [[THIS1]], i32 0, i32 1
1206*d7c69c20SDavid Pagan // CHECK4-NEXT:    store i32 0, ptr [[A]], align 4
1207*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[B:%.*]] = getelementptr inbounds nuw [[STRUCT_SS]], ptr [[THIS1]], i32 0, i32 2
1208*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[BF_LOAD:%.*]] = load i8, ptr [[B]], align 8
1209*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[BF_CLEAR:%.*]] = and i8 [[BF_LOAD]], -16
1210*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[BF_SET:%.*]] = or i8 [[BF_CLEAR]], 0
1211*d7c69c20SDavid Pagan // CHECK4-NEXT:    store i8 [[BF_SET]], ptr [[B]], align 8
1212*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[C:%.*]] = getelementptr inbounds nuw [[STRUCT_SS]], ptr [[THIS1]], i32 0, i32 3
1213*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP1:%.*]] = load ptr, ptr [[D_ADDR]], align 8
1214*d7c69c20SDavid Pagan // CHECK4-NEXT:    store ptr [[TMP1]], ptr [[C]], align 8
1215*d7c69c20SDavid Pagan // CHECK4-NEXT:    store ptr [[A2]], ptr [[TMP]], align 8
1216*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP2:%.*]] = load ptr, ptr @omp_default_mem_alloc, align 8
1217*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[DOTB__VOID_ADDR:%.*]] = call ptr @__kmpc_alloc(i32 [[TMP0]], i64 4, ptr [[TMP2]])
1218*d7c69c20SDavid Pagan // CHECK4-NEXT:    store ptr [[C3]], ptr [[_TMP4]], align 8
1219*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP3:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_1]], ptr [[REF_TMP]], i32 0, i32 0
1220*d7c69c20SDavid Pagan // CHECK4-NEXT:    store ptr [[THIS1]], ptr [[TMP3]], align 8
1221*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP4:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_1]], ptr [[REF_TMP]], i32 0, i32 1
1222*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP5:%.*]] = load ptr, ptr [[TMP]], align 8
1223*d7c69c20SDavid Pagan // CHECK4-NEXT:    store ptr [[TMP5]], ptr [[TMP4]], align 8
1224*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP6:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_1]], ptr [[REF_TMP]], i32 0, i32 2
1225*d7c69c20SDavid Pagan // CHECK4-NEXT:    store ptr [[DOTB__VOID_ADDR]], ptr [[TMP6]], align 8
1226*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP7:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_1]], ptr [[REF_TMP]], i32 0, i32 3
1227*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP8:%.*]] = load ptr, ptr [[_TMP4]], align 8
1228*d7c69c20SDavid Pagan // CHECK4-NEXT:    store ptr [[TMP8]], ptr [[TMP7]], align 8
1229*d7c69c20SDavid Pagan // CHECK4-NEXT:    invoke void @_ZZN2SSC1ERiENKUlvE_clEv(ptr noundef nonnull align 8 dereferenceable(32) [[REF_TMP]])
1230*d7c69c20SDavid Pagan // CHECK4-NEXT:            to label [[INVOKE_CONT:%.*]] unwind label [[TERMINATE_LPAD:%.*]]
1231*d7c69c20SDavid Pagan // CHECK4:       invoke.cont:
1232*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP9:%.*]] = load ptr, ptr @omp_default_mem_alloc, align 8
1233*d7c69c20SDavid Pagan // CHECK4-NEXT:    call void @__kmpc_free(i32 [[TMP0]], ptr [[DOTB__VOID_ADDR]], ptr [[TMP9]])
1234*d7c69c20SDavid Pagan // CHECK4-NEXT:    ret void
1235*d7c69c20SDavid Pagan // CHECK4:       terminate.lpad:
1236*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP10:%.*]] = landingpad { ptr, i32 }
1237*d7c69c20SDavid Pagan // CHECK4-NEXT:            catch ptr null
1238*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP11:%.*]] = extractvalue { ptr, i32 } [[TMP10]], 0
1239*d7c69c20SDavid Pagan // CHECK4-NEXT:    call void @__clang_call_terminate(ptr [[TMP11]]) #[[ATTR10]]
1240*d7c69c20SDavid Pagan // CHECK4-NEXT:    unreachable
1241*d7c69c20SDavid Pagan //
1242*d7c69c20SDavid Pagan //
1243*d7c69c20SDavid Pagan // CHECK4-LABEL: define {{[^@]+}}@_ZZN2SSC1ERiENKUlvE_clEv
1244*d7c69c20SDavid Pagan // CHECK4-SAME: (ptr noundef nonnull align 8 dereferenceable(32) [[THIS:%.*]]) #[[ATTR2]] align 2 {
1245*d7c69c20SDavid Pagan // CHECK4-NEXT:  entry:
1246*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[THIS_ADDR:%.*]] = alloca ptr, align 8
1247*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB2]])
1248*d7c69c20SDavid Pagan // CHECK4-NEXT:    store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
1249*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8
1250*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP1:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_1:%.*]], ptr [[THIS1]], i32 0, i32 0
1251*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP2:%.*]] = load ptr, ptr [[TMP1]], align 8
1252*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP3:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_1]], ptr [[THIS1]], i32 0, i32 1
1253*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP4:%.*]] = load ptr, ptr [[TMP3]], align 8
1254*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP5:%.*]] = load i32, ptr [[TMP4]], align 4
1255*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[INC:%.*]] = add nsw i32 [[TMP5]], 1
1256*d7c69c20SDavid Pagan // CHECK4-NEXT:    store i32 [[INC]], ptr [[TMP4]], align 4
1257*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP6:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_1]], ptr [[THIS1]], i32 0, i32 2
1258*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP7:%.*]] = load ptr, ptr [[TMP6]], align 8
1259*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP8:%.*]] = load i32, ptr [[TMP7]], align 4
1260*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[DEC:%.*]] = add nsw i32 [[TMP8]], -1
1261*d7c69c20SDavid Pagan // CHECK4-NEXT:    store i32 [[DEC]], ptr [[TMP7]], align 4
1262*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP9:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_1]], ptr [[THIS1]], i32 0, i32 3
1263*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP10:%.*]] = load ptr, ptr [[TMP9]], align 8
1264*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP11:%.*]] = load i32, ptr [[TMP10]], align 4
1265*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[DIV:%.*]] = sdiv i32 [[TMP11]], 1
1266*d7c69c20SDavid Pagan // CHECK4-NEXT:    store i32 [[DIV]], ptr [[TMP10]], align 4
1267*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP12:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_1]], ptr [[THIS1]], i32 0, i32 2
1268*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP13:%.*]] = load ptr, ptr [[TMP12]], align 8
1269*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP14:%.*]] = load i32, ptr [[TMP13]], align 4
1270*d7c69c20SDavid Pagan // CHECK4-NEXT:    call void @__kmpc_push_num_threads(ptr @[[GLOB2]], i32 [[TMP0]], i32 [[TMP14]])
1271*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP15:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_1]], ptr [[THIS1]], i32 0, i32 1
1272*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP16:%.*]] = load ptr, ptr [[TMP15]], align 8
1273*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP17:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_1]], ptr [[THIS1]], i32 0, i32 2
1274*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP18:%.*]] = load ptr, ptr [[TMP17]], align 8
1275*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP19:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_1]], ptr [[THIS1]], i32 0, i32 3
1276*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP20:%.*]] = load ptr, ptr [[TMP19]], align 8
1277*d7c69c20SDavid Pagan // CHECK4-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB2]], i32 4, ptr @_ZZN2SSC1ERiENKUlvE_clEv.omp_outlined, ptr [[TMP2]], ptr [[TMP16]], ptr [[TMP18]], ptr [[TMP20]])
1278*d7c69c20SDavid Pagan // CHECK4-NEXT:    ret void
1279*d7c69c20SDavid Pagan //
1280*d7c69c20SDavid Pagan //
1281*d7c69c20SDavid Pagan // CHECK4-LABEL: define {{[^@]+}}@_ZZN2SSC1ERiENKUlvE_clEv.omp_outlined
1282*d7c69c20SDavid Pagan // CHECK4-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], ptr noundef [[THIS:%.*]], ptr noundef nonnull align 4 dereferenceable(4) [[A:%.*]], ptr noundef nonnull align 4 dereferenceable(4) [[B:%.*]], ptr noundef nonnull align 4 dereferenceable(4) [[C:%.*]]) #[[ATTR8]] {
1283*d7c69c20SDavid Pagan // CHECK4-NEXT:  entry:
1284*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 8
1285*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 8
1286*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[THIS_ADDR:%.*]] = alloca ptr, align 8
1287*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[A_ADDR:%.*]] = alloca ptr, align 8
1288*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[B_ADDR:%.*]] = alloca ptr, align 8
1289*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[C_ADDR:%.*]] = alloca ptr, align 8
1290*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP:%.*]] = alloca ptr, align 8
1291*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[_TMP1:%.*]] = alloca ptr, align 8
1292*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[E:%.*]] = alloca ptr, align 8
1293*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[_TMP3:%.*]] = alloca ptr, align 8
1294*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[_TMP4:%.*]] = alloca ptr, align 8
1295*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[_TMP5:%.*]] = alloca ptr, align 8
1296*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[A6:%.*]] = alloca i32, align 4
1297*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[_TMP7:%.*]] = alloca ptr, align 8
1298*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[B8:%.*]] = alloca i32, align 4
1299*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[C9:%.*]] = alloca i32, align 4
1300*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[_TMP10:%.*]] = alloca ptr, align 8
1301*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[E11:%.*]] = alloca i32, align 4
1302*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[_TMP12:%.*]] = alloca ptr, align 8
1303*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[DOTOMP_REDUCTION_RED_LIST:%.*]] = alloca [1 x ptr], align 8
1304*d7c69c20SDavid Pagan // CHECK4-NEXT:    store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 8
1305*d7c69c20SDavid Pagan // CHECK4-NEXT:    store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 8
1306*d7c69c20SDavid Pagan // CHECK4-NEXT:    store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
1307*d7c69c20SDavid Pagan // CHECK4-NEXT:    store ptr [[A]], ptr [[A_ADDR]], align 8
1308*d7c69c20SDavid Pagan // CHECK4-NEXT:    store ptr [[B]], ptr [[B_ADDR]], align 8
1309*d7c69c20SDavid Pagan // CHECK4-NEXT:    store ptr [[C]], ptr [[C_ADDR]], align 8
1310*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP0:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8
1311*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP1:%.*]] = load ptr, ptr [[A_ADDR]], align 8
1312*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP2:%.*]] = load ptr, ptr [[B_ADDR]], align 8
1313*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP3:%.*]] = load ptr, ptr [[C_ADDR]], align 8
1314*d7c69c20SDavid Pagan // CHECK4-NEXT:    store ptr [[TMP1]], ptr [[TMP]], align 8
1315*d7c69c20SDavid Pagan // CHECK4-NEXT:    store ptr [[TMP3]], ptr [[_TMP1]], align 8
1316*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[E2:%.*]] = getelementptr inbounds nuw [[STRUCT_SS:%.*]], ptr [[TMP0]], i32 0, i32 0
1317*d7c69c20SDavid Pagan // CHECK4-NEXT:    store ptr [[E2]], ptr [[E]], align 8
1318*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP4:%.*]] = load ptr, ptr [[TMP]], align 8
1319*d7c69c20SDavid Pagan // CHECK4-NEXT:    store ptr [[TMP4]], ptr [[_TMP3]], align 8
1320*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP5:%.*]] = load ptr, ptr [[E]], align 8
1321*d7c69c20SDavid Pagan // CHECK4-NEXT:    store ptr [[TMP5]], ptr [[_TMP4]], align 8
1322*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP6:%.*]] = load ptr, ptr [[_TMP1]], align 8
1323*d7c69c20SDavid Pagan // CHECK4-NEXT:    store ptr [[TMP6]], ptr [[_TMP5]], align 8
1324*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP7:%.*]] = load ptr, ptr [[_TMP3]], align 8
1325*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP8:%.*]] = load i32, ptr [[TMP7]], align 4
1326*d7c69c20SDavid Pagan // CHECK4-NEXT:    store i32 [[TMP8]], ptr [[A6]], align 4
1327*d7c69c20SDavid Pagan // CHECK4-NEXT:    store ptr [[A6]], ptr [[_TMP7]], align 8
1328*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP9:%.*]] = load i32, ptr [[TMP2]], align 4
1329*d7c69c20SDavid Pagan // CHECK4-NEXT:    store i32 [[TMP9]], ptr [[B8]], align 4
1330*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP10:%.*]] = load ptr, ptr [[_TMP5]], align 8
1331*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP11:%.*]] = load i32, ptr [[TMP10]], align 4
1332*d7c69c20SDavid Pagan // CHECK4-NEXT:    store i32 [[TMP11]], ptr [[C9]], align 4
1333*d7c69c20SDavid Pagan // CHECK4-NEXT:    store ptr [[C9]], ptr [[_TMP10]], align 8
1334*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP12:%.*]] = load ptr, ptr [[_TMP4]], align 8
1335*d7c69c20SDavid Pagan // CHECK4-NEXT:    store i32 0, ptr [[E11]], align 4
1336*d7c69c20SDavid Pagan // CHECK4-NEXT:    store ptr [[E11]], ptr [[_TMP12]], align 8
1337*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP13:%.*]] = load ptr, ptr [[_TMP7]], align 8
1338*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP14:%.*]] = load i32, ptr [[TMP13]], align 4
1339*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[INC:%.*]] = add nsw i32 [[TMP14]], 1
1340*d7c69c20SDavid Pagan // CHECK4-NEXT:    store i32 [[INC]], ptr [[TMP13]], align 4
1341*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP15:%.*]] = load ptr, ptr [[_TMP12]], align 8
1342*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP16:%.*]] = load i32, ptr [[TMP15]], align 4
1343*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP16]], 1
1344*d7c69c20SDavid Pagan // CHECK4-NEXT:    store i32 [[ADD]], ptr [[TMP15]], align 4
1345*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP17:%.*]] = load ptr, ptr [[_TMP10]], align 8
1346*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP18:%.*]] = load i32, ptr [[TMP17]], align 4
1347*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[DIV:%.*]] = sdiv i32 [[TMP18]], 1
1348*d7c69c20SDavid Pagan // CHECK4-NEXT:    store i32 [[DIV]], ptr [[TMP17]], align 4
1349*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP19:%.*]] = getelementptr inbounds [1 x ptr], ptr [[DOTOMP_REDUCTION_RED_LIST]], i64 0, i64 0
1350*d7c69c20SDavid Pagan // CHECK4-NEXT:    store ptr [[E11]], ptr [[TMP19]], align 8
1351*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP20:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8
1352*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP21:%.*]] = load i32, ptr [[TMP20]], align 4
1353*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP22:%.*]] = call i32 @__kmpc_reduce(ptr @[[GLOB3:[0-9]+]], i32 [[TMP21]], i32 1, i64 8, ptr [[DOTOMP_REDUCTION_RED_LIST]], ptr @_ZZN2SSC1ERiENKUlvE_clEv.omp_outlined.omp.reduction.reduction_func, ptr @.gomp_critical_user_.reduction.var)
1354*d7c69c20SDavid Pagan // CHECK4-NEXT:    switch i32 [[TMP22]], label [[DOTOMP_REDUCTION_DEFAULT:%.*]] [
1355*d7c69c20SDavid Pagan // CHECK4-NEXT:      i32 1, label [[DOTOMP_REDUCTION_CASE1:%.*]]
1356*d7c69c20SDavid Pagan // CHECK4-NEXT:      i32 2, label [[DOTOMP_REDUCTION_CASE2:%.*]]
1357*d7c69c20SDavid Pagan // CHECK4-NEXT:    ]
1358*d7c69c20SDavid Pagan // CHECK4:       .omp.reduction.case1:
1359*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP23:%.*]] = load i32, ptr [[TMP12]], align 4
1360*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP24:%.*]] = load i32, ptr [[E11]], align 4
1361*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[ADD13:%.*]] = add nsw i32 [[TMP23]], [[TMP24]]
1362*d7c69c20SDavid Pagan // CHECK4-NEXT:    store i32 [[ADD13]], ptr [[TMP12]], align 4
1363*d7c69c20SDavid Pagan // CHECK4-NEXT:    call void @__kmpc_end_reduce(ptr @[[GLOB3]], i32 [[TMP21]], ptr @.gomp_critical_user_.reduction.var)
1364*d7c69c20SDavid Pagan // CHECK4-NEXT:    br label [[DOTOMP_REDUCTION_DEFAULT]]
1365*d7c69c20SDavid Pagan // CHECK4:       .omp.reduction.case2:
1366*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP25:%.*]] = load i32, ptr [[E11]], align 4
1367*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP26:%.*]] = atomicrmw add ptr [[TMP12]], i32 [[TMP25]] monotonic, align 4
1368*d7c69c20SDavid Pagan // CHECK4-NEXT:    call void @__kmpc_end_reduce(ptr @[[GLOB3]], i32 [[TMP21]], ptr @.gomp_critical_user_.reduction.var)
1369*d7c69c20SDavid Pagan // CHECK4-NEXT:    br label [[DOTOMP_REDUCTION_DEFAULT]]
1370*d7c69c20SDavid Pagan // CHECK4:       .omp.reduction.default:
1371*d7c69c20SDavid Pagan // CHECK4-NEXT:    call void @__kmpc_barrier(ptr @[[GLOB1]], i32 [[TMP21]])
1372*d7c69c20SDavid Pagan // CHECK4-NEXT:    ret void
1373*d7c69c20SDavid Pagan //
1374*d7c69c20SDavid Pagan //
1375*d7c69c20SDavid Pagan // CHECK4-LABEL: define {{[^@]+}}@_ZZN2SSC1ERiENKUlvE_clEv.omp_outlined.omp.reduction.reduction_func
1376*d7c69c20SDavid Pagan // CHECK4-SAME: (ptr noundef [[TMP0:%.*]], ptr noundef [[TMP1:%.*]]) #[[ATTR9:[0-9]+]] {
1377*d7c69c20SDavid Pagan // CHECK4-NEXT:  entry:
1378*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[DOTADDR:%.*]] = alloca ptr, align 8
1379*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[DOTADDR1:%.*]] = alloca ptr, align 8
1380*d7c69c20SDavid Pagan // CHECK4-NEXT:    store ptr [[TMP0]], ptr [[DOTADDR]], align 8
1381*d7c69c20SDavid Pagan // CHECK4-NEXT:    store ptr [[TMP1]], ptr [[DOTADDR1]], align 8
1382*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP2:%.*]] = load ptr, ptr [[DOTADDR]], align 8
1383*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP3:%.*]] = load ptr, ptr [[DOTADDR1]], align 8
1384*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP4:%.*]] = getelementptr inbounds [1 x ptr], ptr [[TMP3]], i64 0, i64 0
1385*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP5:%.*]] = load ptr, ptr [[TMP4]], align 8
1386*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP6:%.*]] = getelementptr inbounds [1 x ptr], ptr [[TMP2]], i64 0, i64 0
1387*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP7:%.*]] = load ptr, ptr [[TMP6]], align 8
1388*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP8:%.*]] = load i32, ptr [[TMP7]], align 4
1389*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP9:%.*]] = load i32, ptr [[TMP5]], align 4
1390*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP8]], [[TMP9]]
1391*d7c69c20SDavid Pagan // CHECK4-NEXT:    store i32 [[ADD]], ptr [[TMP7]], align 4
1392*d7c69c20SDavid Pagan // CHECK4-NEXT:    ret void
1393*d7c69c20SDavid Pagan //
1394*d7c69c20SDavid Pagan //
1395*d7c69c20SDavid Pagan // CHECK4-LABEL: define {{[^@]+}}@_ZN9TestClassC2ERKS_
1396*d7c69c20SDavid Pagan // CHECK4-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[THIS:%.*]], ptr noundef nonnull align 4 dereferenceable(4) [[C:%.*]]) unnamed_addr #[[ATTR2]] comdat align 2 {
1397*d7c69c20SDavid Pagan // CHECK4-NEXT:  entry:
1398*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[THIS_ADDR:%.*]] = alloca ptr, align 8
1399*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[C_ADDR:%.*]] = alloca ptr, align 8
1400*d7c69c20SDavid Pagan // CHECK4-NEXT:    store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
1401*d7c69c20SDavid Pagan // CHECK4-NEXT:    store ptr [[C]], ptr [[C_ADDR]], align 8
1402*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8
1403*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[A:%.*]] = getelementptr inbounds nuw [[CLASS_TESTCLASS:%.*]], ptr [[THIS1]], i32 0, i32 0
1404*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP0:%.*]] = load ptr, ptr [[C_ADDR]], align 8
1405*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[A2:%.*]] = getelementptr inbounds nuw [[CLASS_TESTCLASS]], ptr [[TMP0]], i32 0, i32 0
1406*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP1:%.*]] = load i32, ptr [[A2]], align 4
1407*d7c69c20SDavid Pagan // CHECK4-NEXT:    store i32 [[TMP1]], ptr [[A]], align 4
1408*d7c69c20SDavid Pagan // CHECK4-NEXT:    ret void
1409*d7c69c20SDavid Pagan //
1410*d7c69c20SDavid Pagan //
1411*d7c69c20SDavid Pagan // CHECK4-LABEL: define {{[^@]+}}@_Z15parallel_singlev
1412*d7c69c20SDavid Pagan // CHECK4-SAME: () #[[ATTR2]] {
1413*d7c69c20SDavid Pagan // CHECK4-NEXT:  entry:
1414*d7c69c20SDavid Pagan // CHECK4-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB2]], i32 0, ptr @_Z15parallel_singlev.omp_outlined)
1415*d7c69c20SDavid Pagan // CHECK4-NEXT:    ret void
1416*d7c69c20SDavid Pagan //
1417*d7c69c20SDavid Pagan //
1418*d7c69c20SDavid Pagan // CHECK4-LABEL: define {{[^@]+}}@_Z15parallel_singlev.omp_outlined
1419*d7c69c20SDavid Pagan // CHECK4-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]]) #[[ATTR8]] personality ptr @__gxx_personality_v0 {
1420*d7c69c20SDavid Pagan // CHECK4-NEXT:  entry:
1421*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 8
1422*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 8
1423*d7c69c20SDavid Pagan // CHECK4-NEXT:    store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 8
1424*d7c69c20SDavid Pagan // CHECK4-NEXT:    store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 8
1425*d7c69c20SDavid Pagan // CHECK4-NEXT:    invoke void @_Z3foov()
1426*d7c69c20SDavid Pagan // CHECK4-NEXT:            to label [[INVOKE_CONT:%.*]] unwind label [[TERMINATE_LPAD:%.*]]
1427*d7c69c20SDavid Pagan // CHECK4:       invoke.cont:
1428*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP0:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8
1429*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 4
1430*d7c69c20SDavid Pagan // CHECK4-NEXT:    call void @__kmpc_barrier(ptr @[[GLOB1]], i32 [[TMP1]])
1431*d7c69c20SDavid Pagan // CHECK4-NEXT:    ret void
1432*d7c69c20SDavid Pagan // CHECK4:       terminate.lpad:
1433*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP2:%.*]] = landingpad { ptr, i32 }
1434*d7c69c20SDavid Pagan // CHECK4-NEXT:            catch ptr null
1435*d7c69c20SDavid Pagan // CHECK4-NEXT:    [[TMP3:%.*]] = extractvalue { ptr, i32 } [[TMP2]], 0
1436*d7c69c20SDavid Pagan // CHECK4-NEXT:    call void @__clang_call_terminate(ptr [[TMP3]]) #[[ATTR10]]
1437*d7c69c20SDavid Pagan // CHECK4-NEXT:    unreachable
1438*d7c69c20SDavid Pagan //
1439*d7c69c20SDavid Pagan //
1440*d7c69c20SDavid Pagan // CHECK4-LABEL: define {{[^@]+}}@_GLOBAL__sub_I_scope_codegen.cpp
1441*d7c69c20SDavid Pagan // CHECK4-SAME: () #[[ATTR0]] {
1442*d7c69c20SDavid Pagan // CHECK4-NEXT:  entry:
1443*d7c69c20SDavid Pagan // CHECK4-NEXT:    call void @__cxx_global_var_init()
1444*d7c69c20SDavid Pagan // CHECK4-NEXT:    call void @__cxx_global_var_init.1()
1445*d7c69c20SDavid Pagan // CHECK4-NEXT:    ret void
1446*d7c69c20SDavid Pagan //
1447*d7c69c20SDavid Pagan //
1448*d7c69c20SDavid Pagan // CHECK5-LABEL: define {{[^@]+}}@__cxx_global_var_init
1449*d7c69c20SDavid Pagan // CHECK5-SAME: () #[[ATTR0:[0-9]+]] section "__TEXT,__StaticInit,regular,pure_instructions" !dbg [[DBG6:![0-9]+]] {
1450*d7c69c20SDavid Pagan // CHECK5-NEXT:  entry:
1451*d7c69c20SDavid Pagan // CHECK5-NEXT:    call void @_ZN9TestClassC1Ev(ptr noundef nonnull align 4 dereferenceable(4) @tc), !dbg [[DBG9:![0-9]+]]
1452*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[TMP0:%.*]] = call i32 @__cxa_atexit(ptr @_ZN9TestClassD1Ev, ptr @tc, ptr @__dso_handle) #[[ATTR3:[0-9]+]], !dbg [[DBG12:![0-9]+]]
1453*d7c69c20SDavid Pagan // CHECK5-NEXT:    ret void, !dbg [[DBG9]]
1454*d7c69c20SDavid Pagan //
1455*d7c69c20SDavid Pagan //
1456*d7c69c20SDavid Pagan // CHECK5-LABEL: define {{[^@]+}}@_ZN9TestClassC1Ev
1457*d7c69c20SDavid Pagan // CHECK5-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[THIS:%.*]]) unnamed_addr #[[ATTR1:[0-9]+]] align 2 !dbg [[DBG13:![0-9]+]] {
1458*d7c69c20SDavid Pagan // CHECK5-NEXT:  entry:
1459*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[THIS_ADDR:%.*]] = alloca ptr, align 8
1460*d7c69c20SDavid Pagan // CHECK5-NEXT:    store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
1461*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8
1462*d7c69c20SDavid Pagan // CHECK5-NEXT:    call void @_ZN9TestClassC2Ev(ptr noundef nonnull align 4 dereferenceable(4) [[THIS1]]), !dbg [[DBG14:![0-9]+]]
1463*d7c69c20SDavid Pagan // CHECK5-NEXT:    ret void, !dbg [[DBG15:![0-9]+]]
1464*d7c69c20SDavid Pagan //
1465*d7c69c20SDavid Pagan //
1466*d7c69c20SDavid Pagan // CHECK5-LABEL: define {{[^@]+}}@_ZN9TestClassD1Ev
1467*d7c69c20SDavid Pagan // CHECK5-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[THIS:%.*]]) unnamed_addr #[[ATTR2:[0-9]+]] align 2 !dbg [[DBG16:![0-9]+]] {
1468*d7c69c20SDavid Pagan // CHECK5-NEXT:  entry:
1469*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[THIS_ADDR:%.*]] = alloca ptr, align 8
1470*d7c69c20SDavid Pagan // CHECK5-NEXT:    store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
1471*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8
1472*d7c69c20SDavid Pagan // CHECK5-NEXT:    call void @_ZN9TestClassD2Ev(ptr noundef nonnull align 4 dereferenceable(4) [[THIS1]]) #[[ATTR3]], !dbg [[DBG17:![0-9]+]]
1473*d7c69c20SDavid Pagan // CHECK5-NEXT:    ret void, !dbg [[DBG18:![0-9]+]]
1474*d7c69c20SDavid Pagan //
1475*d7c69c20SDavid Pagan //
1476*d7c69c20SDavid Pagan // CHECK5-LABEL: define {{[^@]+}}@_ZN9TestClassC2Ev
1477*d7c69c20SDavid Pagan // CHECK5-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[THIS:%.*]]) unnamed_addr #[[ATTR2]] align 2 !dbg [[DBG19:![0-9]+]] {
1478*d7c69c20SDavid Pagan // CHECK5-NEXT:  entry:
1479*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[THIS_ADDR:%.*]] = alloca ptr, align 8
1480*d7c69c20SDavid Pagan // CHECK5-NEXT:    store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
1481*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8
1482*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[A:%.*]] = getelementptr inbounds nuw [[CLASS_TESTCLASS:%.*]], ptr [[THIS1]], i32 0, i32 0, !dbg [[DBG20:![0-9]+]]
1483*d7c69c20SDavid Pagan // CHECK5-NEXT:    store i32 0, ptr [[A]], align 4, !dbg [[DBG20]]
1484*d7c69c20SDavid Pagan // CHECK5-NEXT:    ret void, !dbg [[DBG21:![0-9]+]]
1485*d7c69c20SDavid Pagan //
1486*d7c69c20SDavid Pagan //
1487*d7c69c20SDavid Pagan // CHECK5-LABEL: define {{[^@]+}}@_ZN9TestClassD2Ev
1488*d7c69c20SDavid Pagan // CHECK5-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[THIS:%.*]]) unnamed_addr #[[ATTR2]] align 2 !dbg [[DBG22:![0-9]+]] {
1489*d7c69c20SDavid Pagan // CHECK5-NEXT:  entry:
1490*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[THIS_ADDR:%.*]] = alloca ptr, align 8
1491*d7c69c20SDavid Pagan // CHECK5-NEXT:    store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
1492*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8
1493*d7c69c20SDavid Pagan // CHECK5-NEXT:    ret void, !dbg [[DBG23:![0-9]+]]
1494*d7c69c20SDavid Pagan //
1495*d7c69c20SDavid Pagan //
1496*d7c69c20SDavid Pagan // CHECK5-LABEL: define {{[^@]+}}@__cxx_global_var_init.1
1497*d7c69c20SDavid Pagan // CHECK5-SAME: () #[[ATTR0]] section "__TEXT,__StaticInit,regular,pure_instructions" personality ptr @__gxx_personality_v0 !dbg [[DBG24:![0-9]+]] {
1498*d7c69c20SDavid Pagan // CHECK5-NEXT:  entry:
1499*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[EXN_SLOT:%.*]] = alloca ptr, align 8
1500*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[EHSELECTOR_SLOT:%.*]] = alloca i32, align 4
1501*d7c69c20SDavid Pagan // CHECK5-NEXT:    br label [[ARRAYCTOR_LOOP:%.*]], !dbg [[DBG25:![0-9]+]]
1502*d7c69c20SDavid Pagan // CHECK5:       arrayctor.loop:
1503*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[ARRAYCTOR_CUR:%.*]] = phi ptr [ @tc2, [[ENTRY:%.*]] ], [ [[ARRAYCTOR_NEXT:%.*]], [[INVOKE_CONT:%.*]] ], !dbg [[DBG25]]
1504*d7c69c20SDavid Pagan // CHECK5-NEXT:    invoke void @_ZN9TestClassC1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[ARRAYCTOR_CUR]])
1505*d7c69c20SDavid Pagan // CHECK5-NEXT:            to label [[INVOKE_CONT]] unwind label [[LPAD:%.*]], !dbg [[DBG25]]
1506*d7c69c20SDavid Pagan // CHECK5:       invoke.cont:
1507*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[ARRAYCTOR_NEXT]] = getelementptr inbounds [[CLASS_TESTCLASS:%.*]], ptr [[ARRAYCTOR_CUR]], i64 1, !dbg [[DBG25]]
1508*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[ARRAYCTOR_DONE:%.*]] = icmp eq ptr [[ARRAYCTOR_NEXT]], getelementptr inbounds ([[CLASS_TESTCLASS]], ptr @tc2, i64 2), !dbg [[DBG25]]
1509*d7c69c20SDavid Pagan // CHECK5-NEXT:    br i1 [[ARRAYCTOR_DONE]], label [[ARRAYCTOR_CONT:%.*]], label [[ARRAYCTOR_LOOP]], !dbg [[DBG25]]
1510*d7c69c20SDavid Pagan // CHECK5:       arrayctor.cont:
1511*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[TMP0:%.*]] = call i32 @__cxa_atexit(ptr @__cxx_global_array_dtor, ptr null, ptr @__dso_handle) #[[ATTR3]], !dbg [[DBG27:![0-9]+]]
1512*d7c69c20SDavid Pagan // CHECK5-NEXT:    ret void, !dbg [[DBG27]]
1513*d7c69c20SDavid Pagan // CHECK5:       lpad:
1514*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[TMP1:%.*]] = landingpad { ptr, i32 }
1515*d7c69c20SDavid Pagan // CHECK5-NEXT:            cleanup, !dbg [[DBG28:![0-9]+]]
1516*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[TMP2:%.*]] = extractvalue { ptr, i32 } [[TMP1]], 0, !dbg [[DBG28]]
1517*d7c69c20SDavid Pagan // CHECK5-NEXT:    store ptr [[TMP2]], ptr [[EXN_SLOT]], align 8, !dbg [[DBG28]]
1518*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[TMP3:%.*]] = extractvalue { ptr, i32 } [[TMP1]], 1, !dbg [[DBG28]]
1519*d7c69c20SDavid Pagan // CHECK5-NEXT:    store i32 [[TMP3]], ptr [[EHSELECTOR_SLOT]], align 4, !dbg [[DBG28]]
1520*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[ARRAYDESTROY_ISEMPTY:%.*]] = icmp eq ptr @tc2, [[ARRAYCTOR_CUR]], !dbg [[DBG25]]
1521*d7c69c20SDavid Pagan // CHECK5-NEXT:    br i1 [[ARRAYDESTROY_ISEMPTY]], label [[ARRAYDESTROY_DONE1:%.*]], label [[ARRAYDESTROY_BODY:%.*]], !dbg [[DBG25]]
1522*d7c69c20SDavid Pagan // CHECK5:       arraydestroy.body:
1523*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[ARRAYDESTROY_ELEMENTPAST:%.*]] = phi ptr [ [[ARRAYCTOR_CUR]], [[LPAD]] ], [ [[ARRAYDESTROY_ELEMENT:%.*]], [[ARRAYDESTROY_BODY]] ], !dbg [[DBG25]]
1524*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[ARRAYDESTROY_ELEMENT]] = getelementptr inbounds [[CLASS_TESTCLASS]], ptr [[ARRAYDESTROY_ELEMENTPAST]], i64 -1, !dbg [[DBG25]]
1525*d7c69c20SDavid Pagan // CHECK5-NEXT:    call void @_ZN9TestClassD1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[ARRAYDESTROY_ELEMENT]]) #[[ATTR3]], !dbg [[DBG25]]
1526*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[ARRAYDESTROY_DONE:%.*]] = icmp eq ptr [[ARRAYDESTROY_ELEMENT]], @tc2, !dbg [[DBG25]]
1527*d7c69c20SDavid Pagan // CHECK5-NEXT:    br i1 [[ARRAYDESTROY_DONE]], label [[ARRAYDESTROY_DONE1]], label [[ARRAYDESTROY_BODY]], !dbg [[DBG25]]
1528*d7c69c20SDavid Pagan // CHECK5:       arraydestroy.done1:
1529*d7c69c20SDavid Pagan // CHECK5-NEXT:    br label [[EH_RESUME:%.*]], !dbg [[DBG25]]
1530*d7c69c20SDavid Pagan // CHECK5:       eh.resume:
1531*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[EXN:%.*]] = load ptr, ptr [[EXN_SLOT]], align 8, !dbg [[DBG25]]
1532*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[SEL:%.*]] = load i32, ptr [[EHSELECTOR_SLOT]], align 4, !dbg [[DBG25]]
1533*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[LPAD_VAL:%.*]] = insertvalue { ptr, i32 } poison, ptr [[EXN]], 0, !dbg [[DBG25]]
1534*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[LPAD_VAL2:%.*]] = insertvalue { ptr, i32 } [[LPAD_VAL]], i32 [[SEL]], 1, !dbg [[DBG25]]
1535*d7c69c20SDavid Pagan // CHECK5-NEXT:    resume { ptr, i32 } [[LPAD_VAL2]], !dbg [[DBG25]]
1536*d7c69c20SDavid Pagan //
1537*d7c69c20SDavid Pagan //
1538*d7c69c20SDavid Pagan // CHECK5-LABEL: define {{[^@]+}}@__cxx_global_array_dtor
1539*d7c69c20SDavid Pagan // CHECK5-SAME: (ptr noundef [[TMP0:%.*]]) #[[ATTR0]] section "__TEXT,__StaticInit,regular,pure_instructions" !dbg [[DBG29:![0-9]+]] {
1540*d7c69c20SDavid Pagan // CHECK5-NEXT:  entry:
1541*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[DOTADDR:%.*]] = alloca ptr, align 8
1542*d7c69c20SDavid Pagan // CHECK5-NEXT:    store ptr [[TMP0]], ptr [[DOTADDR]], align 8
1543*d7c69c20SDavid Pagan // CHECK5-NEXT:    br label [[ARRAYDESTROY_BODY:%.*]], !dbg [[DBG30:![0-9]+]]
1544*d7c69c20SDavid Pagan // CHECK5:       arraydestroy.body:
1545*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[ARRAYDESTROY_ELEMENTPAST:%.*]] = phi ptr [ getelementptr inbounds ([[CLASS_TESTCLASS:%.*]], ptr @tc2, i64 2), [[ENTRY:%.*]] ], [ [[ARRAYDESTROY_ELEMENT:%.*]], [[ARRAYDESTROY_BODY]] ], !dbg [[DBG30]]
1546*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[ARRAYDESTROY_ELEMENT]] = getelementptr inbounds [[CLASS_TESTCLASS]], ptr [[ARRAYDESTROY_ELEMENTPAST]], i64 -1, !dbg [[DBG30]]
1547*d7c69c20SDavid Pagan // CHECK5-NEXT:    call void @_ZN9TestClassD1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[ARRAYDESTROY_ELEMENT]]) #[[ATTR3]], !dbg [[DBG30]]
1548*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[ARRAYDESTROY_DONE:%.*]] = icmp eq ptr [[ARRAYDESTROY_ELEMENT]], @tc2, !dbg [[DBG30]]
1549*d7c69c20SDavid Pagan // CHECK5-NEXT:    br i1 [[ARRAYDESTROY_DONE]], label [[ARRAYDESTROY_DONE1:%.*]], label [[ARRAYDESTROY_BODY]], !dbg [[DBG30]]
1550*d7c69c20SDavid Pagan // CHECK5:       arraydestroy.done1:
1551*d7c69c20SDavid Pagan // CHECK5-NEXT:    ret void, !dbg [[DBG30]]
1552*d7c69c20SDavid Pagan //
1553*d7c69c20SDavid Pagan //
1554*d7c69c20SDavid Pagan // CHECK5-LABEL: define {{[^@]+}}@_Z3foov
1555*d7c69c20SDavid Pagan // CHECK5-SAME: () #[[ATTR1]] !dbg [[DBG31:![0-9]+]] {
1556*d7c69c20SDavid Pagan // CHECK5-NEXT:  entry:
1557*d7c69c20SDavid Pagan // CHECK5-NEXT:    call void @_Z8mayThrowv(), !dbg [[DBG32:![0-9]+]]
1558*d7c69c20SDavid Pagan // CHECK5-NEXT:    ret void, !dbg [[DBG33:![0-9]+]]
1559*d7c69c20SDavid Pagan //
1560*d7c69c20SDavid Pagan //
1561*d7c69c20SDavid Pagan // CHECK5-LABEL: define {{[^@]+}}@main
1562*d7c69c20SDavid Pagan // CHECK5-SAME: () #[[ATTR5:[0-9]+]] personality ptr @__gxx_personality_v0 !dbg [[DBG34:![0-9]+]] {
1563*d7c69c20SDavid Pagan // CHECK5-NEXT:  entry:
1564*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[RETVAL:%.*]] = alloca i32, align 4
1565*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[A:%.*]] = alloca i8, align 1
1566*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[A2:%.*]] = alloca [2 x i8], align 1
1567*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[C:%.*]] = alloca ptr, align 8
1568*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[SST:%.*]] = alloca [[STRUCT_SST:%.*]], align 8
1569*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[SS:%.*]] = alloca [[STRUCT_SS:%.*]], align 8
1570*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[A1:%.*]] = alloca i8, align 1
1571*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[C2:%.*]] = alloca [[CLASS_TESTCLASS:%.*]], align 4
1572*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[TMP:%.*]] = alloca ptr, align 8
1573*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[TC:%.*]] = alloca [[CLASS_TESTCLASS]], align 4
1574*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[A24:%.*]] = alloca [2 x i8], align 1
1575*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[TC2:%.*]] = alloca [2 x %class.TestClass], align 4
1576*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB2:[0-9]+]]), !dbg [[DBG35:![0-9]+]]
1577*d7c69c20SDavid Pagan // CHECK5-NEXT:    store i32 0, ptr [[RETVAL]], align 4
1578*d7c69c20SDavid Pagan // CHECK5-NEXT:    store ptr @tc, ptr [[C]], align 8, !dbg [[DBG36:![0-9]+]]
1579*d7c69c20SDavid Pagan // CHECK5-NEXT:    call void @_ZN3SSTIdEC1Ev(ptr noundef nonnull align 8 dereferenceable(8) [[SST]]), !dbg [[DBG37:![0-9]+]]
1580*d7c69c20SDavid Pagan // CHECK5-NEXT:    call void @_ZN2SSC1ERi(ptr noundef nonnull align 8 dereferenceable(24) [[SS]], ptr noundef nonnull align 4 dereferenceable(4) @tc), !dbg [[DBG38:![0-9]+]]
1581*d7c69c20SDavid Pagan // CHECK5-NEXT:    store i8 2, ptr [[A]], align 1, !dbg [[DBG39:![0-9]+]]
1582*d7c69c20SDavid Pagan // CHECK5-NEXT:    store i8 2, ptr [[A]], align 1, !dbg [[DBG40:![0-9]+]]
1583*d7c69c20SDavid Pagan // CHECK5-NEXT:    call void @__kmpc_barrier(ptr @[[GLOB1:[0-9]+]], i32 [[TMP0]]), !dbg [[DBG41:![0-9]+]]
1584*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[TMP1:%.*]] = load i8, ptr [[A]], align 1, !dbg [[DBG42:![0-9]+]]
1585*d7c69c20SDavid Pagan // CHECK5-NEXT:    store i8 [[TMP1]], ptr [[A1]], align 1, !dbg [[DBG42]]
1586*d7c69c20SDavid Pagan // CHECK5-NEXT:    invoke void @_ZN9TestClassC1ERKS_(ptr noundef nonnull align 4 dereferenceable(4) [[C2]], ptr noundef nonnull align 4 dereferenceable(4) @tc)
1587*d7c69c20SDavid Pagan // CHECK5-NEXT:            to label [[INVOKE_CONT:%.*]] unwind label [[TERMINATE_LPAD:%.*]], !dbg [[DBG43:![0-9]+]]
1588*d7c69c20SDavid Pagan // CHECK5:       invoke.cont:
1589*d7c69c20SDavid Pagan // CHECK5-NEXT:    store ptr [[C2]], ptr [[TMP]], align 8, !dbg [[DBG44:![0-9]+]]
1590*d7c69c20SDavid Pagan // CHECK5-NEXT:    invoke void @_ZN9TestClassC1ERKS_(ptr noundef nonnull align 4 dereferenceable(4) [[TC]], ptr noundef nonnull align 4 dereferenceable(4) @tc)
1591*d7c69c20SDavid Pagan // CHECK5-NEXT:            to label [[INVOKE_CONT3:%.*]] unwind label [[TERMINATE_LPAD]], !dbg [[DBG45:![0-9]+]]
1592*d7c69c20SDavid Pagan // CHECK5:       invoke.cont3:
1593*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[ARRAY_BEGIN:%.*]] = getelementptr inbounds [2 x %class.TestClass], ptr [[TC2]], i32 0, i32 0, !dbg [[DBG46:![0-9]+]]
1594*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[ARRAYCTOR_END:%.*]] = getelementptr inbounds [[CLASS_TESTCLASS]], ptr [[ARRAY_BEGIN]], i64 2, !dbg [[DBG46]]
1595*d7c69c20SDavid Pagan // CHECK5-NEXT:    br label [[ARRAYCTOR_LOOP:%.*]], !dbg [[DBG46]]
1596*d7c69c20SDavid Pagan // CHECK5:       arrayctor.loop:
1597*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[ARRAYCTOR_CUR:%.*]] = phi ptr [ [[ARRAY_BEGIN]], [[INVOKE_CONT3]] ], [ [[ARRAYCTOR_NEXT:%.*]], [[INVOKE_CONT5:%.*]] ], !dbg [[DBG46]]
1598*d7c69c20SDavid Pagan // CHECK5-NEXT:    invoke void @_ZN9TestClassC1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[ARRAYCTOR_CUR]])
1599*d7c69c20SDavid Pagan // CHECK5-NEXT:            to label [[INVOKE_CONT5]] unwind label [[TERMINATE_LPAD]], !dbg [[DBG46]]
1600*d7c69c20SDavid Pagan // CHECK5:       invoke.cont5:
1601*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[ARRAYCTOR_NEXT]] = getelementptr inbounds [[CLASS_TESTCLASS]], ptr [[ARRAYCTOR_CUR]], i64 1, !dbg [[DBG46]]
1602*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[ARRAYCTOR_DONE:%.*]] = icmp eq ptr [[ARRAYCTOR_NEXT]], [[ARRAYCTOR_END]], !dbg [[DBG46]]
1603*d7c69c20SDavid Pagan // CHECK5-NEXT:    br i1 [[ARRAYCTOR_DONE]], label [[ARRAYCTOR_CONT:%.*]], label [[ARRAYCTOR_LOOP]], !dbg [[DBG46]]
1604*d7c69c20SDavid Pagan // CHECK5:       arrayctor.cont:
1605*d7c69c20SDavid Pagan // CHECK5-NEXT:    invoke void @_Z3foov()
1606*d7c69c20SDavid Pagan // CHECK5-NEXT:            to label [[INVOKE_CONT6:%.*]] unwind label [[TERMINATE_LPAD]], !dbg [[DBG47:![0-9]+]]
1607*d7c69c20SDavid Pagan // CHECK5:       invoke.cont6:
1608*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[ARRAY_BEGIN7:%.*]] = getelementptr inbounds [2 x %class.TestClass], ptr [[TC2]], i32 0, i32 0, !dbg [[DBG47]]
1609*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[TMP2:%.*]] = getelementptr inbounds [[CLASS_TESTCLASS]], ptr [[ARRAY_BEGIN7]], i64 2, !dbg [[DBG47]]
1610*d7c69c20SDavid Pagan // CHECK5-NEXT:    br label [[ARRAYDESTROY_BODY:%.*]], !dbg [[DBG47]]
1611*d7c69c20SDavid Pagan // CHECK5:       arraydestroy.body:
1612*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[ARRAYDESTROY_ELEMENTPAST:%.*]] = phi ptr [ [[TMP2]], [[INVOKE_CONT6]] ], [ [[ARRAYDESTROY_ELEMENT:%.*]], [[ARRAYDESTROY_BODY]] ], !dbg [[DBG47]]
1613*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[ARRAYDESTROY_ELEMENT]] = getelementptr inbounds [[CLASS_TESTCLASS]], ptr [[ARRAYDESTROY_ELEMENTPAST]], i64 -1, !dbg [[DBG47]]
1614*d7c69c20SDavid Pagan // CHECK5-NEXT:    call void @_ZN9TestClassD1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[ARRAYDESTROY_ELEMENT]]) #[[ATTR3]], !dbg [[DBG47]]
1615*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[ARRAYDESTROY_DONE:%.*]] = icmp eq ptr [[ARRAYDESTROY_ELEMENT]], [[ARRAY_BEGIN7]], !dbg [[DBG47]]
1616*d7c69c20SDavid Pagan // CHECK5-NEXT:    br i1 [[ARRAYDESTROY_DONE]], label [[ARRAYDESTROY_DONE8:%.*]], label [[ARRAYDESTROY_BODY]], !dbg [[DBG47]]
1617*d7c69c20SDavid Pagan // CHECK5:       arraydestroy.done8:
1618*d7c69c20SDavid Pagan // CHECK5-NEXT:    call void @_ZN9TestClassD1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[TC]]) #[[ATTR3]], !dbg [[DBG47]]
1619*d7c69c20SDavid Pagan // CHECK5-NEXT:    call void @_ZN9TestClassD1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[C2]]) #[[ATTR3]], !dbg [[DBG47]]
1620*d7c69c20SDavid Pagan // CHECK5-NEXT:    call void @__kmpc_barrier(ptr @[[GLOB4:[0-9]+]], i32 [[TMP0]]), !dbg [[DBG48:![0-9]+]]
1621*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[TMP3:%.*]] = load i8, ptr [[A]], align 1, !dbg [[DBG49:![0-9]+]]
1622*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[CONV:%.*]] = sext i8 [[TMP3]] to i32, !dbg [[DBG49]]
1623*d7c69c20SDavid Pagan // CHECK5-NEXT:    ret i32 [[CONV]], !dbg [[DBG50:![0-9]+]]
1624*d7c69c20SDavid Pagan // CHECK5:       terminate.lpad:
1625*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[TMP4:%.*]] = landingpad { ptr, i32 }
1626*d7c69c20SDavid Pagan // CHECK5-NEXT:            catch ptr null, !dbg [[DBG43]]
1627*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[TMP5:%.*]] = extractvalue { ptr, i32 } [[TMP4]], 0, !dbg [[DBG43]]
1628*d7c69c20SDavid Pagan // CHECK5-NEXT:    call void @__clang_call_terminate(ptr [[TMP5]]) #[[ATTR10:[0-9]+]], !dbg [[DBG43]]
1629*d7c69c20SDavid Pagan // CHECK5-NEXT:    unreachable, !dbg [[DBG43]]
1630*d7c69c20SDavid Pagan //
1631*d7c69c20SDavid Pagan //
1632*d7c69c20SDavid Pagan // CHECK5-LABEL: define {{[^@]+}}@_ZN3SSTIdEC1Ev
1633*d7c69c20SDavid Pagan // CHECK5-SAME: (ptr noundef nonnull align 8 dereferenceable(8) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] align 2 !dbg [[DBG51:![0-9]+]] {
1634*d7c69c20SDavid Pagan // CHECK5-NEXT:  entry:
1635*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[THIS_ADDR:%.*]] = alloca ptr, align 8
1636*d7c69c20SDavid Pagan // CHECK5-NEXT:    store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
1637*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8
1638*d7c69c20SDavid Pagan // CHECK5-NEXT:    call void @_ZN3SSTIdEC2Ev(ptr noundef nonnull align 8 dereferenceable(8) [[THIS1]]), !dbg [[DBG52:![0-9]+]]
1639*d7c69c20SDavid Pagan // CHECK5-NEXT:    ret void, !dbg [[DBG53:![0-9]+]]
1640*d7c69c20SDavid Pagan //
1641*d7c69c20SDavid Pagan //
1642*d7c69c20SDavid Pagan // CHECK5-LABEL: define {{[^@]+}}@_ZN2SSC1ERi
1643*d7c69c20SDavid Pagan // CHECK5-SAME: (ptr noundef nonnull align 8 dereferenceable(24) [[THIS:%.*]], ptr noundef nonnull align 4 dereferenceable(4) [[D:%.*]]) unnamed_addr #[[ATTR1]] align 2 !dbg [[DBG54:![0-9]+]] {
1644*d7c69c20SDavid Pagan // CHECK5-NEXT:  entry:
1645*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[THIS_ADDR:%.*]] = alloca ptr, align 8
1646*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[D_ADDR:%.*]] = alloca ptr, align 8
1647*d7c69c20SDavid Pagan // CHECK5-NEXT:    store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
1648*d7c69c20SDavid Pagan // CHECK5-NEXT:    store ptr [[D]], ptr [[D_ADDR]], align 8
1649*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8
1650*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[TMP0:%.*]] = load ptr, ptr [[D_ADDR]], align 8, !dbg [[DBG55:![0-9]+]]
1651*d7c69c20SDavid Pagan // CHECK5-NEXT:    call void @_ZN2SSC2ERi(ptr noundef nonnull align 8 dereferenceable(24) [[THIS1]], ptr noundef nonnull align 4 dereferenceable(4) [[TMP0]]), !dbg [[DBG55]]
1652*d7c69c20SDavid Pagan // CHECK5-NEXT:    ret void, !dbg [[DBG56:![0-9]+]]
1653*d7c69c20SDavid Pagan //
1654*d7c69c20SDavid Pagan //
1655*d7c69c20SDavid Pagan // CHECK5-LABEL: define {{[^@]+}}@_ZN9TestClassC1ERKS_
1656*d7c69c20SDavid Pagan // CHECK5-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[THIS:%.*]], ptr noundef nonnull align 4 dereferenceable(4) [[C:%.*]]) unnamed_addr #[[ATTR1]] align 2 !dbg [[DBG57:![0-9]+]] {
1657*d7c69c20SDavid Pagan // CHECK5-NEXT:  entry:
1658*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[THIS_ADDR:%.*]] = alloca ptr, align 8
1659*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[C_ADDR:%.*]] = alloca ptr, align 8
1660*d7c69c20SDavid Pagan // CHECK5-NEXT:    store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
1661*d7c69c20SDavid Pagan // CHECK5-NEXT:    store ptr [[C]], ptr [[C_ADDR]], align 8
1662*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8
1663*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[TMP0:%.*]] = load ptr, ptr [[C_ADDR]], align 8, !dbg [[DBG58:![0-9]+]]
1664*d7c69c20SDavid Pagan // CHECK5-NEXT:    call void @_ZN9TestClassC2ERKS_(ptr noundef nonnull align 4 dereferenceable(4) [[THIS1]], ptr noundef nonnull align 4 dereferenceable(4) [[TMP0]]), !dbg [[DBG58]]
1665*d7c69c20SDavid Pagan // CHECK5-NEXT:    ret void, !dbg [[DBG59:![0-9]+]]
1666*d7c69c20SDavid Pagan //
1667*d7c69c20SDavid Pagan //
1668*d7c69c20SDavid Pagan // CHECK5-LABEL: define {{[^@]+}}@__clang_call_terminate
1669*d7c69c20SDavid Pagan // CHECK5-SAME: (ptr noundef [[TMP0:%.*]]) #[[ATTR7:[0-9]+]] {
1670*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[TMP2:%.*]] = call ptr @__cxa_begin_catch(ptr [[TMP0]]) #[[ATTR3]]
1671*d7c69c20SDavid Pagan // CHECK5-NEXT:    call void @_ZSt9terminatev() #[[ATTR10]]
1672*d7c69c20SDavid Pagan // CHECK5-NEXT:    unreachable
1673*d7c69c20SDavid Pagan //
1674*d7c69c20SDavid Pagan //
1675*d7c69c20SDavid Pagan // CHECK5-LABEL: define {{[^@]+}}@_ZN3SSTIdEC2Ev
1676*d7c69c20SDavid Pagan // CHECK5-SAME: (ptr noundef nonnull align 8 dereferenceable(8) [[THIS:%.*]]) unnamed_addr #[[ATTR2]] align 2 !dbg [[DBG60:![0-9]+]] {
1677*d7c69c20SDavid Pagan // CHECK5-NEXT:  entry:
1678*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[THIS_ADDR:%.*]] = alloca ptr, align 8
1679*d7c69c20SDavid Pagan // CHECK5-NEXT:    store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
1680*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8
1681*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[A:%.*]] = getelementptr inbounds nuw [[STRUCT_SST:%.*]], ptr [[THIS1]], i32 0, i32 0, !dbg [[DBG61:![0-9]+]]
1682*d7c69c20SDavid Pagan // CHECK5-NEXT:    store double 0.000000e+00, ptr [[A]], align 8, !dbg [[DBG61]]
1683*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[TMP0:%.*]] = load ptr, ptr @omp_cgroup_mem_alloc, align 8, !dbg [[DBG62:![0-9]+]]
1684*d7c69c20SDavid Pagan // CHECK5-NEXT:    call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN3SSTIdEC1Ev_l70(ptr [[THIS1]], ptr [[TMP0]]) #[[ATTR3]], !dbg [[DBG62]]
1685*d7c69c20SDavid Pagan // CHECK5-NEXT:    ret void, !dbg [[DBG63:![0-9]+]]
1686*d7c69c20SDavid Pagan //
1687*d7c69c20SDavid Pagan //
1688*d7c69c20SDavid Pagan // CHECK5-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN3SSTIdEC1Ev_l70
1689*d7c69c20SDavid Pagan // CHECK5-SAME: (ptr noundef [[THIS:%.*]], ptr noundef [[OMP_CGROUP_MEM_ALLOC:%.*]]) #[[ATTR8:[0-9]+]] !dbg [[DBG64:![0-9]+]] {
1690*d7c69c20SDavid Pagan // CHECK5-NEXT:  entry:
1691*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[THIS_ADDR:%.*]] = alloca ptr, align 8
1692*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[OMP_CGROUP_MEM_ALLOC_ADDR:%.*]] = alloca ptr, align 8
1693*d7c69c20SDavid Pagan // CHECK5-NEXT:    store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
1694*d7c69c20SDavid Pagan // CHECK5-NEXT:    store ptr [[OMP_CGROUP_MEM_ALLOC]], ptr [[OMP_CGROUP_MEM_ALLOC_ADDR]], align 8
1695*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[TMP0:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8, !dbg [[DBG65:![0-9]+]]
1696*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[TMP1:%.*]] = load ptr, ptr [[OMP_CGROUP_MEM_ALLOC_ADDR]], align 8, !dbg [[DBG65]]
1697*d7c69c20SDavid Pagan // CHECK5-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_teams(ptr @[[GLOB10:[0-9]+]], i32 2, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN3SSTIdEC1Ev_l70.omp_outlined, ptr [[TMP0]], ptr [[TMP1]]), !dbg [[DBG65]]
1698*d7c69c20SDavid Pagan // CHECK5-NEXT:    ret void, !dbg [[DBG66:![0-9]+]]
1699*d7c69c20SDavid Pagan //
1700*d7c69c20SDavid Pagan //
1701*d7c69c20SDavid Pagan // CHECK5-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN3SSTIdEC1Ev_l70.omp_outlined
1702*d7c69c20SDavid Pagan // CHECK5-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], ptr noundef [[THIS:%.*]], ptr noundef [[OMP_CGROUP_MEM_ALLOC:%.*]]) #[[ATTR8]] !dbg [[DBG67:![0-9]+]] {
1703*d7c69c20SDavid Pagan // CHECK5-NEXT:  entry:
1704*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 8
1705*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 8
1706*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[THIS_ADDR:%.*]] = alloca ptr, align 8
1707*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[OMP_CGROUP_MEM_ALLOC_ADDR:%.*]] = alloca ptr, align 8
1708*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[A:%.*]] = alloca ptr, align 8
1709*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[A_CASTED:%.*]] = alloca i64, align 8
1710*d7c69c20SDavid Pagan // CHECK5-NEXT:    store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 8
1711*d7c69c20SDavid Pagan // CHECK5-NEXT:    store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 8
1712*d7c69c20SDavid Pagan // CHECK5-NEXT:    store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
1713*d7c69c20SDavid Pagan // CHECK5-NEXT:    store ptr [[OMP_CGROUP_MEM_ALLOC]], ptr [[OMP_CGROUP_MEM_ALLOC_ADDR]], align 8
1714*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[TMP0:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8, !dbg [[DBG68:![0-9]+]]
1715*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[A1:%.*]] = getelementptr inbounds nuw [[STRUCT_SST:%.*]], ptr [[TMP0]], i32 0, i32 0, !dbg [[DBG69:![0-9]+]]
1716*d7c69c20SDavid Pagan // CHECK5-NEXT:    store ptr [[A1]], ptr [[A]], align 8, !dbg [[DBG69]]
1717*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[TMP1:%.*]] = load ptr, ptr [[A]], align 8, !dbg [[DBG69]]
1718*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[TMP2:%.*]] = load double, ptr [[TMP1]], align 8, !dbg [[DBG70:![0-9]+]]
1719*d7c69c20SDavid Pagan // CHECK5-NEXT:    store double [[TMP2]], ptr [[A_CASTED]], align 8, !dbg [[DBG70]]
1720*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[TMP3:%.*]] = load i64, ptr [[A_CASTED]], align 8, !dbg [[DBG70]]
1721*d7c69c20SDavid Pagan // CHECK5-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB8:[0-9]+]], i32 3, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN3SSTIdEC1Ev_l70.omp_outlined.omp_outlined, ptr [[TMP0]], ptr [[OMP_CGROUP_MEM_ALLOC_ADDR]], i64 [[TMP3]]), !dbg [[DBG70]]
1722*d7c69c20SDavid Pagan // CHECK5-NEXT:    ret void, !dbg [[DBG71:![0-9]+]]
1723*d7c69c20SDavid Pagan //
1724*d7c69c20SDavid Pagan //
1725*d7c69c20SDavid Pagan // CHECK5-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN3SSTIdEC1Ev_l70.omp_outlined.omp_outlined
1726*d7c69c20SDavid Pagan // CHECK5-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], ptr noundef [[THIS:%.*]], ptr noundef nonnull align 8 dereferenceable(8) [[OMP_CGROUP_MEM_ALLOC:%.*]], i64 noundef [[A:%.*]]) #[[ATTR8]] personality ptr @__gxx_personality_v0 !dbg [[DBG72:![0-9]+]] {
1727*d7c69c20SDavid Pagan // CHECK5-NEXT:  entry:
1728*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 8
1729*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 8
1730*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[THIS_ADDR:%.*]] = alloca ptr, align 8
1731*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[OMP_CGROUP_MEM_ALLOC_ADDR:%.*]] = alloca ptr, align 8
1732*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[A_ADDR:%.*]] = alloca i64, align 8
1733*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[TMP:%.*]] = alloca ptr, align 8
1734*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[A1:%.*]] = alloca double, align 8
1735*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[_TMP2:%.*]] = alloca ptr, align 8
1736*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[REF_TMP:%.*]] = alloca [[CLASS_ANON:%.*]], align 8
1737*d7c69c20SDavid Pagan // CHECK5-NEXT:    store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 8
1738*d7c69c20SDavid Pagan // CHECK5-NEXT:    store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 8
1739*d7c69c20SDavid Pagan // CHECK5-NEXT:    store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
1740*d7c69c20SDavid Pagan // CHECK5-NEXT:    store ptr [[OMP_CGROUP_MEM_ALLOC]], ptr [[OMP_CGROUP_MEM_ALLOC_ADDR]], align 8
1741*d7c69c20SDavid Pagan // CHECK5-NEXT:    store i64 [[A]], ptr [[A_ADDR]], align 8
1742*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[TMP0:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8, !dbg [[DBG73:![0-9]+]]
1743*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[TMP1:%.*]] = load ptr, ptr [[OMP_CGROUP_MEM_ALLOC_ADDR]], align 8, !dbg [[DBG73]]
1744*d7c69c20SDavid Pagan // CHECK5-NEXT:    store ptr [[A_ADDR]], ptr [[TMP]], align 8, !dbg [[DBG73]]
1745*d7c69c20SDavid Pagan // CHECK5-NEXT:    store ptr [[A1]], ptr [[_TMP2]], align 8, !dbg [[DBG74:![0-9]+]]
1746*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[TMP2:%.*]] = getelementptr inbounds nuw [[CLASS_ANON]], ptr [[REF_TMP]], i32 0, i32 0, !dbg [[DBG75:![0-9]+]]
1747*d7c69c20SDavid Pagan // CHECK5-NEXT:    store ptr [[TMP0]], ptr [[TMP2]], align 8, !dbg [[DBG75]]
1748*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[TMP3:%.*]] = getelementptr inbounds nuw [[CLASS_ANON]], ptr [[REF_TMP]], i32 0, i32 1, !dbg [[DBG75]]
1749*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[TMP4:%.*]] = load ptr, ptr [[_TMP2]], align 8, !dbg [[DBG76:![0-9]+]]
1750*d7c69c20SDavid Pagan // CHECK5-NEXT:    store ptr [[TMP4]], ptr [[TMP3]], align 8, !dbg [[DBG75]]
1751*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[TMP5:%.*]] = getelementptr inbounds nuw [[CLASS_ANON]], ptr [[REF_TMP]], i32 0, i32 2, !dbg [[DBG75]]
1752*d7c69c20SDavid Pagan // CHECK5-NEXT:    store ptr [[TMP1]], ptr [[TMP5]], align 8, !dbg [[DBG75]]
1753*d7c69c20SDavid Pagan // CHECK5-NEXT:    invoke void @_ZZN3SSTIdEC1EvENKUlvE_clEv(ptr noundef nonnull align 8 dereferenceable(24) [[REF_TMP]])
1754*d7c69c20SDavid Pagan // CHECK5-NEXT:            to label [[INVOKE_CONT:%.*]] unwind label [[TERMINATE_LPAD:%.*]], !dbg [[DBG75]]
1755*d7c69c20SDavid Pagan // CHECK5:       invoke.cont:
1756*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[TMP6:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8, !dbg [[DBG77:![0-9]+]]
1757*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[TMP7:%.*]] = load i32, ptr [[TMP6]], align 4, !dbg [[DBG77]]
1758*d7c69c20SDavid Pagan // CHECK5-NEXT:    call void @__kmpc_barrier(ptr @[[GLOB6:[0-9]+]], i32 [[TMP7]]), !dbg [[DBG77]]
1759*d7c69c20SDavid Pagan // CHECK5-NEXT:    ret void, !dbg [[DBG77]]
1760*d7c69c20SDavid Pagan // CHECK5:       terminate.lpad:
1761*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[TMP8:%.*]] = landingpad { ptr, i32 }
1762*d7c69c20SDavid Pagan // CHECK5-NEXT:            catch ptr null, !dbg [[DBG75]]
1763*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[TMP9:%.*]] = extractvalue { ptr, i32 } [[TMP8]], 0, !dbg [[DBG75]]
1764*d7c69c20SDavid Pagan // CHECK5-NEXT:    call void @__clang_call_terminate(ptr [[TMP9]]) #[[ATTR10]], !dbg [[DBG75]]
1765*d7c69c20SDavid Pagan // CHECK5-NEXT:    unreachable, !dbg [[DBG75]]
1766*d7c69c20SDavid Pagan //
1767*d7c69c20SDavid Pagan //
1768*d7c69c20SDavid Pagan // CHECK5-LABEL: define {{[^@]+}}@_ZZN3SSTIdEC1EvENKUlvE_clEv
1769*d7c69c20SDavid Pagan // CHECK5-SAME: (ptr noundef nonnull align 8 dereferenceable(24) [[THIS:%.*]]) #[[ATTR1]] align 2 !dbg [[DBG78:![0-9]+]] {
1770*d7c69c20SDavid Pagan // CHECK5-NEXT:  entry:
1771*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[THIS_ADDR:%.*]] = alloca ptr, align 8
1772*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[REF_TMP:%.*]] = alloca [[CLASS_ANON_0:%.*]], align 8
1773*d7c69c20SDavid Pagan // CHECK5-NEXT:    store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
1774*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8
1775*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[TMP0:%.*]] = getelementptr inbounds nuw [[CLASS_ANON:%.*]], ptr [[THIS1]], i32 0, i32 0
1776*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[TMP1:%.*]] = load ptr, ptr [[TMP0]], align 8
1777*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[TMP2:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_0]], ptr [[REF_TMP]], i32 0, i32 0, !dbg [[DBG79:![0-9]+]]
1778*d7c69c20SDavid Pagan // CHECK5-NEXT:    store ptr [[TMP1]], ptr [[TMP2]], align 8, !dbg [[DBG79]]
1779*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[TMP3:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_0]], ptr [[REF_TMP]], i32 0, i32 1, !dbg [[DBG79]]
1780*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[TMP4:%.*]] = getelementptr inbounds nuw [[CLASS_ANON]], ptr [[THIS1]], i32 0, i32 1, !dbg [[DBG80:![0-9]+]]
1781*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[TMP5:%.*]] = load ptr, ptr [[TMP4]], align 8, !dbg [[DBG80]]
1782*d7c69c20SDavid Pagan // CHECK5-NEXT:    store ptr [[TMP5]], ptr [[TMP3]], align 8, !dbg [[DBG79]]
1783*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[TMP6:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_0]], ptr [[REF_TMP]], i32 0, i32 2, !dbg [[DBG79]]
1784*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[TMP7:%.*]] = getelementptr inbounds nuw [[CLASS_ANON]], ptr [[THIS1]], i32 0, i32 2, !dbg [[DBG80]]
1785*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[TMP8:%.*]] = load ptr, ptr [[TMP7]], align 8, !dbg [[DBG80]]
1786*d7c69c20SDavid Pagan // CHECK5-NEXT:    store ptr [[TMP8]], ptr [[TMP6]], align 8, !dbg [[DBG79]]
1787*d7c69c20SDavid Pagan // CHECK5-NEXT:    call void @_ZZZN3SSTIdEC1EvENKUlvE_clEvENKUlvE_clEv(ptr noundef nonnull align 8 dereferenceable(24) [[REF_TMP]]), !dbg [[DBG79]]
1788*d7c69c20SDavid Pagan // CHECK5-NEXT:    ret void, !dbg [[DBG81:![0-9]+]]
1789*d7c69c20SDavid Pagan //
1790*d7c69c20SDavid Pagan //
1791*d7c69c20SDavid Pagan // CHECK5-LABEL: define {{[^@]+}}@_ZZZN3SSTIdEC1EvENKUlvE_clEvENKUlvE_clEv
1792*d7c69c20SDavid Pagan // CHECK5-SAME: (ptr noundef nonnull align 8 dereferenceable(24) [[THIS:%.*]]) #[[ATTR2]] align 2 !dbg [[DBG84:![0-9]+]] {
1793*d7c69c20SDavid Pagan // CHECK5-NEXT:  entry:
1794*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[THIS_ADDR:%.*]] = alloca ptr, align 8
1795*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[C:%.*]] = alloca i32, align 4
1796*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[A_CASTED:%.*]] = alloca i64, align 8
1797*d7c69c20SDavid Pagan // CHECK5-NEXT:    store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
1798*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8
1799*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[TMP0:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_0:%.*]], ptr [[THIS1]], i32 0, i32 0
1800*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[TMP1:%.*]] = load ptr, ptr [[TMP0]], align 8
1801*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[TMP2:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_0]], ptr [[THIS1]], i32 0, i32 1, !dbg [[DBG85:![0-9]+]]
1802*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[TMP3:%.*]] = load ptr, ptr [[TMP2]], align 8, !dbg [[DBG85]]
1803*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[TMP4:%.*]] = load double, ptr [[TMP3]], align 8, !dbg [[DBG86:![0-9]+]]
1804*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[INC:%.*]] = fadd double [[TMP4]], 1.000000e+00, !dbg [[DBG86]]
1805*d7c69c20SDavid Pagan // CHECK5-NEXT:    store double [[INC]], ptr [[TMP3]], align 8, !dbg [[DBG86]]
1806*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[TMP5:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_0]], ptr [[THIS1]], i32 0, i32 2, !dbg [[DBG87:![0-9]+]]
1807*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[TMP6:%.*]] = load ptr, ptr [[TMP5]], align 8, !dbg [[DBG87]]
1808*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[TMP7:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_0]], ptr [[THIS1]], i32 0, i32 1, !dbg [[DBG88:![0-9]+]]
1809*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[TMP8:%.*]] = load ptr, ptr [[TMP7]], align 8, !dbg [[DBG88]]
1810*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[TMP9:%.*]] = load double, ptr [[TMP8]], align 8, !dbg [[DBG89:![0-9]+]]
1811*d7c69c20SDavid Pagan // CHECK5-NEXT:    store double [[TMP9]], ptr [[A_CASTED]], align 8, !dbg [[DBG89]]
1812*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[TMP10:%.*]] = load i64, ptr [[A_CASTED]], align 8, !dbg [[DBG89]]
1813*d7c69c20SDavid Pagan // CHECK5-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB14:[0-9]+]], i32 3, ptr @_ZZZN3SSTIdEC1EvENKUlvE_clEvENKUlvE_clEv.omp_outlined, ptr [[TMP1]], ptr [[TMP6]], i64 [[TMP10]]), !dbg [[DBG89]]
1814*d7c69c20SDavid Pagan // CHECK5-NEXT:    ret void, !dbg [[DBG90:![0-9]+]]
1815*d7c69c20SDavid Pagan //
1816*d7c69c20SDavid Pagan //
1817*d7c69c20SDavid Pagan // CHECK5-LABEL: define {{[^@]+}}@_ZZZN3SSTIdEC1EvENKUlvE_clEvENKUlvE_clEv.omp_outlined
1818*d7c69c20SDavid Pagan // CHECK5-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], ptr noundef [[THIS:%.*]], ptr noundef nonnull align 8 dereferenceable(8) [[OMP_CGROUP_MEM_ALLOC:%.*]], i64 noundef [[A:%.*]]) #[[ATTR8]] !dbg [[DBG91:![0-9]+]] {
1819*d7c69c20SDavid Pagan // CHECK5-NEXT:  entry:
1820*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 8
1821*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 8
1822*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[THIS_ADDR:%.*]] = alloca ptr, align 8
1823*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[OMP_CGROUP_MEM_ALLOC_ADDR:%.*]] = alloca ptr, align 8
1824*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[A_ADDR:%.*]] = alloca i64, align 8
1825*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[TMP:%.*]] = alloca ptr, align 8
1826*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[_TMP1:%.*]] = alloca ptr, align 8
1827*d7c69c20SDavid Pagan // CHECK5-NEXT:    store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 8
1828*d7c69c20SDavid Pagan // CHECK5-NEXT:    store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 8
1829*d7c69c20SDavid Pagan // CHECK5-NEXT:    store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
1830*d7c69c20SDavid Pagan // CHECK5-NEXT:    store ptr [[OMP_CGROUP_MEM_ALLOC]], ptr [[OMP_CGROUP_MEM_ALLOC_ADDR]], align 8
1831*d7c69c20SDavid Pagan // CHECK5-NEXT:    store i64 [[A]], ptr [[A_ADDR]], align 8
1832*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[TMP0:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8, !dbg [[DBG92:![0-9]+]]
1833*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[TMP1:%.*]] = load ptr, ptr [[OMP_CGROUP_MEM_ALLOC_ADDR]], align 8, !dbg [[DBG92]]
1834*d7c69c20SDavid Pagan // CHECK5-NEXT:    store ptr [[A_ADDR]], ptr [[TMP]], align 8, !dbg [[DBG92]]
1835*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[TMP2:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8, !dbg [[DBG93:![0-9]+]]
1836*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[TMP3:%.*]] = load i32, ptr [[TMP2]], align 4, !dbg [[DBG93]]
1837*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[TMP4:%.*]] = load ptr, ptr [[TMP1]], align 8, !dbg [[DBG94:![0-9]+]]
1838*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[DOTA__VOID_ADDR:%.*]] = call ptr @__kmpc_alloc(i32 [[TMP3]], i64 8, ptr [[TMP4]]), !dbg [[DBG93]]
1839*d7c69c20SDavid Pagan // CHECK5-NEXT:    store ptr [[DOTA__VOID_ADDR]], ptr [[_TMP1]], align 8, !dbg [[DBG93]]
1840*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[TMP5:%.*]] = load ptr, ptr [[_TMP1]], align 8, !dbg [[DBG95:![0-9]+]]
1841*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[TMP6:%.*]] = load double, ptr [[TMP5]], align 8, !dbg [[DBG96:![0-9]+]]
1842*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[INC:%.*]] = fadd double [[TMP6]], 1.000000e+00, !dbg [[DBG96]]
1843*d7c69c20SDavid Pagan // CHECK5-NEXT:    store double [[INC]], ptr [[TMP5]], align 8, !dbg [[DBG96]]
1844*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[TMP7:%.*]] = load ptr, ptr [[TMP1]], align 8, !dbg [[DBG94]]
1845*d7c69c20SDavid Pagan // CHECK5-NEXT:    call void @__kmpc_free(i32 [[TMP3]], ptr [[DOTA__VOID_ADDR]], ptr [[TMP7]]), !dbg [[DBG96]]
1846*d7c69c20SDavid Pagan // CHECK5-NEXT:    call void @__kmpc_barrier(ptr @[[GLOB12:[0-9]+]], i32 [[TMP3]]), !dbg [[DBG97:![0-9]+]]
1847*d7c69c20SDavid Pagan // CHECK5-NEXT:    ret void, !dbg [[DBG97]]
1848*d7c69c20SDavid Pagan //
1849*d7c69c20SDavid Pagan //
1850*d7c69c20SDavid Pagan // CHECK5-LABEL: define {{[^@]+}}@_ZN2SSC2ERi
1851*d7c69c20SDavid Pagan // CHECK5-SAME: (ptr noundef nonnull align 8 dereferenceable(24) [[THIS:%.*]], ptr noundef nonnull align 4 dereferenceable(4) [[D:%.*]]) unnamed_addr #[[ATTR2]] align 2 personality ptr @__gxx_personality_v0 !dbg [[DBG98:![0-9]+]] {
1852*d7c69c20SDavid Pagan // CHECK5-NEXT:  entry:
1853*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[THIS_ADDR:%.*]] = alloca ptr, align 8
1854*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[D_ADDR:%.*]] = alloca ptr, align 8
1855*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[A2:%.*]] = alloca i32, align 4
1856*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[TMP:%.*]] = alloca ptr, align 8
1857*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[C3:%.*]] = alloca i32, align 4
1858*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[_TMP4:%.*]] = alloca ptr, align 8
1859*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[REF_TMP:%.*]] = alloca [[CLASS_ANON_1:%.*]], align 8
1860*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB16:[0-9]+]]), !dbg [[DBG99:![0-9]+]]
1861*d7c69c20SDavid Pagan // CHECK5-NEXT:    store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
1862*d7c69c20SDavid Pagan // CHECK5-NEXT:    store ptr [[D]], ptr [[D_ADDR]], align 8
1863*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8
1864*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[A:%.*]] = getelementptr inbounds nuw [[STRUCT_SS:%.*]], ptr [[THIS1]], i32 0, i32 1, !dbg [[DBG100:![0-9]+]]
1865*d7c69c20SDavid Pagan // CHECK5-NEXT:    store i32 0, ptr [[A]], align 4, !dbg [[DBG100]]
1866*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[B:%.*]] = getelementptr inbounds nuw [[STRUCT_SS]], ptr [[THIS1]], i32 0, i32 2, !dbg [[DBG101:![0-9]+]]
1867*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[BF_LOAD:%.*]] = load i8, ptr [[B]], align 8, !dbg [[DBG101]]
1868*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[BF_CLEAR:%.*]] = and i8 [[BF_LOAD]], -16, !dbg [[DBG101]]
1869*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[BF_SET:%.*]] = or i8 [[BF_CLEAR]], 0, !dbg [[DBG101]]
1870*d7c69c20SDavid Pagan // CHECK5-NEXT:    store i8 [[BF_SET]], ptr [[B]], align 8, !dbg [[DBG101]]
1871*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[C:%.*]] = getelementptr inbounds nuw [[STRUCT_SS]], ptr [[THIS1]], i32 0, i32 3, !dbg [[DBG102:![0-9]+]]
1872*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[TMP1:%.*]] = load ptr, ptr [[D_ADDR]], align 8, !dbg [[DBG103:![0-9]+]]
1873*d7c69c20SDavid Pagan // CHECK5-NEXT:    store ptr [[TMP1]], ptr [[C]], align 8, !dbg [[DBG102]]
1874*d7c69c20SDavid Pagan // CHECK5-NEXT:    store ptr [[A2]], ptr [[TMP]], align 8, !dbg [[DBG104:![0-9]+]]
1875*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[TMP2:%.*]] = load ptr, ptr @omp_default_mem_alloc, align 8, !dbg [[DBG105:![0-9]+]]
1876*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[DOTB__VOID_ADDR:%.*]] = call ptr @__kmpc_alloc(i32 [[TMP0]], i64 4, ptr [[TMP2]]), !dbg [[DBG104]]
1877*d7c69c20SDavid Pagan // CHECK5-NEXT:    store ptr [[C3]], ptr [[_TMP4]], align 8, !dbg [[DBG104]]
1878*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[TMP3:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_1]], ptr [[REF_TMP]], i32 0, i32 0, !dbg [[DBG106:![0-9]+]]
1879*d7c69c20SDavid Pagan // CHECK5-NEXT:    store ptr [[THIS1]], ptr [[TMP3]], align 8, !dbg [[DBG106]]
1880*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[TMP4:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_1]], ptr [[REF_TMP]], i32 0, i32 1, !dbg [[DBG106]]
1881*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[TMP5:%.*]] = load ptr, ptr [[TMP]], align 8, !dbg [[DBG107:![0-9]+]]
1882*d7c69c20SDavid Pagan // CHECK5-NEXT:    store ptr [[TMP5]], ptr [[TMP4]], align 8, !dbg [[DBG106]]
1883*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[TMP6:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_1]], ptr [[REF_TMP]], i32 0, i32 2, !dbg [[DBG106]]
1884*d7c69c20SDavid Pagan // CHECK5-NEXT:    store ptr [[DOTB__VOID_ADDR]], ptr [[TMP6]], align 8, !dbg [[DBG106]]
1885*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[TMP7:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_1]], ptr [[REF_TMP]], i32 0, i32 3, !dbg [[DBG106]]
1886*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[TMP8:%.*]] = load ptr, ptr [[_TMP4]], align 8, !dbg [[DBG107]]
1887*d7c69c20SDavid Pagan // CHECK5-NEXT:    store ptr [[TMP8]], ptr [[TMP7]], align 8, !dbg [[DBG106]]
1888*d7c69c20SDavid Pagan // CHECK5-NEXT:    invoke void @_ZZN2SSC1ERiENKUlvE_clEv(ptr noundef nonnull align 8 dereferenceable(32) [[REF_TMP]])
1889*d7c69c20SDavid Pagan // CHECK5-NEXT:            to label [[INVOKE_CONT:%.*]] unwind label [[TERMINATE_LPAD:%.*]], !dbg [[DBG106]]
1890*d7c69c20SDavid Pagan // CHECK5:       invoke.cont:
1891*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[TMP9:%.*]] = load ptr, ptr @omp_default_mem_alloc, align 8, !dbg [[DBG105]]
1892*d7c69c20SDavid Pagan // CHECK5-NEXT:    call void @__kmpc_free(i32 [[TMP0]], ptr [[DOTB__VOID_ADDR]], ptr [[TMP9]]), !dbg [[DBG106]]
1893*d7c69c20SDavid Pagan // CHECK5-NEXT:    ret void, !dbg [[DBG108:![0-9]+]]
1894*d7c69c20SDavid Pagan // CHECK5:       terminate.lpad:
1895*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[TMP10:%.*]] = landingpad { ptr, i32 }
1896*d7c69c20SDavid Pagan // CHECK5-NEXT:            catch ptr null, !dbg [[DBG106]]
1897*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[TMP11:%.*]] = extractvalue { ptr, i32 } [[TMP10]], 0, !dbg [[DBG106]]
1898*d7c69c20SDavid Pagan // CHECK5-NEXT:    call void @__clang_call_terminate(ptr [[TMP11]]) #[[ATTR10]], !dbg [[DBG106]]
1899*d7c69c20SDavid Pagan // CHECK5-NEXT:    unreachable, !dbg [[DBG106]]
1900*d7c69c20SDavid Pagan //
1901*d7c69c20SDavid Pagan //
1902*d7c69c20SDavid Pagan // CHECK5-LABEL: define {{[^@]+}}@_ZZN2SSC1ERiENKUlvE_clEv
1903*d7c69c20SDavid Pagan // CHECK5-SAME: (ptr noundef nonnull align 8 dereferenceable(32) [[THIS:%.*]]) #[[ATTR2]] align 2 !dbg [[DBG109:![0-9]+]] {
1904*d7c69c20SDavid Pagan // CHECK5-NEXT:  entry:
1905*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[THIS_ADDR:%.*]] = alloca ptr, align 8
1906*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB22:[0-9]+]]), !dbg [[DBG110:![0-9]+]]
1907*d7c69c20SDavid Pagan // CHECK5-NEXT:    store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
1908*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8
1909*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[TMP1:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_1:%.*]], ptr [[THIS1]], i32 0, i32 0
1910*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[TMP2:%.*]] = load ptr, ptr [[TMP1]], align 8
1911*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[TMP3:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_1]], ptr [[THIS1]], i32 0, i32 1, !dbg [[DBG111:![0-9]+]]
1912*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[TMP4:%.*]] = load ptr, ptr [[TMP3]], align 8, !dbg [[DBG111]]
1913*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[TMP5:%.*]] = load i32, ptr [[TMP4]], align 4, !dbg [[DBG112:![0-9]+]]
1914*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[INC:%.*]] = add nsw i32 [[TMP5]], 1, !dbg [[DBG112]]
1915*d7c69c20SDavid Pagan // CHECK5-NEXT:    store i32 [[INC]], ptr [[TMP4]], align 4, !dbg [[DBG112]]
1916*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[TMP6:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_1]], ptr [[THIS1]], i32 0, i32 2, !dbg [[DBG113:![0-9]+]]
1917*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[TMP7:%.*]] = load ptr, ptr [[TMP6]], align 8, !dbg [[DBG113]]
1918*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[TMP8:%.*]] = load i32, ptr [[TMP7]], align 4, !dbg [[DBG114:![0-9]+]]
1919*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[DEC:%.*]] = add nsw i32 [[TMP8]], -1, !dbg [[DBG114]]
1920*d7c69c20SDavid Pagan // CHECK5-NEXT:    store i32 [[DEC]], ptr [[TMP7]], align 4, !dbg [[DBG114]]
1921*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[TMP9:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_1]], ptr [[THIS1]], i32 0, i32 3, !dbg [[DBG115:![0-9]+]]
1922*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[TMP10:%.*]] = load ptr, ptr [[TMP9]], align 8, !dbg [[DBG115]]
1923*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[TMP11:%.*]] = load i32, ptr [[TMP10]], align 4, !dbg [[DBG116:![0-9]+]]
1924*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[DIV:%.*]] = sdiv i32 [[TMP11]], 1, !dbg [[DBG116]]
1925*d7c69c20SDavid Pagan // CHECK5-NEXT:    store i32 [[DIV]], ptr [[TMP10]], align 4, !dbg [[DBG116]]
1926*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[TMP12:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_1]], ptr [[THIS1]], i32 0, i32 2, !dbg [[DBG117:![0-9]+]]
1927*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[TMP13:%.*]] = load ptr, ptr [[TMP12]], align 8, !dbg [[DBG117]]
1928*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[TMP14:%.*]] = load i32, ptr [[TMP13]], align 4, !dbg [[DBG117]]
1929*d7c69c20SDavid Pagan // CHECK5-NEXT:    call void @__kmpc_push_num_threads(ptr @[[GLOB22]], i32 [[TMP0]], i32 [[TMP14]]), !dbg [[DBG118:![0-9]+]]
1930*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[TMP15:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_1]], ptr [[THIS1]], i32 0, i32 1, !dbg [[DBG119:![0-9]+]]
1931*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[TMP16:%.*]] = load ptr, ptr [[TMP15]], align 8, !dbg [[DBG119]]
1932*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[TMP17:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_1]], ptr [[THIS1]], i32 0, i32 2, !dbg [[DBG120:![0-9]+]]
1933*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[TMP18:%.*]] = load ptr, ptr [[TMP17]], align 8, !dbg [[DBG120]]
1934*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[TMP19:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_1]], ptr [[THIS1]], i32 0, i32 3, !dbg [[DBG121:![0-9]+]]
1935*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[TMP20:%.*]] = load ptr, ptr [[TMP19]], align 8, !dbg [[DBG121]]
1936*d7c69c20SDavid Pagan // CHECK5-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB24:[0-9]+]], i32 4, ptr @_ZZN2SSC1ERiENKUlvE_clEv.omp_outlined, ptr [[TMP2]], ptr [[TMP16]], ptr [[TMP18]], ptr [[TMP20]]), !dbg [[DBG118]]
1937*d7c69c20SDavid Pagan // CHECK5-NEXT:    ret void, !dbg [[DBG122:![0-9]+]]
1938*d7c69c20SDavid Pagan //
1939*d7c69c20SDavid Pagan //
1940*d7c69c20SDavid Pagan // CHECK5-LABEL: define {{[^@]+}}@_ZZN2SSC1ERiENKUlvE_clEv.omp_outlined
1941*d7c69c20SDavid Pagan // CHECK5-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], ptr noundef [[THIS:%.*]], ptr noundef nonnull align 4 dereferenceable(4) [[A:%.*]], ptr noundef nonnull align 4 dereferenceable(4) [[B:%.*]], ptr noundef nonnull align 4 dereferenceable(4) [[C:%.*]]) #[[ATTR8]] !dbg [[DBG123:![0-9]+]] {
1942*d7c69c20SDavid Pagan // CHECK5-NEXT:  entry:
1943*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 8
1944*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 8
1945*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[THIS_ADDR:%.*]] = alloca ptr, align 8
1946*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[A_ADDR:%.*]] = alloca ptr, align 8
1947*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[B_ADDR:%.*]] = alloca ptr, align 8
1948*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[C_ADDR:%.*]] = alloca ptr, align 8
1949*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[TMP:%.*]] = alloca ptr, align 8
1950*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[_TMP1:%.*]] = alloca ptr, align 8
1951*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[E:%.*]] = alloca ptr, align 8
1952*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[_TMP3:%.*]] = alloca ptr, align 8
1953*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[_TMP4:%.*]] = alloca ptr, align 8
1954*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[_TMP5:%.*]] = alloca ptr, align 8
1955*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[A6:%.*]] = alloca i32, align 4
1956*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[_TMP7:%.*]] = alloca ptr, align 8
1957*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[B8:%.*]] = alloca i32, align 4
1958*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[C9:%.*]] = alloca i32, align 4
1959*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[_TMP10:%.*]] = alloca ptr, align 8
1960*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[E11:%.*]] = alloca i32, align 4
1961*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[_TMP12:%.*]] = alloca ptr, align 8
1962*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[DOTOMP_REDUCTION_RED_LIST:%.*]] = alloca [1 x ptr], align 8
1963*d7c69c20SDavid Pagan // CHECK5-NEXT:    store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 8
1964*d7c69c20SDavid Pagan // CHECK5-NEXT:    store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 8
1965*d7c69c20SDavid Pagan // CHECK5-NEXT:    store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
1966*d7c69c20SDavid Pagan // CHECK5-NEXT:    store ptr [[A]], ptr [[A_ADDR]], align 8
1967*d7c69c20SDavid Pagan // CHECK5-NEXT:    store ptr [[B]], ptr [[B_ADDR]], align 8
1968*d7c69c20SDavid Pagan // CHECK5-NEXT:    store ptr [[C]], ptr [[C_ADDR]], align 8
1969*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[TMP0:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8, !dbg [[DBG124:![0-9]+]]
1970*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[TMP1:%.*]] = load ptr, ptr [[A_ADDR]], align 8, !dbg [[DBG124]]
1971*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[TMP2:%.*]] = load ptr, ptr [[B_ADDR]], align 8, !dbg [[DBG124]]
1972*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[TMP3:%.*]] = load ptr, ptr [[C_ADDR]], align 8, !dbg [[DBG124]]
1973*d7c69c20SDavid Pagan // CHECK5-NEXT:    store ptr [[TMP1]], ptr [[TMP]], align 8, !dbg [[DBG124]]
1974*d7c69c20SDavid Pagan // CHECK5-NEXT:    store ptr [[TMP3]], ptr [[_TMP1]], align 8, !dbg [[DBG124]]
1975*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[E2:%.*]] = getelementptr inbounds nuw [[STRUCT_SS:%.*]], ptr [[TMP0]], i32 0, i32 0, !dbg [[DBG125:![0-9]+]]
1976*d7c69c20SDavid Pagan // CHECK5-NEXT:    store ptr [[E2]], ptr [[E]], align 8, !dbg [[DBG125]]
1977*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[TMP4:%.*]] = load ptr, ptr [[TMP]], align 8, !dbg [[DBG126:![0-9]+]]
1978*d7c69c20SDavid Pagan // CHECK5-NEXT:    store ptr [[TMP4]], ptr [[_TMP3]], align 8, !dbg [[DBG127:![0-9]+]]
1979*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[TMP5:%.*]] = load ptr, ptr [[E]], align 8, !dbg [[DBG128:![0-9]+]]
1980*d7c69c20SDavid Pagan // CHECK5-NEXT:    store ptr [[TMP5]], ptr [[_TMP4]], align 8, !dbg [[DBG127]]
1981*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[TMP6:%.*]] = load ptr, ptr [[_TMP1]], align 8, !dbg [[DBG129:![0-9]+]]
1982*d7c69c20SDavid Pagan // CHECK5-NEXT:    store ptr [[TMP6]], ptr [[_TMP5]], align 8, !dbg [[DBG127]]
1983*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[TMP7:%.*]] = load ptr, ptr [[_TMP3]], align 8, !dbg [[DBG130:![0-9]+]]
1984*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[TMP8:%.*]] = load i32, ptr [[TMP7]], align 4, !dbg [[DBG130]]
1985*d7c69c20SDavid Pagan // CHECK5-NEXT:    store i32 [[TMP8]], ptr [[A6]], align 4, !dbg [[DBG130]]
1986*d7c69c20SDavid Pagan // CHECK5-NEXT:    store ptr [[A6]], ptr [[_TMP7]], align 8, !dbg [[DBG127]]
1987*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[TMP9:%.*]] = load i32, ptr [[TMP2]], align 4, !dbg [[DBG131:![0-9]+]]
1988*d7c69c20SDavid Pagan // CHECK5-NEXT:    store i32 [[TMP9]], ptr [[B8]], align 4, !dbg [[DBG131]]
1989*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[TMP10:%.*]] = load ptr, ptr [[_TMP5]], align 8, !dbg [[DBG132:![0-9]+]]
1990*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[TMP11:%.*]] = load i32, ptr [[TMP10]], align 4, !dbg [[DBG132]]
1991*d7c69c20SDavid Pagan // CHECK5-NEXT:    store i32 [[TMP11]], ptr [[C9]], align 4, !dbg [[DBG132]]
1992*d7c69c20SDavid Pagan // CHECK5-NEXT:    store ptr [[C9]], ptr [[_TMP10]], align 8, !dbg [[DBG127]]
1993*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[TMP12:%.*]] = load ptr, ptr [[_TMP4]], align 8, !dbg [[DBG125]]
1994*d7c69c20SDavid Pagan // CHECK5-NEXT:    store i32 0, ptr [[E11]], align 4, !dbg [[DBG125]]
1995*d7c69c20SDavid Pagan // CHECK5-NEXT:    store ptr [[E11]], ptr [[_TMP12]], align 8, !dbg [[DBG127]]
1996*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[TMP13:%.*]] = load ptr, ptr [[_TMP7]], align 8, !dbg [[DBG126]]
1997*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[TMP14:%.*]] = load i32, ptr [[TMP13]], align 4, !dbg [[DBG133:![0-9]+]]
1998*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[INC:%.*]] = add nsw i32 [[TMP14]], 1, !dbg [[DBG133]]
1999*d7c69c20SDavid Pagan // CHECK5-NEXT:    store i32 [[INC]], ptr [[TMP13]], align 4, !dbg [[DBG133]]
2000*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[TMP15:%.*]] = load ptr, ptr [[_TMP12]], align 8, !dbg [[DBG128]]
2001*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[TMP16:%.*]] = load i32, ptr [[TMP15]], align 4, !dbg [[DBG134:![0-9]+]]
2002*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP16]], 1, !dbg [[DBG134]]
2003*d7c69c20SDavid Pagan // CHECK5-NEXT:    store i32 [[ADD]], ptr [[TMP15]], align 4, !dbg [[DBG134]]
2004*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[TMP17:%.*]] = load ptr, ptr [[_TMP10]], align 8, !dbg [[DBG129]]
2005*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[TMP18:%.*]] = load i32, ptr [[TMP17]], align 4, !dbg [[DBG135:![0-9]+]]
2006*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[DIV:%.*]] = sdiv i32 [[TMP18]], 1, !dbg [[DBG135]]
2007*d7c69c20SDavid Pagan // CHECK5-NEXT:    store i32 [[DIV]], ptr [[TMP17]], align 4, !dbg [[DBG135]]
2008*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[TMP19:%.*]] = getelementptr inbounds [1 x ptr], ptr [[DOTOMP_REDUCTION_RED_LIST]], i64 0, i64 0, !dbg [[DBG133]]
2009*d7c69c20SDavid Pagan // CHECK5-NEXT:    store ptr [[E11]], ptr [[TMP19]], align 8, !dbg [[DBG133]]
2010*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[TMP20:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8, !dbg [[DBG133]]
2011*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[TMP21:%.*]] = load i32, ptr [[TMP20]], align 4, !dbg [[DBG133]]
2012*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[TMP22:%.*]] = call i32 @__kmpc_reduce(ptr @[[GLOB18:[0-9]+]], i32 [[TMP21]], i32 1, i64 8, ptr [[DOTOMP_REDUCTION_RED_LIST]], ptr @_ZZN2SSC1ERiENKUlvE_clEv.omp_outlined.omp.reduction.reduction_func, ptr @.gomp_critical_user_.reduction.var), !dbg [[DBG133]]
2013*d7c69c20SDavid Pagan // CHECK5-NEXT:    switch i32 [[TMP22]], label [[DOTOMP_REDUCTION_DEFAULT:%.*]] [
2014*d7c69c20SDavid Pagan // CHECK5-NEXT:      i32 1, label [[DOTOMP_REDUCTION_CASE1:%.*]]
2015*d7c69c20SDavid Pagan // CHECK5-NEXT:      i32 2, label [[DOTOMP_REDUCTION_CASE2:%.*]]
2016*d7c69c20SDavid Pagan // CHECK5-NEXT:    ], !dbg [[DBG133]]
2017*d7c69c20SDavid Pagan // CHECK5:       .omp.reduction.case1:
2018*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[TMP23:%.*]] = load i32, ptr [[TMP12]], align 4, !dbg [[DBG125]]
2019*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[TMP24:%.*]] = load i32, ptr [[E11]], align 4, !dbg [[DBG125]]
2020*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[ADD13:%.*]] = add nsw i32 [[TMP23]], [[TMP24]], !dbg [[DBG136:![0-9]+]]
2021*d7c69c20SDavid Pagan // CHECK5-NEXT:    store i32 [[ADD13]], ptr [[TMP12]], align 4, !dbg [[DBG136]]
2022*d7c69c20SDavid Pagan // CHECK5-NEXT:    call void @__kmpc_end_reduce(ptr @[[GLOB18]], i32 [[TMP21]], ptr @.gomp_critical_user_.reduction.var), !dbg [[DBG133]]
2023*d7c69c20SDavid Pagan // CHECK5-NEXT:    br label [[DOTOMP_REDUCTION_DEFAULT]], !dbg [[DBG133]]
2024*d7c69c20SDavid Pagan // CHECK5:       .omp.reduction.case2:
2025*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[TMP25:%.*]] = load i32, ptr [[E11]], align 4, !dbg [[DBG125]]
2026*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[TMP26:%.*]] = atomicrmw add ptr [[TMP12]], i32 [[TMP25]] monotonic, align 4, !dbg [[DBG133]]
2027*d7c69c20SDavid Pagan // CHECK5-NEXT:    call void @__kmpc_end_reduce(ptr @[[GLOB18]], i32 [[TMP21]], ptr @.gomp_critical_user_.reduction.var), !dbg [[DBG133]]
2028*d7c69c20SDavid Pagan // CHECK5-NEXT:    br label [[DOTOMP_REDUCTION_DEFAULT]], !dbg [[DBG133]]
2029*d7c69c20SDavid Pagan // CHECK5:       .omp.reduction.default:
2030*d7c69c20SDavid Pagan // CHECK5-NEXT:    call void @__kmpc_barrier(ptr @[[GLOB20:[0-9]+]], i32 [[TMP21]]), !dbg [[DBG137:![0-9]+]]
2031*d7c69c20SDavid Pagan // CHECK5-NEXT:    ret void, !dbg [[DBG137]]
2032*d7c69c20SDavid Pagan //
2033*d7c69c20SDavid Pagan //
2034*d7c69c20SDavid Pagan // CHECK5-LABEL: define {{[^@]+}}@_ZZN2SSC1ERiENKUlvE_clEv.omp_outlined.omp.reduction.reduction_func
2035*d7c69c20SDavid Pagan // CHECK5-SAME: (ptr noundef [[TMP0:%.*]], ptr noundef [[TMP1:%.*]]) #[[ATTR9:[0-9]+]] !dbg [[DBG138:![0-9]+]] {
2036*d7c69c20SDavid Pagan // CHECK5-NEXT:  entry:
2037*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[DOTADDR:%.*]] = alloca ptr, align 8
2038*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[DOTADDR1:%.*]] = alloca ptr, align 8
2039*d7c69c20SDavid Pagan // CHECK5-NEXT:    store ptr [[TMP0]], ptr [[DOTADDR]], align 8
2040*d7c69c20SDavid Pagan // CHECK5-NEXT:    store ptr [[TMP1]], ptr [[DOTADDR1]], align 8
2041*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[TMP2:%.*]] = load ptr, ptr [[DOTADDR]], align 8, !dbg [[DBG139:![0-9]+]]
2042*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[TMP3:%.*]] = load ptr, ptr [[DOTADDR1]], align 8, !dbg [[DBG139]]
2043*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[TMP4:%.*]] = getelementptr inbounds [1 x ptr], ptr [[TMP3]], i64 0, i64 0, !dbg [[DBG139]]
2044*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[TMP5:%.*]] = load ptr, ptr [[TMP4]], align 8, !dbg [[DBG139]]
2045*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[TMP6:%.*]] = getelementptr inbounds [1 x ptr], ptr [[TMP2]], i64 0, i64 0, !dbg [[DBG139]]
2046*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[TMP7:%.*]] = load ptr, ptr [[TMP6]], align 8, !dbg [[DBG139]]
2047*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[TMP8:%.*]] = load i32, ptr [[TMP7]], align 4, !dbg [[DBG140:![0-9]+]]
2048*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[TMP9:%.*]] = load i32, ptr [[TMP5]], align 4, !dbg [[DBG140]]
2049*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP8]], [[TMP9]], !dbg [[DBG141:![0-9]+]]
2050*d7c69c20SDavid Pagan // CHECK5-NEXT:    store i32 [[ADD]], ptr [[TMP7]], align 4, !dbg [[DBG141]]
2051*d7c69c20SDavid Pagan // CHECK5-NEXT:    ret void, !dbg [[DBG140]]
2052*d7c69c20SDavid Pagan //
2053*d7c69c20SDavid Pagan //
2054*d7c69c20SDavid Pagan // CHECK5-LABEL: define {{[^@]+}}@_ZN9TestClassC2ERKS_
2055*d7c69c20SDavid Pagan // CHECK5-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[THIS:%.*]], ptr noundef nonnull align 4 dereferenceable(4) [[C:%.*]]) unnamed_addr #[[ATTR2]] align 2 !dbg [[DBG142:![0-9]+]] {
2056*d7c69c20SDavid Pagan // CHECK5-NEXT:  entry:
2057*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[THIS_ADDR:%.*]] = alloca ptr, align 8
2058*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[C_ADDR:%.*]] = alloca ptr, align 8
2059*d7c69c20SDavid Pagan // CHECK5-NEXT:    store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
2060*d7c69c20SDavid Pagan // CHECK5-NEXT:    store ptr [[C]], ptr [[C_ADDR]], align 8
2061*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8
2062*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[A:%.*]] = getelementptr inbounds nuw [[CLASS_TESTCLASS:%.*]], ptr [[THIS1]], i32 0, i32 0, !dbg [[DBG143:![0-9]+]]
2063*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[TMP0:%.*]] = load ptr, ptr [[C_ADDR]], align 8, !dbg [[DBG144:![0-9]+]]
2064*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[A2:%.*]] = getelementptr inbounds nuw [[CLASS_TESTCLASS]], ptr [[TMP0]], i32 0, i32 0, !dbg [[DBG145:![0-9]+]]
2065*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[TMP1:%.*]] = load i32, ptr [[A2]], align 4, !dbg [[DBG145]]
2066*d7c69c20SDavid Pagan // CHECK5-NEXT:    store i32 [[TMP1]], ptr [[A]], align 4, !dbg [[DBG143]]
2067*d7c69c20SDavid Pagan // CHECK5-NEXT:    ret void, !dbg [[DBG146:![0-9]+]]
2068*d7c69c20SDavid Pagan //
2069*d7c69c20SDavid Pagan //
2070*d7c69c20SDavid Pagan // CHECK5-LABEL: define {{[^@]+}}@_Z15parallel_singlev
2071*d7c69c20SDavid Pagan // CHECK5-SAME: () #[[ATTR2]] !dbg [[DBG147:![0-9]+]] {
2072*d7c69c20SDavid Pagan // CHECK5-NEXT:  entry:
2073*d7c69c20SDavid Pagan // CHECK5-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB28:[0-9]+]], i32 0, ptr @_Z15parallel_singlev.omp_outlined), !dbg [[DBG148:![0-9]+]]
2074*d7c69c20SDavid Pagan // CHECK5-NEXT:    ret void, !dbg [[DBG149:![0-9]+]]
2075*d7c69c20SDavid Pagan //
2076*d7c69c20SDavid Pagan //
2077*d7c69c20SDavid Pagan // CHECK5-LABEL: define {{[^@]+}}@_Z15parallel_singlev.omp_outlined
2078*d7c69c20SDavid Pagan // CHECK5-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]]) #[[ATTR8]] personality ptr @__gxx_personality_v0 !dbg [[DBG150:![0-9]+]] {
2079*d7c69c20SDavid Pagan // CHECK5-NEXT:  entry:
2080*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 8
2081*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 8
2082*d7c69c20SDavid Pagan // CHECK5-NEXT:    store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 8
2083*d7c69c20SDavid Pagan // CHECK5-NEXT:    store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 8
2084*d7c69c20SDavid Pagan // CHECK5-NEXT:    invoke void @_Z3foov()
2085*d7c69c20SDavid Pagan // CHECK5-NEXT:            to label [[INVOKE_CONT:%.*]] unwind label [[TERMINATE_LPAD:%.*]], !dbg [[DBG151:![0-9]+]]
2086*d7c69c20SDavid Pagan // CHECK5:       invoke.cont:
2087*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[TMP0:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8, !dbg [[DBG152:![0-9]+]]
2088*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 4, !dbg [[DBG152]]
2089*d7c69c20SDavid Pagan // CHECK5-NEXT:    call void @__kmpc_barrier(ptr @[[GLOB26:[0-9]+]], i32 [[TMP1]]), !dbg [[DBG152]]
2090*d7c69c20SDavid Pagan // CHECK5-NEXT:    ret void, !dbg [[DBG152]]
2091*d7c69c20SDavid Pagan // CHECK5:       terminate.lpad:
2092*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[TMP2:%.*]] = landingpad { ptr, i32 }
2093*d7c69c20SDavid Pagan // CHECK5-NEXT:            catch ptr null, !dbg [[DBG151]]
2094*d7c69c20SDavid Pagan // CHECK5-NEXT:    [[TMP3:%.*]] = extractvalue { ptr, i32 } [[TMP2]], 0, !dbg [[DBG151]]
2095*d7c69c20SDavid Pagan // CHECK5-NEXT:    call void @__clang_call_terminate(ptr [[TMP3]]) #[[ATTR10]], !dbg [[DBG151]]
2096*d7c69c20SDavid Pagan // CHECK5-NEXT:    unreachable, !dbg [[DBG151]]
2097*d7c69c20SDavid Pagan //
2098*d7c69c20SDavid Pagan //
2099*d7c69c20SDavid Pagan // CHECK5-LABEL: define {{[^@]+}}@_GLOBAL__sub_I_scope_codegen.cpp
2100*d7c69c20SDavid Pagan // CHECK5-SAME: () #[[ATTR0]] section "__TEXT,__StaticInit,regular,pure_instructions" !dbg [[DBG153:![0-9]+]] {
2101*d7c69c20SDavid Pagan // CHECK5-NEXT:  entry:
2102*d7c69c20SDavid Pagan // CHECK5-NEXT:    call void @__cxx_global_var_init(), !dbg [[DBG154:![0-9]+]]
2103*d7c69c20SDavid Pagan // CHECK5-NEXT:    call void @__cxx_global_var_init.1(), !dbg [[DBG154]]
2104*d7c69c20SDavid Pagan // CHECK5-NEXT:    ret void
2105*d7c69c20SDavid Pagan //
2106*d7c69c20SDavid Pagan //
2107*d7c69c20SDavid Pagan // CHECK6-LABEL: define {{[^@]+}}@_Z10array_funciPiP2St
2108*d7c69c20SDavid Pagan // CHECK6-SAME: (i32 noundef [[N:%.*]], ptr noundef [[A:%.*]], ptr noundef [[S:%.*]]) #[[ATTR0:[0-9]+]] {
2109*d7c69c20SDavid Pagan // CHECK6-NEXT:  entry:
2110*d7c69c20SDavid Pagan // CHECK6-NEXT:    [[N_ADDR:%.*]] = alloca i32, align 4
2111*d7c69c20SDavid Pagan // CHECK6-NEXT:    [[A_ADDR:%.*]] = alloca ptr, align 8
2112*d7c69c20SDavid Pagan // CHECK6-NEXT:    [[S_ADDR:%.*]] = alloca ptr, align 8
2113*d7c69c20SDavid Pagan // CHECK6-NEXT:    [[B:%.*]] = alloca i32, align 4
2114*d7c69c20SDavid Pagan // CHECK6-NEXT:    [[C:%.*]] = alloca i32, align 4
2115*d7c69c20SDavid Pagan // CHECK6-NEXT:    [[B1:%.*]] = alloca i32, align 4
2116*d7c69c20SDavid Pagan // CHECK6-NEXT:    [[A2:%.*]] = alloca ptr, align 8
2117*d7c69c20SDavid Pagan // CHECK6-NEXT:    [[S3:%.*]] = alloca ptr, align 8
2118*d7c69c20SDavid Pagan // CHECK6-NEXT:    [[DOTOMP_REDUCTION_RED_LIST:%.*]] = alloca [1 x ptr], align 8
2119*d7c69c20SDavid Pagan // CHECK6-NEXT:    [[ATOMIC_TEMP:%.*]] = alloca i32, align 4
2120*d7c69c20SDavid Pagan // CHECK6-NEXT:    [[TMP:%.*]] = alloca i32, align 4
2121*d7c69c20SDavid Pagan // CHECK6-NEXT:    [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1:[0-9]+]])
2122*d7c69c20SDavid Pagan // CHECK6-NEXT:    store i32 [[N]], ptr [[N_ADDR]], align 4
2123*d7c69c20SDavid Pagan // CHECK6-NEXT:    store ptr [[A]], ptr [[A_ADDR]], align 8
2124*d7c69c20SDavid Pagan // CHECK6-NEXT:    store ptr [[S]], ptr [[S_ADDR]], align 8
2125*d7c69c20SDavid Pagan // CHECK6-NEXT:    [[TMP1:%.*]] = load i32, ptr [[N_ADDR]], align 4
2126*d7c69c20SDavid Pagan // CHECK6-NEXT:    [[TMP2:%.*]] = zext i32 [[TMP1]] to i64
2127*d7c69c20SDavid Pagan // CHECK6-NEXT:    [[TMP3:%.*]] = load i32, ptr [[B]], align 4
2128*d7c69c20SDavid Pagan // CHECK6-NEXT:    store i32 [[TMP3]], ptr [[B1]], align 4
2129*d7c69c20SDavid Pagan // CHECK6-NEXT:    [[TMP4:%.*]] = load ptr, ptr @omp_high_bw_mem_alloc, align 8
2130*d7c69c20SDavid Pagan // CHECK6-NEXT:    [[DOTC__VOID_ADDR:%.*]] = call ptr @__kmpc_alloc(i32 [[TMP0]], i64 4, ptr [[TMP4]])
2131*d7c69c20SDavid Pagan // CHECK6-NEXT:    store i32 1, ptr [[DOTC__VOID_ADDR]], align 4
2132*d7c69c20SDavid Pagan // CHECK6-NEXT:    [[TMP5:%.*]] = getelementptr inbounds [1 x ptr], ptr [[DOTOMP_REDUCTION_RED_LIST]], i64 0, i64 0
2133*d7c69c20SDavid Pagan // CHECK6-NEXT:    store ptr [[DOTC__VOID_ADDR]], ptr [[TMP5]], align 8
2134*d7c69c20SDavid Pagan // CHECK6-NEXT:    [[TMP6:%.*]] = call i32 @__kmpc_reduce_nowait(ptr @[[GLOB2:[0-9]+]], i32 [[TMP0]], i32 1, i64 8, ptr [[DOTOMP_REDUCTION_RED_LIST]], ptr @_Z10array_funciPiP2St.omp.reduction.reduction_func, ptr @.gomp_critical_user_.reduction.var)
2135*d7c69c20SDavid Pagan // CHECK6-NEXT:    switch i32 [[TMP6]], label [[DOTOMP_REDUCTION_DEFAULT:%.*]] [
2136*d7c69c20SDavid Pagan // CHECK6-NEXT:      i32 1, label [[DOTOMP_REDUCTION_CASE1:%.*]]
2137*d7c69c20SDavid Pagan // CHECK6-NEXT:      i32 2, label [[DOTOMP_REDUCTION_CASE2:%.*]]
2138*d7c69c20SDavid Pagan // CHECK6-NEXT:    ]
2139*d7c69c20SDavid Pagan // CHECK6:       .omp.reduction.case1:
2140*d7c69c20SDavid Pagan // CHECK6-NEXT:    [[TMP7:%.*]] = load i32, ptr [[C]], align 4
2141*d7c69c20SDavid Pagan // CHECK6-NEXT:    [[TMP8:%.*]] = load i32, ptr [[DOTC__VOID_ADDR]], align 4
2142*d7c69c20SDavid Pagan // CHECK6-NEXT:    [[MUL:%.*]] = mul nsw i32 [[TMP7]], [[TMP8]]
2143*d7c69c20SDavid Pagan // CHECK6-NEXT:    store i32 [[MUL]], ptr [[C]], align 4
2144*d7c69c20SDavid Pagan // CHECK6-NEXT:    call void @__kmpc_end_reduce_nowait(ptr @[[GLOB2]], i32 [[TMP0]], ptr @.gomp_critical_user_.reduction.var)
2145*d7c69c20SDavid Pagan // CHECK6-NEXT:    br label [[DOTOMP_REDUCTION_DEFAULT]]
2146*d7c69c20SDavid Pagan // CHECK6:       .omp.reduction.case2:
2147*d7c69c20SDavid Pagan // CHECK6-NEXT:    [[TMP9:%.*]] = load i32, ptr [[DOTC__VOID_ADDR]], align 4
2148*d7c69c20SDavid Pagan // CHECK6-NEXT:    [[ATOMIC_LOAD:%.*]] = load atomic i32, ptr [[C]] monotonic, align 4
2149*d7c69c20SDavid Pagan // CHECK6-NEXT:    br label [[ATOMIC_CONT:%.*]]
2150*d7c69c20SDavid Pagan // CHECK6:       atomic_cont:
2151*d7c69c20SDavid Pagan // CHECK6-NEXT:    [[TMP10:%.*]] = phi i32 [ [[ATOMIC_LOAD]], [[DOTOMP_REDUCTION_CASE2]] ], [ [[TMP15:%.*]], [[ATOMIC_CONT]] ]
2152*d7c69c20SDavid Pagan // CHECK6-NEXT:    store i32 [[TMP10]], ptr [[TMP]], align 4
2153*d7c69c20SDavid Pagan // CHECK6-NEXT:    [[TMP11:%.*]] = load i32, ptr [[TMP]], align 4
2154*d7c69c20SDavid Pagan // CHECK6-NEXT:    [[TMP12:%.*]] = load i32, ptr [[DOTC__VOID_ADDR]], align 4
2155*d7c69c20SDavid Pagan // CHECK6-NEXT:    [[MUL4:%.*]] = mul nsw i32 [[TMP11]], [[TMP12]]
2156*d7c69c20SDavid Pagan // CHECK6-NEXT:    store i32 [[MUL4]], ptr [[ATOMIC_TEMP]], align 4
2157*d7c69c20SDavid Pagan // CHECK6-NEXT:    [[TMP13:%.*]] = load i32, ptr [[ATOMIC_TEMP]], align 4
2158*d7c69c20SDavid Pagan // CHECK6-NEXT:    [[TMP14:%.*]] = cmpxchg ptr [[C]], i32 [[TMP10]], i32 [[TMP13]] monotonic monotonic, align 4
2159*d7c69c20SDavid Pagan // CHECK6-NEXT:    [[TMP15]] = extractvalue { i32, i1 } [[TMP14]], 0
2160*d7c69c20SDavid Pagan // CHECK6-NEXT:    [[TMP16:%.*]] = extractvalue { i32, i1 } [[TMP14]], 1
2161*d7c69c20SDavid Pagan // CHECK6-NEXT:    br i1 [[TMP16]], label [[ATOMIC_EXIT:%.*]], label [[ATOMIC_CONT]]
2162*d7c69c20SDavid Pagan // CHECK6:       atomic_exit:
2163*d7c69c20SDavid Pagan // CHECK6-NEXT:    br label [[DOTOMP_REDUCTION_DEFAULT]]
2164*d7c69c20SDavid Pagan // CHECK6:       .omp.reduction.default:
2165*d7c69c20SDavid Pagan // CHECK6-NEXT:    [[TMP17:%.*]] = load ptr, ptr @omp_high_bw_mem_alloc, align 8
2166*d7c69c20SDavid Pagan // CHECK6-NEXT:    call void @__kmpc_free(i32 [[TMP0]], ptr [[DOTC__VOID_ADDR]], ptr [[TMP17]])
2167*d7c69c20SDavid Pagan // CHECK6-NEXT:    ret void
2168*d7c69c20SDavid Pagan //
2169*d7c69c20SDavid Pagan //
2170*d7c69c20SDavid Pagan // CHECK6-LABEL: define {{[^@]+}}@_Z10array_funciPiP2St.omp.reduction.reduction_func
2171*d7c69c20SDavid Pagan // CHECK6-SAME: (ptr noundef [[TMP0:%.*]], ptr noundef [[TMP1:%.*]]) #[[ATTR2:[0-9]+]] {
2172*d7c69c20SDavid Pagan // CHECK6-NEXT:  entry:
2173*d7c69c20SDavid Pagan // CHECK6-NEXT:    [[DOTADDR:%.*]] = alloca ptr, align 8
2174*d7c69c20SDavid Pagan // CHECK6-NEXT:    [[DOTADDR1:%.*]] = alloca ptr, align 8
2175*d7c69c20SDavid Pagan // CHECK6-NEXT:    store ptr [[TMP0]], ptr [[DOTADDR]], align 8
2176*d7c69c20SDavid Pagan // CHECK6-NEXT:    store ptr [[TMP1]], ptr [[DOTADDR1]], align 8
2177*d7c69c20SDavid Pagan // CHECK6-NEXT:    [[TMP2:%.*]] = load ptr, ptr [[DOTADDR]], align 8
2178*d7c69c20SDavid Pagan // CHECK6-NEXT:    [[TMP3:%.*]] = load ptr, ptr [[DOTADDR1]], align 8
2179*d7c69c20SDavid Pagan // CHECK6-NEXT:    [[TMP4:%.*]] = getelementptr inbounds [1 x ptr], ptr [[TMP3]], i64 0, i64 0
2180*d7c69c20SDavid Pagan // CHECK6-NEXT:    [[TMP5:%.*]] = load ptr, ptr [[TMP4]], align 8
2181*d7c69c20SDavid Pagan // CHECK6-NEXT:    [[TMP6:%.*]] = getelementptr inbounds [1 x ptr], ptr [[TMP2]], i64 0, i64 0
2182*d7c69c20SDavid Pagan // CHECK6-NEXT:    [[TMP7:%.*]] = load ptr, ptr [[TMP6]], align 8
2183*d7c69c20SDavid Pagan // CHECK6-NEXT:    [[TMP8:%.*]] = load i32, ptr [[TMP7]], align 4
2184*d7c69c20SDavid Pagan // CHECK6-NEXT:    [[TMP9:%.*]] = load i32, ptr [[TMP5]], align 4
2185*d7c69c20SDavid Pagan // CHECK6-NEXT:    [[MUL:%.*]] = mul nsw i32 [[TMP8]], [[TMP9]]
2186*d7c69c20SDavid Pagan // CHECK6-NEXT:    store i32 [[MUL]], ptr [[TMP7]], align 4
2187*d7c69c20SDavid Pagan // CHECK6-NEXT:    ret void
2188*d7c69c20SDavid Pagan //
2189*d7c69c20SDavid Pagan //
2190*d7c69c20SDavid Pagan // CHECK6-LABEL: define {{[^@]+}}@main
2191*d7c69c20SDavid Pagan // CHECK6-SAME: () #[[ATTR4:[0-9]+]] {
2192*d7c69c20SDavid Pagan // CHECK6-NEXT:  entry:
2193*d7c69c20SDavid Pagan // CHECK6-NEXT:    [[RETVAL:%.*]] = alloca i32, align 4
2194*d7c69c20SDavid Pagan // CHECK6-NEXT:    [[N:%.*]] = alloca i32, align 4
2195*d7c69c20SDavid Pagan // CHECK6-NEXT:    [[A:%.*]] = alloca [10 x i32], align 16
2196*d7c69c20SDavid Pagan // CHECK6-NEXT:    [[S:%.*]] = alloca [2 x %struct.St], align 16
2197*d7c69c20SDavid Pagan // CHECK6-NEXT:    store i32 0, ptr [[RETVAL]], align 4
2198*d7c69c20SDavid Pagan // CHECK6-NEXT:    [[ARRAY_BEGIN:%.*]] = getelementptr inbounds [2 x %struct.St], ptr [[S]], i32 0, i32 0
2199*d7c69c20SDavid Pagan // CHECK6-NEXT:    [[ARRAYCTOR_END:%.*]] = getelementptr inbounds [[STRUCT_ST:%.*]], ptr [[ARRAY_BEGIN]], i64 2
2200*d7c69c20SDavid Pagan // CHECK6-NEXT:    br label [[ARRAYCTOR_LOOP:%.*]]
2201*d7c69c20SDavid Pagan // CHECK6:       arrayctor.loop:
2202*d7c69c20SDavid Pagan // CHECK6-NEXT:    [[ARRAYCTOR_CUR:%.*]] = phi ptr [ [[ARRAY_BEGIN]], [[ENTRY:%.*]] ], [ [[ARRAYCTOR_NEXT:%.*]], [[ARRAYCTOR_LOOP]] ]
2203*d7c69c20SDavid Pagan // CHECK6-NEXT:    call void @_ZN2StC1Ev(ptr noundef nonnull align 4 dereferenceable(8) [[ARRAYCTOR_CUR]])
2204*d7c69c20SDavid Pagan // CHECK6-NEXT:    [[ARRAYCTOR_NEXT]] = getelementptr inbounds [[STRUCT_ST]], ptr [[ARRAYCTOR_CUR]], i64 1
2205*d7c69c20SDavid Pagan // CHECK6-NEXT:    [[ARRAYCTOR_DONE:%.*]] = icmp eq ptr [[ARRAYCTOR_NEXT]], [[ARRAYCTOR_END]]
2206*d7c69c20SDavid Pagan // CHECK6-NEXT:    br i1 [[ARRAYCTOR_DONE]], label [[ARRAYCTOR_CONT:%.*]], label [[ARRAYCTOR_LOOP]]
2207*d7c69c20SDavid Pagan // CHECK6:       arrayctor.cont:
2208*d7c69c20SDavid Pagan // CHECK6-NEXT:    [[TMP0:%.*]] = load i32, ptr [[N]], align 4
2209*d7c69c20SDavid Pagan // CHECK6-NEXT:    [[ARRAYDECAY:%.*]] = getelementptr inbounds [10 x i32], ptr [[A]], i64 0, i64 0
2210*d7c69c20SDavid Pagan // CHECK6-NEXT:    [[ARRAYDECAY1:%.*]] = getelementptr inbounds [2 x %struct.St], ptr [[S]], i64 0, i64 0
2211*d7c69c20SDavid Pagan // CHECK6-NEXT:    call void @_Z10array_funciPiP2St(i32 noundef [[TMP0]], ptr noundef [[ARRAYDECAY]], ptr noundef [[ARRAYDECAY1]])
2212*d7c69c20SDavid Pagan // CHECK6-NEXT:    store i32 0, ptr [[RETVAL]], align 4
2213*d7c69c20SDavid Pagan // CHECK6-NEXT:    [[ARRAY_BEGIN2:%.*]] = getelementptr inbounds [2 x %struct.St], ptr [[S]], i32 0, i32 0
2214*d7c69c20SDavid Pagan // CHECK6-NEXT:    [[TMP1:%.*]] = getelementptr inbounds [[STRUCT_ST]], ptr [[ARRAY_BEGIN2]], i64 2
2215*d7c69c20SDavid Pagan // CHECK6-NEXT:    br label [[ARRAYDESTROY_BODY:%.*]]
2216*d7c69c20SDavid Pagan // CHECK6:       arraydestroy.body:
2217*d7c69c20SDavid Pagan // CHECK6-NEXT:    [[ARRAYDESTROY_ELEMENTPAST:%.*]] = phi ptr [ [[TMP1]], [[ARRAYCTOR_CONT]] ], [ [[ARRAYDESTROY_ELEMENT:%.*]], [[ARRAYDESTROY_BODY]] ]
2218*d7c69c20SDavid Pagan // CHECK6-NEXT:    [[ARRAYDESTROY_ELEMENT]] = getelementptr inbounds [[STRUCT_ST]], ptr [[ARRAYDESTROY_ELEMENTPAST]], i64 -1
2219*d7c69c20SDavid Pagan // CHECK6-NEXT:    call void @_ZN2StD1Ev(ptr noundef nonnull align 4 dereferenceable(8) [[ARRAYDESTROY_ELEMENT]]) #[[ATTR1:[0-9]+]]
2220*d7c69c20SDavid Pagan // CHECK6-NEXT:    [[ARRAYDESTROY_DONE:%.*]] = icmp eq ptr [[ARRAYDESTROY_ELEMENT]], [[ARRAY_BEGIN2]]
2221*d7c69c20SDavid Pagan // CHECK6-NEXT:    br i1 [[ARRAYDESTROY_DONE]], label [[ARRAYDESTROY_DONE3:%.*]], label [[ARRAYDESTROY_BODY]]
2222*d7c69c20SDavid Pagan // CHECK6:       arraydestroy.done3:
2223*d7c69c20SDavid Pagan // CHECK6-NEXT:    [[TMP2:%.*]] = load i32, ptr [[RETVAL]], align 4
2224*d7c69c20SDavid Pagan // CHECK6-NEXT:    ret i32 [[TMP2]]
2225*d7c69c20SDavid Pagan //
2226*d7c69c20SDavid Pagan //
2227*d7c69c20SDavid Pagan // CHECK6-LABEL: define {{[^@]+}}@_ZN2StC1Ev
2228*d7c69c20SDavid Pagan // CHECK6-SAME: (ptr noundef nonnull align 4 dereferenceable(8) [[THIS:%.*]]) unnamed_addr #[[ATTR0]] align 2 {
2229*d7c69c20SDavid Pagan // CHECK6-NEXT:  entry:
2230*d7c69c20SDavid Pagan // CHECK6-NEXT:    [[THIS_ADDR:%.*]] = alloca ptr, align 8
2231*d7c69c20SDavid Pagan // CHECK6-NEXT:    store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
2232*d7c69c20SDavid Pagan // CHECK6-NEXT:    [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8
2233*d7c69c20SDavid Pagan // CHECK6-NEXT:    call void @_ZN2StC2Ev(ptr noundef nonnull align 4 dereferenceable(8) [[THIS1]])
2234*d7c69c20SDavid Pagan // CHECK6-NEXT:    ret void
2235*d7c69c20SDavid Pagan //
2236*d7c69c20SDavid Pagan //
2237*d7c69c20SDavid Pagan // CHECK6-LABEL: define {{[^@]+}}@_ZN2StD1Ev
2238*d7c69c20SDavid Pagan // CHECK6-SAME: (ptr noundef nonnull align 4 dereferenceable(8) [[THIS:%.*]]) unnamed_addr #[[ATTR0]] align 2 {
2239*d7c69c20SDavid Pagan // CHECK6-NEXT:  entry:
2240*d7c69c20SDavid Pagan // CHECK6-NEXT:    [[THIS_ADDR:%.*]] = alloca ptr, align 8
2241*d7c69c20SDavid Pagan // CHECK6-NEXT:    store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
2242*d7c69c20SDavid Pagan // CHECK6-NEXT:    [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8
2243*d7c69c20SDavid Pagan // CHECK6-NEXT:    call void @_ZN2StD2Ev(ptr noundef nonnull align 4 dereferenceable(8) [[THIS1]]) #[[ATTR1]]
2244*d7c69c20SDavid Pagan // CHECK6-NEXT:    ret void
2245*d7c69c20SDavid Pagan //
2246*d7c69c20SDavid Pagan //
2247*d7c69c20SDavid Pagan // CHECK6-LABEL: define {{[^@]+}}@_ZN2StC2Ev
2248*d7c69c20SDavid Pagan // CHECK6-SAME: (ptr noundef nonnull align 4 dereferenceable(8) [[THIS:%.*]]) unnamed_addr #[[ATTR0]] align 2 {
2249*d7c69c20SDavid Pagan // CHECK6-NEXT:  entry:
2250*d7c69c20SDavid Pagan // CHECK6-NEXT:    [[THIS_ADDR:%.*]] = alloca ptr, align 8
2251*d7c69c20SDavid Pagan // CHECK6-NEXT:    store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
2252*d7c69c20SDavid Pagan // CHECK6-NEXT:    [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8
2253*d7c69c20SDavid Pagan // CHECK6-NEXT:    [[A:%.*]] = getelementptr inbounds nuw [[STRUCT_ST:%.*]], ptr [[THIS1]], i32 0, i32 0
2254*d7c69c20SDavid Pagan // CHECK6-NEXT:    store i32 0, ptr [[A]], align 4
2255*d7c69c20SDavid Pagan // CHECK6-NEXT:    [[B:%.*]] = getelementptr inbounds nuw [[STRUCT_ST]], ptr [[THIS1]], i32 0, i32 1
2256*d7c69c20SDavid Pagan // CHECK6-NEXT:    store i32 0, ptr [[B]], align 4
2257*d7c69c20SDavid Pagan // CHECK6-NEXT:    ret void
2258*d7c69c20SDavid Pagan //
2259*d7c69c20SDavid Pagan //
2260*d7c69c20SDavid Pagan // CHECK6-LABEL: define {{[^@]+}}@_ZN2StD2Ev
2261*d7c69c20SDavid Pagan // CHECK6-SAME: (ptr noundef nonnull align 4 dereferenceable(8) [[THIS:%.*]]) unnamed_addr #[[ATTR0]] align 2 {
2262*d7c69c20SDavid Pagan // CHECK6-NEXT:  entry:
2263*d7c69c20SDavid Pagan // CHECK6-NEXT:    [[THIS_ADDR:%.*]] = alloca ptr, align 8
2264*d7c69c20SDavid Pagan // CHECK6-NEXT:    store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
2265*d7c69c20SDavid Pagan // CHECK6-NEXT:    [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8
2266*d7c69c20SDavid Pagan // CHECK6-NEXT:    ret void
2267*d7c69c20SDavid Pagan //
2268