42906行

SPARCのディレイスロットを埋めるコードを書いた。今まで埋めてなかったのかよ、という感じだが。最終的なコードを生成する直前のステージで実行する。ディレイスロットを埋めるのによく用いられる関数呼び出しの引数を設定する命令などは、レジスタ割り付けステージで初めて生成されるのでそれより後でなければならない。
アルゴリズムは分岐命令やcall命令の上方から依存関係の無い命令を持ってくるだけ。ロード命令はディレイスロットを埋めるためには用いない。クリティカルパス上にある可能性が高いから下方へ動かしたくはない。ヌルチェックと範囲チェックのための分岐命令の場合は特別で、直後の命令*1が適当な条件を満たすならばそれをディレイスロットに入れることができる。
命令を下方に移動するので命令スケジューリングと競合するかもしれない。去年、命令スケジューリングを実装したときにそこらへんで頭を悩ませたが結局諦めた記憶が。
関係ないが、最適化アルゴリズムを実装する際に一番の障害となるものは中間言語の表現能力である、ということを改めて実感したり。中間言語、重要。

*1:直後に限らずもっと後ろの命令でもいいのだが、今のところは前方探索はしてない。