JP2017211842A - 情報処理装置、コンパイル管理方法、およびコンパイルプログラム - Google Patents

情報処理装置、コンパイル管理方法、およびコンパイルプログラム Download PDF

Info

Publication number
JP2017211842A
JP2017211842A JP2016104685A JP2016104685A JP2017211842A JP 2017211842 A JP2017211842 A JP 2017211842A JP 2016104685 A JP2016104685 A JP 2016104685A JP 2016104685 A JP2016104685 A JP 2016104685A JP 2017211842 A JP2017211842 A JP 2017211842A
Authority
JP
Japan
Prior art keywords
function
file
processing apparatus
information processing
loop
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Pending
Application number
JP2016104685A
Other languages
English (en)
Inventor
貴洋 三好
Takahiro Miyoshi
貴洋 三好
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Fujitsu Ltd
Original Assignee
Fujitsu Ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Fujitsu Ltd filed Critical Fujitsu Ltd
Priority to JP2016104685A priority Critical patent/JP2017211842A/ja
Priority to US15/480,862 priority patent/US20170344351A1/en
Publication of JP2017211842A publication Critical patent/JP2017211842A/ja
Pending legal-status Critical Current

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/44Encoding
    • G06F8/443Optimisation
    • G06F8/4441Reducing the execution time required by the program code
    • G06F8/4443Inlining
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/44Encoding
    • G06F8/443Optimisation
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/70Software maintenance or management
    • G06F8/72Code refactoring

