注意点
このページは、dotnet/runtimeリポジトリにマージされたPull Requestを自動的に収集し、その内容をAIが要約した内容を表示しています。そのため、必ずしも正確な要約ではない場合があります。
目次
- #122953 Remove NET9_0_OR_GREATER and NET10_0_OR_GREATER preprocessor constants
- #122948 Various async fixes
- #122946 JIT: fix CEA to handle a few more cases
- #122943 Revert "[release/8.0] Update dependencies from dotnet/arcade"
- #122940 Remove explicit WinRT initialization/uninitialization
- #122936 [clr-interp] Fix EmptyThisCall test
- #122935 [mono] [debugger] Fix string[][]
- #122930 Add diagnostics, escapes, and typedefs to C# ilasm
- #122926 [HTTP] Stress fix for ASAN preload
- #122907 Remove PlatformDetection.IsWindows7 and IsNotWindows7 properties
- #122906 Remove inconsistent UnmanagedCallersOnly delegate construction check
- #122676 Reduce overhead from using AutomaticDecompression
- #122504 Fix interpreter ResumeAfterCatch on arm64 Unix
- #122368 Handle some additional floating-point and SIMD morph optimizations
- #122297 JIT: Expand recognition of struct field offset pattern
- #122167 Inline nullable allocators
#122953 Remove NET9_0_OR_GREATER and NET10_0_OR_GREATER preprocessor constants
- 作成者: @Copilot
- 作成日時: 2026年01月07日 01:24:41(UTC)
- マージ日時: 2026年01月07日 21:05:02(UTC)
- ラベル: area-Meta
概要
.NET 10以降のみをターゲットするように変更されたため、リポジトリ全体から廃止予定のNET9_0_OR_GREATERおよびNET10_0_OR_GREATERプリプロセッサ定数を削除するクリーンアップです。ファイルの用途に応じて、条件付きコンパイルディレクティブを#if NETに置き換えるか、完全に削除しました。
変更内容
主要な変更戦略:
System.Private.CoreLibおよび複数フレームワークをサポートするファイル
#if NET9_0_OR_GREATER/#if NET10_0_OR_GREATER→#if NETに置換- Microsoft.Bcl.AsyncInterfacesなどnetstandard/netframeeworkもターゲットするパッケージとの互換性を維持
.NET Core専用ファイル(netcoreディレクトリまたは
.netcore.cs)- 条件付きコンパイルディレクティブを完全削除
- System.Numerics.Tensorsの多数のファイルで大規模なクリーンアップを実施
その他のファイル
NET9_0_OR_GREATER/NET10_0_OR_GREATER→NETに置換- .NET Core vs netstandard/netframeeworkの区別を維持
変更対象ライブラリ:
- System.Private.CoreLib、System.Collections.Immutable、System.Diagnostics.DiagnosticSource
- System.DirectoryServices.Protocols、System.Formats.Asn1、System.Formats.Nrbf
- System.Numerics.Tensors、System.Security.Cryptography.Pkcs/Xml
- System.Text.Json、System.Threading.Channels
- Microsoft.Extensions系ライブラリ(Caching、DependencyInjection、Options等)
パフォーマンスへの影響
影響なし
クリーンアップのため、機能的な変更はありません。条件付きコンパイルの削減により、コンパイル時間がわずかに改善される可能性がります。
関連Issue
なし
その他
注意点:
System.Private.CoreLibの
IAsyncEnumerable.cs、IAsyncEnumerator.csなどは、Microsoft.Bcl.AsyncInterfacesがnetstandard2.0とnet462もターゲットするため、#if NETガードが必須です。初版で完全削除されたため、ビルドエラーが発生しましたが、その後修正されていますSystem.Numerics.Tensorsでは100以上のファイル行が削除され、.NET Core専用の実装が無条件で有効化されました
古いバージョン定数(
NET8_0_OR_GREATER、NET7_0_OR_GREATER等)については検索対象外となっていることが確認されています
#122948 Various async fixes
- 作成者: @davidwrighton
- 作成日時: 2026年01月06日 23:40:22(UTC)
- マージ日時: 2026年01月07日 23:21:42(UTC)
- ラベル: area-CodeGen-Interpreter-coreclr
概要
async/awaitの非同期フロー制御に関する複数の問題を修正するPull Requestです。suppressed flowの問題を解決し、DOTNET_JitOptimizeAwait環境変数のサポートをインタープリタに追加することで、JITの動作との一貫性を取ります。いくつかのテストは無効化されています。
変更内容
- AsyncHelpers.CoreCLR.cs: async関連のヘルパーロジックを2行追加
- interpreter/compiler.cpp: インタープリタコンパイラの修正(5行追加、1行削除)
- interpreter/inc/interpretershared.h: インタープリタ共有ヘッダーの定義変更(1行削除、1行追加)
- interpreter/interpconfigvalues.h: 新しい設定値を1行追加
- vm/corelib.h: VM層の定義を3行追加
- vm/interpexec.cpp: インタープリタ実行エンジンの大幅な修正(16行追加、5行削除)
- async/reflection/reflection.cs: テスト修正(2行追加、無効化)
パフォーマンスへの影響
DOTNET_JitOptimizeAwaitフラグの追加により、インタープリタでもJITと同じawait最適化を制御できるようになります。これにより、非同期操作のパフォーマンス特性がJITとインタープリタで一貫性を持つようになる可能性があります。
関連Issue
なし
その他
- 複数のコンポーネント(async、インタープリタ、VM層)にまたがる修正で、非同期フローの一貫性向上に注力
- テストの無効化があるため、既知の問題が存在する可能性がある
#122946 JIT: fix CEA to handle a few more cases
- 作成者: @AndyAyersMS
- 作成日時: 2026年01月06日 23:15:35(UTC)
- マージ日時: 2026年01月07日 16:31:50(UTC)
- ラベル: area-CodeGen-coreclr
概要
条件付きエスケープ分析(CEA)がネストされたGetEnumerator呼び出しに対応していなかった問題を修正。オブジェクトのGetEnumeratorが別のGetEnumerator呼び出しの結果を返す場合、JITが適切にフラグを設定できていなかった。フラグ設定ロジックを改善し、インライン化されたメソッドからの戻り値がコール式の場合もそのコールにフラグを設定するようにしました。
変更内容
- src/coreclr/jit/importer.cpp (+31行): フラグ設定ロジックの修正。インライン化された関数の戻り値がコール式の場合、そのコールにもフラグを付与
- src/coreclr/jit/objectalloc.cpp (+19行, -3行): 列挙子一時変数の出現位置に関する制約を緩和。追加のテンポラリ割り当てレイヤーに対応
パフォーマンスへの影響
SPMIテストで2件のスタック割り当て増加と約20件のコンテキストミスが確認されました。正しいコンテキスト情報があれば、さらに多くの最適化差分が期待できます。改善点としては、より複雑な列挙パターンでもスタック割り当てが可能になり、ヒープ割り当てを削減できる可能性があります。
関連Issue
#122856
その他
このフラグ機構は、インターフェースメソッドの呼び出しサイトをマークし、GDV(Guarded Devirtualization)ダイヤモンド内の割り当てと変数追跡を行うもの。複数のネストされたGetEnumeratorがある場合、最初に見つかったもの(RPO順)のみがCEAの対象となります。
#122943 Revert "[release/8.0] Update dependencies from dotnet/arcade"
- 作成者: @jozkee
- 作成日時: 2026年01月06日 22:24:55(UTC)
- マージ日時: 2026年01月07日 17:36:58(UTC)
- ラベル: Servicing-approved area-codeflow
概要
PR #122558でのdotnet/arcadeからの依存関係更新をリバートするPull Requestです。このリバートにより、ビルドやテスト関連の設定が以前の状態に戻されます。リバート理由は関連するIssue #122979およびWasmテストのタイムアウト問題に対応するためです。
変更内容
主に以下のファイルが変更されています:
- eng/Version.Details.xml - 依存関係バージョン情報を前のバージョンに戻す(36行変更)
- eng/Versions.props - ビルドプロパティのバージョン定義を戻す(15行変更)
- eng/common/post-build関連 - ビルド後処理スクリプトの複数ファイルを更新
- eng/common/templates-official/job/ - 公式テンプレートのジョブ設定を戻す
- global.json - グローバルビルド設定を前のバージョンに戻す
- その他ビルドツール関連スクリプト(tools.ps1、source-build.ymlなど)
パフォーマンスへの影響
影響なし(このPRは依存関係のリバートであり、パフォーマンス最適化を目的としていません。むしろ既存の問題を解決するためのロールバックです)
関連Issue
- dotnet/runtime #122979 - Wasmテストのタイムアウト問題
- dotnet/runtime #122558 - 元のarcade依存関係更新PR
その他
- 最新コメントでは、Workloads-NoWebcil-Wasm.Build.Tests.WasmTemplateTestsとWorkloads-Wasm.Build.Tests.WasmTemplateTestsのテストタイムアウト問題に対応していることが示唆されています
- このリバートにより、Wasmビルドテストの安定性向上が期待されます
#122940 Remove explicit WinRT initialization/uninitialization
- 作成者: @Copilot
- 作成日時: 2026年01月06日 21:19:42(UTC)
- マージ日時: 2026年01月07日 03:51:06(UTC)
- ラベル: area-Interop-coreclr
概要
WinRT明示的初期化/初期化解除コードを削除し、ランタイムを簡略化するPRです。標準的なCOM初期化(CoInitializeEx/CoUninitialize)でCOM/WinRTインターオペラビリティが十分に対応できるため、冗長なRoInitialize/RoUninitialize呼び出しと関連するスレッド状態フラグを削除しました。顧客への影響はなく、内部ランタイム最適化です。
変更内容
- threads.h/cpp:
TSNC_WinRTInitializedフラグと関連メソッド(IsWinRTInitialized、ResetWinRTInitialized、BaseWinRTUninitialize)を削除 - Thread.NativeAot.Windows.cs: NativeAOTから
ENABLE_WINRT条件付きコンパイルを削除し、常時CoInitializeEx使用に統一 - CMakeLists.txt(5ファイル):
RuntimeObject.lib依存関係を削除(coreclr/dlls/mscoree、ilasm、ildasm、jit、apphost) - COM初期化ロジック: 3箇所の冗長な
IsCoInitialized()チェックを簡略化
パフォーマンスへの影響
影響なし。削除されるのは冗長な初期化コードのみで、実際の動作はCoInitializeExで継続される。むしろコード削除により、わずかなメモリ/実行オーバーヘッド削減の可能性あり。
関連Issue
なし
その他
リスク評価は低。コード削除であり既存動作変更なし。CoreCLR Linux x64 Release設定でビルド検証済み。マージ過程でIsWinRTInitialized()の取り残し参照をコミット93a16ebで修正。
#122936 [clr-interp] Fix EmptyThisCall test
- 作成者: @davidwrighton
- 作成日時: 2026年01月06日 21:01:48(UTC)
- マージ日時: 2026年01月07日 23:21:57(UTC)
- ラベル: area-CodeGen-Interpreter-coreclr
概要
CLR インタープリタで、thisコール呼び出し規約を使用して関数を呼び出す際に、実際にthis引数が渡されていない場合の検出機能を追加します。EmptyThisCall テストの修正に対応する変更で、不正な関数呼び出しパターンをコンパイル時に検出し、エラーを防ぎます。
変更内容
src/coreclr/interpreter/compiler.cpp (+25行)
- thisコール規約でthis引数なしの関数呼び出しを検出するロジックを実装
- 検証処理とエラーハンドリングを追加
src/coreclr/interpreter/compiler.h (+1行)
- 新しい検出機能のヘッダー定義を追加
パフォーマンスへの影響
影響なし。追加されるのはコンパイル時の検証処理のみで、実行時パフォーマンスへの影響はありません。
関連Issue
#122936
その他
このPRはインタープリタの動作の正確性を向上させるもので、thisコール規約に関連する呼び出し規約の違反をコンパイル段階で早期に検出できるようになります。janvorliとcopilotが確認済み。
#122935 [mono] [debugger] Fix string[][]
- 作成者: @thaystg
- 作成日時: 2026年01月06日 19:13:16(UTC)
- マージ日時: 2026年01月07日 16:16:28(UTC)
- ラベル: area-Debugger-mono
概要
Monoデバッガーでジャグ配列(string[][])型のプロパティを検査する際のバグを修正したPull Requestです。デバッガーエージェントとプロトコルの定義に関連する小規模な変更により、ジャグ配列型のオブジェクトプロパティの適切な検査機能を実現しています。
public class TestObject
{
public string[][] TestProperty { get; set; } = [[], ["hi"]];
}
変更内容
- src/mono/mono/component/debugger-agent.c: デバッガーエージェントのコアロジックに4行追加。ジャグ配列型のプロパティ検査処理を改善
- src/mono/mono/component/debugger-protocol.h: プロトコル定義を1行修正。ジャグ配列型の適切なサポート実装
パフォーマンスへの影響
影響なし
関連Issue
#122935
その他
- 作成者により
release/10.0ブランチへのバックポート対応が進行中 - 診断領域のメンテナーにより通知済み
#122930 Add diagnostics, escapes, and typedefs to C# ilasm
- 作成者: @am11
- 作成日時: 2026年01月06日 17:49:33(UTC)
- マージ日時: 2026年01月07日 01:49:08(UTC)
- ラベル: area-ILTools-coreclr community-contribution
概要
C# ilasm置き換えツールに複数の機能を追加するPRです。診断レポーティング基盤の実装、エスケープシーケンス解析、typedef(型エイリアス)サポート、およびマーシャルクローズ関連のバグ修正が含まれています。これらの機能拡張により、IL アセンブラの互換性と機能性が向上します。
変更内容
- Diagnostic.cs: 20個の診断ID定義と
ReportError、ReportWarning、ReportDiagnosticヘルパーメソッドを追加 - GrammarVisitor.cs: typedef宣言の処理、型/メンバー/カスタム属性エイリアスの保存と解決機能を追加(+225行)
- StringHelpers.cs: エスケープシーケンス処理機能を新規実装。
\t、\n、\r、\\、\"、8進数シーケンスなど対応 - PreprocessedTokenSource.cs: 軽微な調整
- DocumentCompilerTests.cs: typedef、エスケープシーケンス、診断機能の包括的なテスト追加(+211行)
- バグ修正: フィールドにマーシャルクローズがない場合のIndexOutOfRangeException解決
パフォーマンスへの影響
影響なし
関連Issue
なし
その他
このPRは複数の機能を単一PRに統合しており、C# ilasm実装の重要なマイルストーン達成を示しています。typedef機能によりコード生成の簡潔性が向上し、診断インフラは将来のエラーハンドリング拡張の基盤となります。
#122926 [HTTP] Stress fix for ASAN preload
- 作成者: @ManickaP
- 作成日時: 2026年01月06日 16:53:48(UTC)
- マージ日時: 2026年01月07日 07:47:13(UTC)
- ラベル: area-System.Net.Http
概要
HTTP ストレステストの Dockerfile で ASAN (Address Sanitizer) のプリロード失敗を修正するPR。GCC をインストールし、新しい場所から libasan.so を読み込むように変更。これにより、ld.so のエラーメッセージ「object '/usr/lib/gcc/x86_64-linux-gnu/13/libasan.so' from LD_PRELOAD cannot be preloaded」が解消される。
変更内容
- src/libraries/System.Net.Http/tests/StressTests/HttpStress/Dockerfile
- GCC のインストール追加
- ASAN ライブラリのプリロードパス修正(+3行/-3行)
パフォーマンスへの影響
影響なし。この変更はテスト環境の設定修正であり、ランタイムのパフォーマンスには直接的な影響はない。ただしストレステストの実行を正常に完了できるようになるため、品質保証の観点では改善。
関連Issue
なし
その他
- 作成者が実行ログを比較して修正の有効性を検証済み(ASAN プリロード エラーが消滅することを確認)
- release/10.0 ブランチへのバックポート予定あり
- Azure Pipelines での stress-http テスト実行済み
#122907 Remove PlatformDetection.IsWindows7 and IsNotWindows7 properties
- 作成者: @Copilot
- 作成日時: 2026年01月05日 23:59:56(UTC)
- マージ日時: 2026年01月07日 03:52:07(UTC)
- ラベル: 指定なし
概要
Windows 7がサポート対象外になったため、PlatformDetection.IsWindows7とIsNotWindows7プロパティを削除するクリーンアップです。これらのプロパティは常にfalseとtrueを返していたため、コード内の関連する条件分岐や特殊ケース処理を削除し、コードを簡素化しました。
変更内容
- PlatformDetection関連:
IsWindows7とIsNotWindows7プロパティを削除 - TLS処理の簡素化:
GetTls11SupportとGetTls12SupportからWindows 7の特殊ケースを削除 - Console処理:
ConsolePal.Windows.csのバッファサイズ対応を削除 - ネイティブコード:
util_nodependencies.cppでWindows 8を最小サポート対象に設定、ostype.hファイルを完全削除 - 削除された関数:
RunningOnWin8()、WinRTSupported()、RunningOnStatusEnumなど、Windows 7検出用のインフラを削除 - テストデータ削除: Windows 7専用テストデータ(
Unicode_Win7ディレクトリ)とその参照を削除 - テスト属性の修正:
ConditionalTheory/ConditionalFactからtypeof(PlatformDetection), nameof(PlatformDetection.IsWindows)への移行 - 不要コードの削除: Windows 7チェックの早期リターンと死コードを削除
パフォーマンスへの影響
影響なし。本変更は単純なコード削除と簡素化のため、ランタイムパフォーマンスに変化はありません。むしろ不要な条件判定が削除されるため、若干の利益が期待できます。
関連Issue
#122907
その他
- リスク評価: 低。Windows 7はサポート対象外のため、サポート対象のプラットフォーム上での機能動作に変更なし
- 後方互換性: なし。Windows 7のサポート終了に基づく変更
- レビュー: jkotas、stephentoubらによる複数回のレビューを経て、ビルド エラー修正を含む
#122906 Remove inconsistent UnmanagedCallersOnly delegate construction check
- 作成者: @Copilot
- 作成日時: 2026年01月05日 23:51:15(UTC)
- マージ日時: 2026年01月07日 00:34:34(UTC)
- ラベル: area-Interop-coreclr
概要
[UnmanagedCallersOnly]属性を持つメソッドへのデリゲート作成時の早期チェックを削除し、ポリシーの一貫性を実現するPR。従来はNotSupportedExceptionを即座にスローしていましたが、他のコードパス(リフレクション呼び出しなど)と同様に、実際の呼び出し時にのみfailfastが発生するように変更されました。
// 変更前: デリゲート作成時に例外
var del = new Func<int, int>(MyUnmanagedCallersOnlyMethod); // NotSupportedException
// 変更後: デリゲート作成は成功、呼び出し時にfailfast
var del = new Func<int, int>(MyUnmanagedCallersOnlyMethod);
del(42); // ここでfailfast
変更内容
- comdelegate.cpp (-7行):
COMDelegate::GetDelegateCtorのHasUnmanagedCallersOnlyAttribute()チェックと例外スロー処理を削除 - Strings.resx (-3行): 未使用リソース文字列
NotSupported_UnmanagedCallersOnlyTargetを削除 - InvalidCallbacks.il (-41行): チェック動作を検証していた
NegativeTest_ViaDelegateテストと関連IL メソッドを削除 - UnmanagedCallersOnlyTest.cs (-16行): 未使用テストメソッドを削除
パフォーマンスへの影響
影響なし – チェック処理が削除されるため、デリゲート作成パスがわずかに高速化される可能性がありますが、測定可能な改善は期待できません。
関連Issue
dotnet/runtime#122890(および#122656のコメント)
その他
- リスク評価: 低 – 防御的チェック削除だが、実際の呼び出し時のfailfast保護は維持
- 他のデリゲート構成パスとの動作統一により、開発者エクスペリエンス向上
- 回避策なくこのチェックに依存している既存コードの影響は最小限(例外は事前に回避可能)
#122676 Reduce overhead from using AutomaticDecompression
- 作成者: @MihaZupan
- 作成日時: 2025年12月20日 15:18:19(UTC)
- マージ日時: 2026年01月07日 12:50:25(UTC)
- ラベル: area-System.Net.Http
概要
AutomaticDecompressionを使用する際のオーバーヘッドを削減するPRです。Accept-Encodingヘッダが未設定の一般的なケースの最適化、Content-Encodingヘッダ確認時の割り当て削減、圧縮済みコンテンツヘッダのムーブセマンティクス活用により、パフォーマンスを大幅に改善します。
変更内容
- DecompressionHandler.cs:
Accept-Encodingヘッダ設定時の検証ロジックを最適化。ユーザーがヘッダを手動設定していない一般的なケースでHttpHeaderValueCollectionなどの割り当てを回避。またTryGetValuesを使用して不要なコレクション割り当てを削減し、圧縮済みレスポンス処理でムーブセマンティクスを活用 - SocketsHttpHandler.cs: 最小限の関連変更
- HttpContent.cs: コンテンツヘッダムーブ機能の追加(9行)
- HttpContentHeaders.cs: マイナー修正(1行削除)
パフォーマンスへの影響
ベンチマーク結果(メモリ内、実IO無し):
- 非圧縮レスポンス: 実行時間25%削減(897.3ns → 674.0ns)、メモリ割り当て25%削減(1.81KB → 1.37KB)
- 圧縮レスポンス: 実行時間16%削減(1,435.9ns → 1,212.9ns)、メモリ割り当て30%削減(2.53KB → 1.78KB)
主な改善:
HttpHeaderValueCollectionと背後のList<object>の割り当て回避HeaderStoreItemInfoとその関連オブジェクトの割り当て削減- コレクションコピーの代わりにムーブセマンティクスを活用
関連Issue
#63632(クローズ)
その他
HTTP圧縮機能を使用する一般的なシナリオで大きなメモリ割り当て削減が期待でき、GCプレッシャー軽減につながります。
#122504 Fix interpreter ResumeAfterCatch on arm64 Unix
- 作成者: @janvorli
- 作成日時: 2025年12月12日 19:29:32(UTC)
- マージ日時: 2026年01月07日 13:06:01(UTC)
- ラベル: area-CodeGen-Interpreter-coreclr
概要
arm64 Unix環境でのインタープリタの例外処理後の再開時に発生していたバグを修正しました。DispatchManagedExceptionとDispatchRethrownManagedExceptionがNORETURNマークされていたため、C++コンパイラの最適化により関数のエピログが削除され、リターンアドレスが別の関数に位置するようになってしまい、InterpreterCodeManager::ResumeAfterCatchでの非volatile レジスタの復元が正確でなくなっていた問題です。
変更内容
- ファイル:
src/coreclr/pal/src/exception/seh-unwind.cpp - 変更: (+11/-0, total: 11行)
- 主な内容:
PAL_VirtualUnwind呼び出し前に命令ポインタを調整。関数がコール命令で終わる場合、アンワインド目的でPC(プログラムカウンタ)を関数内に戻すロジックを追加しました。これはネイティブEH(例外処理)と同様のアプローチです。
パフォーマンスへの影響
影響なし
関連Issue
- GitHub_88128(macOS arm64でのテスト失敗)
- Regressions/coreclr/GitHub_88128/test88128
その他
- 修正は例外後の処理フローに限定されるため、通常の実行パスには影響を与えません
- 調査過程でJIT\Regression\JitBlue\GitHub_19444テストでlibunwindクラッシュが報告されており、追加の調査・検証が進行中です
#122368 Handle some additional floating-point and SIMD morph optimizations
- 作成者: @tannergooding
- 作成日時: 2025年12月09日 23:46:34(UTC)
- マージ日時: 2026年01月07日 16:03:31(UTC)
- ラベル: area-CodeGen-coreclr
概要
浮動小数点数とSIMD操作の最適化を改善するPR。否定演算の二重否定の除去や、乗算の代わりに加算・否定を使用する最適化、2の累乗による除算・乗算を逆数乗算に変換するなど、複数の簡潔化を実装しています。JITコンパイラの形態素解析段階(morph)でこれらの最適化を行い、生成されるコードの効率を向上させます。
変更内容
- ファイル:
src/coreclr/jit/morph.cpp(+227/-65行) - 主な変更内容:
- 浮動小数点数と整数の二重否定処理の最適化
- 乗算を加算や否定に置き換える変換
- 2の累乗による除算・乗算を逆数乗算に変換
- 複数の簡潔化ロジックの追加
fgMorphSmpOp内での操作タイプ変更後の処理改善
パフォーマンスへの影響
- パフォーマンス回帰なし
- 改善点: マイナーな正のパフォーマンス差分を確認
- 懸念点: x64環境で数件のサイズ回帰が存在(レジスタ選択の変更によるコード生成の最小限の変更、またはプロローグスピルとエピローグリストアの追加による)
- AVX-512最適化の未実装機会が確認されている(本PRには未含)
関連Issue
#122272
その他
- コード生成の最適化には複数の相互作用が必要な場合がある(CSE/VN等の連携により値の使用回数を判断し、L1からの再ロード vs 追加計算時間でコストを決定)
- より大規模な
fgMorphSmpOpのリファクタリングが理想的だが、本PRは現在でも全体的に有益(確認済みテスト結果で検証済み)
#122297 JIT: Expand recognition of struct field offset pattern
- 作成者: @jakobbotsch
- 作成日時: 2025年12月08日 16:18:46(UTC)
- マージ日時: 2026年01月07日 09:53:49(UTC)
- ラベル: area-CodeGen-coreclr
概要
JITコンパイラが構造体フィールドのオフセット計算パターンを認識する最適化を改善しました。従来の昇格機構(old promotion)で昇格された構造体の場合、アドレスが取られるときに親ローカルと子フィールドが共有ストレージを持つ際に、この最適化が機能していなかった問題を修正しています。
public unsafe nint Test()
{
MyStruct dummy;
return (nint)((byte*)&dummy.Field - (byte*)&dummy);
}
変更内容
- ファイル:
src/coreclr/jit/lclmorph.cpp - 変更行数: +35/-13 (計48行)
- 主な変更: 昇格された構造体フィールドのオフセット計算において、親ローカル変数が一致するかどうかで判定するよう条件を拡張
パフォーマンスへの影響
大幅な改善
修正前は12バイトのアセンブリコードが生成されていたのに対し、修正後は5バイトのみとなり、アドレス計算をコンパイル時に静的に解決するようになりました。
- 命令数削減: lea, sub命令が削除され、mov eax, 4で定数に最適化
- PerfScore改善: 2.5 → 1.25
関連Issue
なし
その他
- 将来的には従来の昇格機構(old promotion)は新しい昇格機構(physical promotion)に置き換えられる予定です
- dependent promotion(アドレスが取られる場合の昇格)とindependent promotion(アドレスが取られない場合の昇格)の区別が重要です
#122167 Inline nullable allocators
- 作成者: @EgorBo
- 作成日時: 2025年12月03日 23:56:49(UTC)
- マージ日時: 2026年01月07日 16:35:05(UTC)
- ラベル: area-CodeGen-coreclr
概要
Nullable型のボックス化時にインライン化とスタック割り当てを実現するPR。従来はNullable
object Test(long? n)
{
return n;
}
上記のコードでコード生成が26バイトから46バイトに増加しますが、メモリ割り当てが削減されます。
変更内容
- compiler.cpp/h: コンパイラ処理フェーズの追加
- compphases.h: 新しい最適化フェーズの登録
- gentree.h: Nullable型関連のツリーノード構造拡張
- importer.cpp: Nullable型のボックス化処理のインライン化ロジック実装(+114行)
- morph.cpp: モーフィング処理でのNullable型ハンドリング改善(+59行)
パフォーマンスへの影響
改善点:
- メモリ割り当てが削減(ヒープ割り当てがスタック割り当てに変更)
- GCプレッシャーの軽減
- 特にジェネリック型内でIFormattableなどのインターフェース処理時に効果的
懸念点:
- スタック上でのボックス処理により、コード生成サイズは若干増加(26→46バイト)
- JIT diffs測定が困難(テスト環境でのジェネリック型インスタンス化の影響)
関連Issue
- #50915: Nullable型のボックス化最適化要件
- #114497: 関連するフォーマット処理の最適化
その他
複数のレビュワー(pentp、AndyAyersMS、MichalStrehovsky等)による詳細なレビュー実施。ジェネリック構造体にも対応予定で、実装当初はプリミティブ型のみでしたが、後に全型をサポートに拡張されています。