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