-ip と -ipo を使用してプロシージャ間の最適化 (IPO) を有効にすると、コンパイラにコードを分析させて、次の表に示す最適化を行って効果が出る部分を調べることができます。
IA-32 および Itanium® ベース・アプリケーション
最適化項目 | 影響を受ける部分 |
---|---|
関数のインライン展開 | 呼び出し、ジャンプ、分岐、ループ |
プロシージャ間での定数伝播 | 引数、グローバル変数、戻り値 |
モジュール・レベルでの静的変数の監視 | 現状以上の最適化、ループ不変コード |
不要コードの排除 | コードのサイズ |
関数特性の伝播 | 呼び出し命令の削除と呼び出し命令の移動 |
マルチファイルの最適化 | -ip と同じ特性がありますが、複数のファイル全体にわたって最適化を行います。 |
IA-32 アプリケーションのみ
最適化項目 | 影響を受ける部分 |
---|---|
レジスタ内での引数の受け渡し | 呼び出し、レジスタの使用 |
ループ不変コード移動 | 現状以上の最適化、ループ不変コード |
関数のインライン展開は、プロシージャ間の最適化機構によって実行する主な最適化機能のうちの 1 つです。コンパイラは、頻繁に実行する関数呼び出しが存在していると判断した場合、その呼び出し命令を、当該関数自体のコードに置き換えることがあります。
-ip オプションを指定すると、現在のソースファイル内で定義しているプロシージャ内での呼び出し命令について関数のインライン展開を実行します。ただし、-ipo オプションを使用してマルチファイル IPO を指定すると、別々のファイル内で定義しているプロシージャ内での呼び出し命令について関数のインライン展開が実行されます。
IPO 最適化を無効にするには、-O0 オプションを使用します。
警告
-ip および -ipo オプションの使用により、コンパイルに要する時間とコードのサイズが増大することがあります。
Itanium ベースのシステムで、-auto_ilp32 オプションを使用するには、プログラム全体にわたるプロシージャ間の分析が必要です。この最適化により、コンパイラは、アプリケーションが 32 ビットのアドレス空間を超えない限り、32 ビットのポインタを使用します。32 ビットアドレス空間を超えることができるプログラムで -auto_ilp32 オプションを使用すると、プログラム実行中に予期できない問題が発生することがあります。
この最適化にはプログラム全体のプロシージャ間の分析が必要なので、-auto_ilp32 オプションと -ipo オプションの両方を使用しなければなりません。