インライン化の対象とする呼び出しは、一定の最低基準を満たしていなければなりません。呼び出しには、3 つの主要な要素があります。
呼び出しサイトとは、インライン化する関数の呼び出しのサイトです。
呼び出し元は、呼び出しサイトを含む関数です。
呼び出し先は、呼び出されてインライン化する関数です。
呼び出しサイトの最低基準:
実引数の数は、呼び出し先の仮引数の数と一致していなければなりません。
戻り値の数は、呼び出し先の戻り値の数と一致していなければなりません。
実引数と仮引数のデータ型の間に互換性がなければなりません。
多言語のインライン化は実行できません。呼び出し元と呼び出し先は同じソース言語で記述されていなければなりません。
呼び出し元の最低基準:
呼び出し元にインライン化するすべての呼び出しサイトから、呼び出し元にインライン化される中間文は最大 2000 です。この値は次のオプションを使用して変更できます。
-Qoption,f,-ip_ninl_max_total_stats=new value
関数がスタティックとして宣言されている場合は、呼び出す必要があります。そうでない場合は削除されます。
呼び出し先の最低基準:
可変長引数リストを持ちません。
名前から実行頻度が低いと考えられません。名前に次の部分文字列を含むルーチンはインライン展開されません。abort、alloca、denied、err、exit、fail、fatal、fault、halt、init、inerrupt、invalid、quit、rare、stop、timeout、trace、trap、および warn といった部分文字列がこれに当たります。
その他の理由ではインラインできないと考えられません。
以上の諸条件が満たされると、コンパイラはどのルーチンをインライン展開すればプログラムのパフォーマンスに最も寄与するかを調べて選び出します。これは、デフォルトのヒューリスティックを使用して行われます。プロファイルに基づく最適化 (-prof_use) を使用するかどうかによって、コンパイラが使用するヒューリスティックは異なります。
-ip または -ipo でプロファイルに基づく最適化を使用する場合、コンパイラは次のヒューリスティックを使用します:
デフォルト・ヒューリスティックでは、プログラムに対して収集されたプロファイル情報を基に、最も頻繁に実行される呼び出しサイトに重点がおかれます。
デフォルトでは、コンパイラは 230 以上の中間文では、関数のインライン化は行いません。この値は、オプション -Qoption,f,-ip_ninl_max_stats=new value を使用して変更できます。
通常のデフォルト・ヒューリスティックは、直接再帰 (direct recursion) を検出すると停止します。
デフォルト・ヒューリスティックを使用すると、インライン化の最低条件を満たしている非常に小さな関数は必ずインライン化します。
Itanium® ベース・アプリケーションのデフォルト値: ip_ninl_min_stats = 15
IA-32 アプリケーションのデフォルト値: ip_ninl_min_stats = 7
これらの制限は、-Qoption,f,-ip_ninl_min_stats=new value オプションで変更できます。
「-Qoption 指定子」および「プロファイルに基づく最適化 (PGO)」を参照してください。
-ip または -ipo でプロファイルに基づく最適化を使用しない場合、コンパイラは次のヒューリスティックを使用します: インライン展開が最終的なプログラムのサイズを増加しない場合、関数をインライン展開します。
関数のプリエンプションとは、ランタイム時にその関数を実装するコードを、他のコードで置換することです。関数をプリエンプトすると、関数の元のバージョンではなく置換後の新しいバージョンが実行されます。プリエンプションを使用して、関数のコードにエラーのあるバージョンや効率の悪いバージョンを、正しいバージョンまたは改善されたバージョンに置き換えることができます。
コンパイラは、-ip がオンの場合には外部からアクセスできる関数はすべてプリエンプトされる可能性があり、したがってインライン展開の対象にならないものとみなします。これは、現時点では、-ip がオンの場合には内部プロシージャを除くすべての Fortran サブプログラムがインライン化できないことを意味します。
ただし、-ipo と -ipo_obj をファイルごとに使用した場合には、関数のインライン化を行うことができます。「実際のオブジェクト・ファイルの生成」を参照してください。