@@ -12988,7 +12988,7 @@ void Compiler::impCanInlineIL(CORINFO_METHOD_HANDLE fncHandle,
12988
12988
// Arguments:
12989
12989
// pInlineInfo - inline info for the inline candidate
12990
12990
// arg - the caller argument
12991
- // argNum - logical index of this argument
12991
+ // argInfo - Structure to record information into
12992
12992
// inlineResult - result of ongoing inline evaluation
12993
12993
//
12994
12994
// Notes:
@@ -13000,12 +13000,10 @@ void Compiler::impCanInlineIL(CORINFO_METHOD_HANDLE fncHandle,
13000
13000
13001
13001
void Compiler::impInlineRecordArgInfo(InlineInfo* pInlineInfo,
13002
13002
CallArg* arg,
13003
- unsigned argNum ,
13003
+ InlArgInfo* argInfo ,
13004
13004
InlineResult* inlineResult)
13005
13005
{
13006
- InlArgInfo* inlCurArgInfo = &pInlineInfo->inlArgInfo[argNum];
13007
-
13008
- inlCurArgInfo->arg = arg;
13006
+ argInfo->arg = arg;
13009
13007
GenTree* curArgVal = arg->GetNode();
13010
13008
13011
13009
assert(!curArgVal->OperIs(GT_RET_EXPR));
@@ -13018,7 +13016,7 @@ void Compiler::impInlineRecordArgInfo(InlineInfo* pInlineInfo,
13018
13016
13019
13017
if (varTypeIsStruct(varDsc))
13020
13018
{
13021
- inlCurArgInfo ->argIsByRefToStructLocal = true;
13019
+ argInfo ->argIsByRefToStructLocal = true;
13022
13020
#ifdef FEATURE_SIMD
13023
13021
if (varTypeIsSIMD(varDsc))
13024
13022
{
@@ -13033,22 +13031,21 @@ void Compiler::impInlineRecordArgInfo(InlineInfo* pInlineInfo,
13033
13031
13034
13032
if (curArgVal->gtFlags & GTF_ALL_EFFECT)
13035
13033
{
13036
- inlCurArgInfo ->argHasGlobRef = (curArgVal->gtFlags & GTF_GLOB_REF) != 0;
13037
- inlCurArgInfo ->argHasSideEff = (curArgVal->gtFlags & (GTF_ALL_EFFECT & ~GTF_GLOB_REF)) != 0;
13034
+ argInfo ->argHasGlobRef = (curArgVal->gtFlags & GTF_GLOB_REF) != 0;
13035
+ argInfo ->argHasSideEff = (curArgVal->gtFlags & (GTF_ALL_EFFECT & ~GTF_GLOB_REF)) != 0;
13038
13036
}
13039
13037
13040
13038
if (curArgVal->gtOper == GT_LCL_VAR)
13041
13039
{
13042
- inlCurArgInfo->argIsLclVar = true;
13043
-
13044
- /* Remember the "original" argument number */
13045
- INDEBUG(curArgVal->AsLclVar()->gtLclILoffs = argNum;)
13040
+ argInfo->argIsLclVar = true;
13046
13041
}
13047
13042
13043
+ argInfo->argIsThis = arg->GetWellKnownArg() == WellKnownArg::ThisPointer;
13044
+
13048
13045
if (impIsInvariant(curArgVal))
13049
13046
{
13050
- inlCurArgInfo ->argIsInvariant = true;
13051
- if (inlCurArgInfo ->argIsThis && (curArgVal->gtOper == GT_CNS_INT) && (curArgVal->AsIntCon()->gtIconVal == 0))
13047
+ argInfo ->argIsInvariant = true;
13048
+ if (argInfo ->argIsThis && (curArgVal->gtOper == GT_CNS_INT) && (curArgVal->AsIntCon()->gtIconVal == 0))
13052
13049
{
13053
13050
// Abort inlining at this call site
13054
13051
inlineResult->NoteFatal(InlineObservation::CALLSITE_ARG_HAS_NULL_THIS);
@@ -13057,13 +13054,13 @@ void Compiler::impInlineRecordArgInfo(InlineInfo* pInlineInfo,
13057
13054
}
13058
13055
else if (gtIsTypeof(curArgVal))
13059
13056
{
13060
- inlCurArgInfo ->argIsInvariant = true;
13061
- inlCurArgInfo ->argHasSideEff = false;
13057
+ argInfo ->argIsInvariant = true;
13058
+ argInfo ->argHasSideEff = false;
13062
13059
}
13063
13060
13064
- bool isExact = false;
13065
- bool isNonNull = false;
13066
- inlCurArgInfo ->argIsExact = (gtGetClassHandle(curArgVal, &isExact, &isNonNull) != NO_CLASS_HANDLE) && isExact;
13061
+ bool isExact = false;
13062
+ bool isNonNull = false;
13063
+ argInfo ->argIsExact = (gtGetClassHandle(curArgVal, &isExact, &isNonNull) != NO_CLASS_HANDLE) && isExact;
13067
13064
13068
13065
// If the arg is a local that is address-taken, we can't safely
13069
13066
// directly substitute it into the inlinee.
@@ -13074,51 +13071,51 @@ void Compiler::impInlineRecordArgInfo(InlineInfo* pInlineInfo,
13074
13071
// which is safe in this case.
13075
13072
//
13076
13073
// Instead mark the arg as having a caller local ref.
13077
- if (!inlCurArgInfo ->argIsInvariant && gtHasLocalsWithAddrOp(curArgVal))
13074
+ if (!argInfo ->argIsInvariant && gtHasLocalsWithAddrOp(curArgVal))
13078
13075
{
13079
- inlCurArgInfo ->argHasCallerLocalRef = true;
13076
+ argInfo ->argHasCallerLocalRef = true;
13080
13077
}
13081
13078
13082
13079
#ifdef DEBUG
13083
13080
if (verbose)
13084
13081
{
13085
- if (inlCurArgInfo->argIsThis )
13082
+ if (arg->GetWellKnownArg() != WellKnownArg::None )
13086
13083
{
13087
- printf("thisArg:" );
13084
+ printf("%s:", getWellKnownArgName(arg->GetWellKnownArg()) );
13088
13085
}
13089
13086
else
13090
13087
{
13091
- printf("\nArgument #%u:", argNum );
13088
+ printf("IL argument #%u:", pInlineInfo->iciCall->gtArgs.GetUserIndex(arg) );
13092
13089
}
13093
- if (inlCurArgInfo ->argIsLclVar)
13090
+ if (argInfo ->argIsLclVar)
13094
13091
{
13095
13092
printf(" is a local var");
13096
13093
}
13097
- if (inlCurArgInfo ->argIsInvariant)
13094
+ if (argInfo ->argIsInvariant)
13098
13095
{
13099
13096
printf(" is a constant or invariant");
13100
13097
}
13101
- if (inlCurArgInfo ->argHasGlobRef)
13098
+ if (argInfo ->argHasGlobRef)
13102
13099
{
13103
13100
printf(" has global refs");
13104
13101
}
13105
- if (inlCurArgInfo ->argHasCallerLocalRef)
13102
+ if (argInfo ->argHasCallerLocalRef)
13106
13103
{
13107
13104
printf(" has caller local ref");
13108
13105
}
13109
- if (inlCurArgInfo ->argHasSideEff)
13106
+ if (argInfo ->argHasSideEff)
13110
13107
{
13111
13108
printf(" has side effects");
13112
13109
}
13113
- if (inlCurArgInfo ->argHasLdargaOp)
13110
+ if (argInfo ->argHasLdargaOp)
13114
13111
{
13115
13112
printf(" has ldarga effect");
13116
13113
}
13117
- if (inlCurArgInfo ->argHasStargOp)
13114
+ if (argInfo ->argHasStargOp)
13118
13115
{
13119
13116
printf(" has starg effect");
13120
13117
}
13121
- if (inlCurArgInfo ->argIsByRefToStructLocal)
13118
+ if (argInfo ->argIsByRefToStructLocal)
13122
13119
{
13123
13120
printf(" is byref to a struct local");
13124
13121
}
@@ -13174,51 +13171,29 @@ void Compiler::impInlineInitVars(InlineInfo* pInlineInfo)
13174
13171
unsigned ilArgCnt = 0;
13175
13172
for (CallArg& arg : call->gtArgs.Args())
13176
13173
{
13174
+ InlArgInfo* argInfo;
13177
13175
switch (arg.GetWellKnownArg())
13178
13176
{
13179
- case WellKnownArg::ThisPointer:
13180
- inlArgInfo[ilArgCnt].argIsThis = true;
13181
- break;
13182
13177
case WellKnownArg::RetBuffer:
13183
13178
// This does not appear in the table of inline arg info; do not include them
13184
13179
continue;
13185
13180
case WellKnownArg::InstParam:
13186
- {
13187
- InlArgInfo* ctxInfo = new (this, CMK_Inlining) InlArgInfo{};
13188
- ctxInfo->arg = &arg;
13189
- ctxInfo->argTmpNum = BAD_VAR_NUM;
13190
- ctxInfo->argIsLclVar = arg.GetNode()->OperIs(GT_LCL_VAR);
13191
- if (arg.GetNode()->IsCnsIntOrI())
13192
- {
13193
- ctxInfo->argIsInvariant = true;
13194
- }
13195
- else
13196
- {
13197
- // Conservative approach
13198
- ctxInfo->argHasSideEff = true;
13199
- ctxInfo->argHasGlobRef = true;
13200
- }
13201
- pInlineInfo->inlInstParamArgInfo = ctxInfo;
13202
- continue;
13203
- }
13181
+ pInlineInfo->inlInstParamArgInfo = argInfo = new (this, CMK_Inlining) InlArgInfo{};
13182
+ break;
13204
13183
default:
13184
+ argInfo = &inlArgInfo[ilArgCnt++];
13205
13185
break;
13206
13186
}
13207
13187
13208
13188
arg.SetEarlyNode(gtFoldExpr(arg.GetEarlyNode()));
13209
- impInlineRecordArgInfo(pInlineInfo, &arg, ilArgCnt , inlineResult);
13189
+ impInlineRecordArgInfo(pInlineInfo, &arg, argInfo , inlineResult);
13210
13190
13211
13191
if (inlineResult->IsFailure())
13212
13192
{
13213
13193
return;
13214
13194
}
13215
-
13216
- ilArgCnt++;
13217
13195
}
13218
13196
13219
- /* Make sure we got the arg number right */
13220
- assert(ilArgCnt == methInfo->args.totalILArgs());
13221
-
13222
13197
#ifdef FEATURE_SIMD
13223
13198
bool foundSIMDType = pInlineInfo->hasSIMDTypeArgLocalOrReturn;
13224
13199
#endif // FEATURE_SIMD
@@ -13598,7 +13573,7 @@ unsigned Compiler::impInlineFetchLocal(unsigned lclNum DEBUGARG(const char* reas
13598
13573
//
13599
13574
// This method will side effect inlArgInfo. It should only be called
13600
13575
// for actual uses of the argument in the inlinee.
13601
-
13576
+ //
13602
13577
GenTree* Compiler::impInlineFetchArg(InlArgInfo& argInfo, const InlLclVarInfo& lclInfo)
13603
13578
{
13604
13579
// Cache the relevant arg and lcl info for this argument.
0 commit comments