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

JIT: refine types when creating arg temps to improve devirtualization #13530

Merged
merged 3 commits into from
Aug 23, 2017
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 4 additions & 7 deletions src/jit/flowgraph.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -22625,13 +22625,10 @@ GenTreePtr Compiler::fgInlinePrependStatements(InlineInfo* inlineInfo)
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)
Expand Down
17 changes: 14 additions & 3 deletions src/jit/importer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -18165,11 +18165,22 @@ GenTreePtr Compiler::impInlineFetchArg(unsigned lclNum, InlArgInfo* inlArgInfo,

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);
Expand Down