注意点
このページは、dotnet/runtimeリポジトリにマージされたPull Requestを自動的に収集し、その内容をAIが要約した内容を表示しています。そのため、必ずしも正確な要約ではない場合があります。
目次
- #127413 Add [NoInlining] to Marvin.ComputeHash32OrdinalIgnoreCase
- #127407 Refactor: use DateTime.UnixEpoch
- #127402 Allow O2K_CONST_VEC to handle all TYP_SIMD32/64
- #127394 Replace MemoryMarshal generic Read/Write with BitConverter equivalents
- #127392 Add ability to use clang with GNU toolchain on Haiku
- #127343 [cDAC] Implement GetModuleForAssembly for cDAC
- #127336 Optimize runtime async suspend/resume machinery
- #127329 JIT: Reduce Vector256/512 Sum to a shared per-lane reduction on x64
- #127247 Fix flaky RegularExpressionAttribute timeout test
- #126585 Clean up dynamic method desc native stack arg tracking
- #126259 Fix BigInteger.LeadingZeroCount, PopCount, TrailingZeroCount, RotateLeft, and RotateRight for platform-independent 32-bit word semantics
- #126035 Fix CheckSpecified setter for field-backed members in ReflectionXmlSerializationReader
#127413 Add [NoInlining] to Marvin.ComputeHash32OrdinalIgnoreCase
- 作成者: @AndyAyersMS
- 作成日時: 2026年04月24日 22:59:35(UTC)
- マージ日時: 2026年04月25日 13:02:48(UTC)
- ラベル: area-CodeGen-coreclr
概要
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
その他
- GitHub Copilot支援によるPR
- 既存の
Marvin.ComputeHash32(バイトベース)との一貫性を確保
#127407 Refactor: use DateTime.UnixEpoch
- 作成者: @unsafePtr
- 作成日時: 2026年04月24日 21:36:15(UTC)
- マージ日時: 2026年04月25日 13:10:29(UTC)
- ラベル: area-System.Reflection.Metadata community-contribution
概要
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
その他
なし
#127402 Allow O2K_CONST_VEC to handle all TYP_SIMD32/64
- 作成者: @tannergooding
- 作成日時: 2026年04月24日 21:00:52(UTC)
- マージ日時: 2026年04月25日 02:51:08(UTC)
- ラベル: area-CodeGen-coreclr
概要
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
その他
- 変更は内部実装(System.Private.CoreLib・ライブラリの非公開メソッド)に限定
MemoryMarshal.*<T>APIのcaller-unsafe化に先立つ準備作業- ダウンレベルポリフィルは
MemoryMarshal.Read<T>で実装され、.NETCoreAppではネイティブスパンメソッドが使用される
#127392 Add ability to use clang with GNU toolchain on Haiku
- 作成者: @am11
- 作成日時: 2026年04月24日 16:39:41(UTC)
- マージ日時: 2026年04月25日 16:18:41(UTC)
- ラベル: area-PAL-coreclr community-contribution os-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
その他
このPRはHaiku OS向けのクロスプラットフォーム対応を強化するもので、clangツールチェーンの対応によりビルドの互換性が向上します。
#127343 [cDAC] Implement GetModuleForAssembly for cDAC
- 作成者: @Copilot
- 作成日時: 2026年04月23日 20:44:20(UTC)
- マージ日時: 2026年04月25日 01:25:37(UTC)
- ラベル: area-Diagnostics-coreclr
概要
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
- 作成者: @jakobbotsch
- 作成日時: 2026年04月23日 18:32:39(UTC)
- マージ日時: 2026年04月25日 19:45:43(UTC)
- ラベル: area-VM-coreclr runtime-async
概要
ランタイムの非同期サスペンド/レジューム機構を最適化する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_DOUBLEvpermilpd イミディエート値を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
- 作成者: @danmoseley
- 作成日時: 2026年04月21日 21:06:03(UTC)
- マージ日時: 2026年04月25日 06:08:35(UTC)
- ラベル: area-System.ComponentModel.DataAnnotations
概要
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
その他
- この変更はテスト専用のもので、実装コードへの影響はありません
- 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
- 作成者: @haltandcatchwater
- 作成日時: 2026年03月24日 16:00:58(UTC)
- マージ日時: 2026年04月25日 16:37:42(UTC)
- ラベル: area-Serialization community-contribution
概要
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)の修正であり、互換性への影響なし。