Pull Request on 2026年09月01日

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

注意点

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


目次

  1. #133016 [release/11.0] Preserve side effects in SIMD classification helpers
  2. #133014 JIT: Fix Crossgen2 assertion for non-inlineable tail-call GDV
  3. #133004 [release/11.0] Support nested closed hierarchy inference in System.Text.Json
  4. #132989 Move Attribute.CoreCLR.cs to Attribute.cs
  5. #132986 JIT: update impFixupStructReturnType to handle GT_RET_EXPR
  6. #132973 [GC] Preserve workstation GC diagnostic data in heap dumps
  7. #132972 Support nested closed hierarchy inference in System.Text.Json
  8. #132969 Restore current task tracking for runtime async dispatch
  9. #132959 [release/8.0-staging] Update dependencies from dotnet/xharness
  10. #132872 [release/9.0-staging] Update dependencies from dotnet/arcade
  11. #132852 Fix Microsoft.CSharp dynamic code annotations
  12. #132849 JIT: check operand def chains for overflow in RangeCheck::ComputeDoesOverflow
  13. #132821 Share Attribute implementation with NativeAOT
  14. #132757 Use lock-free reads for ETW rundown versions
  15. #132709 Optimize representation-independent BigInteger arithmetic
  16. #132631 [release/10.0] JIT: fix switch peeling stealing the wrong operand of its compare
  17. #132629 [release/10.0] JIT: don't use a jump-threaded block's sharpened predicate for dominator-based inference
  18. #132628 [release/10.0] JIT: only imply non-null assertions from exact-type assertions
  19. #132592 Preserve information necessary to validate otherwise unused interface constraints in MakeGeneric
  20. #132481 Avoid an allocation on every GetOrCreateComInterfaceForObject call
  21. #132375 Don't require GDV targets to be inlineable
  22. #130849 Add DependencyAnalysisFramework tests from CoreRT repo

#133016 [release/11.0] Preserve side effects in SIMD classification helpers

概要

SIMD分類ヘルパー(IsIntegralType()など)が定数に最適化される際に、オペランドの副作用(例外を含む)が削除されてしまう問題を修正します。JITがgtWrapWithSideEffectsヘルパーを使用して副作用を保持するようにしました。この修正により、コンパイル段階(tier)に依存した動作の差異が解消されます。

変更内容

  • src/coreclr/jit/gentree.cpp: 9つのSIMD分類操作で定数畳み込み時にオペランドの副作用を保持するよう修正。gtWrapWithSideEffects(..., op1, GTF_ALL_EFFECT)でラップして副作用を維持
  • src/tests/JIT/Regression/JitBlue/Runtime_132902/Runtime_132902.cs: 9つの分類操作全てにおいて例外が最適化されないことを検証する新規リグレッションテスト(90行)
  • src/tests/JIT/Regression/Regression_ro_2.csproj: 新規リグレッションテストをプロジェクトに統合

パフォーマンスへの影響

影響なし。副作用が実際に存在する場合のみ追加のコード生成が発生し、定数畳み込みによる最適化は継続して機能します。

関連Issue

#132902、#132921(mainのPR)

その他

  • リスク評価: 低。既存の最適化パスに対する変更のみで、確立されたヘルパー関数を使用しています
  • テスト状況: チェック済みCoreClr、9つのRuntime_132902ケースを含む優先度1の回帰テストが全て合格。jit-format検証も完了
  • 互換性: 破壊的変更なし。.NET 11への既知の回帰なし
  • バージョン: .NET 9以降ではNuGetパッケージの手動バージョン管理が不要

#133014 JIT: Fix Crossgen2 assertion for non-inlineable tail-call GDV

  • 作成者: @EgorBo
  • 作成日時: 2026年09月01日 13:26:15(UTC)
  • マージ日時: 2026年09月01日 14:01:11(UTC)
  • ラベル: area-CodeGen-coreclr

概要

Checked CoreCLR builds での Crossgen2 実行時に JIT アサーション失敗が発生していた問題を修正。非インライン化可能な Guarded Devirtualization (GDV) 候補がテール呼び出し位置にある場合、それらを保持しないようにすることで、GDV 展開時のブロック形状の変形によるテール呼び出し不変式の違反を回避します。

変更内容

  • src/coreclr/jit/importercalls.cpp: canKeepNonInlineableGdvCandidate() 関数を修正し、GenTreeCall::CanTailCall() が true(明示的テール呼び出しプレフィックスまたは暗黙的テール呼び出し候補の両方)の場合はバイアウトするようにしました。この変更により、テール呼び出し位置にある非インライン化可能な GDV 候補は保持されず、後続の GDV 展開によるテール呼び出し不変式の違反を防ぎます。

パフォーマンスへの影響

影響なし

関連Issue

#132375

その他

本修正は #132375 の変更により導入された回帰に対応するもの。インライン化可能な暗黙的テール呼び出し GDV は影響を受けません。より保守的でない実装も可能ですが、GDV 展開コード側の変更が必要になります(最低限、ブロック内のテール呼び出し標識とフロー形状を適切に設定する必要があります)。


