私はここ数年、Haskellの主要な処理系であるGHCに趣味で貢献しています。この記事では、今年(2025年)行なった貢献を紹介します。バグ報告のみ(修正は他の人)のものも含みますが、その場合はその旨を書いています。
去年の記事は「GHCへの私の貢献2024」です。今年は「GHCデバッグ日誌 CI編」という記事も書きました。
貢献内容
SIMDプリミティブ周り
x86 NCGでの整数ベクトル演算の実装を行いました。シャッフルも含めて、まるまる3ヶ月かかりました。GHC 9.14で使えます。
- #25643: x86 NCG SIMD: Implement arithmetic operations for integer vectors · Issues · Glasgow Haskell Compiler / GHC · GitLab
- !13810: x86 NCG SIMD: Implement 128-bit integer vector arithmetics · Merge requests · Glasgow Haskell Compiler / GHC · GitLab
浮動小数点数のベクトルのシャッフルを、従来(GHC 9.12)はAVXを要求していたのに対し、SSE2でもできるようにしました。これもGHC 9.14で使えます。
- Better lowering for shuffleFloatX4# and shuffleDoubleX2# (#26096) · Issue · ghc/ghc
- x86 NCG: Better lowering for shuffleFloatX4# and shuffleDoubleX2# (!14389) · Merge requests · Glasgow Haskell Compiler / GHC · GitLab
バグ修正:
- #25658: x86 NCG SIMD: “Error: operand type mismatch for `movsd'” when using unpackInt64X2# and function call · Issues · Glasgow Haskell Compiler / GHC · GitLab
- !13823: x86 NCG: Use correct format for MOVD in the implementation of unpackInt64X2# · Merge requests · Glasgow Haskell Compiler / GHC · GitLab
- GHC 9.12.3/9.14.1で修正
バグ修正:
- #25659: x86 NCG: MOVD and spilling · Issues · Glasgow Haskell Compiler / GHC · GitLab
- !13828: x86 NCG: Make MOVD’s output format explicit · Merge requests · Glasgow Haskell Compiler / GHC · GitLab
- GHC 9.12.3/9.14.1で修正
バグ報告:
- #25730: LLVM type error when using vector types with FFI · Issues · Glasgow Haskell Compiler / GHC · GitLab(報告のみ)
- GHC 9.12.3/9.14.1で修正
バグ修正:(コードを眺めていたら見つけた)
- #25859: x86 NCG SIMD: Incorrect code generation for SSE operations · Issues · Glasgow Haskell Compiler / GHC · GitLab
- !14114: Fix code generation for SSE vector operations (#25859) · Merge requests · Glasgow Haskell Compiler / GHC · GitLab
- GHC 9.12.3/9.14.1で修正
x86_64 macOSでAVX-512を有効にしても、LLVMがZMMレジスターを使わない問題があったので修正しました:
- LLVM does not use ZMM registers for 512-bit vectors on x86_64 macOS (#26410) · Issue · ghc/ghc
- LLVM backend: Pass the +evex512 attribute to LLVM 18+ if -mavx512f is set (!14990) · Merge requests · Glasgow Haskell Compiler / GHC · GitLab
- GHC 9.12.3/9.14.1には反映されていない。9.12.4/9.14.2を待つ必要がある
バグ報告:
- x86 NCG SIMD: Corrupted value when using 16 vector registers (#26411) · Issue · ghc/ghc
- simd013 fails with optasm way (#26526) · Issue · ghc/ghc
- GHC 9.12.3/9.14.1には反映されていない。9.12.4/9.14.2を待つ必要がある
AArch64 NCGをSIMDに対応させる作業に着手しました。GHC 9.16入りを目指します。
- Add SIMD support to AArch64 NCG (#26536) · Issue · ghc/ghc
- Draft: Add 128-bit SIMD support to AArch64 NCG (!15016) · Merge requests · Glasgow Haskell Compiler / GHC · GitLab
その他NCG
AArch64で8ビット・16ビット整数の算術右シフトがバグっていたので修正しました:
- Sub-word arithmetic right shift with AArch64 NCG (#26061) · Issue · ghc/ghc
- AArch64 NCG: Fix sub-word arithmetic right shift (!14349) · Merge requests · Glasgow Haskell Compiler / GHC · GitLab
- GHC 9.12.3/9.14.1で修正
NCGで、レジスターをスピルする際の命令の順序が間違っていました。AArch64で実際に問題になるので修正しました:
- AArch64 NCG: On the order of instructions returned by mkSpillInstr and mkLoadInstr (#26537) · Issue · ghc/ghc
- NCG backend: Fix the order of spill/reload instructions (!15042) · Merge requests · Glasgow Haskell Compiler / GHC · GitLab
- GHC 9.12.3/9.14.1には反映されていない。9.12.4/9.14.2を待つ必要がある
LLVMバックエンドの問題
LLVMバックエンドがCIでちゃんとテストされていないのでイシューを立てました:
LLVM llvm-asのオプションが誤っていたので報告しました:
- #25856: The value for “LLVM llvm-as flags” is wrong · Issues · Glasgow Haskell Compiler / GHC · GitLab(報告のみ)
- リリース済みの版は影響されないはず
LLVMバックエンドで存在しないintrinsicsを出力していたので報告しました:
- There are no LLVM intrinsics like llvm.x86.bmi.{pdep,pext}.{8,16} (#26065) · Issue · ghc/ghc
- 修正がバックポートされてない気がする
i386の問題
私が以前追加したテストがi386で失敗していました。そもそもテストが32ビット環境を想定していませんでした。責任を取って(?)私が修正しました(32ビット環境ではテストしない)。
- T22033 fails on i386 in optllvm way (#25497) · Issue · ghc/ghc
- T22033 is only relevant if the word size is 64-bit (#25497) (!14225) · Merge requests · Glasgow Haskell Compiler / GHC · GitLab
- リリース済みの版(9.10/9.12/9.14)にはバックポートされていないが、テストケースの問題なので実害はないだろう
x86 NCGのbswapの実装が32ビット環境で間違ったコードを生成していました。
- bswap/W64 test fails on i386 (#13) · Issue · ghc/test-primops
- NCG backend miscompiles bswap64 on i386 (#25601) · Issue · ghc/ghc
- x86 NCG: Fix code generation of bswap64 on i386 (!14363) · Merge requests · Glasgow Haskell Compiler / GHC · GitLab
- GHC 9.12.3/9.14.1で修正済み
SIMD絡みの呼び出し規約の問題があったので修正しました:
- i386: Calling convention issue with SIMD vectors (#25985) · Issue · ghc/ghc
- MachRegs.h: Don’t define NO_ARG_REGS when a XMM register is defined (!14260) · Merge requests · Glasgow Haskell Compiler / GHC · GitLab
- GHC 9.14.1で修正済み。以前の版へはバックポートしていない
pdep64# と pext64# がBMI2を有効にしたi386 NCGでコンパイルできない件を報告しました(未修正):
その他
x86の命令セット拡張の依存関係をいい感じにしました。MRを作ったのは2024年10月ですが、CIの問題に引っかかっており、最近(10月)ようやくマージできました。これを通すためにCIで見つかった問題の修正を頑張りました(「GHCデバッグ日誌 CI編」参照)。
- Handle implications between x86 feature flags (!13369) · Merge requests · Glasgow Haskell Compiler / GHC · GitLab
- GHC 9.16に反映される予定
ドキュメント(User’s Guide)のマークアップがところどころ間違っていたのを修正しました:
- C– formatted incorrectly in the user guide contents (#16812) · Issue · ghc/ghc
- Fix incorrect markups (including “C-\-“) in the User’s Guide (!15008) · Merge requests · Glasgow Haskell Compiler / GHC · GitLab
- GHC 9.16に反映される予定
今後について
今年は私生活で色々あり、使える時間にムラがありました。10月ぐらいは結構作業に取り組んでいましたが、その後は時間が確保できず、です。
やりかけの作業は色々あります。AArch64 NCGでのSIMD対応とかです。SIMDについては、使いやすいパッケージの作成にも取り組みたいです。どれだけ性能が出るか、は別問題ですが。
話は変わりますが、最近、私とHaskellとの向き合い方を考えています。私が日本語の記事執筆等で活動しても日本のコミュニティー(の有力者)に歓迎されないのであれば、表立った活動は控えた方がいいのかもしれません。使える時間も少ないですしね。
それでも、Haskellは私にとって好きな言語であることに変わりはありません。活動するなら、もっと英語圏の方を向いて活動するべきなのかもしれません。幸い、日本語で書いた記事を英語に翻訳することはこのご時世では容易になりました。英語で記事を書いたり、あるいはGHCへの貢献を細々と続けて行ったり。限られた時間でどこまでできるかという問題はありますが。この記事も日本語で書いているし。
そんな中で、私の活動に対して形のある支援をしてくださる方がいることは本当に励みになります。現在、GitHub Sponsorsでは、現在@toyboot4eさんと@kevin-kmetzさんに支援していただいています。ありがとうございます。
