diff --git a/lib/Target/X86/X86ISelLowering.cpp b/lib/Target/X86/X86ISelLowering.cpp index 9477f4db400..3cd80394f5b 100644 --- a/lib/Target/X86/X86ISelLowering.cpp +++ b/lib/Target/X86/X86ISelLowering.cpp @@ -32573,3 +32573,7 @@ void X86TargetLowering::insertCopiesSplitCSR( .addReg(NewVR); } } + +bool X86TargetLowering::supportSwiftError() const { + return Subtarget.is64Bit(); +} diff --git a/lib/Target/X86/X86ISelLowering.h b/lib/Target/X86/X86ISelLowering.h index ab32487fc41..6366ef48118 100644 --- a/lib/Target/X86/X86ISelLowering.h +++ b/lib/Target/X86/X86ISelLowering.h @@ -1022,9 +1022,7 @@ namespace llvm { bool isIntDivCheap(EVT VT, AttributeSet Attr) const override; - bool supportSwiftError() const override { - return true; - } + bool supportSwiftError() const override; protected: std::pair diff --git a/test/CodeGen/X86/swifterror.ll b/test/CodeGen/X86/swifterror.ll index b7226eb2b4e..b88907eaa3a 100644 --- a/test/CodeGen/X86/swifterror.ll +++ b/test/CodeGen/X86/swifterror.ll @@ -1,5 +1,6 @@ ; RUN: llc -verify-machineinstrs < %s -mtriple=x86_64-apple-darwin | FileCheck --check-prefix=CHECK-APPLE %s ; RUN: llc -verify-machineinstrs -O0 < %s -mtriple=x86_64-apple-darwin | FileCheck --check-prefix=CHECK-O0 %s +; RUN: llc -verify-machineinstrs < %s -mtriple=i386-apple-darwin | FileCheck --check-prefix=CHECK-i386 %s declare i8* @malloc(i64) declare void @free(i8*) @@ -478,3 +479,19 @@ entry: %0 = tail call swiftcc float @tailcallswifterror_swiftcc(%swift_error** swifterror %error_ptr_ref) ret float %0 } + +; Check that we can handle an empty function with swifterror argument. +; CHECK-i386-LABEL: empty_swiftcc: +; CHECK-i386: movl 4(%esp), %eax +; CHECK-i386: movl 8(%esp), %edx +; CHECK-i386: movl 12(%esp), %ecx +; CHECK-i386: retl +; CHECK-APPLE-LABEL: empty_swiftcc: +; CHECK-APPLE: movl %edx, %ecx +; CHECK-APPLE: movl %edi, %eax +; CHECK-APPLE: movl %esi, %edx +; CHECK-APPLE: retq +define swiftcc {i32, i32, i32} @empty_swiftcc({i32, i32, i32} , %swift_error** swifterror %error_ptr_ref) { +entry: + ret {i32, i32, i32} %0 +}