Interprocedural optimization とは

プロシージャ間最適化(IPO)は、頻繁に使用される小規模または中規模の関数を含むプログラムのパフォーマンスを向上させるために、コンピュータ・プログラミングで使用されるコンパイラ技法の集合です。 IPOはプログラム全体を解析するため、他のコンパイラの最適化とは異なります。他の最適化では、1つの関数だけ、または単一のコードブロックしか見えません。
IPOは、重複計算、メモリの非効率的な使用を削減または排除し、ループなどの反復シーケンスを単純化することを目指しています。ループ内で発生する別のルーチンへの呼び出しがある場合、IPO解析はそれをインライン化するのが最善であると判断することがあります。さらに、IPOは、より良いメモリレイアウトと地域性のためにルーチンを並べ替えることができます。
IPOには、実行されることのないコードを削除するデッドコードの消去など、プログラム全体のレベルでの一般的なコンパイラの最適化も含まれます。これを達成するために、コンパイラは実行されないブランチをテストし、そのブランチ内のコードを削除します。 IPOはまた、定数のより良い使用を保証しようとします。現代のコンパイラは、コンパイル時にオプションとしてIPOを提供します。実際のIPOプロセスは、人間が判読可能なソースコードと完成した実行可能バイナリプログラムとの間の任意のステップで発生する可能性があります。
全体プログラムの最適化は、プログラム内のすべてのモジュールに関する情報を使用して、プログラムのコンパイラの最適化を行います。通常、モジュールごとに最適化が行われます(compiland)。この方法は、書き込みやテストが容易で、コンパイル中にリソースの要求が少ないため、積極的なインライン展開などの多数の最適化の安全性が保証されていないため、実際には実行されても実行できません放出されたオブジェクトコードのセマンティクスを変更しない効率の向上。
リンク時最適化は、リンク時にコンパイラによってプログラムに実行されるプログラム最適化の一種です。リンク時間の最適化は、プログラムをファイル単位でコンパイルし、一度にすべてではなく(CやFortranなど)一緒にリンクするプログラミング言語に関係します(Javaの「Just in time」(JIT )コンパイル)。
すべてのファイルが個別にオブジェクトファイルにコンパイルされると、従来、コンパイラはオブジェクトファイルを1つのファイル、つまり実行可能ファイルにリンク(マージ)します。しかし、例えばリンク時間最適化(LTO)が有効になっているGCCコンパイラの場合、GCCはその内部表現(GIMPLE)をディスクにダンプすることができるので、コンパイル単位が単一の実行可能ファイルを単一のモジュールとして最適化することができます。これにより、プロシージャ間の最適化の範囲がプログラム全体(またはリンク時に表示されるすべて)にまで拡大されます。リンク時間の最適化を使用すると、コンパイラは、プログラム全体にさまざまな形のプロシージャ間最適化を適用できるため、より深い分析、最適化、最終的にはプログラムのパフォーマンス向上が可能になります。