1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 4
2 ; RUN: llc -o - %s | FileCheck --check-prefix=SELDAG --check-prefix=CHECK %s
3 ; RUN: llc -global-isel -o - %s | FileCheck --check-prefix=GISEL --check-prefix=CHECK %s
5 target datalayout = "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128"
6 target triple = "arm64-apple-ios"
11 declare void @llvm.objc.release(ptr)
12 declare void @objc_object(ptr)
14 declare void @foo2(ptr)
16 declare void @llvm.lifetime.start.p0(i64 immarg, ptr nocapture)
18 declare ptr @_ZN1SD1Ev(ptr nonnull dereferenceable(1))
20 declare void @llvm.lifetime.end.p0(i64 immarg, ptr nocapture)
23 %struct.S = type { i8 }
25 @g = dso_local global ptr null, align 8
26 @fptr = dso_local global ptr null, align 8
28 define dso_local ptr @rv_marker_1_retain() {
29 ; SELDAG-LABEL: rv_marker_1_retain:
30 ; SELDAG: ; %bb.0: ; %entry
31 ; SELDAG-NEXT: stp x29, x30, [sp, #-16]! ; 16-byte Folded Spill
32 ; SELDAG-NEXT: .cfi_def_cfa_offset 16
33 ; SELDAG-NEXT: .cfi_offset w30, -8
34 ; SELDAG-NEXT: .cfi_offset w29, -16
35 ; SELDAG-NEXT: bl _foo1
36 ; SELDAG-NEXT: mov x29, x29
37 ; SELDAG-NEXT: bl _objc_retainAutoreleasedReturnValue
38 ; SELDAG-NEXT: ldp x29, x30, [sp], #16 ; 16-byte Folded Reload
41 ; GISEL-LABEL: rv_marker_1_retain:
42 ; GISEL: ; %bb.0: ; %entry
43 ; GISEL-NEXT: stp x29, x30, [sp, #-16]! ; 16-byte Folded Spill
44 ; GISEL-NEXT: .cfi_def_cfa_offset 16
45 ; GISEL-NEXT: .cfi_offset w30, -8
46 ; GISEL-NEXT: .cfi_offset w29, -16
47 ; GISEL-NEXT: bl _foo1
48 ; GISEL-NEXT: mov x29, x29
49 ; GISEL-NEXT: bl _objc_retainAutoreleasedReturnValue
50 ; GISEL-NEXT: ldp x29, x30, [sp], #16 ; 16-byte Folded Reload
53 %call = call ptr @foo1() [ "clang.arc.attachedcall"(ptr @objc_retainAutoreleasedReturnValue) ]
57 define dso_local ptr @rv_marker_1_unsafeClaim() {
58 ; SELDAG-LABEL: rv_marker_1_unsafeClaim:
59 ; SELDAG: ; %bb.0: ; %entry
60 ; SELDAG-NEXT: stp x29, x30, [sp, #-16]! ; 16-byte Folded Spill
61 ; SELDAG-NEXT: .cfi_def_cfa_offset 16
62 ; SELDAG-NEXT: .cfi_offset w30, -8
63 ; SELDAG-NEXT: .cfi_offset w29, -16
64 ; SELDAG-NEXT: bl _foo1
65 ; SELDAG-NEXT: mov x29, x29
66 ; SELDAG-NEXT: bl _objc_unsafeClaimAutoreleasedReturnValue
67 ; SELDAG-NEXT: ldp x29, x30, [sp], #16 ; 16-byte Folded Reload
70 ; GISEL-LABEL: rv_marker_1_unsafeClaim:
71 ; GISEL: ; %bb.0: ; %entry
72 ; GISEL-NEXT: stp x29, x30, [sp, #-16]! ; 16-byte Folded Spill
73 ; GISEL-NEXT: .cfi_def_cfa_offset 16
74 ; GISEL-NEXT: .cfi_offset w30, -8
75 ; GISEL-NEXT: .cfi_offset w29, -16
76 ; GISEL-NEXT: bl _foo1
77 ; GISEL-NEXT: mov x29, x29
78 ; GISEL-NEXT: bl _objc_unsafeClaimAutoreleasedReturnValue
79 ; GISEL-NEXT: ldp x29, x30, [sp], #16 ; 16-byte Folded Reload
82 %call = call ptr @foo1() [ "clang.arc.attachedcall"(ptr @objc_unsafeClaimAutoreleasedReturnValue) ]
86 define dso_local void @rv_marker_2_select(i32 %c) {
87 ; SELDAG-LABEL: rv_marker_2_select:
88 ; SELDAG: ; %bb.0: ; %entry
89 ; SELDAG-NEXT: stp x29, x30, [sp, #-16]! ; 16-byte Folded Spill
90 ; SELDAG-NEXT: .cfi_def_cfa_offset 16
91 ; SELDAG-NEXT: .cfi_offset w30, -8
92 ; SELDAG-NEXT: .cfi_offset w29, -16
93 ; SELDAG-NEXT: mov w8, #1 ; =0x1
94 ; SELDAG-NEXT: cmp w0, #0
95 ; SELDAG-NEXT: cinc w0, w8, eq
96 ; SELDAG-NEXT: bl _foo0
97 ; SELDAG-NEXT: mov x29, x29
98 ; SELDAG-NEXT: bl _objc_retainAutoreleasedReturnValue
99 ; SELDAG-NEXT: ldp x29, x30, [sp], #16 ; 16-byte Folded Reload
100 ; SELDAG-NEXT: b _foo2
102 ; GISEL-LABEL: rv_marker_2_select:
103 ; GISEL: ; %bb.0: ; %entry
104 ; GISEL-NEXT: stp x29, x30, [sp, #-16]! ; 16-byte Folded Spill
105 ; GISEL-NEXT: .cfi_def_cfa_offset 16
106 ; GISEL-NEXT: .cfi_offset w30, -8
107 ; GISEL-NEXT: .cfi_offset w29, -16
108 ; GISEL-NEXT: mov w8, #1 ; =0x1
109 ; GISEL-NEXT: cmp w0, #0
110 ; GISEL-NEXT: cinc w0, w8, eq
111 ; GISEL-NEXT: bl _foo0
112 ; GISEL-NEXT: mov x29, x29
113 ; GISEL-NEXT: bl _objc_retainAutoreleasedReturnValue
114 ; GISEL-NEXT: ldp x29, x30, [sp], #16 ; 16-byte Folded Reload
115 ; GISEL-NEXT: b _foo2
117 %tobool.not = icmp eq i32 %c, 0
118 %.sink = select i1 %tobool.not, i32 2, i32 1
119 %call1 = call ptr @foo0(i32 %.sink) [ "clang.arc.attachedcall"(ptr @objc_retainAutoreleasedReturnValue) ]
120 tail call void @foo2(ptr %call1)
124 define dso_local void @rv_marker_3() personality ptr @__gxx_personality_v0 {
125 ; SELDAG-LABEL: rv_marker_3:
126 ; SELDAG: Lfunc_begin0:
127 ; SELDAG-NEXT: .cfi_startproc
128 ; SELDAG-NEXT: .cfi_personality 155, ___gxx_personality_v0
129 ; SELDAG-NEXT: .cfi_lsda 16, Lexception0
130 ; SELDAG-NEXT: ; %bb.0: ; %entry
131 ; SELDAG-NEXT: stp x20, x19, [sp, #-32]! ; 16-byte Folded Spill
132 ; SELDAG-NEXT: stp x29, x30, [sp, #16] ; 16-byte Folded Spill
133 ; SELDAG-NEXT: .cfi_def_cfa_offset 32
134 ; SELDAG-NEXT: .cfi_offset w30, -8
135 ; SELDAG-NEXT: .cfi_offset w29, -16
136 ; SELDAG-NEXT: .cfi_offset w19, -24
137 ; SELDAG-NEXT: .cfi_offset w20, -32
138 ; SELDAG-NEXT: bl _foo1
139 ; SELDAG-NEXT: mov x29, x29
140 ; SELDAG-NEXT: bl _objc_retainAutoreleasedReturnValue
141 ; SELDAG-NEXT: mov x19, x0
142 ; SELDAG-NEXT: Ltmp0:
143 ; SELDAG-NEXT: bl _objc_object
144 ; SELDAG-NEXT: Ltmp1:
145 ; SELDAG-NEXT: ; %bb.1: ; %invoke.cont
146 ; SELDAG-NEXT: ldp x29, x30, [sp, #16] ; 16-byte Folded Reload
147 ; SELDAG-NEXT: mov x0, x19
148 ; SELDAG-NEXT: ldp x20, x19, [sp], #32 ; 16-byte Folded Reload
149 ; SELDAG-NEXT: b _objc_release
150 ; SELDAG-NEXT: LBB3_2: ; %lpad
151 ; SELDAG-NEXT: Ltmp2:
152 ; SELDAG-NEXT: mov x20, x0
153 ; SELDAG-NEXT: mov x0, x19
154 ; SELDAG-NEXT: bl _objc_release
155 ; SELDAG-NEXT: mov x0, x20
156 ; SELDAG-NEXT: bl __Unwind_Resume
157 ; SELDAG-NEXT: Lfunc_end0:
158 ; SELDAG-NEXT: .cfi_endproc
159 ; SELDAG-NEXT: .section __TEXT,__gcc_except_tab
160 ; SELDAG-NEXT: .p2align 2, 0x0
161 ; SELDAG-NEXT: GCC_except_table3:
162 ; SELDAG-NEXT: Lexception0:
163 ; SELDAG-NEXT: .byte 255 ; @LPStart Encoding = omit
164 ; SELDAG-NEXT: .byte 255 ; @TType Encoding = omit
165 ; SELDAG-NEXT: .byte 1 ; Call site Encoding = uleb128
166 ; SELDAG-NEXT: .uleb128 Lcst_end0-Lcst_begin0
167 ; SELDAG-NEXT: Lcst_begin0:
168 ; SELDAG-NEXT: .uleb128 Lfunc_begin0-Lfunc_begin0 ; >> Call Site 1 <<
169 ; SELDAG-NEXT: .uleb128 Ltmp0-Lfunc_begin0 ; Call between Lfunc_begin0 and Ltmp0
170 ; SELDAG-NEXT: .byte 0 ; has no landing pad
171 ; SELDAG-NEXT: .byte 0 ; On action: cleanup
172 ; SELDAG-NEXT: .uleb128 Ltmp0-Lfunc_begin0 ; >> Call Site 2 <<
173 ; SELDAG-NEXT: .uleb128 Ltmp1-Ltmp0 ; Call between Ltmp0 and Ltmp1
174 ; SELDAG-NEXT: .uleb128 Ltmp2-Lfunc_begin0 ; jumps to Ltmp2
175 ; SELDAG-NEXT: .byte 0 ; On action: cleanup
176 ; SELDAG-NEXT: .uleb128 Ltmp1-Lfunc_begin0 ; >> Call Site 3 <<
177 ; SELDAG-NEXT: .uleb128 Lfunc_end0-Ltmp1 ; Call between Ltmp1 and Lfunc_end0
178 ; SELDAG-NEXT: .byte 0 ; has no landing pad
179 ; SELDAG-NEXT: .byte 0 ; On action: cleanup
180 ; SELDAG-NEXT: Lcst_end0:
181 ; SELDAG-NEXT: .p2align 2, 0x0
183 ; GISEL-LABEL: rv_marker_3:
184 ; GISEL: Lfunc_begin0:
185 ; GISEL-NEXT: .cfi_startproc
186 ; GISEL-NEXT: .cfi_personality 155, ___gxx_personality_v0
187 ; GISEL-NEXT: .cfi_lsda 16, Lexception0
188 ; GISEL-NEXT: ; %bb.0: ; %entry
189 ; GISEL-NEXT: stp x20, x19, [sp, #-32]! ; 16-byte Folded Spill
190 ; GISEL-NEXT: stp x29, x30, [sp, #16] ; 16-byte Folded Spill
191 ; GISEL-NEXT: .cfi_def_cfa_offset 32
192 ; GISEL-NEXT: .cfi_offset w30, -8
193 ; GISEL-NEXT: .cfi_offset w29, -16
194 ; GISEL-NEXT: .cfi_offset w19, -24
195 ; GISEL-NEXT: .cfi_offset w20, -32
196 ; GISEL-NEXT: bl _foo1
197 ; GISEL-NEXT: mov x29, x29
198 ; GISEL-NEXT: bl _objc_retainAutoreleasedReturnValue
199 ; GISEL-NEXT: mov x19, x0
201 ; GISEL-NEXT: bl _objc_object
203 ; GISEL-NEXT: ; %bb.1: ; %invoke.cont
205 ; GISEL-NEXT: adrp x1, _objc_release@GOTPAGE
206 ; GISEL-NEXT: mov x0, x19
208 ; GISEL-NEXT: ldr x1, [x1, _objc_release@GOTPAGEOFF]
209 ; GISEL-NEXT: ldp x29, x30, [sp, #16] ; 16-byte Folded Reload
210 ; GISEL-NEXT: ldp x20, x19, [sp], #32 ; 16-byte Folded Reload
212 ; GISEL-NEXT: LBB3_2: ; %lpad
215 ; GISEL-NEXT: adrp x8, _objc_release@GOTPAGE
216 ; GISEL-NEXT: mov x20, x0
217 ; GISEL-NEXT: mov x0, x19
219 ; GISEL-NEXT: ldr x8, [x8, _objc_release@GOTPAGEOFF]
221 ; GISEL-NEXT: mov x0, x20
222 ; GISEL-NEXT: bl __Unwind_Resume
223 ; GISEL-NEXT: .loh AdrpLdrGot Lloh0, Lloh1
224 ; GISEL-NEXT: .loh AdrpLdrGot Lloh2, Lloh3
225 ; GISEL-NEXT: Lfunc_end0:
226 ; GISEL-NEXT: .cfi_endproc
227 ; GISEL-NEXT: .section __TEXT,__gcc_except_tab
228 ; GISEL-NEXT: .p2align 2, 0x0
229 ; GISEL-NEXT: GCC_except_table3:
230 ; GISEL-NEXT: Lexception0:
231 ; GISEL-NEXT: .byte 255 ; @LPStart Encoding = omit
232 ; GISEL-NEXT: .byte 255 ; @TType Encoding = omit
233 ; GISEL-NEXT: .byte 1 ; Call site Encoding = uleb128
234 ; GISEL-NEXT: .uleb128 Lcst_end0-Lcst_begin0
235 ; GISEL-NEXT: Lcst_begin0:
236 ; GISEL-NEXT: .uleb128 Lfunc_begin0-Lfunc_begin0 ; >> Call Site 1 <<
237 ; GISEL-NEXT: .uleb128 Ltmp0-Lfunc_begin0 ; Call between Lfunc_begin0 and Ltmp0
238 ; GISEL-NEXT: .byte 0 ; has no landing pad
239 ; GISEL-NEXT: .byte 0 ; On action: cleanup
240 ; GISEL-NEXT: .uleb128 Ltmp0-Lfunc_begin0 ; >> Call Site 2 <<
241 ; GISEL-NEXT: .uleb128 Ltmp1-Ltmp0 ; Call between Ltmp0 and Ltmp1
242 ; GISEL-NEXT: .uleb128 Ltmp2-Lfunc_begin0 ; jumps to Ltmp2
243 ; GISEL-NEXT: .byte 0 ; On action: cleanup
244 ; GISEL-NEXT: .uleb128 Ltmp1-Lfunc_begin0 ; >> Call Site 3 <<
245 ; GISEL-NEXT: .uleb128 Lfunc_end0-Ltmp1 ; Call between Ltmp1 and Lfunc_end0
246 ; GISEL-NEXT: .byte 0 ; has no landing pad
247 ; GISEL-NEXT: .byte 0 ; On action: cleanup
248 ; GISEL-NEXT: Lcst_end0:
249 ; GISEL-NEXT: .p2align 2, 0x0
251 %call = call ptr @foo1() [ "clang.arc.attachedcall"(ptr @objc_retainAutoreleasedReturnValue) ]
252 invoke void @objc_object(ptr %call) #5
253 to label %invoke.cont unwind label %lpad
255 invoke.cont: ; preds = %entry
256 tail call void @llvm.objc.release(ptr %call)
259 lpad: ; preds = %entry
260 %0 = landingpad { ptr, i32 }
262 tail call void @llvm.objc.release(ptr %call)
263 resume { ptr, i32 } %0
266 define dso_local void @rv_marker_4() personality ptr @__gxx_personality_v0 {
267 ; SELDAG-LABEL: rv_marker_4:
268 ; SELDAG: Lfunc_begin1:
269 ; SELDAG-NEXT: .cfi_startproc
270 ; SELDAG-NEXT: .cfi_personality 155, ___gxx_personality_v0
271 ; SELDAG-NEXT: .cfi_lsda 16, Lexception1
272 ; SELDAG-NEXT: ; %bb.0: ; %entry
273 ; SELDAG-NEXT: sub sp, sp, #48
274 ; SELDAG-NEXT: stp x20, x19, [sp, #16] ; 16-byte Folded Spill
275 ; SELDAG-NEXT: stp x29, x30, [sp, #32] ; 16-byte Folded Spill
276 ; SELDAG-NEXT: .cfi_def_cfa_offset 48
277 ; SELDAG-NEXT: .cfi_offset w30, -8
278 ; SELDAG-NEXT: .cfi_offset w29, -16
279 ; SELDAG-NEXT: .cfi_offset w19, -24
280 ; SELDAG-NEXT: .cfi_offset w20, -32
281 ; SELDAG-NEXT: Ltmp3:
282 ; SELDAG-NEXT: bl _foo1
283 ; SELDAG-NEXT: mov x29, x29
284 ; SELDAG-NEXT: bl _objc_retainAutoreleasedReturnValue
285 ; SELDAG-NEXT: Ltmp4:
286 ; SELDAG-NEXT: ; %bb.1: ; %invoke.cont
287 ; SELDAG-NEXT: Ltmp6:
288 ; SELDAG-NEXT: mov x19, x0
289 ; SELDAG-NEXT: bl _objc_object
290 ; SELDAG-NEXT: Ltmp7:
291 ; SELDAG-NEXT: ; %bb.2: ; %invoke.cont2
292 ; SELDAG-NEXT: mov x0, x19
293 ; SELDAG-NEXT: bl _objc_release
294 ; SELDAG-NEXT: add x0, sp, #15
295 ; SELDAG-NEXT: bl __ZN1SD1Ev
296 ; SELDAG-NEXT: ldp x29, x30, [sp, #32] ; 16-byte Folded Reload
297 ; SELDAG-NEXT: ldp x20, x19, [sp, #16] ; 16-byte Folded Reload
298 ; SELDAG-NEXT: add sp, sp, #48
300 ; SELDAG-NEXT: LBB4_3: ; %lpad1
301 ; SELDAG-NEXT: Ltmp8:
302 ; SELDAG-NEXT: mov x20, x0
303 ; SELDAG-NEXT: mov x0, x19
304 ; SELDAG-NEXT: bl _objc_release
305 ; SELDAG-NEXT: b LBB4_5
306 ; SELDAG-NEXT: LBB4_4: ; %lpad
307 ; SELDAG-NEXT: Ltmp5:
308 ; SELDAG-NEXT: mov x20, x0
309 ; SELDAG-NEXT: LBB4_5: ; %ehcleanup
310 ; SELDAG-NEXT: add x0, sp, #15
311 ; SELDAG-NEXT: bl __ZN1SD1Ev
312 ; SELDAG-NEXT: mov x0, x20
313 ; SELDAG-NEXT: bl __Unwind_Resume
314 ; SELDAG-NEXT: Lfunc_end1:
315 ; SELDAG-NEXT: .cfi_endproc
316 ; SELDAG-NEXT: .section __TEXT,__gcc_except_tab
317 ; SELDAG-NEXT: .p2align 2, 0x0
318 ; SELDAG-NEXT: GCC_except_table4:
319 ; SELDAG-NEXT: Lexception1:
320 ; SELDAG-NEXT: .byte 255 ; @LPStart Encoding = omit
321 ; SELDAG-NEXT: .byte 255 ; @TType Encoding = omit
322 ; SELDAG-NEXT: .byte 1 ; Call site Encoding = uleb128
323 ; SELDAG-NEXT: .uleb128 Lcst_end1-Lcst_begin1
324 ; SELDAG-NEXT: Lcst_begin1:
325 ; SELDAG-NEXT: .uleb128 Ltmp3-Lfunc_begin1 ; >> Call Site 1 <<
326 ; SELDAG-NEXT: .uleb128 Ltmp4-Ltmp3 ; Call between Ltmp3 and Ltmp4
327 ; SELDAG-NEXT: .uleb128 Ltmp5-Lfunc_begin1 ; jumps to Ltmp5
328 ; SELDAG-NEXT: .byte 0 ; On action: cleanup
329 ; SELDAG-NEXT: .uleb128 Ltmp6-Lfunc_begin1 ; >> Call Site 2 <<
330 ; SELDAG-NEXT: .uleb128 Ltmp7-Ltmp6 ; Call between Ltmp6 and Ltmp7
331 ; SELDAG-NEXT: .uleb128 Ltmp8-Lfunc_begin1 ; jumps to Ltmp8
332 ; SELDAG-NEXT: .byte 0 ; On action: cleanup
333 ; SELDAG-NEXT: .uleb128 Ltmp7-Lfunc_begin1 ; >> Call Site 3 <<
334 ; SELDAG-NEXT: .uleb128 Lfunc_end1-Ltmp7 ; Call between Ltmp7 and Lfunc_end1
335 ; SELDAG-NEXT: .byte 0 ; has no landing pad
336 ; SELDAG-NEXT: .byte 0 ; On action: cleanup
337 ; SELDAG-NEXT: Lcst_end1:
338 ; SELDAG-NEXT: .p2align 2, 0x0
340 ; GISEL-LABEL: rv_marker_4:
341 ; GISEL: Lfunc_begin1:
342 ; GISEL-NEXT: .cfi_startproc
343 ; GISEL-NEXT: .cfi_personality 155, ___gxx_personality_v0
344 ; GISEL-NEXT: .cfi_lsda 16, Lexception1
345 ; GISEL-NEXT: ; %bb.0: ; %entry
346 ; GISEL-NEXT: sub sp, sp, #48
347 ; GISEL-NEXT: stp x20, x19, [sp, #16] ; 16-byte Folded Spill
348 ; GISEL-NEXT: stp x29, x30, [sp, #32] ; 16-byte Folded Spill
349 ; GISEL-NEXT: .cfi_def_cfa_offset 48
350 ; GISEL-NEXT: .cfi_offset w30, -8
351 ; GISEL-NEXT: .cfi_offset w29, -16
352 ; GISEL-NEXT: .cfi_offset w19, -24
353 ; GISEL-NEXT: .cfi_offset w20, -32
355 ; GISEL-NEXT: bl _foo1
356 ; GISEL-NEXT: mov x29, x29
357 ; GISEL-NEXT: bl _objc_retainAutoreleasedReturnValue
359 ; GISEL-NEXT: ; %bb.1: ; %invoke.cont
361 ; GISEL-NEXT: mov x19, x0
362 ; GISEL-NEXT: bl _objc_object
364 ; GISEL-NEXT: ; %bb.2: ; %invoke.cont2
366 ; GISEL-NEXT: adrp x8, _objc_release@GOTPAGE
367 ; GISEL-NEXT: mov x0, x19
369 ; GISEL-NEXT: ldr x8, [x8, _objc_release@GOTPAGEOFF]
371 ; GISEL-NEXT: add x0, sp, #15
372 ; GISEL-NEXT: bl __ZN1SD1Ev
373 ; GISEL-NEXT: ldp x29, x30, [sp, #32] ; 16-byte Folded Reload
374 ; GISEL-NEXT: ldp x20, x19, [sp, #16] ; 16-byte Folded Reload
375 ; GISEL-NEXT: add sp, sp, #48
377 ; GISEL-NEXT: LBB4_3: ; %lpad1
380 ; GISEL-NEXT: adrp x8, _objc_release@GOTPAGE
381 ; GISEL-NEXT: mov x20, x0
382 ; GISEL-NEXT: mov x0, x19
384 ; GISEL-NEXT: ldr x8, [x8, _objc_release@GOTPAGEOFF]
386 ; GISEL-NEXT: b LBB4_5
387 ; GISEL-NEXT: LBB4_4: ; %lpad
389 ; GISEL-NEXT: mov x20, x0
390 ; GISEL-NEXT: LBB4_5: ; %ehcleanup
391 ; GISEL-NEXT: add x0, sp, #15
392 ; GISEL-NEXT: bl __ZN1SD1Ev
393 ; GISEL-NEXT: mov x0, x20
394 ; GISEL-NEXT: bl __Unwind_Resume
395 ; GISEL-NEXT: .loh AdrpLdrGot Lloh4, Lloh5
396 ; GISEL-NEXT: .loh AdrpLdrGot Lloh6, Lloh7
397 ; GISEL-NEXT: Lfunc_end1:
398 ; GISEL-NEXT: .cfi_endproc
399 ; GISEL-NEXT: .section __TEXT,__gcc_except_tab
400 ; GISEL-NEXT: .p2align 2, 0x0
401 ; GISEL-NEXT: GCC_except_table4:
402 ; GISEL-NEXT: Lexception1:
403 ; GISEL-NEXT: .byte 255 ; @LPStart Encoding = omit
404 ; GISEL-NEXT: .byte 255 ; @TType Encoding = omit
405 ; GISEL-NEXT: .byte 1 ; Call site Encoding = uleb128
406 ; GISEL-NEXT: .uleb128 Lcst_end1-Lcst_begin1
407 ; GISEL-NEXT: Lcst_begin1:
408 ; GISEL-NEXT: .uleb128 Ltmp3-Lfunc_begin1 ; >> Call Site 1 <<
409 ; GISEL-NEXT: .uleb128 Ltmp4-Ltmp3 ; Call between Ltmp3 and Ltmp4
410 ; GISEL-NEXT: .uleb128 Ltmp5-Lfunc_begin1 ; jumps to Ltmp5
411 ; GISEL-NEXT: .byte 0 ; On action: cleanup
412 ; GISEL-NEXT: .uleb128 Ltmp6-Lfunc_begin1 ; >> Call Site 2 <<
413 ; GISEL-NEXT: .uleb128 Ltmp7-Ltmp6 ; Call between Ltmp6 and Ltmp7
414 ; GISEL-NEXT: .uleb128 Ltmp8-Lfunc_begin1 ; jumps to Ltmp8
415 ; GISEL-NEXT: .byte 0 ; On action: cleanup
416 ; GISEL-NEXT: .uleb128 Ltmp7-Lfunc_begin1 ; >> Call Site 3 <<
417 ; GISEL-NEXT: .uleb128 Lfunc_end1-Ltmp7 ; Call between Ltmp7 and Lfunc_end1
418 ; GISEL-NEXT: .byte 0 ; has no landing pad
419 ; GISEL-NEXT: .byte 0 ; On action: cleanup
420 ; GISEL-NEXT: Lcst_end1:
421 ; GISEL-NEXT: .p2align 2, 0x0
423 %s = alloca %struct.S, align 1
424 call void @llvm.lifetime.start.p0(i64 1, ptr nonnull %s) #2
425 %call = invoke ptr @foo1() [ "clang.arc.attachedcall"(ptr @objc_retainAutoreleasedReturnValue) ]
426 to label %invoke.cont unwind label %lpad
428 invoke.cont: ; preds = %entry
429 invoke void @objc_object(ptr %call) #5
430 to label %invoke.cont2 unwind label %lpad1
432 invoke.cont2: ; preds = %invoke.cont
433 tail call void @llvm.objc.release(ptr %call)
434 %call3 = call ptr @_ZN1SD1Ev(ptr nonnull dereferenceable(1) %s)
435 call void @llvm.lifetime.end.p0(i64 1, ptr nonnull %s)
438 lpad: ; preds = %entry
439 %0 = landingpad { ptr, i32 }
443 lpad1: ; preds = %invoke.cont
444 %1 = landingpad { ptr, i32 }
446 tail call void @llvm.objc.release(ptr %call)
449 ehcleanup: ; preds = %lpad1, %lpad
450 %.pn = phi { ptr, i32 } [ %1, %lpad1 ], [ %0, %lpad ]
451 %call4 = call ptr @_ZN1SD1Ev(ptr nonnull dereferenceable(1) %s)
452 call void @llvm.lifetime.end.p0(i64 1, ptr nonnull %s)
453 resume { ptr, i32 } %.pn
456 define dso_local ptr @rv_marker_5_indirect_call() {
457 ; SELDAG-LABEL: rv_marker_5_indirect_call:
458 ; SELDAG: ; %bb.0: ; %entry
459 ; SELDAG-NEXT: stp x20, x19, [sp, #-32]! ; 16-byte Folded Spill
460 ; SELDAG-NEXT: stp x29, x30, [sp, #16] ; 16-byte Folded Spill
461 ; SELDAG-NEXT: .cfi_def_cfa_offset 32
462 ; SELDAG-NEXT: .cfi_offset w30, -8
463 ; SELDAG-NEXT: .cfi_offset w29, -16
464 ; SELDAG-NEXT: .cfi_offset w19, -24
465 ; SELDAG-NEXT: .cfi_offset w20, -32
466 ; SELDAG-NEXT: Lloh0:
467 ; SELDAG-NEXT: adrp x8, _fptr@PAGE
468 ; SELDAG-NEXT: Lloh1:
469 ; SELDAG-NEXT: ldr x8, [x8, _fptr@PAGEOFF]
470 ; SELDAG-NEXT: blr x8
471 ; SELDAG-NEXT: mov x29, x29
472 ; SELDAG-NEXT: bl _objc_retainAutoreleasedReturnValue
473 ; SELDAG-NEXT: mov x19, x0
474 ; SELDAG-NEXT: bl _foo2
475 ; SELDAG-NEXT: ldp x29, x30, [sp, #16] ; 16-byte Folded Reload
476 ; SELDAG-NEXT: mov x0, x19
477 ; SELDAG-NEXT: ldp x20, x19, [sp], #32 ; 16-byte Folded Reload
479 ; SELDAG-NEXT: .loh AdrpLdr Lloh0, Lloh1
481 ; GISEL-LABEL: rv_marker_5_indirect_call:
482 ; GISEL: ; %bb.0: ; %entry
483 ; GISEL-NEXT: stp x20, x19, [sp, #-32]! ; 16-byte Folded Spill
484 ; GISEL-NEXT: stp x29, x30, [sp, #16] ; 16-byte Folded Spill
485 ; GISEL-NEXT: .cfi_def_cfa_offset 32
486 ; GISEL-NEXT: .cfi_offset w30, -8
487 ; GISEL-NEXT: .cfi_offset w29, -16
488 ; GISEL-NEXT: .cfi_offset w19, -24
489 ; GISEL-NEXT: .cfi_offset w20, -32
491 ; GISEL-NEXT: adrp x8, _fptr@PAGE
493 ; GISEL-NEXT: ldr x8, [x8, _fptr@PAGEOFF]
495 ; GISEL-NEXT: mov x29, x29
496 ; GISEL-NEXT: bl _objc_retainAutoreleasedReturnValue
497 ; GISEL-NEXT: mov x19, x0
498 ; GISEL-NEXT: bl _foo2
499 ; GISEL-NEXT: ldp x29, x30, [sp, #16] ; 16-byte Folded Reload
500 ; GISEL-NEXT: mov x0, x19
501 ; GISEL-NEXT: ldp x20, x19, [sp], #32 ; 16-byte Folded Reload
503 ; GISEL-NEXT: .loh AdrpLdr Lloh8, Lloh9
505 %0 = load ptr, ptr @fptr, align 8
506 %call = call ptr %0() [ "clang.arc.attachedcall"(ptr @objc_retainAutoreleasedReturnValue) ]
507 tail call void @foo2(ptr %call)
511 declare ptr @foo(i64, i64, i64)
513 define dso_local void @rv_marker_multiarg(i64 %a, i64 %b, i64 %c) {
514 ; SELDAG-LABEL: rv_marker_multiarg:
516 ; SELDAG-NEXT: stp x29, x30, [sp, #-16]! ; 16-byte Folded Spill
517 ; SELDAG-NEXT: .cfi_def_cfa_offset 16
518 ; SELDAG-NEXT: .cfi_offset w30, -8
519 ; SELDAG-NEXT: .cfi_offset w29, -16
520 ; SELDAG-NEXT: mov x8, x0
521 ; SELDAG-NEXT: mov x0, x2
522 ; SELDAG-NEXT: mov x2, x8
523 ; SELDAG-NEXT: bl _foo
524 ; SELDAG-NEXT: mov x29, x29
525 ; SELDAG-NEXT: bl _objc_retainAutoreleasedReturnValue
526 ; SELDAG-NEXT: ldp x29, x30, [sp], #16 ; 16-byte Folded Reload
529 ; GISEL-LABEL: rv_marker_multiarg:
531 ; GISEL-NEXT: stp x29, x30, [sp, #-16]! ; 16-byte Folded Spill
532 ; GISEL-NEXT: .cfi_def_cfa_offset 16
533 ; GISEL-NEXT: .cfi_offset w30, -8
534 ; GISEL-NEXT: .cfi_offset w29, -16
535 ; GISEL-NEXT: mov x3, x0
536 ; GISEL-NEXT: mov x0, x2
537 ; GISEL-NEXT: mov x2, x3
538 ; GISEL-NEXT: bl _foo
539 ; GISEL-NEXT: mov x29, x29
540 ; GISEL-NEXT: bl _objc_retainAutoreleasedReturnValue
541 ; GISEL-NEXT: ldp x29, x30, [sp], #16 ; 16-byte Folded Reload
543 call ptr @foo(i64 %c, i64 %b, i64 %a) [ "clang.arc.attachedcall"(ptr @objc_retainAutoreleasedReturnValue) ]
547 declare ptr @objc_retainAutoreleasedReturnValue(ptr)
548 declare ptr @objc_unsafeClaimAutoreleasedReturnValue(ptr)
549 declare i32 @__gxx_personality_v0(...)
550 ;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line: