注意点
このページは、dotnet/runtimeリポジトリにマージされたPull Requestを自動的に収集し、その内容をAIが要約した内容を表示しています。そのため、必ずしも正確な要約ではない場合があります。
目次
#129658 Properly annotate CreateGeometricSequence
- 作成者: @hez2010
- 作成日時: 2026年06月20日 16:22:11(UTC)
- マージ日時: 2026年06月20日 20:16:23(UTC)
- ラベル: area-CodeGen-coreclr community-contribution
概要
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
その他
なし
#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) を判定。containedCreateScalarをレジスタとして正しく認識し、movd/movqで SIMD レジスタを読む。非べき等なgenOperandDescを一度だけ呼び出すため、新しいgenHWIntrinsic_R_RM(OperandDesc&)overload を追加。 - codegen.h — 新しい
genHWIntrinsic_R_RMoverload を宣言。 - Runtime_129642.cs — 回帰テスト追加。インデックス計算と算術演算の組み合わせ (
Table[n % 64] + n、Table[n & 63] + (n << 46)) をulongおよびuintで検証。 - Regression_ro_2.csproj — 回帰テストを登録。
パフォーマンスへの影響
影響なし。バグ修正により、最適化コードでの誤った計算結果やアサーション失敗が解決されます。
関連Issue
その他
Copilot の検証コメントで、EVEX-b early-return パスにおいて rmOp->GetRegNum() の使用が信頼できない可能性が指摘されています(contained HWIntrinsic を通じて参照される場合、rmOp が REG_NA となるが rmOpDesc はレジスタを表現)。代わりに rmOpDesc.GetReg() を使用すべき点に注意が必要です。
#129598 Fix NativeAOT GC hole issue
- 作成者: @janvorli
- 作成日時: 2026年06月18日 23:04:51(UTC)
- マージ日時: 2026年06月20日 21:02:49(UTC)
- ラベル: area-NativeAOT-coreclr
概要
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
その他
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
その他
- 互換性: Mono+LLVM の全ターゲットでスカラー
Math.Min/Max(float|double)のセマンティクスが変更(従来の非対称・仕様違反動作から IEEE 754 準拠に修正) - 検証結果: iossimulator-arm64 完全AOT+LLVM環境で、
HalfTestsが 1424→1442合格、HalfTests_GenericMathが 344→356合格 - GitHub Copilot による AI支援調査で実装