Pull Request on 2026年09月25日

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

注意点

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


目次

  1. #134672 Allow whitespace after leading numeric signs and parentheses
  2. #134667 Use shared networking timeout in WebSocket tests
  3. #134648 [perf] Cache validated W3C tracestate per-thread
  4. #134647 [perf] Add fast path for unescaped W3C baggage
  5. #134645 [perf] Avoid boxing TagList in Activity.AddException
  6. #134634 JIT: Preserve SIMD operand order before morph
  7. #134624 JIT: Make multiple try entries in an SCC an implLimitation in fgwasm
  8. #134615 [cDAC] Clear cached contract state on flush
  9. #134613 Fix scheduled WASM extra-platforms job selection
  10. #134609 Disable runtime thread reinitilization check on Apple platforms
  11. #134596 [release/11.0] Fix concurrent Unix named mutex creation
  12. #134593 [release/11.0] Use streaming serialization for JSONL entries
  13. #134590 SPMI: Add -f as an alias for -filter in superpmi.py
  14. #134560 JIT: Track AVX state from register-producing widths
  15. #134530 Avoid repeated SIMD mask proof traversal in value numbering
  16. #134499 Reject truncated stored ZIP entry reads
  17. #134497 [wasm][R2R] Root interpreter thunks for closed static delegate targets
  18. #134490 JIT: Improve Wasm PEP calls
  19. #134426 Use MoveToImmutable for ImmutableArray<T>.Builder in ILCompiler.Compiler
  20. #134387 JIT: Guard comma throw propagation types
  21. #134228 [Tests] Add deterministic InProc Crash Reporter tests
  22. #134117 Reduce ifdefs in the shared RuntimeCustomAttributeData.cs
  23. #134108 [wasm][R2R] Fix closed static delegate struct returns
  24. #134027 Share CoreCLR RuntimeParameterInfo with NativeAOT
  25. #133934 Simplify floating-point integer classification
  26. #133304 Implicit byref arguments are never on the GC heap
  27. #132721 Interpreter block-count PGO for WebAssembly CoreCLR

#134672 Allow whitespace after leading numeric signs and parentheses

概要

NumberStyles.AllowLeadingWhiteが設定されているときに、先頭の符号または開き括弧の直後のホワイトスペースを許可する機能を実装しました。これにより、末尾のホワイトスペース処理と一貫性を持たせています。整数パースは高速パスを維持しながら、符号後のホワイトスペースには共有パーサーを使用し、16進浮動小数点パース処理も調整しています。

// 例:AllowLeadingWhiteが設定されている場合
int.Parse("  +  123", NumberStyles.AllowLeadingWhite); // 許可
int.Parse("  (  123", NumberStyles.AllowLeadingWhite); // 許可

変更内容

  • src/libraries/Common/src/System/Number.Parsing.Common.cs: 共有数値パーサーの符号/括弧後のホワイトスペース処理を更新(+3/-3)
  • src/libraries/System.Private.CoreLib/src/System/Globalization/NumberStyles.cs: AllowLeadingWhiteのドキュメント更新(+3/-3)
  • src/libraries/System.Private.CoreLib/src/System/Number.Parsing.cs: 整数パース最適化と符号後のホワイトスペース処理追加(+15/-0)
  • テストファイル: Int32、Double、Decimal、BigIntegerの回帰テストを追加(計56行追加)
    • 数値型、カスタム符号、括弧、UTF-8、部分パース時の消費長に関するカバレッジを強化

パフォーマンスへの影響

一般的なケースでのJIT回帰は確認されていません。ReadyToRunでint.Parseに先頭ホワイトスペースがある場合、修正前5.9nsから修正後6.4nsへの計測差異がありますが、JIT専用実行では再現せず、コードレイアウトに依存する可能性があります。ベンチマークツール(BenchmarkDotNet)は.NET 11ランタイムで認識不可。

関連Issue

#101873

その他

  • テスト実績:System.Runtime数値型テスト36,311件(失敗0件、スキップ71件)、System.Runtime.Numericsテスト8,635件(失敗0件)
  • 修正前では11件のInt32回帰テストケースが失敗し、修正後に合格
  • AllowLeadingWhiteを設定しない場合、該当入力は従来通り無効

#134667 Use shared networking timeout in WebSocket tests

  • 作成者: @MihaZupan
  • 作成日時: 2026年09月25日 19:01:12(UTC)
  • マージ日時: 2026年09月25日 21:54:23(UTC)
  • ラベル: area-System.Net

概要

WebSocketテストのタイムアウト設定を改善するPRです。複数のテストが独立した短いタイムアウト期限(5秒)を使用していたため、遅いCI環境でテストが失敗していました。共有されているネットワーク用タイムアウト定数TestHelper.PassingTestTimeout(60秒)に統一することで、CI環境での信頼性を向上させます。

変更内容

  • ClientWebSocketTestBase.cs: タイムアウト設定をTestHelper.PassingTestTimeoutに変更
  • WebSocketCloseTests.cs, WebSocketDeflateTests.cs, WebSocketKeepAliveTests.cs, WebSocketReceiveErrorMessageTests.cs: 各テストファイルのタイムアウト設定をTestHelper.PassingTestTimeoutに統一
  • WebSocketTests.cs: 複数箇所のタイムアウト設定を統一
  • System.Net.WebSockets.Tests.csproj: テストプロジェクト設定を更新

パフォーマンスへの影響

影響なし(テストの安定性向上のための変更であり、実行時パフォーマンスへの直接的な影響はありません)

関連Issue

#134569

その他

  • テスト環境における信頼性向上が目的です
  • GitHub Copilotで作成されたPRです

#134648 [perf] Cache validated W3C tracestate per-thread

概要

ValidateTraceStateメソッドが毎回W3C tracestateを再解析していた問題を解決します。単一の受信リクエストから複数の送信呼び出しが発生する場合、同じ値に対して何度も同じ解析処理が繰り返されていました。本変更では、スレッドローカルなキャッシュを追加し、前回の呼び出し時の入出力ペアを保持することで、値が変わっていない場合の再解析をスキップします。

変更内容

  • W3CPropagator.cs: スレッドローカルなtracestate検証キャッシュを追加
    • 前回の入力値と検証済み出力値をスレッドごとにキャッシュ
    • ValidateTraceState呼び出し時に入力値がキャッシュと一致する場合、再解析をスキップ

