i386 does not support optimized swifterror handling
authorArnold Schwaighofer <aschwaighofer@apple.com>
Thu, 22 Sep 2016 20:06:25 +0000 (20:06 +0000)
committerArnold Schwaighofer <aschwaighofer@apple.com>
Thu, 22 Sep 2016 20:06:25 +0000 (20:06 +0000)
rdar://28432565

llvm-svn: 282186

llvm/lib/Target/X86/X86ISelLowering.cpp
llvm/lib/Target/X86/X86ISelLowering.h
llvm/test/CodeGen/X86/swifterror.ll

index 9477f4d..3cd8039 100644 (file)
@@ -32573,3 +32573,7 @@ void X86TargetLowering::insertCopiesSplitCSR(
           .addReg(NewVR);
   }
 }
+
+bool X86TargetLowering::supportSwiftError() const {
+  return Subtarget.is64Bit();
+}
index ab32487..6366ef4 100644 (file)
@@ -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<const TargetRegisterClass *, uint8_t>
index b7226eb..b88907e 100644 (file)
@@ -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
+}