Pull Request on 2026年06月05日

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

注意点

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



#129044 JIT test: remove SimdLoadBetweenBCs from ElidedBoundsChecks

概要

JIT回帰テスト ElidedBoundsChecks から SimdLoadBetweenBCs テストケースを削除するものです。PR #128965 で Vector128.Create の例外動作が変更され、連続した配列インデックスからの単一 SIMD ロードとして認識されなくなったため、このテストは現在の動作と合致しなくなりました。

変更内容

  • src/tests/JIT/opt/RangeChecks/ElidedBoundsChecks.cs: SimdLoadBetweenBCs ヘルパーメソッド(28行)を削除
    • 連続引数の Vector128.Create ロー化動作に依存していたテストケースを削除
    • ArgumentOutOfRangeException 観察に依存していたテストアサーションを削除

パフォーマンスへの影響

影響なし(テストコードの削除のため)

関連Issue

#129037、#128965

その他

  • この変更はテストスイートのメンテナンスであり、ランタイムの動作変更に対応するものです
  • 削除されたテストは CoreCLR 固有で HW アクセラレーション限定のゲート機能に依存していました

#129033 Never attempt to process an RSA 16K key on Android

  • 作成者: @vcsjones
  • 作成日時: 2026年06月05日 05:09:17(UTC)
  • マージ日時: 2026年06月05日 18:22:54(UTC)
  • ラベル: area-System.Security

概要

AndroidのConscrypt/BoringSSLがRSA 16K (16384ビット)キーを適切に処理できず、BoringSSLのエラーキューをクリアしないため、RSA 16Kキーのインポート時に発生したエラーが他の暗号操作に漏れて不正な例外が発生する問題を修正します。本PRではユニットテストでRSA 16Kキーの処理を回避することで、テスト結果の不安定化を防ぎます。

変更内容

  • SignVerify.cs: RSA-16384署名検証テストをConditionalFactでImportExport.Supports16384ゲート化(2行変更)
  • ImportExport.cs: 大きなキーのインポート/エクスポートテスト、およびRSA-16384対応判定メソッドTestRsa16384を修正。Android上ではRSA-16384キープローブを実行せずSupports16384をfalse返却(8行追加、1行削除)
  • EncryptDecrypt.cs: RSA-16384暗号化/復号化ラウンドトリップテストをConditionalFactでゲート化(1行追加、1行削除)

パフォーマンスへの影響

影響なし

関連Issue

#128888

その他

  • 適用範囲: テストコードのみ、公開APIへの変更なし
  • 互換性: ユニットテストの実行スキップで問題なし(既存コードの動作に変更なし)
  • 背景: BoringSSLエラーキューへの直接アクセスがないため、根本的な修正は困難。ネイティブエラー状態の汚染回避が最良の実装可能な対策

#129026 SuperPMI: re-apply JitWasmNyiToR2RUnsupported when ignoring stored config

概要

SuperPMI の asmdiffs-checked-release ビルドで -ignoreStoredConfig を使用する際、WebAssembly JIT 向けの JitWasmNyiToR2RUnsupported=1 設定が失われることで、未実装のオペコード(例:GT_ASYNC_CONTINUATION)に対してアサーション失敗が発生していた問題を修正します。wasm ターゲットの場合に外部から明示的にこのオプションを再適用することで、R2R-unsupported として適切にスキップされるように動作を復元します。

変更内容

  • src/coreclr/scripts/superpmi.py: --diff_with_release で -ignoreStoredConfig が渡される場合、wasm ターゲット (target_arch == "wasm") に対して -jitoption force JitWasmNyiToR2RUnsupported=1 および -jit2option force JitWasmNyiToR2RUnsupported=1 を追加 (+11行)

パフォーマンスへの影響

影響なし

関連Issue

#129014

その他

この変更は SuperPMI スクリプト(内部開発ツール)の修正であり、ランタイム公開API や開発者向けコンポーネントに直接的な影響はありません。WebAssembly JIT の動作を正常に保つための設定修正です。


#129005 Simplify TryParseFormatO fractional-seconds handling

概要

