Pull Request on 2026年05月07日

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

注意点

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


目次

  1. #127925 Fix DispatchProxy TypeLoadException for generic type arguments
  2. #127913 Reduce Unsafe usage in primitive IBinaryInteger TryRead/TryWrite
  3. #127910 JIT: Fix untracked uses of lvLiveInOutOfHndlr
  4. #127893 Fix static analysis findings in GC bridge and NativeAOT runtime
  5. #127887 [cDAC] Update allowlist in LegacyFallbackHelper
  6. #127884 Merge ThreadTasks into ThreadState, remove ThreadTasks
  7. #127882 Enable sccache for linux-x64 coreclr PR builds
  8. #127876 Fix iOS arm64 CoreCLR crash from shared MethodDesc::CalliCookie slot
  9. #127871 Fix cDAC x-plat dump tests: pre-zip payloads and exclude osx legs
  10. #127864 Add test: MaxResponseContentBufferSize enforced against decompressed content (Brotli)
  11. #127862 [mobile] Skip localhost subdomain with trailing dot test on Android
  12. #127861 [mobile] Skip ConcurrentDictionary reflection test on mobile platforms
  13. #127846 Remove unsafe code from System.Collections.BitArray
  14. #127845 Remove unsafe code from System.Linq.MaxMin
  15. #127810 JIT: Remove redundant null checks for non-null PHIs
  16. #127795 Inline remaining usages of OpenProcess on Unix
  17. #127788 [clr-ios] Propagate XSLT ActiveIssue from base to derived test classes
  18. #127758 Fix arg iteration for reverse pinvokes
  19. #127751 [Wasm RyuJIT] Codegen for reverse pinvoke/unmanagedcallersonly
  20. #127621 JIT: Clean up and unify SELECT opts
  21. #127587 [release/10.0] Fix off-by-one error in TypePreinit switch instruction handling
  22. #127559 [browser][coreCLR] Enable download retry by default and improve retry sequencing
  23. #127450 JIT: Restore EH-region check in if-conversion flow validation
  24. #127328 [browser][coreclr] WASM-specific GC OS layer; no mmap/decommit
  25. #127183 Fix WebSocket close single-consumer violation
  26. #127050 Fix for 126457
  27. #125491 Implement UnknownSizeFrame for locals with unknown size
  28. #125061 [release/8.0-staging] Update dependencies from dotnet/hotreload-utils

#127925 Fix DispatchProxy TypeLoadException for generic type arguments

概要

DispatchProxyが汎用型引数を持つインターフェース(例:IFoo<TInternal>)をプロキシする際、内部型の汎用引数に対するIgnoresAccessChecksToAttributeが不足していたため、TypeLoadExceptionが発生する問題を修正しました。EnsureTypeIsVisibleメソッドを改善して、汎用型引数を再帰的にチェックするようにしました。

変更内容

  • DispatchProxyGenerator.cs: EnsureTypeIsVisibleメソッドに汎用型引数の再帰的チェック処理を追加(+11行)。これにより、ネストされた汎用型引数が別アセンブリの内部型である場合、対応するIgnoresAccessChecksToAttributeが正しく生成されるようになります。
  • tests.proj: System.Reflection.DispatchProxy.Testsをブラウザ/CoreCLR環境で有効化(テスト除外を削除)。修正により全89テストが合格するため、プラットフォーム固有の除外が不要になりました。

パフォーマンスへの影響

影響なし

関連Issue

#127925

その他

  • この問題はデスクトップ環境ではテスト実行順序によって隠蔽されていました。他のテストが先に属性を追加することで、問題が顕在化しませんでした。
  • 修正方針はVMの独自再帰的アクセシビリティチェック(ClassLoader::CanAccessClass)と同じです。

#127913 Reduce Unsafe usage in primitive IBinaryInteger TryRead/TryWrite

概要

プリミティブ数値型のIBinaryInteger<T>実装におけるTryRead/TryWrite{Big,Little}Endianメソッドで、MemoryMarshal.GetReference、Unsafe.ReadUnaligned、Unsafe.Addなどの unsafe 操作をSpanのインデクサとBinaryPrimitivesヘルパーで置き換えることで、unsafe コードの使用を削減します。

変更内容

  • 対象: System.Private.CoreLib の全プリミティブ数値型(Byte、SByte、Int16、UInt16、Int32、UInt32、Int64、UInt64、Int128、UInt128、Char、IntPtr、UIntPtr)
  • 主な変更:
    • MemoryMarshal.GetReference() + Unsafe.ReadUnaligned/Add → Span インデクサを使用した安全なアクセスに変更
    • BinaryPrimitives ヘルパーメソッドの活用により、エンディアン変換を明示的かつ安全に実装
  • 結果: 各ファイルで unsafe キーワードの使用箇所を削減し、コード行数も短縮

パフォーマンスへの影響

Span インデクサとBinaryPrimitivesヘルパーはコンパイラによって aggressive に最適化されるため、従来の unsafe 操作と比較してパフォーマンス上の実質的な低下なし。コード の安全性向上による過度な最適化阻害の懸念は、BinaryPrimitives の設計により回避されます。

関連Issue

なし

その他

  • このPRはCopilot CLI(AI エージェント)により作成されました
  • PR内に提示されたDiffs (improvements)で詳細な比較が確認可能

#127910 JIT: Fix untracked uses of lvLiveInOutOfHndlr

概要

JITコンパイラにおける lvLiveInOutOfHndlr プロパティの不正な使用を修正します。このプロパティに依存する箇所で lvTracked チェックを追加し、未追跡(untracked)のローカル変数について正しく保守的に処理するようにします。例外ハンドラのセマンティクスと正確性に関わる修正です。

