(57)【特許請求の範囲】
【請求項１】
ソースプログラムを翻訳して目的プログラムを得るコンパイラ装置であって、
目的プログラムにおける命令順序を並べ替え、並列実行すべき命令の組合せを決定するスケジューリング手段と、
実行順序が並べ替えられた目的プログラムにおいて、各命令で定義され、又は、参照されている資源を、別の資源に書き換える書換手段とを備え、
前記書換手段は、
実行順序が並べ替えられた目的プログラムを解析して、目的プログラムに含まれる資源に値を定義する命令から定義された値を最後に参照する命令までの生存区間を生成する基本解析部と、
前記基本解析部にて生成された複数の生存区間のうち1つを選ぶ処理(1)、選ばれた生存区間reの開始点又は終了点と、一致する開始点又は終了点を有し、同一の資源に属する別の生存区間eを全て検出して、検出された全ての生存区間eを選ばれた生存区間reに連結する処理(2)を、生成された全ての生存区間に対して繰り返す拡張生存区間生成部と、
前記連結の繰り返しにより複数の拡張生存区間が得られれば、複数の拡張生存区間のうち1つを拡張生存区間REとして選ぶ処理(1)、拡張生存区間REに割付可能な資源を、拡張生存区間REと、他の拡張生存区間との重複に基づいて求める処理(2)、拡張生存区間REにおいて定義され、参照されている資源を、割付可能資源に書き換える処理(3)を、複数の拡張生存区間のそれぞれに対して実行する書換処理部と
を備えることを特徴とするコンパイラ装置。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明は、高級プログラミング言語にて記述されたソースプログラムを目的プログラムに翻訳するコンパイラに適用される最適化手法に関し、特に目的プログラムに含まれる各命令のオペランドに割り付けられている資源を、別の資源に変更するよう、命令を書き換える技術に関する。
【０００２】
【従来の技術】
かってはコードサイズが小さな機械語プログラムを生成することがコンパイラの理想とされていたが、近年では、それと並んで、プロセッサの並列実行能力を最大限に発揮させる機械語プログラム（目的プログラム）を生成することも、コンパイラの理想とされつつある。
【０００３】
一般論になるが、高級プログラミング言語を用いて記述されたソースプログラムは並列実行性が高いといわれる。これは、高級プログラミング言語の文法、言語要素がレジスタ、メモリ等のハードウェア資源に拘束されず、ソースプログラムを構成する複数の命令は、プログラマにより任意に定義された変数を用いて記述されているので命令間の依存関係が少ないからである。
【０００４】
これに対して機械語プログラムは、プロセッサが直接実行するものであり、数値の保持、演算がハードウェア資源を被演算子とした機械語命令にて構成されている。これらハードウェア資源における記憶要素は有限であるので、機械語プログラムには、これらの資源に値を定義する機械語命令と、その値を使用する機械語命令との間に多くの依存関係が発生している。依存関係が多くあると、機械語命令の順序の入れ換えや並列実行すべき機械語命令の組み合わせを決定するという命令スケジューリングを好適に行うことができず、並列実行性は自ずと低くなる。ソースプログラム、機械語プログラムにおける上記の性質を考えるとコンパイル時には、ソースプログラムにおいて存在する命令間の並列実行性をなるべく多く機械語プログラムに継承することが望ましい。並列実行性を機械語プログラムに継承させるためコンパイラは、ソースプログラムに含まれる変数に好適にハードウェア資源を割り付けることにより（この処理は一般に、資源割付処理と呼ばれる。）、並列実行性を機械語プログラムに継承させることが行われていた。
【０００５】
尚、コンパイラについての公知文献には以下に示すものがある。
文献  １  Ｓｈｌｏｍｉｔ  Ｓ．Ｐ．：  ”Ｒｅｇｉｓｔｅｒ  Ａｌｌｏｃａｔｉｏｎ  ｗｉｔｈ  Ｉｎｓｔｒｕｃｔｉｏｎ  Ｓｃｈｅｄｕｌｉｎｇ：  ａ  Ｎｅｗ  Ａｐｐｒｏａｃｈ”，  Ｐｒｏｃｅｅｄｉｎｇｓ  ｏｆ  ｔｈｅ  ＡＣＭ  ＳＩＧＰＬＡＮ  ’９３  Ｃｏｎｆｅｒｅｎｃｅ  ｏｎ  Ｐｒｏｇｒａｍｍｉｎｇ  Ｌａｎｇｕａｇｅｓ  Ｄｅｓｉｇｎ  ａｎｄ  Ｉｍｐｌｅｍｅｎｔａｔｉｏｎ，  １９９３．
文献  ２  Ａｈｏ、他：”Ｃｏｍｐｉｌｅｒｓ  −  Ｐｒｉｎｃｉｐｌｅｓ，  Ｔｅｃｈｉｎｉｑｕｅｓ  ａｎｄ  Ｔｏｏｌｓ”，  Ａｄｄｉｓｏｎ−Ｗｅｓｌｅｙ  Ｐｕｂｌｉｓｈｅｒｓ  Ｌｉｍｉｔｅｄ，  １９８９、（邦訳）原田賢一：”コンパイラ  −  原理・技法・ツール”，  株式会社サイエンス社，  １９９０．
文献  ３  Ａｎｄｒｅｗ  ｗ．  Ａｐｐｅｌ：  ”ｍｏｄｅｒｎ  ｃｏｍｐｉｌｅｒ  ｉｍｐｌｅｍｅｎｔａｔｉｏｎ  ｉｎ  Ｊａｖａ”，  Ｃａｍｂｒｉｄｇｅ  ｕｎｉｖｅｒｓｉｔｙ  ｐｒｅｓｓ，  １９９８．
以降、従来の資源割付処理についての説明を行なう。図１７（ａ）は、資源割付処理の対象となる中間プログラム（中間プログラムとは、ソースプログラムを一旦変換することにより得られた一時的なプログラムである。）の一例を示す図である。この中間プログラムに対して資源割付処理を行なう場合、このプログラムにおける中間命令ｓ１には変数ｔ３への代入があり、中間命令ｓ２では変数ｔ３の値を参照しているため、中間命令ｓ１を実行した後に中間命令ｓ２を実行しなければならないという実行順序の依存関係がある。
【０００６】
これに対して中間命令ｓ３には中間命令ｓ１，ｓ２との間には依存関係がない。つまり、中間命令ｓ３を中間命令ｓ１，ｓ２より先に実行しても良いし、ターゲットマシンが並列実行可能型であるならば、中間命令ｓ３と中間命令ｓ１，ｓ２と並列実行してもよい。この中間プログラムに対して資源割付処理を行ない、変数ｔ１，  ｔ２，  ｔ３，  ｔ４，  ｔ５，  ｔ６に対して、それぞれレジスタｒ０，  ｒ１，  ｒ０，  ｒ１，  ｒ２，  ｒ０  を割付けたとすると、各中間命令ｓ１，ｓ２，ｓ３に対応する機械語命令は図１７（ｂ）のようになる（機械語命令はアセンブラコードにて表記されるが、中間命令との対応をとるため、本図では中間命令と同一の表記で図示している。）。
【０００７】
この時、機械語命令ｓ３はレジスタｒ０への代入を行なっているので、機械語命令ｓ３は機械語命令ｓ２より先に実行することができないし、機械語命令ｓ１，ｓ２と並列に実行することもできない場合がある。これは、変数に対して資源割付処理を行なったために、機械語命令ｓ３と機械語命令ｓ１，ｓ２の間に新たな依存関係が発生したことによるものである。
【０００８】
かかる依存関係の発生を避けるため、文献１の資源割付処理は、中間プログラムにおいて依存関係がない中間命令の異なる変数に、異なるレジスタを割り付けることにより、これらの中間命令間に新たな依存関係を作らないような配慮を払う。図１７（ｃ）は、変数ｔ３と変数ｔ６には異なるレジスタを割り付けて、中間命令ｓ１，ｓ２と中間命令ｓ３の間に新たな依存関係を作らないように配慮が払われた資源割付処理結果の一例を示す図である。本図の一例では、中間プログラムの変数ｔ１，  ｔ２，  ｔ３，  ｔ４，  ｔ５，  ｔ６  に対して、それぞれレジスタｒ０，  ｒ１，  ｒ０，  ｒ１，  ｒ２，  ｒ３  が割付けられている。こうすることにより、中間命令ｓ１〜ｓ３に対応する機械語命令ｓ１〜ｓ３において、機械語命令ｓ３は機械語命令ｓ１，ｓ２より先に実行することもできるし、並列実行可能なプロセッサでは、機械語命令ｓ３は機械語命令ｓ１あるいはｓ２と並列に実行することもできるようになる。更に図１７（ｄ）に示すように、機械語命令ｓ２，ｓ３を入れ換えて機械語命令ｓ１，ｓ３を並列実行することが可能となる。このように並列実行性をソースプログラムから機械語プログラムに継承できるように変数へのレジスタ割付を行なうことによって、ターゲットマシンにおける並列実行能力を発揮させ、プログラムの短時間実行が可能となる。
【０００９】
【発明が解決しようとする課題】
ところで、依存関係がない中間命令の異なる変数に異なるレジスタを割り付けることにより依存関係の発生を防ぐ技術は、ともすれば、コンパイラの最終成果物たる機械語プログラムのコードサイズの増大化を誘発するという問題点がある。
【００１０】
本発明の目的は、ソースプログラムから機械語プログラムへと並列実行性を継承させつつも、機械語プログラムのコードサイズの増大を防ぐことができるコンパイラ装置を提供することである。
【００１１】
本発明の目的は、ソースプログラムから機械語プログラムへと並列実行性を継承させつつも、機械語プログラムのコードサイズの増大を防ぐことができるプログラム書換装置を提供することである。
【００１２】
上記の目的を達成するため、本発明に係るコンパイラ装置は、並列実行すべき命令の組合せを決定するスケジューリング手段と、実行順序が並べ替えられた目的プログラムにおいて、各命令で定義され、又は、参照されている資源を、別の資源に書き換える書換手段とを備え、前記書換手段は、実行順序が並べ替えられた目的プログラムを解析して、目的プログラムに含まれる資源に値を定義する命令から定義された値を最後に参照する命令までの生存区間を生成する基本解析部と、前記基本解析部にて生成された複数の生存区間のうち1つを選ぶ処理(1)、選ばれた生存区間reの開始点又は終了点と、一致する開始点又は終了点を有し、同一の資源に属する別の生存区間eを全て検出して、検出された全ての生存区間eを選ばれた生存区間reに連結する処理(2)を、生成された全ての生存区間に対して繰り返す拡張生存区間生成部と、前記連結の繰り返しにより複数の拡張生存区間が得られれば、複数の拡張生存区間のうち1つを拡張生存区間REとして選ぶ処理(1)、拡張生存区間REに割付可能な資源を、拡張生存区間REと、他の拡張生存区間との重複に基づいて求める処理(2)、拡張生存区間REにおいて定義され、参照されている資源を、割付可能資源に書き換える処理(3)を、複数の拡張生存区間のそれぞれに対して実行する書換処理部とを備えることを特徴としている。
【００１３】
【発明の実施の形態】
＜用語の説明＞
まず、コンパイラ装置の実施形態の説明に用いる技術用語について説明する。
・中間プログラム
中間プログラムは、中間命令の列であり、中間命令には４つ組や３つ組などの種類が存在する。例えば、図３（ａ）に示したソースプログラムをコンパイラが処理する中で生成した中間プログラムが図３（ｂ）である。この中間プログラムは4つ組方式にて表記されているものであり、ソースプログラムに存在しない変数（中間命令s1,s2等の中の現れるt1, t2, t3等）が挿入されていることがわかる。これらソースプログラムに存在せず、中間プログラムにて現れる変数は、一時変数と呼ばれ、コンパイラがソースプログラムを中間プログラムに変換する際、コンパイラにより挿入される。以下では特に断らない限り、一時変数を、一般のソースプログラム内の変数と対等に扱うものとする。
【００１４】
コンパイラにより生成された変数としては図３（ｂ）における変数Pr1があるが、これは図３（ａ）の仮引数aに対応するものである。変数retもコンパイラが生成したものであり、これは関数funcの戻り値を表すものである。また変数xは、ソースプログラム中の何処かで外部変数として定義されている変数であるとする。尚、ソースプログラムから中間プログラムへの変換方式自体は本実施形態と関係がなく、他の変換方式でも本実施形態は適用可能である。
・資源
コンピュータ、マイクロプロセッサの構成要素のうち、値を一時的に保持することができるもの、すなわち、レジスタやメモリのことを指す。
・レジスタ／メモリの定義、参照、使用
レジスタまたはメモリの値を、代入文や代入命令などを用いて設定することを「定義する」と呼ぶ。また、この設定された値を計算や命令のオペランドに用いることを「参照する」と呼ぶ。この、定義することと参照することを併せて「使用する」と呼ぶことにする。
・プロログ，エピログ
ソースプログラム上で手続き／関数として定義されている一連の処理のまとまりは、機械語プログラムに翻訳された時に、手続き／関数本体を実行する前と実行した後に手続き／関数本体を実行するためにスタック上に取られる駆動レコード（文献 2）の確保および開放に関連した前処理／後処理を行なうのが一般的である。この前処理のことを「プロログ」、後処理のことを「エピログ」という。「プロログ」・「エピログ」の中の処理で本実施形態に関連のあるものは、レジスタの値の待避／復帰処理である。これは、手続き／関数の呼出しの前後で、レジスタの値を保存するための処理である。手続き／関数呼出しの前後で値が保存されるレジスタを保証レジスタといい、逆に手続き／関数呼出しの前後で値が保証されないレジスタを破壊レジスタという。レジスタの値の待避・復帰処理は、手続き／関数本体で使用している保証レジスタの数だけ行なわれることになる。・基本ブロック
プログラムの先頭命令とジャンプ命令の飛び先の命令のことを「リーダ」と呼ぶことにすると、プログラム上で、リーダから、次のリーダより一つ手前の命令、またはプログラムの最後の命令までの区間にある命令群のことを「基本ブロック」と呼ぶ。
・生存区間
生存区間には、ソースプログラムにおけるものと、目的プログラムにおけるものとで異なる意味を持つ。ソースプログラムにおける生存区間とは、変数に値を定義する命令からその定義された値を最後に参照する命令までのプログラム上の区間のことをいう。一方、目的プログラムにおいて、かかる変数に該当するのは、命令のオペランドに割り付けられた資源であるので、目的プログラムにおける生存区間とは、命令のオペランドに割り付けられた資源に値を定義する命令からその定義された値を最後に参照する命令までのプログラム上の区間のことをいう。つまりレジスタ／メモリの生存区間の始点は、そのレジスタ／メモリに値が定義されたプログラムの命令となり、生存区間の終点は、その定義された値が最後に参照されるプログラムの命令となる。但し、プログラム中に並列実行する命令の組は、同ステップに実行される命令として一つにまとめて扱う。2つの生存区間が重複しているかどうかの判定を行なう際には、一方の終点と他方の始点だけが一致している場合はこれら２つの生存区間は重複していないものとして扱うのが一般的である。生存区間を表す命令の集合積を用いて重複／非重複の判定を行なうために、生存区間の終端を表す命令は、生存区間を表す命令の集合には含めないこととする。
【００１５】
図１０は、生存区間の一例を示す図である。図の左側にあるアセンブラ命令列に対応して、その右側に各レジスタの生存区間を図示している。この図では、生存区間は縦実線で、生存区間の開始点は黒丸で、生存区間の終了点は矢印でそれぞれ表現している。命令i5と命令i6、命令i15と命令i16はそれぞれ並列に実行する命令の組であり、生存区間の始点／終点は２つの命令で共有する形となっている。当該図の情報を表に表したのが図６に示した生存区間データ集合である。
＜実施形態＞
図２は、コンパイラ１の構成を示す図である。本図に示すように、コンパイラ１は、構文解析装置１１と、最適化・資源割付装置１２と、目的プログラム生成装置１３と、スケジューリング装置１４と、プログラム書換装置１５と、再スケジューリング装置１６とから構成される。
【００１６】
構文解析装置１１は、記憶装置にファイルとして記憶されているソースプログラムの字句解析と、構文解析と、意味解析とを行ない、ソースプログラムを中間プログラムに変換する。例えば図３（ａ）のソースプログラムを構文解析装置１１で処理して出力された中間プログラムを図３（ｂ）に示す。
最適化・資源割付装置１２は、目的プログラムのコードサイズの縮小と、実行効率の向上とを実現するために中間プログラムの最適化を行い、中間プログラム内の変数をハードウェア資源に割付ける。この際、最適化・資源割付装置１２は、従来技術と同様、依存関係がない中間命令の異なる変数に、ターゲットマシンにおける資源割り付け可能な全てのレジスタを割り付ける。
【００１７】
目的プログラム生成装置１３は、最適化・資源割付装置１２による資源割り付け結果に従って、中間プログラムを、機械語命令からなる目的プログラムに変換する。例えば、図３（ｂ）に示された中間プログラムに対して目的プログラム生成装置１３がプログラム生成を行うと、図４に示す機械語命令からなる目的プログラムが生成されることとなる。図４においてアセンブラコードにて表記された機械語命令について説明する。”ｍｏｖ”は転送命令を表し、例えば”ｍｏｖ  ｒ０，  ｒ２”は、レジスタｒ０が保持する値をレジスタｒ２へ転送することを表し、”ｍｏｖ  ２０，  ｒ１”は、値２０をレジスタｒ１へ転送することを表す。また、”ａｄｄ”，  ”ｓｕｂ”，  ”ｍｕｌ”，  ”ｄｉｖ”はそれぞれ加算、減算、乗算、除算命令を表し、例えば”ａｄｄ  ２，  ｒ２”は、２とｒ２の加算結果をｒ２に格納することを表し、”ｓｕｂ  ｒ１，  ｒ２”は、ｒ２−ｒ１の計算結果をｒ２に格納することを表す。この例では図３（ｂ）に示した中間プログラムの一つの中間命令から一つの機械語命令が生成されているが、一つの中間命令から複数の機械語命令が生成されることもある。最適化・資源割付装置１２は、資源割り付け可能な全てのレジスタ（レジスタｒ０〜レジスタｒ３）を変数に割り付けているので、退避命令、復帰命令の数は多い目になっている。
【００１８】
スケジューリング装置１４は、機械語命令のプログラムに対して、実行効率向上のために命令の実行順序の並べ替えを行い、並列実行すべき命令の組み合わせを決定する。スケジューリング装置１４は本実施形態の主眼ではなく、文献  ３に記載のものと同様であるので、その処理の概要のみを触れておくものとする。
実行順序の並べ替え、及び、並列実行すべき命令の組み合わせの決定は、プログラムを解析して依存関係を得て、この依存関係を遵守するように行う。より詳しくいうと、命令間の依存関係には、「データ依存関係」、「逆依存関係」、「出力依存関係」という３種類のものがある。
【００１９】
「データ依存関係」とは、ある資源を定義する命令と、同じ資源を参照する命令間の依存関係であり、「逆依存関係」は、ある資源を参照する命令と、同じ資源を定義する命令間の依存関係である。「出力依存関係」は、ある資源を定義する命令と、同じ資源を定義する命令間の依存関係である。
命令における使用レジスタ数が少なければ少ない程、こうした依存関係が多く命令列に現れることとなり、命令列における並べ替えの自由度が奪われることとなる。最適化・資源割付装置１２がターゲットマシンにおける変数割り付けが可能なレジスタの全て（レジスタｒ０〜レジスタｒ３）を変数に割り付けたのは、命令列における依存関係の発生を抑制し、ソースプログラムにおける並列実行性をより多く目的プログラムに継承させるためであり、これによりスケジューリング装置１４は、比較的自由に命令の順位を並べ替えることができる。しかし、変数割り付けが可能なレジスタの全てが変数に割り付けられたため、プロログ、エピログにおける退避命令、復帰命令の数や転送命令の数が多くなっており、スケジューリング装置１４によるスケジュール後のコードは、命令削減の余地が残っていることに留意すべきである。
【００２０】
プログラム書換装置１５は、スケジューリング装置１４によりスケジュールがなされた目的プログラムにおいて、互いに異なる資源に値を定義し、互いに異なる資源に定義された値を参照している命令を、同一の資源に値を定義する命令、及び、同一の資源に定義された値を参照する命令に書き換える。目的プログラムに対してこうした書き換えを行うと、一部のレジスタはプログラムにおいて全く定義・参照されなくなり、その保持値を退避・復帰する必要がなくなるので、プロログ、エピログにおける退避命令、復帰命令を削除することが可能となる。
【００２１】
再スケジューリング装置１６は、プログラム書換装置１５により退避命令、復帰命令、同一レジスタ間で値の転送を行う転送命令が削除された場合、削除された命令に後続する命令の順番を繰り上げるような再スケジュールや、並列実行すべき組み合わせのうち、一方の命令がプログラム書換装置１５により削除された場合、削除された命令に後続する命令を、その組み合わせに割り当てるような再スケジュールを行う。
【００２２】
＜図１に示したプログラム書換装置１５の構成＞
プログラム書換装置１５の概要は次の通りである。プログラム書換装置１５は、各命令のオペランドに割り付けられたレジスタ／メモリがスケジューリングがなされたプログラムにおいてどれだけの区間で有効であるかを解析して、この解析結果に基づいて、各命令のオペランドに割り付けられた資源の値が有効となるプログラム中の区間（いわゆる生存区間）を得る。そしてそれぞれの生存区間に位置する命令のオペランドに割り付けられた資源を別の資源に割り付けるよう、プログラムの書き換え処理を行なう。
【００２３】
この際、オペランド資源の書き換えの対象として単一の生存区間を考えたものとする。この場合プログラム書換装置１５は、この生存区間に含まれる全ての命令のオペランドに割り付けられた資源を別の資源に書き換えることとなる。この生存区間が、同一資源の値が有効となる他の生存区間と連続している場合、資源間で値の転送を行う転送命令が挿入される可能性を考慮しなくてはならない。即ち互いに連続している２つの生存区間のうち、一方が別の資源に書き換えられると、書き換えにより新たに命令のオペランドに割り付けられた資源と、書き換え前から既に命令のオペランドに割り付けられている資源との間で保持値の転送を行わねばならない。生存区間の連続位置において転送命令の挿入が発生するとなると、命令のスケジューリングに影響を与えるほか、新たに発生する転送命令のために解析が非常に困難になる。
【００２４】
そこで本実施形態では、同一資源に対する生存区間が連続している箇所に注目して、拡張生存区間と称する概念を導入し、オペランド資源の書換は、拡張生存区間を対象として行うこととしている。
続いてオペランド資源書換処理を行うプログラム書換装置１５について説明する。
【００２５】
図１にプログラム書換装置１５の構成を示す。プログラム書換装置１５は、オペランド資源書換制御部２１と、基本解析部２２と、拡張生存区間生成部２３と、オペランド資源書換処理部２４と、生存区間データ集合保持部２５と、作業用生存区間データ保持部２６と、拡張生存区間データ集合保持部２７と、作業用拡張生存区間データ保持部２８とから構成される。
【００２６】
基本解析部２２は、処理対象のプログラムの基本ブロック分割、制御フロー解析、データフロー解析を行なう。それぞれの解析は本実施形態の主眼ではないので、簡単に説明する。基本ブロック分割は、処理対象のプログラムを基本ブロックに分割する。制御フロー解析は、命令間の処理の流れによる関係について解析する。データフロー解析は、資源（レジスタ／メモリ）がどこで定義され、どこで参照されているかを解析する。これらの解析の結果、各資源の生存区間を求めることができる。例えば、図１０で示すようなプログラムでは、図の右側に図示したような各資源に対する生存区間を求めることが出来る。
【００２７】
生存区間データ集合保持部２５は、基本解析部２２により得られたプログラム中の各資源の生存区間に関する情報を保持する。図６は、各資源の生存区間を表すデータ集合の一例を示す図である。当該データ集合は、データを区別するための番号ｎ１１と、資源ｎ１２と、その資源の生存区間をあらわす命令の集合ｎ１３と、生存区間の開始点となる命令の集合ｎ１４と、生存区間の終点となる命令の集合ｎ１５と、生存区間中で資源が使用されている命令の集合ｎ１６というフィールドから構成される。また以後、当該データ集合を「生存区間データ集合」と呼び、生存区間データ集合の一つのデータを「生存区間データ」と呼ぶ。また、図６の番号４，  ５の生存区間データのように、同じ資源でも生存区間が異なれば別々の生存区間データとして格納される。
【００２８】
拡張生存区間生成部２３は、基本解析部２２で求めた生存区間に対する解析を行う。ここではオペランド資源書換処理に必要となる拡張生存区間を求める。ここで拡張生存区間について説明する。図１０の生存区間を示した図において、同一の資源に対して、ある生存区間の終了点が別の生存区間の開始点と一致している箇所に注目する。それぞれの開始点と終了点を共有しながら連なっているいくつかの同一資源の生存区間を、ひとつの「拡張生存区間」と呼ぶことにする。これにより、例えば図１０に示した生存区間は、図１１に示すような拡張生存区間となる。オペランド資源の書換処理は、この拡張生存区間を処理対象とする。また、拡張生存区間の始点、終点、生存区間の重複の判定などは、生存区間のものと同様である。拡張生存区間の算出処理の詳細は後述する。
【００２９】
作業用生存区間データ保持部２６は、生存区間データ集合保持部２５で保持している生存区間についてのデータ集合を保持する。これは、拡張生存区間生成部２３が拡張生存区間を求める際に使用する。
拡張生存区間データ集合保持部２７は、拡張生存区間生成部２３で求めた各資源の拡張生存区間とそれに付随する情報を図７に示すようなデータ集合で保持する。当該データ集合は、データを区別するための番号ｎ１と、割付資源ｎ２と、その資源の拡張生存区間をあらわす命令の集合ｎ３と、その拡張生存区間中で割付資源が使用されている命令の集合ｎ４と、その拡張生存区間と生存区間が重なっているデータの集合ｎ５というフィールドからなる。また以後、拡張生存区間データ集合保持部２７で保持する情報を、「拡張生存区間データ集合」と呼び、拡張生存区間データ集合のデータを「拡張生存区間データ」と呼ぶ。
【００３０】
オペランド資源書換処理部２４は、拡張生存区間データ集合保持部２７の内容に基づいて、オペランド資源の書き換えを行なう。処理手順の詳細については後述する。
作業用拡張生存区間データ保持部２８は、オペランド資源書換処理部２４において、オペランド資源の書き換えを行なうための処理対象となる拡張生存区間データを保持する。作業用拡張生存区間データ保持部２８で保持している拡張生存区間データに対して内容の変更操作を行なった場合、その内容変更は拡張生存区間データ集合保持部２７で保持されている拡張生存区間データ集合の内容にも反映される。
【００３１】
オペランド資源書換制御部２１は、オペランド資源書換処理全体を制御する。図９は、オペランド資源書換制御部２１のフローチャートである。
・ステップａ１では、オペランド資源書換制御部２１は、基本解析部２２を起動する。解析結果は生存区間データ集合保持部２５に保持される。
・ステップａ２では、オペランド資源書換制御部２１は、拡張生存区間生成部２３を起動する。解析結果は拡張生存区間データ集合保持部２７に保持される。
【００３２】
・ステップａ３では、オペランド資源書換制御部２１は、オペランド資源書換処理部２４を起動する。
＜拡張生存区間生成部２３の処理手順＞
拡張生存区間生成部２３は、基本解析部２２で求めた生存区間について解析を進めて、生存区間データ集合からオペランド資源書換処理で用いる拡張生存区間を求め、拡張生存区間データ集合保持部２７に拡張生存区間データ集合を作る処理を行なう。ここで、生存区間データ集合保持部２５に保持されている生存区間データ集合をＬＴ、作業用生存区間データ保持部２６で保持する生存区間データをｒｅ、拡張生存区間データ集合保持部２７で保持する拡張生存区間データ集合をＥＬＴと表記する。また、生存区間データｒｅの各フィールドをｒｅ．ｎ１１，  ｒｅ．ｎ１２などのように表記する。
【００３３】
図１４は、拡張生存区間生成部２３の処理手順を示したフローチャートである。以下、このフローチャートを参照しながら処理の詳細を説明していく。
・ステップｂ１は、生存区間データ集合保持部２５の生存区間データ集合ＬＴのデータを順番に処理していくためのループを構成している。ループ内の処理は、ステップｂ２〜ｂ５である。
【００３４】
・ステップｂ２では、生存区間データ集合保持部２５に格納されている生存区間データ集合ＬＴから、次に処理するデータｒｅを取り出し、作業用生存区間データ保持部２６に格納する。そして、生存区間データ集合ＬＴからデータｒｅを削除する。
・ステップｂ３では、作業用生存区間データ保持部２６に格納されているデータｒｅに、生存区間データ集合保持部２５に格納されている生存区間データ集合ＬＴの中で連結可能なデータｅを探し、データｅが存在する間繰り返すループを構成している。２つのデータが連結可能であるための条件は、次の通りである。
【００３５】
ｒｅ．ｎ１２  ＝  ｅ．ｎ１２  かつ
（（ｒｅ．ｎ１４  ∩  ｅ．ｎ１５）≠φ  または  （ｒｅ．ｎ１５  ∩  ｅ．ｎ１４）≠φ）
∩：積集合を求める演算子
φ：空集合
つまり、両者の資源が同一であって、かつ、一方の生存区間の始点の命令と他方の生存区間の終点の命令に共通の命令が存在することである。例えば、図６に示した生存区間データ集合保持部２５が保持している生存区間データ集合の番号４の生存区間と番号５の生存区間は、ともに資源ｎ１２がレジスタｒ２で、番号４の生存区間の終点である命令ｉ５は、番号５の生存区間の始点になっているので連結可能である。連結可能なデータｅが存在すれば後述のステップｂ４を実行し、存在しなければステップｂ５を実行する。
【００３６】
・ステップｂ４では、ステップｂ３で連結可能と判定された生存区間データ集合ＬＴのデータｅを作業用生存区間データ保持部２６に保持されているデータｒｅに連結する。つまりまず、データｅとｒｅの生存区間を表す命令の集合と、生存区間の始点を表す命令の集合と、生存区間の終点を表す命令の集合と、生存区間の中で資源ｎ１２が使用されている命令の集合のそれぞれの和集合を求める。次に、データｅとｒｅの一方の始点と他方の終点に含まれる命令の集合Ｊを求め、始点を表す命令の和集合と終点を表す命令の和集合から集合Ｊを引く。このように求めた２つのデータの和集合を、データｒｅの各フィールドに格納する。
【００３７】
つまり形式的には次のようになる。
Ｌ  ＝  （ｒｅ．ｎ１３  ∪  ｅ．ｎ１３）
Ｊ  ＝  ｛ｉ｜  ｉ∈（ｒｅ．ｎ１４  ∩  ｅ．ｎ１５）  または  ｉ∈（ｒｅ．ｎ１５  ∩  ｅ．ｎ１４）｝
Ｂ  ＝  （ｒｅ．ｎ１４  ∪  ｅ．ｎ１４）  −  Ｊ
Ｅ  ＝  （ｒｅ．ｎ１５  ∪  ｅ．ｎ１５）  −  Ｊ
Ｕ  ＝  （ｒｅ．ｎ１６  ∪  ｅ．ｎ１６）
∪：和集合を求める演算子
−：集合差を求める演算子
∈：含む
集合Ｌ，  Ｊ，  Ｂ，  Ｅ，  Ｕを求め、ｒｅの各フィールドを次のように更新する。
【００３８】
ｒｅ．ｎ１３＝Ｌ，  ｒｅ．ｎ１４＝Ｂ，  ｒｅ．ｎ１５＝Ｅ，  ｒｅ．ｎ１６＝Ｕ
連結処理を行なった後、生存区間データ集合ＬＴからデータｅを消去し、ステップｂ３に戻る。
・ステップｂ５では、作業用生存区間データ保持部２６に格納されている生存区間データｒｅの内容を、拡張生存区間データ集合保持部２７に拡張生存区間データＥとして追加する。データｒｅとＥの関係は、次のようになる。
【００３９】
Ｅ．ｎ１  ＝  ｒｅ．ｎ１１
Ｅ．ｎ２  ＝  ｒｅ．ｎ１２
Ｅ．ｎ３  ＝  ｒｅ．ｎ１３
Ｅ．ｎ４  ＝  ｒｅ．ｎ１６
Ｅ．ｎ５は空欄のままにしておく。
【００４０】
特にＥ．ｎ２は後述のオペランド資源書換処理部２４で再設定される可能性があり、そのため、ここでの処理は、Ｅの割付資源ｎ２をｒ２．ｎ１２で初期設定することを意味する。
以上のように、拡張生存区間生成部２３は、基本解析部２２により解析された生存区間データ集合ＬＴを解析して、オペランド資源書換処理で用いる拡張生存区間データ集合ＥＬＴを拡張生存区間データ集合保持部２７に構築する（ステップｂ１〜ｂ５）。
＜オペランド資源書換処理部２４の処理手順＞
図１５は、オペランド資源書換処理部２４の処理手順を示したフローチャートである。オペランド資源書換処理部２４ではまず、拡張生存区間データ集合保持部２７に保持されている拡張生存区間データ集合ＥＬＴの各データＸに対して、Ｘと拡張生存区間に重なりがある拡張生存区間データの集合を調べて、拡張生存区間データ集合ＥＬＴのデータを割付資源について並べ替える。そして、各データＸについて、Ｘのオペランドに割り付け可能なレジスタ資源を求めて、Ｘに対して資源のオペランド資源書換処理を行なう。次に、各データに対するオペランド資源書換処理の結果、手続き／関数内で使用されないレジスタが存在すれば、そのレジスタに関するプロログ・エピログで行われるレジスタ値の待避・復帰処理命令の削除を行なう。
【００４１】
以下、図１５のフローチャートに沿って処理手順を説明する。
・ステップｃ１では、拡張生存区間データ集合保持部２７で保持している拡張生存区間データ集合の各データの、フィールドｎ５（拡張生存区間が重なっているデータの集合）を求める。２つの拡張生存区間データＥ１，  Ｅ２が重なっているかどうかは、次の式で判定できる。
【００４２】
（Ｅ１．ｎ３  ∩  Ｅ２．ｎ３）≠φ
つまり、データＥ１の生存区間を表す命令の集合とデータＥ２の生存区間を表す命令の集合に共通の命令が存在するならば、データＥ１，  Ｅ２は重なっていると判定する。拡張生存区間データ集合ＥＬＴの各拡張生存区間データについて、それと生存区間が重なっているデータの集合を求め、フィールドｎ５に格納していく。
【００４３】
・ステップｃ２では、拡張生存区間データ集合保持部２７で保持している拡張生存区間データ集合ＥＬＴのデータを割付資源について並べ替える。データの並べ替えは、
１．  レジスタ資源：番号が若いレジスタから順に並べる。
２．  メモリ資源：使用命令数が多い順に並べる。
【００４４】
という順序になるようにする。例えば、図７（ａ）のような拡張生存区間データ集合ＥＬＴに対して、ステップｃ２を実行すると、図７（ｂ）のようになる。
・ステップｃ３は、拡張生存区間データ集合保持部２７で拡張生存区間データ集合のデータをステップｃ２で並べ替えた順番に処理していくためのループを構成している。ループ内の処理はステップｃ４〜ｃ７である。
【００４５】
・ステップc4では、拡張生存区間データ集合保持部２７で保持している拡張生存区間データ集合のデータのうち、次に処理すべきデータREを作業用拡張生存区間データ集合保持部２８に格納する。
・ステップc5では、作業用拡張生存区間データ集合保持部２８が保持している拡張生存区間データREに対して、新しく割付けるレジスタの候補を求める。
【００４６】
まず、次の式を用いて割付候補レジスタの集合ARを求める。
AR = U−[R∈U|R＝E.n2(E∈RE.n5)]
U:      使用可能なレジスタ全体の集合
R:      レジスタ
E:      拡張生存区間データ
RE:      書き換え対象データ（作業用拡張生存区間データ集合保持部２８が保持している拡張生存区間データ）
RE.n5:  REと生存区間が重なっている拡張生存区間データの集合
E.n2:  Ｅの割付資源
つまりARは、使用可能なレジスタ全体のうち、拡張生存区間REと生存区間が重なっている拡張生存区間に割付けられているレジスタを除いたレジスタの集合である。ここで求めた割付候補レジスタ集合ARの中から、レジスタ番号が最も若いレジスタを最終的な割付候補レジスタRCとする。レジスタ集合ARが空集合であるときは、割付候補レジスタは未定義であるとする。
【００４７】
例えば、図７（ｂ）において番号６のデータが拡張生存区間データ集合保持部２７に保持されているときの処理を示す。番号６データと拡張生存区間が重なっているデータそれぞれの割付資源は、番号３の生存区間がレジスタｒ３、番号４の生存区間がレジスタｒ２なので、求める割付候補レジスタの集合は、レジスタｒ２，  ｒ３を除くレジスタの集合｛ｒ０，ｒ１｝となり、割付候補レジスタＲＣはｒ０となる。
【００４８】
・ステップc6では、作業用拡張生存区間データ集合保持部２８が保持している拡張生存区間データREの割付資源RE.n2が、レジスタであればステップc7へ進み、メモリであればステップc8へ進むよう分岐処理を行なう。
・ステップc7では、ステップc4で求めた割付候補レジスタRCを用いて、作業用拡張生存区間データ集合保持部２８で保持している拡張生存区間データREについて、そのデータの割付資源RE.n2（レジスタ）に対して資源のオペランド資源書換処理を行なうかどうかを判定する。判定条件は、ステップc5で求めた割付候補レジスタRCが、未定義でなく、かつ、作業用拡張生存区間データ集合保持部２８で保持している拡張生存区間データREの割付資源RE.n2より若いレジスタ番号のレジスタであるならば、実際にオペランド資源の書き換えを行なうステップc9を実行し、そうでないときは、ステップc3が構成するループの次の段階へ進む。
【００４９】
例えば、番号6のデータについて、ステップc6で求めた割付候補レジスタRCはr0であり、番号6のデータの割付資源はr1である。この時、割付候補レジスタRCのほうがレジスタ番号が若いので、番号6のデータはステップc9以降のステップに進むことになる。
・ステップc8では、ステップc4で求めた割付候補レジスタRCを用いて、作業用拡張生存区間データ集合保持部２８で保持している拡張生存区間データREについて、そのデータの割付資源RE.n2（メモリ）に対して資源のオペランド資源書換処理を行なうかどうかを判定する。割付候補レジスタRCが未定義でないならば、実際にオペランド資源の書き換えを行なうステップc9を実行し、そうでないときは、ステップc3が構成するループの次の段階へ進む。
【００５０】
・ステップc9では、作業用拡張生存区間データ集合保持部２８で保持している拡張生存区間データREに対して、割付資源RE.n2を使用している命令の集合RE.n4の各命令に対して、割付資源の書き換えを行なう。
命令を書き換えるやり方は次の通りである。
1. 割付資源RE.n2が使用されている命令の集合RE.n4の各命令に対して、レジスタ名をRE.n2からステップc5で求めた割付候補レジスタRCへ置き換える。
【００５１】
２．  置き換えた命令が、レジスタＲＣからレジスタＲＣへの転送命令である場合は、その転送命令を削除する。但し、当該命令が並列実行する命令の組の要素ならば、当該転送命令をＮＯＰ（何も実行しない命令）に書き換える。
命令の書き換えが終了した後、拡張生存区間データＲＥの割付資源をあらわすフィールドＲＥ．ｎ２をＲＣに書き換える。
【００５２】
例えば、図７（ｂ）において番号６のデータについて、レジスタｒ０を対象とする処理を示す。番号６のデータで割付資源ｒ１が使用されている命令はｉ６，  ｉ７，  ｉ１２，  ｉ１３である。命令ｉ６は、書き換え対象のレジスタｒ１の値が書き換え対象のレジスタｒ０に対して転送される命令であるので、上記２の方法により削除される。また、命令ｉ７，  ｉ１２，  ｉ１３は、書き換え対象レジスタの値を使用しているので、レジスタ名をｒ１からｒ０に書き換える。
【００５３】
・ステップｃ１０では、手続き／関数の中でオペランド資源書換処理前に使用していたレジスタのうち、ステップｃ３が構成するループ（ステップｃ４〜ｃ９）で行なったオペランド資源書換処理の結果、使用されていないレジスタが存在するかどうかを判定する。判定方法は、次の式を用いて行なう。
（Ｕ−｛Ｒ∈Ｕ  ｜  Ｒ  ＝  Ｅ．ｎ２  （Ｅ∈ＥＬＴ）｝）≠φ
Ｕ    使用可能なレジスタの集合
Ｒ    拡張生存区間に割付けられたレジスタ
Ｅ    拡張生存区間データ集合ＥＬＴに含まれる拡張生存区間データ
つまり、使用可能なレジスタの集合のうち、拡張生存区間データ集合により保持されているデータの割付資源に含まれていないレジスタが存在するかどうかを判定する。このようなレジスタが存在する場合はステップｃ１１を実行し、存在しない場合は、オペランド資源書換処理部２４の処理を終了する。
【００５４】
・ステップｃ１１では、手続き・関数内において使用されないレジスタにそれぞれについて、関数の先頭で行われるレジスタ値の待避処理命令、および関数の末尾で行われるレジスタ値の復帰処理命令の削除を行なう。
図１６に示した機械語プログラムを用いて説明する。ここで、プログラム中の”ＳＰ”は、スタックポインタという特殊なレジスタを表し、スタックの先頭アドレスを保持している。例えば、”ｍｏｖ  ｒ３，（ＳＰ＋４）”という命令は、スタックポインタからオフセット４のアドレスに対してレジスタｒ３の値を転送する命令である。図１６のプログラムにおいて、レジスタｒ３が関数内で使用されないレジスタであるとステップｃ１０で判明した場合には、レジスタｒ３の値のスタックへの待避・復帰処理を行なっている命令ｉ３と命令ｉ１０が不要な命令ということになり、これらの命令が削除される。
【００５５】
以上のようにオペランド資源書換処理部２４は、まずステップｃ１で拡張生存区間データ集合ＥＬＴの各データについて、それと拡張生存区間が重なっている拡張生存区間データの集合を求めて、ステップｃ２で拡張生存区間データ集合ＥＬＴのデータを割付資源について並べ替える処理を行なっている。これにより、ステップｃ３〜ｃ９の処理で、割付資源がレジスタである拡張生存区間データについてオペランド資源の書き換えを行なうと、無駄に割付けられた形になっているレジスタが使用されない形となる。例えば、図７（ｂ）に示した拡張生存区間データ集合に対して、割付資源がレジスタであるものについての処理を行なうと、当該データ集合は図８（ａ）のようになる。この時、レジスタｒ３が使用されなくなっている。次に、割付資源がメモリである拡張生存区間データに対して資源のオペランド資源書換処理を行なうと、先に検出された使用されないレジスタｒ３を割付資源がメモリである拡張生存区間データに対してオペランド資源の書き換えを行うことができる。ステップｃ１０〜ｃ１１では、ステップｃ９までのオペランド資源書換処理の結果、手続き・関数全体で使用されないレジスタが存在すれば、そのレジスタの値の待避・復帰処理を削除する処理を行なっている。
【００５６】
尚、本実施形態ではオペランド資源書換処理部への入力は機械語プログラムを用いて説明しているが、オペランド資源書換処理を行なう対象としては別の種類のプログラム（例えば中間プログラム）であってもかまわない。また、動作説明では入力として図３（ａ）のプログラムを与えており、このプログラムは簡単のため、単一の基本ブロックで構成されたものであるが、生存区間が複数の基本ブロックにまたがっている場合でも、本方式は適用可能である。
【００５７】
＜具体的な実施形態の動作説明＞
以上のように構成される本実施形態のプログラム書換装置における具体的な処理内容をこれまでに示した図を再度参照しながら説明する。コンパイラ１の処理は、図３（ａ）に示したソースプログラムを入力として与えると、構文解析装置１１、最適化・資源割付装置１２、目的プログラム生成装置１３、スケジューリング装置１４で処理されて、図４に示した機械語プログラムが生成される。プログラム書換装置１５への入力は、図４のような機械語プログラムである。
＜入力が図４の機械語プログラムである場合＞
まず、プログラム書換装置１５への入力が図４のプログラムであったときのプログラム書換装置１５の動作について述べる。図４のプログラムでは、使用可能なレジスタはｒ０，  ｒ１，  ｒ２，  ｒ３の４つである（ステップａ１）。
【００５８】
次に、オペランド資源書換制御部２１は拡張生存区間生成部２３を起動する。ここで、生存区間を解析して、拡張生存区間データ集合を得る（ステップａ２）。
拡張生存区間生成部２３の処理を図１４に示すフローチャートを参照しながら以下に説明する。ここで、図６に示す生存区間データ集合が生存区間データ集合保持部２５に保持されているとする。
【００５９】
ステップｂ１により構成されるループでは、生存区間データ集合保持部２５が保持している生存区間データ集合ＬＴの各データについて処理が行なわていく。このループでは、生存区間データ集合保持部２５から次に処理する生存区間データ集合ＬＴのデータを取り出して作業用生存区間データ保持部２６に処理対象生存区間データｒｅとして格納する（ステップｂ２）。そして生存区間データｒｅと連結可能な生存区間データｅを生存区間データ集合ＬＴから探し（ステップｂ３）、もし見つかれば、連結処理を行なう（ステップｂ４）。生存区間データと連結可能な生存区間データｒｅが生存区間データ集合ＬＴからなくなるまでステップｂ３，  ｂ４を繰り返す。連結可能な生存区間データがなくなったら、その時点で作業用生存区間データ保持部２６に格納されている生存区間データを、拡張生存区間データ集合保持部２７が保持する拡張生存区間データ集合のデータとして追加する（ステップｂ５）。
【００６０】
ここで、図６に示した生存区間データ集合の各データに対する処理は次のようになる。
・番号１，  ２，  ３，  １２，  １３，  １４，  １５のデータは、連結可能なデータが見つからないため、処理は、ステップｂ２，  ｂ３，  ｂ５と進んで、これらのデータそれぞれがステップｂ５により拡張生存区間データ集合のデータとなる。
【００６１】
・番号４のデータが作業用生存区間データ保持部２６に保持されているとすると、これと連結可能なデータとして、番号５のデータが見つかる。ステップｂ４において連結処理が行なわれると、生存区間を表す命令の集合は｛ｉ４，  ｉ５，  ｉ６，  ｉ７｝となり、割付資源が使用される命令の集合は｛ｉ４，ｉ５，ｉ８｝となる。さらにこの他に、ステップｂ３においては、連結可能なデータとして番号８，  ９，  １０，  １１，  １５のデータが探索され、これらの連結処理が終わると拡張生存区間を表す命令の集合は｛ｉ４，  ｉ５，  ｉ６，  ｉ７，  ｉ８，  ｉ９，  ｉ１０，  ｉ１１，  ｉ１２，  ｉ１３，  ｉ１４，  ｉ１５，  ｉ１６，  ｉ１７，  ｉ１８，  ｉ１９｝となり、割付資源が使用される命令の集合は｛ｉ４，  ｉ５，  ｉ８，  ｉ９，  ｉ１０，  ｉ１１，  ｉ１５｝となる。
【００６２】
・番号６データが作業用生存区間データ保持部２６に保持されているとすると、これと連結可能なデータとして、番号７，  １２のデータが見つかる。連結処理を行なうと、拡張生存区間を表す命令の集合は｛ｉ６，  ｉ７，  ｉ８，  ｉ９，  ｉ１０，  ｉ１１，  ｉ１２｝となり、割付資源が使用される命令の集合は、｛ｉ６，  ｉ７，  ｉ１２，  ｉ１３｝となる。
・番号１６データが作業用生存区間データ保持部２６に保持されているとすると、これと連結可能なデータとして、番号１７，  １８，  １９のデータが見つかる。連結処理を行なうと、拡張生存区間を表す命令の集合は｛ｉ１６，  ｉ１７，  ｉ１８，  ｉ１９｝となり、割付資源が使用される命令の集合は｛ｉ１６，  ｉ１７，  ｉ１８，  ｉ１９｝となる。
【００６３】
以上の処理の結果、拡張生存区間データ集合保持部２７が保持している拡張生存区間データ集合は図７（ａ）のようになる。（但し、フィールドｎ５重複エントリの列は空欄のままになっている。）
次に、オペランド資源書換制御部２１はオペランド資源書換処理部２４を起動する。ここで資源のオペランド資源書換処理を行なっていく（ステップａ３）。ここで、オペランド資源書換処理部２４の処理を図１５に示すフローチャートを参照しながら以下に説明する。
まず、拡張生存区間データ集合保持部２７により保持されている拡張生存区間データ集合ＥＬＴの各データのフィールドｎ５を求める（ステップｃ１）。その結果、図７（ａ）に示した拡張生存区間データ集合を得る。そして、拡張生存区間データ集合ＥＬＴに対して、割付資源についてデータの並べ替え処理を行なう（ステップｃ２）。この結果、図７（ｂ）に示した拡張生存区間データ集合を得る。
【００６４】
拡張生存区間データ集合ＥＬＴのデータを順次処理していくループ（ステップｃ３）では、次に処理すべきデータを拡張生存区間データ集合保持部２７に保持して（ステップｃ４）、そのデータに対して新しく割付けるレジスタの候補を求め（ステップｃ５）、そのデータの割付資源に対して、そのレジスタの候補にオペランド資源書換処理をするかどうかを判定して（ステップｃ６，  ｃ７，  ｃ８）、オペランド資源書換処理すると判定されると実際にオペランド資源の書き換えを行なう（ステップｃ９）。図７（ｂ）に示した拡張生存区間データ集合の各データについての処理を示す。
【００６５】
・番号１と番号１６のデータについて
これらのデータは最も若いレジスタ番号ｒ０についてのデータであり、オペランド資源の書き換え候補のレジスタはｒ０になるので、何ら処理を行なわない。
・番号２のデータについて
ステップｃ５の処理を行なうと、このデータに対するオペランド資源の書換候補レジスタはｒ１となり、ステップｃ７でオペランド資源書換処理を行なわないと判定され、ステップｃ３へ進む。
【００６６】
・番号６と番号１４のデータについて
ステップｃ５の処理を行なうと、これらのデータに対するオペランド資源の書換候補レジスタはｒ０となる。ステップｃ７での処理により、命令ｉ６が削除され、命令ｉ７，  ｉ１２，  ｉ１４，  ｉ１５が書き換えられる。また、これらの生存区間データはレジスタｒ０に関するデータに変わる。
【００６７】
・番号４のデータについて
ステップｃ５の処理を行なうと、これらのデータに対するオペランド資源の書換候補レジスタはｒ１となる。ステップｃ７での処理により、命令ｉ４，  ｉ５，  ｉ８，  ｉ９，  ｉ１０，  ｉ１１，  ｉ１５が書き換えられる。また、これらの生存区間データはレジスタｒ１に関するデータに変わる。
【００６８】
・番号３のデータについて
ステップｃ５の処理を行なうと、これらのデータに対するオペランド資源の書換候補レジスタはｒ２となる。ステップｃ７での処理により、命令ｉ３，  ｉ１６が書き換えられる。また、これらの生存区間データはレジスタｒ２に関するデータに変わる。
以上の処理の結果、拡張生存区間データ集合保持部２７で保持している生存区間データ集合は図８（ａ）に示すようになっている。また、命令の書き換え処理を行なったプログラムと各資源の生存区間を示すと図１２のようになる。
ここまでの処理で、プログラムで使用するレジスタはｒ０，  ｒ１，  ｒ２の３つになったため、レジスタｒ３は使用されないレジスタとなったことがわかる（ステップｃ１０）。そこで、図１６（ａ）で示したプログラムのプロログ内で、レジスタ  ｒ３の待避処理の命令ｉ３と、エピログ内で、レジスタｒ３の復帰処理の命令ｉ１０が削除される（ステップｃ１１）。
【００６９】
以上でオペランド資源書換処理部２４の処理が終了する。処理結果のプログラムと割付資源とその値の拡張生存区間を示したのが図１３である。この例では、プログラム書換装置１５により、手続き／関数内で使用するレジスタの数を少なくすることができたため、使用しなくなったレジスタについて、プロログ・エピログで行なうレジスタ値の待避・復帰処理が削除された。これにより、コード削減と実行時間短縮が達成される。
＜入力が図５の機械語プログラムである場合＞
また、プログラム書換装置１５への入力が図５  のプログラムであったときのプログラム書換装置１５の動作について述べる。図５のプログラムでは、使用可能なレジスタはｒ０，  ｒ１，  ｒ２の３つであるとし、資源割付処理で記憶資源として駆動レコード中に確保されたメモリ領域を中間変数に対して割付けている（プログラム中には、”ｍｅｍ１”と記している）。
このプログラムに対して先の例と同様に処理を行なっていくと、拡張生存区間データ集合保持部２７では、図８（ｂ）のような拡張生存区間データ集合が作られる。オペランド資源書換処理部２４のステップｃ２で拡張生存区間データ集合の並べ替えを行なうと、番号３の割付資源がｍｅｍ１のデータは、レジスタのデータよりも後ろになる。この拡張生存区間データ集合に対して、オペランド資源書換処理を行なっていくと、図１３に示したプログラムと、割付資源とその値の拡張生存区間を得る。割付資源ｍｅｍ１の拡張生存区間は、レジスタｒ３にオペランド資源書換処理されている。
【００７０】
この例では、資源割付処理の段階で命令のオペランドに割り付けられたメモリが、オペランド資源書換処理の結果、レジスタに割り付けられている。これにより、メモリへのアクセス命令がレジスタへのアクセス命令に置き換わり、プログラムの実行時間短縮が達成される。
以上のように、本実施形態によれば、プログラム中の資源の生存区間を解析して拡張生存区間を構成し、拡張生存区間に対して資源のオペランド資源書換処理を行なう。これにより、手続き／関数内で使用するレジスタの数を減らすことができ、手続き／関数のプロログ・エピログで行なうレジスタ値の待避・復帰処理のうち、使用しなくなったレジスタに関する処理の削除によるコード削減と実行時間短縮、および、メモリに割付けられた命令のオペランドをレジスタに書き換えることによる実行時間短縮を達成することができる。
【００７１】
尚、2つの実施形態は現状において最善の効果が期待できるシステム例として説明したに過ぎない。本発明は、その要旨を逸脱しない範囲で実施変更することができる。例えば、図１４,図１５のフローチャートを参照して説明した手順等を実行形式プログラムにより実現し、これを記録媒体に記録して流通・販売の対象にしても良い。このような記録媒体には、ICカードや光ディスク、フロッピー(登録商標)ディスク等があるが、これらに記録された機械語プログラムは汎用コンピュータにインストールされることにより利用に供される。この汎用コンピュータは、インストールした実行形式プログラムを逐次実行して、本実施形態に示したコンパイラ装置の機能を実現するのである。
【００７２】
【発明の効果】
以上のように本発明に係るコンパイラ装置は、並列実行すべき命令の組合せを決定するスケジューリング手段と、実行順序が並べ替えられた目的プログラムにおいて、各命令で定義され、又は、参照されている資源を、別の資源に書き換える書換手段とを備え、前記書換手段は、実行順序が並べ替えられた目的プログラムを解析して、目的プログラムに含まれる資源に値を定義する命令から定義された値を最後に参照する命令までの生存区間を生成する基本解析部と、前記基本解析部にて生成された複数の生存区間のうち1つを選ぶ処理(1)、選ばれた生存区間reの開始点又は終了点と、一致する開始点又は終了点を有し、同一の資源に属する別の生存区間eを全て検出して、検出された全ての生存区間eを選ばれた生存区間reに連結する処理(2)を、生成された全ての生存区間に対して繰り返す拡張生存区間生成部と、前記連結の繰り返しにより複数の拡張生存区間が得られれば、複数の拡張生存区間のうち1つを拡張生存区間REとして選ぶ処理(1)、拡張生存区間REに割付可能な資源を、拡張生存区間REと、他の拡張生存区間との重複に基づいて求める処理(2)、拡張生存区間REにおいて定義され、参照されている資源を、割付可能資源に書き換える処理(3)を、複数の拡張生存区間のそれぞれに対して実行する書換処理部とを備えることを特徴としているので、機械語プログラム内の命令は、生存区間の重複が無い限り、同じ資源を定義・参照する命令に統合されることとなる。このような統合を行った後、同一資源間の転送を行う転送命令や資源値の退避・復帰を行う退避・復帰命令を削除することができ、機械語プログラムのコードサイズを縮小することができる。
【００７３】
また並列実行性を向上させつつも、プログラム中で使用されているレジスタ数を減すことができるので、コードサイズの縮小化と、プロセッサの並列実行性の双方の向上を図ることができる。
【図面の簡単な説明】
【図１】実施形態に係るプログラム書換装置１５の構成図である。
【図２】コンパイラの構成図である。
【図３】（ａ）ソースプログラムの例である。
（ｂ）（ａ）のプログラムをコンパイル処理したときに、コンパイラ内部で生成される中間プログラムの例である。
【図４】中間プログラムから生成された目的プログラムをアセンブラコードにて表記した図である。
【図５】中間プログラムから生成された目的プログラムをアセンブラコードにて表記した図である。
【図６】生存区間データ集合保持部２５が保持する、生存区間データ集合の例である。
【図７】（ａ）  図６に示した、生存区間データ集合保持部２５が保持するデータ集合を、拡張生存区間生成部２３で解析し、拡張生存区間データ集合を構成した結果を示している。
（ｂ）（ａ）に示した生存区間データ集合に対して、オペランド資源書換処理部２４のステップｃ２の処理が終わった時点での状態を示した図である。
【図８】（ａ）図７（ａ）に示した生存区間データ集合に対して、オペランド資源書換処理部２４の第１段階の処理が終わった時点での状態を示した図である。
（ｂ）図５のプログラムを処理したときに、拡張生存区間生成部２３で生成した拡張生存区間データ集合を示した図である。
【図９】オペランド資源書換制御部２１の処理手順を示すフローチャートである。
【図１０】命令と資源とその値の生存区間を示した図である。
【図１１】命令と割付資源とその値の拡張生存区間を示した図である。
【図１２】図４の機械語プログラムについて、オペランド資源書換処理部２４の処理が終了した後のプログラムと割付資源とその値の生存区間を示した図である。
【図１３】図５の機械語プログラムについて、オペランド資源書換処理部２４の処理が終了した後のプログラムと割付資源とその値の生存区間を示した図である。
【図１４】拡張生存区間生成部２３の処理手順を示すフローチャートである。
【図１５】オペランド資源書換処理部２４の処理手順を示すフローチャートである。
【図１６】（ａ）関数のプロログとエピログをあらわす、機械語プログラムの例である。
（ｂ）オペランド資源書換処理部２４のステップｃ９までの処理で、使用しなくなったレジスタがｒ３であることが判明したとき、ステップｃ１０，  ｃ１１でレジスタｒ３の値の待避・復帰処理を削除した結果を示したプログラムである。
【図１７】（ａ）資源割付処理の対象となる中間プログラムの一例を示す図である。
（ｂ）変数ｔ１，  ｔ２，  ｔ３，  ｔ４，  ｔ５，  ｔ６に対して、それぞれレジスタｒ０，  ｒ１，  ｒ０，  ｒ１，  ｒ２，  ｒ０  を割付けた場合の、各中間命令ｓ１，ｓ２，ｓ３に対応する機械語命令を示す図である。
（ｃ）変数ｔ３と変数ｔ６には異なるレジスタを割り付けて、中間命令ｓ１，ｓ２と中間命令ｓ３の間に新たな依存関係を作らないように配慮が払われた資源割付処理結果の一例を示す図である。
（ｄ）機械語命令ｓ２，ｓ３を入れ換えた場合の一例を示す図である。
【符号の説明】
１    コンパイラ
１１    構文解析装置
１２    資源割付装置
１３    目的プログラム生成装置
１４    スケジューリング装置
１５    プログラム書換装置
１６    再スケジューリング装置
２１    オペランド資源書換制御部
２２    基本解析部
２３    拡張生存区間生成部
２４    オペランド資源書換処理部
２５    生存区間データ集合保持部
２６    作業用生存区間データ保持部
２７    拡張生存区間データ集合保持部
２８    作業用拡張生存区間データ保持部
【図１】
0003634712.tif 000002
【図２】
0003634712.tif 000003
【図３】
0003634712.tif 000004
【図４】
0003634712.tif 000005
【図５】
0003634712.tif 000006
【図６】
0003634712.tif 000007
【図７】
0003634712.tif 000008
【図８】
0003634712.tif 000009
【図９】
0003634712.tif 000010
【図１０】
0003634712.tif 000011
【図１１】
0003634712.tif 000012
【図１２】
0003634712.tif 000013
【図１３】
0003634712.tif 000014
【図１４】
0003634712.tif 000015
【図１５】
0003634712.tif 000016
【図１６】
0003634712.tif 000017
【図１７】
0003634712.tif 000018