LTO

GCC summitを見学しにいったときに、CodeSourceryのMark Mitchellと話をする機会があった。彼はGCCC++フロントエンドのメンテナで、リリースマネージャーでもある。リンク時最適化については、組み込みの世界でも非常に有用だし、待ち望んでる人達もいるので頑張って下さいと言ってきた。今考えてみれば、お前もコミットしろよという感じであるが、言語は日本語しかわからない俺にとってはハードルが高いのである。C言語とか何をやってんのかさっぱりわからん。でもソース見てたら何か出来そうな気がしてきた。気がするだけ。

GCCのltoが結構活発に開発が進められている。whopr(Whole Program Optimization)やgimple tuplesなんかとも連動して、最近はGoogleの人達がよくコードをコミットしている。CodeSourceryはどうしたんだ? SourceryG++のサポートCPUが増えたし、4.3ベースのリリースが待ってたりするから忙しいのかな?

それはともかく、-fwpa -fltrans とかいうオプションが増えた。基本的には前からあった-flto1発でいけるみたいだが、他のオプションは何が違うのか気になるところだ(良くわかってない)。メーリングリストでは、ユーザが混乱するからいっぱい似たようなオプション作るのはやめようぜという意見が出てきたので、最終的には-fltoと-fwpaぐらいになるのかもしれない。

Link-Time Optimizationといってはいるが、別にリンカで最適化してくれるわけではなく(GCCのブランチなんだから当たり前だけど...)、コンパイル過程で作られるコールグラフの情報をオブジェクト単位で残しておき、リンカが呼ばれる直前にもう1度GCCを起動して、全てのオブジェクトを入力する。そして、ローカルなコールグラフを全部ロードしてグローバルなコールグラフを作ればIPOが出来るじゃん、という寸法である。実際、2008/10/3の時点では、各オブジェクト毎に以下のようなセクションが増えてた。

 [ 4] .gnu.lto_internal  PROGBITS
 [ 5] .gnu.lto_main      PROGBITS
 [ 6] .gnu.lto_.static   PROGBITS
 [ 7] .gnu.lto_.cgraph   PROGBITS
 [ 8] .gnu.lto_.decls    PROGBITS
 [ 9] .gnu.lto_.symtab   PROGBITS

ltoのコンパイラドライバ(?)のlto.cを見たが、確かにリンカが起動する直前にGCCを起動してたし、グローバルなコールグラフを作成してから、IPAのパス(今のところインライン展開だけ)が実行されてた。ソースのコメントに書いてあったが、まだ色々問題があるようだ。

ltoプロジェクトを進めている人達は、メモリ効率とコンパイル時間を非常に気にしていて、特にコンパイル時間は倍近くなる可能性もあるため、結構悩んでいるようである。ただでさえGCCコンパイル遅いのに、更に遅くなったら誰が使うんじゃいとか言ってた気がするが、たぶん俺なら喜んで使うと思う。

どうでもいいけど、llvmのbcにはコールグラフの情報が含まれてるんでしょうね。ARMのコンパイラはそんなのが入ってるようなセクションあったかなあ。

10/16追記: -fwpaオプションはさっくりと無くなって -fwhoprに変わった。