インテル® C++ コンパイラー XE 13.1 ユーザー・リファレンス・ガイド

プロシージャー間の最適化 (IPO) の概要

プロシージャー間の最適化 (IPO) はマルチステップの自動処理で、コンパイラーがコードを解析してどの最適化が有効であるかを判断できるようにします。IPO オプション-x-ax (Linux*) オプションまたは /Qx/Qax (Windows*) オプションとともに使用することで、互換マイクロプロセッサーよりもインテル製マイクロプロセッサーにおいてより多くの最適化が行われることがあります。

コンパイラーは、アーキテクチャーごとに次のような最適化を適用します。

アーキテクチャー

最適化

サポートされるすべてのインテル® アーキテクチャー

  • インライン展開

  • 定数の伝播

  • mod/ref 解析

  • エイリアス解析

  • 前方代入

  • ルーチンのキー属性の伝播

  • アドレスの解析

  • 部分不要コール排除

  • シンボル・テーブル・データの促進

  • 共通ブロック変数の統合

  • 不要な関数の排除

  • 未参照変数の削除

  • プログラム全体の解析

  • 配列次元のパディング

  • 共通ブロックの分割

  • スタックフレームのアライメント

  • 構造体分割とフィールドの並べ替え

  • 仮パラメーターのアライメント解析

  • C++ クラス階層解析

  • 間接呼び出し変換

  • 専用化

IA-32 アーキテクチャーおよびインテル® 64 アーキテクチャー

  • レジスターに引数を渡して、呼び出しとレジスターの使用を最適化

IPO コンパイルモデル

IPO は単一ファイルのコンパイルと複数ファイルのコンパイルの 2 つのコンパイルモデルをサポートしています。

単一ファイルのコンパイルでは -ip (Linux* および OS X*) または /Qip (Windows*) オプションを使用し、コンパイルする各ソースファイルに対して 1 つのオブジェクト・ファイルを生成します。 単一ファイルのコンパイル中に、コンパイラーは現在のソースファイル内で定義されているプロシージャーへの呼び出しをインライン展開します。

コンパイラーは、デフォルトの最適化レベル -O2 (Linux* および OS X*) または /O2 (Windows*) でいくつかの単一ファイルの IPO を行います。また、-O1 (Linux* および OS X*) あるいは /O1 (Windows*) 最適化レベルで、インラインでマークされている関数プラグマまたは属性 (GNU C および C++) でマークされている関数、およびクラスの宣言に関数本体が含まれている C++ クラスメンバー関数などのインライン展開を行うこともあります。

複数ファイルのコンパイルでは -ipo (Linux* および OS X*) オプションまたは /Qipo (Windows*) オプションを使用し、通常のオブジェクト・ファイルではなく 1 つまたは複数の擬似オブジェクト・ファイルを生成します。 (擬似オブジェクト・ファイルについての詳細は、下の「コンパイル」セクションを参照してください。) また、コンパイラーは、プログラムを構成する個々のソースファイルからの情報を収集します。 コンパイラーはこの情報を使用して、異なるソースファイルの関数とプロシージャーを最適化します。詳細は、「関数のインライン展開」を参照してください。

インライン展開およびその他の最適化は、プロファイル情報によって向上します。プロファイル情報を用いた IPO で最適化を実行する方法は、「アプリケーションのプロファイル」を参照してください。

OS X*: インテル® プロセッサー・ベースのシステムで実行される OS X* では、複数オブジェクト・コンパイル・モデルはサポートされていません。

IPO によるコンパイル

IPO を使用して各ソースファイルがコンパイルされるたびに、コンパイラーはソースコードの中間表現 (IR) を擬似オブジェクト・ファイルに格納します。このオブジェクト・ファイルには、最適化に使うサマリー情報が含まれます。擬似オブジェクト・ファイルには、通常のオブジェクト・ファイルの代わりに IR が含まれます。擬似オブジェクト・ファイルは、通常のオブジェクト・ファイルのサイズよりも 10 倍以上の大きさになることがあります。

