Index: lib/Target/X86/X86FastISel.cpp =================================================================== --- lib/Target/X86/X86FastISel.cpp +++ lib/Target/X86/X86FastISel.cpp @@ -2983,9 +2983,9 @@ 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 @@ 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 @@ 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 OutVTs; SmallVector ArgRegs; @@ -3336,7 +3332,10 @@ // 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); Index: test/CodeGen/X86/fast-isel-call.ll =================================================================== --- test/CodeGen/X86/fast-isel-call.ll +++ test/CodeGen/X86/fast-isel-call.ll @@ -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 @@ ; 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