Pull Request on 2026年08月24日

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

注意点

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


目次

  1. #132723 Add Announcements area ownership
  2. #132716 Fix ComWrappers ICustomQueryInterface exception handling
  3. #132686 Move HOST_BROWSER ifdef out of #if defined(_MSC_VER)
  4. #132685 Ensure async validation tasks are cleaned up during initialization
  5. #132676 JIT: fix SIMD12 relocatable-address containment check in ContainCheckIndir
  6. #132675 Fix broken private reflection in ArrayPool stress test
  7. #132674 Let native test libraries pick their own library type
  8. #132644 Fix profiler GC heap enumeration on external threads
  9. #132635 Remove forced inlining from Span<T>.ToArray
  10. #132625 JIT: turn MEASURE_NOWAY off by default
  11. #132624 JIT: remove duplicate node uniqueness check
  12. #132615 JIT: remove duplicate fgDebugCheckLinks calls
  13. #132612 JIT: check LIR unused values in the post-phase checks
  14. #132597 Allow trimming of TerminalFormatStrings
  15. #132594 Don't build all JIT flavors for clr.aot
  16. #132568 [release/11.0-rc1] Source code updates from dotnet/dotnet
  17. #132445 JIT: Avoid narrowing a retyped AND operand in fgOptimizeEqualityComparisonWithConst
  18. #132428 Add WasmRelocatableObjectWriter to ILCompiler.Compiler
  19. #131961 [release/10.0] Fix InlinedCallFrameMarker bit-0 check on 64-bit platforms in DAC stack walk
  20. #131654 Implement convertPInvokeCalliToCall for CoreCLR
  21. #131548 Disable ReentrantWaitFromSyncContextTest test on Mono
  22. #131526 Avoid cctor check if we provably executed it
  23. #131024 Use WASM CoreLib when compiling crossgen2 WASM unit tests
  24. #130505 Fail fast when FirstChanceExceptionEventArgs allocation fails
  25. #130023 Add compile-time and run-time methods to obtain Vector<T> byte length

#132723 Add Announcements area ownership

  • 作成者: @jeffhandley
  • 作成日時: 2026年08月24日 22:46:50(UTC)
  • マージ日時: 2026年08月24日 23:05:14(UTC)
  • ラベル: area-Meta

概要

docs/area-owners.mdにarea-Announcements領域の所有権情報(リード、オーナー、スコープノート)を追加します。ルーティングポリシーは変更されません。

変更内容

  • docs/area-owners.md: area-Announcementsの所有権行を追加(+1行)

パフォーマンスへの影響

影響なし

関連Issue

なし

その他

ドキュメント変更のみ。PR説明はGitHub Copilotで生成されました。


#132716 Fix ComWrappers ICustomQueryInterface exception handling

概要

ICustomQueryInterface.GetInterface実装で例外が発生した際のComWrappersの例外処理が不正だった問題を修正しました。ネイティブコードに対して呼び出し成功を示す0が返されていたため、*ppvObjectがnullのままでもネイティブ側でアサート失敗が発生していました。修正により、例外時は-1(TryInvokeICustomQueryInterfaceResult.FailedToInvoke)を返し、ネイティブコードが正しく呼び出し失敗として処理し、フォールバックするようになりました。

変更内容

  • src/coreclr/System.Private.CoreLib/src/System/Runtime/InteropServices/ComWrappers.CoreCLR.cs
    • [UnmanagedCallersOnly] CallICustomQueryInterfaceの例外ハンドラーで、default(0)の代わりに-1を返すように修正
    • enum値のマッピング意図を明確にするコメントを追加

パフォーマンスへの影響

影響なし

関連Issue

#132677、#117393

その他

  • 修正は内部実装(UnmanagedCallersOnlyラッパー)の修正
  • COMワッパー経由で例外が発生する場合の制御フローの正確性に関わる重要な修正
  • 破壊的変更なし(例外を発生させる既存コードの動作をより正確に処理するもの)

#132686 Move HOST_BROWSER ifdef out of #if defined(_MSC_VER)

概要

gcenv.base.hのHOST_BROWSER定義をMSVC固有の条件分岐から移動し、非MSVCビルド(ブラウザ/WebAssembly向けなど)でも利用可能にする変更です。WebAssembly向けネイティブAOTコンパイルでYieldProcessor()とMemoryBarrierの定義が正しく適用されるようになります。

変更内容

  • src/coreclr/gc/env/gcenv.base.h
    • HOST_BROWSERに関連するYieldProcessor()とMemoryBarrierの定義を、#if defined(_MSC_VER)の条件分岐から移動
    • 非MSVCセクションに専用の#ifdef HOST_BROWSERブロックを追加

パフォーマンスへの影響

影響なし

関連Issue

#126633、#113429

その他

  • CoreCLR本体ではこのヘッダーが実際には使用されていないと想定されていますが、ネイティブAOT(特にWebAssembly向け)のビルドでは使用されます
  • 本PRは#126633から分離した小規模で直観的な修正です

#132685 Ensure async validation tasks are cleaned up during initialization

概要

System.ComponentModel.AnnotationsのValidatorクラスにおいて、非同期検証タスクのライフタイム管理を強化しました。部分的に開始された検証タスクが失敗時やアーリーエクスイト時にキャンセルおよび待機されることを保証し、検証呼び出しから漏れ出したバックグラウンドワークを防ぎます。

