122337bfeSXiangling Liao // RUN: %clang_cc1 -triple powerpc-ibm-aix-xcoff -S -emit-llvm -x c++ \
23f2e61c1SXiangling Liao // RUN:     -std=c++2a < %s | \
322337bfeSXiangling Liao // RUN:   FileCheck --check-prefixes=CHECK,CHECK32 %s
422337bfeSXiangling Liao 
522337bfeSXiangling Liao // RUN: %clang_cc1 -triple powerpc64-ibm-aix-xcoff -S -emit-llvm -x c++ \
63f2e61c1SXiangling Liao // RUN:     -std=c++2a < %s | \
722337bfeSXiangling Liao // RUN:   FileCheck --check-prefixes=CHECK,CHECK64 %s
822337bfeSXiangling Liao 
922337bfeSXiangling Liao namespace test1 {
1022337bfeSXiangling Liao   struct Test1 {
1122337bfeSXiangling Liao     Test1();
1222337bfeSXiangling Liao     ~Test1();
1322337bfeSXiangling Liao   } t1, t2;
1422337bfeSXiangling Liao } // namespace test1
1522337bfeSXiangling Liao 
1622337bfeSXiangling Liao namespace test2 {
1722337bfeSXiangling Liao   int foo() { return 3; }
1822337bfeSXiangling Liao   int x = foo();
1922337bfeSXiangling Liao } // namespace test2
2022337bfeSXiangling Liao 
2122337bfeSXiangling Liao namespace test3 {
2222337bfeSXiangling Liao   struct Test3 {
2322337bfeSXiangling Liao     constexpr Test3() {};
2422337bfeSXiangling Liao     ~Test3() {};
2522337bfeSXiangling Liao   };
2622337bfeSXiangling Liao 
2722337bfeSXiangling Liao   constinit Test3 t;
2822337bfeSXiangling Liao } // namespace test3
2922337bfeSXiangling Liao 
3022337bfeSXiangling Liao namespace test4 {
3122337bfeSXiangling Liao   struct Test4 {
3222337bfeSXiangling Liao     Test4();
3322337bfeSXiangling Liao     ~Test4();
3422337bfeSXiangling Liao   };
3522337bfeSXiangling Liao 
3622337bfeSXiangling Liao   void f() {
3722337bfeSXiangling Liao     static Test4 staticLocal;
3822337bfeSXiangling Liao   }
3922337bfeSXiangling Liao } // namespace test4
4022337bfeSXiangling Liao 
416b1e2fc8SXiangling Liao // CHECK: @_ZGVZN5test41fEvE11staticLocal = internal global i64 0, align 8
426ef801aaSXiangling Liao // CHECK: @llvm.global_ctors = appending global [1 x { i32, void ()*, i8* }] [{ i32, void ()*, i8* } { i32 65535, void ()* @_GLOBAL__sub_I__, i8* null }]
436ef801aaSXiangling Liao // CHECK: @llvm.global_dtors = appending global [1 x { i32, void ()*, i8* }] [{ i32, void ()*, i8* } { i32 65535, void ()* @_GLOBAL__D_a, i8* null }]
4422337bfeSXiangling Liao 
4522337bfeSXiangling Liao // CHECK: define internal void @__cxx_global_var_init() [[ATTR:#[0-9]+]] {
4622337bfeSXiangling Liao // CHECK: entry:
4769cd776eSCJ Johnson // CHECK:   call void @_ZN5test15Test1C1Ev(%"struct.test1::Test1"* {{[^,]*}} @_ZN5test12t1E)
4822337bfeSXiangling Liao // CHECK:   %0 = call i32 @atexit(void ()* @__dtor__ZN5test12t1E)
4922337bfeSXiangling Liao // CHECK:   ret void
5022337bfeSXiangling Liao // CHECK: }
5122337bfeSXiangling Liao 
5222337bfeSXiangling Liao // CHECK: define internal void @__dtor__ZN5test12t1E() [[ATTR:#[0-9]+]] {
5322337bfeSXiangling Liao // CHECK: entry:
5422337bfeSXiangling Liao // CHECK:   call void @_ZN5test15Test1D1Ev(%"struct.test1::Test1"* @_ZN5test12t1E)
5522337bfeSXiangling Liao // CHECK:   ret void
5622337bfeSXiangling Liao // CHECK: }
5722337bfeSXiangling Liao 
5822337bfeSXiangling Liao // CHECK: declare i32 @atexit(void ()*)
5922337bfeSXiangling Liao 
6022337bfeSXiangling Liao // CHECK: define internal void @__finalize__ZN5test12t1E() [[ATTR:#[0-9]+]] {
6122337bfeSXiangling Liao // CHECK: entry:
6222337bfeSXiangling Liao // CHECK:   %0 = call i32 @unatexit(void ()* @__dtor__ZN5test12t1E)
6322337bfeSXiangling Liao // CHECK:   %needs_destruct = icmp eq i32 %0, 0
6422337bfeSXiangling Liao // CHECK:   br i1 %needs_destruct, label %destruct.call, label %destruct.end
6522337bfeSXiangling Liao 
6622337bfeSXiangling Liao // CHECK: destruct.call:
6722337bfeSXiangling Liao // CHECK:   call void @__dtor__ZN5test12t1E()
6822337bfeSXiangling Liao // CHECK:   br label %destruct.end
6922337bfeSXiangling Liao 
7022337bfeSXiangling Liao // CHECK: destruct.end:
7122337bfeSXiangling Liao // CHECK:   ret void
7222337bfeSXiangling Liao // CHECK: }
7322337bfeSXiangling Liao 
7422337bfeSXiangling Liao // CHECK: declare i32 @unatexit(void ()*)
7522337bfeSXiangling Liao 
7622337bfeSXiangling Liao // CHECK: define internal void @__cxx_global_var_init.1() [[ATTR:#[0-9]+]] {
7722337bfeSXiangling Liao // CHECK: entry:
7869cd776eSCJ Johnson // CHECK:   call void @_ZN5test15Test1C1Ev(%"struct.test1::Test1"* {{[^,]*}} @_ZN5test12t2E)
7922337bfeSXiangling Liao // CHECK:   %0 = call i32 @atexit(void ()* @__dtor__ZN5test12t2E)
8022337bfeSXiangling Liao // CHECK:   ret void
8122337bfeSXiangling Liao // CHECK: }
8222337bfeSXiangling Liao 
8322337bfeSXiangling Liao // CHECK: define internal void @__dtor__ZN5test12t2E() [[ATTR:#[0-9]+]] {
8422337bfeSXiangling Liao // CHECK: entry:
8522337bfeSXiangling Liao // CHECK:   call void @_ZN5test15Test1D1Ev(%"struct.test1::Test1"* @_ZN5test12t2E)
8622337bfeSXiangling Liao // CHECK:   ret void
8722337bfeSXiangling Liao // CHECK: }
8822337bfeSXiangling Liao 
8922337bfeSXiangling Liao // CHECK: define internal void @__finalize__ZN5test12t2E() [[ATTR:#[0-9]+]] {
9022337bfeSXiangling Liao // CHECK: entry:
9122337bfeSXiangling Liao // CHECK:   %0 = call i32 @unatexit(void ()* @__dtor__ZN5test12t2E)
9222337bfeSXiangling Liao // CHECK:   %needs_destruct = icmp eq i32 %0, 0
9322337bfeSXiangling Liao // CHECK:   br i1 %needs_destruct, label %destruct.call, label %destruct.end
9422337bfeSXiangling Liao 
9522337bfeSXiangling Liao // CHECK: destruct.call:
9622337bfeSXiangling Liao // CHECK:   call void @__dtor__ZN5test12t2E()
9722337bfeSXiangling Liao // CHECK:   br label %destruct.end
9822337bfeSXiangling Liao 
9922337bfeSXiangling Liao // CHECK: destruct.end:
10022337bfeSXiangling Liao // CHECK:   ret void
10122337bfeSXiangling Liao // CHECK: }
10222337bfeSXiangling Liao 
10322337bfeSXiangling Liao // CHECK: define internal void @__cxx_global_var_init.2() [[ATTR:#[0-9]+]] {
10422337bfeSXiangling Liao // CHECK: entry:
105*1b1c8d83Shyeongyu kim // CHECK32: %call = call noundef i32 @_ZN5test23fooEv()
106*1b1c8d83Shyeongyu kim // CHECK64: %call = call noundef signext i32 @_ZN5test23fooEv()
10722337bfeSXiangling Liao // CHECK:   store i32 %call, i32* @_ZN5test21xE
10822337bfeSXiangling Liao // CHECK:   ret void
10922337bfeSXiangling Liao // CHECK: }
11022337bfeSXiangling Liao 
11122337bfeSXiangling Liao // CHECK: define internal void @__cxx_global_var_init.3() [[ATTR:#[0-9]+]] {
11222337bfeSXiangling Liao // CHECK: entry:
11322337bfeSXiangling Liao // CHECK:   %0 = call i32 @atexit(void ()* @__dtor__ZN5test31tE)
11422337bfeSXiangling Liao // CHECK:   ret void
11522337bfeSXiangling Liao // CHECK: }
11622337bfeSXiangling Liao 
11722337bfeSXiangling Liao // CHECK: define internal void @__dtor__ZN5test31tE() [[ATTR:#[0-9]+]] {
11822337bfeSXiangling Liao // CHECK: entry:
11922337bfeSXiangling Liao // CHECK:   call void @_ZN5test35Test3D1Ev(%"struct.test3::Test3"* @_ZN5test31tE)
12022337bfeSXiangling Liao // CHECK:   ret void
12122337bfeSXiangling Liao // CHECK: }
12222337bfeSXiangling Liao 
12322337bfeSXiangling Liao // CHECK: define internal void @__finalize__ZN5test31tE() [[ATTR:#[0-9]+]] {
12422337bfeSXiangling Liao // CHECK: entry:
12522337bfeSXiangling Liao // CHECK:   %0 = call i32 @unatexit(void ()* @__dtor__ZN5test31tE)
12622337bfeSXiangling Liao // CHECK:   %needs_destruct = icmp eq i32 %0, 0
12722337bfeSXiangling Liao // CHECK:   br i1 %needs_destruct, label %destruct.call, label %destruct.end
12822337bfeSXiangling Liao 
12922337bfeSXiangling Liao // CHECK: destruct.call:
13022337bfeSXiangling Liao // CHECK:   call void @__dtor__ZN5test31tE()
13122337bfeSXiangling Liao // CHECK:   br label %destruct.end
13222337bfeSXiangling Liao 
13322337bfeSXiangling Liao // CHECK: destruct.end:
13422337bfeSXiangling Liao // CHECK:   ret void
13522337bfeSXiangling Liao // CHECK: }
13622337bfeSXiangling Liao 
13722337bfeSXiangling Liao // CHECK: define void @_ZN5test41fEv() [[ATTR:#[0-9]+]] {
13822337bfeSXiangling Liao // CHECK: entry:
1396b1e2fc8SXiangling Liao // CHECK:   %0 = load atomic i8, i8* bitcast (i64* @_ZGVZN5test41fEvE11staticLocal to i8*) acquire, align 8
14022337bfeSXiangling Liao // CHECK:   %guard.uninitialized = icmp eq i8 %0, 0
14122337bfeSXiangling Liao // CHECK:   br i1 %guard.uninitialized, label %init.check, label %init.end
14222337bfeSXiangling Liao 
14322337bfeSXiangling Liao // CHECK: init.check:
14422337bfeSXiangling Liao // CHECK:   %1 = call i32 @__cxa_guard_acquire(i64* @_ZGVZN5test41fEvE11staticLocal)
14522337bfeSXiangling Liao // CHECK:   %tobool = icmp ne i32 %1, 0
14622337bfeSXiangling Liao // CHECK:   br i1 %tobool, label %init, label %init.end
14722337bfeSXiangling Liao 
14822337bfeSXiangling Liao // CHECK: init:
14969cd776eSCJ Johnson // CHECK:   call void @_ZN5test45Test4C1Ev(%"struct.test4::Test4"* {{[^,]*}} @_ZZN5test41fEvE11staticLocal)
15022337bfeSXiangling Liao // CHECK:   %2 = call i32 @atexit(void ()* @__dtor__ZZN5test41fEvE11staticLocal)
15122337bfeSXiangling Liao // CHECK:   call void @__cxa_guard_release(i64* @_ZGVZN5test41fEvE11staticLocal)
15222337bfeSXiangling Liao // CHECK:   br label %init.end
15322337bfeSXiangling Liao 
15422337bfeSXiangling Liao // CHECK: init.end:
15522337bfeSXiangling Liao // CHECK:   ret void
15622337bfeSXiangling Liao // CHECK: }
15722337bfeSXiangling Liao 
15822337bfeSXiangling Liao // CHECK: define internal void @__dtor__ZZN5test41fEvE11staticLocal() [[ATTR:#[0-9]+]] {
15922337bfeSXiangling Liao // CHECK: entry:
16022337bfeSXiangling Liao // CHECK:   call void @_ZN5test45Test4D1Ev(%"struct.test4::Test4"* @_ZZN5test41fEvE11staticLocal)
16122337bfeSXiangling Liao // CHECK:   ret void
16222337bfeSXiangling Liao // CHECK: }
16322337bfeSXiangling Liao 
16422337bfeSXiangling Liao // CHECK: define internal void @__finalize__ZZN5test41fEvE11staticLocal() [[ATTR:#[0-9]+]] {
16522337bfeSXiangling Liao // CHECK: entry:
16622337bfeSXiangling Liao // CHECK:   %0 = call i32 @unatexit(void ()* @__dtor__ZZN5test41fEvE11staticLocal)
16722337bfeSXiangling Liao // CHECK:   %needs_destruct = icmp eq i32 %0, 0
16822337bfeSXiangling Liao // CHECK:   br i1 %needs_destruct, label %destruct.call, label %destruct.end
16922337bfeSXiangling Liao 
17022337bfeSXiangling Liao // CHECK: destruct.call:
17122337bfeSXiangling Liao // CHECK:   call void @__dtor__ZZN5test41fEvE11staticLocal()
17222337bfeSXiangling Liao // CHECK:   br label %destruct.end
17322337bfeSXiangling Liao 
17422337bfeSXiangling Liao // CHECK: destruct.end:
17522337bfeSXiangling Liao // CHECK:   ret void
17622337bfeSXiangling Liao // CHECK: }
17722337bfeSXiangling Liao 
1786ef801aaSXiangling Liao // CHECK: define internal void @_GLOBAL__sub_I__() [[ATTR:#[0-9]+]] {
17922337bfeSXiangling Liao // CHECK: entry:
18022337bfeSXiangling Liao // CHECK:   call void @__cxx_global_var_init()
18122337bfeSXiangling Liao // CHECK:   call void @__cxx_global_var_init.1()
18222337bfeSXiangling Liao // CHECK:   call void @__cxx_global_var_init.2()
18322337bfeSXiangling Liao // CHECK:   call void @__cxx_global_var_init.3()
18422337bfeSXiangling Liao // CHECK:   ret void
18522337bfeSXiangling Liao // CHECK: }
18622337bfeSXiangling Liao 
1876ef801aaSXiangling Liao // CHECK: define internal void @_GLOBAL__D_a() [[ATTR:#[0-9]+]] {
18822337bfeSXiangling Liao // CHECK: entry:
18922337bfeSXiangling Liao // CHECK:   call void @__finalize__ZZN5test41fEvE11staticLocal()
19022337bfeSXiangling Liao // CHECK:   call void @__finalize__ZN5test31tE()
19122337bfeSXiangling Liao // CHECK:   call void @__finalize__ZN5test12t2E()
19222337bfeSXiangling Liao // CHECK:   call void @__finalize__ZN5test12t1E()
19322337bfeSXiangling Liao // CHECK:   ret void
19422337bfeSXiangling Liao // CHECK: }
195