プロシージャー間の最適化 (IPO) を有効にするには、-ip (Linux*)、/Qip (Windows*) および -ipo (Linux)、/Qipo (Windows) を使用します。IPO を使用すると、コンパイラーはコードを解析して次の表にリストされているどの最適化が有効かを判断します。
最適化項目 |
影響を受ける部分 |
---|---|
関数のインライン展開 |
呼び出し、ジャンプ、分岐、ループ |
プロシージャー間での定数伝播 |
引数、グローバル変数、戻り値 |
モジュールレベルでの静的変数の監視 |
現状以上の最適化、ループ不変コード |
不要コードの排除 |
コードのサイズ |
関数特性の伝播 |
呼び出し命令の削除と呼び出し命令の移動 |
マルチファイル最適化 |
-ip (Linux) または /Qip (Windows) と同じ特性がありますが、複数のファイル全体にわたって最適化を行います。 |
最適化項目 |
影響を受ける部分 |
---|---|
レジスター内での引数の受け渡し |
呼び出し、レジスターの使用 |
ループ不変コードの移動 |
現状以上の最適化、ループ不変コード |
関数のインライン展開は、プロシージャー間の最適化機構によって実行される主な最適化機能のうちの 1 つです。コンパイラーは、頻繁に実行する関数呼び出しが存在していると判断した場合、その呼び出し命令を、当該関数自体のコードに置き換えることがあります。
-ip (Linux および Mac OS*) または /Qip (Windows) を指定すると、現在のソースファイル内で定義しているプロシージャー内での呼び出し命令について関数のインライン展開を実行します。ただし、-ipo (Linux) または /Qipo (Windows) を使用してマルチファイル IPO を指定すると、別々のファイル内で定義しているプロシージャー内での呼び出し命令について関数のインライン展開が実行されます。
-ip および -ipo (Linux) または /Qip および /Qipo (Windows) のどちらのオプションを指定した場合も、条件によってはコンパイル時間とコードサイズが著しく増える場合があります。
Itanium ベース・システムでは、-auto-ilp32 オプション (Linux) または /Qauto-ilp32 オプション (Windows) は、プログラム全体にわたるプロシージャー間の解析を指定します。この最適化により、コンパイラーは、アプリケーションが 32 ビットのアドレス空間を超えない限り、32 ビットのポインターを使用します。32 ビットのアドレス領域 (232) を超えるプログラムで -auto-ilp32 オプション (Linux) または /Qauto-ilp32 オプション (Windows) を使用すると、プログラム実行時に予測できない結果を引き起こす原因となる可能性があります。
この最適化は、プログラム全体に対するプロシージャー間の解析を必要とするため、このオプションを使用する際、-ipo オプション (Linux) または /Qipo オプション (Windows) も使用する必要があります。
インテル(R) EM64T 対応システムでは、-xP または -axP (Linux)、/QxP または /QaxP (Windows) も指定しない限り、このオプションは効果がありません。
Mac OS*: このオプションはサポートされていません。