#133004 [release/11.0] Support nested closed hierarchy inference in System.Text.Json

概要

System.Text.Jsonの閉じた型階層(closed hierarchy)の推論機能を拡張し、ネストされた閉じた階層にも対応させました。これはカスタマーからの報告による機能ギャップで、ネストされた階層にも自然に対応する必要がありました。本変更により、推移的な階層構造での型推論が「そのまま動作する」ようになります。

変更内容

  • System.Text.Json ソースジェネレーター: RoslynExtensions.csで型階層の走査ロジックを拡張(+38/-18行)し、ネストされた閉じた階層の検出に対応
  • JsonPolymorphicAttribute: ドキュメント/属性の追加で、ネストされた階層をサポート(+5/-1行)
  • DefaultJsonTypeInfoResolver.Helpers.cs: ネストされた階層の解決ロジックを追加(+26/-1行)
  • JsonSourceGenerator.Parser.cs: パーサーロジックの微調整(+7/-3行)
  • JsonSourceGenerationOptionsAttribute.cs: オプション属性の拡張(+7行)
  • テスト: 236行の包括的な閉じた型推論テスト、88行のソースジェネレーションテスト、169行の診断テストを新規追加

パフォーマンスへの影響

影響なし。閉じた階層の型走査はアセンブリ内に限定され、コンパイル時に確定可能なため、ランタイムパフォーマンスへの悪影響はありません。

関連Issue

#132972(オリジナルPR)

その他

  • リスク評価:中程度(低い)。推移的な階層構造サポートのための追加コードですが、閉じた階層の制約により走査範囲は限定されます。
  • release/11.0ブランチへのバックポート版です。
  • 互換性への影響:なし(既存機能の自然な拡張)

#132989 Move Attribute.CoreCLR.cs to Attribute.cs

概要

CoreCLR/NativeAOT固有の属性反射ヘルパー実装を統合するため、Attribute.CoreCLR.csの内容を共有のAttribute.csに移行しました。これにより、CoreCLRとNativeAOT間でコード重複を削減し、メンテナンス性を向上させます。

変更内容

  • src/libraries/System.Private.CoreLib/src/System/Attribute.cs: CoreCLR/NativeAOT向けの属性反射ヘルパー(GetCustomAttributes/IsDefinedオーバーロード実装とヘルパーメソッド)を#if !MONOディレクティブ配下に移行(+762行)
  • src/coreclr/System.Private.CoreLib/System.Private.CoreLib.csproj: Attribute.CoreCLR.csのコンパイル指定を削除
  • src/coreclr/System.Private.CoreLib/src/System/Attribute.CoreCLR.cs: 削除(-770行、内容は共有Attribute.csに移行)
  • src/coreclr/nativeaot/System.Private.CoreLib/src/System.Private.CoreLib.csproj: Attribute.CoreCLR.csのコンパイル指定を削除

パフォーマンスへの影響

影響なし

関連Issue

なし

その他

  • 互換性への影響: なし(内部実装の整理で、公開APIは変更なし)
  • MONOランタイム: #if !MONOディレクティブにより、既存のMONO実装は影響を受けません
  • コード重複削減: CoreCLRとNativeAOTで同一の属性反射実装を共有することで、保守性が向上

#132986 JIT: update impFixupStructReturnType to handle GT_RET_EXPR

概要

CoreCLR JITインポーターの構造体戻り値型変更ロジック(impFixupStructReturnType)を拡張し、GT_RET_EXPRプレースホルダーとして到達する戻り値を正しく処理するようにしました。これにより、インライナーの期待値(戻り値バッファ引数の存在)違反を防止し、Unsafe.BitCastシナリオでの不正な動作を修正します。

変更内容

  • src/coreclr/jit/importer.cpp: impFixupStructReturnTypeメソッドを拡張し、戻り値バッファが必要なGT_RET_EXPR(インライン候補呼び出し)を認識して、直接のGT_CALLノードと同様に処理するよう対応。
  • src/tests/JIT/Regression/JitBlue/Runtime_130135/Runtime_130135.cs: Issue #130135の回帰テストを新規追加。Unsafe.BitCast<Vector64<int>, struct>の戻り値・インライニング・戻り値バッファ相互作用をカバー。
  • src/tests/JIT/Regression/Regression_ro_2.csproj: 新規回帰テストをビルドに組み込み。

パフォーマンスへの影響

影響なし

関連Issue

#130135

その他

コンパイラ内部実装(JIT)の修正です。GT_RET_EXPRノードの処理が不完全だったことによる潜在的なバグ(インライニング時の型情報不整合)を解決するもので、公開APIには影響しません。

レビューコメント:テスト内のusing指令の配置がリポジトリの他のJitBlueテストと異なり、namespace内部に記載されているという軽微な形式上の指摘があります。


#132973 [GC] Preserve workstation GC diagnostic data in heap dumps

  • 作成者: @max-charlamb
  • 作成日時: 2026年08月31日 16:59:47(UTC)
  • マージ日時: 2026年09月01日 23:58:12(UTC)
  • ラベル: area-GC-coreclr

