From 422c1ecfb96ec0df41af0e3333383a5e01722990 Mon Sep 17 00:00:00 2001 From: Varun Gandhi Date: Tue, 30 Mar 2021 15:03:16 -0700 Subject: [PATCH 1/3] Use musttail in MergeFunctions for swiftasync->swiftasync tail calls. Fixes rdar://76024125. --- llvm/lib/Transforms/IPO/MergeFunctions.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/llvm/lib/Transforms/IPO/MergeFunctions.cpp b/llvm/lib/Transforms/IPO/MergeFunctions.cpp index 91af6e0cb72e1..d7892869525bc 100644 --- a/llvm/lib/Transforms/IPO/MergeFunctions.cpp +++ b/llvm/lib/Transforms/IPO/MergeFunctions.cpp @@ -709,7 +709,11 @@ void MergeFunctions::writeThunk(Function *F, Function *G) { CallInst *CI = Builder.CreateCall(F, Args); ReturnInst *RI = nullptr; - CI->setTailCall(); + bool isSwiftTailCall = + F->getCallingConv() == CallingConv::SwiftTail && + G->getCallingConv() == CallingConv::SwiftTail; + CI->setTailCallKind( + isSwiftTailCall ? llvm::CallInst::TCK_MustTail : llvm::CallInst::TCK_Tail); CI->setCallingConv(F->getCallingConv()); CI->setAttributes(F->getAttributes()); if (H->getReturnType()->isVoidTy()) { From bdad91989b36e821021d137fafe5329765921c77 Mon Sep 17 00:00:00 2001 From: Varun Gandhi Date: Tue, 30 Mar 2021 15:15:47 -0700 Subject: [PATCH 2/3] Update musttail verification to check all swiftasync->swiftasync tail calls. When -enable-swifttailcc-musttail-check is passed (off by default), we will check that all swiftasync->swiftasync tail calls are marked musttail. Fixes rdar://75899279. --- llvm/lib/IR/Verifier.cpp | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/llvm/lib/IR/Verifier.cpp b/llvm/lib/IR/Verifier.cpp index c0ff810458aa4..523e006bb34ac 100644 --- a/llvm/lib/IR/Verifier.cpp +++ b/llvm/lib/IR/Verifier.cpp @@ -3430,7 +3430,24 @@ static AttrBuilder getParameterABIAttributes(int I, AttributeList Attrs) { return Copy; } +static cl::opt +EnableSwiftTailCCMustTailCheck("enable-swifttailcc-musttail-check", +cl::init(false), cl::desc("Check that tail calls from swifttailcc functions to" + " swifttailcc functions are marked musttail.")); + void Verifier::verifyMustTailCall(CallInst &CI) { + if (!CI.isMustTailCall()) { + if (EnableSwiftTailCCMustTailCheck && + CI.getCallingConv() == CallingConv::SwiftTail && + CI.getCaller()->getCallingConv() == CallingConv::SwiftTail && + isa_and_nonnull(CI.getNextNode())) { + Assert( + false, "tail call from swifttail->swiftail should be marked musttail", + &CI); + } + return; + } + Assert(!CI.isInlineAsm(), "cannot use musttail call with inline asm", &CI); Function *F = CI.getParent()->getParent(); @@ -3515,9 +3532,7 @@ void Verifier::verifyMustTailCall(CallInst &CI) { void Verifier::visitCallInst(CallInst &CI) { visitCallBase(CI); - - if (CI.isMustTailCall()) - verifyMustTailCall(CI); + verifyMustTailCall(CI); } void Verifier::visitInvokeInst(InvokeInst &II) { From 7220c40793d731ed06be0a05c7ec0838c33d475a Mon Sep 17 00:00:00 2001 From: Varun Gandhi Date: Wed, 26 May 2021 11:28:24 -0700 Subject: [PATCH 3/3] Use additional musttail checking only in debug builds. --- llvm/lib/IR/Verifier.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/llvm/lib/IR/Verifier.cpp b/llvm/lib/IR/Verifier.cpp index 523e006bb34ac..3da7138d730a2 100644 --- a/llvm/lib/IR/Verifier.cpp +++ b/llvm/lib/IR/Verifier.cpp @@ -3437,6 +3437,7 @@ cl::init(false), cl::desc("Check that tail calls from swifttailcc functions to" void Verifier::verifyMustTailCall(CallInst &CI) { if (!CI.isMustTailCall()) { +#ifndef NDEBUG if (EnableSwiftTailCCMustTailCheck && CI.getCallingConv() == CallingConv::SwiftTail && CI.getCaller()->getCallingConv() == CallingConv::SwiftTail && @@ -3445,6 +3446,7 @@ void Verifier::verifyMustTailCall(CallInst &CI) { false, "tail call from swifttail->swiftail should be marked musttail", &CI); } +#endif return; }