パフォーマンスへの影響

大幅な改善が確認されています:

  • 単一スレッド、同じ値の繰り返し: 163.0 ns → 28.4 ns(82.6%削減、メモリ割り当てなし)
  • マルチスレッド環境での実測値:
    • 8スレッド、burst=10: 86.1 ns → 168.5 ns(キャッシュミスが増加する場合もあり)
    • 16スレッド、burst=10: 353.9 ns → 273.4 ns(22.7%改善)
  • メモリ割り当てが削減される場合がある

スレッドプール環境での典型的なサーバーワークロード(複数の異なるリクエストをスレッド再利用で処理)では、バースト内での同一値の繰り返しに対して効果的です。

関連Issue

なし

その他

  • 内部実装変更: System.Diagnosticsライブラリの内部最適化で、公開APIの変更なし
  • 互換性: 検証動作は変わらず、入出力の結果は同一
  • Copilotレビューコメント: スレッドローカルフィールドの配置が他のフィールド宣言より後ろにあるため、レポジトリのコーディング規約に従いフィールドセクションに移動することが推奨されています

#134647 [perf] Add fast path for unescaped W3C baggage

概要

W3C baggage値のデコード処理において、パーセント符号化を必要としない一般的なASCII値に対する高速パスを追加しました。EncodeBaggageValue()をミラーする形で実装し、エスケープされていない値はValueStringBuilderを使用せず直接返すことで、メモリ割り当てを回避しながもパフォーマンスを向上させています。

変更内容

  • src/libraries/System.Diagnostics.DiagnosticSource/src/System/Diagnostics/W3CPropagator.cs: W3C baggage値デコード処理に高速パスを追加。エスケープされていないASCII値は直接返却、エスケープまたは非ASCII値は既存のデコード処理を使用。

パフォーマンスへの影響

改善あり(限定的):

  • 一般的なケース(エスケープなしのbaggage): 約9%高速化(160ns → 145ns)
  • エスケープあるケース(稀): ノイズ範囲内(-4%~+3%、以前は一貫して+5%低下)
  • メモリ割り当て: 両ケースで変化なし(文字列生成は必須)

ベンチマーク結果より、平均的なユースケースの高速化が確認されており、エスケープケースでも性能低下が解消されています。

関連Issue

なし

その他

  • Copilot レビューで高速パスの二重スキャン問題が指摘されましたが、後続のレビューで解決済みです。
  • 既存の機能カバレッジが適用され、動作の互換性が保証されています。
  • ランタイムライブラリ(System.Diagnostics.DiagnosticSource)の内部実装変更で、公開APIへの影響はありません。

#134645 [perf] Avoid boxing TagList in Activity.AddException

概要

Activity.AddException()メソッドでのTagListのボックス化を回避するため、span ベースの高速パスを追加しました。この最適化により、メモリ割り当てと実行時間が削減されます。

変更内容

  • Activity.cs: TagsLinkedListにspan ベースのコンストラクタを追加し、タグスパンから直接リンクドリスト構造を構築可能に
  • ActivityEvent.cs: .NET環境でspan ベースのタグコピーパスを選択するロジックを追加(既存のフォールバックは保持)

パフォーマンスへの影響

ベンチマーク結果(BenchmarkDotNet、.NET 11.0 RC.1):

  • 実行時間: 3.848 µs → 3.712 µs(-3.5%改善)
  • メモリ割り当て: 4.01 KB → 3.69 KB(-320 B、-8.0%削減)
  • Gen0ガベージコレクション削減(0.3204 → 0.2975)

関連Issue

なし

その他

  • 既存テストに対応し、タグの順序と動作を保持
  • クロスターゲット互換性を維持(.NET以外の環境でもフォールバック動作)
  • 内部実装の最適化で、公開API互換性への影響なし

#134634 JIT: Preserve SIMD operand order before morph

概要

SIMDのConcatUpperUpperと可変インデックスシャッフル生成時にオペランドの順序を入れ替える処理で、GTF_REVERSE_OPSフラグがmorph中のソース評価順序を保持していない問題を修正します。gtPrepareOperandsForReorderingを使用してオペランドを一時変数とGT_COMMAで順序付けし、評価順序の変更が観測可能な場合のみ実行します。既存のSIMD命令形式を維持し、HWイントリンシクがreverse フラグなしでmorphに到達することをアサートで確認します。

変更内容

  • src/coreclr/jit/gentree.cpp: SIMDオペランド再順序化時にgtPrepareOperandsForReorderingで一時変数とGT_COMMAを使用してオペランドを序列化。morph時点でHWイントリンシクのreverse フラグ不在をアサート。
  • src/tests/JIT/Regression_ro_2/Runtime_134334.cs: concat および shuffle の評価順序に関する回帰テストを追加。

パフォーマンスへの影響

既存のSIMD命令形式を保持。遅延シャッフルコード生成は256ビット・512ビットケースで reverse フラグ実装と同一の命令を生成(測定済み)。

関連Issue

#134334
#134464

その他

  • x64、x86、ARM64 Debug JIT ビルドで検証。JIT フォーマット検証実施。回帰テスト実行:MinOpts、AVX2 無効化、HWイントリンシク無効化、JitStress2で正常に動作。フルマージ回帰テスト実行結果:423 パス、0 失敗、7 スキップ。
  • Copilot による実装補助。morph 時の HW イントリンシク アサートが remorphed 時に失敗する可能性がある注記あり。

#134624 JIT: Make multiple try entries in an SCC an implLimitation in fgwasm

概要

WebAssembly JIT コンパイル時に、単一の Strongly Connected Component (SCC) 内に複数の try エントリ ヘッダが存在する場合の処理を変更します。従来は NYI (Not Yet Implemented) アサーションで失敗していましたが、実際のコードで発生するため、実装制限として処理するよう修正しました。Microsoft.Diagnostics.NETCore.Client の CrossGen2 コンパイル失敗を解決します。

変更内容

  • src/coreclr/jit/fgwasm.cpp: NYI アサーション assert(NYI_WASM: SCC with multiple try entry headers) を IMPL_LIMITATION(...) に置き換え、複数の try エントリ ヘッダを持つ SCC をサポートされない制御フロー として分類するよう変更(内部実装の変更)