概要

ワークステーションGCの診断データをヒープダンプに保存できるよう、GC-DACインターフェースを改善します。card_tableポインタと完全な診断配列(interesting_data_per_heap、compact_reasons_per_heap、expand_mechanisms_per_heap、interesting_mechanism_bits_per_heap)をGcDacVarsに追加し、バージョン管理により下位互換性を維持します。これにより、CDB /mwダンプから!dumpgcdataやcDACでこれらのデータにアクセス可能になります。

変更内容

  • gcinterface.h: GC_INTERFACE_MINOR_VERSIONを9に更新
  • gcinterface.dacvars.def: バージョン5.9のDAC変数定義にcard_tableを追加
  • gc.cpp: PopulateDacVarsをWKS(ワークステーション)ビルドで新しいv9のcard_table DAC変数を設定するよう拡張
  • request.cpp: GC DACマイナーバージョンが9以上の場合、バージョン管理されたcard_tableを使用し、WKSダンプ用のストレージを列挙。フォールバックとしてg_card_tableグローバル変数を使用(古いバージョン対応)

パフォーマンスへの影響

影響なし

関連Issue

なし

その他

互換性への留意点: Copilotレビューで指摘されている通り、PopulateDacVarsは受け取ったminor_version_numberに基づいて条件付きでフィールドを設定しながら、最後に無条件でminor_version_numberを9で上書きする実装になっています。スタンドアロンGCの不一致(新しいGC+古いランタイム)の場合、実際に設定されていないv9フィールドがあっても報告される可能性があり、DACが存在しないフィールドを読み取ろうとする問題が生じる可能性があります。


#132972 Support nested closed hierarchy inference in System.Text.Json

概要

System.Text.Jsonの閉じた型ポリモーフィズム推論を拡張し、InferClosedTypePolymorphismが入れ子になったclosed型の階層を再帰的に展開するようにしました。これにより、ランタイム推論とソースジェネレータ推論の動作が統一され、入れ子になった派生型も適切に登録されます。

変更内容

  • DefaultJsonTypeInfoResolver.Helpers.cs: ランタイム側で入れ子になったclosed型階層を再帰的に展開し、最終的な派生型のみを登録するGetClosedDerivedTypesメソッドを追加
  • RoslynExtensions.cs: ソースジェネレータ側で同様に入れ子になったclosed型を再帰的に展開する処理を実装
  • JsonSourceGenerator.Parser.cs: closed推論が実行されたことを追跡し、ポリモーフィズムオプションの出力判定を改善
  • JsonSerializerOptions.cs・JsonPolymorphicAttribute.cs・JsonSourceGenerationOptionsAttribute.cs: InferClosedTypePolymorphismのXMLドキュメントを更新し、再帰的展開と明示的登録の優先度ルールを文書化
  • テストファイル: 入れ子になったclosed階層、入れ子になったジェネリック、判別子の衝突、アクセス可能性の失敗などのカバレッジを追加

パフォーマンスへの影響

ソースジェネレータ側で潜在的なパフォーマンス課題が指摘されています:

  • 大規模プロジェクトで入れ子になったclosed型が存在する場合、モジュール走査が複数回繰り返される可能性があり、O(N × M)の計算量(N = モジュール内の型数、M = 展開されたclosedノード数)に悪化する可能性
  • ランタイム側も無限再帰防止機構がないため、不正形式のメタデータでスタックオーバーフローが発生する可能性

関連Issue

#132660

その他

  • 変更はrelease/11.0への将来のバックポートを予定している
  • Copilotによるコードレビューで2つの最適化推奨が提示されている:
    1. ランタイム側で訪問済み型を追跡する反復的なトラバーサルへの変更検討
    2. ソースジェネレータ側で事前にモジュール内の型スキャンをキャッシュし、訪問済み集合で重複展開を防ぐ最適化検討

#132969 Restore current task tracking for runtime async dispatch

  • 作成者: @max-charlamb
  • 作成日時: 2026年08月31日 13:43:56(UTC)
  • マージ日時: 2026年09月01日 13:33:00(UTC)
  • ラベル: area-VM-coreclr

概要

非計測パス(non-instrumented path)のDispatchContinuationsでAsyncDispatcherInfo.CurrentTaskの設定を復活させ、ランタイム非同期タスクの継続チェーン分派中に親タスクを追跡可能にします。これにより、診断ツール(クラッシュダンプなど)が確定的に親タスクを見つけられるようになります。

変更内容

  • src/coreclr/System.Private.CoreLib/src/System/Runtime/CompilerServices/AsyncHelpers.CoreCLR.cs: 非計測なDispatchContinuationsパスでasyncDispatcherInfo.CurrentTask = this;を追加し、計測パスの動作と統一化(計測パスはRuntimeAsyncInstrumentationHelpers.ResumeRuntimeAsyncContext経由で設定)

パフォーマンスへの影響

  • 実行時間: 平均でベースラインと比較して1.83%高速化(環境ノイズとして扱うべき、回帰なし)
  • ReadyToRun(R2R)コードサイズ: RuntimeAsyncTask<int>.DispatchContinuationsで7バイト増加(1,488→1,495バイト)
  • 総合評価: 追加のストア命令の低いオーバーヘッドで、パフォーマンス低下は検出されず

