リンク時最適化

ADSのリンカ

ARM純正のツールであるADS付属のリンカを実際に使ってみたが、特に未使用関数を削除している雰囲気はなかった。マニュアルを見てみたら、C++の仮想関数の削除をするらしい。一応コールグラフを表示させると、普通の関数でもUNUSEDのキーワードがついてるんだけどなあ。何か他にオプションがあるんだろうか。ファイルをまたがったインライン展開や、コンパイラへのフィードバックは見ていない。

GCC Link time optimization

ltoは数あるGCCのプロジェクトの中の1つで、2005年頃にアナウンスされたようだ。CodeSourceryの中の人たちが主に実装を担当しているようである。

GCC Link-time optimization

ビルドして少しだけ使ってみた。configureオプションで

 --enable-languages=lto

としてビルドすると、lto1が作成される。あとは

 gcc -B. -flto hoge.c -o out

みたいな感じでコンパイルすればリンク時の最適化がかかる。1回ファイルごとにコンパイルして生成した中間オブジェクトファイルを、もう一度全て入力して最適化してるみたい。現在どこまで最適化の実装が進んでいるのかわからないが、開発が止まっているような雰囲気がある。まぁソースを見りゃいいんだけど…

LLVM

LLVMのリンカは、普通に未使用関数の削除をしてくれた。
リンク時の最適化なんて、LLVMにとっては大した特徴ではないのかもしれないが、サイズが小さくなる事は良い事だ(サイズだけじゃないけど)。すばらしい。

LLVM Link-time optimization

 llvm-gcc --emit-llvm -c hoge1.c -o hoge1.o
 llvm-gcc --emit-llvm -c hoge2.c -o hoge2.o
 llvm-ld hoge1.c hoge2.c -o hoge
 llc hoge
 gcc hoge.s -o hogen

Diablo

リンク時最適化について調べていたら、Diablo(Diablo is a better link time optimizer)というリンク時最適化のフレームワークを発見した。論文*1によると、ARMの場合は、ADSとGCCGCCbinutilsへのパッチが必要)に適用可能で、通常の10%程度サイズと速度面でのパフォーマンス向上が見られたとの事。試してみる価値はあるかもしれない。
GCC4系への対応があまり積極的に行われていない模様。というか、開発とまってんのか?

Diablo (Diablo is a better link time optimizer)

*1:Link-Time Optimization of ARM Binaries (2004) citeseerで検索しましょう!