Skip to content
This repository was archived by the owner on Jan 23, 2023. It is now read-only.

Commit 02c0ef2

Browse files
author
Jarret Shook
authored
Merge pull request #13897 from hseok-oh/ryujit/ftc_arg_count
Argument register & stack size calculation for fast tail call
2 parents dbdaf34 + 20b54ac commit 02c0ef2

File tree

4 files changed

+30
-61
lines changed

4 files changed

+30
-61
lines changed

src/jit/compiler.h

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8344,10 +8344,8 @@ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
83448344
unsigned compArgsCount; // Number of arguments (incl. implicit and hidden)
83458345

83468346
#if FEATURE_FASTTAILCALL
8347-
unsigned compArgRegCount; // Number of incoming integer argument registers used for incoming arguments
8348-
unsigned compFloatArgRegCount; // Number of incoming floating argument registers used for incoming arguments
8349-
size_t compArgStackSize; // Incoming argument stack size in bytes
8350-
#endif // FEATURE_FASTTAILCALL
8347+
size_t compArgStackSize; // Incoming argument stack size in bytes
8348+
#endif // FEATURE_FASTTAILCALL
83518349

83528350
unsigned compRetBuffArg; // position of hidden return param var (0, 1) (BAD_VAR_NUM means not present);
83538351
int compTypeCtxtArg; // position of hidden param for type context for generic code (CORINFO_CALLCONV_PARAMTYPE)

src/jit/lclvars.cpp

Lines changed: 17 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -235,60 +235,6 @@ void Compiler::lvaInitTypeRef()
235235

236236
lvaInitArgs(&varDscInfo);
237237

238-
#if FEATURE_FASTTAILCALL
239-
240-
//-------------------------------------------------------------------------
241-
// Calculate the argument register usage.
242-
//
243-
// This will later be used for fastTailCall determination
244-
//-------------------------------------------------------------------------
245-
246-
unsigned argRegCount = 0;
247-
unsigned floatingRegCount = 0;
248-
size_t stackSize = 0;
249-
250-
auto incrementRegCount = [&floatingRegCount, &argRegCount](LclVarDsc* varDsc) {
251-
if (varDsc->lvIsHfa())
252-
{
253-
floatingRegCount += varDsc->lvHfaSlots();
254-
}
255-
else
256-
{
257-
varDsc->IsFloatRegType() ? ++floatingRegCount : ++argRegCount;
258-
}
259-
};
260-
261-
unsigned argNum;
262-
LclVarDsc* curDsc;
263-
264-
for (curDsc = lvaTable, argNum = 0; argNum < varDscInfo.varNum; argNum++, curDsc++)
265-
{
266-
if (curDsc->lvIsRegArg)
267-
{
268-
incrementRegCount(curDsc);
269-
#if FEATURE_MULTIREG_ARGS
270-
if (curDsc->lvOtherArgReg != REG_NA)
271-
{
272-
incrementRegCount(curDsc);
273-
}
274-
#endif // FEATURE_MULTIREG_ARGS
275-
}
276-
else
277-
{
278-
stackSize += curDsc->lvArgStackSize();
279-
}
280-
}
281-
282-
//-------------------------------------------------------------------------
283-
// Save the register usage information and stack size.
284-
//-------------------------------------------------------------------------
285-
286-
info.compArgRegCount = argRegCount;
287-
info.compFloatArgRegCount = floatingRegCount;
288-
info.compArgStackSize = stackSize;
289-
290-
#endif // FEATURE_FASTTAILCALL
291-
292238
//-------------------------------------------------------------------------
293239
// Finally the local variables
294240
//-------------------------------------------------------------------------
@@ -410,6 +356,13 @@ void Compiler::lvaInitArgs(InitVarDscInfo* varDscInfo)
410356
codeGen->floatRegState.rsCalleeRegArgCount = varDscInfo->floatRegArgNum;
411357
#endif // FEATURE_STACK_FP_X87
412358

359+
#if FEATURE_FASTTAILCALL
360+
// Save the stack usage information
361+
// We can get register usage information using codeGen->intRegState and
362+
// codeGen->floatRegState
363+
info.compArgStackSize = varDscInfo->stackArgSize;
364+
#endif // FEATURE_FASTTAILCALL
365+
413366
// The total argument size must be aligned.
414367
noway_assert((compArgSize % sizeof(void*)) == 0);
415368