関連Issue

#126091(計測/非計測パスの分離)

その他

  • テスト結果: System.Runtime.Tests(77,810件中、失敗0件、スキップ88件)で確認済み
  • 影響範囲: 内部実装(AsyncDispatcherInfoはランタイム内部)。公開APIへの影響なし
  • このアサインメント(CurrentTask設定)は#126091でパスが分離される前に存在していた機能の復活

#132959 [release/8.0-staging] Update dependencies from dotnet/xharness

概要

dotnet/xharnessからの依存関係を更新するPull Request。Microsoft.DotNet.XHarness関連の3つのパッケージを11.0.0-prerelease.26419.1から11.0.0-prerelease.26428.1にアップグレードします。

変更内容

  • .config/dotnet-tools.json: ツール設定の更新(+1/-1)
  • eng/Version.Details.xml: バージョン詳細情報の更新(+6/-6)
    • Microsoft.DotNet.XHarness.CLI
    • Microsoft.DotNet.XHarness.TestRunners.Common
    • Microsoft.DotNet.XHarness.TestRunners.Xunit
  • eng/Versions.props: バージョンプロパティの更新(+3/-3)

パフォーマンスへの影響

影響なし

関連Issue

なし

その他

このは自動化されたdotnet-maestroボットによる依存関係更新PRです。対象ブランチはrelease/8.0-stagingで、xharnessのmainブランチから2026年8月28日のビルド成果物が取り込まれています。


#132872 [release/9.0-staging] Update dependencies from dotnet/arcade

概要

dotnet/arcadeの依存パッケージを9.0.0-beta.26423.5から9.0.0-beta.26431.8(およびMicrosoft.DotNet.XUnitAssertとMicrosoft.DotNet.XUnitConsoleRunnerを2.9.0-beta.26423.5から2.9.0-beta.26431.8)へ更新する自動更新PRです。19個のbuildおよびtestingツールパッケージが更新対象です。

変更内容

  • eng/Version.Details.xml: arcade依存パッケージのバージョン定義を84行更新
  • eng/Versions.props: グローバルバージョンプロパティ(32行)を更新
  • eng/common/Get-GitHubAppToken.ps1: 13行のスクリプト変更
  • global.json: プロジェクト全体の3行を更新
  • eng/common/core-templates/job/onelocbuild.yml: ローカライゼーションビルドテンプレート(14行)を微調整

パフォーマンスへの影響

影響なし

関連Issue

なし

その他

  • このPRはdotnet-maestro[bot]による自動生成で、Maestro Dependency Update Serviceを通じた依存パッケージの自動更新です
  • release/9.0-stagingブランチへの更新で、2026年9月1日時点のarcade build 329601を取り込んでいます
  • XUnitテスティングフレームワーク関連パッケージも含まれており、テスト基盤の改善が期待できます

#132852 Fix Microsoft.CSharp dynamic code annotations

  • 作成者: @eerhardt
  • 作成日時: 2026年08月27日 19:46:05(UTC)
  • マージ日時: 2026年09月01日 17:15:29(UTC)
  • ラベル: area-Microsoft.CSharp

概要

Microsoft.CSharpライブラリのCOM相互運用関連メソッドにRequiresDynamicCode属性を追加し、AOT互換性分析時の警告を解決する変更です。ComObject.RcwToComObjectとComMetaObjectに動的コード要件アノテーションを伝播させ、既存のRequiresUnreferencedCode属性との一貫性を保つことでAOT分析の警告IL3050を排除します。

変更内容

  • ComObject.cs: RcwToComObjectメソッドにRequiresDynamicCode属性を追加
  • ComMetaObject.cs: RcwToComObjectを呼び出すメソッドにRequiresDynamicCode属性を伝播
    • COM バインディング式の構築時に動的コード生成が必要であることを明示

パフォーマンスへの影響

影響なし

関連Issue

なし

その他

  • 変更は属性アノテーションの追加のみで、実装ロジックには影響なし
  • AOT(Ahead-of-Time)コンパイル互換性を向上させる互換性修正
  • Microsoft.CSharpテストスイート全2,648テストが合格

#132849 JIT: check operand def chains for overflow in RangeCheck::ComputeDoesOverflow

  • 作成者: @EgorBo
  • 作成日時: 2026年08月27日 18:52:30(UTC)
  • マージ日時: 2026年09月01日 11:20:07(UTC)
  • ラベル: area-CodeGen-coreclr

概要

JIT range analysis の overflow 検証ロジックを修正します。RangeCheck::ComputeDoesOverflow が operand def chains をチェックする際に、非オーバーフロー演算子(GT_NEG など)のオペランドも再帰的に検証するようにしました。これにより、GetRange による branch folding が unsafe な前提に依存することを防ぎます。