変更内容

  • sideeffects.h: EH存在時に未追跡ローカル変数のストアを全体的に可視化として扱い、スロー地点を越えた不正な並べ替えを防止
  • lclvars.cpp: EH-live定義の参照カウントヒューリスティックを追跡ローカル変数のみに限定
  • gentree.cpp: "likely reg var"ヒューリスティックが、EH-livenessを追跡ローカル変数についてのみ意味のあるものとして扱うよう修正
  • earlyprop.cpp: tryブロック内でのnullcheckムーション(移動)を、追跡されており かつ EH-liveではないローカル変数の場合を除き禁止

パフォーマンスへの影響

若干数のリグレッション予想(作成者明記)。保守的な処理により、例外ハンドラを含むメソッドでのローカル変数最適化が制限される可能性があります。

関連Issue

なし

その他

この修正は、lvLiveInOutOfHndlr プロパティをカプセル化して追跡ローカルケースのみチェック可能にする将来的な変更の準備段階です(作成者コメント)。JITの正確性に関わるため、EH(例外処理)を含むコードの最適化ロジックに影響します。


#127893 Fix static analysis findings in GC bridge and NativeAOT runtime

  • 作成者: @Copilot
  • 作成日時: 2026年05月06日 23:55:39(UTC)
  • マージ日時: 2026年05月07日 13:36:45(UTC)
  • ラベル: area-NativeAOT-coreclr

概要

GCブリッジとNativeAOTランタイム内の静的解析の警告を修正するPRです。メモリ割り当て不一致、null参照解除の可能性、無効なハンドルクリーンアップの3つの問題を修正しています。ランタイム内部の低レベルな実装の改善で、公開APIへの影響はありません。

変更内容

  • src/coreclr/gc/gcbridge.cpp: メモリ割り当て不一致を修正。new[]で割り当てたメモリをfreeで解放していた箇所をdelete[]に変更(+2/-2)
  • src/coreclr/nativeaot/Runtime/stressLog.h/cpp: NativeAOT stress log内のnull参照解除の可能性を修正。ヒープ割り当てのCrstStaticをインラインminipal_mutexに置き換え、minipal_mutex_init成功をアサート(合計+5/-9)
  • src/coreclr/nativeaot/Runtime/windows/PalMinWin.cpp: 無効なハンドルのクリーンアップを修正。hMapとhFileに対するCloseHandle呼び出しをガード(+9/-2)

パフォーマンスへの影響

影響なし。これらは静的解析警告の修正であり、パフォーマンス特性は変わりません。

関連Issue

なし

その他

  • ビルド検証: ./build.sh clr+libs+hostで修正前後ともパス
  • コードレビュー: 承認済み(残存コメントなし)
  • CodeQL解析: スキップ(DBサイズ制限)
  • src/coreclr/inc/stresslog.hとsrc/coreclr/utilcode/stresslog.cppへの変更はレビュアーのフィードバックに基づいて取り消され、アップストリームから変更なし

#127887 [cDAC] Update allowlist in LegacyFallbackHelper

  • 作成者: @rcj1
  • 作成日時: 2026年05月06日 20:58:38(UTC)
  • マージ日時: 2026年05月07日 02:53:20(UTC)
  • ラベル: area-Diagnostics-cdac

概要

cDAC(Compact Debugger Access Component)のレガシーフォールバック機能において、CDAC_NO_FALLBACK=1が設定されている際にレガシーDAC(Debugger Access Component)へのフォールバックを許可するAPIのallowlistから3つのメソッドを削除しました。これにより、no-fallback実行時の制限がより厳密になります。

変更内容

src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/LegacyFallbackHelper.cs

  • IXCLRDataModule.GetMethodDefinitionByToken をallowlistから削除
  • ISOSDacInterface11.IsTrackedType をallowlistから削除
  • ISOSDacInterface.TraverseLoaderHeap をallowlistから削除

合計9行のコード削除

パフォーマンスへの影響

影響なし

関連Issue

なし

その他

このPRは内部実装の変更であり、cDACのレガシーフォールバックゲーティング機能の動作を改善します。削除されたメソッドはすでに新しい実装で対応されているため、allowlistから除外することで、より新しいDAC実装の使用を強制しています。


#127884 Merge ThreadTasks into ThreadState, remove ThreadTasks

  • 作成者: @Copilot
  • 作成日時: 2026年05月06日 20:36:41(UTC)
  • マージ日時: 2026年05月07日 01:08:19(UTC)
  • ラベル: area-System.Threading

概要

ThreadTasks(単一エントリの列挙型TT_CleanupSyncBlock)をThreadStateに統合し、独立したm_ThreadTasksフィールドを削除するリファクタリング。ThreadStateに未使用のビット(0x00000020)が存在し、すでにInterlockedOr/InterlockedAndによる原子的な操作に対応していたため、冗長な実装を整理したもの。

変更内容

  • src/coreclr/vm/threads.h: ThreadTasks列挙型とm_ThreadTasksフィールドを削除(-16行)、ThreadStateに対応するビットフラグを追加(+4行)
  • src/coreclr/vm/threads.cpp: ThreadTasks関連の実装を削除(-3行)、ThreadStateでの処理に統合(+1行)

パフォーマンスへの影響

わずかなメモリ削減(Threadオブジェクトあたり1フィールド分)。原子操作は既存のInterlockedOr/InterlockedAndメカニズムを活用するため、パフォーマンス特性に変化なし。

関連Issue

なし

その他

コード内のTODOコメントで既に統合の必要性が指摘されていたリファクタリング。内部実装の変更で公開APIへの影響なし。


#127882 Enable sccache for linux-x64 coreclr PR builds

概要