@@ -978,7 +931,6 @@ void Compiler::lvaInitUserArgs(InitVarDscInfo* varDscInfo)
978931
else
979932
{
980933
#if defined(_TARGET_ARM_)
981-
982934
varDscInfo->setAllRegArgUsed(argType);
983935
if (varTypeIsFloating(argType))
984936
{
@@ -994,6 +946,10 @@ void Compiler::lvaInitUserArgs(InitVarDscInfo* varDscInfo)
994946
varDscInfo->setAllRegArgUsed(argType);
995947

996948
#endif // _TARGET_XXX_
949+
950+
#if FEATURE_FASTTAILCALL
951+
varDscInfo->stackArgSize += (unsigned)roundUp(argSize, TARGET_POINTER_SIZE);
952+
#endif // FEATURE_FASTTAILCALL
997953
}
998954

999955
#ifdef FEATURE_UNIX_AMD64_STRUCT_PASSING
@@ -1090,6 +1046,9 @@ void Compiler::lvaInitGenericsCtxt(InitVarDscInfo* varDscInfo)
10901046
// For the RyuJIT backend, we need to mark these as being on the stack,
10911047
// as this is not done elsewhere in the case that canEnreg returns false.
10921048
varDsc->lvOnFrame = true;
1049+
#if FEATURE_FASTTAILCALL
1050+
varDscInfo->stackArgSize += TARGET_POINTER_SIZE;
1051+
#endif // FEATURE_FASTTAILCALL
10931052
}
10941053
#endif // !LEGACY_BACKEND
10951054

@@ -1163,6 +1122,9 @@ void Compiler::lvaInitVarArgsHandle(InitVarDscInfo* varDscInfo)
11631122
// For the RyuJIT backend, we need to mark these as being on the stack,
11641123
// as this is not done elsewhere in the case that canEnreg returns false.
11651124
varDsc->lvOnFrame = true;
1125+
#if FEATURE_FASTTAILCALL
1126+
varDscInfo->stackArgSize += TARGET_POINTER_SIZE;
1127+
#endif // FEATURE_FASTTAILCALL
11661128
}
11671129
#endif // !LEGACY_BACKEND
11681130

src/jit/morph.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7253,8 +7253,8 @@ bool Compiler::fgCanFastTailCall(GenTreeCall* callee)
72537253
// Note that callee being a vararg method is not a problem since we can account the params being passed.
72547254
unsigned nCallerArgs = info.compArgsCount;
72557255

7256-
size_t callerArgRegCount = info.compArgRegCount;
7257-
size_t callerFloatArgRegCount = info.compFloatArgRegCount;
7256+
size_t callerArgRegCount = codeGen->intRegState.rsCalleeRegArgCount;
7257+
size_t callerFloatArgRegCount = codeGen->floatRegState.rsCalleeRegArgCount;
72587258

72597259
// Count the callee args including implicit and hidden.
72607260
// Note that GenericContext and VarargCookie are added by importer while

src/jit/register_arg_convention.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,11 @@ struct InitVarDscInfo
2626
bool anyFloatStackArgs;
2727
#endif // _TARGET_ARM_
2828

29+
#if FEATURE_FASTTAILCALL
30+
// It is used to calculate argument stack size information in byte
31+
unsigned stackArgSize;
32+
#endif // FEATURE_FASTTAILCALL
33+
2934
public:
3035
// set to initial values
3136
void Init(LclVarDsc* lvaTable, bool _hasRetBufArg)
@@ -42,6 +47,10 @@ struct InitVarDscInfo
4247
fltArgSkippedRegMask = RBM_NONE;
4348
anyFloatStackArgs = false;
4449
#endif // _TARGET_ARM_
50+
51+
#if FEATURE_FASTTAILCALL
52+
stackArgSize = 0;
53+
#endif // FEATURE_FASTTAILCALL
4554
}
4655

4756
// return ref to current register arg for this type

0 commit comments

Comments
 (0)