IPO コンパイルフェーズでは、擬似オブジェクト・ファイルのみが表示されます。-ipo-c (Linux* および OS X*) オプションまたは /Qipo-c オプションもともに指定しない限り、実際のオブジェクト・ファイルは公開されません。

IPO によるリンク

-ipo オプション (Linux* および OS X*) または /Qipo オプション (Windows*) を使用してリンクすると、コンパイラーはリンカーの直前に起動されます。 コンパイラーは、IR 等価物を含むオブジェクト・ファイルすべてを対象に IPO を実行します。インテル® コンパイラーまたはインテルのリンクツールを使用して、擬似オブジェクトをリンクする必要があります。コンパイラーは、ネイティブリンカーのエイリアス (またはラッパー) を使用して間接的にリンカーを呼び出します。そのため、異なるリンクツール名に対応できるよう make ファイルを変更する必要があります。 リンクツールの使用に関する情報は、「IPO の使用」を参照してください。詳細は、「リンクツールとオプション」を参照してください。

警告

擬似オブジェクト・ファイルを ld (Linux* および OS X*) または link.exe (Windows*) にリンクするとリンクエラーが発生します。 擬似オブジェクト・ファイルをリンクするには、インテルのリンクツールを使用してリンクしなければなりません。

コンパイル処理中、コンパイラーはまず概要情報を分析してから、アプリケーションのソースファイルの擬似オブジェクトを生成します。

プログラム全体の解析

コンパイラーは、プログラム全体の条件が満たされると適用できる IPO 最適化、または効率性が大幅に向上する多くの IPO 最適化をサポートしています。

プログラム全体の解析は、実行されると、多くのプロシージャー間の最適化を有効にします。解析処理中、コンパイラーは擬似ファイル、オブジェクト・ファイル、ライブラリー・ファイルにあるすべての中間表現 (IR) を読み取り、すべての参照が解決されているか、またはシンボルが擬似オブジェクト・ファイルに定義されているかどうかを判断します。データと関数の両方の擬似オブジェクト・ファイルにある IR に含まれているシンボルは、プログラム全体の解析の結果に基づいた操作を行う候補です。

プログラム全体の解析には、オブジェクト・リーダー・メソッドとテーブルメソッドの 2 種類があります。いずれかの解析でプログラム全体の条件が満たされいてると判断された場合には、ほとんどの最適化が適用できます。ただし、最適化によっては、オブジェクト・リーダー・メソッドにより生成される結果が必要なものと、テーブルメソッドにより生成された結果が必要なものとがあります。

オブジェクト・リーダー・メソッド

オブジェクト・リーダー・メソッドでは、オブジェクト・リーダーによりネイティブリンカーの動作をエミュレートし、アプリケーションのシンボルを解決しようとします。すべてのシンボルが正しく解決されると、プログラム全体の条件が満たされたことになります。このプログラム全体の解析では、プログラム全体の条件が検出される可能性が高くなります。

コンパイラーによってアクセスされるオブジェクト・ファイルとライブラリーはプログラム全体を表現しないことが多々あります。よく知られたライブラリーには多くの依存関係があります。IPO リンク、プログラム全体の解析では、利用可能なコンパイラー・リソースを使用してプログラム全体を検出できるかどうかを判断します。

テーブルメソッド

テーブルメソッドでは、コンパイラーが擬似オブジェクト・ファイルを解析して、コールグラフを作成します。

コンパイラーには libc などのすべての重要な言語固有のライブラリー関数についての詳細なテーブルが含まれています。 この 2 番目のメソッドでは、コンパイラーはアプリケーションのコールグラフを作成します。それから、コンパイラーは関数テーブルとアプリケーションのコールグラフを比較します。コールグラフ中の未解決の各シンボルについてコンパイラーは呼び出しを解決しようとします。コンパイラーが関数を解決できた場合にプログラム全体の条件が整います。


このヘルプトピックについてのフィードバックを送信