JP3871312B2 - プログラム変換方法、これを用いたデータ処理装置及びプログラム - Google Patents
プログラム変換方法、これを用いたデータ処理装置及びプログラム Download PDFInfo
- Publication number
- JP3871312B2 JP3871312B2 JP2002051246A JP2002051246A JP3871312B2 JP 3871312 B2 JP3871312 B2 JP 3871312B2 JP 2002051246 A JP2002051246 A JP 2002051246A JP 2002051246 A JP2002051246 A JP 2002051246A JP 3871312 B2 JP3871312 B2 JP 3871312B2
- Authority
- JP
- Japan
- Prior art keywords
- register
- function
- variable
- program
- compiler
- 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.)
- Expired - Fee Related
Links
- 238000000034 method Methods 0.000 title claims description 48
- 238000012545 processing Methods 0.000 title claims description 29
- 230000006870 function Effects 0.000 claims description 207
- 238000004458 analytical method Methods 0.000 claims description 23
- 238000004590 computer program Methods 0.000 claims description 6
- 238000006243 chemical reaction Methods 0.000 claims 1
- 238000010586 diagram Methods 0.000 description 10
- 238000013507 mapping Methods 0.000 description 5
- 230000004083 survival effect Effects 0.000 description 4
- 238000007796 conventional method Methods 0.000 description 2
- 238000003672 processing method Methods 0.000 description 2
- 238000011161 development Methods 0.000 description 1
- 230000018109 developmental process Effects 0.000 description 1
- 230000000694 effects Effects 0.000 description 1
- 230000008571 general function Effects 0.000 description 1
- 230000003287 optical effect Effects 0.000 description 1
- 238000005457 optimization Methods 0.000 description 1
- 238000007781 pre-processing Methods 0.000 description 1
- 239000004065 semiconductor Substances 0.000 description 1
- 230000033772 system development Effects 0.000 description 1
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/44—Encoding
- G06F8/441—Register allocation; Assignment of physical memory space to logical memory space
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)
Description
【発明の属する技術分野】
本発明は、コンピュータプログラムのコンパイルにおいて実行されるレジスタ割付に関する。
【0002】
【従来の技術】
コンピュータプログラム(以下、単にプログラムと称す)は、複数の関数(メソッド)の集合体として構成される。プログラムをコンパイルする場合、コンパイラは、プログラムを構成するそれぞれの関数に対して同一のレジスタセットを用いてレジスタの割り当てを行う。したがって、プログラムの所定の部分でレジスタの値が関数呼び出しを越えて生存する場合は、そのレジスタ値を一時的にメモリに保存することが必要となる。
【0003】
ところで、CPUが提供するレジスタには、関数を越えるとレジスタ値が保持されない揮発性レジスタ(volatile register)と、関数を越えてもレジスタ値が保持される不揮発性レジスタ(non-volatile register)とがある。
そこで、プログラムの所定の部分でレジスタの値が関数呼び出しを越えて生存する場合に、レジスタ値を保存する方法には次の2つの方法がある。
一つは、変数を揮発性レジスタに割り当て、関数呼び出しの前にレジスタを退避し、復帰の後にレジスタを復元する方法、すなわちコーラーメソッド(caller method:呼び出し側メソッド(関数))においてレジスタ値を退避・復元する方法である。
もう一つは、変数を不揮発性レジスタに割り当て、呼び出された関数において、当該レジスタの使用前にレジスタ値を退避し、使用後に退避前のレジスタ値を復元する方法、すなわちコーリーメソッド(callee method:被呼び出し側メソッド(関数))においてレジスタ値を退避・復元する方法である。
【0004】
不揮発性レジスタと揮発性レジスタの分類は、レジスタ使用慣習として、マシン(CPU)の供給者が定めるものである。したがって、ソフトウェアによるシステムの開発者は、この慣習に従って開発を行わなければならない。
従来のシステム開発では、マシンの供給者が定めたレジスタ使用慣習に従い、通常、関数を越えて生存しない変数には揮発性レジスタを割り当て、関数を越えて生存する変数には不揮発性レジスタを割り当てていた。また、インプリメンテーションのバリエーションとしては、関数を越えて生存する変数に揮発性レジスタを割り当てる方式も存在するが、これは、不揮発性レジスタが供給されていない等の特殊な事情がないかぎり合理的な方法とは考えられていない。
【0005】
【発明が解決しようとする課題】
複数の相互リンク可能なソフトウェアによるシステムがある場合、通常、それぞれのシステムにおいて、上記従来の技術で説明したように、定められた不揮発性レジスタと揮発性レジスタの使用慣習に従ってコード生成を行う。これは、各システムが相互にリンクされる、すなわち相互に関数呼び出しが行われることを前提としている。
ここで、相互リンク可能なシステムの一方がJIT(Just In Time)コンパイラであるとし、JITコンパイラにて生成されたコードとオブジェクト生成等の外部関数との関係を考えると、JITコンパイラにて生成されたコードが外部関数を呼び出す場合がほとんどであり、その逆は極めて稀である。このような場合、外部関数で不揮発性レジスタと定められているレジスタの値を、必ずしもJITコンパイラ内で保存しなければならないとは限らない。
しかしながら、従来は、マシンの供給者により定められた不揮発性レジスタをそのまま固定的に不揮発性レジスタとして使用しているので、本質的には必要とないレジスタ内容の退避・復元が実行されていた。
【0006】
また、上述したように、関数を越えて生存する変数には通常、不揮発性レジスタが割り当てられる。これは、そのような変数を揮発性レジスタに割り付けるよりも不揮発性レジスタに割り付けたほうが、有利なコードパターンが多く発生すると考えられているからである。すなわち、関数を越えて生存する変数を揮発性レジスタに割り付けた場合、最悪の場合で、その変数が定義されて最後に使用されるまでに呼び出された関数の数だけ退避・復元が必要となるのに対し、不揮発性レジスタに割り付けた場合は、その変数の生存区間の外側で多くても1度だけ退避・復元を行えばよいと言える。
しかしながら、関数を越えて生存する変数が存在しても、その関数が稀にしか呼び出されない場合がある。そして、上記従来の手法では、そのような変数も不揮発性レジスタに割り付けられるため、その変数の生存区間の前後でのレジスタ内容の退避・復元が、ほとんどの場合に無駄になってしまっていた。
【0007】
そこで、本発明は、関数を越えて生存する変数のレジスタへの割り付を工夫することにより、レジスタの内容の退避・復元を効率的に行い、コンパイル処理の実行効率を向上させることを目的とする。
【0008】
【課題を解決するための手段】
上記の目的を達成する本発明は、コンピュータを制御して、実行プログラムのソースコードをコンパイルして機械語コードを生成する、次のようなプログラム変換(コンパイル)方法として実現される。すなわち、このプログラム変換方法は、処理対象である実行プログラム中の所定の変数に関して、所定の関数呼び出しを越えて生存するか否かを判断し、この変数が関数呼び出しを越えて生存する場合、さらに、この関数呼び出しがコンパイラにて生成された関数の呼び出しか、外部関数の呼び出しかを判断するステップと、この判断に基づいて、揮発性レジスタ(volatile register)、不揮発性レジスタ(non-volatile register)、または外部関数の呼び出しが行われてもレジスタ値が保存されるがコンパイラにて生成された関数の呼び出しが行われるとレジスタ値が破壊される準揮発性レジスタ(semi-volatile register)のいずれに、この変数を割り付けるかを決定するステップと、この決定に基づいて機械語コードを生成するステップとを含むことを特徴とする。
ここで、この変数の割付先を決定するステップは、所定の変数の生存区間が外部関数の呼び出しのみを越える場合(すなわち、コンパイラにて生成された関数の呼び出しを越えない場合)に、この変数を準揮発性レジスタに割り付けるステップを含む。
【0009】
また、本発明の他のプログラム変換方法は、実行プログラムを実行した際の、かかる実行プログラムを構成する関数の実行頻度を調べてメモリに格納するステップと、この実行プログラム中の変数に対して、この変数が所定の関数呼び出しを越えて生存する場合に、この関数の実行頻度に応じて、揮発性レジスタまたは不揮発性レジスタのどちらに変数を割り当てるかを決定するステップと、この決定されたレジスタの割り当てを反映して機械語コードを生成するステップとを含むことを特徴とする。
ここで、この変数の割付先を決定するステップは、所定の変数の生存区間が実行頻度の低い関数の呼び出しを越える場合に、この変数を揮発性レジスタに割り付けるステップを含む。
【0010】
また、本発明のさらに他のプログラム変換方法は、実行プログラムを実行した際の、かかる実行プログラムを構成する関数の実行頻度を調べてメモリに格納するステップと、この実行プログラム中の変数に対して、この変数が所定の関数呼び出しを越えて生存する場合に、この関数の実行頻度に応じて、レジスタに割り付けられた変数を関数呼び出しの前後で退避・復元するコード、またはこの変数を呼び出された関数内で退避・復元するコードのどちらを付加するかを決定するステップと、この決定に基づいて機械語コードを生成し、メモリに格納するステップとを含むことを特徴とする。
ここで、この変数の割付先を決定するステップは、レジスタに割り付けられた所定の変数の生存区間が実行頻度の低い関数の呼び出しを越える場合に、この変数を呼び出された関数内で退避・復元するコードを実行プログラムに付加する処理を含む。
【0011】
さらにまた、本発明の他のプログラム変換方法は、処理対象である実行プログラム中の所定の変数を、
A群:生存区間がコンパイラにて生成された関数であって頻繁に実行される関数を跨ぐような変数と、
B群:生存区間が頻繁に実行される外部関数を跨ぎ、かつ前記コンパイラにて生成された関数であって頻繁に実行される関数を跨がないような変数と、
C群:その他の変数とに分類するステップと、A群に分類された変数を不揮発性レジスタ(non-volatile register)に割り当て、B群に分類された変数を外部関数の呼び出しが行われてもレジスタ値が保存されるが前記コンパイラにて生成された関数の呼び出しが行われるとレジスタ値が破壊される準揮発性レジスタ(semi-volatile register)に割り当て、C群に分類された変数を揮発性レジスタ(volatile register)に割り当てるステップと、この割り当てにしたがって、機械語コードを生成するステップとを含むことを特徴とする。
【0012】
また、上記の目的を達成する本発明は、実行プログラムのソースコードを読み込み、機械語コードに変換する、次のように構成されたデータ処理装置として実現される。すなわち、このデータ処理装置は、実行プログラム中の変数に対して論理レジスタの割付を行う論理レジスタ割付部と、所定の変数が所定の関数呼び出しを越えて生存するか否かを解析し、かつ、この変数が関数呼び出しを越えて生存する場合に、この関数呼び出しがコンパイラにて生成された関数の呼び出しか、外部関数の呼び出しかを解析する論理レジスタ性質解析部と、この解析結果に基づいて、揮発性レジスタ(volatile register)、不揮発性レジスタ(non-volatile register)、または外部関数の呼び出しが行われてもレジスタ値が保存されるがコンパイラにて生成された関数の呼び出しが行われるとレジスタ値が破壊される準揮発性レジスタ(semi-volatile register)のいずれかに、この変数を割り付ける物理レジスタ割付部と、レジスタ割付の決定を反映させて機械語コードを生成するコード生成部とを備えることを特徴とする。
【0013】
さらに、本発明による他のデータ処理装置は、実行プログラム中の変数に対して、この変数が所定の関数呼び出しを越えて生存する場合に、この関数の実行頻度に応じて、揮発性レジスタ(volatile register)または不揮発性レジスタ(non-volatile register)のどちらかに変数を割り付けるレジスタ割付部と、揮発性レジスタに割り付けられた変数を関数呼び出しの前後で退避・復元するコードを実行プログラムに付加し、前記不揮発性レジスタに割り付けられた変数を呼び出された関数内で退避・復元するコードを実行プログラムに付加するための情報を生成する退避・復元情報生成部と、生成された情報に基づいて機械語コードを生成するコード生成部とを備えることを特徴とする。
【0014】
さらにまた、本発明は、上述したプログラム変換方法の各ステップに対応する処理をコンピュータに実行させ、またはコンピュータを用いて上記のデータ処理装置の各機能を実現させるプログラム(例えば、JavaにおけるJITコンパイラのような、実行プログラムの実行に際して動的(ダイナミック)にコンパイルを行うコンパイラ)として実現することができる。このプログラムは、磁気ディスクや光ディスク、半導体メモリ、その他の記録媒体に格納して配布したり、ネットワークを介して配信したりすることにより提供することができる。
【0015】
【発明の実施の形態】
以下、添付図面に示す実施の形態に基づいて、この発明を詳細に説明する。
図1は、本実施の形態によるデータ処理方法を実現するコンピュータシステムのシステム構成を示す図である。
図1を参照すると、本実施の形態におけるコンピュータシステムは、ソースプログラム(入力コード)をコンパイルするコンパイラ100と、コンパイラ100にてコンパイルされたオブジェクトプログラム(出力コード)を実行して種々の処理を行うプログラム実行部200と、メモリ300とを備える。コンパイラ100及びプログラム実行部200は、パーソナルコンピュータやワークステーションなどのコンピュータシステムにおけるプログラム制御されたCPUにて実現される。メモリ300は、コンピュータ装置のメインメモリであり、RAM等で実現される。メモリ300には、CPUを制御してコンパイラ100として動作させるためのプログラムやコンパイルの対象のプログラムが格納されると共に、コンパイラ100のコンパイル処理において、レジスタから退避される変数が一時的に格納される。なお、メモリ300に格納されるプログラムは、必要に応じて、適宜磁気ディスクその他の外部記録装置に保存されることは言うまでもない。
【0016】
図1において、コンパイラ100は、バイトコード(byte code)で記述された入力コードを入力して処理し、機械語で記述された出力コードを生成して出力する。この入力コードの入力は、コード生成装置400にて生成された入力コードを直接入力したり、コード生成装置400にて生成された入力コードを記憶した記憶装置500から入力したり、ネットワーク600上に存在するコード生成装置400や記憶装置500からネットワーク600を介して入力したりすることにより行われる。コンパイラ100により生成された出力コードは、プログラム実行部200により実行される。
なお、本実施の形態において、コンパイラ100は、JavaにおけるJITコンパイラのような、実行プログラムを実行する際に動的に実行プログラムのコンパイル処理を行うコンパイラである。以下、本実施の形態では、JavaのJITコンパイラを例として説明する。また、プログラム実行部200は、コンパイラ100にてコンパイルされた実行プログラムのオブジェクトコード(機械語コード)を実行するほか、当該実行プログラムをインタープリタによっても実行する。そして、実行プログラムを実行した際に、その実行プロファイル(以下、単にプロファイル)を取得してメモリ300に蓄積する。
【0017】
図2は、本実施の形態におけるコンパイラ100の構成を説明する図である。図2を参照すると、コンパイラ100は、コンパイルの対象であるプログラムに対して論理レジスタの割付を行う論理レジスタ割付部110と、各論理レジスタに関して、割り付けられた変数の生存区間がどのように関数を跨いでいるかを解析する論理レジスタ性質解析部120と、論理レジスタ性質解析部120による解析結果に基づき論理レジスタと物理レジスタのマッピングを行う物理レジスタ割付部130と、物理レジスタ割付部130によるマッピングの結果に基づき、各物理レジスタにおいてどのような退避・復元を実行するかについての情報を生成する退避・復元情報生成部140と、退避・復元情報生成部140により生成された情報を反映させてオブジェクトコードを生成するコード生成部150とを備える。
【0018】
図2に示したコンパイラ100の各構成要素は、コンピュータプログラムにより制御されたCPUにて実現される仮想的なソフトウェアブロックである。CPUを制御する当該コンピュータプログラムは、CD−ROMやフロッピーディスクなどの記録媒体に格納して配布したり、ネットワークを介して伝送したりすることにより提供される。
なお、図2に示したコンパイラ100の構成要素は、本実施の形態における特徴的な機能に関するものである。図示しないが、コンパイラ100は、実際には、入力コードの字句解析や構文解析、各種の最適化処理といったコンパイル処理における一般的な機能を有することは言うまでもない。
【0019】
本実施の形態では、プログラムにおける変数が関数呼び出しを越えて生存する場合に、レジスタ値である当該変数の退避・復元を効率的に行うため、次に説明する二つの手法にて変数のレジスタへの割付を行う。一つは、本実施の形態にて定義される準揮発性レジスタを用いる手法、もう一つは、変数を用いる関数の呼び出し頻度を考慮する手法である。
【0020】
1.準揮発性レジスタを用いる手法
・準揮発性レジスタの導入
JavaのJITコンパイラなどで行われる動的なコンパイル処理(Dynamic Compilation)では、コンパイラ100は、プログラムの実行中にオブジェクトコードを動的に生成し、当該プログラムの実行中だけ使用する。従って、外部関数からの呼び出しがあったかどうかを完全に把握できるため、外部関数からの呼び出し点で不揮発性レジスタを退避しておけば、コンパイラ100が生成したコードの中では、その不揮発性レジスタを自由に揮発性レジスタに変更できる。プログラムの定常実行状態では、外部関数からの呼び出しはほとんど無いため、不揮発性レジスタを揮発性レジスタに変更することの不都合は事実上無いと言ってよい。
【0021】
そこで、マシンで定められている不揮発性レジスタの一部を、コンパイラ100が生成したコード内では揮発性レジスタとして使用する。ここでは、そのように用いられるレジスタを準揮発性レジスタ(semi-volatile register)と呼称する。準揮発性レジスタは、次のように扱われる。
(1)定められた不揮発性レジスタの中からコンパイラ100が生成したコード内で揮発性レジスタとして使用する準揮発性レジスタを決定する。その個数は不揮発性レジスタの数を超えない限りいくつでもよい。
(2)コンパイラ100にて生成されたコードが外部から呼び出されるポイントでは、準揮発性レジスタを退避する。例えば、インタープリタとコンパイラとが混在する実行環境(mixed-mode execution環境)では、コンパイラ100にて生成されたコードをインタープリタが呼び出すときに準揮発性レジスタの内容を退避する。
【0022】
図3は、インタープリタとコンパイラとが混在する実行環境での関数呼び出しの様子を示す図である。
図3において、準揮発性レジスタは、コンパイラ100にて生成されたコード(図ではJIT関数と記載)内では揮発性レジスタとして扱われ、インタープリタ及び外部関数の実行においては不揮発性レジスタとして扱われる。コンパイラ100にて生成されたコードが外部関数を呼び出す場合には、直接関数呼び出しが行われるが、外部関数がコンパイラ100にて生成されたコードを呼び出す場合には、インタープリタ及びJIT Invokerを介して関数呼び出しが行われるため、ここで準揮発性レジスタの内容が退避される。
【0023】
・準揮発性レジスタを用いたレジスタ内容の退避・復元回数の削減
図4は、レジスタの種類と性質を示す図表である。
図4に示すように、準揮発性レジスタの導入により、レジスタの種類は揮発性レジスタ、準揮発性レジスタ、不揮発性レジスタの3種類となる。これらのレジスタを、プログラム中の変数の種類に応じて使い分ける。すなわち、プログラムの解析により、変数を、生存区間が関数を跨がないものと、生存区間がコンパイラ100にて生成された関数を跨ぐものと、生存区間が外部関数を跨ぐがコンパイラ100にて生成された関数は跨がないものとに分ける。このうち、生存区間が関数を跨がない変数には揮発性レジスタを割り当て、生存区間がコンパイラ100にて生成された関数を跨ぐものには不揮発性レジスタを割り当てるのは、これまで通りである。そして、生存区間が外部関数を跨ぐがコンパイラ100にて生成された関数は跨がない変数を準揮発性レジスタに割り当てる。
【0024】
図5は、生存区間が外部関数を跨ぐがコンパイラ100にて生成された関数は跨がない変数に関して必要となるレジスタ内容の退避・復元を説明する図である。
生存区間が外部関数を跨ぐがコンパイラ100にて生成された関数は跨がない変数を準揮発性レジスタに割り当てることにより、図5に示すように、当該変数については、コンパイラ100にて生成されたコード内では、レジスタ内容の退避・復元を伴わずにレジスタ割り当てできるようになる。一方、従来のレジスタ割付では、そのような変数を揮発性レジスタに割り当てた場合、関数呼び出し前後のレジスタ内容の退避・復元が必要であり、また、不揮発性レジスタに割り当てた場合はレジスタ使用前後の退避・復元が必要であった。
したがって、かかるレジスタ内容の退避・復元を削減することにより、コンパイル処理の実行効率が向上する。
【0025】
2.変数を用いる関数の呼び出し頻度を考慮する手法
生存区間が関数を跨ぐ変数に対しては、不揮発性レジスタを割り当てる方が有利なコードパターンが多く発生すると考えられることから、通常、この種の変数には不揮発性レジスタが割り当てられている。しかし、稀にしか呼ばれない関数を跨ぐ変数に不揮発性レジスタを割り当ててしまうと、その変数の生存区間の前後におけるレジスタ内容の退避・復元が無駄になってしまう。
そこで、所定の変数に関し、プロファイル等の情報を利用して、当該変数が跨ぐ関数の呼び出しが稀に実行されるものであるかどうかを判断し、判断結果に応じて割り当てるレジスタを選択する。
【0026】
すなわち、変数が跨ぐ関数の全てが稀にしか実行されない場合、その変数を揮発性レジスタに割り当て、関数呼び出しの前にレジスタ内容を退避し、復帰の後に退避前のレジスタ内容を復元する(コーラーメソッドによるレジスタ値の退避・復元)。
一方、変数が跨ぐ関数のうち、1つでも頻繁に実行されるものがある場合は、その変数を不揮発性レジスタに割り当て、そのレジスタの使用前にレジスタ内容を退避し、使用後に退避前のレジスタ内容を復元する(コーリーメソッドによるレジスタ値の退避・復元)。
【0027】
図6は、関数の実行頻度に応じたレジスタの割り当てによるレジスタ内容の退避・復元を説明する図である。
図6に示すように、関数の実行頻度を考慮することにより、稀にしか実行されない関数を跨ぐレジスタ値の復元・退避が行われる位置は、そのレジスタの生存区間の前後から生存区間が跨ぐ関数の前後に変更される。この関数は稀にしか実行されないので、その関数の前後の復元・退避も稀にしか行われない。すなわち、事実上、レジスタ内容の退避・復元のコストが削減されることになる。
【0028】
上述した1.2.の手法を統合すると、プログラム中の関数が割り付けられるレジスタを選択するには、次の基準が必要であることがわかる。すなわち、
(1)変数の生存区間がコンパイラ100にて生成された関数(コード)を跨ぐか。
(2)変数の生存区間が外部関数を跨ぐか。
(3)変数の生存区間が跨ぐ関数自体の呼び出しの発生頻度。
これらの基準のさまざまな組み合わせを考慮した上で、本実施の形態では、割り当てるレジスタを決定するための変数の範疇を以下の3つと定める。
A群:生存区間がコンパイラ100にて生成された関数を頻繁に実行されるパスで跨ぐことがある変数
B群:生存区間が、外部関数を頻繁に実行されるパスで跨ぐことがあり、かつコンパイラ100にて生成された関数を頻繁に実行されるパスで跨ぐことがない(コンパイラ100にて生成された関数を全て稀にしか実行されないパスで跨ぐか、もしくは全く跨がない)変数
C群:その他の(全ての関数を稀にしか実行されないパスのみで跨ぐか、もしくは全く跨がない)変数
【0029】
次に、本実施の形態で提案した上記の手法を、図1、図2に示したコンパイラ100にて実現する場合の、各構成要素の動作について説明する。
図2に示したコンパイラ100の構成において、論理レジスタ割付部110は、メモリ300から読み出されて構文解析などの前処理が行われたプログラムに対して、従来と同様の方法で論理レジスタの割付を行う。また、コード生成部150は、従来と同様の方法でオブジェクトコードの生成を行い、生成されたオブジェクトコードをメモリ300に格納する。
【0030】
論理レジスタ性質解析部120は、次のようにして、各論理レジスタに関して、割り付けられた変数の生存区間がどのように関数を跨いでいるかを解析する。図7は、論理レジスタ性質解析部120による解析処理の動作を説明するフローチャートである。
特に図示しないが、プログラム実行部200によりコンパイル対象であるプログラムがインタープリタやコンパイル処理を経て実行された際に、そのプロファイルが取得されてメモリ300に格納されているものとする。
図7を参照すると、論理レジスタ性質解析部120は、まず全ての関数に関して、メモリ300に格納されているプロファイル等の情報を取得し、この情報を利用して、その関数が存在するパスの実行頻度(稀にしか実行されないパスか、頻繁に実行されるパスか)を解析する(ステップ701)。そして、全ての論理レジスタに対して順次以下の処理を実行する(ステップ702)。
【0031】
まず、着目中の論理レジスタに対して、その論理レジスタの生存区間が、コンパイラ100が生成する関数を、頻繁に実行されるパスで跨ぐかどうかを判定する(ステップ703)。もしそうであるならば、当該論理レジスタをA群に分類する(ステップ704)。
次に、その論理レジスタの生存区間が、外部関数を頻繁に実行されるパスで跨ぐかどうかを判定する(ステップ705)。もしそうであるならば、当該論理レジスタをB群に分類する(ステップ706)。
そしてさらに、その論理レジスタの生存区間が、全ての関数を稀にしか実行されないパスで跨ぐか、またはまったく関数を跨いでいないならば、当該論理レジスタをC群に分類する(ステップ707)。なお、論理レジスタの性質上、A、B、C群のいずれかに当てはまることが保証されている。
以上の処理が全ての論理レジスタに対して行われたならば、論理レジスタ性質解析部120の処理を終了する(ステップ702)。
【0032】
物理レジスタ割付部130は、論理レジスタ性質解析部120による解析結果に基づいて、論理レジスタと物理レジスタのマッピングを行う。
図8は、物理レジスタ割付部130によるマッピング処理の動作を説明するフローチャートである。
図8を参照すると、物理レジスタ割付部130は、各論理レジスタに対して、順次以下の処理を実行する(ステップ801)。
まず、着目中の論理レジスタに対して、その論理レジスタがA群に分類されているならば、その論理レジスタを不揮発性レジスタに割り付ける(ステップ802、803)。
次に、その論理レジスタがB群に分類されているならば、その論理レジスタを準揮発性レジスタに割り付ける(ステップ804、805)。
そしてさらに、その論理レジスタがC群に分類されているならば、その論理レジスタを揮発性レジスタに割り付ける(ステップ806)。
以上の処理が全ての論理レジスタに対して行われたならば、物理レジスタ割付部130の処理を終了する(ステップ801)。
【0033】
退避・復元情報生成部140は、物理レジスタ割付部130によるマッピングの結果に基づいて、各物理レジスタにおいてどのような退避・復元を実行するかについての情報を生成する。
図9は、退避・復元情報生成部140による情報生成処理の動作を説明するフローチャートである。
図9を参照すると、退避・復元情報生成部140は、物理レジスタ割付部130にて割り付けが行われた各物理レジスタに対して、順次以下の処理を実行する(ステップ901)。
まず、着目中の物理レジスタに対して、その物理レジスタが不揮発性レジスタであれば、コンパイル対象となっているメソッドの入口に、その物理レジスタの内容をメモリに退避することを表す情報を付加し、出口にその物理レジスタの内容をメモリから復元することを表す情報を付加する(ステップ902、903)。
次に、その物理レジスタが準揮発性レジスタまたは揮発性レジスタであれば、その物理レジスタに割り付けられている変数の生存区間が跨ぐ各関数に対して、その関数を呼び出す関数呼び出しの前にその論理レジスタの内容をメモリに退避することを表す情報を付加し、関数呼び出しの後にその論理レジスタの内容をメモリから復元することを表す情報を付加する(ステップ904)。
以上の処理が全ての論理レジスタに対して行われたならば、退避・復元情報生成部140の処理を終了する(ステップ901)。この後、退避・復元情報生成部140にて生成された情報に基づき、コード生成部150によるオブジェクトコードの生成処理において、実際の退避・復元コードが生成される。
【0034】
【発明の効果】
以上説明したように、本発明によれば、レジスタの内容の退避・復元を効率的に行い、コンパイル処理の実行効率を向上させることができる。
【図面の簡単な説明】
【図1】 本実施の形態によるデータ処理方法を実現するコンピュータシステムのシステム構成を示す図である。
【図2】 本実施の形態におけるコンパイラの構成を説明する図である。
【図3】 インタープリタとコンパイラとが混在する実行環境での関数呼び出しの様子を示す図である。
【図4】 本実施の形態において用いられるレジスタの種類と性質を示す図表である。
【図5】 生存区間が外部関数を跨ぐがコンパイラにて生成された関数は跨がない変数に関して必要となるレジスタ内容の退避・復元を説明する図である。
【図6】 関数の実行頻度に応じたレジスタの割り当てによるレジスタ内容の退避・復元を説明する図である。
【図7】 論理レジスタ性質解析部による解析処理の動作を説明するフローチャートである。
【図8】 物理レジスタ割付部によるマッピング処理の動作を説明するフローチャートである。
【図9】 退避・復元情報生成部による情報生成処理の動作を説明するフローチャートである。
【符号の説明】
100…コンパイラ、110…論理レジスタ割付部、120…論理レジスタ性質解析部、130…物理レジスタ割付部、140…退避・復元情報生成部、150…コード生成部、200…プログラム実行部、300…メモリ
Claims (11)
- コンピュータを制御して、実行プログラムのソースコードをコンパイルして機械語コードを生成するプログラム変換方法において、
前記コンピュータのプログラム制御されたCPUにより実現される論理レジスタ性質解析手段が、メモリから処理対象である実行プログラムを読み出し、当該実行プログラム中の所定の変数が所定の関数呼び出しを越えて生存するか否かを判断し、かつ当該変数が関数呼び出しを越えて生存する場合に、当該関数呼び出しがコンパイラにて生成された関数の呼び出しか、当該コンパイラにて生成された関数以外の関数である外部関数の呼び出しかを判断するステップと、
前記コンピュータのプログラム制御されたCPUにより実現される物理レジスタ割付手段が、前記判断に基づいて、関数呼び出しを越えて生存しない前記変数を、関数呼び出しが行われるとレジスタ値が破壊される揮発性レジスタに割り付け、前記コンパイラにて生成された関数の呼び出しを越えて生存する前記変数を、関数呼び出しが行われてもレジスタ値が保存される不揮発性レジスタに割り付け、前記外部関数の呼び出しを越えて生存するが前記コンパイラにて生成された関数の呼び出しは越えない前記変数を、前記外部関数の呼び出しが行われてもレジスタ値が保存されるがコンパイラにて生成された関数の呼び出しが行われるとレジスタ値が破壊される準揮発性レジスタに割り付けるステップと、
前記コンピュータのプログラム制御されたCPUにより実現されるコード生成手段が、前記割り付けに基づいて機械語コードを生成し、メモリに格納するステップと
を含むことを特徴とするプログラム変換方法。 - 前記論理レジスタ性質解析手段が前記変数の性質を判断するステップは、前記実行プログラム中の各関数が存在するパスの実行頻度を解析するステップを含み、
前記物理レジスタ割付手段が前記変数をレジスタに割り付けるステップは、所定の関数呼び出しを越えて生存する前記変数であっても、当該変数が実行頻度の低いパスに存在する関数の呼び出しのみを越えて生存する場合には、当該変数を前記揮発性レジスタに割り付けるステップを含むことを特徴とする請求項1に記載のプログラム変換方法。 - 前記コード生成手段が前記機械語コードを生成するステップは、実行頻度の低いパスに存在する関数の呼び出しのみを越えて生存する前記変数に関して、レジスタに割り付けられた当該変数を関数呼び出しの前後で退避・復元するコードを付加するステップを含むことを特徴とする請求項2に記載のプログラム変換方法。
- コンピュータを制御して、実行プログラムのソースコードをコンパイルして機械語コードを生成するプログラム変換方法において、
前記コンピュータのプログラム制御されたCPUにより実現される論理レジスタ性質解析手段が、前記実行プログラム中の所定の変数を、
A群:生存区間がコンパイラにて生成された関数であって頻繁に実行される関数を跨ぐ変数と、
B群:生存区間が頻繁に実行される、前記コンパイラにて生成された関数以外の関数である外部関数を跨ぎ、かつ前記コンパイラにて生成された関数であって頻繁に実行される関数を跨がない変数と、
C群:その他の変数と
に分類するステップと、
前記コンピュータのプログラム制御されたCPUにより実現される物理レジスタ割付手段が、A群に分類された変数を関数呼び出しが行われてもレジスタ値が保存される不揮発性レジスタに割り当て、B群に分類された変数を前記外部関数の呼び出しが行われてもレジスタ値が保存されるが前記コンパイラにて生成された関数の呼び出しが行われるとレジスタ値が破壊される準揮発性レジスタに割り当て、C群に分類された変数を関数呼び出しが行われるとレジスタ値が破壊される揮発性レジスタに割り当てるステップと、
前記コンピュータのプログラム制御されたCPUにより実現されるコード生成手段が、前記割り当てにしたがって、機械語コードを生成し、メモリに格納するステップと
を含むことを特徴とするプログラム変換方法。 - 実行プログラムのソースコードを読み込み、機械語コードに変換するデータ処理装置において、
前記実行プログラム中の変数に対して論理レジスタの割付を行う論理レジスタ割付部と、
所定の前記変数が所定の関数呼び出しを越えて生存するか否かを解析し、かつ当該変数が関数呼び出しを越えて生存する場合に、当該関数呼び出しがコンパイラにて生成された関数の呼び出しか、当該コンパイラにて生成された関数以外の関数である外部関数の呼び出しかを解析する、プログラム制御されたCPUにより実現される論理レジスタ性質解析部と、
前記論理レジスタ性質解析部による解析結果に基づいて、関数呼び出しを越えて生存しない前記変数を、関数呼び出しが行われるとレジスタ値が破壊される揮発性レジスタに割り付け、前記コンパイラにて生成された関数の呼び出しを越えて生存する前記変数を、関数呼び出しが行われてもレジスタ値が保存される不揮発性レジスタに割り付け、前記外部関数の呼び出しを越えて生存するが前記コンパイラにて生成された関数の呼び出しは越えない前記変数を、前記外部関数の呼び出しが行われてもレジスタ値が保存されるがコンパイラにて生成された関数の呼び出しが行われるとレジスタ値が破壊される準揮発性レジスタに割り付ける、プログラム制御されたCPUにより実現される物理レジスタ割付部と、
前記物理レジスタ割付部によるレジスタの割付の決定を反映させて機械語コードを生成する、プログラム制御されたCPUにより実現されるコード生成部と
を備えることを特徴とするデータ処理装置。 - 前記論理レジスタ性質解析部は、前記実行プログラム中の各関数が存在するパスの実行頻度を解析し、
前記物理レジスタ割付部は、所定の関数呼び出しを越えて生存する前記変数であっても、当該変数が実行頻度の低いパスに存在する関数の呼び出しのみを越えて生存する場合には、当該変数を前記揮発性レジスタに割り付け、
前記コード生成部は、実行頻度の低いパスに存在する関数の呼び出しのみを越えて生存する前記変数に関して、レジスタに割り付けられた当該変数を関数呼び出しの前後で退避・復元するコードを付加することを特徴とする請求項5に記載のデータ処理装置。 - コンピュータを制御して、所定の実行プログラム中の変数に対してレジスタ割付を行うプログラムであって、
前記実行プログラム中の所定の変数が所定の関数呼び出しを越えて生存するか否かを判断し、かつ当該変数が関数呼び出しを越えて生存する場合に、当該関数呼び出しがコンパイラにて生成された関数の呼び出しか、当該コンパイラにて生成された関数以外の関数である外部関数の呼び出しかを判断する処理を、前記コンピュータのプログラム制御されたCPUにより実現される論理レジスタ性質解析手段に実行させ、
前記判断に基づいて、関数呼び出しを越えて生存しない前記変数を、関数呼び出しが行われるとレジスタ値が破壊される揮発性レジスタに割り付け、前記コンパイラにて生成された関数の呼び出しを越えて生存する前記変数を、関数呼び出しが行われてもレジスタ値が保存される不揮発性レジスタに割り付け、前記外部関数の呼び出しを越えて生存するが前記コンパイラにて生成された関数の呼び出しは越えない前記変数を、前記外部関数の呼び出しが行われてもレジスタ値が保存されるがコンパイラにて生成された関数の呼び出しが行われるとレジスタ値が破壊される準揮発性レジスタに割り付ける処理を、前記コンピュータのプログラム制御されたCPUにより実現される物理レジスタ割付手段に実行させることを特徴とするプログラム。 - 前記論理レジスタ性質解析手段に、前記実行プログラム中の各関数が存在するパスの実行頻度を解析する処理をさらに実行させ、
前記物理レジスタ割付手段に、所定の関数呼び出しを越えて生存する前記変数であっても、当該変数が実行頻度の低いパスに存在する関数の呼び出しのみを越えて生存する場合には、当該変数を前記揮発性レジスタに割り付ける処理をさらに実行させ、
前記コンピュータのプログラム制御されたCPUにより実現されるコード生成手段に、 実行頻度の低いパスに存在する関数の呼び出しのみを越えて生存する前記変数に関して、レジスタに割り付けられた当該変数を関数呼び出しの前後で退避・復元するコードを付加する処理をさらに実行させることを特徴とする請求項7に記載のプログラム。 - コンピュータを制御して、所定の実行プログラム中の変数に対してレジスタ割付を行うプログラムであって、
前記実行プログラム中の変数のうち、生存区間がコンパイラにて生成された関数を跨がず、かつ当該コンパイラにて生成された関数以外の関数である外部関数を跨ぐ変数を抽出する処理を、前記コンピュータのプログラム制御されたCPUにより実現される論理レジスタ性質解析手段に実行させ、
抽出された前記変数を前記外部関数の呼び出しが行われてもレジスタ値が保存されるが前記コンパイラにて生成された関数の呼び出しが行われるとレジスタ値が破壊される準揮発性レジスタに割り当てる処理を、前記コンピュータのプログラム制御されたCPUにより実現される物理レジスタ割付手段に実行させることを特徴とするプログラム。 - コンピュータを制御して、所定の実行プログラム中の変数に対してレジスタ割付を行うプログラムであって、
前記実行プログラム中の所定の変数を、
A群:生存区間がコンパイラにて生成された関数であって頻繁に実行される関数を跨ぐ変数と、
B群:生存区間が頻繁に実行される、前記コンパイラにて生成された関数以外の関数である外部関数を跨ぎ、かつ前記コンパイラにて生成された関数であって頻繁に実行される関数を跨がない変数と、
C群:その他の変数と
に分類する処理を、前記コンピュータのプログラム制御されたCPUにより実現される論理レジスタ性質解析手段に実行させ、
A群に分類された変数を関数呼び出しが行われてもレジスタ値が保存される不揮発性レジスタに割り当て、B群に分類された変数を前記外部関数の呼び出しが行われてもレジスタ値が保存されるが前記コンパイラにて生成された関数の呼び出しが行われるとレジスタ値が破壊される準揮発性レジスタに割り当て、C群に分類された変数を関数呼び出しが行われるとレジスタ値が破壊される揮発性レジスタに割り当てる処理を、前記コンピュータのプログラム制御されたCPUにより実現される物理レジスタ割付手段に実行させることを特徴とするプログラム。 - 前記プログラムは、コンピュータが前記実行プログラムを実行する際に動的(ダイナミック)にコンパイルを行うコンパイラであることを特徴とする請求項10に記載のプログラム。
Priority Applications (2)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2002051246A JP3871312B2 (ja) | 2002-02-27 | 2002-02-27 | プログラム変換方法、これを用いたデータ処理装置及びプログラム |
US10/375,761 US7219334B2 (en) | 2002-02-27 | 2003-02-26 | Program conversion method, data processing apparatus and program |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2002051246A JP3871312B2 (ja) | 2002-02-27 | 2002-02-27 | プログラム変換方法、これを用いたデータ処理装置及びプログラム |
Publications (2)
Publication Number | Publication Date |
---|---|
JP2003256215A JP2003256215A (ja) | 2003-09-10 |
JP3871312B2 true JP3871312B2 (ja) | 2007-01-24 |
Family
ID=28034791
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
JP2002051246A Expired - Fee Related JP3871312B2 (ja) | 2002-02-27 | 2002-02-27 | プログラム変換方法、これを用いたデータ処理装置及びプログラム |
Country Status (2)
Country | Link |
---|---|
US (1) | US7219334B2 (ja) |
JP (1) | JP3871312B2 (ja) |
Families Citing this family (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US7539983B2 (en) * | 2005-01-14 | 2009-05-26 | Microsoft Corporation | Tool for processing software programs using modified live-ness definition |
US8225295B2 (en) * | 2007-09-21 | 2012-07-17 | Jens Palsberg | Register allocation by puzzle solving |
JP5208589B2 (ja) * | 2008-06-13 | 2013-06-12 | Necシステムテクノロジー株式会社 | コンパイル装置、コンパイラ、コンパイル方法 |
US20100199270A1 (en) * | 2009-01-30 | 2010-08-05 | Ivan Baev | System, method, and computer-program product for scalable region-based register allocation in compilers |
JP2011141676A (ja) * | 2010-01-06 | 2011-07-21 | Toshiba Corp | 言語処理装置、言語処理方法およびコンピュータプログラムプロダクト |
US8832672B2 (en) * | 2011-01-28 | 2014-09-09 | International Business Machines Corporation | Ensuring register availability for dynamic binary optimization |
KR102492871B1 (ko) * | 2015-12-15 | 2023-01-30 | 삼성전자주식회사 | 사용자 단말장치, 서버, 및 그 어플리케이션 실행 방법 |
Family Cites Families (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US5428793A (en) * | 1989-11-13 | 1995-06-27 | Hewlett-Packard Company | Method and apparatus for compiling computer programs with interproceduural register allocation |
US20020166115A1 (en) * | 1999-06-10 | 2002-11-07 | A.V.S. Sastry | System and method for computer program compilation using scalar register promotion and static single assignment representation |
JP3641997B2 (ja) * | 2000-03-30 | 2005-04-27 | 日本電気株式会社 | プログラム変換装置及び方法並びに記録媒体 |
-
2002
- 2002-02-27 JP JP2002051246A patent/JP3871312B2/ja not_active Expired - Fee Related
-
2003
- 2003-02-26 US US10/375,761 patent/US7219334B2/en not_active Expired - Fee Related
Also Published As
Publication number | Publication date |
---|---|
US7219334B2 (en) | 2007-05-15 |
US20030177479A1 (en) | 2003-09-18 |
JP2003256215A (ja) | 2003-09-10 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
JP3220055B2 (ja) | 機械語命令列またはアセンブリ言語命令列を最適化する最適化装置、及び、高級言語で記載されたソースプログラムを機械語またはアセンブリ言語の命令列に変換するコンパイラ装置。 | |
US7725883B1 (en) | Program interpreter | |
CN1306399C (zh) | 用于网络处理器的虚拟机 | |
KR100302980B1 (ko) | 그래프컬러링레지스터할당기에대한지역문맥스필링을위한시스템 | |
US20050177821A1 (en) | Compiler, dynamic compiler, and replay compiler | |
US7386843B2 (en) | Method and system for register allocation | |
US7143402B2 (en) | Method and apparatus for precision optimization in compiled programs | |
US5890000A (en) | Cooperation of global and local register allocators for better handling of procedures | |
CN102099786A (zh) | 程序优化方法 | |
US8056061B2 (en) | Data processing device and method using predesignated register | |
US8266416B2 (en) | Dynamic reconfiguration supporting method, dynamic reconfiguration supporting apparatus, and dynamic reconfiguration system | |
JP3813087B2 (ja) | プログラム変換方法、コンピュータ装置及びプログラム | |
JP3871312B2 (ja) | プログラム変換方法、これを用いたデータ処理装置及びプログラム | |
JP2002366366A (ja) | コンパイル方法、コード生成方法、スタックレジスタ使用方法、コンパイラ、これらを実現するプログラム及び記憶媒体 | |
US20020062478A1 (en) | Compiler for compiling source programs in an object-oriented programming language | |
JP3790707B2 (ja) | プログラム変換方法、これを用いたコンピュータ装置及びプログラム | |
JP2005129001A (ja) | プログラム実行装置、マイクロプロセッサ及びプログラム実行方法 | |
US7240341B2 (en) | Global constant pool to allow deletion of constant pool entries | |
US6134708A (en) | Program compilation execution system | |
US20020073133A1 (en) | Register allocation method and software development method for various execution environments and LSI for executing developed software | |
KR20130077673A (ko) | 메소드 특수화를 이용한 확장된 널 포인터 검사 제거 방법 | |
JP3634712B2 (ja) | コンパイラ装置 | |
JPH0689187A (ja) | インライン展開最適化方法 | |
JPH11212807A (ja) | プログラム実行方法 | |
JP2001290652A (ja) | プログラム変換装置、プログラム変換方法及び記録媒体 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
A977 | Report on retrieval |
Free format text: JAPANESE INTERMEDIATE CODE: A971007 Effective date: 20060605 |
|
A131 | Notification of reasons for refusal |
Free format text: JAPANESE INTERMEDIATE CODE: A131 Effective date: 20060613 |
|
A521 | Request for written amendment filed |
Free format text: JAPANESE INTERMEDIATE CODE: A523 Effective date: 20060828 |
|
TRDD | Decision of grant or rejection written | ||
A01 | Written decision to grant a patent or to grant a registration (utility model) |
Free format text: JAPANESE INTERMEDIATE CODE: A01 Effective date: 20060926 |
|
RD14 | Notification of resignation of power of sub attorney |
Free format text: JAPANESE INTERMEDIATE CODE: A7434 Effective date: 20060929 |
|
A61 | First payment of annual fees (during grant procedure) |
Free format text: JAPANESE INTERMEDIATE CODE: A61 Effective date: 20061016 |
|
R150 | Certificate of patent or registration of utility model |
Free format text: JAPANESE INTERMEDIATE CODE: R150 |
|
FPAY | Renewal fee payment (event date is renewal date of database) |
Free format text: PAYMENT UNTIL: 20091027 Year of fee payment: 3 |
|
FPAY | Renewal fee payment (event date is renewal date of database) |
Free format text: PAYMENT UNTIL: 20101027 Year of fee payment: 4 |
|
FPAY | Renewal fee payment (event date is renewal date of database) |
Free format text: PAYMENT UNTIL: 20101027 Year of fee payment: 4 |
|
FPAY | Renewal fee payment (event date is renewal date of database) |
Free format text: PAYMENT UNTIL: 20111027 Year of fee payment: 5 |
|
LAPS | Cancellation because of no payment of annual fees |