[Lanai] Use ArgFlags to distinguish fixed parameters (#154278)

Whether the argument is fixed is now available via ArgFlags, so make use
of it. The previous implementation was quite problematic, because it
stored the number of fixed arguments in a global variable, which is not
thread safe.
This commit is contained in:
Nikita Popov 2025-08-20 11:38:02 +02:00 committed by GitHub
parent 9df7ca1f0f
commit 5dbf73f54d
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -353,7 +353,6 @@ void LanaiTargetLowering::LowerAsmOperandForConstraint(
#include "LanaiGenCallingConv.inc" #include "LanaiGenCallingConv.inc"
static unsigned NumFixedArgs;
static bool CC_Lanai32_VarArg(unsigned ValNo, MVT ValVT, MVT LocVT, static bool CC_Lanai32_VarArg(unsigned ValNo, MVT ValVT, MVT LocVT,
CCValAssign::LocInfo LocInfo, CCValAssign::LocInfo LocInfo,
ISD::ArgFlagsTy ArgFlags, Type *OrigTy, ISD::ArgFlagsTy ArgFlags, Type *OrigTy,
@ -361,9 +360,8 @@ static bool CC_Lanai32_VarArg(unsigned ValNo, MVT ValVT, MVT LocVT,
// Handle fixed arguments with default CC. // Handle fixed arguments with default CC.
// Note: Both the default and fast CC handle VarArg the same and hence the // Note: Both the default and fast CC handle VarArg the same and hence the
// calling convention of the function is not considered here. // calling convention of the function is not considered here.
if (ValNo < NumFixedArgs) { if (!ArgFlags.isVarArg())
return CC_Lanai32(ValNo, ValVT, LocVT, LocInfo, ArgFlags, OrigTy, State); return CC_Lanai32(ValNo, ValVT, LocVT, LocInfo, ArgFlags, OrigTy, State);
}
// Promote i8/i16 args to i32 // Promote i8/i16 args to i32
if (LocVT == MVT::i8 || LocVT == MVT::i16) { if (LocVT == MVT::i8 || LocVT == MVT::i16) {
@ -604,15 +602,9 @@ SDValue LanaiTargetLowering::LowerCCCCallTo(
GlobalAddressSDNode *G = dyn_cast<GlobalAddressSDNode>(Callee); GlobalAddressSDNode *G = dyn_cast<GlobalAddressSDNode>(Callee);
MachineFrameInfo &MFI = DAG.getMachineFunction().getFrameInfo(); MachineFrameInfo &MFI = DAG.getMachineFunction().getFrameInfo();
NumFixedArgs = 0; if (IsVarArg) {
if (IsVarArg && G) {
const Function *CalleeFn = dyn_cast<Function>(G->getGlobal());
if (CalleeFn)
NumFixedArgs = CalleeFn->getFunctionType()->getNumParams();
}
if (NumFixedArgs)
CCInfo.AnalyzeCallOperands(Outs, CC_Lanai32_VarArg); CCInfo.AnalyzeCallOperands(Outs, CC_Lanai32_VarArg);
else { } else {
if (CallConv == CallingConv::Fast) if (CallConv == CallingConv::Fast)
CCInfo.AnalyzeCallOperands(Outs, CC_Lanai32_Fast); CCInfo.AnalyzeCallOperands(Outs, CC_Lanai32_Fast);
else else