(57)【要約】【課題】コンパイルを行う際に適切な関数を呼び出し元のファイルに複製すること。【解決手段】図１の（Ａ＿１）で示すように、情報処理装置１０１は、ファイルｓｒｃＡ＿ａ内で定義された第１の関数が、ループ処理を含む外部関数となる第２の関数を呼び出すか否かを判定する。第１の関数が第２の関数を呼び出すと判定した場合、図１の（Ａ＿２）で示すように、情報処理装置１０１は、条件１−１−１、または、条件１−１−２−１のいずれかが成立するかを判定する。条件１−１−１が成立したならば、図１の（Ａ＿３）で示すように、情報処理装置１０１は、ファイルｓｒｃＡ＿ａに第２の関数としてｆｕｎｃＡ関数と、第３の関数としてｆｕｎｃＢ関数とを複製する。ｆｕｎｃＡ関数とｆｕｎｃＢ関数との複製後、情報処理装置１０１は、ｍａｉｎ関数内に、ｆｕｎｃＡ関数とｆｕｎｃＢ関数とをインライン展開する。【選択図】図１
2017211842.tif 000002
【特許請求の範囲】
【請求項１】
複数のファイルのうちの第１のファイルをコンパイルする際に、前記第１のファイル内で定義された第１の関数が、前記複数のファイルのうちの前記第１のファイルとは異なる第２のファイル内で定義された、ループ処理を含む第２の関数を呼び出すか否かを判定し、
前記第１の関数が前記第２の関数を呼び出すと判定した場合、前記ループ処理内に前記複数のファイルのうちのいずれかのファイル内で定義された第３の関数の呼び出しが存在すれば前記第１のファイル内に前記第２の関数および前記第３の関数を複製し、または／および、前記第１の関数が前記第２の関数を呼び出すと判定した場合、前記ループ処理内で前記第２の関数のポインタ型の仮引数が参照されるならば前記第１のファイル内に前記第２の関数を複製する、
制御部を有することを特徴とする情報処理装置。
【請求項２】
前記制御部は、
複製した前記関数と前記第１の関数とに基づいて、複製した前記関数のインライン展開を行う、
ことを特徴とする請求項１に記載の情報処理装置。
【請求項３】
前記制御部は、
前記第１の関数が前記第２の関数を呼び出すと判定した場合、前記ループ処理内に前記第３の関数の呼び出しが存在すれば、さらに、前記第２のファイル内に前記第３の関数を複製する、
ことを特徴とする請求項１または２に記載の情報処理装置。
【請求項４】
コンピュータが、
複数のファイルのうちの第１のファイルをコンパイルする際に、前記第１のファイル内で定義された第１の関数が、前記複数のファイルのうちの前記第１のファイルとは異なる第２のファイル内で定義された、ループ処理を含む第２の関数を呼び出すか否かを判定し、
前記第１の関数が前記第２の関数を呼び出すと判定した場合、前記ループ処理内に前記複数のファイルのうちのいずれかのファイル内で定義された第３の関数の呼び出しが存在すれば前記第１のファイル内に前記第２の関数および前記第３の関数を複製し、または／および、前記第１の関数が前記第２の関数を呼び出すと判定した場合、前記ループ処理内で前記第２の関数のポインタ型の仮引数が参照されるならば前記第１のファイル内に前記第２の関数を複製する、
処理を実行することを特徴とするコンパイル管理方法。
【請求項５】
コンピュータに、
複数のファイルのうちの第１のファイルをコンパイルする際に、前記第１のファイル内で定義された第１の関数が、前記複数のファイルのうちの前記第１のファイルとは異なる第２のファイル内で定義された、ループ処理を含む第２の関数を呼び出すか否かを判定し、
前記第１の関数が前記第２の関数を呼び出すと判定した場合、前記ループ処理内に前記複数のファイルのうちのいずれかのファイル内で定義された第３の関数の呼び出しが存在すれば前記第１のファイル内に前記第２の関数および前記第３の関数を複製し、または／および、前記第１の関数が前記第２の関数を呼び出すと判定した場合、前記ループ処理内で前記第２の関数のポインタ型の仮引数が参照されるならば前記第１のファイル内に前記第２の関数を複製する、
処理を実行させることを特徴とするコンパイルプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、情報処理装置、コンパイル管理方法、およびコンパイルプログラムに関する。
【背景技術】
【０００２】
従来、コンパイラによる最適化の手法の１つとして、関数の読み出し元に、呼び出された関数の処理を挿入することにより、関数の呼び出しにかかるオーバヘッドを削減する、インライン展開と呼ばれる最適化技術がある。また、あるファイルで定義された関数が、他のファイルで定義された他の関数を呼び出す場合、他の関数のインライン展開を促進するために、他の関数の定義を、あるファイルに複製する技術がある。
【０００３】
関連する先行技術として、例えば、ソースコードを変換した中間テキスト列を解析し収集した静的制御情報に基づき各関数をインライン展開したことの当否を評価し、評価結果に応じて、該当するインライン展開部分を元の関数の呼び出しごとに復元するものがある。また、コンパイラで直接ソースライブラリファイルから入力ソースファイルで参照されている関数のプログラムを抽出し、入力ソースファイルと結合して、最適化処理を行い、機械語命令列に変換する技術がある。
【先行技術文献】
【特許文献】
【０００４】
【特許文献１】特開平０９−１２８２４６号公報
【特許文献２】特開平０５−６１６８７号公報
【発明の概要】
【発明が解決しようとする課題】
【０００５】
しかしながら、従来技術によれば、コンパイルを行う際に、インライン展開を促進するためにどの関数を呼び出し元のファイルに複製すればよいのか決定することが難しい。例えば、あらゆる関数に対して複製が実施されると、複製された関数に対しても最適化を行うことになるため、翻訳時間が増大することになる。また、複製された関数の個数分アセンブラ命令数が増加し、アセンブラ命令がオブジェクトコードのコード領域に配置されるためオブジェクトコードのコード領域が増加する。そのため、複製された関数が多くなれば多くなるほど、オブジェクトコードのコード領域の肥大化につながる。このように、インライン展開を促進するために関数を複製することと、コンパイルして得られる実行可能ファイルのサイズとは、トレードオフの関係にある。
【０００６】
１つの側面では、本発明は、コンパイルを行う際に適切な関数を呼び出し元のファイルに複製することができる情報処理装置、コンパイル管理方法、およびコンパイルプログラムを提供することを目的とする。
【課題を解決するための手段】
【０００７】
本発明の一側面によれば、複数のファイルのうちの第１のファイルをコンパイルする際に、第１のファイル内で定義された第１の関数が、複数のファイルのうちの第１のファイルとは異なる第２のファイル内で定義された、ループ処理を含む第２の関数を呼び出すか否かを判定し、第１の関数が第２の関数を呼び出すと判定した場合、ループ処理内に複数のファイルのうちのいずれかのファイル内で定義された第３の関数の呼び出しが存在すれば第１のファイル内に第２の関数および第３の関数を複製し、または／および、第１の関数が第２の関数を呼び出すと判定した場合、ループ処理内で第２の関数のポインタ型の仮引数が参照されるならば第１のファイル内に第２の関数を複製する情報処理装置、コンパイル管理方法、およびコンパイルプログラムが提案される。
【発明の効果】
【０００８】
本発明の一態様によれば、コンパイルを行う際に適切な関数を呼び出し元のファイルに複製することができるという効果を奏する。
【図面の簡単な説明】
【０００９】
【図１】図１は、本実施の形態にかかる情報処理装置１０１の動作例を示す説明図である。
【図２】図２は、情報処理装置１０１のハードウェア構成例を示す説明図である。
【図３】図３は、情報処理装置１０１の機能構成例を示す説明図である。
【図４】図４は、手続き間解析情報ｐｒｏｃの一例を示す説明図である。
【図５】図５は、ソースファイル群ｓｒｃＡの一例を示す説明図である。
【図６】図６は、中間言語データ群ｉｎｔＡの一例を示す説明図である。
【図７】図７は、コールグラフ収集後の手続き間解析情報ｐｒｏｃＡの一例を示す説明図である。
【図８】図８は、コールグラフ情報ｃａｌｌＡの一例を示す説明図である。
【図９】図９は、仮引数情報収集後の手続き間解析情報ｐｒｏｃＡの一例を示す説明図である。
【図１０】図１０は、ループ処理解析後の手続き間解析情報ｐｒｏｃＡの一例を示す説明図である。
【図１１】図１１は、関数複製後の中間言語データ群ｉｎｔＡの一例を示す説明図である。
【図１２】図１２は、ソースファイル群ｓｒｃＢの一例を示す説明図である。
【図１３】図１３は、中間言語データ群ｉｎｔＢの一例を示す説明図である。
【図１４】図１４は、コールグラフ収集後の手続き間解析情報ｐｒｏｃＢの一例を示す説明図である。
【図１５】図１５は、コールグラフ情報ｃａｌｌＢの一例を示す説明図である。
【図１６】図１６は、仮引数情報収集後の手続き間解析情報ｐｒｏｃＢの一例を示す説明図である。
【図１７】図１７は、ループ処理解析後の手続き間解析情報ｐｒｏｃＢの一例を示す説明図である。
【図１８】図１８は、関数複製後の中間言語データ群ｉｎｔＢの一例を示す説明図である。
【図１９】図１９は、手続き間最適化処理手順の一例を示すフローチャート（その１）である。
【図２０】図２０は、手続き間最適化処理手順の一例を示すフローチャート（その２）である。
【図２１】図２１は、手続き間最適化処理手順の一例を示すフローチャート（その３）である。
【発明を実施するための形態】
【００１０】
以下に図面を参照して、開示の情報処理装置、コンパイル管理方法、およびコンパイルプログラムの実施の形態を詳細に説明する。
【００１１】
図１は、本実施の形態にかかる情報処理装置１０１の動作例を示す説明図である。図１に示す情報処理装置１０１は、コンパイルを行うコンピュータである。例えば、情報処理装置１０１は、利用者が用意したソースコードをコンパイルして、実行可能ファイルを作成する。ここで、作成した実行可能ファイルは、情報処理装置１０１をターゲットとするものでもよいし、他のコンピュータをターゲットとするものでもよい。また、情報処理装置１０１は、例えば、ハイ・パフォーマンス・コンピューティング（ＨＰＣ：Ｈｉｇｈ  Ｐｅｒｆｏｒｍａｎｃｅ  Ｃｏｍｐｕｔｉｎｇ）分野で使用されるコンピュータである。
【００１２】
コンパイラが行う最適化手法の１つとして、インライン展開と呼ばれる技術がある。インライン展開は、関数の読み出し元に、呼び出された関数の処理を挿入することにより、関数の呼び出しにかかるオーバヘッドを削減する技術である。また、あるファイルで定義された関数が、他のファイルで定義された他の関数を呼び出す場合、他の関数のインライン展開を促進するために、他の関数の定義を、あるファイルに複製する技術がある。以下、あるファイルで定義された関数が呼び出す、他のファイルで定義された関数を、「外部関数」と呼称する。コンパイラは、同一のファイル内の関数に対してインライン展開を行うか否かを決定するため、外部関数については、関数の定義を複製することにより、インライン展開を促進することができる。
【００１３】
しかしながら、コンパイルを行う際に、インライン展開を促進するため、どの関数を呼び出し元のファイルに複製すればよいのか決定することが難しい。例えば、あらゆる関数に対して複製が実施されると、複製された関数に対しても最適化を行うことになるため、翻訳時間が増大することになる。また、複製された関数の個数分アセンブラ命令数が増加し、アセンブラ命令がオブジェクトコードのコード領域に配置されるためオブジェクトコードのコード領域が増加する。そのため、複製された関数が多くなれば多くなるほど、オブジェクトコードのコード領域の肥大化につながる。このように、インライン展開を行うために外部関数の複製を行うことと、実行可能ファイルのサイズとは、トレードオフの関係にある。
【００１４】
また、あらゆる関数に対して複製を行うと、実行性能の向上につながる関数であるか判断していないため、複製によってインライン展開が促進されたとしても、実行性能が大きく向上するとは限らない。具体的には、インライン展開によって命令数が増えると、命令の順序を入れ替える命令スケジューリングが行いにくくなるためである。ここで、命令スケジューリングとは、命令の意味を変えずに命令の順序を並び替えることにより、例えば、パイプラインのストールを防ぐ最適化手法である。
【００１５】
また、オブジェクトコードに中間言語が含まれるため、リンク時にも手続き間最適化を実施することは可能であるが、手続き間最適化を実施しない場合に作成されるオブジェクトコードと比較すると、オブジェクトコードのサイズが大きくなってしまう。オブジェクトコードのサイズが大きくなる原因としては、手続き間最適化のために集めた情報を、オブジェクトコード内の１つのセクションに埋め込むためである。そして、オブジェクトコードのサイズが大きくなった結果、ディスクの使用量が大きくなる。
【００１６】
そこで、本実施の形態では、外部関数の呼び出し元ファイルに外部関数のループ処理が関数呼び出しを含めば、呼び出された関数とその外部関数を複製し、ループ処理内でポインタ型の仮引数を参照するのであれば、その外部関数を複製することについて説明する。
【００１７】
ここで、上述した、複製の対象とする関数の条件を説明する。まず、複製の対象とする関数は、外部関数である。さらに、外部関数がループ処理を含む。さらに、外部関数のループ処理内に、関数呼び出しが存在する、または、外部関数のループ処理内で、外部引数の仮引数が参照されており、さらに、参照されている仮引数がポインタ型であるという条件となる。ここで、仮引数とは、関数で定義される変数のうち、実行時に呼び出し元から渡される値を受け入れる変数である。また、ポインタ型とは、あるデータのポインタの型、すなわち、あるデータが格納される記憶領域のアドレスの値を記憶する型である。具体的には、Ｃ言語では、「ある型名  ＊変数」と定義された場合、鍵括弧内の変数は、ある型に対するポインタ型となる。例えば、「ｉｎｔ  ＊ａ」と定義された場合、ａは、ｉｎｔ型のデータのポインタとして定義されたことになる。
【００１８】
外部関数がループ処理を含むことについて説明する。ループ処理とは、何らかの条件下で処理を繰り返す処理である。例えば、ループ処理は、ｆｏｒ文やｗｈｉｌｅ文である。ループ処理は、プログラム中のボトルネックとなる箇所なので、ループ処理に対して様々な最適化を施すことにより、実行可能ファイルの性能向上を図ることができる。これに対し、外部関数が、ｇｅｔｔｅｒ／ｓｅｔｔｅｒのような、値を取得するだけの関数や値を代入するだけの関数といったループ処理が存在しない関数である場合、複製しても大きな効果が得られないため、複製の対象外とする。
【００１９】
次に、外部関数のループ処理内に、関数呼び出しが存在することについて説明する。外部関数のループ処理に、関数呼び出しが存在し、かつ、外部関数およびループ処理内に存在する関数がインライン展開されなかった場合、ＳＩＭＤ（Ｓｉｎｇｌｅ  Ｉｎｓｔｒｕｃｔｉｏｎ  Ｍｕｌｔｉｐｌｅ  Ｄａｔａ）化、自動並列化のループ最適化が適用されなくなるためである。以下の記載では、外部関数のループ処理に、関数呼び出しが存在するという条件を、条件１−１−１とする。
【００２０】
また、外部関数のループ処理内で、外部引数の仮引数が参照されており、さらに、参照される仮引数がポインタ型であることについて説明する。ループ処理内で参照される仮引数がポインタ型の場合、ポインタが指している記憶領域が他のポインタ型の変数と重なるか否かを判断すること、いわゆるａｌｉａｓ解析が困難であるため、ＳＩＭＤ化、自動並列化等のループ最適化が適用されなくなるためである。ここで、外部関数を複製することにより、依存関係の有無がわかりやすくすることができる。以下の記載では、外部関数のループ処理内で、外部引数の仮引数が参照されており、さらに、参照されている仮引数がポインタ型であるという条件を、条件１−１−２−１とする。
【００２１】
本実施の形態では、条件１−１−１、または条件１−１−２−１のいずれかが成立する関数を複製するものとする。
【００２２】
図１を用いて、情報処理装置１０１の動作例について説明する。図１では、Ｃ言語で記載されたソースファイルを例に説明を行う。具体的には、図１では、ファイル群Ａと、ファイル群Ｂとを用いて説明する。ここで、関数が複製される複製先は、ソースファイルを変換した中間言語をファイルとした中間言語データである。しかし、図１では、条件１−１−１、１−１−２−１が成立することを説明することを容易にするため、Ｃ言語で表現されたイメージのまま説明を行う。中間言語データに関数が複製される例としては、図１１、図１８で示す。
【００２３】
まず、ファイル群Ａのコンパイルについて説明する。ファイル群Ａは、複数のファイルとして、ソースファイルｓｒｃＡ＿ａ〜ｃを含む。そして、ソースファイルｓｒｃＡ＿ａ〜ｃ内には、それぞれ、ｍａｉｎ関数、ｆｕｎｃＡ関数、ｆｕｎｃＢ関数が定義されている。そして、ｍａｉｎ関数は、ｆｕｎｃＡ関数を呼び出す。ｆｕｎｃＡ関数は、ｍａｉｎ関数が定義されているファイルｓｒｃＡ＿ａとは異なる第２のファイルとなるファイルｓｒｃＡ＿ｂで定義されているため、外部関数となる。そして、ｆｕｎｃＡ関数は、ループ処理を含む。さらに、ｆｕｎｃＡ関数は、ループ処理内で、ｆｕｎｃＢ関数を呼び出す。
【００２４】
ここで、ファイル群Ａのうちの第１のファイルとしてファイルｓｒｃＡ＿ａをコンパイルするとする。この際、図１の（Ａ＿１）で示すように、情報処理装置１０１は、ファイルｓｒｃＡ＿ａ内で定義された第１の関数が、ループ処理を含む外部関数となる第２の関数を呼び出すか否かを判定する。図１のファイル群Ａの例では、情報処理装置１０１は、第１の関数となるｍａｉｎ関数が、第２の関数としてｆｕｎｃＡ関数を呼び出すと判定する。
【００２５】
第１の関数が第２の関数を呼び出すと判定した場合、図１の（Ａ＿２）で示すように、情報処理装置１０１は、条件１−１−１、または、条件１−１−２−１のいずれかが成立するかを判定する。ここで、情報処理装置１０１は、条件１−１−１だけが成立するか否か判定してもよいし、条件１−１−２−１だけが成立するか否かを判定してもよいし、条件１−１−１が成立しない場合に条件１−１−２−１が成立するか否かを判定してもよい。また、情報処理装置１０１は、条件１−１−２−１が成立しない場合に条件１−１−１が成立するか否かを判定してもよいし、条件１−１−２−１が成立してもさらに条件１−１−１が成立するか否かを判定してもよい。
【００２６】
また、第１の関数、第２の関数を用いて条件１−１−１を表現すると、第２の関数に含まれるループ処理内に、複数のファイルののうちのいずれかのファイル内で定義された第３の関数の呼び出しが存在することとなる。ここで、第３の関数を定義するファイルは、第１の関数を定義するファイルでもよいし、第２の関数を定義するファイルでもよいし、第１の関数を定義するファイルおよび第２の関数を定義するファイルとは異なるファイルでもよい。また、第３の関数は、第１の関数や第２の関数とは異なる関数である。同様に、第１の関数、第２の関数を用いて条件１−１−２−１を表現すると、ループ処理内で第２の関数のポインタ型の仮引数が参照されることとなる。
【００２７】
図１のファイル群Ａの例では、外部関数ｆｕｎｃＡは、ループ処理内にファイルｓｒｃＡ＿ｃ内で定義された第３の関数として、ｆｕｎｃＢ関数を呼び出すため、条件１−１−１が成立する。
【００２８】
条件１−１−１が成立したならば、図１の（Ａ＿３）で示すように、情報処理装置１０１は、ファイルｓｒｃＡ＿ａに第２の関数としてｆｕｎｃＡ関数と、第３の関数としてｆｕｎｃＢ関数とを複製する。また、情報処理装置１０１は、ファイルｓｒｃＡ＿ｂにｆｕｎｃＢ関数を複製してもよい。
【００２９】
ｆｕｎｃＡ関数とｆｕｎｃＢ関数との複製後、情報処理装置１０１は、ｍａｉｎ関数内に、ｆｕｎｃＡ関数とｆｕｎｃＢ関数とをインライン展開する。なお、上述したように、インライン展開によって命令数が増えると命令スケジューリングが行いにくくなるため、情報処理装置１０１は、ｍａｉｎ関数内に、ｆｕｎｃＡ関数とｆｕｎｃＢ関数とをインライン展開しない可能性もある。
【００３０】
次に、ファイル群Ｂのコンパイルについて説明する。ファイル群Ｂは、複数のファイルとして、ソースファイルｓｒｃＢ＿ａ、ｂを含む。そして、ソースファイルｓｒｃＢ＿ａ、ｂ内には、それぞれ、ｍａｉｎ関数、ｆｕｎｃＣ関数が定義されている。そして、ｍａｉｎ関数は、ｆｕｎｃＣ関数を呼び出す。ｆｕｎｃＣ関数は、ｍａｉｎ関数が定義されているファイルｓｒｃＢ＿ａとは異なるファイルとなるファイルｓｒｃＢ＿ｂで定義されているため、外部関数となる。そして、ｆｕｎｃＣ関数は、ループ処理を含む。さらに、ｆｕｎｃＣ関数は、ループ処理内で、ｆｕｎｃＣ関数のポインタ型の仮引数ａとｂとを参照している。
【００３１】
ここで、ファイル群Ｂのうちの第１のファイルとしてファイルｓｒｃＢ＿ａをコンパイルするとする。この際、図１の（Ｂ＿１）で示すように、情報処理装置１０１は、ファイルｓｒｃＢ＿ａ内で定義された第１の関数が、ループ処理を含む外部関数となる第２の関数を呼び出すか否かを判定する。図１のファイル群Ｂの例では、情報処理装置１０１は、第１の関数となるｍａｉｎ関数が、第２の関数としてｆｕｎｃＣ関数を呼び出すと判定する。
【００３２】
第１の関数が第２の関数を呼び出すと判定した場合、図１の（Ｂ＿２）で示すように、情報処理装置１０１は、条件１−１−１、または／および、条件１−１−２−１のいずれかが成立するかを判定する。図１のファイル群Ｂの例では、外部関数ｆｕｎｃＣは、ループ処理内で、外部関数ｆｕｎｃＣの仮引数ａ、ｂを参照しており、仮引数ａ、ｂはポインタ型であるため、条件１−１−２−１が成立する。
【００３３】
条件１−１−２−１が成立したならば、図１の（Ｂ＿３）で示すように、情報処理装置１０１は、ファイルｓｒｃＢ＿ａに第２の関数としてｆｕｎｃＣ関数を複製する。ｆｕｎｃＣ関数の複製後、情報処理装置１０１は、ｍａｉｎ関数内に、ｆｕｎｃＣ関数をインライン展開する。なお、上述したように、インライン展開によって命令数が増えると命令スケジューリングが行いにくくなるため、情報処理装置１０１は、ｍａｉｎ関数内にｆｕｎｃＣ関数をインライン展開しない可能性もある。
【００３４】
以上のように、情報処理装置１０１は、条件１−１−１、または／および、条件１−１−２−１を満たす外部関数を複製する。このように、情報処理装置１０１は、最適化が促進される適切な関数に限り複製することができる。従って、情報処理装置１０１は、翻訳時間の増加や実行可能ファイルのサイズの増加を抑えつつ、複製された関数がインライン展開された場合、ループ最適化が促進される可能性が高くなり、実行可能ファイルの実行性能も向上する可能性を向上させることができる。
【００３５】
また、情報処理装置１０１は、複製の条件を絞ることにより複製される関数を削減することが可能となるため、翻訳時間を抑制することが可能となる。また、情報処理装置１０１は、アセンブラ命令数の増大化も抑制することが可能となるため、オブジェクトコードのコード領域の増大を抑制することも可能となる。また、情報処理装置１０１は、実行性能の向上につながる関数だけに対して複製を実施するため、複製によって最適化が促進された場合、実行性能が向上する可能性を向上させることができる。また、情報処理装置１０１が一時的に作成されるファイルは中間言語データだけである。そして、中間言語データは中間言語が含まれるオブジェクトコードと比較するとサイズが小さいので、ディスクの使用量も小さくなる。
【００３６】
また、情報処理装置１０１は、中間言語データの出力、読込みを行うが、リンク時に手続き間最適化を実施しないため、翻訳時間の増加を抑制した上で最適化を促進することが可能となる。
【００３７】
また、図１では、プログラム言語の例としてＣ言語を用いて説明したが、コンパイル言語であり、インライン展開を行う言語であればどのようなものでもよい。例えば、本実施の形態は、Ｆｏｒｔｒａｎ、Ｃ＋＋言語に対しても適用可能である。次に、情報処理装置１０１のハードウェア構成例について、図２を用いて説明する。
【００３８】
（情報処理装置１０１のハードウェア構成例）
図２は、情報処理装置１０１のハードウェア構成例を示す説明図である。図２において、情報処理装置１０１は、ＣＰＵ（Ｃｅｎｔｒａｌ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ）２０１と、ＲＯＭ（Ｒｅａｄ−Ｏｎｌｙ  Ｍｅｍｏｒｙ）２０２と、ＲＡＭ（Ｒａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙ）２０３と、を含む。また、情報処理装置１０１は、ディスクドライブ２０４およびディスク２０５と、通信インターフェース２０６と、を含む。また、ＣＰＵ２０１〜ディスクドライブ２０４、通信インターフェース２０６はバス２０７によってそれぞれ接続される。
【００３９】
ＣＰＵ２０１は、情報処理装置１０１の全体の制御を司る演算処理装置である。また、情報処理装置１０１は、並列処理を実行するために、複数のＣＰＵを有してもよい。または、ＣＰＵ２０１が、ＳＩＭＤを処理する複数のコアを有してもよい。ＲＯＭ２０２は、ブートプログラムなどのプログラムを記憶する不揮発性メモリである。ＲＡＭ２０３は、ＣＰＵ２０１のワークエリアとして使用される揮発性メモリである。
【００４０】
ディスクドライブ２０４は、ＣＰＵ２０１の制御に従ってディスク２０５に対するデータのリードおよびライトを制御する制御装置である。ディスクドライブ２０４には、例えばディスクドライブ、光ディスクドライブ、ソリッドステートドライブなどを採用することができる。ディスク２０５は、ディスクドライブ２０４の制御で書き込まれたデータを記憶する不揮発性メモリである。例えばディスクドライブ２０４が磁気ディスクドライブである場合、ディスク２０５には、磁気ディスクを採用することができる。また、ディスクドライブ２０４が光ディスクドライブである場合、ディスク２０５には、光ディスクを採用することができる。また、ディスクドライブ２０４がソリッドステートドライブである場合、ディスク２０５には、半導体素子によって形成された半導体メモリ、いわゆる半導体ディスクを採用することができる。
【００４１】
通信インターフェース２０６は、ネットワークと内部のインターフェースを司り、他の装置からのデータの入出力を制御する制御装置である。具体的に、通信インターフェース２０６は、通信回線を通じてネットワークを介して情報処理装置１０１を利用する利用者端末等の他の装置に接続される。通信インターフェース２０６には、例えば、モデムやＬＡＮ（Ｌｏｃａｌ  Ａｒｅａ  Ｎｅｔｗｏｒｋ）アダプタなどを採用することができる。
【００４２】
また、情報処理装置１０１の管理者が、情報処理装置１０１を直接操作する場合、情報処理装置１０１は、ディスプレイ、キーボード、マウスといったハードウェアを有してもよい。
【００４３】
（情報処理装置１０１の機能構成例）
図３は、情報処理装置１０１の機能構成例を示す説明図である。情報処理装置１０１は、制御部３００を有する。制御部３００は、中間言語生成部３０１と、コールグラフ収集部３０２と、仮引数情報収集部３０３と、ループ処理解析部３０４と、手続き間最適化用情報収集部３０５と、手続き間最適化部３０６とを含む。さらに、制御部３００は、最適化部３０７と、コード生成部３０８と、オブジェクトコード生成部３０９と、リンカ３１０とを含む。手続き間最適化部３０６は、判定部３１１と、複製部３１２とを含む。
【００４４】
制御部３００は、記憶装置に記憶されたプログラムをＣＰＵ２０１が実行することにより、各部の機能を実現する。記憶装置とは、具体的には、例えば、図２に示したＲＯＭ２０２、ＲＡＭ２０３、ディスク２０５などである。また、各部の処理結果は、ＲＡＭ２０３や、ＣＰＵ２０１のレジスタ、ＣＰＵ２０１のキャッシュメモリ等に格納される。
【００４５】
また、情報処理装置１０１は、ソースファイルｓｒｃにアクセス可能である。ソースファイルｓｒｃは、ＲＡＭ２０３、ディスク２０５といった記憶装置に格納される。
【００４６】
中間言語生成部３０１は、ソースファイルｓｒｃを解析後、コンパイラ特有の中間言語に変換する。そして、中間言語生成部３０１は、中間言語生成部３０１で得られる中間言語データｉｎｔというファイルを出力する。例えば、中間言語生成部３０１は、ＲＡＭ２０３上に中間言語データｉｎｔを出力する。
【００４７】
次に、手続き間最適化を実施する場合、図３の破線内に含まれるコールグラフ収集部３０２〜ループ処理解析部３０４は、次に示す各処理を行う。一方で、手続き間最適化を実施しない場合、コールグラフ収集部３０２〜ループ処理解析部３０４は処理を行わず、最適化部３０７が処理を行う。また、手続き間最適化を実施するか否かの判断方法については、図６で説明する。
【００４８】
コールグラフ収集部３０２は、コールグラフの情報を収集する。ここで、コールグラフとは、関数の呼び出し関係を示す図である。仮引数情報収集部３０３は、関数を宣言または定義している文を解析し、仮引数の情報を収集する。ループ処理解析部３０４は、関数にループ処理があるか否か、仮引数がループ処理内で参照されているか否か、ループ処理内で呼び出されている関数の情報を収集する。手続き間最適化用情報収集部３０５は、コールグラフ収集部３０２〜ループ処理解析部３０４が収集した情報を、手続き間解析情報ｐｒｏｃに設定する。手続き間解析情報ｐｒｏｃの具体例については、図４で説明する。
【００４９】
手続き間最適化部３０６は、手続き間解析情報ｐｒｏｃに基づいて、関数複製を中間言語データｉｎｔに対して実施する。手続き間最適化部３０６に含まれる判定部３１１と、複製部３１２との機能について説明する。
【００５０】
判定部３１１は、手続き間解析情報ｐｒｏｃを参照して、コンパイル対象となる複数の中間言語データｉｎｔのうちのいずれかの中間言語データｉｎｔ内で定義された第１の関数が、ループ処理を含む外部関数となる第２の関数を呼び出すか判定する。
【００５１】
そして、第１の関数が第２の関数を呼び出すと判定した場合、判定部３１１は、条件１−１−１、または／および、条件１−１−２−１が成立するか否かを判定する。具体的には、条件１−１−１は、第２の関数に含まれるループ処理内に、第１の関数を定義する中間言語データｉｎｔとは異なる中間言語データｉｎｔ内で定義された第３の関数が存在するという条件である。また、条件１−１−２−１は、第２の関数に含まれるループ処理内で、第２の関数のポインタ型の仮引数が参照されているという条件である。
【００５２】
複製部３１２は、条件１−１−１が成立すると判定したならば、第１の関数を定義する中間言語データｉｎｔに、第２の関数および第３の関数を複製する。ここで、第３の関数が第１の関数を定義する中間言語データｉｎｔ内で既に定義されているならば、複製部３１２は、第１の関数を定義する中間言語データｉｎｔに、第３の関数を複製しない。また、複製部３１２は、条件１−１−１が成立すると判定したならば、第２の関数を定義する中間言語データｉｎｔに、第３の関数を複製してもよい。ここで、第３の関数が第２の関数を定義する中間言語データｉｎｔ内で既に定義されているならば、複製部３１２は、第２の関数を定義する中間言語データｉｎｔに、第３の関数を複製しない。
【００５３】
また、判定部３１１は、条件１−１−２−１が成立しても、さらに条件１−１−１が成立するか否かを判定してもよい。これは、条件１−１−２−１が成立した外部関数のループ処理内に、関数呼び出しが存在する可能性があるためである。
【００５４】
また、複製部３１２は、条件１−１−２−１が成立すると判定したならば、第１の関数を定義する中間言語データｉｎｔに、第２の関数を複製する。
【００５５】
また、複製部３１２は、ｍａｉｎ関数について複製の対象外とする。さらに、複製部３１２は、複製された関数を、複製先のファイル内でのみ参照可能とし、他のファイルからは参照不可能に設定する。具体的な複製例については、図１１、図１８で示す。
【００５６】
最適化部３０７は、手続き間最適化を実施しなかった場合はソースファイルｓｒｃから得られた中間言語データｉｎｔに対して最適化を実施し、手続き間最適化を実施した場合は関数複製が適用された中間言語データｉｎｔに対して最適化を実施する。例えば、最適化部３０７は、最適化として、上述したインライン展開や、命令スケジューリングを行う。
【００５７】
コード生成部３０８は、各種の最適化が実施された命令列からアセンブリを生成する。オブジェクトコード生成部３０９は、コード生成部３０８で得られるアセンブリからオブジェクトコードを生成する。リンカ３１０は、オブジェクトコードから実行可能ファイルｏｂｊを生成する。
【００５８】
図４は、手続き間解析情報ｐｒｏｃの一例を示す説明図である。図４で示すように、手続き間解析情報ｐｒｏｃには、関数ごとの解析情報であり、具体的には、１つの関数に対して８つの解析情報が格納される。
【００５９】
１つ目の解析情報は、ｃａｌｌｅｒである。ｃａｌｌｅｒには、対象となる呼び出し元関数名が設定される。２つ目の解析情報は、ｈａｓ＿ｄｕｍｍｙ＿ｐｔｒである。ｈａｓ＿ｄｕｍｍｙ＿ｐｔｒには、仮引数にポインタが含まれる場合はｔｒｕｅ、含まれない場合はｆａｌｓｅが設定される。３つ目の解析情報は、ｈａｓ＿ｌｏｏｐである。ｈａｓ＿ｌｏｏｐには、呼び出し元関数に、ループ処理が含まれる場合はｔｒｕｅが設定され、含まれない場合はｆａｌｓｅが設定される。４つ目の解析情報は、ｉｓ＿ｒｅｆｅｒｒｅｄ＿ｉｎ＿ｌｏｏｐである。ｉｓ＿ｒｅｆｅｒｒｅｄ＿ｉｎ＿ｌｏｏｐには、呼び出し元関数の仮引数がループ処理内で参照されている場合はｔｒｕｅが設定され、参照されていない場合はｆａｌｓｅが設定される。
【００６０】
５つ目の解析情報は、ｃａｌｌｅｅ＿ｎｕｍである。ｃａｌｌｅｅ＿ｎｕｍは、呼び出し元関数内で呼び出している関数の数が設定される。６つ目の解析情報は、ｃａｌｌｅｅ＿ｌｉｓｔである。ｃａｌｌｅｅ＿ｌｉｓｔには、呼び出し元関数内で呼び出している関数名のリストが設定される。７つ目の解析情報は、ｃａｌｌｅｅ＿ｎｕｍ＿ｉｎ＿ｌｏｏｐである。ｃａｌｌｅｅ＿ｎｕｍ＿ｉｎ＿ｌｏｏｐには、呼び出し元関数内のループ処理内で呼び出されている関数の数が設定される。８つ目の解析情報は、ｃａｌｌｅｅ＿ｌｉｓｔ＿ｉｎ＿ｌｏｏｐである。ｃａｌｌｅｅ＿ｌｉｓｔ＿ｉｎ＿ｌｏｏｐは、ループ処理内で呼び出されている関数名のリストが設定される。
【００６１】
次に、２つのサンプルとなるソースファイル群ｓｒｃＡ、Ｂを用いて、情報処理装置１０１が中間言語データを生成する手順について説明する。実施例１として、ソースファイル群ｓｒｃＡについて図５〜図１１を用いて説明し、実施例２として、ソースファイル群ｓｒｃＢについて図１２〜図１８を用いて説明する。
【００６２】
（実施例１）
図５は、ソースファイル群ｓｒｃＡの一例を示す説明図である。図５に示すように、ソースファイル群ｓｒｃＡには、ソースファイルｓｒｃＡ＿ａ〜ｆが含まれる。ソースファイルｓｒｃＡ＿ａ〜ｆには、それぞれ、ｍａｉｎ関数、ｆｕｎｃＡ関数、ｆｕｎｃＢ関数、ｆｕｎｃＣ関数、ｆｕｎｃＤ関数、ｆｕｎｃＥ関数が定義されている。
【００６３】
ｍａｉｎ関数は、外部関数として、ｆｕｎｃＡ関数、ｆｕｎｃＢ関数、ｆｕｎｃＥ関数を呼び出している。ｆｕｎｃＡ関数は、ループ処理を含み、そのループ処理内でｆｕｎｃＣ関数を呼び出している。ｆｕｎｃＢ関数は、ループ処理を含み、そのループ処理内でｆｕｎｃＤ関数を呼び出している。ｆｕｎｃＣ関数は、仮引数ａに仮引数ｂを加えた値を返す関数である。ｆｕｎｃＤ関数は、仮引数ａから仮引数ｂを減じた値を返す関数である。ｆｕｎｃＥ関数は、仮引数ａと仮引数ｂとの値を表示する関数である。従って、ｍａｉｎ関数内で呼び出されるｆｕｎｃＥ関数は、結果を表示する関数となる。
【００６４】
図６は、中間言語データ群ｉｎｔＡの一例を示す説明図である。情報処理装置１０１は、ソースファイルｓｒｃＡ＿ａ〜ｅを中間言語データに変換する。図６に示す中間言語データ群ｉｎｔＡに含まれる中間言語データｉｎｔＡ＿ａ〜ｆは、それぞれ、ソースファイルｓｒｃＡ＿ａ〜ｆを中間言語データに変換したものである。なお、実際の中間言語データはバイナリデータとして扱うが、以下では、説明の簡略化のため、バイナリデータを可読性のある形に変換した状態で示す。
【００６５】
次に、情報処理装置１０１は、手続き間最適化を実施するか否かを判断する。例えば、情報処理装置１０１は、コンパイル時のコンパイルオプションによって、手続き間最適化を実施するか否かを判断する。例えば、ソースファイルａ．ｃ、ｂ．ｃ、ｃ．ｃをコンパイルする際に、以下のようなコマンドが実行された場合、情報処理装置１０１は、手続き間最適化を実施すると判断する。
【００６６】
＄  ｄｒｖ  ａ．ｃ  ｂ．ｃ  ｃ．ｃ  −ｏ  実行可能ファイル  −ＩＰＯ
【００６７】
ここで、「ｄｒｖ」は、コンパイラドライバである。そして、「−ＩＰＯ」が、手続き間最適化を実施するというコンパイルオプションである。
【００６８】
手続き間最適化を実施しないと判断した場合、情報処理装置１０１は、中間言語データ群ｉｎｔＡに対しコンパイラ最適化を適用し、実行可能ファイルｏｂｊを作成する。一方、手続き間最適化を実施する場合、情報処理装置１０１は、中間言語データ群ｉｎｔＡに対しコールグラフ収集処理を実行する。
【００６９】
図７は、コールグラフ収集後の手続き間解析情報ｐｒｏｃＡの一例を示す説明図である。図７に示す手続き間解析情報ｐｒｏｃＡは、コールグラフ収集後の手続き間解析情報ｐｒｏｃの一例である。手続き間解析情報ｐｒｏｃＡに含まれる手続き間解析情報ｐｒｏｃＡ＿ａ〜ｆは、それぞれ、中間言語データｉｎｔＡ＿ａ〜ｆの手続き間解析情報である。
【００７０】
情報処理装置１０１は、手続き間解析情報ｐｒｏｃの各解析情報のうち、呼び出し元関数と呼び出し先関数との関係性についてのみを設定する。従って、情報処理装置１０１は、ｈａｓ＿ｄｕｍｍｙ＿ｐｔｒ、ｈａｓ＿ｌｏｏｐ、ｉｓ＿ｒｅｆｅｒｒｅｄ＿ｉｎ＿ｌｏｏｐについて、初期値ｆａｌｓｅを設定する。また、呼び出し関数がない場合、情報処理装置１０１は、ｃａｌｌｅ＿ｎｕｍに０を設定し、ｃａｌｌｅｅ＿ｌｉｓｔにＮＵＬＬを設定する。そして、情報処理装置１０１は、呼び出し関数が重複する場合、同一とみなすこととする。なお、図７において、太字の箇所は、初期値から変更した箇所であることを示す。図７に示す手続き間解析情報ｐｒｏｃＡから、図８に示すコールグラフ情報ｃａｌｌＡが得られる。
【００７１】
図８は、コールグラフ情報ｃａｌｌＡの一例を示す説明図である。図８に示すコールグラフ情報ｃａｌｌＡが示すように、ｍａｉｎ関数は、ｆｕｎｃＡ関数と、ｆｕｎｃＢ関数と、ｆｕｎｃＥ関数とを呼び出すことがわかる。同様に、コールグラフ情報ｃａｌｌＡが示すように、ｆｕｎｃＡ関数は、ｆｕｎｃＣ関数を呼び出し、ｆｕｎｃＢ関数は、ｆｕｎｃＤ関数を呼び出し、ｆｕｎｃＥ関数は、ｐｒｉｎｔｆ関数を呼び出すことがわかる。
【００７２】
なお、コールグラフ情報ｃａｌｌにおいて、再帰呼び出しが含まれる場合には、情報処理装置１０１は、再帰呼び出しを示す記号を付与する。また、関数Ａが関数Ｂを呼び出し、関数Ａが関数Ｂを呼び出すといったように、相互再帰する場合には、情報処理装置１０１は、関数Ａと関数Ｂが相互に呼び出すことを示す記号を付与する。また、関数Ａが関数Ｂを呼び出し、関数Ｂが関数Ｃを呼び出し、関数Ｃが関数Ａを呼び出すようなことも考えられる。この場合、情報処理装置１０１は、関数Ａと関数Ｂとの間、関数Ｂと関数Ｃとの間は図８で示すように表示した上で、関数Ｃから関数Ａまでの矢印を描画する。次に、情報処理装置１０１は、仮引数情報を収集する。
【００７３】
図９は、仮引数情報収集後の手続き間解析情報ｐｒｏｃＡの一例を示す説明図である。図９に示す手続き間解析情報ｐｒｏｃＡは、仮引数情報収集後の手続き間解析情報ｐｒｏｃの一例である。
【００７４】
ｍａｉｎ関数、ｆｕｎｃＣ関数、ｆｕｎｃＤ関数、ｆｕｎｃＥ関数の仮引数にはポインタが含まれないため、それぞれの関数に対応する手続き間解析情報ｐｒｏｃのｈａｓ＿ｄｕｍｍｙ＿ｐｔｒはｆａｌｓｅから変化しない。一方、ｆｕｎｃＡ関数、ｆｕｎｃＢ関数は仮引数にポインタが含まれるため、情報処理装置１０１は、ｐｒｏｃＡ＿ｂ、ｃのｈａｓ＿ｄｕｍｍｙ＿ｐｔｒをｔｒｕｅに設定する。以下の図において、太字の箇所は、前の図から変更した箇所であることを示す。次に、情報処理装置１０１は、ループ処理解析を行う。
【００７５】
図１０は、ループ処理解析後の手続き間解析情報ｐｒｏｃＡの一例を示す説明図である。図１０に示す手続き間解析情報ｐｒｏｃＡは、ループ処理解析後の手続き間解析情報ｐｒｏｃの一例である。
【００７６】
ｍａｉｎ関数、ｆｕｎｃＣ関数、ｆｕｎｃＤ関数はループ処理を含まず、ループ処理内で仮引数を参照しないため、それぞれの関数に対応する手続き間解析情報ｐｒｏｃのｈａｓ＿ｌｏｏｐ、ｉｓ＿ｒｅｆｅｒｒｅｄ＿ｉｎ＿ｌｏｏｐはｆａｌｓｅから変化しない。一方、ｆｕｎｃＡ、ｆｕｎｃＢはループ処理を含み、ループ処理内で仮引数を参照しており、ループ処理内で、それぞれ、ｆｕｎｃＣ関数、ｆｕｎｃＤ関数を呼び出している。従って、情報処理装置１０１は、手続き間解析情報ｐｒｏｃＡ＿ｂ、ｃのｈａｓ＿ｌｏｏｐ、ｉｓ＿ｒｅｆｅｒｒｅｄ＿ｉｎ＿ｌｏｏｐをｔｒｕｅに設定する。さらに、情報処理装置１０１は、手続き間解析情報ｐｒｏｃＡ＿ｂ、ｃのｃａｌｌｅｅ＿ｎｕｍ＿ｉｎ＿ｌｏｏｐを１に設定する。そして、情報処理装置１０１は、手続き間解析情報ｐｒｏｃＡ＿ｂのｃａｌｌｅｅ＿ｌｉｓｔ＿ｉｎ＿ｌｏｏｐを｛ｆｕｎｃＣ｝に設定し、手続き間解析情報ｐｒｏｃＡ＿ｃのｃａｌｌｅｅ＿ｌｉｓｔ＿ｉｎ＿ｌｏｏｐを｛ｆｕｎｃＤ｝に設定する。
【００７７】
次に、情報処理装置１０１は、図１０に示す手続き間解析情報ｐｒｏｃＡを用いて、手続き間最適化処理を実行する。手続き間最適化処理の具体例については、図１９〜図２１で示す。
【００７８】
図１１は、関数複製後の中間言語データ群ｉｎｔＡの一例を示す説明図である。図１１で示す中間言語データ群ｉｎｔＡは、手続き間最適化処理により、関数を複製した後の中間言語データ群ｉｎｔの一例である。例えば、ｆｕｎｃＡ関数、ｆｕｎｃＢ関数は仮引数にポインタが含まれ、かつ、仮引数はループ処理内で参照されているため、条件１−１−２−１を満たす。そのため、情報処理装置１０１は、ｆｕｎｃＡ関数、ｆｕｎｃＢ関数を、中間言語データｉｎｔＡ＿ａに複製する。一方、ｆｕｎｃＥ関数は条件１−１−２−１を満たさないため、関数複製の対象外である。
【００７９】
ここで、複製する際には、複製された関数は、複製先のファイル内でのみ参照可能とし、他のファイルからは参照不可能とする。この２つの処理は、関数名が競合しないようにするための処理である。通常、複製先のファイル内でのみ参照可能とすることと、他のファイルから参照不可能とすることのいずれか一方を行えばよいが、コンパイラによっては、両方行ったほうが好ましい。図１１の例では、「ｓｔａｔｉｃ」により、複製先のファイル内でのみ参照可能とすることを表す。また、複製された関数は、複製元の関数とは異なる名称に変更する。図１１の例では、情報処理装置１０１は、複製元の関数に「ｄｕｐ＿」という語を付与して、複製された関数の関数名を、複製元の関数とは異なる名称に変更する。または、情報処理装置１０１は、複製元の関数にハッシュ値を付与して、複製された関数の関数名を、複製元の関数とは異なる名称に変更してもよい。
【００８０】
そして、ｆｕｎｃＡ関数、ｆｕｎｃＢ関数はループ処理内で関数ｆｕｎｃＣ関数、ｆｕｎｃＤ関数を呼び出しているため、条件１−１−１を満たす。そのため、情報処理装置１０１は、ｆｕｎｃＣ関数を中間言語データｉｎｔＡ＿ａ、ｂに複製し、ｆｕｎｃＤ関数を中間言語データｉｎｔＡ＿ａ、ｃに複製する。また、ｍａｉｎ関数自体は複製の対象外である。以上の処理により、情報処理装置１０１は、図１１で示す中間言語データ群ｉｎｔＡが得られる。
【００８１】
（実施例２）
図１２は、ソースファイル群ｓｒｃＢの一例を示す説明図である。図１２に示すように、ソースファイル群ｓｒｃＢには、ソースファイルｓｒｃＢ＿ａ〜ｄが含まれる。ソースファイルｓｒｃＢ＿ａ〜ｄには、それぞれ、ｍａｉｎ関数、ｆｕｎｃＡ関数、ｆｕｎｃＢ関数、ｆｕｎｃＣ関数が定義されている。
【００８２】
ｍａｉｎ関数は、外部関数として、ｆｕｎｃＡ関数、ｆｕｎｃＣ関数を呼び出している。ｆｕｎｃＡ関数は、ループ処理を含み、そのループ処理内でｆｕｎｃＢ関数を呼び出している。ｆｕｎｃＢ関数は、仮引数ａに仮引数ｂを加えた値を返す関数である。ｆｕｎｃＣ関数は、仮引数ｓｕｍの値を表示する関数である。従って、ｍａｉｎ関数内で呼び出されるｆｕｎｃＣ関数は、結果を表示する関数となる。
【００８３】
図１３は、中間言語データ群ｉｎｔＢの一例を示す説明図である。情報処理装置１０１は、ソースファイルｓｒｃＢ＿ａ〜ｄを中間言語データに変換する。図１３に示す中間言語データ群ｉｎｔＢに含まれる中間言語データｉｎｔＢ＿ａ〜ｄは、それぞれ、ソースファイルｓｒｃＢ＿ａ〜ｄを中間言語データに変換したものである。
【００８４】
次に、情報処理装置１０１は、実施例１と同様に、手続き間最適化を実施するか否かを判断する。手続き間最適化を実施しないと判断した場合、情報処理装置１０１は、中間言語データ群ｉｎｔＢに対しコンパイラ最適化を適用し、実行可能ファイルを作成する。一方、手続き間最適化を実施する場合、情報処理装置１０１は、中間言語データ群ｉｎｔＢに対しコールグラフ収集処理を実行する。
【００８５】
図１４は、コールグラフ収集後の手続き間解析情報ｐｒｏｃＢの一例を示す説明図である。図１４に示す手続き間解析情報ｐｒｏｃＢは、コールグラフ収集後の手続き間解析情報ｐｒｏｃの一例である。手続き間解析情報ｐｒｏｃＢに含まれる手続き間解析情報ｐｒｏｃＢ＿ａ〜ｄは、それぞれ、中間言語データｉｎｔＢ＿ａ〜ｄの手続き間解析情報である。
【００８６】
図１４において、太字の箇所は、初期値から変更した箇所であることを示す。図１４に示す手続き間解析情報ｐｒｏｃＢから、図１５に示すコールグラフ情報ｃａｌｌＢが得られる。
【００８７】
図１５は、コールグラフ情報ｃａｌｌＢの一例を示す説明図である。図１５に示すコールグラフ情報ｃａｌｌＢが示すように、ｍａｉｎ関数は、ｆｕｎｃＡ関数、ｆｕｎｃＢ関数を呼び出すことがわかる。同様に、コールグラフ情報ｃａｌｌＢが示すように、ｆｕｎｃＡ関数は、ｆｕｎｃＢ関数を呼び出し、ｆｕｎｃＣ関数は、ｐｒｉｎｔｆ関数を呼び出すことがわかる。次に、情報処理装置１０１は、仮引数情報を収集する。
【００８８】
図１６は、仮引数情報収集後の手続き間解析情報ｐｒｏｃＢの一例を示す説明図である。図１６に示す手続き間解析情報ｐｒｏｃＢは、仮引数情報収集後の手続き間解析情報ｐｒｏｃの一例である。
【００８９】
ｍａｉｎ関数、ｆｕｎｃＡ関数、ｆｕｎｃＢ関数、ｆｕｎｃＣ関数の仮引数にはポインタが含まれないため、それぞれの関数に対応する手続き間解析情報ｐｒｏｃのｈａｓ＿ｄｕｍｍｙ＿ｐｔｒはｆａｌｓｅから変化しない。従って、図１６では、図１４で示した状態から値が変化しない。次に、情報処理装置１０１は、ループ処理解析を行う。
【００９０】
図１７は、ループ処理解析後の手続き間解析情報ｐｒｏｃＢの一例を示す説明図である。図１７に示す手続き間解析情報ｐｒｏｃＢは、ループ処理解析後の手続き間解析情報ｐｒｏｃの一例である。
【００９１】
ｍａｉｎ関数、ｆｕｎｃＢ関数、ｆｕｎｃＣ関数はループ処理を含まず、ループ処理内で仮引数を参照しないため、それぞれの関数に対応する手続き間解析情報ｐｒｏｃのｈａｓ＿ｌｏｏｐ、ｉｓ＿ｒｅｆｅｒｒｅｄ＿ｉｎ＿ｌｏｏｐはｆａｌｓｅから変化しない。一方、ｆｕｎｃＡはループ処理を含み、ループ処理内でｆｕｎｃＢ関数を呼び出している。従って、情報処理装置１０１は、手続き間解析情報ｐｒｏｃＢ＿ｂのｈａｓ＿ｌｏｏｐをｔｒｕｅに設定する。さらに、情報処理装置１０１は、手続き間解析情報ｐｒｏｃＢ＿ｂのｃａｌｌｅｅ＿ｎｕｍ＿ｉｎ＿ｌｏｏｐを１に設定する。そして、情報処理装置１０１は、手続き間解析情報ｐｒｏｃＢ＿ｂのｃａｌｌｅｅ＿ｌｉｓｔ＿ｉｎ＿ｌｏｏｐを｛ｆｕｎｃＢ｝に設定する。
【００９２】
次に、情報処理装置１０１は、図１７に示す手続き間解析情報ｐｒｏｃＢを用いて、手続き間最適化処理を実行する。手続き間最適化処理の具体例については、図１９〜図２１で示す。
【００９３】
図１８は、関数複製後の中間言語データ群ｉｎｔＢの一例を示す説明図である。図１８で示す中間言語データ群ｉｎｔＢは、手続き間最適化処理により、関数を複製した後の中間言語データ群ｉｎｔの一例である。
【００９４】
ｆｕｎｃＡ関数はポインタ型の仮引数を持たないが、ループ処理を含み、そのループ処理内で関数を呼び出しているため、条件１−１−１を満たす。そのため、情報処理装置１０１は、ｆｕｎｃＡ関数を中間言語データｉｎｔＢ＿ａに複製する。そして、情報処理装置１０１は、ｆｕｎｃＡのループ処理で呼び出しているｆｕｎｃＢを、中間言語データｉｎｔＢ＿ａ、ｂに複製する。
【００９５】
図１９は、手続き間最適化処理手順の一例を示すフローチャート（その１）である。また、図２０は、手続き間最適化処理手順の一例を示すフローチャート（その２）である。また、図２１は、手続き間最適化処理手順の一例を示すフローチャート（その３）である。
【００９６】
情報処理装置１０１は、１を変数ｉに代入する（ステップＳ１９０１）。また、情報処理装置１０１は、手続き間解析情報ｐｒｏｃの数を変数ｌａｓｔに代入する（ステップＳ１９０２）。そして、情報処理装置１０１は、ｉ番目の手続き間解析情報ｐｒｏｃを変数ｃａｌｌｅｒに代入する（ステップＳ１９０３）。
【００９７】
次に、情報処理装置１０１は、ｉがｌａｓｔより小さいか否かを判断する（ステップＳ１９０４）。ｉがｌａｓｔ以上である場合（ステップＳ１９０４：Ｎｏ）、情報処理装置１０１は、手続き間最適化処理を終了する。一方、ｉがｌａｓｔより小さい場合（ステップＳ１９０４：Ｙｅｓ）、情報処理装置１０１は、１を変数ｊに代入する（ステップＳ１９０５）。そして、情報処理装置１０１は、ｊがｃａｌｌｅｅ＿ｎｕｍ以下であるか否かを判断する（ステップＳ１９０６）。ここで、ｃａｌｌｅｅ＿ｎｕｍは、ｃａｌｌｅｒに登録された手続き間解析情報ｐｒｏｃのｃａｌｌｅｅ＿ｎｕｍである。
【００９８】
ｊがｃａｌｌｅｅ＿ｎｕｍ以下である場合（ステップＳ１９０６：Ｙｅｓ）、情報処理装置１０１は、図２０で示すように、ｃａｌｌｅｒに登録されたｃａｌｌｅｅ＿ｌｉｓｔのｊ番目の関数を、変数ｃａｌｌｅｅに代入する（ステップＳ２００１）。次に、情報処理装置１０１は、ｃａｌｌｅｅに対応する手続き間解析情報ｐｒｏｃを、変数ｉｎｆｏに代入する（ステップＳ２００２）。そして、情報処理装置１０１は、ｉｎｆｏに登録されたｈａｓ＿ｌｏｏｐの値を、変数ｈａｓ＿ｌｏｏｐに代入する（ステップＳ２００３）。また、情報処理装置１０１は、ｉｎｆｏに登録されたｈａｓ＿ｄｕｍｍｙ＿ｐｔｒの値を、変数ｈａｓ＿ｄｍｙに代入する（ステップＳ２００４）。また、情報処理装置１０１は、ｉｎｆｏに登録されたｉｓ＿ｒｅｆｅｒｒｅｄ＿ｉｎ＿ｌｏｏｐの値を、変数ｉｓ＿ｒｅｆに代入する（ステップＳ２００５）。
【００９９】
次に、情報処理装置１０１は、ｈａｓ＿ｌｏｏｐの値がｔｒｕｅであるか否かを判断する（ステップＳ２００６）。ｈａｓ＿ｌｏｏｐの値がｔｒｕｅである場合（ステップＳ２００６：Ｙｅｓ）、情報処理装置１０１は、続けて、ｈａｓ＿ｄｍｙの値がｔｒｕｅであるか否かを判断する（ステップＳ２００７）。ｈａｓ＿ｄｍｙの値がｔｒｕｅである場合（ステップＳ２００７：Ｙｅｓ）、情報処理装置１０１は、続けて、ｉｓ＿ｒｅｆの値がｔｒｕｅであるか否かを判断する（ステップＳ２００８）。
【０１００】
ｈａｓ＿ｄｍｙの値がｔｒｕｅでない場合（ステップＳ２００７：Ｎｏ）、または、ｉｓ＿ｒｅｆの値がｔｒｕｅである場合（ステップＳ２００８：Ｙｅｓ）、情報処理装置１０１は、ｃａｌｌｅｅを呼び出し元に複製する（ステップＳ２００９）。ここで、ステップＳ２００８：Ｙｅｓとなる場合が、条件１−１−２−１が成立したときを示す。
【０１０１】
そして、情報処理装置１０１は、図２１で示すように、１を変数ｋに代入する（ステップＳ２１０１）。また、情報処理装置１０１は、ｉｎｆｏに登録されたｃａｌｌｅｅ＿ｎｕｍ＿ｉｎ＿ｌｏｏｐを、変数ｎｕｍに代入する（ステップＳ２１０２）。また、情報処理装置１０１は、ｉｎｆｏに登録されたｃａｌｌｅｅ＿ｌｉｓｔ＿ｉｎ＿ｌｏｏｐを、配列変数ｌｉｓｔに代入する（ステップＳ２１０３）。
【０１０２】
次に、情報処理装置１０１は、ｋがｎｕｍより小さいか否かを判断する（ステップＳ２１０４）。ｋがｎｕｍより小さい場合（ステップＳ２１０４：Ｙｅｓ）、情報処理装置１０１は、ｌｉｓｔ［ｋ］に対応する関数をｃａｌｌｅｅとｃａｌｌｅｅの呼び出し元に複製する（ステップＳ２１０５）。ここで、ステップＳ２１０４：Ｙｅｓとなる場合が、条件１−１−１が成立したときを示す。そして、情報処理装置１０１は、ｋをインクリメントし（ステップＳ２１０６）、ステップＳ２１０４の処理に移行する。
【０１０３】
一方、ｋがｎｕｍ以上である場合（ステップＳ２１０４：Ｎｏ）、図１９に戻り、情報処理装置１０１は、ｊをインクリメントし（ステップＳ１９０７）、ステップＳ１９０６の処理に移行する。
【０１０４】
また、図２０に戻り、ｈａｓ＿ｌｏｏｐの値がｆａｌｓｅである場合（ステップＳ２００６：Ｎｏ）、または、ｉｓ＿ｒｅｆの値がｆａｌｓｅである場合（ステップＳ２００８：Ｎｏ）、情報処理装置１０１は、ステップＳ１９０７の処理に移行する。
【０１０５】
また、図１９に戻り、ｊがｃａｌｌｅｅ＿ｎｕｍ以下でない場合（ステップＳ１９０６：Ｎｏ）、情報処理装置１０１は、ｉをインクリメントし（ステップＳ１９０８）、ステップＳ１９０４の処理に移行する。
【０１０６】
以上説明したように、情報処理装置１０１は、条件１−１−１が成立すれば、外部関数のループ処理内に存在する第３の関数および外部関数を複製し、または／および、条件１−１−２−１が成立した際に外部関数を複製する。これにより、情報処理装置１０１は、複製された関数がインライン展開された場合、ループ最適化が促進される可能性が高くなり、また同時に、実行可能ファイルの実行性能も向上する可能性を向上させることができる。
【０１０７】
また、情報処理装置１０１は、外部関数の呼び出し元の関数と、複製した関数とに基づいて、インライン展開を行ってもよい。このように、実行性能の向上につながる可能性がある外部関数をインライン展開することにより、実行可能ファイルの実行性能を向上することができる。
【０１０８】
また、情報処理装置１０１は、条件１−１−１が成立した際に、外部関数のループ処理内に存在する第３の関数を、外部関数を定義するファイル内に複製してもよい。これにより、情報処理装置１０１は、第３の関数がインライン展開されれば、実行可能ファイルの実行性能を向上することができる。
【０１０９】
なお、本実施の形態で説明したコンパイル管理方法は、予め用意されたプログラムをパーソナル・コンピュータやワークステーション等のコンピュータで実行することにより実現することができる。本コンパイルプログラムは、ハードディスク、フレキシブルディスク、ＣＤ−ＲＯＭ（Ｃｏｍｐａｃｔ  Ｄｉｓｃ−Ｒｅａｄ  Ｏｎｌｙ  Ｍｅｍｏｒｙ）、ＤＶＤ（Ｄｉｇｉｔａｌ  Ｖｅｒｓａｔｉｌｅ  Ｄｉｓｋ）等のコンピュータで読み取り可能な記録媒体に記録され、コンピュータによって記録媒体から読み出されることによって実行される。また本コンパイルプログラムは、インターネット等のネットワークを介して配布してもよい。
【符号の説明】
【０１１０】
１０１  情報処理装置
３０１  中間言語生成部
３０２  コールグラフ収集部
３０３  仮引数情報収集部
３０４  ループ処理解析部
３０５  手続き間最適化用情報収集部
３０６  手続き間最適化部
３０７  最適化部
３０８  コード生成部
３０９  オブジェクトコード生成部
３１０  リンカ
３１１  判定部
３１２  複製部
【図１】
2017211842.tif 000003
【図２】
2017211842.tif 000004
【図３】
2017211842.tif 000005
【図４】
2017211842.tif 000006
【図５】
2017211842.tif 000007
【図６】
2017211842.tif 000008
【図７】
2017211842.tif 000009
【図８】
2017211842.tif 000010
【図９】
2017211842.tif 000011
【図１０】
2017211842.tif 000012
【図１１】
2017211842.tif 000013
【図１２】
2017211842.tif 000014
【図１３】
2017211842.tif 000015
【図１４】
2017211842.tif 000016
【図１５】
2017211842.tif 000017
【図１６】
2017211842.tif 000018
【図１７】
2017211842.tif 000019
【図１８】
2017211842.tif 000020
【図１９】
2017211842.tif 000021
【図２０】
2017211842.tif 000022
【図２１】
2017211842.tif 000023