mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-24 19:52:54 +01:00
2c78d5e9c7
For x86 targets, do not do sibling call optimization when materializing the callee's address would require a GOT relocation. We can still do tail calls to internal functions, hidden functions, and protected functions, because they do not require this kind of relocation. It is still possible to get GOT relocations when the user explicitly asks for it with musttail or -tailcallopt, both of which are supposed to guarantee TCO. Based on a patch by Chih-hung Hsieh. Reviewers: srhines, timmurray, danalbert, enh, void, nadav, rnk Subscribers: joerg, davidxl, llvm-commits Differential Revision: http://reviews.llvm.org/D9799 llvm-svn: 238487
17 lines
499 B
LLVM
17 lines
499 B
LLVM
; RUN: llc < %s -tailcallopt -mtriple=i686-pc-linux-gnu -relocation-model=pic | FileCheck %s
|
|
|
|
; This test uses guaranteed TCO so these will be tail calls, despite the early
|
|
; binding issues.
|
|
|
|
define protected fastcc i32 @tailcallee(i32 %a1, i32 %a2, i32 %a3, i32 %a4) {
|
|
entry:
|
|
ret i32 %a3
|
|
}
|
|
|
|
define fastcc i32 @tailcaller(i32 %in1, i32 %in2) {
|
|
entry:
|
|
%tmp11 = tail call fastcc i32 @tailcallee( i32 %in1, i32 %in2, i32 %in1, i32 %in2 ) ; <i32> [#uses=1]
|
|
ret i32 %tmp11
|
|
; CHECK: jmp tailcallee
|
|
}
|