GHCへの私の貢献2025

私はここ数年、Haskellの主要な処理系であるGHCに趣味で貢献しています。この記事では、今年(2025年)行なった貢献を紹介します。バグ報告のみ(修正は他の人)のものも含みますが、その場合はその旨を書いています。

去年の記事は「GHCへの私の貢献2024」です。今年は「GHCデバッグ日誌 CI編」という記事も書きました。

貢献内容

SIMDプリミティブ周り

x86 NCGでの整数ベクトル演算の実装を行いました。シャッフルも含めて、まるまる3ヶ月かかりました。GHC 9.14で使えます。

浮動小数点数のベクトルのシャッフルを、従来(GHC 9.12)はAVXを要求していたのに対し、SSE2でもできるようにしました。これもGHC 9.14で使えます。

バグ修正:

バグ修正:

バグ報告:

バグ修正:(コードを眺めていたら見つけた)

x86_64 macOSでAVX-512を有効にしても、LLVMがZMMレジスターを使わない問題があったので修正しました:

バグ報告:

AArch64 NCGをSIMDに対応させる作業に着手しました。GHC 9.16入りを目指します。

その他NCG

AArch64で8ビット・16ビット整数の算術右シフトがバグっていたので修正しました:

NCGで、レジスターをスピルする際の命令の順序が間違っていました。AArch64で実際に問題になるので修正しました:

LLVMバックエンドの問題

LLVMバックエンドがCIでちゃんとテストされていないのでイシューを立てました:

LLVM llvm-asのオプションが誤っていたので報告しました:

LLVMバックエンドで存在しないintrinsicsを出力していたので報告しました:

i386の問題

私が以前追加したテストがi386で失敗していました。そもそもテストが32ビット環境を想定していませんでした。責任を取って(?)私が修正しました(32ビット環境ではテストしない)。

x86 NCGのbswapの実装が32ビット環境で間違ったコードを生成していました。

SIMD絡みの呼び出し規約の問題があったので修正しました:

pdep64#pext64# がBMI2を有効にしたi386 NCGでコンパイルできない件を報告しました(未修正):

その他

x86の命令セット拡張の依存関係をいい感じにしました。MRを作ったのは2024年10月ですが、CIの問題に引っかかっており、最近(10月)ようやくマージできました。これを通すためにCIで見つかった問題の修正を頑張りました(「GHCデバッグ日誌 CI編」参照)。

ドキュメント(User’s Guide)のマークアップがところどころ間違っていたのを修正しました:

今後について

今年は私生活で色々あり、使える時間にムラがありました。10月ぐらいは結構作業に取り組んでいましたが、その後は時間が確保できず、です。

やりかけの作業は色々あります。AArch64 NCGでのSIMD対応とかです。SIMDについては、使いやすいパッケージの作成にも取り組みたいです。どれだけ性能が出るか、は別問題ですが。

話は変わりますが、最近、私とHaskellとの向き合い方を考えています。私が日本語の記事執筆等で活動しても日本のコミュニティー(の有力者)に歓迎されないのであれば、表立った活動は控えた方がいいのかもしれません。使える時間も少ないですしね。

それでも、Haskellは私にとって好きな言語であることに変わりはありません。活動するなら、もっと英語圏の方を向いて活動するべきなのかもしれません。幸い、日本語で書いた記事を英語に翻訳することはこのご時世では容易になりました。英語で記事を書いたり、あるいはGHCへの貢献を細々と続けて行ったり。限られた時間でどこまでできるかという問題はありますが。この記事も日本語で書いているし。

そんな中で、私の活動に対して形のある支援をしてくださる方がいることは本当に励みになります。現在、GitHub Sponsorsでは、現在@toyboot4eさんと@kevin-kmetzさんに支援していただいています。ありがとうございます。

Spread the love