From 54c4e2e11ab135e10ce635c8d7c82e38e036ad99 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Strehovsk=C3=BD?= Date: Wed, 29 Jul 2026 21:55:47 +0900 Subject: [PATCH] Avoid cctor check if we provably executed it --- src/coreclr/tools/Common/JitInterface/CorInfoImpl.cs | 11 +++++++++-- .../JitInterface/CorInfoImpl.RyuJit.cs | 8 +++++--- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/src/coreclr/tools/Common/JitInterface/CorInfoImpl.cs b/src/coreclr/tools/Common/JitInterface/CorInfoImpl.cs index 5a0c37b14e523b..77adddbfb5833d 100644 --- a/src/coreclr/tools/Common/JitInterface/CorInfoImpl.cs +++ b/src/coreclr/tools/Common/JitInterface/CorInfoImpl.cs @@ -2883,10 +2883,17 @@ private CorInfoHelpFunc getUnBoxHelper(CORINFO_CLASS_STRUCT_* cls) private CorInfoInitClassResult initClass(CORINFO_FIELD_STRUCT_* field, CORINFO_METHOD_STRUCT_* method, CORINFO_CONTEXT_STRUCT* context) { - FieldDesc fd = field == null ? null : HandleToObject(field); + return initClass( + field == null ? null : HandleToObject(field), + method == null ? null : HandleToObject(method), + context); + } + + private CorInfoInitClassResult initClass(FieldDesc fd, MethodDesc method, CORINFO_CONTEXT_STRUCT* context) + { Debug.Assert(fd == null || fd.IsStatic); - MethodDesc md = method == null ? MethodBeingCompiled : HandleToObject(method); + MethodDesc md = method ?? MethodBeingCompiled; TypeDesc type = fd != null ? fd.OwningType : typeFromContext(context); #if !READYTORUN diff --git a/src/coreclr/tools/aot/ILCompiler.RyuJit/JitInterface/CorInfoImpl.RyuJit.cs b/src/coreclr/tools/aot/ILCompiler.RyuJit/JitInterface/CorInfoImpl.RyuJit.cs index 14f0f9b6c1e33a..ebc2d1976f730f 100644 --- a/src/coreclr/tools/aot/ILCompiler.RyuJit/JitInterface/CorInfoImpl.RyuJit.cs +++ b/src/coreclr/tools/aot/ILCompiler.RyuJit/JitInterface/CorInfoImpl.RyuJit.cs @@ -2126,6 +2126,8 @@ private void getFieldInfo(ref CORINFO_RESOLVED_TOKEN pResolvedToken, CORINFO_MET if (field.IsStatic) { + CorInfoInitClassResult initResult = initClass(field, null, pResolvedToken.tokenContext); + fieldFlags |= CORINFO_FIELD_FLAGS.CORINFO_FLG_FIELD_STATIC; if (field.HasRva) @@ -2140,7 +2142,7 @@ private void getFieldInfo(ref CORINFO_RESOLVED_TOKEN pResolvedToken, CORINFO_MET pResult->fieldLookup.accessType = node.RepresentsIndirectionCell ? InfoAccessType.IAT_PVALUE : InfoAccessType.IAT_VALUE; // We are not going through a helper. The constructor has to be triggered explicitly. - if (_compilation.HasLazyStaticConstructor(field.OwningType)) + if (initResult != CorInfoInitClassResult.CORINFO_INITCLASS_NOT_REQUIRED) { fieldFlags |= CORINFO_FIELD_FLAGS.CORINFO_FLG_FIELD_INITCLASS; } @@ -2213,7 +2215,7 @@ private void getFieldInfo(ref CORINFO_RESOLVED_TOKEN pResolvedToken, CORINFO_MET if (ti.IsInlined) { fieldAccessor = CORINFO_FIELD_ACCESSOR.CORINFO_FIELD_STATIC_TLS_MANAGED; - if (_compilation.HasLazyStaticConstructor(field.OwningType)) + if (initResult != CorInfoInitClassResult.CORINFO_INITCLASS_NOT_REQUIRED) { fieldFlags |= CORINFO_FIELD_FLAGS.CORINFO_FLG_FIELD_INITCLASS; } @@ -2224,7 +2226,7 @@ private void getFieldInfo(ref CORINFO_RESOLVED_TOKEN pResolvedToken, CORINFO_MET pResult->helper = CorInfoHelpFunc.CORINFO_HELP_READYTORUN_THREADSTATIC_BASE; helperId = ReadyToRunHelperId.GetThreadStaticBase; } - else if (!_compilation.HasLazyStaticConstructor(field.OwningType)) + else if (initResult == CorInfoInitClassResult.CORINFO_INITCLASS_NOT_REQUIRED) { fieldAccessor = CORINFO_FIELD_ACCESSOR.CORINFO_FIELD_STATIC_RELOCATABLE; ISymbolNode baseAddr;