JP2008071065A - インライン展開を行うコンパイル装置、方法、プログラム、記憶媒体 - Google Patents
インライン展開を行うコンパイル装置、方法、プログラム、記憶媒体 Download PDFInfo
- Publication number
- JP2008071065A JP2008071065A JP2006248372A JP2006248372A JP2008071065A JP 2008071065 A JP2008071065 A JP 2008071065A JP 2006248372 A JP2006248372 A JP 2006248372A JP 2006248372 A JP2006248372 A JP 2006248372A JP 2008071065 A JP2008071065 A JP 2008071065A
- Authority
- JP
- Japan
- Prior art keywords
- argument
- array
- array variable
- dimension
- information
- 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
Links
Images
Landscapes
- Devices For Executing Special Programs (AREA)
Abstract
【課題】インライン展開を行うコンパイラにおいて、実引数と仮引数が共に配列で、かつ、配列の次元が互いに異なる場合に、コンパイラにより適用される最適化処理を受けることができ、オブジェクトプログラムの実行性能を高めることができるインライン展開を実施する。
【解決手段】インライン展開処理において、呼び出し先関数内で参照されている仮引数情報と、呼び出し元の実引数情報とを比較し、仮引数の配列次元数が実引数の次元数以下であり、かつ添字が実引数の添字範囲と一致し、かつ実引数で与えた添字が添字の下限値である場合に、呼び出し先関数内で参照されている仮引数名を、呼び出し元の実引数名を使った参照へと置き換える処理を行う。インライン展開時に置き換えを実施することで、実行時までメモリアドレスの参照関係が確定しなくなる要素を省き、コンパイラの最適化処理を受けやすくする。
【選択図】 図5
【解決手段】インライン展開処理において、呼び出し先関数内で参照されている仮引数情報と、呼び出し元の実引数情報とを比較し、仮引数の配列次元数が実引数の次元数以下であり、かつ添字が実引数の添字範囲と一致し、かつ実引数で与えた添字が添字の下限値である場合に、呼び出し先関数内で参照されている仮引数名を、呼び出し元の実引数名を使った参照へと置き換える処理を行う。インライン展開時に置き換えを実施することで、実行時までメモリアドレスの参照関係が確定しなくなる要素を省き、コンパイラの最適化処理を受けやすくする。
【選択図】 図5
Description
本発明は、情報処理装置の利用技術において、ソースプログラムを実行可能形式プログラムにコンパイルする方法であって、該実行可能形式プログラムの実行時間と使用メモリを抑えるコンパイル装置、方法、プログラム、記憶媒体に関する。
従来より、情報処理装置の利用技術において、ソースプログラムを実行可能形式プログラムにコンパイルする際に、コンパイルされた結果作成される実行可能形式プログラムの実行時間と使用メモリを抑えるコンパイル方法として、コンパイル処理の1ステップにおいて、呼び出し先の関数をインライン展開する技術がある。
インライン展開とは、コンパイルの直前またはコンパイル実施時に、コンパイラが、実行対象のプログラムのソースプログラムを読み込み、ソースプログラムのうち、関数を呼び出している箇所(呼び出し元)に、関数を呼び出すコードの代わりに、呼び出された関数(呼び出し先関数)のコードを展開して中間的なコードを作成するという最適化方法である。
ここで生成された中間的なコードを使用することで、コンパイラは実行形式プログラムを生成することができる。技術者がプログラムを作成する際には可読性・保守性を高められるようにプログラムを記述し、これを情報処理装置で実行する際には一度実行速度を重視した中間的なソースコードを生成しこれをコンパイルすることで、可読性・保守性を高め、かつ実行性能を確保することが可能となる。
このインライン展開の技術的な原理を以下に説明する。
通常、ある情報処理装置にて実行対象のプログラムを実行させ、その処理ステップの中で関数呼出しを実行する場合には、Callee−saveレジスタ(呼び出し先で退避・回復の必要なレジスタ)の退避・回復や、スタックフレームの確保・開放などのメモリ領域の利用に関する制御処理を情報処理装置が行う。
例えば、図7は実行対象のソースプログラム41の一例である。なお、図の左端に記述してある“数字:”は、図の説明を容易にするために記述してあるもので、実際のソースプログラム中ではその記述はない。このプログラムは、21行目から27行目までにmain関数があり、そのmain関数から、関数func1(1行目から9行目)と関数func2(11行目から19行目)を呼び出す構造になっている。情報処理装置は、24行目でfunc1の呼び出しを実施すると、3行目の文を実行する前に、関数内で参照されているCallee−saveレジスタの退避とスタックフレームの確保を行う。また、関数内の実行が終了し呼び出し元へ制御を戻す文(8行目)を実行する前には、Callee−saveレジスタの回復とスタックフレームの開放を行う。
この関数呼び出し時に必要なCallee−saveレジスタの退避・回復やスタックフレームの確保・開放などが、関数呼び出し時に必要となり、オーバーヘッド負荷となる。この関数呼び出し部分をなくすために、コンパイルの前に呼び出される関数を呼び出し元にあらかじめ展開することで、関数呼び出し部分をなくし、上記オーバーヘッド負荷を最小化する、というのがインライン展開の原理である。
本願に先立つ技術として、特許文献1に記載されているインライン展開方法がある。
この特許文献1に記載されているインライン展開方法は、上記インライン展開をさらに進め、呼び出し元のプログラムから呼び出し先のプログラムへ引き渡す引数が配列であって、かつこの配列の次元が互いに相違する場合の効率的なインライン展開の方法である。
ここで、引数の配列の次元が互いに相違する場合とは、図7のような例である。
図7を見ると、呼び出し元の関数mainでは、配列aが3次元配列として宣言されている(図7の22行目)のに対し、呼び出し先の関数func1やfunc2では、配列arg1やarg2が2次元配列として宣言されている(それぞれ図7の2行目と12行目)。このように、図7に示されたプログラムは、実行対象のプログラムから関数func1やfunc2を呼び出すときの引数(これを実引数と呼ぶ)が3次元配列であり、呼び出された先で参照する引数(これを仮引数と呼ぶ)が2次元配列であり、実引数と仮引数の次元数が互いに相違するといえる。
特許文献1に記載された発明では、上記実引数と仮引数の次元数の相違を以下の方法で吸収している。
インライン展開を実施する手段は、実行対象のプログラムのコンパイルの1ステップにおいて、実行対象のプログラムのソースプログラムを検索し、関数を呼び出している命令行を対象として、実引数が記憶されているメモリ上のアドレスを求め、記憶装置に記憶する。その後、インライン展開を実施する手段は、上記で求めた実引数が記憶されているメモリ上のアドレスを基底とする配列を生成する命令コードを作成し、呼び出し先関数のソースコードから仮引数を参照する命令行を抽出し、前記配列を生成する命令コードに置き換える。
この引数の次元数の相違を吸収するインライン展開方法を適用すると、図7の24行目のfunc1を呼び出す箇所は、図8の6行目から11行目に置き換えられる。この展開方法を具体的に説明する。なお、図8に記載しているソースイメージは、当説明の便宜を図るために表したものであり、実際に該ソースイメージそのものが中間ソースプログラムとして出力されるわけではない。
まず、呼び出し元の命令行では、関数func1呼び出し時の実引数がa(1,1,k)なので、インライン展開を実施する手段は、この実引数が記憶されているメモリアドレスと同じアドレスを基底とする新しい配列ptr_arg1を確保するための宣言文を挿入する(図8の3行目)。なお、インライン展開を実施する手段は、新しい配列ptr_arg1の次元数を、仮引数の次元数と同じ2次元で展開し、かつ、各次元の宣言範囲も同じ下限値1、上限値5となるように展開している。
続いて、インライン展開を実施する手段は、実引数が記憶されたメモリアドレスを新しい配列ptr_arg1の基底とするために、アドレスの代入を行う文を挿入する(図8の6行目)。ここで、「ptr_arg1=&(a(1,1,k))」という行は、配列要素a(1,1,k)のアドレスを、ptr_arg1の基底アドレスと設定するための命令コードである。即ち、この命令コードが実行されると、a(1,1,k)のアドレスとptr_arg1(1,1)の指すメモリアドレスを一致させることができる。
最後に、インライン展開を実施する手段は、関数func1内の仮引数arg1による参照行(図7の5行目)を、新しい配列ptr_arg1による参照行に置き換える(図8の9行目)。
同様に、図7の25行目でfunc2を呼び出す箇所のインライン展開後のコードは、図8の12行目から17行目である。関数func2が実行対象のプログラムへインライン展開された後には、新しい配列としてptr_arg2が宣言され(図8の4行目)、関数func2内の仮引数arg2による参照行(図7の15行目)は、新しい配列ptr_arg2による参照行に置き換えられる(図8の15行目)。
以上が、従来技術によるインライン展開方法である。
従来技術によるインライン展開では、コンパイラは、インライン展開に際して、呼び出される関数を呼び出す側にインライン展開すると共に、呼び出される関数側で使用している仮引数を利用するために、実引数のメモリアドレスを基底とする新しい配列を生成し、この配列にメモリアドレスを代入する処理を実施していた。具体的には、コンパイラは、実引数のメモリアドレスを基底とする新しい配列を生成するための命令コードと、この配列にメモリアドレスを代入する命令コードと、を生成して、中間コードにこれらのコードを挿入することにより、インライン展開時の変数参照を行っていた。
この弊害として、この方法でインライン展開を行うと、コンパイラがその後のステップとして実施する各種最適化処理(ループ融合、ループ不変式の移動、ループ展開など)の適用を受けられなくなり、結果として実行プログラムの処理が最適化されず、実行性能を高めることができない、という弊害がある。
具体的には、コンパイラは、上記最適化処理を行う際には、通常、プログラム中の変数をチェックして、異なる変数が同じメモリ領域を参照する可能性があるかどうかを判定し、判定の結果、同じ領域を参照しない場合に限り、各種最適化を適用する処理を行う。つまり、プログラム実行時に実際のメモリアドレスが代入される変数が存在すると、その変数が参照する領域はコンパイル時には確定できないため、コンパイラでその変数の参照領域を解析するのが困難になる。変数が参照する領域が解析できない場合、その他の変数と同じ領域を指す可能性があるとして、扱わなければならない。これを配列間の依存関係があるという。
よって、コンパイラは、アドレスを代入された変数間は常に依存があるとして扱わなければならないので、コンパイラの解析精度が落ちてしまい、各種最適化を適用できなくなる。上記従来技術によりインライン展開が適用された中間コードをコンパイルすると、アドレス代入文を伴う処理が含まれることになるため、コンパイラによる最適化が適用されないという問題が発生する。
例えば、図8では6行目と12行目で変数ptr_arg1とptr_arg2にアドレスが代入される。そして、ptr_arg1は7行目から11行目で構成されるループ内で配列添字を更新しながら参照を行う。また、ptr_arg2は13行目から17行目で構成されるループ内で配列添字を更新しながら参照を行う。ここで、インライン展開後の最適化として、7行目から11行目で構成されるループと13行目から17行目で構成されるループとのループ融合について考える。
ループ融合については、例えば上記背景技術に記載した非特許文献1に記載がある。ループ融合を行うためには、それぞれのループ内で参照されているメモリ領域に重なりがあるかどうかを調べ、重なりのあるメモリ領域の参照順序がループ融合前とループ融合後で変わらないことをコンパイラが判断できるだけの合理性が必要となる。
ここで、ループ内で参照されているメモリ領域のうち、コンパイルを行う時点で参照先が確定しないものが存在すると、コンパイルを行う時点でメモリ領域の参照順序が確定しないため、それらのループに対してループ融合を適用できないとコンパイラは判断せざるを得なくなる。図8では、ptr_arg1とptr_arg2がアドレスを代入された変数であるため、それらの変数が参照するメモリ領域はコンパイル時点では確定しないため、これらが含まれるループ間で参照順序を確定することができないとコンパイラは判断せざるを得なくなり、ループ融合は適用できない。これは、アドレス代入文を伴うインライン展開を適用したことで、コンパイラの解析精度が落ちてしまうことを意味する。
本発明の目的は、呼び出し元の実引数と呼び出し先の仮引数が共に配列または変数で、実引数と仮引数の次元数が異なる場合であっても、代入文を用いた変数展開を行わずにインライン展開を行う方法を提供することである。
前記目的を達成するための発明に係るコンパイル装置は、
n次元の第1の配列変数を仮引数とする呼び出し先の関数を、m次元の第2の配列変数を実引数とする呼び出し元の関数にインラインで展開するコンパイル装置であって、
記憶部と、所定の条件の満足を判別する判別部と、前記判別部が前記所定の条件を満足すると判別した場合にインライン展開を行うインライン展開部と、を有して構成され、
前記判別部が判別する前記所定の条件は、
前記第1の配列変数の宣言情報における配列次元数(n)が、前記第2の配列変数の宣言情報における配列次元数(m)を超えず、
かつ、前記第1の配列変数の宣言情報における各次元の添字範囲が、前記第2の配列変数の宣言情報における各次元の添字範囲と一致し、
かつ、前記第2の配列変数の各次元の添字のうち、前記第1の配列変数の宣言情報における配列次元数(n)以下の次元の添字が、前記第2の配列変数の宣言情報における各次元の添字範囲の下限値と一致する、
ことであり、
前記インライン展開部は、前記第1の配列変数名を、前記第2の配列変数名に置き換えて中間ソースプログラムを生成し前記記憶部に記憶する、
ことを特徴とする。
n次元の第1の配列変数を仮引数とする呼び出し先の関数を、m次元の第2の配列変数を実引数とする呼び出し元の関数にインラインで展開するコンパイル装置であって、
記憶部と、所定の条件の満足を判別する判別部と、前記判別部が前記所定の条件を満足すると判別した場合にインライン展開を行うインライン展開部と、を有して構成され、
前記判別部が判別する前記所定の条件は、
前記第1の配列変数の宣言情報における配列次元数(n)が、前記第2の配列変数の宣言情報における配列次元数(m)を超えず、
かつ、前記第1の配列変数の宣言情報における各次元の添字範囲が、前記第2の配列変数の宣言情報における各次元の添字範囲と一致し、
かつ、前記第2の配列変数の各次元の添字のうち、前記第1の配列変数の宣言情報における配列次元数(n)以下の次元の添字が、前記第2の配列変数の宣言情報における各次元の添字範囲の下限値と一致する、
ことであり、
前記インライン展開部は、前記第1の配列変数名を、前記第2の配列変数名に置き換えて中間ソースプログラムを生成し前記記憶部に記憶する、
ことを特徴とする。
また、前記目的を達成するための発明に係るコンパイル装置は、
n次元の第1の配列変数を仮引数とする呼び出し先の関数を、m次元の第2の配列変数を実引数とする呼び出し元の関数にインラインで展開するコンパイル装置であって、
所定の条件の満足を判別する判別部と、前記判別部が前記所定の条件を満足すると判別した場合にインライン展開を行うインライン展開部と、を有して構成され、
前記判別部は、
コンパイル対象の関数の仮引数情報を収集する処理ステップと、
前記所定の条件の満足を判別する処理ステップと、
前記判別の結果、所定の条件を満足する場合に、実引数情報と、対応する仮引数情報と、を前記記憶部に記憶させる処理ステップと、
を順に実行し、
前記インライン展開部は、
前記記憶部にて記憶した実引数情報と仮引数情報とを元に、関数呼び出しのインライン展開時に仮引数を実引数に置き換える処理ステップと、
を順に実行する、
ことを特徴とする。
n次元の第1の配列変数を仮引数とする呼び出し先の関数を、m次元の第2の配列変数を実引数とする呼び出し元の関数にインラインで展開するコンパイル装置であって、
所定の条件の満足を判別する判別部と、前記判別部が前記所定の条件を満足すると判別した場合にインライン展開を行うインライン展開部と、を有して構成され、
前記判別部は、
コンパイル対象の関数の仮引数情報を収集する処理ステップと、
前記所定の条件の満足を判別する処理ステップと、
前記判別の結果、所定の条件を満足する場合に、実引数情報と、対応する仮引数情報と、を前記記憶部に記憶させる処理ステップと、
を順に実行し、
前記インライン展開部は、
前記記憶部にて記憶した実引数情報と仮引数情報とを元に、関数呼び出しのインライン展開時に仮引数を実引数に置き換える処理ステップと、
を順に実行する、
ことを特徴とする。
また、前記目的を達成するための発明に係るコンパイル方法は、
n次元の第1の配列変数を仮引数とする呼び出し先の関数を、m次元の第2の配列変数を実引数とする呼び出し元の関数にインラインで展開するコンパイル方法であって、
前記第1の配列変数の宣言情報における配列次元数(n)が、前記第2の配列変数の宣言情報における配列次元数(m)を超えず、
かつ、前記第1の配列変数の宣言情報における各次元の添字範囲が、前記第2の配列変数の宣言情報における各次元の添字範囲と一致し、
かつ、前記第2の配列変数の各次元の添字のうち、前記第1の配列変数の宣言情報における配列次元数(n)以下の次元の添字が、前記第2の配列変数の宣言情報における各次元の添字範囲の下限値と一致する、
ことの満足を判別するステップと、
前記判別においてその結果が満足である場合に、前記第1の配列変数名を、前記第2の配列変数名に置き換えてインライン展開を行うステップと、
を有することを特徴とする。
n次元の第1の配列変数を仮引数とする呼び出し先の関数を、m次元の第2の配列変数を実引数とする呼び出し元の関数にインラインで展開するコンパイル方法であって、
前記第1の配列変数の宣言情報における配列次元数(n)が、前記第2の配列変数の宣言情報における配列次元数(m)を超えず、
かつ、前記第1の配列変数の宣言情報における各次元の添字範囲が、前記第2の配列変数の宣言情報における各次元の添字範囲と一致し、
かつ、前記第2の配列変数の各次元の添字のうち、前記第1の配列変数の宣言情報における配列次元数(n)以下の次元の添字が、前記第2の配列変数の宣言情報における各次元の添字範囲の下限値と一致する、
ことの満足を判別するステップと、
前記判別においてその結果が満足である場合に、前記第1の配列変数名を、前記第2の配列変数名に置き換えてインライン展開を行うステップと、
を有することを特徴とする。
また、前記目的を達成するための発明に係るコンパイルプログラムは、
n次元の第1の配列変数を仮引数とする呼び出し先の関数を、m次元の第2の配列変数を実引数とする呼び出し元の関数にインラインで展開するコンパイルプログラムであって、
情報処理装置に対して、
前記第1の配列変数の宣言情報における配列次元数(n)が、前記第2の配列変数の宣言情報における配列次元数(m)を超えず、
かつ、前記第1の配列変数の宣言情報における各次元の添字範囲が、前記第2の配列変数の宣言情報における各次元の添字範囲と一致し、
かつ、前記第2の配列変数の各次元の添字のうち、前記第1の配列変数の宣言情報における配列次元数(n)以下の次元の添字が、前記第2の配列変数の宣言情報における各次元の添字範囲の下限値と一致する、
ことの満足を判別する処理と、
前記判別においてその結果が満足である場合に、前記第1の配列変数名を、前記第2の配列変数名に置き換えてインライン展開を行う処理と、
を実行させることを特徴とする。
n次元の第1の配列変数を仮引数とする呼び出し先の関数を、m次元の第2の配列変数を実引数とする呼び出し元の関数にインラインで展開するコンパイルプログラムであって、
情報処理装置に対して、
前記第1の配列変数の宣言情報における配列次元数(n)が、前記第2の配列変数の宣言情報における配列次元数(m)を超えず、
かつ、前記第1の配列変数の宣言情報における各次元の添字範囲が、前記第2の配列変数の宣言情報における各次元の添字範囲と一致し、
かつ、前記第2の配列変数の各次元の添字のうち、前記第1の配列変数の宣言情報における配列次元数(n)以下の次元の添字が、前記第2の配列変数の宣言情報における各次元の添字範囲の下限値と一致する、
ことの満足を判別する処理と、
前記判別においてその結果が満足である場合に、前記第1の配列変数名を、前記第2の配列変数名に置き換えてインライン展開を行う処理と、
を実行させることを特徴とする。
以下、本発明に係る実施形態について、図面を用いて説明する。
本発明に係る実施形態としてのコンパイル装置について、図1〜13を用いて説明する。
図1は、本発明によるコンパイル装置の構成図である。このコンパイル装置は、装置本体1と、CPUなどのプロセッサ2と、主記憶装置3と、記憶装置4と、ディスプレイ装置5と、入力装置6と、を有して構成される。
プロセッサ2は、コンパイル処理部21と、コンパイル処理部21に含まれる処理部としてのインライン展開部22と、を有して構成される。
主記憶装置3は、後述する仮引数情報テーブル31と、後述する実引数情報テーブル32と、を有して構成される。上記テーブルはインライン展開部22により作成され、書き込み・読み取りされ、削除される。
記憶装置4には、本実施形態にてコンパイル対象となるコンパイル対象ソースプログラム41と、本実施形態にてコンパイルを行った結果作成されるオブジェクトプログラム42と、が記憶される。
図2は、本実施形態のコンパイル処理部21が処理する概要をフローチャートにして表現したものである。コンパイル処理部21は、指定されたコンパイル対象ソースプログラム41を対象として、構文解析を行うステップ201、インライン展開を行うステップ202、コード最適化を行うステップ203、レジスタ割付を行うステップ204、オブジェクトプログラム42のコード生成を行うステップ205、を実施する。
図3は、図2にて示したコンパイル処理部21の処理ステップのうち、インライン展開部22が実行するインライン展開202の処理ステップを詳細に記載したものである。
インライン展開202のステップは、コンパイル対象ソースプログラム41を対象として、呼び出し先関数の仮引数情報を収集し仮引数情報テーブル31に登録するステップ301と、コンパイル対象ソースプログラム41に記載されている全関数のインライン展開の要否判断またはインライン展開(後述のステップ303〜ステップ308)が完了したかどうかを判定するステップ302と、コンパイル対象ソースプログラム41に含まれる関数の全てについてインライン展開可否の判断がなされたかどうかを判定するステップ303と、その関数内から他の関数を呼び出す箇所(以降、該箇所を「コール文」と記載する。)が、インライン展開が可能な関数呼び出しか否かを判断するステップ304と、インライン展開が可能であればその関数呼び出しの実引数の情報を実引数情報テーブル32に登録するステップ305と、ステップ305に続いて対応する仮引数に関する情報を実引数情報テーブル32に登録するステップ306と、仮引数情報テーブル31と実引数情報テーブル32とを参照して、関数呼び出し文をインライン展開するステップ307と、インライン展開が行われた後に実引数情報テーブル32に登録された情報を破棄するステップ308と、からなり、これを順次インライン展開部22が実行していくことで実現される。
図4は、図3にて示したインライン展開部22が実施するステップのうち、呼び出し先関数の仮引数情報を収集し仮引数情報テーブル31に登録するステップ301をより詳細に示したものである。
該ステップ301は、コンパイル対象のプログラムに含まれる全関数の仮引数情報を登録し終わったかどうかを検査するステップ401と、ある1つの関数の仮引数の名前・型・次元数などの情報を収集し、後に示す仮引数情報テーブル31に登録するステップ402と、からなり、各ステップは、インライン展開部22によって実行される。
図5は、図3にて示したインライン展開部22が実施するステップのうち、対応する仮引数に関する情報を実引数情報テーブル32に登録するステップ306を詳細に示したものである。
該ステップ306は、関数呼び出し時の実引数の情報を前記の仮引数情報テーブル31に記憶された仮引数情報と突合して、呼び出される関数をインライン展開する際に仮引数を実引数に置き換えてインライン展開することが可能かどうかを判断し、可能であれば実引数情報テーブル32に対応する仮引数情報を登録して後に置き換えを行うための情報を取得するステップである。
ここで、仮引数を実引数に置き換えてインライン展開することができると、結果として、代入文を用いた変数展開を行うことなくインライン展開を行うことができるようになり、コンパイラによる最適化処理時の不確定要素を減らすことができれば、本願の目的である最適化の恩恵を受けることができるため、置き換えを行うための情報を取得する必要がある。
具体的には、ステップ306は、以下のステップからなる。
各コール文で指定した実引数に対して置き換えが可能かどうかの判断を完了したかどうかを判定するステップ501と、実引数に対応する仮引数情報を取得するステップ502と、実引数と仮引数の型が一致するかどうかを判定するステップ503と、一致した場合に実引数の次元数が仮引数の次元数以上であるかどうかを判定するステップ504と、実引数の次元数が仮引数の次元数以上である場合に実引数と仮引数の配列の添字の範囲が下限値上限値共に仮引数の次元数まで一致するかどうかを判定するステップ505と、仮引数の次元数まで添字範囲が一致した場合に、各コール文で実引数に指定された際の添字が、仮引数の次元数までの実引数の添字の下限値と一致するかどうかを判定するステップ506と、実引数の添字の下限値と一致した場合に、コール文で指定した実引数に置き換えることを決定し、対応する仮引数名と次元数を実引数情報登録テーブル32に登録するステップ507と、を備える。
ここで、各判定ステップ503、504、505、506、の判定結果がすべて真でない限りコール文で指定した実引数に置き換えることが可能でないと判断し、ステップ507の登録を行わない。
図6は、図3にて示したインライン展開部22が実施するステップのうち、ステップ306にてインライン展開時に実引数への置き換えが可能であると判断された仮引数を、実際に実引数名に置き換えてインライン展開を行うステップ307を詳細に示したものである。
該ステップ307は、各コンパイル対象のコール文について実際に仮引数を実引数に置き換えることが可能かどうかを判断し、可能であれば置き換えを実施してインライン展開を行うステップである。
具体的には、コール文がインライン展開をなされている、あるいはインライン展開を行う必要がないと判断されているかどうかを判定するステップ601と、対象のコール文で使用する全実引数の変数と配列がすでにインライン展開をなされているかどうかを判定するステップ602と、呼び出し先関数をインライン展開した場合に、仮引数名で参照を行う部分があるかどうかを判定するステップ603と、その参照を行う仮引数は実引数情報テーブル32に登録されている引数であるかどうかを判定するステップ604と、登録されている引数であれば仮引数名を実引数名に置き換えてインライン展開するステップ605と、ステップ603の判定結果あるいはステップ604の判定結果が真でない場合に従来技術と同様のインライン展開を行うステップ606と、を実行するステップである。
図11,12を用いて、実引数情報テーブル32の構造を説明する。
実引数情報テーブル32は、引数番号1101と、変数配列名1102と、型1103と、次元数1104と、各次元ごとの添字の範囲を示す次元情報1105と、コール文で引き渡している添字情報1106と、対応仮引数名1107と、仮引数次元数1108と、を有して構成される。
実引数情報テーブル32は、引数番号1101と、変数配列名1102と、型1103と、次元数1104と、各次元ごとの添字の範囲を示す次元情報1105と、コール文で引き渡している添字情報1106と、対応仮引数名1107と、仮引数次元数1108と、を有して構成される。
引数番号1101とは、コール文1つにつき複数の実引数が引き渡される場合に、1コール文中の何番目の引数であるのかを識別するための番号である。
変数配列名1102とは、コール文で引き渡されている実引数の変数名である。
型1103とは、コール文で引き渡されている実引数の変数のデータ型である。
次元数1104とは、コール文で引き渡されている実引数の変数の配列次元数である。実引数が変数の場合は0である。
次元情報1105とは、コール文で引き渡されている実引数の変数の各次元ごとの添字の下限値と上限値を、各次元ごとに取得したものである。
添字情報1106とは、コール文で引き渡されている実引数の変数の各次元ごとの添字である。
対応仮引数名1107とは、インライン展開時に該実引数で置き換える仮引数名の候補である。
仮引数次元数1108とは、対応仮引数名1107で示される仮引数の次元数である。
変数配列名1102とは、コール文で引き渡されている実引数の変数名である。
型1103とは、コール文で引き渡されている実引数の変数のデータ型である。
次元数1104とは、コール文で引き渡されている実引数の変数の配列次元数である。実引数が変数の場合は0である。
次元情報1105とは、コール文で引き渡されている実引数の変数の各次元ごとの添字の下限値と上限値を、各次元ごとに取得したものである。
添字情報1106とは、コール文で引き渡されている実引数の変数の各次元ごとの添字である。
対応仮引数名1107とは、インライン展開時に該実引数で置き換える仮引数名の候補である。
仮引数次元数1108とは、対応仮引数名1107で示される仮引数の次元数である。
ここで、該テーブルのうち、上記対応仮引数名1107と、仮引数次元数1108以外の情報は、インライン展開部22により、実引数情報登録のステップ305にて登録され、実引数情報破棄のステップ308にて破棄される。該テーブルのうち、上記対応仮引数名1107と、仮引数次元数1108は、インライン展開部22により、実引数情報に対応した仮引数情報登録のステップ306にて登録され、実引数情報破棄のステップ308にて破棄される。
図13を用いて、仮引数情報テーブル31の構造を説明する。
仮引数情報テーブル31は、関数名1201と、引数番号1202と、変数配列名1203と、型1204と、次元数1205と、各次元ごとの添字の範囲を示す次元情報1206と、を有して構成される。
仮引数情報テーブル31は、関数名1201と、引数番号1202と、変数配列名1203と、型1204と、次元数1205と、各次元ごとの添字の範囲を示す次元情報1206と、を有して構成される。
関数名1201とは、コールされる関数の名称であり、どの関数の仮引数情報が登録されているかを識別するためのもの、引数番号1202とは、その関数を呼び出す際に複数の引数が引き渡される場合に、1コール文中の何番目の引数であるのかを識別するための番号である。
変数配列名1203とは、仮引数の変数名である。
型1204とは、仮引数の変数のデータ型である。
次元数1205とは、仮引数の変数の配列次元数である。仮引数が変数の場合は、0を登録する。
次元情報1206とは、仮引数の変数の各次元ごとの添字の下限値と上限値を、各次元ごとに取得したものである。
変数配列名1203とは、仮引数の変数名である。
型1204とは、仮引数の変数のデータ型である。
次元数1205とは、仮引数の変数の配列次元数である。仮引数が変数の場合は、0を登録する。
次元情報1206とは、仮引数の変数の各次元ごとの添字の下限値と上限値を、各次元ごとに取得したものである。
ここで、該テーブルのレコードは、インライン展開部22により、仮引数情報登録のステップ301にて登録される。
次に、図1〜13を用いて、本実施形態のコンパイル装置の動作を説明する。
まず、図1と図2を用いて、コンパイル装置1の動作の概要を示す。
コンパイル装置1は、プロセッサ2が備えるコンパイル処理部21が、図2に示すステップに従って処理を実行することにより、記憶装置4に記憶されたコンパイル対象ソースプログラム41のコンパイルを実現し、オブジェクトプログラム42を出力する。
具体的には、コンパイル処理部21は、構文解析201、インライン展開202、コード最適化203、レジスタ割り付け204、コード生成205の順で処理を実行する。
構文解析201のステップでは、コンパイル対象ソースプログラム41を入力として構文解析を行い、中間コード(図示せず)を出力する。インライン展開202のステップは、後に詳細に説明するため、ここでは説明を割愛する。コード最適化203のステップでは、該中間コードを入力として、ループ融合、ループ交換、ループ展開や部分冗長性削除などの最適化処理を適用し、その結果を変換後の中間コード(図示せず)として出力する。レジスタ割り付け204のステップでは、上記変換後の中間コードの各ノードに対してレジスタ割り付けを実施する。コード生成205のステップでは、上記変換後の中間コードをオブジェクトプログラム42に変換し出力する。
次に、主に図7に示すサンプルのプログラムを用いて、本実施形態のコンパイル装置の詳細な動作を図3〜13を用いて具体的に説明する。
図7のサンプルプログラムはFortran言語で記述したプログラムである。このプログラムでは、21行目から27行目までにmain関数があり、そのmain関数から、関数func1(1行目から9行目)と関数func2(11行目から19行目)を呼び出す構造になっている。このプログラムに対し、ステップ301の呼び出し先関数の仮引数情報収集処理(図4のステップ401と402を含む)を適用すると、図13に示す仮引数情報テーブル31が得られる。
該仮引数情報テーブル31の1つめのエントリは、主に関数名func1(図7の1行目から9行目)にある配列変数の宣言文(図7の2行目)から取得した仮引数情報が登録されている。func1にて定義されている1番目の仮引数は、変数配列名がarg1、型がreal*8(テーブル中ではr8と略している)、次元数が2次元で、各次元の(下限値:上限値)の組が共に(1:5)であることを示している。仮引数情報テーブルの2つめのエントリには、主に関数名func2(図7の11行目から19行目)にある配列変数の宣言文(図7の12行目)から取得した仮引数情報が登録されている。func2の1番目の仮引数は、変数・配列名がarg2、型がreal*8、次元数が2次元で、各次元の(下限値:上限値)の組が共に(1:5)であることを示している。
ステップ302の判定では、コンパイル対象の全関数(main,func1,func2)に対するインライン展開が完了したかどうかを判定するが、この段階ではまだいずれも展開していないため、判定結果の真偽値は偽となり、次にステップ303を実施する。
なお、全関数のインライン展開が完了した場合には、判定結果の真偽値は真となり、インライン展開202の処理そのものを終了する。
なお、全関数のインライン展開が完了した場合には、判定結果の真偽値は真となり、インライン展開202の処理そのものを終了する。
ステップ303の判定では、前記の全関数のうちの一つを対象として関数内を走査し、他の関数を呼び出す文の全て(図7では、関数func1と、func2と、を呼び出すmain内の24行目と25行目のコール文)のインライン展開が完了したかどうかを判定する。この段階では、まだいずれのコール文も展開していないため、判定結果の真偽値は偽となり、次にステップ304を実施する。
なお、全コール文のインライン展開が完了した場合には、判定結果の真偽値は真となり、ステップ302の判定に戻って全関数の処理が完了したかどうかの判定を行う。
なお、全コール文のインライン展開が完了した場合には、判定結果の真偽値は真となり、ステップ302の判定に戻って全関数の処理が完了したかどうかの判定を行う。
ステップ304の判定では、対象の1つのコール文(図7では、例えばmain内の24行目のコール文)が、インライン展開画可能な関数呼び出しであるかどうかを判定する。
その判定の方法としては、呼び出し先関数に含まれる文の数を比較するなどの方法がある。呼び出し先関数の文の数が多い場合、その関数をインライン展開すると、呼び出し元のコードサイズが不必要に増加したり、レジスタの消費量が増えるなどの悪影響が出ることが知られている。そのため、インライン展開する場合は、あらかじめ閾値とする文の数を決めておき、その文の数以下の関数の場合だけインライン展開対象とする、などの判定を行う。このような判定のもとで、インライン展開不可と判定された場合は、ステップ303へ戻る。インライン展開可能と判定した場合は、ステップ305を実施する。
ステップ305では、該コール文における実引数の順に応じて引数番号1101を付番して記録し、実引数の名前を変数配列名1102に、変数の型を型1103に、変数の次元数を次元数1104に、実引数の変数の各次元ごとの添字の下限値と上限値を、各次元ごとに次元情報1105に、実引数の変数の各次元ごとの添字を添字情報1106に、対応させて実引数情報テーブル32に登録する。
例では、図11(a)に、main内の24行目にあるfunc1コール文を対象として上記登録を行った直後の実引数情報テーブル32を示す。
引数番号1101には、引数の一つ目であることを示す1を、実引数の名前であるaを変数配列名1102に、変数の型であるr8(実数8バイト)を型1103に、変数の次元数である3を次元数1104に、次元情報1105には一次元目の下限値を1、上限値を5、二次元目の下限値を1、上限値を5、三次元目の下限値を1、上限値を10として記録してある。添字情報1106には1次元目に1、2次元目に1、3次元目にkを記録しており、対応仮引数名1107と、仮引数次元数1108には、この段階では記録するステップを経ていないため何も記録されていない。
同様に、func2に関しては、図12の(c)に記載の情報が該当する。
ステップ306では、仮引数情報テーブル31と実引数情報テーブル32に登録されている情報を使い、呼び出し先の関数をインライン展開したときに、その関数内において仮引数名で参照されている箇所を、呼び出し元の実引数名を使った参照に置き換えることができるかどうかを判定し、可能な場合は対応する仮引数情報を登録する。
ステップ306の処理の詳細は、図5のステップ501からステップ507により実現される。
コール文で指定した実引数全てに対して置き換えが可能かどうかの判断を完了したかどうかを判定するステップ501では、該コール文(例では図7の24行目のfunc1コール文)に指定されているすべての引数を対象として仮引数を実引数に置き換える判断を完了したかどうかを判定する。すべての引数を判断した場合はステップ306を終了する。判断済みでない引数がある場合は、ステップ502へ進む。
コール文で指定した実引数全てに対して置き換えが可能かどうかの判断を完了したかどうかを判定するステップ501では、該コール文(例では図7の24行目のfunc1コール文)に指定されているすべての引数を対象として仮引数を実引数に置き換える判断を完了したかどうかを判定する。すべての引数を判断した場合はステップ306を終了する。判断済みでない引数がある場合は、ステップ502へ進む。
該当する実引数に対応する仮引数情報を取得するステップ502では、呼び出し先の関数名と引数の順序に従って、仮引数情報テーブル31から、対象の実引数と同順序に指定されている仮引数のエントリを取得する。
ステップ503では、該仮引数と該実引数のデータ型が同じかどうかを、型1204と型1103の記録データを比較して調べる。型が異なる場合は、ステップ501へ戻る。型が一致する場合は、ステップ504へ進む。この比較の意図は、型に相違がある場合には、置き換えを行ってしまうとデータ型の互換性が得られず、例えば算式などによる後の処理で型変換エラー等が発生し、オブジェクトプログラム42の実行が不可能となってしまうのを避けることにある。
ステップ504では、同様に仮引数と実引数の次元数の比較を行い、仮引数の次元数(n)が実引数の次元数(m)より大きければ、ステップ501へ戻る。仮引数の次元数(n)が実引数の次元数(m)以下であれば、ステップ505へ進む。これは、仮引数情報テーブル31上のエントリの次元数1205と、実引数情報テーブル32上の次元数1104とを比較することで調べられる。
この比較の意図は、仮引数の次元数(n)が実引数の次元数(m)より大きければ、呼び出し元で用意した実引数のメモリエリアを超えて呼び出される側の関数にてデータにアクセスするという結果を招く虞があり、その結果オブジェクトプログラム42が扱うデータの整合性を得られなくなり、オブジェクトプログラム42の実行が不可能となってしまうのを避けることにある。
ステップ505では、上記n次元目までの下限値と上限値が、仮引数と実引数間で一致するかどうかを調べる。これは、仮引数情報テーブル31上のエントリの次元情報1206と、実引数情報テーブル32上の次元情報1105とを比較することで調べられる。n次元目までの下限値と上限値が一致しない場合は、ステップ501へ戻る。n次元目までの下限値と上限値が一致する場合は、ステップ506へ進む。
この比較の意図は、仮引数と実引数のn次元目までの下限値と上限値が一致しない場合には、呼び出し元で用意した実引数のメモリエリアを超えて呼び出される側の関数にてデータにアクセスするという結果を招く虞があり、その結果オブジェクトプログラム42が扱うデータの整合性を得られなくなり、オブジェクトプログラム42の実行が不可能となってしまうのを避けることにある。
ステップ506では、コール文における実引数のn次元目までの添字が、実引数の下限値と完全一致するかどうかを調べる。これは、実引数の各次元の添字と、実引数情報テーブル32に登録されている次元情報1105の下限値を比較することで調べられる。添字が下限値と一致しない場合は、ステップ501へ進む。添字が下限値と一致する場合は、ステップ507へ進む。これは、配列のアクセス開始位置を、仮引数と実引数との間で共に下限値からアクセスする場合に限って置き換えを許可するためである。
ステップ507では、インライン展開時に仮引数名での参照を実引数名を使った参照に置き換えるための情報として、実引数名に対応する仮引数名を実引数情報テーブル32の対応仮引数名1107に登録する。さらに、仮引数の次元数を仮引数次元数1108へ登録する。
例で説明すると、ステップ502では、呼び出し先の関数名がfunc1で、1番目の引数を処理中なので、図13に示した仮引数情報テーブル31の対応する仮引数のエントリとして1行目のarg1が登録されているエントリが取得される。ステップ503の判定では、仮引数と実引数の型は同じreal*8であるので、型は一致するため、ステップ504へ進む。
ステップ504では、実引数の次元数は図11(a)より3次元なのでm=3、仮引数の次元数は図13より2次元なのでn=2。判定した結果、仮引数の次元数2が実引数の次元数3以下なので、ステップ505へ進む。
ステップ505の判定では、n=2なので実引数と仮引数の2次元目までの(下限値:上限値)の組を調べる。図11(a)より実引数は1次元目、2次元目共に(1:5)の組であり、図13より仮引数も1次元目、2次元目共に(1:5)の組であるので、各次元の(下限値:上限値)の組が一致すると判定され、ステップ506へ進む。
ステップ506の判定では、図11(a)より、実引数の2次元目までの添字が共に1で、これは実引数の1次元目、2次元目の下限値と一致しているため、ステップ507へ進む。
ステップ507では、対応する仮引数情報である、仮引数名arg1と仮引数の次元数2をそれぞれ対応仮引数名1107と仮引数次元数1108に登録して、ステップ501へ処理を戻し、次なる引数に処理を移す。しかし、この実施例では引数は1つであり、置き換えの判断は完了したため、該ステップ306を終了する。
上記登録ステップ306が実施された直後には、func1に関しては図11(b)のとおり、対応仮引数名1107にarg1が、仮引数次元数1108には2が記録された状態となる。
同様に、func2に関しては図12(d)のとおり、対応仮引数名1107にarg2が、仮引数次元数1108には2が記録された状態となる。
同様に、func2に関しては図12(d)のとおり、対応仮引数名1107にarg2が、仮引数次元数1108には2が記録された状態となる。
ステップ307では、処理対象としたコール文に対するインライン展開処理を実施する。このとき、実引数テーブル32に仮引数名が登録されている場合、インライン展開時に仮引数名を実引数名を使った参照に置き換えた中間コードを生成する。
ステップ307の処理の詳細は、図6のステップ601からステップ606により実現される。
コール文がインライン展開をなされているかどうかを判定するステップ601では、呼び出し先関数に含まれるすべての文をインライン展開したかどうかを判定する。すべての文がインライン展開済みであれば、処理を終了する。すべての文がインライン展開されていなければ、ステップ602へ進む。
対象のコール文で使用する全実引数の変数と配列がすでにインライン展開をなされているかどうかを判定するステップ602では、文中の全変数・配列名を処理したかどうかを判定する。全変数・配列名を処理済みであれば、ステップ601へ戻る。全変数・配列名が処理済みでなければ、ステップ603へ進む。
呼び出し先関数をインライン展開した場合に、仮引数名で参照を行う部分があるかどうかを判定するステップ603では、処理中の変数・配列名が仮引数であるか否かを判定する。判定は、インライン展開されている関数名と変数・配列名の組が、仮引数情報テーブル31に登録されているか否かで判断することができる。処理中の変数・配列名が仮引数でない場合は、ステップ606へ進む。処理中の変数・配列名が仮引数の場合は、ステップ604へ進む。
参照を行う仮引数は実引数情報テーブル32に登録されている引数であるか否かを判定するステップ604では、処理中の仮引数名が実引数情報テーブル32の対応仮引数名欄に登録されているか否かを調べる。登録されていない場合は、ステップ606へ進む。登録されている場合は、ステップ605へ進む。
仮引数名を実引数名に置き換えてインライン展開するステップ605では、文中の仮引数名による参照を、呼び出し元で与えた実引数名を使った参照に置き換えることが可能であるため、仮引数名を実引数名に変更するインライン展開を実施する。実引数名で展開した場合の添字は、仮引数の次元数をn、実引数の次元数をmとすると、n次元目までは仮引数の添字を使い、それ以上の次元は実引数の添字を使うものとする。処理終了後ステップ602へ戻る。
ステップ603の判定結果あるいはステップ604の判定結果が真でない場合に従来技術と同様のインライン展開を行うステップ606では、従来のインライン展開を実施する。処理終了後はステップ602へ戻る。
図7の24行目のコール文に、関数func1の3行目から9行目を展開する処理例を挙げる。図7の5行目の文をインライン展開する際、ステップ603の判定により配列arg1は仮引数名であることが分かる。ステップ604では、実引数情報テーブル32(図11(b)参照)にarg1が登録されているかどうかを調べる。このとき、arg1は実引数情報テーブル32に登録されているので、ステップ605に進む。ステップ605では、仮引数名を実引数名に変更するインライン展開を実施する。このインライン展開処理後の中間コードをソースイメージで示したものが図9の4行目から8行目となる。図9の6行目は仮引数arg1での参照を実引数aを使った参照に変更したものである。ここで、配列aの添字は、2次元目までが仮引数arg1のもの(図7の5行目)で、3次元目は実引数aのもの(図7の24行目)である。
図7の25行目のfunc2のコール文においても同様の処理を行うと、実引情報テーブル32として、図12(c)(d)が作成される。また、インライン展開後の中間コードのソースイメージは図9の9行目から13行目となる。
ステップ308では、該コール文でのインライン展開が完了したので、ステップ305で作成した実引数情報テーブル32を破棄する。
その後、コンパイラは、主記憶装置3に作成した中間コードを記憶させ(図示せず)、中間コードに対してコンパイル処理を継続する。
本発明によるインライン展開を適用した後の中間コードのソースイメージは図9のようになる。この例では、外側kループの内側にj,iの2重ループが2つ存在している。ここで、あるkのときに、内側j,iの2重ループが参照する領域を解析すると、前半ループと後半ループで3次元目のkの添字が異なるため、同一領域を参照することはないことが容易に判別でき、コンパイル処理部にて実施する後続処理203にて最適化の一つであるループ融合が容易に適用される。(図10)。
このように、本実施形態におけるコンパイル装置により、呼び出し元の実引数と呼び出し先の仮引数が共に配列または変数で、かつ、実引数と仮引数の次元数が異なる場合であっても、代入文を用いた変数展開を行わずにインライン展開を行うことができる。
1:コンパイル装置、2:プロセッサ、3:主記憶装置、4:記憶装置、5:ディスプレイ、6:入力装置、21:コンパイル処理部、22:インライン展開部、31:仮引数情報テーブル、32:実引数情報テーブル、41:コンパイル対象ソースプログラム、42:オブジェクトプログラム
Claims (5)
- n次元の第1の配列変数を仮引数とする呼び出し先の関数を、m次元の第2の配列変数を実引数とする呼び出し元の関数にインラインで展開するコンパイル装置であって、
記憶部と、所定の条件の満足を判別する判別部と、前記判別部が前記所定の条件を満足すると判別した場合にインライン展開を行うインライン展開部と、を有して構成され、
前記判別部が判別する前記所定の条件は、
前記第1の配列変数の宣言情報における配列次元数(n)が、前記第2の配列変数の宣言情報における配列次元数(m)を超えず、
かつ、前記第1の配列変数の宣言情報における各次元の添字範囲が、前記第2の配列変数の宣言情報における各次元の添字範囲のうち前記第1の配列変数の宣言情報における配列次元数(n)以下の次元のものと一致し、
かつ、前記第2の配列変数の各次元の添字のうち、前記第1の配列変数の宣言情報における配列次元数(n)以下の次元の添字が、前記第2の配列変数の宣言情報における各次元の添字範囲の下限値と一致する、
ことであり、
前記インライン展開部は、前記第1の配列変数名を、前記第2の配列変数名に置き換えて中間コードを生成し前記記憶部に記憶する、
ことを特徴とするコンパイル装置。 - n次元の第1の配列変数を仮引数とする呼び出し先の関数を、m次元の第2の配列変数を実引数とする呼び出し元の関数にインラインで展開するコンパイル装置であって、
所定の条件の満足を判別する判別部と、前記判別部が前記所定の条件を満足すると判別した場合にインライン展開を行うインライン展開部と、を有して構成され、
前記判別部は、
コンパイル対象の関数の仮引数情報を収集する処理ステップと、
前記所定の条件の満足を判別する処理ステップと、
前記判別の結果、所定の条件を満足する場合に、実引数情報と、対応する仮引数情報と、を前記記憶部に記憶させる処理ステップと、
を順に実行し、
前記インライン展開部は、
前記記憶部にて記憶した実引数情報と仮引数情報とを元に、関数呼び出しのインライン展開時に仮引数を実引数に置き換える処理ステップと、
を順に実行する、
ことを特徴とするコンパイル装置。 - n次元の第1の配列変数を仮引数とする呼び出し先の関数を、m次元の第2の配列変数を実引数とする呼び出し元の関数にインラインで展開するコンパイル方法であって、
前記第1の配列変数の宣言情報における配列次元数(n)が、前記第2の配列変数の宣言情報における配列次元数(m)を超えず、
かつ、前記第1の配列変数の宣言情報における各次元の添字範囲が、前記第2の配列変数の宣言情報における各次元の添字範囲のうち前記第1の配列変数の宣言情報における配列次元数(n)以下の次元のものと一致し、
かつ、前記第2の配列変数の各次元の添字のうち、前記第1の配列変数の宣言情報における配列次元数(n)以下の次元の添字が、前記第2の配列変数の宣言情報における各次元の添字範囲の下限値と一致する、
ことの満足を判別するステップと、
前記判別においてその結果が満足である場合に、前記第1の配列変数名を、前記第2の配列変数名に置き換えてインライン展開を行うステップと、
を有することを特徴とするコンパイル方法。 - n次元の第1の配列変数を仮引数とする呼び出し先の関数を、m次元の第2の配列変数を実引数とする呼び出し元の関数にインラインで展開するコンパイルプログラムであって、
情報処理装置に対して、
前記第1の配列変数の宣言情報における配列次元数(n)が、前記第2の配列変数の宣言情報における配列次元数(m)を超えず、
かつ、前記第1の配列変数の宣言情報における各次元の添字範囲が、前記第2の配列変数の宣言情報における各次元の添字範囲のうち前記第1の配列変数の宣言情報における配列次元数(n)以下の次元のものと一致し、
かつ、前記第2の配列変数の各次元の添字のうち、前記第1の配列変数の宣言情報における配列次元数(n)以下の次元の添字が、前記第2の配列変数の宣言情報における各次元の添字範囲の下限値と一致する、
ことの満足を判別する処理と、
前記判別においてその結果が満足である場合に、前記第1の配列変数名を、前記第2の配列変数名に置き換えてインライン展開を行う処理と、
を実行させることを特徴とするコンパイルプログラム。 - 請求項4のコンパイルプログラムを記録したコンピュータ読み取り可能な記録媒体。
Priority Applications (1)
| Application Number | Priority Date | Filing Date | Title |
|---|---|---|---|
| JP2006248372A JP2008071065A (ja) | 2006-09-13 | 2006-09-13 | インライン展開を行うコンパイル装置、方法、プログラム、記憶媒体 |
Applications Claiming Priority (1)
| Application Number | Priority Date | Filing Date | Title |
|---|---|---|---|
| JP2006248372A JP2008071065A (ja) | 2006-09-13 | 2006-09-13 | インライン展開を行うコンパイル装置、方法、プログラム、記憶媒体 |
Publications (1)
| Publication Number | Publication Date |
|---|---|
| JP2008071065A true JP2008071065A (ja) | 2008-03-27 |
Family
ID=39292606
Family Applications (1)
| Application Number | Title | Priority Date | Filing Date |
|---|---|---|---|
| JP2006248372A Pending JP2008071065A (ja) | 2006-09-13 | 2006-09-13 | インライン展開を行うコンパイル装置、方法、プログラム、記憶媒体 |
Country Status (1)
| Country | Link |
|---|---|
| JP (1) | JP2008071065A (ja) |
Cited By (2)
| Publication number | Priority date | Publication date | Assignee | Title |
|---|---|---|---|---|
| WO2009116639A1 (ja) | 2008-03-19 | 2009-09-24 | 千寿製薬株式会社 | ラクリチンの部分ペプチド |
| CN114072740A (zh) * | 2019-08-08 | 2022-02-18 | 欧姆龙株式会社 | 信息处理装置、支持程序以及支持系统 |
-
2006
- 2006-09-13 JP JP2006248372A patent/JP2008071065A/ja active Pending
Cited By (4)
| Publication number | Priority date | Publication date | Assignee | Title |
|---|---|---|---|---|
| WO2009116639A1 (ja) | 2008-03-19 | 2009-09-24 | 千寿製薬株式会社 | ラクリチンの部分ペプチド |
| CN114072740A (zh) * | 2019-08-08 | 2022-02-18 | 欧姆龙株式会社 | 信息处理装置、支持程序以及支持系统 |
| US20220291903A1 (en) * | 2019-08-08 | 2022-09-15 | Omron Corporation | Information processing device, recording medium, and support system |
| US12182540B2 (en) | 2019-08-08 | 2024-12-31 | Omron Corporation | Information processing device, recording medium, and support system |
Similar Documents
| Publication | Publication Date | Title |
|---|---|---|
| US8276130B2 (en) | Method and compiler of compiling a program | |
| CN104536898B (zh) | C程序并行区域的检测方法 | |
| JP4041248B2 (ja) | コンパイラ装置、コンパイルプログラムが記録されたコンピュータ読み取り可能な記録媒体及びコンパイル方法 | |
| US20060195828A1 (en) | Instruction generator, method for generating instructions and computer program product that executes an application for an instruction generator | |
| JPH0926884A (ja) | バイナリ操作を必要とするタスク中に必要なフロー情報を使用可能とする方法および装置 | |
| CN116775127B (zh) | 一种基于RetroWrite框架的静态符号执行插桩方法 | |
| US10013244B2 (en) | Apparatus and method to compile a variadic template function | |
| US7917899B2 (en) | Program development apparatus, method for developing a program, and a computer program product for executing an application for a program development apparatus | |
| JPH11167492A (ja) | ループ飛び出し文を含むループに対する配列サマリ解析方法 | |
| JP2008305337A (ja) | プログラム変換装置、プログラム変換方法、プログラム、記憶媒体、デバッグ装置、デバッグ方法及びプログラム開発システム | |
| JP2008071065A (ja) | インライン展開を行うコンパイル装置、方法、プログラム、記憶媒体 | |
| US20170344351A1 (en) | Information processing apparatus, compiling management method, and recording medium | |
| JPH10320212A (ja) | キャッシュ向け最適化方法 | |
| JP2000207226A (ja) | コ―ド最適化装置、言語処理装置及びコ―ド最適化方法 | |
| JP2002082811A (ja) | コンパイル方法および記録媒体 | |
| CN116700731B (zh) | 代码编译方法及相关装置 | |
| JP3551352B2 (ja) | ループ分割方法 | |
| JPH11154093A (ja) | プログラムコンパイラ及びコンパイラ用プログラムを記録した記録媒体 | |
| US20090112568A1 (en) | Method for Generating a Simulation Program Which Can Be Executed On a Host Computer | |
| JP6447358B2 (ja) | ソースコード生成プログラム、ソースコード生成方法およびコンピュータ | |
| JPH11195011A (ja) | 言語翻訳処理装置、言語翻訳処理方法、言語翻訳処理プログラムを記録した記録媒体 | |
| JP2002073347A (ja) | 例外処理方法及びコンパイラ | |
| JP2005301415A (ja) | コンパイル方式、シミュレータ、エミュレータおよびプログラム開発支援システム | |
| JP2001125779A (ja) | オブジェクト指向型プログラミング言語で記述されたプログラムの構成関係管理装置及び方法並びに記憶媒体 | |
| JP2022125690A (ja) | 情報処理装置、情報処理プログラムおよびプログラム開発支援方法 |