Pull Request on 2026年05月21日

dotnet/runtimeにマージされたPull RequestをAIで日本語要約

注意点

このページは、dotnet/runtimeリポジトリにマージされたPull Requestを自動的に収集し、その内容をAIが要約した内容を表示しています。そのため、必ずしも正確な要約ではない場合があります。



#128447 JIT: Disallow CSE of multireg nodes

概要

JIT の Common Subexpression Elimination (CSE) ロジックを修正し、マルチレジスタ値を持つ非SIMD構造体型の式について CSE を禁止します。これらの値は常にスピルされ、正確性のためには既存のストア先を DNER(Do Not Eliminate Register)として扱う必要があるため。

変更内容

  • src/coreclr/jit/optcse.cpp: 既存の「return下の非SIMD構造体」ガードをより広い非SIMD構造体ゲートブロックに変更し、マルチレグノードの除外ロジックを追加(+20/-6)

パフォーマンスへの影響

影響なし(正確性修正による副作用としてCSEの最適化機会が減少する可能性がありますが、具体的なベンチマーク情報は提供されていません)

関連Issue

#127142 #128452

その他

コンパイラ内部実装(JIT)への変更であり、公開APIへの影響はありません。マルチレジスタ値の CSE による不正な最適化を防ぎます。


#128434 Socket: fix infinite release spin-wait when Socket gets closed after handle was invalidated.

概要

Socket が無効化されたハンドルの後に閉じられる場合に発生する無限のリリーススピンウェイトを修正します。SafeSocketHandle でハンドル無効化後の状態遷移ロジックを改善し、不要なスピンウェイトを削減します。

変更内容

  • SafeSocketHandle.cs: リリース処理のスピンウェイト条件を修正(1行追加、5行削除)
  • SafeHandleTest.cs: ハンドル無効化後のSocket閉鎖シナリオをテストするケースを追加(17行追加)

パフォーマンスへの影響

リリース処理中の無限スピンウェイトが解消されるため、Socket閉鎖時のCPU使用率が低下します。特にハンドル無効化後の閉鎖処理が迅速に完了するようになります。

関連Issue

#128434

その他

System.Net.Sockets内部実装(SafeSocketHandle)の修正です。


#128433 Socket: set Socket.Blocking from handle when constructing from SafeSocketHandle.

概要

SafeSocketHandleからSocketを構築する際に、ハンドルの実際のブロッキング状態を読み取ってSocket.Blockingプロパティを正しく初期化するように変更しました。これにより、既存のソケットハンドルからSocketオブジェクトを作成する場合の状態不整合を防ぎます。

変更内容

  • src/libraries/System.Net.Sockets/src/System/Net/Sockets/Socket.cs: SafeSocketHandleからのコンストラクタ処理で、ハンドルのブロッキング状態を取得してSocket.Blockingプロパティを初期化するロジックを追加
  • src/libraries/System.Net.Sockets/tests/FunctionalTests/CreateSocketTests.cs: SafeSocketHandleから構築したSocketのブロッキング状態が正しく反映されることを検証するテストケースを追加

パフォーマンスへの影響

影響なし

関連Issue

なし

その他

この変更は公開API(Socket.Blocking プロパティ)の初期化ロジックの改善で、内部実装の修正です。既存のソケットハンドルからSocketを再構築する際に、ハンドルの実際の状態とSocketオブジェクトの状態が一致していなかった問題を解決します。


#128403 [clr-interp] Fix handling of continuation return when it is not used by the method

概要

CLR インタープリターの非同期メソッド呼び出しで、戻り値が使用されない場合の継続処理の復帰時に、ライブ変数を誤って上書きするバグを修正します。戻り値が未使用の場合、スタックオフセットが他のテンポラリ変数と共有されることがあり、復帰時に継続戻り値を書き込む際に既存のライブ値が破壊される問題を解決します。

変更内容

  • src/coreclr/interpreter/compiler.cpp: 非同期サスペンド時のメタデータ生成で、戻り値が未使用の場合に returnValueVarStackOffset を -1 に設定して、スタックオフセットのパッチを回避
  • src/coreclr/vm/interpexec.cpp: 復帰パスで returnValueVarStackOffset != -1 の条件チェックを追加し、有効なオフセットがある場合のみ継続結果をインタープリタースタックにコピー

