今日はHaskellでちょっと奇妙なバグに悩まされた。 GHCiでは再現せず、最適化を有効にしてコンパイルすると再現するバグで、原因を追いかけてみると根本原因は (maxBound `div` 10 :: Word) の計算結果が、正しい値 429496729 ではなく謎の値 2576980377 になってしまうというもの。 こんなバグが残っているなんて、なんてしょうもないんだ、GHC!

……調べてみると、一応最新版では修正済みだった。
以下がバグ報告とそれに対する修正。

#8072 (Optimizations change result of div for Word) - GHC
https://ghc.haskell.org/trac/ghc/ticket/8072

Changeset af77ef4 in base
https://ghc.haskell.org/trac/ghc/changeset/af77ef45d576fddb25acf28beb434ef431f430a0/base

自分も定数畳み込み自体のバグかと最初は思ったのだけれど、実際は32bit環境でWordのmaxBoundの定義に64bit環境用の定義が使われてしまっているという、ある意味もっとしょうもないバグだった。
けれど、これが起こってしまった原因はなかなか面白い。
そして、謎の値 2576980377 は (0xFFFFFFFFFFFFFFFF `div` 10) .&. 0xFFFFFFFF だったと。

ただ、ちょっとだけ困るのは、現在最新の Haskell Platform の 2013.2.0.0 に同梱されている base-4.6.0.1 では未修正という点。
早く Haskell Platform の次のリリースがされないかなぁ……