Linux x64 CoreCLR ネイティブビルドのPRパイプラインに対して、sccacheをコンパイラキャッシュとして導入します。Azure Pipelines Cacheタスクを使用してsccacheのストレージディレクトリをビルド間で永続化し、ビルド後に統計情報を出力することで、PR CI時のビルド時間を短縮できます。

変更内容

  • src/coreclr/runtime-prereqs.proj: sccache 0.15.0のPackageDownloadを追加(Linux CI環境のみ)
  • src/coreclr/build-runtime.sh: sccacheバイナリに対して実行権限を付与(NuGetが削除する対策)
  • eng/pipelines/coreclr/templates/setup-sccache.yml: Pipeline Cacheの設定、USE_SCCACHE/SCCACHE_DIR環境変数の設定、PATHへのsccache追加を行う事前ビルドテンプレート
  • eng/pipelines/coreclr/templates/sccache-stats.yml: sccache --show-statsを実行する事後ビルドテンプレート
  • eng/pipelines/runtime.yml: CoreCLR_LibrariesおよびLibraries_CheckedCoreCLRジョブに上記テンプレートを統合

パフォーマンスへの影響

sccacheはC++コンパイル結果をキャッシュすることで、ビルド時間を短縮します。具体的な改善率やベンチマーク数値は提供されていません。テンプレートはコンパイル時条件により非linux-x64プラットフォームでは動作しません。

関連Issue

なし

その他

  • このPRはGitHub Copilotの支援で作成されました
  • テンプレートはマトリックスジョブ内の非linux-x64プラットフォームでは無操作となるように設計されており、将来的に他のプラットフォーム/実行環境への拡張が容易です
  • ビルド処理:(1)Pipeline Cacheでsccacheストレージを復元 → (2)runtime-prereqs.projでsccacheBinaryをダウンロード → (3)CMakeビルドがsccacheをコンパイラランチャーとして使用 → (4)統計情報を出力してキャッシュを保存

#127876 Fix iOS arm64 CoreCLR crash from shared MethodDesc::CalliCookie slot

概要

PR #127016で導入されたcalli署名キャッシュ機構により、iOS arm64でのCoreClrクラッシュが発生していました。MethodDescの共有キャッシュスロットに対して、インタープリタ-ネイティブ呼び出しパスとIL Stubの新しいコード両方が書き込みを行うことが原因です。修正ではCInterpreterJitInfo::GetCookieForInterpreterCalliSigのキャッシュ機構を削除し、毎回GetCookieForCalliSigで計算するようにPR #127016以前の動作に戻しました。

変更内容

  • src/coreclr/vm/jitinterface.cpp: CInterpreterJitInfo::GetCookieForInterpreterCalliSigからpContextMD->{Set,Get}CalliCookieの呼び出しを削除(-19行)、常にGetCookieForCalliSig(sig, pContextMD)で計算するよう修正(+12行)

パフォーマンスへの影響

キャッシュ機構の削除により、毎回calli署名キャッシュの計算が実行されます。パフォーマンスへの影響は軽微と考えられますが、具体的な数値情報は提供されていません。

関連Issue

#127869、#127863、#127867、#127016

その他

  • iOS arm64プラットフォーム固有の問題です。アドレス0の実行時にカーネルがページをコード署名無効と判定しSIGKILLで強制終了させることが根本原因
  • 内部実装(CoreCLRランタイム)の変更で、公開APIには影響なし

#127871 Fix cDAC x-plat dump tests: pre-zip payloads and exclude osx legs

概要

cDAC x-plat dump テストの Helix 送信時に発生する 2 つの問題を修正しています:

  1. Helix SDK の MemoryStream の 2 GB 上限により、大きなペイロードの ZIP 圧縮でアップロード失敗
  2. macOS(osx_arm64/osx_x64)ペイロードの大きさにより、Helix ホストのディスク圧迫

修正として、ZipDirectory でダンプディレクトリを事前に ZIP ファイルとして作成し、<PayloadDirectory> の代わりに <PayloadArchive> で既存 ZIP をアップロードする方式に変更。同時に x-plat テストから macOS をスキップします。

変更内容

  • eng/pipelines/runtime-diagnostics.yml:cdacXPlatDumpPlatforms パラメータを追加し、x-plat テストから osx_arm64 / osx_x64 を除外(単一レグモード用の cdacDumpPlatforms は従来通り)
  • src/native/managed/cdac/tests/DumpTests/cdac-dump-xplat-test-helix.proj:MSBuild の ZipDirectory タスクでプラットフォーム別ダンプを事前 ZIP 化し、Helix に <PayloadArchive> として送信(CompressionLevel="Fastest" で速度を優先)

パフォーマンスへの影響

改善点:

  • FileStream 経由のストリーミング転送により、MemoryStream の 2 GB 上限を回避
  • Helix ホストのディスク容量圧迫を軽減(macOS ペイロード除外により)

懸念点:

  • ローカル ZIP 化ステップが追加されるが、ダンプファイルの圧縮率が低いため実質的なコストは小さい

関連Issue

#127859

その他

  • 本修正は既に src/tests/Common/helixpublishwitharcade.proj で採用されている同じパターンを応用
  • macOS をスキップするのは暫定対応(TODO)で、ダンプセット縮小または Helix キュー拡張後に x-plat フローでも macOS を再有効化予定
  • 単一レグモード(cdacDumpTestMode=single-leg)は従来通り全プラットフォーム対応のため、macOS カバレッジは保持

#127864 Add test: MaxResponseContentBufferSize enforced against decompressed content (Brotli)

  • 作成者: @Copilot
  • 作成日時: 2026年05月06日 13:01:40(UTC)
  • マージ日時: 2026年05月07日 17:05:36(UTC)
  • ラベル: area-System.Net.Http

概要