変更内容

  • src/coreclr/jit/rangecheck.cpp: RangeCheck::ComputeDoesOverflow を拡張し、GT_AND、GT_RSH、GT_RSZ、GT_UMOD、GT_NEG のオペランド def chains に対してオーバーフロー検証を再帰的に実施
  • src/tests/JIT/Regression/JitBlue/Runtime_132841/Runtime_132841.cs: Math.Abs folding miscompile シナリオを再現するリグレッションテスト Runtime_132841 を追加
  • src/tests/JIT/Regression/Regression_ro_2.csproj: 新規リグレッションテストをテストプロジェクトに追加

パフォーマンスへの影響

影響なし

関連Issue

#132841

その他

この修正は CoreCLR JIT コンパイラ内部の range analysis ロジック(非公開実装)の改善です。既存の "it never overflows" というコード パスが不完全だったため、より厳密な overflow チェックを実装することで miscompile を防ぎます。


#132821 Share Attribute implementation with NativeAOT

概要

NativeAOT固有のAttribute実装をCoreClRの実装と共有することで、600行以上の重複コードを削除し、ランタイムリフレクションのカスタム属性レイヤーを整合させるリファクタリング。NativeAOT固有のファサード、レガシーAPI集約、ジェネリック検索階層を削除し、両ランタイム間でコード共有を促進します。

変更内容

  • 削除した重複実装

    • Attribute.NativeAot.cs(157行):NativeAOT専用の属性実装
    • LegacyCustomAttributeApis.cs(231行):レガシーカスタム属性API
    • CustomAttributeSearcher.cs(203行)とCustomAttributeInheritanceRules.cs(250行):カスタム属性検索とルール定義
  • NativeAOT共有レイヤーの追加

    • RuntimeCustomAttribute.NativeAot.cs(新規、192行):NativeAOT固有の処理を効率的に実装
  • リフレクションAPIの統一

    • 複数のRuntimeXxxInfoクラス(RuntimeAssemblyInfo、RuntimeEventInfo、RuntimeFieldInfo等)にカスタム属性メソッドを追加
    • BindingFlagSupportクラス群から不要なポリシーコードを削除
  • プロジェクト設定の調整

    • System.Private.CoreLib.csproj:ファイル参照を更新

パフォーマンスへの影響

影響なし(コード共有による保守性向上が主な目的のリファクタリング)

関連Issue

#73356

その他

  • CoreClRとNativeAOT間のコード重複を削減し、保守性を向上させるリファクタリング
  • 公開API層に変更なし(内部実装の整理)
  • 既存の機能動作は維持される

#132757 Use lock-free reads for ETW rundown versions

  • 作成者: @tommcdon
  • 作成日時: 2026年08月25日 18:20:58(UTC)
  • マージ日時: 2026年09月01日 20:31:42(UTC)
  • ラベル: area-VM-coreclr

概要

ETWランダウン処理でCodeVersionManagerロック保持期間を短縮し、ロックフリー読み込みを導入する変更です。従来、JITメソッド列挙とETWイベント発行全体でロックを保持していたため、JITパスをブロックして実行を遅延させていました。本変更により、公開されたネイティブコードバージョン状態のロックフリー読み込みを活用して、ランダウン処理中のロック保持期間を削減し、JIT実行パスの競合を軽減します。

変更内容

  • src/coreclr/vm/eventtrace.cpp: ランダウン処理のロック保持範囲を削減し、CodeVersionManagerロック外での反復処理を実装
  • src/coreclr/vm/codeversion.cpp: ロックフリー読み込みのためのメモリバリアセマンティクス調整(VolatileLoadWithoutBarrierの使用箇所)
  • src/coreclr/vm/method.cpp / method.hpp: ロックフリーアクセス対応の補助メソッド追加

パフォーマンスへの影響

改善: CodeVersionManagerロック保持期間の短縮により、JITコンパイルパスやティアリング更新の実行スループット向上が期待できます。ランダウン処理中の競合削減が主要な利益です。

トレードオフ: 並行ReJITまたはティアリング更新がランダウン中に発生した場合、新規挿入ノードをスキップしたり、コードアドレス検証失敗時にレコードをスキップする可能性があります。ただし、作成者の評価では、グローバルに原子的なランダウムスナップショット保証よりも、ロックフリーランダウンの利益が優先されるとしています。

関連Issue

#102298、#107152で確立された公開バージョン状態とロックフリー読み込み専用ルックアップに基づいています。

その他

Copilotレビューで、weak-memory architectureにおいてVolatileLoadWithoutBarrierが適切な取得セマンティクスを提供していない点が指摘されています。特にm_pFirstVersionNodeの発行時はVolatileStore(リリース)が使用されているため、ロックフリー読み込みの正確な同期にはVolatileLoadの使用が推奨されています。


#132709 Optimize representation-independent BigInteger arithmetic

概要

BigIntegerの演算パフォーマンスを最適化する変更です。構造化されたオペランド(ゼロ詰めの完全なプレフィックス、2の累乗、繰り返しリムブ、スカラー因子3/5/7など)を検出し、専用の高速演算カーネルにディスパッチします。既存の表現は変わらず、共有演算カーネルが追加されています。

