summaryrefslogtreecommitdiffstats
path: root/llvm/test/CodeGen/ARM/call-tc.ll
diff options
context:
space:
mode:
authorDale Johannesen <dalej@apple.com>2010-06-18 19:00:18 +0000
committerDale Johannesen <dalej@apple.com>2010-06-18 19:00:18 +0000
commitc1570dda5c4fd8792fb159a0ec77ceee6348887a (patch)
tree896b7cbefa8b205ce5fcf2aa4f0db2ff04f1a105 /llvm/test/CodeGen/ARM/call-tc.ll
parente5457c275d0b5594995af70f8bf900c7fe435c26 (diff)
downloadbcm5719-llvm-c1570dda5c4fd8792fb159a0ec77ceee6348887a.tar.gz
bcm5719-llvm-c1570dda5c4fd8792fb159a0ec77ceee6348887a.zip
Enable tail calls on ARM by default, with some
basic tests. This has been well tested on Darwin but not elsewhere. It should work provided the linker correctly resolves B.W <label in other function> which it has not seen before, at least from llvm-based compilers. I'm leaving the arm-tail-calls switch in until I see if there's any problems because of that; it might need to be disabled for some environments. llvm-svn: 106299
Diffstat (limited to 'llvm/test/CodeGen/ARM/call-tc.ll')
-rw-r--r--llvm/test/CodeGen/ARM/call-tc.ll36
1 files changed, 36 insertions, 0 deletions
diff --git a/llvm/test/CodeGen/ARM/call-tc.ll b/llvm/test/CodeGen/ARM/call-tc.ll
new file mode 100644
index 00000000000..8103fab2092
--- /dev/null
+++ b/llvm/test/CodeGen/ARM/call-tc.ll
@@ -0,0 +1,36 @@
+; RUN: llc < %s -march=arm | FileCheck %s -check-prefix=CHECKV4
+; RUN: llc < %s -march=arm -mattr=+v5t | FileCheck %s -check-prefix=CHECKV5
+; RUN: llc < %s -march=arm -mtriple=arm-linux-gnueabi\
+; RUN: -relocation-model=pic | FileCheck %s -check-prefix=CHECKELF
+
+@t = weak global i32 ()* null ; <i32 ()**> [#uses=1]
+
+declare void @g(i32, i32, i32, i32)
+
+define void @f() {
+; CHECKELF: PLT
+ call void @g( i32 1, i32 2, i32 3, i32 4 )
+ ret void
+}
+
+define void @g.upgrd.1() {
+; CHECKV4: bx r0 @ TAILCALL
+; CHECKV5: bx r0 @ TAILCALL
+ %tmp = load i32 ()** @t ; <i32 ()*> [#uses=1]
+ %tmp.upgrd.2 = tail call i32 %tmp( ) ; <i32> [#uses=0]
+ ret void
+}
+
+define i32* @m_231b(i32, i32, i32*, i32*, i32*) nounwind {
+; CHECKV4: m_231b
+; CHECKV4: bx r{{.*}}
+BB0:
+ %5 = inttoptr i32 %0 to i32* ; <i32*> [#uses=1]
+ %t35 = volatile load i32* %5 ; <i32> [#uses=1]
+ %6 = inttoptr i32 %t35 to i32** ; <i32**> [#uses=1]
+ %7 = getelementptr i32** %6, i32 86 ; <i32**> [#uses=1]
+ %8 = load i32** %7 ; <i32*> [#uses=1]
+ %9 = bitcast i32* %8 to i32* (i32, i32*, i32, i32*, i32*, i32*)* ; <i32* (i32, i32*, i32, i32*, i32*, i32*)*> [#uses=1]
+ %10 = call i32* %9(i32 %0, i32* null, i32 %1, i32* %2, i32* %3, i32* %4) ; <i32*> [#uses=1]
+ ret i32* %10
+}
OpenPOWER on IntegriCloud