パフォーマンスへの影響

影響なし

関連Issue

#127931(戻り値変数の書き込み順序変更により露呈)

その他

本修正は内部実装(CLR インタープリター)の改善であり、公開 API への影響はありません。非同期メソッドで戻り値が使用されないエッジケースを適切に処理することで、メモリ破損を防ぎます。


#128399 Use cached continuation in Await as well when used with ValueTaskSource

概要

ValueTaskSourceベースのValueTaskを待機する際に、キャッシュされた継続(continuation)を再利用することでメモリ割り当てを削減する変更です。#127973の考え方を、thunkではなく実際のAwaitが使用される場合に適用します。実測値として、ベンチマークでGen0 GC回数が15/secから2/secまで削減されました。

変更内容

  • AsyncHelpers.cs: Await(ValueTask)とAwait<T>(ValueTask<T>)を変更し、TaskとIValueTaskSourceのルーティングを分離。後者の場合はValueTaskSource専用の待機ヘルパーを使用
  • AsyncHelpers.ValueTaskContinuation.cs: キャッシュされた継続に継続コンテキストスロットを追加し、再利用時に関連する状態とフラグをリセット
  • AsyncHelpers.CoreCLR.cs: AwaitValueTaskSourceとAwaitValueTaskSourceOfTの新しい待機ヘルパーを追加。キャプチャされた継続コンテキストフラグに対応するよう一時停止処理を更新

パフォーマンスへの影響

  • Gen0 GC削減: ベンチマークで15/sec → 2/sec(大幅な改善)
  • メモリ割り当て削減: IValueTaskSourceを利用する非同期パターン(特にASP.NET Coreのソケット通信など)において継続オブジェクトの割り当てを削減
  • 改善はnet10に相当するレベルとのこと

関連Issue

#127973

その他

この変更により、以下のようなパターンの割り当てが削減されます:

var flushTask = Input.FlushAsync();
var paused = !flushTask.IsCompleted;
var result = await flushTask; // ここで再利用可能な継続がキャッシュされる

#128389 Replace small stackallocs with collection literals

  • 作成者: @EgorBo
  • 作成日時: 2026年05月20日 00:26:21(UTC)
  • マージ日時: 2026年05月21日 19:40:07(UTC)
  • ラベル: area-Meta reduce-unsafe

概要

非常に小さい stackalloc バッファを C# collection expressions([0, 0, 0, 0] など)に置き換え、それらの stackalloc のためだけに必要だった unsafe 修飾子を削除するリファクタリングです。スタックベースのバッファ動作は維持しながら、コード安全性を向上させます。

// 変更前
unsafe void Example()
{
    Span<int> buffer = stackalloc int[4];
}

// 変更後
void Example()
{
    Span<int> buffer = [0, 0, 0, 0];
}

変更内容

  • 26ファイルにおける stackalloc の置き換え: 1~4要素の小規模な stackalloc を collection expressions に置き換え
    • stackalloc int[4] → [0, 0, 0, 0]
    • stackalloc byte[1] → [0]
    • stackalloc char[2] → ['\0', '\0'] など
  • unsafe 修飾子の削除: stackalloc 専用だった unsafe コンテキストを削除
  • 影響範囲: System.Text.RegularExpressions、System.Text.Json、System.Security.Cryptography、System.Private.CoreLib、System.IO.Pipelines など複数のライブラリ

パフォーマンスへの影響

影響なし。Collection expressions は C# コンパイラにより stackalloc と同等のスタック割り当てに最適化されるため、実行時パフォーマンスおよびメモリ配置に変化なし。

関連Issue

なし

その他

  • 内部実装の変更: 公開 API に直接的な影響はなし
  • 互換性: 互換性への影響なし(シグネチャ変更なし)
  • コード品質向上: unsafe コンテキストの削除により、より安全で検証可能なコードとなる

