Skip to content

Commit 2361c00

Browse files
Move DevirtualizationManager to NodeFactory (#97855)
This is prep work - I want to be able to use this from dependency analysis, not just codegen (`Compilation` is not available to dependency analysis, `NodeFactory` is). I think there are optimization opportunities around this.
1 parent df0778d commit 2361c00

File tree

7 files changed

+24
-22
lines changed

7 files changed

+24
-22
lines changed

src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/Compilation.cs

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@ public abstract class Compilation : ICompilation
2525
protected readonly NodeFactory _nodeFactory;
2626
protected readonly Logger _logger;
2727
protected readonly DebugInformationProvider _debugInformationProvider;
28-
protected readonly DevirtualizationManager _devirtualizationManager;
2928
private readonly IInliningPolicy _inliningPolicy;
3029

3130
public NameMangler NameMangler => _nodeFactory.NameMangler;
@@ -44,15 +43,13 @@ protected Compilation(
4443
IEnumerable<ICompilationRootProvider> compilationRoots,
4544
ILProvider ilProvider,
4645
DebugInformationProvider debugInformationProvider,
47-
DevirtualizationManager devirtualizationManager,
4846
IInliningPolicy inliningPolicy,
4947
Logger logger)
5048
{
5149
_dependencyGraph = dependencyGraph;
5250
_nodeFactory = nodeFactory;
5351
_logger = logger;
5452
_debugInformationProvider = debugInformationProvider;
55-
_devirtualizationManager = devirtualizationManager;
5653
_inliningPolicy = inliningPolicy;
5754

5855
_dependencyGraph.ComputeDependencyRoutine += ComputeDependencyNodeDependencies;
@@ -108,7 +105,7 @@ public bool CanInline(MethodDesc caller, MethodDesc callee)
108105

109106
public bool CanConstructType(TypeDesc type)
110107
{
111-
return _devirtualizationManager.CanConstructType(type);
108+
return NodeFactory.DevirtualizationManager.CanConstructType(type);
112109
}
113110

114111
public DelegateCreationInfo GetDelegateCtor(TypeDesc delegateType, MethodDesc target, TypeDesc constrainedType, bool followVirtualDispatch)
@@ -215,22 +212,22 @@ public bool HasFixedSlotVTable(TypeDesc type)
215212

216213
public bool IsEffectivelySealed(TypeDesc type)
217214
{
218-
return _devirtualizationManager.IsEffectivelySealed(type);
215+
return NodeFactory.DevirtualizationManager.IsEffectivelySealed(type);
219216
}
220217

221218
public TypeDesc[] GetImplementingClasses(TypeDesc type)
222219
{
223-
return _devirtualizationManager.GetImplementingClasses(type);
220+
return NodeFactory.DevirtualizationManager.GetImplementingClasses(type);
224221
}
225222

226223
public bool IsEffectivelySealed(MethodDesc method)
227224
{
228-
return _devirtualizationManager.IsEffectivelySealed(method);
225+
return NodeFactory.DevirtualizationManager.IsEffectivelySealed(method);
229226
}
230227

231228
public MethodDesc ResolveVirtualMethod(MethodDesc declMethod, TypeDesc implType, out CORINFO_DEVIRTUALIZATION_DETAIL devirtualizationDetail)
232229
{
233-
return _devirtualizationManager.ResolveVirtualMethod(declMethod, implType, out devirtualizationDetail);
230+
return NodeFactory.DevirtualizationManager.ResolveVirtualMethod(declMethod, implType, out devirtualizationDetail);
234231
}
235232

236233
public bool NeedsRuntimeLookup(ReadyToRunHelperId lookupKind, object targetOfLookup)
@@ -264,7 +261,7 @@ public bool NeedsRuntimeLookup(ReadyToRunHelperId lookupKind, object targetOfLoo
264261

265262
public ReadyToRunHelperId GetLdTokenHelperForType(TypeDesc type)
266263
{
267-
bool canConstructPerWholeProgramAnalysis = _devirtualizationManager == null ? true : _devirtualizationManager.CanConstructType(type);
264+
bool canConstructPerWholeProgramAnalysis = NodeFactory.DevirtualizationManager.CanConstructType(type);
268265
bool creationAllowed = ConstructedEETypeNode.CreationAllowed(type);
269266
return (canConstructPerWholeProgramAnalysis && creationAllowed)
270267
? ReadyToRunHelperId.TypeHandle

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ namespace ILCompiler.DependencyAnalysis
1313
public sealed class ILScanNodeFactory : NodeFactory
1414
{
1515
public ILScanNodeFactory(CompilerTypeSystemContext context, CompilationModuleGroup compilationModuleGroup, MetadataManager metadataManager, InteropStubManager interopStubManager, NameMangler nameMangler, PreinitializationManager preinitManager)
16-
: base(context, compilationModuleGroup, metadataManager, interopStubManager, nameMangler, new LazyGenericsDisabledPolicy(), new LazyVTableSliceProvider(), new LazyDictionaryLayoutProvider(), new InlinedThreadStatics(), new ExternSymbolsImportedNodeProvider(), preinitManager)
16+
: base(context, compilationModuleGroup, metadataManager, interopStubManager, nameMangler, new LazyGenericsDisabledPolicy(), new LazyVTableSliceProvider(), new LazyDictionaryLayoutProvider(), new InlinedThreadStatics(), new ExternSymbolsImportedNodeProvider(), preinitManager, new DevirtualizationManager())
1717
{
1818
}
1919

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

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,8 @@ public NodeFactory(
3939
DictionaryLayoutProvider dictionaryLayoutProvider,
4040
InlinedThreadStatics inlinedThreadStatics,
4141
ImportedNodeProvider importedNodeProvider,
42-
PreinitializationManager preinitializationManager)
42+
PreinitializationManager preinitializationManager,
43+
DevirtualizationManager devirtualizationManager)
4344
{
4445
_target = context.Target;
4546
_context = context;
@@ -54,6 +55,7 @@ public NodeFactory(
5455
LazyGenericsPolicy = lazyGenericsPolicy;
5556
_importedNodeProvider = importedNodeProvider;
5657
PreinitializationManager = preinitializationManager;
58+
DevirtualizationManager = devirtualizationManager;
5759
}
5860

5961
public void SetMarkingComplete()
@@ -103,6 +105,11 @@ public PreinitializationManager PreinitializationManager
103105
get;
104106
}
105107

108+
public DevirtualizationManager DevirtualizationManager
109+
{
110+
get;
111+
}
112+
106113
public InteropStubManager InteropStubManager
107114
{
108115
get;

src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/ILScanner.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ internal ILScanner(
3636
DebugInformationProvider debugInformationProvider,
3737
Logger logger,
3838
int parallelism)
39-
: base(dependencyGraph, nodeFactory, roots, ilProvider, debugInformationProvider, null, nodeFactory.CompilationModuleGroup, logger)
39+
: base(dependencyGraph, nodeFactory, roots, ilProvider, debugInformationProvider, nodeFactory.CompilationModuleGroup, logger)
4040
{
4141
_helperCache = new HelperCache(this);
4242
_parallelism = parallelism;

src/coreclr/tools/aot/ILCompiler.RyuJit/Compiler/DependencyAnalysis/RyuJitNodeFactory.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,9 @@ namespace ILCompiler.DependencyAnalysis
1010
public sealed class RyuJitNodeFactory : NodeFactory
1111
{
1212
public RyuJitNodeFactory(CompilerTypeSystemContext context, CompilationModuleGroup compilationModuleGroup, MetadataManager metadataManager,
13-
InteropStubManager interopStubManager, NameMangler nameMangler, VTableSliceProvider vtableSliceProvider, DictionaryLayoutProvider dictionaryLayoutProvider, InlinedThreadStatics inlinedThreadStatics, PreinitializationManager preinitializationManager)
14-
: base(context, compilationModuleGroup, metadataManager, interopStubManager, nameMangler, new LazyGenericsDisabledPolicy(), vtableSliceProvider, dictionaryLayoutProvider, inlinedThreadStatics, new ExternSymbolsImportedNodeProvider(), preinitializationManager)
13+
InteropStubManager interopStubManager, NameMangler nameMangler, VTableSliceProvider vtableSliceProvider, DictionaryLayoutProvider dictionaryLayoutProvider, InlinedThreadStatics inlinedThreadStatics, PreinitializationManager preinitializationManager,
14+
DevirtualizationManager devirtualizationManager)
15+
: base(context, compilationModuleGroup, metadataManager, interopStubManager, nameMangler, new LazyGenericsDisabledPolicy(), vtableSliceProvider, dictionaryLayoutProvider, inlinedThreadStatics, new ExternSymbolsImportedNodeProvider(), preinitializationManager, devirtualizationManager)
1516
{
1617
}
1718

src/coreclr/tools/aot/ILCompiler.RyuJit/Compiler/RyuJitCompilation.cs

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -38,15 +38,14 @@ internal RyuJitCompilation(
3838
ILProvider ilProvider,
3939
DebugInformationProvider debugInformationProvider,
4040
Logger logger,
41-
DevirtualizationManager devirtualizationManager,
4241
IInliningPolicy inliningPolicy,
4342
InstructionSetSupport instructionSetSupport,
4443
ProfileDataManager profileDataManager,
4544
MethodImportationErrorProvider errorProvider,
4645
ReadOnlyFieldPolicy readOnlyFieldPolicy,
4746
RyuJitCompilationOptions options,
4847
int parallelism)
49-
: base(dependencyGraph, nodeFactory, roots, ilProvider, debugInformationProvider, devirtualizationManager, inliningPolicy, logger)
48+
: base(dependencyGraph, nodeFactory, roots, ilProvider, debugInformationProvider, inliningPolicy, logger)
5049
{
5150
_compilationOptions = options;
5251
InstructionSetSupport = instructionSetSupport;
@@ -73,8 +72,7 @@ public override IEETypeNode NecessaryTypeSymbolIfPossible(TypeDesc type)
7372
// information proving that it isn't, give RyuJIT the constructed symbol even
7473
// though we just need the unconstructed one.
7574
// https://github.com/dotnet/runtimelab/issues/1128
76-
bool canPotentiallyConstruct = _devirtualizationManager == null
77-
? true : _devirtualizationManager.CanConstructType(type);
75+
bool canPotentiallyConstruct = NodeFactory.DevirtualizationManager.CanConstructType(type);
7876
if (canPotentiallyConstruct)
7977
return _nodeFactory.MaximallyConstructableType(type);
8078

@@ -83,8 +81,7 @@ public override IEETypeNode NecessaryTypeSymbolIfPossible(TypeDesc type)
8381

8482
public FrozenRuntimeTypeNode NecessaryRuntimeTypeIfPossible(TypeDesc type)
8583
{
86-
bool canPotentiallyConstruct = _devirtualizationManager == null
87-
? true : _devirtualizationManager.CanConstructType(type);
84+
bool canPotentiallyConstruct = NodeFactory.DevirtualizationManager.CanConstructType(type);
8885
if (canPotentiallyConstruct)
8986
return _nodeFactory.SerializedMaximallyConstructableRuntimeTypeObject(type);
9087

src/coreclr/tools/aot/ILCompiler.RyuJit/Compiler/RyuJitCompilationBuilder.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -123,11 +123,11 @@ public override ICompilation ToCompilation()
123123
if (_resilient)
124124
options |= RyuJitCompilationOptions.UseResilience;
125125

126-
var factory = new RyuJitNodeFactory(_context, _compilationGroup, _metadataManager, _interopStubManager, _nameMangler, _vtableSliceProvider, _dictionaryLayoutProvider, _inlinedThreadStatics, GetPreinitializationManager());
126+
var factory = new RyuJitNodeFactory(_context, _compilationGroup, _metadataManager, _interopStubManager, _nameMangler, _vtableSliceProvider, _dictionaryLayoutProvider, _inlinedThreadStatics, GetPreinitializationManager(), _devirtualizationManager);
127127

128128
JitConfigProvider.Initialize(_context.Target, jitFlagBuilder.ToArray(), _ryujitOptions, _jitPath);
129129
DependencyAnalyzerBase<NodeFactory> graph = CreateDependencyGraph(factory, new ObjectNode.ObjectNodeComparer(CompilerComparer.Instance));
130-
return new RyuJitCompilation(graph, factory, _compilationRoots, _ilProvider, _debugInformationProvider, _logger, _devirtualizationManager, _inliningPolicy ?? _compilationGroup, _instructionSetSupport, _profileDataManager, _methodImportationErrorProvider, _readOnlyFieldPolicy, options, _parallelism);
130+
return new RyuJitCompilation(graph, factory, _compilationRoots, _ilProvider, _debugInformationProvider, _logger, _inliningPolicy ?? _compilationGroup, _instructionSetSupport, _profileDataManager, _methodImportationErrorProvider, _readOnlyFieldPolicy, options, _parallelism);
131131
}
132132
}
133133
}

0 commit comments

Comments
 (0)