特に因子3、5、7の累乗計算で顕著な改善が見られ、3^1025は86.8%高速化、7^1025は89.3%高速化、16,384ビットの末尾ゼロ乗算は97.7%高速化されました。PiDigitsベンチマーク(3,000桁)では36.8%の累積改善を達成しています。

変更内容

  • BigIntegerCalculator.Shared.cs: 繰り返しリムブ、シフトされたストリーム、Mersenne除数、スカラー除算などの共有演算カーネルを追加(+1042行)
  • BigIntegerCalculator.SquMul.cs: 構造化乗算パスの追加と最適化されたディスパッチロジック
  • BigIntegerCalculator.DivRem.cs: 特殊化された除算とMersenne除算パスの実装
  • BigIntegerCalculator.PowTables.cs: 因子3、5、7の厳密に圧縮された累乗テーブル(32ビット・64ビット両対応、JIT最適化で選択)
  • BigIntegerCalculator.PowMod.cs: テーブル駆動の累乗計算の追加
  • BigIntegerCalculator.GcdInv.cs: ゼロ詰めリムブプレフィックス最適化
  • BigIntegerCalculator.ShiftRot.cs: 共有右シフトロジックの移行
  • BigInteger.cs: 最適化された演算ディスパッチの統合(公開API変更なし)
  • BigIntegerPropertyTests.cs: 構造化演算カバレッジの拡張テスト追加

パフォーマンスへの影響

著しい改善(大規模構造化オペランド):

  • 3^1025: -86.8% (1,531.49ns → 202.40ns)
  • 7^1025: -89.3% (2,130.20ns → 228.66ns)
  • 10^1025: -89.8% (2,527.87ns → 258.62ns)
  • 31個の繰り返し-1リムブ: -87.5%
  • Mersenne除算 (B^31 - 1): -89.6%
  • 16,384ビットの末尾ゼロ乗算: -97.7% (24,280.55ns → 563.00ns)

中程度の改善(一般的なサイズ):

  • 3^47: -33.5%, 3^257: -72.0%, 7^257: -71.0%
  • 769ビット ÷ 3: -18.5%, 2,047ビット ÷ 7: -27.5%

エンドツーエンド(PiDigits):

  • 300桁: -22.0% (3.546ms → 2.767ms)
  • 1,000桁: -32.1% (37.017ms → 25.143ms)
  • 3,000桁: -36.8% (354.370ms → 223.798ms)

#132631 [release/10.0] JIT: fix switch peeling stealing the wrong operand of its compare

概要

.NET 10 JITコンパイラのswitch peeling最適化(fgPeelSwitch)における深刻なバグ修正のバックポート。ループ展開されたswitch文の処理時に、compare文がシーケンスされる際にオペランドが入れ替わることで、switch値の代わりに定数を使用してしまい、サイレント誤動作を引き起こしていた問題を解決します。

変更内容

  • src/coreclr/jit/fgopt.cpp: fgPeelSwitch内の処理順序を変更。compare文を作成・シーケンス化する前にswitch値をreattachすることで、オペランド入れ替わりによる誤動作を防止
  • src/tests/JIT/Regression/JitBlue/Runtime_132370/Runtime_132370.cs: ループ展開されたswitch peeling下でのTiered PGO環境でバグを再現する回帰テスト(3成分ベクトルの全ゼロ判定ロジック)
  • src/tests/JIT/Regression/JitBlue/Runtime_132370/Runtime_132370.csproj: テスト用プロジェクトファイル、Tiered PGO環境変数を設定

パフォーマンスへの影響

影響なし。本修正は処理順序の変更のみで、asm差分なし(公開ベンチマーク実施済み)

関連Issue

#132370、#132395

その他

  • 重要度: 高。.NET 10全バージョン(Preview.1〜10.0.11の21リリース全て)で共通の動作エラーが発生。.NET 8・9は影響なし
  • 破壊的変更: なし。純粋なバグ修正
  • テスト: 付属の回帰テストで検証済み。例えば、ベクトル(0, 0, 1)が誤って全ゼロと判定されるケースが修正される

#132629 [release/10.0] JIT: don't use a jump-threaded block's sharpened predicate for dominator-based inference

概要

JIT最適化の不具合を修正するバックポート。RBO(Redundant Branch Optimization)がジャンプスレッドを実行する際、ブロックの述語(predicate)を不正に狭める問題を解決します。この不具合により、最適化されたReleaseビルドでNullReferenceExceptionが発生していました。

変更内容

  • block.h/block.cpp: 新しいフラグ BBF_STALE_PREDICATE を追加(述語が陳腐化したブロックを標記)
  • redundantbranchopts.cpp:
    • optJumpThreadCore でジャンプスレッド後に述語を狭める際、対象ブロックに BBF_STALE_PREDICATE フラグを設定
    • optRedundantBranch で、このフラグが立っているブロックの述語を使用した推論をスキップ
    • optRedundantBranches 終了時にフラグをクリア
  • テストケース追加: Runtime_130700 回帰テストを追加(RBO処理後も正しくNullReferenceExceptionを発生させることを確認)

パフォーマンスへの影響

