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

プロシージャー間の最適化 (IPO) を使用すると、コンパイラーはコードを解析してどの最適化が有効かを判断します。多くの場合、適用できる最適化はアーキテクチャーに依存します。

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

アーキテクチャー

最適化項目

IA-32、インテル(R) 64、および IA-64 アーキテクチャー

  • インライン展開

  • 定数の伝播

  • mod/ref 解析

  • エイリアス解析

  • 先行代入

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

  • アドレスの解析

  • 部分不要コール排除

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

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

  • 不要な関数の排除

  • 未参照変数の削除

  • プログラム全体の解析

  • 配列次元のパディング

  • 共通ブロックの分割

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

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

  • フォーマル・パラメーターのアライメント解析

  • C++ クラス階層解析

  • 間接呼び出し変換

  • 専用化

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

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

IA-64 アーキテクチャーのみ

  • 冗長な EXTEND 命令の排除

  • ショート・データ・セクション割り当て

  • プリフェッチ解析

IPO は、コンパイルおよびリンクを含むマルチステップの処理で、自動で行われます。ただし、IPO は、単一ファイルのコンパイルと複数ファイルのコンパイルの 2 つのコンパイルモデルをサポートしています。

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

コンパイラーは、単一ファイルのプロシージャー間の最適化をデフォルトの最適化レベル (-O2 (Linux および Mac OS X) または /O2 (Windows) で行います。また、-O1 (Linux および Mac OS X) または /O1 (Windows) 最適化レベルでインライン化を行います (インラインプラグマまたは属性 (GNU C および C++) でマークされているインライン関数、およびクラスの宣言に含まれている本体を持つ C++ クラスメンバー関数など)。

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

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

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

コンパイル

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

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

リンク

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

警告

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

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

プログラム全体の解析

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

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

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

IPO レポートでは、プログラム全体の解析の条件が満たされているかどうかの詳細と、IPO コンパイル中に使用されたメソッドが示されます。

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

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

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

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