変更内容

  • src/libraries/System.ComponentModel.Annotations/src/System/ComponentModel/DataAnnotations/Validator.cs
    • 非同期検証タスクの作成を既存のtry/finallyクリーンアップスコープ内に移動
    • 例外発生時やアーリーエクスイト時に実行中のタスクをキャンセルおよび待機するロジックを追加
    • タスクのライフタイム/クリーンアップ保証に関するコメントを明確化

パフォーマンスへの影響

影響なし(リソースリークの防止により、長期実行アプリケーションではメモリ効率が向上する可能性がありますが、個別の検証呼び出しのパフォーマンスへの直接的な影響はありません)

関連Issue

なし

その他

  • System.ComponentModel.Annotations.Tests:984テスト合格、0失敗
  • この変更は公開APIには影響しない内部実装の改善です
  • リソースリーク防止による信頼性向上が主な目的です

#132676 JIT: fix SIMD12 relocatable-address containment check in ContainCheckIndir

  • 作成者: @Copilot
  • 作成日時: 2026年08月24日 00:34:41(UTC)
  • マージ日時: 2026年08月24日 12:02:26(UTC)
  • ラベル: area-CodeGen-coreclr

概要

SIMD12(Vector3)の間接参照(indir)操作における再配置可能アドレス定数のコンテインメント判定が誤っていた問題を修正しました。条件判定をaddr->TypeIs(TYP_SIMD12)からnode->TypeIs(TYP_SIMD12)に変更し、アドレス演算子ではなく間接参照ノードの型に基づいて判定するように修正します。

変更内容

  • src/coreclr/jit/lowerxarch.cpp: Lowering::ContainCheckIndirメソッドで、SIMD12型の再配置制限を適用する対象を変更
    • 修正前:addr->TypeIs(TYP_SIMD12)(アドレス演算子は常にポインタ型のため判定が無意味)
    • 修正後:node->TypeIs(TYP_SIMD12)(間接参照ノード自体の型に基づいて判定)

パフォーマンスへの影響

影響なし。この修正はコンテインメント分析のロジック修正であり、生成されるコードの正確性を改善するものです。

関連Issue

なし

その他

  • 適用範囲: JIT_FLAG_RELOC(AOT)での動作に限定。ランタイムJITではImmedValNeedsRelocは常にfalseのため、コンテインメント動作に変化なし
  • 背景: SIMD12の上位要素アクセスは+8オフセットで実装されており、アドレス定数を変更する(icon->SetIconValue(icon->IconValue() + 8))ため、再配置が必要な定数がコンテインされるとassert(!icon->ImmedValNeedsReloc(m_compiler))に違反する
  • 検証: NativeAOT(checked JIT)でVector3のロード/ストア時にアサーション失敗が確認され、修正後は正しいコード生成(lea + movsd + extractps)を確認
  • テスト: 既存のNativeAOT関連テストで実質的にカバーされているため、新規テストは追加なし

#132675 Fix broken private reflection in ArrayPool stress test

概要

ArrayPoolストレステスト内で破損していたプライベートリフレクションを修正するPR。ThreadLocalIsCollectedUnderHighPressureテストがGetMemoryPressureメソッドを誤ったインスタンス型から検索していたためnullが返され、テスト実行時にNullReferenceExceptionが発生していた問題を解決。正しい内部型(System.Buffers.Utilities)から検索するよう修正し、型・メソッドの解決に失敗した際に明示的なアサーション失敗を行うよう改善。

変更内容

  • src/libraries/System.Runtime/tests/System.Buffers.Tests/ArrayPool/CollectionTests.cs
    • リフレクション検索対象をArrayPool<byte>.Shared.GetType()からtypeof(ArrayPool<byte>).Assembly.GetType("System.Buffers.Utilities")に変更
    • 内部型とメソッドの解決に失敗した場合の明示的なアサーションを追加
    • 不要になった#pragma warning disable IL2075を削除
    • GetMemoryPressureの戻り値型からHigh圧力状態(値2)をパースするロジックの堅牢性向上

パフォーマンスへの影響

影響なし

関連Issue

#128431

その他

  • このテストはDOTNET_TEST_STRESS=1環境変数が設定された場合のみ実行される(ストレステスト)。通常のCIではこの変数が設定されていないため、バグが5年以上検出されずにいた
  • ローカル環境での実行で修正後、バッファが正常に確保・解放されることを確認済み(実行時間:6.66秒)
  • 修正前後で通常テスト(ストレステスト以外)は91件すべてパスのため、副作用なし

#132674 Let native test libraries pick their own library type

概要