パフォーマンスへの影響

影響なし

関連Issue

#134624

その他

Copilot レビューでは、実装制限処理の追加に加えてコメント文法の修正(subject-verb agreement)も推奨されています。このPRはWebAssemblyターゲットのJITコンパイルパイプライン内の制御フロー解析(fgwasm)に関連する内部実装変更であり、公開APIへの影響はありません。


#134615 [cDAC] Clear cached contract state on flush

概要

cDAC(Common Data Access Component)の契約インスタンスがターゲットの状態変化後に古いポインタを保持する問題を解決します。新たに導入される CachedValue<T> により、遅延初期化された契約状態をキャッシュしながら、Target.Flush 時に確実にリセットします。これにより、実行再開後やターゲットスナップショット変更時にも値が正しく再読み込みされます。

変更内容

  • CachedValue.cs: リセット可能な遅延初期化キャッシュ型 CachedValue<T> を新規実装
  • ComWrappers_1.cs、SyncBlock_1.cs、Thread_1.cs、Object_1.cs: 各契約でターゲット由来のポインタキャッシュを CachedValue<T> に変更し、Flush メソッドでリセット
  • RuntimeTypeSystem_1.cs: キャッシュ機構を CachedValue<T> に統合
  • ExecutionManagerCore.cs: 契約フラッシュの伝播に対応
  • TypeValidation.cs: キャッシュロジックを簡素化・統合
  • テストファイル: 同期テーブル置換、フラッシュ伝播をカバーするテストを追加・拡張(3,158件全合格)

パフォーマンスへの影響

影響なし。既存の1契約ごとのキャッシング効率を維持しながら、状態一貫性を改善します。

関連Issue

なし

その他

Copilot レビューで中程度の指摘あり:基盤クラスの Flush メソッド呼び出しによる処理データキャッシュの無効化に関する確認が必要との指摘。


#134613 Fix scheduled WASM extra-platforms job selection

概要

スケジュール実行される runtime-extra-platforms パイプラインにおいて、WASM関連ジョブの選択ロジックが誤動作していた問題を修正。ネストされたテンプレート展開時に環境変数 variables.isRollingBuild が利用不可のため、WASM固有のブランチが誤って選択されていた。明示的なテンプレートパラメータ isExtraPlatformsBuild と isWasmOnlyBuild を使用することで、正しいジョブ選択を実現。

変更内容

  • eng/pipelines/extra-platforms/runtime-extra-platforms-wasm.yml:
    • パイプラインテンプレートの条件分岐を修正
    • isExtraPlatformsBuild パラメータで extra-platforms ブランチの選択を制御
    • isWasmOnlyBuild パラメータで WASI smoke テストの alwaysRun 動作を制御
    • コメント更新

パフォーマンスへの影響

影響なし(ビルドパイプラインの定義修正のため、実行時パフォーマンスへの直接的な影響はない)

関連Issue

#133068

その他

  • 修正前: 環境変数の展開失敗により、LibraryTestsCoreCLR_R2R と TestWasmReadyToRun ジョブが省略される一方で、不要な SingleThreaded_BuildOnly や非-extra ブラウザ CoreCLR ジョブが追加されていた
  • 修正後: YAML 構文検証、Azure DevOps パイプライン定義のプレビュー確認により、正しいジョブセット(ブラウザ/WASI AOT ジョブ、高リソース AOT ジョブなど)が選択されることを検証
  • スケジュール実行パイプラインの検証は、次回の日次スケジュール実行により完全に確認予定

#134609 Disable runtime thread reinitilization check on Apple platforms

概要

Apple プラットフォーム(macOS/iOS)において、ランタイムのスレッド再初期化チェック(CheckThreadStateNotDestroyed())を無効化する変更です。#134571 で報告された問題に対応しており、Apple プラットフォーム特有のスレッド管理動作に対応します。

変更内容

  • src/coreclr/vm/threads.cpp: Apple プラットフォーム上でスレッド状態破棄チェックをバイパスするコード追加(+4行)
  • src/tests/baseservices/threading/ThreadStateDestroyed/ThreadStateDestroyed.csproj: macOS での関連リグレッション テストを未サポート対象として標記(+2行)

パフォーマンスへの影響

影響なし

関連Issue

#134571

その他

重要な懸念事項: Copilot のコード レビューで以下の指摘があります:

  • 高重要度: Apple プラットフォーム上でチェックをバイパスすることにより、TLS クリーンアップ後もスレッドが attached のままになる可能性があります。スレッドの明示的な attach/detach 処理またはクリーンアップ メカニズムの再設計が必要とされています。
  • 低重要度: ThreadStateDestroyed テストは macOS で除外するのではなく、正常な再エントリの検証を行うテストとして更新すべきとの指摘があります。

#134596 [release/11.0] Fix concurrent Unix named mutex creation

概要