影響なし。本修正は不正な最適化を防止するため、パフォーマンスに悪影響を与えることはありません。

関連Issue

#130700、#132281

その他

  • 長年存在していた不具合(.NET 10リージョンではない)
  • release/10.0へのバックポートのため、mainブランチとは異なる実装(optRedundantDominatingBranchの処理を省略)
  • 変更範囲が限定的で、RBO最適化の健全性をスキップする機構に限定されているため、リスク低

#132628 [release/10.0] JIT: only imply non-null assertions from exact-type assertions

概要

JITアサーション伝播ロジックのバグを修正しました。optImpliedByTypeOfAssertionsが定数チェックなしに任意のlcl != <const>アサーションを非null アサーションとして扱い、ガード付き仮想化による型アサーションと無関係のアサーションが誤って活性化される結果、正当な比較分岐が到達不可能にされていました。具体的には、ホットループ内のvirtualCall().Equals(typeof(T))で大規模データ構造の列挙時にサイレント データドロップが発生していました。修正は定数値が明確に0であることを確認するチェックを追加することで、有効でないアサーションの伝播を防ぎます。

変更内容

  • src/coreclr/jit/assertionprop.cpp: optImpliedByTypeOfAssertionsメソッドに定数が0であることを確認するチェック(iconVal == 0)を追加。非null アサーションの推定をより厳密に限定(非破壊的変更、条件縮小のみ)
  • src/tests/JIT/Regression/JitBlue/Runtime_132599/: 顧客報告のケースから抽出した30行の回帰テストを追加

パフォーマンスへの影響

影響なし。本修正は無効なアサーション伝播を削除するのみで、パフォーマンス低下のおそれはありません。むしろ、不正な最適化折り畳みが減少するため、動作の正確性が向上します。

関連Issue

#132599、#123856

その他

  • 対象ブランチ: release/10.0限定。mainブランチは#123856でoptImpliedByTypeOfAssertionsが既に削除済みため、同バグは存在していません。
  • リスク評価: 低。修正はアサーション条件を狭めるのみで、有効でないアサーション伝播を排除する性質上、副作用がありません。
  • カスタマー影響: OpenXML大規模ワークシート列挙時に100万行インポート中に黙ってデータドロップが発生していました。チルアップ時のティアード実行で顕在化。回避策はDOTNET_TieredPGO=0またはDOTNET_JitEnableGuardedDevirtualization=0でした。

#132592 Preserve information necessary to validate otherwise unused interface constraints in MakeGeneric

  • 作成者: @Copilot
  • 作成日時: 2026年08月21日 00:11:53(UTC)
  • マージ日時: 2026年09月01日 04:04:38(UTC)
  • ラベル: area-NativeAOT-coreclr

概要

NativeAOT ILCompilerの依存関係分析を更新し、リフレクション駆動のMakeGenericType/MakeGenericMethodでジェネリック制約の検証に必要な情報(メタデータとインターフェースの使用追跡)を保持するようにしました。制約情報が不足していると、制約のTypeRefが解決不可能になる問題を修正します。

変更内容

  • TypeMetadataNode.cs: ジェネリック型パラメータの制約型に対するメタデータ依存関係を追加
  • GenericDefinitionEETypeNode.cs: リフレクション可視のジェネリック・インターフェース定義からInterfaceUseを報告するよう修正
  • HandleCallAction.cs: MakeGeneric*イントリンシック認識時に、インターフェース制約に基づいて依存関係をルート化するロジックを追加
  • テストプロジェクト: 回帰テスト(GitHub_130545)から不要なTestLibrary参照を削除

パフォーマンスへの影響

影響なし。作者のrt-sz測定によると、メタデータ保持やインターフェース使用追跡による出力サイズへの影響は無視できるレベルです。

関連Issue

#130545(関連する回帰テストが参照)

その他

  • 内部実装の変更: NativeAOTコンパイラの依存関係分析エンジン内部の修正で、公開APIへの影響なし
  • レビュー指摘: MakeGenericMethodの場合、不正形式のインスタンス化配列に対しても制約インターフェースが不要にルート化される可能性があり、arity チェック後に移動することで最適化できる余地があります

#132481 Avoid an allocation on every GetOrCreateComInterfaceForObject call

概要

ComWrappers.GetOrCreateComInterfaceForObjectの呼び出しで毎回発生していたヒープ割り当てを削除。ConditionalWeakTable.GetOrAddに渡す状態オブジェクトを匿名型から小さなreadonly structに変更することで、ガベージコレクション圧力とキャッシュミスを削減。

変更内容

  • src/libraries/System.Private.CoreLib/src/System/Runtime/InteropServices/ComWrappers.cs
    • 匿名型new { This = this, flags }を新しいプライベート状態構造体CreateManagedObjectWrapperStateに置き換え
    • GetOrAddのバリュファクトリを新しい状態構造体のメンバー(state.ComWrappers、state.Flags)を使用するように更新
    • ComWrappersインスタンスとCreateComInterfaceFlagsを保持する readonly struct を追加

パフォーマンスへの影響

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