ネイティブテストライブラリのビルド時に、既存の ${TEST_LIB_TYPE} CMake変数を活用して、プラットフォームごとに動的/静的ライブラリの選択を柔軟に行えるようにする機械的な変更です。現在はSHAREDにハードコードされていますが、この変更により WASM環境での静的ライブラリビルドが可能になります(後続のPR #131866で活用予定)。

変更内容

  • 111個のCMakeLists.txtファイル: src/tests配下の add_library() コマンドで、ハードコードされた SHARED を ${TEST_LIB_TYPE} に置き換え
  • 対象ライブラリ: 140箇所中138箇所がこの変更に対応(+137/-137行)
  • 除外ライブラリ: platformdefines と CustomMainNative の2つのヘルパーアーカイブは明示的に STATIC のまま(他のライブラリに統合される性質のため)
  • 既存設定の活用: TEST_LIB_TYPE は既に src/tests/CMakeLists.txt に存在(WASM外で SHARED、WASM上で STATIC)

パフォーマンスへの影響

影響なし。 ビルド出力は完全に同一です。現在のすべてのプラットフォームでは TEST_LIB_TYPE が SHARED に展開されるため、生成されるビルドグラフは変わりません。osx-arm64での検証では、394個のネイティブターゲットが同じ結果(88個の .dylib + 2個の .a)を生成しました。

関連Issue

#131866 (後続のWASM corerunワーク)

その他

  • これはPR #131866から分離された「準備作業」です
  • 現在のところこの変更自体は機能的な影響なし(テキスト変換により同一の結果)
  • WASM環境でのネイティブテストライブラリ静的リンクが必要な理由: WebAssemblyは動的ローディング機能を持たないため
  • すべての変更は add_library() 呼び出しで構成され、111ファイルすべてが確認済み

#132644 Fix profiler GC heap enumeration on external threads

概要

プロファイラーのGCヒープ列挙時に、外部スレッド(非管理スレッド)と中断スレッドの両方がnullptrの場合、外部スレッドが誤ってサスペンション所有者として識別される問題を修正しました。修正により、null同士の比較がサスペンション所有者の条件を満たさないようになります。

bool suspendedByThisThread =
    pCurrentThread != nullptr &&
    ThreadSuspend::GetSuspensionThread() == pCurrentThread;

変更内容

  • src/coreclr/vm/proftoeeinterfaceimpl.cpp: EnumerateGCHeapObjects内のサスペンション所有権判定ロジックを修正。マネージド現在スレッドが存在することを必須条件とし、nullptr同士の誤った比較を防止(+2/-1行)。

パフォーマンスへの影響

影響なし

関連Issue

#132643

その他

  • 影響範囲: コンパイラ/ランタイム(CoreCLR プロファイラー インターフェース)の内部実装
  • リスク: 低。変更は2つのnullptrを区別し、実際のサスペンション所有権のみを認識するもの。
  • 既知の回帰: なし
  • テスト: 既存のgcheapenumerationカバレッジがランタイム中断競合パスを検証
  • サーバーGC時の影響: サーバーGC実行時のプロファイラーヒープ列挙が誤ってエラーを返すことがなくなります。

#132635 Remove forced inlining from Span<T>.ToArray

概要

Span<T>.ToArray()からAggressiveInlining属性を削除し、JITが通常の収益性判定に基づいてインライン化を決定できるようにします。これにより、Span<T>.ToArray()とReadOnlySpan<T>.ToArray()の実装を一貫させます。ToArray()はメモリ割り当てを行うため、強制インライン化の恩恵は限定的です。

変更内容

  • System.Private.CoreLib/src/System/Span.cs: Span<T>.ToArray()メソッドからAggressiveInlining属性を削除(1行削減)
  • System.Collections.Immutable/src/System/Collections/Immutable/ImmutableArray.cs: 関連する実装の調整(7行追加、7行削除、合計14行変更)

パフォーマンスへの影響

  • コードサイズ: JIT-diff実験の結果、ReadOnlySpan<T>.ToArray()にAggressiveInliningを追加する場合と比較して、削除する方法はコードサイズへの影響が大幅に小さい
  • ランタイム動作: 変更なし。JITが最適なインライン化判定を行うことで、過剰なコード膨張を回避

関連Issue

#119713

その他

  • JIT-diff実験の結果に基づいた設計判断です(MihuBot/runtime-utils#2120, MihuBot/runtime-utils#2121参照)
  • 変更はAggressiveInlining属性の削除のみで、実装ロジックに変更はありません
  • @xtqqczze によるJIT-diff実験の評価に基づいています

#132625 JIT: turn MEASURE_NOWAY off by default

概要

JIT コンパイラの MEASURE_NOWAY 機能をデフォルトで無効化する変更です。従来は DEBUG ビルドで常に有効化されており、すべての noway_assert に対して無条件に RecordNowayAssertGlobal の呼び出しが展開されていました。この変更により、測定が必要な場合にのみ手動で MEASURE_NOWAY を 1 に定義する方式に変更されます。

変更内容

  • src/coreclr/jit/error.h: MEASURE_NOWAY のデフォルト値を 0 に変更。DEBUG ビルドでも有効化されなくなります。
  • src/coreclr/jit/jitconfigvalues.h: JitMeasureNowayAssert と JitMeasureNowayAssertFile の設定コメントを更新し、測定時には MEASURE_NOWAY を 1 に定義する必要があることを明記。

パフォーマンスへの影響

大幅な改善:

  • JIT 命令数削減:
    • benchmarks.run: -3.75%
    • benchmarks.run_pgo: -3.65%
    • benchmarks.run_pgo_optrepeat: -3.75%
    • libraries.pmi: -3.63%
  • benchmarks.run ウォールクロック時間: 67.38s → 65.59s (-2.66%)

不要な計測コードの削減により、JIT コンパイル時間とコード生成効率が改善されます。

関連Issue

なし

その他

この変更は内部実装(JIT 計測機能)の最適化であり、公開 API への影響はありません。noway_assert の機能自体は変わらず、計測オーバーヘッドが削減されるのみです。


#132624 JIT: remove duplicate node uniqueness check

概要

JITコンパイラの Phase::PostPhase でノード一意性チェック(fgDebugCheckNodesUniqueness)が重複実行されていた問題を修正しました。CHECK_UNIQUE は importation 前に有効になり、CHECK_IR は morph 後のみ有効なため、fgDebugCheckLinks() 内の呼び出しは冗長です。この重複チェックを削除することで、JIT コンパイルのパフォーマンスを向上させます。

変更内容

  • src/coreclr/jit/fgdiagnostic.cpp: Compiler::fgDebugCheckLinks() から無条件の fgDebugCheckNodesUniqueness() 呼び出しを削除(-1行)
  • ノード一意性チェックは Phase::PostPhase の CHECK_UNIQUE フェーズで既に実行されるため、重複実行を排除

パフォーマンスへの影響

顕著な改善が確認されました:

  • JIT命令数削減: -5.54% ~ -5.82%(libraries.pmi、benchmarks.run 等で測定)
  • Replay wall clock: 67.38s → 65.11s(-3.37%)

デバッグビルドの IR 検証オーバーヘッドが軽減されます。

関連Issue

なし

その他

この変更はデバッグ検証ロジックの最適化であり、CHECK_UNIQUE が有効な場合の既存の検証フロー(Phase::PostPhase → CHECK_UNIQUE → CHECK_IR)に依存しています。リリースビルドには影響しません。


#132615 JIT: remove duplicate fgDebugCheckLinks calls

概要

JITコンパイラの重複するデバッグチェック呼び出しを削除し、パフォーマンスを改善する変更です。Phase::PostPhaseがすべてのフェーズ後にfgDebugCheckLinksを実行するため、4箇所の直接呼び出しは冗長でした。検出ロジックは変わらず、フェーズ中盤で導入された破損は現在フェーズ終了時に報告されます。

変更内容

  • src/coreclr/jit/assertionprop.cpp: optAssertionPropMain内のfgDebugCheckLinks呼び出しを削除(-4行)
  • src/coreclr/jit/compiler.cpp: compCompile内の2つのフェーズ間でのfgDebugCheckLinks呼び出しを削除(-4行)
  • src/coreclr/jit/lsra.cpp: doRegisterAllocation終了時のfgDebugCheckLinks呼び出しを削除(-4行)
  • src/coreclr/jit/optcse.cpp: optValnumCSE_InitDataFlow内のfgDebugCheckLinks呼び出しを削除(-2行)

パフォーマンスへの影響

改善あり - checked JIT on benchmarks.run:

  • 命令数: -4.35%削減
  • 実行時間(ウォールクロック): -2.4%削減

特に検査ビルド(Checked JIT)でのデバッグチェック呼び出しオーバーヘッドが削減されました。

関連Issue

なし

その他

本変更は内部実装(JITコンパイラのデバッグ検証)に対するもので、公開APIや言語動作には影響しません。Phase::PostPhaseが唯一の呼び出し元になることで、コードの集約化とメンテナンス性の向上が図られています。


#132612 JIT: check LIR unused values in the post-phase checks

概要

JITコンパイラの低位中間言語(LIR)検証ロジックを改善する変更です。CheckLIRのcheckUnusedValuesチェックが複数の場所で個別に呼び出されていた冗長性を排除し、CHECK_LIR_UNUSED_VALUESフラグを導入してラショナライゼーションからレジスタ割り当てまで一貫して有効化します。6つの直接呼び出しを削除し、fgDebugCheckLinks経由で統一的に処理することで保守性と効率を向上させます。

変更内容

  • compiler.h: CHECK_LIR_UNUSED_VALUESフラグを新たに定義し、既存フラグを整理
  • compiler.cpp: ラショナライゼーションからレジスタ割り当て前までの期間でCHECK_LIR_UNUSED_VALUESフラグを有効化する初期化ロジックを追加
  • fgdiagnostic.cpp: fgDebugCheckNodeLinksを修正し、CHECK_LIR_UNUSED_VALUESフラグをCheckLIRに渡すように変更
  • codegenlinear.cpp、decomposelongs.cpp、lower.cpp、rationalize.cpp: 重複していた直接的なCheckLIR呼び出しを削除
  • fgopt.cpp: フロー更新後の冗長なCheckLIR呼び出しを削除

パフォーマンスへの影響

チェック機能付きJIT(デバッグモード)での計測結果:

  • 命令数削減:-6.03%
  • ウォールクロック時間削減:-5.59%

検証ロジックの統一化により、チェック付きビルドでのスループット向上を実現しています。

関連Issue

なし

その他

このチェックはレジスタ割り当て(LSRA)段階では無効化されます。LSRAはユーザーを持たないノードを挿入してレジスタセーブ/リストア動作をモデル化するため、この段階ではチェック対象外となります。


#132597 Allow trimming of TerminalFormatStrings

  • 作成者: @Copilot
  • 作成日時: 2026年08月21日 02:07:11(UTC)
  • マージ日時: 2026年08月24日 10:44:14(UTC)
  • ラベル: area-System.Console

概要

Unix環境でのコンソール機能で使用されるTerminalFormatStringsのトリミング対応を実施し、"Hello world"プログラムでLinuxにおいて約8kBのサイズ削減を実現します。ConsolePalの遅延初期化プロパティを削除し、一元化されたインスタンスアクセス方式に統合することで、NativeAOTのサイズ削減に貢献します。

変更内容

  • TerminalFormatStrings.cs: キャッシュされたInstanceエントリーポイントを追加(テスト時は除外)
  • StdInReader.cs: ConsolePal.TerminalFormatStringsInstanceからTerminalFormatStrings.Instanceへの呼び出し切り替え
  • ConsolePal.Unix.cs: 遅延初期化を含むインスタンス管理を削除し、TerminalFormatStrings.Instanceへのアクセスに統一
  • System.Console.Tests.csproj: リンク済みソースファイルで本番環境専用の静的初期化を制御するためUNITTESTを定義

パフォーマンスへの影響

  • Linux上で"Hello world"プログラムで8kB のバイナリサイズ削減
  • インスタンス管理の一元化による冗長な遅延初期化削除で、メモリ使用量と初期化オーバーヘッドが削減
  • NativeAOT利用時のトリミング効率が向上

関連Issue

#132595

その他

注意: ConsolePal.Unix.cs:1101にてInterlocked.CompareExchangeがbool型を直接使用しているため、オリジナルのint型(0/1)への復元とvolatile書き込みパターンの確認が必要とのコメント指摘があります。


#132594 Don't build all JIT flavors for clr.aot

概要

NativeAOT (clr.aot) ビルドにおいて、デフォルトで必要なホスト/ターゲットシナリオ向けの単一JITフレーバーのみをビルドするよう変更します。従来のすべてのクロスターゲットJITフレーバーのビルド (clr.alljits) はオプトイン方式になり、ビルド時間の短縮が期待されます。

変更内容

  • eng/Subsets.props: DefaultNativeAotSubsets の定義を clr.alljits から clr.jit に変更(デフォルトで単一JITフレーバーのみビルド)
  • docs/workflow/building/coreclr/nativeaot.md: クロスコンパイル対応時に clr.alljits を subset リストに追加する方法を文書化

パフォーマンスへの影響

ビルド時間短縮(#131666 と同等の削減が期待されます)。不要なJITフレーバーのビルドが回避されます。

関連Issue

#131666

その他

クロスビルドが必要なシナリオではオプトインで clr.alljits を指定することで対応可能。主流シナリオではビルド時間の短縮がメリット。


#132568 [release/11.0-rc1] Source code updates from dotnet/dotnet

概要

dotnet/dotnetリポジトリからのコードフローアップデート(codeflow PR)です。VMRからのソースコード変更と依存パッケージの更新を含みます。2026年8月20日時点のビルドから、Microsoft.CodeAnalysis、NuGet、System.Reflection.Metadataなど複数の主要ライブラリおよびビルドツール関連パッケージが更新されています。

変更内容

  • ビルド・構成ファイル: global.json、.config/dotnet-tools.json、eng/Version.Details.props/xml、helix-job-monitor.yml、publish-logs.ymlなど、ビルドツールチェーンと構成の更新
  • テストコード修正: System.Data.SqlTypesやSystem.Runtimeなど複数のテストコードで数値リテラル指定等の細微な調整
  • ネイティブコード: src/native/minipal/thread.cにスレッド関連の追加コード(7行)
  • ツール・分析: illink、pgoなど分析・リンク関連ツールの更新

依存パッケージアップデート(全て2026-08-20付のビルド):

  • Microsoft.CodeAnalysis系: 5.11.0-1.26420.103へ
  • NuGet系(Frameworks/Packaging/ProjectModel/Versioning): 7.11.0-rc.42103へ
  • System.Reflection.Metadata: 11.0.0-rc.1.26420.103へ
  • Microsoft.DotNet.Arcade.Sdk他、ビルドタスク関連: 11.0.0-beta.26420.103へ
  • System.CommandLine: 3.0.0-rc.1.26420.103へ
  • Wasm.Node.Transport: 11.0.0-alpha.1.26413.1へ

パフォーマンスへの影響

影響なし

関連Issue

なし

その他

  • このPRは自動化されたコードフロープロセスにより、複数のdotnet関連リポジトリ(aspnetcore、roslyn、sdk、msbuildなど約18個)の同期的な更新を含みます
  • RC1リリースブランチ(release/11.0-rc1)対象のアップデートです

#132445 JIT: Avoid narrowing a retyped AND operand in fgOptimizeEqualityComparisonWithConst

  • 作成者: @Copilot
  • 作成日時: 2026年08月18日 01:10:07(UTC)
  • マージ日時: 2026年08月24日 12:03:44(UTC)
  • ラベル: area-CodeGen-coreclr

概要

JIT最適化処理で、暗黙的byrefパラメータのアドレスを取得してアラインメントテストを行う場合に、型の不一致によるアサーションエラーが発生していた問題を修正しました。

MODからANDへの書き換えが前処理で実行される際、暗黙的byrefパラメータがTYP_BYREFに再型化されても、AND操作は依然としてTYP_LONGとして扱われたため、optNarrowTreeの型チェックアサーションが失敗していました。

修正により、TYP_BYREF型の操作数に対する狭窄化を避け、代わりにCAST<int>でラップすることで、変換を継続適用しながら正しい型チェックを行うようにしました。

サンプルコード:

static bool TestAlignment(Vector128<float> test)
{
    return ((nint)(&test) % 16) == 0;
}

変更内容

  • src/coreclr/jit/morph.cpp: fgOptimizeEqualityComparisonWithConst関数内のoptNarrowTree呼び出しをガード条件で保護。andOpOp1->TypeIs(TYP_LONG)チェックを追加し、TYP_BYREF型の操作数に対する狭窄化を防止。条件を満たさない場合は既存のelse分岐でCAST<int>でラップする処理に統一。

パフォーマンスへの影響

影響なし。生成されるコード形状は変わらず(mov eax, ecx; test al, 15; sete al)

関連Issue

#132444

その他

  • win-x64およびarm64で再現(linux-x64はSysVが暗黙的byref渡しを使用しないため影響なし)
  • テストケースは提供されていません(レビュワーEgorBoの指示による)

#132428 Add WasmRelocatableObjectWriter to ILCompiler.Compiler

  • 作成者: @jtschuster
  • 作成日時: 2026年08月17日 19:55:41(UTC)
  • マージ日時: 2026年08月24日 18:58:23(UTC)
  • ラベル: area-ReadyToRun

概要

WASM モジュールをランタイム WASM モジュールとリンク可能な形式で出力するための WasmRelocatableObjectWriter クラスを ILCompiler に追加します。基本的な実装で、すべてのリロケーションは完全に実装されておらず、.reloc カスタム WASM セクションはまだ出力されません。あわせて WASM ファイルのスタイル警告も修正されています。

変更内容

  • WasmRelocatableObjectWriter.cs(新規): WASM32 ビルド用の新しいリロケータブル WASM ライター。基本的なリロケーション解決と既定インポート機能を実装。リロケーション処理時に記号定義を参照し、構造インデックス(関数、テーブルなど)を自己解決。
  • ObjectWriter.cs: Wasm32 非READYTORUN ビルドで WasmRelocatableObjectWriter を選択するよう EmitObject メソッドを更新。
  • ILCompiler.Compiler.csproj: WASM ライター/ロウアリングソースを RyuJit から Compiler プロジェクトに移動。
  • ILCompiler.RyuJit.csproj: WASM 固有の共有ソースを削除。
  • CompilerTypeSystemContext.cs: GetClassAlignmentRequirementStatic ヘルパーメソッドを追加(内部実装から移行)。
  • WasmLowering.cs、WasmNative.cs、WasmInstructions.cs、WasmSection.cs: スタイル修正(フィールド可視性、readonly、|= 使用法など)。
  • CorInfoImpl.cs: GetClassAlignmentRequirementStatic の内部実装を削除。

パフォーマンスへの影響

影響なし

関連Issue

なし

その他

本機能は、このPRの上に積み重ねられた別のPRが存在するまで未使用です。

注記: Copilot レビューで複数の実装上の懸念が指摘されています:

  • MemoryStream に long を int にキャストする際、オーバーフロー可能性がある(2GB以上のセクション)
  • WASM_MEMORY_ADDR_REL_SLEB リロケーションの処理に問題がある可能性(相対メモリアドレスとして正しく解決されていない可能性)
  • メモリインポートの最小ページ数がハードコードされている(32ページ、TODO コメント付き)
  • 例外時のエラーメッセージが不十分(シンボル不在時に KeyNotFoundException)
  • CreateDebugInfoBuilder() が null を返すため、デバッグ情報生成時に問題が発生する可能性

#131961 [release/10.0] Fix InlinedCallFrameMarker bit-0 check on 64-bit platforms in DAC stack walk

概要

64ビットプラットフォームでのDAC スタックウォーク処理において、InlinedCallFrame::m_Datum フィールドのビット判定ロジックを修正しました。アンマネージ calli ターゲットが奇数アドレスに配置された場合、ビット0を確認せずにビット1を検査していたため、例外処理ヘルパーマーカーが誤って認識されてフレームがスキップされる問題を解決しました。

変更内容

  • src/coreclr/debug/daccess/dacdbiimplstackwalk.cpp
    • GetCountOfInternalFrames と EnumerateInternalFrames の2箇所で、InlinedCallFrameMarker::ExceptionHandlingHelper のビット1チェック前に、ビット0の確認処理を追加(TARGET_64BIT ガード)
    • フィールドが MethodDesc* (マーカービット付き)であることを確認してからビット1を解釈するよう修正

パフォーマンスへの影響

影響なし(ロジック修正のみで、パフォーマンス面への変更なし)

関連Issue

#131606

その他

  • .NET 8からの回帰修正: 例外処理の再実装に伴い導入されたリグレッション
  • 顧客への影響: Visual Studioの混合モードデバッガで、C++/CLIレイヤーがアンマネージ calli を通じてネイティブコードを呼び出す場合、ターゲットアドレスが奇数(遅延ロードインポートや増分リンクサンク化では一般的)の時にネイティブC++呼び出しスタックフレームが表示されない
  • リスク評価: Low。変更はDAC スタックウォーク部分に限定され、32ビットプラットフォームや実際のEHヘルパーマークフレームの動作に影響なし
  • 既存の先例: InlinedCallFrame::GetFunction_Impl (src/coreclr/vm/frames.h)で同様のマーカービットマスク処理が既に確立されている

#131654 Implement convertPInvokeCalliToCall for CoreCLR

  • 作成者: @jkoritzinsky
  • 作成日時: 2026年07月31日 16:50:27(UTC)
  • マージ日時: 2026年08月24日 21:17:40(UTC)
  • ラベル: area-VM-coreclr

概要

CoreCLRのアンマネージ calli 呼び出しの処理メカニズムを刷新し、レガシーな実行時ヘルパー(GenericPInvokeCalliHelper)からJIT時のILスタブ生成への移行を実装しました。これによりNativeAOTと同じ convertPInvokeCalliToCall JIT-EEパスを使用するようになります。

変更により、アンマネージ calli は呼び出し元のJITコンパイル時にスタブメソッドを作成・キャッシュし、初回呼び出し時にJITコンパイルされます。ターゲットアドレスはシークレットレジスタの代わりに通常の末尾パラメータとして渡されます。

変更内容

VM側の主な実装:

  • CEEInfo::convertPInvokeCalliToCall を新規実装し、CALLI IL スタブ作成パイプラインを構築
  • スタブ生成時の失敗(非blittable型、非サポート呼び出し規約、インスタンス this など)を実行時に報告する仕組みを導入(StubHelpers.ThrowInteropException)
  • スタブ署名の独立化対応として CallConv::TryGetUnmanagedCallingConventionFromModOptSigStartingAtRetType の2つのバグを修正

削除内容:

  • 全7アーキテクチャ(amd64/arm/arm64/i386/loongarch64/riscv64/wasm)の GenericPInvokeCalliHelper アセンブリ実装
  • PInvokeCalliFrame フレームタイプ、cDAC記述子
  • JIT側の cookie 関連コード:GenTreeCall::gtCallCookie、WellKnownArg::PInvokeCookie/PInvokeTarget、関連する morph/lower パス
  • JIT-EE インターフェース:GetCookieForPInvokeCalliSig、CORINFO_HELP_PINVOKE_CALLI(JIT-EE version GUID を更新)

デバッガ対応:

  • ILStubManager::TraceManager を更新してシークレット引数の代わりに末尾の target パラメータから目標アドレスを復元(x86/amd64/arm/arm64 で実装、その他は FALSE)

ReadyToRun:

  • crossgen2 が convertPInvokeCalliToCall を実装し、必要に応じて実行時 JIT へフォールバック
  • バイト単位で同一の出力を確認(MarshallingCalli/FastcallCalli は従来通り実行時 JIT)

パフォーマンスへの影響

影響なし。スタブ作成がJIT時に早まる一方、初回呼び出しのコスト(スタブJIT化)は同等です。ReadyToRun出力は byte-identical で性能差なし。

関連Issue

#127473
#131606

その他

互換性への変更:

  • インスタンス this を持つアンマネージ calli は従来は静的スタブ作成を拒否していましたが、現在は呼び出し時に InvalidProgramException を報告します(P/Invoke 宣言と同じ動

#131548 Disable ReentrantWaitFromSyncContextTest test on Mono

概要

Mono ランタイムでの ReentrantWaitFromSyncContextTest テストを無効化する変更です。Mono では Monitor.Wait がネイティブ実装のままで、CoreCLR のようにマネージド実装に移行していないため、SynchronizationContext.Wait へのフォワーディングが行われず、このテストの検証対象シナリオが実行されません。

変更内容

  • src/libraries/System.Threading/tests/MonitorTests.cs
    • Mono 専用の ActiveIssue スキップを ConditionalFact ガードに置き換え(PlatformDetection.IsNotMonoRuntime)
    • Mono で適用不可である理由を説明するコメント追加

パフォーマンスへの影響

影響なし

関連Issue

#126138

その他

なし


#131526 Avoid cctor check if we provably executed it

概要

AOT RyuJit JIT-EE インターフェースを改善し、静的フィールドアクセス時にクラスコンストラクタ(cctor)チェックが既に実行されたことが証明できる場合、そのチェックをスキップするようにしました。初期化分析(initClass)を活用することで、不要なcctorチェックを削除し、コード生成を最適化します。

変更内容

  • src/coreclr/tools/Common/JitInterface/CorInfoImpl.cs: initClassロジックをFieldDesc/MethodDescで直接実行するオーバーロードを追加し、ハンドルベースのエントリポイント用ラッパーを実装
  • src/coreclr/tools/aot/ILCompiler.RyuJit/JitInterface/CorInfoImpl.RyuJit.cs: getFieldInfo内でinitClassの結果を参照し、初期化が不要な場合はCORINFO_FLG_FIELD_INITCLASSフラグを設定しない、またはヘルパー呼び出しを避けるようにロジックを変更

パフォーマンスへの影響

改善あり

Before: 69バイト、複数のIG(ブロック)でcctorチェック(cmp qword ptr [rax-0x08], 0 + 条件分岐)を実行 After: 47バイト、不要なcctorチェック、ヘルパー呼び出し(CORINFO_HELP_READYTORUN_GCSTATIC_BASE)が削除

静的フィールドへのアクセスにおいて、初期化が不要な場合に以下を削除:

  • cctor実行済みチェックのための比較命令と条件分岐
  • ヘルパー呼び出しの遅延パス

コード長の削減により、キャッシュ効率が向上し、分岐予測の回避により命令スループットが改善されます。

関連Issue

#131526

その他

この変更はAOTコンパイル時の静的フィールドアクセス最適化であり、ランタイム動作に影響を与えません。インスタンスメソッドなど、初期化が既に証明された文脈では自動的にチェックがスキップされます。


#131024 Use WASM CoreLib when compiling crossgen2 WASM unit tests

概要

crossgen2 WASM単体テストをコンパイルする際に、ホストマシンのcorelib(System.Private.CoreLib)ではなく、WASM専用のcorelbを使用するように変更するもの。これにより、crossgen2がWASM固有のcorelib機能に依存する場合でも失敗しなくなります。また、Windows/ARM/iOS-arm64などのプラットフォーム固有の問題も同様に解決されます。テストは対象アーキテクチャ・OSと互換性のあるものだけが実行されるようになります。

変更内容

  • TestPaths.cs: WASM runtime-packの経路設定とRequireWasmReferencesスイッチを追加。設定プローブロジックを簡潔化。
  • R2RTestRunner.cs: コンパイル対象ごとにホスト/browser-wasmの参照パスを選択し、ResolverにそのパスセットをPASS。
  • R2RTestCaseCompiler.cs: Roslyn コンパイル参照セットアップを明示的な参照リストを消費する形式に変更。
  • R2RResultChecker.cs: SimpleAssemblyResolverをTestPathsではなく提供された参照セットからフレームワークアセンブリを解決するように更新。
  • R2RDriver.cs: 専用の"target arch arm"オプションをTargetRid駆動の引数に統合。
  • R2RTestSuites.cs: WASMとARMテストケースをTargetRidを使用するように更新、ARMテストゲーティングを厳密化。
  • ILCompiler.ReadyToRun.Tests.csproj: WASM runtime-packの検出・設定伝播とCI検証を追加。
  • Microsoft.NETCore.App.Runtime.CoreCLR.sfxproj: IncludeStaticLibrariesInPackをオーバーライド可能に。
  • runtime.yml: browser-wasm libs構築・アーティファクト発行とツールテストジョブへのダウンロードを追加。
  • Subsets.props: 新規clr.r2rtestsサブセットを追加してプラットフォーム独立テスト分離。

パフォーマンスへの影響

影響なし

関連Issue

なし

その他

このPRによりローカル実行で完全なカバレッジを得るには、複数ターゲット向けのlibsをビルドし、各ターゲットRIDに対してテストを再実行する必要があります。CI パイプラインではプラットフォーム依存の入力アセットのみがターゲット固有で、実行側はAnyCPUでコンパイルされcrossgen2はクロスコンパイル対応なため、ほとんどのテストはlinux-x64上で前回ビルドのアーティファクトをダウンロード後に実行可能です。ただしPDB再現が必要な2つの回帰テストはWindowsのみで実行されます。


#130505 Fail fast when FirstChanceExceptionEventArgs allocation fails

概要

FirstChanceExceptionEventArgsの割り当て失敗時の例外発生処理を改善するPRです。メモリ不足時にイベント引数の割り当てに失敗しても、無限再帰やスタックオーバーフローを防ぐため、fail-fast処理で確定的に終了するようにしました。同時に、AppDomain.FirstChanceExceptionハンドラの再入を防ぐスレッドローカルガードを追加しました。

// 割り当て失敗時はfail-fastで終了
OBJECTREF eventArgs = AllocateObject(g_pFirstChanceExceptionEventArgsClass);
if (eventArgs == NULL)
{
    EEPOLICY_HANDLE_FATAL_ERROR(COR_E_OUTOFMEMORY);
}

変更内容

  • src/coreclr/System.Private.CoreLib/src/System/AppContext.CoreCLR.cs: FirstChanceExceptionEventArgsの割り当て失敗をfatal errorとして処理
  • src/libraries/System.Private.CoreLib/src/System/AppContext.cs: ThreadStatic型の再入ガードを追加し、同一スレッド上でのFirstChanceException派遣の再入を防止。try/finallyで確実にガードをリセット
  • src/libraries/System.Runtime/tests/System.Runtime.Extensions.Tests/System/AppDomainTests.cs: throwing handlerがスタックオーバーフローを引き起こさないことを検証する回帰テストを追加

パフォーマンスへの影響

影響なし。変更は既に致命的なメモリ不足エッジケースに限定されており、通常の例外派遣パスに影響しません。

関連Issue

なし

その他

  • 公開API形状の変更なし
  • 互換性への影響なし(通常の割り当て成功パスに変更なし)
  • CoreCLRランタイムの例外処理ロジック(内部実装)の改善
  • 低メモリ例外パスにおける無限再帰を確定的なfail-fast挙動に置き換え

#130023 Add compile-time and run-time methods to obtain Vector<T> byte length

概要

Vector<T>のバイト長を取得するメソッドを再編成し、コンパイル時評価と実行時評価を分離しました。getVectorTByteLengthをgetCompileTimeVectorTByteLengthにリネームし、新たにgetRuntimeVectorTByteLengthを追加します。特にArm64のSVE対応で、ISA機能のみではVector<T>のサイズを予測できない場合に、実行時にキャッシュされたクラスハンドルから正確なサイズを取得できるようになります。

変更内容

  • corinfo.h: 新しいコンパイラインターフェースメソッド定義を追加
  • jiteeversionguid.h: JIT EEバージョンGUIDを更新(インターフェース変更に伴う)
  • compiler.h: getCompileTimeVectorTByteLength()とgetRuntimeVectorTByteLength()メソッドの宣言を追加
  • gentree.cpp, hwintrinsic.cpp, simd.cpp: メソッド呼び出しをgetCompileTimeVectorTByteLengthに更新
  • importercalls.cpp: Vector<T>の長さ取得ロジックを拡張。コンパイル時と実行時の双方の取得メソッドを統合
  • jitinterface.cpp: getRuntimeVectorTByteLengthの実装追加
  • CorInfoImpl.cs, CorInfoTypes.cs: マネージド側のインターフェース定義を追加

パフォーマンスへの影響

影響なし。この変更は機能拡張であり、既存のパフォーマンス特性は維持されます。

関連Issue

#130023

その他

  • 破壊的変更:JIT EEインターフェースのバージョンが変更されたため、再コンパイル必要
  • Arm64 SVE環境でのVector<T>の正確なサイズ取得が必要な場面(OSRパッチポイント生成など)でこの機能が活用されます

目次