Pull Request on 2026年01月31日

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

注意点

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



#123839 SPMI: Update superpmi-collect queues from osx13 to osx15

概要

OSX 13 ARM64キューの容量不足に対応するため、SPMI(SuperPMI)収集スクリプトのキュー構成をOSX 13からOSX 15に更新しました。これにより、継続的なパフォーマンス測定とJIT最適化データの収集が維持されます。

変更内容

  • src/coreclr/scripts/superpmi_collect_setup.py
    • osx.13.arm64キューへの参照をosx.15に変更
    • 設定ファイルの4行を更新(+4/-4)
    • SuperPMI収集パイプラインの対象プラットフォーム構成を修正

パフォーマンスへの影響

影響なし。本変更は設定・インフラレベルの変更であり、ランタイムやコンパイラロジックへの直接的な影響はありません。ただしOSX 15への移行により、パフォーマンス測定データの収集環境が新しいプラットフォームに統一されます。

関連Issue

なし

その他

  • SuperPMI(SuperPerfect Method Instrumentation)はコンパイラ最適化の検証とパフォーマンス回帰検出に使用される重要なインフラです
  • osx.13.arm64キューの容量終了に伴う計画的なインフラ移行です
  • レビュアーはCopilotにより自動確認済み(変更内容は単純な設定更新のため、新規コメントなし)

#123821 Fix LINQ Append/Prepend GetCount overflow to throw OverflowException

  • 作成者: @Copilot
  • 作成日時: 2026年01月30日 22:43:33(UTC)
  • マージ日時: 2026年01月31日 06:26:03(UTC)
  • ラベル: area-System.Linq

概要

LINQ の Append と Prepend メソッドの GetCount 最適化において、int.MaxValue 要素を持つシーケンスをカウントする際にサイレント整数オーバーフローが発生し、負の値を返していた問題を修正しました。修正により、Concat と同様に OverflowException をスローするようになります。

var source = Enumerable.Repeat(0, int.MaxValue);
var appended = source.Append(1);
appended.Count();  // 修正前: -2147483648 → 修正後: OverflowException

変更内容

  • AppendPrepend.SpeedOpt.cs: AppendPrepend1Iterator と AppendPrependN の GetCount メソッドに checked キーワードを追加(4箇所の算術演算)
  • AppendPrependTests.cs: MockCollection<T> ヘルパークラスを追加し、メモリ割り当てなしでオーバーフロー検証テスト 6 件を実装

パフォーマンスへの影響

checked 演算を使用することでランタイム時の追加チェックが発生するため、微小なパフォーマンス低下が考えられます。ただし、これは例外系統の正確性確保のための必要な変更です。通常の正常系ではパフォーマンス差は最小限に抑えられます。

関連Issue

Issue #123820(dotnet/runtime)に対応

その他

  • 本修正は同期的な System.Linq ライブラリにのみ適用されます。System.Linq.AsyncEnumerable には同等の GetCount 最適化がなく、CountAsync でオーバーフロー時に既に正しく例外をスローしています。
  • 全 28 テストケース(新規 6 件含む)が合格しており、テストカバレッジは十分です。
  • 破壊的変更です:これまでオーバーフロー時に負の値を返していたコードは OverflowException で動作が変わります。

#123814 JIT: fix arm32 dump/disasm of references to async resume info

  • 作成者: @Copilot
  • 作成日時: 2026年01月30日 20:05:46(UTC)
  • マージ日時: 2026年01月31日 18:46:28(UTC)
  • ラベル: 指定なし

概要

ARM32 JIT の dump/disasm でAsync Resume Info への参照を処理する際のアサーション失敗を修正するパッチです。IF_T2_N2 命令フォーマットがブロックアドレステーブルと Async Resume Info の両方に使用されていますが、ダンプロジックがブロックアドレステーブルのみを想定していたことが原因です。出力形式のみに影響し、コード生成には影響ありません。

変更内容

  • src/coreclr/jit/emitarm.cpp
    • emitarm.cpp:7308 のアサーション削除(jdsc が null の場合に失敗していた)
    • テーブルダンプ前に null チェック追加:jdsc が null の場合はインラインブロックアドレステーブルのダンプをスキップ
    • NULL を nullptr に統一(モダン C++ スタイル)
    • 条件付き出力追加:jdsc が null の場合は RWD%02zu フォーマット、null でない場合は J_M%03u_DS%02u フォーマットで出力
