JP3634712B2 - コンパイラ装置 - Google Patents
コンパイラ装置 Download PDFInfo
- Publication number
- JP3634712B2 JP3634712B2 JP2000078868A JP2000078868A JP3634712B2 JP 3634712 B2 JP3634712 B2 JP 3634712B2 JP 2000078868 A JP2000078868 A JP 2000078868A JP 2000078868 A JP2000078868 A JP 2000078868A JP 3634712 B2 JP3634712 B2 JP 3634712B2
- Authority
- JP
- Japan
- Prior art keywords
- resource
- program
- data
- life span
- instruction
- 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
Images
Landscapes
- Devices For Executing Special Programs (AREA)
Description
【発明の属する技術分野】
本発明は、高級プログラミング言語にて記述されたソースプログラムを目的プログラムに翻訳するコンパイラに適用される最適化手法に関し、特に目的プログラムに含まれる各命令のオペランドに割り付けられている資源を、別の資源に変更するよう、命令を書き換える技術に関する。
【0002】
【従来の技術】
かってはコードサイズが小さな機械語プログラムを生成することがコンパイラの理想とされていたが、近年では、それと並んで、プロセッサの並列実行能力を最大限に発揮させる機械語プログラム(目的プログラム)を生成することも、コンパイラの理想とされつつある。
【0003】
一般論になるが、高級プログラミング言語を用いて記述されたソースプログラムは並列実行性が高いといわれる。これは、高級プログラミング言語の文法、言語要素がレジスタ、メモリ等のハードウェア資源に拘束されず、ソースプログラムを構成する複数の命令は、プログラマにより任意に定義された変数を用いて記述されているので命令間の依存関係が少ないからである。
【0004】
これに対して機械語プログラムは、プロセッサが直接実行するものであり、数値の保持、演算がハードウェア資源を被演算子とした機械語命令にて構成されている。これらハードウェア資源における記憶要素は有限であるので、機械語プログラムには、これらの資源に値を定義する機械語命令と、その値を使用する機械語命令との間に多くの依存関係が発生している。依存関係が多くあると、機械語命令の順序の入れ換えや並列実行すべき機械語命令の組み合わせを決定するという命令スケジューリングを好適に行うことができず、並列実行性は自ずと低くなる。ソースプログラム、機械語プログラムにおける上記の性質を考えるとコンパイル時には、ソースプログラムにおいて存在する命令間の並列実行性をなるべく多く機械語プログラムに継承することが望ましい。並列実行性を機械語プログラムに継承させるためコンパイラは、ソースプログラムに含まれる変数に好適にハードウェア資源を割り付けることにより(この処理は一般に、資源割付処理と呼ばれる。)、並列実行性を機械語プログラムに継承させることが行われていた。
【0005】
尚、コンパイラについての公知文献には以下に示すものがある。
文献 1 Shlomit S.P.: ”Register Allocation with Instruction Scheduling: a New Approach”, Proceedings of the ACM SIGPLAN ’93 Conference on Programming Languages Design and Implementation, 1993.
文献 2 Aho、他:”Compilers − Principles, Techiniques and Tools”, Addison−Wesley Publishers Limited, 1989、(邦訳)原田賢一:”コンパイラ − 原理・技法・ツール”, 株式会社サイエンス社, 1990.
文献 3 Andrew w. Appel: ”modern compiler implementation in Java”, Cambridge university press, 1998.
以降、従来の資源割付処理についての説明を行なう。図17(a)は、資源割付処理の対象となる中間プログラム(中間プログラムとは、ソースプログラムを一旦変換することにより得られた一時的なプログラムである。)の一例を示す図である。この中間プログラムに対して資源割付処理を行なう場合、このプログラムにおける中間命令s1には変数t3への代入があり、中間命令s2では変数t3の値を参照しているため、中間命令s1を実行した後に中間命令s2を実行しなければならないという実行順序の依存関係がある。
【0006】
これに対して中間命令s3には中間命令s1,s2との間には依存関係がない。つまり、中間命令s3を中間命令s1,s2より先に実行しても良いし、ターゲットマシンが並列実行可能型であるならば、中間命令s3と中間命令s1,s2と並列実行してもよい。この中間プログラムに対して資源割付処理を行ない、変数t1, t2, t3, t4, t5, t6に対して、それぞれレジスタr0, r1, r0, r1, r2, r0 を割付けたとすると、各中間命令s1,s2,s3に対応する機械語命令は図17(b)のようになる(機械語命令はアセンブラコードにて表記されるが、中間命令との対応をとるため、本図では中間命令と同一の表記で図示している。)。
【0007】
この時、機械語命令s3はレジスタr0への代入を行なっているので、機械語命令s3は機械語命令s2より先に実行することができないし、機械語命令s1,s2と並列に実行することもできない場合がある。これは、変数に対して資源割付処理を行なったために、機械語命令s3と機械語命令s1,s2の間に新たな依存関係が発生したことによるものである。
【0008】
かかる依存関係の発生を避けるため、文献1の資源割付処理は、中間プログラムにおいて依存関係がない中間命令の異なる変数に、異なるレジスタを割り付けることにより、これらの中間命令間に新たな依存関係を作らないような配慮を払う。図17(c)は、変数t3と変数t6には異なるレジスタを割り付けて、中間命令s1,s2と中間命令s3の間に新たな依存関係を作らないように配慮が払われた資源割付処理結果の一例を示す図である。本図の一例では、中間プログラムの変数t1, t2, t3, t4, t5, t6 に対して、それぞれレジスタr0, r1, r0, r1, r2, r3 が割付けられている。こうすることにより、中間命令s1〜s3に対応する機械語命令s1〜s3において、機械語命令s3は機械語命令s1,s2より先に実行することもできるし、並列実行可能なプロセッサでは、機械語命令s3は機械語命令s1あるいはs2と並列に実行することもできるようになる。更に図17(d)に示すように、機械語命令s2,s3を入れ換えて機械語命令s1,s3を並列実行することが可能となる。このように並列実行性をソースプログラムから機械語プログラムに継承できるように変数へのレジスタ割付を行なうことによって、ターゲットマシンにおける並列実行能力を発揮させ、プログラムの短時間実行が可能となる。
【0009】
【発明が解決しようとする課題】
ところで、依存関係がない中間命令の異なる変数に異なるレジスタを割り付けることにより依存関係の発生を防ぐ技術は、ともすれば、コンパイラの最終成果物たる機械語プログラムのコードサイズの増大化を誘発するという問題点がある。
【0010】
本発明の目的は、ソースプログラムから機械語プログラムへと並列実行性を継承させつつも、機械語プログラムのコードサイズの増大を防ぐことができるコンパイラ装置を提供することである。
【0011】
本発明の目的は、ソースプログラムから機械語プログラムへと並列実行性を継承させつつも、機械語プログラムのコードサイズの増大を防ぐことができるプログラム書換装置を提供することである。
【0012】
上記の目的を達成するため、本発明に係るコンパイラ装置は、並列実行すべき命令の組合せを決定するスケジューリング手段と、実行順序が並べ替えられた目的プログラムにおいて、各命令で定義され、又は、参照されている資源を、別の資源に書き換える書換手段とを備え、前記書換手段は、実行順序が並べ替えられた目的プログラムを解析して、目的プログラムに含まれる資源に値を定義する命令から定義された値を最後に参照する命令までの生存区間を生成する基本解析部と、前記基本解析部にて生成された複数の生存区間のうち1つを選ぶ処理(1)、選ばれた生存区間reの開始点又は終了点と、一致する開始点又は終了点を有し、同一の資源に属する別の生存区間eを全て検出して、検出された全ての生存区間eを選ばれた生存区間reに連結する処理(2)を、生成された全ての生存区間に対して繰り返す拡張生存区間生成部と、前記連結の繰り返しにより複数の拡張生存区間が得られれば、複数の拡張生存区間のうち1つを拡張生存区間REとして選ぶ処理(1)、拡張生存区間REに割付可能な資源を、拡張生存区間REと、他の拡張生存区間との重複に基づいて求める処理(2)、拡張生存区間REにおいて定義され、参照されている資源を、割付可能資源に書き換える処理(3)を、複数の拡張生存区間のそれぞれに対して実行する書換処理部とを備えることを特徴としている。
【0013】
【発明の実施の形態】
<用語の説明>
まず、コンパイラ装置の実施形態の説明に用いる技術用語について説明する。
・中間プログラム
中間プログラムは、中間命令の列であり、中間命令には4つ組や3つ組などの種類が存在する。例えば、図3(a)に示したソースプログラムをコンパイラが処理する中で生成した中間プログラムが図3(b)である。この中間プログラムは4つ組方式にて表記されているものであり、ソースプログラムに存在しない変数(中間命令s1,s2等の中の現れるt1, t2, t3等)が挿入されていることがわかる。これらソースプログラムに存在せず、中間プログラムにて現れる変数は、一時変数と呼ばれ、コンパイラがソースプログラムを中間プログラムに変換する際、コンパイラにより挿入される。以下では特に断らない限り、一時変数を、一般のソースプログラム内の変数と対等に扱うものとする。
【0014】
コンパイラにより生成された変数としては図3(b)における変数Pr1があるが、これは図3(a)の仮引数aに対応するものである。変数retもコンパイラが生成したものであり、これは関数funcの戻り値を表すものである。また変数xは、ソースプログラム中の何処かで外部変数として定義されている変数であるとする。尚、ソースプログラムから中間プログラムへの変換方式自体は本実施形態と関係がなく、他の変換方式でも本実施形態は適用可能である。
・資源
コンピュータ、マイクロプロセッサの構成要素のうち、値を一時的に保持することができるもの、すなわち、レジスタやメモリのことを指す。
・レジスタ/メモリの定義、参照、使用
レジスタまたはメモリの値を、代入文や代入命令などを用いて設定することを「定義する」と呼ぶ。また、この設定された値を計算や命令のオペランドに用いることを「参照する」と呼ぶ。この、定義することと参照することを併せて「使用する」と呼ぶことにする。
・プロログ,エピログ
ソースプログラム上で手続き/関数として定義されている一連の処理のまとまりは、機械語プログラムに翻訳された時に、手続き/関数本体を実行する前と実行した後に手続き/関数本体を実行するためにスタック上に取られる駆動レコード(文献 2)の確保および開放に関連した前処理/後処理を行なうのが一般的である。この前処理のことを「プロログ」、後処理のことを「エピログ」という。「プロログ」・「エピログ」の中の処理で本実施形態に関連のあるものは、レジスタの値の待避/復帰処理である。これは、手続き/関数の呼出しの前後で、レジスタの値を保存するための処理である。手続き/関数呼出しの前後で値が保存されるレジスタを保証レジスタといい、逆に手続き/関数呼出しの前後で値が保証されないレジスタを破壊レジスタという。レジスタの値の待避・復帰処理は、手続き/関数本体で使用している保証レジスタの数だけ行なわれることになる。・基本ブロック
プログラムの先頭命令とジャンプ命令の飛び先の命令のことを「リーダ」と呼ぶことにすると、プログラム上で、リーダから、次のリーダより一つ手前の命令、またはプログラムの最後の命令までの区間にある命令群のことを「基本ブロック」と呼ぶ。
・生存区間
生存区間には、ソースプログラムにおけるものと、目的プログラムにおけるものとで異なる意味を持つ。ソースプログラムにおける生存区間とは、変数に値を定義する命令からその定義された値を最後に参照する命令までのプログラム上の区間のことをいう。一方、目的プログラムにおいて、かかる変数に該当するのは、命令のオペランドに割り付けられた資源であるので、目的プログラムにおける生存区間とは、命令のオペランドに割り付けられた資源に値を定義する命令からその定義された値を最後に参照する命令までのプログラム上の区間のことをいう。つまりレジスタ/メモリの生存区間の始点は、そのレジスタ/メモリに値が定義されたプログラムの命令となり、生存区間の終点は、その定義された値が最後に参照されるプログラムの命令となる。但し、プログラム中に並列実行する命令の組は、同ステップに実行される命令として一つにまとめて扱う。2つの生存区間が重複しているかどうかの判定を行なう際には、一方の終点と他方の始点だけが一致している場合はこれら2つの生存区間は重複していないものとして扱うのが一般的である。生存区間を表す命令の集合積を用いて重複/非重複の判定を行なうために、生存区間の終端を表す命令は、生存区間を表す命令の集合には含めないこととする。
【0015】
図10は、生存区間の一例を示す図である。図の左側にあるアセンブラ命令列に対応して、その右側に各レジスタの生存区間を図示している。この図では、生存区間は縦実線で、生存区間の開始点は黒丸で、生存区間の終了点は矢印でそれぞれ表現している。命令i5と命令i6、命令i15と命令i16はそれぞれ並列に実行する命令の組であり、生存区間の始点/終点は2つの命令で共有する形となっている。当該図の情報を表に表したのが図6に示した生存区間データ集合である。
<実施形態>
図2は、コンパイラ1の構成を示す図である。本図に示すように、コンパイラ1は、構文解析装置11と、最適化・資源割付装置12と、目的プログラム生成装置13と、スケジューリング装置14と、プログラム書換装置15と、再スケジューリング装置16とから構成される。
【0016】
構文解析装置11は、記憶装置にファイルとして記憶されているソースプログラムの字句解析と、構文解析と、意味解析とを行ない、ソースプログラムを中間プログラムに変換する。例えば図3(a)のソースプログラムを構文解析装置11で処理して出力された中間プログラムを図3(b)に示す。
最適化・資源割付装置12は、目的プログラムのコードサイズの縮小と、実行効率の向上とを実現するために中間プログラムの最適化を行い、中間プログラム内の変数をハードウェア資源に割付ける。この際、最適化・資源割付装置12は、従来技術と同様、依存関係がない中間命令の異なる変数に、ターゲットマシンにおける資源割り付け可能な全てのレジスタを割り付ける。
【0017】
目的プログラム生成装置13は、最適化・資源割付装置12による資源割り付け結果に従って、中間プログラムを、機械語命令からなる目的プログラムに変換する。例えば、図3(b)に示された中間プログラムに対して目的プログラム生成装置13がプログラム生成を行うと、図4に示す機械語命令からなる目的プログラムが生成されることとなる。図4においてアセンブラコードにて表記された機械語命令について説明する。”mov”は転送命令を表し、例えば”mov r0, r2”は、レジスタr0が保持する値をレジスタr2へ転送することを表し、”mov 20, r1”は、値20をレジスタr1へ転送することを表す。また、”add”, ”sub”, ”mul”, ”div”はそれぞれ加算、減算、乗算、除算命令を表し、例えば”add 2, r2”は、2とr2の加算結果をr2に格納することを表し、”sub r1, r2”は、r2−r1の計算結果をr2に格納することを表す。この例では図3(b)に示した中間プログラムの一つの中間命令から一つの機械語命令が生成されているが、一つの中間命令から複数の機械語命令が生成されることもある。最適化・資源割付装置12は、資源割り付け可能な全てのレジスタ(レジスタr0〜レジスタr3)を変数に割り付けているので、退避命令、復帰命令の数は多い目になっている。
【0018】
スケジューリング装置14は、機械語命令のプログラムに対して、実行効率向上のために命令の実行順序の並べ替えを行い、並列実行すべき命令の組み合わせを決定する。スケジューリング装置14は本実施形態の主眼ではなく、文献 3に記載のものと同様であるので、その処理の概要のみを触れておくものとする。
実行順序の並べ替え、及び、並列実行すべき命令の組み合わせの決定は、プログラムを解析して依存関係を得て、この依存関係を遵守するように行う。より詳しくいうと、命令間の依存関係には、「データ依存関係」、「逆依存関係」、「出力依存関係」という3種類のものがある。
【0019】
「データ依存関係」とは、ある資源を定義する命令と、同じ資源を参照する命令間の依存関係であり、「逆依存関係」は、ある資源を参照する命令と、同じ資源を定義する命令間の依存関係である。「出力依存関係」は、ある資源を定義する命令と、同じ資源を定義する命令間の依存関係である。
命令における使用レジスタ数が少なければ少ない程、こうした依存関係が多く命令列に現れることとなり、命令列における並べ替えの自由度が奪われることとなる。最適化・資源割付装置12がターゲットマシンにおける変数割り付けが可能なレジスタの全て(レジスタr0〜レジスタr3)を変数に割り付けたのは、命令列における依存関係の発生を抑制し、ソースプログラムにおける並列実行性をより多く目的プログラムに継承させるためであり、これによりスケジューリング装置14は、比較的自由に命令の順位を並べ替えることができる。しかし、変数割り付けが可能なレジスタの全てが変数に割り付けられたため、プロログ、エピログにおける退避命令、復帰命令の数や転送命令の数が多くなっており、スケジューリング装置14によるスケジュール後のコードは、命令削減の余地が残っていることに留意すべきである。
【0020】
プログラム書換装置15は、スケジューリング装置14によりスケジュールがなされた目的プログラムにおいて、互いに異なる資源に値を定義し、互いに異なる資源に定義された値を参照している命令を、同一の資源に値を定義する命令、及び、同一の資源に定義された値を参照する命令に書き換える。目的プログラムに対してこうした書き換えを行うと、一部のレジスタはプログラムにおいて全く定義・参照されなくなり、その保持値を退避・復帰する必要がなくなるので、プロログ、エピログにおける退避命令、復帰命令を削除することが可能となる。
【0021】
再スケジューリング装置16は、プログラム書換装置15により退避命令、復帰命令、同一レジスタ間で値の転送を行う転送命令が削除された場合、削除された命令に後続する命令の順番を繰り上げるような再スケジュールや、並列実行すべき組み合わせのうち、一方の命令がプログラム書換装置15により削除された場合、削除された命令に後続する命令を、その組み合わせに割り当てるような再スケジュールを行う。
【0022】
<図1に示したプログラム書換装置15の構成>
プログラム書換装置15の概要は次の通りである。プログラム書換装置15は、各命令のオペランドに割り付けられたレジスタ/メモリがスケジューリングがなされたプログラムにおいてどれだけの区間で有効であるかを解析して、この解析結果に基づいて、各命令のオペランドに割り付けられた資源の値が有効となるプログラム中の区間(いわゆる生存区間)を得る。そしてそれぞれの生存区間に位置する命令のオペランドに割り付けられた資源を別の資源に割り付けるよう、プログラムの書き換え処理を行なう。
【0023】
この際、オペランド資源の書き換えの対象として単一の生存区間を考えたものとする。この場合プログラム書換装置15は、この生存区間に含まれる全ての命令のオペランドに割り付けられた資源を別の資源に書き換えることとなる。この生存区間が、同一資源の値が有効となる他の生存区間と連続している場合、資源間で値の転送を行う転送命令が挿入される可能性を考慮しなくてはならない。即ち互いに連続している2つの生存区間のうち、一方が別の資源に書き換えられると、書き換えにより新たに命令のオペランドに割り付けられた資源と、書き換え前から既に命令のオペランドに割り付けられている資源との間で保持値の転送を行わねばならない。生存区間の連続位置において転送命令の挿入が発生するとなると、命令のスケジューリングに影響を与えるほか、新たに発生する転送命令のために解析が非常に困難になる。
【0024】
そこで本実施形態では、同一資源に対する生存区間が連続している箇所に注目して、拡張生存区間と称する概念を導入し、オペランド資源の書換は、拡張生存区間を対象として行うこととしている。
続いてオペランド資源書換処理を行うプログラム書換装置15について説明する。
【0025】
図1にプログラム書換装置15の構成を示す。プログラム書換装置15は、オペランド資源書換制御部21と、基本解析部22と、拡張生存区間生成部23と、オペランド資源書換処理部24と、生存区間データ集合保持部25と、作業用生存区間データ保持部26と、拡張生存区間データ集合保持部27と、作業用拡張生存区間データ保持部28とから構成される。
【0026】
基本解析部22は、処理対象のプログラムの基本ブロック分割、制御フロー解析、データフロー解析を行なう。それぞれの解析は本実施形態の主眼ではないので、簡単に説明する。基本ブロック分割は、処理対象のプログラムを基本ブロックに分割する。制御フロー解析は、命令間の処理の流れによる関係について解析する。データフロー解析は、資源(レジスタ/メモリ)がどこで定義され、どこで参照されているかを解析する。これらの解析の結果、各資源の生存区間を求めることができる。例えば、図10で示すようなプログラムでは、図の右側に図示したような各資源に対する生存区間を求めることが出来る。
【0027】
生存区間データ集合保持部25は、基本解析部22により得られたプログラム中の各資源の生存区間に関する情報を保持する。図6は、各資源の生存区間を表すデータ集合の一例を示す図である。当該データ集合は、データを区別するための番号n11と、資源n12と、その資源の生存区間をあらわす命令の集合n13と、生存区間の開始点となる命令の集合n14と、生存区間の終点となる命令の集合n15と、生存区間中で資源が使用されている命令の集合n16というフィールドから構成される。また以後、当該データ集合を「生存区間データ集合」と呼び、生存区間データ集合の一つのデータを「生存区間データ」と呼ぶ。また、図6の番号4, 5の生存区間データのように、同じ資源でも生存区間が異なれば別々の生存区間データとして格納される。
【0028】
拡張生存区間生成部23は、基本解析部22で求めた生存区間に対する解析を行う。ここではオペランド資源書換処理に必要となる拡張生存区間を求める。ここで拡張生存区間について説明する。図10の生存区間を示した図において、同一の資源に対して、ある生存区間の終了点が別の生存区間の開始点と一致している箇所に注目する。それぞれの開始点と終了点を共有しながら連なっているいくつかの同一資源の生存区間を、ひとつの「拡張生存区間」と呼ぶことにする。これにより、例えば図10に示した生存区間は、図11に示すような拡張生存区間となる。オペランド資源の書換処理は、この拡張生存区間を処理対象とする。また、拡張生存区間の始点、終点、生存区間の重複の判定などは、生存区間のものと同様である。拡張生存区間の算出処理の詳細は後述する。
【0029】
作業用生存区間データ保持部26は、生存区間データ集合保持部25で保持している生存区間についてのデータ集合を保持する。これは、拡張生存区間生成部23が拡張生存区間を求める際に使用する。
拡張生存区間データ集合保持部27は、拡張生存区間生成部23で求めた各資源の拡張生存区間とそれに付随する情報を図7に示すようなデータ集合で保持する。当該データ集合は、データを区別するための番号n1と、割付資源n2と、その資源の拡張生存区間をあらわす命令の集合n3と、その拡張生存区間中で割付資源が使用されている命令の集合n4と、その拡張生存区間と生存区間が重なっているデータの集合n5というフィールドからなる。また以後、拡張生存区間データ集合保持部27で保持する情報を、「拡張生存区間データ集合」と呼び、拡張生存区間データ集合のデータを「拡張生存区間データ」と呼ぶ。
【0030】
オペランド資源書換処理部24は、拡張生存区間データ集合保持部27の内容に基づいて、オペランド資源の書き換えを行なう。処理手順の詳細については後述する。
作業用拡張生存区間データ保持部28は、オペランド資源書換処理部24において、オペランド資源の書き換えを行なうための処理対象となる拡張生存区間データを保持する。作業用拡張生存区間データ保持部28で保持している拡張生存区間データに対して内容の変更操作を行なった場合、その内容変更は拡張生存区間データ集合保持部27で保持されている拡張生存区間データ集合の内容にも反映される。
【0031】
オペランド資源書換制御部21は、オペランド資源書換処理全体を制御する。図9は、オペランド資源書換制御部21のフローチャートである。
・ステップa1では、オペランド資源書換制御部21は、基本解析部22を起動する。解析結果は生存区間データ集合保持部25に保持される。
・ステップa2では、オペランド資源書換制御部21は、拡張生存区間生成部23を起動する。解析結果は拡張生存区間データ集合保持部27に保持される。
【0032】
・ステップa3では、オペランド資源書換制御部21は、オペランド資源書換処理部24を起動する。
<拡張生存区間生成部23の処理手順>
拡張生存区間生成部23は、基本解析部22で求めた生存区間について解析を進めて、生存区間データ集合からオペランド資源書換処理で用いる拡張生存区間を求め、拡張生存区間データ集合保持部27に拡張生存区間データ集合を作る処理を行なう。ここで、生存区間データ集合保持部25に保持されている生存区間データ集合をLT、作業用生存区間データ保持部26で保持する生存区間データをre、拡張生存区間データ集合保持部27で保持する拡張生存区間データ集合をELTと表記する。また、生存区間データreの各フィールドをre.n11, re.n12などのように表記する。
【0033】
図14は、拡張生存区間生成部23の処理手順を示したフローチャートである。以下、このフローチャートを参照しながら処理の詳細を説明していく。
・ステップb1は、生存区間データ集合保持部25の生存区間データ集合LTのデータを順番に処理していくためのループを構成している。ループ内の処理は、ステップb2〜b5である。
【0034】
・ステップb2では、生存区間データ集合保持部25に格納されている生存区間データ集合LTから、次に処理するデータreを取り出し、作業用生存区間データ保持部26に格納する。そして、生存区間データ集合LTからデータreを削除する。
・ステップb3では、作業用生存区間データ保持部26に格納されているデータreに、生存区間データ集合保持部25に格納されている生存区間データ集合LTの中で連結可能なデータeを探し、データeが存在する間繰り返すループを構成している。2つのデータが連結可能であるための条件は、次の通りである。
【0035】
re.n12 = e.n12 かつ
((re.n14 ∩ e.n15)≠φ または (re.n15 ∩ e.n14)≠φ)
∩:積集合を求める演算子
φ:空集合
つまり、両者の資源が同一であって、かつ、一方の生存区間の始点の命令と他方の生存区間の終点の命令に共通の命令が存在することである。例えば、図6に示した生存区間データ集合保持部25が保持している生存区間データ集合の番号4の生存区間と番号5の生存区間は、ともに資源n12がレジスタr2で、番号4の生存区間の終点である命令i5は、番号5の生存区間の始点になっているので連結可能である。連結可能なデータeが存在すれば後述のステップb4を実行し、存在しなければステップb5を実行する。
【0036】
・ステップb4では、ステップb3で連結可能と判定された生存区間データ集合LTのデータeを作業用生存区間データ保持部26に保持されているデータreに連結する。つまりまず、データeとreの生存区間を表す命令の集合と、生存区間の始点を表す命令の集合と、生存区間の終点を表す命令の集合と、生存区間の中で資源n12が使用されている命令の集合のそれぞれの和集合を求める。次に、データeとreの一方の始点と他方の終点に含まれる命令の集合Jを求め、始点を表す命令の和集合と終点を表す命令の和集合から集合Jを引く。このように求めた2つのデータの和集合を、データreの各フィールドに格納する。
【0037】
つまり形式的には次のようになる。
L = (re.n13 ∪ e.n13)
J = {i| i∈(re.n14 ∩ e.n15) または i∈(re.n15 ∩ e.n14)}
B = (re.n14 ∪ e.n14) − J
E = (re.n15 ∪ e.n15) − J
U = (re.n16 ∪ e.n16)
∪:和集合を求める演算子
−:集合差を求める演算子
∈:含む
集合L, J, B, E, Uを求め、reの各フィールドを次のように更新する。
【0038】
re.n13=L, re.n14=B, re.n15=E, re.n16=U
連結処理を行なった後、生存区間データ集合LTからデータeを消去し、ステップb3に戻る。
・ステップb5では、作業用生存区間データ保持部26に格納されている生存区間データreの内容を、拡張生存区間データ集合保持部27に拡張生存区間データEとして追加する。データreとEの関係は、次のようになる。
【0039】
E.n1 = re.n11
E.n2 = re.n12
E.n3 = re.n13
E.n4 = re.n16
E.n5は空欄のままにしておく。
【0040】
特にE.n2は後述のオペランド資源書換処理部24で再設定される可能性があり、そのため、ここでの処理は、Eの割付資源n2をr2.n12で初期設定することを意味する。
以上のように、拡張生存区間生成部23は、基本解析部22により解析された生存区間データ集合LTを解析して、オペランド資源書換処理で用いる拡張生存区間データ集合ELTを拡張生存区間データ集合保持部27に構築する(ステップb1〜b5)。
<オペランド資源書換処理部24の処理手順>
図15は、オペランド資源書換処理部24の処理手順を示したフローチャートである。オペランド資源書換処理部24ではまず、拡張生存区間データ集合保持部27に保持されている拡張生存区間データ集合ELTの各データXに対して、Xと拡張生存区間に重なりがある拡張生存区間データの集合を調べて、拡張生存区間データ集合ELTのデータを割付資源について並べ替える。そして、各データXについて、Xのオペランドに割り付け可能なレジスタ資源を求めて、Xに対して資源のオペランド資源書換処理を行なう。次に、各データに対するオペランド資源書換処理の結果、手続き/関数内で使用されないレジスタが存在すれば、そのレジスタに関するプロログ・エピログで行われるレジスタ値の待避・復帰処理命令の削除を行なう。
【0041】
以下、図15のフローチャートに沿って処理手順を説明する。
・ステップc1では、拡張生存区間データ集合保持部27で保持している拡張生存区間データ集合の各データの、フィールドn5(拡張生存区間が重なっているデータの集合)を求める。2つの拡張生存区間データE1, E2が重なっているかどうかは、次の式で判定できる。
【0042】
(E1.n3 ∩ E2.n3)≠φ
つまり、データE1の生存区間を表す命令の集合とデータE2の生存区間を表す命令の集合に共通の命令が存在するならば、データE1, E2は重なっていると判定する。拡張生存区間データ集合ELTの各拡張生存区間データについて、それと生存区間が重なっているデータの集合を求め、フィールドn5に格納していく。
【0043】
・ステップc2では、拡張生存区間データ集合保持部27で保持している拡張生存区間データ集合ELTのデータを割付資源について並べ替える。データの並べ替えは、
1. レジスタ資源:番号が若いレジスタから順に並べる。
2. メモリ資源:使用命令数が多い順に並べる。
【0044】
という順序になるようにする。例えば、図7(a)のような拡張生存区間データ集合ELTに対して、ステップc2を実行すると、図7(b)のようになる。
・ステップc3は、拡張生存区間データ集合保持部27で拡張生存区間データ集合のデータをステップc2で並べ替えた順番に処理していくためのループを構成している。ループ内の処理はステップc4〜c7である。
【0045】
・ステップc4では、拡張生存区間データ集合保持部27で保持している拡張生存区間データ集合のデータのうち、次に処理すべきデータREを作業用拡張生存区間データ集合保持部28に格納する。
・ステップc5では、作業用拡張生存区間データ集合保持部28が保持している拡張生存区間データREに対して、新しく割付けるレジスタの候補を求める。
【0046】
まず、次の式を用いて割付候補レジスタの集合ARを求める。
AR = U−[R∈U|R=E.n2(E∈RE.n5)]
U: 使用可能なレジスタ全体の集合
R: レジスタ
E: 拡張生存区間データ
RE: 書き換え対象データ(作業用拡張生存区間データ集合保持部28が保持している拡張生存区間データ)
RE.n5: REと生存区間が重なっている拡張生存区間データの集合
E.n2: Eの割付資源
つまりARは、使用可能なレジスタ全体のうち、拡張生存区間REと生存区間が重なっている拡張生存区間に割付けられているレジスタを除いたレジスタの集合である。ここで求めた割付候補レジスタ集合ARの中から、レジスタ番号が最も若いレジスタを最終的な割付候補レジスタRCとする。レジスタ集合ARが空集合であるときは、割付候補レジスタは未定義であるとする。
【0047】
例えば、図7(b)において番号6のデータが拡張生存区間データ集合保持部27に保持されているときの処理を示す。番号6データと拡張生存区間が重なっているデータそれぞれの割付資源は、番号3の生存区間がレジスタr3、番号4の生存区間がレジスタr2なので、求める割付候補レジスタの集合は、レジスタr2, r3を除くレジスタの集合{r0,r1}となり、割付候補レジスタRCはr0となる。
【0048】
・ステップc6では、作業用拡張生存区間データ集合保持部28が保持している拡張生存区間データREの割付資源RE.n2が、レジスタであればステップc7へ進み、メモリであればステップc8へ進むよう分岐処理を行なう。
・ステップc7では、ステップc4で求めた割付候補レジスタRCを用いて、作業用拡張生存区間データ集合保持部28で保持している拡張生存区間データREについて、そのデータの割付資源RE.n2(レジスタ)に対して資源のオペランド資源書換処理を行なうかどうかを判定する。判定条件は、ステップc5で求めた割付候補レジスタRCが、未定義でなく、かつ、作業用拡張生存区間データ集合保持部28で保持している拡張生存区間データREの割付資源RE.n2より若いレジスタ番号のレジスタであるならば、実際にオペランド資源の書き換えを行なうステップc9を実行し、そうでないときは、ステップc3が構成するループの次の段階へ進む。
【0049】
例えば、番号6のデータについて、ステップc6で求めた割付候補レジスタRCはr0であり、番号6のデータの割付資源はr1である。この時、割付候補レジスタRCのほうがレジスタ番号が若いので、番号6のデータはステップc9以降のステップに進むことになる。
・ステップc8では、ステップc4で求めた割付候補レジスタRCを用いて、作業用拡張生存区間データ集合保持部28で保持している拡張生存区間データREについて、そのデータの割付資源RE.n2(メモリ)に対して資源のオペランド資源書換処理を行なうかどうかを判定する。割付候補レジスタRCが未定義でないならば、実際にオペランド資源の書き換えを行なうステップc9を実行し、そうでないときは、ステップc3が構成するループの次の段階へ進む。
【0050】
・ステップc9では、作業用拡張生存区間データ集合保持部28で保持している拡張生存区間データREに対して、割付資源RE.n2を使用している命令の集合RE.n4の各命令に対して、割付資源の書き換えを行なう。
命令を書き換えるやり方は次の通りである。
1. 割付資源RE.n2が使用されている命令の集合RE.n4の各命令に対して、レジスタ名をRE.n2からステップc5で求めた割付候補レジスタRCへ置き換える。
【0051】
2. 置き換えた命令が、レジスタRCからレジスタRCへの転送命令である場合は、その転送命令を削除する。但し、当該命令が並列実行する命令の組の要素ならば、当該転送命令をNOP(何も実行しない命令)に書き換える。
命令の書き換えが終了した後、拡張生存区間データREの割付資源をあらわすフィールドRE.n2をRCに書き換える。
【0052】
例えば、図7(b)において番号6のデータについて、レジスタr0を対象とする処理を示す。番号6のデータで割付資源r1が使用されている命令はi6, i7, i12, i13である。命令i6は、書き換え対象のレジスタr1の値が書き換え対象のレジスタr0に対して転送される命令であるので、上記2の方法により削除される。また、命令i7, i12, i13は、書き換え対象レジスタの値を使用しているので、レジスタ名をr1からr0に書き換える。
【0053】
・ステップc10では、手続き/関数の中でオペランド資源書換処理前に使用していたレジスタのうち、ステップc3が構成するループ(ステップc4〜c9)で行なったオペランド資源書換処理の結果、使用されていないレジスタが存在するかどうかを判定する。判定方法は、次の式を用いて行なう。
(U−{R∈U | R = E.n2 (E∈ELT)})≠φ
U 使用可能なレジスタの集合
R 拡張生存区間に割付けられたレジスタ
E 拡張生存区間データ集合ELTに含まれる拡張生存区間データ
つまり、使用可能なレジスタの集合のうち、拡張生存区間データ集合により保持されているデータの割付資源に含まれていないレジスタが存在するかどうかを判定する。このようなレジスタが存在する場合はステップc11を実行し、存在しない場合は、オペランド資源書換処理部24の処理を終了する。
【0054】
・ステップc11では、手続き・関数内において使用されないレジスタにそれぞれについて、関数の先頭で行われるレジスタ値の待避処理命令、および関数の末尾で行われるレジスタ値の復帰処理命令の削除を行なう。
図16に示した機械語プログラムを用いて説明する。ここで、プログラム中の”SP”は、スタックポインタという特殊なレジスタを表し、スタックの先頭アドレスを保持している。例えば、”mov r3,(SP+4)”という命令は、スタックポインタからオフセット4のアドレスに対してレジスタr3の値を転送する命令である。図16のプログラムにおいて、レジスタr3が関数内で使用されないレジスタであるとステップc10で判明した場合には、レジスタr3の値のスタックへの待避・復帰処理を行なっている命令i3と命令i10が不要な命令ということになり、これらの命令が削除される。
【0055】
以上のようにオペランド資源書換処理部24は、まずステップc1で拡張生存区間データ集合ELTの各データについて、それと拡張生存区間が重なっている拡張生存区間データの集合を求めて、ステップc2で拡張生存区間データ集合ELTのデータを割付資源について並べ替える処理を行なっている。これにより、ステップc3〜c9の処理で、割付資源がレジスタである拡張生存区間データについてオペランド資源の書き換えを行なうと、無駄に割付けられた形になっているレジスタが使用されない形となる。例えば、図7(b)に示した拡張生存区間データ集合に対して、割付資源がレジスタであるものについての処理を行なうと、当該データ集合は図8(a)のようになる。この時、レジスタr3が使用されなくなっている。次に、割付資源がメモリである拡張生存区間データに対して資源のオペランド資源書換処理を行なうと、先に検出された使用されないレジスタr3を割付資源がメモリである拡張生存区間データに対してオペランド資源の書き換えを行うことができる。ステップc10〜c11では、ステップc9までのオペランド資源書換処理の結果、手続き・関数全体で使用されないレジスタが存在すれば、そのレジスタの値の待避・復帰処理を削除する処理を行なっている。
【0056】
尚、本実施形態ではオペランド資源書換処理部への入力は機械語プログラムを用いて説明しているが、オペランド資源書換処理を行なう対象としては別の種類のプログラム(例えば中間プログラム)であってもかまわない。また、動作説明では入力として図3(a)のプログラムを与えており、このプログラムは簡単のため、単一の基本ブロックで構成されたものであるが、生存区間が複数の基本ブロックにまたがっている場合でも、本方式は適用可能である。
【0057】
<具体的な実施形態の動作説明>
以上のように構成される本実施形態のプログラム書換装置における具体的な処理内容をこれまでに示した図を再度参照しながら説明する。コンパイラ1の処理は、図3(a)に示したソースプログラムを入力として与えると、構文解析装置11、最適化・資源割付装置12、目的プログラム生成装置13、スケジューリング装置14で処理されて、図4に示した機械語プログラムが生成される。プログラム書換装置15への入力は、図4のような機械語プログラムである。
<入力が図4の機械語プログラムである場合>
まず、プログラム書換装置15への入力が図4のプログラムであったときのプログラム書換装置15の動作について述べる。図4のプログラムでは、使用可能なレジスタはr0, r1, r2, r3の4つである(ステップa1)。
【0058】
次に、オペランド資源書換制御部21は拡張生存区間生成部23を起動する。ここで、生存区間を解析して、拡張生存区間データ集合を得る(ステップa2)。
拡張生存区間生成部23の処理を図14に示すフローチャートを参照しながら以下に説明する。ここで、図6に示す生存区間データ集合が生存区間データ集合保持部25に保持されているとする。
【0059】
ステップb1により構成されるループでは、生存区間データ集合保持部25が保持している生存区間データ集合LTの各データについて処理が行なわていく。このループでは、生存区間データ集合保持部25から次に処理する生存区間データ集合LTのデータを取り出して作業用生存区間データ保持部26に処理対象生存区間データreとして格納する(ステップb2)。そして生存区間データreと連結可能な生存区間データeを生存区間データ集合LTから探し(ステップb3)、もし見つかれば、連結処理を行なう(ステップb4)。生存区間データと連結可能な生存区間データreが生存区間データ集合LTからなくなるまでステップb3, b4を繰り返す。連結可能な生存区間データがなくなったら、その時点で作業用生存区間データ保持部26に格納されている生存区間データを、拡張生存区間データ集合保持部27が保持する拡張生存区間データ集合のデータとして追加する(ステップb5)。
【0060】
ここで、図6に示した生存区間データ集合の各データに対する処理は次のようになる。
・番号1, 2, 3, 12, 13, 14, 15のデータは、連結可能なデータが見つからないため、処理は、ステップb2, b3, b5と進んで、これらのデータそれぞれがステップb5により拡張生存区間データ集合のデータとなる。
【0061】
・番号4のデータが作業用生存区間データ保持部26に保持されているとすると、これと連結可能なデータとして、番号5のデータが見つかる。ステップb4において連結処理が行なわれると、生存区間を表す命令の集合は{i4, i5, i6, i7}となり、割付資源が使用される命令の集合は{i4,i5,i8}となる。さらにこの他に、ステップb3においては、連結可能なデータとして番号8, 9, 10, 11, 15のデータが探索され、これらの連結処理が終わると拡張生存区間を表す命令の集合は{i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19}となり、割付資源が使用される命令の集合は{i4, i5, i8, i9, i10, i11, i15}となる。
【0062】
・番号6データが作業用生存区間データ保持部26に保持されているとすると、これと連結可能なデータとして、番号7, 12のデータが見つかる。連結処理を行なうと、拡張生存区間を表す命令の集合は{i6, i7, i8, i9, i10, i11, i12}となり、割付資源が使用される命令の集合は、{i6, i7, i12, i13}となる。
・番号16データが作業用生存区間データ保持部26に保持されているとすると、これと連結可能なデータとして、番号17, 18, 19のデータが見つかる。連結処理を行なうと、拡張生存区間を表す命令の集合は{i16, i17, i18, i19}となり、割付資源が使用される命令の集合は{i16, i17, i18, i19}となる。
【0063】
以上の処理の結果、拡張生存区間データ集合保持部27が保持している拡張生存区間データ集合は図7(a)のようになる。(但し、フィールドn5重複エントリの列は空欄のままになっている。)
次に、オペランド資源書換制御部21はオペランド資源書換処理部24を起動する。ここで資源のオペランド資源書換処理を行なっていく(ステップa3)。ここで、オペランド資源書換処理部24の処理を図15に示すフローチャートを参照しながら以下に説明する。
まず、拡張生存区間データ集合保持部27により保持されている拡張生存区間データ集合ELTの各データのフィールドn5を求める(ステップc1)。その結果、図7(a)に示した拡張生存区間データ集合を得る。そして、拡張生存区間データ集合ELTに対して、割付資源についてデータの並べ替え処理を行なう(ステップc2)。この結果、図7(b)に示した拡張生存区間データ集合を得る。
【0064】
拡張生存区間データ集合ELTのデータを順次処理していくループ(ステップc3)では、次に処理すべきデータを拡張生存区間データ集合保持部27に保持して(ステップc4)、そのデータに対して新しく割付けるレジスタの候補を求め(ステップc5)、そのデータの割付資源に対して、そのレジスタの候補にオペランド資源書換処理をするかどうかを判定して(ステップc6, c7, c8)、オペランド資源書換処理すると判定されると実際にオペランド資源の書き換えを行なう(ステップc9)。図7(b)に示した拡張生存区間データ集合の各データについての処理を示す。
【0065】
・番号1と番号16のデータについて
これらのデータは最も若いレジスタ番号r0についてのデータであり、オペランド資源の書き換え候補のレジスタはr0になるので、何ら処理を行なわない。
・番号2のデータについて
ステップc5の処理を行なうと、このデータに対するオペランド資源の書換候補レジスタはr1となり、ステップc7でオペランド資源書換処理を行なわないと判定され、ステップc3へ進む。
【0066】
・番号6と番号14のデータについて
ステップc5の処理を行なうと、これらのデータに対するオペランド資源の書換候補レジスタはr0となる。ステップc7での処理により、命令i6が削除され、命令i7, i12, i14, i15が書き換えられる。また、これらの生存区間データはレジスタr0に関するデータに変わる。
【0067】
・番号4のデータについて
ステップc5の処理を行なうと、これらのデータに対するオペランド資源の書換候補レジスタはr1となる。ステップc7での処理により、命令i4, i5, i8, i9, i10, i11, i15が書き換えられる。また、これらの生存区間データはレジスタr1に関するデータに変わる。
【0068】
・番号3のデータについて
ステップc5の処理を行なうと、これらのデータに対するオペランド資源の書換候補レジスタはr2となる。ステップc7での処理により、命令i3, i16が書き換えられる。また、これらの生存区間データはレジスタr2に関するデータに変わる。
以上の処理の結果、拡張生存区間データ集合保持部27で保持している生存区間データ集合は図8(a)に示すようになっている。また、命令の書き換え処理を行なったプログラムと各資源の生存区間を示すと図12のようになる。
ここまでの処理で、プログラムで使用するレジスタはr0, r1, r2の3つになったため、レジスタr3は使用されないレジスタとなったことがわかる(ステップc10)。そこで、図16(a)で示したプログラムのプロログ内で、レジスタ r3の待避処理の命令i3と、エピログ内で、レジスタr3の復帰処理の命令i10が削除される(ステップc11)。
【0069】
以上でオペランド資源書換処理部24の処理が終了する。処理結果のプログラムと割付資源とその値の拡張生存区間を示したのが図13である。この例では、プログラム書換装置15により、手続き/関数内で使用するレジスタの数を少なくすることができたため、使用しなくなったレジスタについて、プロログ・エピログで行なうレジスタ値の待避・復帰処理が削除された。これにより、コード削減と実行時間短縮が達成される。
<入力が図5の機械語プログラムである場合>
また、プログラム書換装置15への入力が図5 のプログラムであったときのプログラム書換装置15の動作について述べる。図5のプログラムでは、使用可能なレジスタはr0, r1, r2の3つであるとし、資源割付処理で記憶資源として駆動レコード中に確保されたメモリ領域を中間変数に対して割付けている(プログラム中には、”mem1”と記している)。
このプログラムに対して先の例と同様に処理を行なっていくと、拡張生存区間データ集合保持部27では、図8(b)のような拡張生存区間データ集合が作られる。オペランド資源書換処理部24のステップc2で拡張生存区間データ集合の並べ替えを行なうと、番号3の割付資源がmem1のデータは、レジスタのデータよりも後ろになる。この拡張生存区間データ集合に対して、オペランド資源書換処理を行なっていくと、図13に示したプログラムと、割付資源とその値の拡張生存区間を得る。割付資源mem1の拡張生存区間は、レジスタr3にオペランド資源書換処理されている。
【0070】
この例では、資源割付処理の段階で命令のオペランドに割り付けられたメモリが、オペランド資源書換処理の結果、レジスタに割り付けられている。これにより、メモリへのアクセス命令がレジスタへのアクセス命令に置き換わり、プログラムの実行時間短縮が達成される。
以上のように、本実施形態によれば、プログラム中の資源の生存区間を解析して拡張生存区間を構成し、拡張生存区間に対して資源のオペランド資源書換処理を行なう。これにより、手続き/関数内で使用するレジスタの数を減らすことができ、手続き/関数のプロログ・エピログで行なうレジスタ値の待避・復帰処理のうち、使用しなくなったレジスタに関する処理の削除によるコード削減と実行時間短縮、および、メモリに割付けられた命令のオペランドをレジスタに書き換えることによる実行時間短縮を達成することができる。
【0071】
尚、2つの実施形態は現状において最善の効果が期待できるシステム例として説明したに過ぎない。本発明は、その要旨を逸脱しない範囲で実施変更することができる。例えば、図14,図15のフローチャートを参照して説明した手順等を実行形式プログラムにより実現し、これを記録媒体に記録して流通・販売の対象にしても良い。このような記録媒体には、ICカードや光ディスク、フロッピー( 登録商標 )ディスク等があるが、これらに記録された機械語プログラムは汎用コンピュータにインストールされることにより利用に供される。この汎用コンピュータは、インストールした実行形式プログラムを逐次実行して、本実施形態に示したコンパイラ装置の機能を実現するのである。
【0072】
【発明の効果】
以上のように本発明に係るコンパイラ装置は、並列実行すべき命令の組合せを決定するスケジューリング手段と、実行順序が並べ替えられた目的プログラムにおいて、各命令で定義され、又は、参照されている資源を、別の資源に書き換える書換手段とを備え、前記書換手段は、実行順序が並べ替えられた目的プログラムを解析して、目的プログラムに含まれる資源に値を定義する命令から定義された値を最後に参照する命令までの生存区間を生成する基本解析部と、前記基本解析部にて生成された複数の生存区間のうち1つを選ぶ処理(1)、選ばれた生存区間reの開始点又は終了点と、一致する開始点又は終了点を有し、同一の資源に属する別の生存区間eを全て検出して、検出された全ての生存区間eを選ばれた生存区間reに連結する処理(2)を、生成された全ての生存区間に対して繰り返す拡張生存区間生成部と、前記連結の繰り返しにより複数の拡張生存区間が得られれば、複数の拡張生存区間のうち1つを拡張生存区間REとして選ぶ処理(1)、拡張生存区間REに割付可能な資源を、拡張生存区間REと、他の拡張生存区間との重複に基づいて求める処理(2)、拡張生存区間REにおいて定義され、参照されている資源を、割付可能資源に書き換える処理(3)を、複数の拡張生存区間のそれぞれに対して実行する書換処理部とを備えることを特徴としているので、機械語プログラム内の命令は、生存区間の重複が無い限り、同じ資源を定義・参照する命令に統合されることとなる。このような統合を行った後、同一資源間の転送を行う転送命令や資源値の退避・復帰を行う退避・復帰命令を削除することができ、機械語プログラムのコードサイズを縮小することができる。
【0073】
また並列実行性を向上させつつも、プログラム中で使用されているレジスタ数を減すことができるので、コードサイズの縮小化と、プロセッサの並列実行性の双方の向上を図ることができる。
【図面の簡単な説明】
【図1】実施形態に係るプログラム書換装置15の構成図である。
【図2】コンパイラの構成図である。
【図3】(a)ソースプログラムの例である。
(b)(a)のプログラムをコンパイル処理したときに、コンパイラ内部で生成される中間プログラムの例である。
【図4】中間プログラムから生成された目的プログラムをアセンブラコードにて表記した図である。
【図5】中間プログラムから生成された目的プログラムをアセンブラコードにて表記した図である。
【図6】生存区間データ集合保持部25が保持する、生存区間データ集合の例である。
【図7】(a) 図6に示した、生存区間データ集合保持部25が保持するデータ集合を、拡張生存区間生成部23で解析し、拡張生存区間データ集合を構成した結果を示している。
(b)(a)に示した生存区間データ集合に対して、オペランド資源書換処理部24のステップc2の処理が終わった時点での状態を示した図である。
【図8】(a)図7(a)に示した生存区間データ集合に対して、オペランド資源書換処理部24の第1段階の処理が終わった時点での状態を示した図である。
(b)図5のプログラムを処理したときに、拡張生存区間生成部23で生成した拡張生存区間データ集合を示した図である。
【図9】オペランド資源書換制御部21の処理手順を示すフローチャートである。
【図10】命令と資源とその値の生存区間を示した図である。
【図11】命令と割付資源とその値の拡張生存区間を示した図である。
【図12】図4の機械語プログラムについて、オペランド資源書換処理部24の処理が終了した後のプログラムと割付資源とその値の生存区間を示した図である。
【図13】図5の機械語プログラムについて、オペランド資源書換処理部24の処理が終了した後のプログラムと割付資源とその値の生存区間を示した図である。
【図14】拡張生存区間生成部23の処理手順を示すフローチャートである。
【図15】オペランド資源書換処理部24の処理手順を示すフローチャートである。
【図16】(a)関数のプロログとエピログをあらわす、機械語プログラムの例である。
(b)オペランド資源書換処理部24のステップc9までの処理で、使用しなくなったレジスタがr3であることが判明したとき、ステップc10, c11でレジスタr3の値の待避・復帰処理を削除した結果を示したプログラムである。
【図17】(a)資源割付処理の対象となる中間プログラムの一例を示す図である。
(b)変数t1, t2, t3, t4, t5, t6に対して、それぞれレジスタr0, r1, r0, r1, r2, r0 を割付けた場合の、各中間命令s1,s2,s3に対応する機械語命令を示す図である。
(c)変数t3と変数t6には異なるレジスタを割り付けて、中間命令s1,s2と中間命令s3の間に新たな依存関係を作らないように配慮が払われた資源割付処理結果の一例を示す図である。
(d)機械語命令s2,s3を入れ換えた場合の一例を示す図である。
【符号の説明】
1 コンパイラ
11 構文解析装置
12 資源割付装置
13 目的プログラム生成装置
14 スケジューリング装置
15 プログラム書換装置
16 再スケジューリング装置
21 オペランド資源書換制御部
22 基本解析部
23 拡張生存区間生成部
24 オペランド資源書換処理部
25 生存区間データ集合保持部
26 作業用生存区間データ保持部
27 拡張生存区間データ集合保持部
28 作業用拡張生存区間データ保持部
Claims (1)
- ソースプログラムを翻訳して目的プログラムを得るコンパイラ装置であって、
目的プログラムにおける命令順序を並べ替え、並列実行すべき命令の組合せを決定するスケジューリング手段と、
実行順序が並べ替えられた目的プログラムにおいて、各命令で定義され、又は、参照されている資源を、別の資源に書き換える書換手段とを備え、
前記書換手段は、
実行順序が並べ替えられた目的プログラムを解析して、目的プログラムに含まれる資源に値を定義する命令から定義された値を最後に参照する命令までの生存区間を生成する基本解析部と、
前記基本解析部にて生成された複数の生存区間のうち1つを選ぶ処理(1)、選ばれた生存区間reの開始点又は終了点と、一致する開始点又は終了点を有し、同一の資源に属する別の生存区間eを全て検出して、検出された全ての生存区間eを選ばれた生存区間reに連結する処理(2)を、生成された全ての生存区間に対して繰り返す拡張生存区間生成部と、
前記連結の繰り返しにより複数の拡張生存区間が得られれば、複数の拡張生存区間のうち1つを拡張生存区間REとして選ぶ処理(1)、拡張生存区間REに割付可能な資源を、拡張生存区間REと、他の拡張生存区間との重複に基づいて求める処理(2)、拡張生存区間REにおいて定義され、参照されている資源を、割付可能資源に書き換える処理(3)を、複数の拡張生存区間のそれぞれに対して実行する書換処理部と
を備えることを特徴とするコンパイラ装置。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2000078868A JP3634712B2 (ja) | 2000-03-21 | 2000-03-21 | コンパイラ装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2000078868A JP3634712B2 (ja) | 2000-03-21 | 2000-03-21 | コンパイラ装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
JP2001265604A JP2001265604A (ja) | 2001-09-28 |
JP3634712B2 true JP3634712B2 (ja) | 2005-03-30 |
Family
ID=18596214
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
JP2000078868A Expired - Fee Related JP3634712B2 (ja) | 2000-03-21 | 2000-03-21 | コンパイラ装置 |
Country Status (1)
Country | Link |
---|---|
JP (1) | JP3634712B2 (ja) |
-
2000
- 2000-03-21 JP JP2000078868A patent/JP3634712B2/ja not_active Expired - Fee Related
Also Published As
Publication number | Publication date |
---|---|
JP2001265604A (ja) | 2001-09-28 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
JP3220055B2 (ja) | 機械語命令列またはアセンブリ言語命令列を最適化する最適化装置、及び、高級言語で記載されたソースプログラムを機械語またはアセンブリ言語の命令列に変換するコンパイラ装置。 | |
US20110119660A1 (en) | Program conversion apparatus and program conversion method | |
US5828886A (en) | Compiling apparatus and method for promoting an optimization effect of a program | |
US6718541B2 (en) | Register economy heuristic for a cycle driven multiple issue instruction scheduler | |
US5966539A (en) | Link time optimization with translation to intermediate program and following optimization techniques including program analysis code motion live variable set generation order analysis, dead code elimination and load invariant analysis | |
US6651247B1 (en) | Method, apparatus, and product for optimizing compiler with rotating register assignment to modulo scheduled code in SSA form | |
US8832672B2 (en) | Ensuring register availability for dynamic binary optimization | |
US6973644B2 (en) | Program interpreter | |
US7181730B2 (en) | Methods and apparatus for indirect VLIW memory allocation | |
US20030237080A1 (en) | System and method for improved register allocation in an optimizing compiler | |
US20070234276A1 (en) | Method, system, and program of a compiler to parallelize source code | |
JP2001282549A (ja) | プログラム変換装置及び方法並びに記録媒体 | |
JPH05143332A (ja) | 命令スケジユーラを備えたコンピユータ・システム及び入力命令シーケンスを再スケジユールする方法 | |
JP4041248B2 (ja) | コンパイラ装置、コンパイルプログラムが記録されたコンピュータ読み取り可能な記録媒体及びコンパイル方法 | |
US8266416B2 (en) | Dynamic reconfiguration supporting method, dynamic reconfiguration supporting apparatus, and dynamic reconfiguration system | |
KR19990013980A (ko) | 컴파일 방법, 컴파일러, 예외 핸들러 및 프로그램 기록 매체 | |
Gupta et al. | Optimizing Java programs in the presence of exceptions | |
JP3802058B2 (ja) | ソフトウェア・コンパイル・ユニットを条件付きでコンパイルするシステム、方法およびコンパイラ・プリプロセッサ | |
US20060107258A1 (en) | Program, program code optimization method, program code compile method, program code, and information processing system | |
JP2009169864A (ja) | コンパイル方法およびコンパイルプログラム | |
US20050081016A1 (en) | Method and apparatus for program execution in a microprocessor | |
US20220236970A1 (en) | Program, information conversion device, and information conversion method | |
JP2008305337A (ja) | プログラム変換装置、プログラム変換方法、プログラム、記憶媒体、デバッグ装置、デバッグ方法及びプログラム開発システム | |
CN113721899B (zh) | 面向gpdsp的轻量级高效汇编代码编程方法及系统 | |
JP3634712B2 (ja) | コンパイラ装置 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
A131 | Notification of reasons for refusal |
Free format text: JAPANESE INTERMEDIATE CODE: A131 Effective date: 20040615 |
|
A521 | Written amendment |
Free format text: JAPANESE INTERMEDIATE CODE: A523 Effective date: 20040806 |
|
A131 | Notification of reasons for refusal |
Free format text: JAPANESE INTERMEDIATE CODE: A131 Effective date: 20040907 |
|
A521 | Written amendment |
Free format text: JAPANESE INTERMEDIATE CODE: A523 Effective date: 20041007 |
|
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: 20041124 |
|
A61 | First payment of annual fees (during grant procedure) |
Free format text: JAPANESE INTERMEDIATE CODE: A61 Effective date: 20041224 |
|
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: 20080107 Year of fee payment: 3 |
|
FPAY | Renewal fee payment (event date is renewal date of database) |
Free format text: PAYMENT UNTIL: 20090107 Year of fee payment: 4 |
|
FPAY | Renewal fee payment (event date is renewal date of database) |
Free format text: PAYMENT UNTIL: 20100107 Year of fee payment: 5 |
|
FPAY | Renewal fee payment (event date is renewal date of database) |
Free format text: PAYMENT UNTIL: 20110107 Year of fee payment: 6 |
|
FPAY | Renewal fee payment (event date is renewal date of database) |
Free format text: PAYMENT UNTIL: 20110107 Year of fee payment: 6 |
|
FPAY | Renewal fee payment (event date is renewal date of database) |
Free format text: PAYMENT UNTIL: 20120107 Year of fee payment: 7 |
|
LAPS | Cancellation because of no payment of annual fees |