JP3956112B2 - コンパイラ、レジスタ割当装置、プログラム、記録媒体、コンパイル方法、及びレジスタ割当方法 - Google Patents
コンパイラ、レジスタ割当装置、プログラム、記録媒体、コンパイル方法、及びレジスタ割当方法 Download PDFInfo
- Publication number
- JP3956112B2 JP3956112B2 JP2002171856A JP2002171856A JP3956112B2 JP 3956112 B2 JP3956112 B2 JP 3956112B2 JP 2002171856 A JP2002171856 A JP 2002171856A JP 2002171856 A JP2002171856 A JP 2002171856A JP 3956112 B2 JP3956112 B2 JP 3956112B2
- Authority
- JP
- Japan
- Prior art keywords
- allocation
- variable
- variables
- register
- order
- 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 58
- 238000003860 storage Methods 0.000 claims description 94
- 238000004458 analytical method Methods 0.000 claims description 28
- 238000012545 processing Methods 0.000 claims description 26
- 230000006870 function Effects 0.000 claims description 25
- 230000008569 process Effects 0.000 claims description 18
- 238000001514 detection method Methods 0.000 claims description 11
- 230000004083 survival effect Effects 0.000 claims description 11
- 238000012546 transfer Methods 0.000 claims description 4
- 230000003252 repetitive effect Effects 0.000 claims 1
- 238000010586 diagram Methods 0.000 description 18
- 238000005457 optimization Methods 0.000 description 15
- 238000004891 communication Methods 0.000 description 4
- 238000004040 coloring Methods 0.000 description 3
- 238000011946 reduction process Methods 0.000 description 3
- 230000008859 change Effects 0.000 description 2
- 238000005206 flow analysis Methods 0.000 description 2
- 238000006243 chemical reaction Methods 0.000 description 1
- 230000001419 dependent effect Effects 0.000 description 1
- 230000000694 effects Effects 0.000 description 1
- 230000014509 gene expression Effects 0.000 description 1
- 238000012986 modification Methods 0.000 description 1
- 230000004048 modification Effects 0.000 description 1
- 230000003287 optical effect Effects 0.000 description 1
- 230000002093 peripheral effect Effects 0.000 description 1
- 230000009467 reduction Effects 0.000 description 1
- 239000004065 semiconductor Substances 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】
【従来の技術】
米国特許第4571678号によると、複数の変数それぞれを、当該変数と同時に使われる変数とは異なるレジスタに割当てる変数間の割当順序を生成するレジスタ割当方法が提案されている。この割当順序に従い変数をレジスタに順次割当てることにより、変数の値をメモリへ退避及び復帰する回数を極小にできるので、メモリへのアクセス量を抑えることができる。
【0003】
【発明が解決しようとする課題】
しかしながら、上記方法によると、複数のレジスタそれぞれの性質が互いに異なるようなコンピュータにおいて、変数の用いられ方と、当該変数に割当てられるレジスタの性質とが適合せず、生成される命令列の実行速度を遅くしてしまう場合があった。
【0004】
そこで本発明は、上記の課題を解決することのできるコンパイラ、レジスタ割当装置、プログラム、記録媒体、コンパイル方法、及びレジスタ割当方法を提供することを目的とする。この目的は特許請求の範囲における独立項に記載の特徴の組み合わせにより達成される。また従属項は本発明の更なる有利な具体例を規定する。
【0005】
【課題を解決するための手段】
即ち、本発明の第1の形態によると、外部から入力を受けたソースプログラムを記憶装置に格納し、前記ソースプログラムにおいて変数に値が代入されてから当該値が最後に使われるまでの区間を示す生存区間をCPUの動作により解析する生存区間解析部と、生存区間の少なくとも一部が互いに重複する関係にある変数の組を示す情報を、干渉状態にあって同時に使われる複数の変数を示す情報として、解析された前記生存区間に基づいて前記CPUの動作により取得して記憶装置に格納する同時使用変数取得部と、前記複数の変数それぞれを当該変数と同時に使われる変数とは異なる前記レジスタに割当てるために、複数の変数をレジスタに順次割当てるべき順序を示す割当順序グラフを示すデータであって、少なくとも一組の変数間には順序が定められており、全体として変数間に順序の循環が無い関係である半順序関係を示すグラフデータを、干渉状態にあって同時に使われる複数の変数を示す前記情報に基づいて前記CPUの動作により生成して記憶装置に格納する割当順序生成部と、前記複数の変数のそれぞれを、複数の前記レジスタのうち何れのレジスタに優先して割当てるかを示す割当優先度を示す情報を前記CPUの動作により記憶装置から取得する割当優先度取得部と、前記グラフデータおよび前記割当優先度に基づき前記複数の変数を前記CPUの動作により前記レジスタに割当てるレジスタ割当部とを備え、前記レジスタ割当部は、前記グラフデータにおいて前記割当順序が最先の1個または2個以上の変数であって、2個以上の場合には互いの間のレジスタ割当の順序が定められていない変数である同時割当候補変数を示す情報を、前記CPUの動作により生成して前記記憶装置に格納する格納部と、前記少なくとも一つの同時割当候補変数のそれぞれについての前記割当優先度を前記記憶装置から読み出す割当選択部と、前記少なくとも一つの同時割当候補変数の中から特定した一の同時割当候補変数に対し、前記割当選択部により読み出された前記割当優先度に基づき前記CPUの動作により選択した前記レジスタを割当てる割当実行部と、前記レジスタに割当てられてなくかつ前記割当順序がより先の変数を有しない変数があると前記CPUの動作により判断した場合には、当該変数を示す情報を新たに前記格納部に格納させて、新たに格納された当該変数について前記割当選択部により前記の読み出しの処理をさせ、新たに前記格納部に格納させる情報がない場合にはレジスタ割当を終了する割当反復部とを有することを特徴とするレジスタ割当装置、レジスタ割当方法、当該レジスタ割当装置を実現するプログラム、当該プログラムを記録した記録媒体、当該レジスタ割当装置を備えるコンパイラ装置、当該コンパイラ装置のコンパイル方法、当該コンパイラを実現するプログラム、当該プログラムを記録した記録媒体を提供する。
【0006】
なお上記の発明の概要は、本発明の必要な特徴の全てを列挙したものではなく、これらの特徴群のサブコンビネーションも又発明となりうる。
【0007】
【発明の実施の形態】
以下、発明の実施の形態を通じて本発明を説明するが、以下の実施形態は特許請求の範囲にかかる発明を限定するものではなく、又実施形態の中で説明されている特徴の組み合わせの全てが発明の解決手段に必須であるとは限らない。
【0008】
図1は、コンパイラ10の機能ブロックの一例を示す図である。コンパイラ10は、メモリへのアクセス量を極小化しつつ、変数及びレジスタ間の嗜好性を生かしたレジスタ割当を行うことを目的とする。コンパイラ10は、最適化処理部100と、レジスタ割当装置200と、実行コード生成部900とを備える。
【0009】
最適化処理部100は、ソースプログラムを外部から受け取り、例えば、データフロー最適化や、関数やメソッドのインライニング等の、各種の最適化を行うことにより当該ソースプログラムを変換し、レジスタ割当装置200に送る。レジスタ割当装置200は、ソースプログラムを最適化処理部100から受け取ると、当該ソースプログラム中で用いられる変数を、プロセッサにより実行可能な命令列中のレジスタに割り当て、当該命令列を実行コード生成部900に送る。実行コード生成部900は、命令列をレジスタ割当装置200から受け取り、当該命令列をプロセッサにより実行可能なデータ形式に変換し、外部に出力する。ここで、ソースプログラムとは、例えば、Java(サン・マイクロシステムズ・インコーポレーテッドの登録商標)やC言語等の表層言語で記述されたプログラムである。また、ソースプログラムとは、表層言語に所定の変換を行った、Javaバイトコードや、RTL(Register Transfer Languageの略)等の中間表現(例えば、Intermediate Representation)であってもよい。また、ソースプログラムとは、これらの表現により記述されたプログラムの全体であってもよいし、当該プログラムの一部であって、特定の処理のみを行うモジュールやオブジェクトであってもよい。
【0010】
レジスタ割当装置200は、生存区間解析部210と、同時使用変数取得部220と、割当順序生成部230と、レジスタ割当可能性判断部240と、同一レジスタ割当検出部260と、ループ解析部270と、実行履歴情報取得部280と、割当優先度生成部290と、割当優先度取得部300と、レジスタ割当部310とを有する。
【0011】
生存区間解析部210は、最適化処理部100からソースプログラムを受け取ると、当該ソースプログラムを解析することにより、複数の変数を検出する。変数とは、例えば、ソースプログラム中の変数そのものである。また、変数とは、ソースプログラム中で、変数に値が代入されてから当該値が最後に使われるまでの区間を示す生存区間(Live Range)であってもよい。この場合、生存区間解析部210は、ソースプログラム中で用いられる各値の生存区間を、データフロー解析等の技術により解析してもよい。そして、生存区間解析部210は、ソースプログラム及び複数の変数の情報を同時使用変数取得部220に送る。
【0012】
同時使用変数取得部220は、生存区間解析部210又はレジスタ割当可能性判断部240から、ソースプログラム及び複数の変数の情報を受け取ると、複数の変数それぞれについて、当該変数と同時に使われる状態である干渉状態にある変数を、ソースプログラムを解析することにより取得する。例えば、同時使用変数取得部220は、複数の変数として、複数の値それぞれにつき、生存区間の少なくとも一部が重複する他の値を、干渉状態にある変数であると解析する。そして、同時使用変数取得部220は、干渉状態にある変数の情報及びソースプログラムを割当順序生成部230に送る。
【0013】
割当順序生成部230は、干渉グラフ生成部400と、第1選択部410と、第2選択部420と、順序決定部430とを有する。干渉グラフ生成部400は、干渉状態にある変数の情報を同時使用変数取得部220から受け取り、これらの変数を、変数をノードで表し、変数が干渉状態にある旨をエッジで表した干渉グラフ(Interference Graph)を作成する。そして、第1選択部410及び第2選択部420は、グラフカラーリング手法により、干渉グラフを簡約(Simplification)する。そして、順序決定部430は、干渉グラフの簡約により得られる情報に基づき、変数間のレジスタへの割当順序を半順序として生成し、レジスタ割当部310に送る。また、割当順序生成部230は、同時使用変数取得部220から受け取ったソースプログラムをレジスタ割当部310に送る。
【0014】
ここで、半順序とは、少なくとも一組の変数間に順序が定められ、全体として変数間に順序の循環がない順序を示す。なお、本実施形態において、割当順序生成部230は、レジスタの割当順序として半順序を生成したが、割当順序生成部230が生成する複数の割当順序は本例に限定されない。例えば、割当順序生成部230は、複数の全順序関係を割当順序として生成してもよいし、複数の全順序を包含する半順序を用いて複数の割当順序を表現してもよい。
【0015】
同一レジスタ割当検出部260は、最適化処理部100からソースプログラムを受け取り、当該ソースプログラムを解析することにより、複数の変数の組合せであって、これら複数の変数を同一のレジスタに割当てることにより命令列の実行速度を向上させる組合せを検出し、この変数の組合せの情報を割当優先度生成部290に送る。ループ解析部270は、最適化処理部100からソースプログラムを受け取り、当該ソースプログラムを解析することにより、繰り返し実行される部分であるループ部分を検出し、このループ部分の情報を割当優先度生成部290に送る。実行履歴情報取得部280は、ソースプログラムを予め実行した場合の実行履歴情報を最適化処理部100から取得し、割当優先度生成部290に送る。割当優先度生成部290は、変数の組合せの情報、ループ部分の情報、実行履歴情報、及びソースプログラムを、それぞれ、同一レジスタ割当検出部260、ループ解析部270、実行履歴情報取得部280、及び最適化処理部100から受け取り、これらの情報及びプログラムに基づき、複数の変数のそれぞれを、複数のレジスタのうち何れのレジスタに優先して割当てるかを示す割当優先度を生成する。そして、割当優先度生成部290は、割当優先度を割当優先度取得部300に送る。割当優先度取得部300は、割当優先度を割当優先度生成部290から取得し、レジスタ割当部310に送る。
【0016】
レジスタ割当部310は、格納部500と、割当選択部510と、割当実行部520と、割当反復部530とを有する。格納部500は、割当順序を割当順序生成部230から受け取り、当該割当順序が最先である少なくとも1つの同時割当候補変数を格納する。また、割当選択部510は、割当優先度取得部300から割当優先度を受け取る。そして、割当選択部510、割当実行部520及び割当反復部530は、割当順序及び割当優先度に基づき、必要に応じて格納部500を用いて、割当順序が先である変数から順次レジスタを割当てる。そして、レジスタ割当部310は、割当順序生成部230から受け取ったソースプログラムと伴に、レジスタを割当てた結果をレジスタ割当可能性判断部240に送る。
【0017】
レジスタ割当可能性判断部240は、レジスタ割当部310からレジスタを割当てた結果を受け取る。そして、レジスタ割当可能性判断部240は、複数の変数それぞれをレジスタに割当てられないと判断した場合に、複数の変数に所定の変更を行い、当該変更を行った複数の変数の情報と伴に、割当順序生成部230から受け取ったソースプログラムを同時使用変数取得部220に送る。
【0018】
このように、コンパイラ10は、レジスタの値のメモリへの退避及び復帰の量を極小にしつつ、ソースプログラム中における変数の用いられ方に基づいて、複数の変数をレジスタに割当てることができる。
【0019】
図2は、コンパイラ10の動作フローを示す。生存区間解析部210は、複数の変数における値の生存区間を解析する(S10)。同時使用変数取得部220は、ソースプログラム内で用いられる複数の変数それぞれにおいて、当該変数と干渉状態にある変数の情報を取得する(S20)。続いて、干渉グラフ生成部400は、この情報に基づき、干渉グラフを生成する。そして、割当順序生成部230は、複数の変数それぞれを、当該変数と干渉状態にある変数とは異なるレジスタに割当てる、複数の変数間の割当順序を半順序として生成する(S40)。例えば、割当順序生成部230は、複数の変数それぞれを、当該変数と干渉状態にある変数とは異なるレジスタに割当てるために、グラフカラーリング手法による彩色可能性を保証するような複数の変数間の割当順序を生成する。一方、割当優先度生成部290は、複数の変数のそれぞれを、複数のレジスタのうち何れのレジスタに優先して割当てるかを示す割当優先度を生成する(S50)。そして、レジスタ割当部310は、割当順序及び割当優先度に基づき複数の変数を複数のレジスタに割当てる(S60)。続いて、レジスタ割当可能性判断部240は、レジスタ割当部310が複数の変数それぞれを当該変数と干渉状態にある変数とは異なるレジスタに割当てていないと判断した場合(S70:NO)に、複数の変数のうち少なくとも一の変数をそれぞれ2以上の変数に分割することにより、複数の変数から新たな複数の変数を生成し(S80)、S20の処理に戻る。一方、レジスタ割当可能性判断部240は、レジスタ割当部310が複数の変数それぞれを当該変数と干渉状態にある変数とは異なるレジスタに割当てたと判断した場合(S70:YES)に、レジスタ割当を終了する。なお、レジスタ割当可能性判断部240は、複数の変数それぞれを当該変数と干渉状態にある変数とは異なるレジスタに割当てられるか否かを判断する方法として、S60の処理結果に基づき、レジスタの値をメモリに退避することを示すスピルの発生を判断する。また、他の例として、レジスタ割当可能性判断部240は、干渉グラフを簡約できるか否かを判断することによりレジスタ割当可能性を判断してもよい。
【0020】
図3は、S40の動作フローを示す図である。割当順序生成部230は、S40の動作に際して一時的に用いる記憶領域として、スタック型のデータ構造であるスタックAを準備する。第1選択部410は、レジスタの総数(以降の説明において、Nと呼称する)より小さい数の変数とのみ干渉状態にある変数をすべて選択し、これらの変数の識別情報を任意の順序でスタックAに順次プッシュする(S500)。割当順序生成部230は、ソースプログラム中の全ての変数をスタックAにプッシュすることを示す簡約処理が終了したか否かを判断する。割当順序生成部230が簡約処理を終了していないと判断した場合に(S510:NO)、第2選択部420は、既に選択された変数を除外し(S520)、この場合における残された変数に対してS500の処理を行う。
【0021】
一方、割当順序生成部230が簡約処理を終了したと判断した場合に(S510:YES)、順序決定部430は、スタックA内の識別情報を逆順に並び替える(S530)。続いて、順序決定部430は、Nより小さい数の変数とのみ干渉状態にある変数を選択し(S540)、これらの変数を、最も後ろの割当順序とする(S550)。続いて、割当順序生成部230は、以降の処理を繰り返し行う。
【0022】
順序決定部430は、スタックAが空になったと判断した場合(S560:YES)、生成された割当順序を出力して終了する。順序決定部430は、スタックAが空でないと判断した場合(S560:NO)、スタックAから識別情報を1つポップし(S570)、この識別情報に対応する変数と干渉状態にある少なくとも1つの変数を選択する(S580)。
【0023】
そして、順序決定部430は、選択した少なくとも1つの変数のうち、N以上の変数と干渉状態にある変数を特定し(S590)、この特定された変数の割当順序を、スタックAからポップした変数より先の割当順序とする(S600)。すなわち、順序決定部430は、スタックAからポップした変数を除外することにより、N−1以下の変数とのみ干渉状態となり得る変数を、スタックAからポップした変数より先の割当順序とする。
【0024】
続いて、順序決定部430は、割当順序の生成により生じた推移的な順序を削除する。すなわち、順序決定部430は、例えば、ソースプログラム中の複数の変数のうちの1つの変数である第1変数と、第1変数より割当順序が後である第2変数と、第2変数より割当順序が後である第3変数と、第3変数が第1変数より後である旨の割当順序とを検出した場合に、第3変数が第1変数より後である旨の割当順序を削除する(S610)。続いて、順序決定部430は、ポップした変数を除外した場合について、S560からの処理を繰り返し実行する(S610)。
【0025】
このように、順序決定部430は、スタックAを逆順にアクセスすることにより、第2選択部420が行った複数の変数の選択順を特定することができる。従って、順序決定部430は、第2選択部420の処理を複数の変数のそれぞれに適用する場合に、当該変数を、当該変数を除外することにより選択可能となる変数より後の割当順序とすることにより半順序を生成することができる。
【0026】
図4は、S50の動作フローを示す図である。割当優先度生成部290は、ソースプログラム中の、関数呼び出しの前及びこの関数呼び出しからの復帰後の双方の部分において、変数が使用されると判断した場合(S400:YES)に、この変数を関数内で用いられないレジスタに優先して割当てることを示すレジスタ嗜好性情報を生成する(S405)。関数内で用いられないレジスタとは、例えば、実行コードである命令列の関数呼び出し手続き(Calling Conventionと呼称される)において定められる、呼び出される関数に値の保存及び復帰を行うことが定められている不揮発性レジスタ(例えば、non―volatile registerや、callee−saved registerと呼称される)である。
【0027】
続いて、割当優先度生成部290は、変数が関数間の値の引渡しに用いられると判断した場合(S410:YES)に、関数呼び出し手続きにおいて定められる引数レジスタ又は戻り値レジスタに、当該変数を優先して割当てることを示すレジスタ嗜好性情報を生成する(S420)。
【0028】
一方、実行履歴情報取得部280は、ソースプログラムが示す処理を予め実行した場合に得られる実行履歴情報を最適化処理部100から取得し、ループ解析部270は、ソースプログラムにおいて、繰り返し実行されるループ部分を解析する。そして、割当優先度生成部290は、実行履歴情報又はループ部分の情報に基づき、変数が頻繁に用いられると判断した場合に(S430:YES)、当該変数を他の部分のみで用いられる変数より優先してレジスタに割当てる旨のレジスタ嗜好性情報を生成する(S440)。
【0029】
また、コンパイラ10は、ソースプログラムを、ペアードロード及びペアードストア(例えば、LDD、STDとシンボル化される命令)等の、アドレスの連続するメモリとの間でデータを転送するメモリアクセス命令を有する命令列に変換する場合に、下記の処理を行う。割当優先度生成部290は、ソースプログラム内においてアドレスの連続するメモリとの間でデータを転送する複数の変数を検出した場合(S450:YES)に、これらの複数の変数を、組合せメモリアクセス命令を適用可能な複数のレジスタに優先して割当てる変数関連性情報を生成する(S460)。
【0030】
続いて、同一レジスタ割当検出部260は、同一のレジスタに割当てた場合に命令列の実行速度が向上する変数の組合せを検出した場合(S470:YES)に、この組合せ中の変数を同一のレジスタに優先して割当てる旨の変数関連性情報を生成する(S480)。例えば、同一レジスタ割当検出部260は、ソースプログラム中のある変数から他の変数への代入文を検出すると、このある変数及び他の変数を、同一のレジスタに割当てた場合に命令列の実行速度が向上する変数の組合せとする。すなわち、これらの変数が同一のレジスタに割当てられた場合に、同一レジスタ割当検出部260は、他の最適化処理に、代入文自体を削除する可能性を提供することができる。
【0031】
このように、割当優先度生成部290は、同一レジスタ割当検出部260、ループ解析部270、及び実行履歴情報取得部280を用いて、複数の変数のそれぞれを、複数のレジスタのうち何れのレジスタに優先して割当てるかを示す割当優先度を生成することができる。
【0032】
図5は、S55の動作フローを示す図である。割当優先度生成部290は、割当優先度情報を示すデータ構造の一例として、レジスタ嗜好性及び変数関連性を示すグラフを作成してもよい。例えば、割当優先度生成部290は、グラフにおけるノードが変数及びレジスタの種類を表し、エッジが割当優先度情報を表すグラフを以下に示す動作により作成する。割当優先度生成部290は、まず、複数の変数のうち1つの変数を選択する(S800)。割当優先度生成部290は、選択した変数が、何れかのレジスタ又は変数に対して、割当優先度情報を持つと判断した場合に(S810:YES)、割当優先度生成部290は、この選択した変数を、割当優先度情報の対象となるノード、すなわち変数又はレジスタとエッジで接続し(S820)、このエッジに、割当優先度の高さを示す数値を対応付けて設定することにより、このエッジを重み付けする(S830)。割当優先度生成部290は、この重み付けを終えた場合、若しくは選択した変数が何れかのレジスタ又は変数に対して割当優先度情報を持たないと判断した場合に(S810:NO)、複数の変数全てについて選択及び割当優先度の設定を終了したか否かを判断する(S840)。割当優先度生成部290は、複数の変数全てについて選択及び割当優先度の設定を終了したと判断した場合に(S840:YES)、S800に戻り、そうでない場合に(S840:NO)、処理を終了する。このように、割当優先度生成部290は、割当優先度情報をグラフで示すことにより、割当優先度情報を利便に参照させることができる。
【0033】
図6は、S60の動作フローを示す図である。格納部500は、割当順序を参照することにより、割当順序が最も先の少なくとも1つの同時割当候補変数を特定し、この変数の識別情報を格納する(S700)。割当反復部530は、格納部500が空であると判断した場合に(S710:YES)、レジスタ割当を終了する。割当反復部530により格納部500が空でないと判断された場合に(S710:NO)、割当選択部510は、格納部500から1つの識別情報を選択し(S720)、格納部500から削除し、この識別情報に対応する同時割当候補変数(例えば、変数Vとする)の全ての割当優先度の情報を割当優先度取得部300から取得する(S730)。
【0034】
割当選択部510は、取得した割当優先度の情報から、変数Vと干渉状態にある全ての変数に既に割当てられているレジスタと、変数Vとの間のレジスタ嗜好性情報を削除する(S740)。続いて、割当選択部510は、変数Vとの変数関連性情報を有する全ての変数のうち、既にレジスタに割当てられていない変数に対する変数関連性情報を、取得した割当優先度の情報から削除する(S750)。以上のように変更した割当優先度の情報に基づき、割当実行部520は、最大の割当優先度及び最小の割当優先度の差を算出し、変数Vを識別する情報と対応付けて一時的に格納しておく(S760)。続いて、割当実行部520は、格納部500内の全ての変数に、上記S720からS760を処理していないと判断した場合に、S720に戻り処理を継続する。
【0035】
割当実行部520は、格納部500内の全ての変数に、上記S720からS760を処理したと判断した場合に(S770:YES)格納部500内の変数の中に、レジスタ割当可能な変数があるか否かを判断する(S775)。割当実行部520は、レジスタ割当可能な変数がないと判断した場合に(S775:NO)、レジスタの値をメモリに退避することを示すスピルが発生した旨の情報をレジスタ割当可能性判断部240に送り、処理を終了する(S778)。一方、割当実行部520は、レジスタ割当可能な変数があると判断した場合に(S775:YES)、一時的に格納されている、最大の割当優先度及び最小の割当優先度の差が最大である変数を特定し、当該変数を、最大の割当優先度に対応するレジスタに割当てる(S780)。続いて、格納部500中の同時割当候補変数より割当順序が低い変数のうち、レジスタに割当てられてなくかつ割当順序がより先の変数を有しない変数を、新たに格納部500に格納し(S790)、S710に戻る。
このように、レジスタ割当部310は、レジスタ割当の半順序を保ちつつ、割当優先度に基づき当該半順序を位相整列(例えば、topological sortと呼称される)することにより選択した一の割当順序に従い、複数の変数をレジスタに割当てることができる。
【0036】
図7は、コンパイラ10がコンパイルするソースプログラムの一例を示す図である。
【0037】
図7(a)が示すソースプログラムは、第1文910から第10文995を有する。第1文910、第2文920、第3文930、第4文940、第5文950、第6文960、及び第8文980は、それぞれ、変数v0にメモリ中のアドレスarg0の内容を代入する、変数v1にメモリ中のアドレスv0の内容を代入する、変数v2にメモリ中のアドレスv0+4の内容を代入する、変数v3に変数v0の内容を代入する、変数v4に変数v1と変数v2の和を代入する、変数arg0に変数v3の内容を代入する、変数v0に変数v4に1を加えた値を代入することを示す。第7文970は、所定の関数を呼び出し、当該関数の処理を終了した後に、第8文980からの処理を継続することを示す。第9文990は、変数v0と0とを比較し、等しくない場合に第2文920に処理を移すことを示す。第10文995は、図7(a)に示すソースプログラムの実行を終了することを示す。
【0038】
図7(b)は、複数の変数の生存区間を示す。生存区間解析部210は、図7(a)に示すソースプログラムを、データフロー解析等の技術を用いることにより、図7(b)に示す生存区間を生成する。第1生存区間810は、変数v0の値が第2文920で代入され、第4文940で最後に用いられることを、第2文920から第4文940に至る線分で示す。第2生存区間820は、変数v1の値が第2文920で代入され、第5文950で最後に用いられることを、第2文920から第5文950に至る線分で示す。第3生存区間830は、変数v2の値が第3文930で代入され、第5文950で最後に用いられることを、第3文930から第5文950に至る線分で示す。第4生存区間840は、変数v3の値が第4文940で代入され、第6文960で最後に用いられることを、第4文940から第6文960に至る線分で示す。
【0039】
第5生存区間850は、変数v4の値が第5文950文で代入され、第8文980で最後に用いられることを、第5文950から第8文980に至る線分で示す。第6生存区間860は、変数arg0の値が第1文910で用いられることを、第1文910付近の線分で示す。第7生存区間870は、変数arg0の値が第6文960で代入され、第7文970で最後に用いられることを、第6文960から第7文970に至る線分で示す。第8生存区間880は、変数v0の値が第2文920で代入され、第4文940で最後に用いられることを、第2文920から第4文940に至る線分で示す。
【0040】
図7(c)は、ソースプログラム内で用いられる複数の変数それぞれにおける、当該変数と同時に使われる状態である干渉状態にある変数の情報を示す干渉グラフの一例を示す。同時使用変数取得部220は、図7(b)に示す生存区間を用いて、図7(c)にグラフとして示す情報を生成する。v0〜v4、及びarg0と記されたノードは、それぞれ記された名称の変数を表す。複数のノードを接続するエッジは、それらのノードが示す変数が互いに干渉状態にあることを示す。例えば、変数v0は、変数v1及び変数v2と互いに干渉状態にある。変数v1は変数v2と互いに干渉状態にある。変数v3は、変数v1、変数v2、及び変数v4と互いに干渉状態にある。変数v4は、変数arg0と互いに干渉状態にある。
【0041】
このように、ソースプログラムを解析することにより、生存区間解析部210は、生存区間を算出し、同時使用変数取得部220は、同時使用変数を特定することができる。
【0042】
図8は、割当順序生成部230が生成する割当順序の一例を示す図である。図8(a)は、割当順序生成部230が、図7(c)で示した干渉状態を示すグラフに、図3のS500〜S520(本図ではレジスタ数Nは3である)で示した処理を行った結果を示す。すなわち、割当順序生成部230は、スタック型のデータ構造であるスタックAの、底から順に、変数v0、変数v4、変数v1、変数v2、及び変数v3を格納する。
【0043】
図8(b)は、図8(a)に基づき、割当順序生成部230が、図3のS530からS610の処理を行った結果生成した割当順序を示す。図8(b)において、最先の割当順序の変数を示すノードは、「トップ」と記されたノードと、当該ノードから最先の割当順序の変数への有向エッジで接続されている。例えば、変数v1、変数v2、及び変数v3を示すノードは、「トップ」と記されたノードと接続されている。そして、変数v1及び変数v2を示すノードは、それぞれ、変数v0を示すノードと、変数v1及び変数v2それぞれから変数v0への有向エッジで接続されている。また、変数v3を示すノードは、変数v4を示すノードと、変数v3から変数v4への有向エッジで接続されている。そして、割当順序が最も後である変数v0及び変数v4は、それぞれ、「ボトム」と記されたノードと、変数v0及び変数v4から「ボトム」と記されたノードへの有向エッジで接続されている。上記有向エッジは、それぞれ、有向エッジの接続元のノードに対応する変数を、当該有向きエッジの接続際のノードに対応する変数より先にレジスタに割当てる割当順序を示す。
このように、割当順序生成部230は、ソースプログラムの解析結果に基づき、割当順序を生成することができる。
【0044】
図9は、レジスタ割当部310が生成する割当優先度及びコンパイラ10が生成する命令列の一例を示す図である。図9(a)は、レジスタ割当部310が生成する割当優先度をグラフで示す。変数v0〜v4と記されたノードは、それぞれ記された名称の変数を示す。「揮発性レジスタ」と記されたノードは、レジスタの種類としての揮発性レジスタを示す。同様に、「不揮発性レジスタ」と記されたノードは、レジスタの種類として、揮発性レジスタでない不揮発性レジスタを示す。arg0と記されたノードは、レジスタの種類として関数間の値の受渡しに用いられるレジスタを示す。本図に示した各変数は、図7(a)に示した同一の名称のレジスタにそれぞれ対応する。また、関数呼び出し手続きにより関数間の値の受渡しにレジスタr1を用いることが予め定められているので、変数arg0は、既にレジスタr1に割当てられているものとする。各ノード間を接続するエッジは、割当優先度を示す。例えば、変数v0と「揮発性レジスタ」を示すノードとの間のエッジは、レジスタ嗜好性情報を示し、割当優先度が91であることを示す。また、変数v1とv2とを示すノードを接続するエッジは、変数関連性情報を示し、変数v2が変数v1に隣接するレジスタに割当てる場合の割当優先度が、50又は48であることを示している。より具体的には、変数v1が既に不揮発性レジスタに割当てられている場合に、変数v2を変数v1の次のレジスタに割当てる場合の割当優先度は、48である。一方、変数v1が既に揮発性レジスタに割当てられている場合に、変数v2を変数v1の次のレジスタに割当てる場合の割当優先度は、50である。同様に、変数v3を変数v0と同一のレジスタに割当てる場合の割当優先度は、40又は38である。
なお、上記の割当優先度は、図4及び図5に示した動作により生成される。例えば、変数v4は、関数呼び出しの前後の双方の部分で用いられるので、揮発性レジスタより、不揮発性レジスタにより優先して割当てられる(例えば、不揮発性レジスタへの割当優先度が28、揮発性レジスタへの割当優先度が0)。
このように、割当優先度生成部290は、変数と、レジスタの種類との間の割当優先度を、変数及びレジスタの組合せ毎に生成する。従って、レジスタ割当部310は、変数と、引数レジスタや揮発性レジスタ等のレジスタの種類との間の割当優先度に応じて、変数をレジスタに割当てることができる。
【0045】
図9(b)は、図9(a)及び図8(b)に基づき、レジスタ割当部310が変数をレジスタに割当てた結果を示す。レジスタ割当部310は、変数v0、変数v1、変数v2、変数v3、変数v4、及び変数arg0を、それぞれレジスタr1、レジスタr2、レジスタr3、レジスタr1、レジスタr3、及びレジスタr1に割当てる。従って、レジスタ割当部310は、複数の変数それぞれを、当該変数と同時に使われる変数とは異なるレジスタに割当てることができる。このように、レジスタ割当装置200は、レジスタ割当の順序を保ちつつ、割当優先度に基づき、変数をレジスタに割当てるので、高速に実行される命令列を生成することができる。
【0046】
図10は、コンパイラ10を動作させるコンピュータのハードウェア構成の一例を示す。本実施形態に係るコンパイラ10を動作させるコンピュータは、ホストコントローラ1082により相互に接続されるCPU1000、RAM1020、グラフィックコントローラ1075、及び表示装置1080を有するCPU周辺部と、入出力コントローラ1084によりホストコントローラ1082に接続される通信インターフェイス1030、ハードディスクドライブ1040、及びCD−ROMドライブ1060を有する入出力部と、入出力コントローラ1084に接続されるROM1010、フロッピーディスクドライブ1050、及び入出力チップ1070を有するレガシー入出力部とを備える。
【0047】
ホストコントローラ1082は、RAM1020と、高い転送レートでRAM1020をアクセスするCPU1000及びグラフィックコントローラ1075とを接続する。CPU1000は、ROM1010及びRAM1020に格納されたプログラムに基づいて動作し、各部の制御を行う。グラフィックコントローラ1075は、CPU1000等がRAM1020内に設けたフレームバッファ上に生成する画像データを取得し、表示装置1080上に表示させる。これに代えて、グラフィックコントローラ1075は、CPU1000等が生成する画像データを格納するフレームバッファを、内部に含んでもよい。
【0048】
入出力コントローラ1084は、ホストコントローラ1082と、比較的高速な入出力装置である通信インターフェイス1030、ハードディスクドライブ1040、及びCD−ROMドライブ1060を接続する。通信インターフェイス1030は、ネットワークを介して他の装置と通信する。ハードディスクドライブ1040は、コンパイラ10が使用するプログラム及びデータを格納する。CD−ROMドライブ1060は、CD−ROM1095からプログラム又はデータを読み取り、RAM1020を介して入出力チップ1070に提供する。
【0049】
また、入出力コントローラ1084には、ROM1010と、フロッピーディスクドライブ1050や入出力チップ1070等の比較的低速な入出力装置とが接続される。ROM1010は、コンパイラ10の起動時にCPU1000が実行するブートプログラムや、パーソナルコンピュータ本体110のハードウェアに依存するプログラム等を格納する。フロッピーディスクドライブ1050は、フロッピーディスク1090からプログラム又はデータを読み取り、RAM1020を介して入出力チップ1070に提供する。入出力チップ1070は、フロッピーディスク1090や、例えばパラレルポート、シリアルポート、キーボードポート、マウスポート等を介して各種の入出力装置を接続する。
【0050】
コンパイラ10を実現するプログラムは、各種最適化処理モジュールと、レジスタ割当プログラムと、生存区間解析モジュールと、同時使用変数取得モジュールと、割当順序生成モジュールと、レジスタ割当可能性判断モジュールと、同一レジスタ割当モジュールと、ループ解析モジュールと、実行履歴情報取得モジュールと、割当優先度生成モジュールと、割当優先度取得モジュールと、干渉グラフ生成モジュールと、第1選択モジュールと、第2選択モジュールと、順序決定モジュールと、格納モジュールと、割当選択モジュールと、割当実行モジュールと、割当反復モジュールと、実行コード生成モジュールとを備える。これらのモジュールは、コンパイラ10を、最適化処理部100、レジスタ割当装置200、生存区間解析部210、同時使用変数取得部220、割当順序生成部230、レジスタ割当可能性判断部240、同一レジスタ割当検出部260、ループ解析部270、実行履歴情報取得部280、割当優先度生成部290、割当優先度取得部300、レジスタ割当部310、干渉グラフ生成部400、第1選択部410、第2選択部420、順序決定部430、格納部500、割当選択部510、割当実行部520、及び割当反復部530として動作させるプログラムである。
【0051】
コンパイラ10に提供されるプログラムは、フロッピーディスク1090、CD−ROM1095、又はICカード等の記録媒体に格納されて利用者によって提供される。このプログラムは、記録媒体から読み出され、入出力チップ1070を介して記憶システム200及びバックアップ装置300にインストールされ、記憶システム200及びバックアップ装置300において実行される。これに代えて、記憶システム200及びバックアップ装置300のそれぞれは、更にフロッピーディスクドライブ、CD−ROMドライブ、又はICカードリーダ等を備え、当該プログラムを記録媒体から直接読み出して実行してもよい。
【0052】
以上に示したプログラム又はモジュールは、外部の記憶媒体に格納されてもよい。記憶媒体としては、フロッピーディスク1090、CD−ROM1095の他に、DVDやPD等の光学記録媒体、MD等の光磁気記録媒体、テープ媒体、ICカード等の半導体メモリ等を用いることができる。また、専用通信ネットワークやインターネットに接続されたサーバシステムに設けたハードディスク又はRAM等の記憶装置を記録媒体として使用し、ネットワークを介してプログラムをコンパイラ10に提供してもよい。
【0053】
以上の説明から明らかなように、コンパイラ10は、レジスタの退避及び復帰回数を軽減し、かつ変数を適切なレジスタに割当てることができ、生成される命令列の実行速度を向上することができる。
【0054】
以上、本発明を実施形態を用いて説明したが、本発明の技術的範囲は上記実施形態に記載の範囲には限定されない。上記実施形態に、多様な変更または改良を加えることができる。そのような変更または改良を加えた形態も本発明の技術的範囲に含まれ得ることが、特許請求の範囲の記載から明らかである。
【0055】
以上に説明した実施形態によれば、以下の各項目に示すコンパイラ、レジスタ割当装置、プログラム、記録媒体、コンパイル方法、及びレジスタ割当方法が実現される。
【0056】
(項目1) ソースプログラムをプロセッサの命令列に変換するコンパイラであって、前記ソースプログラム内で用いられる複数の変数それぞれにおいて、当該変数と同時に使われる変数を取得する同時使用変数取得部と、前記複数の変数それぞれを、当該変数と同時に使われる変数とは異なるレジスタに割当てる、前記複数の変数間の割当順序を複数生成する割当順序生成部と、前記複数の変数のそれぞれを、複数の前記レジスタのうち何れのレジスタに優先して割当てるかを示す割当優先度を取得する割当優先度取得部と、複数の前記割当順序のうち前記割当優先度に基づき選択した一の前記割当順序に従い、前記複数の変数を前記レジスタに割当てるレジスタ割当部とを備えることを特徴とするコンパイラ。
【0057】
(項目2) 前記割当順序生成部は、前記複数の変数それぞれを、当該変数と同時に使われる変数とは異なる前記レジスタに割当てる、前記複数の変数間の半順序を生成し、前記レジスタ割当部は、前記半順序を保ちつつ前記割当優先度に基づき選択した前記一の割当順序に従い、前記複数の変数を前記レジスタに割当てることを特徴とする請求項1記載のコンパイラ。
(項目3) 前記割当順序生成部は、前記レジスタの総数より小さい数の変数とのみ同時に使われる変数を選択する第1選択部と、既に選択された変数を除外した場合における残された変数のうち、前記レジスタの総数より小さい数の変数とのみ同時に使われる変数を選択する第2選択部と、前記第2選択部の処理を前記複数の変数のそれぞれに適用する場合に、当該変数を、当該変数を除外することにより選択可能となる変数より後の前記割当順序とすることにより前記半順序を生成する順序決定部とを有することを特徴とする請求項2記載のコンパイラ。
(項目4) 前記レジスタ割当部が前記複数の変数それぞれを当該変数と同時に使われる変数とは異なる前記レジスタに割当てられないと判断した場合に、前記複数の変数のうち少なくとも一の前記変数をそれぞれ2以上の変数に分割することにより、前記複数の変数から新たな複数の変数を生成し、当該新たな複数の変数に対して、前記同時使用変数取得部、前記割当順序生成部、及び前記レジスタ割当部による処理を繰り返し実行させるレジスタ割当可能性判断部をさらに備えることを特徴とする請求項2記載のコンパイラ。
【0058】
(項目5) 前記レジスタ割当部は、前記半順序において前記割当順序が最先である少なくとも1つの同時割当候補変数を格納する格納部と、前記少なくとも一つの同時割当候補変数のうち、前記割当優先度に基づき一の前記同時割当候補変数を選択する割当選択部と、前記一の同時割当候補変数を前記格納部から取り除き、前記割当優先度に基づき選択した前記レジスタに割当てる割当実行部と、前記一の同時割当候補変数より前記割当順序が低い変数のうち、前記レジスタに割当てられてなくかつ前記割当順序がより先の変数を有しない変数を、新たに前記格納部に格納し、前記格納部が空になるまで前記割当実行部による処理を繰り返し実行させる割当反復部とを有することを特徴とする請求項2記載のコンパイラ。
(項目6) 前記割当実行部は、前記少なくとも一つの同時割当候補変数のうち、前記一の同時割当候補変数として、同時に使われる前記変数に既に割当てられていないレジスタとの割当優先度につき、最大の前記割当優先度及び最小の前記割当優先度との差が最大の変数を選択し、前記最大の割当優先度に対応するレジスタに割当てることを特徴とする請求項5記載のコンパイラ。
【0059】
(項目7) 前記割当優先度として、前記複数の変数それぞれにおいて、前記ソースプログラム内における当該変数の用いられ方に基づいて、当該変数を何れの種類のレジスタに割当てるべきかを示すレジスタ嗜好性情報及び当該変数と他の変数との間にある前記ソースプログラム上における関連性を示す情報である変数関連性情報のうち、少なくとも1方の情報を、前記複数の変数毎の前記複数のレジスタそれぞれへの割当優先度として生成する割当優先度生成部を更に備えることを特徴とする請求項1記載のコンパイラ。
(項目8) ソースプログラムをプロセッサの命令列に変換するコンパイラであって、前記ソースプログラム内で用いられる複数の変数それぞれにおいて、前記ソースプログラム内における当該変数の用いられ方に基づいて、当該変数を何れの種類のレジスタに割当てるべきかを示すレジスタ嗜好性情報及び当該変数と他の変数との間にある前記ソースプログラム上における関連性を示す情報である変数関連性情報のうち、少なくとも一方の情報を、前記複数の変数毎の前記複数のレジスタそれぞれへの割当優先度として生成する割当優先度生成部と、前記割当優先度に基づき、前記複数の変数を複数の前記レジスタに割当てるレジスタ割当部とを備えることを特徴とするコンパイラ。
【0060】
(項目9) 前記レジスタ割当部は、前記複数の変数のうち、最大の前記割当優先度及び最小の前記割当優先度との差が最大の変数をより優先して前記レジスタに割当てることを特徴とする請求項8記載のコンパイラ。
(項目10) 前記割当優先度生成部は、関数呼び出しの前及び前記関数呼び出しからの復帰後の双方の部分において、前記変数が使用されると判断した場合に、当該変数を前記関数内で用いられないレジスタに優先して割当てることを示すレジスタ嗜好性情報を生成することを特徴とする請求項8記載のコンパイラ。
(項目11) 前記割当優先度生成部は、前記変数が関数間の値の引渡しに用いられると判断した場合に、前記命令列の関数呼び出し手続きにおいて定められる引数レジスタ又は戻り値レジスタに、当該変数を優先して割当てることを示すレジスタ嗜好性情報を生成することを特徴とする請求項8記載のコンパイラ。
(項目12) 前記ソースプログラムが示す処理を予め実行した場合に得られる実行履歴情報を取得する実行履歴情報取得部を更に備え、前記割当優先度生成部は、前記実行履歴情報に基づき、前記ソースプログラムのうちより高い頻度で実行される部分に用いられる変数が、他の部分のみで用いられる変数より優先してレジスタに割当てられることを示すレジスタ嗜好性情報を生成することを特徴とする請求項8記載のコンパイラ。
【0061】
(項目13) 前記ソースプログラムにおいて、繰り返し実行されるループ部分を解析するループ解析部を更に備え、前記割当優先度生成部は、前記ループ部分において用いられる変数が、前記ループ部分以外の部分において用いられる変数より優先して前記レジスタに割当てられることを示すレジスタ嗜好性情報を生成することを特徴とする請求項8記載のコンパイラ。
(項目14) 当該コンパイラは、前記ソースプログラムを、複数の前記レジスタと、アドレスの連続するメモリとの間でデータを転送するメモリアクセス命令を有する前記命令列に変換し、前記割当優先度生成部は、前記ソースプログラム内においてアドレスの連続するメモリとの間でデータを転送する複数の変数を、前記組合せメモリアクセス命令を適用可能な複数のレジスタに優先して割当てる変数関連性情報を生成することを特徴とする請求項8記載のコンパイラ。
(項目15) 前記複数の変数のうち、同一のレジスタに割当てた場合に前記命令列の実行速度が向上する変数の組合せを検出する同一レジスタ割当検出部を更に備え、前記割当優先度生成部は、同一レジスタ割当検出部により検出された前記変数の組合せ中の変数を、同一のレジスタに割当てる変数関連性情報を生成することを特徴とする請求項8記載のコンパイラ。
(項目16) コンピュータを、請求項1から請求項15の何れかに記載したコンパイラとして動作させるプログラム。
【0062】
(項目17) ソースプログラムで用いられる複数の変数を、プロセッサの命令列中で用いられるレジスタに割当てるレジスタ割当装置であって、前記複数の変数それぞれにおいて、当該変数と同時に使われる変数を取得する同時使用変数取得部と、前記複数の変数それぞれを、当該変数と同時に使われる変数とは異なる前記レジスタに割当てる、前記複数の変数間の割当順序を複数生成する割当順序生成部と、前記複数の変数のそれぞれを、複数の前記レジスタのうち何れのレジスタに優先して割当てるかを示す割当優先度を取得する割当優先度取得部と、複数の前記割当順序のうち前記割当優先度に基づき選択した一の前記割当順序に従い、前記複数の変数を前記レジスタに割当てるレジスタ割当部とを備えることを特徴とするレジスタ割当装置。
(項目18) ソースプログラム内で用いられる複数の変数を、プロセッサの命令列中で用いられるレジスタに変換するレジスタ割当装置であって、前記複数の変数それぞれにおいて、前記ソースプログラム内における当該変数の用いられ方に基づいて、当該変数を何れの種類の前記レジスタに割当てるべきかを示すレジスタ嗜好性情報及び当該変数と他の変数との間にある前記ソースプログラム上における関連性を示す情報である変数関連性情報のうち、少なくとも一方の情報を、前記複数の変数毎の前記複数のレジスタそれぞれへの割当優先度として生成する割当優先度生成部と、前記割当優先度に基づき、前記複数の変数を複数の前記レジスタに割当てるレジスタ割当部とを備えることを特徴とするレジスタ割当装置。
(項目19) 請求項17又は請求項18に記載のレジスタ割当装置をコンピュータにより実現するプログラム。
【0063】
(項目20) コンピュータを、ソースプログラムをプロセッサの命令列に変換するコンパイラとして動作させるプログラムを記録した記録媒体であって、前記プログラムは、前記ソースプログラム内で用いられる複数の変数それぞれにおいて、当該変数と同時に使われる変数を取得する同時使用変数取得部と、前記複数の変数それぞれを、当該変数と同時に使われる変数とは異なるレジスタに割当てる、前記複数の変数間の割当順序を複数生成する割当順序生成部と、前記複数の変数のそれぞれを、複数の前記レジスタのうち何れのレジスタに優先して割当てるかを示す割当優先度を取得する割当優先度取得部と、複数の前記割当順序のうち前記割当優先度に基づき選択した一の前記割当順序に従い、前記複数の変数を前記レジスタに割当てるレジスタ割当部とを備えることを特徴とする記録媒体。
(項目21) コンピュータを、ソースプログラムをプロセッサの命令列に変換するコンパイラとして動作させるプログラムを記録した記録媒体であって、前記プログラムは、前記ソースプログラム内で用いられる複数の変数それぞれにおいて、前記ソースプログラム内における当該変数の用いられ方に基づいて、当該変数を何れの種類のレジスタに割当てるべきかを示すレジスタ嗜好性情報及び当該変数と他の変数との間にある前記ソースプログラム上における関連性を示す情報である変数関連性情報のうち、少なくとも一方の情報を、前記複数の変数毎の前記複数のレジスタそれぞれへの割当優先度として生成する割当優先度生成部と、前記割当優先度に基づき、前記複数の変数を複数の前記レジスタに割当てるレジスタ割当部とを備えることを特徴とする記録媒体。
【0064】
(項目22) コンピュータを、ソースプログラムで用いられる複数の変数をプロセッサの命令列中で用いられるレジスタに割当てるレジスタ割当装置として動作させるプログラムを記録した記録媒体であって、前記プログラムは、前記複数の変数それぞれにおいて、当該変数と同時に使われる変数を取得する同時使用変数取得部と、前記複数の変数それぞれを、当該変数と同時に使われる変数とは異なる前記レジスタに割当てる、前記複数の変数間の割当順序を複数生成する割当順序生成部と、前記複数の変数のそれぞれを、複数の前記レジスタのうち何れのレジスタに優先して割当てるかを示す割当優先度を取得する割当優先度取得部と、複数の前記割当順序のうち前記割当優先度に基づき選択した一の前記割当順序に従い、前記複数の変数を前記レジスタに割当てるレジスタ割当部とを備えることを特徴とする記録媒体。
(項目23) コンピュータを、ソースプログラムで用いられる複数の変数をプロセッサの命令列中で用いられるレジスタに割当てるレジスタ割当装置として動作させるプログラムを記録した記録媒体であって、前記プログラムは、前記複数の変数それぞれにおいて、前記ソースプログラム内における当該変数の用いられ方に基づいて、当該変数を何れの種類の前記レジスタに割当てるべきかを示すレジスタ嗜好性情報及び当該変数と他の変数との間にある前記ソースプログラム上における関連性を示す情報である変数関連性情報のうち、少なくとも一方の情報を、前記複数の変数毎の前記複数のレジスタそれぞれへの割当優先度として生成する割当優先度生成部と、前記割当優先度に基づき、前記複数の変数を複数の前記レジスタに割当てるレジスタ割当部とを備えることを特徴とする記録媒体。
【0065】
(項目24) ソースプログラムをプロセッサの命令列に変換するコンパイル方法であって、前記ソースプログラム内で用いられる複数の変数それぞれにおいて、当該変数と同時に使われる変数を取得するステップと、前記複数の変数それぞれを、当該変数と同時に使われる変数とは異なるレジスタに割当てる、前記複数の変数間の割当順序を複数生成するステップと、前記複数の変数のそれぞれを、複数の前記レジスタのうち何れのレジスタに優先して割当てるかを示す割当優先度を取得するステップと、複数の前記割当順序のうち前記割当優先度に基づき選択した一の前記割当順序に従い、前記複数の変数を前記レジスタに割当てるステップとを備えることを特徴とするコンパイル方法。
(項目25) ソースプログラムをプロセッサの命令列に変換するコンパイル方法であって、前記ソースプログラム内で用いられる複数の変数それぞれにおいて、前記ソースプログラム内における当該変数の用いられ方に基づいて、当該変数を何れの種類のレジスタに割当てるべきかを示すレジスタ嗜好性情報及び当該変数と他の変数との間にある前記ソースプログラム上における関連性を示す情報である変数関連性情報のうち、少なくとも一方の情報を、前記複数の変数毎の前記複数のレジスタそれぞれへの割当優先度として生成するステップと、前記割当優先度に基づき、前記複数の変数を複数の前記レジスタに割当てるステップとを備えることを特徴とするコンパイル方法。
【0066】
(項目26) ソースプログラムで用いられる複数の変数を、プロセッサの命令列中で用いられるレジスタに割当てるレジスタ割当方法であって、前記複数の変数それぞれにおいて、当該変数と同時に使われる変数を取得するステップと、前記複数の変数それぞれを、当該変数と同時に使われる変数とは異なる前記レジスタに割当てる、前記複数の変数間の割当順序を複数生成するステップと、前記複数の変数のそれぞれを、複数の前記レジスタのうち何れのレジスタに優先して割当てるかを示す割当優先度を取得するステップと、複数の前記割当順序のうち前記割当優先度に基づき選択した一の前記割当順序に従い、前記複数の変数を前記レジスタに割当てるステップとを備えることを特徴とするレジスタ割当方法。
(項目27) ソースプログラム内で用いられる複数の変数を、プロセッサの命令列中で用いられるレジスタに変換するレジスタ割当方法であって、前記複数の変数それぞれにおいて、前記ソースプログラム内における当該変数の用いられ方に基づいて、当該変数を何れの種類の前記レジスタに割当てるべきかを示すレジスタ嗜好性情報及び当該変数と他の変数との間にある前記ソースプログラム上における関連性を示す情報である変数関連性情報のうち、少なくとも一方の情報を、前記複数の変数毎の前記複数のレジスタそれぞれへの割当優先度として生成するステップと、前記割当優先度に基づき、前記複数の変数を複数の前記レジスタに割当てるステップとを備えることを特徴とするレジスタ割当方法。
【0067】
【発明の効果】
上記説明から明らかなように、本発明によれば複数の変数に適切なレジスタを割当てるコンパイラ及びコンパイル方法を実現することができる。
【図面の簡単な説明】
【図1】図1は、コンパイラ10の機能ブロックの一例を示す図。
【図2】図2は、コンパイラ10の動作フローを示す図。
【図3】図3は、S40の動作フローを示す図。
【図4】図4は、S50の動作フローを示す図。
【図5】図5は、S55の動作フローを示す図。
【図6】図6は、S60の動作フローを示す図。
【図7】図7は、コンパイラ10がコンパイルするソースプログラムの一例を示す図。
【図8】図8は、割当順序生成部230が生成する割当順序の一例を示す図。
【図9】図9は、レジスタ割当部310が生成する割当優先度及びコンパイラ10が生成する命令列の一例を示す図。
【図10】図10は、コンパイラ10のハードウェア構成の一例を示す図。
【符号の説明】
10 コンパイラ
100 最適化処理部
200 レジスタ割当装置
900 実行コード生成部
210 生存区間解析部
220 同時使用変数取得部
230 割当順序生成部
240 レジスタ割当可能性判断部
260 同一レジスタ割当検出部
270 ループ解析部
280 実行履歴情報取得部
290 割当優先度生成部
300 割当優先度取得部
310 レジスタ割当部
400 干渉グラフ生成部
410 第1選択部
420 第2選択部
430 順序決定部
500 格納部
510 割当選択部
520 割当実行部
530 割当反復部
610 第1命令
620 第2命令
630 第3命令
640 第4命令
650 第5命令
660 第6命令
670 第7命令
810 第1生存区間
820 第2生存区間
830 第3生存区間
840 第4生存区間
850 第5生存区間
860 第6生存区間
870 第7生存区間
880 第8生存区間
910 第1文
920 第2文
930 第3文
940 第4文
950 第5文
960 第6文
970 第7文
980 第8文
990 第9文
995 第10文
Claims (16)
- ソースプログラムをプロセッサの命令列に変換するコンピュータであるコンパイラ装置であって、
外部から入力を受けたソースプログラムを記憶装置に格納し、前記ソースプログラムにおいて変数に値が代入されてから当該値が最後に使われるまでの区間を示す生存区間をCPUの動作により解析する生存区間解析部と、
生存区間の少なくとも一部が互いに重複する関係にある変数の組を示す情報を、干渉状態にあって同時に使われる複数の変数を示す情報として、解析された前記生存区間に基づいて前記CPUの動作により取得して記憶装置に格納する同時使用変数取得部と、
前記複数の変数それぞれを当該変数と同時に使われる変数とは異なるレジスタに割当てるために、複数の変数をレジスタに順次割当てるべき順序を示す割当順序グラフを示すデータであって、少なくとも一組の変数間には順序が定められており、全体として変数間に順序の循環が無い関係である半順序関係を示すグラフデータを、干渉状態にあって同時に使われる複数の変数を示す前記情報に基づいて前記CPUの動作により生成して記憶装置に格納する割当順序生成部と、
前記複数の変数のそれぞれを、複数の前記レジスタのうち何れのレジスタに優先して割当てるかを示す割当優先度を示す情報を前記CPUの動作により記憶装置から取得する割当優先度取得部と、
前記グラフデータおよび前記割当優先度に基づき前記複数の変数を前記CPUの動作により前記レジスタに割当てるレジスタ割当部と
を備え、
前記レジスタ割当部は、
前記グラフデータにおいて前記割当順序が最先の1個または2個以上の変数であって、2個以上の場合には互いの間のレジスタ割当の順序が定められていない変数である同時割当候補変数を示す情報を、前記CPUの動作により生成して前記記憶装置に格納する格納部と、
前記同時割当候補変数のそれぞれについての前記割当優先度を前記記憶装置から読み出す割当選択部と、
前記同時割当候補変数の中から特定した一の同時割当候補変数に対し、前記割当選択部により読み出された前記割当優先度に基づき前記CPUの動作により選択した前記レジスタを割当てる割当実行部と、
前記レジスタに割当てられてなくかつ前記割当順序がより先の変数を有しない変数があると前記CPUの動作により判断した場合には、当該変数を示す情報を新たに前記格納部に格納させて、新たに格納された当該変数について前記割当選択部により前記の読み出しの処理をさせ、新たに前記格納部に格納させる情報がない場合にはレジスタ割当を終了する割当反復部と
を有することを特徴とするコンパイラ装置。 - 前記割当順序生成部は、
前記記憶装置に格納された、干渉状態にあって同時に使われる複数の変数を示す情報に基づいて、前記レジスタの総数より小さい数の変数とのみ同時に使われる変数を、前記ソースプログラムにおいて用いられる変数の中から前記CPUの動作により選択して、選択した当該変数を示す識別情報を、スタック型のデータ構造の記憶領域に順次プッシュする第1選択部と、
前記ソースプログラムにおいて用いられる変数の中から、既に前記第1選択部または第2選択部によって選択された変数を除外した場合における残された変数のうち、前記レジスタの総数より小さい数の変数とのみ同時に使われる変数を前記CPUの動作により選択して、選択した当該変数を示す識別情報を、前記記憶領域に順次プッシュする第2選択部と、
前記記憶領域における識別情報の記憶順序を前記CPUの動作により逆順に並び替え、並び替えた前記記憶領域から識別情報を前記CPUの動作により順次ポップし、ポップした識別情報によって識別される変数について、前記ポップした識別情報によって識別される変数と干渉する変数であって前記レジスタの総数以上の個数の変数と干渉する変数を特定し、前記特定された変数の割当順序を前記ポップした識別情報によって識別される変数よりも先にするという処理を、ポップすべき識別情報が無くなるまで繰り返すことにより、前記グラフデータを前記CPUの動作により生成し、記憶装置に格納する順序決定部と
を有することを特徴とする請求項1記載のコンパイラ装置。 - 変数およびレジスタの組み合わせ毎に、当該変数を当該レジスタに割り当てる割当優先度を前記CPUの動作により生成する割当優先度生成部をさらに備え、
前記割当実行部は、それぞれの同時割当候補変数と、当該同時割当候補変数と同時に使われる何れの変数に対しても割り当てられていない各レジスタとの間の割当優先度を特定し、同時割当候補変数毎に、前記特定した割当優先度の最大値および最小値の差分値を前記CPUの動作により算出したうえで、当該差分値を最大化する同時割当候補変数に、当該同時割当候補変数との間の割当優先度が最大のレジスタを前記CPUの動作により割り当てることを特徴とする請求項1記載のコンパイラ装置。 - 前記割当優先度生成部は、外部から入力を受けた前記ソースプログラム中の関数呼び出しの前及び前記関数呼び出しからの復帰後の双方の部分において、前記変数を使用する処理が記述されている場合に、当該変数を前記関数内で用いられないレジスタに優先して割当てることを示す割当優先度を前記CPUの動作により生成して、前記割当優先度取得部に取得させるべく記憶装置に格納することを特徴とする請求項3記載のコンパイラ装置。
- 前記割当優先度生成部は、外部から入力を受けた前記ソースプログラム中の前記変数が関数間の値の引渡しに用いられる場合に、前記命令列の関数呼び出し手続きにおいて定められる引数レジスタ又は戻り値レジスタに、当該変数を優先して割当てることを示す割当優先度を前記CPUの動作により生成して、前記割当優先度取得部に取得させるべく記憶装置に格納する請求項3記載のコンパイラ装置。
- 前記ソースプログラムが示す処理を予め実行した場合に得られる実行履歴情報を記憶装置から読み出して取得する実行履歴情報取得部を更に備え、
前記割当優先度生成部は、前記実行履歴情報に基づき、前記ソースプログラムのうちより高い頻度で実行される部分に用いられる変数が、他の部分のみで用いられる変数より優先してレジスタに割当てられることを示す割当優先度を前記CPUの動作により生成して、前記割当優先度取得部に取得させるべく記憶装置に格納することを特徴とする請求項3記載のコンパイラ装置。 - 前記割当優先度生成部は、前記ソースプログラムにおいて、繰り返し実行されるループ部分において用いられる変数が、前記ループ部分以外の部分において用いられる変数より優先して前記レジスタに割当てられることを示す割当優先度を前記CPUの動作により生成して、前記割当優先度取得部に取得させるべく記憶装置に格納することを特徴とする請求項3記載のコンパイラ装置。
- 前記割当優先度生成部は、アドレスの連続するメモリとの間でデータを転送する前記ソースプログラム内の複数の変数を、アドレスの連続するメモリとの間でデータを転送するメモリアクセス命令である組合せメモリアクセス命令を適用可能な複数のレジスタに優先して割当てる割当優先度を前記CPUの動作により生成して、前記割当優先度取得部に取得させるべく記憶装置に格納することを特徴とする請求項3記載のコンパイラ装置。
- 前記複数の変数のうち、同一のレジスタに割当てた場合に前記命令列の実行速度が向上する変数の組合せを、外部から入力を受けた前記ソースプログラム中の変数の組合せの中から、前記CPUの動作により検出する同一レジスタ割当検出部を更に備え、
前記割当優先度生成部は、同一レジスタ割当検出部により検出された前記変数の組合せ中の変数を、同一のレジスタに優先して割当てる割当優先度を前記CPUの動作により生成して、前記割当優先度取得部に取得させるべく記憶装置に格納することを特徴とする請求項3記載のコンパイラ装置。 - コンピュータを、請求項1から請求項9の何れかに記載したコンパイラ装置として動作させるプログラム。
- ソースプログラムで用いられる複数の変数を、プロセッサの命令列中で用いられるレジスタに割当てるレジスタ割当装置であって、
外部から入力を受けたソースプログラムを記憶装置に格納し、前記ソースプログラムにおいて変数に値が代入されてから当該値が最後に使われるまでの区間を示す生存区間をCPUの動作により解析する生存区間解析部と、
生存区間の少なくとも一部が互いに重複する関係にある変数の組を示す情報を、干渉状態にあって同時に使われる複数の変数を示す情報として、解析された前記生存区間に基づいて前記CPUの動作により取得して記憶装置に格納する同時使用変数取得部と、
前記複数の変数それぞれを当該変数と同時に使われる変数とは異なる前記レジスタに割当てるために、複数の変数をレジスタに順次割当てるべき順序を示す割当順序グラフを示すデータであって、少なくとも一組の変数間には順序が定められており、全体として変数間に順序の循環が無い関係である半順序関係を示すグラフデータを、干渉状態にあって同時に使われる複数の変数を示す前記情報に基づいて前記CPUの動作により生成して記憶装置に格納する割当順序生成部と、
前記複数の変数のそれぞれを、複数の前記レジスタのうち何れのレジスタに優先して割当てるかを示す割当優先度を示す情報を前記CPUの動作により記憶装置から取得する割当優先度取得部と、
前記グラフデータおよび前記割当優先度に基づき前記複数の変数を前記CPUの動作により前記レジスタに割当てるレジスタ割当部と
を備え、
前記レジスタ割当部は、
前記グラフデータにおいて前記割当順序が最先の1個または2個以上の変数であって、2個以上の場合には互いの間のレジスタ割当の順序が定められていない変数である同時割当候補変数を示す情報を、前記CPUの動作により生成して前記記憶装置に格納する格納部と、
前記少なくとも一つの同時割当候補変数のそれぞれについての前記割当優先度を前記記憶装置から読み出す割当選択部と、
前記少なくとも一つの同時割当候補変数の中から特定した一の同時割当候補変数に対し、前記割当選択部により読み出された前記割当優先度に基づき前記CPUの動作により選択した前記レジスタを割当てる割当実行部と、
前記レジスタに割当てられてなくかつ前記割当順序がより先の変数を有しない変数があると前記CPUの動作により判断した場合には、当該変数を示す情報を新たに前記格納部に格納させて、新たに格納された当該変数について前記割当選択部により前記の読み出しの処理をさせ、新たに前記格納部に格納させる情報がない場合にはレジスタ割当を終了する割当反復部と
を有することを特徴とするレジスタ割当装置。 - 請求項11に記載のレジスタ割当装置をコンピュータにより実現するプログラム。
- コンピュータを、ソースプログラムをプロセッサの命令列に変換するコンパイラ装置として動作させるプログラムを記録した記録媒体であって、
前記プログラムは、コンピュータを、
外部から入力を受けたソースプログラムを記憶装置に格納し、前記ソースプログラムにおいて変数に値が代入されてから当該値が最後に使われるまでの区間を示す生存区間をCPUの動作により解析する生存区間解析部と、
生存区間の少なくとも一部が互いに重複する関係にある変数の組を示す情報を、干渉状態にあって同時に使われる複数の変数を示す情報として、解析された前記生存区間に基づいて前記CPUの動作により取得して記憶装置に格納する同時使用変数取得部と、
前記複数の変数それぞれを当該変数と同時に使われる変数とは異なるレジスタに割当てるために、複数の変数をレジスタに順次割当てるべき順序を示す割当順序グラフを示すデータであって、少なくとも一組の変数間には順序が定められており、全体として変数間に順序の循環が無い関係である半順序関係を示すグラフデータを、干渉状態にあって同時に使われる複数の変数を示す前記情報に基づいて前記CPUの動作により生成して記憶装置に格納する割当順序生成部と、
前記複数の変数のそれぞれを、複数の前記レジスタのうち何れのレジスタに優先して割当てるかを示す割当優先度を示す情報を前記CPUの動作により記憶装置から取得する割当優先度取得部と、
前記グラフデータおよび前記割当優先度に基づき前記複数の変数を前記CPUの動作により前記レジスタに割当てるレジスタ割当部と
を備え、
前記レジスタ割当部は、
前記グラフデータにおいて前記割当順序が最先の1個または2個以上の変数であって、2個以上の場合には互いの間のレジスタ割当の順序が定められていない変数である同時割当候補変数を示す情報を、前記CPUの動作により生成して前記記憶装置に格納する格納部と、
前記少なくとも一つの同時割当候補変数のそれぞれについての前記割当優先度を前記記憶装置から読み出す割当選択部と、
前記少なくとも一つの同時割当候補変数の中から特定した一の同時割当候補変数に対し、前記割当選択部により読み出された前記割当優先度に基づき前記CPUの動作により選択した前記レジスタを割当てる割当実行部と、
前記レジスタに割当てられてなくかつ前記割当順序がより先の変数を有しない変数があると前記CPUの動作により判断した場合には、当該変数を示す情報を新たに前記格納部に格納させて、新たに格納された当該変数について前記割当選択部により前記の読み出しの処理をさせ、新たに前記格納部に格納させる情報がない場合にはレジスタ割当を終了する割当反復部と
を有するコンパイラ装置として動作させることを特徴とする記録媒体。 - コンピュータを、ソースプログラムで用いられる複数の変数をプロセッサの命令列中で用いられるレジスタに割当てるレジスタ割当装置として動作させるプログラムを記録した記録媒体であって、
前記プログラムは、前記コンピュータを、
外部から入力を受けたソースプログラムを記憶装置に格納し、前記ソースプログラムにおいて変数に値が代入されてから当該値が最後に使われるまでの区間を示す生存区間をCPUの動作により解析する生存区間解析部と、
生存区間の少なくとも一部が互いに重複する関係にある変数の組を示す情報を、干渉状態にあって同時に使われる複数の変数を示す情報として、解析された前記生存区間に基づいて前記CPUの動作により取得して記憶装置に格納する同時使用変数取得部と、
前記複数の変数それぞれを当該変数と同時に使われる変数とは異なるレジスタに割当てるために、複数の変数をレジスタに順次割当てるべき順序を示す割当順序グラフを示すデータであって、少なくとも一組の変数間には順序が定められており、全体として変数間に順序の循環が無い関係である半順序関係を示すグラフデータを、干渉状態にあって同時に使われる複数の変数を示す前記情報に基づいて前記CPUの動作により生成して記憶装置に格納する割当順序生成部と、
前記複数の変数のそれぞれを、複数の前記レジスタのうち何れのレジスタに優先して割当てるかを示す割当優先度を示す情報を前記CPUの動作により記憶装置から取得する割当優先度取得部と、
前記グラフデータおよび前記割当優先度に基づき前記複数の変数を前記CPUの動作により前記レジスタに割当てるレジスタ割当部と
を備え、
前記レジスタ割当部は、
前記グラフデータにおいて前記割当順序が最先の1個または2個以上の変数であって、2個以上の場合には互いの間のレジスタ割当の順序が定められていない変数である同時割当候補変数を示す情報を、前記CPUの動作により生成して前記記憶装置に格納する格納部と、
前記少なくとも一つの同時割当候補変数のそれぞれについての前記割当優先度を前記記憶装置から読み出す割当選択部と、
前記少なくとも一つの同時割当候補変数の中から特定した一の同時割当候補変数に対し、前記割当選択部により読み出された前記割当優先度に基づき前記CPUの動作により選択した前記レジスタを割当てる割当実行部と、
前記レジスタに割当てられてなくかつ前記割当順序がより先の変数を有しない変数があると前記CPUの動作により判断した場合には、当該変数を示す情報を新たに前記格納部に格納させて、新たに格納された当該変数について前記割当選択部により前記の読み出しの処理をさせ、新たに前記格納部に格納させる情報がない場合にはレジスタ割当を終了する割当反復部と
を有するレジスタ割当装置として動作させることを特徴とする記録媒体。 - ソースプログラムをプロセッサの命令列に変換するコンパイル方法であって、
CPUが、外部から入力を受けたソースプログラムを記憶装置に格納し、前記ソースプログラムにおいて変数に値が代入されてから当該値が最後に使われるまでの区間を示す生存区間を解析する生存区間解析ステップと、
CPUが、生存区間の少なくとも一部が互いに重複する関係にある変数の組を示す情報を、干渉状態にあって同時に使われる複数の変数を示す情報として、解析された前記生存区間に基づいて取得して記憶装置に格納する同時使用変数取得ステップと、
CPUが、前記複数の変数それぞれを当該変数と同時に使われる変数とは異なるレジスタに割当てるために、複数の変数をレジスタに順次割当てるべき順序を示す割当順序グラフを示すデータであって、少なくとも一組の変数間には順序が定められており、全体として変数間に順序の循環が無い関係である半順序関係を示すグラフデータを、干渉状態にあって同時に使われる複数の変数を示す前記情報に基づいて生成して記憶装置に格納する割当順序生成ステップと、
CPUが、前記複数の変数のそれぞれを、複数の前記レジスタのうち何れのレジスタに優先して割当てるかを示す割当優先度を示す情報を記憶装置から取得する割当優先度取得ステップと、
CPUが、前記グラフデータおよび前記割当優先度に基づき前記複数の変数を前記レジスタに割当てるレジスタ割当ステップと
を備え、
前記レジスタ割当ステップは、さらに、
CPUが、前記グラフデータにおいて前記割当順序が最先の1個または2個以上の変数であって、2個以上の場合には互いの間のレジスタ割当の順序が定められていない変数である同時割当候補変数を示す情報を、生成して前記記憶装置に格納するステップと、
CPUが、前記少なくとも一つの同時割当候補変数のそれぞれについての前記割当優先度を前記記憶装置から読み出す割当選択ステップと、
CPUが、前記少なくとも一つの同時割当候補変数の中から特定した一の同時割当候補変数に対し、前記割当選択ステップにおいて読み出された前記割当優先度に基づきCPUが選択した前記レジスタを割当てる割当実行ステップと、
CPUが、前記レジスタに割当てられてなくかつ前記割当順序がより先の変数を有しない変数があると判断した場合には、当該変数を示す情報を新たに前記格納するステップにおいて格納させて、新たに格納された当該変数について前記割当選択ステップにより前記の読み出しの処理をさせ、新たに前記格納するステップにおいて格納させる情報がない場合にはレジスタ割当を終了する割当反復ステップと
を有するコンパイル方法。 - ソースプログラムで用いられる複数の変数を、プロセッサの命令列中で用いられるレジスタに割当てるレジスタ割当方法であって、
CPUが、外部から入力を受けたソースプログラムを記憶装置に格納し、前記ソースプログラムにおいて変数に値が代入されてから当該値が最後に使われるまでの区間を示す生存区間を解析する生存区間解析ステップと、
CPUが、生存区間の少なくとも一部が互いに重複する関係にある変数の組を示す情報を、干渉状態にあって同時に使われる複数の変数を示す情報として、解析された前記生存区間に基づいて取得して記憶装置に格納する同時使用変数取得ステップと、
CPUが、前記複数の変数それぞれを当該変数と同時に使われる変数とは異なる前記レジスタに割当てるために、複数の変数をレジスタに順次割当てるべき順序を示す割当順序グラフを示すデータであって、少なくとも一組の変数間には順序が定められており、全体として変数間に順序の循環が無い関係である半順序関係を示すグラフデータを、干渉状態にあって同時に使われる複数の変数を示す前記情報に基づいて生成して記憶装置に格納する割当順序生成ステップと、
CPUが、前記複数の変数のそれぞれを、複数の前記レジスタのうち何れのレジスタに優先して割当てるかを示す割当優先度を示す情報を記憶装置から取得する割当優先度取得ステップと、
CPUが、前記グラフデータおよび前記割当優先度に基づき前記複数の変数を前記レジスタに割当てるレジスタ割当ステップと
を備え、
前記レジスタ割当ステップは、さらに、
CPUが、前記グラフデータにおいて前記割当順序が最先の1個または2個以上の変数であって、2個以上の場合には互いの間のレジスタ割当の順序が定められていない変数である同時割当候補変数を示す情報を、生成して前記記憶装置に格納するステップと、
CPUが、前記少なくとも一つの同時割当候補変数のそれぞれについての前記割当優先度を前記記憶装置から読み出す割当選択ステップと、
CPUが、前記少なくとも一つの同時割当候補変数の中から特定した一の同時割当候補変数に対し、前記割当選択ステップにおいて読み出された前記割当優先度に基づきCPUが選択した前記レジスタを割当てる割当実行ステップと、
CPUが、前記レジスタに割当てられてなくかつ前記割当順序がより先の変数を有しない変数があると判断した場合には、当該変数を示す情報を新たに前記格納するステップにおいて格納させて、新たに格納された当該変数について前記割当選択ステップにより前記の読み出しの処理をさせ、新たに前記格納するステップにおいて格納させる情報がない場合にはレジスタ割当を終了する割当反復ステップと
を有するレジスタ割当方法。
Priority Applications (3)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2002171856A JP3956112B2 (ja) | 2002-06-12 | 2002-06-12 | コンパイラ、レジスタ割当装置、プログラム、記録媒体、コンパイル方法、及びレジスタ割当方法 |
US10/458,823 US7305665B2 (en) | 2002-06-12 | 2003-06-11 | Compiler register allocation and compilation |
US11/927,355 US8104026B2 (en) | 2002-06-12 | 2007-10-29 | Compiler register allocation and compilation |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2002171856A JP3956112B2 (ja) | 2002-06-12 | 2002-06-12 | コンパイラ、レジスタ割当装置、プログラム、記録媒体、コンパイル方法、及びレジスタ割当方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
JP2004021336A JP2004021336A (ja) | 2004-01-22 |
JP3956112B2 true JP3956112B2 (ja) | 2007-08-08 |
Family
ID=30112225
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
JP2002171856A Expired - Fee Related JP3956112B2 (ja) | 2002-06-12 | 2002-06-12 | コンパイラ、レジスタ割当装置、プログラム、記録媒体、コンパイル方法、及びレジスタ割当方法 |
Country Status (2)
Country | Link |
---|---|
US (2) | US7305665B2 (ja) |
JP (1) | JP3956112B2 (ja) |
Families Citing this family (24)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US8549466B2 (en) * | 2005-07-15 | 2013-10-01 | Texas Instruments Incorporated | Tiered register allocation |
US8201140B2 (en) * | 2005-08-30 | 2012-06-12 | The Mathworks, Inc. | System and method for creating and using graphical object instances in a statechart environment |
US20080005722A1 (en) * | 2006-06-28 | 2008-01-03 | Hidenori Matsuzaki | Compiling device, compiling method and recording medium |
US7650598B2 (en) * | 2006-08-09 | 2010-01-19 | National Tsing Hua University | Method for allocating registers for a processor |
US8429613B2 (en) * | 2006-10-31 | 2013-04-23 | Microsoft Corporation | Stepping and application state viewing between points |
JP2008305337A (ja) * | 2007-06-11 | 2008-12-18 | Panasonic Corp | プログラム変換装置、プログラム変換方法、プログラム、記憶媒体、デバッグ装置、デバッグ方法及びプログラム開発システム |
JP5165969B2 (ja) * | 2007-08-29 | 2013-03-21 | インターナショナル・ビジネス・マシーンズ・コーポレーション | プログラムのコンパイルのために変数にレジスタを割り付ける技術 |
US8225295B2 (en) * | 2007-09-21 | 2012-07-17 | Jens Palsberg | Register allocation by puzzle solving |
US8555266B2 (en) * | 2007-11-13 | 2013-10-08 | International Business Machines Corporation | Managing variable assignments in a program |
JP5208589B2 (ja) * | 2008-06-13 | 2013-06-12 | Necシステムテクノロジー株式会社 | コンパイル装置、コンパイラ、コンパイル方法 |
US8581912B2 (en) | 2008-06-27 | 2013-11-12 | Microsoft Corporation | Dynamic subroutine linkage optimizing shader performance |
US9009692B2 (en) * | 2009-12-26 | 2015-04-14 | Oracle America, Inc. | Minimizing register spills by using register moves |
JP2011141676A (ja) * | 2010-01-06 | 2011-07-21 | Toshiba Corp | 言語処理装置、言語処理方法およびコンピュータプログラムプロダクト |
US8555267B2 (en) * | 2010-03-03 | 2013-10-08 | Red Hat, Inc. | Performing register allocation of program variables based on priority spills and assignments |
US8572747B2 (en) * | 2010-11-19 | 2013-10-29 | International Business Machines Corporation | Policy-driven detection and verification of methods such as sanitizers and validators |
US8832672B2 (en) * | 2011-01-28 | 2014-09-09 | International Business Machines Corporation | Ensuring register availability for dynamic binary optimization |
TWI441020B (zh) * | 2011-02-15 | 2014-06-11 | Nat Univ Chung Cheng | Extend the segmentation method of the RISC processor scratchpad |
CN103827840B (zh) * | 2011-09-29 | 2017-09-12 | 英特尔公司 | 用于拷贝寄存器内容的处理器、方法和装置以及计算系统 |
US8806460B2 (en) * | 2012-01-26 | 2014-08-12 | Qualcomm Incorporated | Method and apparatus for avoiding register interference |
CA2794154C (en) | 2012-11-01 | 2019-09-10 | Ibm Canada Limited - Ibm Canada Limitee | Code generation using data marking |
KR101462347B1 (ko) * | 2013-07-08 | 2014-12-04 | 충북대학교 산학협력단 | 가상 머신 바이너리 변환 방법 |
US9733911B2 (en) * | 2015-11-11 | 2017-08-15 | National Instruments Corporation | Value transfer between program variables using dynamic memory resource mapping |
CN111857816B (zh) * | 2019-04-25 | 2024-05-10 | 阿里巴巴集团控股有限公司 | 寄存器分配方法、装置、电子设备及计算机存储介质 |
JP2021005250A (ja) * | 2019-06-26 | 2021-01-14 | コネクトフリー株式会社 | 実行コード提供方法およびソフトウェア開発システム |
Family Cites Families (12)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US4571678A (en) * | 1982-11-05 | 1986-02-18 | International Business Machines Corporation | Register allocation and spilling via graph coloring |
US5428793A (en) * | 1989-11-13 | 1995-06-27 | Hewlett-Packard Company | Method and apparatus for compiling computer programs with interproceduural register allocation |
JPH0816871B2 (ja) * | 1990-12-07 | 1996-02-21 | 富士ゼロックス株式会社 | プログラム翻訳装置およびプログラム翻訳方法 |
JPH05204660A (ja) | 1992-01-27 | 1993-08-13 | Hitachi Ltd | コンパイラ最適化方式 |
JP3299611B2 (ja) | 1993-10-20 | 2002-07-08 | 松下電器産業株式会社 | 資源割付装置 |
US5946491A (en) * | 1996-06-06 | 1999-08-31 | International Business Machines Corporation | Register allocation method and apparatus for gernerating spill code as a function of register pressure compared to dual thresholds |
US6128775A (en) * | 1998-06-16 | 2000-10-03 | Silicon Graphics, Incorporated | Method, system, and computer program product for performing register promotion via load and store placement optimization within an optimizing compiler |
US6421824B1 (en) * | 1999-04-23 | 2002-07-16 | Sun Microsystems, Inc. | Method and apparatus for producing a sparse interference graph |
US6408433B1 (en) * | 1999-04-23 | 2002-06-18 | Sun Microsystems, Inc. | Method and apparatus for building calling convention prolog and epilog code using a register allocator |
US6317876B1 (en) * | 1999-06-08 | 2001-11-13 | Hewlett-Packard Company | Method and apparatus for determining a maximum number of live registers |
JP4298868B2 (ja) | 1999-09-29 | 2009-07-22 | 富士通株式会社 | ペアレジスタ割当て処理方法,コンパイル処理装置およびコンパイラのプログラム記録媒体 |
US6651247B1 (en) * | 2000-05-09 | 2003-11-18 | Hewlett-Packard Development Company, L.P. | Method, apparatus, and product for optimizing compiler with rotating register assignment to modulo scheduled code in SSA form |
-
2002
- 2002-06-12 JP JP2002171856A patent/JP3956112B2/ja not_active Expired - Fee Related
-
2003
- 2003-06-11 US US10/458,823 patent/US7305665B2/en not_active Expired - Fee Related
-
2007
- 2007-10-29 US US11/927,355 patent/US8104026B2/en not_active Expired - Fee Related
Also Published As
Publication number | Publication date |
---|---|
US7305665B2 (en) | 2007-12-04 |
US8104026B2 (en) | 2012-01-24 |
US20040010784A1 (en) | 2004-01-15 |
US20080134151A1 (en) | 2008-06-05 |
JP2004021336A (ja) | 2004-01-22 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
JP3956112B2 (ja) | コンパイラ、レジスタ割当装置、プログラム、記録媒体、コンパイル方法、及びレジスタ割当方法 | |
US8522222B2 (en) | Tracing just-in-time compilation with pointers to local variables | |
US7086046B2 (en) | Method and apparatus for displaying compiler-optimizated code | |
JP5139987B2 (ja) | 拡張可能メタデータ | |
US7406684B2 (en) | Compiler, dynamic compiler, and replay compiler | |
US8806463B1 (en) | Feedback-directed inter-procedural optimization | |
US8127032B2 (en) | Performance sampling in distributed systems | |
US20100229161A1 (en) | Compile method and compiler | |
US20060101437A1 (en) | Data processing device and method | |
JP5966509B2 (ja) | プログラム、コード生成方法および情報処理装置 | |
US6360360B1 (en) | Object-oriented compiler mechanism for automatically selecting among multiple implementations of objects | |
JPH09212369A (ja) | 記憶域割り付け装置 | |
JP3919680B2 (ja) | コンパイラ装置、コンパイラプログラム、及び記録媒体 | |
JP4042972B2 (ja) | 最適化コンパイラ、コンパイラプログラム、及び記録媒体 | |
CN113138841A (zh) | 一种资源调度方法以及资源调度系统 | |
JP4039633B2 (ja) | 最適化コンパイラ、コンパイル方法、コンパイラプログラム、及び記録媒体 | |
JP2003271394A (ja) | 関数と基本ブロックの配置割付装置および割付最適化プログラム | |
JP5525658B2 (ja) | 計算機、リソース使用量計算方法及びリソース使用量計算プログラム | |
JP3927510B2 (ja) | コンパイラ装置、コンパイラプログラム、記録媒体、及びコンパイル方法 | |
JP3323147B2 (ja) | コンパイル装置、コンパイル方法およびコンパイラプログラムを記録した記録媒体 | |
JP2004287870A (ja) | ごみ集め方法及びコンパイル方法 | |
JP2004094581A (ja) | 並列拡張機能を備えたコンパイラプログラム、その記録媒体、コンパイル方法、およびコンパイル装置 | |
JP2001202252A (ja) | プログラム処理方法および記録媒体 | |
JP3634712B2 (ja) | コンパイラ装置 | |
JP4949789B2 (ja) | コンパイルプログラム、コンパイル装置、及びコンパイル方法 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
A977 | Report on retrieval |
Free format text: JAPANESE INTERMEDIATE CODE: A971007 Effective date: 20060707 |
|
A131 | Notification of reasons for refusal |
Free format text: JAPANESE INTERMEDIATE CODE: A131 Effective date: 20060725 |
|
A521 | Request for written amendment filed |
Free format text: JAPANESE INTERMEDIATE CODE: A523 Effective date: 20061020 |
|
A521 | Request for written amendment filed |
Free format text: JAPANESE INTERMEDIATE CODE: A821 Effective date: 20061020 |
|
A131 | Notification of reasons for refusal |
Free format text: JAPANESE INTERMEDIATE CODE: A131 Effective date: 20061128 |
|
A521 | Request for written amendment filed |
Free format text: JAPANESE INTERMEDIATE CODE: A523 Effective date: 20070222 |
|
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: 20070410 |
|
RD14 | Notification of resignation of power of sub attorney |
Free format text: JAPANESE INTERMEDIATE CODE: A7434 Effective date: 20070411 |
|
A61 | First payment of annual fees (during grant procedure) |
Free format text: JAPANESE INTERMEDIATE CODE: A61 Effective date: 20070424 |
|
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: 20110518 Year of fee payment: 4 |
|
LAPS | Cancellation because of no payment of annual fees |