#128369 [R2R] Add discovery of generic virtual methods

  • 作成者: @BrzVlad
  • 作成日時: 2026年05月19日 13:29:28(UTC)
  • マージ日時: 2026年05月21日 09:24:06(UTC)
  • ラベル: area-ReadyToRun

概要

ReadyToRun(R2R)コンパイラの依存関係分析を拡張し、ジェネリック仮想メソッド(GVM)呼び出しの実装を動的に発見・コンパイルする機能を追加します。GVMDependenciesNodeをNativeAOTから共有ソースに移動し、ReadyToRunでも利用可能にします。型マーカーノード(InheritedVirtualMethodsNode)を導入し、アプリケーションで使用される型に対するGVM実装の解決を行います。

変更内容

  • GVMDependenciesNode を src/coreclr/tools/Common に移動し、READYTORUNガード付きで ReadyToRun対応を実装
  • InheritedVirtualMethodsNode を新規作成し、動的依存関係スキャン対象の型マーカーとして機能
  • TypeFixupSignature に型マーカーノードの追加を実装
  • MethodFixupSignature でGVM依存関係ノード作成ロジックを追加
  • ReadyToRunCodegenNodeFactory にキャッシュと型/GVM依存関係のファクトリAPI を追加
  • プロジェクト設定を調整し、NativeAOTとReadyToRunが共有実装を参照するように変更

パフォーマンスへの影響

影響なし

関連Issue

なし

その他

  • この変更は主にコンパイルタイムの依存関係分析に関するもので、ランタイムの公開APIへの影響はありません
  • READYTORUNプリプロセッサ定義で条件付けされており、ReadyToRun固有の動作(NoteOverridingMethodの非報告、TypeGVMEntriesの非追加)を実装しています
  • NativeAOTとReadyToRunの両方で共有可能な形に GVMDependenciesNode が再設計されています

#128296 [browser] More Wasm.Build.Tests on CoreCLR

概要

CoreCLR-on-WASM「ノーワークロード」モードにおいて、公開時のネイティブ再リンク機能をエンドツーエンドで実装し、Wasm.Build.Testsの追加テストカバレッジをCoreCLRで有効化するもの。ランタイムパックのペイロード調整、ビルドパイプラインの再設計、テスト基盤の拡張を含む。

変更内容

ランタイムパック・Helixペイロール:

  • 静的ライブラリ(.a)とlibSystem.Native.Browser.extpost.jsをランタイムパックに含める(Microsoft.NETCore.App.Runtime.CoreCLR.sfxproj、Directory.Build.props)
  • ランタイムテスト用ブラウザホストファイルセットからlibminipal.a等を除外(eng/liveBuilds.targets)
  • minipalヘッダとcallhelpers.hppをHelix相関ペイロードにステージ(src/libraries/sendtohelix-browser.targets)、MINIPAL_INCLUDE_DIR・CORECLR_VM_WASM_INCLUDE_DIR環境変数を公開

BrowserWasmApp.CoreCLR.targets 再設計:

  • _CoreCLRSetWasmBuildNativeDefaultsによりNativeFileReference・NativeLibrary項目からWasmBuildNativeを自動有効化
  • _CoreCLRWasmNativeForBuild・_CoreCLRWasmNativeにより、ノーワークロード時にビルド/公開フェーズの再リンクを適切なタイミングで実行
  • 公開時にWasmBuildOnlyAfterPublishをデフォルト有効化(古いfor-build/dotnet.native.wasmの混入回避)
  • ネストされた公開がOriginalItemNameメタデータを返し、結果ルーティングがファイル拡張子ではなくメタデータキーで判定
  • コンパイルパイプラインを2つのRSPに分割:
    • emcc-compile.rsp:ユーザーNativeFileReference C/C++ソース(互換ヘッダを強制非含)
    • emcc-compile-generated.rsp:ManagedToNativeGenerator出力(coreclr_compat.hを強制含、minipal・coreclr/vm/wasmインクルードパスを環境変数でオーバーライド可能)
  • 生成される_WasmPInvokeModulesにユーザーC/C++ソースファイル名を含める