Unix プラットフォームで名前付きミューテックスの同時作成時の競合状態を修正するバックポート(#134111のrelease/11.0へのバックポート)。

initiallyOwned パラメータが true で同じプロセス内の複数のスレッドから新しい名前付きミューテックスを作成する場合、スレッドの一つがミューテックスの所有権なしで進行してしまう問題を修正しました。この問題は Roslyn がマルチスレッド MSBuild タスクへの移行時に発見されました。

変更内容

  • NamedMutex.Unix.cs: Unix プラットフォームでの名前付きミューテックス作成ロジックを修正し、競合状態を排除(+51/-31行)
  • SharedMemoryManager.Unix.cs: 共有メモリ管理の関連ロジックを追加(+5行)
  • MutexTests.cs: 競合状況を確実に再現し検証するユニットテストを追加(+45行)

パフォーマンスへの影響

影響なし

関連Issue

#134111(元のPR) #117635(回帰を引き起こしたPR)

その他

  • 重要度: 低 - 名前付きミューテックスロジックのみに影響し、テストでは失敗時に最初の150イテレーション以内で確実に再現可能
  • 顧客報告: あり
  • 回帰: はい(#117635に由来)
  • テスト戦略: 競合状況をループ内で強制的に多数回実行し確実に検証する設計

#134593 [release/11.0] Use streaming serialization for JSONL entries

概要

JsonSerializer.SerializeAsyncEnumerable メソッドが JSONL エントリの個別要素をシリアライズする際に、ストリーミングシリアライゼーションではなく非ストリーミングシリアライゼーションを使用していた問題を修正します。これにより、大規模要素のバッファリング削減と、ネストされた IAsyncEnumerable などの非同期シリアライゼーションが必要な型のサポートが実現されます。

変更内容

  • JsonSerializer.Write.Stream.cs: Stream への JSONL シリアライゼーションをストリーミングパイプラインを通すようにルーティング
  • JsonSerializer.Write.Pipe.cs: PipeWriter への JSONL エントリシリアライゼーションにストリーミングシリアライゼーションを適用
  • JsonTypeInfoOfT.WriteHelpers.cs: ストリーミング JSONL 要素シリアライゼーション対応、フラッシング・キャンセレーション・バックプレッシャー・ライター所有権を保持
  • JsonTypeInfo.cs: 内部シリアライゼーション契約の更新
  • AsyncEnumerableTests.cs: ネストされた非同期列挙可能型、エラーハンドリング、メタデータ、ソース生成を含むテスト追加

パフォーマンスへの影響

  • 大規模 JSONL 要素ストリーミング時のバッファリング削減により、メモリ効率が向上
  • ストリーミング経由のシリアライゼーションにより、バックプレッシャーが適切に処理される

関連Issue

#134554(オリジナル PR)

その他

  • .NET 11.0 リリースブランチへのバックポート
  • リスク評価:低(ストリーミングシリアライゼーション使用への直接的な変更)
  • テストカバレッジが追加されており、回帰リスクは低い

#134590 SPMI: Add -f as an alias for -filter in superpmi.py

概要

SuperPMI(superpmi.py)のコマンドラインツールに対して、-filterオプションの短縮形として-fエイリアスを追加します。-full_ir_checksオプション追加後に引数解析の曖昧性を解決するための変更です。

変更内容

  • src/coreclr/scripts/superpmi.py: -filterオプションに-fエイリアスを登録。リプレイ関連コマンドとダウンロードコマンドの両方の引数パーサーに対応(+2/-2行)。

パフォーマンスへの影響

影響なし

関連Issue

なし

その他

この変更はコマンドライン引数解析の利便性向上を目的としており、機能的な変更ではありません。-full_ir_checks追加によって生じた引数解析の曖昧性を明示的な引数登録で解決します。


#134560 JIT: Track AVX state from register-producing widths

概要

JIT コンパイラの AVX 状態追跡を改善し、レジスタ生成幅に基づいて正確に AVX 上位状態を追跡するようにしました。これにより不要な vzeroupper 命令を削除しつつ、以前見落とされていたワイドロード、コピー、整数除算の中間値を考慮します。

主な変更:

  • アロケータ挿入のスピル/リロードおよび実際のローカルレジスタコピーを考慮
  • unsafe-widening/extraction コピーを定義されたソース幅または必要な結果幅に縮小し、整数ベクトル除算で XMM ゼロイングを使用
  • 既存の call/prolog/epilog クリアリング ポリシーを保持

変更内容

  • src/coreclr/jit/lsraxarch.cpp: LSRA を通じて SIMD 幅追跡を実装
  • src/coreclr/jit/lsra.cpp: アロケータのリロードおよびコピーアカウンティング追加
  • src/coreclr/jit/hwintrinsiccodegenxarch.cpp: レジスタ移動と除算ゼロイングを最適化
  • src/coreclr/jit/gentree.cpp: アンマネージド呼び出し時の AVX 状態クリア処理
  • src/tests/JIT/opt/Vectorization/AvxState.cs: 機能および逆アセンブリ回帰テスト追加

パフォーマンスへの影響

SuperPMI テスト結果(CI build 1610798):

  • Windows x64: +810 バイト(FullOpts: −1,008 バイト)
  • Linux x64: +15,645 バイト(FullOpts: +11,970 バイト)
  • Windows x86: +11,088 バイト(FullOpts: +8,784 バイト)
  • ARM/ARM64/WASM: アセンブリ差分なし

JIT 実行命令数は xarch で約 0.011–0.031% 増加(コンパイラ作業測定であり、アプリケーションスループット測定ではない)。コードサイズ増加の一部は、正確なワイドプロデューサアカウンティングと保守的なメソッド全体のクリーンアップ配置によるもの。

関連Issue

#134410

その他

レビュー指摘事項:

  • ローカル SIMD ストアの AVX 幅追跡除外が必要(解決済み)
  • Vector256 除算の無効な AVX 幅回避が必要(解決済み)
  • ワイド SIMD 定数のトラッキング漏れ(未解決高優先度)
  • アンマネージド calli vzeroupper 動作のテストカバレッジ改善が必要

このPRは GitHub Copilot 支援で準備されました。Checked x64/全ターゲット JIT ビルド、デフォルト/AVX2/AVX/SSE/ソフトウェア構成での実行および逆アセンブリチェック、レジスタストレスランで検証済み。


#134530 Avoid repeated SIMD mask proof traversal in value numbering

概要

JIT値番号付けにおけるSIMDマスク証明の指数時間探索を最適化しました。短い鎖状の参照グラフで同じマスク値番号が複数の経路から参照される場合、証明プロセスが部分グラフを何度も再探索していた問題を修正します。クエリごとのマスク証明キャッシング、64段階の再帰カットオフ、定数チェックの前処理によって対応。また、操作数のVNペアが一致する場合は組み込み関数の評価結果を再利用します。

変更内容

  • src/coreclr/jit/valuenum.cpp (75行追加, 23行削除): SIMD値マスク証明のキャッシング機構と再帰深度制限の実装、定数チェックの前置、VNペアが一致する場合の評価結果再利用
  • src/coreclr/jit/valuenum.h (31行追加, 4行削除): キャッシュ用のデータ構造とマスク分析・評価ロジック関連の宣言追加
  • src/tests/JIT/Regression_2/Runtime_134487/Runtime_134487.cs (68行): 指数時間探索回避を検証するための25段階のSIMDマスク鎖テスト追加
  • src/tests/JIT/Regression_2/Runtime_134487/Runtime_134487.csproj (12行): テストプロジェクト設定とAVX-512無効化オプション

パフォーマンスへの影響

大幅改善: 25段階マスク鎖のコンパイル時間が5.59秒から約0.29ミリ秒に短縮(約19,000倍高速化)。元の証明処理は52個の関連する一意VNに対して約1億3,400万回の呼び出しを展開していたものが排除されました。VNペア再利用による追加改善は測定ノイズレベルで検出不可でした。

関連Issue

#134487

その他

検証状況: Windows x64 Release/Checked JITでの構築・テスト実施済み。既存のスカラー数学、ビット演算、ハードウェア組み込み関数の値番号付けテストとVector128テストは合格。ただしARM64実行、JIT全テストスイート、SuperPMIによる検証は未実施。

注記: このPRの説明はGitHub Copilotで作成されました。リカーシブなSIMD値マスク証明でのキャッシング戦略がスカラー数学の既存VNPairForFuncパターンに準拠しています。


#134499 Reject truncated stored ZIP entry reads

概要

ZIP アーカイブから読み込む際に、宣言されている非圧縮長に達する前に EOF が発生した場合に InvalidDataException をスローするようにしました。これにより、破損した ZIP エントリの読み込みをより厳密に検証し、データの完全性を確保します。

変更内容

  • ZipCustomStreams.cs: CrcValidatingReadStream で早期 EOF の検出ロジックを追加。宣言された非圧縮長より少ないデータで読み込みが終了した場合、InvalidDataException をスロー
  • zip_InvalidParametersAndStrangeFiles.cs: 破損エントリメタデータのテストカバレッジを更新

パフォーマンスへの影響

影響なし

関連Issue

#134496

その他

Copilot レビューで、同期および非同期パスの両方が対応するコピーメソッドで演習されるべきという推奨があります(軽微:同期 CRC 検証パスをカバーするために同期コピーを使用することが推奨されています)。


#134497 [wasm][R2R] Root interpreter thunks for closed static delegate targets

概要

WebAssemblyのR2R(Ready-to-Run)コンパイルにおいて、クローズド静的デリゲートターゲットへのインタープリタサンク(thunk)ルーティングを修正します。デリゲート呼び出しサイトのインスタンスシグネチャと、バインドされたオブジェクトを明示的な第1パラメータとして受け取る静的ターゲットのシグネチャが異なるため、対応するインタープリタサンクが見つからずに実行時エラーが発生していた問題を解決します。

変更内容

  • WasmLowering.cs: クローズド静的デリゲートシグネチャを正規のWasm低レベル化により構築(シグネチャ文字列の書き換えではなく)
  • CorInfoImpl.ReadyToRun.cs: WasmデリゲートInvoke呼び出し解決時に対応するインタープリタサンクをルーティング
  • WasmArgumentLayoutTests.cs: Nullable構造体、戻りバッファ、ジェネリック文脈引数、非同期継続引数をカバーする10個のコンパイラレイアウトテストケースを追加
  • DelegateInDynamicTests.cs: 状態をキャプチャしNullable引数を受け入れるコンパイル式に関する3ケースのランタイム回帰テストを追加
  • tests.proj: WebAssembly R2R向けMicrosoft.CSharpテストを再有効化

パフォーマンスへの影響

R2R出力サイズに最小限の影響:39イメージの比較で追加31,368バイト(0.0715%)

関連Issue

  • #134497
  • #134108(関連する閉じたスタティックデリゲート戻りバッファアダプタ)
  • #134200(調査中に発見)

その他

留意事項:

  • 本PRはドラフト段階で、ブラウザランタイム全体テストスイートの再実行はまだ実施されていません
  • LambdaTestsの一部でInvokeComputedLambdaにおけるインタープリタメモリアクセス障害が報告されていますが、本PRでは対応していません
  • コンパイラレイアウトテストは77個全てが成功、Microsoft.CSharp.Testsは4,805個全てが成功
  • Copilotレビューで「非Static フラグの削除により必要なサンク がルーティングされない可能性」と「非管理呼び出し規約でのサンク依存関係の保護」に関する指摘あり

#134490 JIT: Improve Wasm PEP calls

概要

WebAssemblyのPEP(Platform Exception Propagation)呼び出し生成を最適化します。マネージドPEP呼び出しターゲットのWasm local を最終PEP引数と間接呼び出しターゲットの両方に再利用することで、shadow stack への不要なアクセスを削除し、コード生成パスを統一しました。System.UInt32.GetHashCodeの例では、メソッドサイズが116バイトから105バイトに削減されています。

変更内容

  • src/coreclr/jit/regallocwasm.cpp: PEP ターゲット一時変数のライフタイム管理を更新
  • src/coreclr/jit/lowerwasm.cpp: 元の制御式を使用してPEP呼び出しを低レベル化し、含まれたABIプレースホルダーを導入
  • src/coreclr/jit/liveness.cpp: liveness 解析を修正(36行追加、9行削除)
  • src/coreclr/jit/lower.cpp: PEP呼び出し低レベル化ロジックを統合(48行追加、34行削除)
  • src/coreclr/jit/compiler.h/cpp: コンパイラ支援フラグを追加

パフォーマンスへの影響

コード サイズ 大幅改善

  • Browser CoreLib SuperPMI測定(28,985コンテキスト):
    • ベースライン:9,973,415バイト
    • 変更後:9,746,072バイト
    • 削減率:-227,343バイト(-2.2795%)
  • 16,849メソッドが改善、9メソッドが若干増加、12,127メソッドは変化なし
  • shadow stack へのメモリアクセス削減により、実行時オーバーヘッドも軽減

関連Issue

#134450

その他

テスト済み項目:

  • Browser/Wasm ネイティブライブラリ、CoreCLR ランタイム、cross-JITおよび CoreLib ビルド
  • Browser CoreLib SuperPMI リプレイ:28,985/28,985コンテキスト成功
  • ノード実行テスト(新規構築のハッシュマッチ Checked ランタイム使用)

本PRは#134450で報告された非効率なPEP呼び出しシーケンスの改善に焦点を当てており、同Issue で議論されている他の問題への対処は意図的に除外されています。


#134426 Use MoveToImmutable for ImmutableArray<T>.Builder in ILCompiler.Compiler

概要

ILCompiler.CompilerにおけるImmutableArray<T>.Builderの使用パターンを最適化するPRです。ToImmutable/ToImmutableArrayからMoveToImmutableへの切り替えと、ビルダーに初期容量を指定することで、バッキング配列の再割り当てとImmutableArray<T>作成時の余分なコピーを削減します。また、ReflectionMethodBodyScannerのLINQ Skip(1)をCollectionsMarshal.AsSpanとSliceで置き換えます。

変更内容

  • AttributeDataFlow.cs: ToImmutableArrayをMoveToImmutableに変更
  • MethodProxy.cs (NativeAOT/illink共通): ToImmutableArrayをMoveToImmutableに変更
  • TypeProxy.cs (NativeAOT/illink共通): ToImmutableArrayをMoveToImmutableに変更
  • TrimAnalysisMethodCallPattern.cs (NativeAOT/illink共通): 初期容量を指定した上でToImmutableArrayをMoveToImmutableに変更
  • ReflectionMethodBodyScanner.cs (NativeAOT/illink共通): LINQ Skip(1)をCollectionsMarshal.AsSpan(...).Slice(1)に置き換え

パフォーマンスへの影響

小幅な改善。以下の不要な割り当てとコピーを削減:

  • ビルダー成長時のバッキング配列再割り当て(初期容量指定により回避)
  • ImmutableArray<T>作成時の余分なコピー(MoveToImmutable使用により回避)
  • Skip(1)による列挙型割り当て(Span Sliceにより削減)

具体的なベンチマーク数値は提供されていません。

関連Issue

なし

その他

  • 変更は内部実装(NativeAOT AoTコンパイラおよびILLinkerのデータフロー解析)に限定されており、公開APIへの影響なし
  • 互換性への影響なし
  • NativeAOT smoketestsおよび複数のILCompilerテストスイート(Trimming.Tests、TypeSystem.Tests、DependencyAnalysisFramework.Tests)でローカル検証済み
  • illink側の同等ファイルも同時に更新されています

#134387 JIT: Guard comma throw propagation types

概要

JITのコンマ・スロー伝播(comma throw propagation)機能が、無効な構造体型のゼロ定数を生成する問題を修正しました。ゼロ定数型の検証を集約し、サポートされていない親型に対してはこの伝播をスキップするよう改善されています。

変更内容

  • src/coreclr/jit/morph.cpp: コンマ・スロー伝播にガード条件を追加し、サポートされていない型に対する伝播を防止(+12/-3)
  • src/coreclr/jit/gentree.h: 型チェックヘルパーを宣言
  • src/coreclr/jit/compiler.hpp: サポート対象型制約を実装
  • 回帰テスト: Runtime_133862.cs で FullOpts とティアリング無効化構成での回帰テスト追加(+29)

パフォーマンスへの影響

影響なし

関連Issue

#133862

その他

JITコンパイラの内部実装(morph.cpp)に対する変更です。無効な構造体型の定数生成を事前に検出することで、後続のコード生成段階での不正な挙動を防止します。


#134228 [Tests] Add deterministic InProc Crash Reporter tests

概要

CoreCLRのインプロセスクラッシュレポーターに対する決定論的なコンポーネントテストスイートを追加します。マネージドハーネスとネイティブドライバ(PAL/レポーター機能をリンク)を組み合わせ、シグナルパス報告とオンデマンド報告の両形式を検証します。Unix、Android、Apple Mobileプラットフォーム向けのテスト(RichSigsegv、Abort、StackOverflow、ConsoleOnly、OnDemand)で、JSON出力、テキスト出力、並行リクエスト処理、失敗復旧を網羅的にテストします。

変更内容

  • ネイティブテストドライバ (inproccrashreport_test_driver.cpp, CMakeLists.txt):PALをリンクした合成レポーター実装で固定のスレッド/スタック/レジスタデータを提供
  • マネージドハーネス (Program.cs):レポート内容の検証、JSON/テキスト形式の出力確認、エラーハンドリングのテスト
  • プラットフォーム統合:
    • Unix:標準的なテスト発見
    • Android:APKパッケージング、ログ出力キャプチャ用のリンカーラッピング(android_log_interpose.c/h)
    • iOS/macOS:XHarness統合、AppleAppBuilderサイン
  • CI連携 (sendtohelix-mobile.targets, tests.proj):Helixアーティファクト収集、モバイル失敗ログ取得を設定
  • テストシナリオ:
    • RichSigsegv:マネージド/ネイティブフレーム混在、スレッド3個
    • Abort:ネイティブのみのクラッシュスタック
    • StackOverflow:圧縮スタックトレース
    • ConsoleOnly:JSON出力無効化
    • OnDemand:逐次/重複リクエスト、コールバック制御、ネストリクエスト拒否

パフォーマンスへの影響

影響なし(テスト追加のため)

関連Issue

なし

その他

重要な注意事項:

  • minipal依存関係がUnixネイティブテストライブラリに必要です(レビューで指摘)
  • 各テストプロジェクトは独立したプロセスで実行され、レポーターのプロセス単位の状態を分離
  • 並行制御テストは明示的な通知と有界ウェイトで調整し、以下を検証します:
    • オンデマンド報告進行中 → 他のオンデマンドリクエストを拒否
    • オンデマンド進行中 → シグナルパスリクエストは枚挙なし
    • シグナルパス進行中 → オンデマンドリクエストを拒否
  • フォローアップ課題:
    • Appleのアーティファクト取得(JSON/ログ/不完全ファイルのホスト転送)
    • PAL依存関係の共有化・ビルドシステム一貫性
    • 追加コンポーネントテスト(ファイルクリーンアップ、保持制限)
    • 致命的シグナル/GC状態クラッシュの統合テスト

#134117 Reduce ifdefs in the shared RuntimeCustomAttributeData.cs

概要

カスタム属性の取得・解析ロジックをQCustomAttributeListという共有の抽象化で統一し、CoreCLRとNativeAOT実装を分離することで、共有ファイル内の条件付きコンパイル(#ifdef)を削減する変更です。これにより、コードの重複を減らし、保守性を向上させます。

変更内容

  • RuntimeCustomAttributeData.cs(共有): 条件付きコンパイルを大幅削減(207行→35行に圧縮)し、QCustomAttributeList抽象化を活用
  • RuntimeCustomAttributeData.CoreCLR.cs: CoreCLR固有のQCustomAttributeList実装を追加(+62行)
  • RuntimeCustomAttributeData.NativeAot.cs: NativeAOT固有のQCustomAttributeList実装とパーサーロジックを追加(+102行)

パフォーマンスへの影響

影響なし

関連Issue

なし

その他

注意点: Copilot reviewerが指摘した通り、共有ファイルがQCustomAttributeListを参照しますが、Mono実装が未対応です。Mono builds ではQCustomAttributeListが定義されていないため、別途Mono対応が必要になる可能性があります。作成者は実装の簡潔さと保守性のトレードオフを許容しているものの、最終的にはMono側の対応が必須になると考えられます。


#134108 [wasm][R2R] Fix closed static delegate struct returns

概要

WebAssembly ReadyToRun環境において、クローズドスタティックデリゲートが構造体を返す際の問題を修正します。問題の根本原因は、デリゲート呼び出しの引数レイアウト(キャプチャされたターゲットと戻り値バッファ)がWasm ABIの期待する順序と異なり、ポインタ引数としてi32に低下するため型検証は通るものの、引数が暗黙的に入れ替わり、オブジェクト参照を含む構造体が不正な値を返していました。修正では、パラメータを交換する専用のWasm適配器(WasmClosedStaticRetBufThunkNode)をCrossgen2が生成し、ランタイムがキャッシュして使用することで、正しい呼び出し規約を確保します。

変更内容

ランタイム(内部実装):

  • precode_portable.hpp/cpp: ClosedStaticRetBufPortableEntryPointを追加し、対応するPEP前に目標関数の入口点を保存
  • comdelegate.cpp: デリゲート構成時に適配器を選択・生成・キャッシュ。LCG(軽量コード生成)のDynamicMethodDescを動的キャッシュ前に準備
  • fptrstubs.h/cpp: 適配器キャッシュ実装(ターゲットとデリゲートInvokeメソッド単位)
  • loaderallocator.hpp/cpp: 保留中の適配器リストと登録フロー。O(1)フラグにより登録前後を追跡
  • pregeneratedstringthunks.cpp/h: ターゲットメソッドPEPと閉じたスタティック適配器の解決を2段階で実行
  • wasm/helpers.hpp/cpp: Wasm戻り値バッファ分類とthunk検索ヘルパー

Crossgen2(R2R生成):

  • WasmClosedStaticRetBufThunkNode.cs: キャプチャされたターゲットと戻り値バッファパラメータを交換するWasm適配器を生成。物理Wasm署名で共有
  • StringDiscoverableAssemblyStubNode.cs: Wasm署名キー生成ロジック(既存のWasmUnboxingStubNode、WasmVirtualDispatchThunkNodeと共有)
  • DelegateCtorSignature.cs: デリゲートコンストラクタ署名用のthunk依存性ルート化
  • CorInfoImpl.ReadyToRun.cs: 関連署名に対応するR2R-to-interpreter thunkをルート化
  • ReadyToRunCodegenNodeFactory.cs: 生成されたthunkをキャッシュ・ルート化

テスト:

  • WasmInterpreterTransitions.cs: R2R作成・解釈実行・汎用ラッパー・オブジェクト参照返却・LCGリサイクル・物理署名衝突などの回帰カバレッジ(100ケース)
  • DelegateTests.cs: #133618の一時的な隔離を削除し、メタデータ・同等性・オブジェクト参照返却を検証

パフォーマンスへの影響

影響なし。修正は適配器キャッシング機構により正常なクローズドスタティックデリゲート呼び出しパスに追加の検索/


#134027 Share CoreCLR RuntimeParameterInfo with NativeAOT

概要

NativeAOTとCoreClrで重複していたパラメータ情報リフレクション実装を統一し、CoreClrのRuntimeParameterInfoを共有する実装に置き換えるもの。約570行のコードを削減し、NativeAOT固有のメタデータ処理、デフォルト値、修飾型サポートを追加。

変更内容

  • 共有実装の拡張: RuntimeParameterInfo.csにNativeAOT用パスを追加し、メタデータ処理対応
  • NativeAOT固有の実装削除: 従来のパラメータ階層(RuntimeParameterInfo/RuntimeMethodParameterInfo/RuntimeFatMethodParameterInfo/RuntimeThinMethodParameterInfo等)を削除
  • パラメータ構築の統一: メソッド、プロパティ、合成パラメータ構築をCoreClr共有実装に移行
  • 修飾型対応: ModifiedType.NativeAot.csでメタデータなしの修飾型をサポート
  • メタデータハンドリング: RuntimeParameterInfo.NativeAot.csで専用のメタデータ処理を実装

パフォーマンスへの影響

影響なし

関連Issue

  • #134025(テスト失敗報告)
  • #134022(既知バグを意図的に継承)

その他

注意点: このPRは以下の理由から詳細なレビューが必要です。

  • NativeAOTのリフレクション動作を広範に変更
  • #134022の既知バグを意図的に継承
  • 回帰テストが別PRで管理されている

公開APIの破壊的変更は明示されていませんが、リフレクション動作の変更が含まれます。


#133934 Simplify floating-point integer classification

概要

浮動小数点数の整数分類(IsEvenInteger、IsOddInteger)をスカラー・SIMD・JIT実装全体で簡素化し、切り詰め残差比較に置き換えました。非有限入力はNaN残差を生成して偽を返すようになります。またSingle.RootNとDouble.RootNの奇数根における負数のパリティ処理を修正し、ベクトル対数の特殊値マスク処理を更新しました。

変更内容

  • Single.cs/Double.cs: IsEvenInteger/IsOddIntegerを有限チェック・剰余・指数・仮数テストから切り詰め残差比較に置き換え。RootNで整数パリティチェックを採用し、負入力の奇数根バグを修正。
  • VectorMath.cs: ベクトル偶数/奇数アルゴリズムを要素型・幅横断で統合し、可変シフトヘルパーを削除。ベクトルログの複合特殊値マスクを符号なしエンコード範囲比較に置き換え。
  • Vector64/128/256/512.cs: ディスパッチロジックを更新し共有アルゴリズムを適用。
  • Vector.cs: ポータブルベクトル分類を更新。
  • hwintrinsic.cpp/gentree.cpp: JIT下位化で残差IsInteger比較を適用。
  • テストファイル: 境界値・混合レーン分類・RootNリグレッション・ログ特殊ケースをカバー。

パフォーマンスへの影響

大幅な改善:

操作 入力分布 改善前(ns) 改善後(ns) 改善率
double.IsEvenInteger 小値混合 2.69 0.72 73%
double.IsOddInteger 小値混合 3.66 0.84 77%
float.IsOddInteger 小値混合 6.75 0.74 89%
double.IsEvenInteger 大整数 28.18 0.69 97%
double.IsOddInteger 大整数 29.31 0.65 98%

加速化ラッパー: Vector128<float>で51→31バイト、Vector256<double>で54→34バイトに縮小。

関連Issue

#133916

その他

未解決の問題: Copilotレビューが最大有限値のオーバーフロー要因を指摘(高重要度3件)。これらはPR作成者による検証対象外の潜在的回帰です。検証はWindows x64のみ;ARM64・Mono・WASMは未実行。既知のVector256.IsPositive<double> JIT assertion問題が一部テストに影響するも、本変更の焦点テストは合格。1,488固定幅+507ポータブルテストが各構成で合格。


#133304 Implicit byref arguments are never on the GC heap

  • 作成者: @EgorBo
  • 作成日時: 2026年09月05日 14:23:17(UTC)
  • マージ日時: 2026年09月25日 09:04:43(UTC)
  • ラベル: area-CodeGen-coreclr

概要

インプリシット byref 引数(暗黙的に参照渡しされるスタラクト)が確実に GC ヒープ上に存在しないことを保証する変更です。これにより、呼ばれた側がこれらのスタラクトへの書き込みに際してライトバリア(write barrier)の発行をスキップでき、生成されるコード量と実行コストが削減されます。

例えば、16バイトの S16 スタラクトに対する書き込みは、ライトバリア呼び出しなしの直接メモリ書き込みになり、コードサイズが32バイトから19バイトへ削減されます。

struct S16 { public object A; public object B; }

[MethodImpl(MethodImplOptions.NoInlining)]
static void Store(S16 s, object o) { s.A = o; Sink(ref s); }

変更内容

  • JIT コンパイラ: インプリシット byref 引数をヒープ外ストレージとしてマーク(morph.cpp、lclvars.cpp、promotion.cpp)し、ライトバリア不要の最適化を有効化
  • ABI ドキュメント: インプリシット byref ストレージの不変式を明記(clr-abi.md)
  • ReadyToRun バージョン: メジャーバージョン 30 へ昇格(readytorun.h、ModuleHeaders.cs、ModuleHeaders.h)。crossgen2 が今後バリア省略コードを生成するため、旧ランタイムは新しいイメージを拒否する必要があります
  • デバッガ func-eval: 引数を GC 保護されたネイティブメモリへコピー(funceval.cpp)
  • ランタイムアサーション: 呼び出し側でインプリシット byref 引数がヒープ上でないことを検証(callhelpers.cpp、callhelpers.h)

パフォーマンスへの影響

改善あり

  • ライトバリア呼び出しの削減により、コードサイズ削減(実例: 32 → 19バイト)
  • メモリ書き込みの高速化(CORINFO_HELP_CHECKED_ASSIGN_REF 呼び出し廃止)
  • スタック操作(push/pop)の最適化

関連Issue

#133961

その他

  • 互換性: MINIMUM_READYTORUN_MAJOR_VERSION は 26 のまま。既存イメージが暗黙的 byref を転送する場合は引き続きサポート
  • 注記: Copilot レビューで、アーキテクチャドキュメント(WebAssembly など)や自動リグレッション テストの強化が提案されています

#132721 Interpreter block-count PGO for WebAssembly CoreCLR

概要

WebAssemly上のCoreClRインタープリタに対して、ブロックカウントPGO(Profile-Guided Optimization)インストルメンテーションを追加し、EventPipe経由でプロファイルデータを収集できるようにする変更です。シングルスレッドのブラウザ/WASI環境向けで、dotnet-pgoがR2Rプリコンパイル用の.mibcファイルを生成できるようになります。マルチスレッドWASMではこの機能はコンパイルアウトされます。

変更内容

インタープリタ側の変更:

  • 新しいINTOP_PGO_COUNTインタープリタオペコードを追加(シングルスレッドのみ)し、ネイティブuint32_tカウンタをインクリメント
  • InterpCompiler::InstrumentBlockCountsでブロック先頭のみにBasicBlockIntCountプローブを挿入(メソッドエントリと分岐/スイッチ/ループターゲット)
  • DOTNET_InterpPgo環境変数でゲート、DOTNET_InterpPgoMethodsで対象メソッド フィルタリング可能

EventPipe側の変更:

  • EventPipeセッション停止時にJitInstrumentationDataVerboseイベントとして蓄積カウントを出力
  • 新しいep_rt_session_stoppingフックを導入し、セッション停止時にPGOデータをPgoManager::EmitInstrumentationDataToEventPipe()で自動フラッシュ
  • テキストファイルエクスポート(DOTNET_WritePGOData)はシャットダウンパスに限定

JavaScript診断クライアント側の変更:

  • collectPgoTrace() 関数(js://pgo)でトレース開始と10秒後の自動.nettraceダウンロード
  • プロセスごとにワンショット実行(インタープリタカウンタは累積的なため、複数回実行すると重複データとなる)

共有PGO インターフェース:

  • JITとインタープリタが共有するPGO割り当てメソッドをCEECodeGenInfo基底クラスに移行
  • ブラウザ/WASI向けにティアリングゲートを緩和

パフォーマンスへの影響

影響なし。本変更はプロファイルデータ収集に限定されており、ランタイム性能への直接的な低下は確認されていません。ただし、以下の懸念が指摘されています:

  • マルチスレッドビルドでの競合状態: INTOP_PGO_COUNTがマルチスレッド環境で実行される可能性があり、複数ワーカーがカウンタにレースする恐れがあります(符号付き整数のオーバーフロー対応が必要)
  • インタープリタのティアリングゲート緩和により、JITのPGO段階でも非ティアリング対象メソッドの計測が可能になる点

関連Issue

#130524、#130517、#130518

その他

重要な制限事項:

  • メソ

目次