2020年5月17日日曜日

Google Code Jam 2020でのSBCLのトラブル その2

GCJ Round 2に出たが、Round 1に引き続いてSBCL絡みのトラブルにあってしまった。

以下の(特に意味のない)コードをSBCL 1.3.8 ~ 1.4.5に打ち込むとコンパイルが終了しない。

(defun test (n graph)
  (let ((vector (make-array n :initial-element 1)))
    (setf (aref vector 0) 0)
    (let ((value 1))
      (dotimes (i n)
        (dolist (v (list 1))
          (setf (aref vector v) value)
          (dolist (y (aref graph v))
            (print y)))))))

1.3.7→1.3.8と、1.4.5→1.4.6の変化を眺めた感じでは、make-arrayの最適化に関連して低レベルの問題が起こっていそうで、(declare (fixnum n))(declare (notinline make-array))を宣言すると問題が解消する。詳細はわかっていない。

Security Updateのvisibleをとりあえず通しておこうとして起きた現象で、この対処に時間を費やしてしまった。自分の準備にも問題があって、ローカルではバージョン1.4.14を使っていたので単純に問題の把握が遅れたというのがある。(GCJの環境は1.3.14だが、Windowsリリースはないし、CodeChefの1.3.13で問題が起きたことがないので気にしていなかった。) 本格的にWSL環境に移ることを考えたほうがよいのかもしれない。

しかし、こんな基本的なコードが落ちるのはさすがに驚く……


コンテスト後にはさすがに凹んだけれど、去年よりは確実に強くなっている。来年も頑張ろう。