]> granicus.if.org Git - llvm/commitdiff
Disable tail calls if there is an swifterror argument
authorArnold Schwaighofer <aschwaighofer@apple.com>
Wed, 21 Sep 2016 16:53:36 +0000 (16:53 +0000)
committerArnold Schwaighofer <aschwaighofer@apple.com>
Wed, 21 Sep 2016 16:53:36 +0000 (16:53 +0000)
ISel does not handle them correctly yet i.e we crash trying to emit tail call
code.

radar://28407842

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@282088 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp
test/CodeGen/AArch64/swifterror.ll
test/CodeGen/ARM/swifterror.ll
test/CodeGen/X86/swifterror.ll

index ceabccca2ab16a466eb47375c78c6deb614b42a7..a0db9ae34f8523e6befd428d270ba717452cd449 100644 (file)
@@ -5833,6 +5833,11 @@ void SelectionDAGBuilder::LowerCallTo(ImmutableCallSite CS, SDValue Callee,
   if (isTailCall && !isInTailCallPosition(CS, DAG.getTarget()))
     isTailCall = false;
 
+  // Disable tail calls if there is an swifterror argument. Targets have not
+  // been updated to support tail calls.
+  if (TLI.supportSwiftError() && SwiftErrorVal)
+    isTailCall = false;
+
   TargetLowering::CallLoweringInfo CLI(DAG);
   CLI.setDebugLoc(getCurSDLoc())
       .setChain(getRoot())
index a0bfffdef95e704689b7a40c7b0c51cb64621c98..507ae4d37d5dbbd2147839c764f08d165b1eaf76 100644 (file)
@@ -383,3 +383,15 @@ handler:
   call void @free(i8* %tmp)
   ret float 1.0
 }
+
+; Check that we don't blow up on tail calling swifterror argument functions.
+define float @tailcallswifterror(%swift_error** swifterror %error_ptr_ref) {
+entry:
+  %0 = tail call float @tailcallswifterror(%swift_error** swifterror %error_ptr_ref)
+  ret float %0
+}
+define swiftcc float @tailcallswifterror_swiftcc(%swift_error** swifterror %error_ptr_ref) {
+entry:
+  %0 = tail call swiftcc float @tailcallswifterror_swiftcc(%swift_error** swifterror %error_ptr_ref)
+  ret float %0
+}
index 17bd7059f6d40860ddc1d047933a6dfca306728e..29cd2ffc281123238b48ddcc1067a36f50247919 100644 (file)
@@ -379,3 +379,15 @@ handler:
   call void @free(i8* %tmp)
   ret float 1.0
 }
+
+; Check that we don't blow up on tail calling swifterror argument functions.
+define float @tailcallswifterror(%swift_error** swifterror %error_ptr_ref) {
+entry:
+  %0 = tail call float @tailcallswifterror(%swift_error** swifterror %error_ptr_ref)
+  ret float %0
+}
+define swiftcc float @tailcallswifterror_swiftcc(%swift_error** swifterror %error_ptr_ref) {
+entry:
+  %0 = tail call swiftcc float @tailcallswifterror_swiftcc(%swift_error** swifterror %error_ptr_ref)
+  ret float %0
+}
index b1e82e543284f45ba091db0b86dbebe53aa3634e..b7226eb2b4ee316ac32eff68c28cbf46050b2ded 100644 (file)
@@ -466,3 +466,15 @@ gen_error:
 normal:
   ret float 0.0
 }
+
+; Check that we don't blow up on tail calling swifterror argument functions.
+define float @tailcallswifterror(%swift_error** swifterror %error_ptr_ref) {
+entry:
+  %0 = tail call float @tailcallswifterror(%swift_error** swifterror %error_ptr_ref)
+  ret float %0
+}
+define swiftcc float @tailcallswifterror_swiftcc(%swift_error** swifterror %error_ptr_ref) {
+entry:
+  %0 = tail call swiftcc float @tailcallswifterror_swiftcc(%swift_error** swifterror %error_ptr_ref)
+  ret float %0
+}