Index: llvm/include/llvm/CodeGen/GlobalISel/CallLowering.h =================================================================== --- llvm/include/llvm/CodeGen/GlobalISel/CallLowering.h +++ llvm/include/llvm/CodeGen/GlobalISel/CallLowering.h @@ -80,6 +80,9 @@ 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 Index: llvm/lib/CodeGen/GlobalISel/CallLowering.cpp =================================================================== --- llvm/lib/CodeGen/GlobalISel/CallLowering.cpp +++ llvm/lib/CodeGen/GlobalISel/CallLowering.cpp @@ -62,6 +62,7 @@ CS.getInstruction()->getMetadata(LLVMContext::MD_callees); Info.CallConv = CS.getCallingConv(); Info.SwiftErrorVReg = SwiftErrorVReg; + Info.IsMustTailCall = CS.isMustTailCall(); return lowerCall(MIRBuilder, Info); } Index: llvm/lib/Target/AArch64/AArch64CallLowering.cpp =================================================================== --- llvm/lib/Target/AArch64/AArch64CallLowering.cpp +++ llvm/lib/Target/AArch64/AArch64CallLowering.cpp @@ -409,6 +409,11 @@ 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); Index: llvm/test/CodeGen/AArch64/GlobalISel/call-translator-musttail.ll =================================================================== --- /dev/null +++ llvm/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 +}