diff --git a/include/llvm/CodeGen/GlobalISel/CallLowering.h b/include/llvm/CodeGen/GlobalISel/CallLowering.h index 3ff64b4c459..fa6c23a7e2c 100644 --- a/include/llvm/CodeGen/GlobalISel/CallLowering.h +++ b/include/llvm/CodeGen/GlobalISel/CallLowering.h @@ -80,6 +80,9 @@ public: Register SwiftErrorVReg = 0; MDNode *KnownCallees = nullptr; + + /// True if the call must be tail call optimized. + bool IsMustTailCall = false; }; /// Argument handling is mostly uniform between the four places that diff --git a/lib/CodeGen/GlobalISel/CallLowering.cpp b/lib/CodeGen/GlobalISel/CallLowering.cpp index efed4c281b5..5e08361fc05 100644 --- a/lib/CodeGen/GlobalISel/CallLowering.cpp +++ b/lib/CodeGen/GlobalISel/CallLowering.cpp @@ -62,6 +62,7 @@ bool CallLowering::lowerCall(MachineIRBuilder &MIRBuilder, ImmutableCallSite CS, CS.getInstruction()->getMetadata(LLVMContext::MD_callees); Info.CallConv = CS.getCallingConv(); Info.SwiftErrorVReg = SwiftErrorVReg; + Info.IsMustTailCall = CS.isMustTailCall(); return lowerCall(MIRBuilder, Info); } diff --git a/lib/Target/AArch64/AArch64CallLowering.cpp b/lib/Target/AArch64/AArch64CallLowering.cpp index 5dd83b9b208..e389aaaeb71 100644 --- a/lib/Target/AArch64/AArch64CallLowering.cpp +++ b/lib/Target/AArch64/AArch64CallLowering.cpp @@ -409,6 +409,11 @@ bool AArch64CallLowering::lowerCall(MachineIRBuilder &MIRBuilder, MachineRegisterInfo &MRI = MF.getRegInfo(); auto &DL = F.getParent()->getDataLayout(); + if (Info.IsMustTailCall) { + LLVM_DEBUG(dbgs() << "Cannot lower musttail calls yet.\n"); + return false; + } + SmallVector SplitArgs; for (auto &OrigArg : Info.OrigArgs) { splitToValueTypes(OrigArg, SplitArgs, DL, MRI, Info.CallConv); diff --git a/test/CodeGen/AArch64/GlobalISel/call-translator-musttail.ll b/test/CodeGen/AArch64/GlobalISel/call-translator-musttail.ll new file mode 100644 index 00000000000..a93184e237e --- /dev/null +++ b/test/CodeGen/AArch64/GlobalISel/call-translator-musttail.ll @@ -0,0 +1,9 @@ +; RUN: not llc %s -mtriple aarch64-unknown-unknown -debug-only=aarch64-call-lowering -global-isel -o - 2>&1 | FileCheck %s + +; CHECK: Cannot lower musttail calls yet. +; CHECK-NEXT: LLVM ERROR: unable to translate instruction: call (in function: foo) +declare void @must_callee(i8*) +define void @foo(i32*) { + musttail call void @must_callee(i8* null) + ret void +}