Skip to content

Commit 16a38c1

Browse files
authored
Micro-optimize type check in GVMDependenciesNode.SearchDynamicDependencies (#103199)
1 parent c897ce6 commit 16a38c1

File tree

2 files changed

+13
-4
lines changed

2 files changed

+13
-4
lines changed

src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/ConstructedEETypeNode.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88

99
namespace ILCompiler.DependencyAnalysis
1010
{
11-
public class ConstructedEETypeNode : EETypeNode
11+
public sealed class ConstructedEETypeNode : EETypeNode
1212
{
1313
public ConstructedEETypeNode(NodeFactory factory, TypeDesc type) : base(factory, type)
1414
{

src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/GVMDependenciesNode.cs

+12-3
Original file line numberDiff line numberDiff line change
@@ -73,9 +73,18 @@ public override IEnumerable<CombinedDependencyListEntry> SearchDynamicDependenci
7373
for (int i = firstNode; i < markedNodes.Count; i++)
7474
{
7575
DependencyNodeCore<NodeFactory> entry = markedNodes[i];
76-
EETypeNode entryAsEETypeNode = entry as EETypeNode;
77-
78-
if (entryAsEETypeNode == null)
76+
EETypeNode entryAsEETypeNode;
77+
78+
// This method is often called with a long list of ScannedMethodNode
79+
// or MethodCodeNode nodes. We are not interested in those. In order
80+
// to make the type check as cheap as possible we check for specific
81+
// *sealed* types instead of doing `entry is EETypeNode` which has
82+
// to walk the whole class hierarchy for the non matching nodes.
83+
if (entry is ConstructedEETypeNode constructedEETypeNode)
84+
entryAsEETypeNode = constructedEETypeNode;
85+
else if (entry is CanonicalEETypeNode canonicalEETypeNode)
86+
entryAsEETypeNode = canonicalEETypeNode;
87+
else
7988
continue;
8089

8190
TypeDesc potentialOverrideType = entryAsEETypeNode.Type;

0 commit comments

Comments
 (0)