mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-25 04:02:41 +01:00
a6d2fff5aa
Currently, musttail codegen is relying on sibcall optimization, and reporting a fatal error if fails. Sibcall optimization fails when stack arguments need to be modified, which is insufficient for musttail. The logic for moving arguments in memory safely is already implemented for GuaranteedTailCallOpt. This change merely arranges for musttail calls to use it. No functional change for GuaranteedTailCallOpt. Reviewers: espindola Differential Revision: http://reviews.llvm.org/D3493 llvm-svn: 207598
32 lines
1.0 KiB
LLVM
32 lines
1.0 KiB
LLVM
; RUN: llc -march=x86 < %s | FileCheck %s
|
|
; RUN: llc -march=x86 -O0 < %s | FileCheck %s
|
|
|
|
; CHECK-LABEL: t1:
|
|
; CHECK: jmp {{_?}}t1_callee
|
|
define x86_thiscallcc void @t1(i8* %this) {
|
|
%adj = getelementptr i8* %this, i32 4
|
|
musttail call x86_thiscallcc void @t1_callee(i8* %adj)
|
|
ret void
|
|
}
|
|
declare x86_thiscallcc void @t1_callee(i8* %this)
|
|
|
|
; CHECK-LABEL: t2:
|
|
; CHECK: jmp {{_?}}t2_callee
|
|
define x86_thiscallcc i32 @t2(i8* %this, i32 %a) {
|
|
%adj = getelementptr i8* %this, i32 4
|
|
%rv = musttail call x86_thiscallcc i32 @t2_callee(i8* %adj, i32 %a)
|
|
ret i32 %rv
|
|
}
|
|
declare x86_thiscallcc i32 @t2_callee(i8* %this, i32 %a)
|
|
|
|
; CHECK-LABEL: t3:
|
|
; CHECK: jmp {{_?}}t3_callee
|
|
define x86_thiscallcc i8* @t3(i8* %this, <{ i8*, i32 }>* inalloca %args) {
|
|
%adj = getelementptr i8* %this, i32 4
|
|
%a_ptr = getelementptr <{ i8*, i32 }>* %args, i32 0, i32 1
|
|
store i32 0, i32* %a_ptr
|
|
%rv = musttail call x86_thiscallcc i8* @t3_callee(i8* %adj, <{ i8*, i32 }>* inalloca %args)
|
|
ret i8* %rv
|
|
}
|
|
declare x86_thiscallcc i8* @t3_callee(i8* %this, <{ i8*, i32 }>* inalloca %args);
|