diff options
author | Nico Weber <nicolasweber@gmx.de> | 2016-07-12 01:30:35 +0000 |
---|---|---|
committer | Nico Weber <nicolasweber@gmx.de> | 2016-07-12 01:30:35 +0000 |
commit | c7bf646a994949f9bf31cb5577575653b7414027 (patch) | |
tree | 139a546ff2710f661f3d0a7cc2e0200b4b966eba /llvm/lib/Target/X86/X86FastISel.cpp | |
parent | de76548f9aa6bd92e0552979fd55f533031282ed (diff) | |
download | bcm5719-llvm-c7bf646a994949f9bf31cb5577575653b7414027.tar.gz bcm5719-llvm-c7bf646a994949f9bf31cb5577575653b7414027.zip |
Teach FastISel about thiscall (and, hence, about callee-pop).
http://reviews.llvm.org/D22115
llvm-svn: 275135
Diffstat (limited to 'llvm/lib/Target/X86/X86FastISel.cpp')
-rw-r--r-- | llvm/lib/Target/X86/X86FastISel.cpp | 17 |
1 files changed, 12 insertions, 5 deletions
diff --git a/llvm/lib/Target/X86/X86FastISel.cpp b/llvm/lib/Target/X86/X86FastISel.cpp index 1457553e55f..6258e4f6cf3 100644 --- a/llvm/lib/Target/X86/X86FastISel.cpp +++ b/llvm/lib/Target/X86/X86FastISel.cpp @@ -1151,14 +1151,15 @@ bool X86FastISel::X86SelectRet(const Instruction *I) { if (CC != CallingConv::C && CC != CallingConv::Fast && CC != CallingConv::X86_FastCall && + CC != CallingConv::X86_ThisCall && CC != CallingConv::X86_64_SysV) return false; if (Subtarget->isCallingConvWin64(CC)) return false; - // Don't handle popping bytes on return for now. - if (X86MFInfo->getBytesToPopOnReturn() != 0) + // Don't handle popping bytes if they don't fit the ret's immediate. + if (!isUInt<16>(X86MFInfo->getBytesToPopOnReturn())) return false; // fastcc with -tailcallopt is intended to provide a guaranteed @@ -1261,9 +1262,15 @@ bool X86FastISel::X86SelectRet(const Instruction *I) { } // Now emit the RET. - MachineInstrBuilder MIB = - BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DbgLoc, - TII.get(Subtarget->is64Bit() ? X86::RETQ : X86::RETL)); + MachineInstrBuilder MIB; + if (X86MFInfo->getBytesToPopOnReturn()) { + MIB = BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DbgLoc, + TII.get(Subtarget->is64Bit() ? X86::RETIQ : X86::RETIL)) + .addImm(X86MFInfo->getBytesToPopOnReturn()); + } else { + MIB = BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DbgLoc, + TII.get(Subtarget->is64Bit() ? X86::RETQ : X86::RETL)); + } for (unsigned i = 0, e = RetRegs.size(); i != e; ++i) MIB.addReg(RetRegs[i], RegState::Implicit); return true; |