新規ファイル・ヘッダ:

  • src/mono/browser/build/coreclr_compat.h:最小限の型定義(MethodDesc・PCODE・ULONG・INTERP_STACK_SLOT_SIZE)と互換性スタブ(ロギング・アサーション)を提供

Wasm.Build.Tests インフラ:

  • BuildEnvironment.cs:ランタイムパックをMicrosoft.NETCore.App.Runtime.{rid}として解決、環境変数をプロパゲート
  • AssertBundleOptions.cs:RuntimePackDirオプションを追加(ICUアセット検証用)
  • テストクラス群(NativeBuildTests・DllImportTests・PInvokeTableGeneratorTests等)をCoreCLRで有効

#128162 Add System.Text.Json union support

概要

System.Text.JsonにC#の共用体型(union-like shapes)のサポートを追加します。ユニオン型のシリアライゼーション/デシリアライゼーション、カスタム分類器API、ソース生成対応を実装しています。新しいメタデータ、属性、コンバーターインフラストラクチャを導入し、リフレクションとソース生成の両方で対応します。

変更内容

  • 新規API(公開):

    • JsonUnionAttribute:ユニオン型をカスタマイズするための属性
    • JsonPolymorphicAttribute:多態的な分類器フック
    • JsonTypeClassifier、JsonTypeClassifierContext、JsonTypeClassifierFactory、JsonTypeClassifierKind:ユニオンと多態型の分類APIs
    • JsonTypeInfoKind.Union:メタデータで型がユニオンであることを示す
  • ランタイム実装(内部):

    • JsonUnionCaseInfo、JsonUnionInfoValues<T>:ユニオンケース用メタデータ
    • JsonValueType:内部JSONバリュー形状フラグ
    • ユニオンコンバーター(UnionConverter)とファクトリ
    • JsonTypeInfoにユニオンコンストラクタ/デコンストラクタ、ユニオンケース、分類器解決機能を追加
    • JsonSerializerOptionsに分類器リスト設定と統合
  • ソース生成器:

    • ユニオンケースコンストラクタの発見とメタデータ生成
    • PolymorphismOptionsSpec、DerivedTypeSpec、UnionCaseSpec等の新規モデルクラス
    • パーサーとエミッターの拡張:ユニオン/ポリモーフィズム/分類器メタデータ対応
    • 新規診断:SYSLIB1227、SYSLIB1228
  • スキーマ生成:

    • JsonSchemaExporterにユニオンコントラクトのスキーマ生成対応

パフォーマンスへの影響

影響なし

関連Issue

#127299

その他

  • 反射メタデータリゾルバーがユニオン発見と分類器配線に対応
  • MemberAccessorにコンストラクタ/ゲッターヘルパーを追加
  • 複数言語のローカライズファイルを更新
  • 反射およびソース生成の両方で包括的なテストカバレッジを追加
  • 163ファイル変更(ジェネレータ、メタデータ、属性、コンバーター、テスト等)

#127894 Remove the concept of primitive value types and follow-up JIT/TypedReference/arglist cleanup

  • 作成者: @Copilot
  • 作成日時: 2026年05月07日 00:33:27(UTC)
  • マージ日時: 2026年05月21日 17:15:11(UTC)
  • ラベル: area-VM-coreclr

概要

プリミティブ値型の概念を削除し、JIT/TypedReference/arglistの関連実装をクリーンアップするランタイム内部の大規模リファクタリングです。GetVerifierCorElementTypeを廃止してGetInternalCorElementTypeに統一し、列挙型とプリミティブ型を明確に区別するようにMethodTableのカテゴリフラグを再構成します。TypedReferenceは通常のbyref様値型として扱われ、CEE_ARGLISTはJITで実際のRuntimeArgumentHandle構造体を生成するようになります。

