Home | History | Annotate | Download | only in AArch64
      1 ; RUN: llc -verify-machineinstrs -mtriple=arm64-apple-ios7.0 -o - %s | FileCheck %s
      2 @var = global void()* zeroinitializer
      3 
      4 declare void @bar()
      5 
      6 define void @foo() {
      7 ; CHECK-LABEL: foo:
      8        %func = load void()*, void()** @var
      9 
     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()
     15 
     16        tail call void %func()
     17 ; CHECK: br {{x([0-79]|1[0-8])}}
     18        ret void
     19 }
     20 
     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 i8* @llvm.returnaddress(i32 0)
     28   %faddr = bitcast i8* %addr to void()*
     29   tail call void %faddr()
     30   ret void
     31 }
     32 
     33 declare i8* @llvm.returnaddress(i32)
     34