(57)【要約】【課題】複数の変数に適切なレジスタを割当てる。【解決手段】ソースプログラムをプロセッサの命令列に変換するコンパイラは、ソースプログラム内で用いられる複数の変数それぞれにおいて、当該変数と同時に使われる変数を取得する同時使用変数取得部２２０と、複数の変数それぞれを、当該変数と同時に使われる変数とは異なるレジスタに割当てる、複数の変数間の割当順序を複数生成する割当順序生成部２３０と、複数の変数のそれぞれを、複数のレジスタのうち何れのレジスタに優先して割当てるかを示す割当優先度を取得する割当優先度取得部３００と、複数の割当順序のうち割当優先度に基づき選択した一の割当順序に従い、複数の変数を前記レジスタに割当てるレジスタ割当部３１０とを備える。【選択図】　図１
2004021336.tif 000002
【特許請求の範囲】
【請求項１】
ソースプログラムをプロセッサの命令列に変換するコンパイラであって、
前記ソースプログラム内で用いられる複数の変数それぞれにおいて、当該変数と同時に使われる変数を取得する同時使用変数取得部と、
前記複数の変数それぞれを、当該変数と同時に使われる変数とは異なるレジスタに割当てる、前記複数の変数間の割当順序を複数生成する割当順序生成部と、前記複数の変数のそれぞれを、複数の前記レジスタのうち何れのレジスタに優先して割当てるかを示す割当優先度を取得する割当優先度取得部と、
複数の前記割当順序のうち前記割当優先度に基づき選択した一の前記割当順序に従い、前記複数の変数を前記レジスタに割当てるレジスタ割当部と
を備えることを特徴とするコンパイラ。
【請求項２】
前記割当順序生成部は、前記複数の変数それぞれを、当該変数と同時に使われる変数とは異なる前記レジスタに割当てる、前記複数の変数間の半順序を生成し、
前記レジスタ割当部は、前記半順序を保ちつつ前記割当優先度に基づき選択した前記一の割当順序に従い、前記複数の変数を前記レジスタに割当てることを特徴とする請求項１記載のコンパイラ。
【請求項３】
前記割当順序生成部は、
前記レジスタの総数より小さい数の変数とのみ同時に使われる変数を選択する第１選択部と、
既に選択された変数を除外した場合における残された変数のうち、前記レジスタの総数より小さい数の変数とのみ同時に使われる変数を選択する第２選択部と、
前記第２選択部の処理を前記複数の変数のそれぞれに適用する場合に、当該変数を、当該変数を除外することにより選択可能となる変数より後の前記割当順序とすることにより前記半順序を生成する順序決定部と
を有することを特徴とする請求項２記載のコンパイラ。
【請求項４】
前記レジスタ割当部が前記複数の変数それぞれを当該変数と同時に使われる変数とは異なる前記レジスタに割当てられないと判断した場合に、前記複数の変数のうち少なくとも一の前記変数をそれぞれ２以上の変数に分割することにより、前記複数の変数から新たな複数の変数を生成し、当該新たな複数の変数に対して、前記同時使用変数取得部、前記割当順序生成部、及び前記レジスタ割当部による処理を繰り返し実行させるレジスタ割当可能性判断部をさらに備えることを特徴とする請求項２記載のコンパイラ。
【請求項５】
前記レジスタ割当部は、
前記半順序において前記割当順序が最先である少なくとも１つの同時割当候補変数を格納する格納部と、
前記少なくとも一つの同時割当候補変数のうち、前記割当優先度に基づき一の前記同時割当候補変数を選択する割当選択部と、
前記一の同時割当候補変数を前記格納部から取り除き、前記割当優先度に基づき選択した前記レジスタに割当てる割当実行部と、
前記一の同時割当候補変数より前記割当順序が低い変数のうち、前記レジスタに割当てられてなくかつ前記割当順序がより先の変数を有しない変数を、新たに前記格納部に格納し、前記格納部が空になるまで前記割当実行部による処理を繰り返し実行させる割当反復部と
を有することを特徴とする請求項２記載のコンパイラ。
【請求項６】
前記割当実行部は、前記少なくとも一つの同時割当候補変数のうち、前記一の同時割当候補変数として、同時に使われる前記変数に既に割当てられていないレジスタとの割当優先度につき、最大の前記割当優先度及び最小の前記割当優先度との差が最大の変数を選択し、前記最大の割当優先度に対応するレジスタに割当てることを特徴とする請求項５記載のコンパイラ。
【請求項７】
前記割当優先度として、前記複数の変数それぞれにおいて、前記ソースプログラム内における当該変数の用いられ方に基づいて、当該変数を何れの種類のレジスタに割当てるべきかを示すレジスタ嗜好性情報及び当該変数と他の変数との間にある前記ソースプログラム上における関連性を示す情報である変数関連性情報のうち、少なくとも１方の情報を、前記複数の変数毎の前記複数のレジスタそれぞれへの割当優先度として生成する割当優先度生成部を更に備えることを特徴とする請求項１記載のコンパイラ。
【請求項８】
ソースプログラムをプロセッサの命令列に変換するコンパイラであって、
前記ソースプログラム内で用いられる複数の変数それぞれにおいて、前記ソースプログラム内における当該変数の用いられ方に基づいて、当該変数を何れの種類のレジスタに割当てるべきかを示すレジスタ嗜好性情報及び当該変数と他の変数との間にある前記ソースプログラム上における関連性を示す情報である変数関連性情報のうち、少なくとも一方の情報を、前記複数の変数毎の前記複数のレジスタそれぞれへの割当優先度として生成する割当優先度生成部と、
前記割当優先度に基づき、前記複数の変数を複数の前記レジスタに割当てるレジスタ割当部と
を備えることを特徴とするコンパイラ。
【請求項９】
前記レジスタ割当部は、前記複数の変数のうち、最大の前記割当優先度及び最小の前記割当優先度との差が最大の変数をより優先して前記レジスタに割当てることを特徴とする請求項８記載のコンパイラ。
【請求項１０】
前記割当優先度生成部は、関数呼び出しの前及び前記関数呼び出しからの復帰後の双方の部分において、前記変数が使用されると判断した場合に、当該変数を前記関数内で用いられないレジスタに優先して割当てることを示すレジスタ嗜好性情報を生成することを特徴とする請求項８記載のコンパイラ。
【請求項１１】
前記割当優先度生成部は、前記変数が関数間の値の引渡しに用いられると判断した場合に、前記命令列の関数呼び出し手続きにおいて定められる引数レジスタ又は戻り値レジスタに、当該変数を優先して割当てることを示すレジスタ嗜好性情報を生成することを特徴とする請求項８記載のコンパイラ。
【請求項１２】
前記ソースプログラムが示す処理を予め実行した場合に得られる実行履歴情報を取得する実行履歴情報取得部を更に備え、
前記割当優先度生成部は、前記実行履歴情報に基づき、前記ソースプログラムのうちより高い頻度で実行される部分に用いられる変数が、他の部分のみで用いられる変数より優先してレジスタに割当てられることを示すレジスタ嗜好性情報を生成することを特徴とする請求項８記載のコンパイラ。
【請求項１３】
前記ソースプログラムにおいて、繰り返し実行されるループ部分を解析するループ解析部を更に備え、
前記割当優先度生成部は、前記ループ部分において用いられる変数が、前記ループ部分以外の部分において用いられる変数より優先して前記レジスタに割当てられることを示すレジスタ嗜好性情報を生成することを特徴とする請求項８記載のコンパイラ。
【請求項１４】
当該コンパイラは、前記ソースプログラムを、複数の前記レジスタと、アドレスの連続するメモリとの間でデータを転送するメモリアクセス命令を有する前記命令列に変換し、
前記割当優先度生成部は、前記ソースプログラム内においてアドレスの連続するメモリとの間でデータを転送する複数の変数を、前記組合せメモリアクセス命令を適用可能な複数のレジスタに優先して割当てる変数関連性情報を生成することを特徴とする請求項８記載のコンパイラ。
【請求項１５】
前記複数の変数のうち、同一のレジスタに割当てた場合に前記命令列の実行速度が向上する変数の組合せを検出する同一レジスタ割当検出部を更に備え、
前記割当優先度生成部は、同一レジスタ割当検出部により検出された前記変数の組合せ中の変数を、同一のレジスタに割当てる変数関連性情報を生成することを特徴とする請求項８記載のコンパイラ。
【請求項１６】
コンピュータを、請求項１から請求項１５の何れかに記載したコンパイラとして動作させるプログラム。
【請求項１７】
ソースプログラムで用いられる複数の変数を、プロセッサの命令列中で用いられるレジスタに割当てるレジスタ割当装置であって、
前記複数の変数それぞれにおいて、当該変数と同時に使われる変数を取得する同時使用変数取得部と、
前記複数の変数それぞれを、当該変数と同時に使われる変数とは異なる前記レジスタに割当てる、前記複数の変数間の割当順序を複数生成する割当順序生成部と、
前記複数の変数のそれぞれを、複数の前記レジスタのうち何れのレジスタに優先して割当てるかを示す割当優先度を取得する割当優先度取得部と、
複数の前記割当順序のうち前記割当優先度に基づき選択した一の前記割当順序に従い、前記複数の変数を前記レジスタに割当てるレジスタ割当部と
を備えることを特徴とするレジスタ割当装置。
【請求項１８】
ソースプログラム内で用いられる複数の変数を、プロセッサの命令列中で用いられるレジスタに変換するレジスタ割当装置であって、
前記複数の変数それぞれにおいて、前記ソースプログラム内における当該変数の用いられ方に基づいて、当該変数を何れの種類の前記レジスタに割当てるべきかを示すレジスタ嗜好性情報及び当該変数と他の変数との間にある前記ソースプログラム上における関連性を示す情報である変数関連性情報のうち、少なくとも一方の情報を、前記複数の変数毎の前記複数のレジスタそれぞれへの割当優先度として生成する割当優先度生成部と、
前記割当優先度に基づき、前記複数の変数を複数の前記レジスタに割当てるレジスタ割当部と
を備えることを特徴とするレジスタ割当装置。
【請求項１９】
請求項１７又は請求項１８に記載のレジスタ割当装置をコンピュータにより実現するプログラム。
【請求項２０】
コンピュータを、ソースプログラムをプロセッサの命令列に変換するコンパイラとして動作させるプログラムを記録した記録媒体であって、
前記プログラムは、
前記ソースプログラム内で用いられる複数の変数それぞれにおいて、当該変数と同時に使われる変数を取得する同時使用変数取得部と、
前記複数の変数それぞれを、当該変数と同時に使われる変数とは異なるレジスタに割当てる、前記複数の変数間の割当順序を複数生成する割当順序生成部と、前記複数の変数のそれぞれを、複数の前記レジスタのうち何れのレジスタに優先して割当てるかを示す割当優先度を取得する割当優先度取得部と、
複数の前記割当順序のうち前記割当優先度に基づき選択した一の前記割当順序に従い、前記複数の変数を前記レジスタに割当てるレジスタ割当部と
を備えることを特徴とする記録媒体。
【請求項２１】
コンピュータを、ソースプログラムをプロセッサの命令列に変換するコンパイラとして動作させるプログラムを記録した記録媒体であって、
前記プログラムは、
前記ソースプログラム内で用いられる複数の変数それぞれにおいて、前記ソースプログラム内における当該変数の用いられ方に基づいて、当該変数を何れの種類のレジスタに割当てるべきかを示すレジスタ嗜好性情報及び当該変数と他の変数との間にある前記ソースプログラム上における関連性を示す情報である変数関連性情報のうち、少なくとも一方の情報を、前記複数の変数毎の前記複数のレジスタそれぞれへの割当優先度として生成する割当優先度生成部と、
前記割当優先度に基づき、前記複数の変数を複数の前記レジスタに割当てるレジスタ割当部と
を備えることを特徴とする記録媒体。
【請求項２２】
コンピュータを、ソースプログラムで用いられる複数の変数をプロセッサの命令列中で用いられるレジスタに割当てるレジスタ割当装置として動作させるプログラムを記録した記録媒体であって、
前記プログラムは、
前記複数の変数それぞれにおいて、当該変数と同時に使われる変数を取得する同時使用変数取得部と、
前記複数の変数それぞれを、当該変数と同時に使われる変数とは異なる前記レジスタに割当てる、前記複数の変数間の割当順序を複数生成する割当順序生成部と、
前記複数の変数のそれぞれを、複数の前記レジスタのうち何れのレジスタに優先して割当てるかを示す割当優先度を取得する割当優先度取得部と、
複数の前記割当順序のうち前記割当優先度に基づき選択した一の前記割当順序に従い、前記複数の変数を前記レジスタに割当てるレジスタ割当部と
を備えることを特徴とする記録媒体。
【請求項２３】
コンピュータを、ソースプログラムで用いられる複数の変数をプロセッサの命令列中で用いられるレジスタに割当てるレジスタ割当装置として動作させるプログラムを記録した記録媒体であって、
前記プログラムは、
前記複数の変数それぞれにおいて、前記ソースプログラム内における当該変数の用いられ方に基づいて、当該変数を何れの種類の前記レジスタに割当てるべきかを示すレジスタ嗜好性情報及び当該変数と他の変数との間にある前記ソースプログラム上における関連性を示す情報である変数関連性情報のうち、少なくとも一方の情報を、前記複数の変数毎の前記複数のレジスタそれぞれへの割当優先度として生成する割当優先度生成部と、
前記割当優先度に基づき、前記複数の変数を複数の前記レジスタに割当てるレジスタ割当部と
を備えることを特徴とする記録媒体。
【請求項２４】
ソースプログラムをプロセッサの命令列に変換するコンパイル方法であって、
前記ソースプログラム内で用いられる複数の変数それぞれにおいて、当該変数と同時に使われる変数を取得するステップと、
前記複数の変数それぞれを、当該変数と同時に使われる変数とは異なるレジスタに割当てる、前記複数の変数間の割当順序を複数生成するステップと、
前記複数の変数のそれぞれを、複数の前記レジスタのうち何れのレジスタに優先して割当てるかを示す割当優先度を取得するステップと、
複数の前記割当順序のうち前記割当優先度に基づき選択した一の前記割当順序に従い、前記複数の変数を前記レジスタに割当てるステップと
を備えることを特徴とするコンパイル方法。
【請求項２５】
ソースプログラムをプロセッサの命令列に変換するコンパイル方法であって、
前記ソースプログラム内で用いられる複数の変数それぞれにおいて、前記ソースプログラム内における当該変数の用いられ方に基づいて、当該変数を何れの種類のレジスタに割当てるべきかを示すレジスタ嗜好性情報及び当該変数と他の変数との間にある前記ソースプログラム上における関連性を示す情報である変数関連性情報のうち、少なくとも一方の情報を、前記複数の変数毎の前記複数のレジスタそれぞれへの割当優先度として生成するステップと、
前記割当優先度に基づき、前記複数の変数を複数の前記レジスタに割当てるステップと
を備えることを特徴とするコンパイル方法。
【請求項２６】
ソースプログラムで用いられる複数の変数を、プロセッサの命令列中で用いられるレジスタに割当てるレジスタ割当方法であって、
前記複数の変数それぞれにおいて、当該変数と同時に使われる変数を取得するステップと、
前記複数の変数それぞれを、当該変数と同時に使われる変数とは異なる前記レジスタに割当てる、前記複数の変数間の割当順序を複数生成するステップと、
前記複数の変数のそれぞれを、複数の前記レジスタのうち何れのレジスタに優先して割当てるかを示す割当優先度を取得するステップと、
複数の前記割当順序のうち前記割当優先度に基づき選択した一の前記割当順序に従い、前記複数の変数を前記レジスタに割当てるステップと
を備えることを特徴とするレジスタ割当方法。
【請求項２７】
ソースプログラム内で用いられる複数の変数を、プロセッサの命令列中で用いられるレジスタに変換するレジスタ割当方法であって、
前記複数の変数それぞれにおいて、前記ソースプログラム内における当該変数の用いられ方に基づいて、当該変数を何れの種類の前記レジスタに割当てるべきかを示すレジスタ嗜好性情報及び当該変数と他の変数との間にある前記ソースプログラム上における関連性を示す情報である変数関連性情報のうち、少なくとも一方の情報を、前記複数の変数毎の前記複数のレジスタそれぞれへの割当優先度として生成するステップと、
前記割当優先度に基づき、前記複数の変数を複数の前記レジスタに割当てるステップと
を備えることを特徴とするレジスタ割当方法。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明は、コンパイラ、レジスタ割当装置、プログラム、記録媒体、コンパイル方法、及びレジスタ割当方法に関する。特に本発明は、変数とレジスタとの嗜好性を考慮したコンパイラ、レジスタ割当装置、プログラム、記録媒体、コンパイル方法、及びレジスタ割当方法に関する。
【０００２】
【従来の技術】
米国特許第４５７１６７８号によると、複数の変数それぞれを、当該変数と同時に使われる変数とは異なるレジスタに割当てる変数間の割当順序を生成するレジスタ割当方法が提案されている。この割当順序に従い変数をレジスタに順次割当てることにより、変数の値をメモリへ退避及び復帰する回数を極小にできるので、メモリへのアクセス量を抑えることができる。
【０００３】
【発明が解決しようとする課題】
しかしながら、上記方法によると、複数のレジスタそれぞれの性質が互いに異なるようなコンピュータにおいて、変数の用いられ方と、当該変数に割当てられるレジスタの性質とが適合せず、生成される命令列の実行速度を遅くしてしまう場合があった。
【０００４】
そこで本発明は、上記の課題を解決することのできるコンパイラ、レジスタ割当装置、プログラム、記録媒体、コンパイル方法、及びレジスタ割当方法を提供することを目的とする。この目的は特許請求の範囲における独立項に記載の特徴の組み合わせにより達成される。また従属項は本発明の更なる有利な具体例を規定する。
【０００５】
【課題を解決するための手段】
即ち、本発明の第１の形態によると、ソースプログラムをプロセッサの命令列に変換するコンパイラであって、ソースプログラム内で用いられる複数の変数それぞれにおいて、当該変数と同時に使われる変数を取得する同時使用変数取得部と、複数の変数それぞれを、当該変数と同時に使われる変数とは異なるレジスタに割当てる、複数の変数間の割当順序を複数生成する割当順序生成部と、複数の変数のそれぞれを、複数のレジスタのうち何れのレジスタに優先して割当てるかを示す割当優先度を取得する割当優先度取得部と、複数の割当順序のうち割当優先度に基づき選択した一の割当順序に従い、複数の変数をレジスタに割当てるレジスタ割当部とを備えることを特徴とするレジスタ割当装置、レジスタ割当方法、当該レジスタ割当装置を実現するプログラム、当該プログラムを記録した記録媒体、当該レジスタ割当装置を備えるコンパイラ、当該コンパイラのコンパイル方法、当該コンパイラを実現するプログラム、当該プログラムを記録した記録媒体を提供する。
【０００６】
本発明の第２の形態によると、ソースプログラムをプロセッサの命令列に変換するコンパイラであって、ソースプログラム内で用いられる複数の変数それぞれにおいて、ソースプログラム内における当該変数の用いられ方に基づいて、当該変数を何れの種類のレジスタに割当てるべきかを示すレジスタ嗜好性情報及び当該変数と他の変数との間にあるソースプログラム上における関連性を示す情報である変数関連性情報のうち、少なくとも一方の情報を、複数の変数毎の複数のレジスタそれぞれへの割当優先度として生成する割当優先度生成部と、割当優先度に基づき、複数の変数を複数のレジスタに割当てるレジスタ割当部とを備えることを特徴とするレジスタ割当装置、レジスタ割当方法、当該レジスタ割当装置を実現するプログラム、当該プログラムを記録した記録媒体、当該レジスタ割当装置を備えるコンパイラ、当該コンパイラのコンパイル方法、当該コンパイラを実現するプログラム、当該プログラムを記録した記録媒体を提供する。
なお上記の発明の概要は、本発明の必要な特徴の全てを列挙したものではなく、これらの特徴群のサブコンビネーションも又発明となりうる。
【０００７】
【発明の実施の形態】
以下、発明の実施の形態を通じて本発明を説明するが、以下の実施形態は特許請求の範囲にかかる発明を限定するものではなく、又実施形態の中で説明されている特徴の組み合わせの全てが発明の解決手段に必須であるとは限らない。
【０００８】
図１は、コンパイラ１０の機能ブロックの一例を示す図である。コンパイラ１０は、メモリへのアクセス量を極小化しつつ、変数及びレジスタ間の嗜好性を生かしたレジスタ割当を行うことを目的とする。コンパイラ１０は、最適化処理部１００と、レジスタ割当装置２００と、実行コード生成部９００とを備える。
【０００９】
最適化処理部１００は、ソースプログラムを外部から受け取り、例えば、データフロー最適化や、関数やメソッドのインライニング等の、各種の最適化を行うことにより当該ソースプログラムを変換し、レジスタ割当装置２００に送る。レジスタ割当装置２００は、ソースプログラムを最適化処理部１００から受け取ると、当該ソースプログラム中で用いられる変数を、プロセッサにより実行可能な命令列中のレジスタに割り当て、当該命令列を実行コード生成部９００に送る。実行コード生成部９００は、命令列をレジスタ割当装置２００から受け取り、当該命令列をプロセッサにより実行可能なデータ形式に変換し、外部に出力する。ここで、ソースプログラムとは、例えば、Ｊａｖａ（サン・マイクロシステムズ・インコーポレーテッドの登録商標）やＣ言語等の表層言語で記述されたプログラムである。また、ソースプログラムとは、表層言語に所定の変換を行った、Ｊａｖａバイトコードや、ＲＴＬ（Ｒｅｇｉｓｔｅｒ　Ｔｒａｎｓｆｅｒ　Ｌａｎｇｕａｇｅの略）等の中間表現（例えば、Ｉｎｔｅｒｍｅｄｉａｔｅ　Ｒｅｐｒｅｓｅｎｔａｔｉｏｎ）であってもよい。また、ソースプログラムとは、これらの表現により記述されたプログラムの全体であってもよいし、当該プログラムの一部であって、特定の処理のみを行うモジュールやオブジェクトであってもよい。
【００１０】
レジスタ割当装置２００は、生存区間解析部２１０と、同時使用変数取得部２２０と、割当順序生成部２３０と、レジスタ割当可能性判断部２４０と、同一レジスタ割当検出部２６０と、ループ解析部２７０と、実行履歴情報取得部２８０と、割当優先度生成部２９０と、割当優先度取得部３００と、レジスタ割当部３１０とを有する。
【００１１】
生存区間解析部２１０は、最適化処理部１００からソースプログラムを受け取ると、当該ソースプログラムを解析することにより、複数の変数を検出する。変数とは、例えば、ソースプログラム中の変数そのものである。また、変数とは、ソースプログラム中で、変数に値が代入されてから当該値が最後に使われるまでの区間を示す生存区間（Ｌｉｖｅ　Ｒａｎｇｅ）であってもよい。この場合、生存区間解析部２１０は、ソースプログラム中で用いられる各値の生存区間を、データフロー解析等の技術により解析してもよい。そして、生存区間解析部２１０は、ソースプログラム及び複数の変数の情報を同時使用変数取得部２２０に送る。
【００１２】
同時使用変数取得部２２０は、生存区間解析部２１０又はレジスタ割当可能性判断部２４０から、ソースプログラム及び複数の変数の情報を受け取ると、複数の変数それぞれについて、当該変数と同時に使われる状態である干渉状態にある変数を、ソースプログラムを解析することにより取得する。例えば、同時使用変数取得部２２０は、複数の変数として、複数の値それぞれにつき、生存区間の少なくとも一部が重複する他の値を、干渉状態にある変数であると解析する。そして、同時使用変数取得部２２０は、干渉状態にある変数の情報及びソースプログラムを割当順序生成部２３０に送る。
【００１３】
割当順序生成部２３０は、干渉グラフ生成部４００と、第１選択部４１０と、第２選択部４２０と、順序決定部４３０とを有する。干渉グラフ生成部４００は、干渉状態にある変数の情報を同時使用変数取得部２２０から受け取り、これらの変数を、変数をノードで表し、変数が干渉状態にある旨をエッジで表した干渉グラフ（Ｉｎｔｅｒｆｅｒｅｎｃｅ　Ｇｒａｐｈ）を作成する。そして、第１選択部４１０及び第２選択部４２０は、グラフカラーリング手法により、干渉グラフを簡約（Ｓｉｍｐｌｉｆｉｃａｔｉｏｎ）する。そして、順序決定部４３０は、干渉グラフの簡約により得られる情報に基づき、変数間のレジスタへの割当順序を半順序として生成し、レジスタ割当部３１０に送る。また、割当順序生成部２３０は、同時使用変数取得部２２０から受け取ったソースプログラムをレジスタ割当部３１０に送る。
【００１４】
ここで、半順序とは、少なくとも一組の変数間に順序が定められ、全体として変数間に順序の循環がない順序を示す。なお、本実施形態において、割当順序生成部２３０は、レジスタの割当順序として半順序を生成したが、割当順序生成部２３０が生成する複数の割当順序は本例に限定されない。例えば、割当順序生成部２３０は、複数の全順序関係を割当順序として生成してもよいし、複数の全順序を包含する半順序を用いて複数の割当順序を表現してもよい。
【００１５】
同一レジスタ割当検出部２６０は、最適化処理部１００からソースプログラムを受け取り、当該ソースプログラムを解析することにより、複数の変数の組合せであって、これら複数の変数を同一のレジスタに割当てることにより命令列の実行速度を向上させる組合せを検出し、この変数の組合せの情報を割当優先度生成部２９０に送る。ループ解析部２７０は、最適化処理部１００からソースプログラムを受け取り、当該ソースプログラムを解析することにより、繰り返し実行される部分であるループ部分を検出し、このループ部分の情報を割当優先度生成部２９０に送る。実行履歴情報取得部２８０は、ソースプログラムを予め実行した場合の実行履歴情報を最適化処理部１００から取得し、割当優先度生成部２９０に送る。割当優先度生成部２９０は、変数の組合せの情報、ループ部分の情報、実行履歴情報、及びソースプログラムを、それぞれ、同一レジスタ割当検出部２６０、ループ解析部２７０、実行履歴情報取得部２８０、及び最適化処理部１００から受け取り、これらの情報及びプログラムに基づき、複数の変数のそれぞれを、複数のレジスタのうち何れのレジスタに優先して割当てるかを示す割当優先度を生成する。そして、割当優先度生成部２９０は、割当優先度を割当優先度取得部３００に送る。割当優先度取得部３００は、割当優先度を割当優先度生成部２９０から取得し、レジスタ割当部３１０に送る。
【００１６】
レジスタ割当部３１０は、格納部５００と、割当選択部５１０と、割当実行部５２０と、割当反復部５３０とを有する。格納部５００は、割当順序を割当順序生成部２３０から受け取り、当該割当順序が最先である少なくとも１つの同時割当候補変数を格納する。また、割当選択部５１０は、割当優先度取得部３００から割当優先度を受け取る。そして、割当選択部５１０、割当実行部５２０及び割当反復部５３０は、割当順序及び割当優先度に基づき、必要に応じて格納部５００を用いて、割当順序が先である変数から順次レジスタを割当てる。そして、レジスタ割当部３１０は、割当順序生成部２３０から受け取ったソースプログラムと伴に、レジスタを割当てた結果をレジスタ割当可能性判断部２４０に送る。
【００１７】
レジスタ割当可能性判断部２４０は、レジスタ割当部３１０からレジスタを割当てた結果を受け取る。そして、レジスタ割当可能性判断部２４０は、複数の変数それぞれをレジスタに割当てられないと判断した場合に、複数の変数に所定の変更を行い、当該変更を行った複数の変数の情報と伴に、割当順序生成部２３０から受け取ったソースプログラムを同時使用変数取得部２２０に送る。
【００１８】
このように、コンパイラ１０は、レジスタの値のメモリへの退避及び復帰の量を極小にしつつ、ソースプログラム中における変数の用いられ方に基づいて、複数の変数をレジスタに割当てることができる。
【００１９】
図２は、コンパイラ１０の動作フローを示す。生存区間解析部２１０は、複数の変数における値の生存区間を解析する（Ｓ１０）。同時使用変数取得部２２０は、ソースプログラム内で用いられる複数の変数それぞれにおいて、当該変数と干渉状態にある変数の情報を取得する（Ｓ２０）。続いて、干渉グラフ生成部４００は、この情報に基づき、干渉グラフを生成する。そして、割当順序生成部２３０は、複数の変数それぞれを、当該変数と干渉状態にある変数とは異なるレジスタに割当てる、複数の変数間の割当順序を半順序として生成する（Ｓ４０）。例えば、割当順序生成部２３０は、複数の変数それぞれを、当該変数と干渉状態にある変数とは異なるレジスタに割当てるために、グラフカラーリング手法による彩色可能性を保証するような複数の変数間の割当順序を生成する。一方、割当優先度生成部２９０は、複数の変数のそれぞれを、複数のレジスタのうち何れのレジスタに優先して割当てるかを示す割当優先度を生成する（Ｓ５０）。そして、レジスタ割当部３１０は、割当順序及び割当優先度に基づき複数の変数を複数のレジスタに割当てる（Ｓ６０）。続いて、レジスタ割当可能性判断部２４０は、レジスタ割当部３１０が複数の変数それぞれを当該変数と干渉状態にある変数とは異なるレジスタに割当てていないと判断した場合（Ｓ７０：ＮＯ）に、複数の変数のうち少なくとも一の変数をそれぞれ２以上の変数に分割することにより、複数の変数から新たな複数の変数を生成し（Ｓ８０）、Ｓ２０の処理に戻る。一方、レジスタ割当可能性判断部２４０は、レジスタ割当部３１０が複数の変数それぞれを当該変数と干渉状態にある変数とは異なるレジスタに割当てたと判断した場合（Ｓ７０：ＹＥＳ）に、レジスタ割当を終了する。なお、レジスタ割当可能性判断部２４０は、複数の変数それぞれを当該変数と干渉状態にある変数とは異なるレジスタに割当てられるか否かを判断する方法として、Ｓ６０の処理結果に基づき、レジスタの値をメモリに退避することを示すスピルの発生を判断する。また、他の例として、レジスタ割当可能性判断部２４０は、干渉グラフを簡約できるか否かを判断することによりレジスタ割当可能性を判断してもよい。
【００２０】
図３は、Ｓ４０の動作フローを示す図である。割当順序生成部２３０は、Ｓ４０の動作に際して一時的に用いる記憶領域として、スタック型のデータ構造であるスタックＡを準備する。第１選択部４１０は、レジスタの総数（以降の説明において、Ｎと呼称する）より小さい数の変数とのみ干渉状態にある変数をすべて選択し、これらの変数の識別情報を任意の順序でスタックＡに順次プッシュする（Ｓ５００）。割当順序生成部２３０は、ソースプログラム中の全ての変数をスタックＡにプッシュすることを示す簡約処理が終了したか否かを判断する。割当順序生成部２３０が簡約処理を終了していないと判断した場合に（Ｓ５１０：ＮＯ）、第２選択部４２０は、既に選択された変数を除外し（Ｓ５２０）、この場合における残された変数に対してＳ５００の処理を行う。
【００２１】
一方、割当順序生成部２３０が簡約処理を終了したと判断した場合に（Ｓ５１０：ＹＥＳ）、順序決定部４３０は、スタックＡ内の識別情報を逆順に並び替える（Ｓ５３０）。続いて、順序決定部４３０は、Ｎより小さい数の変数とのみ干渉状態にある変数を選択し（Ｓ５４０）、これらの変数を、最も後ろの割当順序とする（Ｓ５５０）。続いて、割当順序生成部２３０は、以降の処理を繰り返し行う。
【００２２】
順序決定部４３０は、スタックＡが空になったと判断した場合（Ｓ５６０：ＹＥＳ）、生成された割当順序を出力して終了する。順序決定部４３０は、スタックＡが空でないと判断した場合（Ｓ５６０：ＮＯ）、スタックＡから識別情報を１つポップし（Ｓ５７０）、この識別情報に対応する変数と干渉状態にある少なくとも１つの変数を選択する（Ｓ５８０）。
【００２３】
そして、順序決定部４３０は、選択した少なくとも１つの変数のうち、Ｎ以上の変数と干渉状態にある変数を特定し（Ｓ５９０）、この特定された変数の割当順序を、スタックＡからポップした変数より先の割当順序とする（Ｓ６００）。すなわち、順序決定部４３０は、スタックＡからポップした変数を除外することにより、Ｎ−１以下の変数とのみ干渉状態となり得る変数を、スタックＡからポップした変数より先の割当順序とする。
【００２４】
続いて、順序決定部４３０は、割当順序の生成により生じた推移的な順序を削除する。すなわち、順序決定部４３０は、例えば、ソースプログラム中の複数の変数のうちの１つの変数である第１変数と、第１変数より割当順序が後である第２変数と、第２変数より割当順序が後である第３変数と、第３変数が第１変数より後である旨の割当順序とを検出した場合に、第３変数が第１変数より後である旨の割当順序を削除する（Ｓ６１０）。続いて、順序決定部４３０は、ポップした変数を除外した場合について、Ｓ５６０からの処理を繰り返し実行する（Ｓ６１０）。
【００２５】
このように、順序決定部４３０は、スタックＡを逆順にアクセスすることにより、第２選択部４２０が行った複数の変数の選択順を特定することができる。従って、順序決定部４３０は、第２選択部４２０の処理を複数の変数のそれぞれに適用する場合に、当該変数を、当該変数を除外することにより選択可能となる変数より後の割当順序とすることにより半順序を生成することができる。
【００２６】
図４は、Ｓ５０の動作フローを示す図である。割当優先度生成部２９０は、ソースプログラム中の、関数呼び出しの前及びこの関数呼び出しからの復帰後の双方の部分において、変数が使用されると判断した場合（Ｓ４００：ＹＥＳ）に、この変数を関数内で用いられないレジスタに優先して割当てることを示すレジスタ嗜好性情報を生成する（Ｓ４０５）。関数内で用いられないレジスタとは、例えば、実行コードである命令列の関数呼び出し手続き（Ｃａｌｌｉｎｇ　Ｃｏｎｖｅｎｔｉｏｎと呼称される）において定められる、呼び出される関数に値の保存及び復帰を行うことが定められている不揮発性レジスタ（例えば、ｎｏｎ―ｖｏｌａｔｉｌｅ　ｒｅｇｉｓｔｅｒや、ｃａｌｌｅｅ−ｓａｖｅｄ　ｒｅｇｉｓｔｅｒと呼称される）である。
【００２７】
続いて、割当優先度生成部２９０は、変数が関数間の値の引渡しに用いられると判断した場合（Ｓ４１０：ＹＥＳ）に、関数呼び出し手続きにおいて定められる引数レジスタ又は戻り値レジスタに、当該変数を優先して割当てることを示すレジスタ嗜好性情報を生成する（Ｓ４２０）。
【００２８】
一方、実行履歴情報取得部２８０は、ソースプログラムが示す処理を予め実行した場合に得られる実行履歴情報を最適化処理部１００から取得し、ループ解析部２７０は、ソースプログラムにおいて、繰り返し実行されるループ部分を解析する。そして、割当優先度生成部２９０は、実行履歴情報又はループ部分の情報に基づき、変数が頻繁に用いられると判断した場合に（Ｓ４３０：ＹＥＳ）、当該変数を他の部分のみで用いられる変数より優先してレジスタに割当てる旨のレジスタ嗜好性情報を生成する（Ｓ４４０）。
【００２９】
また、コンパイラ１０は、ソースプログラムを、ペアードロード及びペアードストア（例えば、ＬＤＤ、ＳＴＤとシンボル化される命令）等の、アドレスの連続するメモリとの間でデータを転送するメモリアクセス命令を有する命令列に変換する場合に、下記の処理を行う。割当優先度生成部２９０は、ソースプログラム内においてアドレスの連続するメモリとの間でデータを転送する複数の変数を検出した場合（Ｓ４５０：ＹＥＳ）に、これらの複数の変数を、組合せメモリアクセス命令を適用可能な複数のレジスタに優先して割当てる変数関連性情報を生成する（Ｓ４６０）。
【００３０】
続いて、同一レジスタ割当検出部２６０は、同一のレジスタに割当てた場合に命令列の実行速度が向上する変数の組合せを検出した場合（Ｓ４７０：ＹＥＳ）に、この組合せ中の変数を同一のレジスタに優先して割当てる旨の変数関連性情報を生成する（Ｓ４８０）。例えば、同一レジスタ割当検出部２６０は、ソースプログラム中のある変数から他の変数への代入文を検出すると、このある変数及び他の変数を、同一のレジスタに割当てた場合に命令列の実行速度が向上する変数の組合せとする。すなわち、これらの変数が同一のレジスタに割当てられた場合に、同一レジスタ割当検出部２６０は、他の最適化処理に、代入文自体を削除する可能性を提供することができる。
【００３１】
このように、割当優先度生成部２９０は、同一レジスタ割当検出部２６０、ループ解析部２７０、及び実行履歴情報取得部２８０を用いて、複数の変数のそれぞれを、複数のレジスタのうち何れのレジスタに優先して割当てるかを示す割当優先度を生成することができる。
【００３２】
図５は、Ｓ５５の動作フローを示す図である。割当優先度生成部２９０は、割当優先度情報を示すデータ構造の一例として、レジスタ嗜好性及び変数関連性を示すグラフを作成してもよい。例えば、割当優先度生成部２９０は、グラフにおけるノードが変数及びレジスタの種類を表し、エッジが割当優先度情報を表すグラフを以下に示す動作により作成する。割当優先度生成部２９０は、まず、複数の変数のうち１つの変数を選択する（Ｓ８００）。割当優先度生成部２９０は、選択した変数が、何れかのレジスタ又は変数に対して、割当優先度情報を持つと判断した場合に（Ｓ８１０：ＹＥＳ）、割当優先度生成部２９０は、この選択した変数を、割当優先度情報の対象となるノード、すなわち変数又はレジスタとエッジで接続し（Ｓ８２０）、このエッジに、割当優先度の高さを示す数値を対応付けて設定することにより、このエッジを重み付けする（Ｓ８３０）。割当優先度生成部２９０は、この重み付けを終えた場合、若しくは選択した変数が何れかのレジスタ又は変数に対して割当優先度情報を持たないと判断した場合に（Ｓ８１０：ＮＯ）、複数の変数全てについて選択及び割当優先度の設定を終了したか否かを判断する（Ｓ８４０）。割当優先度生成部２９０は、複数の変数全てについて選択及び割当優先度の設定を終了したと判断した場合に（Ｓ８４０：ＹＥＳ）、Ｓ８００に戻り、そうでない場合に（Ｓ８４０：ＮＯ）、処理を終了する。このように、割当優先度生成部２９０は、割当優先度情報をグラフで示すことにより、割当優先度情報を利便に参照させることができる。
【００３３】
図６は、Ｓ６０の動作フローを示す図である。格納部５００は、割当順序を参照することにより、割当順序が最も先の少なくとも１つの同時割当候補変数を特定し、この変数の識別情報を格納する（Ｓ７００）。割当反復部５３０は、格納部５００が空であると判断した場合に（Ｓ７１０：ＹＥＳ）、レジスタ割当を終了する。割当反復部５３０により格納部５００が空でないと判断された場合に（Ｓ７１０：ＮＯ）、割当選択部５１０は、格納部５００から１つの識別情報を選択し（Ｓ７２０）、格納部５００から削除し、この識別情報に対応する同時割当候補変数（例えば、変数Ｖとする）の全ての割当優先度の情報を割当優先度取得部３００から取得する（Ｓ７３０）。
【００３４】
割当選択部５１０は、取得した割当優先度の情報から、変数Ｖと干渉状態にある全ての変数に既に割当てられているレジスタと、変数Ｖとの間のレジスタ嗜好性情報を削除する（Ｓ７４０）。続いて、割当選択部５１０は、変数Ｖとの変数関連性情報を有する全ての変数のうち、既にレジスタに割当てられていない変数に対する変数関連性情報を、取得した割当優先度の情報から削除する（Ｓ７５０）。以上のように変更した割当優先度の情報に基づき、割当実行部５２０は、最大の割当優先度及び最小の割当優先度の差を算出し、変数Ｖを識別する情報と対応付けて一時的に格納しておく（Ｓ７６０）。続いて、割当実行部５２０は、格納部５００内の全ての変数に、上記Ｓ７２０からＳ７６０を処理していないと判断した場合に、Ｓ７２０に戻り処理を継続する。
【００３５】
割当実行部５２０は、格納部５００内の全ての変数に、上記Ｓ７２０からＳ７６０を処理したと判断した場合に（Ｓ７７０：ＹＥＳ）格納部５００内の変数の中に、レジスタ割当可能な変数があるか否かを判断する（Ｓ７７５）。割当実行部５２０は、レジスタ割当可能な変数がないと判断した場合に（Ｓ７７５：ＮＯ）、レジスタの値をメモリに退避することを示すスピルが発生した旨の情報をレジスタ割当可能性判断部２４０に送り、処理を終了する（Ｓ７７８）。一方、割当実行部５２０は、レジスタ割当可能な変数があると判断した場合に（Ｓ７７５：ＹＥＳ）、一時的に格納されている、最大の割当優先度及び最小の割当優先度の差が最大である変数を特定し、当該変数を、最大の割当優先度に対応するレジスタに割当てる（Ｓ７８０）。続いて、格納部５００中の同時割当候補変数より割当順序が低い変数のうち、レジスタに割当てられてなくかつ割当順序がより先の変数を有しない変数を、新たに格納部５００に格納し（Ｓ７９０）、Ｓ７１０に戻る。
このように、レジスタ割当部３１０は、レジスタ割当の半順序を保ちつつ、割当優先度に基づき当該半順序を位相整列（例えば、ｔｏｐｏｌｏｇｉｃａｌ　ｓｏｒｔと呼称される）することにより選択した一の割当順序に従い、複数の変数をレジスタに割当てることができる。
【００３６】
図７は、コンパイラ１０がコンパイルするソースプログラムの一例を示す図である。
【００３７】
図７（ａ）が示すソースプログラムは、第１文９１０から第１０文９９５を有する。第１文９１０、第２文９２０、第３文９３０、第４文９４０、第５文９５０、第６文９６０、及び第８文９８０は、それぞれ、変数ｖ０にメモリ中のアドレスａｒｇ０の内容を代入する、変数ｖ１にメモリ中のアドレスｖ０の内容を代入する、変数ｖ２にメモリ中のアドレスｖ０＋４の内容を代入する、変数ｖ３に変数ｖ０の内容を代入する、変数ｖ４に変数ｖ１と変数ｖ２の和を代入する、変数ａｒｇ０に変数ｖ３の内容を代入する、変数ｖ０に変数ｖ４に１を加えた値を代入することを示す。第７文９７０は、所定の関数を呼び出し、当該関数の処理を終了した後に、第８文９８０からの処理を継続することを示す。第９文９９０は、変数ｖ０と０とを比較し、等しくない場合に第２文９２０に処理を移すことを示す。第１０文９９５は、図７（ａ）に示すソースプログラムの実行を終了することを示す。
【００３８】
図７（ｂ）は、複数の変数の生存区間を示す。生存区間解析部２１０は、図７（ａ）に示すソースプログラムを、データフロー解析等の技術を用いることにより、図７（ｂ）に示す生存区間を生成する。第１生存区間８１０は、変数ｖ０の値が第２文９２０で代入され、第４文９４０で最後に用いられることを、第２文９２０から第４文９４０に至る線分で示す。第２生存区間８２０は、変数ｖ１の値が第２文９２０で代入され、第５文９５０で最後に用いられることを、第２文９２０から第５文９５０に至る線分で示す。第３生存区間８３０は、変数ｖ２の値が第３文９３０で代入され、第５文９５０で最後に用いられることを、第３文９３０から第５文９５０に至る線分で示す。第４生存区間８４０は、変数ｖ３の値が第４文９４０で代入され、第６文９６０で最後に用いられることを、第４文９４０から第６文９６０に至る線分で示す。
【００３９】
第５生存区間８５０は、変数ｖ４の値が第５文９５０文で代入され、第８文９８０で最後に用いられることを、第５文９５０から第８文９８０に至る線分で示す。第６生存区間８６０は、変数ａｒｇ０の値が第１文９１０で用いられることを、第１文９１０付近の線分で示す。第７生存区間８７０は、変数ａｒｇ０の値が第６文９６０で代入され、第７文９７０で最後に用いられることを、第６文９６０から第７文９７０に至る線分で示す。第８生存区間８８０は、変数ｖ０の値が第２文９２０で代入され、第４文９４０で最後に用いられることを、第２文９２０から第４文９４０に至る線分で示す。
【００４０】
図７（ｃ）は、ソースプログラム内で用いられる複数の変数それぞれにおける、当該変数と同時に使われる状態である干渉状態にある変数の情報を示す干渉グラフの一例を示す。同時使用変数取得部２２０は、図７（ｂ）に示す生存区間を用いて、図７（ｃ）にグラフとして示す情報を生成する。ｖ０〜ｖ４、及びａｒｇ０と記されたノードは、それぞれ記された名称の変数を表す。複数のノードを接続するエッジは、それらのノードが示す変数が互いに干渉状態にあることを示す。例えば、変数ｖ０は、変数ｖ１及び変数ｖ２と互いに干渉状態にある。変数ｖ１は変数ｖ２と互いに干渉状態にある。変数ｖ３は、変数ｖ１、変数ｖ２、及び変数ｖ４と互いに干渉状態にある。変数ｖ４は、変数ａｒｇ０と互いに干渉状態にある。
【００４１】
このように、ソースプログラムを解析することにより、生存区間解析部２１０は、生存区間を算出し、同時使用変数取得部２２０は、同時使用変数を特定することができる。
【００４２】
図８は、割当順序生成部２３０が生成する割当順序の一例を示す図である。図８（ａ）は、割当順序生成部２３０が、図７（ｃ）で示した干渉状態を示すグラフに、図３のＳ５００〜Ｓ５２０（本図ではレジスタ数Ｎは３である）で示した処理を行った結果を示す。すなわち、割当順序生成部２３０は、スタック型のデータ構造であるスタックＡの、底から順に、変数ｖ０、変数ｖ４、変数ｖ１、変数ｖ２、及び変数ｖ３を格納する。
【００４３】
図８（ｂ）は、図８（ａ）に基づき、割当順序生成部２３０が、図３のＳ５３０からＳ６１０の処理を行った結果生成した割当順序を示す。図８（ｂ）において、最先の割当順序の変数を示すノードは、「トップ」と記されたノードと、当該ノードから最先の割当順序の変数への有向エッジで接続されている。例えば、変数ｖ１、変数ｖ２、及び変数ｖ３を示すノードは、「トップ」と記されたノードと接続されている。そして、変数ｖ１及び変数ｖ２を示すノードは、それぞれ、変数ｖ０を示すノードと、変数ｖ１及び変数ｖ２それぞれから変数ｖ０への有向エッジで接続されている。また、変数ｖ３を示すノードは、変数ｖ４を示すノードと、変数ｖ３から変数ｖ４への有向エッジで接続されている。そして、割当順序が最も後である変数ｖ０及び変数ｖ４は、それぞれ、「ボトム」と記されたノードと、変数ｖ０及び変数ｖ４から「ボトム」と記されたノードへの有向エッジで接続されている。上記有向エッジは、それぞれ、有向エッジの接続元のノードに対応する変数を、当該有向きエッジの接続際のノードに対応する変数より先にレジスタに割当てる割当順序を示す。
このように、割当順序生成部２３０は、ソースプログラムの解析結果に基づき、割当順序を生成することができる。
【００４４】
図９は、レジスタ割当部３１０が生成する割当優先度及びコンパイラ１０が生成する命令列の一例を示す図である。図９（ａ）は、レジスタ割当部３１０が生成する割当優先度をグラフで示す。変数ｖ０〜ｖ４と記されたノードは、それぞれ記された名称の変数を示す。「揮発性レジスタ」と記されたノードは、レジスタの種類としての揮発性レジスタを示す。同様に、「不揮発性レジスタ」と記されたノードは、レジスタの種類として、揮発性レジスタでない不揮発性レジスタを示す。ａｒｇ０と記されたノードは、レジスタの種類として関数間の値の受渡しに用いられるレジスタを示す。本図に示した各変数は、図７（ａ）に示した同一の名称のレジスタにそれぞれ対応する。また、関数呼び出し手続きにより関数間の値の受渡しにレジスタｒ１を用いることが予め定められているので、変数ａｒｇ０は、既にレジスタｒ１に割当てられているものとする。各ノード間を接続するエッジは、割当優先度を示す。例えば、変数ｖ０と「揮発性レジスタ」を示すノードとの間のエッジは、レジスタ嗜好性情報を示し、割当優先度が９１であることを示す。また、変数ｖ１とｖ２とを示すノードを接続するエッジは、変数関連性情報を示し、変数ｖ２が変数ｖ１に隣接するレジスタに割当てる場合の割当優先度が、５０又は４８であることを示している。より具体的には、変数ｖ１が既に不揮発性レジスタに割当てられている場合に、変数ｖ２を変数ｖ１の次のレジスタに割当てる場合の割当優先度は、４８である。一方、変数ｖ１が既に揮発性レジスタに割当てられている場合に、変数ｖ２を変数ｖ１の次のレジスタに割当てる場合の割当優先度は、５０である。同様に、変数ｖ３を変数ｖ０と同一のレジスタに割当てる場合の割当優先度は、４０又は３８である。
なお、上記の割当優先度は、図４及び図５に示した動作により生成される。例えば、変数ｖ４は、関数呼び出しの前後の双方の部分で用いられるので、揮発性レジスタより、不揮発性レジスタにより優先して割当てられる（例えば、不揮発性レジスタへの割当優先度が２８、揮発性レジスタへの割当優先度が０）。
このように、割当優先度生成部２９０は、変数と、レジスタの種類との間の割当優先度を、変数及びレジスタの組合せ毎に生成する。従って、レジスタ割当部３１０は、変数と、引数レジスタや揮発性レジスタ等のレジスタの種類との間の割当優先度に応じて、変数をレジスタに割当てることができる。
【００４５】
図９（ｂ）は、図９（ａ）及び図８（ｂ）に基づき、レジスタ割当部３１０が変数をレジスタに割当てた結果を示す。レジスタ割当部３１０は、変数ｖ０、変数ｖ１、変数ｖ２、変数ｖ３、変数ｖ４、及び変数ａｒｇ０を、それぞれレジスタｒ１、レジスタｒ２、レジスタｒ３、レジスタｒ１、レジスタｒ３、及びレジスタｒ１に割当てる。従って、レジスタ割当部３１０は、複数の変数それぞれを、当該変数と同時に使われる変数とは異なるレジスタに割当てることができる。このように、レジスタ割当装置２００は、レジスタ割当の順序を保ちつつ、割当優先度に基づき、変数をレジスタに割当てるので、高速に実行される命令列を生成することができる。
【００４６】
図１０は、コンパイラ１０のハードウェア構成の一例を示す。本実施形態に係るコンパイラ１０は、ホストコントローラ１０８２により相互に接続されるＣＰＵ１０００、ＲＡＭ１０２０、グラフィックコントローラ１０７５、及び表示装置１０８０を有するＣＰＵ周辺部と、入出力コントローラ１０８４によりホストコントローラ１０８２に接続される通信インターフェイス１０３０、ハードディスクドライブ１０４０、及びＣＤ−ＲＯＭドライブ１０６０を有する入出力部と、入出力コントローラ１０８４に接続されるＲＯＭ１０１０、フロッピーディスクドライブ１０５０、及び入出力チップ１０７０を有するレガシー入出力部とを備える。
【００４７】
ホストコントローラ１０８２は、ＲＡＭ１０２０と、高い転送レートでＲＡＭ１０２０をアクセスするＣＰＵ１０００及びグラフィックコントローラ１０７５とを接続する。ＣＰＵ１０００は、ＲＯＭ１０１０及びＲＡＭ１０２０に格納されたプログラムに基づいて動作し、各部の制御を行う。グラフィックコントローラ１０７５は、ＣＰＵ１０００等がＲＡＭ１０２０内に設けたフレームバッファ上に生成する画像データを取得し、表示装置１０８０上に表示させる。これに代えて、グラフィックコントローラ１０７５は、ＣＰＵ１０００等が生成する画像データを格納するフレームバッファを、内部に含んでもよい。
【００４８】
入出力コントローラ１０８４は、ホストコントローラ１０８２と、比較的高速な入出力装置である通信インターフェイス１０３０、ハードディスクドライブ１０４０、及びＣＤ−ＲＯＭドライブ１０６０を接続する。通信インターフェイス１０３０は、ネットワークを介して他の装置と通信する。ハードディスクドライブ１０４０は、コンパイラ１０が使用するプログラム及びデータを格納する。ＣＤ−ＲＯＭドライブ１０６０は、ＣＤ−ＲＯＭ１０９５からプログラム又はデータを読み取り、ＲＡＭ１０２０を介して入出力チップ１０７０に提供する。
【００４９】
また、入出力コントローラ１０８４には、ＲＯＭ１０１０と、フロッピーディスクドライブ１０５０や入出力チップ１０７０等の比較的低速な入出力装置とが接続される。ＲＯＭ１０１０は、コンパイラ１０の起動時にＣＰＵ１０００が実行するブートプログラムや、パーソナルコンピュータ本体１１０のハードウェアに依存するプログラム等を格納する。フロッピーディスクドライブ１０５０は、フロッピーディスク１０９０からプログラム又はデータを読み取り、ＲＡＭ１０２０を介して入出力チップ１０７０に提供する。入出力チップ１０７０は、フロッピーディスク１０９０や、例えばパラレルポート、シリアルポート、キーボードポート、マウスポート等を介して各種の入出力装置を接続する。
【００５０】
コンパイラ１０を実現するプログラムは、各種最適化処理モジュールと、レジスタ割当プログラムと、生存区間解析モジュールと、同時使用変数取得モジュールと、割当順序生成モジュールと、レジスタ割当可能性判断モジュールと、同一レジスタ割当モジュールと、ループ解析モジュールと、実行履歴情報取得モジュールと、割当優先度生成モジュールと、割当優先度取得モジュールと、干渉グラフ生成モジュールと、第１選択モジュールと、第２選択モジュールと、順序決定モジュールと、格納モジュールと、割当選択モジュールと、割当実行モジュールと、割当反復モジュールと、実行コード生成モジュールとを備える。これらのモジュールは、コンパイラ１０を、最適化処理部１００、レジスタ割当装置２００、生存区間解析部２１０、同時使用変数取得部２２０、割当順序生成部２３０、レジスタ割当可能性判断部２４０、同一レジスタ割当検出部２６０、ループ解析部２７０、実行履歴情報取得部２８０、割当優先度生成部２９０、割当優先度取得部３００、レジスタ割当部３１０、干渉グラフ生成部４００、第１選択部４１０、第２選択部４２０、順序決定部４３０、格納部５００、割当選択部５１０、割当実行部５２０、及び割当反復部５３０として動作させるプログラムである。
【００５１】
コンパイラ１０に提供されるプログラムは、フロッピーディスク１０９０、ＣＤ−ＲＯＭ１０９５、又はＩＣカード等の記録媒体に格納されて利用者によって提供される。このプログラムは、記録媒体から読み出され、入出力チップ１０７０を介して記憶システム２００及びバックアップ装置３００にインストールされ、記憶システム２００及びバックアップ装置３００において実行される。これに代えて、記憶システム２００及びバックアップ装置３００のそれぞれは、更にフロッピーディスクドライブ、ＣＤ−ＲＯＭドライブ、又はＩＣカードリーダ等を備え、当該プログラムを記録媒体から直接読み出して実行してもよい。
【００５２】
以上に示したプログラム又はモジュールは、外部の記憶媒体に格納されてもよい。記憶媒体としては、フロッピーディスク１０９０、ＣＤ−ＲＯＭ１０９５の他に、ＤＶＤやＰＤ等の光学記録媒体、ＭＤ等の光磁気記録媒体、テープ媒体、ＩＣカード等の半導体メモリ等を用いることができる。また、専用通信ネットワークやインターネットに接続されたサーバシステムに設けたハードディスク又はＲＡＭ等の記憶装置を記録媒体として使用し、ネットワークを介してプログラムをコンパイラ１０に提供してもよい。
【００５３】
以上の説明から明らかなように、コンパイラ１０は、レジスタの退避及び復帰回数を軽減し、かつ変数を適切なレジスタに割当てることができ、生成される命令列の実行速度を向上することができる。
【００５４】
以上、本発明を実施形態を用いて説明したが、本発明の技術的範囲は上記実施形態に記載の範囲には限定されない。上記実施形態に、多様な変更または改良を加えることができる。そのような変更または改良を加えた形態も本発明の技術的範囲に含まれ得ることが、特許請求の範囲の記載から明らかである。
【００５５】
以上に説明した実施形態によれば、以下の各項目に示すコンパイラ、レジスタ割当装置、プログラム、記録媒体、コンパイル方法、及びレジスタ割当方法が実現される。
【００５６】
（項目１）　ソースプログラムをプロセッサの命令列に変換するコンパイラであって、前記ソースプログラム内で用いられる複数の変数それぞれにおいて、当該変数と同時に使われる変数を取得する同時使用変数取得部と、前記複数の変数それぞれを、当該変数と同時に使われる変数とは異なるレジスタに割当てる、前記複数の変数間の割当順序を複数生成する割当順序生成部と、前記複数の変数のそれぞれを、複数の前記レジスタのうち何れのレジスタに優先して割当てるかを示す割当優先度を取得する割当優先度取得部と、複数の前記割当順序のうち前記割当優先度に基づき選択した一の前記割当順序に従い、前記複数の変数を前記レジスタに割当てるレジスタ割当部とを備えることを特徴とするコンパイラ。
【００５７】
（項目２）　前記割当順序生成部は、前記複数の変数それぞれを、当該変数と同時に使われる変数とは異なる前記レジスタに割当てる、前記複数の変数間の半順序を生成し、前記レジスタ割当部は、前記半順序を保ちつつ前記割当優先度に基づき選択した前記一の割当順序に従い、前記複数の変数を前記レジスタに割当てることを特徴とする請求項１記載のコンパイラ。
（項目３）　前記割当順序生成部は、前記レジスタの総数より小さい数の変数とのみ同時に使われる変数を選択する第１選択部と、既に選択された変数を除外した場合における残された変数のうち、前記レジスタの総数より小さい数の変数とのみ同時に使われる変数を選択する第２選択部と、前記第２選択部の処理を前記複数の変数のそれぞれに適用する場合に、当該変数を、当該変数を除外することにより選択可能となる変数より後の前記割当順序とすることにより前記半順序を生成する順序決定部とを有することを特徴とする請求項２記載のコンパイラ。
（項目４）　前記レジスタ割当部が前記複数の変数それぞれを当該変数と同時に使われる変数とは異なる前記レジスタに割当てられないと判断した場合に、前記複数の変数のうち少なくとも一の前記変数をそれぞれ２以上の変数に分割することにより、前記複数の変数から新たな複数の変数を生成し、当該新たな複数の変数に対して、前記同時使用変数取得部、前記割当順序生成部、及び前記レジスタ割当部による処理を繰り返し実行させるレジスタ割当可能性判断部をさらに備えることを特徴とする請求項２記載のコンパイラ。
【００５８】
（項目５）　前記レジスタ割当部は、前記半順序において前記割当順序が最先である少なくとも１つの同時割当候補変数を格納する格納部と、前記少なくとも一つの同時割当候補変数のうち、前記割当優先度に基づき一の前記同時割当候補変数を選択する割当選択部と、前記一の同時割当候補変数を前記格納部から取り除き、前記割当優先度に基づき選択した前記レジスタに割当てる割当実行部と、前記一の同時割当候補変数より前記割当順序が低い変数のうち、前記レジスタに割当てられてなくかつ前記割当順序がより先の変数を有しない変数を、新たに前記格納部に格納し、前記格納部が空になるまで前記割当実行部による処理を繰り返し実行させる割当反復部とを有することを特徴とする請求項２記載のコンパイラ。
（項目６）　前記割当実行部は、前記少なくとも一つの同時割当候補変数のうち、前記一の同時割当候補変数として、同時に使われる前記変数に既に割当てられていないレジスタとの割当優先度につき、最大の前記割当優先度及び最小の前記割当優先度との差が最大の変数を選択し、前記最大の割当優先度に対応するレジスタに割当てることを特徴とする請求項５記載のコンパイラ。
【００５９】
（項目７）　前記割当優先度として、前記複数の変数それぞれにおいて、前記ソースプログラム内における当該変数の用いられ方に基づいて、当該変数を何れの種類のレジスタに割当てるべきかを示すレジスタ嗜好性情報及び当該変数と他の変数との間にある前記ソースプログラム上における関連性を示す情報である変数関連性情報のうち、少なくとも１方の情報を、前記複数の変数毎の前記複数のレジスタそれぞれへの割当優先度として生成する割当優先度生成部を更に備えることを特徴とする請求項１記載のコンパイラ。
（項目８）　ソースプログラムをプロセッサの命令列に変換するコンパイラであって、前記ソースプログラム内で用いられる複数の変数それぞれにおいて、前記ソースプログラム内における当該変数の用いられ方に基づいて、当該変数を何れの種類のレジスタに割当てるべきかを示すレジスタ嗜好性情報及び当該変数と他の変数との間にある前記ソースプログラム上における関連性を示す情報である変数関連性情報のうち、少なくとも一方の情報を、前記複数の変数毎の前記複数のレジスタそれぞれへの割当優先度として生成する割当優先度生成部と、前記割当優先度に基づき、前記複数の変数を複数の前記レジスタに割当てるレジスタ割当部とを備えることを特徴とするコンパイラ。
【００６０】
（項目９）　前記レジスタ割当部は、前記複数の変数のうち、最大の前記割当優先度及び最小の前記割当優先度との差が最大の変数をより優先して前記レジスタに割当てることを特徴とする請求項８記載のコンパイラ。
（項目１０）　前記割当優先度生成部は、関数呼び出しの前及び前記関数呼び出しからの復帰後の双方の部分において、前記変数が使用されると判断した場合に、当該変数を前記関数内で用いられないレジスタに優先して割当てることを示すレジスタ嗜好性情報を生成することを特徴とする請求項８記載のコンパイラ。
（項目１１）　前記割当優先度生成部は、前記変数が関数間の値の引渡しに用いられると判断した場合に、前記命令列の関数呼び出し手続きにおいて定められる引数レジスタ又は戻り値レジスタに、当該変数を優先して割当てることを示すレジスタ嗜好性情報を生成することを特徴とする請求項８記載のコンパイラ。
（項目１２）　前記ソースプログラムが示す処理を予め実行した場合に得られる実行履歴情報を取得する実行履歴情報取得部を更に備え、前記割当優先度生成部は、前記実行履歴情報に基づき、前記ソースプログラムのうちより高い頻度で実行される部分に用いられる変数が、他の部分のみで用いられる変数より優先してレジスタに割当てられることを示すレジスタ嗜好性情報を生成することを特徴とする請求項８記載のコンパイラ。
【００６１】
（項目１３）　前記ソースプログラムにおいて、繰り返し実行されるループ部分を解析するループ解析部を更に備え、前記割当優先度生成部は、前記ループ部分において用いられる変数が、前記ループ部分以外の部分において用いられる変数より優先して前記レジスタに割当てられることを示すレジスタ嗜好性情報を生成することを特徴とする請求項８記載のコンパイラ。
（項目１４）　当該コンパイラは、前記ソースプログラムを、複数の前記レジスタと、アドレスの連続するメモリとの間でデータを転送するメモリアクセス命令を有する前記命令列に変換し、前記割当優先度生成部は、前記ソースプログラム内においてアドレスの連続するメモリとの間でデータを転送する複数の変数を、前記組合せメモリアクセス命令を適用可能な複数のレジスタに優先して割当てる変数関連性情報を生成することを特徴とする請求項８記載のコンパイラ。
（項目１５）　前記複数の変数のうち、同一のレジスタに割当てた場合に前記命令列の実行速度が向上する変数の組合せを検出する同一レジスタ割当検出部を更に備え、前記割当優先度生成部は、同一レジスタ割当検出部により検出された前記変数の組合せ中の変数を、同一のレジスタに割当てる変数関連性情報を生成することを特徴とする請求項８記載のコンパイラ。
（項目１６）　コンピュータを、請求項１から請求項１５の何れかに記載したコンパイラとして動作させるプログラム。
【００６２】
（項目１７）　ソースプログラムで用いられる複数の変数を、プロセッサの命令列中で用いられるレジスタに割当てるレジスタ割当装置であって、前記複数の変数それぞれにおいて、当該変数と同時に使われる変数を取得する同時使用変数取得部と、前記複数の変数それぞれを、当該変数と同時に使われる変数とは異なる前記レジスタに割当てる、前記複数の変数間の割当順序を複数生成する割当順序生成部と、前記複数の変数のそれぞれを、複数の前記レジスタのうち何れのレジスタに優先して割当てるかを示す割当優先度を取得する割当優先度取得部と、複数の前記割当順序のうち前記割当優先度に基づき選択した一の前記割当順序に従い、前記複数の変数を前記レジスタに割当てるレジスタ割当部とを備えることを特徴とするレジスタ割当装置。
（項目１８）　ソースプログラム内で用いられる複数の変数を、プロセッサの命令列中で用いられるレジスタに変換するレジスタ割当装置であって、前記複数の変数それぞれにおいて、前記ソースプログラム内における当該変数の用いられ方に基づいて、当該変数を何れの種類の前記レジスタに割当てるべきかを示すレジスタ嗜好性情報及び当該変数と他の変数との間にある前記ソースプログラム上における関連性を示す情報である変数関連性情報のうち、少なくとも一方の情報を、前記複数の変数毎の前記複数のレジスタそれぞれへの割当優先度として生成する割当優先度生成部と、前記割当優先度に基づき、前記複数の変数を複数の前記レジスタに割当てるレジスタ割当部とを備えることを特徴とするレジスタ割当装置。
（項目１９）　請求項１７又は請求項１８に記載のレジスタ割当装置をコンピュータにより実現するプログラム。
【００６３】
（項目２０）　コンピュータを、ソースプログラムをプロセッサの命令列に変換するコンパイラとして動作させるプログラムを記録した記録媒体であって、前記プログラムは、前記ソースプログラム内で用いられる複数の変数それぞれにおいて、当該変数と同時に使われる変数を取得する同時使用変数取得部と、前記複数の変数それぞれを、当該変数と同時に使われる変数とは異なるレジスタに割当てる、前記複数の変数間の割当順序を複数生成する割当順序生成部と、前記複数の変数のそれぞれを、複数の前記レジスタのうち何れのレジスタに優先して割当てるかを示す割当優先度を取得する割当優先度取得部と、複数の前記割当順序のうち前記割当優先度に基づき選択した一の前記割当順序に従い、前記複数の変数を前記レジスタに割当てるレジスタ割当部とを備えることを特徴とする記録媒体。
（項目２１）　コンピュータを、ソースプログラムをプロセッサの命令列に変換するコンパイラとして動作させるプログラムを記録した記録媒体であって、前記プログラムは、前記ソースプログラム内で用いられる複数の変数それぞれにおいて、前記ソースプログラム内における当該変数の用いられ方に基づいて、当該変数を何れの種類のレジスタに割当てるべきかを示すレジスタ嗜好性情報及び当該変数と他の変数との間にある前記ソースプログラム上における関連性を示す情報である変数関連性情報のうち、少なくとも一方の情報を、前記複数の変数毎の前記複数のレジスタそれぞれへの割当優先度として生成する割当優先度生成部と、前記割当優先度に基づき、前記複数の変数を複数の前記レジスタに割当てるレジスタ割当部とを備えることを特徴とする記録媒体。
【００６４】
（項目２２）　コンピュータを、ソースプログラムで用いられる複数の変数をプロセッサの命令列中で用いられるレジスタに割当てるレジスタ割当装置として動作させるプログラムを記録した記録媒体であって、前記プログラムは、前記複数の変数それぞれにおいて、当該変数と同時に使われる変数を取得する同時使用変数取得部と、前記複数の変数それぞれを、当該変数と同時に使われる変数とは異なる前記レジスタに割当てる、前記複数の変数間の割当順序を複数生成する割当順序生成部と、前記複数の変数のそれぞれを、複数の前記レジスタのうち何れのレジスタに優先して割当てるかを示す割当優先度を取得する割当優先度取得部と、複数の前記割当順序のうち前記割当優先度に基づき選択した一の前記割当順序に従い、前記複数の変数を前記レジスタに割当てるレジスタ割当部とを備えることを特徴とする記録媒体。
（項目２３）　コンピュータを、ソースプログラムで用いられる複数の変数をプロセッサの命令列中で用いられるレジスタに割当てるレジスタ割当装置として動作させるプログラムを記録した記録媒体であって、前記プログラムは、前記複数の変数それぞれにおいて、前記ソースプログラム内における当該変数の用いられ方に基づいて、当該変数を何れの種類の前記レジスタに割当てるべきかを示すレジスタ嗜好性情報及び当該変数と他の変数との間にある前記ソースプログラム上における関連性を示す情報である変数関連性情報のうち、少なくとも一方の情報を、前記複数の変数毎の前記複数のレジスタそれぞれへの割当優先度として生成する割当優先度生成部と、前記割当優先度に基づき、前記複数の変数を複数の前記レジスタに割当てるレジスタ割当部とを備えることを特徴とする記録媒体。
【００６５】
（項目２４）　ソースプログラムをプロセッサの命令列に変換するコンパイル方法であって、前記ソースプログラム内で用いられる複数の変数それぞれにおいて、当該変数と同時に使われる変数を取得するステップと、前記複数の変数それぞれを、当該変数と同時に使われる変数とは異なるレジスタに割当てる、前記複数の変数間の割当順序を複数生成するステップと、前記複数の変数のそれぞれを、複数の前記レジスタのうち何れのレジスタに優先して割当てるかを示す割当優先度を取得するステップと、複数の前記割当順序のうち前記割当優先度に基づき選択した一の前記割当順序に従い、前記複数の変数を前記レジスタに割当てるステップとを備えることを特徴とするコンパイル方法。
（項目２５）　ソースプログラムをプロセッサの命令列に変換するコンパイル方法であって、前記ソースプログラム内で用いられる複数の変数それぞれにおいて、前記ソースプログラム内における当該変数の用いられ方に基づいて、当該変数を何れの種類のレジスタに割当てるべきかを示すレジスタ嗜好性情報及び当該変数と他の変数との間にある前記ソースプログラム上における関連性を示す情報である変数関連性情報のうち、少なくとも一方の情報を、前記複数の変数毎の前記複数のレジスタそれぞれへの割当優先度として生成するステップと、前記割当優先度に基づき、前記複数の変数を複数の前記レジスタに割当てるステップとを備えることを特徴とするコンパイル方法。
【００６６】
（項目２６）　ソースプログラムで用いられる複数の変数を、プロセッサの命令列中で用いられるレジスタに割当てるレジスタ割当方法であって、前記複数の変数それぞれにおいて、当該変数と同時に使われる変数を取得するステップと、前記複数の変数それぞれを、当該変数と同時に使われる変数とは異なる前記レジスタに割当てる、前記複数の変数間の割当順序を複数生成するステップと、前記複数の変数のそれぞれを、複数の前記レジスタのうち何れのレジスタに優先して割当てるかを示す割当優先度を取得するステップと、複数の前記割当順序のうち前記割当優先度に基づき選択した一の前記割当順序に従い、前記複数の変数を前記レジスタに割当てるステップとを備えることを特徴とするレジスタ割当方法。
（項目２７）　ソースプログラム内で用いられる複数の変数を、プロセッサの命令列中で用いられるレジスタに変換するレジスタ割当方法であって、前記複数の変数それぞれにおいて、前記ソースプログラム内における当該変数の用いられ方に基づいて、当該変数を何れの種類の前記レジスタに割当てるべきかを示すレジスタ嗜好性情報及び当該変数と他の変数との間にある前記ソースプログラム上における関連性を示す情報である変数関連性情報のうち、少なくとも一方の情報を、前記複数の変数毎の前記複数のレジスタそれぞれへの割当優先度として生成するステップと、前記割当優先度に基づき、前記複数の変数を複数の前記レジスタに割当てるステップとを備えることを特徴とするレジスタ割当方法。
【００６７】
【発明の効果】
上記説明から明らかなように、本発明によれば複数の変数に適切なレジスタを割当てるコンパイラ及びコンパイル方法を実現することができる。
【図面の簡単な説明】
【図１】図１は、コンパイラ１０の機能ブロックの一例を示す図。
【図２】図２は、コンパイラ１０の動作フローを示す図。
【図３】図３は、Ｓ４０の動作フローを示す図。
【図４】図４は、Ｓ５０の動作フローを示す図。
【図５】図５は、Ｓ５５の動作フローを示す図。
【図６】図６は、Ｓ６０の動作フローを示す図。
【図７】図７は、コンパイラ１０がコンパイルするソースプログラムの一例を示す図。
【図８】図８は、割当順序生成部２３０が生成する割当順序の一例を示す図。
【図９】図９は、レジスタ割当部３１０が生成する割当優先度及びコンパイラ１０が生成する命令列の一例を示す図。
【図１０】図１０は、コンパイラ１０のハードウェア構成の一例を示す図。
【符号の説明】
１０　コンパイラ
１００　最適化処理部
２００　レジスタ割当装置
９００　実行コード生成部
２１０　生存区間解析部
２２０　同時使用変数取得部
２３０　割当順序生成部
２４０　レジスタ割当可能性判断部
２６０　同一レジスタ割当検出部
２７０　ループ解析部
２８０　実行履歴情報取得部
２９０　割当優先度生成部
３００　割当優先度取得部
３１０　レジスタ割当部
４００　干渉グラフ生成部
４１０　第１選択部
４２０　第２選択部
４３０　順序決定部
５００　格納部
５１０　割当選択部
５２０　割当実行部
５３０　割当反復部
６１０　第１命令
６２０　第２命令
６３０　第３命令
６４０　第４命令
６５０　第５命令
６６０　第６命令
６７０　第７命令
８１０　第１生存区間
８２０　第２生存区間
８３０　第３生存区間
８４０　第４生存区間
８５０　第５生存区間
８６０　第６生存区間
８７０　第７生存区間
８８０　第８生存区間
９１０　第１文
９２０　第２文
９３０　第３文
９４０　第４文
９５０　第５文
９６０　第６文
９７０　第７文
９８０　第８文
９９０　第９文
９９５　第１０文
【図１】
2004021336.tif 000003
【図２】
2004021336.tif 000004
【図３】
2004021336.tif 000005
【図４】
2004021336.tif 000006
【図５】
2004021336.tif 000007
【図６】
2004021336.tif 000008
【図７】
2004021336.tif 000009
【図８】
2004021336.tif 000010
【図９】
2004021336.tif 000011
【図１０】
2004021336.tif 000012