1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-10-21 12:02:58 +02:00

Teach fast isel about thiscall (and callee-pop) calls.

http://reviews.llvm.org/D22315

llvm-svn: 275360
This commit is contained in:
Nico Weber 2016-07-14 01:52:51 +00:00
parent eabbdab4f5
commit d4fcb8d00e
2 changed files with 26 additions and 10 deletions

View File

@ -2983,9 +2983,9 @@ bool X86FastISel::fastLowerArguments() {
return true;
}
static unsigned computeBytesPoppedByCallee(const X86Subtarget *Subtarget,
CallingConv::ID CC,
ImmutableCallSite *CS) {
static unsigned computeBytesPoppedByCalleeForSRet(const X86Subtarget *Subtarget,
CallingConv::ID CC,
ImmutableCallSite *CS) {
if (Subtarget->is64Bit())
return 0;
if (Subtarget->getTargetTriple().isOSMSVCRT())
@ -3025,6 +3025,7 @@ bool X86FastISel::fastLowerCall(CallLoweringInfo &CLI) {
case CallingConv::WebKit_JS:
case CallingConv::Swift:
case CallingConv::X86_FastCall:
case CallingConv::X86_ThisCall:
case CallingConv::X86_64_Win64:
case CallingConv::X86_64_SysV:
break;
@ -3052,11 +3053,6 @@ bool X86FastISel::fastLowerCall(CallLoweringInfo &CLI) {
if (Flag.isSwiftError())
return false;
// Fast-isel doesn't know about callee-pop yet.
if (X86::isCalleePop(CC, Subtarget->is64Bit(), IsVarArg,
TM.Options.GuaranteedTailCallOpt))
return false;
SmallVector<MVT, 16> OutVTs;
SmallVector<unsigned, 16> ArgRegs;
@ -3336,7 +3332,10 @@ bool X86FastISel::fastLowerCall(CallLoweringInfo &CLI) {
// Issue CALLSEQ_END
unsigned NumBytesForCalleeToPop =
computeBytesPoppedByCallee(Subtarget, CC, CLI.CS);
X86::isCalleePop(CC, Subtarget->is64Bit(), IsVarArg,
TM.Options.GuaranteedTailCallOpt)
? NumBytes // Callee pops everything.
: computeBytesPoppedByCalleeForSRet(Subtarget, CC, CLI.CS);
unsigned AdjStackUp = TII.getCallFrameDestroyOpcode();
BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DbgLoc, TII.get(AdjStackUp))
.addImm(NumBytes).addImm(NumBytesForCalleeToPop);

View File

@ -1,4 +1,5 @@
; RUN: llc < %s -O0 -fast-isel-abort=1 -march=x86 -mtriple=i686-apple-darwin8 | FileCheck %s
; RUN: llc < %s -O0 -fast-isel-abort=1 -march=x86 -mtriple=i686-apple-darwin8 2>/dev/null | FileCheck %s
; RUN: llc < %s -O0 -fast-isel-abort=1 -march=x86 -mtriple=i686-apple-darwin8 2>&1 >/dev/null | FileCheck -check-prefix=STDERR -allow-empty %s
%struct.s = type {i32, i32, i32}
@ -53,3 +54,19 @@ define void @test4(i8* %a, i8* %b) {
; CHECK: movl $100, 8(%esp)
; CHECK: calll {{.*}}memcpy
}
; STDERR-NOT: FastISel missed call: call x86_thiscallcc void @thiscallfun
%struct.S = type { i8 }
define void @test5() #0 {
entry:
%s = alloca %struct.S, align 1
; CHECK-LABEL: test5:
; CHECK: subl $12, %esp
; CHECK: leal 8(%esp), %ecx
; CHECK: movl $43, (%esp)
; CHECK: calll {{.*}}thiscallfun
; CHECK: addl $8, %esp
call x86_thiscallcc void @thiscallfun(%struct.S* %s, i32 43)
ret void
}
declare x86_thiscallcc void @thiscallfun(%struct.S*, i32) #1