(57)【要約】【課題】メモリからデータを読み出すロード命令を効率的に最適化する。【解決手段】最適化対象の対象プログラムにおいて、メモリからデータを読み出すロード命令を最適化する最適化コンパイラであって、メモリから変数にデータを読み出すロード命令に対して、変数がレジスタに割り当てられた場合にスピル処理を生じさせない部分冗長性の除去処理を行う部分冗長性除去手段と、ロード命令が読み出すデータを使用する命令から実行順序を遡ることによりロード命令に到達する実行経路において、何れの変数にも割り当てられていない空きレジスタを検出する後進方向レジスタ検出手段と、ロード命令がデータを読み出す読出先変数に、後進方向レジスタ検出手段により検出された空きレジスタを割り当てる空きレジスタ割当手段とを備える最適化コンパイラを提供する。【選択図】図１
2005107816.tif 000002
【特許請求の範囲】
【請求項１】
最適化対象の対象プログラムにおいて、メモリからデータを読み出すロード命令を最適化する最適化コンパイラであって、
少なくとも一部の変数がレジスタに割り当てられていない前記対象プログラムにおいて、メモリから変数にデータを読み出すロード命令に対して、当該変数がレジスタに割り当てられた場合にスピル処理を生じさせない部分冗長性の除去処理を行う部分冗長性除去手段と、
前記ロード命令が読み出すデータを使用する使用命令から実行順序を遡ることにより前記ロード命令に到達する実行経路において、何れの変数にも割り当てられていない空きレジスタを検出する後進方向レジスタ検出手段と、
前記ロード命令がデータを読み出す読出先変数に、前記後進方向レジスタ検出手段により検出された前記空きレジスタを割り当てる空きレジスタ割当手段と
を備える最適化コンパイラ。
【請求項２】
前記後進方向レジスタ検出手段は、前記対象プログラムの終端から実行順序を遡る方向に空きレジスタの集合を示す情報を伝播させ、かつ反復解法によって空きレジスタの数が単調減少するデータフロー方程式として表される処理により、空きレジスタを検出する
請求項１記載の最適化コンパイラ。
【請求項３】
前記使用命令から実行順序を遡ることにより前記ロード命令に到達する実行経路において空きレジスタが検出されない場合に、前記空きレジスタ割当手段は、前記読出先変数に、前記ロード命令の実行位置における空きレジスタの何れかを割り当て、
当該最適化コンパイラは、
前記読出先変数に割り当てられたレジスタに既に割り当てられていた既割当変数の、値の生存区間を検出する生存区間検出手段と、
前記生存区間における空きレジスタである代替レジスタを検出する代替レジスタ検出手段と、
前記既割当変数に割り当てられていたレジスタを、前記代替レジスタに変更する割当レジスタ変更手段と
を更に備える請求項１記載の最適化コンパイラ。
【請求項４】
変数をレジスタに割り当てるレジスタ割当処理手段と、
前記レジスタ割当処理手段によりレジスタに割当不能と判断された各変数について、当該変数の値を使用する命令に先立って当該変数の値をメモリからロードするスピルイン命令を生成するスピルイン命令生成手段と
を更に備え、
前記部分冗長性除去手段は、前記ロード命令であるスピルイン命令に対して、前記部分冗長性の除去処理を行い、更に、当該スピルイン命令が読み出すデータを格納するレジスタを、当該最適化コンパイラ内で使用する変数に置き換え、
前記空きレジスタ割当手段は、前記部分冗長性除去手段が置き換えた変数に、前記後進方向レジスタ検出手段により検出された前記空きレジスタを割り当てる
請求項１記載の最適化コンパイラ。
【請求項５】
複数の前記レジスタには、変数を割り当てる優先順位が予め定められており、
前記レジスタ割当処理手段は、変数を前記優先順位がより高いレジスタに優先して割り当て、
前記使用命令から実行順序を遡ることにより前記ロード命令に到達する実行経路において空きレジスタが検出されない場合に、前記空きレジスタ割当手段は、前記ロード命令の実行位置における空きレジスタのうち前記優先順位が最も高いレジスタを、前記読出先変数に割り当て、
当該最適化コンパイラは、
前記ロード命令から前記使用命令に至る実行経路において、前記読出先変数に割り当てられたレジスタに他の変数のデータを代入する命令に先立って実行される実行位置に、前記優先順位が最も高い空きレジスタに前記読出先変数のデータをコピーする命令を生成するコピー命令生成手段と、
前記使用命令が使用する変数に、当該コピー命令のコピー先であるレジスタを割り当てる使用命令レジスタ割当手段と
を更に備える請求項４記載の最適化コンパイラ。
【請求項６】
前記ロード命令から実行順序を辿ることにより前記ロード命令が読み出すデータを使用する使用命令に到達する実行経路において、何れの変数にも割り当てられていない空きレジスタを検出する前進方向レジスタ検出手段を更に備え、
前記空きレジスタ割当手段は、前記読出先変数に、前記後進方向レジスタ検出手段及び前記前進方向レジスタ検出手段により共通して検出された空きレジスタを割り当てる
請求項１記載の最適化コンパイラ。
【請求項７】
最適化対象の対象プログラムにおいて、メモリからデータを読み出すロード命令を最適化する最適化コンパイラであって、
少なくとも一部の変数がレジスタに割り当てられていない前記対象プログラムにおいて、メモリから変数にデータを読み出すロード命令に対して、当該変数がレジスタに割り当てられた場合にスピル処理を生じさせない部分冗長性の除去処理を行う部分冗長性除去手段と、
前記ロード命令から実行順序を辿ることにより前記ロード命令が読み出すデータを使用する使用命令に到達する実行経路において、何れの変数にも割り当てられていない空きレジスタを検出する前進方向レジスタ検出手段と、
前記ロード命令がデータを読み出す読出先変数に、前記前進方向レジスタ検出手段により検出された前記空きレジスタを割り当てる空きレジスタ割当手段と
を備える最適化コンパイラ。
【請求項８】
前記前進方向レジスタ検出手段は、前記対象プログラムの始点から実行順序を辿る方向に空きレジスタの集合を示す情報を伝播させ、かつ反復解法によって空きレジスタの数が単調減少するデータフロー方程式として表される処理により、空きレジスタを検出する
請求項７記載の最適化コンパイラ。
【請求項９】
最適化対象の対象プログラムにおいて、メモリからデータを読み出すロード命令を最適化する最適化コンパイラであって、
少なくとも一部の変数がレジスタに割り当てられていない前記対象プログラムにおいて、メモリから変数にデータを読み出すロード命令に対して、当該変数がレジスタに割り当てられた場合にスピル処理を生じさせない部分冗長性の除去処理を行う部分冗長性除去手段と、
前記ロード命令が実行される実行頻度と、当該ロード命令により読み出されるデータを使用する使用命令が実行される実行頻度とを取得する実行頻度取得手段と、
前記ロード命令及び前記使用命令のそれぞれが実行される実行位置において、何れの変数にも割り当てられていない空きレジスタの集合を検出する空きレジスタ検出手段と、
前記ロード命令及び前記使用命令の実行頻度を、前記ロード命令又は前記使用命令の実行位置における空きレジスタ毎に合計した実行頻度合計値を算出する実行頻度合計値算出手段と、
前記ロード命令の実行位置における前記空きレジスタのうち前記実行頻度合計値が最も高い前記空きレジスタを、前記ロード命令の読み出し先の読出先変数に割り当てる空きレジスタ割当手段と
を備える最適化コンパイラ。
【請求項１０】
前記ロード命令から前記使用命令に至る実行経路において、前記読出先変数に割り当てられたレジスタに他の変数のデータを代入する命令に先立って実行される実行位置に、前記読出先変数のデータを前記実行頻度合計値が最も高い空きレジスタにコピーする命令を生成するコピー命令生成手段と、
前記使用命令が使用する変数に、当該コピー命令のコピー先であるレジスタを割り当てる使用命令レジスタ割当手段と
を更に備える請求項９記載の最適化コンパイラ。
【請求項１１】
最適化対象の対象プログラムにおいて、メモリからデータを読み出すロード命令を最適化する最適化コンパイラとしてコンピュータを機能させるコンパイラプログラムであって、
前記コンピュータを、
少なくとも一部の変数がレジスタに割り当てられていない前記対象プログラムにおいて、メモリから変数にデータを読み出すロード命令に対して、当該変数がレジスタに割り当てられた場合にスピル処理を生じさせない部分冗長性の除去処理を行う部分冗長性除去手段と、
前記ロード命令が読み出すデータを使用する使用命令から実行順序を遡ることにより前記ロード命令に到達する実行経路において、何れの変数にも割り当てられていない空きレジスタを検出する後進方向レジスタ検出手段と、
前記ロード命令がデータを読み出す読出先変数に、前記後進方向レジスタ検出手段により検出された前記空きレジスタを割り当てる空きレジスタ割当手段と
して機能させるコンパイラプログラム。
【請求項１２】
最適化対象の対象プログラムにおいて、メモリからデータを読み出すロード命令を最適化する最適化コンパイラとしてコンピュータを機能させるコンパイラプログラムであって、
前記コンピュータを、
少なくとも一部の変数がレジスタに割り当てられていない前記対象プログラムにおいて、メモリから変数にデータを読み出すロード命令に対して、当該変数がレジスタに割り当てられた場合にスピル処理を生じさせない部分冗長性の除去処理を行う部分冗長性除去手段と、
前記ロード命令から実行順序を辿ることにより前記ロード命令が読み出すデータを使用する使用命令に到達する実行経路において、何れの変数にも割り当てられていない空きレジスタを検出する前進方向レジスタ検出手段と、
前記ロード命令がデータを読み出す読出先変数に、前記前進方向レジスタ検出手段により検出された前記空きレジスタを割り当てる空きレジスタ割当手段と
して機能させるコンパイラプログラム。
【請求項１３】
最適化対象の対象プログラムにおいて、メモリからデータを読み出すロード命令を最適化する最適化コンパイラとしてコンピュータを機能させるコンパイラプログラムであって、
前記コンピュータを、
少なくとも一部の変数がレジスタに割り当てられていない前記対象プログラムにおいて、メモリから変数にデータを読み出すロード命令に対して、当該変数がレジスタに割り当てられた場合にスピル処理を生じさせない部分冗長性の除去処理を行う部分冗長性除去手段と、
前記ロード命令が実行される実行頻度と、当該ロード命令により読み出されるデータを使用する使用命令が実行される実行頻度とを取得する実行頻度取得手段と、
前記ロード命令及び前記使用命令のそれぞれが実行される実行位置において、何れの変数にも割り当てられていない空きレジスタの集合を検出する空きレジスタ検出手段と、
前記ロード命令及び前記使用命令の実行頻度を、前記ロード命令又は前記使用命令の実行位置における空きレジスタ毎に合計した実行頻度合計値を算出する実行頻度合計値算出手段と、
前記ロード命令の実行位置における前記空きレジスタのうち前記実行頻度合計値が最も高い前記空きレジスタを、前記ロード命令の読み出し先の読出先変数に割り当てる空きレジスタ割当手段と
して機能させるコンパイラプログラム。
【請求項１４】
請求項１１から請求項１３の何れかに記載のコンパイラプログラムを記録した記録媒体。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、最適化コンパイラ、コンパイラプログラム、及び記録媒体に関する。特に本発明は、メモリからデータを読み出すロード命令を最適化する最適化コンパイラ、コンパイラプログラム、及び記録媒体に関する。
【背景技術】
【０００２】
近年、技術革新により、コンピュータの中央処理装置の動作速度が高速になっている。このため、中央処理装置のレジスタからのデータ読出し時間に対して、メモリアクセスに要する時間が、相対的に大きくなってきている。従って、プログラム全体の処理速度を向上するには、プログラムで使用される変数の値をできるだけレジスタに保持してメモリアクセス量を減らすことがますます重要になってきている。
【０００３】
従来、最適化コンパイラは、メモリに対するアクセス量を減らして処理全体を効率化するべく、最適化対象の対象プログラムにおける変数を、レジスタに有効に割り当てるレジスタ割当機能を有している。そして、最適化コンパイラは、レジスタに割り当てられた変数の値を当該レジスタに保持させる一方、レジスタに割当不能と判断された変数の値をメモリに格納させる。そして、最適化コンパイラは、メモリに格納された変数の値を参照する命令に先立って、変数の値をメモリから読み出させるスピルイン命令を生成する。
【０００４】
また、近年の最適化コンパイラにおいて、当該複数の命令のうち冗長な命令を削除して処理全体を効率化する冗長性除去技術が用いられている。この際、最適化コンパイラは、冗長性を効果的に除去するために、命令の実行位置を変更する場合が多い。従来、命令の実行位置を変更する場合に、当該命令の演算結果を格納する変数を新たに生成しないように制御する技術が用いられている（非特許文献１参照。）。また、変数をレジスタに割り当てた場合であっても新たにスピル処理を生じさせない範囲内で、命令の実行位置を変更する技術が提案されている（非特許文献２参照。）。
【０００５】
【非特許文献１】J.Knoop et al., The Power of Assignment Motion, PLDI'95.
【非特許文献２】R.Gupta and R.Bodik, Register presure sensitive redundancy elimination, In Proceedings of the 8th International Conference on Compiler Construction, LNCS 1575, p.107-121, 1999.
【発明の開示】
【発明が解決しようとする課題】
【０００６】
上記冗長性除去技術は、スピルイン命令に対して適用可能である。しかしながら、非特許文献１によると、スピルイン命令によるデータの読み出し先のレジスタが他の命令で用いられている場合には、スピルイン命令の実行位置を変更する範囲が制限される問題があった。また、非特許文献２の技術は、冗長性除去の対象となる命令について、当該命令の実行位置を変更することができる範囲を検出することができるものの、変数に割り当てるべきレジスタを定めることはできない。
【０００７】
そこで本発明は、上記の課題を解決することのできる最適化コンパイラ、コンパイラプログラム、及び記録媒体を提供することを目的とする。この目的は特許請求の範囲における独立項に記載の特徴の組み合わせにより達成される。また従属項は本発明の更なる有利な具体例を規定する。
【課題を解決するための手段】
【０００８】
上記課題を解決するために、本発明の第１の形態においては、最適化対象の対象プログラムにおいて、メモリからデータを読み出すロード命令を最適化する最適化コンパイラであって、少なくとも一部の変数がレジスタに割り当てられていない対象プログラムにおいて、メモリから変数にデータを読み出すロード命令に対して、当該変数がレジスタに割り当てられた場合にスピル処理を生じさせない部分冗長性の除去処理を行う部分冗長性除去手段と、ロード命令が読み出すデータを使用する使用命令から実行順序を遡ることによりロード命令に到達する実行経路において、何れの変数にも割り当てられていない空きレジスタを検出する後進方向レジスタ検出手段と、ロード命令がデータを読み出す読出先変数に、後進方向レジスタ検出手段により検出された空きレジスタを割り当てる空きレジスタ割当手段とを備える最適化コンパイラ、コンピュータを最適化コンパイラとして機能させるコンパイラプログラム、及びコンパイラプログラムを記録した記録媒体を提供する。
【０００９】
なお、上記の発明の概要は、本発明の必要な特徴の全てを列挙したものではなく、これらの特徴群のサブコンビネーションもまた、発明となりうる。
【発明の効果】
【００１０】
本発明によれば、メモリからデータを読み出すロード命令を効率的に最適化できる。
【発明を実施するための最良の形態】
【００１１】
以下、発明の実施の形態を通じて本発明を説明するが、以下の実施形態は特許請求の範囲にかかる発明を限定するものではなく、また実施形態の中で説明されている特徴の組み合わせの全てが発明の解決手段に必須であるとは限らない。
【００１２】
図１は、最適化コンパイラ１０の機能ブロック図である。最適化コンパイラ１０は、最適化対象の対象プログラムにおいて、メモリからデータを読み出すロード命令を最適化する。最適化コンパイラ１０は、レジスタ割当処理手段１００と、スピルイン命令生成手段１１０と、部分冗長性除去手段１３０と、空きレジスタ検出手段１４０と、後進方向レジスタ検出手段１４２と、前進方向レジスタ検出手段１４４と、実行頻度取得手段１５０と、実行頻度合計値算出手段１６０と、空きレジスタ割当手段１７０と、生存区間検出手段１８０と、代替レジスタ検出手段１８２と、割当レジスタ変更手段１８４と、コピー命令生成手段１９０と、使用命令レジスタ割当手段１９２とを備える。
【００１３】
最適化コンパイラ１０は、対象プログラムに含まれる複数の変数をレジスタに割り当て、割当不能と判断した各変数について、変数の値をメモリからロードするスピルイン命令を生成する。そして、最適化コンパイラ１０は、複数のスピルイン命令が互いに同一の処理を行う冗長な命令である場合に、当該複数のスピルイン命令の少なくとも一部を削除することにより処理全体を効率化する部分冗長性の除去処理を行う。そして、最適化コンパイラ１０は、部分冗長性の除去処理を行った複数のスピルイン命令のそれぞれについて、当該スピルイン命令の読み出し先である読出先変数に割り当てるレジスタとして利用可能な空きレジスタの集合を取得し、読出先変数にレジスタを割り当てる。
本実施形態に係る最適化コンパイラ１０は、検出した空きレジスタの集合を絞り込んで読出先変数に適切なレジスタを割り当てることにより、効率的にロード命令を最適化することを目的とする。
【００１４】
ここで、対象プログラムとは、例えば、最適化コンパイラ１０内で最適化対象のプログラムを表す中間表現であり、一例としては、Ｊａｖａ（登録商標）言語におけるバイトコード、ＲＴＬ（Ｒｅｇｉｓｔｅｒ  Ｔｒａｎｓｆｅｒ  Ｌａｎｇｕａｇｅ）、又は４つ組表現である。これに代えて、対象プログラムとは、プログラムのソースコードであってもよい。また、変数とは、ソースコードにおける変数そのものに限定されず、例えば、対象プログラムにおける値の生存区間であってもよい。
【００１５】
また、レジスタとは、対象プログラムを実行する中央処理装置において使用可能な全てのレジスタとは限らず、情報処理装置のオペレーティングシステム又はプログラミング言語等の仕様により予め定められ、対象プログラムにおける使用が許可されているレジスタ群に含まれていればよい。例えば、対象プログラムから呼び出されるライブラリプログラム等により使用され内容が変更され得るレジスタを含まなくてもよい。
【００１６】
レジスタ割当処理手段１００は、対象プログラムを受け取ると、当該対象プログラムにおける変数をレジスタに割り当て、当該割り当て処理を行った結果の対象プログラムをスピルイン命令生成手段１１０に送る。この場合、好ましくは、レジスタ割当処理手段１００は、複数のレジスタに予め定められた割当優先順位に基づいて、変数を割当優先順位がより高いレジスタに優先して割り当てる。これにより、レジスタ割当処理手段１００は、割り当てるレジスタを特定の種類のレジスタに偏らせ、所定の実行経路において一貫して使用可能な空きレジスタの数を増やすことができる。
【００１７】
スピルイン命令生成手段１１０は、受け取った対象プログラムにおいて、レジスタ割当処理手段１００によりレジスタに割当不能と判断された各変数について、スピルイン命令を生成し、当該生成処理を行った結果の対象プログラムを部分冗長性除去手段１３０に送る。ここで、スピルイン命令とは、変数の値を使用する命令に先立って変数の値をメモリからロードするロード命令である。
【００１８】
部分冗長性除去手段１３０は、受け取った対象プログラムにおけるロード命令であるスピルイン命令に対して、部分冗長性の除去処理を行う。具体的には、部分冗長性除去手段１３０は、各ロード命令を、少なくとも１の空きレジスタが存在する範囲で移動させることにより、変数がレジスタに割り当てられた場合にスピル処理を生じさせない部分冗長性の除去処理を行う。一例として、部分冗長性除去手段１３０は、非特許文献２に記載した技術により部分冗長性の除去処理を行ってもよい。更に、部分冗長性除去手段１３０は、スピルイン命令が読み出すデータを格納するレジスタを、最適化コンパイラ１０内で使用する変数に置き換える。
そして、部分冗長性除去手段１３０は、当該置き換え処理を行った結果の対象プログラムを、空きレジスタ検出手段１４０及び実行頻度取得手段１５０に送る。
【００１９】
処理の具体例として、部分冗長性除去手段１３０は、複数のロード命令が冗長である場合に、当該複数のロード命令の少なくとも一部を削除してもよいし、当該複数のロード命令の少なくとも一部の実行位置を変更してもよい。また、変数をレジスタに割当済みの対象プログラムに対して部分冗長性の除去処理を行うのに代えて、部分冗長性除去手段１３０は、少なくとも一部の変数がレジスタに割り当てられていない対象プログラムにおいて、メモリから変数にデータを読み出すロード命令に対して、変数がレジスタに割り当てられた場合にスピル処理を生じさせない部分冗長性の除去処理を行ってもよい。ここで、レジスタに割り当てられていない変数とは、部分冗長性の除去処理が行われる時点でレジスタに割り当てられていない変数だけでなく、既にレジスタに割り当てられている変数であっても、対象プログラムから結果プログラムを生成する過程において、最終的に当該レジスタとは異なるレジスタに割り当てられる変数を含んでいてもよい。
【００２０】
空きレジスタ検出手段１４０は、ロード命令及びロード命令が読み出すデータを使用する使用命令のそれぞれが実行される実行位置において、何れの変数にも割り当てられていない空きレジスタの集合を検出し、検出結果を後進方向レジスタ検出手段１４２に送る。後進方向レジスタ検出手段１４２は、空きレジスタ検出手段１４０により検出された空きレジスタの集合のうち、使用命令から実行順序を遡ることによりロード命令に到達する実行経路において、何れの変数にも割り当てられていない空きレジスタを検出し、検出結果を前進方向レジスタ検出手段１４４に送る。前進方向レジスタ検出手段１４４は、後進方向レジスタ検出手段１４２により検出された空きレジスタの集合のうち、ロード命令から実行順序を辿ることにより使用命令に到達する実行経路において、何れの変数にも割り当てられていない空きレジスタを検出する。そして、前進方向レジスタ検出手段１４４は、この検出結果を、実行頻度合計値算出手段１６０及び空きレジスタ割当手段１７０に送る。
【００２１】
実行頻度取得手段１５０は、部分冗長性除去手段１３０から受け取った対象プログラムにおいて、ロード命令が実行される実行頻度と使用命令が実行される実行頻度とを取得し、取得結果を実行頻度合計値算出手段１６０に送る。実行頻度取得手段１５０は、例えば、ノードプロファイル手法やエッジプロファイル手法等のプロファイル技術を用いて対象プログラムに含まれる複数の命令それぞれの実行頻度を計測することにより、ロード命令及び使用命令の実行頻度を取得してもよい。実行頻度合計値算出手段１６０は、前進方向レジスタ検出手段１４４から受け取った空きレジスタの検出結果に基づいて、実行頻度取得手段１５０から受け取ったロード命令及び使用命令の実行頻度を、ロード命令及び使用命令の実行位置における空きレジスタ毎に合計した実行頻度合計値を算出し、算出結果を空きレジスタ割当手段１７０に送る。
【００２２】
空きレジスタ割当手段１７０は、後進方向レジスタ検出手段１４２及び前進方向レジスタ検出手段１４４により共通して検出された、ロード命令の実行位置における空きレジスタのうち、実行頻度合計値算出手段１６０により算出された実行頻度合計値が最も高い空きレジスタをロード命令の読み出し先の読出先変数に割り当て、当該割り当て処理を行った結果の対象プログラムを、結果プログラムとして出力する。ここで、読出先変数とは、ロード命令により読み出されるデータを格納するレジスタを部分冗長性除去手段１３０が置き換えた、最適化コンパイラ１０内で使用する変数であってよい。
【００２３】
但し、使用命令から実行順序を遡ることによりロード命令に到達する実行経路において空きレジスタが検出されない場合に、空きレジスタ割当手段１７０は、ロード命令の実行位置における空きレジスタの何れかを読出先変数に割り当て、当該割り当て処理を行った結果の対象プログラムを生存区間検出手段１８０又はコピー命令生成手段１９０に送る。例えば、空きレジスタ割当手段１７０は、ロード命令の実行位置における実行頻度合計値が最も高い空きレジスタ、又はロード命令の実行位置における割当優先順位が最も高い空きレジスタを読出先変数に割り当ててもよい。
【００２４】
生存区間検出手段１８０は、受け取った対象プログラムにおいて、空きレジスタ割当手段１７０により読出先変数に割り当てられたレジスタに既に割り当てられていた既割当変数の、値の生存区間を検出し、検出結果を代替レジスタ検出手段１８２に送る。代替レジスタ検出手段１８２は、生存区間検出手段１８０が検出した生存区間における空きレジスタである代替レジスタを検出し、検出結果を割当レジスタ変更手段１８４に送る。これを受けて、割当レジスタ変更手段１８４は、既割当変数に割り当てられていたレジスタを代替レジスタに変更し、当該変更した結果の対象プログラムを結果プログラムとして出力する。
【００２５】
コピー命令生成手段１９０は、受け取った対象プログラムのロード命令から使用命令に至る実行経路において、空きレジスタ割当手段１７０により読出先変数に割り当てられたレジスタに他の変数のデータを代入する命令に先立って実行される実行位置に、実行頻度合計値が最も高い空きレジスタに読出先変数のデータをコピーする命令を生成し、当該生成処理を行った結果の対象プログラムを使用命令レジスタ割当手段１９２に送る。これに代えて、コピー命令生成手段１９０は、レジスタ割当処理手段１００において用いられた優先順位が最も高い空きレジスタに読出先変数のデータをコピーする命令を生成してもよい。
【００２６】
また、コピー命令生成手段１９０は、複数の実行経路の合流点において、各実行経路で読出先変数に割り当てられたレジスタが一致するように、即ち、一の実行経路における読出先変数に割り当てられたレジスタの集合であるレジスタイメージと、他の実行経路におけるレジスタイメージとが一致するように、合流点の直前にコピー命令を生成してもよい。このとき、コピー命令生成手段１９０は、当該複数の実行経路のそれぞれにおける実行頻度に基づいて、コピー命令を生成する実行経路における実行頻度合計値が最小になるように読出先変数のデータをコピーするレジスタを選択する。そして、使用命令レジスタ割当手段１９２は、受け取った対象プログラムにおいて、使用命令が使用する変数にコピー命令のコピー先であるレジスタを割り当て、当該割り当て処理を行った結果の対象プログラムを結果プログラムとして出力する。
【００２７】
なお、本図に示した構成は一例であり、本図の構成に多様な変更を加えてもよい。例えば、最適化コンパイラ１０は、後進方向レジスタ検出手段１４２及び前進方向レジスタ検出手段１４４の何れか一方乃至は両方を備えていなくともよい。この場合、空きレジスタ割当手段１７０は、ロード命令がデータを読み出す読出先変数に、空きレジスタ検出手段１４０により検出された空きレジスタの集合の何れかを割り当ててもよいし、後進方向レジスタ検出手段１４２及び前進方向レジスタ検出手段１４４の何れかにより検出された空きレジスタを割り当ててもよい。
【００２８】
また、例えば、最適化コンパイラ１０は、生存区間検出手段１８０、代替レジスタ検出手段１８２、及び割当レジスタ変更手段１８４を備えていなくともよい。この構成において、空きレジスタ割当手段１７０は、使用命令から実行順序を遡ることによりロード命令に到達する実行経路において空きレジスタが検出されない場合に、ロード命令の実行位置における空きレジスタの何れかを読出先変数に割り当て、当該割り当て処理を行った結果の対象プログラムをコピー命令生成手段１９０に送る。
【００２９】
本実施形態に係る最適化コンパイラ１０によれば、ロード命令を少なくとも１の空きレジスタが存在する範囲で移動させて部分冗長性の除去処理を行い、当該ロード命令の読出先変数に割り当てるレジスタをロード命令及び使用命令における実行頻度に基づいて決定することにより、より効率的にロード命令を最適化することができる。
【００３０】
図２は、最適化コンパイラ１０の動作フローを示す図である。まず、レジスタ割当処理手段１００は、受け取った対象プログラムにおける変数をレジスタに割り当てる（Ｓ２００）。続いて、スピルイン命令生成手段１１０は、レジスタ割当処理手段１００によりレジスタに割当不能と判断された各変数について、当該変数の値を使用する命令に先立って当該変数の値をメモリからロードするスピルイン命令を生成する（Ｓ２０５）。
【００３１】
そして、最適化コンパイラ１０は、スピルイン命令により互いに異なるメモリアドレスからロードされる複数のデータのそれぞれについて、以下の処理を繰り返す（Ｓ２１５）。まず、部分冗長性除去手段１３０は、当該データをロードする複数のスピルイン命令のそれぞれに対して部分冗長性の除去処理を行い、更に、当該スピルイン命令が読み出すデータを格納するレジスタを、最適化コンパイラ１０内で使用する変数に置き換える（Ｓ２２０）。
【００３２】
続いて、空きレジスタ検出手段１４０は、ロード命令及びロード命令により読み出されるデータを使用する使用命令のそれぞれが実行される実行位置ｐにおいて、何れの変数にも割り当てられていない空きレジスタの集合ＲＥＧ（ｐ）を検出する（Ｓ２２５）。
【００３３】
ここで、最適化コンパイラ１０は、対象プログラムの各基本ブロックにおいて、以下の３つの集合を生成する。
（１）ＧＥＮ集合
最適化コンパイラ１０は、当該基本ブロックの実行開始位置から当該変数を最後に参照する命令の実行位置までの範囲で、レジスタ割当処理手段１００により他の変数に割り当てられていないレジスタの集合をＧＥＮ集合として生成する。
（２）ＧＥＮ’集合
最適化コンパイラ１０は、ロード命令の実行位置から、当該基本ブロックの実行終了位置までの範囲で、レジスタ割当処理手段１００により他の変数に割り当てられていないレジスタの集合をＧＥＮ’集合として生成する。
（３）ＫＩＬＬ集合
最適化コンパイラ１０は、当該基本ブロックの中で、レジスタ割当処理手段１００により他の変数に割り当てられているレジスタの集合をＫＩＬＬ集合として生成する。
以降の説明において、第ｎ基本ブロックにおけるＧＥＮ集合、ＧＥＮ’集合、及びＫＩＬＬ集合を、それぞれＧＥＮ（ｎ）、ＧＥＮ’（ｎ）、及びＫＩＬＬ（ｎ）と表記する。
【００３４】
後進方向レジスタ検出手段１４２は、空きレジスタ検出手段１４０の検出結果に基づいて、使用命令から実行順序を遡ることによりロード命令に到達する実行経路において、何れの変数にも割り当てられていない空きレジスタを検出する（Ｓ２３０）。
【００３５】
具体的には、後進方向レジスタ検出手段１４２は、対象プログラムの終端から実行順序を遡る方向に空きレジスタの集合を示す情報を伝播させ、かつ反復解法によって空きレジスタの数が単調減少する以下のデータフロー方程式（１）として表される処理により、空きレジスタを検出する。
本数式において、第ｎ基本ブロックの実行開始位置における空きレジスタの集合をＢＷＤ−ＲＥＧｉｎ（ｎ）と表記し、第ｎ基本ブロックの実行終了位置における空きレジスタの集合をＢＷＤ−ＲＥＧｏｕｔ（ｎ）と表記する。
【数１】
2005107816.tif 000003
但し、第ｎ基本ブロックの次に実行され得る基本ブロックの集合を、Ｓｕｃｃ（ｎ）と表記する。
【００３６】
更に、後進方向レジスタ検出手段１４２は、第ｎ基本ブロックにおける各命令の実行位置ｐにおける空きレジスタの集合を、ＢＷＤ−ＲＥＧｏｕｔ（ｎ）、ＧＥＮ（ｎ）、及びＫＩＬＬ（ｎ）に基づいて取得し、取得した空きレジスタの集合と、空きレジスタ検出手段１４０において検出された空きレジスタの集合ＲＥＧ（ｐ）との積集合を算出する。そして、後進方向レジスタ検出手段１４２は、算出した積集合が空集合でない場合に、ＲＥＧ（ｐ）を当該積集合に更新する。
【００３７】
続いて、前進方向レジスタ検出手段１４４は、後進方向レジスタ検出手段１４２の検出結果に基づいて、ロード命令から使用命令に到達する実行経路において、何れの変数にも割り当てられていない空きレジスタを検出する（Ｓ２３５）。
【００３８】
具体的には、前進方向レジスタ検出手段１４４は、対象プログラムの始点から実行順序を辿る方向に空きレジスタの集合を示す情報を伝播させ、かつ反復解法によって空きレジスタの数が単調減少する以下のデータフロー方程式（２）として表される処理により、空きレジスタを検出する。
本数式において、第ｎ基本ブロックの実行開始位置における空きレジスタの集合をＦＷＤ−ＲＥＧｉｎ（ｎ）と表記し、第ｎ基本ブロックの実行終了位置における空きレジスタの集合をＦＷＤ−ＲＥＧｏｕｔ（ｎ）と表記する。
【数２】
2005107816.tif 000004
但し、第ｎ基本ブロックの前に実行され得る基本ブロックの集合を、Ｐｒｅｄ（ｎ）と表記する。
【００３９】
更に、前進方向レジスタ検出手段１４４は、第ｎ基本ブロックにおける各命令の実行位置ｐにおける空きレジスタの集合を、ＦＷＤ−ＲＥＧｉｎ（ｎ）、ＧＥＮ’（ｎ）、及びＫＩＬＬ（ｎ）に基づいて取得し、取得した空きレジスタの集合と、後進方向レジスタ検出手段１４２において更新された空きレジスタの集合ＲＥＧ（ｐ）との積集合を取得する。そして、前進方向レジスタ検出手段１４４は、取得した積集合が空集合でない場合に、ＲＥＧ（ｐ）を当該積集合に更新する。
【００４０】
ここで、ステップ２３０及びステップ２３５の実行順序は、上記の説明における実行順序に限定されない。つまり、前進方向レジスタ検出手段１４４は空きレジスタ検出手段１４０の検出結果に基づいて空きレジスタを検出し、その後、後進方向レジスタ検出手段１４２は前進方向レジスタ検出手段１４４の検出結果に基づいて空きレジスタを検出してもよい。
【００４１】
また、ステップ２３０及びステップ２３５に示す処理の何れか一方、乃至は両方が実行されなくともよい。つまり、最適化コンパイラ１０は、空きレジスタ検出手段１４０により検出されたレジスタの集合、又は空きレジスタ検出手段１４０と後進方向レジスタ検出手段１４２及び前進方向レジスタ検出手段１４４の何れか一方とにより共通して検出されたレジスタの集合を、空きレジスタとして検出してもよい。
【００４２】
続いて、最適化コンパイラ１０は、ロード命令とロード命令が読み出すデータを使用する複数の使用命令とをグループ化する（Ｓ２４０）。例えば、最適化コンパイラ１０は、ロード命令及び使用命令を、UD-DU chain技術や、web技術を用いてグループ化してもよい。続いて、実行頻度取得手段１５０は、ロード命令が実行される実行頻度と使用命令が実行される実行頻度とを取得する（Ｓ２４５）。
【００４３】
続いて、実行頻度合計値算出手段１６０は、ロード命令及び使用命令の実行頻度を、ロード命令及び使用命令の実行位置における空きレジスタ毎に合計した実行頻度合計値を算出する（Ｓ２５０）。具体的には、実行頻度合計値算出手段１６０は、同じグループに含まれる複数の命令のそれぞれについて、当該命令の実行位置ｐにおけるＲＥＧ（ｐ）に含まれる複数のレジスタのそれぞれに、当該命令の実行頻度を対応付ける。そして、実行頻度合計値算出手段１６０は、対象プログラムにおいて使用可能な全てのレジスタについて、各実行位置においてレジスタに対応付けられた実行頻度を、レジスタ毎に合計することにより実行頻度合計値を算出する。また、実行頻度合計値算出手段１６０は、複数のレジスタにおいて実行頻度合計値が互いに同一の場合には、実行頻度合計値を互いに異なる値になるように調節してもよい。
【００４４】
続いて、空きレジスタ割当手段１７０は、ロード命令がデータを読み出す読出先変数に、空きレジスタの何れかを割り当てる（Ｓ２５５）。最適化コンパイラ１０は、以上の処理を、スピルイン命令により互いに異なるメモリアドレスからロードされる複数のデータのそれぞれについて繰り返す（Ｓ２６０）。
以上、本図で示すように、最適化コンパイラ１０は、レジスタ割当処理によりレジスタに割当不能と判断された各変数を、レジスタ割当処理を終えてもなお変数を割り当てていないレジスタに割り当てることができる。これにより、スピルイン命令の実行回数を減らして、対象プログラム全体の実行を効率化することができる。
【００４５】
図３は、図２におけるＳ２５５の詳細を示す動作フローである。空きレジスタ割当手段１７０は、使用命令から実行順序を遡ることによりロード命令に到達する全ての実行経路において一貫して利用可能な空きレジスタを検出したか否かを判断する（Ｓ３００）。
【００４６】
空きレジスタを検出した場合に（Ｓ３００：ＹＥＳ）、空きレジスタ割当手段１７０は、ロード命令の実行位置ｐにおける空きレジスタＲＥＧ（ｐ）のうち、使用命令から実行順序を遡ることによりロード命令に到達する全ての実行経路において一貫して利用可能であり、かつ実行頻度合計値が最も高い空きレジスタを、ロード命令の読み出し先の読出先変数に割り当て（Ｓ３１０）、処理を終了する。
【００４７】
空きレジスタを検出しなかった場合に（Ｓ３００：ＮＯ）、空きレジスタ割当手段１７０は、ロード命令の実行位置ｐにおける空きレジスタＲＥＧ（ｐ）のうち、実行頻度合計値が最も高いレジスタを、読出先変数に割り当てる（Ｓ３２０）。続いて、生存区間検出手段１８０は、空きレジスタ割当手段１７０により読出先変数に割り当てられたレジスタに既に割り当てられていた既割当変数の値の生存区間を検出し（Ｓ３３０）、検出した生存区間について以下の処理を行う。なお、生存区間検出手段１８０は、複数の生存区間を検出した場合には、各生存区間について以下の処理を行ってもよい。
【００４８】
代替レジスタ検出手段１８２は、生存区間検出手段１８０により検出された生存区間における空きレジスタである代替レジスタを検出する（Ｓ３４０）。代替レジスタ検出手段１８２が代替レジスタを検出できた場合に（Ｓ３５０：ＹＥＳ）、割当レジスタ変更手段１８４は、既割当変数に割り当てられていたレジスタを、代替レジスタに変更し（Ｓ３６０）、処理を終了する。
【００４９】
一方、代替レジスタ検出手段１８２が代替レジスタを検出できなかった場合に（Ｓ３５０：ＮＯ）、コピー命令生成手段１９０は、ロード命令から使用命令に至る実行経路において、読出先変数に割り当てられたレジスタに他の変数のデータを代入する命令に先立って実行される実行位置に、実行頻度合計値が最も高い空きレジスタに読出先変数のデータをコピーする命令を生成する（Ｓ３７０）。
【００５０】
続いて、使用命令レジスタ割当手段１９２は、使用命令が使用する変数に、コピー命令のコピー先であるレジスタを割り当て（Ｓ３８０）、処理を終了する。
【００５１】
以上、本図で示すように、最適化コンパイラ１０は、変数の値のロード命令から使用命令までの間で一貫して他の変数に割り当てられていないレジスタを検出した場合には、検出した当該レジスタを、変数の値を保持するレジスタとして選択する。さらに、一貫して他の変数に割り当てられていない空きレジスタが検出されない場合であっても、既に他の変数に割り当てられていたレジスタを他のレジスタに変更することを試みる。この結果、最適化コンパイラ１０は、レジスタ間で値をコピーする処理をできるだけ生じさせないようにすることにより、対象プログラムの実行効率を高めることができる。
【００５２】
図４は、本実施例の第１の適用例を示す。（ａ）は、本適用例における図２のステップ２２０実行後の対象プログラムを示す。（ｂ）は、本適用例における図２のステップ２５５実行後の対象プログラムを示す。（ｃ）は、本適用例に係る対象プログラムに含まれる複数の基本ブロックのそれぞれにおけるＧＥＮ集合及びＫＩＬＬ集合を示す。（ｄ）は、本適用例に係る対象プログラムに含まれる複数の基本ブロックのそれぞれにおける後進方向レジスタ検出手段１４２による空きレジスタの検出結果を示す。以下、データフロー方程式（１）に基づいて（ｄ）に示した結果を求める手順を説明する。
【００５３】
まず、後進方向レジスタ検出手段１４２は、対象プログラムの終端である基本ブロックＢＢ６の実行終了位置における空きレジスタの集合ＢＷＤ−ＲＥＧｏｕｔ（ＢＢ６）として、利用可能な全てのレジスタである｛ｒ１、ｒ２、ｒ３、ｒ４｝を検出する。続いて、後進方向レジスタ検出手段１４２は、基本ブロックＢＢ６の実行開始位置における空きレジスタの集合ＢＷＤ−ＲＥＧｉｎ（ＢＢ６）として、ＢＷＤ−ＲＥＧｏｕｔ（ＢＢ６）である｛ｒ１、ｒ２、ｒ３、ｒ４｝からＫＩＬＬ（ＢＢ６）である｛ｒ３、ｒ４｝を差し引いた｛ｒ１、ｒ２｝と、ＧＥＮ（ＢＢ６）である｛ｒ１、ｒ２｝との和集合である｛ｒ１、ｒ２｝を検出する。
【００５４】
続いて、後進方向レジスタ検出手段１４２は、基本ブロックＢＢ５の実行終了位置における空きレジスタの集合ＢＷＤ−ＲＥＧｏｕｔ（ＢＢ５）として、ＢＷＤ−ＲＥＧｉｎ（ＢＢ６）である｛ｒ１、ｒ２｝を検出する。ここで、基本ブロックＢＢ５の次に実行する基本ブロックとして、基本ブロックＢＢ６の他に基本ブロックＢＢ２が存在するが、この時点ではＢＷＤ−ＲＥＧｉｎ（ＢＢ２）は検出されていないので、後進方向レジスタ検出手段１４２は、ＢＷＤ−ＲＥＧｉｎ（ＢＢ６）のみに基づいてＢＷＤ−ＲＥＧｏｕｔ（ＢＢ５）を検出する。後進方向レジスタ検出手段１４２は、図２で示したデータフロー方程式（１）を反復解法で解くことにより、ループ処理の実行開始位置における空きレジスタであるＢＷＤ−ＲＥＧｉｎ（ＢＢ２）とループ処理の次に実行される位置における空きレジスタであるＢＷＤ−ＲＥＧｉｎ（ＢＢ６）とを使用してＢＷＤ−ＲＥＧｏｕｔ（ＢＢ５）を検出する。以降、同様の手順で計算することにより、後進方向レジスタ検出手段１４２は、使用命令から実行順序を遡ることによりロード命令に到達する実行経路における空きレジスタとして、（ｄ）に示した空きレジスタを検出することができる。
【００５５】
（ｅ）は、本適用例に係る対象プログラムの基本ブロックＢＢ３における空きレジスタを示す。ここで、（ｅ）は、基本ブロックＢＢ３において、実行位置５００及び実行位置５１０において利用可能なレジスタが｛ｒ２｝であることを示している。基本ブロックＢＢ３の他の基本ブロック、例えば基本ブロックＢＢ４において、空きレジスタが｛ｒ１｝であった場合、空きレジスタ割当手段１７０は、基本ブロックＢＢ６における使用命令から実行順序を遡ることにより基本ブロックＢＢ１におけるロード命令に到達する全ての実行経路において一貫して利用可能な空きレジスタを検出することができない。
【００５６】
ここで、空きレジスタ割当手段１７０は、基本ブロックＢＢ１におけるロード命令の読出先変数にレジスタｒ１を割り当てる。そして、生存区間検出手段１８０は、読出先変数に割り当てられたレジスタｒ１に既に割り当てられていた既割当変数の、基本ブロックＢＢ３における値の生存区間が、実行位置５００から実行位置５１０であることを検出する。これを受けて、代替レジスタ検出手段１８２は、当該生存区間における空きレジスタである代替レジスタとして、レジスタｒ２を検出する。そして、割当レジスタ変更手段１８４は、既割当変数に割り当てられていたレジスタｒ１を、代替レジスタｒ２に変更することにより、基本ブロックＢＢ３において、レジスタｒ１を利用可能とする。
以上のようにして、最適化コンパイラ１０は、変数Ｔを一貫してレジスタｒ１に割り当てることにより、（ｂ）に示した対象プログラムを生成することができる。
【００５７】
本適用例に示すように、最適化コンパイラ１０によれば、既割当変数に割り当てられたレジスタを代替レジスタに変更することによりコピー命令の生成を回避することができ、効率的にロード命令を最適化することができる。
【００５８】
図５は、本実施例の第２の適用例を示す。（ａ）は、本適用例における図２のステップ２０５実行後の対象プログラムを示す。（ｂ）は、本適用例における図２のステップ２３０実行後の対象プログラムの一例を示す。（ｃ）は、本適用例における図２のステップ２３５実行後の対象プログラムの一例を示す。
【００５９】
スピルイン命令生成手段１１０は、対象プログラムにおいて、レジスタ割当処理手段１００によりレジスタに割当不能と判断された各変数について、スピルイン命令を生成する。例えば、図５（ａ）の４行目及び７行目に示すように、スピルイン命令生成手段１１０は、変数の値が使用される毎に、値の使用に先立ってスピルイン命令を生成する。
【００６０】
後進方向レジスタ検出手段１４２は、実行位置６００から実行順序を遡ることによりスピルイン命令に到達する実行経路における空きレジスタを検出する。具体的には、後進方向レジスタ検出手段１４２は、ループ処理中に使用命令が存在する場合には、ループ処理が一回目に実行される経路について空きレジスタを検出する。その結果、図５（ｂ）に示すように、後進方向レジスタ検出手段１４２は、実行位置６００からスピルイン命令に至る実行経路における空きレジスタとして、｛ｒ２、ｒ３｝を検出する。
【００６１】
これに対して、前進方向レジスタ検出手段１４４は、スピルイン命令から実行経路を辿ることにより実行位置６１０に到達する実行経路における空きレジスタを検出する。具体的には、前進方向レジスタ検出手段１４４は、ループ処理中に使用命令が存在する場合には、ループ処理が２度以上繰り返し実行される経路について空きレジスタを検出する。その結果、前進方向レジスタ検出手段１４４は、実行位置６１０における空きレジスタとして、｛ｒ３｝を検出する。
【００６２】
このように、後進方向レジスタ検出手段１４２及び前進方向レジスタ検出手段１４４の何れかにより空きレジスタを検出する場合には、後進方向レジスタ検出手段１４２及び前進方向レジスタ検出手段１４４の双方に共通した空きレジスタを検出する場合と比較して、空きレジスタの検出結果が異なる場合がある。
【００６３】
これにより、最適化コンパイラ１０による最適化の結果が異なる場合がある。例えば、（ｂ）において変数Ｔに割り当てるレジスタとしてレジスタｒ２を選択した場合、実行位置６００においてレジスタｒ２は他の目的で使用されてしまうので、最適化コンパイラ１０は、実行位置６００に先立って実行される実行位置にコピー命令を生成する必要がある。具体的には、最適化コンパイラ１０は、変数Ｔの値をレジスタｒ２以外の他のレジスタにコピーして値を保持させるコピー命令を生成する必要がある。これに対し、（ｃ）において変数Ｔに割り当てるレジスタとしてレジスタｒ３を選択した場合、最適化コンパイラ１０は、コピー命令を生成する必要がない。
【００６４】
本適用例に係る最適化コンパイラ１０によれば、ロード命令の読出先変数に、後進方向レジスタ検出手段１４２及び前進方向レジスタ検出手段１４４により共通して検出された空きレジスタを割り当てることにより、コピー命令を生成させることを回避して、効率的にロード命令を最適化できる。
【００６５】
図６は、最適化コンパイラ１０として機能するコンピュータのハードウェア構成の一例を示す図である。最適化コンパイラ１０は、ホストコントローラ１０８２により相互に接続されるＣＰＵ１０００、ＲＡＭ１０２０、グラフィックコントローラ１０７５、及び表示装置１０８０を有するＣＰＵ周辺部と、入出力コントローラ１０８４によりホストコントローラ１０８２に接続される通信インターフェイス１０３０、ハードディスクドライブ１０４０、及びＣＤ−ＲＯＭドライブ１０６０を有する入出力部と、入出力コントローラ１０８４に接続されるＲＯＭ１０１０、フレキシブルディスクドライブ１０５０、及び入出力チップ１０７０を有するレガシー入出力部とを備える。
【００６６】
ホストコントローラ１０８２は、ＲＡＭ１０２０と、高い転送レートでＲＡＭ１０２０をアクセスするＣＰＵ１０００及びグラフィックコントローラ１０７５とを接続する。ＣＰＵ１０００は、ＲＯＭ１０１０及びＲＡＭ１０２０に格納されたプログラムに基づいて動作し、各部の制御を行う。グラフィックコントローラ１０７５は、ＣＰＵ１０００等がＲＡＭ１０２０内に設けたフレームバッファ上に生成する画像データを取得し、表示装置１０８０上に表示させる。これに代えて、グラフィックコントローラ１０７５は、ＣＰＵ１０００等が生成する画像データを格納するフレームバッファを、内部に含んでもよい。
【００６７】
入出力コントローラ１０８４は、ホストコントローラ１０８２と、比較的高速な入出力装置である通信インターフェイス１０３０、ハードディスクドライブ１０４０、及びＣＤ−ＲＯＭドライブ１０６０を接続する。通信インターフェイス１０３０は、ネットワークを介して外部の装置と接続する。ハードディスクドライブ１０４０は、最適化コンパイラ１０が使用するコンパイラプログラム及びデータを格納する。ＣＤ−ＲＯＭドライブ１０６０は、ＣＤ−ＲＯＭ１０９５からプログラム又はデータを読みとり、ＲＡＭ１０２０を介して入出力チップ１０７０に提供する。
【００６８】
また、入出力コントローラ１０８４には、ＲＯＭ１０１０と、フレキシブルディスクドライブ１０５０や入出力チップ１０７０等の比較的低速な入出力装置とが接続される。ＲＯＭ１０１０は、最適化コンパイラ１０の起動時にＣＰＵ１０００が実行するブートプログラムや、最適化コンパイラ１０のハードウェアに依存するプログラム等を格納する。フレキシブルディスクドライブ１０５０は、フレキシブルディスク１０９０からプログラム又はデータを読み取り、ＲＡＭ１０２０を介して入出力チップ１０７０に提供する。入出力チップ１０７０は、フレキシブルディスク１０９０や、例えばパラレルポート、シリアルポート、キーボードポート、マウスポート等を介して各種の入出力装置を接続する。
【００６９】
最適化コンパイラ１０に提供されるコンパイラプログラムは、フレキシブルディスク１０９０、ＣＤ−ＲＯＭ１０９５、又はＩＣカード等の記録媒体に格納されて利用者によって提供される。コンパイラプログラムは、入出力チップ１０７０及び／又は入出力コントローラ１０８４を介して、記録媒体から読み出され最適化コンパイラ１０にインストールされて実行される。
【００７０】
最適化コンパイラ１０にインストールされて実行されるコンパイラプログラムは、レジスタ割当処理モジュールと、スピルイン命令生成モジュールと、部分冗長性除去モジュールと、空きレジスタ検出モジュールと、後進方向レジスタ検出モジュールと、前進方向レジスタ検出モジュールと、実行頻度取得モジュールと、実行頻度合計値算出モジュールと、空きレジスタ割当モジュールと、生存区間検出モジュールと、代替レジスタ検出モジュールと、割当レジスタ変更モジュールと、コピー命令生成モジュールと、使用命令レジスタ割当モジュールとを含む。各モジュールが最適化コンパイラ１０に働きかけて行わせる動作は、図１から図５において説明した最適化コンパイラ１０における、対応する部材の動作と同一であるので、説明を省略する。
【００７１】
以上に示したコンパイラプログラムは、外部の記憶媒体に格納されてもよい。記憶媒体としては、フレキシブルディスク１０９０、ＣＤ−ＲＯＭ１０９５の他に、ＤＶＤやＰＤ等の光学記録媒体、ＭＤ等の光磁気記録媒体、テープ媒体、ＩＣカード等の半導体メモリ等を用いることができる。また、専用通信ネットワークやインターネットに接続されたサーバシステムに設けたハードディスク又はＲＡＭ等の記憶装置を記録媒体として使用し、ネットワークを介してコンパイラプログラムを最適化コンパイラ１０に提供してもよい。
【００７２】
以上、本実施例で示すように、最適化コンパイラ１０は、レジスタ割当処理によりレジスタに割当不能と判断された各変数を、レジスタ割当処理を終えてもなお変数を割り当てていないレジスタに割り当てることができる。これにより、スピルイン命令の実行回数を減らして、対象プログラム全体の実行を効率化することができる。
【００７３】
また、最適化コンパイラ１０は、レジスタ割当処理により既に変数に割り当てられているレジスタを、他のレジスタに変更することにより、レジスタ間で値をコピーするコピー命令の数を減少させることができる。また、他のレジスタに変更できない場合であっても、実行頻度のより高い命令が実行される実行位置における空きレジスタを優先して割り当てることにより、対象プログラムの実行を効率化することができる。
【００７４】
以上、本発明を実施の形態を用いて説明したが、本発明の技術的範囲は上記実施の形態に記載の範囲には限定されない。上記実施の形態に、多様な変更または改良を加えることが可能であることが当業者に明らかである。その様な変更または改良を加えた形態も本発明の技術的範囲に含まれ得ることが、特許請求の範囲の記載から明らかである。
【００７５】
上記実施例によると、以下の各項目に示す最適化コンパイラ、コンパイラプログラム、及び記録媒体が実現される。
【００７６】
（項目１）  最適化対象の対象プログラムにおいて、メモリからデータを読み出すロード命令を最適化する最適化コンパイラであって、少なくとも一部の変数がレジスタに割り当てられていない前記対象プログラムにおいて、メモリから変数にデータを読み出すロード命令に対して、当該変数がレジスタに割り当てられた場合にスピル処理を生じさせない部分冗長性の除去処理を行う部分冗長性除去手段と、前記ロード命令が読み出すデータを使用する使用命令から実行順序を遡ることにより前記ロード命令に到達する実行経路において、何れの変数にも割り当てられていない空きレジスタを検出する後進方向レジスタ検出手段と、前記ロード命令がデータを読み出す読出先変数に、前記後進方向レジスタ検出手段により検出された前記空きレジスタを割り当てる空きレジスタ割当手段とを備える最適化コンパイラ。
（項目２）  前記後進方向レジスタ検出手段は、前記対象プログラムの終端から実行順序を遡る方向に空きレジスタの集合を示す情報を伝播させ、かつ反復解法によって空きレジスタの数が単調減少するデータフロー方程式として表される処理により、空きレジスタを検出する項目１記載の最適化コンパイラ。
【００７７】
（項目３）  前記使用命令から実行順序を遡ることにより前記ロード命令に到達する実行経路において空きレジスタが検出されない場合に、前記空きレジスタ割当手段は、前記読出先変数に、前記ロード命令の実行位置における空きレジスタの何れかを割り当て、当該最適化コンパイラは、前記読出先変数に割り当てられたレジスタに既に割り当てられていた既割当変数の、値の生存区間を検出する生存区間検出手段と、前記生存区間における空きレジスタである代替レジスタを検出する代替レジスタ検出手段と、前記既割当変数に割り当てられていたレジスタを、前記代替レジスタに変更する割当レジスタ変更手段とを更に備える項目１記載の最適化コンパイラ。
（項目４）  変数をレジスタに割り当てるレジスタ割当処理手段と、前記レジスタ割当処理手段によりレジスタに割当不能と判断された各変数について、当該変数の値を使用する命令に先立って当該変数の値をメモリからロードするスピルイン命令を生成するスピルイン命令生成手段とを更に備え、前記部分冗長性除去手段は、前記ロード命令であるスピルイン命令に対して、前記部分冗長性の除去処理を行い、更に、当該スピルイン命令が読み出すデータを格納するレジスタを、当該最適化コンパイラ内で使用する変数に置き換え、前記空きレジスタ割当手段は、前記部分冗長性除去手段が置き換えた変数に、前記後進方向レジスタ検出手段により検出された前記空きレジスタを割り当てる項目１記載の最適化コンパイラ。
（項目５）  複数の前記レジスタには、変数を割り当てる優先順位が予め定められており、前記レジスタ割当処理手段は、変数を前記優先順位がより高いレジスタに優先して割り当て、前記使用命令から実行順序を遡ることにより前記ロード命令に到達する実行経路において空きレジスタが検出されない場合に、前記空きレジスタ割当手段は、前記ロード命令の実行位置における空きレジスタのうち前記優先順位が最も高いレジスタを、前記読出先変数に割り当て、当該最適化コンパイラは、前記ロード命令から前記使用命令に至る実行経路において、前記読出先変数に割り当てられたレジスタに他の変数のデータを代入する命令に先立って実行される実行位置に、前記優先順位が最も高い空きレジスタに前記読出先変数のデータをコピーする命令を生成するコピー命令生成手段と、前記使用命令が使用する変数に、当該コピー命令のコピー先であるレジスタを割り当てる使用命令レジスタ割当手段とを更に備える項目４記載の最適化コンパイラ。
【００７８】
（項目６）  前記ロード命令から実行順序を辿ることにより前記ロード命令が読み出すデータを使用する使用命令に到達する実行経路において、何れの変数にも割り当てられていない空きレジスタを検出する前進方向レジスタ検出手段を更に備え、前記空きレジスタ割当手段は、前記読出先変数に、前記後進方向レジスタ検出手段及び前記前進方向レジスタ検出手段により共通して検出された空きレジスタを割り当てる項目１記載の最適化コンパイラ。
（項目７）  最適化対象の対象プログラムにおいて、メモリからデータを読み出すロード命令を最適化する最適化コンパイラであって、少なくとも一部の変数がレジスタに割り当てられていない前記対象プログラムにおいて、メモリから変数にデータを読み出すロード命令に対して、当該変数がレジスタに割り当てられた場合にスピル処理を生じさせない部分冗長性の除去処理を行う部分冗長性除去手段と、前記ロード命令から実行順序を辿ることにより前記ロード命令が読み出すデータを使用する使用命令に到達する実行経路において、何れの変数にも割り当てられていない空きレジスタを検出する前進方向レジスタ検出手段と、前記ロード命令がデータを読み出す読出先変数に、前記前進方向レジスタ検出手段により検出された前記空きレジスタを割り当てる空きレジスタ割当手段とを備える最適化コンパイラ。
（項目８）  前記前進方向レジスタ検出手段は、前記対象プログラムの始点から実行順序を辿る方向に空きレジスタの集合を示す情報を伝播させ、かつ反復解法によって空きレジスタの数が単調減少するデータフロー方程式として表される処理により、空きレジスタを検出する項目７記載の最適化コンパイラ。
【００７９】
（項目９）  最適化対象の対象プログラムにおいて、メモリからデータを読み出すロード命令を最適化する最適化コンパイラであって、少なくとも一部の変数がレジスタに割り当てられていない前記対象プログラムにおいて、メモリから変数にデータを読み出すロード命令に対して、当該変数がレジスタに割り当てられた場合にスピル処理を生じさせない部分冗長性の除去処理を行う部分冗長性除去手段と、前記ロード命令が実行される実行頻度と、当該ロード命令により読み出されるデータを使用する使用命令が実行される実行頻度とを取得する実行頻度取得手段と、前記ロード命令及び前記使用命令のそれぞれが実行される実行位置において、何れの変数にも割り当てられていない空きレジスタの集合を検出する空きレジスタ検出手段と、前記ロード命令及び前記使用命令の実行頻度を、前記ロード命令又は前記使用命令の実行位置における空きレジスタ毎に合計した実行頻度合計値を算出する実行頻度合計値算出手段と、前記ロード命令の実行位置における前記空きレジスタのうち前記実行頻度合計値が最も高い前記空きレジスタを、前記ロード命令の読み出し先の読出先変数に割り当てる空きレジスタ割当手段とを備える最適化コンパイラ。
（項目１０）  前記ロード命令から前記使用命令に至る実行経路において、前記読出先変数に割り当てられたレジスタに他の変数のデータを代入する命令に先立って実行される実行位置に、前記読出先変数のデータを前記実行頻度合計値が最も高い空きレジスタにコピーする命令を生成するコピー命令生成手段と、前記使用命令が使用する変数に、当該コピー命令のコピー先であるレジスタを割り当てる使用命令レジスタ割当手段とを更に備える項目９記載の最適化コンパイラ。
（項目１１）  最適化対象の対象プログラムにおいて、メモリからデータを読み出すロード命令を最適化する最適化コンパイラとしてコンピュータを機能させるコンパイラプログラムであって、前記コンピュータを、少なくとも一部の変数がレジスタに割り当てられていない前記対象プログラムにおいて、メモリから変数にデータを読み出すロード命令に対して、当該変数がレジスタに割り当てられた場合にスピル処理を生じさせない部分冗長性の除去処理を行う部分冗長性除去手段と、前記ロード命令が読み出すデータを使用する使用命令から実行順序を遡ることにより前記ロード命令に到達する実行経路において、何れの変数にも割り当てられていない空きレジスタを検出する後進方向レジスタ検出手段と、前記ロード命令がデータを読み出す読出先変数に、前記後進方向レジスタ検出手段により検出された前記空きレジスタを割り当てる空きレジスタ割当手段として機能させるコンパイラプログラム。
【００８０】
（項目１２）  最適化対象の対象プログラムにおいて、メモリからデータを読み出すロード命令を最適化する最適化コンパイラとしてコンピュータを機能させるコンパイラプログラムであって、前記コンピュータを、少なくとも一部の変数がレジスタに割り当てられていない前記対象プログラムにおいて、メモリから変数にデータを読み出すロード命令に対して、当該変数がレジスタに割り当てられた場合にスピル処理を生じさせない部分冗長性の除去処理を行う部分冗長性除去手段と、前記ロード命令から実行順序を辿ることにより前記ロード命令が読み出すデータを使用する使用命令に到達する実行経路において、何れの変数にも割り当てられていない空きレジスタを検出する前進方向レジスタ検出手段と、前記ロード命令がデータを読み出す読出先変数に、前記前進方向レジスタ検出手段により検出された前記空きレジスタを割り当てる空きレジスタ割当手段として機能させるコンパイラプログラム。
（項目１３）  最適化対象の対象プログラムにおいて、メモリからデータを読み出すロード命令を最適化する最適化コンパイラとしてコンピュータを機能させるコンパイラプログラムであって、前記コンピュータを、少なくとも一部の変数がレジスタに割り当てられていない前記対象プログラムにおいて、メモリから変数にデータを読み出すロード命令に対して、当該変数がレジスタに割り当てられた場合にスピル処理を生じさせない部分冗長性の除去処理を行う部分冗長性除去手段と、前記ロード命令が実行される実行頻度と、当該ロード命令により読み出されるデータを使用する使用命令が実行される実行頻度とを取得する実行頻度取得手段と、前記ロード命令及び前記使用命令のそれぞれが実行される実行位置において、何れの変数にも割り当てられていない空きレジスタの集合を検出する空きレジスタ検出手段と、前記ロード命令及び前記使用命令の実行頻度を、前記ロード命令又は前記使用命令の実行位置における空きレジスタ毎に合計した実行頻度合計値を算出する実行頻度合計値算出手段と、前記ロード命令の実行位置における前記空きレジスタのうち前記実行頻度合計値が最も高い前記空きレジスタを、前記ロード命令の読み出し先の読出先変数に割り当てる空きレジスタ割当手段として機能させるコンパイラプログラム。
（項目１４）  項目１１から項目１３の何れかに記載のコンパイラプログラムを記録した記録媒体。
【図面の簡単な説明】
【００８１】
【図１】最適化コンパイラ１０の機能ブロック図である。
【図２】最適化コンパイラ１０の動作フローを示す。
【図３】図２におけるＳ２５５の詳細を示す動作フローである。
【図４】本実施例の第１の適用例を示す。
【図５】本実施例の第２の適用例を示す。
【図６】最適化コンパイラ１０として機能するコンピュータのハードウェア構成の一例を示す。
【符号の説明】
【００８２】
１０・・・最適化コンパイラ、１００・・・レジスタ割当処理手段、１１０・・・スピルイン命令生成手段、１３０・・・部分冗長性除去手段、１４０・・・空きレジスタ検出手段、１４２・・・後進方向レジスタ検出手段、１４４・・・前進方向レジスタ検出手段、１５０・・・実行頻度取得手段、１６０・・・実行頻度合計値算出手段、１７０・・・空きレジスタ割当手段、１８０・・・生存区間検出手段、１８２・・・代替レジスタ検出手段、１８４・・・割当レジスタ変更手段、１９０・・・コピー命令生成手段、１９２・・・使用命令レジスタ割当手段、５００、５１０、６００、６１０・・・実行位置
【図１】
2005107816.tif 000005
【図２】
2005107816.tif 000006
【図３】
2005107816.tif 000007
【図４】
2005107816.tif 000008
【図５】
2005107816.tif 000009
【図６】
2005107816.tif 000010