変更内容

  • typehandle.h/cpp: GetVerifierCorElementTypeメソッドを削除、全呼び出し箇所をGetInternalCorElementTypeに置換
  • methodtable.h/cpp/inl: MethodTableカテゴリフラグをCategory_Primitive (0x00060000) / Category_Enum (0x00070000)に改名・再値付け
  • jitinterface.cpp: JIT/CoreCLRインターフェース内のプリミティブ・列挙型正規化ロジックを更新
  • classnames.h: ランタイムハンドル構造体(RuntimeArgumentHandle等)の特殊扱いを削除
  • System.Private.CoreLib/src/System/RuntimeHandles.cs: CoreLibのMethodTableフラグ定数を同期更新
  • RuntimeTypeSystem.md: cDAC契約ドキュメントを新しい列挙型/プリミティブカテゴリセマンティクスで更新
  • その他VM層: typedesc.cpp、reflectioninvocation.cpp、proftoeeinterfaceimpl.cpp等で内部要素型を使用するよう一貫性を強化

パフォーマンスへの影響

影響なし

関連Issue

なし

その他

  • 破壊的変更:TypedReferenceの扱いが変更されます(従来は条件付きプリミティブ、現在は標準byref様値型)
  • 内部実装の変更:このPRは主にランタイム内部(VM層・JIT)に影響し、公開APIは直接的には変更されません
  • CEE_ARGLISTの動作修正により、マネージド可変長引数メソッドでRuntimeArgumentHandleをキャプチャして別メソッドに渡し、ArgIteratorで転送された引数を反復処理できるようになります
  • 無効なarglistテスト(RuntimeArgumentHandleをポインタに暗黙変換できると仮定していた)を削除し、新しい回帰テスト(varargmanaged.cs/vararg.cs)を追加

#127883 JIT: Unify post-order cmp transforms into fgOptimizeRelationalComparison

概要

JITコンパイラの比較演算最適化ロジックを統合する変更です。複数の後順序(post-order)比較変換をまとめてfgOptimizeRelationalComparison関数で一元化し、コード構造を簡潔にします。変更はゼロディフ(生成されるコードに影響なし)です。

変更内容

  • src/coreclr/jit/compiler.h: 関数シグネチャ修正(+2/-1)
  • src/coreclr/jit/morph.cpp: 比較演算最適化ロジックの統合リファクタリング(+73/-66)
    • 後順序の比較変換をまとめてfgOptimizeRelationalComparisonに統合

パフォーマンスへの影響

影響なし(ゼロディフ確認済み)

関連Issue

なし

その他

内部JIT最適化パスの整理を目的とするリファクタリング。公開APIへの影響なし。


#117261 Improve Math.BigMul performance on x64

概要

x64プラットフォームにおいてMath.BigMulのパフォーマンスを改善するPRです。JITコンパイラがx64固有の乗算命令を活用して、より効率的なコード生成を行うようにします。mulxサポートを含まないバージョンとして提出されており、AVX2非対応ハードウェアでの動作確認が目的です。

変更内容

  • JIT/コンパイラ層:x64向けハードウェアイントリンシック対応

    • hwintrinsiccodegenxarch.cppにBigMul用コード生成ロジック追加(32行)
    • hwintrinsicxarch.cppでハードウェアイントリンシック定義追加(20行)
    • lsraxarch.cppでレジスタ割り当て最適化対応(28行追加、2行削除)
    • hwintrinsiclistxarch.hにBigMul関連の定義追加(2行追加、1行削除)
  • パブリックAPI層:

    • System.Math.csにBigMulの公開APIを追加(19行追加、5行削除)
    • X86Base.csにx64向けBigMul操作用のプラットフォーム固有メソッド追加(20行)
    • X86Base.PlatformNotSupported.csでプラットフォーム非対応時のスタブ実装追加(17行)
  • テスト:

    • BigMul機能の包括的なテストスイート追加(285行)
    • プロジェクト設定にテスト対象を追加

パフォーマンスへの影響

パフォーマンス改善の具体的な数値は提供されていません。ただし、作成者はリファレンスPR(#115966)にベンチマーク結果が記載されていることを言及しており、x64プラットフォーム上でのMath.BigMul実行速度の向上が期待されます。

関連Issue

#115966(元のPR)

その他

  • 本PRはmulxサポートを意図的に除外しており、より広範なハードウェア互換性での動作検証が目的です
  • チームの判断により元のPRに統合することも想定しており、独立したPRとしての柔軟な取り扱いを前提としています

目次