HttpClient.MaxResponseContentBufferSizeが自動Brotli解凍時に解凍後のレスポンスサイズに対して正しく適用されることを検証する機能テストを追加しました。既存のLoopbackサーバーインフラを活用し、高圧縮率のBrotliコンテンツでバッファサイズ制限が実装される動作を確認します。

変更内容

  • HttpClientHandlerTest.Decompression.cs: 新しいFactテストを追加。高圧縮Brotliコンテンツをストリーミングし、解凍後のサイズがMaxResponseContentBufferSizeを超えるとクライアントが失敗することを検証
  • ByteCountingStream: DelegatingStreamを継承した新しいストリームラッパーを実装。サーバーが送信した圧縮データの量を追跡し、圧縮後のデータサイズが解凍バッファ制限より小さいことを確認
  • System.Net.Http.WinHttpHandler.Functional.Tests.csproj: .NETCoreApp条件付きでDelegatingStream.csを追加(net481では使用不可なAPI対応)

パフォーマンスへの影響

影響なし

関連Issue

#127864

その他

このテストは、高圧縮データを扱う場合でもクライアントが迅速にバッファ制限を適用することを実証します。テストは信頼性を保ちつつ、サーバーが実際に送信する圧縮データ量がクライアントのバッファ制限に達する前に、展開後の制限に達することを検証します。


#127862 [mobile] Skip localhost subdomain with trailing dot test on Android

概要

Android プラットフォーム上で DNS クエリが RFC 6761 の仕様と異なる動作をするため、DnsGetHostEntry_LocalhostSubdomainWithTrailingDot_ReturnsLoopback テストをスキップする変更です。Android の DNS リゾルバーは *.localhost.(末尾ドット付き)をループバックアドレスに解決せず、実ネットワークアドレスを返すため、既存の issue #126456 と同じ [ActiveIssue] 属性を追加して対応しています。

