Pull Request on 2026年04月25日

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

注意点

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



#127413 Add [NoInlining] to Marvin.ComputeHash32OrdinalIgnoreCase

概要

Marvin.ComputeHash32OrdinalIgnoreCaseメソッドに[MethodImpl(MethodImplOptions.NoInlining)]属性を追加します。これにより、JITインラインバジェット増加(#118641)で発生していた部分的なインライン化による性能低下を防ぎます。既に同じ属性がMarvin.ComputeHash32に存在しており、OrdinalIgnoreCaseバージョンにも同じ対策が必要でした。

変更内容

  • src/libraries/System.Private.CoreLib/src/System/Marvin.OrdinalIgnoreCase.cs: ComputeHash32OrdinalIgnoreCaseメソッドに[MethodImpl(MethodImplOptions.NoInlining)]属性を追加(1行追加)

パフォーマンスへの影響

改善:性能リグレッション解消

  • CredentialCacheTests.GetCredential_HostPort: 最大32%のリグレッション解消(notfound)、17%改善(name5)
  • StringComparer.OrdinalIgnoreCase.GetHashCode()を経由する複数のベンチマークで改善

JITインラインバジェット22では、従来ComputeHash32OrdinalIgnoreCase自体のインライン化とその内部のBlock()呼び出しの両方をインライン化できず、Block()が別途Tier1コンパイルされていました。[NoInlining]属性により、ハッシュ計算メソッドは不透明な呼び出しとして保つ一方で、Block()(AggressiveInliningマークあり)は完全にインライン化されるため、コードレイアウトが改善されます。

関連Issue

#118739、#118641

その他

  • GitHub Copilot支援によるPR
  • 既存のMarvin.ComputeHash32(バイトベース)との一貫性を確保

#127407 Refactor: use DateTime.UnixEpoch

概要

DateTime.UnixEpochを使用する形にコードをリファクタリングしました。Unix エポック(1970年1月1日UTC)を表す定数値の記述を標準化することで、コードの可読性と保守性を向上させています。

変更内容

  • System.Diagnostics.EventLog: EventLogEntry.csでUnix エポックの日時計算をDateTime.UnixEpochを使用する形に変更(+2/-4)
  • System.Reflection.Metadata: BlobContentId.csでUnix エポック関連の記述をDateTime.UnixEpochに統一(+1/-1)

パフォーマンスへの影響

影響なし

関連Issue

#127407

その他

なし


#127402 Allow O2K_CONST_VEC to handle all TYP_SIMD32/64

概要

SIMD定数処理の改善で、O2K_CONST_VECがTYP_SIMD32/64型の全ての定数に対応するようになりました。TYP_SIMD16より大きい値に対してはヒープ割り当てを行うことで、より多くのSIMD定数シナリオをサポートします。

変更内容

  • compiler.h: O2K_CONST_VEC関連の定数処理ロジック拡張(+61/-21)

    • SIMD32/64定数のサポート範囲を拡大
    • ヒープ割り当てメカニズムの追加
  • assertionprop.cpp: アサーション伝播ロジックの対応(+12/-10)

    • 拡張されたSIMD定数処理への適応

パフォーマンスへの影響

大規模SIMD定数(TYP_SIMD32/64)に対してヒープ割り当てを導入するため、メモリ使用量が増加する可能性があります。ただし具体的なベンチマーク結果は提供されていません。

関連Issue

#127390(代替ソリューション)

その他

  • JIT(Just-In-Time)コンパイラのコンパイラ最適化フェーズに関連
  • 内部実装の変更であり、公開APIへの影響なし

#127394 Replace MemoryMarshal generic Read/Write with BitConverter equivalents

  • 作成者: @EgorBo
  • 作成日時: 2026年04月24日 18:10:46(UTC)
  • マージ日時: 2026年04月25日 02:38:21(UTC)
  • ラベル: area-Meta reduce-unsafe

概要

Generic MemoryMarshal.Read/Write/TryRead/TryWrite<T> APIが将来caller-unsafe属性でマークされるため、プリミティブ型の使用をすべてBitConverterスパン相当の安全なAPIに置き換え、ダウンレベルTFM向けのBitConverterスパンポリフィルを追加します。これは複数ライブラリとSystem.Private.CoreLibにわたる移行の一環です。

変更内容

  • BitConverterPolyfills.cs(新規): 非.NETCoreAppターゲット向けにBitConverter.To*スパンオーバーロードを拡張メンバー経由で実装
  • System.Text.Json: PropertyRefとJsonDocument.MetadataDb内のMemoryMarshal.Read<T>をBitConverter.To*に置き換え
  • System.Private.CoreLib: EventPipePayloadDecoder・RegistryKeyにて同様に置き換え
  • System.Security.Cryptography: OpenSslCrlCache・HelpersWindowsでMemoryMarshal.Read<T>をBitConverter.To*に変更
  • System.Net.Primitives: IPAddress内の読み書き操作をBitConverter.ToUInt32に統一
  • System.Formats.Cbor: CborHelpers.netstandard内の大エンディアンヘルパーをBinaryPrimitivesAPIで簡潔化(-44行)
  • System.Diagnostics系・Microsoft.Win32.Registry: RegistryやPerformanceCounter値読取をBitConverter.To*APIに統一
  • HashCodePolyfills: HashCode.AddBytesチャンク読取をBitConverter.ToInt32に変更
  • 非.NETCoreApp プロジェクト(.csproj)にBitConverterPolyfills.csをリンク

パフォーマンスへの影響

影響なし。内部実装の安全性向上に伴う置き換えで、ホストエンディアンの解釈は変わりません。

関連Issue

#127394

その他

  • 変更は内部実装(System.Private.CoreLib・ライブラリの非公開メソッド)に限定
  • MemoryMarshal.*<T> APIのcaller-unsafe化に先立つ準備作業
  • ダウンレベルポリフィルはMemoryMarshal.Read<T>で実装され、.NETCoreAppではネイティブスパンメソッドが使用される

#127392 Add ability to use clang with GNU toolchain on Haiku

概要

Haiku OSでclang(GNU toolchain付き)を使用したランタイムビルドが可能になります。このPRにより、Haiku固有のGNU toolchainを用いたclangコンパイラでのランタイム構築が実現されました。clang + Haiku GNU toolchainの組み合わせでランタイムビルドが成功することが確認されています。

変更内容

  • eng/common/cross/toolchain.cmake: toolchain設定でHaiku向けのclang対応を追加(9行追加/3行削除)
  • eng/native/configureplatform.cmake: プラットフォーム設定にHaiku固有の構成を追加(5行追加/1行削除)
  • src/coreclr/gc/unix/gcenv.unix.cpp: GC環境設定の修正(1行削除)
  • src/native/libs/System.Native/pal_*.c: Platform Abstraction Layerの複数ファイルで環境判定やAPI呼び出しの微調整
    • pal_environment.c: 環境変数処理の修正
    • pal_mount.c: マウント情報処理の修正
    • pal_networking.c: ネットワーク処理の修正
    • pal_process.c: プロセス処理の修正(9行追加/4行削除)
  • src/native/libs/System.Security.Cryptography.Native/pal_evp_pkey.c: EVP PKEYの実装追加(4行追加)

パフォーマンスへの影響

影響なし

関連Issue

#126701

その他

このPRはHaiku OS向けのクロスプラットフォーム対応を強化するもので、clangツールチェーンの対応によりビルドの互換性が向上します。


#127343 [cDAC] Implement GetModuleForAssembly for cDAC

概要

cDAC(Contract-based Diagnostics Access Component)において、GetModuleForAssemblyメソッドをレガシー委譲スタブから契約ベースの実装に移植しました。ネイティブC++実装(dacdbiimpl.cpp)のpAssembly->GetModule()呼び出しに相当する処理を、ILoader.GetModuleHandleFromAssemblyPtr → ILoader.GetModuleを使用して管理コードで実装しています。

変更内容

  • DacDbiImpl.cs: レガシーフォールバック(1行)を契約ベースの実装に置き換え。GetAssemblyPathパターンに従い、try/catchでhrを処理し、DEBUGビルド時はレガシー検証を実施
  • DacDbiLoaderDumpTests.cs: ダンプベースの統合テストを追加。アセンブリ→モジュール間の往復解決をテストし、GetModuleForAssemblyが正しいモジュールポインタを返すことを検証

パフォーマンスへの影響

影響なし

関連Issue

なし

その他

  • 実装はILoaderインターフェースの契約ベースAPI(GetModuleHandleFromAssemblyPtrとGetModule)を活用
  • DEBUG専用のレガシーDAC検証により、移植の正確性を確保
  • テストはダンプベースの統合テストで、実際のダンプデータに対して検証される成功パスと無効なアセンブリの失敗パスをカバー
  • リポジトリ内にcDAC文書化を追跡する移植メソッド記録は見つかっていない

#127336 Optimize runtime async suspend/resume machinery

概要

ランタイムの非同期サスペンド/レジューム機構を最適化するPRです。TLSアクセス回数の削減、書き込みバリアの除去、ホットパスのキャスト削減により、サスペンション負荷の高いベンチマークで約17%のパフォーマンス改善を実現しています。主な最適化は以下の通りです:

  • Thread.CurrentThreadをスタック割り当てのRuntimeAsyncStackStateにキャッシュ
  • TLS参照構造体による書き込みバリア削減
  • ホットパスでUnsafeを使用した不要なキャスト削減

変更内容

  • AsyncHelpers.CoreCLR.cs: スタック割り当てのRuntimeAsyncStackStateを導入し、TLS (RuntimeAsyncAwaitState) に参照を保持。サスペンション/ディスパッチ/ファイナライズ処理を更新し、ホットパスでUnsafe.Asを活用
  • asyncthunks.cpp / AsyncThunks.cs: task-returning thunkの生成コードを更新。新しいランタイム非同期状態のPush/Popを追加し、ファイナライザーにref RuntimeAsyncAwaitStateを渡す
  • corelib.h / metasig.h: 新しいネストされた型、フィールド、メソッドシグネチャをバインダーに登録
  • AsyncHelpers.cs: await helperをスタック状態経由で通知者データを書き込むように更新し、TLSアクセス回数を削減

パフォーマンスへの影響

改善あり: 提供ベンチマーク例において約17%の改善を確認

  • Before: 350.3 ms
  • After: 291.3 ms

改善要因は、(1) TLSルックアップの削減、(2) GC書き込みバリアの削減、(3) ホットパス上のキャスト削減による実行速度向上です。

関連Issue

なし

その他

この変更は内部実装の最適化であり、公開APIの変更はありません。ランタイム非同期チェーンの初期化・終了時のスタック割り当て状態管理により、メモリ効率とスループットの改善が期待できます。


#127329 JIT: Reduce Vector256/512 Sum to a shared per-lane reduction on x64

  • 作成者: @Copilot
  • 作成日時: 2026年04月23日 16:56:43(UTC)
  • マージ日時: 2026年04月25日 00:26:04(UTC)
  • ラベル: area-CodeGen-coreclr

概要

x64 上の浮動小数点 SIMD Vector256/Vector512.Sum の JIT IR 生成を最適化し、V128 水平リダクション処理の重複を排除します。フルな SIMD 幅での permute+add シーケンスを実行してから 128-bit レーンを単一の V128 に統合する設計に変更し、コード量を削減しながら機能を保証します。

変更内容

  • src/coreclr/jit/gentree.cpp: gtNewSimdSumNode の浮動小数点パスを再構成
    • V256/V512 で per-128-bit-lane の permute+add をフル SIMD 幅で実行
    • その後、上半分/下半分の統合を通じてレーンを V128 に縮小
    • TYP_DOUBLE vpermilpd イミディエート値を 0b0001 から 0b01010101 に修正し、各 128-bit レーンの交換が正確に行われるよう改善
    • Permute 関数選択(AVX vs AVX512)を三項演算子で簡潔化
    • V512 レーン統合構造を整数リダクション形状に合わせて統一
    • 整数パスは変更せず(V128 への縮小後、V128 リダクションを実行)

パフォーマンスへの影響

影響なし。このリファクタリングはコード生成の最適化であり、実行時の機能やパフォーマンス特性に実質的な変更はありません。IR 構造の簡潔化により、JIT コンパイル時間がわずかに短縮される可能性があります。

関連Issue

なし

その他

  • テスト: 全 12,944 件の System.Runtime.Intrinsics.Tests に合格
  • ベースラインビルド成功
  • コード行数: +110/-67 でネットの削減(計 177 行)

#127247 Fix flaky RegularExpressionAttribute timeout test

概要

RegularExpressionAttributeTests.Validate_MatchingTimesOut_ThrowsRegexMatchTimeoutExceptionのフレーキーなタイムアウトテストを修正します。正規表現エンジンのパフォーマンス向上により、1msのタイムアウト内に処理が完了してしまう場合があり、期待されるRegexMatchTimeoutExceptionではなくValidationExceptionが発生していました。テスト入力を28文字から100文字に増やすことで、指数関数的なバックトラック(O(2^n))を確実にタイムアウトさせます。

変更内容

  • src/libraries/System.ComponentModel.Annotations/tests/System/ComponentModel/DataAnnotations/RegularExpressionAttributeTests.cs: テスト入力を"aaaaaaaaaaaaaaaaaaaaaaaaaaaa>"(28文字)からnew string('a', 100) + ">"(100文字)に変更し、パターン(a[ab]+)+$のカタストロフィックバックトラックが1msのタイムアウト内で確実に発生するようにしました。

パフォーマンスへの影響

影響なし(テストコードのみの変更)

関連Issue

#127247

その他

  • この変更はテスト専用のもので、実装コードへの影響はありません
  • GitHub Copilotにより生成されたコミット

#126585 Clean up dynamic method desc native stack arg tracking

  • 作成者: @jkoritzinsky
  • 作成日時: 2026年04月06日 20:05:11(UTC)
  • マージ日時: 2026年04月25日 00:44:10(UTC)
  • ラベル: area-VM-coreclr

概要

ネイティブスタック引数サイズ追跡機能をx86アーキテクチャのみに制限する最適化です。FEATURE_DYNAMIC_METHOD_HAS_NATIVE_STACK_ARG_SIZEマクロを廃止し、関連APIと管理フィールドを直接TARGET_X86ゲートに変更することで、x86以外のアーキテクチャにおける不要な管理オーバーヘッドを削減します。

変更内容

  • method.hpp/method.cpp: DynamicMethodDesc::Get/SetNativeStackArgSize()およびMethodDesc::SizeOfNativeArgStack()をx86のみに制限
  • dllimport.cpp: IL スタブのシグネチャスワップとスタブ生成パスを更新し、ネイティブスタックサイズの保存/コピーをx86のみに制限
  • comtoclrcall.h/comtoclrcall.cpp: ComCallMethodDescのスタックポップ追跡フィールドをx86専用に再構成
  • clrtocomcall.cpp: 特定のCOMスタブに対するネイティブスタック引数サイズ設定の削除
  • comcallablewrapper.cpp: 軽微な変更

パフォーマンスへの影響

  • x86以外のアーキテクチャ(x64、ARM64等)でメモリ使用量を削減:MethodDescおよびDynamicMethodDescから不要なフィールドを削除
  • x86での動作は変更なし
  • 管理オーバーヘッド削減により、ネイティブ相互運用性が向上する見込み

関連Issue

#126509の議論に対応

その他

この変更は内部実装の最適化であり、公開APIへの影響はありません。x86アーキテクチャのサポート状況の変化に伴う技術的負債削減の一環です。


#126259 Fix BigInteger.LeadingZeroCount, PopCount, TrailingZeroCount, RotateLeft, and RotateRight for platform-independent 32-bit word semantics

  • 作成者: @Copilot
  • 作成日時: 2026年03月28日 17:56:49(UTC)
  • マージ日時: 2026年04月25日 00:21:16(UTC)
  • ラベル: area-System.Numerics

概要

_bitsがuint[]からnuint[]に移行した後、BigIntegerの5つのIBinaryInteger<BigInteger>メソッド(LeadingZeroCount、PopCount、TrailingZeroCount、RotateLeft、RotateRight)がプラットフォーム依存の結果を返していた問題を修正します。このPRはプラットフォーム非依存の32ビット語セマンティクスを復元し、_signパスと_bitsパスの両方に対応します。

変更内容

  • LeadingZeroCount: _signパスでuint.LeadingZeroCount((uint)value._sign)を使用、_bitsパスで32ビット語セマンティクスへのマッピング
  • PopCount: _signパスでnint.PopCountからint.PopCountに変更(64ビット上でPopCount(-1)が64を返す問題を修正)。_bitsパスではMSL上位32ビット補正とファントムビット検出を実装
  • TrailingZeroCount: _signパスでint.TrailingZeroCountを使用(BigInteger.Zeroの動作を32/64ビット間で統一)
  • RotateLeft/RotateRight: _signパスで32ビット回転を使用。_bitsパスではSIMD加速シフトを活用しつつ、64ビットプラットフォームで上位32ビット修正を適用。エンディアン対応でSwapUpperAndLower時にnuintとuint間のキャストを使用
  • テスト更新: プラットフォーム非依存の32ビットセマンティクステストを追加、既存Rotate.csテストをnint.Size * 8から固定32ビット値に更新

パフォーマンスへの影響

ローテーション_bitsパスはnuintリムで直接動作し、SIMD加速シフトにより64ビットスループットを保持します。SwapUpperAndLowerステップは64ビットで奇数語数の場合のみMemoryMarshal.Cast<nuint, uint>でSpan<uint>ビューを使用しますが、一時配列割り当てを回避するためRentedBufferで最終結果バッファ内で動作します。

関連Issue

#125799(_bitsのuint[]からnuint[]への移行)

その他

  • 互換性: 破壊的変更ではありませんが、64ビットプラットフォーム上での既存コードの結果値が32ビット語セマンティクスに変更される可能性があります
  • エンディアン対応: ビッグエンディアン64ビットプラットフォームではSwapUpperAndLower時に各nuintリム内の32ビット半分をスワップして正確な語順を確保
  • 公開API変更(IBinaryInteger<BigInteger>実装メソッド)のため、セマンティクスの一貫性確保が重要

#126035 Fix CheckSpecified setter for field-backed members in ReflectionXmlSerializationReader

概要

ReflectionXmlSerializationReaderのバグを修正し、フィールドバック型のXxxSpecifiedメンバーがデシリアライゼーション時に正しく設定されるようにしました。従来はGetMethod("set_X")でプロパティセッターのみを検索していたため、フィールドバック型のSpecifiedメンバーはnullとなり、XMLに要素が存在してもfalseのままでした。本修正により、リフレクションパスとILGenパスの動作を統一し、既存のキャッシュデリゲート基盤を活用しています。

変更内容

  • ReflectionXmlSerializationReader.cs: GetMethod("set_X")を使用したXxxSpecifiedメンバーの設定をGetSetMemberValueDelegateに変更。デリゲートはキャッシュされ、フィールドとプロパティの両方に対応
  • ReflectionXmlSerializationWriter.cs: ShouldSerializeメソッド呼び出しでCheckShouldPersistMethodInfoをキャッシュ利用に最適化
  • SerializationTypes.cs: フィールドバック型のFooSpecifiedメンバーを持つTypeWithFieldBackedSpecifiedMemberテスト型を追加
  • XmlSerializerTests.cs: フィールドバックFooSpecifiedとイニシャライズされたShouldSerialize*メソッドのデシリアライゼーション動作を検証するテストケースを追加

パフォーマンスへの影響

改善。以下の点で効率化:

  • キャッシュされたMethodInfoインスタンスCheckShouldPersistMethodInfoを使用することで、反復的なリフレクションルックアップを排除
  • GetSetMemberValueDelegateによるデリゲートキャッシングで、デシリアライゼーション時の毎回の反射呼び出しを回避

関連Issue

#125859(リフレクションパスとILGenパスの同期に関連)

その他

このPRは、既存のキャッシュデリゲート基盤(ILGenリーダーのILGenSetパターンなど)と同じアプローチを採用し、XmlSerializerの内部一貫性を向上させるもの。内部実装(非公開API)の修正であり、互換性への影響なし。


目次