JP5165969B2 - プログラムのコンパイルのために変数にレジスタを割り付ける技術 - Google Patents

プログラムのコンパイルのために変数にレジスタを割り付ける技術 Download PDF

Info

Publication number
JP5165969B2
JP5165969B2 JP2007223143A JP2007223143A JP5165969B2 JP 5165969 B2 JP5165969 B2 JP 5165969B2 JP 2007223143 A JP2007223143 A JP 2007223143A JP 2007223143 A JP2007223143 A JP 2007223143A JP 5165969 B2 JP5165969 B2 JP 5165969B2
Authority
JP
Japan
Prior art keywords
variable
register
variables
interference
assignment
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
Application number
JP2007223143A
Other languages
English (en)
Other versions
JP2009059001A (ja
Inventor
怜 大平
達氏 稲垣
卓也 仲池
秀昭 小松
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
International Business Machines Corp
Original Assignee
International Business Machines Corp
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by International Business Machines Corp filed Critical International Business Machines Corp
Priority to JP2007223143A priority Critical patent/JP5165969B2/ja
Priority to US12/133,349 priority patent/US8266603B2/en
Publication of JP2009059001A publication Critical patent/JP2009059001A/ja
Application granted granted Critical
Publication of JP5165969B2 publication Critical patent/JP5165969B2/ja
Expired - Fee Related legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/44Encoding
    • G06F8/441Register allocation; Assignment of physical memory space to logical memory space

Description

本発明は、プログラムのコンパイルに関する。特に本発明は、プログラムのコンパイルのために変数にレジスタを割り付ける技術に関する。
コンパイラは、プログラム内で用いられる変数の値をレジスタに保持させることで、プログラムの実行を効率化する。コンパイラが各変数の値をどのレジスタに保持させるかを決定する技術は、レジスタ割付と呼ばれる。レジスタ割付において、プログラムで使用されるある変数の値をあるレジスタに一貫して保持させると、そのプログラムのうちその変数をあまり使用しない部分においても、その変数のためにそのレジスタが占有される。このため、そのレジスタを他の用途に使用できず、プログラムの実行の効率を全体として低下させてしまう場合がある。
非特許文献1−5については後述する。
P. Briggs, K. D. Cooper, and L. Torczon. Improvements to Graph Coloring Register Allocation. ACM TOPLAS, Vol.16, No.3, pp.428-455, 1994. L. George and A. W. Appel. Iterated Register Coalescing. ACM TOPLAS, Vol.18, No.3, pp.300-324, 1996. G. J. Chaitin. Register Allocation & Spilling via Graph Coloring. ACM SIGPLAN Notices, Vol.17, No.6, pp.98-105, 1982. J. Park and S. Moon. Optimistic Register Coalescing. ACM TOPLAS, Vol.26, No.4, pp.735-765, 2004. P. Briggs. Register Allocation via Graph Coloring. Ph. D Thesis, Rice University, 1992.
これに対し、コンパイラは、変数を、例えばプログラムの部分ごとに新たな複数の変数に分割してもよい。そして、コンパイラは、それら複数の変数のそれぞれに対しレジスタを割り付けるか否かを選択的に決定する。これにより、変数をあまり使用しない部分においてはレジスタを他の用途に使用することができ、プログラムの実行効率を向上できる。一方、変数を新たな複数の変数に分割すると、分割の境界において変数値を代入する処理が必要となる。この代入する処理が多すぎると、やはり、プログラムの実行効率が低下する。従って、プログラム全体としての実行効率を高めるためには、変数を適度に分割することが好ましい。
変数を適度に分割するためには、変数をノードとして表しかつ変数同士の干渉関係をエッジで表したグラフ上でノードを融合(coalescing)する技術を応用できるとも考えられる(非特許文献1−4を参照。)。非特許文献1には、保守的融合(conservative coalescing)という技術が開示され、非特許文献2には、繰り返し融合(interated coalescing)という技術が開示される。非特許文献3には、積極的融合(agressive coalescing)という技術が開示され、非特許文献4には、楽観的融合(optimistic coalescing)という技術が開示される。しかしながら、非特許文献1または2に記載の技術では、融合が不充分ゆえ多くの代入命令が生成される場合がある。また、非特許文献3または4に記載の技術では、融合し過ぎて変数分割による効果が充分でない場合がある。
そこで本発明は、上記の課題を解決することのできるコンパイラ装置、コンパイル方法およびプログラムを提供することを目的とする。この目的は特許請求の範囲における独立項に記載の特徴の組み合わせにより達成される。また従属項は本発明の更なる有利な具体例を規定する。
上記課題を解決するために、本発明の一側面においては、コンパイルの対象となるプログラムの中で使用される変数にレジスタを割り付けるコンパイラ装置であって、前記プログラムの中で使用されるある変数と他の変数とが前記プログラムの実行中の何れかの時点において同時に有効な値を保持している関係である干渉関係にあるかどうかを示す干渉情報、および、前記プログラム中の代入命令の代入元の変数を代入先の変数に対応付けた代入情報を記憶している記憶装置と、前記プログラムの中で使用されるそれぞれの変数に、前記干渉関係にある変数の組に同一のレジスタを割り付けない範囲内において、予め定められた基準数以上のレジスタの中から予め定められた手順に従ってレジスタを選択して割り付ける第1割付部と、複数の前記変数に、前記第1割付部により同一のレジスタが割り付けられ、かつ、当該複数の変数が前記代入情報において互いに対応付けられていることを条件に、当該複数の変数を新たな変数に置換すると共に、当該複数の変数のそれぞれについての前記干渉関係を前記記憶装置から読み出して併合して、当該新たな変数についての干渉関係を生成し、生成した当該干渉関係により前記干渉情報を更新する更新部と、当該複数の変数に代えて当該新たな変数を使用する前記プログラム中の各変数に、更新した前記干渉情報に基づく干渉関係にある変数の組に同一のレジスタを割り付けない範囲内において、前記第1割付部と同一の前記手順に従って前記基準数のレジスタの中からレジスタを選択して割り付ける第2割付部と、前記第2割付部が変数にレジスタを割り付けた前記プログラムを出力する出力部とを備えるコンパイラ装置を提供する。
なお、上記の発明の概要は、本発明の必要な特徴の全てを列挙したものではなく、これらの特徴群のサブコンビネーションもまた、発明となりうる。
以下、発明の実施の形態を通じて本発明を説明するが、以下の実施形態は特許請求の範囲にかかる発明を限定するものではなく、また実施形態の中で説明されている特徴の組み合わせの全てが発明の解決手段に必須であるとは限らない。
図1は、本実施形態に係るコンパイラ装置10の全体構成を示す。コンパイラ装置10は、入力したプログラムを機械語プログラムに変換して出力する。このほかに、コンパイラ装置10は、機械語プログラムを効率的に実行させるための最適化をする。具体的には、コンパイラ装置10は、第1最適化部100と、レジスタ割付部110と、記憶装置120と、第2最適化部130とを備える。
第1最適化部100は、コンパイルの対象となるプログラムを受け取る。このプログラムを入力プログラムと呼ぶ。そして、第1最適化部100は、その入力プログラムに対し、最適化のための各種の処理を行う。例えば、第1最適化部100は、入力プログラム内で使用される各変数の生存区間を解析してもよい。ある変数が互いに連続しない複数の生存区間を有する場合には、第1最適化部100は、その変数を、生存区間ごとにその変数の値を保持する複数の変数に変換してもよい。第1最適化部100により各種の処理が行われたプログラムを対象プログラム22とする。
レジスタ割付部110は、対象プログラム22の中で使用される変数にレジスタを割り付ける。このように、レジスタ割付の対象となるプログラムは、コンパイラ装置10に入力されたプログラムそのもののみならず、そのプログラムに対し所定の処理を行った後のプログラムであってよい。同様に、レジスタ割付の対象となる変数は、コンパイラ装置10に入力されたプログラム中の変数のみならず、そのプログラムに対し所定の処理を行った結果生成された変数をも含む。
レジスタ割付のために、レジスタ割付部110は、対象プログラム22を解析して各種の情報を生成し、記憶装置120に格納してもよい。そして、レジスタ割付部110は、記憶装置120に記憶されているこれらの情報を参照して変数にレジスタを割り付ける。記憶装置120に記憶される情報は、例えば、変数の干渉関係を示す干渉情報、変数の代入先および代入元の関係を示す代入情報、および、変数毎のレジスタ割付の優先度を示す優先度、などである。
レジスタ割付部110は、変数にレジスタを割り付けたプログラム(これを結果プログラム69と呼ぶ)を生成して出力する。レジスタ割付部110は、この結果プログラム69を更に入力してもよい。この場合、レジスタ割付部110は、結果プログラム69に含まれる各レジスタを変数とみなして、さらにその変数にレジスタを割り付けてもよい。レジスタ割付部110は、以上の処理を、所定の条件が成立するまで繰り返してよい。
第2最適化部130は、この結果プログラム69に対し各種の処理を行う。例えば、第2最適化部130は、代入元および代入先のそれぞれが同一のレジスタである代入命令を、結果プログラム69から削除してもよい。各種の処理が行われた結果プログラム69は、出力プログラム24としてレジスタ割付部110の外部に出力される。外部の装置は、出力プログラム24を実行することで、入力プログラムの作成者の意図に従った各種の処理を行うことができる。
図2は、ある対象プログラム22の中で使用される各変数の使用状況を示す。図左側に示すように、対象プログラム22は、最適化の早い段階において、例えば基本ブロックと呼ばれる単位によって、複数の部分に分割される場合が多い。それぞれの基本ブロックは、連続して実行される少なくとも1つの命令を含む。そして、それぞれの基本ブロックは、その先頭および末尾を除き、条件分岐命令の分岐元または分岐先とはならない。
第1の基本ブロックは、変数aに値を代入する命令、および、変数aを参照する命令を含む。記号「=」は右辺を参照して左辺に代入する命令を示す。記号「−>」は、ポインタ演算子であり、記号の左側の変数の値をアドレスとする記憶領域のうち、記号の右側により定められる領域のデータを読み出す演算を示す。したがって、「a−>…」により、変数aの値がアドレスとして参照される。
以降同様に、第2の基本ブロックは、変数bに値を代入する命令、および、変数bの値を参照する2つの命令を含む。第3の基本ブロックは、変数cに値を代入する命令、変数bの値を参照する2つの命令、および、変数cの値を参照する3つの命令を含む。第4の基本ブロックは、変数aの値を参照する3つの命令、変数bの値を参照する命令、および、変数cの値を参照する命令を含む。
図右側に示すように、変数の生存区間は、変数にある値を最初に代入してからその値を最後に使用するまでである。使用とは、例えば、その変数の値を参照することをいう。図では、変数を囲う丸印が代入を示し、変数の伴わない丸印が使用を示す。各丸印を接続する直線が、変数の生存区間を示す。変数aについて例示すれば、第1の基本ブロックの第1命令によって最初に代入され、以降3度の使用を経て、第4の基本ブロックの第3命令により最後に使用される。以降の説明においても、生存区間を直感的に認識し易くするため、連続する生存区間については、この図のような連続する直線として表す。
なお、実際には、コンパイル前およびコンパイル後のプログラムを比較すると、数値、文字列および記号を含む文が、オペレータ、レジスタ、アドレスおよび定数値を含む命令に変換される。そして、コンパイルの途中段階においては、オペレータの抽象概念である中間コードが用いられることもある。一方で、コンパイルのどの段階であっても、プログラムに表現されている各種操作は機能的には略同一である。従って、当該技術分野においてはよくあることだが、本実施形態においても、命令、代入、参照、ロードまたストアなどの本来はコンパイル前または後の一方のみで用いることが適切な用語群を、コンパイルの何れの段階にあるプログラムにおいても共通して使用する。
図3は、各変数の値を特定のレジスタが一貫して保持する場合におけるレジスタの割付結果の一例を示す。この例において、対象プログラム22の実行に使用可能なレジスタの数は2である。そして、変数cにはレジスタr1が割り付けられ、変数bにはレジスタr2が割り付けられる。レジスタr1は、変数cの値を一貫して保持している。レジスタr2は、変数bの値を一貫して保持している。一方、変数aにはレジスタが割り付けられていない。この結果、変数aの値はメモリに格納されて、参照の毎にメモリから読み出される(これをスピルと呼ぶ)。この例では参照が4回なので、変数aの値は4回読み出され、読出しの都度使用完了後には破棄される。
図4は、各変数を複数の変数に変換したうえでレジスタを割り付ける場合におけるレジスタの割付結果の第1例を示す。図左には、各変数の生存区間を示す。この図は図2右側の図と同一である。レジスタ割付部110は、変数aおよび変数bのそれぞれを複数の変数に変換する。変数bは変数b1および変数b2に、変数aは変数a1、変数a2および変数a3に、それぞれ変換される。また、変数b2に変数b1の値を代入する命令、変数a2に変数a1を代入する命令、および、変数a3に変数a2を代入する命令が生成される。
レジスタ割付部110は、変換後のそれぞれの変数に、レジスタを割り付ける。例えば、レジスタ割付部110は、変数a1にレジスタr2を割り付け、変数b1にレジスタr2を割り付け、変数a3にレジスタr2を割り付け、そして、変数cにレジスタr1を割り付ける。
変数a2および変数b2はレジスタに割り付けられない。したがって、これらの変数の値は一旦メモリに格納されて、使用の毎にメモリから読み出される。この結果、メモリからの値の読出しの処理は、それぞれ変数a2およびb2のための2回となる。この例によれば、図3と比較して、スピルによる値の読出しの回数を減らすことができる。また、一旦生成された代入命令も不要となる。
図5は、各変数を複数の変数に変換したうえでレジスタを割り付ける場合におけるレジスタの割付結果の第2例を示す。図左には、各変数の生存区間を示す。この図は図2右側の図と同一である。レジスタ割付部110は、変数a−cのそれぞれを複数の変数に変換する。変数bは変数b1、変数b2、変数b3、変数b4および変数b5に、変数aは変数a1、変数a2、変数a3および変数a4に、それぞれ変換される。変数cは、変数c1、変数c2、変数c3および変数c4に、それぞれ変換される。
また、この変換により、下記の代入命令が生成される。変数c1から変数c2、変数c2から変数c3、変数c3から変数c4、変数b1から変数b2、変数b2から変数b3、変数b3から変数b4、変数b4から変数b5、変数a1から変数a2、変数a2から変数a3、および、変数a3から変数a4への代入命令である。
レジスタ割付部110は、変換後のそれぞれの変数に、レジスタを割り付ける。例えば、レジスタ割付部110は、変数a1にレジスタr2を割り付け、変数a3−4にレジスタr2を割り付ける。また、レジスタ割付部110は、変数b1−4にレジスタr1を割り付ける。また、レジスタ割付部110は、変数c1−3にレジスタr2を割り付け、変数c4にレジスタr1を割り付ける。
図4の例と同様、変数a2および変数b5はレジスタに割り付けられない。したがって、これらの変数の値は一旦メモリに格納されて、使用の毎にメモリから読み出される。この結果、メモリからの値の読出しの処理は、それぞれ変数a2およびb5のための2回となる。
但し、図4の例と異なり、変数c1−3と変数c4とには異なるレジスタが割り付けられる。従って、変数c1−3の値を保持するレジスタr2から、変数c4の値を保持するレジスタr1への代入命令が必要となる。このように、変数を分割し過ぎると、レジスタ間の代入命令が必要となって、プログラムの実行効率が低下する場合がある。
これに対し、本実施形態に係るコンパイラ装置10は、変数を適度に分割することで、分割によるスピル低減と、分割により生じる代入命令の削減とをバランスし、プログラムを全体として効率的に動作させることができる。以下、具体的に説明する。
図6は、本実施形態に係るレジスタ割付部110の機能構成の一例を示す。レジスタ割付部110は、変数変換部600と、代入命令生成部610と、情報生成部620と、第1割付部630と、更新部640と、第2割付部650と、スピル生成部660と、出力部670とを備える。変数変換部600は、対象プログラム22内の各変数を複数の変数に変換する。この変換は、例えば、変数変換部600が、ある変数の生存区間を分割して、分割した生存区間ごとにその変数の値を保持する複数の変数を生成することで実現されてよい。
具体的には、変数変換部600は、変数の生存区間を、対象プログラム22中の各部の実行頻度、または、その変数の使用頻度に応じて分割してよい。より詳細には、変数変換部600は、ある変数の生存区間を、対象プログラム22のうちの実行頻度が基準よりも高い部分に対応する生存区間と、対象プログラム22のうちの実行頻度が基準よりも低い部分に対応する生存区間と、に分割してよい。また、変数変換部600は、ある変数の生存区間を、その変数の代入または参照を境界として分割してもよい。
代入命令生成部610は、変換した当該複数の変数のうちのある変数から他の変数への代入命令を対象プログラム22中に生成する。例えば、変数aが変数a1および変数a2に変換された場合、代入命令生成部610は、変数a1から変数a2に値を代入する命令を生成する。このように、代入命令生成部610は、それぞれの生存区間が互いに連続する変数の組について、生存区間の境界に代入命令を生成してよい。変数が変換され、かつ、代入命令が生成されたプログラムを、プログラム60とする。図7にその一例を示す。
図7は、本実施形態に係るプログラム60の一例を示す。変数cは、変数c1−4のそれぞれに変換される。変数bは、変数b1−5のそれぞれに変換される。変数aは、変数a1−4のそれぞれに変換される。また、変数c1から変数c2への代入命令、変数c2から変数c3への代入命令、および、変数c3から変数c4への代入命令が生成される。
また、変数b1から変数b2への代入命令、変数b2から変数b3への代入命令、変数b3から変数b4への代入命令、および、変数b4から変数b5への代入命令が生成される。また、変数a1から変数a2への代入命令、変数a2から変数a3への代入命令、および、変数a3から変数a4への代入命令が生成される。
図6の説明に戻る。情報生成部620は、対象プログラム22中で使用される複数の変数についての干渉関係を示す情報を、干渉情報62Aとして生成して記憶装置120に格納する。ここでいう対象プログラム22中で使用される複数の変数には、変数変換部600による変換前の変数は含まれず、変数変換部600による変換後の変数が含まれる。また、干渉関係とは、ある変数と他の変数とが対象プログラム22の実行中の何れかの時点において同時に有効な値を保持している関係を示す。ここでいう「有効な」値とは、その変数の最初の代入から最後の使用までの間にその変数に格納されている値をいう。図8に干渉情報62Aの一例を示す。
図8は、本実施形態に係る干渉情報62Aの一例を示す。干渉情報62Aは、干渉グラフと呼ばれるグラフ形式のデータ構造を有してよい。干渉グラフとは、プログラム60により使用される各変数をノードとし、互いに干渉関係にある変数の組を示すノードの組を、エッジで連結したグラフである。
この図の例で、例えば変数a2は、変数c1−4および変数b1−5の何れとの間でも干渉関係にある。従って、変数a2を示すノードは、変数c1−4および変数b1−5の何れを示すノードとの間でもエッジで直接接続される。また、変数b5は、変数c1−4および変数a2−4の何れとの間でも干渉関係にある。従って、変数b5を示すノードは、変数c1−4および変数a2−4の何れを示すノードとの間でもエッジで直接接続される。
また、変数c4は、変数a2−3および変数b5の何れとの間でも干渉関係にある。従って、変数c4を示すノードは、変数a2−3および変数b5の何れを示すノードとの間でもエッジで直接接続される。また、変数c1は、変数b3−5および変数a2の何れとの間でも干渉関係にある。従って、変数c1を示すノードは、変数b3−5および変数a2の何れを示すノードとの間でもエッジで直接接続される。一方で、変数a1は何れの変数との間でも干渉関係にないので、変数a1を示すノードは何れのノードともエッジで直接接続されない。図6の説明に戻る。
また、情報生成部620は、代入命令生成部610が生成した代入命令の代入元および代入先となる変数の組を示す代入情報64Aを生成して、記憶装置120に格納する。この代入情報は、たとえば、対象プログラム22を走査して対象プログラム22から変数の代入命令を検出することによって取得されてもよい。代入情報64Aの一例を図9に示す。
図9は、本実施形態に係る代入情報64Aの一例を示す。代入情報64Aは、プログラム60の中で使用される各変数を行方向および列方向にそれぞれ配列した行列状のデータ構造を有してよい。そして、代入情報64Aにおいて、代入命令の代入元および代入先の関係にある変数の組には数値1が対応付けられており、そのような関係にない変数の組に対応付けて数値0が対応付けられている。
例えば、図7に示したように、変数a2は変数a1を代入元とする代入命令の代入先であり、さらに、変数a3を代入先とする代入命令の代入元である。従って、代入情報64Aにおいて、変数a2および変数a1の組には数値1が対応付けられている。そして、変数a2および変数a3の組にも数値1が対応付けられている。
変数a2は、その他の変数との間では代入命令の代入元および代入先の関係に無い。従って、変数a2とその他の変数との組には、数値0が対応付けられている。他の変数についても同様である。具体的には、変数a4および変数a3の組には数値1が対応付けられ、変数b2および変数b1ならびに変数b2および変数b3の組には数値1が対応付けられる。また、変数b4および変数b3の組ならびに変数b4および変数b5の組には数値1が対応付けられる。
また、変数c2および変数c1の組ならびに変数c2および変数c3の組には数値1が対応付けられる。また、変数c3および変数c4の組には数値1が対応付けられる。以上に例示した代入情報64Aによれば、プログラム60を改めて走査しなくとも、何れの変数が他の何れの変数との間で変数値を代入される関係にあるかを迅速に判別できる。
図6の説明に戻る。さらに、情報生成部620は、それぞれの変数についてその変数にレジスタを割り付ける優先度65Aを生成し、記憶装置120に格納してもよい。図10にその一例を示す。
図10は、本実施形態に係る優先度65Aの一例を示す。優先度65Aは、プログラム60の中で用いられるそれぞれの変数に、その変数にレジスタを割り付けることで得られる利得、その変数と干渉関係にある他の変数の数(次数)、および、その変数をスピルすることで蒙る損失のコストを対応付けている。このコストが、本発明にかかる優先度の一例である。コストが高い程、レジスタ割り付けの優先度が高い。
ある変数の利得は、例えば、プログラム60の中でその変数を使用する回数に基づく。使用回数の多い変数ほど、レジスタを割り付けると実行効率が向上するからである。コストは、例えば、利得(x)を次数(y)で割り算することによって算出される。次数(y)が大きい変数ほど、その変数をスピルすることで他の変数をレジスタに割り付けやすくなり、即ち、そのスピルにより蒙る損失は小さくなるからである。
具体的には、情報生成部620は、プログラム60を走査して、それぞれの変数を参照する命令を検出する。そして、情報生成部620は、その命令の数を変数ごとに集計する。そして、情報生成部620は、変数ごとに集計したその命令の数を、変数ごとの利得として記憶装置120に格納する。具体的には、変数a1−4、変数b1−5、および、変数c1−4の何れについても、その使用回数は1回なので、利得は1である。
また、情報生成部620は、記憶装置120に記憶された干渉情報62Aを走査して、それぞれの変数に接続されたエッジの数を算出する。そして、情報生成部620は、算出したその数を次数として記憶装置120に格納する。そして、情報生成部620は、それぞれの変数について、その変数の利得を次数で割り算することによりコストを算出し、記憶装置120に格納する。
図6の説明に戻る。第1割付部630は、プログラム60の中で使用されるそれぞれの変数に、予め定められた基準数以上のレジスタの中から予め定められた手順に従ってレジスタを選択して割り付ける。この割り付けの処理は、干渉関係にある変数の組に同一のレジスタを割り付けない範囲内において行われる。仮に干渉関係にある変数の組に同一のレジスタを割り付けてしまうと、あるレジスタが同時に複数の変数の値を保持することとなって、プログラムが正常動作しないからである。
構成の具体例として、第1割付部630は、シンプリファイ部632およびセレクト部635を有する。詳細は後述するが、概要は概ね以下の通りである。シンプリファイ部632は、所定の基準に従って変数を選択してスタックにプッシュすると共に、プッシュしたその変数についての干渉関係を干渉情報62Aから除外する処理、を、割り付けるべき全ての変数をプッシュするまで繰り返す。
ここでいうスタックは、例えば、記憶装置120内に一時的に設けた作業用領域により実現される。そして、スタックは、ここでは、例えば、単にLIFO(Last In First Out)型の操作が可能なデータ構造を有する記憶領域をさす。また、予め定められた基準数とは、プログラム60の実行に使用することのできるレジスタである物理レジスタの上限数を示す。
そして次に、セレクト部635は、そのスタックから変数をポップし、ポップしたその変数に、その変数と干渉関係にある他の変数に既に割り付けられているレジスタとは異なるレジスタを割り付ける処理、を、そのスタックが空になるまで繰り返す。この処理は、バイアス彩色と呼ばれる、非特許文献1に記載の技術に基づいて行われることが好ましい。これに代えて、この処理は、他の如何なるレジスタ割付アルゴリズムに基づいてもよい。
また、セレクト部635は、上記基準数の物理レジスタに、プログラム60の実行には使用することのできない仮想的なレジスタである仮想レジスタを少なくとも1つ加えたレジスタの集合の中から、割り付けるべきレジスタを選択してもよい。なお、基準数、および、割付可能な物理レジスタについては、記憶装置120にあらかじめ記憶されていてもよい。また、コンパイラ装置10の動作時に与えるパラメータに基づいて、コンパイラ装置10が決定してもよい。例えば、コンパイル結果のプログラムをどの機種のコンピュータで動作させるかによって、使用するべき物理レジスタの数が定められてもよい。
この割り付け結果を割付結果66とする。その一例を図11に示す。
図11は、本実施形態に係る割付結果66の一例を示す。変数a1には物理レジスタr1が割り付けられる。変数a3−4のそれぞれには物理レジスタr1が割り付けられる。変数b1−4のそれぞれには物理レジスタr2が割り付けられる。変数c1−3のそれぞれには物理レジスタr1が割り付けられる。変数c4には物理レジスタr2が割り付けられる。一方、変数a2には仮想レジスタr4が割り付けられ、変数b5には仮想レジスタr3が割り付けられる。
なお、同一のレジスタが割り付けられ、かつ、代入命令の代入先および代入元の関係にある変数の組を、後の説明のためにグループ化して示す。具体的には、変数a3および変数a4はグループ化され、変数c1−3はグループ化され、変数b1−4はグループ化されている。
図6の説明に戻る。更新部640は、複数の変数に、第1割付部630により同一のレジスタが割り付けられ、かつ、当該複数の変数が代入情報64Aにおいて相互に対応付けられていることを条件に、当該複数の変数を新たな変数に置換する。例えば、更新部640は、プログラム60の内容を書き換えてもよい。そして、更新部640は、当該複数の変数のそれぞれについての干渉関係を記憶装置120の干渉情報62Aから読み出して併合する。併合したその干渉関係は、当該新たな変数についての干渉関係となる。そして、更新部640は、生成したその干渉関係により干渉情報62Aを更新する。更新された干渉情報を干渉情報62Bとする。これに加えて、更新部640は、代入情報64Aおよび優先度65Aを更新し、代入情報64Bおよび優先度65Bとして記憶装置120に格納してもよい。
図12−14にこれらの一例を示す。
図12は、本実施形態に係る干渉情報62Bの一例を示す。更新部640は、図11において同一グループに分類された複数の変数を、新たな1つの変数に置換する。例えば、更新部640は、変数c1−3を、変数c1´に置換し、変数a3−4を、変数a3´に置換し、変数b1−4を、変数b1´に置換する。
これに伴い、更新部640は、置換する当該複数の変数を干渉グラフにおいて表している複数のノードを新たな1つのノードに置換する。そして、更新部640は、干渉グラフにおける当該複数のノードのそれぞれと他のそれぞれのノードとの間のエッジを、当該新たな1つのノードと当該他のそれぞれのノードとの間のエッジに置換する。
具体的には、置換前の変数c1は変数a2、b3、b4およびb5のそれぞれと干渉関係にある。また、置換前の変数c2は、変数a2およびb5のそれぞれと干渉関係にある。また、置換前の変数c3は、変数a2およびb5のそれぞれと干渉関係にある。更新部640は、変数c1−3のそれぞれとの間で干渉関係にある変数の和集合を算出する。この結果、変数a2、b3、b4およびb5が和集合として算出される。
そして、更新部640は、置換後の変数c1´と、この和集合に含まれる各変数との間の干渉関係を、干渉情報62Bに含めて生成する。但し、変数b3および変数b4もまた、新たな変数b1´に変換される。従って、変数b3および変数b4についての干渉関係も、新たな変数b1´についての干渉関係に置換される。この結果、更新部640は、変数c1´を、変数a2、b1´およびb5のそれぞれと干渉することを示す干渉関係を、干渉情報62Bに含めて生成する。
図13は、本実施形態に係る代入情報64Bの一例を示す。更新部640は、置換前の当該複数の変数の間で相互に値を代入する命令をプログラム60から削除する。また、更新部640は、プログラム60において、置換前の当該複数の変数の何れかと他の変数との間の代入命令を、置換後の当該新たな1つの変数と当該他の変数との間の代入命令に置換する。
例えば、置換前の変数c1−3の間で相互に値を代入する命令、例えば変数c1から変数c2に値を代入する命令は削除される。そして、変数c1−3のうちの変数c3から、変数c4へ値を代入する命令は、置換後の変数c1´から変数c4へ値を代入する命令に置換される。
そして、更新部640は、代入命令を置換または削除したプログラム60を走査して、改めて代入命令を検出して、その検出結果に基づいて代入情報64Bを生成する。例えば、更新部640は、変数c1´および変数c4が代入命令の代入先および代入元の関係にあることを示す情報を、代入情報64Bに含めて生成してよい。
図14は、本実施形態に係る優先度65Bの一例を示す。更新部640は、置換前の当該複数の変数のそれぞれに対応する利得を合計して、置換後の当該新たな1つの変数に対応する利得とする。また、更新部640は、干渉情報62Bに基づいて、置換後の当該新たな1つの変数を干渉グラフにおいて表すノードの次数を算出する。
置換前の変数c1−3のそれぞれには、利得1が対応付けられている。従って、更新部640は、それらの利得を合計した利得を置換後の変数c1´に対応付けて算出し、優先度65Bに含めて記憶装置120に格納する。また、置換後の変数c1´を干渉グラフ上で表すノードの次数は、干渉情報62Bにおいて3である。従って、更新部640は、次数3を変数c1´に対応付けて算出し、優先度65Bに含めて記憶装置120に格納する。
このように算出された利得および次数に基づいて、更新部640は、各変数をスピルすることによって蒙る損失を算出して、代入情報64Bに含めて記憶装置120に格納してもよい。図6の説明に戻る。
第1割付部630によるレジスタ割付および更新部640による情報の更新が予め定められた回数行われたかどうかなど、所定の終了条件が成立したかどうかを判断する。終了条件が成立しない場合には、変数の置換後のプログラムについて、第1割付部630が再度レジスタ割付を行う。
その場合には、更新部640は、干渉情報62Bを更新して干渉情報62Cを生成し、代入情報64Bを更新して代入情報64Cを生成し、優先度65Bを更新して優先度65Cを生成する。このように、繰り返しの回数に応じて各種情報が順次更新されていく。なお、以降の説明ではここで繰り返しは無いものとし、更新部640により最終的に生成される情報は干渉情報62B、代入情報64B、および、優先度65Bとする。
第2割付部650は、第1割付部630により同一のレジスタが割り付けられた当該複数の変数に代えて当該新たな変数を使用するプログラム60中の各変数に、第1割付部630による上記予め定められた手順と同一の手順に従って上記基準数と同数の物理レジスタの中からレジスタを選択して割り付ける。この割り付けは、第1割付部630による割付の結果とは無関係に、何れの変数にもレジスタをまだ割り付けていない状態から行われる。また、この割り付けは、更新した干渉情報62Bに基づく干渉関係にある変数の組に同一のレジスタを割り付けない範囲内において行われる。そのような割付ができない場合には、第2割付部650は、所定の基準に従ってある変数をスピルすると決定する。
構成の具体例は概ね第1割付部630と同一である。第2割付部650は、シンプリファイ部652およびセレクト部655を有する。これらの詳細については後述する。第2割付部650による割り付けの結果を割付結果68とする。その一例を図15に示す。
図15は、本実施形態に係る割付結果68の一例を示す。第2割付部650は、変数a1、変数c1´、および変数c4のそれぞれにレジスタr1を割り付ける。また、第2割付部650は、変数a3´および変数b1´のそれぞれに、レジスタr2を割り付ける。また、第2割付部650は、変数a2および変数b5をスピルすると決定する。図6の説明に戻る。
スピル生成部660は、第2割付部650がある第1変数をスピルすると決定したことを条件に、その第1変数に関するスピル用の各種命令をプログラム60中に生成する。例えば、スピル生成部660は、その第1変数に対する変数値の代入命令を、当該変数値を格納したレジスタの値をメモリ上の領域に格納する命令に変換する。また、スピル生成部660は、当該第1変数の変数値を参照する命令を、当該変数値をメモリ上の領域から読み出してレジスタに格納し、当該レジスタの値を参照する命令に変換する。
出力部670は、第2割付部650が変数にレジスタを割り付け、かつ、スピル生成部660がスピルのための命令を生成したプログラムを、結果プログラム69として第2最適化部130などに対し出力する。スピルのための命令とは、例えば、変数値の定義の毎に、当該変数値を一時的に格納したレジスタからメモリへ当該変数値を書込む命令と、その変数値の使用の毎にその領域からレジスタに値を読み出す命令である。そして、その後、変数変換部600は、この結果プログラム69中に含まれる各レジスタを変数とみなして、上記と同様の処理を繰り返してもよい。
図16は、本実施形態に係る出力プログラム24の一例を示す。まず、変数a1はレジスタr1に割り付けられている。このため、コンパイラ装置10は、変数a1に値を代入する命令を、例えば、レジスタr1にメモリから値を読み出すロード命令にコンパイルする。
なお、図16に示すLOAD命令は、第2オペランドから第1オペランドに値を読み出す命令を示す。また、[………]はアドレス演算子であり、メモリ中の………によって示されるアドレスからデータを読み出す演算を示す。
また、コンパイラ装置10は、変数a1を参照する命令を、レジスタr1を参照する命令にコンパイルする。この命令は、例えば、レジスタr1の内容をアドレスとして、メモリ中のそのアドレスから値を読み出す命令である。
一方で、変数a2はスピルすることが決定されている。従って、スピル生成部660は、その変数a2に対し変数a1から変数値を代入する代入命令を、当該変数値を格納したレジスタr2の値をメモリ上の領域[memA]に格納するストア命令に変換する。なお、図16に示すSTORE命令は、第1オペランドから第2オペランドが示す領域に対し値を書込む命令を示す。
この領域は、変数aの値を格納するために予め確保される領域である。この変数がメソッドまたは関数の局所変数の場合において、この領域は例えばスタック中に確保されてもよい。即ち、コンパイラ装置10がこのような領域を確保するための命令を各メソッドまたは各関数の先頭部分に生成してよい。
次に、変数b1−4はレジスタr2に割り付けられている。このため、コンパイラ装置10は、変数b1に値を代入する命令を、例えば、レジスタr2にメモリから値を読み出すロード命令にコンパイルする。
また、第2割付部650は、その他に変数b1−4を参照する命令を、レジスタr2を参照する命令に置換する。例えば、レジスタr2の内容をアドレスとしてメモリ中のそのアドレスから値を読み出す命令が生成されてもよい。
この結果、変数b1から変数b2に変数値を代入する命令は、レジスタr2からレジスタr2に値を代入する命令に置換される。第2最適化部130は、このような代入先および代入元を同一とする代入命令をプログラム60から削除する。この結果、出力プログラム24においては、変数bを参照する本来の命令のみが残り、変数間の代入命令は除外されている。
同様に、変数b2から変数b3への代入命令、変数b3から変数b4への代入命令、変数a3から変数a4への代入命令、変数c1から変数c2への代入命令、変数c2から変数c3への代入命令、および、変数c3から変数c4への代入命令も削除される。
一方で、変数b5はスピルすることが決定されている。従って、スピル生成部660は、その変数b5に対し変数b4から変数値を代入する代入命令を、当該変数値を格納したレジスタr2の値をメモリ上の領域[memB]に格納するストア命令に変換する。
また、変数c1−4はレジスタr1に割り付けられている。このため、コンパイラ装置10は、変数c1に値を代入する命令を、例えば、レジスタr1にメモリから値を読み出すロード命令にコンパイルする。
そして、コンパイラ装置10は、変数c1−4を参照する命令を、レジスタr1を参照する命令にコンパイルする。この命令は、例えば、レジスタr1の内容をアドレスとして、メモリ中のそのアドレスから値を読み出す命令である。
変数a2は、上述のようにスピルすることが決定されている。そして、変数a2に対する変数値の代入命令はストア命令にコンパイルされている。この場合において、スピル生成部660は、変数a2の変数値を参照する命令を、当該変数値をメモリ上の領域から読み出してレジスタに格納し、当該レジスタの値を参照する命令に変換する。例えば、メモリ上の領域[memA]から値を読み出してレジスタr2に格納するロード命令、および、そのレジスタr2の内容をアドレスとしてメモリ上のそのアドレスから値を読み出すロード命令が生成される。
同様に、変数b5は、上述のようにスピルすることが決定されている。そして、変数b5に対する変数値の代入命令はストア命令にコンパイルされている。この場合において、スピル生成部660は、変数b5の変数値を参照する命令を、当該変数値をメモリ上の領域から読み出してレジスタに格納し、当該レジスタの値を参照する命令に変換する。例えば、メモリ上の領域[memB]から値を読み出してレジスタr2に格納するロード命令、および、そのレジスタr2の内容をアドレスとしてメモリ上のそのアドレスから値を読み出すロード命令が生成される。
以上のように、変数の代入・参照はレジスタのロード・ストアなどの各種命令に変換される。但し、スピルされたことが決定された変数について、その変数に値を代入する命令は、メモリにデータをストアする命令に変換される。また、その変数の値を参照する命令はメモリからデータをロードする命令に変換される。また、プログラム60により生成された代入命令は、生存区間の連続する複数の変数に同一のレジスタが割り付けられていることを条件に削除される。
以上、図1−16を参照して説明したように、本実施形態に係るコンパイラ装置10によれば、一旦は細かく分割した変数を、一度目のレジスタ割付の結果を利用して部分的に融合する。そして、コンパイラ装置10は、融合した変数について改めてレジスタ割付を行う。このため、結果として適度に分割した変数をレジスタ割付の対象とすることができる。これにより、コンパイラ装置10は、変数を分割することによるスピル低減と、変数を融合することによるレジスタ間コピーの削減とをバランス良く達成して、プログラムの効率を全体として向上できる。
より詳細には、第2割付部650が第1割付部630と同一の手順に従ってレジスタ割付を行うことで、上記の適度な分割が実現される。その理由の概略を説明する。いま、第1割付部630および第2割付部650の間に行われる変数の置換および情報の併合(まとめて変数の融合と呼ぶ)により、可能性として下記の利点および欠点が生じる場合がある。
[利点]変数x1と変数x2を融合すると、変数x1および変数x2の双方と干渉関係にある変数yの次数が1減少する。したがって、変数yをレジスタに割り付け易くなる
[欠点]変数x1と変数x2を融合すると、融合後の変数xと干渉関係にある他の変数の数は、融合前の変数x1および変数x2の何れかの次数と等しいかそれより多くなる。従って、変数xをレジスタに割り付けにくくなる。
但し、変数の融合は、第1割付部630により同一のレジスタを割り付けたことを条件に行われる。第2割付部650が第1割付部630と同一の手順・基準でレジスタを割り付けると、多くの場合、融合前の各変数x1およびx2に割り付けたレジスタが、融合後の変数xにも割り付けられることが期待される。また、変数x1および変数x2のそれぞれと干渉関係にある他の変数にも融合前後で同一のレジスタが割り付けられることが期待される。
従って、たとえ融合後の変数xの次数が見かけ上増加したとしても、変数x1−2およびそれと干渉関係にある他の変数は、第1割付部630によりレジスタに割り付けられていたのであるから、第2割付部650によってもレジスタに割り付けられることが期待される。即ち、上記[欠点]は、見かけ上の次数の増加はもたらすものの、多くの場合、融合後の変数xにレジスタが割り当てられるかどうかは、融合の前後で変化しないことが期待される。一方、上記[利点]に関して、次数が減少することは、レジスタ割り付けの自由度を向上させて、効率向上のための様々な機会を提供できる。
次に、図17から図20を参照して、本実施形態におけるレジスタ割付のより詳しい処理の流れを説明する。なお、図17から図20に示す処理は、ベースとなるレジスタ割付手順として非特許文献5に記載された技術を利用しているが、レジスタ割付手順はこれに限られない。
図17は、本実施形態に係るレジスタ割付部110が変数にレジスタを割り付ける処理の流れを示す。変数変換部600は、対象プログラム22内の各変数を複数の変数に変換する(S1700)。この変換は、例えば、変数変換部600が、ある変数の生存区間を分割して、分割した生存区間ごとにその変数の値を保持する複数の変数を生成することで実現されてよい。
代入命令生成部610は、変換した当該複数の変数のうちのある変数から他の変数への代入命令を対象プログラム22中に生成する(S1710)。例えば、変数aが変数a1および変数a2に変換された場合、代入命令生成部610は、変数a1から変数a2に値を代入する命令を生成する。このように、代入命令生成部610は、それぞれの生存区間が互いに連続する変数の組について、生存区間の境界に代入命令を生成してよい。
情報生成部620は、対象プログラム22中で使用される複数の変数についての干渉情報62A、代入情報64Aおよび優先度65Aを生成して、記憶装置120に格納する(S1720)。そして、第1割付部630は、プログラム60の中で使用されるそれぞれの変数に、予め定められた基準数の物理レジスタ、および、仮想レジスタの中から予め定められた手順に従ってレジスタを選択して割り付ける(S1730)。
具体的には、第1割付部630は、レジスタ割付の候補となる第1の変数について、当該第1の変数を代入元とした代入先の第2の変数、または、当該第1の変数を代入先とした代入元の第2の変数を、代入情報64Aに基づいて選択する。そして、第1割付部630は、干渉情報62Aに基づく干渉関係にある変数の組に同一のレジスタを割り付けない範囲内において当該第1の変数に割付可能なレジスタのうち、選択した当該第2の変数に既に割り付けたレジスタと同一のレジスタを、当該第1の変数に割り付ける。
処理段階の具体例として、シンプリファイ部632は、シンプリファイ処理を行う(S1732)。また、セレクト部635は、セレクト処理を行う(S1735)。これらの処理の詳細は後述する。
更新部640は、第1割付部630により同一のレジスタが割り付けられ、かつ、代入情報64Aにおいて互いに対応付けられた複数の変数を干渉グラフ上で融合する(S1740)。この融合の処理は、主に、変数の置換、および、各種情報の更新、によって実現される。具体的には、まず、更新部640は、第1割付部630により仮想レジスタを含め同一のレジスタが割り付けられ、かつ、代入情報64Aにおいて互いに対応付けられたた複数の変数を新たな変数に置換する。例えば、更新部640は、プログラム60の内容を書き換えてもよい。
そして、更新部640は、当該複数の変数のそれぞれについての干渉関係を記憶装置120の干渉情報62Aから読み出して併合する。例えば、更新部640は、当該複数の変数の少なくとも何れか1つとの間で干渉関係にある他の変数を、記憶装置120に記憶された干渉情報に基づき検索し、当該干渉関係を、当該複数の変数に代わる新たな変数と当該他の変数との間の干渉関係に変更する。
併合したその干渉関係は、当該新たな変数についての干渉関係となる。そして、更新部640は、生成したその干渉関係により干渉情報62Aを更新する。さらに、更新部640は、干渉関係を併合する当該複数の変数については、当該複数の変数についての代入情報を併合して記憶装置120の代入情報64Aを更新してよい。
次に、第2割付部650は、更新部640が、その更新の処理を予め定められた回数行ったか否かを、第1のレジスタ割付の終了条件として判断する(S1750)。この回数は、例えば1回などの極めて少ない回数でよい。予め定められた回数行っていない場合には(S1750:NO)、第1割付部630は、変数の置換されたプログラム60および更新された干渉情報62B等に基づいて、既に割り付けた結果に関わらず、何れの変数にもレジスタを割り付けていない状態からレジスタ割付を行う。
これに代えて、第2割付部650は、更新の処理の回数が2回以上の場合においては、第1割付部630によるレジスタ割り付けの結果が、第1割付部630による以前のレジスタ割り付けの結果と等しいかどうかを判断してよい。この場合、等しい場合には、第2割付部650は、終了条件が成立したものとしてS1760に処理を進める。異なる場合には、第1割付部630はレジスタ割付を再び行う。このように、第1割付部630は、情報の更新の毎にレジスタ割付を行い、更新部640は、レジスタ割付の毎に情報を更新するというように、第1割付部630および更新部640は相互に処理を繰り返してもよい。これにより繰り返しの毎に徐々にプログラムの効率を向上させることができる。
終了条件が成立したことを条件に(S1750:YES)、第2割付部650は、第1割付部630により同一のレジスタが割り付けられた当該複数の変数に代えて当該新たな変数を使用するプログラム60中の各変数に、第1割付部630と同一の手順に従って上記基準数のレジスタの中からレジスタを選択して割り付ける(S1760)。この割り付けは、第1割付部630による割付の結果とは無関係に、何れの変数にもレジスタをまだ割り付けていない状態から行われる。そのような割付ができない場合には、第2割付部650は、所定の基準に従ってある変数をスピルすると決定する。
具体的には、第2割付部650は、レジスタ割付の候補となる第1の変数について、当該第1の変数を代入元とした代入先の第2の変数、または、当該第1の変数を代入先とした代入元の第2の変数を、更新後の代入情報64Bに基づいて選択する。そして、第2割付部650は、干渉情報62Bに基づく干渉関係にある変数の組に同一のレジスタを割り付けない範囲内において当該第1の変数に割付可能なレジスタのうち、選択した当該第2の変数に既に割り付けたレジスタと同一のレジスタを、当該第1の変数に割り付ける。
処理段階の具体例として、シンプリファイ部652は、シンプリファイ処理を行う(S1762)。また、セレクト部655は、セレクト処理を行う(S1765)。これらの処理の詳細は後述する。
スピル生成部660は、第2割付部650がある第1変数をスピルすると決定したことを条件に、その第1変数に関するスピル用の各種命令をプログラム60中に生成する(S1770)。例えば、スピル生成部660は、その第1変数に対する変数値の代入命令を、当該変数値を格納したレジスタの値をメモリ上の領域に格納する命令に変換する。また、スピル生成部660は、当該第1変数の変数値を参照する命令を、当該変数値をメモリ上の領域から読み出してレジスタに格納し、当該レジスタの値を参照する命令に変換する。
出力部670は、予め定められた終了条件が成立したか否かを判断する(S1780)。この終了条件は、第2割付部650が何れの変数もスピルしなかったことであってよい。即ちこれにより、レジスタを割り付けるべき変数の生存区間が、繰り返しの毎に短くなってゆき、変数にレジスタを割り付けやすくなってゆく。そして、何れかの繰り返しの時点において全ての変数にレジスタを割り付けられるようになり、この終了条件が成立する。これに代えて、コンパイラ装置10が、スピルのためのレジスタを予め確保している場合には、ここの終了条件は常に成立する。即ち、上記S1700からS1770は1度だけ処理される。終了条件が成立したことを条件に(S1780:YES)、出力部670は、変数にレジスタを割り付けたプログラムを出力して、図17の処理を終了する。
終了条件が成立していなければ(S1780:NO)、出力部670はS1700に処理を戻す。この場合には、レジスタ割付部110は、割り付けたレジスタをあたかも変数であるかのようにみなして、上記の処理を繰り返す。
図18は、S1732およびS1762における処理の流れの詳細を示す。シンプリファイ部632は、干渉関係にある変数の数が、プログラム60の実行に使用可能なレジスタの上限数として予め定められた上記基準数未満の変数を干渉情報62Aに基づいて検索する(S1800)。そして、シンプリファイ部632は、そのような変数が検索されなければ(S1810:NO)、優先度65Aに基づく優先度の最も低い変数を選択する(S1820)。
そして、シンプリファイ部632は、当該選択した変数をスタックにプッシュする(S1830)。また、シンプリファイ部632は、当該選択した変数についての干渉関係を干渉情報62Aから除外する(S1840)。シンプリファイ部632は、割り付けるべき全ての変数がプッシュされていなければ(S1850:NO)、S1800に処理を戻して、割り付けるべき全ての変数がプッシュされるまで上記処理を繰り返す。
なお、シンプリファイ部652がS1762として行う処理も、上記干渉情報62Aに代えて干渉情報62Bに基づき、上記優先度65Aに代えて優先度65Bに基づくことの他は、図18に示す処理と略同一であるから説明を省略する。
なお、スタックに変数をプッシュする、とは、その変数を識別するデータをスタック型のデータ構造を有する記憶領域に記憶することをいう。また、スタックから変数をポップする、とは、その変数を識別するデータをスタック型のデータ構造を有する記憶領域から読み出すことをいう。
図19は、S1735における処理の流れの詳細を示す。セレクト部635は、スタックが空か否かを判断する(S1900)。スタックが空でなければ(S1900:NO)、セレクト部635は、スタックから変数をポップする(S1910)。そして、セレクト部635は、ポップしたその変数と干渉関係にある他の変数にはまだ割り当てられていない物理レジスタである未割当レジスタを検索する(S1920)。
これは、例えば以下のように実現される。セレクト部635は、ポップしたその変数を干渉グラフにおいて表すノードに直接連結された他の全てのノードを干渉情報62Aから検索する。そして、セレクト部635は、検索した他の全てのノードに既に割り当てたレジスタの集合を、例えば記憶装置120などに記憶した割り付け結果を示す情報に基づき選択する。そして、セレクト部635は、予め定められた上記基準数のレジスタから、選択した当該レジスタの集合を除外した残りのレジスタを未割当レジスタとして検索する。
次に、セレクト部635は、ポップしたその変数を代入元とする代入先の変数、または、ポップしたその変数を代入先とする代入元の変数を、代入情報64Aに基づいて選択する(S1930)。これは、例えば代入情報64Aから、ポップしたその変数との間の代入関係が数値1である他の変数を検索することによって実現される。
次に、セレクト部635は、未割当レジスタのうち、選択した当該変数に既に割り付けられたレジスタがあるかどうか判断する(S1940)。そのようなレジスタがあれば(S1940:YES)、セレクト部635は、そのレジスタを選択して、ポップしたその変数に割りつける(S1990)。
一方、選択した当該変数に既に割り付けられたレジスタが未割当レジスタの中に無ければ(S1940:NO)、セレクト部635は、他の未割当レジスタがあるかどうか判断する(S1950)。他の未割当レジスタがあれば(S1950:YES)、セレクト部635は、そのレジスタを選択して、ポップしたその変数に割り付ける(S1990)。
未割当レジスタがなければ(S1950:NO)、セレクト部635は、ポップした当該変数と干渉関係にある他の変数にまだ割り当てられていない仮想レジスタである未割当仮想レジスタのうち、ポップした当該変数と代入情報64Aにおいて対応付けられた他の変数(即ち、ポップした当該変数を代入先とする代入元の変数またはポップした当該変数を代入元とする代入先の変数)に既に割り当てられた仮想レジスタがあるかどうかを判断する(S1960)。
そのような仮想レジスタがあれば(S1960:YES)、セレクト部635は、その仮想レジスタを選択して、ポップしたその変数に割り付ける(S1990)。そのような仮想レジスタがなければ(S1960:NO)、セレクト部635は、ポップした当該変数と干渉関係にある他の変数にまだ割り当てられておらず、かつ、さらに他の変数に既に割り付けた仮想レジスタがあるかどうかを判断する(S1970)。
ポップしたその変数と干渉関係にある他の変数にはまだ割り付けられていないレジスタが仮想レジスタも含め存在しなければ(S1970:YES)、セレクト部635は、新たに仮想レジスタを1つ生成する(S1980)。そして、セレクト部635は、生成したその仮想レジスタを、ポップしたその変数に割り付ける(S1990)。以上の処理を、セレクト部635は、スタックが空になるまで(S1900:YES)繰り返す。
図20は、S1765における処理の流れの詳細を示す。セレクト部655は、スタックが空か否かを判断する(S2000)。スタックが空でなければ(S2000:NO)、セレクト部655は、スタックから変数をポップする(S2010)。そして、セレクト部655は、ポップしたその変数と干渉関係にある他の変数にはまだ割り当てられていない物理レジスタである未割当レジスタを検索する(S2020)。
これは、例えば以下のように実現される。セレクト部655は、ポップしたその変数を干渉グラフにおいて表すノードに直接連結された他の全てのノードを干渉情報62Bから検索する。そして、セレクト部655は、検索した他の全てのノードに既に割り当てたレジスタの集合を、例えば記憶装置120などに記憶した割り付け結果を示す情報に基づき選択する。そして、セレクト部655は、予め定められた上記基準数のレジスタから、選択した当該レジスタの集合を除外した残りのレジスタを未割当レジスタとして検索する。
次に、セレクト部655は、ポップしたその変数を代入元とする代入先の変数、または、ポップしたその変数を代入先とする代入元の変数を、代入情報64Bに基づいて選択する(S2030)。これは、例えば代入情報64Bから、ポップしたその変数との間の代入関係が数値1である他の変数を検索することによって実現される。
次に、セレクト部655は、未割当レジスタのうち、選択した当該変数に既に割り付けられたレジスタがあるかどうか判断する(S2040)。そのようなレジスタがあれば(S2040:YES)、セレクト部655は、そのレジスタを選択して、ポップしたその変数に割りつける(S2070)。
一方、選択した当該変数に既に割り付けられたレジスタが未割当レジスタの中に無ければ(S2040:NO)、セレクト部655は、他の未割当レジスタがあるかどうか判断する(S2050)。他の未割当レジスタがあれば(S2050:YES)、セレクト部655は、そのレジスタを選択して、ポップしたその変数に割り付ける(S2070)。
一方、未割当レジスタを選択できなければ(S2050:NO)、セレクト部655は、ポップしたその変数をスピルすると決定する(S2060)。以上の処理を、セレクト部655は、スタックが空になるまで(S2000:YES)繰り返す。
次に、図21から図32を参照して、コンパイルの対象とする他のプログラムについて、変数にレジスタを割り付ける具体例を示す。
図21は、本実施形態に係るコンパイラ装置10がコンパイルの対象とする他のプログラムについて、変数の干渉関係及び優先度の一例を示す。
(a)に示すように、変数変換の結果、プログラムは変数p1およびp2、変数q1およびq2、変数r1およびr2ならびに変数sを含む。そして、変数p1は変数q1、変数q2、変数r1、変数r2および変数sとの間でそれぞれ干渉関係にある。また、変数p2は、変数q1、変数q2、変数r1、変数r2および変数sとの間でそれぞれ干渉関係にある。さらに、変数q1は変数r2と干渉関係にあり、変数q2は変数r1および変数sとそれぞれ干渉関係にある。
また、アルファベット部分が等しい変数の組は、代入命令の代入元および代入先となっている。例えば変数p1および変数p2の一方を代入先とする代入命令は、変数p1および変数p2の他方を代入元としている。この代入命令は、図7の例のようにある変数を変換した結果として生成された代入命令であってもよいが、入力プログラムに元々記述されていた代入命令であってもよい。
何れの変数もプログラム中で1回参照されるので、いずれの変数についても利得(x)は1である。また、変数p1、p2、q1、q2、r1、r2およびsのそれぞれの次数(y)は、5、5、3、4、4、3および4である。従って、それぞれの変数について、その変数をスピルすることによって蒙る損失のコスト(x/y)は、それぞれ、0.2、0.2、0.3333、0.25、0.25、0.3333および0.25である。また、レジスタ割り付け前においてスタックは空である。
図22は、シンプリファイ処理(S1732)によってある干渉関係が干渉情報から除外される処理の第1手順を示す。この例において、プログラムの実行に使用することができる物理レジスタの上限数は3個である。図21の干渉グラフを参照すると、何れの変数の次数も3以上である。従って、シンプリファイ部632は、レジスタに割り付ける優先度の最も低い変数を選択する。
優先度が最も低いということは、スピルによって蒙る損失が最も小さいということである。この例では変数p1およびp2のコストが0.2で最も小さい。従って、シンプリファイ部632は、そのうち任意の一方、例えば変数p1を選択して、スタックにプッシュする。
変数p1のプッシュに応じて、シンプリファイ部632は、干渉情報および優先度を更新する。この結果、変数q1、変数q2、変数r1、変数r2および変数sの次数はそれぞれ1減少して、減少後の次数は2、3、3、2および3となる。また、コストはこの次数を用いて再計算される。
図23は、シンプリファイ処理(S1732)によって次の干渉関係が干渉情報から除外される処理の第2手順を示す。図22の干渉グラフを参照すると、変数q1およびr2の次数が基準数である3未満である。従って、シンプリファイ部632は、これらの変数を選択してスタックにプッシュする。これらの変数の間でプッシュされる順序は何れかに限定されなくてよい。そして、シンプリファイ部632は、選択したこれらの変数についての干渉関係を干渉情報から除外する。
この結果、スタックには、底側から順に変数p1、q1およびr2が格納される。変数q1およびr2のプッシュに応じて、シンプリファイ部632は、干渉情報および優先度を更新する。この結果、変数p2の次数が2減少して3となる。また、コストはこの次数を用いて再計算される。
図24は、シンプリファイ処理(S1732)によって更に次の干渉関係が干渉情報から除外される処理の第3手順を示す。図23のグラフを参照すると、何れの変数の次数も基準数3である。従って、シンプリファイ部632は、レジスタに割り付ける優先度の最も低い変数を選択する。
この例では何れの変数のコストも同じである。そのような場合、シンプリファイ部632は、任意の変数を選択してプッシュしてもよい。これに代えて、シンプリファイ部632は、代入情報に基づいて、既にプッシュした変数を代入元とする代入先の変数、または、既にプッシュした変数を代入先とする代入元の変数を選択し、その変数をプッシュしてよい。例えば、変数p2が選択されてプッシュされる。
この結果、スタックには、底側から順に変数p1、q1、r2およびp2が格納される。変数p2のプッシュに応じて、シンプリファイ部632は、干渉情報および優先度を更新する。この結果、変数q2、r1およびsの次数がそれぞれ1減少して2となる。また、コストはこの次数を用いて再計算される。
図25は、シンプリファイ処理(S1732)によって更に次の干渉関係が干渉情報から除外される処理の第4手順を示す。図24のグラフを参照すると、何れの変数の次数も基準数3未満である。従って、シンプリファイ部632は、これらの変数を任意の順序で選択してスタックにプッシュする。この結果、スタックには、底側から順に変数p1、q1、r2、p2、q2、r1およびsが格納される。
図26は、セレクト処理(S1735)によって変数にレジスタが割り付けられる処理の第1手順を示す。セレクト部635は、グラフを再構築しながら、変数をスタックから順次ポップして、ポップした変数にレジスタを割り付ける。割り付けは、干渉関係にある変数の組に同一のレジスタを割り付けないという条件の下行われる。また、この割り付けは、各レジスタを色彩とし、干渉グラフの各ノードを、互いにエッジで直接連結されたノードの組を同一の色彩で彩色しない範囲内で各色彩で彩色する問題に置き換えることができる。
具体的には、セレクト部635は、まず変数sをポップすると、干渉グラフからは何れの干渉関係も除外されているので、変数sを示すノードを任意の色彩で彩色する。そして次に、セレクト部635は、変数r1をポップすると、その変数r1と、既にポップされた変数sとの間の干渉関係を干渉情報に追加する。
そして、セレクト部635は、追加したその干渉関係に基づき、変数r1を、それと干渉関係にある変数sに既に彩色した色彩とは異なる色彩に彩色する。そして次に、セレクト部635は、変数q2をポップすると、その変数q2と、既にポップされた変数r1およびsとの間の干渉関係を干渉情報に追加する。セレクト部635は、変数q2に、既にポップされた変数r1およびsに既に彩色されたいずれの色彩とも異なる色彩を彩色する。
この結果、変数q2は、第1レジスタを示す色彩「黄色」で彩色され、変数r1は、第2レジスタを示す色彩「緑」で彩色され、変数sは、第3レジスタを示す色彩「青」で彩色される。スタックからは、変数q2、変数r2および変数sが取り除かれる。
なお、このような処理を実現可能とするためには、干渉情報の取り扱いとして下記の点に注意することが望ましい。まず、干渉グラフは一旦削除された後に、当初の干渉関係に基づいて、当初の干渉グラフとして再構築される。従って、当初の干渉グラフそれ自体を削除してしまうと、当初の干渉グラフを再構築することはできない。
このため、シンプリファイ部632は、シンプリファイ処理の前に、元の干渉グラフを複写して作業用の干渉グラフを生成して記憶装置120に格納することが望ましい。そして、シンプリファイ部632は、その作業用の干渉グラフを更新することで、その干渉グラフから干渉関係を徐々に取り除く。一方、セレクト部635は、その作業用の干渉グラフではなく元の干渉グラフを参照して変数間の干渉関係を判断したうえで、作業用の干渉グラフを再構築する。これにより、当初の干渉グラフを適切に再構築できる。
図27は、セレクト処理(S1735)によって変数にレジスタが割り付けられる処理の第2手順を示す。次に、セレクト部635は、変数p2をスタックからポップする。セレクト部635は、変数p2と、既にポップされた変数q2、r1およびsとの間の干渉関係を再構築する。
そして、セレクト部635は、ポップされた変数p2を示すノードを彩色するべく、変数p2と干渉関係にある他の変数に既に彩色された色彩とは異なる色彩を検索する。しかしながら、変数p2と干渉関係にある他の変数には、既に基準数の色彩が彩色されている。そこで、セレクト部635は、変数p2に仮想レジスタを割り付ける。ここではその仮想レジスタを*と記す。この結果、スタックには変数p、変数q1および変数r2が残る。
図28は、セレクト処理(S1735)によって変数にレジスタが割り付けられる処理の第3手順を示す。上記と同様の処理によって、セレクト部635は、変数r2および変数q1を順次ポップする。その結果、変数r2を示すノードは「緑」に、変数q1を示すノードは「黄色」に、それぞれ彩色される。
しかしながら、セレクト部635は、最後にポップされる変数p1を示すノードを、物理レジスタを示す色彩で彩色することができない。従って、セレクト部635は、変数p1を示すノードを、例えば仮想レジスタを示す「*」で彩色する。
ここで、この彩色結果をそのまま利用してレジスタ割付の結果とする場合には、変数p1およびp2がスピルの対象となる。そしてその場合、変数p1およびp2にレジスタを割り付けることによって得られる利得、即ち利得1に利得1を加えた利得2が得られない。具体的には、変数p1の値を参照する命令1回について、メモリから値をロードする命令が実行され、変数p2の値を参照する命令1回について、メモリから値をロードする命令が実行される。
続いて、この割り付け結果に基づいてノード融合することで、この損失を低減する処理の具体例を示す。
図29は、変数の融合(S1740)によって変数の干渉情報および優先度が併合される処理の一例を示す。
更新部640は、第1割付部630により同一のレジスタが割り付けられ、かつ代入情報64Aにおいて相互に対応付けられた複数の変数を新たな変数に置換する。図28を参照すると、変数q1およびq2は同一のレジスタに割り付けられている。また、変数r1およびr2は同一のレジスタに割り付けられている。また、変数p1およびp2は共に同一の仮想レジスタに割り付けられている。
したがって、更新部640は、変数p1およびp2を新たな変数pに置換する。また、更新部640は、変数q1およびq2を新たな変数qに置換する。また、更新部640は、変数r1およびr2を新たな変数rに置換する。
この結果得られた各種の情報を(a)および(b)に示す。変数pは変数q、rおよびsとそれぞれ干渉関係にある。変数qは変数rおよびsとそれぞれ干渉関係にある。変数rは変数sと干渉関係にある。また、変数pの参照回数は2回であり、変数qの参照回数は2回であり、変数rの参照回数は2回であり、変数sの参照回数は1回であるから、各変数の利得はそれぞれ2、2、2および1である。次数およびコストは図示の通りである。
図30は、シンプリファイ処理(S1762)によって干渉関係が干渉情報から除外される処理の第1手順を示す。図29を参照すると、次数が基準数3未満の変数は無い。従って、シンプリファイ部652は、優先度の最も低い変数sを選択してスタックにプッシュする。この結果、変数p、qおよびrの次数は3から2に減少する。また、スタックには変数sが格納される。
図31は、シンプリファイ処理(S1762)によって干渉関係が干渉情報から除外される処理の第2手順を示す。図30を参照すると、変数p、qおよびrの次数はそれぞれ2であり、基準数3未満である。したがって、シンプリファイ部652は、変数p、qおよびrをスタックにプッシュする。プッシュの順序は問わない。この結果、全ての変数がスタックに格納される。
図32は、セレクト処理(S1765)によって変数にレジスタが割り付けられる処理の一例を示す。セレクト部655は、干渉グラフを再構築しながら変数r、qおよびpを順次ポップする。そして、セレクト部655は、ポップした当該変数に、当該変数と干渉関係にある既にポップした変数とは異なるレジスタを割り付ける。この結果、例えば変数pは「青色」に彩色され、変数rは「緑色」に彩色され、変数qは「黄色」に彩色される。変数「s」はスピルされることが決定される。
ここで、図28において第1割付部630のみがレジスタを割り付けた場合と比較して、図32の例では、変数p1およびp2に代えて変数sがスピルされている。変数p1およびp2の利得の合計は2であるのに対し、変数sの利得は1である。従って、第1割付部630に加えて更新部640がレジスタ割付を行うことで、失われる利得が1減少している。具体的には、例えば変数の値をメモリからレジスタに読み出す処理を1回減少させることができる。
図33は、本実施形態に係るコンパイラ装置10として機能するコンピュータ500のハードウェア構成の一例を示す。コンピュータ500は、ホストコントローラ1082により相互に接続されるCPU1000、RAM1020、及びグラフィックコントローラ1075を有するCPU周辺部と、入出力コントローラ1084によりホストコントローラ1082に接続される通信インターフェイス1030、ハードディスクドライブ1040、及びCD−ROMドライブ1060を有する入出力部と、入出力コントローラ1084に接続されるBIOS1010、フレキシブルディスクドライブ1050、及び入出力チップ1070を有するレガシー入出力部とを備える。
ホストコントローラ1082は、RAM1020と、高い転送レートでRAM1020をアクセスするCPU1000及びグラフィックコントローラ1075とを接続する。CPU1000は、BIOS1010及びRAM1020に格納されたプログラムに基づいて動作し、各部の制御を行う。グラフィックコントローラ1075は、CPU1000等がRAM1020内に設けたフレームバッファ上に生成する画像データを取得し、表示装置1080上に表示させる。これに代えて、グラフィックコントローラ1075は、CPU1000等が生成する画像データを格納するフレームバッファを、内部に含んでもよい。
入出力コントローラ1084は、ホストコントローラ1082と、比較的高速な入出力装置である通信インターフェイス1030、ハードディスクドライブ1040、及びCD−ROMドライブ1060を接続する。通信インターフェイス1030は、ネットワークを介して外部の装置と通信する。ハードディスクドライブ1040は、コンピュータ500が使用するプログラム及びデータを格納する。CD−ROMドライブ1060は、CD−ROM1095からプログラム又はデータを読み取り、RAM1020又はハードディスクドライブ1040に提供する。
また、入出力コントローラ1084には、BIOS1010と、フレキシブルディスクドライブ1050や入出力チップ1070等の比較的低速な入出力装置とが接続される。BIOS1010は、コンピュータ500の起動時にCPU1000が実行するブートプログラムや、コンピュータ500のハードウェアに依存するプログラム等を格納する。フレキシブルディスクドライブ1050は、フレキシブルディスク1090からプログラム又はデータを読み取り、入出力チップ1070を介してRAM1020またはハードディスクドライブ1040に提供する。入出力チップ1070は、フレキシブルディスク1090や、例えばパラレルポート、シリアルポート、キーボードポート、マウスポート等を介して各種の入出力装置を接続する。
コンピュータ500に提供されるプログラムは、フレキシブルディスク1090、CD−ROM1095、又はICカード等の記録媒体に格納されて利用者によって提供される。プログラムは、入出力チップ1070及び/又は入出力コントローラ1084を介して、記録媒体から読み出されコンピュータ500にインストールされて実行される。プログラムがコンピュータ500等に働きかけて行わせる動作は、図1から図32において説明したコンパイラ装置10における動作と同一であるから、説明を省略する。
以上に示したプログラムは、外部の記憶媒体に格納されてもよい。記憶媒体としては、フレキシブルディスク1090、CD−ROM1095の他に、DVDやPD等の光学記録媒体、MD等の光磁気記録媒体、テープ媒体、ICカード等の半導体メモリ等を用いることができる。また、専用通信ネットワークやインターネットに接続されたサーバシステムに設けたハードディスク又はRAM等の記憶装置を記録媒体として使用し、ネットワークを介してプログラムをコンピュータ500に提供してもよい。
以上、図1から図33を参照して説明したように、本実施形態に係るコンパイラ装置10によれば、一度目のレジスタ割付により同一のレジスタに割り付けられ、かつ、相互に代入関係にある変数を融合して、融合後の干渉関係について二度目のレジスタ割付を行う。そして、二度目のレジスタ割付は一度目のレジスタ割付と同一の手順に従う。これにより、融合前後で同一の割当が行われやすいことを利用して融合により生じる不利益を軽減しつつ、融合により各変数の次数を減少させて、レジスタ割当の自由度を向上させることができる。この結果、例えば、図21から図32に示したように、スピルにより追加的に必要な処理を減少させるなどして、プログラムの実行効率を向上させることができる。
以上、本発明を実施の形態を用いて説明したが、本発明の技術的範囲は上記実施の形態に記載の範囲には限定されない。上記実施の形態に、多様な変更または改良を加えることのできることが当業者にとって明らかである。その様な変更または改良を加えた形態も本発明の技術的範囲に含まれ得ることが、特許請求の範囲の記載から明らかである。
図1は、本実施形態に係るコンパイラ装置10の全体構成を示す。 図2は、ある対象プログラム22の中で使用される各変数の使用状況を示す。 図3は、各変数の値を特定のレジスタが一貫して保持する場合におけるレジスタの割付結果の一例を示す。 図4は、各変数を複数の変数に変換したうえでレジスタを割り付ける場合におけるレジスタの割付結果の第1例を示す。 図5は、各変数を複数の変数に変換したうえでレジスタを割り付ける場合におけるレジスタの割付結果の第2例を示す。 図6は、本実施形態に係るレジスタ割付部110の機能構成の一例を示す。 図7は、本実施形態に係るプログラム60の一例を示す。 図8は、本実施形態に係る干渉情報62Aの一例を示す。 図9は、本実施形態に係る代入情報64Aの一例を示す。 図10は、本実施形態に係る優先度65Aの一例を示す。 図11は、本実施形態に係る割付結果66の一例を示す。 図12は、本実施形態に係る干渉情報62Bの一例を示す。 図13は、本実施形態に係る代入情報64Bの一例を示す。 図14は、本実施形態に係る優先度65Bの一例を示す。 図15は、本実施形態に係る割付結果68の一例を示す。 図16は、本実施形態に係る出力プログラム24の一例を示す。 図17は、本実施形態に係るレジスタ割付部110が変数にレジスタを割り付ける処理の流れを示す。 図18は、S1732およびS1762における処理の流れの詳細を示す。 図19は、S1735における処理の流れの詳細を示す。 図20は、S1765における処理の流れの詳細を示す。 図21は、本実施形態に係るコンパイラ装置10がコンパイルの対象とする他のプログラムについて、変数の干渉関係及び優先度の一例を示す。 図22は、シンプリファイ処理(S1732)によってある干渉関係が干渉情報から除外される処理の第1手順を示す。 図23は、シンプリファイ処理(S1732)によって次の干渉関係が干渉情報から除外される処理の第2手順を示す。 図24は、シンプリファイ処理(S1732)によって更に次の干渉関係が干渉情報から除外される処理の第3手順を示す。 図25は、シンプリファイ処理(S1732)によって更に次の干渉関係が干渉情報から除外される処理の第4手順を示す。 図26は、セレクト処理(S1735)によって変数にレジスタが割り付けられる処理の第1手順を示す。 図27は、セレクト処理(S1735)によって変数にレジスタが割り付けられる処理の第2手順を示す。 図28は、セレクト処理(S1735)によって変数にレジスタが割り付けられる処理の第3手順を示す。 図29は、変数の融合(S1740)によって変数の干渉情報および優先度が併合される処理の一例を示す。 図30は、シンプリファイ処理(S1762)によって干渉関係が干渉情報から除外される処理の第1手順を示す。 図31は、シンプリファイ処理(S1762)によって干渉関係が干渉情報から除外される処理の第2手順を示す。 図32は、セレクト処理(S1765)によって変数にレジスタが割り付けられる処理の一例を示す。 図33は、本実施形態に係るコンパイラ装置10として機能するコンピュータ500のハードウェア構成の一例を示す。
符号の説明
10 コンパイラ装置
22 対象プログラム
24 出力プログラム
60 プログラム
62 干渉情報
64 代入情報
65 優先度
66 割付結果
68 割付結果
69 結果プログラム
100 第1最適化部
110 レジスタ割付部
120 記憶装置
130 第2最適化部
500 コンピュータ
600 変数変換部
610 代入命令生成部
620 情報生成部
630 第1割付部
632 シンプリファイ部
635 セレクト部
640 更新部
650 第2割付部
652 シンプリファイ部
655 セレクト部
660 スピル生成部
670 出力部

Claims (12)

  1. コンパイルの対象となるプログラムの中で使用される変数にレジスタを割り付けるコンパイラ装置であって、
    前記プログラムの中で使用されるある変数と他の変数とが前記プログラムの実行中の何れかの時点において同時に有効な値を保持している関係である干渉関係にあるかどうかを示す干渉情報、および、前記プログラム中の代入命令の代入元の変数を代入先の変数に対応付けた代入情報を記憶している記憶装置と、
    前記プログラムの中で使用されるそれぞれの変数に、前記干渉関係にある変数の組に同一のレジスタを割り付けない範囲内において、予め定められた基準数以上のレジスタの中から予め定められた手順に従ってレジスタを選択して割り付ける第1割付部と、
    複数の前記変数に、前記第1割付部により同一のレジスタが割り付けられ、かつ、当該複数の変数が前記代入情報において互いに対応付けられていることを条件に、当該複数の変数を新たな変数に置換すると共に、当該複数の変数のそれぞれについての前記干渉関係を前記記憶装置から読み出して併合して、当該新たな変数についての干渉関係を生成し、生成した当該干渉関係により前記干渉情報を更新する更新部と、
    当該複数の変数に代えて当該新たな変数を使用する前記プログラム中の各変数に、更新した前記干渉情報に基づく干渉関係にある変数の組に同一のレジスタを割り付けない範囲内において、前記第1割付部と同一の前記手順に従って前記基準数のレジスタの中からレジスタを選択して割り付ける第2割付部と、
    前記第2割付部が変数にレジスタを割り付けた前記プログラムを出力する出力部と
    を備えるコンパイラ装置。
  2. 前記予め定められた基準数は、前記プログラムの実行に使用することのできるレジスタである物理レジスタの上限数として予め定められた数であり、
    前記第1割付部は、前記基準数の物理レジスタに、前記プログラムの実行には使用することのできない仮想的なレジスタである仮想レジスタを少なくとも1つ加えたレジスタの集合の中から、前記予め定められた手順に従ってレジスタを選択して各変数に割り付け、
    前記第2割付部は、当該新たな変数を使用する前記プログラム中の各変数に、前記基準数と同数の物理レジスタの中から前記予め定められた手順に従ってレジスタを選択して割り付ける、請求項1に記載のコンパイラ装置。
  3. 前記第1割付部は、レジスタ割付の候補となる第1の変数について、当該第1の変数を代入元とした代入先の第2の変数、または、当該第1の変数を代入先とした代入元の第2の変数を、前記代入情報に基づいて選択すると共に、更新前の前記干渉情報に基づく干渉関係にある変数の組に同一のレジスタを割り付けない範囲内において当該第1の変数に割付可能なレジスタのうち、選択した当該第2の変数に既に割り付けたレジスタと同一のレジスタを、当該第1の変数に割り付け、
    前記更新部は、干渉関係を併合する当該複数の変数については、さらに、前記代入情報を併合して前記記憶装置の代入情報を更新し、
    前記第2割付部は、レジスタ割付の候補となる第1の変数について、当該第1の変数を代入元とした代入先の第2の変数、または、当該第1の変数を代入先とした代入元の第2の変数を、前記代入情報に基づいて選択すると共に、更新後の前記干渉情報に基づく干渉関係にある変数の組に同一のレジスタを割り付けない範囲内において当該第1の変数に割付可能なレジスタのうち、選択した当該第2の変数に既に割り付けたレジスタと同一のレジスタを、当該第1の変数に割り付ける、
    請求項2に記載のコンパイラ装置。
  4. 前記記憶装置は、さらに、それぞれの変数について当該変数にレジスタを割り付ける優先度を記憶しており、また、スタックを実現するための記憶領域を有し、
    前記第1割付部は、
    干渉関係にある変数の数が前記基準数未満の変数を前記干渉情報に基づいて検索し、検索されれば当該変数を選択し、検索されなければ前記優先度の最も低い変数を選択して、当該選択した変数を前記スタックにプッシュすると共に、当該選択した変数についての干渉関係を前記干渉情報から除外する処理、を、割り付けるべき全ての変数をプッシュするまで繰り返すシンプリファイ部と、
    前記スタックから変数をポップし、ポップした当該変数を代入元とする代入先の変数、または、ポップした当該変数を代入先とする代入元の変数を前記代入情報に基づいて選択し、ポップした当該変数と干渉関係にある他の変数にはまだ割り付けられていない物理レジスタである未割当レジスタのうち、選択した当該変数に既に割り付けられたレジスタがあれば当該レジスタを選択し、選択した当該変数に既に割り付けられた当該レジスタが前記未割当レジスタの中に無ければ他の未割当レジスタを選択し、未割当レジスタが無ければポップした当該変数と干渉関係にある他の変数にはまだ割り付けられていない仮想的なレジスタである未割当仮想レジスタのうち、選択した当該変数に既に割り付けられた仮想レジスタがあれば当該レジスタを選択して、ポップした当該変数に選択した当該レジスタを割り付ける、処理を、前記スタックが空になるまで繰り返すセレクト部と
    を有し、
    前記更新部は、複数の前記変数に、前記仮想的なレジスタを含め同一のレジスタが割り付けられており、かつ、前記代入情報において互いに対応付けられていることを条件に、当該複数の変数の少なくとも何れか1つとの間で干渉関係にある他の変数を、前記記憶装置に記憶された前記干渉情報に基づき検索し、当該干渉関係を、当該複数の変数に代わる新たな変数と当該他の変数との間の干渉関係に変更し、
    前記第2割付部は、
    干渉関係の併合された前記干渉情報に基づいて、干渉関係にある変数の数が前記基準数未満の変数を検索し、検索されれば当該変数を選択し、検索されなければ前記優先度の最も低い変数を選択して、当該選択した変数を前記スタックにプッシュすると共に、当該選択した変数についての干渉関係を前記干渉情報から除外する処理、を、割り付けるべき全ての変数をプッシュするまで繰り返すシンプリファイ部と、
    前記スタックから変数をポップし、ポップした当該変数を代入元とする代入先の変数、または、ポップした当該変数を代入先とする代入元の変数を前記代入情報に基づいて選択し、ポップした当該変数と干渉関係にある他の変数にはまだ割り付けられていない物理レジスタである未割当レジスタのうち、選択した当該変数に既に割り付けられたレジスタがあれば当該レジスタを選択し、選択した当該変数に既に割り付けられたレジスタが前記未割当レジスタの中に無ければ他の未割当レジスタを選択し、選択した当該未割当レジスタをポップした当該変数に割り付け、未割当レジスタを選択できなければポップした当該変数をスピルすると決定する、処理を、前記スタックが空になるまで繰り返すセレクト部と
    を有し、
    前記出力部は、コンパイルした前記プログラムに、スピルすると決定した変数の値については使用の毎にメモリからレジスタに読み出す命令、および、変数値の定義の毎にレジスタからメモリへ当該変数値を書込む命令を含めて出力する、請求項3に記載のコンパイラ装置。
  5. 前記第1割付部における前記セレクト部は、ポップした当該変数と干渉関係にある他の変数にはまだ割り付けられていない仮想レジスタである未割当仮想レジスタのうち、ポップした当該変数と前記代入情報において対応付けられている他の変数に既に割り付けられた仮想レジスタが存在しなくても、ポップした当該変数と干渉関係にある他の変数にはまだ割り付けられていない、既に他の変数に割り付けた前記仮想レジスタがあれば、ポップした当該変数に当該仮想レジスタを割り付け、ポップした当該変数と干渉関係にある他の変数にはまだ割り付けられていないレジスタが、当該仮想レジスタを含めて存在しなければ、新たに前記仮想レジスタを生成してポップした当該変数に割り付ける、請求項4に記載のコンパイラ装置。
  6. 前記記憶装置は、前記プログラムにより使用される各変数をノードとし、互いに干渉関係にある変数の組を示すノードの組を、エッジで連結したグラフである干渉グラフを、前記干渉情報として記憶しており、
    前記第1割付部および前記第2割付部は、各レジスタを色彩とし、前記干渉グラフの各ノードを、互いにエッジで直接連結されたノードの組を同一の色彩で彩色しない範囲内で、各色彩で彩色することで、変数に割り付けるレジスタを決定し、
    前記更新部は、前記第1割付部により同一のレジスタが割り付けられ、かつ、前記代入情報において互いに対応付けられた複数の変数について、前記干渉グラフにおける当該複数の変数を表す複数のノードを新たな1つのノードに置換すると共に、前記干渉グラフにおける当該複数のノードのそれぞれと他のそれぞれのノードとの間のエッジを、当該新たな1つのノードと当該他のそれぞれのノードとの間のエッジに置換する、請求項1に記載のコンパイラ装置。
  7. ある変数を、その変数の生存区間を分割して、分割した生存区間ごとにその変数の値を保持する複数の変数を生成することで、当該複数の変数に変換する変数変換部と、
    変換した当該複数の変数のうちのある変数から他の変数への代入命令を前記プログラム中に生成する代入命令生成部と、
    変換後の当該複数の変数を含む、前記プログラム中で使用される複数の変数についての干渉関係を示す情報を、前記干渉情報として生成して前記記憶装置に格納すると共に、生成した前記代入命令の代入元および代入先となる変数の組を示す代入情報を生成して前記記憶装置に格納する情報生成部と
    を更に備え、
    前記第1割付部は、前記記憶装置に格納された前記干渉情報及び前記代入情報に基づいて変数にレジスタを割り付け、
    前記更新部は、前記記憶装置に格納された前記代入情報に基づいて、前記記憶装置に格納された前記干渉情報を更新する、請求項3に記載のコンパイラ装置。
  8. 前記第2割付部がある第1変数をスピルすると決定したことを条件に、当該第1変数に対する変数値の代入命令を、当該変数値を格納するレジスタの値をメモリ上の領域に格納する命令に変換すると共に、当該第1変数の変数値を参照する命令を、当該変数値をメモリ上の領域から読み出してレジスタに格納し、当該レジスタの値を参照する命令に変換する、スピル生成部と、
    前記第1割付部は、さらに、前記スピル生成部および前記第2割付部が生成したレジスタを変数とみなして、それぞれの変数にレジスタを割り付ける
    請求項3に記載のコンパイラ装置。
  9. 前記第1割付部は、前記更新部が前記干渉情報を更新する毎に、前記プログラムの中で使用されるそれぞれの変数に、前記更新部が更新した前記干渉情報に基づき前記干渉関係にある変数の組に同一のレジスタを割り付けない範囲内において、前記基準数以上のレジスタの中から前記手順に従ってレジスタを選択して割り付ける処理、を行い、
    前記更新部は、前記第1割付部がレジスタを割り付ける毎に、同一のレジスタを割り付け、かつ、前記代入情報において相互に対応付けられた複数の変数のそれぞれについての前記干渉関係を前記記憶装置から読み出して併合することで、当該複数の変数に代わる新たな変数についての干渉関係を生成し、生成した当該干渉関係により前記干渉情報を更新する処理、を行い、
    前記第2割付部は、前記更新部が前記更新する処理を予め定められた回数行ったことを条件に、更新後の前記干渉情報に基づいて変数にレジスタを割り付ける
    請求項1に記載のコンパイラ装置。
  10. 前記第1割付部は、レジスタ割付の候補となる第1の変数について、当該第1の変数を代入元とした代入先の第2の変数、または、当該第1の変数を代入先とした代入元の第2の変数を、前記代入情報に基づいて選択すると共に、更新前の前記干渉情報に基づく干渉関係にある変数の組に同一のレジスタを割り付けない範囲内において当該第1の変数に割付可能なレジスタのうち、選択した当該第2の変数に既に割り付けたレジスタと同一のレジスタを、当該第1の変数に割り付け、
    前記更新部は、干渉関係を併合する当該複数の変数については、さらに、前記代入情報を併合して前記記憶装置の代入情報を更新し、
    前記第2割付部は、レジスタ割付の候補となる第1の変数について、当該第1の変数を代入元とした代入先の第2の変数、または、当該第1の変数を代入先とした代入元の第2の変数を、前記代入情報に基づいて選択すると共に、更新後の前記干渉情報に基づく干渉関係にある変数の組に同一のレジスタを割り付けない範囲内において当該第1の変数に割付可能なレジスタのうち、選択した当該第2の変数に既に割り付けたレジスタと同一のレジスタを、当該第1の変数に割り付ける、
    請求項1に記載のコンパイラ装置。
  11. コンパイルの対象となるプログラムの中で使用される変数に、コンピュータによってレジスタを割り付けるコンパイル方法であって、 前記コンピュータは、 前記プログラムの中で使用されるある変数と他の変数とが前記プログラムの実行中の何れかの時点において同時に有効な値を保持している関係である干渉関係にあるかどうかを示す干渉情報、および、前記プログラム中の代入命令の代入元の変数を代入先の変数に対応付けた代入情報を記憶している記憶装置を有し、 前記プログラムの中で使用されるそれぞれの変数に、前記干渉関係にある変数の組に同一のレジスタを割り付けない範囲内において、予め定められた基準数以上のレジスタの中から予め定められた手順に従ってレジスタを選択して割り付けるステップと、 複数の前記変数に、前記割り付けるステップにおいて同一のレジスタが割り付けられ、かつ、当該複数の変数が前記代入情報において互いに対応付けられていることを条件に、当該複数の変数を新たな変数に置換すると共に、当該複数の変数のそれぞれについての前記干渉関係を前記記憶装置から読み出して併合して、当該新たな変数についての干渉関係を生成し、生成した当該干渉関係により前記干渉情報を更新するステップと、 当該複数の変数に代えて当該新たな変数を使用する前記プログラム中の各変数に、更新した前記干渉情報に基づく干渉関係にある変数の組に同一のレジスタを割り付けない範囲内において、前記割り付けるステップと同一の前記手順に従って前記基準数のレジスタの中からレジスタを選択して割り付けるステップと、 後段の前記割り付けるステップにおいてレジスタに割り付けられた変数を含む前記プログラムを出力するステップと を実行するコンパイル方法。
  12. コンパイルの対象となるプログラムの中で使用される変数にレジスタを割り付けるコンパイラ装置として、コンピュータを機能させるプログラムであって、
    前記コンピュータは、
    前記プログラムの中で使用されるある変数と他の変数とが前記プログラムの実行中の何れかの時点において同時に有効な値を保持している関係である干渉関係にあるかどうかを示す干渉情報、および、前記プログラム中の代入命令の代入元の変数を代入先の変数に対応付けた代入情報を記憶している記憶装置を有し、
    前記コンピュータを、
    前記プログラムの中で使用されるそれぞれの変数に、前記干渉関係にある変数の組に同一のレジスタを割り付けない範囲内において、予め定められた基準数以上のレジスタの中から予め定められた手順に従ってレジスタを選択して割り付ける第1割付部と、
    複数の前記変数に、前記第1割付部により同一のレジスタが割り付けられ、かつ、当該複数の変数が前記代入情報において互いに対応付けられていることを条件に、当該複数の変数を新たな変数に置換すると共に、当該複数の変数のそれぞれについての前記干渉関係を前記記憶装置から読み出して併合して、当該新たな変数についての干渉関係を生成し、生成した当該干渉関係により前記干渉情報を更新する更新部と、
    当該複数の変数に代えて当該新たな変数を使用する前記プログラム中の各変数に、更新した前記干渉情報に基づく干渉関係にある変数の組に同一のレジスタを割り付けない範囲内において、前記第1割付部と同一の前記手順に従って前記基準数のレジスタの中からレジスタを選択して割り付ける第2割付部と、
    前記第2割付部が変数にレジスタを割り付けた前記プログラムを出力する出力部
    として機能させるプログラム。
JP2007223143A 2007-08-29 2007-08-29 プログラムのコンパイルのために変数にレジスタを割り付ける技術 Expired - Fee Related JP5165969B2 (ja)

Priority Applications (2)

Application Number Priority Date Filing Date Title
JP2007223143A JP5165969B2 (ja) 2007-08-29 2007-08-29 プログラムのコンパイルのために変数にレジスタを割り付ける技術
US12/133,349 US8266603B2 (en) 2007-08-29 2008-06-04 Technique for allocating register to variable for compiling

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP2007223143A JP5165969B2 (ja) 2007-08-29 2007-08-29 プログラムのコンパイルのために変数にレジスタを割り付ける技術

Publications (2)

Publication Number Publication Date
JP2009059001A JP2009059001A (ja) 2009-03-19
JP5165969B2 true JP5165969B2 (ja) 2013-03-21

Family

ID=40409535

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2007223143A Expired - Fee Related JP5165969B2 (ja) 2007-08-29 2007-08-29 プログラムのコンパイルのために変数にレジスタを割り付ける技術

Country Status (2)

Country Link
US (1) US8266603B2 (ja)
JP (1) JP5165969B2 (ja)

Families Citing this family (24)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US8225295B2 (en) * 2007-09-21 2012-07-17 Jens Palsberg Register allocation by puzzle solving
US8180805B2 (en) * 2008-08-25 2012-05-15 Sap Ag Systems and methods for assigning hosts in response to a data query
US8713543B2 (en) * 2009-02-11 2014-04-29 Johnathan C. Mun Evaluation compiler method
US8732680B2 (en) * 2009-02-19 2014-05-20 International Business Machines Corporation Intermediate form for bitwidth sensitive applications and uses thereof
CA2675680C (en) * 2009-08-27 2013-05-14 Ibm Canada Limited - Ibm Canada Limitee Generating object code that uses calculated contents for a variable determined from a predicate
US8516465B2 (en) * 2009-12-04 2013-08-20 Oracle America, Inc. Register prespill phase in a compiler
US9009692B2 (en) * 2009-12-26 2015-04-14 Oracle America, Inc. Minimizing register spills by using register moves
CA2691851A1 (en) * 2010-02-04 2011-08-04 Ibm Canada Limited - Ibm Canada Limitee Control flow analysis using deductive reaching definitions
US8555267B2 (en) * 2010-03-03 2013-10-08 Red Hat, Inc. Performing register allocation of program variables based on priority spills and assignments
US8832671B1 (en) * 2010-07-07 2014-09-09 Nvidia Corporation Conflict-free register allocation
US8555035B1 (en) 2010-07-07 2013-10-08 Nvidia Corporation Conflict-free register allocation using a multi-bank register file with input operand alignment
WO2012025792A1 (en) * 2010-08-26 2012-03-01 Freescale Semiconductor, Inc. Optimization method for compiler, optimizer for a compiler and storage medium storing optimizing code
US9696975B2 (en) * 2010-09-03 2017-07-04 International Business Machines Corporation Allocating register halves independently
US8893104B2 (en) * 2012-01-26 2014-11-18 Qualcomm Incorporated Method and apparatus for register spill minimization
US8806460B2 (en) 2012-01-26 2014-08-12 Qualcomm Incorporated Method and apparatus for avoiding register interference
KR101813140B1 (ko) 2013-05-15 2018-01-30 삼성전자주식회사 코드 실행 장치 및 그 코드 실행 장치를 이용한 코드 실행 방법
US9710263B2 (en) * 2013-09-26 2017-07-18 International Business Machines Corporation Understanding computer code with human language assistance
CN105637474B (zh) * 2013-10-18 2019-03-22 马维尔国际贸易有限公司 用于寄存器分配的系统和方法
US9329867B2 (en) 2014-01-08 2016-05-03 Qualcomm Incorporated Register allocation for vectors
US9582255B1 (en) 2015-08-28 2017-02-28 International Business Machines Corporation Method of splitting register live ranges
US9733911B2 (en) * 2015-11-11 2017-08-15 National Instruments Corporation Value transfer between program variables using dynamic memory resource mapping
US10951259B2 (en) * 2017-10-30 2021-03-16 Electronics And Telecommunications Research Institute Method for simultaneously transmitting/receiving upstream and downstream signals using remote PHY architecture and apparatus for the same
GB2582785A (en) * 2019-04-02 2020-10-07 Graphcore Ltd Compiling a program from a graph
CN111736899B (zh) * 2020-05-29 2023-09-08 中国科学院计算技术研究所 一种网络处理器上寄存器的分配方法

Family Cites Families (17)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPH0769831B2 (ja) * 1987-09-01 1995-07-31 株式会社日立製作所 コンパイラにおけるレジスタ割当て方法
JPH04199428A (ja) * 1990-11-29 1992-07-20 Matsushita Electric Ind Co Ltd レジスタ装置およびレジスタ割り付け方法
JP3299611B2 (ja) * 1993-10-20 2002-07-08 松下電器産業株式会社 資源割付装置
JP2857600B2 (ja) * 1995-05-11 1999-02-17 松下電器産業株式会社 プロセッサ及びプログラム翻訳装置
JP3650649B2 (ja) * 1995-06-16 2005-05-25 松下電器産業株式会社 最適化装置
US5881288A (en) * 1995-09-29 1999-03-09 Matsushita Electric Industrial Co., Ltd. Debugging information generation system
US5784066A (en) * 1995-11-22 1998-07-21 International Business Machines Corporation Method and apparatus for using partner information to color nodes in an interference graph within a computer system
JPH10293691A (ja) * 1997-04-18 1998-11-04 Hitachi Ltd レジスタ割り付け方法
US6421824B1 (en) * 1999-04-23 2002-07-16 Sun Microsystems, Inc. Method and apparatus for producing a sparse interference graph
JP4041248B2 (ja) * 1999-07-09 2008-01-30 松下電器産業株式会社 コンパイラ装置、コンパイルプログラムが記録されたコンピュータ読み取り可能な記録媒体及びコンパイル方法
JP3641997B2 (ja) * 2000-03-30 2005-04-27 日本電気株式会社 プログラム変換装置及び方法並びに記録媒体
JP3651774B2 (ja) * 2000-09-12 2005-05-25 インターナショナル・ビジネス・マシーンズ・コーポレーション コンパイラ及びそのレジスタ割付方法
US6925639B2 (en) * 2001-02-23 2005-08-02 Microsoft Corporation Method and system for register allocation
US6898787B2 (en) * 2001-03-22 2005-05-24 Hewlett-Packard Development Company, L.P. Method and apparatus for ordered predicate phi in static single assignment form
JP3956112B2 (ja) * 2002-06-12 2007-08-08 インターナショナル・ビジネス・マシーンズ・コーポレーション コンパイラ、レジスタ割当装置、プログラム、記録媒体、コンパイル方法、及びレジスタ割当方法
JP3901182B2 (ja) * 2004-06-30 2007-04-04 日本電気株式会社 プログラム並列化装置及びその方法並びにプログラム
US8010953B2 (en) * 2006-04-04 2011-08-30 International Business Machines Corporation Method for compiling scalar code for a single instruction multiple data (SIMD) execution engine

Also Published As

Publication number Publication date
US20090064112A1 (en) 2009-03-05
US8266603B2 (en) 2012-09-11
JP2009059001A (ja) 2009-03-19

Similar Documents

Publication Publication Date Title
JP5165969B2 (ja) プログラムのコンパイルのために変数にレジスタを割り付ける技術
Hack et al. Register allocation for programs in SSA-form
US8104026B2 (en) Compiler register allocation and compilation
TWI498817B (zh) 減少64位元電腦程式迴圈內符號擴展指令的需求導向運算法
US8291398B2 (en) Compiler for optimizing program
US8555035B1 (en) Conflict-free register allocation using a multi-bank register file with input operand alignment
US20080005722A1 (en) Compiling device, compiling method and recording medium
US5946491A (en) Register allocation method and apparatus for gernerating spill code as a function of register pressure compared to dual thresholds
US5784066A (en) Method and apparatus for using partner information to color nodes in an interference graph within a computer system
US6925639B2 (en) Method and system for register allocation
AU773940B2 (en) Method and apparatus for allocating stack slots
JPH07121377A (ja) 資源割付装置
JP5966509B2 (ja) プログラム、コード生成方法および情報処理装置
US8832671B1 (en) Conflict-free register allocation
JP4178278B2 (ja) コンパイラ装置、最適化方法、コンパイラプログラム、及び記録媒体
US8266416B2 (en) Dynamic reconfiguration supporting method, dynamic reconfiguration supporting apparatus, and dynamic reconfiguration system
US7979853B2 (en) Compiler device, method, program and recording medium
JPH0816871B2 (ja) プログラム翻訳装置およびプログラム翻訳方法
JP4042972B2 (ja) 最適化コンパイラ、コンパイラプログラム、及び記録媒体
JP4045802B2 (ja) プログラム処理装置及びプログラム処理方法、記憶媒体、並びにコンピュータ・プログラム
JP4039633B2 (ja) 最適化コンパイラ、コンパイル方法、コンパイラプログラム、及び記録媒体
JP3638171B2 (ja) 資源割付装置
US20040172624A1 (en) Compiler apparatus and method for determining locations for data in memory area
US7774748B1 (en) System and method for automatic conversion of a partially-explicit instruction set to an explicit instruction set
JP3692884B2 (ja) プログラム処理方法および記録媒体

Legal Events

Date Code Title Description
A621 Written request for application examination

Free format text: JAPANESE INTERMEDIATE CODE: A621

Effective date: 20100524

A977 Report on retrieval

Free format text: JAPANESE INTERMEDIATE CODE: A971007

Effective date: 20120515

A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A131

Effective date: 20120529

A521 Request for written amendment filed

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20120601

A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A131

Effective date: 20121009

RD14 Notification of resignation of power of sub attorney

Free format text: JAPANESE INTERMEDIATE CODE: A7434

Effective date: 20121015

A521 Request for written amendment filed

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20121109

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: 20121204

A61 First payment of annual fees (during grant procedure)

Free format text: JAPANESE INTERMEDIATE CODE: A61

Effective date: 20121220

FPAY Renewal fee payment (event date is renewal date of database)

Free format text: PAYMENT UNTIL: 20151228

Year of fee payment: 3

R150 Certificate of patent or registration of utility model

Free format text: JAPANESE INTERMEDIATE CODE: R150

LAPS Cancellation because of no payment of annual fees