プロシージャー間分析 (IPA)
プロシージャー間分析 (IPA) を行うと、アプリケーションをファイル単位ではなく全体として分析し、最適化できます。
プロシージャー間分析はアプリケーション・ビルドのリンク・ステップ中に実行され、リンク・ライブラリーを含むアプリケーション全体がプロシージャー間分析の対象になります。 このプログラム全体の分析により、強力な一連の変換をアプリケーションに適用できます。これらの変換は、複数のファイルまたはコンパイル単位にアクセスできる場合にのみ使用可能なものです。IPA による最適化は、混合言語アプリケーションに対しても有効です。
次に、アプリケーションの再構成および最適化のために IPA が使用できる、リンク時の変換をいくつか示します。
- コンパイル単位間でのインライン化。
- サブプログラム呼び出し間での複合データ・フロー分析によってパラメーターを排除する、または呼び出し先サブプログラムに定数を直接伝搬する。
- パラメーター使用法分析を改善する、または外部サブプログラムによるシステム・ライブラリーの呼び出しを効率的なインライン・コードに置き換える。
- データ構造の再構築によって、アクセスの局所性を最大限に高める。
- 呼び出しによって定数パラメーターが渡されるサブプログラムを複製して、これらのパラメーターを使用して式を最適化できるようにする。
IPA によるリンク時の最適化から最大限の効果を得るためには、コンパイルとリンクの両ステップで IPA を使用する必要があります。IPA を使用してコンパイルしていないオブジェクトは、最適化プログラムにわずかな情報しか提供できないので、得られる改善効果もわずかです。 一方、コンパイル・ステップで IPA がアクティブになっていれば、作成されるオブジェクト・ファイルにプログラム情報が格納され、リンク・ステップ中に IPA がこの情報を読み取ることができます。このプログラム情報はシステム・リンカーには認識されず、IPA を起動しなくてもオブジェクト・ファイルとリンクは引き続き使用できます。 IPA による最適化では、表面に現れない情報を使用して元のコンパイル内容を再構成し、アプリケーション内でのサブプログラムの実際の使用状況に基づいて、オブジェクトに含まれるサブプログラムを完全に分析できます。
リンク・ステップ中に、IPA はアプリケーションを再構成し、別個の論理コード単位に区分化します。IPA 最適化が完了した後、-O2 および -O3 の基本最適化レベルと同じ、低レベルのコンパイル単位ごとの変換が、IPA によって適用されます。 これらの変換が行われた後、コンパイラーによって 1 つ以上のオブジェクト・ファイルが作成され、必要なライブラリーとのリンクがシステム・リンカーによって行われます。
アプリケーションのコンパイルとリンクの際には、可能な限り一貫性のあるコンパイル・オプションを指定することが重要です。 これは、-qipa サブオプションのみでなく、すべてのコンパイラー・オプションに当てはまります。 可能ならば、すべてのコンパイルに対して同一のオプションを指定し、IPA リンク・ステップでも同じオプションを繰り返して指定します。非互換のオプション、または競合するオプションを指定してオブジェクト・ファイルを作成したり、コンパイル時オプションと矛盾するリンク時オプションを指定したりすると、IPA 最適化の効果が減少することがあります。
IPA 最適化について詳しくは、以降のトピックを参照してください。