JP3648402B2 - コンパイル方法及びコンパイラ装置 - Google Patents
コンパイル方法及びコンパイラ装置 Download PDFInfo
- Publication number
- JP3648402B2 JP3648402B2 JP09389699A JP9389699A JP3648402B2 JP 3648402 B2 JP3648402 B2 JP 3648402B2 JP 09389699 A JP09389699 A JP 09389699A JP 9389699 A JP9389699 A JP 9389699A JP 3648402 B2 JP3648402 B2 JP 3648402B2
- Authority
- JP
- Japan
- Prior art keywords
- register
- instruction
- real
- assigned
- virtual
- 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
【発明の属する技術分野】
本発明は、out−of−order実行をサポートし複数の並行に動作する演算器を持つプロセッサ上で実行されるオブジェクトプログラムを生成するためのコンパイル方法及びコンパイラ装置に関する。
【0002】
【従来の技術】
命令の実行速度の高速化のためのCPUアーキテクチャとして、レジスタやキャッシュを共有し並行に動作する演算器を複数持つCPUアーキテクチャが知られている。その代表的なものとして、コンパイル時にスタティックに資源を割り当て使用するVLIW(Very Long Instruction Word)や、実行時に資源の割り当てをダイナミックに行うスーパスカラがある(J. L. Hennessy & D. A. Patterson、 “COMPUTER ARCHITECTURE A QUANTITATIVE APPROACH”、 Chapter4参照)。以下ではそれらのようなCPUアーキテクチャを総称してILPアーキテクチャ(ILP:Instruction−Level Parallelism)と呼ぶ。
【0003】
ILPアーキテクチャではハードウェアとしては複数命令の並行実行によりプログラムを高速に実行できる資源を有しているが、実際に高速性を発揮させるためには命令実行時の並行度(以下、ILPと呼ぶ)が高いことが必要であり、このための方策が鍵となる。
【0004】
ILPを上げる方法としてout−of−order実行が知られている。すなわち、通常の方法であるin−order実行では、あるサイクルで実行を開始すべく配置された命令と、それよりも後のサイクルで実行を開始すべく配置された命令との実行開始順序は守られる。しかし、命令の配置順序が後であるにもかかわらず、先に配置された命令との依存関係がなければ、先の命令を待たずに後の命令の実行の開始を許すことにより、高速化を図ることが可能である。これを実現する方法をout−of−order実行と呼ぶ。既存のスーパスカラでは実際にout−of−order実行をとるものが少なくない(ただし、従来のVLIWではin−of−order実行を前提としており、out−of−order実行をとるVLIWは知られていない)。
【0005】
out−of−order実行を行なうILPアーキテクチャのCPUでは、フォールスディペンデンシ(false dependency)の回避が重要となる。false dependencyとは、先行命令において使用されているレジスタを後続命令が再定義する場合に発生する依存関係で、例えば、図24(a)に示すように、命令Aの使用したレジスタR2を、命令Aの後に実行される命令Bが定義するときに、発生する。ここで、レジスタを使用するとはレジスタの値を参照する(読み出す)ことを意味し、レジスタを定義するとはレジスタの値を変更する(書き込む)ことを意味する。図24(a)の命令列を実行する場合、レジスタR2の値を命令Bで再定義しても命令Aの結果が正しくなることが保証されるまで命令Bの実行を待たなければならないため、命令Aと命令Bを同時に実行できずILPを下げる原因となる。
【0006】
スーパスカラでは、false dependencyの回避のために、レジスタ・リネーミングと呼ばれる方法をとるものが多い。これは、図24(a)を例にすると、命令Bにおいて依存しているレジスタR2を依存関係の発生しないようなレジスタ(例えば、レジスタR7とする)と置き換えることにより、命令Aと命令Bとの間のfalse dependencyを回避するものである。この際、もとのプログラムで命令Bが定義したレジスタR2の値を使用している他の命令に関しても、その使用レジスタR2をレジスタR7に置き換える必要がある。この例の場合、レジスタ・リネーミング後の命令列は、図24(b)のようになり、命令Aと命令Bとが同時に実行可能となる。
【0007】
このようにレジスタ・リネーミングによってfalse dependencyを回避することが従来から行われているが、この処理は実行時に複雑な制御を行なうために、CPUの周波数を上げられない原因になり、最適な方法とは言えなかった。
【0008】
レジスタ・リネーミングを行なわずにfalse dependencyによる速度低下を避けるためには、あらかじめCPUで実行すべき命令列をコンパイラが生成するときにfalse dependencyが起こりにくいように考慮して生成する必要がある。
【0009】
しかし、out−of−order実行においてどのような順序で命令が実行されるのかは、コンパイル時に静的に見積もることができない。そのため、コンパイル時に静的に見積もった仮想レジスタの生存区間に基づいて仮想レジスタに対して実レジスタを割り当てると、実行時の動的な命令発行により生存区間にずれが生じて、同じ実レジスタが割り当てられた命令間でfalse dependencyが発生するという問題があった。
【0010】
【発明が解決しようとする課題】
以上説明したように、out−of−order実行を行なうILPアーキテクチャのプロセッサでは、高速化のためにfalse dependencyの回避が重要となる。スーパースカラで用いられるレジスタ・リネーミングは、false dependencyの回避が可能な反面、実行時に複雑な制御を行なうため、結局、高速化に寄与し難いという問題があった。また、従来のコンパイル方法には、false dependencyを回避することを考慮したものはなかった。一方、従来のVLIWについてはout−of−order実行を可能とするものが知られていなかった。
【0011】
本発明は、上記事情を考慮してなされたもので、out−of−order実行をサポートするプロセッサのためのコンパイル方法及びコンパイラ装置であって、ハードウェアによるレジスタ・リネーミング機構なしでout−of−order実行特有のfalse dependencyを回避するためのレジスタ割当を可能にしたコンパイル方法及びコンパイラ装置を提供することを目的とする。
【0012】
【課題を解決するための手段】
本発明(請求項1)は、並行に命令を実行できる複数の演算器を備えるとともに命令配置順序において後続する命令の実行をそれに先行する命令の実行よりも前に開始させることを可能とする機能を有するプロセッサを対象として、与えられたソースプログラムに基づいて該プロセッサで実行可能なオブジェクトプログラムを生成するコンパイル方法であって、前記ソースプログラムを解析して第1の中間コードを生成する解析ステップと、前記第1の中間コードに基づいて命令スケジューリングを行って、演算の一時的な結果を置くレジスタとして仮想レジスタを割り当てて記述され第2の中間コードを生成する命令スケジューリングステップと、前記第2の中間コードおよび前記プロセッサの実レジスタに関する情報に基づいて、前記各仮想レジスタに割り当てるべき実レジスタを決定するレジスタ割り当てステップと、前記仮想レジスタを割り当てられた前記実レジスタで置き換えたオブジェクトプログラムを出力する出力ステップとを有し、前記レジスタ割り当てステップは、前記実レジスタが前記仮想レジスタに割り当てられて使用される区間および該実レジスタの割り当て対象となった該仮想レジスタの使用される区間を解析するステップと、前記区間解析結果および既に発生している命令間依存関係を示す情報をもとに、割り当て対象となった前記仮想レジスタに割り当てても新たな命令間依存関係を生じさせない実レジスタが存在すれば、該実レジスタを優先的に該仮想レジスタに割り当てる候補として決定するステップとを含むことを特徴とする。
【0013】
命令間依存関係を示す情報(例えば、依存グラフ)は、例えば、初期的には、ソースプログラムの解析(例えば、データ依存解析処理)によって作成される。また、命令間依存関係は、例えば、前記決定するステップにおいて仮想レジスタに対する実レジスタの割り当てが決定された際に、新たな命令間依存関係が発生した場合には、当該新たな命令間依存関係が反映されたものとなる。
【0014】
好ましくは、割り当て対象となった前記仮想レジスタに割り当てても新たな命令間依存関係を生じさせない実レジスタのうち、実際には既に発生している命令間依存関係とは別の命令間依存関係を生じさせるが該別の命令間依存関係が該既に発生している命令間依存関係によって隠蔽される結果として新たな命令間依存関係を生じさせないものとみなし得る実レジスタの割り当て優先順位を、実際にいかなる命令間依存関係をも生じさせないことにより新たな命令間依存関係を生じさせない実レジスタの割り当て優先順位よりも高くするようにしてもよい。
好ましくは、前記レジスタ割り当てステップは、割り当て対象となった前記仮想レジスタに割り当てると新たな命令間依存関係を生じさせる実レジスタを、割り当て対象となった前記仮想レジスタに割り当てても新たな命令間依存関係を生じさせない実レジスタに次ぐ優先順位で割り当てる候補として決定するステップを更に含むようにしてもよい。
好ましくは、前記新たな命令間依存関係を生じさせる実レジスタのうち、その生存区間と、割り当て対象となった前記仮想レジスタの生存区間との間の距離がより大きい実レジスタほど、より高い優先順位で割り当てる候補として決定するようにしてもよい。
【0017】
好ましくは、命令間依存関係におけるクリティカルパス長をより小さくする実レジスタほどより高い優先順位で割り当てる候補として決定するようにしてもよい。
【0018】
好ましくは、前記レジスタ割り当てステップは、前記仮想レジスタの生存区間と重複する部分を持つ他の仮想レジスタの数および前記プロセッサの実レジスタの数に基づいて、実レジスタを割り当てる対象とする仮想レジスタの順番を決定するステップを更に含むようにしてもよい。
【0019】
好ましくは、前記レジスタ割り当てステップは、割り当て対象となった前記仮想レジスタに対して決定された実レジスタであってその時点で実際に割り当て可能なもののうちで最も優先順位が高い実レジスタを選択し、該仮想レジスタと選択された該実レジスタとの対応関係を記憶するステップを更に含むようにしてもよい。
【0020】
本発明(請求項8)は、並行に命令を実行できる複数の演算器を備えるとともに命令配置順序において後続する命令の実行をそれに先行する命令の実行よりも前に開始させることを可能とする機能を有するプロセッサを対象として、与えられたソースプログラムに基づいて該プロセッサで実行可能なオブジェクトプログラムを生成するコンパイル装置であって、前記ソースプログラムを解析して第1の中間コードを生成する解析手段と、前記第1の中間コードに基づいて命令スケジューリングを行って、演算の一時的な結果を置くレジスタとして仮想レジスタを割り当てて記述され第2の中間コードを生成する命令スケジューリング手段と、前記第2の中間コードおよび前記プロセッサの実レジスタに関する情報に基づいて、前記各仮想レジスタに割り当てるべき実レジスタを決定するレジスタ割り当て手段と、前記仮想レジスタを割り当てられた前記実レジスタで置き換えたオブジェクトプログラムを出力する出力手段とを具備し、前記レジスタ割り当て手段は、前記実レジスタが前記仮想レジスタに割り当てられて使用される区間および該実レジスタの割り当て対象となった該仮想レジスタの使用される区間を解析する手段と、前記区間解析結果および既に発生している命令間依存関係を示す情報をもとに、割り当て対象となった前記仮想レジスタに割り当てても新たな命令間依存関係を生じさせない実レジスタが存在すれば、該実レジスタを優先的に該仮想レジスタに割り当てる候補として決定する手段とを含むことを特徴とする。
【0021】
本発明(請求項9)は、並行に命令を実行できる複数の演算器を備えるとともに命令配置順序において後続する命令の実行をそれに先行する命令の実行よりも前に開始させることを可能とする機能を有するプロセッサを対象として、与えられたソースプログラムに基づいて該プロセッサで実行可能なオブジェクトプログラムを生成するために、前記ソースプログラムを解析して第1の中間コードを生成する解析させ、前記第1の中間コードに基づいて命令スケジューリングを行って、演算の一時的な結果を置くレジスタとして仮想レジスタを割り当てて記述され第2の中間コードを生成させ、前記第2の中間コードおよび前記プロセッサの実レジスタに関する情報に基づいて、前記各仮想レジスタに割り当てるべき実レジスタを決定するレジスタ割り当てさせ、前記仮想レジスタを割り当てられた前記実レジスタで置き換えたオブジェクトプログラムを出力する出力ステップとをコンピュータに実行させるプログラムであって、前記レジスタ割り当てステップにおいて、前記実レジスタが前記仮想レジスタに割り当てられて使用される区間および該実レジスタの割り当て対象となった該仮想レジスタの使用される区間を解析させ、前記区間解析結果および既に発生している命令間依存関係を示す情報をもとに、割り当て対象となった前記仮想レジスタに割り当てても新たな命令間依存関係を生じさせない実レジスタが存在すれば、該実レジスタを優先的に該仮想レジスタに割り当てる候補として決定させるためのプログラムを記録したコンピュータ読取り可能な記録媒体を要旨とする。
【0022】
本発明では、第2の中間コードにおける仮想レジスタに実レジスタを割り当てる際、割り当て対象となった仮想レジスタに割り当てても新たな命令間依存関係を生じさせない実レジスタが存在すれば、該実レジスタを優先的に該割り当て対象となった仮想レジスタに割り当てる候補として決定する(もしくは割り当てることを決定する)。ここで、「レジスタの生存区間」とは、レジスタの値が定義されている点からその値が最後に参照される点までの区間である。レジスタの使われ方によっては、複数の生存区間が存在することもある。
【0023】
より具体的には、例えば、第2の中間コードから例えばフロー解析・データ依存関係を行い、依存グラフの生成と演算の一時的な結果を置く仮想レジスタの生存区間の計算を行い、これをもとに仮想レジスタに割り当てるべき実レジスタを決定する。仮想レジスタに割り当てるのに最も理想的な実レジスタとは、それを割り当てても依存グラフ中に新たな依存関係が発生しないような実レジスタである。このような条件を満たす実レジスタを例えば依存グラフをもとに決定する。
【0024】
上記のような実レジスタを割り当てることによって、out−of−order実行時のILPの低下を防ぐことができる。
【0025】
新たな依存関係が発生しないような実レジスタを割り当てることができれば、命令実行時にレジスタを割り当てたことによる速度低下は発生しない。しかし、実レジスタは有限であり、必ずしもこのような実レジスタが存在するとは限らないため、新たな依存関係が発生するような実レジスタの中から仮想レジスタに割り当てる実レジスタを選択しなくてはならない場合もある。
【0026】
そこで、このような場合、新しく発生する依存関係は実行時の速度低下の原因となり得るが、仮想レジスタに割り当てることによって新たな依存関係が発生したとしてもその依存関係がout−of−order実行時に速度低下を引き起こさない、もしくは速度が低下したとしてもそれを最小限にそどめるような実レジスタ(例えば、仮想レジスタに割り当てたときに依存グラフ中に新たな依存関係が発生したとしてもそれらの命令の実行されるタイミングの差が大きくなると予想されるような実レジスタ)を優先的に割り当てるとよい。
【0027】
本発明によれば、レジスタ割り当てにともなって命令間に新たな依存関係が発生することを防ぎ、もし発生してしまう場合でも新たな依存関係になる命令間の実行されるタイミングをなるべく離れたものにすることができるようになる。このため、ハードウェアによるレジスタ・リネーミング機構を用いることなく、out−of−order実行時のILPの低下の原因となるfalse dependencyを最小限に抑えることが可能となる。また、ハードウェアによるレジスタ・リネーミングではある限られた命令数に対してしかできないのに対して、コンパイラでおこなえば広範囲なレジスタ解析を行うことができレジスタをより有効活用できるようになる。
【0028】
なお、装置に係る本発明は方法に係る発明としても成立し、方法に係る本発明は装置に係る発明としても成立する。
【0029】
また、コンパイラ装置または方法に係る本発明は、コンピュータに当該発明に相当する手順を実行させるための(あるいはコンピュータを当該発明に相当する手段として機能させるための、あるいはコンピュータに当該発明に相当する機能を実現させるための)プログラムを記録したコンピュータ読取り可能な記録媒体としても成立する。
【0030】
【発明の実施の形態】
以下、図面を参照しながら発明の実施の形態を説明する。
【0031】
本発明の一実施形態に係る最適化コンパイラについて説明する。
本実施形態の最適化コンパイラは、コンパイルの対象としてout−of−order実行可能なプロセッサ(CPU)を想定している。
なお、本発明はout−of−order実行可能なスーパースカラプロセッサにも適用可能であり、またout−of−order実行可能なVLIWにも適用可能であるが、out−of−order実行可能なスーパースカラプロセッサについてはよく知られているのでここでの詳細な説明は省略し、out−of−order実行可能なVLIWについては本コンパイラを説明した後に説明する。
【0032】
図1に、本実施形態に係る最適化コンパイラの構成例を示す。
【0033】
本コンパイラは、高級言語で書かれたソースプログラム(11)を入力とし、解析部1において、入力されたソースプログラム(11)に対する字句解析・構文解析等を行って第1の中間コード(12)を生成する。字句解析処理では、入力されたソースプログラム(11)を形成する文字列を、解析し、語句に分割する。
例えば、構文解析処理では、上記解析により得た語句を上記高級言語の文法に照合して正しいか否かを判別し、誤りがあればこれを通知し実行を止める。正しければ、構文の解析結果を中間コード(12)として生成する。生成された中間コード(12)は、主記憶やディスク等の記憶装置に格納される。中間コード(12)は、通常は、コンパイラ内部で管理され、外部からはアクセスできない。
【0034】
次に、最適化部2において、中間コード(12)に対して処理を高速化するための最適化(生成されたオブジェクトプログラムが対象プロセッサで実行されたときの実行速度を高速化するための最適化)を行って最適化された第2の中間コード(13)を生成する。なお、本実施形態では、最適化部2においては、命令スケジューリング部21による命令スケジューリングが行われた後にレジスタ割り当て部22によるレジスタ割り当てが行われるものとする。
より具体的には例えば、最適化部2は、フロー解析、データ依存解析、命令スケジューリング(命令割り当て)、レジスタ割り当て等を行う。フロー解析処理では、中間コード(12)が生成されると、この中間コード(12)をもとにしてプログラムの流れの解析を行なう。データ依存解析処理では、プログラムの流れの解析が行われると、中間コード(12)を構成する各命令のデータ依存解析を行なって依存グラフを作成し、どのような順番で命令割り当てを行なわなければならないかといった制約を明らかにする。命令スケジューリング処理では、中間コードをもとにオブジェクトプログラムの直前段階となる中間コード(仮想レジスタが割り当てられたもの)(13)を生成する。生成された中間コード(13)は、主記憶やディスク等の記憶装置に格納される。中間コード(13)は、通常は、コンパイラ内部で管理され、外部からはアクセスできない。レジスタ割り当て処理では、命令スケジューリング処理により生成された中間コード(13)について、命令スケジューリング処理で仮に割り当てられていた仮想レジスタを、対象となるプロセッサの持つ実レジスタに割り当て直す、といったレジスタ割り当てを行う。ここでは、仮想レジスタと実レジスタとの対応をレジスタ対応表に登録する。
【0035】
そして、出力部3において、最適化された中間コード(13)をもとに対象プロセッサで実行可能な機械語(オブジェクトプログラム)(14)を生成し出力する。すなわち、出力部3は、上記レジスタ対応表をもとに、最適化された中間コード(13)の仮想レジスタを実レジスタに置き換えた上で、機械語(14)として出力する。
【0036】
機械語(14)を実行するプロセッサ(すなわち本コンパイラが対象とするプロセッサ)は、複数の並行に動作する演算器を有し、同時に複数の命令の実行が可能であり、また命令のout−of−order実行機能を有し、さらに本コンパイラにより仮想レジスタに割り当てられる実レジスタを有するものとする。
【0037】
本実施形態では、グラフカラーリング技法によるレジスタ割り当て方式を例にして説明する。グラフカラーリング技法とは、仮想レジスタに対して実レジスタを割り当てるための手法として最も広く用いられている方式の一つである。
【0038】
図2に、グラフカラーリング技法によるレジスタ割り当て方式の処理手順の一例を示す。
【0039】
図2に示されるように、このレジスタ割り当て方式は、レジスタ干渉グラフを生成するフェーズ(ステップS11)から始まる。このグラフにおける「ノード」は「仮想レジスタ」であり、詳しくは後述するように、仮想レジスタの値が定義されている点が別の仮想レジスタの生存区間内であれば、それらの仮想レジスタに対応するノードを「エッジ」で結ぶ。
【0040】
ここで、図3に、これから実レジスタを割り当てようとしているプログラムの一例(MIPSアセンブリ言語により記述されたもの)を示す。
図3の例において、$100,$101,$102,$103,$104は仮想レジスタであるとする。また、ここでは、割り当てに使用できる実レジスタは$1,$2,$3の3つのレジスタであるものとする。
【0041】
図4は、図3の例の場合における命令間の依存関係を示す依存グラフである。
命令(2)“lui $101,0x2000”の実行結果(この場合、実行結果は$101に書かれる)をもとに命令(4)“sw $101,tmp1($0)”は実行されるため、命令(2)と命令(4)との間には依存関係を示すエッジ(図4では、単方向の矢線で示す)が張られている。同様に、命令(3)“lui $102,0x3000”と命令(5)“ori $103,$102,0x1111”との間、そして命令(5)と命令(6)“sw $103,tmp2($0)”との間にも依存関係が存在することが示されている。
【0042】
図5に、図3の例の場合における各仮想レジスタの生存区間を示す。
図5に示されるように、$100は命令(1)の開始時から命令(7)の終了時まで、$101は命令(2)の開始時から命令(4)の開始時まで、$102は命令(3)の開始時から命令(5)の開始時まで、$103は命令(5)の開始時から命令(6)の開始時まで、$104は命令(7)の開始時から命令(7)の終了時までをそれぞれ生存区間とする。
【0043】
図6は、この場合に生成されるレジスタ干渉グラフである。
$100は他の全ての仮想レジスタと生存区間が重複しているため、全ての仮想レジスタに対してエッジが張られる。$101は$100以外に$102と生存区間が重複しているため$102との間にもエッジが張られる。$103,$104については$100と生存区間が重複しているのみである。
【0044】
生存区間が重複する仮想レジスタに対しては異なる実レジスタを割り当てる必要がある。そこで、このようにしてつくられたレジスタ干渉グラフにおいて、エッジで結ばれているノードどうしがどれも別の色(実レジスタ)で塗られているように色を塗る(カラーリングする)ことにより(すなわち、エッジで結ばれている両ノードに同じ実レジスタが割り当てられないように)、実レジスタ割り当てを行う。
図6の例で考えると、$100に対して実レジスタ$1が割り当てられた場合、$100とエッジで結ばれた$101,$102,$103,$104には$1以外の実レジスタ(本例の場合、$2または$3)を割り当てなければならない。
【0045】
さて、ステップS11でレジスタ干渉グラフが生成されたならば、次に、レジスタ干渉グラフ中のどのノードから実レジスタを割り当てていくかを決定する。この処理は図2に示すステップS12〜S15により行われる。
【0046】
ステップS12において、レジスタ干渉グラフ内のノードのうち、そのノードから出ているエッジの数(すなわち、そのノードに隣接している他のノードの数)が、割り当て可能な実レジスタの数よりも少ないものを検出し、そのようなノードが存在すれば、ステップS14でそのノードをレジスタ干渉グラフから取り除いてレジスタ干渉グラフを再構築する。ここで、レジスタ干渉グラフの再構築とは、検出されたノードとそれに接しているエッジをレジスタ干渉グラフから削除することを意味している。なお、取り除くノードを検出する順番については任意である(すなわち、上記条件を満たすノードが複数存在する場合には、そのエッジの数の大小にかかわらず、いずれのノードを先に選択しても構わない)。
【0047】
図6の例においてこの処理を行う場合について説明する。
【0048】
まず、図6のレジスタ干渉グラフにおいて、ここでは例えば$104について考えてみるものとすると、$104に隣接するノードは$100のノードのみであるので、隣接するノードの数は割り当て可能な実レジスタ数“3”より小さい。そこで、まず$104を図6のレジスタ干渉グラフから取り除いて、レジスタ干渉グラフを再構築する。この結果、再構築後のレジスタ干渉グラフは、図7(a)のようになる。取り除いたノードに関しては、その取り除いた順に記録をしておく。
【0049】
なお、ステップS12において隣接ノード数が割り当て可能実レジスタ数未満であるノードが存在しない場合には、ステップS13においてノードをレジスタスピル(spill)処理の候補として選択し、そのノードをステップS14でレジスタ干渉グラフから取り除いてレジスタ干渉グラフを再構築する。なお、レジスタspillの候補を選択する方法については既に種々の方法が提案されている。
【0050】
以上の処理をステップS15によってレジスタ干渉グラフが空になるまで繰り返す。
【0051】
なお、ここまでのフェーズにおける処理は従来の技術と同様でよく、周知技術であるのでここでの詳しい説明は省略する(Andrew W. Appel ″modern compiler implementation in C″ Chapter11参照)。
【0052】
図6の例の場合、上記の$104と同様にして、例えば以降は$103,$102,$101,$100の順にノードを取り除いていく。その際に再構築されるレジスタ干渉グラフは、図6の状態から順に、図7(a)→図7(b)→図7(c)→図7(d)のようになり、最終的にレジスタ干渉グラフは図7(e)のように空になる。なお、図6の例では、上記の順でレジスタ干渉グラフからノードを取り除いていったとき、レジスタspillの候補は空集合である。
【0053】
ここまでのフェーズによって、仮想レジスタの識別情報と、その仮想レジスタがレジスタ干渉グラフから取り除かれた順番との対応が記録されたことになる。本具体例の場合、仮想レジスタは図8に示すような順でレジスタ干渉グラフから取り除かれたことが記録されている。
【0054】
なお、上記では、図3のプログラムを処理対象とした場合において、レジスタ干渉グラフから$104,$103,$102,$101,$100の順にノードを取り除いた例を示したが、もちろん前述したようにこの順番に限らず、例えば、$102,$103,$101,$104,$100の順でも、$104,$103,$102,$100,$101の順など、他の順でも構わない。
【0055】
さて、干渉グラフから全てのノードを選択し終ったならば、ステップS16において、ノードを選択したのとは逆の順序で各ノードに実レジスタを割り当て、そのノードを再びレジスタ干渉グラフに戻していく処理を行う。以下、このステップS16の処理について詳しく説明する。
【0056】
図9に、このフェーズ(ステップS16)においてノードに割り当てる実レジスタを決定する方式の処理手順の一例を示す。
【0057】
まず、干渉グラフから取り除いたのとは逆の順に実レジスタを割り当てる仮想レジスタを選択する(ステップS21)。本具体例の場合、$100が選択される。
【0058】
次に、ステップS22〜S24において、上記選択されたレジスタに割り当てる実レジスタを決定する。
最初に、新たな依存関係が発生しないような実レジスタが存在するかどうかを検査し、もしそのような実レジスタが存在する場合には、それを優先順序付けされた実レジスタの列に登録する(ステップS22)。
続いて、新たな依存関係を発生させないような実レジスタ以外の実レジスタについては、out−of−order実行時に新たな依存関係がなるべく影響しないような実レジスタを優先して優先順序付けされた実レジスタの列に登録する(ステップS23)。
【0059】
図10は、優先順序付けされた実レジスタの列である。図10に示すように、新たな依存関係が発生しないような実レジスタ、新たな依存関係を生じる実レジスタの順に優先順序が高い。詳しくは後述するが、新たな依存関係が発生しないような実レジスタの中でも、冗長な依存関係を生じるが既存の依存関係によって隠蔽可能なものと、冗長な依存関係を生じないものとがあり、前者の方が優先順位が高い。また、新たな依存関係を生じる実レジスタどうしでは、新たな依存関係となる命令間の距離が大きくなるものほど優先順序が高い。
【0060】
続いて、優先順序付けされた実レジスタの列が生成されたならば、その列からノードに割り当て可能な実レジスタを優先順序に従って検索し、割り当て可能な実レジスタを見つけたならば、それをレジスタ対応表(図11参照)に登録する(ステップS24)。なお、例えば実レジスタの割り当てに何らかの制約があるような場合などに、割り当て可能でない実レジスタが発生し得る。
【0061】
そして、割り当ての行われたノードを再びレジスタ干渉グラフに戻し、既に配置されているノードの生存区間と該ノードの生存区間が重複する場合には、そのノード間にエッジを張ることによりレジスタ干渉グラフを再構築する(ステップS25)。
【0062】
以上の処理をレジスタ干渉グラフから削除されたレジスタが全てレジスタ干渉グラフに再配置されるまで繰り返し行う(ステップS26)。
【0063】
例えば、図3の例において、$100,$101,$102,$103,$104の順にノードに実レジスタを割り当てていくと、レジスタ干渉グラフは図7(e)の空の状態から順に、図7(d)→図7(c)→図7(b)→図7(a)→図6のように再構築されていく。
【0064】
ここで、レジスタ対応表とは、図11に示すような各仮想レジスタにどの実レジスタを割り当てるかを示すものであり、仮想レジスタの個数分のエントリを持っている。図11は、仮想レジスタ$100,$101,$102,$103,$104に順に実レジスタ$1,$2,$3,$3,$2が割り当てられた例を示している。
なお、出力部3においてコンパイラが最終的に機械語(14)を出力する際には、この表をもとに最適化された中間コード(13)の仮想レジスタを実レジスタに置き換えた上で、機械語(14)を出力する。
【0065】
次に、図2に示すステップS16の処理のうち図9に示すステップS22での処理について詳細に説明する。
【0066】
なお、説明の便宜上、図10の「冗長な依存関係を生じるが既存の依存関係によって隠蔽可能な実レジスタの集合」を第1優先レジスタ集合、「冗長な依存関係を生じない実レジスタの集合」を第2優先レジスタ集合、「新たな依存関係を生じる実レジスタの集合」を第3優先レジスタ集合と呼ぶものとする。
【0067】
図12に、ステップS22の処理を詳細化した手順の一例を示す。
【0068】
ここでは、選択されたあるノード(すなわち仮想レジスタ)にある実レジスタを割り当てることによって同一の実レジスタを参照している他の命令との間に新たな依存関係が発生しないような実レジスタか、またはそのような新たな依存関係が発生したとしてもそれらの命令間に既存の依存関係があり当該新たな依存関係は無視できるような実レジスタの検出、およびそれらの実レジスタの優先順序付けされた実レジスタの列への登録を行う。具体的には、ステップS31〜S38の一連の処理で図10の第1優先レジスタ集合に相当する実レジスタの登録を行い、次にステップS39において第2最優先レジスタ集合に相当する実レジスタの登録を行う。
【0069】
まず、「第1優先レジスタ集合」に相当する実レジスタの登録について説明する。
【0070】
実レジスタを割り当てるノード(図9に示すステップS21で選択された仮想レジスタ)の生存区間ごとにステップS31〜S35の処理を行い、それぞれの生存区間について該ノードに割り当てても新たな依存関係が発生しない実レジスタを検出する。
【0071】
ステップS31〜S33では、既に他の仮想レジスタに割り当てられている実レジスタのうち、該ノードに割り当てても新たな依存関係を生じない可能性のある実レジスタを検出する。ステップS31において該ノードを定義している命令(該仮想レジスタの値を変更する命令)に関して新たな依存関係を生じないような実レジスタの検出を行い、ステップS32において該ノードを使用している命令(該仮想レジスタの値を参照する命令)に関して新たな依存関係を生じないような実レジスタの検出を行う。
【0072】
該ノードを定義している命令に関しては、選択されたノードの生存区間において該ノードを定義する命令を検索し、生存区間内で該ノードを定義する命令全てに共通な先行依存命令を見つけ、それらの使用レジスタ(実レジスタ)を全て検出する。このとき、先行依存命令として該ノードを定義している命令自身も含める。検出されたそれら実レジスタを、該ノードを定義している命令に関して、該ノードに割り当てても新たな依存関係を生じない可能性のある実レジスタ集合とする。
【0073】
図3の例において、既に仮想レジスタには$100=$1,$101=$2,$102=$3が割り当てられているとして、次に仮想レジスタ$103に割り当てる実レジスタを選択する場合を考える。仮想レジスタ$103の生存区間は、図5に示すように一つだけである。そこで、この生存区間(命令(5)開始時から命令(6)開始時まで)に関して解析を行う。生存区間において仮想レジスタ$103を定義する命令は、命令(5)だけである。図4の依存グラフをみると、命令(5)の先行依存命令は、命令(3)であることが分かる。そこで、定義する命令に共通な先行依存命令は、命令(3)および命令(5)となる。これら2つの命令で使用されるレジスタのうち実レジスタが割り当てられているのは$102だけであるので、フェーズ(ステップS31)で検出される実レジスタ集合は{$3}となる。
【0074】
同様に、該ノードを使用している命令に関しては、選択された該ノードの生存区間において該ノードを使用する命令を検索し、生存区間内で該ノードを使用する命令全てに共通な後続依存命令を見つけ、それらの定義レジスタ(実レジスタ)を全て検出する。このとき、後続依存命令として該ノードを使用している命令自身も含める。検出されたそれら実レジスタを、該ノードを使用している命令に関して、該ノードに割り当てても新たな依存関係を生じない可能性のある実レジスタ集合とする。
【0075】
図3の例について引続き考えてみると、$103の生存区間において仮想レジスタ$103を使用する命令は、命令(6)だけである。図4の依存グラフをみると、命令(6)の後続依存命令は存在しない。そこで、使用する命令に共通な後続依存命令は、命令(6)だけとなる。この命令で定義されるレジスタのうち実レジスタが割り当てられているものは存在しないので、フェーズ(ステップS32)で検出される実レジスタ集合は空集合となる。
【0076】
最後に、ステップS33で、それらの和集合を計算し、既に他の仮想レジスタに割り当てられている実レジスタのうち、該ノードに割り当てても新たな依存関係を生じない可能性のある実レジスタ集合とする。
【0077】
図3の例に関して{$3}と空集合の和集合を計算してフェーズ(ステップS33)の段階で求められる実レジスタ集合は{$3}となる。
【0078】
次に、ステップS34,S35において上記のレジスタ集合から該ノードに割り当てると新たな依存関係が生じてしまう実レジスタを削除する。ステップS34において該ノードを定義している命令に関して新たな依存関係が生じる実レジスタの検出を行い、ステップS35において該ノードを使用している命令に関して新たな依存関係が生じる実レジスタの検出を行う。
【0079】
該ノードを定義している命令に関しては、生存区間内で該ノードを定義する命令全てに共通な先行依存命令以外の先行命令を全て見つけ、それらの使用実レジスタを全て検出する。このとき先行命令として該ノードを定義している命令自身も含める。これらを、該ノードを定義している命令に関して、該ノードに割り当ると新たな依存関係を生じてしまう実レジスタ集合とし、ステップS33で求めた実レジスタの集合から削除する。
【0080】
引続き、図3の例について考えてみる。該ノードを定義する命令全てに共通な先行依存命令以外の先行命令は命令(1),(2),(4)であり、それらの使用する仮想レジスタのうち実レジスタが割り当てられているものは$101であり、$101に割り当てられた実レジスタは$2であるので、使用実レジスタ集合は{$2}となる。よって、ステップS33で求めた集合{$3}から{$2}を削除して{$3}となる。
【0081】
同様に、該ノードを使用している命令に関しては、生存区間内で該ノードを使用する命令全てに共通な後続依存命令以外の後続命令を全て見つけ、それらの定義実レジスタを全て検出する。このとき後続命令として該ノードを使用している命令自身も含める。これらを、該ノードを使用している命令に関して、該ノードに割り当ると新たな依存関係を生じてしまう実レジスタ集合とし、ステップS33で求めた実レジスタの集合から削除する。
【0082】
引続き、図3の例について考えてみる。該ノードを使用する命令全てに共通な後続依存命令以外の後続命令は命令(7)であり、命令(7)の定義する仮想レジスタは$104であるが、$104にはまだ実レジスタが割り当てられていないので、それらの定義する実レジスタ集合は空集合となる。よって、ステップS34で求めた集合{$3}から空集合を削除して{$3}となる。
【0083】
以上のステップS31〜S35の処理を該ノードの全ての生存区間について行う(ステップS36)。
【0084】
次に、ステップS37において全ての生存区間で新たな依存関係を発生させない実レジスタ集合を検出することによって、既に割り当てがされている実レジスタのうち該ノードに割り当てたときに新たな依存関係を発生されない実レジスタ集合を抽出する。
【0085】
図3の例に関しては、仮想レジスタ$103の生存区間は一つだけである。よって、ステップS37の時点で求められる実レジスタ集合は{$3}となる。
【0086】
そして、ステップS38において、図10の第1優先レジスタ集合に相当する実レジスタの登録を行う。これに当てはまる実レジスタ集合がステップS37までで求めた実レジスタ集合であるので、そこに含まれる実レジスタを最も優先順序が高い実レジスタとして優先順序付けされた実レジスタの列に登録する。
【0087】
図3の例では、ステップS37の時点で求められる実レジスタ集合が{$3}であるので、実レジスタ$3を優先順序付けされた実レジスタの列に登録する。
【0088】
次に、第2優先レジスタ集合に相当する実レジスタの登録について説明する。
【0089】
ステップS39において、レジスタ干渉グラフ中のノードに一度も割り当てられていない実レジスタを検出する。一度も割り当てされていない実レジスタを該ノードに割り当てても他の命令との間に冗長な依存関係が発生することはない。そこで、このようなレジスタを冗長な依存関係を生じない実レジスタとして検出し、2番目に優先順序が高い実レジスタとして優先順序付けされた実レジスタの列に登録する。このような実レジスタを既に割り当てられた実レジスタよりも優先順序が下であるとしたのは、可能な限り既に割り当てられた実レジスタを再利用し、使用する実レジスタ数を最小限にとどめるようにするためである。
【0090】
図3の例では、実レジスタ$1,$2のうち一度も割り当てられていない実レジスタは存在しないので(既に全ての実レジスタが干渉グラフ中のノードに割り当てられているので)、どのレジスタも優先順序付けされた実レジスタの列に登録されない。
【0091】
以上がステップS22における処理の詳細な説明である。
【0092】
次に、上記のステップS16の処理のうちステップS23での処理について詳細に説明する。
【0093】
ステップS23では、上記のステップS22にて当てはまらなかった実レジスタについて優先順序付け(すなわち、「第3優先レジスタ集合」に相当する実レジスタの登録)を行う。このフェーズでは、上記の選択されたノード(すなわち仮想レジスタ)に実レジスタを割り当てることによって同一の実レジスタを参照している他の命令との間に新たな依存関係が発生するが、依存関係を持つ命令どうしの実行されるタイミングが大きく異なるために、実際のout−of−order実行時にはその依存関係の影響を受けないかもしくは受けたとしてもそれが小さなものであるような実レジスタを優先させる。
【0094】
図13に、ステップS23の処理を詳細化した手順の一例を示す。
【0095】
ここでは、説明の便宜上、ステップS22の説明とは異なる例を用いる。すなわち、図3のプログラムにおいて、仮想レジスタ$104に割り当てる実レジスタを選択する場合を考える。なお、既に仮想レジスタには$100=$1,$101=$2,$102=$3,$103=$3が割り当てられているとする。また、仮想レジスタ$104に関してステップS22において検出される実レジスタは存在しない。
【0096】
最初に、ステップS41において、干渉グラフ中にノード(既に実レジスタが割り当てられたノード)が存在すれば、その全てのノードに関して割り当てられた実レジスタの生存区間を解析する。
【0097】
図14は、仮想レジスタ$104に割り当てを行う時点で既に割り当てられている実レジスタおよび仮想レジスタ$104の生存区間である。実レジスタ$3の生存区間は、$3が割り当てられた仮想レジスタ$102,$103の生存区間を合わせたものとなっている。
【0098】
次に、ステップS42において、既に割り当てられた実レジスタの生存区間と実レジスタを割り当てようとしているノードの生存区間との距離を計算する。生存区間どうしの距離とは、一方の生存区間が終了してから他方の生存区間が始まるまでのサイクル数であり、あるレジスタに関して複数の生存区間が存在する場合にはそれらの区間全てに関して距離を計算しその最小値を上記生存区間どうしの距離とする。本実施形態では、命令は中間コードの並びに従って一つずつ実行されると仮定している。
【0099】
さらに、本実施形態では、計算された生存区間どうしの距離について修正を行うものとする。ここでは、計算された距離がある一定値X以上となった場合は、その距離を一定値Xであるとする。一般的に、Xの値としては、それ以上距離が離れていれば依存の影響は無くなると考えられるような値を利用する。
【0100】
なお、生存区間が重なっている(干渉している)ものに関しては、その距離を負数とするものとする。
【0101】
このようにして、全ての実レジスタに関して該ノードの生存区間との距離が計算される。
【0102】
ここでの具体例について考えてみる。一定値Xが10であるとすると、仮想レジスタ$104と実レジスタとの距離はそれぞれ次のようになる。ただし、レジスタの生存区間どうしの距離をdist(reg1,reg2)で表わしている。
dist($1,$104)=−1
dist($2,$104)=3
dist($3,$104)=1
ここで、距離が−1とは生存区間が重複することを意味する。
【0103】
次に、ステップS43においてノードに割り当てる実レジスタの優先順序付けをする。順序付けは、生存区間どうしの距離が大きいものを優先させるように行う。
【0104】
ただし、距離が一定値Xの実レジスタが複数あった場合には、一度でも他のノードに対して割り当てがされた実レジスタをその中で優先されるものとする。このようにすることにより、実レジスタの再利用が促進され、使用する実レジスタ数を可能な限り削減できるようになる。また、距離が負数の実レジスタは、ノードに割り当てることが不可能であるため、優先順序付けの対象から除外する。この処理をステップS44で行う。
【0105】
ここでの具体例について考えてみると、仮想レジスタ$104に割り当てるための実レジスタの優先順序は、優先度の高い順に$2,$3となる。
【0106】
最後に、ステップS45において、以上の処理によって定まった優先順序に従って実レジスタを優先順序付けされた実レジスタの列に登録する。
【0107】
なお、このステップS23の例では、$100=$1,$101=$2,$102=$3,$103=$3のように仮想レジスタが実レジスタに割り当てられている場合に仮想レジスタ$104に割り当てる実レジスタ(第3優先レジスタ集合に相当するもの)の優先順位は$2,$3となったが、ステップS22の例、すなわち$100=$1,$101=$2,$102=$3と割り当てられている場合に仮想レジスタ$103に割り当てる実レジスタを選択する例における実レジスタの優先順位については、ステップS22で図10の第1優先レジスタ集合に$3が登録された(第2優先レジスタ集合は空集合)後、残りの$1,$2に関して距離を計算すると、
dist($1,$103)=−1
dist($2,$103)=1
となるため、それらの間の優先順位は$2,$1の順となる。
【0108】
以上がステップS23における処理の詳細な説明である。
【0109】
このようにして、ステップS22,S23で優先順序付けされた実レジスタの列を生成し、ステップS24においてその中から優先度の高い順に該ノードに割り当て可能な実レジスタを検索し割り当てを行う。
【0110】
例えば、ステップS22で用いた例($100=$1,$101=$2,$102=$3と割り当てられている場合に仮想レジスタ$103に割り当てる実レジスタを選択する例)では、最終的に仮想レジスタ$103に割り当てる実レジスタの優先順位は[$3,$2]となり、ステップS24において、$3,$2の順に割り当て可能なものを見つけ、この例の場合には、$3が選択され、これがレジスタ対応表に登録される。
【0111】
また、例えばステップS23で用いた例($100=$1,$101=$2,$102=$3,$103=$3と割り当てられている場合に仮想レジスタ$104に割り当てる実レジスタを選択する例)では、最終的に仮想レジスタ$104に割り当てる実レジスタの優先順位は[$2,$3]となり、ステップS24において、$2,$3の順に割り当て可能なものを見つけ、この例の場合には、$2が選択され、これがレジスタ対応表に登録される。
【0112】
この結果、図11に示すような内容のレジスタ対応表が得られる。
【0113】
ここで、本実施形態による処理結果の一例と、従来技術による処理結果の一例とを比較する。
【0114】
図15(a)は、(本実施形態の優先順序付けを実レジスタに対して行わないような)従来の方法によって図3の仮想レジスタに対してレジスタ割り当てを行ったときに出力されるコードの一例である。この場合、$100=$1,$101=$2,$102=$3,$103=$2,$104=$2というように仮想レジスタに対して実レジスタが割り当てられている。
このコードにおいて命令間の依存関係は、命令(4)と命令(5)の間、および命令(6)と命令(7)の間に新たなfalse dependencyが発生するため、図15(b)のようになってしまう。
【0115】
一方、図16(a)は、本実施形態を用いて優先順序付けされた実レジスタを図3の仮想レジスタに対して割り当てた場合に出力されるコードである。この場合、$100=$1,$101=$2,$102=$3,$103=$3,$104=$2というように仮想レジスタに対して実レジスタが割り当てられている。
このコードでは命令間の依存関係は、命令(4)と命令(7)の間に新たなfalse dependencyが発生するため、図16(b)のようになる。これは図15(b)と比較すると命令間の依存関係が少なくスケジューリングに対する自由度も高い。
【0116】
このように命令間の依存関係を考慮したレジスタ割り当てを行った結果、レジスタ割り当てにともなうILPの低下を防ぐことができる。また、図16の命令(4)と命令(7)の間のfalse dependencyに関しても、これらの命令の実行されるタイミングが離れているため、この依存関係がout−of−order実行に対して与える影響は小さい。
【0117】
ところで、上記では図10の第3優先レジスタ集合の優先順序を決定する際の優先順序の基準としてレジスタの生存区間どうしの距離を利用したが、他の基準をもとに優先順序を決定するようにしてもよい。
以下では、他の基準の一例としてクリティカルパス長をもとに優先順序を決定する場合について説明する。なお、この場合、前述した処理のうち図9のステップS23や図13の処理が相違する以外は同様であるので、ここでは、相違する点を中心として説明する。
【0118】
クリティカルパスとは、図4に示すような依存グラフにおける最長パスである。パス長とは、そのパスの処理に必要なサイクル数のことを示す。つまり、クリティカルパス長とは、演算器が無限にあると仮定して命令列を並列に実行したときに、その命令列全体が処理を終了するのに最低限必要なサイクル数を示している。なお、1つの命令の実行には複数サイクル要することもあり、本発明は1命令の実行に複数サイクルを要する場合も包含するが、以下では、説明を分かり易くするために、1命令が1サイクルで処理されるとした場合について説明する。
【0119】
図17に、クリティカルパス長を基準としたときの優先順序付けされた実レジスタの列を示す。図17に示すように、新たな依存関係が発生しないような実レジスタ、新たな依存関係を生じる実レジスタの順に優先順序が高い(この点は、前述と同様である)。また、ここでは、新たな依存関係を生じる実レジスタどうしでは、新たな依存関係が発生したときの命令列全体のクリティカルパス長が小さくなるものほど優先順序が高い。
【0120】
このような優先順序付けされた実レジスタの列を作成するには、前述の形態ではレジスタの生存区間どうしの距離dist(reg1,reg2)を用いて仮想レジスタに割り当てる実レジスタの優先順序付けを行ったのに対し、本形態では、仮想レジスタregpに実レジスタregrを割り当てたときのクリティカルパス長cp_length(regr,regp)を用いて実レジスタの優先順序付けを行う。仮想レジスタに実レジスタを割り当てると新たな依存関係が発生するためクリティカルパス長が変わることがあるが、この値は割り当てる実レジスタによって異なる。クリティカルパス長が小さいほど命令列全体の処理時間を短縮できる可能性は高くなるため、割り当て後のクリティカルパス長が小さくなるような実レジスタを優先させる。ただし、生存区間が重なっている(干渉している)ものに関してはノードに割り当てることが不可能であるため、優先順序付けの対象から除外する。
【0121】
さて、$100,$101,$102,$103,$104の順に実レジスタを割り当てるものとし、また実レジスタは$1,$2,$3の3つとする。本形態でも先の例と同様に新たな依存関係を生じずに$100,$101,$102,$103には実レジスタを割り当てることができる。つまり、仮想レジスタには$100=$1,$101=$2,$102=$3,$103=$3というように実レジスタが割り当てられているものとする。
【0122】
ここで、$104への実レジスタの割り当てを行う場合を考える。
【0123】
まず、前述の通り、第1および第2優先レジスタ集合は空集合となる。
【0124】
次に、第3優先レジスタ集合に相当する実レジスタとその優先順位をクリティカルバス長をもとに求める。
【0125】
この場合、$1については、$104と$1は生存区間が重なっている(干渉している)ため、優先順序付けの対象から除外される。
【0126】
$2については、$104に$2を割り当てると命令(4)と命令(7)の間に新たにfalse−dependencyが発生するため、依存グラフは図18(a)のようになり、このときのクリティカルパス長は3となる。
【0127】
一方、$3については、$104に$3を割り当てると、命令(6)と命令(7)の間に新たにfalse−dependencyが発生するため、依存グラフは図18(b)のようになり、このときのクリティカルパス長は4となる。
【0128】
したがって、
cp_length($2,$104)=3
cp_length($3,$104)=4
となり、クリティカルパス長が小さいものから優先させると、仮想レジスタ$104に割り当てるための実レジスタの優先順序は優先度の高い順に$2,$3となる。
【0129】
そして、最終的に仮想レジスタ$104に割り当てる実レジスタの優先順位は[$2,$3]となり、ステップS24において、$2,$3の順に割り当て可能なものを見つけ、この例の場合には、$2が選択され、これがレジスタ対応表に登録される。この結果、本例の場合、図11と同様の実レジスタ割り当ての結果となる。
【0130】
ところで、本実施形態では、図10や図17の優先順序付けされた実レジスタの列における第1〜第3優先レジスタ集合の各々について相当するレジスタを求めてから、図9に示すステップS24において、該優先順序付けされた実レジスタの列から対象ノードに割り当て可能な実レジスタを優先順序に従って検索し、その実レジスタが割り当て可能か否かを判断し、割り当て可能であればそれを選択してレジスタ対応表(図11参照)に登録するようにした。
その代わりに、その都度割り当て可能か否かを判断して、割り当て可能なレジスタが得られた時点でその仮想レジスタに対する実レジスタ割り当て処理を終了するようにしてもよい。すなわち、第1優先レジスタ集合に相当する実レジスタが得られたならば、それが割り当て可能か否かを判断し、割り当て可能の場合にはそれを選択して以降の処理は省く。割り当て可能でない場合または第1優先レジスタ集合が空集合の場合には第2優先レジスタ集合についての処理を行い、第2優先レジスタ集合に相当する実レジスタが得られたならば、それが割り当て可能か否かを判断し、割り当て可能の場合にはそれを選択して以降の処理は省く。割り当て可能でない場合または第2優先レジスタ集合が空集合の場合には第3優先レジスタ集合についての処理を行う。
なお、仮に割り当て可能か否かを判断する必要がない場合には、第1優先レジスタ集合に相当する実レジスタが得られた場合にはそれを選択して以降の処理は省き、そうでない場合には第2優先レジスタ集合についての処理を行い、その処理においても実レジスタが定まらないときに、第3優先レジスタ集合についての処理を行うようにしてもよい。
【0131】
以上の実施形態ではグラフカラーリング手法によるレジスタ割り当てを用いた場合について説明したが、本発明は、グラフカラーリング手法に限定されるものではなく、様々なレジスタ割り当て手法において仮想レジスタに割り当てるべき実レジスタを複数の候補の中から選択する場合に適用可能である。
【0132】
さて、前述したように、本発明はout−of−order実行可能なVLIWにも適用可能であるが、従来はout−of−order実行可能なVLIW自体がなかったので、以下では、out−of−order命令発行VLIW(以下、ダイナミックVLIW)プロセッサに係る発明の実施形態について説明する。
【0133】
なお、以下では、1つのVLIW命令を構成している個々の命令をアトムと呼ぶことがある。図19に、1つのVLIW命令の一例を示す。これは、3つのアトムから1つのVLIW命令が構成される例である。また、VLIW命令を構成する個々のアトムが入るべき位置を、スロットと呼ぶ。
【0134】
さて、命令レベルの並列度を上げる方法としてコンパイル時にスタティックに資源を割り当て使用するVLIWによる方法と、実行時に資源の割り当てをダイナミックに行うスーパースカラーの方法とがある。VLIW方式ではコンパイラにより同時実行可能な命令を検出するので、実行時に検出するメカニズムが必要なく、実行時のハードウェアが単純化され、高い周波数が達成される可能性がある。しかし、コンパイラにより同時実行可能な命令を検出する方法にはコンパイラでは完全に予測できないあるいは現実的に予測不可能なパラメータが存在する。
【0135】
このダイナミックVLIW方式は、スーパースカラー方式とVLIW方式の中間に位置するもので、基本的にはVLIW方式でありながら一部をダイナミックに実行することにより、コンパイラ時に予測困難な事項に対してもある程度ダイナミックに動作し、プロセッサ全体を止めることなく処理を進めることができるようにしたものである。つまり、このダイナミックVLIW方式は、ハードウェアとソフトウェア(コンパイラ)の新たな最適点を求め、性能を最適化することを目指したものである。
【0136】
ダイナミックVLIW方式によるプロセッサの基本的な構成においては、フェッチしたが実行できないアトムを、後続のアトムを先行して実行させることを可能とするために一時待避させておくためのペンディングキューを備え、各レジスタの使用状況に関する情報を記憶・管理し、この情報に基づいて、フェッチしたアトムの実行可否の判断を行い、実行可能であればフェッチしたアトムを実行し、実行可能でないならばフェッチしたアトムをペンディングキューに蓄積するとともに、ペンディングキューに蓄積されているアトムの実行可否の判断を行い、実行可能であれば該アトムを実行することにより、先行するアトムが直ちには実行できない場合にこれを一時待避しておき後続のアトムを先に実行できるようにしている。
【0137】
このダイナミックVLIW方式は、VLIW命令ごとにアトムをフェッチしていく点は従来のin−order命令発行VLIWと同様であるが、同時にフェッチしたVLIW命令の複数のアトムのうちに実行できないものがでてきた場合に、従来のin−order命令発行VLIWでは常にフェッチを中断することになるが、このダイナミックVLIW方式ではフェッチを中断させないで済む可能性がでてくるわけである。
【0138】
図20は、このようなダイナミックVLIWプロセッサの基本的な構成を表す概念的な図である。図20では、2つのパイプラインユニット(1006−1,1006−2)を持つ場合を例としている。このダイナミックVLIWプロセッサは、命令列からフェッチしたアトムが直ちには実行できない場合にこれを実行待ちとして待避させておくためのペンディングキュー(Pending Queue)というスロット毎に独立に設けたキュー1002−1,1002−2と、各レジスタの使用状況に関する情報を各レジスタ毎に管理するためのスコアボード1004というテーブルを用いて、out−of−orderを実現している例である。
【0139】
フェッチされたVLIW命令の複数のアトムのうち実行されないアトムは、実行可能になるまで、対応するペンディングキューに保存される。
【0140】
ペンディングキューはFIFO(先入れ先出し型のバッファ)で構成すると好ましい。ペンディングキューをFIFOで構成すると、ペンディングキューに蓄積された先頭のアトムから順に実行されることになり、この点が従来のスーパースカラーのリオーダーバッファの場合と異なってくる。つまり、実行可能なアトムがペンディングキューに存在するのに実行できない場合があるという性能上の制約と引き換えに、ハードウェアを非常に単純化させて高速化を図ることができる。
【0141】
さらに、ペンディングキューは、VLIW命令を構成する個々のアトムが入るべきスロットごとに設けるのが好ましい。例えば、図20に例示したVLIW命令の形式を使う場合には、スロットが2つあるので、ペンディングキューは2つ用意されることになる。そして、フェッチされたVLIW命令のうち実行されないアトムは、そのスロットに対応するペンディングキューに投入する。このようにスロットごとにペンディングキューが存在し、スロット間をまたぐことがないことも、ハードウェアを単純化して高速化を図るための制限の一つになる。
【0142】
各サイクル/各スロットにおいて、実行の機会を与えるアトムには、通常の命令列からフェッチしたアトムと、ペンディングキューが空でない場合におけるペンディングキューからのアトムとがあり得るが、(1)フェッチしたアトム、(2)ペンディングキューのアトムの順に、実行が優先される。
【0143】
実行の機会が与えられたアトム(フェッチしたアトムまたはペンディングキューの先頭にあるアトム)が実行可能かどうかについての判定は、スコアボードの内容(当該アトムに関連するレジスタの使用状況)に基づいて行い、基本的には、当該アトムが使うレジスタが当該アトムにとって利用可能でないときは、当該アトムが実行できないと判定される。
【0144】
以上のように、本ダイナミックVLIW方式では、直ちには実行できないアトムをペンディングキューに一時待避しておき、それが実行可能になったら実行するという方法で、out−of−orderを実現している。
【0145】
なお、このダイナミックVLIW方式では、レジスタについては、プロセッサ内にリネーミングの構成を持たず、コンパイラによりレジスタを割り当てるものとする。レジスタリネーミングを行わないようにすることで、ハードウェアを単純にすることができる。なお、このために、VLIWの命令列を生成するコンパイラとして、false dependencyが起こらないようにレジスタ割付を行うものが用いられる(公知のコンパイラで構わない)。
【0146】
次に、このダイナミックVLIWの作用効果を示すために、簡単な例を使ってその概要を説明する。
【0147】
図21に、実行される命令列の例として、一つのVLIW命令に二つのアトムが含まれる場合の命令列の一例を示す。
【0148】
なお、図21では、各アトムは、ニーモニック、ディスティネーション(dest)のレジスタ、第1のソース(src1)のレジスタ、第2のソース(src2)のレジスタの順番で表記するものとする。
【0149】
図21に示されるように、この命令列は、
ADD R8,R9,R10とLD R5,(R3)、
LDI R18,1000とADDI R13,R9,4、
ADD R21,R18,R9とSUB R11,R5,R8、
LSR R22,R21,5 とORI R24,R21,0xFF、
SUBI R25,R24,5とNOP、
BRZ R11,R0,ROOP_EXTとNOP
が、この順に1組ずつフェッチされることになる。
【0150】
なお、NOPアトムは、実際になにも動作を生じさせない命令であってもよいし、ADD等を実行するが結果としてなにも変化が起こらないような命令であってもよい。
【0151】
以下、図21に例示した命令列が従来のin−order命令発行VLIW方式とダイナミックVLIW方式とでそれぞれ実行された場合について比較して説明する。
【0152】
図22に、この命令列が従来のin−order命令発行VLIW方式で実行された場合の様子を示し、図23に、この命令列がダイナミックVLIW方式で実行された場合の様子を示す。
【0153】
図22と図23の例では、最初のVLIW命令の第2スロットのアトムであるLD(ロード命令)が1次キャッシュでミスを起こし、該当するデータが2次キャッシュに存在したために、これをロードしてくるのに4サイクル必要となったものとする。
【0154】
図22に示されるように、この命令列を従来のin−order命令発行VLIW方式により実行した場合、サイクル1では、第1スロットのADD R8,R9,R10と第2スロットのLD R5,(R3)が実行されるが、第2スロットのLDがキャシュミスを起こしたため、サイクル2〜5の4サイクルは第1、第2スロットともにLDのミスによるストールになり(この間、フェッチが中断する)、その後は、順次命令が実行され、結局、10サイクルを要して処理が完了している。
【0155】
次に、図23に示されるように、この命令列をダイナミックVLIW方式により実行した場合、まず、サイクル1では、第1スロットのADD R8,R9,R10と第2スロットのLD R5,(R3)が実行され、LDがキャシュミスを起す。次のサイクルからは、このLDのディスティネーション・レジスタであるR5を使用するアトムは、LDが完了するまで実行できなくなる(このレジスタR5の状況は、スコアボードに反映される)。
【0156】
サイクル2では、VLIW命令の各アトムはLDのディスティネーション・レジスタであるR5を使用しないため、LDI R18,1000とADDI R13,R9,4が実行される。
【0157】
サイクル3では、第1スロットのADD R21,R18,R9はR5を使用しないため実行されるが、第2スロットのSUB R11,R5,R8は、R5を第1のソースレジスタとして参照するので、実行できずにペンディングキューへ投入される(スコアボードを参照することによってR5が使用できないことが分かることから、実行できないことが分かる)。また、次のサイクルからは、SUBのディスティネーション・レジスタであるR11を使用するアトム(このSUBを除く)は、このSUBが完了するまで実行できなくなる(このレジスタR11の状況も、スコアボードに反映される)。
【0158】
サイクル4では、R5もR11も使用されないので、LSR R22,R21,5とORI R24,R21,0xFFが実行される。
【0159】
サイクル5では、R5もR11も使用されないので、SUBI R25,R24,5とNOPが実行される。
【0160】
ここで、LDが完了し、次のサイクルからは、R5が使用可能となる(このレジスタR5の状況も、スコアボードに反映される)。
【0161】
サイクル6では、まず、第1スロットのBRZ R11,R0,ROOP_EXは、R11をディスティネーションとするので、実行できないことがわかる。なお、詳しくは後述するが、ディスティネーションとするレジスタが使用できない場合には、ペンディングキューへは投入せずに、実行可能になるのを待つ(フェッチを中断する)。従って、このサイクルは、空きスロットとなる。フェッチが中断するので、フェッチした第2スロットの命令も実行が保留される。
【0162】
ここで、第2スロットでは、フェッチの中断が発生したので、ペンディングキュー中のアトムに実行の機会が与えられる。ペンディングキューにあるSUB R11,R5,R8は、先のLDが完了し、R5が使用可能となっているので、実行可能であり(スコアボードを参照することによって実行できることが分かる)、したがってSUB R11,R5,R8がペンディングキューから取り出され、実行される。
【0163】
ここで、SUBが完了し、次のサイクルからは、R11が使用可能となる(このレジスタR11の状況も、スコアボードに反映される)。
【0164】
サイクル7では、第1スロットで実行を待っていたBRZ R11,R0,ROOP_EXTが、実行可能となって、実行され、第2スロットでは実行を待っていたNOPが実行される。
【0165】
この結果、7サイクルを要して処理が完了したことになる。
【0166】
以上のように、従来のin−order命令発行VLIW方式では10サイクルかかるところが、ダイナミックVLIW方式ではLDアトムによるミスの期間中に他のアトムが実行できるout−of−orderの機能により、7サイクルで実行が完了し、高速化できることがわかる。
【0167】
このようなout−of−order実行可能なVLIW方式によるプロセッサを対象とするコンパイラに対しても本発明は適用可能である。
【0168】
なお、本実施形態におけるコンパイラはソフトウェアとしても実現可能である。また、本実施形態におけるコンパイラは、コンピュータに所定の手段を実行させるための(あるいはコンピュータを所定の手段として機能させるための、あるいはコンピュータに所定の機能を実現させるための)プログラムを記録したコンピュータ読取り可能な記録媒体としても実施することもできる。
【0169】
本発明は、上述した実施の形態に限定されるものではなく、その技術的範囲において種々変形して実施することができる。
【0170】
【発明の効果】
本発明によれば、レジスタ割り当てにともなって命令間に新たな依存関係が発生することを防ぎ、もし発生してしまう場合でも新たな依存関係になる命令間の実行されるタイミングをなるべく離れたものにすることができるようになる。そのため、ハードウェアによるレジスタ・リネーミング機構を用いることなく、out−of−order実行時のILPの低下の原因となるfalse dependencyを最小限に抑えることが可能となる。また、ハードウェアによるレジスタ・リネーミングではある限られた命令数に対してしかできないのに対して、コンパイラでおこなえば広範囲なレジスタ解析を行うことができレジスタをより有効活用できるようになる。
【図面の簡単な説明】
【図1】本発明の一実施形態に係るコンパイラの構成例を示す図
【図2】グラフカラーリングの手順を示すフローチャート
【図3】プログラムの一例を示す図
【図4】依存グラフを示す図
【図5】各仮想レジスタの生存区間を示す図
【図6】レジスタ干渉グラフを示す図
【図7】レジスタ干渉グラフの再構築を説明するための図
【図8】仮想レジスタがレジスタ干渉グラフから取り除かれた順番の記録を示す図
【図9】仮想レジスタに対して実レジスタを割り当てる処理の手順の一例を示すフローチャート
【図10】優先順序付けされた実レジスタの列の一例を示す図
【図11】レジスタ対応表の一例を示す図
【図12】仮想レジスタに割り当てても新たな依存関係を生じない実レジスタに関する処理の手順の一例を示すフローチャート
【図13】仮想レジスタに割り当てると新たな依存関係を生じない実レジスタに関する処理の手順の一例を示すフローチャート
【図14】対象仮想レジスタと実レジスタの生存区間を示す図
【図15】従来方法による処理結果の一例を示す図
【図16】本実施形態における処理結果の一例を示す図
【図17】優先順序付けされた実レジスタの列の他の例を示す図
【図18】クリティカルバス長を用いて実レジスタ割り当てを行う場合のクリティカルパスの例を示す図
【図19】VLIW命令の一例を示す図
【図20】ダイナミックVLIW方式について説明するための図
【図21】VLIW命令の命令列の一例を示す図
【図22】図21の命令列を従来のVLIW方式で実行した場合について説明するための図
【図23】図21の命令列をダイナミックVLIW方式で実行した場合について説明するための図
【図24】命令間の依存関係について説明するための図
【符号の説明】
1…解析部
2…最適化部
3…出力部
21…命令スケジューリング部
22…レジスタ割り当て部
1002−1,1002−2…ペンディングキュー(Pending Queue)
1004…スコアボード
1006−1,1006−2…パイプラインユニット
Claims (9)
- 並行に命令を実行できる複数の演算器を備えるとともに命令配置順序において後続する命令の実行をそれに先行する命令の実行よりも前に開始させることを可能とする機能を有するプロセッサを対象として、与えられたソースプログラムに基づいて該プロセッサで実行可能なオブジェクトプログラムを生成するコンパイル方法であって、
前記ソースプログラムを解析して第1の中間コードを生成する解析ステップと、
前記第1の中間コードに基づいて命令スケジューリングを行って、演算の一時的な結果を置くレジスタとして仮想レジスタを割り当てて記述され第2の中間コードを生成する命令スケジューリングステップと、
前記第2の中間コードおよび前記プロセッサの実レジスタに関する情報に基づいて、前記各仮想レジスタに割り当てるべき実レジスタを決定するレジスタ割り当てステップと、
前記仮想レジスタを割り当てられた前記実レジスタで置き換えたオブジェクトプログラムを出力する出力ステップとを有し、
前記レジスタ割り当てステップは、
前記実レジスタが前記仮想レジスタに割り当てられて使用される区間および該実レジスタの割り当て対象となった該仮想レジスタの使用される区間を解析するステップと、
前記区間解析結果および既に発生している命令間依存関係を示す情報をもとに、割り当て対象となった前記仮想レジスタに割り当てても新たな命令間依存関係を生じさせない実レジスタが存在すれば、該実レジスタを優先的に該仮想レジスタに割り当てる候補として決定するステップとを含むことを特徴とするコンパイル方法。 - 割り当て対象となった前記仮想レジスタに割り当てても新たな命令間依存関係を生じさせない実レジスタのうち、実際には既に発生している命令間依存関係とは別の命令間依存関係を生じさせるが該別の命令間依存関係が該既に発生している命令間依存関係によって隠蔽される結果として新たな命令間依存関係を生じさせないものとみなし得る実レジスタの割り当て優先順位を、実際にいかなる命令間依存関係をも生じさせないことにより新たな命令間依存関係を生じさせない実レジスタの割り当て優先順位よりも高くすることを特徴とする請求項1に記載のコンパイル方法。
- 前記レジスタ割り当てステップは、
割り当て対象となった前記仮想レジスタに割り当てると新たな命令間依存関係を生じさせる実レジスタを、割り当て対象となった前記仮想レジスタに割り当てても新たな命令間依存関係を生じさせない実レジスタに次ぐ優先順位で割り当てる候補として決定するステップを更に含むことを特徴とする請求項1に記載のコンパイル方法。 - 前記新たな命令間依存関係を生じさせる実レジスタのうち、その生存区間と、割り当て対象となった前記仮想レジスタの生存区間との間の距離がより大きい実レジスタほど、より高い優先順位で割り当てる候補として決定することを特徴とする請求項3に記載のコンパイル方法。
- 命令間依存関係におけるクリティカルパス長をより小さくする実レジスタほどより高い優先順位で割り当てる候補として決定することを特徴とする請求項3に記載のコンパイル方法。
- 前記レジスタ割り当てステップは、
前記仮想レジスタの生存区間と重複する部分を持つ他の仮想レジスタの数および前記プロセッサの実レジスタの数に基づいて、実レジスタを割り当てる対象とする仮想レジスタの順番を決定するステップを更に含むことを特徴とする請求項1ないし5のいずれか1項に記載のコンパイル方法。 - 前記レジスタ割り当てステップは、
割り当て対象となった前記仮想レジスタに対して決定された実レジスタであってその時点で実際に割り当て可能なもののうちで最も優先順位が高い実レジスタを選択し、該仮想レジスタと選択された該実レジスタとの対応関係を記憶するステップを更に含むことを特徴とする請求項1ないし6のいずれか1項に記載のコンパイル方法。 - 並行に命令を実行できる複数の演算器を備えるとともに命令配置順序において後続する命令の実行をそれに先行する命令の実行よりも前に開始させることを可能とする機能を有するプロセッサを対象として、与えられたソースプログラムに基づいて該プロセッサで実行可能なオブジェクトプログラムを生成するコンパイル装置であって、
前記ソースプログラムを解析して第1の中間コードを生成する解析手段と、
前記第1の中間コードに基づいて命令スケジューリングを行って、演算の一時的な結果を置くレジスタとして仮想レジスタを割り当てて記述され第2の中間コードを生成する命令スケジューリング手段と、
前記第2の中間コードおよび前記プロセッサの実レジスタに関する情報に基づいて、前記各仮想レジスタに割り当てるべき実レジスタを決定するレジスタ割り当て手段と、
前記仮想レジスタを割り当てられた前記実レジスタで置き換えたオブジェクトプログラムを出力する出力手段とを具備し、
前記レジスタ割り当て手段は、
前記実レジスタが前記仮想レジスタに割り当てられて使用される区間および該実レジスタの割り当て対象となった該仮想レジスタの使用される区間を解析する手段と、
前記区間解析結果および既に発生している命令間依存関係を示す情報をもとに、割り当て対象となった前記仮想レジスタに割り当てても新たな命令間依存関係を生じさせない実レジスタが存在すれば、該実レジスタを優先的に該仮想レジスタに割り当てる候補として決定する手段とを含むことを特徴とするコンパイル装置。 - 並行に命令を実行できる複数の演算器を備えるとともに命令配置順序において後続する命令の実行をそれに先行する命令の実行よりも前に開始させることを可能とする機能を有するプロセッサを対象として、与えられたソースプログラムに基づいて該プロセッサで実行可能なオブジェクトプログラムを生成するために、前記ソースプログラムを解析して第1の中間コードを生成する解析させ、前記第1の中間コードに基づいて命令スケジューリングを行って、演算の一時的な結果を置くレジスタとして仮想レジスタを割り当てて記述され第2の中間コードを生成させ、前記第2の中間コードおよび前記プロセッサの実レジスタに関する情報に基づいて、前記各仮想レジスタに割り当てるべき実レジスタを決定するレジスタ割り当てさせ、前記仮想レジスタを割り当てられた前記実レジスタで置き換えたオブジェクトプログラムを出力する出力ステップとをコンピュータに実行させるプログラムであって、
前記レジスタ割り当てステップにおいて、
前記実レジスタが前記仮想レジスタに割り当てられて使用される区間および該実レジスタの割り当て対象となった該仮想レジスタの使用される区間を解析させ、
前記区間解析結果および既に発生している命令間依存関係を示す情報をもとに、割り当て対象となった前記仮想レジスタに割り当てても新たな命令間依存関係を生じさせない実レジスタが存在すれば、該実レジスタを優先的に該仮想レジスタに割り当てる候補として決定させるためのプログラムを記録したコンピュータ読取り可能な記録媒体。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP09389699A JP3648402B2 (ja) | 1999-03-31 | 1999-03-31 | コンパイル方法及びコンパイラ装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP09389699A JP3648402B2 (ja) | 1999-03-31 | 1999-03-31 | コンパイル方法及びコンパイラ装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
JP2000284968A JP2000284968A (ja) | 2000-10-13 |
JP3648402B2 true JP3648402B2 (ja) | 2005-05-18 |
Family
ID=14095259
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
JP09389699A Expired - Fee Related JP3648402B2 (ja) | 1999-03-31 | 1999-03-31 | コンパイル方法及びコンパイラ装置 |
Country Status (1)
Country | Link |
---|---|
JP (1) | JP3648402B2 (ja) |
Families Citing this family (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JP4721975B2 (ja) * | 2006-07-28 | 2011-07-13 | パナソニック株式会社 | コンパイラ装置およびコンパイル方法 |
US11762640B2 (en) | 2019-05-21 | 2023-09-19 | The University Of Tokyo | Program, information conversion device, and information conversion method |
Family Cites Families (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JPH0769831B2 (ja) * | 1987-09-01 | 1995-07-31 | 株式会社日立製作所 | コンパイラにおけるレジスタ割当て方法 |
JPH02236638A (ja) * | 1989-03-10 | 1990-09-19 | Hitachi Ltd | レジスタ割付け管理方式 |
JPH03150637A (ja) * | 1989-11-08 | 1991-06-27 | Oki Electric Ind Co Ltd | パイプライン対応のレジスタ割付け方式 |
JP3239907B2 (ja) * | 1993-01-20 | 2001-12-17 | 富士ゼロックス株式会社 | レジスタ割り付け方式 |
JP3276479B2 (ja) * | 1993-10-05 | 2002-04-22 | 富士通株式会社 | コンパイル方式 |
JPH08234997A (ja) * | 1995-02-28 | 1996-09-13 | Nec Corp | レジスタ割付け方法 |
JP2000172510A (ja) * | 1998-12-03 | 2000-06-23 | Matsushita Electric Ind Co Ltd | 資源割付装置及び資源割付プログラムが記録されたコンピュータ読み取り可能な記録媒体 |
-
1999
- 1999-03-31 JP JP09389699A patent/JP3648402B2/ja not_active Expired - Fee Related
Also Published As
Publication number | Publication date |
---|---|
JP2000284968A (ja) | 2000-10-13 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US6718541B2 (en) | Register economy heuristic for a cycle driven multiple issue instruction scheduler | |
KR100676011B1 (ko) | 인스트럭션 처리 방법 및 장치와 기계 판독가능한 매체 | |
US6918111B1 (en) | System and method for scheduling instructions to maximize outstanding prefetches and loads | |
US5941983A (en) | Out-of-order execution using encoded dependencies between instructions in queues to determine stall values that control issurance of instructions from the queues | |
US6044222A (en) | System, method, and program product for loop instruction scheduling hardware lookahead | |
JP4003830B2 (ja) | マルチプロセッシング環境における透過動的最適化のための方法およびシステム | |
US8214831B2 (en) | Runtime dependence-aware scheduling using assist thread | |
JP3311462B2 (ja) | コンパイル処理装置 | |
JP4841861B2 (ja) | 演算処理装置及びデータ転送処理の実行方法 | |
JP2001282549A (ja) | プログラム変換装置及び方法並びに記録媒体 | |
JP2000222207A (ja) | コンピュ―タ処理システムにおけるロ―ド動作を順序変更する方法および装置 | |
JPH08505724A (ja) | レジスタ・リネーミングのシステム及び方法 | |
WO1998037485A1 (en) | Method and apparatus for forwarding of operands in a computer system | |
WO2000063775A1 (en) | Dynamic code motion optimization and path tracing | |
JP3589698B2 (ja) | インタロックハードウェアの単純化方法及び装置 | |
US20230101571A1 (en) | Devices, methods, and media for efficient data dependency management for in-order issue processors | |
JPH0738158B2 (ja) | コード最適化方法およびコンパイラ・システム | |
US6516462B1 (en) | Cache miss saving for speculation load operation | |
JP2001092657A (ja) | 中央演算装置、コンパイル方法、及びコンパイルプログラムを記録した記録媒体 | |
GB2394085A (en) | Generating code for a configurable microprocessor | |
CN108027736B (zh) | 使用通过对物理寄存器预分配的乱序重命名的运行时代码并行化 | |
JP3648402B2 (ja) | コンパイル方法及びコンパイラ装置 | |
Kessler | Compiling for VLIW DSPs | |
JP3311381B2 (ja) | コンパイラにおける命令スケジューリング処理方法 | |
Li et al. | Compiler techniques for concurrent multithreading with hardware speculation support |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
A131 | Notification of reasons for refusal |
Free format text: JAPANESE INTERMEDIATE CODE: A131 Effective date: 20041012 |
|
A521 | Written amendment |
Free format text: JAPANESE INTERMEDIATE CODE: A523 Effective date: 20041208 |
|
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: 20050208 |
|
A61 | First payment of annual fees (during grant procedure) |
Free format text: JAPANESE INTERMEDIATE CODE: A61 Effective date: 20050214 |
|
FPAY | Renewal fee payment (event date is renewal date of database) |
Free format text: PAYMENT UNTIL: 20080218 Year of fee payment: 3 |
|
FPAY | Renewal fee payment (event date is renewal date of database) |
Free format text: PAYMENT UNTIL: 20090218 Year of fee payment: 4 |
|
FPAY | Renewal fee payment (event date is renewal date of database) |
Free format text: PAYMENT UNTIL: 20100218 Year of fee payment: 5 |
|
LAPS | Cancellation because of no payment of annual fees |