(57)【要約】【課題】  変数の値を効率的に参照させることができる。【解決手段】  プログラムのロード命令を最適化するコンパイラであって、プログラム中の対象ロード命令から実行順序を遡る全ての実行経路のそれぞれについて、ロード命令が実行された場合に当該ロード命令により読み出されたデータをレジスタに保持して対象ロード命令の実行位置に伝達可能である、当該ロード命令の実行可能範囲を検出する実行可能範囲検出手段と、実行経路のそれぞれについて、実行可能範囲において対象ロード命令に先立って実行される、対象ロード命令と同一アドレスから同一データを読み出す先行ロード命令が存在しない場合に、実行可能範囲内に先行ロード命令を生成する命令生成手段と、対象ロード命令を削除し、対象ロード命令により読み出されたデータを使用する命令を先行ロード命令により読み出されたデータを使用する命令に置換する命令置換手段とを備えるコンパイラを提供する。【選択図】図１
2005078474.tif 000002
【特許請求の範囲】
【請求項１】
最適化対象の対象プログラムにおいて、メモリからレジスタにデータを読み出すロード命令を最適化する最適化コンパイラであって、
前記対象プログラム中の最適化対象の対象ロード命令から実行順序を遡ることにより到達する全ての実行経路のそれぞれについて、ロード命令が実行された場合に当該ロード命令により読み出されたデータをレジスタに保持して前記対象ロード命令の実行位置に伝達可能である、当該ロード命令の実行可能範囲を検出する実行可能範囲検出手段と、
前記実行経路のそれぞれについて、前記実行可能範囲において前記対象ロード命令に先立って実行される、前記対象ロード命令と同一のアドレスから同一のデータを読み出す先行ロード命令が存在しない場合に、前記実行可能範囲内に前記先行ロード命令を生成する命令生成手段と、
前記対象ロード命令を削除すると共に、前記対象ロード命令により読み出されたデータを使用する命令を、前記先行ロード命令により読み出されレジスタに保持されて伝播されるデータを使用する命令に置換する命令置換手段と
を備える最適化コンパイラ。
【請求項２】
変数をレジスタに割り当てるレジスタ割当手段と、
前記レジスタ割当手段によりレジスタに割当不能と判断された各変数について、当該変数の値を使用する各命令に先立って当該変数の値をメモリからロードするスピルイン命令を生成するスピルイン命令生成手段と
を更に備え、
前記実行可能範囲検出手段は、前記スピルイン命令を前記対象ロード命令である対象スピルイン命令として、前記対象スピルイン命令を遡ることにより到達可能な全ての実行経路のそれぞれについて前記実行可能範囲を検出し、
前記命令生成手段は、前記実行経路のそれぞれについて、前記実行可能範囲において前記対象スピルイン命令についての前記先行ロード命令が存在しない場合に、前記実行可能範囲内に前記先行ロード命令を生成し、
前記命令置換手段は、前記対象スピルイン命令を削除すると共に、前記対象スピルイン命令により読み出されたデータを使用する命令を、前記先行ロード命令により読み出されレジスタに保持されて伝播されるデータを使用する命令に置換する
請求項１記載の最適化コンパイラ。
【請求項３】
前記実行可能範囲検出手段は、互いに同一のアドレスから同一のデータを読み出す複数の前記対象ロード命令のそれぞれについて、前記複数の実行経路における前記実行可能範囲を検出し、
前記命令生成手段は、第１の前記対象ロード命令における前記実行経路のそれぞれについて、前記実行可能範囲において前記先行ロード命令が存在せず、かつ当該実行可能範囲及び第２の前記対象ロード命令における実行可能範囲の少なくとも一部が重複する場合に、当該重複する範囲内に前記先行ロード命令を生成し、
前記命令置換手段は、前記先行ロード命令より後に実行されることが定まっておりかつ前記実行可能範囲に存在する対象ロード命令のそれぞれを削除すると共に、当該対象ロード命令により読み出されたデータを使用する命令を、前記先行ロード命令により読み出されレジスタに保持されて伝播されるデータを使用する命令に置換する
請求項１記載の最適化コンパイラ。
【請求項４】
前記命令生成手段は、前記実行可能範囲の何れかが互いに重複する複数の対象ロード命令について、当該複数の対象ロード命令についての計算的最適性（computational optimality）を満たす範囲内に、前記先行ロード命令を生成する
請求項３記載の最適化コンパイラ。
【請求項５】
前記計算的最適性を保持する場合において、前記命令生成手段により生成される先行ロード命令及び他の先行ロード命令における読み出し先のレジスタを同一に設定できか否かを判断する同一性判断手段を更に備え、
同一に設定できない場合に、前記命令生成手段は、前記実行可能範囲のうち、当該計算的最適性が満たされず、かつ当該先行ロード命令及び他の先行ロード命令による読み出し先のレジスタを同一に設定可能となる位置に、当該先行ロード命令を生成する
請求項４記載の最適化コンパイラ。
【請求項６】
前記同一性判断手段によりレジスタを同一に設定できないと判断された場合に、レジスタを同一に設定しない場合にレジスタ間においてデータをコピーする処理に要するコピー処理時間と、レジスタを同一に設定した場合に前記計算的最適性を満たす場合と比較して追加されるロード命令の処理時間である追加命令処理時間とを算出するコピー処理時間算出手段を更に備え、
前記命令生成手段は、前記追加命令処理時間が前記コピー処理時間より大きいことを更に条件として、当該計算的最適性が満たされず、かつ当該先行ロード命令及び他の先行ロード命令による読み出し先のレジスタを同一に設定可能となる位置に、当該先行ロード命令を生成する
請求項５記載の最適化コンパイラ。
【請求項７】
前記命令生成手段は、前記計算的最適性を満たす範囲のうち、更に、前記先行ロード命令により読み出されたデータの生存区間が最小となる生存区間的最適性（lifetime optimality）を満たす位置に、前記先行ロード命令を生成する
請求項４記載の最適化コンパイラ。
【請求項８】
前記生存区間的最適性を満たす位置から、前記先行ロード命令により読み出されるデータを使用する命令の実行位置までに他の命令が実行されるのに要する処理時間である必要処理時間と、前記先行ロード命令の実行を開始してからデータの読み出しが完了するまでに要するロード処理時間とを解析するロード遅延解析手段を更に備え、
前記命令生成手段は、前記必要処理時間が、前記ロード処理時間より小さい場合に、前記生存区間的最適性を満たす位置に先立って実行される位置に、前記先行ロード命令を生成する
請求項７記載の最適化コンパイラ。
【請求項９】
前記命令生成手段は、前記必要処理時間が前記ロード処理時間より小さい場合に、前記生存区間的最適性を満たす位置から、前記ロード処理時間から前記必要処理時間を減じた時間先立って実行される実行位置に、前記先行ロード命令を生成する
請求項８記載の最適化コンパイラ。
【請求項１０】
前記命令生成手段は、前記実行経路のそれぞれについて前記実行可能範囲に先行ロード命令が存在しない場合に、前記先行ロード命令として、他の先行ロード命令がデータを読み出すレジスタと同一である共通レジスタにデータを読み出すロード命令を生成し、
前記命令置換手段は、前記対象ロード命令により読み出されたデータを使用する命令を、前記共通レジスタに保持されたデータを使用する命令に置換する
請求項１記載の最適化コンパイラ。
【請求項１１】
前記命令置換手段により前記対象ロード命令が削除された場合に、当該対象ロード命令によってのみ読み出されており、かつ生成された前記先行ロード命令により読み出されないデータを書き込むストア命令を削除するストア命令削除手段を更に備える請求項１記載の最適化コンパイラ。
【請求項１２】
最適化対象の対象プログラムにおいて、メモリからレジスタにデータを読み出すロード命令を最適化する最適化コンパイラであって、
前記対象プログラム中の最適化対象の対象ロード命令から実行順序を遡ることにより到達する全ての実行経路のそれぞれについて、ロード命令が実行された場合に当該ロード命令により読み出されたデータをレジスタに保持して前記対象ロード命令の実行位置に伝達可能である、当該ロード命令の実行可能範囲を検出する実行可能範囲検出手段と、
前記実行経路のそれぞれについて、前記実行可能範囲において前記対象ロード命令に先立って実行される、前記対象ロード命令と同一のアドレスから同一のデータを読み出す先行ロード命令が存在する場合に、前記対象ロード命令を削除すると共に、前記対象ロード命令により読み出されたデータを使用する命令を、前記先行ロード命令により読み出されレジスタに保持されて伝播されるデータを使用する命令に置換する命令置換手段と
を備える最適化コンパイラ。
【請求項１３】
最適化対象の対象プログラムにおいて、メモリからレジスタにデータを読み出すロード命令を最適化するコンパイル方法であって、
前記対象プログラム中の最適化対象の対象ロード命令から実行順序を遡ることにより到達する全ての実行経路のそれぞれについて、ロード命令が実行された場合に当該ロード命令により読み出されたデータをレジスタに保持して前記対象ロード命令の実行位置に伝達可能である、当該ロード命令の実行可能範囲を検出する実行可能範囲検出段階と、
前記実行経路のそれぞれについて、前記実行可能範囲において前記対象ロード命令に先立って実行される、前記対象ロード命令と同一のアドレスから同一のデータを読み出す先行ロード命令が存在しない場合に、前記実行可能範囲内に前記先行ロード命令を生成する命令生成段階と、
前記対象ロード命令を削除すると共に、前記対象ロード命令により読み出されたデータを使用する命令を、前記先行ロード命令により読み出されレジスタに保持されて伝播されるデータを使用する命令に置換する命令置換段階と
を備えるコンパイル方法。
【請求項１４】
最適化対象の対象プログラムにおいて、メモリからレジスタにデータを読み出すロード命令を最適化する最適化コンパイラとしてコンピュータを機能させるコンパイラプログラムであって、
前記対象プログラム中の最適化対象の対象ロード命令から実行順序を遡ることにより到達する全ての実行経路のそれぞれについて、ロード命令が実行された場合に当該ロード命令により読み出されたデータをレジスタに保持して前記対象ロード命令の実行位置に伝達可能である、当該ロード命令の実行可能範囲を検出する実行可能範囲検出手段と、
前記実行経路のそれぞれについて、前記実行可能範囲において前記対象ロード命令に先立って実行される、前記対象ロード命令と同一のアドレスから同一のデータを読み出す先行ロード命令が存在しない場合に、前記実行可能範囲内に前記先行ロード命令を生成する命令生成手段と、
前記対象ロード命令を削除すると共に、前記対象ロード命令により読み出されたデータを使用する命令を、前記先行ロード命令により読み出されレジスタに保持されて伝播されるデータを使用する命令に置換する命令置換手段と
して機能させるコンパイラプログラム。
【請求項１５】
請求項１４記載のコンパイラプログラムを記録した記録媒体。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、最適化コンパイラ、コンパイル方法、コンパイラプログラム、及び記録媒体
に関する。特に、本発明は、冗長な命令を削除する最適化コンパイラ、コンパイル方法、コンパイラプログラム、及び記録媒体に関する。
【背景技術】
【０００２】
近年、技術革新により、コンピュータの中央処理装置の動作速度が高速になっている。このため、メモリアクセスに要する時間に対する、中央処理装置のレジスタに対する読み出し処理に要する時間が、相対的に大きくなってきている。従って、プログラム全体の処理速度を向上するには、プログラムで使用される変数の値をできるだけレジスタに保持してメモリアクセス量を減らすことがますます重要となってきている。
【０００３】
従来、最適化コンパイラは、メモリに対するアクセス量を減らして処理全体を効率化するべく、最適化対象の対象プログラムにおける変数を、中央処理装置におけるレジスタに有効に割り当てるレジスタ割当機能を有している（非特許文献１から５参照。）。そして、最適化コンパイラは、レジスタに割り当てられた変数の値を当該レジスタに保持させる一方、レジスタ割当機能によりレジスタに割当不能と判断された変数の値を、メモリに格納させ、参照される毎にメモリから読み出させる命令を生成する。
【０００４】
また、従来、最適化コンパイラにおいて、複数の命令が互いに同一の処理を行い冗長である場合に、当該複数の命令の少なくとも一部を削除して処理全体を効率化する冗長性除去技術が用いられている（非特許文献７参照。）。更に、冗長性除去技術を適用する過程で、変数をできるだけレジスタに割り当てるように制御する技術が提案されている（非特許文献６参照。）。
【０００５】
【非特許文献１】D. Bernstein, D.Q. Goldin, M.C. Golumbic, H. Krawczyk, Y. Mansour, I. Nahshon, and R.Y. Pinter. Spill code minimization techniques for optimizing compilers. In Proceedings of the ACM SIGPLAN 1989 Conference on Programming Language Design and Implementation, pages 258-263, 1989.
【非特許文献２】P. Briggs, K.D. Cooper, and L. Torczon. Rematerialization. In Proceedings of the ACM SIGPLAN 1992 Conference on Programming Language Design and Implementation, pages 311-321, 1992.
【非特許文献３】S. Kurlander and C. Fisher. Zero-cost range splitting. In Proceedings of the ACM SIGPLAN 1994 Conference on Programming Language Design and Implementation, pages 257-265, 1994.
【非特許文献４】P. Kolte and M.J. Harrold. Load/store range analysis for global register allocation. In Proceedings of the ACM SIGPLAN 1993 Conference on Programming Language Design and Implementation, pages 268-277, 1993.
【非特許文献５】P. Bergner, P. Dahl, D. Engebretsen, and M. O'Keefe. Spill code minimization via interference region spilling. In Proceedings of the ACM SIGPLAN 1997 Conference on Programming Language Design and Implementation, pages 287-295, 1997.
【非特許文献６】R. Gupta and R. Bodik. Register pressure sensitive redundancy elimination. In Proceedings of the 8th International Conference on Compiler Construction, LNCS 1575, pages 107-121, 1999.
【非特許文献７】J. Knoop, O. Ruthing, and B. Steffen. Optimal code motion: theory & practice. ACM TOPLAS, 18(3): 300-324, 1996.
【発明の開示】
【発明が解決しようとする課題】
【０００６】
しかしながら、レジスタ割当機能を用いた場合であってもなお部分的に使用可能なレジスタが存在する場合がある。このような場合であっても、レジスタに割当不能と一旦判断された変数の値を常にメモリから読み出すのは効率的でない。また、非特許文献６の技術によっても、レジスタに割り当てられない変数が存在する場合がある。
【課題を解決するための手段】
【０００７】
上記課題を解決するために、本発明の第１の形態においては、最適化対象の対象プログラムにおいて、メモリからレジスタにデータを読み出すロード命令を最適化する最適化コンパイラであって、対象プログラム中の最適化対象の対象ロード命令から実行順序を遡ることにより到達する全ての実行経路のそれぞれについて、ロード命令が実行された場合に当該ロード命令により読み出されたデータをレジスタに保持して対象ロード命令の実行位置に伝達可能である、当該ロード命令の実行可能範囲を検出する実行可能範囲検出手段と、実行経路のそれぞれについて、実行可能範囲において対象ロード命令に先立って実行される、対象ロード命令と同一のアドレスから同一のデータを読み出す先行ロード命令が存在しない場合に、実行可能範囲内に先行ロード命令を生成する命令生成手段と、対象ロード命令を削除すると共に、対象ロード命令により読み出されたデータを使用する命令を、先行ロード命令により読み出されレジスタに保持されて伝播されるデータを使用する命令に置換する命令置換手段とを備える最適化コンパイラ、当該最適化コンパイラを用いたコンパイル方法、当該最適化コンパイラとしてコンピュータを機能させるコンパイラプログラム、及び当該コンパイラプログラムを記録した記録媒体を提供する。
【０００８】
なお、上記の発明の概要は、本発明の必要な特徴の全てを列挙したものではなく、これらの特徴群のサブコンビネーションもまた、発明となりうる。
【発明の効果】
【０００９】
本発明によれば、変数の値を効率的に参照させることができる。
【発明を実施するための最良の形態】
【００１０】
以下、発明の実施の形態を通じて本発明を説明するが、以下の実施形態は特許請求の範囲にかかる発明を限定するものではなく、また実施形態の中で説明されている特徴の組み合わせの全てが発明の解決手段に必須であるとは限らない。
【００１１】
図１は、最適化コンパイラ１０の機能ブロック図である。最適化コンパイラ１０は、最適化対象の対象プログラムにおいて、メモリからデータを読み出すロード命令を最適化することを目的とする。最適化コンパイラ１０は、レジスタ割当手段１００と、スピルイン命令生成手段１１０と、実行可能範囲生成手段１２０と、他命令処理時間解析手段１２５と、同一性判断手段１３０と、コピー処理時間算出手段１４０と、命令生成手段１５０と、命令置換手段１６０と、ストア命令削除手段の一例であるスピルアウト命令削除手段１７０とを備える。
【００１２】
レジスタ割当手段１００は、対象プログラムを受け取ると、変数をレジスタに割り当てるレジスタ割当処理を行い、当該処理結果の対象プログラムをスピルイン命令生成手段１１０に送る。これを受けて、スピルイン命令生成手段１１０は、レジスタ割当手段１００によりレジスタに割当不能と判断された各変数について、当該変数の値を使用する各命令に先立って当該変数の値をメモリからロードするスピルイン命令を生成し、当該生成処理を行った結果の対象プログラムを実行可能範囲生成手段１２０に送る。
【００１３】
ここで、対象プログラムとは、例えば、最適化コンパイラ内で最適化対象のプログラムを表す中間表現であり、一例としては、Ｊａｖａ（登録商標）言語におけるバイトコード、ＲＴＬ（Ｒｅｇｉｓｔｅｒ  Ｔｒａｎｓｆｅｒ  Ｌａｎｇｕａｇｅ）、又は４つ組表現である。これに代えて、対象プログラムとは、プログラムのソースコードであってもよい。また、変数とは、ソースコードにおける変数そのものに限定されず、例えば、対象プログラムにおける値の生存区間であってもよい。
【００１４】
また、レジスタとは、対象プログラムを実行する中央処理装置において使用可能な全てのレジスタとは限らず、情報処理装置のオペレーティングシステム又はプログラミング言語等の仕様により予め定められ、対象プログラムにおける使用が許可されているレジスタ群であればよい。例えば、対象プログラムから呼び出されるライブラリプログラム等により使用され内容が変更され得るレジスタを含まなくてもよい。
【００１５】
実行可能範囲生成手段１２０は、受け取った対象プログラムにおいて、レジスタに割当不能である何れかの変数について、当該変数の値をメモリから読み出す複数のスピルイン命令のそれぞれを最適化対象の対象スピルイン命令として、以下の処理を行う。
【００１６】
まず、実行可能範囲生成手段１２０は、当該対象スピルイン命令から実行順序を遡ることにより到達する全ての実行経路のそれぞれについて、ロード命令が実行された場合に当該ロード命令により読み出されたデータをレジスタに保持して当該対象スピルイン命令の実行位置に伝達可能である、当該ロード命令の実行可能範囲を検出する。
【００１７】
次に、実行可能範囲生成手段１２０は、実行可能範囲の何れかが互いに重複する複数の対象スピルイン命令について、当該複数の対象スピルイン命令に代えて当該複数の対象スピルイン命令と同一のアドレスから同一のデータを読み出す先行ロード命令を生成すべき実行位置の範囲であって、当該複数の対象スピルイン命令についての計算的最適性（computational optimality）を満たす範囲を検出する。更に、実行可能範囲生成手段１２０は、計算的最適性を満たす範囲のうち、当該先行ロード命令により読み出される値の生存区間が最小となる生存区間的最適性（lifetime optimality）を満たす位置を検出する。そして、実行可能範囲生成手段１２０は、対象プログラムを検出結果と共に他命令処理時間解析手段１２５及び同一性判断手段１３０に送る。
【００１８】
ロード遅延解析手段１２５は、検出結果を実行可能範囲生成手段１２０から受け取ると、生存区間的最適性を満たす位置から先行ロード命令により読み出されるデータを使用する命令の実行位置までに他の命令が実行されるのに要する処理時間である必要処理時間を解析する。次に、ロード遅延解析手段１２５は、先行ロード命令の実行を開始してからデータの読み出しが完了するまでに要するロード処理時間を解析する。そして、ロード遅延解析手段１２５は、必要処理時間がロード処理時間より小さい場合に、生存区間的最適性を満たす位置から、ロード処理時間から必要処理時間を減じた時間先立って実行される実行位置を、先行ロード命令を生成するべき生成位置として検出し、検出結果を命令生成手段１５０に送る。
【００１９】
同一性判断手段１３０は、計算的最適性を満たす場合において、各対象スピルイン命令について、当該対象スピルイン命令における当該実行可能範囲において当該対象スピルイン命令に先立って実行される全ての先行ロード命令のそれぞれにおける読み出し先のレジスタを同一に設定できるか否かを判断する。そして、同一性判断手段１３０は、判断結果をコピー処理時間算出手段１４０及び命令生成手段１５０に通知する。
【００２０】
コピー処理時間算出手段１４０は、同一性判断手段１３０からの通知を受けて、同一性判断手段１３０によりレジスタを同一に設定できないと判断された場合に、レジスタを同一に設定しない場合にレジスタ間においてデータをコピーする処理に要するコピー処理時間と、レジスタを同一に設定した場合に計算的最適性を満たす場合と比較して追加されるロード命令の処理時間である追加命令処理時間とを算出し、算出結果を命令生成手段１５０に送る。
【００２１】
命令生成手段１５０は、実行経路のそれぞれについて実行可能範囲に当該対象スピルイン命令の先行ロード命令が存在しない場合に、以下に示す処理により実行可能範囲内に先行ロード命令を生成する。
【００２２】
まず、命令生成手段１５０は、同一性判断手段１３０によりレジスタを同一に設定できると判断された場合、又はコピー処理時間算出手段１４０により算出された追加命令処理時間がコピー処理時間より小さい場合に、計算的最適性かつ生存区間的最適性を満たす実行位置に先行ロード命令を生成する。
【００２３】
一方、命令生成手段１５０は、同一性判断手段１３０によりレジスタを同一に設定できないと判断され、かつコピー処理時間算出手段１４０により算出された追加命令処理時間がコピー処理時間より大きい場合に、実行可能範囲のうち、当該計算的最適性が満たされず、かつ先行ロード命令のそれぞれによる読み出し先のレジスタを同一に設定可能となる位置に、先行ロード命令を生成する。そして、命令生成手段１５０は、当該生成処理を行った結果の対象プログラムを命令置換手段１６０に送る。
【００２４】
ここで、計算的最適性を満たす範囲とは、例えば、ロード命令を生成することにより対象プログラム全体におけるスピルイン命令の実行回数が最適化される範囲をいう。例えば、計算的最適性を満たす範囲は、第１の対象スピルイン命令における実行経路のそれぞれについて、当該実行経路の実行可能範囲及び第２の対象スピルイン命令における実行可能範囲の少なくとも一部が重複する場合の、当該重複する範囲である。即ち、命令生成手段１５０は、当該重複する範囲に先行ロード命令が存在しない場合に、当該重複する範囲に先行ロード命令を生成することにより、第１のスピルイン命令のみならず第２のスピルイン命令をも削除させることができる。
【００２５】
命令置換手段１６０は、先行ロード命令より後に実行されることが定まっている対象スピルイン命令のそれぞれを削除すると共に、当該対象スピルイン命令により読み出されたデータを使用する命令を、先行ロード命令により読み出されレジスタに保持されて伝播されるデータを使用する命令に置換する。そして、レジスタ割当手段１００により割当不能と判断された全ての変数について処理を終えた場合に、命令置換手段１６０は、対象プログラムをスピルアウト命令削除手段１７０に送る。レジスタ割当手段１００により割当不能と判断された全ての変数について処理を終えていない場合に、命令置換手段１６０は、対象プログラムを実行可能範囲生成手段１２０に送る。
【００２６】
スピルアウト命令削除手段１７０は、命令置換手段１６０により対象スピルイン命令が削除された場合に、当該対象スピルイン命令によってのみ読み出されており、かつ生成された先行ロード命令により読み出されないデータを書き込むストア命令を削除し、当該削除処理を行った結果の対象プログラムを、コンパイル結果の結果プログラムとして出力する。
【００２７】
図２は、最適化コンパイラ１０の動作フローを示す図である。まず、レジスタ割当手段１００は、対象プログラムに対して、変数をレジスタに割り当てるレジスタ割当処理を行う（Ｓ２００）。例えば、レジスタ割当手段１００は、非特許文献２に記載の技術によりレジスタ割当処理を行ってもよい。そして、スピルイン命令生成手段１１０は、レジスタ割当手段１００によりレジスタに割当不能と判断された各変数について、当該変数の値を使用する各命令に先立って当該変数の値をメモリからレジスタに読み出すスピルイン命令を生成する（Ｓ２１０）。
【００２８】
実行可能範囲生成手段１２０は、レジスタ割当手段１００によりレジスタに割当不能と判断された複数の変数について、最適化する順序を決定する（Ｓ２２０）。例えば、実行可能範囲生成手段１２０は、参照される回数がより多い変数から順に最適化されるように順序を決定してもよい。そして、この順序に基づいて、実行可能範囲生成手段１２０は、レジスタに割当不能と判断された各変数について、以下の処理を繰り返す（Ｓ２３０）。
【００２９】
実行可能範囲生成手段１２０は、当該変数の値をメモリから読み出す複数の対象スピルイン命令のそれぞれについて、当該対象スピルイン命令から実行順序を遡ることにより到達する全ての実行経路のそれぞれについて、ロード命令が実行された場合に当該ロード命令により読み出されたデータをレジスタに保持して当該対象スピルイン命令の実行位置に伝達可能である、当該ロード命令の実行可能範囲を検出する（Ｓ２４０）。
【００３０】
そして、命令生成手段１５０は、実行経路のそれぞれについて、実行可能範囲に先行ロード命令が存在しない場合に、実行可能範囲内に先行ロード命令を生成する（Ｓ２５０）。続いて、命令置換手段１６０は、対象スピルイン命令を削除すると共に、当該対象スピルイン命令により読み出されたデータを使用する命令を、先行ロード命令により読み出されレジスタに保持されて伝播されるデータを使用する命令に置換する（Ｓ２６０）。例えば、複数の実行経路における複数の先行ロード命令が、互いに共通である共通レジスタにデータを読み出す場合、命令置換手段１６０は、対象スピルイン命令により読み出されたデータを使用する命令を、共通レジスタに保持されたデータを使用する命令に置換する。また、命令置換手段１６０は、複数の実行経路における複数の先行ロード命令について、読み出し先のレジスタが同一でない場合には、レジスタ間でデータをコピーする命令を更に生成する。
【００３１】
続いて、先行ロード命令の生成及び対象スピルイン命令の削除の結果を受けて、命令置換手段１６０は、レジスタの使用状態に関する情報を更新する（Ｓ２７０）。最適化コンパイラ１０は、以上の処理を、レジスタ割当手段１００によりレジスタに割当不能と判断された全ての変数について繰り返す（Ｓ２８０）。
【００３２】
スピルアウト命令削除手段１７０は、命令置換手段１６０により対象スピルイン命令が削除された場合に、当該対象スピルイン命令によってのみ読み出されており、かつ生成された先行ロード命令により読み出されないデータを書き込むストア命令を削除し、当該削除処理を行った結果の対象プログラムを、コンパイル結果の結果プログラムとして出力する（Ｓ２９０）。
【００３３】
図３は、図２におけるＳ２４０の詳細を示す動作フローである。図４は、図３におけるＳ３１０の処理を説明する図である。実行可能範囲生成手段１２０は、対象プログラムの各基本ブロックにおいて、スピルイン命令生成手段１１０により生成されたスピルイン命令を検出する（Ｓ３００）。そして、実行可能範囲生成手段１２０は、対象プログラム中のスピルイン命令について、以下の３つの集合を基本ブロック毎に生成する。
【００３４】
（１）ＧＥＮ集合
実行可能範囲生成手段１２０は、当該基本ブロック中のスピルイン命令のそれぞれについて、当該基本ブロックの実行開始位置から当該スピルイン命令の実行位置までの範囲で、レジスタ割当手段１００により変数に割り当てられていないレジスタの集合を求める。但し、スピルイン命令自体によるレジスタの使用は含めない。そして、実行可能範囲生成手段１２０は、基本ブロックにおける複数のスピルイン命令のそれぞれにおける当該集合の積集合を、ＧＥＮ集合として生成する。なお、実行可能範囲生成手段１２０は、対象スピルイン命令がデータを読み出すアドレスと同一のアドレスに書き込みを行うスピルアウト命令が存在する場合は、当該基本ブロックのうち当該スピルアウト命令に先立って実行される範囲についてＧＥＮ集合を生成する。
【００３５】
例えば、図４の例において、実行可能範囲生成手段１２０は、１つ目のスピルイン命令の実行位置までの範囲で変数に割り当てられていないレジスタの集合を、｛レジスタ１、レジスタ２、レジスタ３、レジスタ４、レジスタ５、レジスタ７｝として生成する。そして、実行可能範囲生成手段１２０は、２つ目のスピルイン命令の実行位置までの範囲で変数に割り当てられていないレジスタの集合を、｛レジスタ３、レジスタ４、レジスタ５｝として生成する。従って、実行可能範囲生成手段１２０は、｛レジスタ１、レジスタ２、レジスタ３、レジスタ４、レジスタ５、レジスタ７｝∩｛レジスタ３、レジスタ４、レジスタ５｝である｛レジスタ３、レジスタ４、レジスタ５｝を、ＧＥＮ集合として生成する。
【００３６】
（２）ＧＥＮ’集合
実行可能範囲生成手段１２０は、当該基本ブロック中のスピルイン命令のそれぞれについて、当該スピルイン命令の実行位置から当該基本ブロックの実行終了位置までの範囲で、レジスタ割当手段１００により変数に割り当てられていないレジスタの集合を求める。そして、実行可能範囲生成手段１２０は、基本ブロックにおける複数のスピルイン命令のそれぞれにおける当該集合の積集合を、ＧＥＮ’集合として生成する。なお、実行可能範囲生成手段１２０は、対象スピルイン命令がデータを読み出すアドレスと同一のアドレスに書き込みを行うスピルアウト命令が存在する場合は、当該基本ブロックのうち当該スピルアウト命令より後に実行される範囲についてＧＥＮ’集合を生成する。
【００３７】
（３）ＫＩＬＬ集合
実行可能範囲生成手段１２０は、当該基本ブロック中で一貫してレジスタ割当手段１００により変数に割り当てられていないレジスタの集合を生成する。但し、スピルイン命令自体によるレジスタの使用は含まれない。そして、実行可能範囲生成手段１２０は、生成した当該集合の補集合を、ＫＩＬＬ集合として生成する。また、実行可能範囲生成手段１２０は、対象スピルイン命令がデータを読み出すアドレスと同一のアドレスに書き込みを行うスピルアウト命令が存在する場合は、全てのレジスタの集合をＫＩＬＬ集合として生成する。
【００３８】
例えば、図４において、レジスタ１から７のそれぞれにおける、レジスタ割当手段１００により既に変数に割り当てられている範囲を、斜線で示す。この例において、実行可能範囲生成手段１２０は、基本ブロック中で一貫して変数に割り当てられていないレジスタの集合として、｛レジスタ３、レジスタ４｝を生成する。従って、実行可能範囲生成手段１２０は、｛レジスタ０、レジスタ１、レジスタ２、レジスタ５、レジスタ６、レジスタ７｝をＫＩＬＬ集合として生成する。
【００３９】
以降の説明において、第ｎ基本ブロックにおけるＧＥＮ集合、ＧＥＮ’集合、及びＫＩＬＬ集合を、それぞれＧＥＮ（ｎ）、ＧＥＮ’（ｎ）、及びＫＩＬＬ（ｎ）と表記する。
【００４０】
続いて、実行可能範囲生成手段１２０は、対象プログラムの各実行位置ｘ（例えば、ある基本ブロックの実行開始位置又は実行終了位置）について、当該実行位置ｘから対象プログラムの終了位置までの全ての実行経路に計算ｅ（例えば、スピルイン命令）が存在するか否かを示す、計算ｅについての完全上方安全配置性（totally-anticipatability）を算出する（Ｓ３２０）。
【００４１】
具体的には、実行可能範囲生成手段１２０は、以下のデータフロー方程式（１）を解くことにより、完全上方安全配置性を算出する。本数式において、第ｎ基本ブロックの実行開始位置において、スピルイン命令が読み出し先として選択した場合に完全上方安全配置性を満たすレジスタの集合を、ＡＮＴｉｎ（ｎ）と表記し、第ｎ基本ブロックの実行終了位置において、スピルイン命令が読み出し先として選択した場合に完全上方安全配置性を満たすレジスタの集合を、ＡＮＴｏｕｔ（ｎ）と表記する。
【００４２】
【数１】
2005078474.tif 000003
但し、第ｎ基本ブロックの次に実行され得る基本ブロックの集合を、ｓｕｃｃ（ｎ）と表記する。
【００４３】
続いて、実行可能範囲生成手段１２０は、対象プログラムの各実行位置ｘについて、対象プログラムの実行開始位置から当該実行位置ｘまでの全ての実行経路に計算ｅが存在するか否かを示す、計算ｅについての完全下方安全配置性（totally-availability）を算出する（Ｓ３３０）。
【００４４】
具体的には、実行可能範囲生成手段１２０は、以下のデータフロー方程式（２）を解くことにより、完全下方安全配置性を算出する。本数式において、第ｎ基本ブロックの実行開始位置において、スピルイン命令が読み出し先として選択した場合に完全下方安全配置性を満たすレジスタの集合を、ＡＶＬｉｎ（ｎ）と表記し、第ｎ基本ブロックの実行終了位置において、スピルイン命令が読み出し先として選択した場合に完全下方安全配置性を満たすレジスタの集合を、ＡＶＬｏｕｔ（ｎ）と表記する。
【数２】
2005078474.tif 000004
但し、第ｎ基本ブロックに先立って実行され得る基本ブロックの集合を、ｐｒｅｄ（ｎ）と表記する。
【００４５】
そして、実行可能範囲生成手段１２０は、計算ｅについて完全上方安全配置性がありかつ完全下方安全配置性のない実行位置を、最先上方安全配置性（Earliest-Anticipatable）を満たす位置として算出する。具体的には、実行可能範囲生成手段１２０は、以下の式（３）により、最先安全配置性を満たす位置を算出する（Ｓ３４０）。
【数３】
2005078474.tif 000005
【００４６】
続いて、ロード遅延解析手段１２５は、完全上方安全配置性を満たす各基本ブロックの開始位置から、スピルイン命令により読み出されるデータを使用する命令の実行位置までに他の命令が実行されるのに要する処理時間である必要処理時間を解析する（Ｓ３５０）。そして、ロード遅延解析手段１２５は、スピルイン命令の実行を開始してからデータの読み出しが完了するまでに要するロード処理時間から、解析した当該必要処理時間を減じた時間であるＬＡＴ−ＬＯＣ（ｎ）を算出する。
【００４７】
ここで、ロード遅延解析手段１２５が解析する処理時間とは、例えば、実行サイクル数であってもよい。即ち、ロード遅延解析手段１２５は、完全上方安全配置性を満たす各基本ブロックの開始位置から、スピルイン命令により読み出されるデータを使用する命令の実行位置までに他の命令が実行されるのに要する実行サイクル数を、必要処理時間として解析してもよい。同様に、ロード遅延解析手段１２５は、スピルイン命令の実行を開始してからデータの読み出しが完了するまでに要する実行サイクル数を、ロード処理時間として解析してもよい。
【００４８】
そして、ロード遅延解析手段１２５は、完全上方安全配置性を満たす各基本ブロックについて、当該基本ブロックの実行開始位置においてスピルイン命令を実行した場合に読み出し処理により実行が停止する時間の見積である、ＬＡＴｉｎ（ｎ）と、当該基本ブロックの実行終了位置においてスピルイン命令を実行した場合に読み出し処理により実行が遅延する時間の見積である、ＬＡＴｏｕｔ（ｎ）とを生成する。
【００４９】
具体的には、ロード遅延解析手段１２５は、以下の式（４）によりＬＡＴｉｎ（ｎ）及びＬＡＴｏｕｔ（ｎ）を算出する。但し、ＳＥＣ（ｎ）は、第ｎ基本ブロック全体の処理時間の見積を示す。
【数４】
2005078474.tif 000006
【００５０】
また、ＬＡＴｏｕｔ（ｎ）を算出する他の例として、ロード遅延解析手段１２５は、第ｎ基本ブロックの次に実行され得る第ｍ基本ブロックについての、ＬＡＴｉｎ（ｍ）の最大値を、ＬＡＴｏｕｔ（ｎ）として算出してもよい。更に他の例として、ロード遅延解析手段１２５は、第ｎ基本ブロックの次に実行され得る基本ブロックのうち、最も高い頻度で実行されると判断された第ｍ基本ブロックについてのＬＡＴｉｎ（ｍ）を、ＬＡＴｏｕｔ（ｎ）として算出してもよい。
【００５１】
続いて、実行可能範囲生成手段１２０は、各基本ブロックについて、当該基本ブロックの実行開始位置においてスピルイン命令を実行した場合において計算ｅについての計算的最適性を満たすか否かを示すＤＥＬＡＹＥＤｉｎ（ｎ）と、当該基本ブロックの実行終了位置においてスピルイン命令を実行した場合において計算ｅについての計算的最適性を満たすか否かを示すＤＥＬＡＹＥＤｏｕｔ（ｎ）とを生成する。
【００５２】
具体的には、実行可能範囲生成手段１２０は、以下の式（５）によりＤＥＬＡＹＥＤｉｎ（ｎ）及びＤＥＬＡＹＥＤｏｕｔ（ｎ）を生成する。
【数５】
2005078474.tif 000007
【００５３】
そして、実行可能範囲生成手段１２０は、スピルイン命令を生成するべき生成位置として、計算的最適性を満たす範囲内であって、生存区間的最適性を満たす実行位置から、読み出し処理により実行が遅延する時間先立って実行される位置を算出する。具体的には、実行可能範囲生成手段１２０は、第ｎ基本ブロックの実行開始位置にスピルイン命令を生成するべきか否かを示すＬＡＴＥＳＴｉｎ（ｎ）と、第ｎ基本ブロックの実行終了位置にスピルイン命令を生成するべきか否かを示すＬＡＴＥＳＴｏｕｔ（ｎ）とを、以下の式（６）により生成する。
【００５４】
【数６】
2005078474.tif 000008
これにより、命令生成手段１５０は、ＬＡＴＥＳＴｉｎ（ｎ）又はＬＡＴＥＳＴｏｕｔ（ｎ）がｔｒｕｅである実行位置に、即ち、生存区間的最適性を満たす位置から、ロード処理時間から必要処理時間を減じた時間先立って実行される実行位置に、先行ロード命令を生成することができる。
【００５５】
また、ステップＳ３２０からステップＳ３７０における処理に代えて、最適化コンパイラ１０は、スピルイン命令が例外（Exception）を発生させない場合において、以下の方程式（７）を解くことにより、ＬＡＴＥＳＴｉｎ（ｎ）及びＬＡＴＥＳＴｏｕｔ（ｎ）を生成してもよい。
【数７】
2005078474.tif 000009
【００５６】
この方法によると、更に多くのスピルイン命令を削除することができると共に、下方安全配置性（availability）を算出する処理を省くことによりコンパイル処理に要する時間を短縮することができる。
【００５７】
図５は、図２におけるＳ２５０の詳細を示す動作フローである。命令生成手段１５０は、実行経路のそれぞれについて実行可能範囲に当該対象スピルイン命令の先行ロード命令が存在するか否かを、例えば、ＬＡＴＥＳＴｉｎ（ｎ）又はＬＡＴＥＳＴｏｕｔ（ｎ）がｔｒｕｅである基本ブロックにスピルイン命令があるか否かを検出することにより判断する（Ｓ５００）。先行ロード命令が存在する場合には（Ｓ５００：ＹＥＳ）、最適化コンパイラ１０は、当該実行経路について、本図の処理を終了する。
【００５８】
同一性判断手段１３０は、計算的最適性を満たす場合において、命令生成手段１５０により生成される先行ロード命令及び他の全ての先行ロード命令の読み出し先のレジスタを同一に設定できるか否かを判断する（Ｓ５１０）。
【００５９】
例えば、先行ロード命令の実行位置がＬＡＴＥＳＴｉｎ（ｎ）により表される場合には、同一性判断手段１３０は、当該先行ロード命令の読み出し先のレジスタとしてＡＮＴｉｎ（ｎ）におけるレジスタの何れかを設定可能と判断する。また、先行ロード命令の実行位置がＬＡＴＥＳＴｏｕｔ（ｎ）により表される場合には、同一性判断手段１３０は、当該先行ロード命令の読み出し先のレジスタとしてＡＮＴｏｕｔ（ｎ）におけるレジスタの何れかを設定可能と判断する。従って、同一性判断手段１３０は、複数の先行ロード命令において、設定可能な読み出し先のレジスタの集合が重複するか否かを判断することにより、読み出し先のレジスタを同一に設定できるか否かを判断することができる。
【００６０】
同一性判断手段１３０がレジスタを同一に設定できると判断した場合に（Ｓ５１０：ＹＥＳ）、命令生成手段１５０は、他の先行ロード命令と同一である共通レジスタにデータを読み出す先行ロード命令を、計算的最適性及び生存区間的最適性を満たす位置、例えば、ＬＡＴＥＳＴｉｎ（ｎ）又はＬＡＴＥＳＴｏｕｔ（ｎ）がtrueである位置に生成する（Ｓ５２０）。
【００６１】
一方、同一性判断手段１３０がレジスタを同一に設定できないと判断した場合に（Ｓ５１０：ＮＯ）、コピー処理時間算出手段１４０は、レジスタを同一に設定しない場合にレジスタ間においてデータをコピーする処理に要するコピー処理時間と、レジスタを同一に設定した場合に計算的最適性を満たす場合と比較して追加されるロード命令の処理時間である追加命令処理時間とを算出する（Ｓ５３０）。
【００６２】
命令生成手段１５０は、コピー処理時間算出手段１４０により算出された追加命令処理時間がコピー処理時間より大きい場合に（Ｓ５４０：ＹＥＳ）、実行可能範囲のうち、当該計算的最適性が満たされず、かつ先行ロード命令のそれぞれによる読み出し先のレジスタを同一に設定可能となる位置に、例えば、複数の先行ロード命令より後に実行され制御フローが合流する実行位置である下方合流点に、先行ロード命令を生成する（Ｓ５５０）。
【００６３】
コピー処理時間算出手段１４０により算出された追加命令処理時間がコピー処理時間より小さい場合に（Ｓ５４０：ＮＯ）、命令生成手段１５０は、計算的最適性が満たされる位置、例えば、ＬＡＴＥＳＴｉｎ（ｎ）又はＬＡＴＥＳＴｏｕｔ（ｎ）がtrueである位置に先行ロード命令を生成する（Ｓ５６０）。
【００６４】
なお、最適化コンパイラ１０は、複数の実行経路について実行可能範囲に先行ロード命令を生成するべく、本図の処理を繰り返してもよい。
【００６５】
図６は、本実施例の第１の適用例を示す。本図は、変数Ａ、変数Ｂ、及び変数Ｃを、レジスタｒ１及びレジスタｒ２に割り当てる例を示している。本図において、対象プログラムの実行方向は下方向である。また、黒点は変数の値を定義する命令を示し、白抜点は変数の値を使用する命令を示している。また、各点を結ぶ実線は、レジスタに変数の値が有効に保持されている範囲を示している。
【００６６】
（ａ）は、レジスタ割当手段１００により変数がレジスタに割り当てられた対象プログラムの例を示す。変数Ｂの生存区間は、変数Ｃの生存区間と、図示した干渉領域において重複している。例えば、レジスタ割当手段１００は、非特許文献５に記載の方法によりレジスタ割当処理を行った場合に、変数Ａ及び変数Ｂのそれぞれをレジスタｒ１及びレジスタｒ２のそれぞれに割り当てると共に、変数Ｃをレジスタに割当不能と判断する。
【００６７】
（ｂ）は、スピルイン命令生成手段１１０によりスピルイン命令が生成された対象プログラムの例を示す。スピルイン命令生成手段１１０は、変数Ｃの値が定義された場合に当該値を示すデータをメモリに格納させるスピルアウト命令を生成し、変数Ｃを使用する毎にメモリからレジスタｒ１又はレジスタｒ２にデータを読み出すスピルイン命令を生成する。
【００６８】
（ｃ）は、本実施例に係る最適化コンパイラ１０による最適化結果である結果プログラムを示す。本図のように、最適化コンパイラ１０は、レジスタ割当手段１００により変数がレジスタに割り当てられた場合であってもなお使用可能なレジスタに、変数Ｃの値を保持させることができる。これにより、スピルイン命令の実行回数を減らし、処理全体を高速化することができる。
【００６９】
図７は、本実施例の第２の適用例を示す。（ａ）は、レジスタ割当手段１００により変数がレジスタに割り当てられた対象プログラムの例を示す。変数Ｂの生存区間は、変数Ｃの生存区間と、図示した干渉領域において重複している。そして、レジスタ割当手段１００は、変数Ａをレジスタｒ１に割り当てると共に、変数Ｂ及び変数Ｃをレジスタに割当不能と判断する。
【００７０】
（ｂ）は、スピルイン命令生成手段１１０によりスピルイン命令が生成された対象プログラムの例を示す。スピルイン命令生成手段１１０は、変数Ｂの値が定義された場合に当該値を示すデータをメモリに格納させるスピルアウト命令を生成し、変数Ｂを使用する毎にメモリからレジスタｒ２にデータを読み出すスピルイン命令を生成する。また、スピルイン命令生成手段１１０は、変数Ｃの値が定義された場合に当該値を示すデータをメモリに格納させるスピルアウト命令を生成し、変数Ｃを使用する毎にメモリからレジスタｒ２にデータを読み出すスピルイン命令を生成する。
【００７１】
（ｃ）は、本実施例に係る最適化コンパイラ１０による最適化結果である結果プログラムを示す。本図で示すように、最適化コンパイラ１０は、レジスタ割当手段１００により変数がレジスタに割り当てられた場合であってもなお使用可能なレジスタｒ２に、変数Ｂ又は変数Ｃの値を保持させることができる。これにより、スピルイン命令の実行回数を減らし、処理全体を高速化することができる。
【００７２】
図８は、本実施例の第３の適用例を示す。（ａ）は、最適化前の対象プログラムの一例を示す。本図において、レジスタ割当手段１００によりレジスタに割当不能と判断された変数についての値の定義を黒点で表し、当該変数についての値の使用を白抜点で表す。また、当該変数の値の生存区間を太実線で表す。
【００７３】
（ｂ）は、スピルイン命令生成手段１１０によりスピルイン命令が生成された対象プログラムの例を示す。スピルイン命令生成手段１１０は、レジスタ割当手段１００によりレジスタに割当不能と判断された変数について、当該変数の値が定義される毎に当該値をメモリに格納するスピルアウト命令を生成し、当該変数の値が使用される毎に当該値を使用する各命令に先立って当該変数の値をメモリからロードするスピルイン命令を生成する。
【００７４】
（ｃ）は、本実施例に係る最適化コンパイラ１０による最適化結果である結果プログラムを示す。本図は、レジスタ割当手段１００が変数を４つのレジスタに割り当てる場合を示しており、図の斜線部分は、レジスタ割当手段１００により既にレジスタが変数に割り当てられている範囲を示している。
【００７５】
例えば、最適化コンパイラ１０は、基本ブロック８２０中のスピルイン命令から実行順序を遡ることにより到達可能な基本ブロック８００及び基本ブロック８１０について、実行可能範囲に先行ロード命令があるか否かを判断する。そして、最適化コンパイラ１０は、基本ブロック８００に先行ロード命令が存在しないので、基本ブロック８００に先行ロード命令であるスピルイン命令を生成する。これにより、最適化コンパイラ１０は、基本ブロック８２０におけるスピルイン命令を削除することができる。
【００７６】
このように、最適化コンパイラ１０は、レジスタ割当手段１００により変数がレジスタに割り当てられた場合であってもなお使用可能なレジスタに、変数の値を保持させることができる。これにより、スピルイン命令の実行回数を減らし、処理全体を高速化することができる。
【００７７】
図９は、最適化コンパイラ１０として機能するコンピュータのハードウェア構成の一例を示す。最適化コンパイラ１０は、ホストコントローラ１０８２により相互に接続されるＣＰＵ１０００、ＲＡＭ１０２０、グラフィックコントローラ１０７５、及び表示装置１０８０を有するＣＰＵ周辺部と、入出力コントローラ１０８４によりホストコントローラ１０８２に接続される通信インターフェイス１０３０、ハードディスクドライブ１０４０、及びＣＤ−ＲＯＭドライブ１０６０を有する入出力部と、入出力コントローラ１０８４に接続されるＲＯＭ１０１０、フレキシブルディスクドライブ１０５０、及び入出力チップ１０７０を有するレガシー入出力部とを備える。
【００７８】
ホストコントローラ１０８２は、ＲＡＭ１０２０と、高い転送レートでＲＡＭ１０２０をアクセスするＣＰＵ１０００及びグラフィックコントローラ１０７５とを接続する。ＣＰＵ１０００は、ＲＯＭ１０１０及びＲＡＭ１０２０に格納されたプログラムに基づいて動作し、各部の制御を行う。グラフィックコントローラ１０７５は、ＣＰＵ１０００等がＲＡＭ１０２０内に設けたフレームバッファ上に生成する画像データを取得し、表示装置１０８０上に表示させる。これに代えて、グラフィックコントローラ１０７５は、ＣＰＵ１０００等が生成する画像データを格納するフレームバッファを、内部に含んでもよい。
【００７９】
入出力コントローラ１０８４は、ホストコントローラ１０８２と、比較的高速な入出力装置である通信インターフェイス１０３０、ハードディスクドライブ１０４０、及びＣＤ−ＲＯＭドライブ１０６０を接続する。通信インターフェイス１０３０は、ファイバチャネル等のネットワークを介して外部の装置と通信する。ハードディスクドライブ１０４０は、最適化コンパイラ１０が使用するコンパイラプログラム及びデータを格納する。ＣＤ−ＲＯＭドライブ１０６０は、ＣＤ−ＲＯＭ１０９５からコンパイラプログラム又はデータを読み取り、ＲＡＭ１０２０を介して入出力チップ１０７０に提供する。
【００８０】
また、入出力コントローラ１０８４には、ＲＯＭ１０１０と、フレキシブルディスクドライブ１０５０や入出力チップ１０７０等の比較的低速な入出力装置とが接続される。ＲＯＭ１０１０は、最適化コンパイラ１０の起動時にＣＰＵ１０００が実行するブートプログラムや、最適化コンパイラ１０のハードウェアに依存するプログラム等を格納する。フレキシブルディスクドライブ１０５０は、フレキシブルディスク１０９０からコンパイラプログラム又はデータを読み取り、ＲＡＭ１０２０を介して入出力チップ１０７０に提供する。入出力チップ１０７０は、フレキシブルディスク１０９０や、例えばパラレルポート、シリアルポート、キーボードポート、マウスポート等を介して各種の入出力装置を接続する。
【００８１】
最適化コンパイラ１０に提供されるコンパイラプログラムは、フレキシブルディスク１０９０、ＣＤ−ＲＯＭ１０９５、又はＩＣカード等の記録媒体に格納されて利用者によって提供される。コンパイラプログラムは、入出力チップ１０７０及び／又は入出力コントローラ１０８４を介して、記録媒体から読み出され最適化コンパイラ１０にインストールされて実行される。
【００８２】
最適化コンパイラ１０にインストールされて実行されるコンパイラプログラムは、レジスタ割当モジュールと、スピルイン命令生成モジュールと、実行可能範囲検出モジュールと、同一性判断モジュールと、コピー処理時間算出モジュールと、他命令処理時間解析モジュールと、命令生成モジュールと、命令置換モジュールと、ストア命令削除モジュールとを含む。各モジュールが最適化コンパイラ１０に働きかけて行わせる動作は、図１から図８において説明した最適化コンパイラ１０における、対応する部材の動作と同一であるから、説明を省略する。
【００８３】
以上に示したコンパイラプログラム又はモジュールは、外部の記憶媒体に格納されてもよい。記憶媒体としては、フレキシブルディスク１０９０、ＣＤ−ＲＯＭ１０９５の他に、ＤＶＤやＰＤ等の光学記録媒体、ＭＤ等の光磁気記録媒体、テープ媒体、ＩＣカード等の半導体メモリ等を用いることができる。また、専用通信ネットワークやインターネットに接続されたサーバシステムに設けたハードディスク又はＲＡＭ等の記憶装置を記録媒体として使用し、ネットワークを介してコンパイラプログラムを最適化コンパイラ１０に提供してもよい。
【００８４】
以上の説明から明らかなように、最適化コンパイラ１０は、レジスタ割当手段１００により変数がレジスタに割り当てられた場合であってもなお使用可能なレジスタに、変数の値を保持させることができる。これにより、スピルイン命令の実行回数を減らし、処理全体を高速化することができる。
【００８５】
以上、本発明を実施の形態を用いて説明したが、本発明の技術的範囲は上記実施の形態に記載の範囲には限定されない。上記実施の形態に、多様な変更または改良を加えることが可能であることが当業者に明らかである。その様な変更または改良を加えた形態も本発明の技術的範囲に含まれ得ることが、特許請求の範囲の記載から明らかである。
【００８６】
以上の説明から明らかなように、本実施例によれば、以下の各項目に示す最適化コンパイラ、コンパイル方法、コンパイラプログラム、及び記録媒体が実現される。
【００８７】
（項目１）  最適化対象の対象プログラムにおいて、メモリからレジスタにデータを読み出すロード命令を最適化する最適化コンパイラであって、前記対象プログラム中の最適化対象の対象ロード命令から実行順序を遡ることにより到達する全ての実行経路のそれぞれについて、ロード命令が実行された場合に当該ロード命令により読み出されたデータをレジスタに保持して前記対象ロード命令の実行位置に伝達可能である、当該ロード命令の実行可能範囲を検出する実行可能範囲検出手段と、前記実行経路のそれぞれについて、前記実行可能範囲において前記対象ロード命令に先立って実行される、前記対象ロード命令と同一のアドレスから同一のデータを読み出す先行ロード命令が存在しない場合に、前記実行可能範囲内に前記先行ロード命令を生成する命令生成手段と、前記対象ロード命令を削除すると共に、前記対象ロード命令により読み出されたデータを使用する命令を、前記先行ロード命令により読み出されレジスタに保持されて伝播されるデータを使用する命令に置換する命令置換手段とを備える最適化コンパイラ。
（項目２）  変数をレジスタに割り当てるレジスタ割当手段と、前記レジスタ割当手段によりレジスタに割当不能と判断された各変数について、当該変数の値を使用する各命令に先立って当該変数の値をメモリからロードするスピルイン命令を生成するスピルイン命令生成手段とを更に備え、前記実行可能範囲検出手段は、前記スピルイン命令を前記対象ロード命令である対象スピルイン命令として、前記対象スピルイン命令を遡ることにより到達可能な全ての実行経路のそれぞれについて前記実行可能範囲を検出し、前記命令生成手段は、前記実行経路のそれぞれについて、前記実行可能範囲において前記対象スピルイン命令についての前記先行ロード命令が存在しない場合に、前記実行可能範囲内に前記先行ロード命令を生成し、前記命令置換手段は、前記対象スピルイン命令を削除すると共に、前記対象スピルイン命令により読み出されたデータを使用する命令を、前記先行ロード命令により読み出されレジスタに保持されて伝播されるデータを使用する命令に置換する項目１記載の最適化コンパイラ。
【００８８】
（項目３）  前記実行可能範囲検出手段は、互いに同一のアドレスから同一のデータを読み出す複数の前記対象ロード命令のそれぞれについて、前記複数の実行経路における前記実行可能範囲を検出し、前記命令生成手段は、第１の前記対象ロード命令における前記実行経路のそれぞれについて、前記実行可能範囲において前記先行ロード命令が存在せず、かつ当該実行可能範囲及び第２の前記対象ロード命令における実行可能範囲の少なくとも一部が重複する場合に、当該重複する範囲内に前記先行ロード命令を生成し、前記命令置換手段は、前記先行ロード命令より後に実行されることが定まっておりかつ前記実行可能範囲に存在する全ての対象ロード命令を削除すると共に、前記全ての対象ロード命令のそれぞれにより読み出されたデータを使用する命令のそれぞれを、前記先行ロード命令により読み出されレジスタに保持されて伝播されるデータを使用する命令に置換する項目１記載の最適化コンパイラ。
（項目４）  前記命令生成手段は、前記実行可能範囲の何れかが互いに重複する複数の対象ロード命令について、当該複数の対象ロード命令についての計算的最適性（computational optimality）を満たす範囲内に、前記先行ロード命令を生成する項目３記載の最適化コンパイラ。
（項目５）  前記計算的最適性を保持する場合において、前記命令生成手段により生成される先行ロード命令及び他の先行ロード命令における読み出し先のレジスタを同一に設定できか否かを判断する同一性判断手段を更に備え、同一に設定できない場合に、前記命令生成手段は、前記実行可能範囲のうち、当該計算的最適性が満たされず、かつ当該先行ロード命令及び他の先行ロード命令による読み出し先のレジスタを同一に設定可能となる位置に、当該先行ロード命令を生成する項目４記載の最適化コンパイラ。
【００８９】
（項目６）  前記同一性判断手段によりレジスタを同一に設定できないと判断された場合に、レジスタを同一に設定しない場合にレジスタ間においてデータをコピーする処理に要するコピー処理時間と、レジスタを同一に設定した場合に前記計算的最適性を満たす場合と比較して追加されるロード命令の処理時間である追加命令処理時間とを算出するコピー処理時間算出手段を更に備え、前記命令生成手段は、前記追加命令処理時間が前記コピー処理時間より大きいことを更に条件として、当該計算的最適性が満たされず、かつ当該先行ロード命令及び他の先行ロード命令による読み出し先のレジスタを同一に設定可能となる位置に、当該先行ロード命令を生成する項目５記載の最適化コンパイラ。
（項目７）  前記命令生成手段は、前記計算的最適性を満たす範囲のうち、更に、前記先行ロード命令により読み出されたデータの生存区間が最小となる生存区間的最適性（lifetime optimality）を満たす位置に、前記先行ロード命令を生成する項目４記載の最適化コンパイラ。
（項目８）  前記生存区間的最適性を満たす位置から、前記先行ロード命令により読み出されるデータを使用する命令の実行位置までに他の命令が実行されるのに要する処理時間である必要処理時間と、前記先行ロード命令の実行を開始してからデータの読み出しが完了するまでに要するロード処理時間とを解析するロード遅延解析手段を更に備え、前記命令生成手段は、前記必要処理時間が、前記ロード処理時間より小さい場合に、前記生存区間的最適性を満たす位置に先立って実行される位置に、前記先行ロード命令を生成する項目７記載の最適化コンパイラ。
【００９０】
（項目９）  前記命令生成手段は、前記必要処理時間が前記ロード処理時間より小さい場合に、前記生存区間的最適性を満たす位置から、前記ロード処理時間から前記必要処理時間を減じた時間先立って実行される実行位置に、前記先行ロード命令を生成する項目８記載の最適化コンパイラ。
（項目１０）  前記命令生成手段は、前記実行経路のそれぞれについて前記実行可能範囲に先行ロード命令が存在しない場合に、前記先行ロード命令として、他の先行ロード命令がデータを読み出すレジスタと同一である共通レジスタにデータを読み出すロード命令を生成し、前記命令置換手段は、前記対象ロード命令により読み出されたデータを使用する命令を、前記共通レジスタに保持されたデータを使用する命令に置換する項目１記載の最適化コンパイラ。
（項目１１）  前記命令置換手段により前記対象ロード命令が削除された場合に、当該対象ロード命令によってのみ読み出されており、かつ生成された前記先行ロード命令により読み出されないデータを書き込むストア命令を削除するストア命令削除手段を更に備える項目１記載の最適化コンパイラ。
（項目１２）  最適化対象の対象プログラムにおいて、メモリからレジスタにデータを読み出すロード命令を最適化する最適化コンパイラであって、前記対象プログラム中の最適化対象の対象ロード命令から実行順序を遡ることにより到達する全ての実行経路のそれぞれについて、ロード命令が実行された場合に当該ロード命令により読み出されたデータをレジスタに保持して前記対象ロード命令の実行位置に伝達可能である、当該ロード命令の実行可能範囲を検出する実行可能範囲検出手段と、前記実行経路のそれぞれについて、前記実行可能範囲において前記対象ロード命令に先立って実行される、前記対象ロード命令と同一のアドレスから同一のデータを読み出す先行ロード命令が存在する場合に、前記対象ロード命令を削除すると共に、前記対象ロード命令により読み出されたデータを使用する命令を、前記先行ロード命令により読み出されレジスタに保持されて伝播されるデータを使用する命令に置換する命令置換手段とを備える最適化コンパイラ。
【００９１】
（項目１３）  最適化対象の対象プログラムにおいて、メモリからレジスタにデータを読み出すロード命令を最適化するコンパイル方法であって、前記対象プログラム中の最適化対象の対象ロード命令から実行順序を遡ることにより到達する全ての実行経路のそれぞれについて、ロード命令が実行された場合に当該ロード命令により読み出されたデータをレジスタに保持して前記対象ロード命令の実行位置に伝達可能である、当該ロード命令の実行可能範囲を検出する実行可能範囲検出段階と、前記実行経路のそれぞれについて、前記実行可能範囲において前記対象ロード命令に先立って実行される、前記対象ロード命令と同一のアドレスから同一のデータを読み出す先行ロード命令が存在しない場合に、前記実行可能範囲内に前記先行ロード命令を生成する命令生成段階と、前記対象ロード命令を削除すると共に、前記対象ロード命令により読み出されたデータを使用する命令を、前記先行ロード命令により読み出されレジスタに保持されて伝播されるデータを使用する命令に置換する命令置換段階とを備えるコンパイル方法。
（項目１４）  最適化対象の対象プログラムにおいて、メモリからレジスタにデータを読み出すロード命令を最適化する最適化コンパイラとしてコンピュータを機能させるコンパイラプログラムであって、前記対象プログラム中の最適化対象の対象ロード命令から実行順序を遡ることにより到達する全ての実行経路のそれぞれについて、ロード命令が実行された場合に当該ロード命令により読み出されたデータをレジスタに保持して前記対象ロード命令の実行位置に伝達可能である、当該ロード命令の実行可能範囲を検出する実行可能範囲検出手段と、前記実行経路のそれぞれについて、前記実行可能範囲において前記対象ロード命令に先立って実行される、前記対象ロード命令と同一のアドレスから同一のデータを読み出す先行ロード命令が存在しない場合に、前記実行可能範囲内に前記先行ロード命令を生成する命令生成手段と、前記対象ロード命令を削除すると共に、前記対象ロード命令により読み出されたデータを使用する命令を、前記先行ロード命令により読み出されレジスタに保持されて伝播されるデータを使用する命令に置換する命令置換手段として機能させるコンパイラプログラム。
（項目１５）  項目１４記載のコンパイラプログラムを記録した記録媒体。
【図面の簡単な説明】
【００９２】
【図１】図１は、最適化コンパイラ１０の機能ブロック図である。
【図２】図２は、最適化コンパイラ１０の動作フローを示す図である。
【図３】図３は、図２におけるＳ２４０の詳細を示す動作フローである。
【図４】図４は、図３におけるＳ３１０の処理を説明する図である。
【図５】図５は、図２におけるＳ２５０の詳細を示す動作フローである。
【図６】図６は、本実施例の第１の適用例を示す。（ａ）は、レジスタ割当手段１００により変数がレジスタに割り当てられた対象プログラムの例を示す。（ｂ）は、スピルイン命令生成手段１１０によりスピルイン命令が生成された対象プログラムの例を示す。（ｃ）は、本実施例に係る最適化コンパイラ１０による最適化結果である結果プログラムを示す。
【図７】図７は、本実施例の第２の適用例を示す。（ａ）は、レジスタ割当手段１００により変数がレジスタに割り当てられた対象プログラムの例を示す。（ｂ）は、スピルイン命令生成手段１１０によりスピルイン命令が生成された対象プログラムの例を示す。（ｃ）は、本実施例に係る最適化コンパイラ１０による最適化結果である結果プログラムを示す。
【図８】図８は、本実施例の第３の適用例を示す。（ａ）は、最適化前の対象プログラムの一例を示す。（ｂ）は、スピルイン命令生成手段１１０によりスピルイン命令が生成された対象プログラムの例を示す。（ｃ）は、本実施例に係る最適化コンパイラ１０による最適化結果である結果プログラムを示す。
【図９】図９は、最適化コンパイラ１０として機能するコンピュータのハードウェア構成の一例を示す。
【符号の説明】
【００９３】
１０  最適化コンパイラ
１００  レジスタ割当手段
１１０  スピルイン命令生成手段
１２０  実行可能範囲生成手段
１２５  ロード遅延解析手段
１３０  同一性判断手段
１４０  コピー処理時間算出手段
１５０  命令生成手段
１６０  命令置換手段
１７０  スピルアウト命令削除手段
８００  基本ブロック
８１０  基本ブロック
８２０  基本ブロック
【図１】
2005078474.tif 000010
【図２】
2005078474.tif 000011
【図３】
2005078474.tif 000012
【図４】
2005078474.tif 000013
【図５】
2005078474.tif 000014
【図６】
2005078474.tif 000015
【図７】
2005078474.tif 000016
【図８】
2005078474.tif 000017
【図９】
2005078474.tif 000018