プロシージャー間分析 (IPA)

このトピックでは、CRTPGM および CRTSRVPGM コマンドの IPA オプションを介して使用可能な、 プロシージャー間分析 (IPA) 処理について概説します。

コンパイル時に、最適化変換プログラムは、 プロシージャー内分析とプロシージャー間分析の両方を実行します。 プロシージャー内分析は、コンパイル単位内の各関数の最適化を、その関数とコンパイル単位でのみ 使用可能な情報を使用して実行するメカニズムです。 プロシージャー間分析は、関数の境界を超えて最適化を実行するメカニズムです。 最適化変換プログラムは、プロシージャー間分析を実行しますが、1 つのコンパイル単位内にのみ限定されます。IPA コンパイラー・オプションによって実行されるプロシージャー間分析は、 上記の限定されたプロシージャー間分析を改善しました。IPA オプションを介してプロシージャー間分析を実行すると、IPA はプログラム全体に渡って 最適化を実行します。さらに、コンパイル時に最適化変換プログラムを使用して、 他の方法では実行できない最適化も実行します。 最適化変換プログラムまたは IPA オプションは、以下のタイプの最適化を実行します。
  • 複数のコンパイル単位に渡るインライン化。インライン化は、特定の関数呼び出しを、関数の実際のコードと置換します。 インライン化は、呼び出しのオーバーヘッドを除去するだけでなく、 関数全体を呼び出し元に露出することになるので、コンパイラーはコードをさらに最適化することができます。
  • プログラムの区画化。プログラムの区画化では、関数を再順序付けして、参照の局所性を活用することによって、パフォーマンスを改善します。 区画化では、頻繁に相互に呼び出しを行う関数をメモリー内で接近させて置くようにします。 プログラムの区画への分割の詳細については IPA によって作成される区画を参照してください。
  • グローバル変数の合体。 コンパイラーは、グローバル変数を 1 つ以上の構造に書き込んでおき、 構造の先頭からのオフセットを計算することで、これらの変数にアクセスしています。 これにより、変数アクセスのためのコストを低減させ、データの局所性を活用できます。
  • コードの直線化。コードを直線化することにより、 プログラムのフローが合理化されます。
  • 到達不能コードの除去。到達不能コードの除去によって、関数内の到達不能コードが除去されます。
  • 到達不能関数の呼び出しグラフのプルーニング。到達不能関数の呼び出しグラフのプルーニングによって、100% インライン化されているか、 またはまったく参照されないコードが除去されます。
  • プロシージャー内での定数の伝搬および設定の伝搬。IPA は、浮動小数点定数と整数定数をその使用法に合わせて伝搬し、定数式はコンパイル時に計算します。 また、いくつかの定数のうちの 1 つであると分かっている変数使用は、 結果として、複数の条件とスイッチをフォールディングします。
  • プロシージャー内ポインターの別名分析。IPA は、ポインターの使用法に対する定義を追跡して、 ポインター参照解除で使用または定義する可能性があるメモリー・ロケーションに関する情報 がより詳細になるようにしています。 これにより、コンパイラーの他の部分が、このような参照解除に関連するコードをさらに最適化できるようになります。IPA は、データ・ポインターおよび関数ポインターの定義を追跡します。 ポインターが単一のメモリー・ロケーションまたは関数のみしか参照できない場合 、IPA は、そのメモリー・ロケーションまたは関数を明示的に参照するようにポインターを書き直します。
  • プロシージャー内コピーの伝搬。IPA は、式を伝搬し、一部の変数は、変数の使用法を定義します。 これによって、さらに定数式のフォールディングを行う機会が与えられます。 これは、冗長な変数コピーも除去します。
  • プロシージャー内到達不能コードおよび保管の除去。IPA は到達不能な変数の定義を、その定義を作成するための計算と共に除去します。
  • 参照 (アドレス) 引数の値引数への変換。IPA は、仮パラメーターが呼び出し先プロシージャーで指定されていない場合に、 参照 (アドレス) 引数を値引数へ変換します。
  • 静的変数の自動 (スタック) 変数への変換。IPA は、静的変数の使用が単一のプロシージャー呼び出しに限定されている場合は、 その静的変数を自動 (スタック) 変数に変換します。
通常、IPA を使用して最適化されたコードの実行時間は、コンパイル時のみ最適化されたコードの実行時間より速くなります。しかし、すべてのアプリケーションが IPA 最適化に適しているわけではありません。 また、IPA の使用によって実現されるパフォーマンスの向上は、アプリケーションによって異なります。 アプリケーションによっては、プロシージャー間分析を使用しても、 パフォーマンスが向上しない可能性があります。 実際、まれには、プロシージャー間分析を使用すると、 アプリケーションのパフォーマンスが低下する場合があります。 このような場合には、プロシージャー間分析を使用しないことをお勧めします。 プロシージャー間分析によって実現されるパフォーマンス向上は、 アプリケーションのタイプに依存します。 パフォーマンスが向上する可能性が高いアプリケーションは、 以下の特性を持つアプリケーションです。
  • 多数の関数を含んでいる。
  • 多数のコンパイル単位を含んでいる。
  • 呼び出し元と同じコンパイル単位にない多数の関数を含んでいる。
  • 多数の入出力操作を実行しない。
プロシージャー間の最適化は、次の条件に該当する ILE プログラムや サービス・プログラムでのみ使用可能です。
  • 特に V4R4M0 以降のリリースで、 プログラムまたはサービス・プログラムにバインドされるモジュールを作成した場合。
  • 20 (*BASIC) 以上の最適化レベルで、 プログラムまたはサービス・プログラムにバインドされるモジュールをコンパイルした場合。
  • プログラムまたはサービス・プログラムにバインドされるモジュールに、 それに関連付けられている IL データがある場合。 中間言語 (IL) データをモジュールと一緒に保持するには、 モジュール作成オプション MODCRTOPT(*KEEPILDTA) を使用してください。
注: 最適化の要件を満たすためには、 プロシージャー間分析を使用する前に、完全にプログラムをデバッグする必要があります。