DateTimeの"O"形式(ISO 8601ラウンドトリップ)パーサーのテンス秒処理を簡略化しました。7桁の小数秒は常にTimeSpan.TicksPerSecond(10,000,000)と一致するため、浮動小数点の除算・乗算・丸め処理を経由せず、直接tickカウントとしてTryAddTicksに渡すことで、処理を簡素化しかつ精度を保証します。この変更は完全に下位互換性があり(10M個の7桁値すべてで同一の結果を確認)、同時に若干のパフォーマンス向上が得られます。

変更内容

  • src/libraries/System.Private.CoreLib/src/System/Globalization/DateTimeParse.cs (+8/-4)
    • TryParseFormatOメソッドの小数秒処理を変更
    • 7桁の小数秒から直接tick値を計算し、doubleを経由した計算処理を削除
    • 内部実装の変更(公開APIへの影響なし)

パフォーマンスへの影響

改善:約6%の高速化

Perf_DateTime.ParseOベンチマーク結果(Windows 11, Intel Core i9-14900K, .NET 11.0 R2R'd):

  • 基準版:11.87 ns
  • パッチ版:11.14 ns(改善幅:約0.73 ns/call)

制御試験(ParseR)は両ビルドで同等(11.4 ns)であり、計測の安定性が確認されています。

関連Issue

なし

その他

  • 既存テスト(System.Tests.DateTimeTests 1378件、System.Tests.DateTimeOffsetTests 737件)がすべてパスしている
  • GitHub Copilotの支援で準備されたPR

#128999 [HTTP] httpbin sometimes returns 503

  • 作成者: @ManickaP
  • 作成日時: 2026年06月04日 17:03:36(UTC)
  • マージ日時: 2026年06月05日 12:25:48(UTC)
  • ラベル: area-System.Net.Http

概要

httpbin.orgエンドポイントからの一時的な503 ServiceUnavailable応答がテスト失敗を引き起こす問題を修正します。既存の502/504エラーと同様に、503応答をテストで無視する対象として追加することで、リモートサーバーの不安定性に起因するテストの不安定性を低減します。

変更内容

  • src/libraries/Common/tests/System/Net/Http/HttpClientHandlerTest.RemoteServer.cs: httpbin deflate デコンプレッションテストで無視すべきHTTPステータスコードのセットに HttpStatusCode.ServiceUnavailable (503) を追加

パフォーマンスへの影響

影響なし

関連Issue

#128940 - 本修正の対象となった元のテスト失敗

その他

この変更はテストインフラの改善であり、公開APIや実装ロジックへの影響はありません。httpbin.orgの外部サービスが返す一時的な503エラーに対する耐性をテストに持たせるものです。


#128988 Reduce redundant lookup in OrderedDictionary<TKey, TValue>.Remove

概要

OrderedDictionary<TKey, TValue>.Remove(KeyValuePair<TKey, TValue>) メソッドにおいて、冗長なルックアップを削除する最適化を実施しました。TryGetValue から取得したインデックスを使用して RemoveAt を呼び出すことで、2回目のルックアップを回避します。また、IDictionary.Add の重複した null チェックも削除しました。

変更内容

  • System/Collections/Generic/OrderedDictionary.cs
    • Remove(KeyValuePair<TKey, TValue>) メソッドの最適化:TryGetValue で取得したインデックスを直接 RemoveAt に渡すことで、キー検索の重複を排除
    • IDictionary.Add(object, object?) の重複した null チェック ガードを削除

パフォーマンスへの影響

改善あり。Remove(KeyValuePair<TKey, TValue>) 呼び出し時、キーのルックアップが1回に削減され、ハッシュテーブルのプローブ処理が削減されます。特に大規模なコレクションや頻繁な削除操作の場合に効果的です。

関連Issue

#128988

その他

なし


#128967 JIT: Superpmi wasm32 neardiff

概要

SuperPMI の asm near-diffing パイプラインに WebAssembly (Wasm32) サポートを追加します。CoreDisTools を v1.7.0 に更新して Wasm 逆アセンブリ機能を有効化し、SuperPMI の NearDiffer と CompileResult に Wasm 固有のオフセット・リロケーション処理を実装します。

変更内容

  • eng/Versions.props: CoreDisTools パッケージを v1.7.0 に更新
  • src/coreclr/inc/coredistools.h: Target_Wasm32 ターゲット定義と Wasm フレーム対応の near-diff/disasm API を追加(39行追加)
  • src/coreclr/tools/superpmi/superpmi/neardiffer.h: Wasm 固有のオフセット比較関数宣言を追加
  • src/coreclr/tools/superpmi/superpmi/neardiffer.cpp: wasm/wasm32 を CoreDisTools Target_Wasm32 にマッピングし、compareOffsetsWasm を実装(108行追加)
  • src/coreclr/tools/superpmi/superpmi-shared/compileresult.h: Wasm near-diff 用のリロケーション範囲検索関数 findRelocationInRange を宣言
  • src/coreclr/tools/superpmi/superpmi-shared/compileresult.cpp: Wasm32 のリロケーション適用をスキップし、リロケーション範囲検索を実装(40行追加)

パフォーマンスへの影響

影響なし

関連Issue

なし

その他

  • この変更は JIT コンパイラの Wasm32 コード生成をテストするための SuperPMI ツール基盤を拡張するもので、公開 API には影響しません
  • 内部的には CompileResult ヘルパー機能が追加され、Wasm32 では applyRelocs 処理がスキップされます

#128966 [cDAC] Implement GetThreadOwningMonitorLock for cDAC

  • 作成者: @barosiak
  • 作成日時: 2026年06月04日 00:39:12(UTC)
  • マージ日時: 2026年06月05日 19:17:47(UTC)
  • ラベル: area-Diagnostics-cdac

概要

cDAC(Compact Diagnostics and Analysis Component)で GetThreadOwningMonitorLock メソッドを実装しました。このメソッドはマネージド実装(DacDbiImpl)でSync Blockのロック情報を読み込み、所有スレッドを解決します。#if DEBUG配下で従来のDAC実装との互換性検証も含まれています。

変更内容

  • DacDbiImpl.cs - GetThreadOwningMonitorLock実装を追加。Sync Blockのロック情報を読み込み、ThreadData.Idからスレッド所有者を解決。DEBUG時に従来のDAC実装との整合性検証を実施。
  • DacDbiImplTests.cs - ロック保持/未保持シナリオに対応した8つのxUnitテストを追加。モック化されたIObject/ISyncBlock/IThreadコントラクトを使用して、アーキテクチャ間でのDacDbiMonitorLockInfo.lockOwnerとacquisitionCountの返却値を検証。
  • dacdbiimpl.cpp - 軽微な変更(+2/-1)

パフォーマンスへの影響

影響なし

関連Issue

なし

その他

本実装はcDAC内のマネージド診断インターフェース(IDacDbiInterface)の一部であり、内部的な診断・デバッグインフラストラクチャの強化です。公開APIへの影響はありません。


#128960 [release/10.0] JIT: bail from optOptimizeBoolsCondBlock on GTF_UNSIGNED inputs

概要

JIT最適化「optOptimizeBoolsCondBlock」が符号なし整数型(GTF_UNSIGNED)の入力で不正な結果を生成する問題を修正します。.NET 8/9からの回帰で、顧客のアプリに影響を及ぼしていました。修正は該当条件での最適化をスキップすることで、安全性を優先しています。

変更内容

  • src/coreclr/jit/optimizebools.cpp: optOptimizeBoolsCondBlock関数に符号なし入力チェックを追加。GTF_UNSIGNEDフラグが設定されている場合は最適化をスキップ(14行追加)
  • Runtime_128895.cs: 回帰テストケースを追加。符号なし整数の条件判定を含むテストコード
  • Runtime_128895.csproj: テストプロジェクト設定ファイル

パフォーマンスへの影響

影響なし(または軽微)。最適化が無効化される特定のパターンに限定されるため、全体的なパフォーマンス影響は最小限。

関連Issue

#128928(本体修正のオリジナルPR)、#128895(顧客報告)、#78786(導入元)

その他

  • リスク評価:低い(最適化の無効化のため)
  • 顧客がローカル環境で修正を検証済み
  • SPMIテストで差異なし
  • release/10.0ブランチへのバックポート対応

#128709 [clr-interp] Fix GC liveness reporting stale data for a var, before it is actually set

概要

CLRインタプリタのGC生存性レポート(liveness reporting)を修正し、ローカル変数が実際に設定を完了するまで生存状態にならないようにしました。これにより、未初期化のスタック領域が誤ってGCルートとして報告されるのを防ぎます。

修正前:変数の生存性は値を設定する命令の開始位置から開始され、命令実行中でも変数が活きているものとして見なされていました。
修正後:変数の生存性は値を設定する命令の終了位置から開始され、命令完全実行後のみ活きているものとして報告されます。

変更内容

src/coreclr/interpreter/compiler.cpp

  • 非グローバル変数の生存範囲の開始位置を定義命令より後ろに移動
  • 設定されているが後続で使用されない変数については、長さゼロの生存範囲をスキップ
  • インタプリタGC診断ダンプ出力のフォーマットを16進数オフセットに更新

パフォーマンスへの影響

影響なし。本修正はGC生存性レポートの正確性向上に関するもので、パフォーマンス特性に変化なし。

関連Issue

#128709
LibraryImportGenerator.UnitTests.IncrementalGenerationTests.GeneratorRun_WithNewCompilation_DoesNotKeepOldCompilationAliveテストの修正

その他

  • 本修正はインタプリタレイヤーの正確性向上であり、JITコンパイラレベルの精密さには及びません
  • この単純な修正で実運用では十分に機能すると評価されています

#128619 Reduce contention in UnwindInfoTable seen during high volume LCG method creation

概要

大量のLCG(Lightweight Code Generation)メソッド作成時におけるUnwindInfoTableでのロック競合を削減する最適化です。.NET 10で確認された性能低下(.NET 9比で169%遅化)に対応し、グローバルロックをテーブル単位のロックに変更、ロック取得の条件付き化、バイナリサーチの導入などにより、LCGストレスベンチマーク(300K メソッド)では.NET 10比で44%改善を実現しています。

変更内容

  • LCGMethodResolver: m_DynamicCodePointersに初期ポインタを追加し、ほとんどのケースで不要なチャンク割り当てとロック取得を回避
  • UnwindInfoTable: グローバル公開ロック/保留ロックをテーブル単位のロックに変更(m_publishLock、m_pendingLockを個別管理)
  • 公開ロック競合削減: 全スレッドが公開ロックを取得する必要をなくし、フラッシャースレッドの完了を待つか、フラッシャースレッドに昇格することで競合を軽減
  • パフォーマンス最適化:
    • 保留テーブルのサイズ≤4時はSwapソートを使用
    • エントリ削除をバイナリサーチで実装(線形探索から変更)
    • 登録失敗フラグを追加して不要なロック取得を回避

パフォーマンスへの影響

LCGストレスベンチマーク(300K メソッド):

  • .NET 10: 12.868秒 (.NET 9比+169%)
  • .NET 10 + このPR: 7.177秒 (.NET 10比-44%、.NET 9比+50%)

Original xUnitベンチマーク(30K メソッド):

  • .NET 10: 2.772秒 (.NET 9比+35%)
  • .NET 10 + このPR: 2.181秒 (.NET 10比-21%、.NET 9比+6%)

大規模LCG作成時の競合を大幅に削減しますが、.NET 9比では若干遅化が残存します。

関連Issue

#123124

その他

  • ランタイム内部実装(コンパイラ/GC層)の変更であり、公開APIへの影響はなし
  • 破壊的変更なし
  • Copilotレビュー時にRtlAddGrowableFunctionTable失敗時のm_registrationFailedフラグ更新漏れ懸念が指摘されていますが、PRの最終状態での対応については提供情報から確認不可

#128515 JIT: Merge all RETURN/THROW blocks

概要

JITコンパイラのRETURN/THROW ブロックマージ処理を修正しました。tailMergePreds(nullptr)が一度だけ呼び出されていましたが、複数のセットを処理するために繰り返し呼び出す必要があるという問題を修正しています。

変更内容

  • src/coreclr/jit/fgopt.cpp: tailMergePreds(nullptr)の呼び出しロジックを修正(+14/-6)
  • src/coreclr/jit/jitstd/vector.h: ヘッダーファイルの軽微な追加(+2/-0)

パフォーマンスへの影響

影響なし

関連Issue

#128514

その他

JITの最適化パス内部での修正であり、公開APIへの影響はありません。


#127439 JIT: coalesce constant-indexed bounds checks within a block

概要

JIT コンパイラに新しい最適化フェーズ optBoundsCheckCoalesce を追加します。このフェーズはアサーション伝播の前に実行され、同じブロック内で同じ長さVNを持つ定数インデックスの境界チェックをマージしています。

例:a[0] + a[1] + a[2] + a[3] では、最初のチェックのインデックスを3に書き換え、残りの3つのチェックを「範囲内」としてマークすることで、アサーション伝播時に削除されるようにします。

変更内容

  • src/coreclr/jit/compphases.h: 新しいフェーズ PHASE_BOUNDS_CHECK_COALESCE を登録
  • src/coreclr/jit/compiler.h: Compiler::optBoundsCheckCoalesce() メソッドを宣言
  • src/coreclr/jit/compiler.cpp: 新しいフェーズをアサーション伝播の直前に実行するよう統合
  • src/coreclr/jit/boundscheckcoalesce.cpp: ブロック局所の定数インデックス境界チェック統合処理を実装(273行)
  • src/coreclr/jit/CMakeLists.txt: JIT ビルドに新しい .cpp ファイルを追加
  • テストファイル: 境界チェック削減の機能テストを追加

パフォーマンスへの影響

内部実装の最適化であり、ランタイム・コンパイル時に以下の利点が期待されます:

  • 同じブロック内の冗長な境界チェックを削減することにより、生成コードサイズとアサーション伝播処理の負荷を軽減
  • 複数インデックスアクセス時の実行時オーバーヘッドを削減

具体的なベンチマーク結果の記載なし。

関連Issue

なし

その他

  • JIT コンパイラの内部最適化フェーズであり、公開APIへの影響なし
  • 破壊的変更なし、既存コードの互換性に影響なし

#118257 Fix DataContractJsonSerializer not passing ISerializationSurrogateProvider to internal serializer

  • 作成者: @Copilot
  • 作成日時: 2025年08月01日 02:07:13(UTC)
  • マージ日時: 2026年06月05日 17:29:11(UTC)
  • ラベル: area-Serialization

概要

DataContractJsonSerializerがSetSerializationSurrogateProvider()で設定されたISerializationSurrogateProviderを内部シリアライザーコンテキストに正しく渡していない問題を修正しました。修正により、DataContractJsonSerializerの動作がDataContractSerializerと一貫するようになります。

変更内容

  • XmlObjectSerializerReadContextComplexJson / XmlObjectSerializerWriteContextComplexJson: ISerializationSurrogateProviderをベースクラスに正しく渡すための新規コンストラクタを追加
  • XmlObjectSerializerReadContextComplex / XmlObjectSerializerWriteContextComplex: ISerializationSurrogateProvider対応の基本実装を追加
  • DataContractJsonSerializer: RootContractプロパティを修正し、サロゲートプロバイダーが存在する場合にGetSurrogatedType()を呼び出すように対応
  • テスト: 新しいテストケース(65行)を追加し、サロゲートプロバイダーメソッドが正しく呼ばれることを検証

パフォーマンスへの影響

影響なし

関連Issue

#100553

その他

  • 既存の共有テストインフラ(SerializationTypes.RuntimeOnly.csのNonSerializablePerson/MyPersonSurrogateProvider)を再利用し、コード重複を削減
  • RootContractプロパティの実装パターンをDataContractSerializerと統一
  • テスト検証用に*WasCalledプロパティをMyPersonSurrogateProviderに追加

目次