シナリオ 改善効果
ラッパー既存時(8,000個の異なるオブジェクト) −21%速度向上、32B → 0B割り当て削減
ラッパー既存時(同じオブジェクト毎回) −8%速度向上、32B → 0B割り当て削減
ラッパー作成時 −4%、32B割り当て削減

割り当て削減によるGC圧力軽減とキャッシュミスの改善が大きな効果をもたらす。

関連Issue

#132481

その他

  • 動作変更なし、パブリックAPI変更なし
  • ComWrappersTests、ComWrappersTestsBuiltInComDisabled、GcRestrictedCalloutReversePInvoke、GlobalInstanceMarshallingTests、GlobalInstanceMarshallingTestsBuiltInComDisabled、GlobalInstanceTrackerSupportTests_TargetWindows、WeakReferenceTestが全てパス
  • この変更は、マネージオブジェクトがネイティブコードに渡される全てのパスで効果を発揮するため、COM相互運用の利用頻度が高いアプリケーションでは累積的な改善が期待できる

#132375 Don't require GDV targets to be inlineable

  • 作成者: @EgorBo
  • 作成日時: 2026年08月16日 16:31:50(UTC)
  • マージ日時: 2026年09月01日 11:20:29(UTC)
  • ラベル: area-CodeGen-coreclr

概要

Guarded Devirtualization (GDV) において、ターゲットメソッドがインライン化不可の場合でも GDV 候補を保持し、直接呼び出しの利点を活用できるよう変更しました。クラスベースの GDV に対し、インライン化なしのデバーチャル化を許可します。DOTNET_JitGuardedDevirtualizationRequireInlining=1 で従来の動作(インライン化必須)に戻せます。

変更内容

  • jitconfigvalues.h: JitGuardedDevirtualizationRequireInlining 設定を追加し、従来の「インライン化必須」動作の復帰オプションを提供
  • inline.h: InlineCandidateInfo::isInlineable フィールドを追加し、インライン候補とデバーチャル化専用候補を区別
  • indirectcalltransformer.cpp: インライン候補の必須条件チェックを削除し、GDV 展開時に条件付きでインライン候補を再マーク
  • importercalls.cpp: クラスベース GDV の非インライン化候補を保持、候補情報の値初期化、struct 戻り値修正の遅延処理を調整
  • compiler.h: Compiler::canKeepNonInlineableGdvCandidate メソッドを追加
  • jitmetadatalist.h: デバーチャル化なしインライン化ケース用メトリック NoInlineGDV を追加

パフォーマンスへの影響

大幅な改善。ベンチマーク結果(全ターゲット [NoInlining] の CoreCLR デフォルト環境):

  • Interface: 0.45~0.72倍(大幅改善)
  • Virtual: 0.62~0.86倍(改善)
  • InterfaceShared: 0.50~0.88倍(改善)
  • DirectControl: 0.99~1.01倍(ノイズレベル)

単一の後退: VirtualShared(共有ジェネリック仮想)で Mono が 1.19倍(予測済みの vtable 呼び出しの方が効率的なため)。

NativeAOT で特に有効(getExactClasses はインライン化不可ターゲットに対応)。rt-sz レポートおよび smoke-test ベンチマークで検証済み。

関連Issue

#132375

その他

  • 変更はコンパイラ内部実装(JIT)の最適化であり、公開 API への影響はなし
  • 破壊的変更なし(レガシー動作オプション JitGuardedDevirtualizationRequireInlining=1 で復帰可能)
  • ARM64 を含む複数プラットフォームでの効果を期待

#130849 Add DependencyAnalysisFramework tests from CoreRT repo

概要

CoreRT リポジトリから忘れられていた ILCompiler.DependencyAnalysisFramework のユニットテストプロジェクトを runtime リポジトリに追加し、CoreCLR ツールテストスイートに統合します。静的・条件付き・動的な依存関係マーキング動作を検証するテストフレームワークと xUnit テストを実装し、CI/ツールテスト実行に参加させます。

変更内容

  • TestGraph.cs (+177行): テスト用グラフ/ノードモデルを追加。依存関係アナライザーを駆動するためのテストグラフインフラストラクチャを提供
  • DependencyAnalysisFrameworkTests.cs (+202行): xUnit テストを追加。異なるログ戦略での依存関係マーキング動作と DGML 出力形状を検証
  • ILCompiler.DependencyAnalysisFramework.Tests.csproj (+20行): 新規テストプロジェクトを定義。DependencyAnalysisFramework プロジェクトと xUnit 拡張機能を参照
  • eng/Subsets.props (+2行): clr.toolstests サブセットにテストプロジェクトを追加し、CI実行時に実行されるよう構成

パフォーマンスへの影響

影響なし

関連Issue

なし

その他

  • 変更対象は AOT コンパイラツール (src/coreclr/tools/aot/) のテスト基盤であり、ランタイム本体の公開 API には影響しません
  • これは内部テストインフラストラクチャの追加で、既存機能への破壊的変更はありません
  • Copilot によるレビューで推奨事項が指摘されているため、マージ前に確認が必要です

目次