(57)【特許請求の範囲】
【請求項１】
並行に命令を実行できる複数の演算器を備えるとともに命令配置順序において後続する命令の実行をそれに先行する命令の実行よりも前に開始させることを可能とする機能を有するプロセッサを対象として、与えられたソースプログラムに基づいて該プロセッサで実行可能なオブジェクトプログラムを生成するコンパイル方法であって、
前記ソースプログラムを解析して第１の中間コードを生成する解析ステップと、
前記第１の中間コードに基づいて命令スケジューリングを行って、演算の一時的な結果を置くレジスタとして仮想レジスタを割り当てて記述され第２の中間コードを生成する命令スケジューリングステップと、
前記第２の中間コードおよび前記プロセッサの実レジスタに関する情報に基づいて、前記各仮想レジスタに割り当てるべき実レジスタを決定するレジスタ割り当てステップと、
前記仮想レジスタを割り当てられた前記実レジスタで置き換えたオブジェクトプログラムを出力する出力ステップとを有し、
前記レジスタ割り当てステップは、
前記実レジスタが前記仮想レジスタに割り当てられて使用される区間および該実レジスタの割り当て対象となった該仮想レジスタの使用される区間を解析するステップと、
前記区間解析結果および既に発生している命令間依存関係を示す情報をもとに、割り当て対象となった前記仮想レジスタに割り当てても新たな命令間依存関係を生じさせない実レジスタが存在すれば、該実レジスタを優先的に該仮想レジスタに割り当てる候補として決定するステップとを含むことを特徴とするコンパイル方法。
【請求項２】
割り当て対象となった前記仮想レジスタに割り当てても新たな命令間依存関係を生じさせない実レジスタのうち、実際には既に発生している命令間依存関係とは別の命令間依存関係を生じさせるが該別の命令間依存関係が該既に発生している命令間依存関係によって隠蔽される結果として新たな命令間依存関係を生じさせないものとみなし得る実レジスタの割り当て優先順位を、実際にいかなる命令間依存関係をも生じさせないことにより新たな命令間依存関係を生じさせない実レジスタの割り当て優先順位よりも高くすることを特徴とする請求項１に記載のコンパイル方法。
【請求項３】
前記レジスタ割り当てステップは、
割り当て対象となった前記仮想レジスタに割り当てると新たな命令間依存関係を生じさせる実レジスタを、割り当て対象となった前記仮想レジスタに割り当てても新たな命令間依存関係を生じさせない実レジスタに次ぐ優先順位で割り当てる候補として決定するステップを更に含むことを特徴とする請求項１に記載のコンパイル方法。
【請求項４】
前記新たな命令間依存関係を生じさせる実レジスタのうち、その生存区間と、割り当て対象となった前記仮想レジスタの生存区間との間の距離がより大きい実レジスタほど、より高い優先順位で割り当てる候補として決定することを特徴とする請求項３に記載のコンパイル方法。
【請求項５】
命令間依存関係におけるクリティカルパス長をより小さくする実レジスタほどより高い優先順位で割り当てる候補として決定することを特徴とする請求項３に記載のコンパイル方法。
【請求項６】
前記レジスタ割り当てステップは、
前記仮想レジスタの生存区間と重複する部分を持つ他の仮想レジスタの数および前記プロセッサの実レジスタの数に基づいて、実レジスタを割り当てる対象とする仮想レジスタの順番を決定するステップを更に含むことを特徴とする請求項１ないし５のいずれか１項に記載のコンパイル方法。
【請求項７】
前記レジスタ割り当てステップは、
割り当て対象となった前記仮想レジスタに対して決定された実レジスタであってその時点で実際に割り当て可能なもののうちで最も優先順位が高い実レジスタを選択し、該仮想レジスタと選択された該実レジスタとの対応関係を記憶するステップを更に含むことを特徴とする請求項１ないし６のいずれか１項に記載のコンパイル方法。
【請求項８】
並行に命令を実行できる複数の演算器を備えるとともに命令配置順序において後続する命令の実行をそれに先行する命令の実行よりも前に開始させることを可能とする機能を有するプロセッサを対象として、与えられたソースプログラムに基づいて該プロセッサで実行可能なオブジェクトプログラムを生成するコンパイル装置であって、
前記ソースプログラムを解析して第１の中間コードを生成する解析手段と、
前記第１の中間コードに基づいて命令スケジューリングを行って、演算の一時的な結果を置くレジスタとして仮想レジスタを割り当てて記述され第２の中間コードを生成する命令スケジューリング手段と、
前記第２の中間コードおよび前記プロセッサの実レジスタに関する情報に基づいて、前記各仮想レジスタに割り当てるべき実レジスタを決定するレジスタ割り当て手段と、
前記仮想レジスタを割り当てられた前記実レジスタで置き換えたオブジェクトプログラムを出力する出力手段とを具備し、
前記レジスタ割り当て手段は、
前記実レジスタが前記仮想レジスタに割り当てられて使用される区間および該実レジスタの割り当て対象となった該仮想レジスタの使用される区間を解析する手段と、
前記区間解析結果および既に発生している命令間依存関係を示す情報をもとに、割り当て対象となった前記仮想レジスタに割り当てても新たな命令間依存関係を生じさせない実レジスタが存在すれば、該実レジスタを優先的に該仮想レジスタに割り当てる候補として決定する手段とを含むことを特徴とするコンパイル装置。
【請求項９】
並行に命令を実行できる複数の演算器を備えるとともに命令配置順序において後続する命令の実行をそれに先行する命令の実行よりも前に開始させることを可能とする機能を有するプロセッサを対象として、与えられたソースプログラムに基づいて該プロセッサで実行可能なオブジェクトプログラムを生成するために、前記ソースプログラムを解析して第１の中間コードを生成する解析させ、前記第１の中間コードに基づいて命令スケジューリングを行って、演算の一時的な結果を置くレジスタとして仮想レジスタを割り当てて記述され第２の中間コードを生成させ、前記第２の中間コードおよび前記プロセッサの実レジスタに関する情報に基づいて、前記各仮想レジスタに割り当てるべき実レジスタを決定するレジスタ割り当てさせ、前記仮想レジスタを割り当てられた前記実レジスタで置き換えたオブジェクトプログラムを出力する出力ステップとをコンピュータに実行させるプログラムであって、
前記レジスタ割り当てステップにおいて、
前記実レジスタが前記仮想レジスタに割り当てられて使用される区間および該実レジスタの割り当て対象となった該仮想レジスタの使用される区間を解析させ、
前記区間解析結果および既に発生している命令間依存関係を示す情報をもとに、割り当て対象となった前記仮想レジスタに割り当てても新たな命令間依存関係を生じさせない実レジスタが存在すれば、該実レジスタを優先的に該仮想レジスタに割り当てる候補として決定させるためのプログラムを記録したコンピュータ読取り可能な記録媒体。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明は、ｏｕｔ−ｏｆ−ｏｒｄｅｒ実行をサポートし複数の並行に動作する演算器を持つプロセッサ上で実行されるオブジェクトプログラムを生成するためのコンパイル方法及びコンパイラ装置に関する。
【０００２】
【従来の技術】
命令の実行速度の高速化のためのＣＰＵアーキテクチャとして、レジスタやキャッシュを共有し並行に動作する演算器を複数持つＣＰＵアーキテクチャが知られている。その代表的なものとして、コンパイル時にスタティックに資源を割り当て使用するＶＬＩＷ（Ｖｅｒｙ  Ｌｏｎｇ  Ｉｎｓｔｒｕｃｔｉｏｎ  Ｗｏｒｄ）や、実行時に資源の割り当てをダイナミックに行うスーパスカラがある（Ｊ．  Ｌ．  Ｈｅｎｎｅｓｓｙ  ＆  Ｄ．  Ａ．  Ｐａｔｔｅｒｓｏｎ、  “ＣＯＭＰＵＴＥＲ  ＡＲＣＨＩＴＥＣＴＵＲＥ  Ａ  ＱＵＡＮＴＩＴＡＴＩＶＥ  ＡＰＰＲＯＡＣＨ”、  Ｃｈａｐｔｅｒ４参照）。以下ではそれらのようなＣＰＵアーキテクチャを総称してＩＬＰアーキテクチャ（ＩＬＰ：Ｉｎｓｔｒｕｃｔｉｏｎ−Ｌｅｖｅｌ  Ｐａｒａｌｌｅｌｉｓｍ）と呼ぶ。
【０００３】
ＩＬＰアーキテクチャではハードウェアとしては複数命令の並行実行によりプログラムを高速に実行できる資源を有しているが、実際に高速性を発揮させるためには命令実行時の並行度（以下、ＩＬＰと呼ぶ）が高いことが必要であり、このための方策が鍵となる。
【０００４】
ＩＬＰを上げる方法としてｏｕｔ−ｏｆ−ｏｒｄｅｒ実行が知られている。すなわち、通常の方法であるｉｎ−ｏｒｄｅｒ実行では、あるサイクルで実行を開始すべく配置された命令と、それよりも後のサイクルで実行を開始すべく配置された命令との実行開始順序は守られる。しかし、命令の配置順序が後であるにもかかわらず、先に配置された命令との依存関係がなければ、先の命令を待たずに後の命令の実行の開始を許すことにより、高速化を図ることが可能である。これを実現する方法をｏｕｔ−ｏｆ−ｏｒｄｅｒ実行と呼ぶ。既存のスーパスカラでは実際にｏｕｔ−ｏｆ−ｏｒｄｅｒ実行をとるものが少なくない（ただし、従来のＶＬＩＷではｉｎ−ｏｆ−ｏｒｄｅｒ実行を前提としており、ｏｕｔ−ｏｆ−ｏｒｄｅｒ実行をとるＶＬＩＷは知られていない）。
【０００５】
ｏｕｔ−ｏｆ−ｏｒｄｅｒ実行を行なうＩＬＰアーキテクチャのＣＰＵでは、フォールスディペンデンシ（ｆａｌｓｅ  ｄｅｐｅｎｄｅｎｃｙ）の回避が重要となる。ｆａｌｓｅ  ｄｅｐｅｎｄｅｎｃｙとは、先行命令において使用されているレジスタを後続命令が再定義する場合に発生する依存関係で、例えば、図２４（ａ）に示すように、命令Ａの使用したレジスタＲ２を、命令Ａの後に実行される命令Ｂが定義するときに、発生する。ここで、レジスタを使用するとはレジスタの値を参照する（読み出す）ことを意味し、レジスタを定義するとはレジスタの値を変更する（書き込む）ことを意味する。図２４（ａ）の命令列を実行する場合、レジスタＲ２の値を命令Ｂで再定義しても命令Ａの結果が正しくなることが保証されるまで命令Ｂの実行を待たなければならないため、命令Ａと命令Ｂを同時に実行できずＩＬＰを下げる原因となる。
【０００６】
スーパスカラでは、ｆａｌｓｅ  ｄｅｐｅｎｄｅｎｃｙの回避のために、レジスタ・リネーミングと呼ばれる方法をとるものが多い。これは、図２４（ａ）を例にすると、命令Ｂにおいて依存しているレジスタＲ２を依存関係の発生しないようなレジスタ（例えば、レジスタＲ７とする）と置き換えることにより、命令Ａと命令Ｂとの間のｆａｌｓｅ  ｄｅｐｅｎｄｅｎｃｙを回避するものである。この際、もとのプログラムで命令Ｂが定義したレジスタＲ２の値を使用している他の命令に関しても、その使用レジスタＲ２をレジスタＲ７に置き換える必要がある。この例の場合、レジスタ・リネーミング後の命令列は、図２４（ｂ）のようになり、命令Ａと命令Ｂとが同時に実行可能となる。
【０００７】
このようにレジスタ・リネーミングによってｆａｌｓｅ  ｄｅｐｅｎｄｅｎｃｙを回避することが従来から行われているが、この処理は実行時に複雑な制御を行なうために、ＣＰＵの周波数を上げられない原因になり、最適な方法とは言えなかった。
【０００８】
レジスタ・リネーミングを行なわずにｆａｌｓｅ  ｄｅｐｅｎｄｅｎｃｙによる速度低下を避けるためには、あらかじめＣＰＵで実行すべき命令列をコンパイラが生成するときにｆａｌｓｅ  ｄｅｐｅｎｄｅｎｃｙが起こりにくいように考慮して生成する必要がある。
【０００９】
しかし、ｏｕｔ−ｏｆ−ｏｒｄｅｒ実行においてどのような順序で命令が実行されるのかは、コンパイル時に静的に見積もることができない。そのため、コンパイル時に静的に見積もった仮想レジスタの生存区間に基づいて仮想レジスタに対して実レジスタを割り当てると、実行時の動的な命令発行により生存区間にずれが生じて、同じ実レジスタが割り当てられた命令間でｆａｌｓｅ  ｄｅｐｅｎｄｅｎｃｙが発生するという問題があった。
【００１０】
【発明が解決しようとする課題】
以上説明したように、ｏｕｔ−ｏｆ−ｏｒｄｅｒ実行を行なうＩＬＰアーキテクチャのプロセッサでは、高速化のためにｆａｌｓｅ  ｄｅｐｅｎｄｅｎｃｙの回避が重要となる。スーパースカラで用いられるレジスタ・リネーミングは、ｆａｌｓｅ  ｄｅｐｅｎｄｅｎｃｙの回避が可能な反面、実行時に複雑な制御を行なうため、結局、高速化に寄与し難いという問題があった。また、従来のコンパイル方法には、ｆａｌｓｅ  ｄｅｐｅｎｄｅｎｃｙを回避することを考慮したものはなかった。一方、従来のＶＬＩＷについてはｏｕｔ−ｏｆ−ｏｒｄｅｒ実行を可能とするものが知られていなかった。
【００１１】
本発明は、上記事情を考慮してなされたもので、ｏｕｔ−ｏｆ−ｏｒｄｅｒ実行をサポートするプロセッサのためのコンパイル方法及びコンパイラ装置であって、ハードウェアによるレジスタ・リネーミング機構なしでｏｕｔ−ｏｆ−ｏｒｄｅｒ実行特有のｆａｌｓｅ  ｄｅｐｅｎｄｅｎｃｙを回避するためのレジスタ割当を可能にしたコンパイル方法及びコンパイラ装置を提供することを目的とする。
【００１２】
【課題を解決するための手段】
本発明（請求項１）は、並行に命令を実行できる複数の演算器を備えるとともに命令配置順序において後続する命令の実行をそれに先行する命令の実行よりも前に開始させることを可能とする機能を有するプロセッサを対象として、与えられたソースプログラムに基づいて該プロセッサで実行可能なオブジェクトプログラムを生成するコンパイル方法であって、前記ソースプログラムを解析して第１の中間コードを生成する解析ステップと、前記第１の中間コードに基づいて命令スケジューリングを行って、演算の一時的な結果を置くレジスタとして仮想レジスタを割り当てて記述され第２の中間コードを生成する命令スケジューリングステップと、前記第２の中間コードおよび前記プロセッサの実レジスタに関する情報に基づいて、前記各仮想レジスタに割り当てるべき実レジスタを決定するレジスタ割り当てステップと、前記仮想レジスタを割り当てられた前記実レジスタで置き換えたオブジェクトプログラムを出力する出力ステップとを有し、前記レジスタ割り当てステップは、前記実レジスタが前記仮想レジスタに割り当てられて使用される区間および該実レジスタの割り当て対象となった該仮想レジスタの使用される区間を解析するステップと、前記区間解析結果および既に発生している命令間依存関係を示す情報をもとに、割り当て対象となった前記仮想レジスタに割り当てても新たな命令間依存関係を生じさせない実レジスタが存在すれば、該実レジスタを優先的に該仮想レジスタに割り当てる候補として決定するステップとを含むことを特徴とする。
【００１３】
命令間依存関係を示す情報（例えば、依存グラフ）は、例えば、初期的には、ソースプログラムの解析（例えば、データ依存解析処理）によって作成される。また、命令間依存関係は、例えば、前記決定するステップにおいて仮想レジスタに対する実レジスタの割り当てが決定された際に、新たな命令間依存関係が発生した場合には、当該新たな命令間依存関係が反映されたものとなる。
【００１４】
好ましくは、割り当て対象となった前記仮想レジスタに割り当てても新たな命令間依存関係を生じさせない実レジスタのうち、実際には既に発生している命令間依存関係とは別の命令間依存関係を生じさせるが該別の命令間依存関係が該既に発生している命令間依存関係によって隠蔽される結果として新たな命令間依存関係を生じさせないものとみなし得る実レジスタの割り当て優先順位を、実際にいかなる命令間依存関係をも生じさせないことにより新たな命令間依存関係を生じさせない実レジスタの割り当て優先順位よりも高くするようにしてもよい。
好ましくは、前記レジスタ割り当てステップは、割り当て対象となった前記仮想レジスタに割り当てると新たな命令間依存関係を生じさせる実レジスタを、割り当て対象となった前記仮想レジスタに割り当てても新たな命令間依存関係を生じさせない実レジスタに次ぐ優先順位で割り当てる候補として決定するステップを更に含むようにしてもよい。
好ましくは、前記新たな命令間依存関係を生じさせる実レジスタのうち、その生存区間と、割り当て対象となった前記仮想レジスタの生存区間との間の距離がより大きい実レジスタほど、より高い優先順位で割り当てる候補として決定するようにしてもよい。
【００１７】
好ましくは、命令間依存関係におけるクリティカルパス長をより小さくする実レジスタほどより高い優先順位で割り当てる候補として決定するようにしてもよい。
【００１８】
好ましくは、前記レジスタ割り当てステップは、前記仮想レジスタの生存区間と重複する部分を持つ他の仮想レジスタの数および前記プロセッサの実レジスタの数に基づいて、実レジスタを割り当てる対象とする仮想レジスタの順番を決定するステップを更に含むようにしてもよい。
【００１９】
好ましくは、前記レジスタ割り当てステップは、割り当て対象となった前記仮想レジスタに対して決定された実レジスタであってその時点で実際に割り当て可能なもののうちで最も優先順位が高い実レジスタを選択し、該仮想レジスタと選択された該実レジスタとの対応関係を記憶するステップを更に含むようにしてもよい。
【００２０】
本発明（請求項８）は、並行に命令を実行できる複数の演算器を備えるとともに命令配置順序において後続する命令の実行をそれに先行する命令の実行よりも前に開始させることを可能とする機能を有するプロセッサを対象として、与えられたソースプログラムに基づいて該プロセッサで実行可能なオブジェクトプログラムを生成するコンパイル装置であって、前記ソースプログラムを解析して第１の中間コードを生成する解析手段と、前記第１の中間コードに基づいて命令スケジューリングを行って、演算の一時的な結果を置くレジスタとして仮想レジスタを割り当てて記述され第２の中間コードを生成する命令スケジューリング手段と、前記第２の中間コードおよび前記プロセッサの実レジスタに関する情報に基づいて、前記各仮想レジスタに割り当てるべき実レジスタを決定するレジスタ割り当て手段と、前記仮想レジスタを割り当てられた前記実レジスタで置き換えたオブジェクトプログラムを出力する出力手段とを具備し、前記レジスタ割り当て手段は、前記実レジスタが前記仮想レジスタに割り当てられて使用される区間および該実レジスタの割り当て対象となった該仮想レジスタの使用される区間を解析する手段と、前記区間解析結果および既に発生している命令間依存関係を示す情報をもとに、割り当て対象となった前記仮想レジスタに割り当てても新たな命令間依存関係を生じさせない実レジスタが存在すれば、該実レジスタを優先的に該仮想レジスタに割り当てる候補として決定する手段とを含むことを特徴とする。
【００２１】
本発明（請求項９）は、並行に命令を実行できる複数の演算器を備えるとともに命令配置順序において後続する命令の実行をそれに先行する命令の実行よりも前に開始させることを可能とする機能を有するプロセッサを対象として、与えられたソースプログラムに基づいて該プロセッサで実行可能なオブジェクトプログラムを生成するために、前記ソースプログラムを解析して第１の中間コードを生成する解析させ、前記第１の中間コードに基づいて命令スケジューリングを行って、演算の一時的な結果を置くレジスタとして仮想レジスタを割り当てて記述され第２の中間コードを生成させ、前記第２の中間コードおよび前記プロセッサの実レジスタに関する情報に基づいて、前記各仮想レジスタに割り当てるべき実レジスタを決定するレジスタ割り当てさせ、前記仮想レジスタを割り当てられた前記実レジスタで置き換えたオブジェクトプログラムを出力する出力ステップとをコンピュータに実行させるプログラムであって、前記レジスタ割り当てステップにおいて、前記実レジスタが前記仮想レジスタに割り当てられて使用される区間および該実レジスタの割り当て対象となった該仮想レジスタの使用される区間を解析させ、前記区間解析結果および既に発生している命令間依存関係を示す情報をもとに、割り当て対象となった前記仮想レジスタに割り当てても新たな命令間依存関係を生じさせない実レジスタが存在すれば、該実レジスタを優先的に該仮想レジスタに割り当てる候補として決定させるためのプログラムを記録したコンピュータ読取り可能な記録媒体を要旨とする。
【００２２】
本発明では、第２の中間コードにおける仮想レジスタに実レジスタを割り当てる際、割り当て対象となった仮想レジスタに割り当てても新たな命令間依存関係を生じさせない実レジスタが存在すれば、該実レジスタを優先的に該割り当て対象となった仮想レジスタに割り当てる候補として決定する（もしくは割り当てることを決定する）。ここで、「レジスタの生存区間」とは、レジスタの値が定義されている点からその値が最後に参照される点までの区間である。レジスタの使われ方によっては、複数の生存区間が存在することもある。
【００２３】
より具体的には、例えば、第２の中間コードから例えばフロー解析・データ依存関係を行い、依存グラフの生成と演算の一時的な結果を置く仮想レジスタの生存区間の計算を行い、これをもとに仮想レジスタに割り当てるべき実レジスタを決定する。仮想レジスタに割り当てるのに最も理想的な実レジスタとは、それを割り当てても依存グラフ中に新たな依存関係が発生しないような実レジスタである。このような条件を満たす実レジスタを例えば依存グラフをもとに決定する。
【００２４】
上記のような実レジスタを割り当てることによって、ｏｕｔ−ｏｆ−ｏｒｄｅｒ実行時のＩＬＰの低下を防ぐことができる。
【００２５】
新たな依存関係が発生しないような実レジスタを割り当てることができれば、命令実行時にレジスタを割り当てたことによる速度低下は発生しない。しかし、実レジスタは有限であり、必ずしもこのような実レジスタが存在するとは限らないため、新たな依存関係が発生するような実レジスタの中から仮想レジスタに割り当てる実レジスタを選択しなくてはならない場合もある。
【００２６】
そこで、このような場合、新しく発生する依存関係は実行時の速度低下の原因となり得るが、仮想レジスタに割り当てることによって新たな依存関係が発生したとしてもその依存関係がｏｕｔ−ｏｆ−ｏｒｄｅｒ実行時に速度低下を引き起こさない、もしくは速度が低下したとしてもそれを最小限にそどめるような実レジスタ（例えば、仮想レジスタに割り当てたときに依存グラフ中に新たな依存関係が発生したとしてもそれらの命令の実行されるタイミングの差が大きくなると予想されるような実レジスタ）を優先的に割り当てるとよい。
【００２７】
本発明によれば、レジスタ割り当てにともなって命令間に新たな依存関係が発生することを防ぎ、もし発生してしまう場合でも新たな依存関係になる命令間の実行されるタイミングをなるべく離れたものにすることができるようになる。このため、ハードウェアによるレジスタ・リネーミング機構を用いることなく、ｏｕｔ−ｏｆ−ｏｒｄｅｒ実行時のＩＬＰの低下の原因となるｆａｌｓｅ  ｄｅｐｅｎｄｅｎｃｙを最小限に抑えることが可能となる。また、ハードウェアによるレジスタ・リネーミングではある限られた命令数に対してしかできないのに対して、コンパイラでおこなえば広範囲なレジスタ解析を行うことができレジスタをより有効活用できるようになる。
【００２８】
なお、装置に係る本発明は方法に係る発明としても成立し、方法に係る本発明は装置に係る発明としても成立する。
【００２９】
また、コンパイラ装置または方法に係る本発明は、コンピュータに当該発明に相当する手順を実行させるための（あるいはコンピュータを当該発明に相当する手段として機能させるための、あるいはコンピュータに当該発明に相当する機能を実現させるための）プログラムを記録したコンピュータ読取り可能な記録媒体としても成立する。
【００３０】
【発明の実施の形態】
以下、図面を参照しながら発明の実施の形態を説明する。
【００３１】
本発明の一実施形態に係る最適化コンパイラについて説明する。
本実施形態の最適化コンパイラは、コンパイルの対象としてｏｕｔ−ｏｆ−ｏｒｄｅｒ実行可能なプロセッサ（ＣＰＵ）を想定している。
なお、本発明はｏｕｔ−ｏｆ−ｏｒｄｅｒ実行可能なスーパースカラプロセッサにも適用可能であり、またｏｕｔ−ｏｆ−ｏｒｄｅｒ実行可能なＶＬＩＷにも適用可能であるが、ｏｕｔ−ｏｆ−ｏｒｄｅｒ実行可能なスーパースカラプロセッサについてはよく知られているのでここでの詳細な説明は省略し、ｏｕｔ−ｏｆ−ｏｒｄｅｒ実行可能なＶＬＩＷについては本コンパイラを説明した後に説明する。
【００３２】
図１に、本実施形態に係る最適化コンパイラの構成例を示す。
【００３３】
本コンパイラは、高級言語で書かれたソースプログラム（１１）を入力とし、解析部１において、入力されたソースプログラム（１１）に対する字句解析・構文解析等を行って第１の中間コード（１２）を生成する。字句解析処理では、入力されたソースプログラム（１１）を形成する文字列を、解析し、語句に分割する。
例えば、構文解析処理では、上記解析により得た語句を上記高級言語の文法に照合して正しいか否かを判別し、誤りがあればこれを通知し実行を止める。正しければ、構文の解析結果を中間コード（１２）として生成する。生成された中間コード（１２）は、主記憶やディスク等の記憶装置に格納される。中間コード（１２）は、通常は、コンパイラ内部で管理され、外部からはアクセスできない。
【００３４】
次に、最適化部２において、中間コード（１２）に対して処理を高速化するための最適化（生成されたオブジェクトプログラムが対象プロセッサで実行されたときの実行速度を高速化するための最適化）を行って最適化された第２の中間コード（１３）を生成する。なお、本実施形態では、最適化部２においては、命令スケジューリング部２１による命令スケジューリングが行われた後にレジスタ割り当て部２２によるレジスタ割り当てが行われるものとする。
より具体的には例えば、最適化部２は、フロー解析、データ依存解析、命令スケジューリング（命令割り当て）、レジスタ割り当て等を行う。フロー解析処理では、中間コード（１２）が生成されると、この中間コード（１２）をもとにしてプログラムの流れの解析を行なう。データ依存解析処理では、プログラムの流れの解析が行われると、中間コード（１２）を構成する各命令のデータ依存解析を行なって依存グラフを作成し、どのような順番で命令割り当てを行なわなければならないかといった制約を明らかにする。命令スケジューリング処理では、中間コードをもとにオブジェクトプログラムの直前段階となる中間コード（仮想レジスタが割り当てられたもの）（１３）を生成する。生成された中間コード（１３）は、主記憶やディスク等の記憶装置に格納される。中間コード（１３）は、通常は、コンパイラ内部で管理され、外部からはアクセスできない。レジスタ割り当て処理では、命令スケジューリング処理により生成された中間コード（１３）について、命令スケジューリング処理で仮に割り当てられていた仮想レジスタを、対象となるプロセッサの持つ実レジスタに割り当て直す、といったレジスタ割り当てを行う。ここでは、仮想レジスタと実レジスタとの対応をレジスタ対応表に登録する。
【００３５】
そして、出力部３において、最適化された中間コード（１３）をもとに対象プロセッサで実行可能な機械語（オブジェクトプログラム）（１４）を生成し出力する。すなわち、出力部３は、上記レジスタ対応表をもとに、最適化された中間コード（１３）の仮想レジスタを実レジスタに置き換えた上で、機械語（１４）として出力する。
【００３６】
機械語（１４）を実行するプロセッサ（すなわち本コンパイラが対象とするプロセッサ）は、複数の並行に動作する演算器を有し、同時に複数の命令の実行が可能であり、また命令のｏｕｔ−ｏｆ−ｏｒｄｅｒ実行機能を有し、さらに本コンパイラにより仮想レジスタに割り当てられる実レジスタを有するものとする。
【００３７】
本実施形態では、グラフカラーリング技法によるレジスタ割り当て方式を例にして説明する。グラフカラーリング技法とは、仮想レジスタに対して実レジスタを割り当てるための手法として最も広く用いられている方式の一つである。
【００３８】
図２に、グラフカラーリング技法によるレジスタ割り当て方式の処理手順の一例を示す。
【００３９】
図２に示されるように、このレジスタ割り当て方式は、レジスタ干渉グラフを生成するフェーズ（ステップＳ１１）から始まる。このグラフにおける「ノード」は「仮想レジスタ」であり、詳しくは後述するように、仮想レジスタの値が定義されている点が別の仮想レジスタの生存区間内であれば、それらの仮想レジスタに対応するノードを「エッジ」で結ぶ。
【００４０】
ここで、図３に、これから実レジスタを割り当てようとしているプログラムの一例（ＭＩＰＳアセンブリ言語により記述されたもの）を示す。
図３の例において、＄１００，＄１０１，＄１０２，＄１０３，＄１０４は仮想レジスタであるとする。また、ここでは、割り当てに使用できる実レジスタは＄１，＄２，＄３の３つのレジスタであるものとする。
【００４１】
図４は、図３の例の場合における命令間の依存関係を示す依存グラフである。
命令（２）“ｌｕｉ  ＄１０１，０ｘ２０００”の実行結果（この場合、実行結果は＄１０１に書かれる）をもとに命令（４）“ｓｗ  ＄１０１，ｔｍｐ１（＄０）”は実行されるため、命令（２）と命令（４）との間には依存関係を示すエッジ（図４では、単方向の矢線で示す）が張られている。同様に、命令（３）“ｌｕｉ  ＄１０２，０ｘ３０００”と命令（５）“ｏｒｉ  ＄１０３，＄１０２，０ｘ１１１１”との間、そして命令（５）と命令（６）“ｓｗ  ＄１０３，ｔｍｐ２（＄０）”との間にも依存関係が存在することが示されている。
【００４２】
図５に、図３の例の場合における各仮想レジスタの生存区間を示す。
図５に示されるように、＄１００は命令（１）の開始時から命令（７）の終了時まで、＄１０１は命令（２）の開始時から命令（４）の開始時まで、＄１０２は命令（３）の開始時から命令（５）の開始時まで、＄１０３は命令（５）の開始時から命令（６）の開始時まで、＄１０４は命令（７）の開始時から命令（７）の終了時までをそれぞれ生存区間とする。
【００４３】
図６は、この場合に生成されるレジスタ干渉グラフである。
＄１００は他の全ての仮想レジスタと生存区間が重複しているため、全ての仮想レジスタに対してエッジが張られる。＄１０１は＄１００以外に＄１０２と生存区間が重複しているため＄１０２との間にもエッジが張られる。＄１０３，＄１０４については＄１００と生存区間が重複しているのみである。
【００４４】
生存区間が重複する仮想レジスタに対しては異なる実レジスタを割り当てる必要がある。そこで、このようにしてつくられたレジスタ干渉グラフにおいて、エッジで結ばれているノードどうしがどれも別の色（実レジスタ）で塗られているように色を塗る（カラーリングする）ことにより（すなわち、エッジで結ばれている両ノードに同じ実レジスタが割り当てられないように）、実レジスタ割り当てを行う。
図６の例で考えると、＄１００に対して実レジスタ＄１が割り当てられた場合、＄１００とエッジで結ばれた＄１０１，＄１０２，＄１０３，＄１０４には＄１以外の実レジスタ（本例の場合、＄２または＄３）を割り当てなければならない。
【００４５】
さて、ステップＳ１１でレジスタ干渉グラフが生成されたならば、次に、レジスタ干渉グラフ中のどのノードから実レジスタを割り当てていくかを決定する。この処理は図２に示すステップＳ１２〜Ｓ１５により行われる。
【００４６】
ステップＳ１２において、レジスタ干渉グラフ内のノードのうち、そのノードから出ているエッジの数（すなわち、そのノードに隣接している他のノードの数）が、割り当て可能な実レジスタの数よりも少ないものを検出し、そのようなノードが存在すれば、ステップＳ１４でそのノードをレジスタ干渉グラフから取り除いてレジスタ干渉グラフを再構築する。ここで、レジスタ干渉グラフの再構築とは、検出されたノードとそれに接しているエッジをレジスタ干渉グラフから削除することを意味している。なお、取り除くノードを検出する順番については任意である（すなわち、上記条件を満たすノードが複数存在する場合には、そのエッジの数の大小にかかわらず、いずれのノードを先に選択しても構わない）。
【００４７】
図６の例においてこの処理を行う場合について説明する。
【００４８】
まず、図６のレジスタ干渉グラフにおいて、ここでは例えば＄１０４について考えてみるものとすると、＄１０４に隣接するノードは＄１００のノードのみであるので、隣接するノードの数は割り当て可能な実レジスタ数“３”より小さい。そこで、まず＄１０４を図６のレジスタ干渉グラフから取り除いて、レジスタ干渉グラフを再構築する。この結果、再構築後のレジスタ干渉グラフは、図７（ａ）のようになる。取り除いたノードに関しては、その取り除いた順に記録をしておく。
【００４９】
なお、ステップＳ１２において隣接ノード数が割り当て可能実レジスタ数未満であるノードが存在しない場合には、ステップＳ１３においてノードをレジスタスピル（ｓｐｉｌｌ）処理の候補として選択し、そのノードをステップＳ１４でレジスタ干渉グラフから取り除いてレジスタ干渉グラフを再構築する。なお、レジスタｓｐｉｌｌの候補を選択する方法については既に種々の方法が提案されている。
【００５０】
以上の処理をステップＳ１５によってレジスタ干渉グラフが空になるまで繰り返す。
【００５１】
なお、ここまでのフェーズにおける処理は従来の技術と同様でよく、周知技術であるのでここでの詳しい説明は省略する（Ａｎｄｒｅｗ  Ｗ．  Ａｐｐｅｌ  ″ｍｏｄｅｒｎ  ｃｏｍｐｉｌｅｒ  ｉｍｐｌｅｍｅｎｔａｔｉｏｎ  ｉｎ  Ｃ″  Ｃｈａｐｔｅｒ１１参照）。
【００５２】
図６の例の場合、上記の＄１０４と同様にして、例えば以降は＄１０３，＄１０２，＄１０１，＄１００の順にノードを取り除いていく。その際に再構築されるレジスタ干渉グラフは、図６の状態から順に、図７（ａ）→図７（ｂ）→図７（ｃ）→図７（ｄ）のようになり、最終的にレジスタ干渉グラフは図７（ｅ）のように空になる。なお、図６の例では、上記の順でレジスタ干渉グラフからノードを取り除いていったとき、レジスタｓｐｉｌｌの候補は空集合である。
【００５３】
ここまでのフェーズによって、仮想レジスタの識別情報と、その仮想レジスタがレジスタ干渉グラフから取り除かれた順番との対応が記録されたことになる。本具体例の場合、仮想レジスタは図８に示すような順でレジスタ干渉グラフから取り除かれたことが記録されている。
【００５４】
なお、上記では、図３のプログラムを処理対象とした場合において、レジスタ干渉グラフから＄１０４，＄１０３，＄１０２，＄１０１，＄１００の順にノードを取り除いた例を示したが、もちろん前述したようにこの順番に限らず、例えば、＄１０２，＄１０３，＄１０１，＄１０４，＄１００の順でも、＄１０４，＄１０３，＄１０２，＄１００，＄１０１の順など、他の順でも構わない。
【００５５】
さて、干渉グラフから全てのノードを選択し終ったならば、ステップＳ１６において、ノードを選択したのとは逆の順序で各ノードに実レジスタを割り当て、そのノードを再びレジスタ干渉グラフに戻していく処理を行う。以下、このステップＳ１６の処理について詳しく説明する。
【００５６】
図９に、このフェーズ（ステップＳ１６）においてノードに割り当てる実レジスタを決定する方式の処理手順の一例を示す。
【００５７】
まず、干渉グラフから取り除いたのとは逆の順に実レジスタを割り当てる仮想レジスタを選択する（ステップＳ２１）。本具体例の場合、＄１００が選択される。
【００５８】
次に、ステップＳ２２〜Ｓ２４において、上記選択されたレジスタに割り当てる実レジスタを決定する。
最初に、新たな依存関係が発生しないような実レジスタが存在するかどうかを検査し、もしそのような実レジスタが存在する場合には、それを優先順序付けされた実レジスタの列に登録する（ステップＳ２２）。
続いて、新たな依存関係を発生させないような実レジスタ以外の実レジスタについては、ｏｕｔ−ｏｆ−ｏｒｄｅｒ実行時に新たな依存関係がなるべく影響しないような実レジスタを優先して優先順序付けされた実レジスタの列に登録する（ステップＳ２３）。
【００５９】
図１０は、優先順序付けされた実レジスタの列である。図１０に示すように、新たな依存関係が発生しないような実レジスタ、新たな依存関係を生じる実レジスタの順に優先順序が高い。詳しくは後述するが、新たな依存関係が発生しないような実レジスタの中でも、冗長な依存関係を生じるが既存の依存関係によって隠蔽可能なものと、冗長な依存関係を生じないものとがあり、前者の方が優先順位が高い。また、新たな依存関係を生じる実レジスタどうしでは、新たな依存関係となる命令間の距離が大きくなるものほど優先順序が高い。
【００６０】
続いて、優先順序付けされた実レジスタの列が生成されたならば、その列からノードに割り当て可能な実レジスタを優先順序に従って検索し、割り当て可能な実レジスタを見つけたならば、それをレジスタ対応表（図１１参照）に登録する（ステップＳ２４）。なお、例えば実レジスタの割り当てに何らかの制約があるような場合などに、割り当て可能でない実レジスタが発生し得る。
【００６１】
そして、割り当ての行われたノードを再びレジスタ干渉グラフに戻し、既に配置されているノードの生存区間と該ノードの生存区間が重複する場合には、そのノード間にエッジを張ることによりレジスタ干渉グラフを再構築する（ステップＳ２５）。
【００６２】
以上の処理をレジスタ干渉グラフから削除されたレジスタが全てレジスタ干渉グラフに再配置されるまで繰り返し行う（ステップＳ２６）。
【００６３】
例えば、図３の例において、＄１００，＄１０１，＄１０２，＄１０３，＄１０４の順にノードに実レジスタを割り当てていくと、レジスタ干渉グラフは図７（ｅ）の空の状態から順に、図７（ｄ）→図７（ｃ）→図７（ｂ）→図７（ａ）→図６のように再構築されていく。
【００６４】
ここで、レジスタ対応表とは、図１１に示すような各仮想レジスタにどの実レジスタを割り当てるかを示すものであり、仮想レジスタの個数分のエントリを持っている。図１１は、仮想レジスタ＄１００，＄１０１，＄１０２，＄１０３，＄１０４に順に実レジスタ＄１，＄２，＄３，＄３，＄２が割り当てられた例を示している。
なお、出力部３においてコンパイラが最終的に機械語（１４）を出力する際には、この表をもとに最適化された中間コード（１３）の仮想レジスタを実レジスタに置き換えた上で、機械語（１４）を出力する。
【００６５】
次に、図２に示すステップＳ１６の処理のうち図９に示すステップＳ２２での処理について詳細に説明する。
【００６６】
なお、説明の便宜上、図１０の「冗長な依存関係を生じるが既存の依存関係によって隠蔽可能な実レジスタの集合」を第１優先レジスタ集合、「冗長な依存関係を生じない実レジスタの集合」を第２優先レジスタ集合、「新たな依存関係を生じる実レジスタの集合」を第３優先レジスタ集合と呼ぶものとする。
【００６７】
図１２に、ステップＳ２２の処理を詳細化した手順の一例を示す。
【００６８】
ここでは、選択されたあるノード（すなわち仮想レジスタ）にある実レジスタを割り当てることによって同一の実レジスタを参照している他の命令との間に新たな依存関係が発生しないような実レジスタか、またはそのような新たな依存関係が発生したとしてもそれらの命令間に既存の依存関係があり当該新たな依存関係は無視できるような実レジスタの検出、およびそれらの実レジスタの優先順序付けされた実レジスタの列への登録を行う。具体的には、ステップＳ３１〜Ｓ３８の一連の処理で図１０の第１優先レジスタ集合に相当する実レジスタの登録を行い、次にステップＳ３９において第２最優先レジスタ集合に相当する実レジスタの登録を行う。
【００６９】
まず、「第１優先レジスタ集合」に相当する実レジスタの登録について説明する。
【００７０】
実レジスタを割り当てるノード（図９に示すステップＳ２１で選択された仮想レジスタ）の生存区間ごとにステップＳ３１〜Ｓ３５の処理を行い、それぞれの生存区間について該ノードに割り当てても新たな依存関係が発生しない実レジスタを検出する。
【００７１】
ステップＳ３１〜Ｓ３３では、既に他の仮想レジスタに割り当てられている実レジスタのうち、該ノードに割り当てても新たな依存関係を生じない可能性のある実レジスタを検出する。ステップＳ３１において該ノードを定義している命令（該仮想レジスタの値を変更する命令）に関して新たな依存関係を生じないような実レジスタの検出を行い、ステップＳ３２において該ノードを使用している命令（該仮想レジスタの値を参照する命令）に関して新たな依存関係を生じないような実レジスタの検出を行う。
【００７２】
該ノードを定義している命令に関しては、選択されたノードの生存区間において該ノードを定義する命令を検索し、生存区間内で該ノードを定義する命令全てに共通な先行依存命令を見つけ、それらの使用レジスタ（実レジスタ）を全て検出する。このとき、先行依存命令として該ノードを定義している命令自身も含める。検出されたそれら実レジスタを、該ノードを定義している命令に関して、該ノードに割り当てても新たな依存関係を生じない可能性のある実レジスタ集合とする。
【００７３】
図３の例において、既に仮想レジスタには＄１００＝＄１，＄１０１＝＄２，＄１０２＝＄３が割り当てられているとして、次に仮想レジスタ＄１０３に割り当てる実レジスタを選択する場合を考える。仮想レジスタ＄１０３の生存区間は、図５に示すように一つだけである。そこで、この生存区間（命令（５）開始時から命令（６）開始時まで）に関して解析を行う。生存区間において仮想レジスタ＄１０３を定義する命令は、命令（５）だけである。図４の依存グラフをみると、命令（５）の先行依存命令は、命令（３）であることが分かる。そこで、定義する命令に共通な先行依存命令は、命令（３）および命令（５）となる。これら２つの命令で使用されるレジスタのうち実レジスタが割り当てられているのは＄１０２だけであるので、フェーズ（ステップＳ３１）で検出される実レジスタ集合は｛＄３｝となる。
【００７４】
同様に、該ノードを使用している命令に関しては、選択された該ノードの生存区間において該ノードを使用する命令を検索し、生存区間内で該ノードを使用する命令全てに共通な後続依存命令を見つけ、それらの定義レジスタ（実レジスタ）を全て検出する。このとき、後続依存命令として該ノードを使用している命令自身も含める。検出されたそれら実レジスタを、該ノードを使用している命令に関して、該ノードに割り当てても新たな依存関係を生じない可能性のある実レジスタ集合とする。
【００７５】
図３の例について引続き考えてみると、＄１０３の生存区間において仮想レジスタ＄１０３を使用する命令は、命令（６）だけである。図４の依存グラフをみると、命令（６）の後続依存命令は存在しない。そこで、使用する命令に共通な後続依存命令は、命令（６）だけとなる。この命令で定義されるレジスタのうち実レジスタが割り当てられているものは存在しないので、フェーズ（ステップＳ３２）で検出される実レジスタ集合は空集合となる。
【００７６】
最後に、ステップＳ３３で、それらの和集合を計算し、既に他の仮想レジスタに割り当てられている実レジスタのうち、該ノードに割り当てても新たな依存関係を生じない可能性のある実レジスタ集合とする。
【００７７】
図３の例に関して｛＄３｝と空集合の和集合を計算してフェーズ（ステップＳ３３）の段階で求められる実レジスタ集合は｛＄３｝となる。
【００７８】
次に、ステップＳ３４，Ｓ３５において上記のレジスタ集合から該ノードに割り当てると新たな依存関係が生じてしまう実レジスタを削除する。ステップＳ３４において該ノードを定義している命令に関して新たな依存関係が生じる実レジスタの検出を行い、ステップＳ３５において該ノードを使用している命令に関して新たな依存関係が生じる実レジスタの検出を行う。
【００７９】
該ノードを定義している命令に関しては、生存区間内で該ノードを定義する命令全てに共通な先行依存命令以外の先行命令を全て見つけ、それらの使用実レジスタを全て検出する。このとき先行命令として該ノードを定義している命令自身も含める。これらを、該ノードを定義している命令に関して、該ノードに割り当ると新たな依存関係を生じてしまう実レジスタ集合とし、ステップＳ３３で求めた実レジスタの集合から削除する。
【００８０】
引続き、図３の例について考えてみる。該ノードを定義する命令全てに共通な先行依存命令以外の先行命令は命令（１），（２），（４）であり、それらの使用する仮想レジスタのうち実レジスタが割り当てられているものは＄１０１であり、＄１０１に割り当てられた実レジスタは＄２であるので、使用実レジスタ集合は｛＄２｝となる。よって、ステップＳ３３で求めた集合｛＄３｝から｛＄２｝を削除して｛＄３｝となる。
【００８１】
同様に、該ノードを使用している命令に関しては、生存区間内で該ノードを使用する命令全てに共通な後続依存命令以外の後続命令を全て見つけ、それらの定義実レジスタを全て検出する。このとき後続命令として該ノードを使用している命令自身も含める。これらを、該ノードを使用している命令に関して、該ノードに割り当ると新たな依存関係を生じてしまう実レジスタ集合とし、ステップＳ３３で求めた実レジスタの集合から削除する。
【００８２】
引続き、図３の例について考えてみる。該ノードを使用する命令全てに共通な後続依存命令以外の後続命令は命令（７）であり、命令（７）の定義する仮想レジスタは＄１０４であるが、＄１０４にはまだ実レジスタが割り当てられていないので、それらの定義する実レジスタ集合は空集合となる。よって、ステップＳ３４で求めた集合｛＄３｝から空集合を削除して｛＄３｝となる。
【００８３】
以上のステップＳ３１〜Ｓ３５の処理を該ノードの全ての生存区間について行う（ステップＳ３６）。
【００８４】
次に、ステップＳ３７において全ての生存区間で新たな依存関係を発生させない実レジスタ集合を検出することによって、既に割り当てがされている実レジスタのうち該ノードに割り当てたときに新たな依存関係を発生されない実レジスタ集合を抽出する。
【００８５】
図３の例に関しては、仮想レジスタ＄１０３の生存区間は一つだけである。よって、ステップＳ３７の時点で求められる実レジスタ集合は｛＄３｝となる。
【００８６】
そして、ステップＳ３８において、図１０の第１優先レジスタ集合に相当する実レジスタの登録を行う。これに当てはまる実レジスタ集合がステップＳ３７までで求めた実レジスタ集合であるので、そこに含まれる実レジスタを最も優先順序が高い実レジスタとして優先順序付けされた実レジスタの列に登録する。
【００８７】
図３の例では、ステップＳ３７の時点で求められる実レジスタ集合が｛＄３｝であるので、実レジスタ＄３を優先順序付けされた実レジスタの列に登録する。
【００８８】
次に、第２優先レジスタ集合に相当する実レジスタの登録について説明する。
【００８９】
ステップＳ３９において、レジスタ干渉グラフ中のノードに一度も割り当てられていない実レジスタを検出する。一度も割り当てされていない実レジスタを該ノードに割り当てても他の命令との間に冗長な依存関係が発生することはない。そこで、このようなレジスタを冗長な依存関係を生じない実レジスタとして検出し、２番目に優先順序が高い実レジスタとして優先順序付けされた実レジスタの列に登録する。このような実レジスタを既に割り当てられた実レジスタよりも優先順序が下であるとしたのは、可能な限り既に割り当てられた実レジスタを再利用し、使用する実レジスタ数を最小限にとどめるようにするためである。
【００９０】
図３の例では、実レジスタ＄１，＄２のうち一度も割り当てられていない実レジスタは存在しないので（既に全ての実レジスタが干渉グラフ中のノードに割り当てられているので）、どのレジスタも優先順序付けされた実レジスタの列に登録されない。
【００９１】
以上がステップＳ２２における処理の詳細な説明である。
【００９２】
次に、上記のステップＳ１６の処理のうちステップＳ２３での処理について詳細に説明する。
【００９３】
ステップＳ２３では、上記のステップＳ２２にて当てはまらなかった実レジスタについて優先順序付け（すなわち、「第３優先レジスタ集合」に相当する実レジスタの登録）を行う。このフェーズでは、上記の選択されたノード（すなわち仮想レジスタ）に実レジスタを割り当てることによって同一の実レジスタを参照している他の命令との間に新たな依存関係が発生するが、依存関係を持つ命令どうしの実行されるタイミングが大きく異なるために、実際のｏｕｔ−ｏｆ−ｏｒｄｅｒ実行時にはその依存関係の影響を受けないかもしくは受けたとしてもそれが小さなものであるような実レジスタを優先させる。
【００９４】
図１３に、ステップＳ２３の処理を詳細化した手順の一例を示す。
【００９５】
ここでは、説明の便宜上、ステップＳ２２の説明とは異なる例を用いる。すなわち、図３のプログラムにおいて、仮想レジスタ＄１０４に割り当てる実レジスタを選択する場合を考える。なお、既に仮想レジスタには＄１００＝＄１，＄１０１＝＄２，＄１０２＝＄３，＄１０３＝＄３が割り当てられているとする。また、仮想レジスタ＄１０４に関してステップＳ２２において検出される実レジスタは存在しない。
【００９６】
最初に、ステップＳ４１において、干渉グラフ中にノード（既に実レジスタが割り当てられたノード）が存在すれば、その全てのノードに関して割り当てられた実レジスタの生存区間を解析する。
【００９７】
図１４は、仮想レジスタ＄１０４に割り当てを行う時点で既に割り当てられている実レジスタおよび仮想レジスタ＄１０４の生存区間である。実レジスタ＄３の生存区間は、＄３が割り当てられた仮想レジスタ＄１０２，＄１０３の生存区間を合わせたものとなっている。
【００９８】
次に、ステップＳ４２において、既に割り当てられた実レジスタの生存区間と実レジスタを割り当てようとしているノードの生存区間との距離を計算する。生存区間どうしの距離とは、一方の生存区間が終了してから他方の生存区間が始まるまでのサイクル数であり、あるレジスタに関して複数の生存区間が存在する場合にはそれらの区間全てに関して距離を計算しその最小値を上記生存区間どうしの距離とする。本実施形態では、命令は中間コードの並びに従って一つずつ実行されると仮定している。
【００９９】
さらに、本実施形態では、計算された生存区間どうしの距離について修正を行うものとする。ここでは、計算された距離がある一定値Ｘ以上となった場合は、その距離を一定値Ｘであるとする。一般的に、Ｘの値としては、それ以上距離が離れていれば依存の影響は無くなると考えられるような値を利用する。
【０１００】
なお、生存区間が重なっている（干渉している）ものに関しては、その距離を負数とするものとする。
【０１０１】
このようにして、全ての実レジスタに関して該ノードの生存区間との距離が計算される。
【０１０２】
ここでの具体例について考えてみる。一定値Ｘが１０であるとすると、仮想レジスタ＄１０４と実レジスタとの距離はそれぞれ次のようになる。ただし、レジスタの生存区間どうしの距離をｄｉｓｔ（ｒｅｇ１，ｒｅｇ２）で表わしている。
ｄｉｓｔ（＄１，＄１０４）＝−１
ｄｉｓｔ（＄２，＄１０４）＝３
ｄｉｓｔ（＄３，＄１０４）＝１
ここで、距離が−１とは生存区間が重複することを意味する。
【０１０３】
次に、ステップＳ４３においてノードに割り当てる実レジスタの優先順序付けをする。順序付けは、生存区間どうしの距離が大きいものを優先させるように行う。
【０１０４】
ただし、距離が一定値Ｘの実レジスタが複数あった場合には、一度でも他のノードに対して割り当てがされた実レジスタをその中で優先されるものとする。このようにすることにより、実レジスタの再利用が促進され、使用する実レジスタ数を可能な限り削減できるようになる。また、距離が負数の実レジスタは、ノードに割り当てることが不可能であるため、優先順序付けの対象から除外する。この処理をステップＳ４４で行う。
【０１０５】
ここでの具体例について考えてみると、仮想レジスタ＄１０４に割り当てるための実レジスタの優先順序は、優先度の高い順に＄２，＄３となる。
【０１０６】
最後に、ステップＳ４５において、以上の処理によって定まった優先順序に従って実レジスタを優先順序付けされた実レジスタの列に登録する。
【０１０７】
なお、このステップＳ２３の例では、＄１００＝＄１，＄１０１＝＄２，＄１０２＝＄３，＄１０３＝＄３のように仮想レジスタが実レジスタに割り当てられている場合に仮想レジスタ＄１０４に割り当てる実レジスタ（第３優先レジスタ集合に相当するもの）の優先順位は＄２，＄３となったが、ステップＳ２２の例、すなわち＄１００＝＄１，＄１０１＝＄２，＄１０２＝＄３と割り当てられている場合に仮想レジスタ＄１０３に割り当てる実レジスタを選択する例における実レジスタの優先順位については、ステップＳ２２で図１０の第１優先レジスタ集合に＄３が登録された（第２優先レジスタ集合は空集合）後、残りの＄１，＄２に関して距離を計算すると、
ｄｉｓｔ（＄１，＄１０３）＝−１
ｄｉｓｔ（＄２，＄１０３）＝１
となるため、それらの間の優先順位は＄２，＄１の順となる。
【０１０８】
以上がステップＳ２３における処理の詳細な説明である。
【０１０９】
このようにして、ステップＳ２２，Ｓ２３で優先順序付けされた実レジスタの列を生成し、ステップＳ２４においてその中から優先度の高い順に該ノードに割り当て可能な実レジスタを検索し割り当てを行う。
【０１１０】
例えば、ステップＳ２２で用いた例（＄１００＝＄１，＄１０１＝＄２，＄１０２＝＄３と割り当てられている場合に仮想レジスタ＄１０３に割り当てる実レジスタを選択する例）では、最終的に仮想レジスタ＄１０３に割り当てる実レジスタの優先順位は［＄３，＄２］となり、ステップＳ２４において、＄３，＄２の順に割り当て可能なものを見つけ、この例の場合には、＄３が選択され、これがレジスタ対応表に登録される。
【０１１１】
また、例えばステップＳ２３で用いた例（＄１００＝＄１，＄１０１＝＄２，＄１０２＝＄３，＄１０３＝＄３と割り当てられている場合に仮想レジスタ＄１０４に割り当てる実レジスタを選択する例）では、最終的に仮想レジスタ＄１０４に割り当てる実レジスタの優先順位は［＄２，＄３］となり、ステップＳ２４において、＄２，＄３の順に割り当て可能なものを見つけ、この例の場合には、＄２が選択され、これがレジスタ対応表に登録される。
【０１１２】
この結果、図１１に示すような内容のレジスタ対応表が得られる。
【０１１３】
ここで、本実施形態による処理結果の一例と、従来技術による処理結果の一例とを比較する。
【０１１４】
図１５（ａ）は、（本実施形態の優先順序付けを実レジスタに対して行わないような）従来の方法によって図３の仮想レジスタに対してレジスタ割り当てを行ったときに出力されるコードの一例である。この場合、＄１００＝＄１，＄１０１＝＄２，＄１０２＝＄３，＄１０３＝＄２，＄１０４＝＄２というように仮想レジスタに対して実レジスタが割り当てられている。
このコードにおいて命令間の依存関係は、命令（４）と命令（５）の間、および命令（６）と命令（７）の間に新たなｆａｌｓｅ  ｄｅｐｅｎｄｅｎｃｙが発生するため、図１５（ｂ）のようになってしまう。
【０１１５】
一方、図１６（ａ）は、本実施形態を用いて優先順序付けされた実レジスタを図３の仮想レジスタに対して割り当てた場合に出力されるコードである。この場合、＄１００＝＄１，＄１０１＝＄２，＄１０２＝＄３，＄１０３＝＄３，＄１０４＝＄２というように仮想レジスタに対して実レジスタが割り当てられている。
このコードでは命令間の依存関係は、命令（４）と命令（７）の間に新たなｆａｌｓｅ  ｄｅｐｅｎｄｅｎｃｙが発生するため、図１６（ｂ）のようになる。これは図１５（ｂ）と比較すると命令間の依存関係が少なくスケジューリングに対する自由度も高い。
【０１１６】
このように命令間の依存関係を考慮したレジスタ割り当てを行った結果、レジスタ割り当てにともなうＩＬＰの低下を防ぐことができる。また、図１６の命令（４）と命令（７）の間のｆａｌｓｅ  ｄｅｐｅｎｄｅｎｃｙに関しても、これらの命令の実行されるタイミングが離れているため、この依存関係がｏｕｔ−ｏｆ−ｏｒｄｅｒ実行に対して与える影響は小さい。
【０１１７】
ところで、上記では図１０の第３優先レジスタ集合の優先順序を決定する際の優先順序の基準としてレジスタの生存区間どうしの距離を利用したが、他の基準をもとに優先順序を決定するようにしてもよい。
以下では、他の基準の一例としてクリティカルパス長をもとに優先順序を決定する場合について説明する。なお、この場合、前述した処理のうち図９のステップＳ２３や図１３の処理が相違する以外は同様であるので、ここでは、相違する点を中心として説明する。
【０１１８】
クリティカルパスとは、図４に示すような依存グラフにおける最長パスである。パス長とは、そのパスの処理に必要なサイクル数のことを示す。つまり、クリティカルパス長とは、演算器が無限にあると仮定して命令列を並列に実行したときに、その命令列全体が処理を終了するのに最低限必要なサイクル数を示している。なお、１つの命令の実行には複数サイクル要することもあり、本発明は１命令の実行に複数サイクルを要する場合も包含するが、以下では、説明を分かり易くするために、１命令が１サイクルで処理されるとした場合について説明する。
【０１１９】
図１７に、クリティカルパス長を基準としたときの優先順序付けされた実レジスタの列を示す。図１７に示すように、新たな依存関係が発生しないような実レジスタ、新たな依存関係を生じる実レジスタの順に優先順序が高い（この点は、前述と同様である）。また、ここでは、新たな依存関係を生じる実レジスタどうしでは、新たな依存関係が発生したときの命令列全体のクリティカルパス長が小さくなるものほど優先順序が高い。
【０１２０】
このような優先順序付けされた実レジスタの列を作成するには、前述の形態ではレジスタの生存区間どうしの距離ｄｉｓｔ（ｒｅｇ１，ｒｅｇ２）を用いて仮想レジスタに割り当てる実レジスタの優先順序付けを行ったのに対し、本形態では、仮想レジスタｒｅｇｐに実レジスタｒｅｇｒを割り当てたときのクリティカルパス長ｃｐ＿ｌｅｎｇｔｈ（ｒｅｇｒ，ｒｅｇｐ）を用いて実レジスタの優先順序付けを行う。仮想レジスタに実レジスタを割り当てると新たな依存関係が発生するためクリティカルパス長が変わることがあるが、この値は割り当てる実レジスタによって異なる。クリティカルパス長が小さいほど命令列全体の処理時間を短縮できる可能性は高くなるため、割り当て後のクリティカルパス長が小さくなるような実レジスタを優先させる。ただし、生存区間が重なっている（干渉している）ものに関してはノードに割り当てることが不可能であるため、優先順序付けの対象から除外する。
【０１２１】
さて、＄１００，＄１０１，＄１０２，＄１０３，＄１０４の順に実レジスタを割り当てるものとし、また実レジスタは＄１，＄２，＄３の３つとする。本形態でも先の例と同様に新たな依存関係を生じずに＄１００，＄１０１，＄１０２，＄１０３には実レジスタを割り当てることができる。つまり、仮想レジスタには＄１００＝＄１，＄１０１＝＄２，＄１０２＝＄３，＄１０３＝＄３というように実レジスタが割り当てられているものとする。
【０１２２】
ここで、＄１０４への実レジスタの割り当てを行う場合を考える。
【０１２３】
まず、前述の通り、第１および第２優先レジスタ集合は空集合となる。
【０１２４】
次に、第３優先レジスタ集合に相当する実レジスタとその優先順位をクリティカルバス長をもとに求める。
【０１２５】
この場合、＄１については、＄１０４と＄１は生存区間が重なっている（干渉している）ため、優先順序付けの対象から除外される。
【０１２６】
＄２については、＄１０４に＄２を割り当てると命令（４）と命令（７）の間に新たにｆａｌｓｅ−ｄｅｐｅｎｄｅｎｃｙが発生するため、依存グラフは図１８（ａ）のようになり、このときのクリティカルパス長は３となる。
【０１２７】
一方、＄３については、＄１０４に＄３を割り当てると、命令（６）と命令（７）の間に新たにｆａｌｓｅ−ｄｅｐｅｎｄｅｎｃｙが発生するため、依存グラフは図１８（ｂ）のようになり、このときのクリティカルパス長は４となる。
【０１２８】
したがって、
ｃｐ＿ｌｅｎｇｔｈ（＄２，＄１０４）＝３
ｃｐ＿ｌｅｎｇｔｈ（＄３，＄１０４）＝４
となり、クリティカルパス長が小さいものから優先させると、仮想レジスタ＄１０４に割り当てるための実レジスタの優先順序は優先度の高い順に＄２，＄３となる。
【０１２９】
そして、最終的に仮想レジスタ＄１０４に割り当てる実レジスタの優先順位は［＄２，＄３］となり、ステップＳ２４において、＄２，＄３の順に割り当て可能なものを見つけ、この例の場合には、＄２が選択され、これがレジスタ対応表に登録される。この結果、本例の場合、図１１と同様の実レジスタ割り当ての結果となる。
【０１３０】
ところで、本実施形態では、図１０や図１７の優先順序付けされた実レジスタの列における第１〜第３優先レジスタ集合の各々について相当するレジスタを求めてから、図９に示すステップＳ２４において、該優先順序付けされた実レジスタの列から対象ノードに割り当て可能な実レジスタを優先順序に従って検索し、その実レジスタが割り当て可能か否かを判断し、割り当て可能であればそれを選択してレジスタ対応表（図１１参照）に登録するようにした。
その代わりに、その都度割り当て可能か否かを判断して、割り当て可能なレジスタが得られた時点でその仮想レジスタに対する実レジスタ割り当て処理を終了するようにしてもよい。すなわち、第１優先レジスタ集合に相当する実レジスタが得られたならば、それが割り当て可能か否かを判断し、割り当て可能の場合にはそれを選択して以降の処理は省く。割り当て可能でない場合または第１優先レジスタ集合が空集合の場合には第２優先レジスタ集合についての処理を行い、第２優先レジスタ集合に相当する実レジスタが得られたならば、それが割り当て可能か否かを判断し、割り当て可能の場合にはそれを選択して以降の処理は省く。割り当て可能でない場合または第２優先レジスタ集合が空集合の場合には第３優先レジスタ集合についての処理を行う。
なお、仮に割り当て可能か否かを判断する必要がない場合には、第１優先レジスタ集合に相当する実レジスタが得られた場合にはそれを選択して以降の処理は省き、そうでない場合には第２優先レジスタ集合についての処理を行い、その処理においても実レジスタが定まらないときに、第３優先レジスタ集合についての処理を行うようにしてもよい。
【０１３１】
以上の実施形態ではグラフカラーリング手法によるレジスタ割り当てを用いた場合について説明したが、本発明は、グラフカラーリング手法に限定されるものではなく、様々なレジスタ割り当て手法において仮想レジスタに割り当てるべき実レジスタを複数の候補の中から選択する場合に適用可能である。
【０１３２】
さて、前述したように、本発明はｏｕｔ−ｏｆ−ｏｒｄｅｒ実行可能なＶＬＩＷにも適用可能であるが、従来はｏｕｔ−ｏｆ−ｏｒｄｅｒ実行可能なＶＬＩＷ自体がなかったので、以下では、ｏｕｔ−ｏｆ−ｏｒｄｅｒ命令発行ＶＬＩＷ（以下、ダイナミックＶＬＩＷ）プロセッサに係る発明の実施形態について説明する。
【０１３３】
なお、以下では、１つのＶＬＩＷ命令を構成している個々の命令をアトムと呼ぶことがある。図１９に、１つのＶＬＩＷ命令の一例を示す。これは、３つのアトムから１つのＶＬＩＷ命令が構成される例である。また、ＶＬＩＷ命令を構成する個々のアトムが入るべき位置を、スロットと呼ぶ。
【０１３４】
さて、命令レベルの並列度を上げる方法としてコンパイル時にスタティックに資源を割り当て使用するＶＬＩＷによる方法と、実行時に資源の割り当てをダイナミックに行うスーパースカラーの方法とがある。ＶＬＩＷ方式ではコンパイラにより同時実行可能な命令を検出するので、実行時に検出するメカニズムが必要なく、実行時のハードウェアが単純化され、高い周波数が達成される可能性がある。しかし、コンパイラにより同時実行可能な命令を検出する方法にはコンパイラでは完全に予測できないあるいは現実的に予測不可能なパラメータが存在する。
【０１３５】
このダイナミックＶＬＩＷ方式は、スーパースカラー方式とＶＬＩＷ方式の中間に位置するもので、基本的にはＶＬＩＷ方式でありながら一部をダイナミックに実行することにより、コンパイラ時に予測困難な事項に対してもある程度ダイナミックに動作し、プロセッサ全体を止めることなく処理を進めることができるようにしたものである。つまり、このダイナミックＶＬＩＷ方式は、ハードウェアとソフトウェア（コンパイラ）の新たな最適点を求め、性能を最適化することを目指したものである。
【０１３６】
ダイナミックＶＬＩＷ方式によるプロセッサの基本的な構成においては、フェッチしたが実行できないアトムを、後続のアトムを先行して実行させることを可能とするために一時待避させておくためのペンディングキューを備え、各レジスタの使用状況に関する情報を記憶・管理し、この情報に基づいて、フェッチしたアトムの実行可否の判断を行い、実行可能であればフェッチしたアトムを実行し、実行可能でないならばフェッチしたアトムをペンディングキューに蓄積するとともに、ペンディングキューに蓄積されているアトムの実行可否の判断を行い、実行可能であれば該アトムを実行することにより、先行するアトムが直ちには実行できない場合にこれを一時待避しておき後続のアトムを先に実行できるようにしている。
【０１３７】
このダイナミックＶＬＩＷ方式は、ＶＬＩＷ命令ごとにアトムをフェッチしていく点は従来のｉｎ−ｏｒｄｅｒ命令発行ＶＬＩＷと同様であるが、同時にフェッチしたＶＬＩＷ命令の複数のアトムのうちに実行できないものがでてきた場合に、従来のｉｎ−ｏｒｄｅｒ命令発行ＶＬＩＷでは常にフェッチを中断することになるが、このダイナミックＶＬＩＷ方式ではフェッチを中断させないで済む可能性がでてくるわけである。
【０１３８】
図２０は、このようなダイナミックＶＬＩＷプロセッサの基本的な構成を表す概念的な図である。図２０では、２つのパイプラインユニット（１００６−１，１００６−２）を持つ場合を例としている。このダイナミックＶＬＩＷプロセッサは、命令列からフェッチしたアトムが直ちには実行できない場合にこれを実行待ちとして待避させておくためのペンディングキュー（Ｐｅｎｄｉｎｇ  Ｑｕｅｕｅ）というスロット毎に独立に設けたキュー１００２−１，１００２−２と、各レジスタの使用状況に関する情報を各レジスタ毎に管理するためのスコアボード１００４というテーブルを用いて、ｏｕｔ−ｏｆ−ｏｒｄｅｒを実現している例である。
【０１３９】
フェッチされたＶＬＩＷ命令の複数のアトムのうち実行されないアトムは、実行可能になるまで、対応するペンディングキューに保存される。
【０１４０】
ペンディングキューはＦＩＦＯ（先入れ先出し型のバッファ）で構成すると好ましい。ペンディングキューをＦＩＦＯで構成すると、ペンディングキューに蓄積された先頭のアトムから順に実行されることになり、この点が従来のスーパースカラーのリオーダーバッファの場合と異なってくる。つまり、実行可能なアトムがペンディングキューに存在するのに実行できない場合があるという性能上の制約と引き換えに、ハードウェアを非常に単純化させて高速化を図ることができる。
【０１４１】
さらに、ペンディングキューは、ＶＬＩＷ命令を構成する個々のアトムが入るべきスロットごとに設けるのが好ましい。例えば、図２０に例示したＶＬＩＷ命令の形式を使う場合には、スロットが２つあるので、ペンディングキューは２つ用意されることになる。そして、フェッチされたＶＬＩＷ命令のうち実行されないアトムは、そのスロットに対応するペンディングキューに投入する。このようにスロットごとにペンディングキューが存在し、スロット間をまたぐことがないことも、ハードウェアを単純化して高速化を図るための制限の一つになる。
【０１４２】
各サイクル／各スロットにおいて、実行の機会を与えるアトムには、通常の命令列からフェッチしたアトムと、ペンディングキューが空でない場合におけるペンディングキューからのアトムとがあり得るが、（１）フェッチしたアトム、（２）ペンディングキューのアトムの順に、実行が優先される。
【０１４３】
実行の機会が与えられたアトム（フェッチしたアトムまたはペンディングキューの先頭にあるアトム）が実行可能かどうかについての判定は、スコアボードの内容（当該アトムに関連するレジスタの使用状況）に基づいて行い、基本的には、当該アトムが使うレジスタが当該アトムにとって利用可能でないときは、当該アトムが実行できないと判定される。
【０１４４】
以上のように、本ダイナミックＶＬＩＷ方式では、直ちには実行できないアトムをペンディングキューに一時待避しておき、それが実行可能になったら実行するという方法で、ｏｕｔ−ｏｆ−ｏｒｄｅｒを実現している。
【０１４５】
なお、このダイナミックＶＬＩＷ方式では、レジスタについては、プロセッサ内にリネーミングの構成を持たず、コンパイラによりレジスタを割り当てるものとする。レジスタリネーミングを行わないようにすることで、ハードウェアを単純にすることができる。なお、このために、ＶＬＩＷの命令列を生成するコンパイラとして、ｆａｌｓｅ  ｄｅｐｅｎｄｅｎｃｙが起こらないようにレジスタ割付を行うものが用いられる（公知のコンパイラで構わない）。
【０１４６】
次に、このダイナミックＶＬＩＷの作用効果を示すために、簡単な例を使ってその概要を説明する。
【０１４７】
図２１に、実行される命令列の例として、一つのＶＬＩＷ命令に二つのアトムが含まれる場合の命令列の一例を示す。
【０１４８】
なお、図２１では、各アトムは、ニーモニック、ディスティネーション（ｄｅｓｔ）のレジスタ、第１のソース（ｓｒｃ１）のレジスタ、第２のソース（ｓｒｃ２）のレジスタの順番で表記するものとする。
【０１４９】
図２１に示されるように、この命令列は、
ＡＤＤ  Ｒ８，Ｒ９，Ｒ１０とＬＤ  Ｒ５，（Ｒ３）、
ＬＤＩ  Ｒ１８，１０００とＡＤＤＩ  Ｒ１３，Ｒ９，４、
ＡＤＤ  Ｒ２１，Ｒ１８，Ｒ９とＳＵＢ  Ｒ１１，Ｒ５，Ｒ８、
ＬＳＲ  Ｒ２２，Ｒ２１，５  とＯＲＩ  Ｒ２４，Ｒ２１，０ｘＦＦ、
ＳＵＢＩ  Ｒ２５，Ｒ２４，５とＮＯＰ、
ＢＲＺ  Ｒ１１，Ｒ０，ＲＯＯＰ＿ＥＸＴとＮＯＰ
が、この順に１組ずつフェッチされることになる。
【０１５０】
なお、ＮＯＰアトムは、実際になにも動作を生じさせない命令であってもよいし、ＡＤＤ等を実行するが結果としてなにも変化が起こらないような命令であってもよい。
【０１５１】
以下、図２１に例示した命令列が従来のｉｎ−ｏｒｄｅｒ命令発行ＶＬＩＷ方式とダイナミックＶＬＩＷ方式とでそれぞれ実行された場合について比較して説明する。
【０１５２】
図２２に、この命令列が従来のｉｎ−ｏｒｄｅｒ命令発行ＶＬＩＷ方式で実行された場合の様子を示し、図２３に、この命令列がダイナミックＶＬＩＷ方式で実行された場合の様子を示す。
【０１５３】
図２２と図２３の例では、最初のＶＬＩＷ命令の第２スロットのアトムであるＬＤ（ロード命令）が１次キャッシュでミスを起こし、該当するデータが２次キャッシュに存在したために、これをロードしてくるのに４サイクル必要となったものとする。
【０１５４】
図２２に示されるように、この命令列を従来のｉｎ−ｏｒｄｅｒ命令発行ＶＬＩＷ方式により実行した場合、サイクル１では、第１スロットのＡＤＤ  Ｒ８，Ｒ９，Ｒ１０と第２スロットのＬＤ  Ｒ５，（Ｒ３）が実行されるが、第２スロットのＬＤがキャシュミスを起こしたため、サイクル２〜５の４サイクルは第１、第２スロットともにＬＤのミスによるストールになり（この間、フェッチが中断する）、その後は、順次命令が実行され、結局、１０サイクルを要して処理が完了している。
【０１５５】
次に、図２３に示されるように、この命令列をダイナミックＶＬＩＷ方式により実行した場合、まず、サイクル１では、第１スロットのＡＤＤ  Ｒ８，Ｒ９，Ｒ１０と第２スロットのＬＤ  Ｒ５，（Ｒ３）が実行され、ＬＤがキャシュミスを起す。次のサイクルからは、このＬＤのディスティネーション・レジスタであるＲ５を使用するアトムは、ＬＤが完了するまで実行できなくなる（このレジスタＲ５の状況は、スコアボードに反映される）。
【０１５６】
サイクル２では、ＶＬＩＷ命令の各アトムはＬＤのディスティネーション・レジスタであるＲ５を使用しないため、ＬＤＩ  Ｒ１８，１０００とＡＤＤＩ  Ｒ１３，Ｒ９，４が実行される。
【０１５７】
サイクル３では、第１スロットのＡＤＤ  Ｒ２１，Ｒ１８，Ｒ９はＲ５を使用しないため実行されるが、第２スロットのＳＵＢ  Ｒ１１，Ｒ５，Ｒ８は、Ｒ５を第１のソースレジスタとして参照するので、実行できずにペンディングキューへ投入される（スコアボードを参照することによってＲ５が使用できないことが分かることから、実行できないことが分かる）。また、次のサイクルからは、ＳＵＢのディスティネーション・レジスタであるＲ１１を使用するアトム（このＳＵＢを除く）は、このＳＵＢが完了するまで実行できなくなる（このレジスタＲ１１の状況も、スコアボードに反映される）。
【０１５８】
サイクル４では、Ｒ５もＲ１１も使用されないので、ＬＳＲ  Ｒ２２，Ｒ２１，５とＯＲＩ  Ｒ２４，Ｒ２１，０ｘＦＦが実行される。
【０１５９】
サイクル５では、Ｒ５もＲ１１も使用されないので、ＳＵＢＩ  Ｒ２５，Ｒ２４，５とＮＯＰが実行される。
【０１６０】
ここで、ＬＤが完了し、次のサイクルからは、Ｒ５が使用可能となる（このレジスタＲ５の状況も、スコアボードに反映される）。
【０１６１】
サイクル６では、まず、第１スロットのＢＲＺ  Ｒ１１，Ｒ０，ＲＯＯＰ＿ＥＸは、Ｒ１１をディスティネーションとするので、実行できないことがわかる。なお、詳しくは後述するが、ディスティネーションとするレジスタが使用できない場合には、ペンディングキューへは投入せずに、実行可能になるのを待つ（フェッチを中断する）。従って、このサイクルは、空きスロットとなる。フェッチが中断するので、フェッチした第２スロットの命令も実行が保留される。
【０１６２】
ここで、第２スロットでは、フェッチの中断が発生したので、ペンディングキュー中のアトムに実行の機会が与えられる。ペンディングキューにあるＳＵＢ  Ｒ１１，Ｒ５，Ｒ８は、先のＬＤが完了し、Ｒ５が使用可能となっているので、実行可能であり（スコアボードを参照することによって実行できることが分かる）、したがってＳＵＢ  Ｒ１１，Ｒ５，Ｒ８がペンディングキューから取り出され、実行される。
【０１６３】
ここで、ＳＵＢが完了し、次のサイクルからは、Ｒ１１が使用可能となる（このレジスタＲ１１の状況も、スコアボードに反映される）。
【０１６４】
サイクル７では、第１スロットで実行を待っていたＢＲＺ  Ｒ１１，Ｒ０，ＲＯＯＰ＿ＥＸＴが、実行可能となって、実行され、第２スロットでは実行を待っていたＮＯＰが実行される。
【０１６５】
この結果、７サイクルを要して処理が完了したことになる。
【０１６６】
以上のように、従来のｉｎ−ｏｒｄｅｒ命令発行ＶＬＩＷ方式では１０サイクルかかるところが、ダイナミックＶＬＩＷ方式ではＬＤアトムによるミスの期間中に他のアトムが実行できるｏｕｔ−ｏｆ−ｏｒｄｅｒの機能により、７サイクルで実行が完了し、高速化できることがわかる。
【０１６７】
このようなｏｕｔ−ｏｆ−ｏｒｄｅｒ実行可能なＶＬＩＷ方式によるプロセッサを対象とするコンパイラに対しても本発明は適用可能である。
【０１６８】
なお、本実施形態におけるコンパイラはソフトウェアとしても実現可能である。また、本実施形態におけるコンパイラは、コンピュータに所定の手段を実行させるための（あるいはコンピュータを所定の手段として機能させるための、あるいはコンピュータに所定の機能を実現させるための）プログラムを記録したコンピュータ読取り可能な記録媒体としても実施することもできる。
【０１６９】
本発明は、上述した実施の形態に限定されるものではなく、その技術的範囲において種々変形して実施することができる。
【０１７０】
【発明の効果】
本発明によれば、レジスタ割り当てにともなって命令間に新たな依存関係が発生することを防ぎ、もし発生してしまう場合でも新たな依存関係になる命令間の実行されるタイミングをなるべく離れたものにすることができるようになる。そのため、ハードウェアによるレジスタ・リネーミング機構を用いることなく、ｏｕｔ−ｏｆ−ｏｒｄｅｒ実行時のＩＬＰの低下の原因となるｆａｌｓｅ  ｄｅｐｅｎｄｅｎｃｙを最小限に抑えることが可能となる。また、ハードウェアによるレジスタ・リネーミングではある限られた命令数に対してしかできないのに対して、コンパイラでおこなえば広範囲なレジスタ解析を行うことができレジスタをより有効活用できるようになる。
【図面の簡単な説明】
【図１】本発明の一実施形態に係るコンパイラの構成例を示す図
【図２】グラフカラーリングの手順を示すフローチャート
【図３】プログラムの一例を示す図
【図４】依存グラフを示す図
【図５】各仮想レジスタの生存区間を示す図
【図６】レジスタ干渉グラフを示す図
【図７】レジスタ干渉グラフの再構築を説明するための図
【図８】仮想レジスタがレジスタ干渉グラフから取り除かれた順番の記録を示す図
【図９】仮想レジスタに対して実レジスタを割り当てる処理の手順の一例を示すフローチャート
【図１０】優先順序付けされた実レジスタの列の一例を示す図
【図１１】レジスタ対応表の一例を示す図
【図１２】仮想レジスタに割り当てても新たな依存関係を生じない実レジスタに関する処理の手順の一例を示すフローチャート
【図１３】仮想レジスタに割り当てると新たな依存関係を生じない実レジスタに関する処理の手順の一例を示すフローチャート
【図１４】対象仮想レジスタと実レジスタの生存区間を示す図
【図１５】従来方法による処理結果の一例を示す図
【図１６】本実施形態における処理結果の一例を示す図
【図１７】優先順序付けされた実レジスタの列の他の例を示す図
【図１８】クリティカルバス長を用いて実レジスタ割り当てを行う場合のクリティカルパスの例を示す図
【図１９】ＶＬＩＷ命令の一例を示す図
【図２０】ダイナミックＶＬＩＷ方式について説明するための図
【図２１】ＶＬＩＷ命令の命令列の一例を示す図
【図２２】図２１の命令列を従来のＶＬＩＷ方式で実行した場合について説明するための図
【図２３】図２１の命令列をダイナミックＶＬＩＷ方式で実行した場合について説明するための図
【図２４】命令間の依存関係について説明するための図
【符号の説明】
１…解析部
２…最適化部
３…出力部
２１…命令スケジューリング部
２２…レジスタ割り当て部
１００２−１，１００２−２…ペンディングキュー（Ｐｅｎｄｉｎｇ  Ｑｕｅｕｅ）
１００４…スコアボード
１００６−１，１００６−２…パイプラインユニット
【図１】
0003648402.tif 000002
【図２】
0003648402.tif 000003
【図３】
0003648402.tif 000004
【図４】
0003648402.tif 000005
【図５】
0003648402.tif 000006
【図６】
0003648402.tif 000007
【図７】
0003648402.tif 000008
【図８】
0003648402.tif 000009
【図９】
0003648402.tif 000010
【図１０】
0003648402.tif 000011
【図１１】
0003648402.tif 000012
【図１２】
0003648402.tif 000013
【図１３】
0003648402.tif 000014
【図１４】
0003648402.tif 000015
【図１５】
0003648402.tif 000016
【図１６】
0003648402.tif 000017
【図１７】
0003648402.tif 000018
【図１８】
0003648402.tif 000019
【図１９】
0003648402.tif 000020
【図２０】
0003648402.tif 000021
【図２１】
0003648402.tif 000022
【図２２】
0003648402.tif 000023
【図２３】
0003648402.tif 000024
【図２４】
0003648402.tif 000025