Index: llvm/include/llvm/CodeGen/GlobalISel/CallLowering.h =================================================================== --- llvm/include/llvm/CodeGen/GlobalISel/CallLowering.h +++ llvm/include/llvm/CodeGen/GlobalISel/CallLowering.h @@ -267,6 +267,7 @@ /// \return True if everything has succeeded, false otherwise. bool handleAssignments(MachineIRBuilder &MIRBuilder, SmallVectorImpl &Args, ValueHandler &Handler, + CallingConv::ID CallConv, bool IsVarArg, Register ThisReturnReg = Register()) const; bool handleAssignments(CCState &CCState, SmallVectorImpl &ArgLocs, Index: llvm/lib/CodeGen/GlobalISel/CallLowering.cpp =================================================================== --- llvm/lib/CodeGen/GlobalISel/CallLowering.cpp +++ llvm/lib/CodeGen/GlobalISel/CallLowering.cpp @@ -231,11 +231,13 @@ bool CallLowering::handleAssignments(MachineIRBuilder &MIRBuilder, SmallVectorImpl &Args, ValueHandler &Handler, + CallingConv::ID CallConv, bool IsVarArg, Register ThisReturnReg) const { MachineFunction &MF = MIRBuilder.getMF(); const Function &F = MF.getFunction(); SmallVector ArgLocs; - CCState CCInfo(F.getCallingConv(), F.isVarArg(), MF, ArgLocs, F.getContext()); + + CCState CCInfo(CallConv, IsVarArg, MF, ArgLocs, F.getContext()); return handleAssignments(CCInfo, ArgLocs, MIRBuilder, Args, Handler, ThisReturnReg); } Index: llvm/lib/Target/AArch64/GISel/AArch64CallLowering.cpp =================================================================== --- llvm/lib/Target/AArch64/GISel/AArch64CallLowering.cpp +++ llvm/lib/Target/AArch64/GISel/AArch64CallLowering.cpp @@ -409,7 +409,8 @@ } OutgoingArgHandler Handler(MIRBuilder, MRI, MIB, AssignFn, AssignFn); - Success = handleAssignments(MIRBuilder, SplitArgs, Handler); + Success = + handleAssignments(MIRBuilder, SplitArgs, Handler, CC, F.isVarArg()); } if (SwiftErrorVReg) { @@ -501,7 +502,8 @@ TLI.CCAssignFnForCall(F.getCallingConv(), /*IsVarArg=*/false); FormalArgHandler Handler(MIRBuilder, MRI, AssignFn); - if (!handleAssignments(MIRBuilder, SplitArgs, Handler)) + if (!handleAssignments(MIRBuilder, SplitArgs, Handler, F.getCallingConv(), + F.isVarArg())) return false; AArch64FunctionInfo *FuncInfo = MF.getInfo(); @@ -903,7 +905,7 @@ // Do the actual argument marshalling. OutgoingArgHandler Handler(MIRBuilder, MRI, MIB, AssignFnFixed, AssignFnVarArg, true, FPDiff); - if (!handleAssignments(MIRBuilder, OutArgs, Handler)) + if (!handleAssignments(MIRBuilder, OutArgs, Handler, CalleeCC, Info.IsVarArg)) return false; Mask = getMaskForArgs(OutArgs, Info, *TRI, MF); @@ -1015,7 +1017,8 @@ // Do the actual argument marshalling. OutgoingArgHandler Handler(MIRBuilder, MRI, MIB, AssignFnFixed, AssignFnVarArg, false); - if (!handleAssignments(MIRBuilder, OutArgs, Handler)) + if (!handleAssignments(MIRBuilder, OutArgs, Handler, Info.CallConv, + Info.IsVarArg)) return false; Mask = getMaskForArgs(OutArgs, Info, *TRI, MF); @@ -1050,6 +1053,7 @@ RetAssignFn); if (!handleAssignments(MIRBuilder, InArgs, UsingReturnedArg ? ReturnedArgHandler : Handler, + Info.CallConv, Info.IsVarArg, UsingReturnedArg ? OutArgs[0].Regs[0] : Register())) return false; } @@ -1075,4 +1079,4 @@ bool AArch64CallLowering::isTypeIsValidForThisReturn(EVT Ty) const { return Ty.getSizeInBits() == 64; -} \ No newline at end of file +} Index: llvm/lib/Target/AMDGPU/AMDGPUCallLowering.cpp =================================================================== --- llvm/lib/Target/AMDGPU/AMDGPUCallLowering.cpp +++ llvm/lib/Target/AMDGPU/AMDGPUCallLowering.cpp @@ -513,7 +513,7 @@ CCAssignFn *AssignFn = TLI.CCAssignFnForReturn(CC, F.isVarArg()); AMDGPUOutgoingValueHandler RetHandler(B, *MRI, Ret, AssignFn); - return handleAssignments(B, SplitRetInfos, RetHandler); + return handleAssignments(B, SplitRetInfos, RetHandler, CC, F.isVarArg()); } bool AMDGPUCallLowering::lowerReturn(MachineIRBuilder &B, const Value *Val, @@ -1381,7 +1381,8 @@ CCAssignFn *RetAssignFn = TLI.CCAssignFnForReturn(Info.CallConv, Info.IsVarArg); CallReturnHandler Handler(MIRBuilder, MRI, MIB, RetAssignFn); - if (!handleAssignments(MIRBuilder, InArgs, Handler)) + if (!handleAssignments(MIRBuilder, InArgs, Handler, Info.CallConv, + Info.IsVarArg)) return false; } Index: llvm/lib/Target/ARM/ARMCallLowering.cpp =================================================================== --- llvm/lib/Target/ARM/ARMCallLowering.cpp +++ llvm/lib/Target/ARM/ARMCallLowering.cpp @@ -259,7 +259,8 @@ ARMOutgoingValueHandler RetHandler(MIRBuilder, MF.getRegInfo(), Ret, AssignFn); - return handleAssignments(MIRBuilder, SplitRetInfos, RetHandler); + return handleAssignments(MIRBuilder, SplitRetInfos, RetHandler, + F.getCallingConv(), F.isVarArg()); } bool ARMCallLowering::lowerReturn(MachineIRBuilder &MIRBuilder, @@ -458,7 +459,8 @@ if (!MBB.empty()) MIRBuilder.setInstr(*MBB.begin()); - if (!handleAssignments(MIRBuilder, SplitArgInfos, ArgHandler)) + if (!handleAssignments(MIRBuilder, SplitArgInfos, ArgHandler, + F.getCallingConv(), F.isVarArg())) return false; // Move back to the end of the basic block. @@ -551,7 +553,8 @@ auto ArgAssignFn = TLI.CCAssignFnForCall(Info.CallConv, Info.IsVarArg); ARMOutgoingValueHandler ArgHandler(MIRBuilder, MRI, MIB, ArgAssignFn); - if (!handleAssignments(MIRBuilder, ArgInfos, ArgHandler)) + if (!handleAssignments(MIRBuilder, ArgInfos, ArgHandler, Info.CallConv, + Info.IsVarArg)) return false; // Now we can add the actual call instruction to the correct basic block. @@ -565,7 +568,8 @@ splitToValueTypes(Info.OrigRet, ArgInfos, MF); auto RetAssignFn = TLI.CCAssignFnForReturn(Info.CallConv, Info.IsVarArg); CallReturnHandler RetHandler(MIRBuilder, MRI, MIB, RetAssignFn); - if (!handleAssignments(MIRBuilder, ArgInfos, RetHandler)) + if (!handleAssignments(MIRBuilder, ArgInfos, RetHandler, Info.CallConv, + Info.IsVarArg)) return false; } Index: llvm/lib/Target/X86/X86CallLowering.cpp =================================================================== --- llvm/lib/Target/X86/X86CallLowering.cpp +++ llvm/lib/Target/X86/X86CallLowering.cpp @@ -216,7 +216,8 @@ } X86OutgoingValueHandler Handler(MIRBuilder, MRI, MIB, RetCC_X86); - if (!handleAssignments(MIRBuilder, SplitArgs, Handler)) + if (!handleAssignments(MIRBuilder, SplitArgs, Handler, F.getCallingConv(), + F.isVarArg())) return false; } @@ -364,7 +365,8 @@ MIRBuilder.setInstr(*MBB.begin()); FormalArgHandler Handler(MIRBuilder, MRI, CC_X86); - if (!handleAssignments(MIRBuilder, SplitArgs, Handler)) + if (!handleAssignments(MIRBuilder, SplitArgs, Handler, F.getCallingConv(), + F.isVarArg())) return false; // Move back to the end of the basic block. @@ -420,7 +422,8 @@ } // Do the actual argument marshalling. X86OutgoingValueHandler Handler(MIRBuilder, MRI, MIB, CC_X86); - if (!handleAssignments(MIRBuilder, SplitArgs, Handler)) + if (!handleAssignments(MIRBuilder, SplitArgs, Handler, Info.CallConv, + Info.IsVarArg)) return false; bool IsFixed = Info.OrigArgs.empty() ? true : Info.OrigArgs.back().IsFixed; @@ -469,7 +472,8 @@ return false; CallReturnHandler Handler(MIRBuilder, MRI, RetCC_X86, MIB); - if (!handleAssignments(MIRBuilder, SplitArgs, Handler)) + if (!handleAssignments(MIRBuilder, SplitArgs, Handler, Info.CallConv, + Info.IsVarArg)) return false; if (!NewRegs.empty())