// 修正前:jdsc が null でアサート、常に DS フォーマットで出力
assert(jdsc != NULL);
printf("... J_M%03u_DS%02u", ...);

// 修正後:jdsc に応じた条件分岐
if (jdsc != nullptr)
    printf("... J_M%03u_DS%02u", ...);  // ブロックアドレステーブル
else
    printf("... RWD%02zu", ...);         // Async Resume Info

パフォーマンスへの影響

影響なし。ダンプ/ディスアセンブリ出力のみの変更で、実行時コード生成とランタイムパフォーマンスには影響ありません。

関連Issue

#123813

その他

このパッチは PR #123781 で導入された Async Resume Info 対応に関連しており、ARM32 プラットフォームでの JIT デバッグ出力の正確性向上を目的としています。破壊的変更なく、既存のブロックアドレステーブルダンプ動作は完全に保持されます。


#123812 Fix GetThreadStaticsBase to be included in R2R images

  • 作成者: @Copilot
  • 作成日時: 2026年01月30日 19:59:14(UTC)
  • マージ日時: 2026年01月31日 04:47:48(UTC)
  • ラベル: 指定なし

概要

GetThreadStaticsBaseがReadyToRun(R2R)コンパイルをバイパスしていたため、iOS環境(composite-r2r + interpreter fallback)でスレッド静的フィールドアクセスが35倍遅くなる問題を修正しました。新しいJITヘルパーCORINFO_HELP_GETDIRECTONTHREADLOCALDATA_NONGCTHREADSTATIC_BASEを追加し、スレッドローカルストレージ内のpThreadフィールドへの直接アクセスを提供することで、R2R編集を有効化しました。

// 改善効果の例:スレッド静的フィールドアクセス
[ThreadStatic]
private static int value;

public static int GetValue() => value; // R2R化により高速化

変更内容

  • jithelpers.cpp: JIT_GetDirectOnThreadLocalDataNonGCThreadStaticBaseを実装(スレッドローカルデータのpThreadフィールドアドレスを返却)
  • prestub.cpp: getHelperForStaticBaseを修正し、DirectOnThreadLocalData MethodTableを検出して新ヘルパーを使用
  • Thread.CoreCLR.cs: GetThreadStaticsBaseからBypassReadyToRunAttributeを削除
  • corinfo.h/CorInfoHelpFunc.cs: 新JITヘルパーのenum値を追加
  • jithelpers.h: 新ヘルパーをJITHELPERとして定義
  • jiteeversionguid.h: JITインターフェースバージョンGUIDを更新
  • CorInfoImpl.ReadyToRun.cs: 新ヘルパーをRequiresRuntimeJitException listに追加

パフォーマンスへの影響

改善: 35倍のパフォーマンス改善が期待されます。

  • 改善内容: R2R化により、スレッド静的フィールドアクセスがネイティブコードで実行され、インタプリタ実行を回避
  • 対象環境: iOS(composite-r2r + interpreter fallback構成)
  • 測定条件: マイクロベンチマークでスレッド静的フィールド(SetA(GetA() + 1))を500,000,000回実行時に確認

関連Issue

#123616

その他

  • 破壊的変更なし: JITインターフェースバージョンは更新されていますが、ReadyToRun定数は変更されていません
  • 実装パターン: 新ヘルパーは通常のJITHELPERとして定義(DYNAMICJITHELPER やReadyToRun専用ヘルパーではない)
  • 再帰初期化回避: 新ヘルパーはDirectOnThreadLocalDataの初期化依存関係に直接アクセスすることで再帰問題を回避

#123781 JIT: remove anticipated demand for throw helpers

概要

JIT コンパイラの throw helper 処理フローを再設計しました。従来は fgAddCodeRef を通じて throw helper 需要を事前に予測していましたが、Wasm など null check が明示的であるターゲットではこの手法が適さないため、throw helper の需要判定と生成を stack level setting フェーズ中に一元化しました。これにより、デバッグ不可能なコードでは共通 throw helper のセットを最小化します。

変更内容

  • flowgraph.cpp: throw helper ブロック/呼び出し生成ロジックを stack level setting フェーズに移行(107 行追加/-131 行削除)
  • morph.cpp: fgAddCodeRef 呼び出しを削除し、throw helper 事前予測を廃止(2 行追加/-43 行削除)
  • stacklevelsetter.cpp: throw helper 需要判定と block/call 作成を実装(16 行修正)
  • compiler.h: throw helper 関連のメソッドシグネチャを修正(5 行追加/-6 行削除)
  • compiler.cpp: 関連する古いコード削除(4 行削除)
  • コードジェネレータ複数ファイル (arm64, loongarch64, riscv64, wasm): throw helper 取得処理の微調整
  • テスト: HardwareIntrinsics smoke test を更新

