Pull Request on 2026年06月20日

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

注意点

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



#129658 Properly annotate CreateGeometricSequence

概要

JIT コンパイラにおいて、CreateGeometricSequence ノードを非無効ノード(non-invalid node)として適切にアノテーションする修正です。このノードは定数伝播(constant propagation)の最適化の恩恵を受けるため、GenTree ノードとして残される可能性があります。Pull Request #127690 からの積み残し作業です。

変更内容

  • src/coreclr/jit/gentree.cpp: CreateGeometricSequence のノード分類を更新(3行追加)
  • src/coreclr/jit/hwintrinsiclistarm64.h: CreateGeometricSequence のアノテーション情報を修正(2行更新)
  • src/coreclr/jit/hwintrinsiclistxarch.h: CreateGeometricSequence のアノテーション情報を修正(3行更新)

パフォーマンスへの影響

定数伝播最適化の適用対象となることで、コンパイル時の最適化が改善される可能性があります。実行時性能への直接的な影響は記載されていません。

関連Issue

#127690

その他

なし


#129644 Fix x64 ToScalar XMM→GPR codegen for contained CreateScalar operand

  • 作成者: @Copilot
  • 作成日時: 2026年06月20日 00:21:34(UTC)
  • マージ日時: 2026年06月20日 20:46:50(UTC)
  • ラベル: area-CodeGen-coreclr

概要

x64において Vector128<T>.ToScalar() による XMM→GPR レジスタ間転送の codegen バグを修正しました。contained operand として CreateScalar/CreateScalarUnsafe が最適化される場合、SIMD レジスタを参照する必要があるのに、整数 mov 命令が発行されていたため、誤った結果やアサーション失敗が発生していました。

修正により、operandDesc の kind (register/memory) に基づいて命令を正確に選択し、movq/movd を適切に発行するようになります。

// 修正前:誤った mov gpr, xmm
// 修正後:正しく movq xmm → gpr
ulong n = Vector128.CreateScalarUnsafe(x).AsUInt64().ToScalar();
return Table[n % 64] + n; // 正確な計算結果

変更内容

  • hwintrinsiccodegenxarch.cpp — genBaseIntrinsic の ToScalar/AsVector* 処理を修正。op1->isContained() の直接確認ではなく、genOperandDesc(ins, op1) の結果から instruction kind (register/memory) を判定。contained CreateScalar をレジスタとして正しく認識し、movd/movq で SIMD レジスタを読む。非べき等な genOperandDesc を一度だけ呼び出すため、新しい genHWIntrinsic_R_RM(OperandDesc&) overload を追加。
  • codegen.h — 新しい genHWIntrinsic_R_RM overload を宣言。
  • Runtime_129642.cs — 回帰テスト追加。インデックス計算と算術演算の組み合わせ (Table[n % 64] + n、Table[n & 63] + (n << 46)) を ulong および uint で検証。
  • Regression_ro_2.csproj — 回帰テストを登録。

パフォーマンスへの影響

影響なし。バグ修正により、最適化コードでの誤った計算結果やアサーション失敗が解決されます。

関連Issue

#129642

その他

Copilot の検証コメントで、EVEX-b early-return パスにおいて rmOp->GetRegNum() の使用が信頼できない可能性が指摘されています(contained HWIntrinsic を通じて参照される場合、rmOp が REG_NA となるが rmOpDesc はレジスタを表現)。代わりに rmOpDesc.GetReg() を使用すべき点に注意が必要です。


#129598 Fix NativeAOT GC hole issue

概要

NativeAOT環境でのGCホール(ガベージコレクション追跡漏洩)を修正します。例外が funclet から再スローされ、その finally が実行中にGCが動作した場合、非揮発性レジスタに保持されているGC参照が正しく更新されないという問題を解決します。修正内容は、finally funclet から戻った後に非揮発性レジスタを ExInfo の REGDISPLAY で参照される位置に保存することです。

変更内容

  • ExceptionHandling.S / ExceptionHandling.asm: RhpCallFinallyFunclet で finally funclet から戻った後、非揮発性レジスタをスタック上に保存する処理を追加(各ファイルに対応する実装を追加)
  • clr-abi.md: ドキュメント修正(1行の変更)
  • 回帰テスト: GitHub Issue #129010 に対する回帰テストケースを追加(Test129010.csproj、test129010.cs)

パフォーマンスへの影響

影響なし

関連Issue

#129598、#129010

その他

NativeAOT ランタイムの x64 例外処理に関する内部実装の修正です。公開APIへの影響はありません。GC参照の正確な追跡に関わる重要な修正で、特定の条件下での メモリ破損を防ぎます。


#129593 [mono][llvm] Use llvm.minimum/maximum for scalar Math.Min/Max float ops

  • 作成者: @lewing
  • 作成日時: 2026年06月18日 19:35:24(UTC)
  • マージ日時: 2026年06月20日 10:42:33(UTC)
  • ラベル: area-Codegen-LLVM-mono

概要

Mono LLVM バックエンドの浮動小数点スカラー Math.Min/Max 実装を修正するPRです。従来の fcmp + select 方式から LLVM 12以降で利用可能な llvm.minimum/llvm.maximum 組み込み関数に変更し、NaN処理の仕様違反と AArch64 での誤コンパイルの両問題を解決します。

修正前の問題:

  • Math.Min(x, NaN) が x を返す(仕様では NaN を返すべき)
  • LLVM 23 の AArch64 バックエンドが fminnm/fmaxnm(NaN抑制型)にマッチして誤った結果を生成

修正後:

  • IEEE 754-2019 準拠の NaN 伝播型 minimum/maximum を使用
  • AArch64 では fmin/fmax(NaN伝播型)に正しくコンパイル

変更内容

  • llvm-intrinsics.h: llvm.minimum.f32/.f64 および llvm.maximum.f32/.f64 組み込み関数エントリを追加
  • mini-llvm.c: OP_FMIN/OP_FMAX/OP_RMIN/OP_RMAX の実装を llvm.minimum/llvm.maximum 経由に変更(整数min/maxと分離)
  • intrinsics.c: Math.Min/Max(float|double) 組み込み認識時の mono_use_fast_math ゲートを削除(修正後のNaN処理が正しいため不要化)
  • BFloat16Tests.cs: テスト追加(+2行)

パフォーマンスへの影響

AArch64 では従来の fcmp + select シーケンスが単一命令 fmin/fmax に最適化されるため、性能向上の可能性あり。x86(AVX-10非搭載環境)では従来のシーケンスと同等の比較・選択シーケンスに展開されます。SIMD min/max パス(AArch64 aarch64_neon_fmin/fmax 既使用)への影響なし。

関連Issue

#129507、#129299

その他

  • 互換性: Mono+LLVM の全ターゲットでスカラー Math.Min/Max(float|double) のセマンティクスが変更(従来の非対称・仕様違反動作から IEEE 754 準拠に修正)
  • 検証結果: iossimulator-arm64 完全AOT+LLVM環境で、HalfTests が 1424→1442合格、HalfTests_GenericMath が 344→356合格
  • GitHub Copilot による AI支援調査で実装

目次