(57)【要約】【課題】例外を発生しうる命令の実行順序を変更することによりプログラムを最適化する。【解決手段】最適化対象プログラムにおける、命令の実行順序を変更する最適化装置は、例外を発生し得る第１命令を検出する例外発生命令検出部３１０と、第１命令より先に実行され、第１命令の例外を発生させないことを保証する第２命令を検出する保証命令検出部３１５と、第１命令を選択的に実行させる条件分岐命令より先、かつ第２命令より後に実行させるように、第１命令の実行順序を変更する実行順序制御部３３０とを備える。【選択図】　図１
2004062520.tif 000002
【特許請求の範囲】
【請求項１】
最適化対象プログラムにおける、命令の実行順序を変更する最適化装置であって、
例外を発生し得る第１命令を検出する例外発生命令検出部と、
前記第１命令より先に実行され、前記第１命令の例外を発生させないことを保証する第２命令を検出する保証命令検出部と、
前記第１命令を選択的に実行させる条件分岐命令より先、かつ前記第２命令より後に実行させるように、前記第１命令の実行順序を変更する実行順序制御部とを備えることを特徴とする最適化装置。
【請求項２】
前記条件分岐命令の分岐条件が、前記条件分岐命令によって選択的に実行される命令の例外を発生させないことを保証しうる場合に、前記条件分岐命令より後、かつ前記第１命令の前に実行される位置に、実質的な処理を行わない命令であるダミー命令を生成するダミー命令生成部を更に備え、
前記実行順序制御部は、前記第１命令を前記ダミー命令より先に配置させないように、実行順序の変更を制限することを特徴とする請求項１記載の最適化装置。
【請求項３】
前記例外発生命令検出部は、前記第１命令として、メモリアクセス命令を検出し、
前記例外は、前記メモリアクセス命令によりアクセスされるメモリ中のアドレスが無効である場合に発生し、
前記保証命令検出部は、前記第２命令として、前記メモリアクセス命令によりアクセスされるメモリのアドレスが有効なアドレスであるか否かを判断する命令を検出することを特徴とする請求項１記載の最適化装置。
【請求項４】
前記例外発生命令検出部は、前記第１命令として、変数に基づき指定されたメモリ内のアドレスを参照する命令を検出し、
前記保証命令検出部は、前記第２命令として、前記変数の値が無効である事を示すヌル値であるか否かを判断する命令を検出することを特徴とする請求項３記載の最適化装置。
【請求項５】
前記例外発生命令検出部は、前記第１命令として、メモリに格納された配列変数にアクセスする前記メモリアクセス命令を検出し、
前記保証命令検出部は、前記第２命令として、前記メモリアクセス命令によりアクセスされる配列変数の添字が、配列変数の大きさの範囲内であるか否かを判断する命令を検出することを特徴とする請求項３記載の最適化装置。
【請求項６】
前記最適化対象プログラムは、前記第１命令により例外が発生するか否かを検出する例外チェック命令を、前記第１命令の実行より先かつ前記条件分岐命令の実行より後に含み、
前記例外発生命令検出部は、前記例外チェック命令を検出し、
前記保証命令検出部は、前記第２命令として、前記例外チェック命令による例外が発生しないことを保証する命令を検出し、
前記第２命令が検出された場合に、前記例外チェック命令を除去する命令除去部を更に備え、
前記実行順序制御部は、前記例外チェック命令が除去されない場合における、前記第２命令、前記例外チェック命令、及び前記第１命令の実行順序を保ちつつ、前記第１命令を、前記条件分岐命令より先に実行させるように実行順序を変更することを特徴とする請求項１記載の最適化装置。
【請求項７】
前記実行順序制御部により命令の実行順序を変更した前記最適化対象プログラムに対して、処理の内容が他の命令と冗長である冗長命令の除去を行う冗長性除去部を更に備えることを特徴とする請求項１記載の最適化装置。
【請求項８】
前記実行順序制御部により命令の実行順序を変更した前記最適化対象プログラムに対して、更に部分冗長性除去を行う部分冗長性除去部を更に備えることを特徴とする請求項１記載の最適化装置。
【請求項９】
前記実行順序制御部により命令の実行順序を変更した前記最適化対象プログラムに対して、更にループ内において不変の値を読み出すメモリアクセス命令をループ外に移動する処理を行うループ内不変値最適化部を更に備えることを特徴とする請求項１記載の最適化装置。
【請求項１０】
命令の実行順序の変更により最適化対象プログラムを最適化する最適化装置であって、
命令の実行順序の変更を制限する場合に用いられ、実質的な処理を行わないダミー命令を生成するダミー命令生成部と、
前記ダミー命令を越えた命令の実行順序の変更を制限しつつ、命令の実行順序の変更による最適化を行う実行順序制御部と
を備えることを特徴とする最適化装置。
【請求項１１】
前記最適化対象プログラム中の条件分岐命令の分岐条件が、前記条件分岐命令によって選択的に実行される第１命令による例外が発生しないことを保証するか否かを判断する保証命令検出部を更に備え、
前記分岐条件が、前記第１命令による例外が発生しないことを保証すると判断された場合に、前記ダミー命令生成部は、前記条件分岐命令より後、かつ前記第１命令より先に実行される位置に、前記ダミー命令を生成することを特徴とする請求項１０記載の最適化装置。
【請求項１２】
コンピュータによって、最適化対象プログラムにおける命令の実行順序を変更させるコンパイラプログラムであって、
前記コンピュータを、
例外を発生し得る第１命令を検出する例外発生命令検出部と、
前記第１命令より先に実行され、前記第１命令の例外を発生させないことを保証する第２命令を検出する保証命令検出部と、
前記第１命令を選択的に実行させる条件分岐命令より先、かつ前記第２命令より後に実行させるように、前記第１命令の実行順序を変更する実行順序制御部として機能させることを特徴とするコンパイラプログラム。
【請求項１３】
前記例外発生命令検出部は、前記第１命令として、メモリアクセス命令を検出し、
前記例外は、前記メモリアクセス命令によりアクセスされるメモリ中のアドレスが無効である場合に発生し、
前記保証命令検出部は、前記第２命令として、前記メモリアクセス命令によりアクセスされるメモリのアドレスが有効なアドレスであるか否かを判断する命令を検出することを特徴とする請求項１２記載のコンパイラプログラム。
【請求項１４】
前記最適化対象プログラムは、前記第１命令により例外が発生するか否かを検出する例外チェック命令を前記第１命令の実行より先かつ前記条件分岐命令の実行より後に含み、
前記例外発生命令検出部は、前記例外チェック命令を検出し、
前記保証命令検出部は、前記第２命令として、前記例外チェック命令による例外が発生しないことを保証する命令を検出し、
前記第２命令が検出された場合に、前記例外チェック命令を除去する命令除去部を更に備え、
前記実行順序制御部は、前記例外チェック命令が除去されない場合における、前記第２命令、前記例外チェック命令、及び前記第１命令の実行順序を保ちつつ、前記第１命令を、前記条件分岐命令より先に実行させるように実行順序を変更することを特徴とする請求項１２記載のコンパイラプログラム。
【請求項１５】
前記実行順序制御部により命令の実行順序を変更された前記最適化対象プログラムに対して、処理の内容が他の命令と冗長である冗長命令の除去を行う冗長性除去部を更に備えることを特徴とする請求項１２記載のコンパイラプログラム。
【請求項１６】
コンピュータによって、命令の実行順序の変更により最適化対象プログラムを最適化させるコンパイラプログラムであって、
前記コンピュータを、
命令の実行順序の変更を制限する場合に用いられ、実質的な処理を行わないダミー命令を生成するダミー命令生成部と、
前記ダミー命令を越えた命令の実行順序の変更を制限しつつ、命令の実行順序の変更による最適化を行う実行順序制御部と
して機能させることを特徴とするコンパイラプログラム。
【請求項１７】
最適化対象プログラムにおける、命令の実行順序を変更する最適化方法であって、
例外を発生し得る第１命令を検出する段階と、
前記第１命令より先に実行され、前記第１命令の例外を発生させないことを保証する第２命令を検出する段階と、
前記第１命令を選択的に実行させる条件分岐命令より先、かつ前記第２命令より後に実行させるように、前記第１命令の実行順序を変更する段階と
を備えることを特徴とする最適化方法。
【請求項１８】
命令の実行順序の変更により最適化対象プログラムを最適化する最適化方法であって、
命令の実行順序の変更を制限する場合に用いられ、実質的な処理を行わないダミー命令を生成する段階と、
前記ダミー命令を越えた命令の実行順序の変更を制限しつつ、命令の実行順序の変更による最適化を行う段階と
を備えることを特徴とする最適化方法。
【請求項１９】
コンピュータによって、最適化対象プログラムにおける、命令の実行順序を変更させるコンパイラプログラムを記録した記録媒体であって、
前記コンパイラプログラムは、前記コンピュータを、
例外を発生し得る第１命令を検出する例外発生命令検出部と、
前記第１命令より先に実行され、前記第１命令の例外を発生させないことを保証する第２命令を検出する保証命令検出部と、
前記第１命令を選択的に実行させる条件分岐命令より先、かつ前記第２命令より後に実行させるように、前記第１命令の実行順序を変更する実行順序制御部として機能させることを特徴とする記録媒体。
【請求項２０】
コンピュータによって、命令の実行順序の変更により最適化対象プログラムを最適化させるコンパイラプログラムを記録した記録媒体であって、
前記コンパイラプログラムは、前記コンピュータを、
命令の実行順序の変更を制限する場合に用いられ、実質的な処理を行わないダミー命令を生成するダミー命令生成部と、
前記ダミー命令を越えた命令の実行順序の変更を制限しつつ、命令の実行順序の変更による最適化を行う実行順序制御部と
して機能させることを特徴とする記録媒体。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明は、最適化装置、コンパイラプログラム、最適化方法、及び記録媒体に関する。特に本発明は、命令の実行順序を変更する最適化装置、コンパイラプログラム、最適化方法、及び記録媒体に関する。
【０００２】
【従来の技術】
「Ｍｏｔｏｈｉｒｏ　Ｋａｗａｈｉｔｏ，Ｈｉｄｅａｋｉ　Ｋｏｍａｔｓｕ，Ｔｏｓｈｉｏ　Ｎａｋａｔａｎｉ著、ＴＲＬ　Ｒｅｓｅａｒｃｈ　ＲｅｐｏｒｔＲＴ０３５０　２０００掲載、Ｅｌｉｍｉｎａｔｉｎｇ　ＥｘｃｅｐｔｉｏｎＣｈｅｃｋｓ　ａｎｄ　Ｐａｒｔｉａｌ　Ｒｅｄｕｎｄａｎｃｉｅｓ　ｆｏｒＪａｖａ（登録商標）　Ｊｕｓｔ−ｉｎ−Ｔｉｍｅ　Ｃｏｍｐｉｌｅｒｓ」において、条件分岐命令等を越えて命令の実行順序を変更する投機的なコード移動の方法が提案されている。
【０００３】
【発明が解決しようとする課題】
しかしながら、上記方法においては、例外を発生しうる命令であるメモリアクセス命令を、投機的に実行させるように実行順序を変更することができなかった。したがって、メモリアクセス命令の実行順序の変更に伴い可能となる各種の最適化を行うことができなかった。
そこで本発明は、上記の課題を解決することのできる最適化装置、コンパイラプログラム、最適化方法、及び記録媒体を提供することを目的とする。この目的は特許請求の範囲における独立項に記載の特徴の組み合わせにより達成される。また従属項は本発明の更なる有利な具体例を規定する。
【０００４】
【課題を解決するための手段】
即ち、本発明の第１の形態によると、最適化対象プログラムにおける、命令の実行順序を変更する最適化装置であって、例外を発生し得る第１命令を検出する例外発生命令検出部と、第１命令より先に実行され、第１命令の例外を発生させないことを保証する第２命令を検出する保証命令検出部と、第１命令を選択的に実行させる条件分岐命令より先、かつ第２命令より後に実行させるように、第１命令の実行順序を変更する実行順序制御部とを備えることを特徴とする最適化装置、当該最適化装置を実現するコンパイラプログラム、コンパイラプログラムを記録した記録媒体、最適化方法を提供する。
【０００５】
また、本発明の第２の形態によると、命令の実行順序の変更により最適化対象プログラムを最適化する最適化装置であって、命令の実行順序の変更を制限する場合に用いられ、実質的な処理を行わないダミー命令を生成するダミー命令生成部と、ダミー命令を越えた命令の実行順序の変更を制限しつつ、命令の実行順序の変更による最適化を行う実行順序制御部とを備えることを特徴とする最適化装置、当該最適化装置を実現するコンパイラプログラム、コンパイラプログラムを記録した記録媒体、最適化方法を提供する。
なお上記の発明の概要は、本発明の必要な特徴の全てを列挙したものではなく、これらの特徴群のサブコンビネーションも又発明となりうる。
【０００６】
【発明の実施の形態】
以下、発明の実施の形態を通じて本発明を説明するが、以下の実施形態は特許請求の範囲にかかる発明を限定するものではなく、又実施形態の中で説明されている特徴の組み合わせの全てが発明の解決手段に必須であるとは限らない。
【０００７】
図１は、コンパイラ１０の機能ブロック図を示す。コンパイラ１０は、外部からソースプログラムを受け取り、当該ソースプログラムをコンピュータにより実行可能な実行コードに変換する。実行コードの変換において、コンパイラ１０は、コンピュータの資源を有効に活用する最適化を行い、実行コードの実行速度を高速化したり、実行コードのサイズを低減させることを目的とする。
【０００８】
コンパイラ１０は、フロントエンド処理装置２０と、最適化装置３０と、コード生成部９０とを備える。フロントエンド処理装置２０は、外部からソースプログラムを受け取ると、最適化処理に適した中間表現（例えば、Ｉｎｔｅｒｍｅｄｉａｔｅ　Ｒｅｐｒｅｓｅｎｔａｔｉｏｎ）等に変換し、最適化対象プログラムとして最適化装置３０に送る。最適化装置３０は、受け取った最適化対象プログラムに対して、各種の最適化を行い、最適化済プログラムとしてコード生成部９０に送る。コード生成部９０は、受け取った最適化済プログラムを、コンピュータ及びオペレーティングシステムにより実行可能な状態に変換し、外部に出力する。
【０００９】
本実施形態において、最適化対象プログラムとは、例えば、ソースプログラムに所定の変換を行った、Ｊａｖａ（登録商標）バイトコードや、ＲＴＬ（Ｒｅｇｉｓｔｅｒ　Ｔｒａｎｓｆｅｒ　Ｌａｎｇｕａｇｅの略）等の中間表現（例えば、Ｉｎｔｅｒｍｅｄｉａｔｅ　Ｒｅｐｒｅｓｅｎｔａｔｉｏｎ）である。また、他の例として、Ｊａｖａ（登録商標）やＣ言語等の表層言語で記述されたプログラムそのものであってもよい。なお、Ｊａｖａ（登録商標）は、サン・マイクロシステムズ・インコーポレーテッドの登録商標である。また、最適化対象プログラムとは、これらの表現により記述されたプログラムの全体であってもよいし、当該プログラムの一部であって、特定の処理のみを行うモジュールやオブジェクトであってもよい。
【００１０】
最適化装置３０は、命令除去部３００と、ダミー命令生成部３２０と、実行順序制御部３３０と、冗長性除去部３４０とを有する。命令除去部３００は、例外発生命令検出部３１０と、保証命令検出部３１５とを有する。例外発生命令検出部３１０は、フロントエンド処理装置２０から受け取った最適化対象プログラム中において、命令処理の障害等を示す例外を発生し得る第１命令と、第１命令の直前に実行され、第１命令による例外が発生するか否かを判断する例外チェック命令とを検出する。そして、保証命令検出部３１５は、第１命令及び例外チェック命令より先に実行され、第１命令の例外を発生させないことを保証する第２命令を検出する。第１命令による例外が発生しないことが第２命令により保証された場合に、例外チェック命令は不要であるので、命令除去部３００は、例外チェック命令を除去する。
【００１１】
本実施形態のように、最適化対象プログラムが、Ｊａｖａ（登録商標）言語のような型安全性を持つ言語により記述された場合においては、ソフトウェアにより型安全性のチェックが行われるので、例外チェック命令が明示的に記述される。従って、例外発生命令検出部３１０は、例外チェック命令等の動的な型チェックを行う命令を検出する。
一方、他の例として、最適化対象プログラムが、Ｃ言語のような型安全性を持たない言語により記述された場合においては、ハードウェアにより型安全性のチェックの一部が行われるので、例外チェック命令は明示的に記述されない。この場合、例外発生命令検出部３１０は、第１命令のみを検出してもよい。
【００１２】
また、命令除去部３００は、例外チェック命令の他に、他の冗長な命令の削除を行う。例えば、最適化対象プログラムが、例外チェック命令と、当該例外チェック命令より後に実行され、当該例外チェック命令と冗長な判定を行う条件分岐命令とを含む場合、命令除去部３００は、条件分岐命令を除去し、条件分岐命令の分岐先のうち、条件が成立しない場合に実行される部分を除去する。
そして、命令除去部３００は、上記の除去処理を終えた最適化対象プログラムを、ダミー命令生成部３２０に送る。
【００１３】
ダミー命令生成部３２０は、除去処理を終えた最適化対象プログラムを命令除去部３００から受け取る。そして、ダミー命令生成部３２０は、最適化対象プログラム中の条件分岐命令（例えば、ＩＦ文や、ＷＨＩＬＥ文）のうち、条件分岐命令によって選択的に実行される命令の例外を発生させないことを保証しうる分岐条件を含む命令を検出する。
例えば、第１命令の種類がメモリアクセス命令である場合に、ダミー命令生成部３２０は、条件分岐命令が、アクセスするメモリのアドレスを示す変数が有効なアドレス値を保持するか否かの条件により分岐する命令であるか否かを判断する。
そして、ダミー命令生成部３２０は、条件分岐命令から例外を発生しうる命令に至る制御フロー上における、条件分岐命令の直後に実行される位置に、実質的な処理を行わない命令であるダミー命令を生成する。そして、ダミー命令生成部３２０は、ダミー命令を挿入した最適化対象プログラムを実行順序制御部３３０に送る。
なお、ダミー命令を生成する他の例として、ダミー命令生成部３２０は、分岐先に例外を発生しうる命令を含む条件分岐命令のみに対して、条件分岐命令から例外を発生しうる命令に至る制御フロー上における、条件分岐命令の直後に実行される位置に、ダミー命令を生成してもよい。
【００１４】
実行順序制御部３３０は、ダミー命令生成部３２０から最適化対象プログラムを受け取ると、第１命令をダミー命令より先に配置させないように、実行順序の変更を制限しつつ、実行コードにおける命令の位置を変える等により、命令の実行順序を変更する。例えば、実行順序制御部３３０は、第２命令より後に実行され、かつ第１命令を選択的に実行させる条件分岐命令のうち、ダミー命令を伴わない条件分岐命令より先に実行されるように第１命令の実行順序を変更してもよい。そして、実行順序制御部３３０は、命令の実行順序を変更した最適化対象プログラムを冗長性除去部３４０に送る。
なお、ダミー命令は、命令の実行の依存関係を保たせるためにのみ用いられ、実際には実行コードとして生成されなくてもよい。すなわち、実行順序制御部３３０は、ダミー命令が存在するものと仮定して、第１命令の実行順序を変更するが、コード生成部９０は、ダミー命令に対して何らの実行コードを生成しなくてもよいし、実質的な処理を行わない命令（例えば、ＮＯＰ命令）を生成してもよい。
【００１５】
冗長性除去部３４０は、部分冗長性除去部３５０と、ループ内不変値最適化部３６０とを備え、実行順序制御部３３０から受け取った最適化対象プログラムに対して、処理の内容が他の命令と冗長である冗長命令の除去を行い、最適化済プログラムとしてコード生成部９０に送る。
例えば、部分冗長性除去部３５０は、制御の流れの合流点において、複数の合流元の一部のみにおいて実行される命令と、合流先において実行される命令の内容が同一である場合に、合流先における命令を除去し、複数の合流元全てにおいて当該命令を実行させることにより、部分冗長性を除去する。
また、ループ内不変値最適化部３６０は、最適化対象プログラムを解析することにより、ループ内において不変の値を読み出すメモリアクセス命令をループ外に移動する処理を行う。
【００１６】
このように、最適化装置３０は、第２命令により例外が発生しないことが保証された第１命令に対して、第１命令の例外の発生を検出する例外チェック命令を除去する。更に、最適化装置３０は、最適化対象プログラム中の、第１命令により例外が発生しないことを保証する条件分岐命令から第１命令に至る制御フロー上における、条件分岐命令の直後に実行される位置にダミー命令を生成する。そして、最適化装置３０は、ダミー命令と第１命令との実行の依存関係を保ちつつ、第１命令の実行順序を変更する。したがって、最適化装置３０は、最適化対象プログラムの意味及び動作を忠実に反映しつつ、例外を発生しうる第１命令の実行順序を変更することができるので、最適化対象プログラムの実行を高速化することができる。
【００１７】
図２は、コンパイラ１０の動作フローを示す。フロントエンド処理装置２０は、フロントエンド処理として、外部から受け取ったソースプログラムを最適化処理に適した中間表現等に変換する（Ｓ１００）。そして、最適化装置３０は、命令除去部３００による例外チェック命令の除去より先に、最適化対象プログラムに事前に各種の最適化を施してもよい（Ｓ１１０）。例えば、最適化装置３０は、メソッドや関数のインライニングや、共通部分式削除等の最適化を施してもよい。そして、命令除去部３００は、最適化対象プログラムから冗長な例外チェック命令を除去する（Ｓ１２０）。命令除去部３００は、例外チェック命令の他に、他の冗長な命令を削除してもよい。例えば、最適化対象プログラムが、例外チェック命令と、当該例外チェック命令より後に実行され、当該例外チェック命令と冗長な条件に基づく条件分岐命令とを含む場合、命令除去部３００は、条件分岐命令を除去する。
【００１８】
コンパイラ１０は、最適化対象プログラムに対して以下の処理を繰り返し行う。ダミー命令生成部３２０は、最適化対象プログラム中の、条件分岐命令を検出する（Ｓ１３０）。そして、ダミー命令生成部３２０は、条件分岐命令が、第１命令による例外が発生しないことを保証しうると判断した場合に（Ｓ１４０：ＹＥＳ）、条件分岐命令から第１命令に至る制御フロー上における、条件分岐命令の直後に実行される位置にダミー命令を生成する（Ｓ１５０）。例えば、第１命令がメモリアクセス命令である場合に、ダミー命令生成部３２０は、アクセスするメモリのアドレスを示す変数の値が有効か否かを分岐条件とする条件分岐命令を検出する。最適化装置３０は、ダミー命令を生成する候補となる条件分岐命令が他に存在すると判断した場合に（Ｓ１６０：ＹＥＳ）、Ｓ１３０に戻り処理を継続する。
【００１９】
続いて、実行順序制御部３３０は、第１命令をダミー命令より先に配置させないように、実行順序の変更を制限しつつ、命令の実行順序を変更する最適化を行う（Ｓ１６５）。そして、冗長性除去部３４０は、命令の実行順序を変更した最適化対象プログラムに対して、冗長性の除去を行う（Ｓ１６０）。そして、コード生成部９０は、最適化済プログラムに基づき、実行コードを生成する。この際、コード生成部９０は、ダミー命令に対しては、何らの実行コードを生成しない。
【００２０】
このように、最適化装置３０は、第１命令をダミー命令より先に配置させないように、実行順序の変更を制限することにより、最適化対象プログラムの本来の動作や意味を保ちつつ、命令の実行順序を変更することができる。例えば、最適化対象プログラムが、Ｊａｖａ（登録商標）等により記述された型安全性の保障されているプログラムであれば、最適化装置３０は、この型安全性を保ちつつ、最適化対象プログラムを高速化する等の最適化を行うことができる。
【００２１】
図３は、メモリアクセス命令の投機的な移動の一例を示す。図３の（Ａ）及び（Ｂ）は、それぞれ最適化装置３０が入力とする最適化対象プログラムを示す。本実施形態において、最適化装置３０は、最適化に適した形態である中間表現を、最適化対象プログラムとして入力とするが、図３〜５、及び図７〜９においては、簡潔に説明するために、最適化対象プログラムの処理の意味を示す擬似言語により表現した図を用いる。
【００２２】
図３（Ａ）は、第１命令であるメモリアクセス命令の実行順序が変更できない例を示す。本図は、変数ａ及び変数ｂの値が異なる場合にのみ（２行目）、変数ａが示すアドレスに所定値を加えたアドレスのメモリを、変数ｔに読み出す旨（３行目）のプログラムである。
【００２３】
コンパイラ１０が生成する実行コードを実行するコンピュータにおいて、メモリから値を読み出す処理は、読み出した値を用いて演算する処理等に比べ、多くの時間を要する。したがって、最適化装置３０は、３行目に示すようなメモリアクセス命令をできるだけ先に実行させるように実行順序を変更すれば、最適化対象プログラム全体を高速化することができる。
【００２４】
しかし、最適化装置３０は、３行目に示すメモリアクセス命令を、２行目に示す条件分岐命令を越えて１行目に移動してしまうと、プログラムを正しく実行させることができない。なぜなら、変数ａと変数ｂが等しく、かつ変数ａが無効な値である場合に、最適化装置３０は、変数ａの値が無効である旨を示す例外を発生する。元のプログラムにおいては、変数ａと変数ｂが等しい場合には、３行目のメモリアクセス命令が実行されないので、この様な例外は発生しないはずである。したがって、最適化装置３０は、このようなメモリアクセス命令の移動を行うと、元のプログラムの動作を最適化済プログラムに忠実に反映させることができない。
【００２５】
図３（Ｂ）は、第１命令としてのメモリアクセス命令の実行順序が変更できる例を示す。最適化装置３０は、本図に示すように、変数ａが有効な値か否かを検出するｎｕｌｌｃｈｅｃｋ命令（以降の本図の説明で（１）と略す）と、変数ａが示すアドレスに所定値を加えたアドレスのメモリの内容を変数ｕに読み出す命令（以降の本図の説明で（２）と略す）と、変数ａ及び変数ｂの値が異なるか否かを判断する命令（以降の本図の説明で（３）と略す）と、変数ａへのｎｕｌｌｃｈｅｃｋ命令（以降の本図の説明で（４）と略す）と、変数ａが示すアドレスに所定値を加えたアドレスのメモリを、変数ｔに読み出す命令（以降の本図の説明で（５）と略す）とを含む最適化対象プログラムを入力とする。
【００２６】
例外発生命令検出部３１０は、第１命令として（５）を検出する。そして、保証命令検出部３１５は、（５）により例外が発生しないことを保証する第２命令として、（１）を検出する。したがって、命令除去部３００は、例外が発生しないと保証された（５）に対応する（４）を、冗長命令であるとして除去することができる。
【００２７】
したがって、最適化装置３０は、（１）、（４）、及び（５）の実行順序を保ちつつ、（５）を、（３）より先、かつ（１）より後に投機的に実行させるように命令の実行順序を変更することができる。例えば、（５）を、（２）と（３）の間に実行させるように実行順序を変更することができる。
【００２８】
このように、例外が発生しないことを保証する第２命令（例えば（１））を検出した場合に、最適化装置３０は、メモリアクセス命令等の例外を発生しうる第１命令（例えば（５））を、第１命令を選択的に実行する条件分岐命令（例えば（３））より先に投機的に実行させるように、第１命令の実行順序を変更することができる。
【００２９】
図４は、ダミー命令が命令の実行順序の変更を制限する一例を示す。最適化装置３０は、図４（Ａ）に示すように、最適化対象プログラムとして、変数ａの値が無効なアドレス値であるヌル値か否かの条件に基づく分岐命令（以降の本図の説明で（１）と略す）と、変数ａに対するｎｕｌｌｃｈｅｃｋ命令（以降の本図の説明で（２）と略す）と、変数ａが示すアドレスに所定値を加えたアドレスのメモリの内容を変数ｔに読み出すメモリアクセス命令（以降の本図の説明で（３）と略す）とを入力とする。
【００３０】
例外発生命令検出部３１０は、（２）を検出し、保証命令検出部３１５は、（２）による例外が発生しないことを保証する第２命令として、（１）を検出する。この結果、命令除去部３００は、（２）を除去する。
【００３１】
そして、ダミー命令生成部３２０は、（１）の条件分岐命令の分岐条件が第１命令の例外を発生させないことを保証すると判断し、ダミー命令であるｄｕｍｍｙ＿ｎｕｌｌｃｈｅｃｋ命令を、（３）より先、かつ（１）の後に実行される位置に生成する（図４（Ｂ））。
【００３２】
以上で示したように、最適化装置３０は、例外チェック命令を除去する。また、最適化装置３０は、条件分岐命令から第１命令に至る制御フロー上における、条件分岐命令の直後に実行される位置にダミー命令を生成する。従って、最適化装置３０は、（３）等のメモリアクセス命令をダミー命令より先に配置させないように、実行順序の変更を制限できるので、命令の実行順序を適切に変更する最適化を行うことができる。
【００３３】
なお、本図において、保証命令検出部３１５は、条件分岐命令として、変数ａの値が無効なアドレス値であるヌル値か否かの条件に基づく分岐命令を検出する。例えば、保証命令検出部３１５は、最適化対象プログラムがＪａｖａ（登録商標）のバイトコードである場合には、条件分岐命令としてｉｆｎｕｌｌ命令や、ｉｆｎｏｎｎｕｌｌ命令や、ｉｓｉｎｓｔａｎｃｅｏｆ命令を検出する。
【００３４】
図５は、ダミー命令が命令の実行順序の変更を制限する他の例を示す。最適化装置３０は、図５（Ａ）に示すように、最適化対象プログラムとして、配列変数ａに対するｎｕｌｌｃｈｅｃｋ命令（以降の本図の説明で（１）と略す）と、配列変数ａに対する添字０が、配列変数の大きさの範囲内であるか否かに応じて例外を発生させるｂｏｕｎｄｃｈｅｃｋ命令（以降の本図の説明で（２）と略す）と、配列変数ａの０番目の要素に０を代入する命令（以降の本図の説明で（３）と略す）と、変数ｉが配列変数ａの大きさの範囲内であるか否かの判断に基づく条件分岐命令（以降の本図の説明で（４）と略す）と、配列変数ａに対するｎｕｌｌｃｈｅｃｋ命令（以降の本図の説明で（５）と略す）と、配列変数ａ及び添字ｉに対するｂｏｕｎｄｃｈｅｃｋ命令（以降の本図の説明で（６）と略す）と、配列変数ａの添字ｉが示すメモリ中のアドレスから値を変数ｔに読み出す命令（以降の本図の説明で（７）と略す）とを入力とする。
【００３５】
例外発生命令検出部３１０は、第１命令である（７）と、（７）に対応付けられた例外チェック命令である（５）及び（６）を検出する。そして、保証命令検出部３１５は、（５）による例外が発生しないことを保証する命令として（１）を検出し、（６）による例外が発生しないことを保証する命令として（４）を検出する。従って、命令除去部３００は、（５）及び（６）の双方を削除する。
なお、本図の例において、保証命令検出部３１５は、（６）による例外が発生しないことを保証する命令として（４）を検出するが、他の例として、（６）による例外が発生する条件より限定された条件が成立した場合にのみ、（６）を実行させる条件分岐命令を検出してもよい。例えば、保証命令検出部３１５は、（６）による例外が発生する条件より限定された条件として、変数ｉの値が０以上かつ配列変数の長さの半分以下（例えば、ｉｆ（０＜＝＆＆ｉ＜ａ．ａｒｒａｙｌｅｎｇｔｈ／２））である場合にのみ（６）を実行する命令を第２命令として検出してもよい。
【００３６】
続いて、図５（Ａ）において、条件分岐命令である（４）が、（７）の例外が発生しないことが保証するので、ダミー命令生成部３２０は、ダミー命令であるｄｕｍｍｙ＿ｂｏｕｎｄｃｈｅｃｋ命令を、（４）から（７）に至る制御フロー上の、（４）の直後に実行される部分に生成する（図５（Ｂ））。この結果、実行順序制御部３３０は、（７）を（４）より先に配置させないように、実行順序の変更を制限しつつ、命令の実行順序を変更する最適化を行うことができる。
【００３７】
以上で示したように、最適化装置３０は、例外チェック命令の除去を行うと伴に、例外が発生しないことを保証する条件分岐命令を検出した場合に、条件分岐命令の直後に実行される位置にダミー命令を生成する。従って、最適化装置３０は、ダミー命令を用いて、実行の依存関係を適切に保ちつつ、命令の実行順序を変更する最適化を行うことができる。
【００３８】
図６は、ダミー命令が実行順序の変更を制限する概念図を示す。本図において、図４に示したｄｕｍｍｙ＿ｎｕｌｌｃｈｅｃｋ命令が命令の実行順序の変更を制限する。基本ブロック５００は、図４で示した（１）に相当し、変数ａがヌル値であるかの判断に基づき条件分岐する命令である。基本ブロック５００へ入力する矢印と、基本ブロック５００から出力する矢印は、図４で示した最適化対象プログラムの制御フローを示す。
【００３９】
図６（Ａ）に示すように、最適化を行う前の最適化対象プログラムにおいて、変数ａがヌル値でない場合に、図４（Ａ）に示すｎｕｌｌｃｈｅｃｋ　ａの処理を行う。そして、最適化装置３０による最適化において、命令除去部３００は、図４（Ａ）におけるｎｕｌｌｃｈｅｃｋ　ａを除去し、ダミー命令生成部３２０が、ｄｕｍｍｙ＿ｎｕｌｌｃｈｅｃｋ　ａを生成することにより、図６（Ｂ）に示す制御フローを生成する。すなわち、ダミー命令生成部３２０は、ｄｕｍｍｙ＿ｎｕｌｌｃｈｅｃｋ　ａ命令を、図６（Ｂ）で示すように、次に実行される命令である「ｔ＝ａ．ｆ１」への制御フローのエッジの途中に生成する。
【００４０】
このように、最適化装置３０は、ダミー命令を、条件分岐から出力する制御フローのエッジの途中に生成することにより、「ｔ＝ａ．ｆ１」等の命令を、この条件分岐命令より先に実行させないように、実行順序の変更を制限することができる。したがって、最適化装置３０は、最適化対象プログラムが正しく実行されることを保証しつつ、メモリアクセス命令等の実行順序を変更し、高速な実行を実現することができる。
【００４１】
図７は、ダミー命令が実行順序の変更を制限する制御フローの一例を示す。本図において、最適化対象プログラムの制御の流れは、矩形領域で示した基本ブロックと、矩形領域を結ぶ実線の矢印で示した制御フローとで模式的に表されている。
具体的には、最適化対象プログラムは、最初に実行される基本ブロック６００と、基本ブロック６００に続いて実行され変数ａがヌル値でない場合に基本ブロック６２０に分岐する基本ブロック６１０と、基本ブロック６１０による条件が成立した場合に実行される基本ブロック６２０と、基本ブロック６２０に続いて実行され条件分岐命令を含む基本ブロック６３０と、基本ブロック６３０による条件が成立した場合に実行される基本ブロック６４０と、基本ブロック６４０に続いて実行され条件分岐命令を含む基本ブロック６５０と、基本ブロック６５０に続いて実行され条件分岐命令を含む基本ブロック６６０とを有する。また、基本ブロック６５０及び基本ブロック６６０の条件分岐命令は、それぞれ基本ブロック６３０及び基本ブロック６１０に戻る処理を行うことによりループを形成している。
【００４２】
基本ブロック６４０は、変数ａに対するｎｕｌｌｃｈｅｃｋ命令と、変数ａをアドレス値とするメモリアクセス命令「Ｆ＝ａ．ｆ」と、変数Ｆの値を変数ｔに累積する命令「ｔ＋＝Ｆ」とを有する。最適化装置３０は、メモリアクセス命令「Ｆ＝ａ．ｆ」により例外が発生しないことを保証する命令を基本ブロック６１０内に検出し、変数ａに対するｎｕｌｌｃｈｅｃｋ命令を除去する。
ここで、最適化装置３０は、メモリアクセス命令「Ｆ＝ａ．ｆ」を、基本ブロック６００に移動してしまうと、プログラムを正しく実行させることができない。なぜなら、変数ａがヌル値である場合に、最適化対象プログラムは、アクセスされるメモリのアドレスが無効である旨の例外を発生させる可能性がある。一方、元の最適化対象プログラムでは、変数ａがヌル値である場合には、基本ブロック６４０のメモリアクセス命令「Ｆ＝ａ．ｆ」が実行されないので、この様な例外は発生しない。従って、最適化装置３０は、このようなメモリアクセス命令の移動を行うと、最適化対象プログラムの動作を最適化済プログラムに忠実に反映させることができない。例えば、最適化対象プログラムにおいて保障されている型安全性が保証されなくなる。
【００４３】
そこで、図７（Ｂ）に示したように、ダミー命令生成部３２０は、選択的に実行される命令の例外を発生させないことを保証しうる基本ブロック６１０の条件分岐命令より後、かつメモリアクセス命令「Ｆ＝ａ．ｆ」の前に実行される位置に、ｄｕｍｍｙ＿ｎｕｌｌｃｈｅｃｋを含む基本ブロック６１５を生成する。そして、実行順序制御部３３０は、メモリアクセス命令「Ｆ＝ａ．ｆ」の移動を基本ブロック６１５より前に移動させないように、実行順序の変更を制限する。
一方、実行順序制御部３３０は、基本ブロック６１５より後、かつ条件分岐命令を含む基本ブロック６３０より先に、メモリアクセス命令「Ｆ＝ａ．ｆ」を実行させるような実行順序の変更を行うことができる。例えば、実行順序制御部３３０は、メモリアクセス命令「Ｆ＝ａ．ｆ」を、基本ブロック６２０に移動しても、最適化対象プログラムの意味及び動作を最適化済プログラムに正しく反映させることができ、型安全性を保障することができる。
【００４４】
図８は、最適化対象プログラムの一例を示す。本プログラムは、４行目から１６行目までの処理を１６行目の判断結果に応じて繰り返す。また、この繰り返し（ループ）のそれぞれにおいて、７行目の判断結果に応じて、８行目の処理又は１０〜１４行目の処理を行う。
【００４５】
図８の１６行目において「ｔｈｉｓ．ｍａｘＰｏｓｉｔｉｏｎ」は、ｔｈｉｓオブジェクトの先頭のアドレスに、ｍａｘＰｏｓｉｔｉｏｎのフィールド名により定まる所定値を加えたアドレスのメモリ中の値を示している。また、本図の６行目、７行目、及び１０行目において「ｔｈｉｓ．ｓｔｒ」は、ｔｈｉｓオブジェクトの先頭のアドレスに、ｓｔｒのフィールド名により定まる所定値を加えたアドレスのメモリ中の値を示している。
「ｔｈｉｓ．ｍａｘＰｏｓｉｔｉｏｎ」又は「ｔｈｉｓ．ｓｔｒ」によりアクセスされるメモリ中のアドレスが無効である場合に、最適化対象プログラムは例外を発生する。本図において、「ｔｈｉｓ．ｍａｘＰｏｓｉｔｉｏｎ」及び「ｔｈｉｓ．ｓｔｒ」によるメモリアクセスと、アクセスされるアドレスが有効か否かを判断する例外チェックとは、４〜１６行目の繰り返し毎に実行されるので効率が悪い。
【００４６】
図９は、最適化対象プログラムに、実行順序の投機的でない変更を行った結果を示す。図８の１６行目で示した「ｔｈｉｓ．ｍａｘＰｏｓｉｔｉｏｎ」は、本図の１８行目において、「Ｔ＿ｍａｘＰｏｓｉｔｉｏｎ」の変数に置き換えられ、「Ｔ＿ｍａｘＰｏｓｉｔｉｏｎ」の変数には、３行目において、「ｔｈｉｓ．ｍａｘＰｏｓｉｔｉｏｎ」の値が代入されている。また、図７の６行目、７行目、及び１０行目で示した「ｔｈｉｓ．ｓｔｒ」は、それぞれ本図の６行目、９行目、及び１２行目において、「Ｔ＿ｓｔｒ」の変数に置き換えられ、「Ｔ＿ｓｔｒ」の変数には、５行目において、「ｔｈｉｓ．ｓｔｒ」の値が代入されている。
したがって、コンパイラ１０は、「ｔｈｉｓ．ｍａｘＰｏｓｉｔｉｏｎ」及び「ｔｈｉｓ．ｓｔｒ」によるメモリアクセスを、７行目から１８行目までのループの外部において行わせることができるので、最適化対象プログラムを高速化することができる。
【００４７】
しかしながら、本図においては、コンパイラ１０は、９行目に示す「Ｔ＿ｓｔｒ．ｃｏｕｎｔ」、１２行目に示す「Ｔ＿ｓｔｒ．ｖａｌｕｅ」、「Ｔ＿ｓｔｒ．ｏｆｆｓｅｔ」、１３行目に示す「ｔｈｉｓ．ｍａｘＤｅｌｉｍＣｈａｒ」、及び１４行目に示す「ｔｈｉｓ．ｄｅｌｉｍｉｔｅｒｓ」のそれぞれによるメモリアクセスを、９行目に示した条件分岐を越えて先に実行させるような実行順序の変更することができない。
したがって、これらのメモリアクセスによりメモリから読み出される値がループ内で不変な値であるにも関わらず、最適化対象プログラムは、ループによる繰り返し毎にメモリをアクセスしなければならないので、依然として効率が悪い部分を含む。
【００４８】
図１０は、最適化対象プログラムに、本実施形態で示す実行順序の投機的な変更を行った結果を示す。命令除去部３００は、図９で示した効率的でないメモリアクセスに対する例外チェック命令を除去し、実行順序制御部３３０は、これらのメモリアクセスを１４行目の条件分岐命令より先に実行させるように実行順序を変更する。
すなわち、実行順序制御部３３０及びループ内不変値最適化部３６０は、図９で示したメモリアクセスを、本図の７〜１１行目に移動することにより、ループ内でのメモリアクセスを低減し、最適化対象プログラムを高速化することができる。
【００４９】
図１１は、コンパイラ１０のハードウェア構成の一例を示す。本実施形態に係るコンパイラ１０は、ホストコントローラ１０８２により相互に接続されるＣＰＵ１０００、ＲＡＭ１０２０、グラフィックコントローラ１０７５、及び表示装置１０８０を有するＣＰＵ周辺部と、入出力コントローラ１０８４によりホストコントローラ１０８２に接続される通信インターフェイス１０３０、ハードディスクドライブ１０４０、及びＣＤ−ＲＯＭドライブ１０６０を有する入出力部と、入出力コントローラ１０８４に接続されるＲＯＭ１０１０、フレキシブルディスクドライブ１０５０、及び入出力チップ１０７０を有するレガシー入出力部とを備える。
【００５０】
ホストコントローラ１０８２は、ＲＡＭ１０２０と、高い転送レートでＲＡＭ１０２０をアクセスするＣＰＵ１０００及びグラフィックコントローラ１０７５とを接続する。ＣＰＵ１０００は、ＲＯＭ１０１０及びＲＡＭ１０２０に格納されたコンパイラプログラムに基づいて動作し、各部の制御を行う。グラフィックコントローラ１０７５は、ＣＰＵ１０００等がＲＡＭ１０２０内に設けたフレームバッファ上に生成する画像データを取得し、表示装置１０８０上に表示させる。これに代えて、グラフィックコントローラ１０７５は、ＣＰＵ１０００等が生成する画像データを格納するフレームバッファを、内部に含んでもよい。
【００５１】
入出力コントローラ１０８４は、ホストコントローラ１０８２と、比較的高速な入出力装置である通信インターフェイス１０３０、ハードディスクドライブ１０４０、及びＣＤ−ＲＯＭドライブ１０６０を接続する。通信インターフェイス１０３０は、ネットワークを介して他の装置と通信する。ハードディスクドライブ１０４０は、コンパイラ１０が使用するコンパイラプログラム及びデータを格納する。ＣＤ−ＲＯＭドライブ１０６０は、ＣＤ−ＲＯＭ１０９５からコンパイラプログラム又はデータを読み取り、ＲＡＭ１０２０を介して入出力チップ１０７０に提供する。
【００５２】
また、入出力コントローラ１０８４には、ＲＯＭ１０１０と、フレキシブルディスクドライブ１０５０や入出力チップ１０７０等の比較的低速な入出力装置とが接続される。ＲＯＭ１０１０は、コンパイラ１０の起動時にＣＰＵ１０００が実行するブートプログラムや、パーソナルコンピュータ本体１１０のハードウェアに依存するプログラム等を格納する。フレキシブルディスクドライブ１０５０は、フレキシブルディスク１０９０からコンパイラプログラム又はデータを読み取り、ＲＡＭ１０２０を介して入出力チップ１０７０に提供する。入出力チップ１０７０は、フレキシブルディスク１０９０や、例えばパラレルポート、シリアルポート、キーボードポート、マウスポート等を介して各種の入出力装置を接続する。
【００５３】
コンパイラ１０を実現するコンパイラプログラムは、命令除去モジュールと、例外発生命令検出モジュールと、保証命令検出モジュールと、ダミー命令生成モジュールと、実行順序制御モジュールと、冗長性除去モジュールと、部分冗長性除去モジュールと、ループ内不変値最適化モジュールとを備える。これらのモジュールは、コンパイラ１０を、命令除去部３００、例外発生命令検出部３１０、保証命令検出部３１５、ダミー命令生成部３２０、実行順序制御部３３０、冗長性除去部３４０、部分冗長性除去部３５０、及びループ内不変値最適化部３６０として動作させるプログラムである。
【００５４】
コンパイラ１０に提供されるコンパイラプログラムは、フレキシブルディスク１０９０、ＣＤ−ＲＯＭ１０９５、又はＩＣカード等の記録媒体に格納されて利用者によって提供される。このコンパイラプログラムは、記録媒体から読み出され、入出力チップ１０７０を介して記憶システム２００及びバックアップ装置３００にインストールされ、記憶システム２００及びバックアップ装置３００において実行される。これに代えて、記憶システム２００及びバックアップ装置３００のそれぞれは、更にフレキシブルディスクドライブ、ＣＤ−ＲＯＭドライブ、又はＩＣカードリーダ等を備え、当該コンパイラプログラムを記録媒体から直接読み出して実行してもよい。
【００５５】
以上に示したプログラム又はモジュールは、外部の記憶媒体に格納されてもよい。記憶媒体としては、フレキシブルディスク１０９０、ＣＤ−ＲＯＭ１０９５の他に、ＤＶＤやＰＤ等の光学記録媒体、ＭＤ等の光磁気記録媒体、テープ媒体、ＩＣカード等の半導体メモリ等を用いることができる。また、専用通信ネットワークやインターネットに接続されたサーバシステムに設けたハードディスク又はＲＡＭ等の記憶装置を記録媒体として使用し、ネットワークを介してコンパイラプログラムをコンパイラ１０に提供してもよい。
【００５６】
以上の説明から明らかなように、コンパイラ１０は、例外を発生しうるメモリアクセス命令等を、当該メモリアクセス命令を選択的に実行させる条件分岐命令より先に実行させるように命令の実行順序を変更することができる。したがって、コンパイラ１０は、処理に多くの時間を要するメモリアクセス等の実行開始を早めることができ、結果として、最適化対象プログラムを高速化することができる。更に、コンパイラ１０は、これらの最適化に伴い可能となる多様な最適化を行うことにより、最適化対象プログラムを更に高速化することができる。
【００５７】
以上に説明した実施形態によれば、以下の各項目に示す最適化装置、コンパイラプログラム、最適化方法、及び記録媒体が実現される。
【００５８】
（項目１）　最適化対象プログラムにおける、命令の実行順序を変更する最適化装置であって、例外を発生し得る第１命令を検出する例外発生命令検出部と、前記第１命令より先に実行され、前記第１命令の例外を発生させないことを保証する第２命令を検出する保証命令検出部と、前記第１命令を選択的に実行させる条件分岐命令より先、かつ前記第２命令より後に実行させるように、前記第１命令の実行順序を変更する実行順序制御部とを備えることを特徴とする最適化装置。
（項目２）　前記条件分岐命令の分岐条件が、前記条件分岐命令によって選択的に実行される命令の例外を発生させないことを保証しうる場合に、前記条件分岐命令より後、かつ前記第１命令の前に実行される位置に、実質的な処理を行わない命令であるダミー命令を生成するダミー命令生成部を更に備え、前記実行順序制御部は、前記第１命令を前記ダミー命令より先に配置させないように、実行順序の変更を制限することを特徴とする項目１記載の最適化装置。
【００５９】
（項目３）　前記例外発生命令検出部は、前記第１命令として、メモリアクセス命令を検出し、前記例外は、前記メモリアクセス命令によりアクセスされるメモリ中のアドレスが無効である場合に発生し、前記保証命令検出部は、前記第２命令として、前記メモリアクセス命令によりアクセスされるメモリのアドレスが有効なアドレスであるか否かを判断する命令を検出することを特徴とする項目１記載の最適化装置。
（項目４）　前記例外発生命令検出部は、前記第１命令として、変数に基づき指定されたメモリ内のアドレスを参照する命令を検出し、前記保証命令検出部は、前記第２命令として、前記変数の値が無効である事を示すヌル値であるか否かを判断する命令を検出することを特徴とする項目３記載の最適化装置。
（項目５）　前記例外発生命令検出部は、前記第１命令として、メモリに格納された配列変数にアクセスする前記メモリアクセス命令を検出し、前記保証命令検出部は、前記第２命令として、前記メモリアクセス命令によりアクセスされる配列変数の添字が、配列変数の大きさの範囲内であるか否かを判断する命令を検出することを特徴とする項目３記載の最適化装置。
【００６０】
（項目６）　前記最適化対象プログラムは、前記第１命令により例外が発生するか否かを検出する例外チェック命令を、前記第１命令の実行より先かつ前記条件分岐命令の実行より後に含み、前記例外発生命令検出部は、前記例外チェック命令を検出し、前記保証命令検出部は、前記第２命令として、前記例外チェック命令による例外が発生しないことを保証する命令を検出し、前記第２命令が検出された場合に、前記例外チェック命令を除去する命令除去部を更に備え、前記実行順序制御部は、前記例外チェック命令が除去されない場合における、前記第２命令、前記例外チェック命令、及び前記第１命令の実行順序を保ちつつ、前記第１命令を、前記条件分岐命令より先に実行させるように実行順序を変更することを特徴とする項目１記載の最適化装置。
（項目７）　前記実行順序制御部により命令の実行順序を変更した前記最適化対象プログラムに対して、処理の内容が他の命令と冗長である冗長命令の除去を行う冗長性除去部を更に備えることを特徴とする項目１記載の最適化装置。
【００６１】
（項目８）　前記実行順序制御部により命令の実行順序を変更した前記最適化対象プログラムに対して、更に部分冗長性除去を行う部分冗長性除去部を更に備えることを特徴とする項目１記載の最適化装置。
（項目９）　前記実行順序制御部により命令の実行順序を変更した前記最適化対象プログラムに対して、更にループ内において不変の値を読み出すメモリアクセス命令をループ外に移動する処理を行うループ内不変値最適化部を更に備えることを特徴とする項目１記載の最適化装置。
（項目１０）　命令の実行順序の変更により最適化対象プログラムを最適化する最適化装置であって、命令の実行順序の変更を制限する場合に用いられ、実質的な処理を行わないダミー命令を生成するダミー命令生成部と、前記ダミー命令を越えた命令の実行順序の変更を制限しつつ、命令の実行順序の変更による最適化を行う実行順序制御部とを備えることを特徴とする最適化装置。
【００６２】
（項目１１）　前記最適化対象プログラム中の条件分岐命令の分岐条件が、前記条件分岐命令によって選択的に実行される第１命令による例外が発生しないことを保証するか否かを判断する保証命令検出部を更に備え、前記分岐条件が、前記第１命令による例外が発生しないことを保証すると判断された場合に、前記ダミー命令生成部は、前記条件分岐命令より後、かつ前記第１命令より先に実行される位置に、前記ダミー命令を生成することを特徴とする項目１０記載の最適化装置。
（項目１２）　コンピュータによって、最適化対象プログラムにおける命令の実行順序を変更させるコンパイラプログラムであって、前記コンピュータを、例外を発生し得る第１命令を検出する例外発生命令検出部と、前記第１命令より先に実行され、前記第１命令の例外を発生させないことを保証する第２命令を検出する保証命令検出部と、前記第１命令を選択的に実行させる条件分岐命令より先、かつ前記第２命令より後に実行させるように、前記第１命令の実行順序を変更する実行順序制御部として機能させることを特徴とするコンパイラプログラム。
（項目１３）　前記例外発生命令検出部は、前記第１命令として、メモリアクセス命令を検出し、前記例外は、前記メモリアクセス命令によりアクセスされるメモリ中のアドレスが無効である場合に発生し、前記保証命令検出部は、前記第２命令として、前記メモリアクセス命令によりアクセスされるメモリのアドレスが有効なアドレスであるか否かを判断する命令を検出することを特徴とする項目１２記載のコンパイラプログラム。
【００６３】
（項目１４）　前記最適化対象プログラムは、前記第１命令により例外が発生するか否かを検出する例外チェック命令を前記第１命令の実行より先かつ前記条件分岐命令の実行より後に含み、前記例外発生命令検出部は、前記例外チェック命令を検出し、前記保証命令検出部は、前記第２命令として、前記例外チェック命令による例外が発生しないことを保証する命令を検出し、前記第２命令が検出された場合に、前記例外チェック命令を除去する命令除去部を更に備え、前記実行順序制御部は、前記例外チェック命令が除去されない場合における、前記第２命令、前記例外チェック命令、及び前記第１命令の実行順序を保ちつつ、前記第１命令を、前記条件分岐命令より先に実行させるように実行順序を変更することを特徴とする項目１２記載のコンパイラプログラム。
（項目１５）　前記実行順序制御部により命令の実行順序を変更された前記最適化対象プログラムに対して、処理の内容が他の命令と冗長である冗長命令の除去を行う冗長性除去部を更に備えることを特徴とする項目１２記載のコンパイラプログラム。
【００６４】
（項目１６）　コンピュータによって、命令の実行順序の変更により最適化対象プログラムを最適化させるコンパイラプログラムであって、前記コンピュータを、命令の実行順序の変更を制限する場合に用いられ、実質的な処理を行わないダミー命令を生成するダミー命令生成部と、前記ダミー命令を越えた命令の実行順序の変更を制限しつつ、命令の実行順序の変更による最適化を行う実行順序制御部として機能させることを特徴とするコンパイラプログラム。
（項目１７）　最適化対象プログラムにおける、命令の実行順序を変更する最適化方法であって、例外を発生し得る第１命令を検出する段階と、前記第１命令より先に実行され、前記第１命令の例外を発生させないことを保証する第２命令を検出する段階と、前記第１命令を選択的に実行させる条件分岐命令より先、かつ前記第２命令より後に実行させるように、前記第１命令の実行順序を変更する段階とを備えることを特徴とする最適化方法。
（項目１８）　命令の実行順序の変更により最適化対象プログラムを最適化する最適化方法であって、命令の実行順序の変更を制限する場合に用いられ、実質的な処理を行わないダミー命令を生成する段階と、前記ダミー命令を越えた命令の実行順序の変更を制限しつつ、命令の実行順序の変更による最適化を行う段階とを備えることを特徴とする最適化方法。
【００６５】
（項目１９）　コンピュータによって、最適化対象プログラムにおける、命令の実行順序を変更させるコンパイラプログラムを記録した記録媒体であって、前記コンパイラプログラムは、前記コンピュータを、例外を発生し得る第１命令を検出する例外発生命令検出部と、前記第１命令より先に実行され、前記第１命令の例外を発生させないことを保証する第２命令を検出する保証命令検出部と、前記第１命令を選択的に実行させる条件分岐命令より先、かつ前記第２命令より後に実行させるように、前記第１命令の実行順序を変更する実行順序制御部と
して機能させることを特徴とする記録媒体。
（項目２０）　コンピュータによって、命令の実行順序の変更により最適化対象プログラムを最適化させるコンパイラプログラムを記録した記録媒体であって、前記コンパイラプログラムは、前記コンピュータを、命令の実行順序の変更を制限する場合に用いられ、実質的な処理を行わないダミー命令を生成するダミー命令生成部と、前記ダミー命令を越えた命令の実行順序の変更を制限しつつ、命令の実行順序の変更による最適化を行う実行順序制御部として機能させることを特徴とする記録媒体。
【００６６】
以上、本発明を実施形態を用いて説明したが、本発明の技術的範囲は上記実施形態に記載の範囲には限定されない。上記実施形態に、多様な変更または改良を加えることができる。そのような変更または改良を加えた形態も本発明の技術的範囲に含まれ得ることが、特許請求の範囲の記載から明らかである。
【００６７】
【発明の効果】
上記説明から明らかなように、本発明によれば例外を発生しうる命令の実行順序を変更することによりプログラムを最適化することができる。
【図面の簡単な説明】
【図１】図１は、コンパイラ１０の機能ブロック図。
【図２】図２は、コンパイラ１０の動作フローを示す図。
【図３】図３は、メモリアクセス命令の投機的な移動を示す図。
【図４】図４は、ダミー命令が命令の実行順序の変更を制限する一例を示す図。
【図５】図５は、ダミー命令が命令の実行順序の変更を制限する他の例を示す図。
【図６】図６は、ダミー命令が実行順序の変更を制限する概念図。
【図７】図７は、ダミー命令が実行順序の変更を制限する制御フローの一例を示す図。
【図８】図８は、最適化対象プログラムの例を示す図。
【図９】図９は、最適化対象プログラムに、実行順序の投機的でない変更を行った結果を示す図。
【図１０】図１０は、最適化対象プログラムに、実行順序の投機的な変更を行った結果を示す図。
【図１１】図１１は、コンパイラ１０のハードウェア構成の一例を示す図。
【符号の説明】
１０　コンパイラ
２０　フロントエンド処理装置
３０　最適化装置
９０　コード生成部
３００　命令除去部
３１０　例外発生命令検出部
３１５　保証命令検出部
３２０　ダミー命令生成部
３３０　実行順序制御部
３４０　冗長性除去部
３５０　部分冗長性除去部
３６０　ループ内不変値最適化部
６００　基本ブロック
６１０　基本ブロック
６１５　基本ブロック
６２０　基本ブロック
６３０　基本ブロック
６４０　基本ブロック
６５０　基本ブロック
６６０　基本ブロック
【図１】
2004062520.tif 000003
【図２】
2004062520.tif 000004
【図３】
2004062520.tif 000005
【図４】
2004062520.tif 000006
【図５】
2004062520.tif 000007
【図６】
2004062520.tif 000008
【図７】
2004062520.tif 000009
【図８】
2004062520.tif 000010
【図９】
2004062520.tif 000011
【図１０】
2004062520.tif 000012
【図１１】
2004062520.tif 000013