Landscapes

  • Engineering & Computer Science (AREA)
  • General Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Software Systems (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Devices For Executing Special Programs (AREA)

Abstract

【課題】コンパイルを行う際に適切な関数を呼び出し元のファイルに複製すること。【解決手段】図1の(A_1)で示すように、情報処理装置101は、ファイルsrcA_a内で定義された第1の関数が、ループ処理を含む外部関数となる第2の関数を呼び出すか否かを判定する。第1の関数が第2の関数を呼び出すと判定した場合、図1の(A_2)で示すように、情報処理装置101は、条件1−1−1、または、条件1−1−2−1のいずれかが成立するかを判定する。条件1−1−1が成立したならば、図1の(A_3)で示すように、情報処理装置101は、ファイルsrcA_aに第2の関数としてfuncA関数と、第3の関数としてfuncB関数とを複製する。funcA関数とfuncB関数との複製後、情報処理装置101は、main関数内に、funcA関数とfuncB関数とをインライン展開する。【選択図】図1

Description

本発明は、情報処理装置、コンパイル管理方法、およびコンパイルプログラムに関する。
従来、コンパイラによる最適化の手法の1つとして、関数の読み出し元に、呼び出された関数の処理を挿入することにより、関数の呼び出しにかかるオーバヘッドを削減する、インライン展開と呼ばれる最適化技術がある。また、あるファイルで定義された関数が、他のファイルで定義された他の関数を呼び出す場合、他の関数のインライン展開を促進するために、他の関数の定義を、あるファイルに複製する技術がある。
関連する先行技術として、例えば、ソースコードを変換した中間テキスト列を解析し収集した静的制御情報に基づき各関数をインライン展開したことの当否を評価し、評価結果に応じて、該当するインライン展開部分を元の関数の呼び出しごとに復元するものがある。また、コンパイラで直接ソースライブラリファイルから入力ソースファイルで参照されている関数のプログラムを抽出し、入力ソースファイルと結合して、最適化処理を行い、機械語命令列に変換する技術がある。
特開平09−128246号公報 特開平05−61687号公報
しかしながら、従来技術によれば、コンパイルを行う際に、インライン展開を促進するためにどの関数を呼び出し元のファイルに複製すればよいのか決定することが難しい。例えば、あらゆる関数に対して複製が実施されると、複製された関数に対しても最適化を行うことになるため、翻訳時間が増大することになる。また、複製された関数の個数分アセンブラ命令数が増加し、アセンブラ命令がオブジェクトコードのコード領域に配置されるためオブジェクトコードのコード領域が増加する。そのため、複製された関数が多くなれば多くなるほど、オブジェクトコードのコード領域の肥大化につながる。このように、インライン展開を促進するために関数を複製することと、コンパイルして得られる実行可能ファイルのサイズとは、トレードオフの関係にある。
1つの側面では、本発明は、コンパイルを行う際に適切な関数を呼び出し元のファイルに複製することができる情報処理装置、コンパイル管理方法、およびコンパイルプログラムを提供することを目的とする。
本発明の一側面によれば、複数のファイルのうちの第1のファイルをコンパイルする際に、第1のファイル内で定義された第1の関数が、複数のファイルのうちの第1のファイルとは異なる第2のファイル内で定義された、ループ処理を含む第2の関数を呼び出すか否かを判定し、第1の関数が第2の関数を呼び出すと判定した場合、ループ処理内に複数のファイルのうちのいずれかのファイル内で定義された第3の関数の呼び出しが存在すれば第1のファイル内に第2の関数および第3の関数を複製し、または/および、第1の関数が第2の関数を呼び出すと判定した場合、ループ処理内で第2の関数のポインタ型の仮引数が参照されるならば第1のファイル内に第2の関数を複製する情報処理装置、コンパイル管理方法、およびコンパイルプログラムが提案される。
本発明の一態様によれば、コンパイルを行う際に適切な関数を呼び出し元のファイルに複製することができるという効果を奏する。
図1は、本実施の形態にかかる情報処理装置101の動作例を示す説明図である。 図2は、情報処理装置101のハードウェア構成例を示す説明図である。 図3は、情報処理装置101の機能構成例を示す説明図である。 図4は、手続き間解析情報procの一例を示す説明図である。 図5は、ソースファイル群srcAの一例を示す説明図である。 図6は、中間言語データ群intAの一例を示す説明図である。 図7は、コールグラフ収集後の手続き間解析情報procAの一例を示す説明図である。 図8は、コールグラフ情報callAの一例を示す説明図である。 図9は、仮引数情報収集後の手続き間解析情報procAの一例を示す説明図である。 図10は、ループ処理解析後の手続き間解析情報procAの一例を示す説明図である。 図11は、関数複製後の中間言語データ群intAの一例を示す説明図である。 図12は、ソースファイル群srcBの一例を示す説明図である。 図13は、中間言語データ群intBの一例を示す説明図である。 図14は、コールグラフ収集後の手続き間解析情報procBの一例を示す説明図である。 図15は、コールグラフ情報callBの一例を示す説明図である。 図16は、仮引数情報収集後の手続き間解析情報procBの一例を示す説明図である。 図17は、ループ処理解析後の手続き間解析情報procBの一例を示す説明図である。 図18は、関数複製後の中間言語データ群intBの一例を示す説明図である。 図19は、手続き間最適化処理手順の一例を示すフローチャート(その1)である。 図20は、手続き間最適化処理手順の一例を示すフローチャート(その2)である。 図21は、手続き間最適化処理手順の一例を示すフローチャート(その3)である。
以下に図面を参照して、開示の情報処理装置、コンパイル管理方法、およびコンパイルプログラムの実施の形態を詳細に説明する。
図1は、本実施の形態にかかる情報処理装置101の動作例を示す説明図である。図1に示す情報処理装置101は、コンパイルを行うコンピュータである。例えば、情報処理装置101は、利用者が用意したソースコードをコンパイルして、実行可能ファイルを作成する。ここで、作成した実行可能ファイルは、情報処理装置101をターゲットとするものでもよいし、他のコンピュータをターゲットとするものでもよい。また、情報処理装置101は、例えば、ハイ・パフォーマンス・コンピューティング(HPC:High Performance Computing)分野で使用されるコンピュータである。
コンパイラが行う最適化手法の1つとして、インライン展開と呼ばれる技術がある。インライン展開は、関数の読み出し元に、呼び出された関数の処理を挿入することにより、関数の呼び出しにかかるオーバヘッドを削減する技術である。また、あるファイルで定義された関数が、他のファイルで定義された他の関数を呼び出す場合、他の関数のインライン展開を促進するために、他の関数の定義を、あるファイルに複製する技術がある。以下、あるファイルで定義された関数が呼び出す、他のファイルで定義された関数を、「外部関数」と呼称する。コンパイラは、同一のファイル内の関数に対してインライン展開を行うか否かを決定するため、外部関数については、関数の定義を複製することにより、インライン展開を促進することができる。
しかしながら、コンパイルを行う際に、インライン展開を促進するため、どの関数を呼び出し元のファイルに複製すればよいのか決定することが難しい。例えば、あらゆる関数に対して複製が実施されると、複製された関数に対しても最適化を行うことになるため、翻訳時間が増大することになる。また、複製された関数の個数分アセンブラ命令数が増加し、アセンブラ命令がオブジェクトコードのコード領域に配置されるためオブジェクトコードのコード領域が増加する。そのため、複製された関数が多くなれば多くなるほど、オブジェクトコードのコード領域の肥大化につながる。このように、インライン展開を行うために外部関数の複製を行うことと、実行可能ファイルのサイズとは、トレードオフの関係にある。
また、あらゆる関数に対して複製を行うと、実行性能の向上につながる関数であるか判断していないため、複製によってインライン展開が促進されたとしても、実行性能が大きく向上するとは限らない。具体的には、インライン展開によって命令数が増えると、命令の順序を入れ替える命令スケジューリングが行いにくくなるためである。ここで、命令スケジューリングとは、命令の意味を変えずに命令の順序を並び替えることにより、例えば、パイプラインのストールを防ぐ最適化手法である。
また、オブジェクトコードに中間言語が含まれるため、リンク時にも手続き間最適化を実施することは可能であるが、手続き間最適化を実施しない場合に作成されるオブジェクトコードと比較すると、オブジェクトコードのサイズが大きくなってしまう。オブジェクトコードのサイズが大きくなる原因としては、手続き間最適化のために集めた情報を、オブジェクトコード内の1つのセクションに埋め込むためである。そして、オブジェクトコードのサイズが大きくなった結果、ディスクの使用量が大きくなる。
そこで、本実施の形態では、外部関数の呼び出し元ファイルに外部関数のループ処理が関数呼び出しを含めば、呼び出された関数とその外部関数を複製し、ループ処理内でポインタ型の仮引数を参照するのであれば、その外部関数を複製することについて説明する。
ここで、上述した、複製の対象とする関数の条件を説明する。まず、複製の対象とする関数は、外部関数である。さらに、外部関数がループ処理を含む。さらに、外部関数のループ処理内に、関数呼び出しが存在する、または、外部関数のループ処理内で、外部引数の仮引数が参照されており、さらに、参照されている仮引数がポインタ型であるという条件となる。ここで、仮引数とは、関数で定義される変数のうち、実行時に呼び出し元から渡される値を受け入れる変数である。また、ポインタ型とは、あるデータのポインタの型、すなわち、あるデータが格納される記憶領域のアドレスの値を記憶する型である。具体的には、C言語では、「ある型名 *変数」と定義された場合、鍵括弧内の変数は、ある型に対するポインタ型となる。例えば、「int *a」と定義された場合、aは、int型のデータのポインタとして定義されたことになる。
外部関数がループ処理を含むことについて説明する。ループ処理とは、何らかの条件下で処理を繰り返す処理である。例えば、ループ処理は、for文やwhile文である。ループ処理は、プログラム中のボトルネックとなる箇所なので、ループ処理に対して様々な最適化を施すことにより、実行可能ファイルの性能向上を図ることができる。これに対し、外部関数が、getter/setterのような、値を取得するだけの関数や値を代入するだけの関数といったループ処理が存在しない関数である場合、複製しても大きな効果が得られないため、複製の対象外とする。
次に、外部関数のループ処理内に、関数呼び出しが存在することについて説明する。外部関数のループ処理に、関数呼び出しが存在し、かつ、外部関数およびループ処理内に存在する関数がインライン展開されなかった場合、SIMD(Single Instruction Multiple Data)化、自動並列化のループ最適化が適用されなくなるためである。以下の記載では、外部関数のループ処理に、関数呼び出しが存在するという条件を、条件1−1−1とする。
また、外部関数のループ処理内で、外部引数の仮引数が参照されており、さらに、参照される仮引数がポインタ型であることについて説明する。ループ処理内で参照される仮引数がポインタ型の場合、ポインタが指している記憶領域が他のポインタ型の変数と重なるか否かを判断すること、いわゆるalias解析が困難であるため、SIMD化、自動並列化等のループ最適化が適用されなくなるためである。ここで、外部関数を複製することにより、依存関係の有無がわかりやすくすることができる。以下の記載では、外部関数のループ処理内で、外部引数の仮引数が参照されており、さらに、参照されている仮引数がポインタ型であるという条件を、条件1−1−2−1とする。
本実施の形態では、条件1−1−1、または条件1−1−2−1のいずれかが成立する関数を複製するものとする。
図1を用いて、情報処理装置101の動作例について説明する。図1では、C言語で記載されたソースファイルを例に説明を行う。具体的には、図1では、ファイル群Aと、ファイル群Bとを用いて説明する。ここで、関数が複製される複製先は、ソースファイルを変換した中間言語をファイルとした中間言語データである。しかし、図1では、条件1−1−1、1−1−2−1が成立することを説明することを容易にするため、C言語で表現されたイメージのまま説明を行う。中間言語データに関数が複製される例としては、図11、図18で示す。
まず、ファイル群Aのコンパイルについて説明する。ファイル群Aは、複数のファイルとして、ソースファイルsrcA_a〜cを含む。そして、ソースファイルsrcA_a〜c内には、それぞれ、main関数、funcA関数、funcB関数が定義されている。そして、main関数は、funcA関数を呼び出す。funcA関数は、main関数が定義されているファイルsrcA_aとは異なる第2のファイルとなるファイルsrcA_bで定義されているため、外部関数となる。そして、funcA関数は、ループ処理を含む。さらに、funcA関数は、ループ処理内で、funcB関数を呼び出す。
ここで、ファイル群Aのうちの第1のファイルとしてファイルsrcA_aをコンパイルするとする。この際、図1の(A_1)で示すように、情報処理装置101は、ファイルsrcA_a内で定義された第1の関数が、ループ処理を含む外部関数となる第2の関数を呼び出すか否かを判定する。図1のファイル群Aの例では、情報処理装置101は、第1の関数となるmain関数が、第2の関数としてfuncA関数を呼び出すと判定する。
第1の関数が第2の関数を呼び出すと判定した場合、図1の(A_2)で示すように、情報処理装置101は、条件1−1−1、または、条件1−1−2−1のいずれかが成立するかを判定する。ここで、情報処理装置101は、条件1−1−1だけが成立するか否か判定してもよいし、条件1−1−2−1だけが成立するか否かを判定してもよいし、条件1−1−1が成立しない場合に条件1−1−2−1が成立するか否かを判定してもよい。また、情報処理装置101は、条件1−1−2−1が成立しない場合に条件1−1−1が成立するか否かを判定してもよいし、条件1−1−2−1が成立してもさらに条件1−1−1が成立するか否かを判定してもよい。
また、第1の関数、第2の関数を用いて条件1−1−1を表現すると、第2の関数に含まれるループ処理内に、複数のファイルののうちのいずれかのファイル内で定義された第3の関数の呼び出しが存在することとなる。ここで、第3の関数を定義するファイルは、第1の関数を定義するファイルでもよいし、第2の関数を定義するファイルでもよいし、第1の関数を定義するファイルおよび第2の関数を定義するファイルとは異なるファイルでもよい。また、第3の関数は、第1の関数や第2の関数とは異なる関数である。同様に、第1の関数、第2の関数を用いて条件1−1−2−1を表現すると、ループ処理内で第2の関数のポインタ型の仮引数が参照されることとなる。
図1のファイル群Aの例では、外部関数funcAは、ループ処理内にファイルsrcA_c内で定義された第3の関数として、funcB関数を呼び出すため、条件1−1−1が成立する。
条件1−1−1が成立したならば、図1の(A_3)で示すように、情報処理装置101は、ファイルsrcA_aに第2の関数としてfuncA関数と、第3の関数としてfuncB関数とを複製する。また、情報処理装置101は、ファイルsrcA_bにfuncB関数を複製してもよい。
funcA関数とfuncB関数との複製後、情報処理装置101は、main関数内に、funcA関数とfuncB関数とをインライン展開する。なお、上述したように、インライン展開によって命令数が増えると命令スケジューリングが行いにくくなるため、情報処理装置101は、main関数内に、funcA関数とfuncB関数とをインライン展開しない可能性もある。
次に、ファイル群Bのコンパイルについて説明する。ファイル群Bは、複数のファイルとして、ソースファイルsrcB_a、bを含む。そして、ソースファイルsrcB_a、b内には、それぞれ、main関数、funcC関数が定義されている。そして、main関数は、funcC関数を呼び出す。funcC関数は、main関数が定義されているファイルsrcB_aとは異なるファイルとなるファイルsrcB_bで定義されているため、外部関数となる。そして、funcC関数は、ループ処理を含む。さらに、funcC関数は、ループ処理内で、funcC関数のポインタ型の仮引数aとbとを参照している。
ここで、ファイル群Bのうちの第1のファイルとしてファイルsrcB_aをコンパイルするとする。この際、図1の(B_1)で示すように、情報処理装置101は、ファイルsrcB_a内で定義された第1の関数が、ループ処理を含む外部関数となる第2の関数を呼び出すか否かを判定する。図1のファイル群Bの例では、情報処理装置101は、第1の関数となるmain関数が、第2の関数としてfuncC関数を呼び出すと判定する。
第1の関数が第2の関数を呼び出すと判定した場合、図1の(B_2)で示すように、情報処理装置101は、条件1−1−1、または/および、条件1−1−2−1のいずれかが成立するかを判定する。図1のファイル群Bの例では、外部関数funcCは、ループ処理内で、外部関数funcCの仮引数a、bを参照しており、仮引数a、bはポインタ型であるため、条件1−1−2−1が成立する。
条件1−1−2−1が成立したならば、図1の(B_3)で示すように、情報処理装置101は、ファイルsrcB_aに第2の関数としてfuncC関数を複製する。funcC関数の複製後、情報処理装置101は、main関数内に、funcC関数をインライン展開する。なお、上述したように、インライン展開によって命令数が増えると命令スケジューリングが行いにくくなるため、情報処理装置101は、main関数内にfuncC関数をインライン展開しない可能性もある。
以上のように、情報処理装置101は、条件1−1−1、または/および、条件1−1−2−1を満たす外部関数を複製する。このように、情報処理装置101は、最適化が促進される適切な関数に限り複製することができる。従って、情報処理装置101は、翻訳時間の増加や実行可能ファイルのサイズの増加を抑えつつ、複製された関数がインライン展開された場合、ループ最適化が促進される可能性が高くなり、実行可能ファイルの実行性能も向上する可能性を向上させることができる。
また、情報処理装置101は、複製の条件を絞ることにより複製される関数を削減することが可能となるため、翻訳時間を抑制することが可能となる。また、情報処理装置101は、アセンブラ命令数の増大化も抑制することが可能となるため、オブジェクトコードのコード領域の増大を抑制することも可能となる。また、情報処理装置101は、実行性能の向上につながる関数だけに対して複製を実施するため、複製によって最適化が促進された場合、実行性能が向上する可能性を向上させることができる。また、情報処理装置101が一時的に作成されるファイルは中間言語データだけである。そして、中間言語データは中間言語が含まれるオブジェクトコードと比較するとサイズが小さいので、ディスクの使用量も小さくなる。
また、情報処理装置101は、中間言語データの出力、読込みを行うが、リンク時に手続き間最適化を実施しないため、翻訳時間の増加を抑制した上で最適化を促進することが可能となる。
また、図1では、プログラム言語の例としてC言語を用いて説明したが、コンパイル言語であり、インライン展開を行う言語であればどのようなものでもよい。例えば、本実施の形態は、Fortran、C++言語に対しても適用可能である。次に、情報処理装置101のハードウェア構成例について、図2を用いて説明する。
(情報処理装置101のハードウェア構成例)
図2は、情報処理装置101のハードウェア構成例を示す説明図である。図2において、情報処理装置101は、CPU(Central Processing Unit)201と、ROM(Read−Only Memory)202と、RAM(Random Access Memory)203と、を含む。また、情報処理装置101は、ディスクドライブ204およびディスク205と、通信インターフェース206と、を含む。また、CPU201〜ディスクドライブ204、通信インターフェース206はバス207によってそれぞれ接続される。
CPU201は、情報処理装置101の全体の制御を司る演算処理装置である。また、情報処理装置101は、並列処理を実行するために、複数のCPUを有してもよい。または、CPU201が、SIMDを処理する複数のコアを有してもよい。ROM202は、ブートプログラムなどのプログラムを記憶する不揮発性メモリである。RAM203は、CPU201のワークエリアとして使用される揮発性メモリである。
ディスクドライブ204は、CPU201の制御に従ってディスク205に対するデータのリードおよびライトを制御する制御装置である。ディスクドライブ204には、例えばディスクドライブ、光ディスクドライブ、ソリッドステートドライブなどを採用することができる。ディスク205は、ディスクドライブ204の制御で書き込まれたデータを記憶する不揮発性メモリである。例えばディスクドライブ204が磁気ディスクドライブである場合、ディスク205には、磁気ディスクを採用することができる。また、ディスクドライブ204が光ディスクドライブである場合、ディスク205には、光ディスクを採用することができる。また、ディスクドライブ204がソリッドステートドライブである場合、ディスク205には、半導体素子によって形成された半導体メモリ、いわゆる半導体ディスクを採用することができる。
通信インターフェース206は、ネットワークと内部のインターフェースを司り、他の装置からのデータの入出力を制御する制御装置である。具体的に、通信インターフェース206は、通信回線を通じてネットワークを介して情報処理装置101を利用する利用者端末等の他の装置に接続される。通信インターフェース206には、例えば、モデムやLAN(Local Area Network)アダプタなどを採用することができる。
また、情報処理装置101の管理者が、情報処理装置101を直接操作する場合、情報処理装置101は、ディスプレイ、キーボード、マウスといったハードウェアを有してもよい。
(情報処理装置101の機能構成例)
図3は、情報処理装置101の機能構成例を示す説明図である。情報処理装置101は、制御部300を有する。制御部300は、中間言語生成部301と、コールグラフ収集部302と、仮引数情報収集部303と、ループ処理解析部304と、手続き間最適化用情報収集部305と、手続き間最適化部306とを含む。さらに、制御部300は、最適化部307と、コード生成部308と、オブジェクトコード生成部309と、リンカ310とを含む。手続き間最適化部306は、判定部311と、複製部312とを含む。
制御部300は、記憶装置に記憶されたプログラムをCPU201が実行することにより、各部の機能を実現する。記憶装置とは、具体的には、例えば、図2に示したROM202、RAM203、ディスク205などである。また、各部の処理結果は、RAM203や、CPU201のレジスタ、CPU201のキャッシュメモリ等に格納される。
また、情報処理装置101は、ソースファイルsrcにアクセス可能である。ソースファイルsrcは、RAM203、ディスク205といった記憶装置に格納される。
中間言語生成部301は、ソースファイルsrcを解析後、コンパイラ特有の中間言語に変換する。そして、中間言語生成部301は、中間言語生成部301で得られる中間言語データintというファイルを出力する。例えば、中間言語生成部301は、RAM203上に中間言語データintを出力する。
次に、手続き間最適化を実施する場合、図3の破線内に含まれるコールグラフ収集部302〜ループ処理解析部304は、次に示す各処理を行う。一方で、手続き間最適化を実施しない場合、コールグラフ収集部302〜ループ処理解析部304は処理を行わず、最適化部307が処理を行う。また、手続き間最適化を実施するか否かの判断方法については、図6で説明する。
コールグラフ収集部302は、コールグラフの情報を収集する。ここで、コールグラフとは、関数の呼び出し関係を示す図である。仮引数情報収集部303は、関数を宣言または定義している文を解析し、仮引数の情報を収集する。ループ処理解析部304は、関数にループ処理があるか否か、仮引数がループ処理内で参照されているか否か、ループ処理内で呼び出されている関数の情報を収集する。手続き間最適化用情報収集部305は、コールグラフ収集部302〜ループ処理解析部304が収集した情報を、手続き間解析情報procに設定する。手続き間解析情報procの具体例については、図4で説明する。
手続き間最適化部306は、手続き間解析情報procに基づいて、関数複製を中間言語データintに対して実施する。手続き間最適化部306に含まれる判定部311と、複製部312との機能について説明する。
判定部311は、手続き間解析情報procを参照して、コンパイル対象となる複数の中間言語データintのうちのいずれかの中間言語データint内で定義された第1の関数が、ループ処理を含む外部関数となる第2の関数を呼び出すか判定する。
そして、第1の関数が第2の関数を呼び出すと判定した場合、判定部311は、条件1−1−1、または/および、条件1−1−2−1が成立するか否かを判定する。具体的には、条件1−1−1は、第2の関数に含まれるループ処理内に、第1の関数を定義する中間言語データintとは異なる中間言語データint内で定義された第3の関数が存在するという条件である。また、条件1−1−2−1は、第2の関数に含まれるループ処理内で、第2の関数のポインタ型の仮引数が参照されているという条件である。
複製部312は、条件1−1−1が成立すると判定したならば、第1の関数を定義する中間言語データintに、第2の関数および第3の関数を複製する。ここで、第3の関数が第1の関数を定義する中間言語データint内で既に定義されているならば、複製部312は、第1の関数を定義する中間言語データintに、第3の関数を複製しない。また、複製部312は、条件1−1−1が成立すると判定したならば、第2の関数を定義する中間言語データintに、第3の関数を複製してもよい。ここで、第3の関数が第2の関数を定義する中間言語データint内で既に定義されているならば、複製部312は、第2の関数を定義する中間言語データintに、第3の関数を複製しない。
また、判定部311は、条件1−1−2−1が成立しても、さらに条件1−1−1が成立するか否かを判定してもよい。これは、条件1−1−2−1が成立した外部関数のループ処理内に、関数呼び出しが存在する可能性があるためである。
また、複製部312は、条件1−1−2−1が成立すると判定したならば、第1の関数を定義する中間言語データintに、第2の関数を複製する。
また、複製部312は、main関数について複製の対象外とする。さらに、複製部312は、複製された関数を、複製先のファイル内でのみ参照可能とし、他のファイルからは参照不可能に設定する。具体的な複製例については、図11、図18で示す。
最適化部307は、手続き間最適化を実施しなかった場合はソースファイルsrcから得られた中間言語データintに対して最適化を実施し、手続き間最適化を実施した場合は関数複製が適用された中間言語データintに対して最適化を実施する。例えば、最適化部307は、最適化として、上述したインライン展開や、命令スケジューリングを行う。
コード生成部308は、各種の最適化が実施された命令列からアセンブリを生成する。オブジェクトコード生成部309は、コード生成部308で得られるアセンブリからオブジェクトコードを生成する。リンカ310は、オブジェクトコードから実行可能ファイルobjを生成する。
図4は、手続き間解析情報procの一例を示す説明図である。図4で示すように、手続き間解析情報procには、関数ごとの解析情報であり、具体的には、1つの関数に対して8つの解析情報が格納される。
1つ目の解析情報は、callerである。callerには、対象となる呼び出し元関数名が設定される。2つ目の解析情報は、has_dummy_ptrである。has_dummy_ptrには、仮引数にポインタが含まれる場合はtrue、含まれない場合はfalseが設定される。3つ目の解析情報は、has_loopである。has_loopには、呼び出し元関数に、ループ処理が含まれる場合はtrueが設定され、含まれない場合はfalseが設定される。4つ目の解析情報は、is_referred_in_loopである。is_referred_in_loopには、呼び出し元関数の仮引数がループ処理内で参照されている場合はtrueが設定され、参照されていない場合はfalseが設定される。
5つ目の解析情報は、callee_numである。callee_numは、呼び出し元関数内で呼び出している関数の数が設定される。6つ目の解析情報は、callee_listである。callee_listには、呼び出し元関数内で呼び出している関数名のリストが設定される。7つ目の解析情報は、callee_num_in_loopである。callee_num_in_loopには、呼び出し元関数内のループ処理内で呼び出されている関数の数が設定される。8つ目の解析情報は、callee_list_in_loopである。callee_list_in_loopは、ループ処理内で呼び出されている関数名のリストが設定される。
次に、2つのサンプルとなるソースファイル群srcA、Bを用いて、情報処理装置101が中間言語データを生成する手順について説明する。実施例1として、ソースファイル群srcAについて図5〜図11を用いて説明し、実施例2として、ソースファイル群srcBについて図12〜図18を用いて説明する。
(実施例1)
図5は、ソースファイル群srcAの一例を示す説明図である。図5に示すように、ソースファイル群srcAには、ソースファイルsrcA_a〜fが含まれる。ソースファイルsrcA_a〜fには、それぞれ、main関数、funcA関数、funcB関数、funcC関数、funcD関数、funcE関数が定義されている。
main関数は、外部関数として、funcA関数、funcB関数、funcE関数を呼び出している。funcA関数は、ループ処理を含み、そのループ処理内でfuncC関数を呼び出している。funcB関数は、ループ処理を含み、そのループ処理内でfuncD関数を呼び出している。funcC関数は、仮引数aに仮引数bを加えた値を返す関数である。funcD関数は、仮引数aから仮引数bを減じた値を返す関数である。funcE関数は、仮引数aと仮引数bとの値を表示する関数である。従って、main関数内で呼び出されるfuncE関数は、結果を表示する関数となる。
図6は、中間言語データ群intAの一例を示す説明図である。情報処理装置101は、ソースファイルsrcA_a〜eを中間言語データに変換する。図6に示す中間言語データ群intAに含まれる中間言語データintA_a〜fは、それぞれ、ソースファイルsrcA_a〜fを中間言語データに変換したものである。なお、実際の中間言語データはバイナリデータとして扱うが、以下では、説明の簡略化のため、バイナリデータを可読性のある形に変換した状態で示す。
次に、情報処理装置101は、手続き間最適化を実施するか否かを判断する。例えば、情報処理装置101は、コンパイル時のコンパイルオプションによって、手続き間最適化を実施するか否かを判断する。例えば、ソースファイルa.c、b.c、c.cをコンパイルする際に、以下のようなコマンドが実行された場合、情報処理装置101は、手続き間最適化を実施すると判断する。
$ drv a.c b.c c.c −o 実行可能ファイル −IPO
ここで、「drv」は、コンパイラドライバである。そして、「−IPO」が、手続き間最適化を実施するというコンパイルオプションである。
手続き間最適化を実施しないと判断した場合、情報処理装置101は、中間言語データ群intAに対しコンパイラ最適化を適用し、実行可能ファイルobjを作成する。一方、手続き間最適化を実施する場合、情報処理装置101は、中間言語データ群intAに対しコールグラフ収集処理を実行する。
図7は、コールグラフ収集後の手続き間解析情報procAの一例を示す説明図である。図7に示す手続き間解析情報procAは、コールグラフ収集後の手続き間解析情報procの一例である。手続き間解析情報procAに含まれる手続き間解析情報procA_a〜fは、それぞれ、中間言語データintA_a〜fの手続き間解析情報である。
情報処理装置101は、手続き間解析情報procの各解析情報のうち、呼び出し元関数と呼び出し先関数との関係性についてのみを設定する。従って、情報処理装置101は、has_dummy_ptr、has_loop、is_referred_in_loopについて、初期値falseを設定する。また、呼び出し関数がない場合、情報処理装置101は、calle_numに0を設定し、callee_listにNULLを設定する。そして、情報処理装置101は、呼び出し関数が重複する場合、同一とみなすこととする。なお、図7において、太字の箇所は、初期値から変更した箇所であることを示す。図7に示す手続き間解析情報procAから、図8に示すコールグラフ情報callAが得られる。
図8は、コールグラフ情報callAの一例を示す説明図である。図8に示すコールグラフ情報callAが示すように、main関数は、funcA関数と、funcB関数と、funcE関数とを呼び出すことがわかる。同様に、コールグラフ情報callAが示すように、funcA関数は、funcC関数を呼び出し、funcB関数は、funcD関数を呼び出し、funcE関数は、printf関数を呼び出すことがわかる。
なお、コールグラフ情報callにおいて、再帰呼び出しが含まれる場合には、情報処理装置101は、再帰呼び出しを示す記号を付与する。また、関数Aが関数Bを呼び出し、関数Aが関数Bを呼び出すといったように、相互再帰する場合には、情報処理装置101は、関数Aと関数Bが相互に呼び出すことを示す記号を付与する。また、関数Aが関数Bを呼び出し、関数Bが関数Cを呼び出し、関数Cが関数Aを呼び出すようなことも考えられる。この場合、情報処理装置101は、関数Aと関数Bとの間、関数Bと関数Cとの間は図8で示すように表示した上で、関数Cから関数Aまでの矢印を描画する。次に、情報処理装置101は、仮引数情報を収集する。
図9は、仮引数情報収集後の手続き間解析情報procAの一例を示す説明図である。図9に示す手続き間解析情報procAは、仮引数情報収集後の手続き間解析情報procの一例である。
main関数、funcC関数、funcD関数、funcE関数の仮引数にはポインタが含まれないため、それぞれの関数に対応する手続き間解析情報procのhas_dummy_ptrはfalseから変化しない。一方、funcA関数、funcB関数は仮引数にポインタが含まれるため、情報処理装置101は、procA_b、cのhas_dummy_ptrをtrueに設定する。以下の図において、太字の箇所は、前の図から変更した箇所であることを示す。次に、情報処理装置101は、ループ処理解析を行う。
図10は、ループ処理解析後の手続き間解析情報procAの一例を示す説明図である。図10に示す手続き間解析情報procAは、ループ処理解析後の手続き間解析情報procの一例である。
main関数、funcC関数、funcD関数はループ処理を含まず、ループ処理内で仮引数を参照しないため、それぞれの関数に対応する手続き間解析情報procのhas_loop、is_referred_in_loopはfalseから変化しない。一方、funcA、funcBはループ処理を含み、ループ処理内で仮引数を参照しており、ループ処理内で、それぞれ、funcC関数、funcD関数を呼び出している。従って、情報処理装置101は、手続き間解析情報procA_b、cのhas_loop、is_referred_in_loopをtrueに設定する。さらに、情報処理装置101は、手続き間解析情報procA_b、cのcallee_num_in_loopを1に設定する。そして、情報処理装置101は、手続き間解析情報procA_bのcallee_list_in_loopを{funcC}に設定し、手続き間解析情報procA_cのcallee_list_in_loopを{funcD}に設定する。
次に、情報処理装置101は、図10に示す手続き間解析情報procAを用いて、手続き間最適化処理を実行する。手続き間最適化処理の具体例については、図19〜図21で示す。
図11は、関数複製後の中間言語データ群intAの一例を示す説明図である。図11で示す中間言語データ群intAは、手続き間最適化処理により、関数を複製した後の中間言語データ群intの一例である。例えば、funcA関数、funcB関数は仮引数にポインタが含まれ、かつ、仮引数はループ処理内で参照されているため、条件1−1−2−1を満たす。そのため、情報処理装置101は、funcA関数、funcB関数を、中間言語データintA_aに複製する。一方、funcE関数は条件1−1−2−1を満たさないため、関数複製の対象外である。
ここで、複製する際には、複製された関数は、複製先のファイル内でのみ参照可能とし、他のファイルからは参照不可能とする。この2つの処理は、関数名が競合しないようにするための処理である。通常、複製先のファイル内でのみ参照可能とすることと、他のファイルから参照不可能とすることのいずれか一方を行えばよいが、コンパイラによっては、両方行ったほうが好ましい。図11の例では、「static」により、複製先のファイル内でのみ参照可能とすることを表す。また、複製された関数は、複製元の関数とは異なる名称に変更する。図11の例では、情報処理装置101は、複製元の関数に「dup_」という語を付与して、複製された関数の関数名を、複製元の関数とは異なる名称に変更する。または、情報処理装置101は、複製元の関数にハッシュ値を付与して、複製された関数の関数名を、複製元の関数とは異なる名称に変更してもよい。
そして、funcA関数、funcB関数はループ処理内で関数funcC関数、funcD関数を呼び出しているため、条件1−1−1を満たす。そのため、情報処理装置101は、funcC関数を中間言語データintA_a、bに複製し、funcD関数を中間言語データintA_a、cに複製する。また、main関数自体は複製の対象外である。以上の処理により、情報処理装置101は、図11で示す中間言語データ群intAが得られる。
(実施例2)
図12は、ソースファイル群srcBの一例を示す説明図である。図12に示すように、ソースファイル群srcBには、ソースファイルsrcB_a〜dが含まれる。ソースファイルsrcB_a〜dには、それぞれ、main関数、funcA関数、funcB関数、funcC関数が定義されている。
main関数は、外部関数として、funcA関数、funcC関数を呼び出している。funcA関数は、ループ処理を含み、そのループ処理内でfuncB関数を呼び出している。funcB関数は、仮引数aに仮引数bを加えた値を返す関数である。funcC関数は、仮引数sumの値を表示する関数である。従って、main関数内で呼び出されるfuncC関数は、結果を表示する関数となる。
図13は、中間言語データ群intBの一例を示す説明図である。情報処理装置101は、ソースファイルsrcB_a〜dを中間言語データに変換する。図13に示す中間言語データ群intBに含まれる中間言語データintB_a〜dは、それぞれ、ソースファイルsrcB_a〜dを中間言語データに変換したものである。
次に、情報処理装置101は、実施例1と同様に、手続き間最適化を実施するか否かを判断する。手続き間最適化を実施しないと判断した場合、情報処理装置101は、中間言語データ群intBに対しコンパイラ最適化を適用し、実行可能ファイルを作成する。一方、手続き間最適化を実施する場合、情報処理装置101は、中間言語データ群intBに対しコールグラフ収集処理を実行する。
図14は、コールグラフ収集後の手続き間解析情報procBの一例を示す説明図である。図14に示す手続き間解析情報procBは、コールグラフ収集後の手続き間解析情報procの一例である。手続き間解析情報procBに含まれる手続き間解析情報procB_a〜dは、それぞれ、中間言語データintB_a〜dの手続き間解析情報である。
図14において、太字の箇所は、初期値から変更した箇所であることを示す。図14に示す手続き間解析情報procBから、図15に示すコールグラフ情報callBが得られる。
図15は、コールグラフ情報callBの一例を示す説明図である。図15に示すコールグラフ情報callBが示すように、main関数は、funcA関数、funcB関数を呼び出すことがわかる。同様に、コールグラフ情報callBが示すように、funcA関数は、funcB関数を呼び出し、funcC関数は、printf関数を呼び出すことがわかる。次に、情報処理装置101は、仮引数情報を収集する。
図16は、仮引数情報収集後の手続き間解析情報procBの一例を示す説明図である。図16に示す手続き間解析情報procBは、仮引数情報収集後の手続き間解析情報procの一例である。
main関数、funcA関数、funcB関数、funcC関数の仮引数にはポインタが含まれないため、それぞれの関数に対応する手続き間解析情報procのhas_dummy_ptrはfalseから変化しない。従って、図16では、図14で示した状態から値が変化しない。次に、情報処理装置101は、ループ処理解析を行う。
図17は、ループ処理解析後の手続き間解析情報procBの一例を示す説明図である。図17に示す手続き間解析情報procBは、ループ処理解析後の手続き間解析情報procの一例である。
main関数、funcB関数、funcC関数はループ処理を含まず、ループ処理内で仮引数を参照しないため、それぞれの関数に対応する手続き間解析情報procのhas_loop、is_referred_in_loopはfalseから変化しない。一方、funcAはループ処理を含み、ループ処理内でfuncB関数を呼び出している。従って、情報処理装置101は、手続き間解析情報procB_bのhas_loopをtrueに設定する。さらに、情報処理装置101は、手続き間解析情報procB_bのcallee_num_in_loopを1に設定する。そして、情報処理装置101は、手続き間解析情報procB_bのcallee_list_in_loopを{funcB}に設定する。
次に、情報処理装置101は、図17に示す手続き間解析情報procBを用いて、手続き間最適化処理を実行する。手続き間最適化処理の具体例については、図19〜図21で示す。
図18は、関数複製後の中間言語データ群intBの一例を示す説明図である。図18で示す中間言語データ群intBは、手続き間最適化処理により、関数を複製した後の中間言語データ群intの一例である。
funcA関数はポインタ型の仮引数を持たないが、ループ処理を含み、そのループ処理内で関数を呼び出しているため、条件1−1−1を満たす。そのため、情報処理装置101は、funcA関数を中間言語データintB_aに複製する。そして、情報処理装置101は、funcAのループ処理で呼び出しているfuncBを、中間言語データintB_a、bに複製する。
図19は、手続き間最適化処理手順の一例を示すフローチャート(その1)である。また、図20は、手続き間最適化処理手順の一例を示すフローチャート(その2)である。また、図21は、手続き間最適化処理手順の一例を示すフローチャート(その3)である。
情報処理装置101は、1を変数iに代入する(ステップS1901)。また、情報処理装置101は、手続き間解析情報procの数を変数lastに代入する(ステップS1902)。そして、情報処理装置101は、i番目の手続き間解析情報procを変数callerに代入する(ステップS1903)。
次に、情報処理装置101は、iがlastより小さいか否かを判断する(ステップS1904)。iがlast以上である場合(ステップS1904:No)、情報処理装置101は、手続き間最適化処理を終了する。一方、iがlastより小さい場合(ステップS1904:Yes)、情報処理装置101は、1を変数jに代入する(ステップS1905)。そして、情報処理装置101は、jがcallee_num以下であるか否かを判断する(ステップS1906)。ここで、callee_numは、callerに登録された手続き間解析情報procのcallee_numである。
jがcallee_num以下である場合(ステップS1906:Yes)、情報処理装置101は、図20で示すように、callerに登録されたcallee_listのj番目の関数を、変数calleeに代入する(ステップS2001)。次に、情報処理装置101は、calleeに対応する手続き間解析情報procを、変数infoに代入する(ステップS2002)。そして、情報処理装置101は、infoに登録されたhas_loopの値を、変数has_loopに代入する(ステップS2003)。また、情報処理装置101は、infoに登録されたhas_dummy_ptrの値を、変数has_dmyに代入する(ステップS2004)。また、情報処理装置101は、infoに登録されたis_referred_in_loopの値を、変数is_refに代入する(ステップS2005)。
次に、情報処理装置101は、has_loopの値がtrueであるか否かを判断する(ステップS2006)。has_loopの値がtrueである場合(ステップS2006:Yes)、情報処理装置101は、続けて、has_dmyの値がtrueであるか否かを判断する(ステップS2007)。has_dmyの値がtrueである場合(ステップS2007:Yes)、情報処理装置101は、続けて、is_refの値がtrueであるか否かを判断する(ステップS2008)。
has_dmyの値がtrueでない場合(ステップS2007:No)、または、is_refの値がtrueである場合(ステップS2008:Yes)、情報処理装置101は、calleeを呼び出し元に複製する(ステップS2009)。ここで、ステップS2008:Yesとなる場合が、条件1−1−2−1が成立したときを示す。
そして、情報処理装置101は、図21で示すように、1を変数kに代入する(ステップS2101)。また、情報処理装置101は、infoに登録されたcallee_num_in_loopを、変数numに代入する(ステップS2102)。また、情報処理装置101は、infoに登録されたcallee_list_in_loopを、配列変数listに代入する(ステップS2103)。
次に、情報処理装置101は、kがnumより小さいか否かを判断する(ステップS2104)。kがnumより小さい場合(ステップS2104:Yes)、情報処理装置101は、list[k]に対応する関数をcalleeとcalleeの呼び出し元に複製する(ステップS2105)。ここで、ステップS2104:Yesとなる場合が、条件1−1−1が成立したときを示す。そして、情報処理装置101は、kをインクリメントし(ステップS2106)、ステップS2104の処理に移行する。
一方、kがnum以上である場合(ステップS2104:No)、図19に戻り、情報処理装置101は、jをインクリメントし(ステップS1907)、ステップS1906の処理に移行する。
また、図20に戻り、has_loopの値がfalseである場合(ステップS2006:No)、または、is_refの値がfalseである場合(ステップS2008:No)、情報処理装置101は、ステップS1907の処理に移行する。
また、図19に戻り、jがcallee_num以下でない場合(ステップS1906:No)、情報処理装置101は、iをインクリメントし(ステップS1908)、ステップS1904の処理に移行する。
以上説明したように、情報処理装置101は、条件1−1−1が成立すれば、外部関数のループ処理内に存在する第3の関数および外部関数を複製し、または/および、条件1−1−2−1が成立した際に外部関数を複製する。これにより、情報処理装置101は、複製された関数がインライン展開された場合、ループ最適化が促進される可能性が高くなり、また同時に、実行可能ファイルの実行性能も向上する可能性を向上させることができる。
また、情報処理装置101は、外部関数の呼び出し元の関数と、複製した関数とに基づいて、インライン展開を行ってもよい。このように、実行性能の向上につながる可能性がある外部関数をインライン展開することにより、実行可能ファイルの実行性能を向上することができる。
また、情報処理装置101は、条件1−1−1が成立した際に、外部関数のループ処理内に存在する第3の関数を、外部関数を定義するファイル内に複製してもよい。これにより、情報処理装置101は、第3の関数がインライン展開されれば、実行可能ファイルの実行性能を向上することができる。
なお、本実施の形態で説明したコンパイル管理方法は、予め用意されたプログラムをパーソナル・コンピュータやワークステーション等のコンピュータで実行することにより実現することができる。本コンパイルプログラムは、ハードディスク、フレキシブルディスク、CD−ROM(Compact Disc−Read Only Memory)、DVD(Digital Versatile Disk)等のコンピュータで読み取り可能な記録媒体に記録され、コンピュータによって記録媒体から読み出されることによって実行される。また本コンパイルプログラムは、インターネット等のネットワークを介して配布してもよい。
101 情報処理装置
301 中間言語生成部
302 コールグラフ収集部
303 仮引数情報収集部
304 ループ処理解析部
305 手続き間最適化用情報収集部
306 手続き間最適化部
307 最適化部
308 コード生成部
309 オブジェクトコード生成部
310 リンカ
311 判定部
312 複製部

Claims (5)

  1. 複数のファイルのうちの第1のファイルをコンパイルする際に、前記第1のファイル内で定義された第1の関数が、前記複数のファイルのうちの前記第1のファイルとは異なる第2のファイル内で定義された、ループ処理を含む第2の関数を呼び出すか否かを判定し、
    前記第1の関数が前記第2の関数を呼び出すと判定した場合、前記ループ処理内に前記複数のファイルのうちのいずれかのファイル内で定義された第3の関数の呼び出しが存在すれば前記第1のファイル内に前記第2の関数および前記第3の関数を複製し、または/および、前記第1の関数が前記第2の関数を呼び出すと判定した場合、前記ループ処理内で前記第2の関数のポインタ型の仮引数が参照されるならば前記第1のファイル内に前記第2の関数を複製する、
    制御部を有することを特徴とする情報処理装置。
  2. 前記制御部は、
    複製した前記関数と前記第1の関数とに基づいて、複製した前記関数のインライン展開を行う、
    ことを特徴とする請求項1に記載の情報処理装置。
  3. 前記制御部は、
    前記第1の関数が前記第2の関数を呼び出すと判定した場合、前記ループ処理内に前記第3の関数の呼び出しが存在すれば、さらに、前記第2のファイル内に前記第3の関数を複製する、
    ことを特徴とする請求項1または2に記載の情報処理装置。
  4. コンピュータが、
    複数のファイルのうちの第1のファイルをコンパイルする際に、前記第1のファイル内で定義された第1の関数が、前記複数のファイルのうちの前記第1のファイルとは異なる第2のファイル内で定義された、ループ処理を含む第2の関数を呼び出すか否かを判定し、
    前記第1の関数が前記第2の関数を呼び出すと判定した場合、前記ループ処理内に前記複数のファイルのうちのいずれかのファイル内で定義された第3の関数の呼び出しが存在すれば前記第1のファイル内に前記第2の関数および前記第3の関数を複製し、または/および、前記第1の関数が前記第2の関数を呼び出すと判定した場合、前記ループ処理内で前記第2の関数のポインタ型の仮引数が参照されるならば前記第1のファイル内に前記第2の関数を複製する、
    処理を実行することを特徴とするコンパイル管理方法。
  5. コンピュータに、
    複数のファイルのうちの第1のファイルをコンパイルする際に、前記第1のファイル内で定義された第1の関数が、前記複数のファイルのうちの前記第1のファイルとは異なる第2のファイル内で定義された、ループ処理を含む第2の関数を呼び出すか否かを判定し、
    前記第1の関数が前記第2の関数を呼び出すと判定した場合、前記ループ処理内に前記複数のファイルのうちのいずれかのファイル内で定義された第3の関数の呼び出しが存在すれば前記第1のファイル内に前記第2の関数および前記第3の関数を複製し、または/および、前記第1の関数が前記第2の関数を呼び出すと判定した場合、前記ループ処理内で前記第2の関数のポインタ型の仮引数が参照されるならば前記第1のファイル内に前記第2の関数を複製する、
    処理を実行させることを特徴とするコンパイルプログラム。
JP2016104685A 2016-05-25 2016-05-25 情報処理装置、コンパイル管理方法、およびコンパイルプログラム Pending JP2017211842A (ja)

Priority Applications (2)

Application Number Priority Date Filing Date Title
JP2016104685A JP2017211842A (ja) 2016-05-25 2016-05-25 情報処理装置、コンパイル管理方法、およびコンパイルプログラム
US15/480,862 US20170344351A1 (en) 2016-05-25 2017-04-06 Information processing apparatus, compiling management method, and recording medium

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP2016104685A JP2017211842A (ja) 2016-05-25 2016-05-25 情報処理装置、コンパイル管理方法、およびコンパイルプログラム

Publications (1)

Publication Number Publication Date
JP2017211842A true JP2017211842A (ja) 2017-11-30

Family

ID=60417877

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2016104685A Pending JP2017211842A (ja) 2016-05-25 2016-05-25 情報処理装置、コンパイル管理方法、およびコンパイルプログラム

Country Status (2)

Country Link
US (1) US20170344351A1 (ja)
JP (1) JP2017211842A (ja)

Families Citing this family (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US11204746B2 (en) * 2020-01-28 2021-12-21 Oracle International Corporation Encoding dependencies in call graphs
US20240045662A1 (en) * 2022-08-02 2024-02-08 Nvidia Corporation Software code verification using call graphs for autonomous systems and applications

Family Cites Families (7)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP3356742B2 (ja) * 1999-11-17 2002-12-16 インターナショナル・ビジネス・マシーンズ・コーポレーション プログラム実行方法
JP5039948B2 (ja) * 2007-10-30 2012-10-03 インターナショナル・ビジネス・マシーンズ・コーポレーション プログラムを最適化するコンパイラ
US8495603B2 (en) * 2008-08-11 2013-07-23 International Business Machines Corporation Generating an executable version of an application using a distributed compiler operating on a plurality of compute nodes
JP5583514B2 (ja) * 2010-08-11 2014-09-03 インターナショナル・ビジネス・マシーンズ・コーポレーション バイナリコードを最適化するコンパイル方法、及びそのコンパイラシステム、並びにコンピュータ・プログラム
EP2831797B1 (en) * 2012-03-30 2018-05-02 Irdeto B.V. Securing accessible systems using dynamic data mangling
US9182957B2 (en) * 2012-07-10 2015-11-10 Loring Craymer Method and system for automated improvement of parallelism in program compilation
US9495141B1 (en) * 2015-12-01 2016-11-15 International Business Machines Corporation Expanding inline function calls in nested inlining scenarios

Also Published As

Publication number Publication date
US20170344351A1 (en) 2017-11-30

Similar Documents

Publication Publication Date Title
US11567759B1 (en) Generating source code from binary files
US8726255B2 (en) Recompiling with generic to specific replacement
JP6141365B2 (ja) 逐次コンピュータプログラムコードを並列処理する方法及びシステム
JP5583514B2 (ja) バイナリコードを最適化するコンパイル方法、及びそのコンパイラシステム、並びにコンピュータ・プログラム
US9152389B2 (en) Trace generating unit, system, and program of the same
US8843920B2 (en) Systems and methods for deferring software implementation decisions until load time
US20030196196A1 (en) Program interpreter
JP2010134614A (ja) 並列化処理方法、システム、及びプログラム
US20190079805A1 (en) Execution node selection method and information processing apparatus
JP2011096107A (ja) 並列化方法、システム、及びプログラム
Fonseca et al. Automatic parallelization: Executing sequential programs on a task-based parallel runtime
US9396095B2 (en) Software verification
Lee et al. OpenMPC: extended OpenMP for efficient programming and tuning on GPUs
JP5479942B2 (ja) 並列化方法、システム、及びプログラム
JP6651977B2 (ja) 情報処理装置、コンパイル方法、およびコンパイルプログラム
Khatchadourian et al. [Engineering Paper] A Tool for Optimizing Java 8 Stream Software via Automated Refactoring
Putta et al. Parallel replication-based points-to analysis
Su et al. An efficient GPU implementation of inclusion-based pointer analysis
JP2017211842A (ja) 情報処理装置、コンパイル管理方法、およびコンパイルプログラム
JP2008276735A (ja) プログラムコード変換装置及びプログラムコード変換方法
Welton et al. Exposing hidden performance opportunities in high performance GPU applications
Gregório et al. E-APK: Energy pattern detection in decompiled android applications
Besnard et al. A framework for automatic and parameterizable memoization
Norrish et al. An approach for proving the correctness of inspector/executor transformations
JP2009258796A (ja) プログラム開発装置及びプログラム開発方法