[Hexagon] Use A2_tfrsi for constant pool and jump table addresses
[oota-llvm.git] / test / CodeGen / AArch64 / regress-tail-livereg.ll
index 0c7f8cbffadbe41a1d2aaaa85e35e7b0368e67e3..965aa0d062d5e9801eea01785e1bfae57b38367d 100644 (file)
@@ -1,11 +1,11 @@
-; RUN: llc -verify-machineinstrs -march=aarch64 < %s | FileCheck %s
+; RUN: llc -verify-machineinstrs -mtriple=arm64-apple-ios7.0 -o - %s | FileCheck %s
 @var = global void()* zeroinitializer
 
 declare void @bar()
 
 define void @foo() {
-; CHECK: foo:
-       %func = load void()** @var
+; CHECK-LABEL: foo:
+       %func = load void()*, void()** @var
 
        ; Calling a function encourages @foo to use a callee-saved register,
        ; which makes it a natural choice for the tail call itself. But we don't
@@ -16,4 +16,18 @@ define void @foo() {
        tail call void %func()
 ; CHECK: br {{x([0-79]|1[0-8])}}
        ret void
-}
\ No newline at end of file
+}
+
+; No matter how tempting it is, LLVM should not use x30 since that'll be
+; restored to its incoming value before the "br".
+define void @test_x30_tail() {
+; CHECK-LABEL: test_x30_tail:
+; CHECK: mov [[DEST:x[0-9]+]], x30
+; CHECK: br [[DEST]]
+  %addr = call i8* @llvm.returnaddress(i32 0)
+  %faddr = bitcast i8* %addr to void()*
+  tail call void %faddr()
+  ret void
+}
+
+declare i8* @llvm.returnaddress(i32)