impAssignTempGen(tmpNum, argNode, structHnd, (unsigned)CHECK_SPILL_NONE, &afterStmt, callILOffset,
block);
- // If we know the argument's value can't be
- // changed within the method body, try and improve
- // the type of the temp.
- if (argIsSingleDef && (argType == TYP_REF))
- {
- lvaUpdateClass(tmpNum, argNode);
- }
+ // We used to refine the temp type here based on
+ // the actual arg, but we now do this up front, when
+ // creating the temp, over in impInlineFetchArg.
+ CLANG_FORMAT_COMMENT_ANCHOR;
#ifdef DEBUG
if (verbose)
lvaTable[tmpNum].lvType = lclTyp;
- // Copy over class handle for ref types. Note this may be
- // further improved if it is a shared type and we know the exact context.
+ // For ref types, determine the type of the temp.
if (lclTyp == TYP_REF)
{
- lvaSetClass(tmpNum, lclInfo.lclVerTypeInfo.GetClassHandleForObjRef());
+ if (!argCanBeModified)
+ {
+ // If the arg can't be modified in the method
+ // body, use the type of the value, if
+ // known. Otherwise, use the declared type.
+ lvaSetClass(tmpNum, argInfo.argNode, lclInfo.lclVerTypeInfo.GetClassHandleForObjRef());
+ }
+ else
+ {
+ // Arg might be modified, use the delcared type of
+ // the argument.
+ lvaSetClass(tmpNum, lclInfo.lclVerTypeInfo.GetClassHandleForObjRef());
+ }
}
assert(lvaTable[tmpNum].lvAddrExposed == 0);