注意点
このページは、dotnet/runtimeリポジトリにマージされたPull Requestを自動的に収集し、その内容をAIが要約した内容を表示しています。そのため、必ずしも正確な要約ではない場合があります。
目次
- #134672 Allow whitespace after leading numeric signs and parentheses
- #134667 Use shared networking timeout in WebSocket tests
- #134648 [perf] Cache validated W3C tracestate per-thread
- #134647 [perf] Add fast path for unescaped W3C baggage
- #134645 [perf] Avoid boxing TagList in Activity.AddException
- #134634 JIT: Preserve SIMD operand order before morph
- #134624 JIT: Make multiple try entries in an SCC an implLimitation in fgwasm
- #134615 [cDAC] Clear cached contract state on flush
- #134613 Fix scheduled WASM extra-platforms job selection
- #134609 Disable runtime thread reinitilization check on Apple platforms
- #134596 [release/11.0] Fix concurrent Unix named mutex creation
- #134593 [release/11.0] Use streaming serialization for JSONL entries
- #134590 SPMI: Add -f as an alias for -filter in superpmi.py
- #134560 JIT: Track AVX state from register-producing widths
- #134530 Avoid repeated SIMD mask proof traversal in value numbering
- #134499 Reject truncated stored ZIP entry reads
- #134497 [wasm][R2R] Root interpreter thunks for closed static delegate targets
- #134490 JIT: Improve Wasm PEP calls
- #134426 Use MoveToImmutable for ImmutableArray<T>.Builder in ILCompiler.Compiler
- #134387 JIT: Guard comma throw propagation types
- #134228 [Tests] Add deterministic InProc Crash Reporter tests
- #134117 Reduce ifdefs in the shared RuntimeCustomAttributeData.cs
- #134108 [wasm][R2R] Fix closed static delegate struct returns
- #134027 Share CoreCLR RuntimeParameterInfo with NativeAOT
- #133934 Simplify floating-point integer classification
- #133304 Implicit byref arguments are never on the GC heap
- #132721 Interpreter block-count PGO for WebAssembly CoreCLR
#134672 Allow whitespace after leading numeric signs and parentheses
- 作成者: @tannergooding
- 作成日時: 2026年09月25日 20:07:03(UTC)
- マージ日時: 2026年09月25日 22:41:23(UTC)
- ラベル: area-System.Numerics
概要
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
その他
- テスト実績: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
その他
- テスト環境における信頼性向上が目的です
- GitHub Copilotで作成されたPRです
#134648 [perf] Cache validated W3C tracestate per-thread
- 作成者: @martincostello
- 作成日時: 2026年09月25日 10:48:55(UTC)
- マージ日時: 2026年09月25日 16:44:52(UTC)
- ラベル: area-System.Diagnostics.Tracing community-contribution
概要
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
- 作成者: @martincostello
- 作成日時: 2026年09月25日 10:18:30(UTC)
- マージ日時: 2026年09月25日 17:09:15(UTC)
- ラベル: area-System.Diagnostics.Tracing community-contribution
概要
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
- 作成者: @martincostello
- 作成日時: 2026年09月25日 10:07:07(UTC)
- マージ日時: 2026年09月25日 16:19:09(UTC)
- ラベル: area-System.Diagnostics.Tracing community-contribution
概要
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
- 作成者: @tannergooding
- 作成日時: 2026年09月25日 02:43:06(UTC)
- マージ日時: 2026年09月25日 15:33:05(UTC)
- ラベル: area-CodeGen-coreclr
概要
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
その他
- 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
- 作成者: @adamperlin
- 作成日時: 2026年09月24日 22:32:17(UTC)
- マージ日時: 2026年09月25日 22:50:39(UTC)
- ラベル: area-CodeGen-coreclr
概要
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
その他
Copilot レビューでは、実装制限処理の追加に加えてコメント文法の修正(subject-verb agreement)も推奨されています。このPRはWebAssemblyターゲットのJITコンパイルパイプライン内の制御フロー解析(fgwasm)に関連する内部実装変更であり、公開APIへの影響はありません。
#134615 [cDAC] Clear cached contract state on flush
- 作成者: @max-charlamb
- 作成日時: 2026年09月24日 20:03:50(UTC)
- マージ日時: 2026年09月25日 16:41:18(UTC)
- ラベル: area-Diagnostics-cdac
概要
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
- 作成者: @radekdoulik
- 作成日時: 2026年09月24日 19:33:02(UTC)
- マージ日時: 2026年09月25日 10:27:39(UTC)
- ラベル: arch-wasm area-Infrastructure
概要
スケジュール実行される 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
その他
- 修正前: 環境変数の展開失敗により、
LibraryTestsCoreCLR_R2RとTestWasmReadyToRunジョブが省略される一方で、不要なSingleThreaded_BuildOnlyや非-extra ブラウザ CoreCLR ジョブが追加されていた - 修正後: YAML 構文検証、Azure DevOps パイプライン定義のプレビュー確認により、正しいジョブセット(ブラウザ/WASI AOT ジョブ、高リソース AOT ジョブなど)が選択されることを検証
- スケジュール実行パイプラインの検証は、次回の日次スケジュール実行により完全に確認予定
#134609 Disable runtime thread reinitilization check on Apple platforms
- 作成者: @eduardo-vp
- 作成日時: 2026年09月24日 18:36:57(UTC)
- マージ日時: 2026年09月25日 00:32:44(UTC)
- ラベル: area-System.Threading
概要
Apple プラットフォーム(macOS/iOS)において、ランタイムのスレッド再初期化チェック(CheckThreadStateNotDestroyed())を無効化する変更です。#134571 で報告された問題に対応しており、Apple プラットフォーム特有のスレッド管理動作に対応します。
変更内容
- src/coreclr/vm/threads.cpp: Apple プラットフォーム上でスレッド状態破棄チェックをバイパスするコード追加(+4行)
- src/tests/baseservices/threading/ThreadStateDestroyed/ThreadStateDestroyed.csproj: macOS での関連リグレッション テストを未サポート対象として標記(+2行)
パフォーマンスへの影響
影響なし
関連Issue
その他
重要な懸念事項: Copilot のコード レビューで以下の指摘があります:
- 高重要度: Apple プラットフォーム上でチェックをバイパスすることにより、TLS クリーンアップ後もスレッドが attached のままになる可能性があります。スレッドの明示的な attach/detach 処理またはクリーンアップ メカニズムの再設計が必要とされています。
- 低重要度: ThreadStateDestroyed テストは macOS で除外するのではなく、正常な再エントリの検証を行うテストとして更新すべきとの指摘があります。
#134596 [release/11.0] Fix concurrent Unix named mutex creation
- 作成者: @github-actions[bot]
- 作成日時: 2026年09月24日 16:43:34(UTC)
- マージ日時: 2026年09月25日 18:55:56(UTC)
- ラベル: Servicing-approved area-System.Threading
概要
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
- 作成者: @github-actions[bot]
- 作成日時: 2026年09月24日 15:35:19(UTC)
- マージ日時: 2026年09月25日 17:05:19(UTC)
- ラベル: Servicing-approved area-System.Text.Json
概要
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
- 作成者: @jakobbotsch
- 作成日時: 2026年09月24日 13:39:54(UTC)
- マージ日時: 2026年09月25日 07:56:27(UTC)
- ラベル: area-CodeGen-coreclr
概要
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
- 作成者: @tannergooding
- 作成日時: 2026年09月24日 01:51:45(UTC)
- マージ日時: 2026年09月25日 01:47:26(UTC)
- ラベル: area-CodeGen-coreclr
概要
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
その他
レビュー指摘事項:
- ローカル SIMD ストアの AVX 幅追跡除外が必要(解決済み)
- Vector256 除算の無効な AVX 幅回避が必要(解決済み)
- ワイド SIMD 定数のトラッキング漏れ(未解決高優先度)
- アンマネージド
callivzeroupper 動作のテストカバレッジ改善が必要
このPRは GitHub Copilot 支援で準備されました。Checked x64/全ターゲット JIT ビルド、デフォルト/AVX2/AVX/SSE/ソフトウェア構成での実行および逆アセンブリチェック、レジスタストレスランで検証済み。
#134530 Avoid repeated SIMD mask proof traversal in value numbering
- 作成者: @tannergooding
- 作成日時: 2026年09月23日 15:46:23(UTC)
- マージ日時: 2026年09月25日 01:41:13(UTC)
- ラベル: area-CodeGen-coreclr
概要
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
その他
検証状況: Windows x64 Release/Checked JITでの構築・テスト実施済み。既存のスカラー数学、ビット演算、ハードウェア組み込み関数の値番号付けテストとVector128テストは合格。ただしARM64実行、JIT全テストスイート、SuperPMIによる検証は未実施。
注記: このPRの説明はGitHub Copilotで作成されました。リカーシブなSIMD値マスク証明でのキャッシング戦略がスカラー数学の既存VNPairForFuncパターンに準拠しています。
#134499 Reject truncated stored ZIP entry reads
- 作成者: @Copilot
- 作成日時: 2026年09月23日 07:37:15(UTC)
- マージ日時: 2026年09月25日 07:56:11(UTC)
- ラベル: area-System.IO.Compression
概要
ZIP アーカイブから読み込む際に、宣言されている非圧縮長に達する前に EOF が発生した場合に InvalidDataException をスローするようにしました。これにより、破損した ZIP エントリの読み込みをより厳密に検証し、データの完全性を確保します。
変更内容
- ZipCustomStreams.cs:
CrcValidatingReadStreamで早期 EOF の検出ロジックを追加。宣言された非圧縮長より少ないデータで読み込みが終了した場合、InvalidDataExceptionをスロー - zip_InvalidParametersAndStrangeFiles.cs: 破損エントリメタデータのテストカバレッジを更新
パフォーマンスへの影響
影響なし
関連Issue
その他
Copilot レビューで、同期および非同期パスの両方が対応するコピーメソッドで演習されるべきという推奨があります(軽微:同期 CRC 検証パスをカバーするために同期コピーを使用することが推奨されています)。
#134497 [wasm][R2R] Root interpreter thunks for closed static delegate targets
- 作成者: @pavelsavara
- 作成日時: 2026年09月23日 07:12:24(UTC)
- マージ日時: 2026年09月25日 16:07:29(UTC)
- ラベル: arch-wasm area-ReadyToRun
概要
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
その他
留意事項:
- 本PRはドラフト段階で、ブラウザランタイム全体テストスイートの再実行はまだ実施されていません
LambdaTestsの一部でInvokeComputedLambdaにおけるインタープリタメモリアクセス障害が報告されていますが、本PRでは対応していません- コンパイラレイアウトテストは77個全てが成功、Microsoft.CSharp.Testsは4,805個全てが成功
- Copilotレビューで「非Static フラグの削除により必要なサンク がルーティングされない可能性」と「非管理呼び出し規約でのサンク依存関係の保護」に関する指摘あり
#134490 JIT: Improve Wasm PEP calls
- 作成者: @AndyAyersMS
- 作成日時: 2026年09月23日 00:33:43(UTC)
- マージ日時: 2026年09月25日 18:28:00(UTC)
- ラベル: arch-wasm area-CodeGen-coreclr
概要
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
その他
テスト済み項目:
- 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
- 作成者: @prozolic
- 作成日時: 2026年09月22日 15:07:14(UTC)
- マージ日時: 2026年09月25日 21:59:42(UTC)
- ラベル: linkable-framework community-contribution area-Tools-ILLink
概要
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
- 作成者: @AndyAyersMS
- 作成日時: 2026年09月22日 00:44:37(UTC)
- マージ日時: 2026年09月25日 01:33:39(UTC)
- ラベル: area-CodeGen-coreclr
概要
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
その他
JITコンパイラの内部実装(morph.cpp)に対する変更です。無効な構造体型の定数生成を事前に検出することで、後続のコード生成段階での不正な挙動を防止します。
#134228 [Tests] Add deterministic InProc Crash Reporter tests
- 作成者: @mdh1418
- 作成日時: 2026年09月18日 21:54:29(UTC)
- マージ日時: 2026年09月25日 21:13:45(UTC)
- ラベル: area-Diagnostics-coreclr area-Infrastructure
概要
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
- 作成者: @MichalStrehovsky
- 作成日時: 2026年09月17日 02:26:05(UTC)
- マージ日時: 2026年09月25日 06:33:50(UTC)
- ラベル: area-System.Reflection
概要
カスタム属性の取得・解析ロジックを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
- 作成者: @lewing
- 作成日時: 2026年09月16日 22:06:17(UTC)
- マージ日時: 2026年09月25日 19:44:59(UTC)
- ラベル: arch-wasm area-ReadyToRun
概要
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
- 作成者: @MichalStrehovsky
- 作成日時: 2026年09月16日 04:15:52(UTC)
- マージ日時: 2026年09月25日 02:14:23(UTC)
- ラベル: area-NativeAOT-coreclr
概要
NativeAOTとCoreClrで重複していたパラメータ情報リフレクション実装を統一し、CoreClrのRuntimeParameterInfoを共有する実装に置き換えるもの。約570行のコードを削減し、NativeAOT固有のメタデータ処理、デフォルト値、修飾型サポートを追加。
変更内容
- 共有実装の拡張:
RuntimeParameterInfo.csにNativeAOT用パスを追加し、メタデータ処理対応 - NativeAOT固有の実装削除: 従来のパラメータ階層(
RuntimeParameterInfo/RuntimeMethodParameterInfo/RuntimeFatMethodParameterInfo/RuntimeThinMethodParameterInfo等)を削除 - パラメータ構築の統一: メソッド、プロパティ、合成パラメータ構築をCoreClr共有実装に移行
- 修飾型対応:
ModifiedType.NativeAot.csでメタデータなしの修飾型をサポート - メタデータハンドリング:
RuntimeParameterInfo.NativeAot.csで専用のメタデータ処理を実装
パフォーマンスへの影響
影響なし
関連Issue
その他
注意点: このPRは以下の理由から詳細なレビューが必要です。
- NativeAOTのリフレクション動作を広範に変更
- #134022の既知バグを意図的に継承
- 回帰テストが別PRで管理されている
公開APIの破壊的変更は明示されていませんが、リフレクション動作の変更が含まれます。
#133934 Simplify floating-point integer classification
- 作成者: @tannergooding
- 作成日時: 2026年09月15日 06:24:51(UTC)
- マージ日時: 2026年09月25日 20:30:54(UTC)
- ラベル: area-System.Numerics
概要
浮動小数点数の整数分類(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
その他
未解決の問題: 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
その他
- 互換性:
MINIMUM_READYTORUN_MAJOR_VERSIONは 26 のまま。既存イメージが暗黙的 byref を転送する場合は引き続きサポート - 注記: Copilot レビューで、アーキテクチャドキュメント(WebAssembly など)や自動リグレッション テストの強化が提案されています
#132721 Interpreter block-count PGO for WebAssembly CoreCLR
- 作成者: @pavelsavara
- 作成日時: 2026年08月24日 22:35:28(UTC)
- マージ日時: 2026年09月25日 06:36:10(UTC)
- ラベル: arch-wasm area-VM-coreclr os-browser
概要
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
その他
重要な制限事項:
- メソ