blob: 948b1c18f274b7dff54cf07c8accfba7f1c8339e [file] [log] [blame]
Manman Rencb8470b2015-12-08 00:14:38 +00001; RUN: llc < %s -mtriple=aarch64-apple-ios | FileCheck %s
Mandeep Singh Grang029a0562016-04-19 23:51:52 +00002; RUN: llc < %s -mtriple=aarch64-apple-ios -enable-shrink-wrap=true | FileCheck %s
Manman Rencb8470b2015-12-08 00:14:38 +00003; Shrink wrapping currently does not kick in because we have a TLS CALL
4; in the entry block and it will clobber the link register.
5
Manman Ren2828c572016-03-18 23:38:49 +00006; RUN: llc < %s -mtriple=aarch64-apple-ios -O0 | FileCheck --check-prefix=CHECK-O0 %s
7
Manman Rencb8470b2015-12-08 00:14:38 +00008%struct.S = type { i8 }
9
10@sg = internal thread_local global %struct.S zeroinitializer, align 1
11@__dso_handle = external global i8
12@__tls_guard = internal thread_local unnamed_addr global i1 false
Manman Ren4632e8e2016-01-15 20:13:28 +000013@sum1 = internal thread_local global i32 0, align 4
Manman Rencb8470b2015-12-08 00:14:38 +000014
15declare %struct.S* @_ZN1SC1Ev(%struct.S* returned)
16declare %struct.S* @_ZN1SD1Ev(%struct.S* returned)
17declare i32 @_tlv_atexit(void (i8*)*, i8*, i8*)
18
Manman Rencbe4f942015-12-16 21:04:19 +000019define cxx_fast_tlscc nonnull %struct.S* @_ZTW2sg() nounwind {
Manman Rencb8470b2015-12-08 00:14:38 +000020 %.b.i = load i1, i1* @__tls_guard, align 1
21 br i1 %.b.i, label %__tls_init.exit, label %init.i
22
23init.i:
24 store i1 true, i1* @__tls_guard, align 1
25 %call.i.i = tail call %struct.S* @_ZN1SC1Ev(%struct.S* nonnull @sg)
26 %1 = tail call i32 @_tlv_atexit(void (i8*)* nonnull bitcast (%struct.S* (%struct.S*)* @_ZN1SD1Ev to void (i8*)*), i8* nonnull getelementptr inbounds (%struct.S, %struct.S* @sg, i64 0, i32 0), i8* nonnull @__dso_handle)
27 br label %__tls_init.exit
28
29__tls_init.exit:
30 ret %struct.S* @sg
31}
32
33; CHECK-LABEL: _ZTW2sg
Manman Rencbe4f942015-12-16 21:04:19 +000034; CHECK-NOT: stp d31, d30
35; CHECK-NOT: stp d29, d28
36; CHECK-NOT: stp d27, d26
37; CHECK-NOT: stp d25, d24
38; CHECK-NOT: stp d23, d22
39; CHECK-NOT: stp d21, d20
40; CHECK-NOT: stp d19, d18
41; CHECK-NOT: stp d17, d16
42; CHECK-NOT: stp d7, d6
43; CHECK-NOT: stp d5, d4
44; CHECK-NOT: stp d3, d2
45; CHECK-NOT: stp d1, d0
46; CHECK-NOT: stp x20, x19
47; CHECK-NOT: stp x14, x13
48; CHECK-NOT: stp x12, x11
49; CHECK-NOT: stp x10, x9
50; CHECK-NOT: stp x8, x7
51; CHECK-NOT: stp x6, x5
52; CHECK-NOT: stp x4, x3
53; CHECK-NOT: stp x2, x1
Manman Rencb8470b2015-12-08 00:14:38 +000054; CHECK: blr
55; CHECK: tbnz w{{.*}}, #0, [[BB_end:.?LBB0_[0-9]+]]
56; CHECK: blr
57; CHECK: tlv_atexit
58; CHECK: [[BB_end]]:
59; CHECK: blr
Manman Rencbe4f942015-12-16 21:04:19 +000060; CHECK-NOT: ldp x2, x1
61; CHECK-NOT: ldp x4, x3
62; CHECK-NOT: ldp x6, x5
63; CHECK-NOT: ldp x8, x7
64; CHECK-NOT: ldp x10, x9
65; CHECK-NOT: ldp x12, x11
66; CHECK-NOT: ldp x14, x13
67; CHECK-NOT: ldp x20, x19
68; CHECK-NOT: ldp d1, d0
69; CHECK-NOT: ldp d3, d2
70; CHECK-NOT: ldp d5, d4
71; CHECK-NOT: ldp d7, d6
72; CHECK-NOT: ldp d17, d16
73; CHECK-NOT: ldp d19, d18
74; CHECK-NOT: ldp d21, d20
75; CHECK-NOT: ldp d23, d22
76; CHECK-NOT: ldp d25, d24
77; CHECK-NOT: ldp d27, d26
78; CHECK-NOT: ldp d29, d28
79; CHECK-NOT: ldp d31, d30
Manman Ren4632e8e2016-01-15 20:13:28 +000080
Manman Ren2828c572016-03-18 23:38:49 +000081; CHECK-O0-LABEL: _ZTW2sg
82; CHECK-O0: stp d31, d30
83; CHECK-O0: stp d29, d28
84; CHECK-O0: stp d27, d26
85; CHECK-O0: stp d25, d24
86; CHECK-O0: stp d23, d22
87; CHECK-O0: stp d21, d20
88; CHECK-O0: stp d19, d18
89; CHECK-O0: stp d17, d16
90; CHECK-O0: stp d7, d6
91; CHECK-O0: stp d5, d4
92; CHECK-O0: stp d3, d2
93; CHECK-O0: stp d1, d0
94; CHECK-O0: stp x14, x13
95; CHECK-O0: stp x12, x11
96; CHECK-O0: stp x10, x9
97; CHECK-O0: stp x8, x7
98; CHECK-O0: stp x6, x5
99; CHECK-O0: stp x4, x3
100; CHECK-O0: stp x2, x1
101; CHECK-O0: blr
102; CHECK-O0: tbnz w{{.*}}, #0, [[BB_end:.?LBB0_[0-9]+]]
103; CHECK-O0: blr
104; CHECK-O0: tlv_atexit
105; CHECK-O0: [[BB_end]]:
106; CHECK-O0: blr
107; CHECK-O0: ldp x2, x1
108; CHECK-O0: ldp x4, x3
109; CHECK-O0: ldp x6, x5
110; CHECK-O0: ldp x8, x7
111; CHECK-O0: ldp x10, x9
112; CHECK-O0: ldp x12, x11
113; CHECK-O0: ldp x14, x13
114; CHECK-O0: ldp d1, d0
115; CHECK-O0: ldp d3, d2
116; CHECK-O0: ldp d5, d4
117; CHECK-O0: ldp d7, d6
118; CHECK-O0: ldp d17, d16
119; CHECK-O0: ldp d19, d18
120; CHECK-O0: ldp d21, d20
121; CHECK-O0: ldp d23, d22
122; CHECK-O0: ldp d25, d24
123; CHECK-O0: ldp d27, d26
124; CHECK-O0: ldp d29, d28
125; CHECK-O0: ldp d31, d30
126
Manman Ren4632e8e2016-01-15 20:13:28 +0000127; CHECK-LABEL: _ZTW4sum1
128; CHECK-NOT: stp d31, d30
129; CHECK-NOT: stp d29, d28
130; CHECK-NOT: stp d27, d26
131; CHECK-NOT: stp d25, d24
132; CHECK-NOT: stp d23, d22
133; CHECK-NOT: stp d21, d20
134; CHECK-NOT: stp d19, d18
135; CHECK-NOT: stp d17, d16
136; CHECK-NOT: stp d7, d6
137; CHECK-NOT: stp d5, d4
138; CHECK-NOT: stp d3, d2
139; CHECK-NOT: stp d1, d0
140; CHECK-NOT: stp x20, x19
141; CHECK-NOT: stp x14, x13
142; CHECK-NOT: stp x12, x11
143; CHECK-NOT: stp x10, x9
144; CHECK-NOT: stp x8, x7
145; CHECK-NOT: stp x6, x5
146; CHECK-NOT: stp x4, x3
147; CHECK-NOT: stp x2, x1
148; CHECK: blr
Manman Ren2828c572016-03-18 23:38:49 +0000149
150; CHECK-O0-LABEL: _ZTW4sum1
151; CHECK-O0-NOT: vstr
152; CHECK-O0-NOT: vldr
Manman Ren4632e8e2016-01-15 20:13:28 +0000153define cxx_fast_tlscc nonnull i32* @_ZTW4sum1() nounwind {
154 ret i32* @sum1
155}
Manman Ren2828c572016-03-18 23:38:49 +0000156
157; Make sure at O0, we don't generate spilling/reloading of the CSRs.
158; CHECK-O0-LABEL: tls_test2
159; CHECK-O0-NOT: stp d31, d30
160; CHECK-O0-NOT: stp d29, d28
161; CHECK-O0-NOT: stp d27, d26
162; CHECK-O0-NOT: stp d25, d24
163; CHECK-O0-NOT: stp d23, d22
164; CHECK-O0-NOT: stp d21, d20
165; CHECK-O0-NOT: stp d19, d18
166; CHECK-O0-NOT: stp d17, d16
167; CHECK-O0-NOT: stp d7, d6
168; CHECK-O0-NOT: stp d5, d4
169; CHECK-O0-NOT: stp d3, d2
170; CHECK-O0-NOT: stp d1, d0
171; CHECK-O0-NOT: stp x20, x19
172; CHECK-O0-NOT: stp x14, x13
173; CHECK-O0-NOT: stp x12, x11
174; CHECK-O0-NOT: stp x10, x9
175; CHECK-O0-NOT: stp x8, x7
176; CHECK-O0-NOT: stp x6, x5
177; CHECK-O0-NOT: stp x4, x3
178; CHECK-O0-NOT: stp x2, x1
179; CHECK-O0: bl {{.*}}tls_helper
180; CHECK-O0-NOT: ldp x2, x1
181; CHECK-O0-NOT: ldp x4, x3
182; CHECK-O0-NOT: ldp x6, x5
183; CHECK-O0-NOT: ldp x8, x7
184; CHECK-O0-NOT: ldp x10, x9
185; CHECK-O0-NOT: ldp x12, x11
186; CHECK-O0-NOT: ldp x14, x13
187; CHECK-O0-NOT: ldp x20, x19
188; CHECK-O0-NOT: ldp d1, d0
189; CHECK-O0-NOT: ldp d3, d2
190; CHECK-O0-NOT: ldp d5, d4
191; CHECK-O0-NOT: ldp d7, d6
192; CHECK-O0-NOT: ldp d17, d16
193; CHECK-O0-NOT: ldp d19, d18
194; CHECK-O0-NOT: ldp d21, d20
195; CHECK-O0-NOT: ldp d23, d22
196; CHECK-O0-NOT: ldp d25, d24
197; CHECK-O0-NOT: ldp d27, d26
198; CHECK-O0-NOT: ldp d29, d28
199; CHECK-O0-NOT: ldp d31, d30
200; CHECK-O0: ret
201%class.C = type { i32 }
202@tC = internal thread_local global %class.C zeroinitializer, align 4
203declare cxx_fast_tlscc void @tls_helper()
204define cxx_fast_tlscc %class.C* @tls_test2() #1 {
205 call cxx_fast_tlscc void @tls_helper()
206 ret %class.C* @tC
207}
Manman Ren4865d892016-03-18 23:41:51 +0000208
209; Make sure we do not allow tail call when caller and callee have different
210; calling conventions.
211declare %class.C* @_ZN1CD1Ev(%class.C* readnone returned %this)
212; CHECK-LABEL: tls_test
213; CHECK: bl __tlv_atexit
214define cxx_fast_tlscc void @__tls_test() {
215entry:
216 store i32 0, i32* getelementptr inbounds (%class.C, %class.C* @tC, i64 0, i32 0), align 4
217 %0 = tail call i32 @_tlv_atexit(void (i8*)* bitcast (%class.C* (%class.C*)* @_ZN1CD1Ev to void (i8*)*), i8* bitcast (%class.C* @tC to i8*), i8* nonnull @__dso_handle) #1
218 ret void
219}
220
Manman Ren2828c572016-03-18 23:38:49 +0000221attributes #0 = { nounwind "no-frame-pointer-elim"="true" }
222attributes #1 = { nounwind }