変更内容

  • src/libraries/System.Net.NameResolution/tests/FunctionalTests/GetHostEntryTest.cs: DnsGetHostEntry_LocalhostSubdomainWithTrailingDot_ReturnsLoopback テストメソッドに [ActiveIssue(#126456)] 属性を追加し、Android プラットフォーム(android-arm64、android-arm、android-x64、android-x86)でのテスト実行をスキップします。

パフォーマンスへの影響

影響なし

関連Issue

#126456

その他

  • このテスト失敗は DnsGetHostEntry_LocalhostSubdomain_ReturnsLoopback(末尾ドットなし)と同じ根本原因であり、既に同じ issue で追跡されています。
  • Android デバイスではフレームワークの DNS リゾルバーが .localhost サブドメインを RFC 6761 で規定された予約名として扱わず、末尾ドットの有無に関わらずループバックアドレスへの解決を保証しません。

#127861 [mobile] Skip ConcurrentDictionary reflection test on mobile platforms

概要

ConcurrentDictionary_Generic_Tests_string_string.NonRandomizedToRandomizedUpgrade_FunctionsCorrectlyテストがiOS、tvOS、macCatalyst、Androidなどのモバイルプラットフォームで失敗するため、[SkipOnPlatform]属性を使用してこれらプラットフォームでのテスト実行をスキップします。

このテストはType.GetType()を使用してConcurrentDictionaryの非公開ネストされた型(Tables)にリフレクションでアクセスしており、トリミング・AOTコンパイルされたモバイルビルドではTypeLoadExceptionが発生します。

変更内容

  • src/libraries/System.Collections.Concurrent/tests/ConcurrentDictionary/ConcurrentDictionary.Generic.Tests.cs
    • NonRandomizedToRandomizedUpgrade_FunctionsCorrectlyテストに[SkipOnPlatform]を追加し、iOS、tvOS、macCatalyst、Android環境でのテスト実行をスキップ
    • 既存のトリミング関連の[ActiveIssue]属性は保持

パフォーマンスへの影響

影響なし(テストスキップのみの変更)

関連Issue

なし

その他

  • 技術的背景: モバイルプラットフォームではアセンブリがトリミング・AOTコンパイルされるため、非公開のネストされた型に対するリフレクションが機能しません
  • テスト性質: このテストは公開API契約ではなく、内部実装詳細の動作検証であるため、プロダクトの不具合ではなくモバイルプラットフォームの技術的制限に起因しています
  • 影響範囲: tvos-arm64、iossimulator-x64/arm64、maccatalyst-x64/arm64、android-arm64/arm/x64/x86で失敗が報告されていました

#127846 Remove unsafe code from System.Collections.BitArray

概要

System.Collections.BitArrayのコンストラクタから unsafe コードを削除し、Unsafe.As<bool, byte>による型再解釈を廃止。代わりにMemoryMarshal.AsBytesで取得したReadOnlySpan<byte>を使用してSIMD操作を行うよう変更しました。

変更内容

  • src/libraries/System.Private.CoreLib/src/System/Collections/BitArray.cs
    • BitArray(bool[] values)コンストラクタの実装を変更
    • Unsafe.As<bool, byte>の使用を削除
    • MemoryMarshal.AsBytesを利用してReadOnlySpan<byte>を取得
    • Vector*.LoadUnsafe(ref, offset)ループをVector*.Create(ReadOnlySpan<byte>)と span スライシングに置き換え
    • インデックスベースのforループからwhile (valuesAsBytes.Length >= ...)ループに変更

パフォーマンスへの影響

影響なし(unsafe コード削除による機能等価性が維持されていることが期待される)

関連Issue

なし

その他

このPRはAI生成のコードです。変更はSIMD最適化を維持しながら unsafe コードを排除し、メモリ安全性を向上させています。


#127845 Remove unsafe code from System.Linq.MaxMin

概要

System.Linq.MaxMinのunsafeコードを安全なコードに置き換えるPRです。LoadUnsafeと参照操作をspan基準のVector*.Create(ReadOnlySpan<T>)に変更し、Vector256/512をVector128に圧縮することでスカラーループの効率を向上させます。インライナー予算対策として複数の[AggressiveInlining]アトリビュートを追加しています。

変更内容

  • System.Linq/src/System/Linq/MaxMin.cs: MinMaxIntegerメソッド内のunsafeコードをspan スライシングとVector APIの安全な呼び出しに置き換え。Vector256/512からVector128への効率的なリダクション処理を実装。複数のメソッドに[AggressiveInlining]アトリビュートを追加。
  • coreclr/jit/inline.cpp, inline.h, importercalls.cpp: JITインライナー予算関連の設定を調整し、Safeな実装でのインライナー予算枯渇に対応。

パフォーマンスへの影響

x64(AVX-512環境)で大幅な改善を実現:

  • IntMax: 16要素で9.41倍、32要素で2.79倍、200要素で5.42倍、1000要素で1.89倍高速化
  • IntMin: 16要素で3.10倍、32要素で2.61倍、200要素で3.03倍高速化
  • ByteMax: 4要素で3.37倍、200要素で6.52倍、1000要素で7.76倍高速化

arm64(Apple M2)ではほぼ横ばい。小~中規模配列で若干の低下あるが、大規模配列では改善あり。

関連Issue

#127845

その他

このPRはAI生成です。Vector256/512をVector128にリダクションすることで、スカラーループが最小ベクトルサイズのみ処理するようになり、特にAVX-512環境での効率が向上します。公開API(LINQ Max/Min)の動作は変わらず、内部実装の最適化です。


#127810 JIT: Remove redundant null checks for non-null PHIs

  • 作成者: @EgorBo
  • 作成日時: 2026年05月05日 16:09:17(UTC)
  • マージ日時: 2026年05月07日 11:56:56(UTC)
  • ラベル: area-CodeGen-coreclr

概要

JIT(Just-In-Time)コンパイラの非null アサーション伝播を改善し、PHI(PHI関数)値に到達するエッジアサーションを検査することで、??=演算子による統合後の冗長なnullチェックを削除します。

class Program
{
    Inner? _inner;

    [MethodImpl(MethodImplOptions.NoInlining)]
    public int Invoke(int n) => (_inner ??= new Inner()).Do(n);
}

上記のようなコードで、不要なnullチェック命令(cmp byte ptr [rax], al)が削除されます。

変更内容

  • src/coreclr/jit/assertionprop.cpp: optAssertionIsNonNull 関数を拡張し、PHI定義の値番号(VN)とそのベースVNに到達するエッジアサーションを検査するロジックを追加(+44/-36)
  • src/coreclr/jit/compiler.h: 関数シグネチャの軽微な変更(+1/-1)

既存の optVisitReachingAssertions + optAssertionVNIsNonNull ビジターパターンを再利用し、すべてのPHI引数がnon-nullであることを証明できる場合のみ、値をnon-nullと判定する実装になっています。

パフォーマンスへの影響

生成されるコード(x64アセンブリ)から不要なnullチェック命令が削除され、命令数が削減されます。メモリアクセス不要になるため、わずかな実行速度改善が期待できます。

関連Issue

#127796

その他

この変更は内部実装の最適化で、公開APIに影響はありません。非nullアサーション伝播はJIT最適化フェーズの一部として、コンパイル時に冗長なチェックを排除します。


#127795 Inline remaining usages of OpenProcess on Unix

概要

UnixプラットフォームにおけるOpenProcess関連APIの使用箇所を削除し、これらのAPIをPAL(Platform Abstraction Layer)から廃止するリファクタリングです。デバッガのリモートデータ取得処理において、OpenProcess/OpenProcessMemoryの呼び出しをインライン化し、PAL抽象化を廃止することで、プラットフォーム固有の実装を削除しています。

変更内容

  • dbgtransportmanager.cpp/h: OpenProcess呼び出しをインライン化し、プロセスハンドル取得ロジックをファイルローカルで実装
  • shimremotedatatarget.cpp: OpenProcessMemory呼び出しをインライン化
  • debugger.cpp: デバッガ初期化処理の簡略化
  • pal.h/process.cpp: OpenProcess、OpenProcessMemory、関連の列挙型・構造体定義を削除(PAL公開APIから廃止)
  • synchmanager相関: プロセス同期管理に関連する1400行以上のコードを削除(Unix固有の実装)
  • PALテストスイート: cross-process同期イベント・セマフォテストを削除(26ファイル、約3,400行)
  • mscordac_unixexports.src: エクスポートシンボルの削除

パフォーマンスへの影響

影響なし。本変更はコード整理・API廃止であり、実行時パフォーマンスに直接的な影響はありません。

関連Issue

#127604(フォローアップ)

その他

  • 互換性: PALの公開APIを削除する破壊的変更ですが、Unix向けのinternal APIレベルの変更です
  • 削除対象: Unix固有のクロスプロセス同期機構(shared event/semaphore)が廃止されるため、PALの該当機能を依存していたコードへの影響確認が必要です
  • コードサイズ削減: PAL関連コード削除により約2,500行以上の削減

#127788 [clr-ios] Propagate XSLT ActiveIssue from base to derived test classes

概要

xUnitの[ActiveIssue]属性は基底クラスから派生クラスに継承されない仕様により、#127464で基底クラスXsltApiTestCaseBase2に設定された[ActiveIssue(IsAppleMobile, IsCoreCLR)]が機能せず、469個のXSLTテストが依然として実行されてTypeInitializationExceptionを発生させていました。このPRは、[ActiveIssue]属性を具体的な派生テストクラスに直接設定することで、AppleMobileプラットフォーム上でのテストスキップを正しく機能させます。

変更内容

  • XsltApiV2.cs: 基底クラスXsltApiTestCaseBase2から非機能の[ActiveIssue]属性を削除
  • 9つの派生テストクラス(XsltSettings.cs、XslTransformMultith.cs、XsltArgumentListMultith.cs、XsltArgumentList.cs、XslCompiledTransform.cs、TempFiles.cs、OutputSettings.cs、Errata4.csなど):各クラスに[ActiveIssue(".../124344", IsAppleMobile, IsCoreCLR)]を追加して、AppleMobile CoreCLRプラットフォーム上でスキップされるようにしました

パフォーマンスへの影響

影響なし

関連Issue

#127464(基となった変更)、#124344(参照されるIssue)

その他

テスト属性の継承に関するxUnitの仕様制限により、基底クラスの属性では派生クラスに効果が及ばないことが判明しました。このPRは、テスト実行パイプラインで不要なテスト失敗を防ぎ、CI/CDの安定性を向上させます。


#127758 Fix arg iteration for reverse pinvokes

概要

Reverse P/Invoke IL スタブの引数イテレーション処理を修正。ArgIterator ではなく PInvokeArgIterator を使用し、構造体マーシャリングのリバースコールバック時の引数解析の正確性を向上させます。

変更内容

  • src/coreclr/vm/callstubgenerator.cpp: Reverse P/Invoke IL スタブを unmanaged call convention として扱うようにラウティングロジックを修正(2行削除、2行追加)
    • CallStubGenerator::ComputeCallStub に Reverse P/Invoke 特化分岐を追加
    • Reverse P/Invoke IL スタブをプラットフォーム既定の unmanaged calling convention でマーク

パフォーマンスへの影響

影響なし

関連Issue

#127758

その他

  • 修正対象: Interop/StructMarshalling/ReversePInvoke/MarshalSeqStruct/ReversePInvoke テストにおける ArgIteratorBase::IsRegPassedStruct でのクラッシュ
  • 内部実装の変更であり、公開API への影響なし
  • Reverse P/Invoke(ネイティブコードから .NET へのコールバック)シナリオでの互換性修正

#127751 [Wasm RyuJIT] Codegen for reverse pinvoke/unmanagedcallersonly

概要

WebAssembly RyuJIT コードジェネレータで、reverse P/Invoke および UnmanagedCallersOnly 属性によるアンマネージドエントリポイントのサポートを追加しました。これにより、WASM shadow スタックポインタが明示的な引数として渡されない場合のプロローグ生成に対応し、以下のようなコードのコンパイルが可能になります:

[UnmanagedCallersOnly(CallConvs = new[] { typeof(CallConvCdecl) })]
static int uco () {
    return 42;
}

変更内容

  • src/coreclr/jit/codegenwasm.cpp: genAllocLclFrame を更新し、SP引数が実際のパラメータではない(reverse P/Invoke の場合)に、グローバルから SP ローカル変数を初期化する処理を追加。WASM グローバルインデックス定数を導入
  • src/coreclr/jit/compiler.hpp: 小規模な定義変更
  • src/coreclr/jit/lclvars.cpp: 小規模な定義変更

通常のマネージド呼び出し規約における SP ファーストアーグパスの既存パスは維持されます。

パフォーマンスへの影響

影響なし

関連Issue

なし

その他

この変更は WebAssembly ターゲット固有の実装です。内部コンパイラコード(JIT)の変更であり、公開 API への影響はありません。


#127621 JIT: Clean up and unify SELECT opts

概要

JITコンパイラのSELECT最適化をクリーンアップして統一し、将来の変換追加を容易にするためのリファクタリングです。SELECT変換の呼び出しをHIR内の他の箇所からも可能にしています。本PRは機能上の変更はなく(zero-diff)、その後の改善の基盤となることを目指しています。

変更内容

  • src/coreclr/jit/ifconversion.cpp: SELECT最適化ロジックの再構成と統一。変換パターンの追加を容易にするための構造化 (+172/-136)
  • src/coreclr/jit/lower.cpp: 冗長なコード削除 (-28)

パフォーマンスへの影響

影響なし(zero-diff PR)

関連Issue

なし

その他

作成者は本PRの後に以下の改善を予定していると記載しています:

  • インパクトのあるSELECT変換の追加
  • "optimizeBools"フェーズをSELECT変換として実装し直す(if-conversion自体の改善が必要)
  • SELECT最適化後にコストチェックを移動し、if-conversionの主な目的を制御フローの単純化に絞り、他の最適化がその成果を活用できるようにする設計への転換を検討中

#127587 [release/10.0] Fix off-by-one error in TypePreinit switch instruction handling

概要

TypePreinitのswitch命令ハンドリングにおけるオフバイワンエラーを修正。値がケース数と正確に一致する場合、存在しないジャンプテーブルエントリへのアクセスを試みており、IL読み取りオフセットを破損させてNativeAOT コンパイル時にIndexOutOfRangeExceptionが発生していた問題に対応しています。

変更内容

  • src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/TypePreinit.cs: オフバイワンエラーの修正(1行の変更)
  • src/tests/nativeaot/SmokeTests/Preinitialization/Preinitialization.cs: テストケース追加(2行の追加)

パフォーマンスへの影響

影響なし

関連Issue

#123911

その他

本PR は release/10.0 ブランチへのバックポート。顧客報告による問題修正で、リスク評価は低。ユニットテストで検証済み。


#127559 [browser][coreCLR] Enable download retry by default and improve retry sequencing

概要

WebAssembly向けcoreCLRローダーにおいて、ダウンロード再試行をデフォルトで有効化し、再試行シーケンスを改善しました。すべての初回ダウンロードがキューに登録されるまで再試行を遅延させることで、起動時の再試行ストームがダウンロードスロットを枯渇させるのを防ぎます。

変更内容

  • config.ts: enableDownloadRetryをデフォルトでtrueに設定
  • assets.ts:
    • allDownloadsQueuedPCSプロミスで再試行をゲート化し、すべての初回ダウンロードがキューに登録されるまで再試行を開始しない
    • fetchBytes/fetchTextでloadResourceのエラーをキャッチして再スロー、loadBootResourceコールバックの.silentフラグを削除し、エラーが通常のリスナーを通じて浮上するようにする
    • 診断トレース用に「Retrying download」「Retrying download (2)」ログを追加
  • run.ts: resolveAllDownloadsQueued()を呼び出して再試行をゲート化
  • ModuleConfigTests.cs:
    • DownloadProgressFinishesの[InlineData(true)]ケースを再度有効化
    • DownloadRetryRecoversFromFailureテストを追加し、ダウンロード失敗時の再試行回復と進捗完了を検証

パフォーマンスへの影響

起動時の再試行ストームを削減により、初回ダウンロードリソースのスターベーション(枯渇)を防止。ただし具体的なベンチマーク数値は提供されていません。

関連Issue

#124946

その他

なし


#127450 JIT: Restore EH-region check in if-conversion flow validation

  • 作成者: @Copilot
  • 作成日時: 2026年04月27日 12:17:19(UTC)
  • マージ日時: 2026年05月07日 11:20:09(UTC)
  • ラベル: area-CodeGen-coreclr

概要

JITのIf-conversion最適化フェーズにおいて、EH(例外処理)領域の境界チェックが誤って削除されていた問題を修正します。Fuzzlyn生成のテストケースで、ThenブロックがTry領域の開始地点である場合に BBF_DONT_REMOVE アサーション失敗が発生していました。PR #125347 で IfConvertCheckFlow が簡略化された際に BasicBlock::sameEHRegion チェックが不適切に削除されたため、これを復元します。

変更内容

  • src/coreclr/jit/ifconversion.cpp — OptIfConversionDsc::IfConvertCheckFlow に EH領域チェックを追加。Then/Else ブロックが m_startBlock と同じ EH領域にあることを確認してから if-conversion を実行。False/True ブロックの取得時に新しい HasElseBlock() ヘルパーを使用。
  • src/tests/JIT/Regression/JitBlue/Runtime_127446/Runtime_127446.cs — 元の再現ケースを使用した回帰テストを追加。
  • src/tests/JIT/Regression/Regression_ro_2.csproj — 回帰テストをプロジェクトに統合。

パフォーマンスへの影響

影響なし。本修正は if-conversion の条件チェックを厳しくするもので、パフォーマンス改善や低下をもたらすものではありません。

関連Issue

#127446(Fuzzlyn repro に基づくアサーション失敗) [#125347](https://github.com/dotnet/runtime/issues/125347)(チェック削除の原因となったPR)

その他

  • 修正前:ThenまたはElseブロックが EH領域の開始地点の場合でも if-conversion が進行し、後のブロック削除時にアサーション失敗が発生
  • 修正後:EH領域の不整合を事前に検出して if-conversion をスキップ。テスト検証済み

#127328 [browser][coreclr] WASM-specific GC OS layer; no mmap/decommit

概要

WASM環境でのメモリ管理に対応するため、GCのOS抽象化レイヤー(GCToOSInterface)をUNIX実装から分離し、WASM専用実装を導入しました。WASMでは仮想メモリ機能(mmap/decommit)が実質的に利用できないため、posix_memalign/freeベースの実装に切り替え、新たにnever_decommit_pフラグを導入してdecommit不可の意図をコード上で明確化しています。

変更内容

  • GC OS層の分離:gc/wasm/gcenv.cpp(新規)にWASM専用実装を追加し、VirtualReserve/VirtualCommit/VirtualDecommit/VirtualReleaseをposix_memalign/freeで実装。gc/unix/gcenv.unix.cppからWASM関連の#ifdefパッチを削除
  • GCフラグの導入:新たにnever_decommit_pフラグを追加。WASMで無条件に有効化、他プラットフォームではuse_large_pages_p設定時に有効化
  • PAL仮想メモリの更新:virtual.cppをWASM対応に修正し、MEM_DECOMMIT時にメモリをゼロ化して次のVirtualCommitに備える
  • ページサイズ抽象化:minipal_getpagesize(新規)を導入。WASM時はコンパイル時定数16KB、Windows時は4KB定数、他POSIX時はgetpagesize()をキャッシュ。PAL呼び出し元を更新
  • CMake再構成:gc/CMakeLists.txtでWASMターゲットをgc/wasmへ振り分け、同時にunix/configure.cmakeでconfig.gc.h生成

パフォーマンスへの影響

影響なし。メモリ割り当て戦略の変更はWASM固有で、非WASM環境の既存動作はnever_decommit_p == use_large_pages_pのため変わらず。

関連Issue

その他

  • VirtualReserveAndCommitLargePagesはWASMで通常のreserve/commitパスへフォールスルー
  • posix_memalignは新規割り当てまたはメモリプール再利用のいずれかで、呼び出し元の「メモリはゼロ化済み」前提を満たすため、reserve時とdecommit時に常にmemsetでゼロ化
  • VirtualResetはWASムでfalseを返却し、GCにmadvise(emscriptenで無効)ではなくmemsetベースのfallbackを強制

#127183 Fix WebSocket close single-consumer violation

概要

WebSocketのクローズハンドシェイク中に、HTTP/2上で並行するReceiveAsyncとCloseAsyncの呼び出しによる単一コンシューマー違反を修正しました。RFC 6455 7.1.1の"クライアントがサーバーのTCPクローズを待つ"ステップを_receiveMutexの背後で保護することで、同じストリームからの並行読み取りを防止し、Http2Stream.TryReadFromBufferのDebug.Assert(!_hasWaiter)失敗を解決します。

変更内容

  • ManagedWebSocket.cs: RFC 6455 7.1.1のEOF待機をSendCloseFrameAsyncから呼び出し元に移行。HandleReceivedCloseAsyncは既に_receiveMutexを保持しており、CloseAsyncPrivateとCloseOutputAsyncCoreはEOF待機前に_receiveMutexを取得するよう修正。CloseWithReceiveErrorAndThrowAsyncは_receiveMutex下で実行されるため、再入を避けるためSendCloseFrameAsyncを直接呼び出し。_waitedForServerCloseワンショットガードを維持して、複数のクローズパスが完了ハンドシェイク状態に到達した場合のEOF待機の重複を防止。
  • CloseTest.cs: RunClient_CloseAsync_DuringConcurrentReceiveAsync_ExpectedStatesテストのコメントを更新し、OperationCanceledExceptionの由来を正確に説明(受信ループ中に状態がAbortedの場合、ReceiveAsyncPrivateが例外を変換)。テストロジックの変更なし。

パフォーマンスへの影響

影響なし

関連Issue

#121157、#117267

その他

  • 公開APIの変更なし。意図した状態機械の変化なし。
  • RFC 6455 7.1.1の"クライアントがサーバーのTCPクローズを待つ"ステップは完了クライアントクローズハンドシェイクに対して最大1回実行される仕様を維持。
  • HTTP/1.1では動作は以前も問題でしたが歴史的にエラーハンドリングで許容されていました。HTTP/2ではHttp2Stream.Http2ReadWriteStreamが単一コンシューマー読み取り不変性を強制するため、このPRで修正されます。
  • クラスレベルのスレッド安全契約で明記されている"ペンディングReceiveAsync中にCloseOutputAsyncまたはCloseAsyncを呼び出すことは許容される"シナリオに対応。

#127050 Fix for 126457

概要

bool型のインライン関数が末尾呼び出し(tail call)を含み、戻り値が末尾呼び出しとは別のブロックにある場合、インライナーが挿入する正規化キャスト(int→ubyte→int)を末尾呼び出し検証で適切に処理するよう修正しました。正規化キャストは末尾呼び出しの場合、呼び出し元関数がインライン化されなかった場合にはmorphの後の段階で挿入されるため、安全に無視できます。

変更内容

  • src/coreclr/jit/morph.cpp: 末尾呼び出し検証ロジックを拡張し、正規化キャストを識別して無視する処理を追加(+14行)
  • src/tests/JIT/Regression/JitBlue/Runtime_126457/Runtime_126457.il: リグレッションテストを追加(+98行)
  • src/tests/JIT/Regression/JitBlue/Runtime_126457/Runtime_126457.ilproj: テストプロジェクト構成ファイルを追加(+14行)

パフォーマンスへの影響

影響なし

関連Issue

#126457

その他

なし


#125491 Implement UnknownSizeFrame for locals with unknown size

概要

未知サイズのローカル変数(TYP_SIMDとTYP_MASK型)を処理するためのUnknownSizeFrameを実装しました。ARM64アーキテクチャでは、x19レジスタをこのフレーム内のローカル変数のアドレッシング用に予約し、SVE メモリ転送命令を更新してベクトル長の倍数(またはマスクの場合はVL/8)に対応させています。

変更内容

  • lclvars.cpp: lvaIsUnknownSizeLocalが真のローカル変数に対してUnknownSizeFrameへの割り当てロジックを追加(109行追加)
  • compiler.h: UnknownSizeFrame管理用の構造体およびメンバ変数を新規追加(215行追加)
  • emitarm64.cpp: SVE命令のメモリアドレッシング方式を更新し、インデックスをベクトル長の倍数で指定するよう変更(169行追加/166行削除)
  • codegenarmarch.cpp: ARM64特有のコード生成ロジックを追加(41行追加)
  • codegencommon.cpp: フレーム初期化時の共通処理を追加(28行追加)
  • regset.cpp: x19レジスタの予約管理を更新
  • lsra.cpp: レジスタ割り当て時のUnknownSizeFrame対応を追加
  • targetarm64.h: ARM64ターゲット設定を更新

パフォーマンスへの影響

影響なし(アーキテクチャレベルの機能追加であり、既存のコード生成パスに直接的な変更を加えるものではありません)

関連Issue

#125491

その他

このPRは複数レビュアー(jakobbotsch、AndyAyersMS)による段階的なレビューを経ており、ARM64特有の機能実装です。x19レジスタの予約はARM64の呼び出し規約における変更となるため、既存コードとの互換性確認が必要です。


#125061 [release/8.0-staging] Update dependencies from dotnet/hotreload-utils

概要

dotnet/hotreload-utilsからの依存パッケージを更新するPull Requestです。Microsoft.DotNet.HotReload.Utils.Generator.BuildToolを8.0.0-alpha.0.26116.3から8.0.0-alpha.0.26202.2にアップグレードしています。

変更内容

  • eng/Version.Details.xml: hotreload-utils依存関係のメタデータを更新(commit: d51568ac5594873815971cb9e3e7ee2d463a01ef)
  • eng/Versions.props: Microsoft.DotNet.HotReload.Utils.Generator.BuildToolのバージョン番号を更新
  • NuGet.config: 1行削除(詳細不明)

パフォーマンスへの影響

影響なし

関連Issue

なし

その他

  • 自動依存関係更新(dotnet-maestroによる)
  • release/8.0-stagingブランチへの更新
  • ビルド日時: 2026年4月2日 (UTC)

目次