xref: /aosp_15_r20/external/clang/test/CodeGenCXX/arm.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // RUN: %clang_cc1 %s -triple=thumbv7-apple-ios6.0 -fno-use-cxa-atexit -target-abi apcs-gnu -emit-llvm -o - -fexceptions | FileCheck %s
2*67e74705SXin Li 
3*67e74705SXin Li // CHECK: @_ZZN5test74testEvE1x = internal global i32 0, align 4
4*67e74705SXin Li // CHECK: @_ZGVZN5test74testEvE1x = internal global i32 0
5*67e74705SXin Li // CHECK: @_ZZN5test84testEvE1x = internal global [[TEST8A:.*]] zeroinitializer, align 1
6*67e74705SXin Li // CHECK: @_ZGVZN5test84testEvE1x = internal global i32 0
7*67e74705SXin Li 
8*67e74705SXin Li typedef typeof(sizeof(int)) size_t;
9*67e74705SXin Li 
10*67e74705SXin Li class foo {
11*67e74705SXin Li public:
12*67e74705SXin Li     foo();
13*67e74705SXin Li     virtual ~foo();
14*67e74705SXin Li };
15*67e74705SXin Li 
16*67e74705SXin Li class bar : public foo {
17*67e74705SXin Li public:
18*67e74705SXin Li 	bar();
19*67e74705SXin Li };
20*67e74705SXin Li 
21*67e74705SXin Li // The global dtor needs the right calling conv with -fno-use-cxa-atexit
22*67e74705SXin Li // rdar://7817590
23*67e74705SXin Li bar baz;
24*67e74705SXin Li 
25*67e74705SXin Li // PR9593
26*67e74705SXin Li // Make sure atexit(3) is used for global dtors.
27*67e74705SXin Li 
28*67e74705SXin Li // CHECK:      call [[BAR:%.*]]* @_ZN3barC1Ev(
29*67e74705SXin Li // CHECK-NEXT: call i32 @atexit(void ()* @__dtor_baz)
30*67e74705SXin Li 
31*67e74705SXin Li // CHECK-NOT: @_GLOBAL__D_a()
32*67e74705SXin Li // CHECK-LABEL: define internal void @__dtor_baz()
33*67e74705SXin Li // CHECK: call [[BAR]]* @_ZN3barD1Ev([[BAR]]* @baz)
34*67e74705SXin Li 
35*67e74705SXin Li // Destructors and constructors must return this.
36*67e74705SXin Li namespace test1 {
37*67e74705SXin Li   void foo();
38*67e74705SXin Li 
39*67e74705SXin Li   struct A {
Atest1::A40*67e74705SXin Li     A(int i) { foo(); }
~Atest1::A41*67e74705SXin Li     ~A() { foo(); }
bartest1::A42*67e74705SXin Li     void bar() { foo(); }
43*67e74705SXin Li   };
44*67e74705SXin Li 
45*67e74705SXin Li   // CHECK-LABEL: define void @_ZN5test14testEv()
test()46*67e74705SXin Li   void test() {
47*67e74705SXin Li     // CHECK: [[AV:%.*]] = alloca [[A:%.*]], align 1
48*67e74705SXin Li     // CHECK: call [[A]]* @_ZN5test11AC1Ei([[A]]* [[AV]], i32 10)
49*67e74705SXin Li     // CHECK: invoke void @_ZN5test11A3barEv([[A]]* [[AV]])
50*67e74705SXin Li     // CHECK: call [[A]]* @_ZN5test11AD1Ev([[A]]* [[AV]])
51*67e74705SXin Li     // CHECK: ret void
52*67e74705SXin Li     A a = 10;
53*67e74705SXin Li     a.bar();
54*67e74705SXin Li   }
55*67e74705SXin Li 
56*67e74705SXin Li   // CHECK: define linkonce_odr [[A]]* @_ZN5test11AC1Ei([[A]]* returned %this, i32 %i) unnamed_addr
57*67e74705SXin Li   // CHECK:   [[THIS:%.*]] = alloca [[A]]*, align 4
58*67e74705SXin Li   // CHECK:   store [[A]]* {{.*}}, [[A]]** [[THIS]]
59*67e74705SXin Li   // CHECK:   [[THIS1:%.*]] = load [[A]]*, [[A]]** [[THIS]]
60*67e74705SXin Li   // CHECK:   {{%.*}} = call [[A]]* @_ZN5test11AC2Ei(
61*67e74705SXin Li   // CHECK:   ret [[A]]* [[THIS1]]
62*67e74705SXin Li 
63*67e74705SXin Li   // CHECK: define linkonce_odr [[A]]* @_ZN5test11AD1Ev([[A]]* returned %this) unnamed_addr
64*67e74705SXin Li   // CHECK:   [[THIS:%.*]] = alloca [[A]]*, align 4
65*67e74705SXin Li   // CHECK:   store [[A]]* {{.*}}, [[A]]** [[THIS]]
66*67e74705SXin Li   // CHECK:   [[THIS1:%.*]] = load [[A]]*, [[A]]** [[THIS]]
67*67e74705SXin Li   // CHECK:   {{%.*}} = call [[A]]* @_ZN5test11AD2Ev(
68*67e74705SXin Li   // CHECK:   ret [[A]]* [[THIS1]]
69*67e74705SXin Li }
70*67e74705SXin Li 
71*67e74705SXin Li // Awkward virtual cases.
72*67e74705SXin Li namespace test2 {
73*67e74705SXin Li   void foo();
74*67e74705SXin Li 
75*67e74705SXin Li   struct A {
76*67e74705SXin Li     int x;
77*67e74705SXin Li 
78*67e74705SXin Li     A(int);
~Atest2::A79*67e74705SXin Li     virtual ~A() { foo(); }
80*67e74705SXin Li   };
81*67e74705SXin Li 
82*67e74705SXin Li   struct B {
83*67e74705SXin Li     int y;
84*67e74705SXin Li     int z;
85*67e74705SXin Li 
86*67e74705SXin Li     B(int);
~Btest2::B87*67e74705SXin Li     virtual ~B() { foo(); }
88*67e74705SXin Li   };
89*67e74705SXin Li 
90*67e74705SXin Li   struct C : A, virtual B {
91*67e74705SXin Li     int q;
92*67e74705SXin Li 
Ctest2::C93*67e74705SXin Li     C(int i) : A(i), B(i) { foo(); }
~Ctest2::C94*67e74705SXin Li     ~C() { foo(); }
95*67e74705SXin Li   };
96*67e74705SXin Li 
test()97*67e74705SXin Li   void test() {
98*67e74705SXin Li     C c = 10;
99*67e74705SXin Li   }
100*67e74705SXin Li 
101*67e74705SXin Li   // Tests at eof
102*67e74705SXin Li }
103*67e74705SXin Li 
104*67e74705SXin Li namespace test3 {
105*67e74705SXin Li   struct A {
106*67e74705SXin Li     int x;
107*67e74705SXin Li     ~A();
108*67e74705SXin Li   };
109*67e74705SXin Li 
a()110*67e74705SXin Li   void a() {
111*67e74705SXin Li     // CHECK-LABEL: define void @_ZN5test31aEv()
112*67e74705SXin Li     // CHECK: call i8* @_Znam(i32 48)
113*67e74705SXin Li     // CHECK: store i32 4
114*67e74705SXin Li     // CHECK: store i32 10
115*67e74705SXin Li     A *x = new A[10];
116*67e74705SXin Li   }
117*67e74705SXin Li 
b(int n)118*67e74705SXin Li   void b(int n) {
119*67e74705SXin Li     // CHECK-LABEL: define void @_ZN5test31bEi(
120*67e74705SXin Li     // CHECK: [[N:%.*]] = load i32, i32*
121*67e74705SXin Li     // CHECK: @llvm.umul.with.overflow.i32(i32 [[N]], i32 4)
122*67e74705SXin Li     // CHECK: @llvm.uadd.with.overflow.i32(i32 {{.*}}, i32 8)
123*67e74705SXin Li     // CHECK: [[OR:%.*]] = or i1
124*67e74705SXin Li     // CHECK: [[SZ:%.*]] = select i1 [[OR]]
125*67e74705SXin Li     // CHECK: call i8* @_Znam(i32 [[SZ]])
126*67e74705SXin Li     // CHECK: store i32 4
127*67e74705SXin Li     // CHECK: store i32 [[N]]
128*67e74705SXin Li     A *x = new A[n];
129*67e74705SXin Li   }
130*67e74705SXin Li 
c()131*67e74705SXin Li   void c() {
132*67e74705SXin Li     // CHECK-LABEL: define void @_ZN5test31cEv()
133*67e74705SXin Li     // CHECK: call  i8* @_Znam(i32 808)
134*67e74705SXin Li     // CHECK: store i32 4
135*67e74705SXin Li     // CHECK: store i32 200
136*67e74705SXin Li     A (*x)[20] = new A[10][20];
137*67e74705SXin Li   }
138*67e74705SXin Li 
d(int n)139*67e74705SXin Li   void d(int n) {
140*67e74705SXin Li     // CHECK-LABEL: define void @_ZN5test31dEi(
141*67e74705SXin Li     // CHECK: [[N:%.*]] = load i32, i32*
142*67e74705SXin Li     // CHECK: @llvm.umul.with.overflow.i32(i32 [[N]], i32 80)
143*67e74705SXin Li     // CHECK: [[NE:%.*]] = mul i32 [[N]], 20
144*67e74705SXin Li     // CHECK: @llvm.uadd.with.overflow.i32(i32 {{.*}}, i32 8)
145*67e74705SXin Li     // CHECK: [[SZ:%.*]] = select
146*67e74705SXin Li     // CHECK: call i8* @_Znam(i32 [[SZ]])
147*67e74705SXin Li     // CHECK: store i32 4
148*67e74705SXin Li     // CHECK: store i32 [[NE]]
149*67e74705SXin Li     A (*x)[20] = new A[n][20];
150*67e74705SXin Li   }
151*67e74705SXin Li 
e(A * x)152*67e74705SXin Li   void e(A *x) {
153*67e74705SXin Li     // CHECK-LABEL: define void @_ZN5test31eEPNS_1AE(
154*67e74705SXin Li     // CHECK: icmp eq {{.*}}, null
155*67e74705SXin Li     // CHECK: getelementptr {{.*}}, i32 -8
156*67e74705SXin Li     // CHECK: getelementptr {{.*}}, i32 4
157*67e74705SXin Li     // CHECK: bitcast {{.*}} to i32*
158*67e74705SXin Li     // CHECK: load
159*67e74705SXin Li     // CHECK: invoke {{.*}} @_ZN5test31AD1Ev
160*67e74705SXin Li     // CHECK: call void @_ZdaPv
161*67e74705SXin Li     delete [] x;
162*67e74705SXin Li   }
163*67e74705SXin Li 
f(A (* x)[20])164*67e74705SXin Li   void f(A (*x)[20]) {
165*67e74705SXin Li     // CHECK-LABEL: define void @_ZN5test31fEPA20_NS_1AE(
166*67e74705SXin Li     // CHECK: icmp eq {{.*}}, null
167*67e74705SXin Li     // CHECK: getelementptr {{.*}}, i32 -8
168*67e74705SXin Li     // CHECK: getelementptr {{.*}}, i32 4
169*67e74705SXin Li     // CHECK: bitcast {{.*}} to i32*
170*67e74705SXin Li     // CHECK: load
171*67e74705SXin Li     // CHECK: invoke {{.*}} @_ZN5test31AD1Ev
172*67e74705SXin Li     // CHECK: call void @_ZdaPv
173*67e74705SXin Li     delete [] x;
174*67e74705SXin Li   }
175*67e74705SXin Li }
176*67e74705SXin Li 
177*67e74705SXin Li namespace test4 {
178*67e74705SXin Li   struct A {
179*67e74705SXin Li     int x;
180*67e74705SXin Li     void operator delete[](void *, size_t sz);
181*67e74705SXin Li   };
182*67e74705SXin Li 
a()183*67e74705SXin Li   void a() {
184*67e74705SXin Li     // CHECK-LABEL: define void @_ZN5test41aEv()
185*67e74705SXin Li     // CHECK: call i8* @_Znam(i32 48)
186*67e74705SXin Li     // CHECK: store i32 4
187*67e74705SXin Li     // CHECK: store i32 10
188*67e74705SXin Li     A *x = new A[10];
189*67e74705SXin Li   }
190*67e74705SXin Li 
b(int n)191*67e74705SXin Li   void b(int n) {
192*67e74705SXin Li     // CHECK-LABEL: define void @_ZN5test41bEi(
193*67e74705SXin Li     // CHECK: [[N:%.*]] = load i32, i32*
194*67e74705SXin Li     // CHECK: @llvm.umul.with.overflow.i32(i32 [[N]], i32 4)
195*67e74705SXin Li     // CHECK: @llvm.uadd.with.overflow.i32(i32 {{.*}}, i32 8)
196*67e74705SXin Li     // CHECK: [[SZ:%.*]] = select
197*67e74705SXin Li     // CHECK: call i8* @_Znam(i32 [[SZ]])
198*67e74705SXin Li     // CHECK: store i32 4
199*67e74705SXin Li     // CHECK: store i32 [[N]]
200*67e74705SXin Li     A *x = new A[n];
201*67e74705SXin Li   }
202*67e74705SXin Li 
c()203*67e74705SXin Li   void c() {
204*67e74705SXin Li     // CHECK-LABEL: define void @_ZN5test41cEv()
205*67e74705SXin Li     // CHECK: call  i8* @_Znam(i32 808)
206*67e74705SXin Li     // CHECK: store i32 4
207*67e74705SXin Li     // CHECK: store i32 200
208*67e74705SXin Li     A (*x)[20] = new A[10][20];
209*67e74705SXin Li   }
210*67e74705SXin Li 
d(int n)211*67e74705SXin Li   void d(int n) {
212*67e74705SXin Li     // CHECK-LABEL: define void @_ZN5test41dEi(
213*67e74705SXin Li     // CHECK: [[N:%.*]] = load i32, i32*
214*67e74705SXin Li     // CHECK: @llvm.umul.with.overflow.i32(i32 [[N]], i32 80)
215*67e74705SXin Li     // CHECK: [[NE:%.*]] = mul i32 [[N]], 20
216*67e74705SXin Li     // CHECK: @llvm.uadd.with.overflow.i32(i32 {{.*}}, i32 8)
217*67e74705SXin Li     // CHECK: [[SZ:%.*]] = select
218*67e74705SXin Li     // CHECK: call i8* @_Znam(i32 [[SZ]])
219*67e74705SXin Li     // CHECK: store i32 4
220*67e74705SXin Li     // CHECK: store i32 [[NE]]
221*67e74705SXin Li     A (*x)[20] = new A[n][20];
222*67e74705SXin Li   }
223*67e74705SXin Li 
e(A * x)224*67e74705SXin Li   void e(A *x) {
225*67e74705SXin Li     // CHECK-LABEL: define void @_ZN5test41eEPNS_1AE(
226*67e74705SXin Li     // CHECK: [[ALLOC:%.*]] = getelementptr inbounds {{.*}}, i32 -8
227*67e74705SXin Li     // CHECK: getelementptr inbounds {{.*}}, i32 4
228*67e74705SXin Li     // CHECK: bitcast
229*67e74705SXin Li     // CHECK: [[T0:%.*]] = load i32, i32*
230*67e74705SXin Li     // CHECK: [[T1:%.*]] = mul i32 4, [[T0]]
231*67e74705SXin Li     // CHECK: [[T2:%.*]] = add i32 [[T1]], 8
232*67e74705SXin Li     // CHECK: call void @_ZN5test41AdaEPvm(i8* [[ALLOC]], i32 [[T2]])
233*67e74705SXin Li     delete [] x;
234*67e74705SXin Li   }
235*67e74705SXin Li 
f(A (* x)[20])236*67e74705SXin Li   void f(A (*x)[20]) {
237*67e74705SXin Li     // CHECK-LABEL: define void @_ZN5test41fEPA20_NS_1AE(
238*67e74705SXin Li     // CHECK: [[ALLOC:%.*]] = getelementptr inbounds {{.*}}, i32 -8
239*67e74705SXin Li     // CHECK: getelementptr inbounds {{.*}}, i32 4
240*67e74705SXin Li     // CHECK: bitcast
241*67e74705SXin Li     // CHECK: [[T0:%.*]] = load i32, i32*
242*67e74705SXin Li     // CHECK: [[T1:%.*]] = mul i32 4, [[T0]]
243*67e74705SXin Li     // CHECK: [[T2:%.*]] = add i32 [[T1]], 8
244*67e74705SXin Li     // CHECK: call void @_ZN5test41AdaEPvm(i8* [[ALLOC]], i32 [[T2]])
245*67e74705SXin Li     delete [] x;
246*67e74705SXin Li   }
247*67e74705SXin Li }
248*67e74705SXin Li 
249*67e74705SXin Li // <rdar://problem/8386802>: don't crash
250*67e74705SXin Li namespace test5 {
251*67e74705SXin Li   struct A {
252*67e74705SXin Li     ~A();
253*67e74705SXin Li   };
254*67e74705SXin Li 
255*67e74705SXin Li   // CHECK-LABEL: define void @_ZN5test54testEPNS_1AE
test(A * a)256*67e74705SXin Li   void test(A *a) {
257*67e74705SXin Li     // CHECK:      [[PTR:%.*]] = alloca [[A:%.*]]*, align 4
258*67e74705SXin Li     // CHECK-NEXT: store [[A]]* {{.*}}, [[A]]** [[PTR]], align 4
259*67e74705SXin Li     // CHECK-NEXT: [[TMP:%.*]] = load [[A]]*, [[A]]** [[PTR]], align 4
260*67e74705SXin Li     // CHECK-NEXT: call [[A]]* @_ZN5test51AD1Ev([[A]]* [[TMP]])
261*67e74705SXin Li     // CHECK-NEXT: ret void
262*67e74705SXin Li     a->~A();
263*67e74705SXin Li   }
264*67e74705SXin Li }
265*67e74705SXin Li 
266*67e74705SXin Li namespace test6 {
267*67e74705SXin Li   struct A {
268*67e74705SXin Li     virtual ~A();
269*67e74705SXin Li   };
270*67e74705SXin Li 
271*67e74705SXin Li   // CHECK-LABEL: define void @_ZN5test64testEPNS_1AE
test(A * a)272*67e74705SXin Li   void test(A *a) {
273*67e74705SXin Li     // CHECK:      [[AVAR:%.*]] = alloca [[A:%.*]]*, align 4
274*67e74705SXin Li     // CHECK-NEXT: store [[A]]* {{.*}}, [[A]]** [[AVAR]], align 4
275*67e74705SXin Li     // CHECK-NEXT: [[V:%.*]] = load [[A]]*, [[A]]** [[AVAR]], align 4
276*67e74705SXin Li     // CHECK-NEXT: [[ISNULL:%.*]] = icmp eq [[A]]* [[V]], null
277*67e74705SXin Li     // CHECK-NEXT: br i1 [[ISNULL]]
278*67e74705SXin Li     // CHECK:      [[T0:%.*]] = bitcast [[A]]* [[V]] to void ([[A]]*)***
279*67e74705SXin Li     // CHECK-NEXT: [[T1:%.*]] = load void ([[A]]*)**, void ([[A]]*)*** [[T0]]
280*67e74705SXin Li     // CHECK-NEXT: [[T2:%.*]] = getelementptr inbounds void ([[A]]*)*, void ([[A]]*)** [[T1]], i64 1
281*67e74705SXin Li     // CHECK-NEXT: [[T3:%.*]] = load void ([[A]]*)*, void ([[A]]*)** [[T2]]
282*67e74705SXin Li     // CHECK-NEXT: call void [[T3]]([[A]]* [[V]])
283*67e74705SXin Li     // CHECK-NEXT: br label
284*67e74705SXin Li     // CHECK:      ret void
285*67e74705SXin Li     delete a;
286*67e74705SXin Li   }
287*67e74705SXin Li }
288*67e74705SXin Li 
289*67e74705SXin Li namespace test7 {
290*67e74705SXin Li   int foo();
291*67e74705SXin Li 
292*67e74705SXin Li   // Static and guard tested at top of file
293*67e74705SXin Li 
294*67e74705SXin Li   // CHECK-LABEL: define void @_ZN5test74testEv() {{.*}} personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*)
test()295*67e74705SXin Li   void test() {
296*67e74705SXin Li     // CHECK:      [[T0:%.*]] = load atomic i8, i8* bitcast (i32* @_ZGVZN5test74testEvE1x to i8*) acquire, align 4
297*67e74705SXin Li     // CHECK-NEXT: [[T1:%.*]] = and i8 [[T0]], 1
298*67e74705SXin Li     // CHECK-NEXT: [[T2:%.*]] = icmp eq i8 [[T1]], 0
299*67e74705SXin Li     // CHECK-NEXT: br i1 [[T2]]
300*67e74705SXin Li     //   -> fallthrough, end
301*67e74705SXin Li     // CHECK:      [[T3:%.*]] = call i32 @__cxa_guard_acquire(i32* @_ZGVZN5test74testEvE1x)
302*67e74705SXin Li     // CHECK-NEXT: [[T4:%.*]] = icmp ne i32 [[T3]], 0
303*67e74705SXin Li     // CHECK-NEXT: br i1 [[T4]]
304*67e74705SXin Li     //   -> fallthrough, end
305*67e74705SXin Li     // CHECK:      [[INIT:%.*]] = invoke i32 @_ZN5test73fooEv()
306*67e74705SXin Li     // CHECK:      store i32 [[INIT]], i32* @_ZZN5test74testEvE1x, align 4
307*67e74705SXin Li     // CHECK-NEXT: call void @__cxa_guard_release(i32* @_ZGVZN5test74testEvE1x)
308*67e74705SXin Li     // CHECK-NEXT: br label
309*67e74705SXin Li     //   -> end
310*67e74705SXin Li     // end:
311*67e74705SXin Li     // CHECK:      ret void
312*67e74705SXin Li     static int x = foo();
313*67e74705SXin Li 
314*67e74705SXin Li     // CHECK:      landingpad { i8*, i32 }
315*67e74705SXin Li     // CHECK-NEXT:   cleanup
316*67e74705SXin Li     // CHECK:      call void @__cxa_guard_abort(i32* @_ZGVZN5test74testEvE1x)
317*67e74705SXin Li     // CHECK:      resume { i8*, i32 }
318*67e74705SXin Li   }
319*67e74705SXin Li }
320*67e74705SXin Li 
321*67e74705SXin Li namespace test8 {
322*67e74705SXin Li   struct A {
323*67e74705SXin Li     A();
324*67e74705SXin Li     ~A();
325*67e74705SXin Li   };
326*67e74705SXin Li 
327*67e74705SXin Li   // Static and guard tested at top of file
328*67e74705SXin Li 
329*67e74705SXin Li   // CHECK-LABEL: define void @_ZN5test84testEv() {{.*}} personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*)
test()330*67e74705SXin Li   void test() {
331*67e74705SXin Li     // CHECK:      [[T0:%.*]] = load atomic i8, i8* bitcast (i32* @_ZGVZN5test84testEvE1x to i8*) acquire, align 4
332*67e74705SXin Li     // CHECK-NEXT: [[T1:%.*]] = and i8 [[T0]], 1
333*67e74705SXin Li     // CHECK-NEXT: [[T2:%.*]] = icmp eq i8 [[T1]], 0
334*67e74705SXin Li     // CHECK-NEXT: br i1 [[T2]]
335*67e74705SXin Li     //   -> fallthrough, end
336*67e74705SXin Li     // CHECK:      [[T3:%.*]] = call i32 @__cxa_guard_acquire(i32* @_ZGVZN5test84testEvE1x)
337*67e74705SXin Li     // CHECK-NEXT: [[T4:%.*]] = icmp ne i32 [[T3]], 0
338*67e74705SXin Li     // CHECK-NEXT: br i1 [[T4]]
339*67e74705SXin Li     //   -> fallthrough, end
340*67e74705SXin Li     // CHECK:      [[INIT:%.*]] = invoke [[TEST8A]]* @_ZN5test81AC1Ev([[TEST8A]]* @_ZZN5test84testEvE1x)
341*67e74705SXin Li 
342*67e74705SXin Li     // FIXME: Here we register a global destructor that
343*67e74705SXin Li     // unconditionally calls the destructor.  That's what we've always
344*67e74705SXin Li     // done for -fno-use-cxa-atexit here, but that's really not
345*67e74705SXin Li     // semantically correct at all.
346*67e74705SXin Li 
347*67e74705SXin Li     // CHECK:      call void @__cxa_guard_release(i32* @_ZGVZN5test84testEvE1x)
348*67e74705SXin Li     // CHECK-NEXT: br label
349*67e74705SXin Li     //   -> end
350*67e74705SXin Li     // end:
351*67e74705SXin Li     // CHECK:      ret void
352*67e74705SXin Li     static A x;
353*67e74705SXin Li 
354*67e74705SXin Li     // CHECK:      landingpad { i8*, i32 }
355*67e74705SXin Li     // CHECK-NEXT:   cleanup
356*67e74705SXin Li     // CHECK:      call void @__cxa_guard_abort(i32* @_ZGVZN5test84testEvE1x)
357*67e74705SXin Li     // CHECK:      resume { i8*, i32 }
358*67e74705SXin Li   }
359*67e74705SXin Li }
360*67e74705SXin Li 
361*67e74705SXin Li //   rdar://12836470
362*67e74705SXin Li // Use a larger-than-mandated array cookie when allocating an
363*67e74705SXin Li // array whose type is overaligned.
364*67e74705SXin Li namespace test9 {
365*67e74705SXin Li   class __attribute__((aligned(16))) A {
366*67e74705SXin Li     float data[4];
367*67e74705SXin Li   public:
368*67e74705SXin Li     A();
369*67e74705SXin Li     ~A();
370*67e74705SXin Li   };
371*67e74705SXin Li 
testNew(unsigned n)372*67e74705SXin Li   A *testNew(unsigned n) {
373*67e74705SXin Li     return new A[n];
374*67e74705SXin Li   }
375*67e74705SXin Li // CHECK:    define [[TEST9:%.*]]* @_ZN5test97testNewEj(i32
376*67e74705SXin Li // CHECK:      [[N_VAR:%.*]] = alloca i32, align 4
377*67e74705SXin Li // CHECK:      [[N:%.*]] = load i32, i32* [[N_VAR]], align 4
378*67e74705SXin Li // CHECK-NEXT: [[T0:%.*]] = call { i32, i1 } @llvm.umul.with.overflow.i32(i32 [[N]], i32 16)
379*67e74705SXin Li // CHECK-NEXT: [[O0:%.*]] = extractvalue { i32, i1 } [[T0]], 1
380*67e74705SXin Li // CHECK-NEXT: [[T1:%.*]] = extractvalue { i32, i1 } [[T0]], 0
381*67e74705SXin Li // CHECK-NEXT: [[T2:%.*]] = call { i32, i1 } @llvm.uadd.with.overflow.i32(i32 [[T1]], i32 16)
382*67e74705SXin Li // CHECK-NEXT: [[O1:%.*]] = extractvalue { i32, i1 } [[T2]], 1
383*67e74705SXin Li // CHECK-NEXT: [[OVERFLOW:%.*]] = or i1 [[O0]], [[O1]]
384*67e74705SXin Li // CHECK-NEXT: [[T3:%.*]] = extractvalue { i32, i1 } [[T2]], 0
385*67e74705SXin Li // CHECK-NEXT: [[T4:%.*]] = select i1 [[OVERFLOW]], i32 -1, i32 [[T3]]
386*67e74705SXin Li // CHECK-NEXT: [[ALLOC:%.*]] = call i8* @_Znam(i32 [[T4]])
387*67e74705SXin Li // CHECK-NEXT: [[T0:%.*]] = bitcast i8* [[ALLOC]] to i32*
388*67e74705SXin Li // CHECK-NEXT: store i32 16, i32* [[T0]]
389*67e74705SXin Li // CHECK-NEXT: [[T1:%.*]] = getelementptr inbounds i32, i32* [[T0]], i32 1
390*67e74705SXin Li // CHECK-NEXT: store i32 [[N]], i32* [[T1]]
391*67e74705SXin Li // CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds i8, i8* [[ALLOC]], i32 16
392*67e74705SXin Li // CHECK-NEXT: bitcast i8* [[T0]] to [[TEST9]]*
393*67e74705SXin Li //   Array allocation follows.
394*67e74705SXin Li 
testDelete(A * array)395*67e74705SXin Li   void testDelete(A *array) {
396*67e74705SXin Li     delete[] array;
397*67e74705SXin Li   }
398*67e74705SXin Li // CHECK-LABEL:    define void @_ZN5test910testDeleteEPNS_1AE(
399*67e74705SXin Li // CHECK:      [[BEGIN:%.*]] = load [[TEST9]]*, [[TEST9]]**
400*67e74705SXin Li // CHECK-NEXT: [[T0:%.*]] = icmp eq [[TEST9]]* [[BEGIN]], null
401*67e74705SXin Li // CHECK-NEXT: br i1 [[T0]],
402*67e74705SXin Li // CHECK:      [[T0:%.*]] = bitcast [[TEST9]]* [[BEGIN]] to i8*
403*67e74705SXin Li // CHECK-NEXT: [[ALLOC:%.*]] = getelementptr inbounds i8, i8* [[T0]], i32 -16
404*67e74705SXin Li // CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds i8, i8* [[ALLOC]], i32 4
405*67e74705SXin Li // CHECK-NEXT: [[T1:%.*]] = bitcast i8* [[T0]] to i32*
406*67e74705SXin Li // CHECK-NEXT: [[N:%.*]] = load i32, i32* [[T1]]
407*67e74705SXin Li // CHECK-NEXT: [[END:%.*]] = getelementptr inbounds [[TEST9]], [[TEST9]]* [[BEGIN]], i32 [[N]]
408*67e74705SXin Li // CHECK-NEXT: [[T0:%.*]] = icmp eq [[TEST9]]* [[BEGIN]], [[END]]
409*67e74705SXin Li // CHECK-NEXT: br i1 [[T0]],
410*67e74705SXin Li //   Array deallocation follows.
411*67e74705SXin Li }
412*67e74705SXin Li 
413*67e74705SXin Li   // CHECK: define linkonce_odr [[C:%.*]]* @_ZTv0_n12_N5test21CD1Ev(
414*67e74705SXin Li   // CHECK:   call [[C]]* @_ZN5test21CD1Ev(
415*67e74705SXin Li   // CHECK:   ret [[C]]* undef
416*67e74705SXin Li 
417*67e74705SXin Li   // CHECK-LABEL: define linkonce_odr void @_ZTv0_n12_N5test21CD0Ev(
418*67e74705SXin Li   // CHECK:   call void @_ZN5test21CD0Ev(
419*67e74705SXin Li   // CHECK:   ret void
420