Bump version to 19.1.0-rc3
[llvm-project.git] / llvm / test / CodeGen / AArch64 / regress-tail-livereg.ll
blobc17d4ec4e9c171e02379201de20bfef7041998de
1 ; RUN: llc -verify-machineinstrs -mtriple=arm64-apple-ios7.0 -o - %s | FileCheck %s
2 @var = global ptr zeroinitializer
4 declare void @bar()
6 define void @foo() {
7 ; CHECK-LABEL: foo:
8        %func = load ptr, ptr @var
10        ; Calling a function encourages @foo to use a callee-saved register,
11        ; which makes it a natural choice for the tail call itself. But we don't
12        ; want that: the final "br xN" has to use a temporary or argument
13        ; register.
14        call void @bar()
16        tail call void %func()
17 ; CHECK: br {{x([0-79]|1[0-8])}}
18        ret void
21 ; No matter how tempting it is, LLVM should not use x30 since that'll be
22 ; restored to its incoming value before the "br".
23 define void @test_x30_tail() {
24 ; CHECK-LABEL: test_x30_tail:
25 ; CHECK: mov [[DEST:x[0-9]+]], x30
26 ; CHECK: br [[DEST]]
27   %addr = call ptr @llvm.returnaddress(i32 0)
28   tail call void %addr()
29   ret void
32 declare ptr @llvm.returnaddress(i32)