パフォーマンスへの影響

改善点: デバッグ不可能なコード生成時に共通 throw helper セットを最小化することで、コード生成とコンパイル時間が削減される可能性あり。

懸念点: なし。この変更は実装の整理であり、runtime 挙動への影響は最小限です。

関連Issue

なし

その他

Copilot のレビューコメントで、Wasm コードジェネレータ (codegenwasm.cpp:1203) の null check が現在は常に満たされるため、デッドコードになる可能性を指摘。stack level setter が null check demand を必ず事前作成するため、該当の null チェックと assert の削除または調整が推奨されています。


#123774 Fix length when getting property from host

  • 作成者: @elinor-fung
  • 作成日時: 2026年01月29日 21:15:47(UTC)
  • マージ日時: 2026年01月31日 02:27:27(UTC)
  • ラベル: area-Host

概要

ホストからプロパティを取得する際に、実際に書き込まれたプロパティ長より大きい文字列長が返される問題を修正しました。バッファを実際の書き込み長でクローズすることで、正確な文字列長を確保します。

変更内容

  • src/coreclr/vm/hostinformation.cpp (+19/-5)
    • ホストプロパティ取得処理でバッファのクローズ時に実際の書き込み長を使用するように修正
    • 不正な文字列長の割り当てを防止

パフォーマンスへの影響

影響なし(バグ修正のため、パフォーマンスへの直接的な改善・悪化なし)

関連Issue

なし

その他

  • CoreCLRのホスト情報管理機能に関わる修正
  • @dotnet/appmodel と @AaronRobinsonMSFT により確認・レビュー済み
  • 文字列メモリ管理の正確性向上により、後続の文字列処理での予期しない動作を防止

#123248 Migrate test exclusions from issues.targets to inline ActiveIssue attributes

  • 作成者: @Copilot
  • 作成日時: 2026年01月16日 02:12:07(UTC)
  • マージ日時: 2026年01月31日 03:32:54(UTC)
  • ラベル: area-Infrastructure

概要

テスト除外設定を集中型の issues.targets (3,447行) から、インライン [ActiveIssue] 属性へマイグレーション。1,201個のテスト除外をテストソースコード内に移動し、可読性と保守性を向上。issues.targets は99.7%削減(3,447→9行)。

// マイグレーション例
[ActiveIssue("https://github.com/dotnet/runtime/issues/76041", TestPlatforms.Any)]
[Fact]
public static int TestEntryPoint() { }

変更内容

主要変更

  • 1,201個のテスト除外をインライン属性へマイグレーション
  • 1,751個のテストファイルを修正
  • PlatformDetection.cs に IsThreadingSupported プロパティを追加
  • IL/C#/F#ファイルで51個の using TestLibrary; 追加、16個のプロジェクト参照追加

マイグレーション基盤

  • MSBuild条件(50+種類)をC#/IL/F#属性にマッピング
  • テスト名サフィックス処理(_d, _r, _ro, _do → ベース名)
  • 特殊プロパティマッピング:issue 64127 → PlatformDoesNotSupportNativeTestAssets、issue 41472 → IsThreadingSupported

技術的修正

  • 28個のIL extern宣言に公開キートークン追加
  • 6個のXMLタグ不一致修正、プリプロセッサシンボル順序修正、F#ビット演算構文修正

パフォーマンスへの影響

影響なし。本変更はテスト実行時のロジックを変更せず、除外設定の記述場所のみを変更。ビルド時のパフォーマンスは、集中型ファイルスキャンから分散型属性検査へ移行するため、大規模テストスイートではわずかなビルド時間削減の可能性あり。

関連Issue

  • #76041(finalizer関連テスト除外)
  • #64127(ネイティブテストアセット非対応プラットフォーム)
  • #41472(スレッド処理サポート)
  • runtimelab#155(非ゼロ下限配列サポート)

その他

互換性への影響

  • 公開APIの変更はなし(テストインフラのみ)
  • IsThreadingSupported 追加は新規プロパティで破壊的変更なし

メンテナンス性の改善

  • テスト除外条件が定義場所に記載されるため、テスト修正時に条件を容易に確認・更新可能
  • ドキュメント更新済み(disabling-tests.md 等)

目次