mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-25 12:12:47 +01:00
f87d29dc88
Cleanup/change the code that checks for possible tailcall conventions to look the same as the one in the X86 target. This makes the distinction between calling conventions that can guarnatee tailcalls and the ones that may tailcall more obvious. - Add Swift to the mayTailCall list - PreserveMost seemed to be incorrectly part of the guarnteed tail call list, move it to the mayTailCall list. llvm-svn: 281376
101 lines
2.5 KiB
LLVM
101 lines
2.5 KiB
LLVM
; RUN: llc < %s -mtriple=arm64-apple-ios7.0 | FileCheck %s
|
|
|
|
@t = weak global i32 ()* null
|
|
@x = external global i32, align 4
|
|
|
|
define void @t2() {
|
|
; CHECK-LABEL: t2:
|
|
; CHECK: adrp x[[GOTADDR:[0-9]+]], _t@GOTPAGE
|
|
; CHECK: ldr x[[ADDR:[0-9]+]], [x[[GOTADDR]], _t@GOTPAGEOFF]
|
|
; CHECK: ldr x[[DEST:[0-9]+]], [x[[ADDR]]]
|
|
; CHECK: br x[[DEST]]
|
|
%tmp = load i32 ()*, i32 ()** @t
|
|
%tmp.upgrd.2 = tail call i32 %tmp()
|
|
ret void
|
|
}
|
|
|
|
define void @t3() {
|
|
; CHECK-LABEL: t3:
|
|
; CHECK: b _t2
|
|
tail call void @t2()
|
|
ret void
|
|
}
|
|
|
|
define double @t4(double %a) nounwind readonly ssp {
|
|
; CHECK-LABEL: t4:
|
|
; CHECK: b _sin
|
|
%tmp = tail call double @sin(double %a) nounwind readonly
|
|
ret double %tmp
|
|
}
|
|
|
|
define float @t5(float %a) nounwind readonly ssp {
|
|
; CHECK-LABEL: t5:
|
|
; CHECK: b _sinf
|
|
%tmp = tail call float @sinf(float %a) nounwind readonly
|
|
ret float %tmp
|
|
}
|
|
|
|
define void @t7() nounwind {
|
|
; CHECK-LABEL: t7:
|
|
; CHECK: b _foo
|
|
; CHECK: b _bar
|
|
|
|
br i1 undef, label %bb, label %bb1.lr.ph
|
|
|
|
bb1.lr.ph: ; preds = %entry
|
|
tail call void @bar() nounwind
|
|
ret void
|
|
|
|
bb: ; preds = %entry
|
|
tail call void @foo() nounwind
|
|
ret void
|
|
}
|
|
|
|
define i32 @t8(i32 %x) nounwind ssp {
|
|
; CHECK-LABEL: t8:
|
|
; CHECK: b _c
|
|
; CHECK: b _a
|
|
; CHECK: b _b
|
|
%and = and i32 %x, 1
|
|
%tobool = icmp eq i32 %and, 0
|
|
br i1 %tobool, label %if.end, label %if.then
|
|
|
|
if.then: ; preds = %entry
|
|
%call = tail call i32 @a(i32 %x) nounwind
|
|
br label %return
|
|
|
|
if.end: ; preds = %entry
|
|
%and1 = and i32 %x, 2
|
|
%tobool2 = icmp eq i32 %and1, 0
|
|
br i1 %tobool2, label %if.end5, label %if.then3
|
|
|
|
if.then3: ; preds = %if.end
|
|
%call4 = tail call i32 @b(i32 %x) nounwind
|
|
br label %return
|
|
|
|
if.end5: ; preds = %if.end
|
|
%call6 = tail call i32 @c(i32 %x) nounwind
|
|
br label %return
|
|
|
|
return: ; preds = %if.end5, %if.then3, %if.then
|
|
%retval.0 = phi i32 [ %call, %if.then ], [ %call4, %if.then3 ], [ %call6, %if.end5 ]
|
|
ret i32 %retval.0
|
|
}
|
|
|
|
declare float @sinf(float) nounwind readonly
|
|
declare double @sin(double) nounwind readonly
|
|
declare void @bar() nounwind
|
|
declare void @foo() nounwind
|
|
declare i32 @a(i32)
|
|
declare i32 @b(i32)
|
|
declare i32 @c(i32)
|
|
|
|
; CHECK-LABEL: tswift:
|
|
; CHECK: b _swiftfunc
|
|
define swiftcc i32 @tswift(i32 %a) nounwind {
|
|
%res = tail call i32 @swiftfunc(i32 %a)
|
|
ret i32 %res
|
|
}
|
|
|
|
declare swiftcc i32 @swiftfunc(i32) nounwind
|