Skip to content

Commit d3e945a

Browse files
Merge pull request #2790 from aschwaighofer/i386_swifttailcc_swiftself
X86: swifttailcc pass swiftself in ECX
2 parents 5b25bcb + f6bdbde commit d3e945a

File tree

3 files changed

+30
-0
lines changed

3 files changed

+30
-0
lines changed

llvm/lib/Target/X86/X86CallingConv.td

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -862,6 +862,10 @@ def CC_X86_32_C : CallingConv<[
862862
// The 'nest' parameter, if any, is passed in ECX.
863863
CCIfNest<CCAssignToReg<[ECX]>>,
864864

865+
// On swifttailcc pass swiftself in ECX.
866+
CCIfCC<"CallingConv::SwiftTail",
867+
CCIfSwiftSelf<CCIfType<[i32], CCAssignToReg<[ECX]>>>>,
868+
865869
// The first 3 integer arguments, if marked 'inreg' and if the call is not
866870
// a vararg call, are passed in integer registers.
867871
CCIfNotVarArg<CCIfInReg<CCIfType<[i32], CCAssignToReg<[EAX, EDX, ECX]>>>>,

llvm/lib/Target/X86/X86RegisterInfo.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -350,6 +350,8 @@ X86RegisterInfo::getCalleeSavedRegs(const MachineFunction *MF) const {
350350
return CSR_Win64_NoSSE_SaveList;
351351
return CSR_Win64_SaveList;
352352
case CallingConv::SwiftTail:
353+
if (!Is64Bit)
354+
return CSR_32_SaveList;
353355
return IsWin64 ? CSR_Win64_SwiftTail_SaveList : CSR_64_SwiftTail_SaveList;
354356
case CallingConv::X86_64_SysV:
355357
if (CallsEHReturn)
@@ -468,6 +470,8 @@ X86RegisterInfo::getCallPreservedMask(const MachineFunction &MF,
468470
case CallingConv::Win64:
469471
return CSR_Win64_RegMask;
470472
case CallingConv::SwiftTail:
473+
if (!Is64Bit)
474+
return CSR_32_RegMask;
471475
return IsWin64 ? CSR_Win64_SwiftTail_RegMask : CSR_64_SwiftTail_RegMask;
472476
case CallingConv::X86_64_SysV:
473477
return CSR_64_RegMask;
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
; RUN: llc -mtriple=i386-apple-darwin %s -o - | FileCheck %s
2+
3+
declare void @clobber()
4+
5+
declare swifttailcc void @swifttail_callee()
6+
define swifttailcc void @swifttail() {
7+
; CHECK-LABEL: swifttail:
8+
; CHECK-NOT: %rbx
9+
call void @clobber()
10+
tail call swifttailcc void @swifttail_callee()
11+
ret void
12+
}
13+
14+
declare swifttailcc void @swiftself(i8* swiftself)
15+
16+
define swifttailcc void @swifttail2(i8* %arg) {
17+
; CHECK-LABEL: swifttail2:
18+
; CHECK: movl {{.*}}, %ecx
19+
; CHECK: jmp _swiftself
20+
tail call swifttailcc void @swiftself(i8* swiftself %arg)
21+
ret void
22+
}

0 commit comments

Comments
 (0)