(57)【要約】【課題】プログラムの整合性を保持しつつ、ある実行経路の基本ブロックを拡張することができるようにプログラムを変換するコンパイラ装置を提供。【解決手段】元の部分プログラムのホットパス上における中間コードのパス置換対象変数に変数置換処理を施した中間コードと、ホットパス上の分岐命令をホットパスが実行される条件となるように変換した分岐中間コードとを含む新たな基本ブロックと、パス置換対象変数のうちパス保証変数の値を元の変数の値に復元する中間コードの基本ブロックを生成し連結することで高速化ブロックを形成する。条件分岐中間コードの実行結果が真である場合には、基本ブロックの実行と、高速化ブロック中の中間コード間の依存解析と依存生成と命令のスケジューリングとを行い、元のプログラムを高速化する。【選択図】  図１
2008004082.tif 000002
【特許請求の範囲】
【請求項１】
分岐命令を含むソースプログラムを目的コードの列である目的プログラムに変換するコンパイラ装置であって、
実行経路指定器と、第１の実行経路コード生成器と、保証コード生成器と、部分コード生成器と、第１の分岐コード生成器と、第１の依存解析器と、並列化器とを備え、
前記実行経路指定器は、前記ソースプログラムを構成する、途中に分岐命令を含む一部命令列における複数の実行経路から一つを指定するものであり、
前記第１の実行経路コード生成器は、前記実行経路指定器によって指定される実行経路上で定義されている変数であって当該指定される実行経路の入口において生存が必要とされる変数をその他の変数に置き換えてなる第１の実行経路コードを生成するものであり、
前記保証コード生成器は、前記第１の実行経路コード生成器によって置き換えられたその他の変数であって前記指定される実行経路の出口においても生存が必要とされるその他の変数を元の変数に復元する保証コードを生成するものであり、
前記部分コード生成器は、前記一部命令列に対応する部分コードを生成するものであり、
前記第１の分岐コード生成器は、前記指定される実行経路上の条件分岐命令の条件に基づいて、前記指定される実行経路を実行するための分岐条件が成立しない場合には、前記指定される実行経路上の条件分岐命令に、前記部分コードの始点に分岐する第１の分岐コードを生成するものであり、
前記第１の依存解析器は、前記指定される実行経路上の命令間の依存関係の解析に基づいて命令間の依存関係を算出するとともに、前記保証コードが前記指定される実行経路上の条件分岐命令より後に実行されるように、前記保証コードと前記指定される実行経路上の条件分岐命令に対応する前記分岐コードとの間に依存を追加し、かつ、例外が発生しないように命令間の依存を付加するものであり、
前記並列化器は、前記第１の依存解析器が付加する前記命令間の依存に基づいて前記指定される実行経路中の命令の並び替えを行うものである、
コンパイラ装置。
【請求項２】
当該コンパイラ装置は、前記ソースプログラムが有するループを一つの命令として扱うものであって、ループ単位処理器をさらに備え、
前記ループ単位処理器は、前記実行経路指定器と前記第１の実行経路コード生成器と前記保証コード生成器と前記第１の分岐コード生成器と前記第１の依存解析器と前記並列化器とを、前記ループの最内ループより外側のループに向かって起動するものである、
請求項１のコンパイラ装置。
【請求項３】
第１の実行経路変換判定器をさらに備え、
前記第１の実行経路変換判定器は、前記指定される実行経路の実行確率に基づいて、前記並列化器を実行した後のプログラムを目的コードとするか否かを判定するものである、
請求項１のコンパイラ装置。
【請求項４】
第２の実行経路変換判定器をさらに備え、
前記第２の実行経路変換判定器は、
前記指定される実行経路の実行確率と前記部分コードの実行時間とに基づいて、前記部分コードの平均実行時間を算定し、
前記並列化器を実行した後の前記指定される実行経路における前記目的コードの実行時間と前記実行確率とに基づいて、前記指定される実行経路の平均実行時間を算定し、
前記部分コードの平均実行時間と前記指定される実行経路の平均実行時間との比較に基づいて、前記並列化器を実行した後のプログラムを前記目的コードの列とするか否かを判定する、
ものである、
請求項１のコンパイラ装置。
【請求項５】
戻り場所設定命令コード生成器と第２の依存解析器とをさらに備え、
前記戻り場所設定命令コード生成器は、前記指定される実行経路の実行中に例外が発生した際の戻り場所を特定する命令コードを前記指定される実行経路上に追加するものであり、
前記第２の依存解析器は、前記指定される実行経路上の命令間の依存関係の解析に基づいて、前記保証コードが前記指定される実行経路上の条件分岐命令より後に実行されるように、前記保証コードと前記指定される実行経路上の条件分岐命令に対応する分岐コードとの間に依存を追加するものであり、
かつ、前記第２の依存解析器は、前記第１の依存解析器が実施する、例外が発生しないように命令間に付加する依存については、それを付加しない、
請求項１のコンパイラ装置。
【請求項６】
割り込み発生時処理ルーチン付加器をさらに備え、
前記割り込み発生時処理ルーチン付加器は、例外が発生した際に、前記命令コードで指定する前記戻り場所に戻る処理ルーチンを前記目的コードに追加するものである、
請求項５のコンパイラ装置。
【請求項７】
第３の実行経路変換判定器をさらに備え、
前記第３の実行経路変換判定器は、前記指定される実行経路の実行確率と、前記並列化器を実行した後の実行経路上で例外が発生する確率とに基づいて、前記並列化器を実行した後のプログラムを前記目的コードとするか否かを判定するものである、
請求項６のコンパイラ装置。
【請求項８】
第４の実行経路変換判定器をさらに備え、
前記第４の実行経路変換判定器は、
前記指定される実行経路の実行確率と、前記指定される実行経路上で例外が発生する確率と、前記部分コードの実行時間とに基づいて、前記部分コードの平均実行時間を算定し、
前記指定される実行経路の実行確率と、前記例外が発生する確率と、前記並列化器を実行した後の実行経路における前記目的コードの実行時間と、前記割り込み発生時処理ルーチン付加器が付加する前記処理ルーチンにおける前記目的コードの実行時間とに基づいて、前記並列化器を実行した後の実行経路の平均実行時間と前記処理ルーチンの平均実行時間とを算定し、
前記並列化器を実行した後の実行経路の平均実行時間と前記処理ルーチンの平均実行時間との比較に基づいて、前記並列化器を実行した後のプログラムを目的コードとするか否かを判定するものである、
請求項７のコンパイラ装置。
【請求項９】
第２の実行経路コード生成器をさらに備え、
前記第２の実行経路コード生成器は、前記指定される実行経路上で参照される変数が特定の値を保持することが多い場合には、当該変数を当該変数が保持する値に置き換え、当該変数が前記置き換えた値と異なる値を保持する場合には、前記指定される実行経路の外へ分岐するように条件を設定した条件分岐命令を前記指定される実行経路中の先頭に挿入してなる第２の実行経路コードを生成するものであり、
当該コンパイラ装置は、前記第２の実行経路コード生成器が起動した後に、定数値に関する冗長性の削除最適化を行う、
請求項８のコンパイラ装置。
【請求項１０】
第５の実行経路変換判定器をさらに備え、
前記第５の実行経路変換判定器は、前記指定される実行経路の実行確率と、前記指定される実行経路上の変数が特定の値を保持する確率とに基づいて、前記第２の実行経路コード生成器を実行するか否かを判定するものである、
請求項９のコンパイラ装置。
【請求項１１】
第６の実行経路変換判定器をさらに備え、
前記第６の実行経路変換判定器は、前記指定される実行経路の実行確率と、前記指定される実行経路上の変数が特定の値を保持する確率と、前記並列化器を実行した後の実行経路における前記目的コードの実行時間とに基づいて、前記並列化器を実行した後の実行経路の平均実行時間を算定し、
前記並列化器を実行した後の実行経路の平均実行時間と前記部分コードの平均実行時間との比較に基づいて、前記並列化器を実行した後のプログラムを前記目的コードとするか否かを判定するものである、
請求項１０のコンパイラ装置。
【請求項１２】
第３の実行経路コード生成器と第２の分岐コード生成器とをさらに備え、
前記第３の実行経路コード生成器は、
前記指定される実行経路上で参照される変数が特定の値を保持することが多い場合には、当該指定される実行経路中の命令を複製したうえで、当該複製した実行経路において前記特定の値を保持することが多い変数を当該変数が保持する値に置き換え、前記指定される実行経路上で参照される変数が前記置き換えた値と異なる値を保持する場合には、当該指定される実行経路の外へ分岐するように条件を設定した条件分岐命令を当該指定される実行経路中の先頭に挿入してなる第３の実行経路コードを生成するものであり、
前記第２の分岐コード生成器は、前記指定される実行経路中の条件分岐命令に前記複製した実行経路上の条件分岐命令の条件が成立しない場合には、前記複製した実行経路上の条件分岐命令に、前記指定される実行経路コードの始点に分岐する第２の分岐コードを生成するものである、
請求項１１のコンパイラ装置。
【請求項１３】
第７の実行経路変換判定器をさらに備え、
前記第７の実行経路変換判定器は、
前記指定される実行経路上で参照される変数が特定の値を保持する確率に基づいて、または前記指定される実行経路の実行確率と前記指定される実行経路上で参照される変数が特定の値を保持する確率とに基づいて変形後のプログラムの平均実行時間を算出したうえで、
算出する前記変形後のプログラムの平均実行時間に基づいて、前記第３の実行経路コード生成器と前記第２の分岐コード生成器とを実行するか否かを判定するものである、
請求項１２のコンパイラ装置。
【請求項１４】
分岐命令を含むソースプログラムを目的コードの列である目的プログラムに変換するコンパイラ装置であって、
実行経路指定器と、実行経路コード生成器と、保証コード生成器と、部分コード生成器と、分岐コード生成器と、依存解析器と、並列化器とを備え、
前記実行経路指定器は、前記ソースプログラムを構成する、途中に分岐命令を含む一部命令列に含まれる複数の実行経路から一つを指定するものであり、
前記実行経路コード生成器は、前記実行経路指定器によって指定される実行経路上で定義されている変数であって当該指定される実行経路の入口において生存が必要とされる変数をその他の変数に置き換えてなる実行経路コードを生成するものであり、
前記保証コード生成器は、前記実行経路コード生成器によって置き換えられた前記その他の変数であって前記指定される実行経路の出口においても生存が必要とされるその他の変数を元の変数に復元する保証コードを生成するものであり、
前記部分コード生成器は、前記一部命令列に対応する部分コードを生成するものであり、
前記分岐コード生成器は、前記指定される実行経路上の条件分岐命令の条件に基づいて、前記指定される実行経路を実行するための分岐条件が成立しない場合には、前記指定される実行経路上の条件分岐命令の分岐先が前記部分コード中の当該分岐条件が成立しない場合の分岐先になるように、分岐コードを生成するものであり、
前記依存解析器は、前記指定される実行経路中の命令間の依存関係の解析に基づいて、命令間の依存関係を算出するとともに、前記指定される実行経路中の命令であって制御が合流する基本ブロック中に存在する命令から、前記実行経路の終点方向に向かって最初に見つかる前記条件分岐命令を越えて処理移動ができないように、当該基本ブロック中に存在する命令と前記条件分岐命令との間に依存を付加し、かつ、前記指定される実行経路中の命令であって前記基本ブロック中に存在しない命令から、前記条件分岐命令を越えて処理移動できないように、当該命令と前記条件分岐命令との間に依存を付加するものであり、
前記並列化器は、前記依存解析器が付加する前記命令間の依存に基づいて前記指定される実行経路中の命令の並び替えを行うものである、
コンパイラ装置。
【請求項１５】
合流定義変数置換器と、合流定義変数保証コード生成器とをさらに備え、
前記合流定義変数置換器は、前記ソースプログラムを構成する、途中に分岐命令を含む一部命令列において、制御が合流する基本ブロック中で定義される変数が存在する場合には、当該変数の定義箇所と参照箇所とをその他の変数に置き換えるものであり、
前記合流定義変数保証コード生成器は、前記合流定義変数置換器によって置き換えられたその他の変数であって前記一部命令列の出口で生存が必要とされるその他の変数を元の変数に復元する保証コードを、一部命令列の出口に生成するものである、
請求項１４のコンパイラ装置。
【請求項１６】
第１の実行経路変換判定器をさらに備え、
前記第１の実行経路変換判定器は、前記指定される実行経路の実行確率に基づいて、前記並列化器を実行した後のプログラムを目的コードとするか否かを判定するものである、
請求項１５のコンパイラ装置。
【請求項１７】
第２の実行経路変換判定器をさらに備え、
前記第２の実行経路変換判定器は、
前記指定される実行経路の実行確率と前記部分コードの実行時間とに基づいて、前記部分コードの平均実行時間を算定し、
前記指定される実行経路の実行確率と前記並列化器を実行した後の実行経路における前記目的コードの実行時間とに基づいて、前記並列化器を実行した後の実行経路の平均実行時間を算定し、
前記部分コードの平均実行時間と前記並列化器を実行した後の実行経路の平均実行時間との比較に基づいて、前記並列化器を実行した後のプログラムを前記目的コードの列とするか否かを判定する、
ものである、
請求項１６のコンパイラ装置。
【請求項１８】
分岐命令を含むソースプログラムを目的コードの列である目的プログラムに変換するコンパイラ装置であって、
実行経路指定器と、第１の実行経路コード生成器と、第１の保証コード生成器と、第２の実行経路コード生成器と、合流定義変数置換器と、合流定義変数保証コード生成器と、第３の実行経路コード生成器と、第２の保証コード生成器と、部分コード生成器と、第１の分岐コード生成器と、第２の分岐コード生成器と、第３の分岐コード生成器と、依存解析器と、並列化器とを備え、
前記実行経路指定器は、前記ソースプログラムを構成する、途中に分岐命令を含む一部命令列における複数の実行経路から一つを指定するものであり、
前記第１の実行経路コード生成器は、前記実行経路指定器によって指定される実行経路上における全命令列に対応する目的コードであって、前記指定される実行経路の入口において生存が必要とされかつ前記指定される実行経路上で定義されている変数が第１のその他の変数に置き換えられてなる第１の実行経路コードを生成するものであり、
前記第１の保証コード生成器は、前記第１のその他の変数であって前記指定される実行経路の出口で生存が必要とされる第１のその他の変数を元の変数に復元する第１の保証コードを生成するものであり、
第２の実行経路コード生成器は、前記第１の実行経路コード生成器と前記第１の保証コード生成器とによって生成されるコード列で参照される変数が特定の値を保持することが多い場合には、当該コード列を複製したうえで、当該複製したコード列における前記特定の値を保持することが多い変数を当該変数が保持する値に置き換え、前記コード列で参照される変数が置き換えた値と異なる値を保持する場合には、前記指定される実行経路の外へ分岐するように条件を設定した条件分岐命令を当該コード列の先頭に挿入してなる第２の実行経路コードを生成するものであり、
前記合流定義変数置換器は、前記一部命令列において制御が合流する基本ブロック中で定義される変数が存在する場合には、当該変数の定義箇所と参照箇所とを第２のその他の変数に置き換えるものであり、
前記合流定義変数保証コード生成器は、前記第２のその他の変数であって前記一部命令列の出口で生存が必要とされる第２のその他の変数については、当該第２のその他の変数を元の変数に復元する変数保証コードを一部命令列の出口に生成するものであり、
前記第３の実行経路コード生成器は、前記合流定義変数置換器と前記合流定義変数保証コード生成器とを実施した後の、前記指定される実行経路上における全命令列に対応する目的コードであって前記指定される実行経路の入口で生存が必要とされかつ当該指定される実行経路上で定義されている変数を第３のその他の変数に置き換えてなる第３の実行経路コードを生成するものであり、
前記第２の保証コード生成器は、前記第３のその他の変数であって前記指定される実行経路の出口で生存が必要とされる第３のその他の変数を元の変数に復元する第２の保証コードを生成するものであり、
前記部分コード生成器は、前記合流定義変数置換器と前記合流定義変数保証コード生成器とを実施した後の、前記一部命令列に対応する部分コードを生成するものであり、
前記第１の分岐コード生成器は、前記第３の実行経路コードの条件分岐命令の条件に基づいて、前記指定される実行経路を実行するための分岐条件が成立しない場合には、前記第３の実行経路コード中の条件分岐命令の分岐先を、前記部分コード中の当該分岐条件が成立しない場合における分岐先になるように第１の分岐コードを生成するものであり、
前記第２の分岐コード生成器は、前記第１の実行経路コード中の条件分岐命令の条件に基づいて、前記指定される実行経路を実行するための分岐条件が成立しない場合には、前記第１の実行経路コード中の分岐命令に、前記第３の実行経路コードの始点に分岐する第２の分岐コードを生成するものであり、
前記第３の分岐コード生成器は、前記第２の実行経路コード中の条件分岐命令の条件に基づいて、前記指定される実行経路を実行するための分岐条件が成立しない場合には、前記第２の実行経路コード中の分岐命令に、前記第１の実行経路コードの始点に分岐する第３の分岐コードを生成するものであり、
前記依存解析器は、前記第１の実行経路コード生成器と、前記第１の保証コード生成器と、前記第２の実行経路コード生成器と、前記第３の実行経路コード生成器と、前記第２の保証コード生成器とで生成される各コード列中の命令間の依存関係を解析して、当該命令間の依存関係を算出するものであり、
前記並列化器は、前記依存解析器が算出する前記命令間の依存関係に基づいて前記指定される実行経路中の命令の並び替えを行うものである、
コンパイラ装置。
【請求項１９】
分岐命令を含むソースプログラムを目的コードの列である目的プログラムに変換するコンパイル方法であって、
前記ソースプログラムを構成する、途中に分岐命令を含む一部命令列における複数の実行経路から一つを指定する実行経路指定ステップと、
前記実行経路指定ステップにおいて指定される実行経路上で定義されている変数であって当該指定される実行経路の入口において生存が必要とされる変数をその他の変数に置き換えてなる第１の実行経路コードを生成する第１の実行経路コード生成ステップと、
前記第１の実行経路コード生成ステップにおいて置き換えられたその他の変数であって前記指定される実行経路の出口においても生存が必要とされるその他の変数を元の変数に復元する保証コードを生成する保証コード生成ステップと、
前記一部命令列に対応する部分コードを生成する部分コード生成ステップと、
前記指定される実行経路上の条件分岐命令の条件に基づいて、前記指定される実行経路を実行するための分岐条件が成立しない場合には、前記指定される実行経路上の条件分岐命令に、前記部分コードの始点に分岐する第１の分岐コードを生成する第１の分岐コード生成ステップと、
前記指定される実行経路上の命令間の依存関係の解析に基づいて、命令間の依存関係を算出するとともに、前記保証コードが前記指定される実行経路上の条件分岐命令より後に実行されるように、前記保証コードと前記指定される実行経路上の条件分岐命令に対応する前記分岐コードとの間に依存を追加し、かつ、例外が発生しないように命令間の依存を付加する第１の依存解析ステップと、
前記第１の依存解析ステップにおいて付加する前記命令間の依存に基づいて前記指定される実行経路中の命令の並び替えを行う並列化ステップと、
を含むコンパイル方法。
【請求項２０】
前記指定される実行経路の実行中に例外が発生した際の戻り場所を特定する命令コードを前記指定される実行経路上に追加する戻り場所設定命令コード生成ステップと、
前記指定される実行経路上の命令間の依存関係の解析に基づいて、前記保証コードが前記指定される実行経路上の条件分岐命令より後に実行されるように、前記保証コードと前記指定される実行経路上の条件分岐命令に対応する分岐コードとの間に依存を追加する第２の依存解析ステップと、
をさらに含み、
前記第２の依存解析ステップでは、前記第１の依存解析ステップが実施する、例外が発生しないように命令間に付加する依存については、それを付加しない、
請求項１９のコンパイル方法。
【請求項２１】
例外が発生した際に、前記命令コードで指定する前記戻り場所に戻る処理ルーチンを前記目的コードに追加する割り込み発生時処理ルーチン付加ステップを、
さらに含む、
請求項２０のコンパイル方法。
【請求項２２】
分岐命令を含むソースプログラムを目的コードの列である目的プログラムに変換するコンパイラ方法であって、
前記ソースプログラムを構成する、途中に分岐命令を含む一部命令列における複数の実行経路から一つを指定する実行経路指定ステップと、
前記実行経路指定ステップにおいて指定される実行経路上における全命令列に対応する目的コードであって、前記指定される実行経路の入口において生存が必要とされかつ前記指定される実行経路上で定義されている変数が第１のその他の変数に置き換えられてなる第１の実行経路コードを生成する第１の実行経路コード生成ステップと、
前記第１のその他の変数であって前記指定される実行経路の出口で生存が必要とされる第１のその他の変数を元の変数に復元する第１の保証コードを生成する第１の保証コード生成ステップと、
前記第１の実行経路コード生成ステップと前記第１の保証コード生成ステップとにおいて生成されるコード列で参照される変数が特定の値を保持することが多い場合には、当該コード列を複製したうえで、複製したコード列における前記特定の値を保持することが多い変数を当該変数が保持する値に置き換え、前記コード列で参照される変数が置き換えた値と異なる値を保持する場合には、前記指定される実行経路の外へ分岐するように条件を設定した条件分岐命令を当該コード列の先頭に挿入してなる第２の実行経路コードを生成する第２の実行経路コード生成ステップと、
前記一部命令列において制御が合流する基本ブロック中で定義される変数が存在する場合には、当該変数の定義箇所と参照箇所とを第２のその他の変数に置き換える合流定義変数置換ステップと、
前記第２のその他の変数であって前記一部命令列の出口で生存が必要とされる第２のその他の変数については、当該第２のその他の変数を元の変数に復元する変数保証コードを一部命令列の出口に生成する合流定義変数保証コード生成ステップと、
前記合流定義変数置換ステップと前記合流定義変数保証コード生成ステップとを実施した後の、前記指定される実行経路上における全命令列に対応する目的コードであって前記指定される実行経路の入口で生存が必要とされかつ当該指定される実行経路上で定義されている変数を第３のその他の変数に置き換えてなる第３の実行経路コードを生成する第３の実行経路コード生成ステップと、
前記第３のその他の変数であって前記指定される実行経路の出口で生存が必要とされる第３のその他の変数を元の変数に復元する第２の保証コードを生成する  第２の保証コード生成ステップと、
前記合流定義変数置換ステップと前記合流定義変数保証コード生成ステップとを実施した後の、前記一部命令列に対応する部分コードを生成する部分コード生成ステップと、
前記第３の実行経路コードの条件分岐命令の条件に基づいて、前記指定される実行経路を実行するための分岐条件が成立しない場合には、前記第３の実行経路コード中の条件分岐命令の分岐先を、前記部分コード中の当該分岐条件が成立しない場合における分岐先になるように第１の分岐コードを生成する第１の分岐コード生成ステップと、
前記第１の実行経路コード中の条件分岐命令の条件に基づいて、前記指定される実行経路を実行するための分岐条件が成立しない場合には、前記第１の実行経路コード中の分岐命令に、前記第３の実行経路コードの始点に分岐する第２の分岐コードを生成する第２の分岐コード生成ステップと、
前記第２の実行経路コード中の条件分岐命令の条件に基づいて、前記指定される実行経路を実行するための分岐条件が成立しない場合には、前記第２の実行経路コード中の分岐命令に、前記第１の実行経路コードの始点に分岐する第３の分岐コードを生成する第３の分岐コード生成ステップと、
前記第１の実行経路コード生成ステップと、前記第１の保証コード生成ステップと、前記第２の実行経路コード生成ステップと、前記第３の実行経路コード生成ステップと、前記第２の保証コード生成ステップとで生成される各コード列中の命令間の依存関係を解析して、当該命令間の依存関係を算出する依存解析ステップと、
前記依存解析ステップが算出する前記命令間の依存関係に基づいて前記指定される実行経路中の命令の並び替えを行う並列化ステップと、
を含むコンパイル方法。
【請求項２３】
分岐命令を含むソースプログラムを目的コードの列である目的プログラムに変換するコンパイラプログラムであって、
前記ソースプログラムを構成する、途中に分岐命令を含む一部命令列における複数の実行経路から一つを指定する実行経路指定ステップと、
前記実行経路指定ステップにおいて指定される実行経路上で定義されている変数であって当該指定される実行経路の入口において生存が必要とされる変数をその他の変数に置き換えてなる第１の実行経路コードを生成する第１の実行経路コード生成ステップと、
前記第１の実行経路コード生成ステップにおいて置き換えられたその他の変数であって前記指定される実行経路の出口においても生存が必要とされるその他の変数を元の変数に復元する保証コードを生成する保証コード生成ステップと、
前記一部命令列に対応する部分コードを生成する部分コード生成ステップと、
前記指定される実行経路上の条件分岐命令の条件に基づいて、前記指定される実行経路を実行するための分岐条件が成立しない場合には、前記指定される実行経路上の条件分岐命令に、前記部分コードの始点に分岐する第１の分岐コードを生成する第１の分岐コード生成ステップと、
前記指定される実行経路上の命令間の依存関係の解析に基づいて、命令間の依存関係を算出するとともに、前記保証コードが前記指定される実行経路上の条件分岐命令より後に実行されるように、前記保証コードと前記指定される実行経路上の条件分岐命令に対応する前記分岐コードとの間に依存を追加し、かつ、例外が発生しないように命令間の依存を付加する第１の依存解析ステップと、
前記第１の依存解析ステップにおいて付加する前記命令間の依存に基づいて前記指定される実行経路中の命令の並び替えを行う並列化ステップと、
をコンピュータに実行させるためのコンパイラプログラム。
【請求項２４】
コンピュータに実行させるためのステップとして、
前記指定される実行経路の実行中に例外が発生した際の戻り場所を特定する命令コードを前記指定される実行経路上に追加する戻り場所設定命令コード生成ステップと、
前記指定される実行経路上の命令間の依存関係の解析に基づいて、前記保証コードが前記指定される実行経路上の条件分岐命令より後に実行されるように、前記保証コードと前記指定される実行経路上の条件分岐命令に対応する分岐コードとの間に依存を追加する第２の依存解析ステップと、
をさらに含み、
前記第２の依存解析ステップでは、前記第１の依存解析ステップが実施する、例外が発生しないように命令間に付加する依存については、それを付加しない、
請求項２３のコンパイラプログラム。
【請求項２５】
コンピュータに実行させるためのステップとして、
例外が発生した際に、前記命令コードで指定する前記戻り場所に戻る処理ルーチンを前記目的コードに追加する割り込み発生時処理ルーチン付加ステップを、
さらに含む、
請求項２４のコンパイラプログラム。
【請求項２６】
分岐命令を含むソースプログラムを目的コードの列である目的プログラムに変換するコンパイラプログラムであって、
前記ソースプログラムを構成する、途中に分岐命令を含む一部命令列における複数の実行経路から一つを指定する実行経路指定ステップと、
前記実行経路指定ステップにおいて指定される実行経路上における全命令列に対応する目的コードであって、前記指定される実行経路の入口において生存が必要とされかつ前記指定される実行経路上で定義されている変数が第１のその他の変数に置き換えられてなる第１の実行経路コードを生成する第１の実行経路コード生成ステップと、
前記第１のその他の変数であって前記指定される実行経路の出口で生存が必要とされる第１のその他の変数を元の変数に復元する第１の保証コードを生成する第１の保証コード生成ステップと、
前記第１の実行経路コード生成ステップと前記第１の保証コード生成ステップとにおいて生成されるコード列で参照される変数が特定の値を保持することが多い場合には、当該コード列を複製したうえで、当該複製したコード列における前記特定の値を保持することが多い変数を当該変数が保持する値に置き換え、前記コード列で参照される変数が置き換えた値と異なる値を保持する場合には、前記指定される実行経路の外へ分岐するように条件を設定した条件分岐命令を当該コード列の先頭に挿入してなる第２の実行経路コードを生成する第２の実行経路コード生成ステップと、
前記一部命令列において制御が合流する基本ブロック中で定義される変数が存在する場合には、当該変数の定義箇所と参照箇所とを第２のその他の変数に置き換える合流定義変数置換ステップと、
前記第２のその他の変数であって前記一部命令列の出口で生存が必要とされる第２のその他の変数については、当該第２のその他の変数を元の変数に復元する変数保証コードを一部命令列の出口に生成する合流定義変数保証コード生成ステップと、
前記合流定義変数置換ステップと前記合流定義変数保証コード生成ステップとを実施した後の、前記指定される実行経路上における全命令列に対応する目的コードであって前記指定される実行経路の入口で生存が必要とされかつ当該指定される実行経路上で定義されている変数を第３のその他の変数に置き換えてなる第３の実行経路コードを生成する第３の実行経路コード生成ステップと、
前記第３のその他の変数であって前記指定される実行経路の出口で生存が必要とされる第３のその他の変数を元の変数に復元する第２の保証コードを生成する  第２の保証コード生成ステップと、
前記合流定義変数置換ステップと前記合流定義変数保証コード生成ステップとを実施した後の、前記一部命令列に対応する部分コードを生成する部分コード生成ステップと、
前記第３の実行経路コードの条件分岐命令の条件に基づいて、前記指定される実行経路を実行するための分岐条件が成立しない場合には、前記第３の実行経路コード中の条件分岐命令の分岐先を、前記部分コード中の当該分岐条件が成立しない場合における分岐先になるように第１の分岐コードを生成する第１の分岐コード生成ステップと、
前記第１の実行経路コード中の条件分岐命令の条件に基づいて、前記指定される実行経路を実行するための分岐条件が成立しない場合には、前記第１の実行経路コード中の分岐命令に、前記第３の実行経路コードの始点に分岐する第２の分岐コードを生成する第２の分岐コード生成ステップと、
前記第２の実行経路コード中の条件分岐命令の条件に基づいて、前記指定される実行経路を実行するための分岐条件が成立しない場合には、前記第２の実行経路コード中の分岐命令に、前記第１の実行経路コードの始点に分岐する第３の分岐コードを生成する第３の分岐コード生成ステップと、
前記第１の実行経路コード生成ステップと、前記第１の保証コード生成ステップと、前記第２の実行経路コード生成ステップと、前記第３の実行経路コード生成ステップと、前記第２の保証コード生成ステップとで生成される各コード列中の命令間の依存関係を解析して、当該命令間の依存関係を算出する依存解析ステップと、
前記依存解析ステップが算出する前記命令間の依存関係に基づいて前記指定される実行経路中の命令の並び替えを行う並列化ステップと、
をコンピュータに実行させるためのコンパイラプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、コンパイラ装置、コンパイル方法およびコンパイラプログラムにかかわり、特に実行速度面に関する最適化コンパイルの技術に関する。
【背景技術】
【０００２】
従来、大量のデータを処理するコンピュータシステムに搭載されるプログラムの性能を上げるため、プログラムの実行時間を短縮するように最適化を行うコンパイラ装置が用いられる。
【０００３】
コンパイラ装置では、最適化を行うために、プログラムの実行効率を上げるように命令の順序を並び替える命令スケジューリングが用いられる。また、コンパイラ装置は、最適化の際に、プログラム中の分岐の命令文および分岐先の命令文に着目した制御フロー解析により、プログラムを基本ブロック単位に分割する。基本ブロックは、命令文の文列であって基本ブロックの先頭の命令文から最後の命令文へと順に実行され、命令文の列の途中に分岐や合流を含まないものをいう。但し、基本ブロックの最後には分岐命令を含んでいてもよい。
【０００４】
基本ブロックの途中には分岐や合流がないため、基本ブロック毎の命令スケジューリングは容易に行うことができるが、基本ブロック毎の局所的な最適化では最適化の効果が限られる。そのため、基本ブロックを拡張し命令スケジューリングの対象範囲を広げることが必要とされる。
【０００５】
また、複数の分岐を含むプログラムにおいて、実行頻度が高い実行経路（以下「ホットパス」という）が分かっている場合がある。そのような場合には、ホットパス上の命令文を移動させてホットパスの基本ブロックを拡大し、ホットパスの実行効率を上げる方法が従来から知られている。
【０００６】
ここで、ホットパス上の基本ブロックを拡張する方法について、図５Ａ,図５Ｂのプログラムを例にして説明する。図５Ａはプログラムの一部を示しており、図５Ｂはこのプログラムのコンパイラ内部における中間プログラム表現を示している。中間プログラムは、Ｓ１,Ｓ２などの中間コードの列により構成される。また、図５Ｂでは、実線の矢印により、制御の流れを示す制御フローグラフも表現している。プログラム中の命令文はコンパイラ内部では中間コードとして表現される。制御フローグラフは、基本ブロックＢ１〜Ｂ７の間を分岐や合流を表す有向辺で接続した有向グラフである。また、この例では破線矢印ＨＰ上の基本ブロックＢ１,Ｂ２,Ｂ４,Ｂ５,Ｂ７を順に遷移する実行経路をホットパスとして説明する。
【０００７】
図６に示すプログラムを参照して説明する。このプログラムにおいて図７に示すように、基本ブロックＢ４の中間コードＳ８を基本ブロックＢ２に移動させ、基本ブロックＢ３から基本ブロックＢ４へ遷移する場合を考慮して中間コードＳ８をコピーした中間コードＳ８１を基本ブロックＢ３に挿入する。この操作によって、プログラムの整合性を保持しつつ、ホットパスＨＰ上の基本ブロックＢ２を拡張することができる。
【特許文献１】特開平８−３１４７２７号公報
【発明の開示】
【発明が解決しようとする課題】
【０００８】
しかしながら、図８に示すように、基本ブロックＢ５の中間コードＳ１０を基本ブロックＢ２に移動させたとき、基本ブロックＢ１,Ｂ２,Ｂ４の順に遷移し、基本ブロックＢ４の分岐命令Ｓ９の判定が偽である場合に、基本ブロックＢ６の中間コードＳ１２の変数ａは、本来なら基本ブロックＢ１の中間コードＳ１の変数ａの値を参照しなければならないが、移動させた中間コードＳ１０の変数ａの値を参照することになり、プログラムの整合性が保たれなくなる。
【０００９】
このように、最後に分岐命令を含む基本ブロックを跨って中間コードを移動させることにより元のプログラムのデータ依存関係が保たれなくなる場合、中間コードの移動が制限され、基本ブロックを拡張することができない。
【００１０】
したがって、本発明の主たる目的は、プログラムの整合性を保持しつつ、ある実行経路の基本ブロックを拡張することができるようにプログラムを変換するコンパイラ装置を提供することである。
【課題を解決するための手段】
【００１１】
（１）本発明によるコンパイラ装置は、分岐命令を含むソースプログラムを目的コードの列である目的プログラムに変換するコンパイラ装置であって、
実行経路指定器と、第１の実行経路コード生成器と、保証コード生成器と、部分コード生成器と、第１の分岐コード生成器と、第１の依存解析器と、並列化器とを備え、
前記実行経路指定器は、前記ソースプログラムを構成する、途中に分岐命令を含む一部命令列における複数の実行経路から一つを指定するものであり、
前記第１の実行経路コード生成器は、前記実行経路指定器によって指定される実行経路上で定義されている変数であって当該指定される実行経路の入口において生存が必要とされる変数をその他の変数に置き換えてなる第１の実行経路コードを生成するものであり、
前記保証コード生成器は、前記第１の実行経路コード生成器によって置き換えられたその他の変数であって前記指定される実行経路の出口においても生存が必要とされるその他の変数を元の変数に復元する保証コードを生成するものであり、
前記部分コード生成器は、前記一部命令列に対応する部分コードを生成するものであり、
前記第１の分岐コード生成器は、前記指定される実行経路上の条件分岐命令の条件に基づいて、前記指定される実行経路を実行するための分岐条件が成立しない場合には、前記指定される実行経路上の条件分岐命令に、前記部分コードの始点に分岐する第１の分岐コードを生成するものであり、
前記第１の依存解析器は、前記指定される実行経路上の命令間の依存関係の解析に基づいて命令間の依存関係を算出するとともに、前記保証コードが前記指定される実行経路上の条件分岐命令より後に実行されるように、前記保証コードと前記指定される実行経路上の条件分岐命令に対応する前記分岐コードとの間に依存を追加し、かつ、例外が発生しないように命令間の依存を付加するものであり、
前記並列化器は、前記第１の依存解析器が付加する前記命令間の依存に基づいて前記指定される実行経路中の命令の並び替えを行うものである。
【００１２】
以上の本発明の構成は、例外発生しないように依存を設定する態様のものである。この構成において、実行経路指定器は、途中に分岐命令を含む一部命令列において、いわゆるホットパスを指定する。第１の実行経路コード生成器は、パス置換対象変数（指定された実行経路の入口で生存が必要とされる変数でありかつ指定された実行経路上で定義されている変数）を他の変数に置き換えた実行経路コードを生成する。また、保証コード生成器は、置き換えた変数を元の変数に戻すために必要となる保証コードを前もって生成しておく。そして、部分コード生成器は、途中に分岐命令を含む一部命令列に対応する部分コードを生成する。第１の分岐コード生成器は、指定された実行経路を実行するための条件分岐命令について、まず、条件を指定された実行経路が実行されない場合の条件になるように調整したうえで、かつ実行経路の途中に分岐を含まない構成とするために、分岐先を部分コードの始点に分岐する分岐コードを生成する。これは、分岐条件が成立するときは高速化ブロック（実行経路）において処理を実行して高速処理を実現する一方、分岐条件が成立しないときは整合性を担保するために高速化ブロックを使用しない通常のシーケンスでの処理へ分岐させるために実施される。第１の依存解析器は、指定された実行経路上の命令間の依存関係を割り出し、保証コードが条件分岐命令より後になり、かつ、例外を発生させないように調整する。そして、並列化器は、得られた命令間の依存関係に従って実行経路中の命令の並び替えを行う。
【００１３】
この構成によれば、指定された実行経路の基本ブロックを拡張することができ、命令スケジューリングの対象範囲を広げることができるので、より効果的に最適化を行うことができる。またこの構成は、当該実行経路の命令文が優先的に実行されて実行経路の途中に分岐を含まない構成であるため、当該実行経路の実行確率が他の実行経路より高い場合に当該実行経路の実行速度を向上させることができる。
【００１４】
（２）上記（１）のコンパイラ装置において、当該コンパイラ装置は、前記ソースプログラムが有するループを一つの命令として扱うものであって、ループ単位処理器をさらに備え、
前記ループ単位処理器は、前記実行経路指定器と前記第１の実行経路コード生成器と前記保証コード生成器と前記第１の分岐コード生成器と前記第１の依存解析器と前記並列化器とを、前記ループの最内ループより外側のループに向かって起動するものである、という態様がある。
【００１５】
ループ単位処理器を備えることにより、最内ループから外側のループに向かって、繰り返し、実行経路の指定範囲を拡大できるのでより広い範囲でのプログラムの実行速度を向上させることができる。
【００１６】
（３）上記（１）のコンパイラ装置において、第１の実行経路変換判定器をさらに備え、
前記第１の実行経路変換判定器は、前記指定される実行経路の実行確率に基づいて、前記並列化器を実行した後のプログラムを目的コードとするか否かを判定するものである、という態様がある。
【００１７】
指定された実行経路の実行確率が低い条件下であるにもかかわらず、並列化器を実行した後のプログラムを目的コードとすることを常に行うのであれば、却って処理時間の延長化を招くという事態も想定される。そこで、上記の実行経路変換判定器を設ける。この実行経路変換判定器は、指定された実行経路の実行確率が所定の閾値よりも大きいときは、並列化器を実行した後のプログラムを目的コードとすることで処理時間の短縮化を図る。逆に、指定された実行経路の実行確率が所定の閾値以下のときは、並列化器は実行しない元のプログラムを目的コードとする。これにより、さらなる処理時間の短縮化を図ることができる。
【００１８】
（４）また上記（１）のコンパイラ装置において、第２の実行経路変換判定器をさらに備え、
前記第２の実行経路変換判定器は、
前記指定される実行経路の実行確率と前記部分コードの実行時間とに基づいて、前記部分コードの平均実行時間を算定し、
前記並列化器を実行した後の前記指定される実行経路における前記目的コードの実行時間と前記実行確率とに基づいて、前記指定される実行経路の平均実行時間を算定し、
前記部分コードの平均実行時間と前記指定される実行経路の平均実行時間との比較に基づいて、前記並列化器を実行した後のプログラムを前記目的コードの列とするか否かを判定する、という態様がある。
【００１９】
並列化器を実行した後のプログラムを目的コードとするか、並列化器は実行しない元のプログラムを目的コードとするかを判定する際において、単に指定された実行経路の実行確率の大小判定だけでは、処理時間の短縮化の正確性において不足が生じる場合がある。処理時間と確率とでは次元が異なるからである。そこで、時間の次元で比較判定を行うために前記第２の実行経路変換判定器を設ける。この実行経路変換判定器は、指定された実行経路における平均実行時間と部分コードにおける平均実行時間とをそれぞれ算定する。 そのうえで、実行経路変換判定器は、並列化器による実行経路の平均実行時間が部分コードの平均実行時間よりも短いときには、並列化器によるプログラムを目的コードとして設定する。その結果、処理時間の短縮化をより確実なものにすることができる。
【００２０】
（５）また上記（１）のコンパイラ装置において、戻り場所設定命令コード生成器と第２の依存解析器とをさらに備え、
前記戻り場所設定命令コード生成器は、前記指定される実行経路の実行中に例外が発生した際の戻り場所を特定する命令コードを前記指定される実行経路上に追加するものであり、
前記第２の依存解析器は、前記指定される実行経路上の命令間の依存関係の解析に基づいて、前記保証コードが前記指定される実行経路上の条件分岐命令より後に実行されるように、前記保証コードと前記指定される実行経路上の条件分岐命令に対応する分岐コードとの間に依存を追加するものであり、
かつ、前記第２の依存解析器は、前記第１の依存解析器が実施する、例外が発生しないように命令間に付加する依存については、それを付加しない、
これは、例外時の戻り場所を設定するようにし、例外発生しないようにするための、依存を設定しない構成である。これについては、後述する実施の形態での変形例１を参照することができる。
【００２１】
ゼロ割算が発生すれば、プロセッサまたはオペレーティングシステムにおいて例外が発生する。また、変数がＣ言語におけるポインタ変数であり、かつ、その変数の間接参照があるときに、その変数が未実装のアドレスやアクセスが禁止されているようなメモリのアドレスを保持している場合には、プロセッサまたはオペレーティングシステムにおいて例外が発生する。この対応策として、上述した戻り場所設定命令コード生成器と依存解析器とを設ける。すなわち、例外時の戻り場所を設定するようにして、投機的に実行された命令において例外が発生した場合でも矛盾なくプログラムの実行を継続できるようにする。その結果、指定された実行経路上にある例外を発生する可能性のある命令も制限なく指定された実行経路上を移動できるので、より命令の並列実行化が促進され実行速度を向上させることができる。
【００２２】
（６）また上記（５）のコンパイラ装置において、割り込み発生時処理ルーチン付加器をさらに備え、
前記割り込み発生時処理ルーチン付加器は、例外が発生した際に、前記命令コードで指定する前記戻り場所に戻る処理ルーチンを前記目的コードに追加するものである、という態様がある。これは、例外発生時の処理を割り込みルーチン（ソフト的に）で実施することで、プログラムの実行を継続するものである。これについては、後述する実施の形態での変形例１を参照することができる。このように構成すれば、依存に起因して生じる可能性のある指定された実行経路での高速実行の障害を回避し、指定された実行経路上にある例外を発生する可能性のある命令も制限なく指定された実行経路上を移動させることができるようになる。これにより、命令の並列実行化がさらに促進されて実行速度が向上する。
【００２３】
（７）また上記（６）のコンパイラ装置において、第３の実行経路変換判定器をさらに備え、
前記第３の実行経路変換判定器は、前記指定される実行経路の実行確率と、前記並列化器を実行した後の実行経路上で例外が発生する確率とに基づいて、前記並列化器を実行した後のプログラムを前記目的コードとするか否かを判定するものである、という態様がある。
【００２４】
このように構成すれば、指定された実行経路上で例外が発生する確率を判定材料として追加するので、この例外の発生確率を加味しない場合に比べて、状況の変化に応じたよりきめの細かい処理時間の短縮化を進めることができる。
【００２５】
（８）また上記（７）のコンパイラ装置において、第４の実行経路変換判定器をさらに備え、
前記第４の実行経路変換判定器は、
前記指定される実行経路の実行確率と、前記指定される実行経路上で例外が発生する確率と、前記部分コードの実行時間とに基づいて、前記部分コードの平均実行時間を算定し、
前記指定される実行経路の実行確率と、前記例外が発生する確率と、前記並列化器を実行した後の実行経路における前記目的コードの実行時間と、前記割り込み発生時処理ルーチン付加器が付加する前記処理ルーチンにおける前記目的コードの実行時間とに基づいて、前記並列化器を実行した後の実行経路の平均実行時間と前記処理ルーチンの平均実行時間とを算定し、
前記並列化器を実行した後の実行経路の平均実行時間と前記処理ルーチンの平均実行時間との比較に基づいて、前記並列化器を実行した後のプログラムを目的コードとするか否かを判定するものである、という態様がある。
【００２６】
このように構成すれば、部分コードの平均実行時間を基準とする判定だけでなく、また、実行経路と処理ルーチンの平均実行時間を基準とした判定だけでもなく、両者の平均実行時間の比較に基づく判定を行う。このようにしていずれの選択肢を選ぶかを決定するので、処理時間の短縮化をより確実なものにすることができる。
【００２７】
（９）また上記（８）のコンパイラ装置において、第２の実行経路コード生成器をさらに備え、
前記第２の実行経路コード生成器は、前記指定される実行経路上で参照される変数が特定の値を保持することが多い場合には、当該変数を当該変数が保持する値に置き換え、当該変数が前記置き換えた値と異なる値を保持する場合には、前記指定される実行経路の外へ分岐するように条件を設定した条件分岐命令を前記指定される実行経路中の先頭に挿入してなる第２の実行経路コードを生成するものであり、
当該コンパイラ装置は、前記第２の実行経路コード生成器が起動した後に、定数値に関する冗長性の削除最適化を行う、という態様がある。
【００２８】
このように構成すれば、変数が保持する値が特定の値に偏っている場合に、処理時間の短縮化をより確実なものにすることができる。
【００２９】
（１０）また上記（９）のコンパイラ装置において、第５の実行経路変換判定器をさらに備え、
前記第５の実行経路変換判定器は、前記指定される実行経路の実行確率と、前記指定される実行経路上の変数が特定の値を保持する確率とに基づいて、前記第２の実行経路コード生成器を実行するか否かを判定するものである、という態様がある。
【００３０】
このように構成すれば、指定された実行経路上の変数が特定の値を保持する確率を加味するので、この確率を加味しない場合に比べて、状況の変化に応じたよりきめの細かい処理時間の短縮化を進めることができる。
【００３１】
（１１）また上記（１０）のコンパイラ装置において、第６の実行経路変換判定器をさらに備え、
前記第６の実行経路変換判定器は、前記指定される実行経路の実行確率と、前記指定される実行経路上の変数が特定の値を保持する確率と、前記並列化器を実行した後の実行経路における前記目的コードの実行時間とに基づいて、前記並列化器を実行した後の実行経路の平均実行時間を算定し、
前記並列化器を実行した後の実行経路の平均実行時間と前記部分コードの平均実行時間との比較に基づいて、前記並列化器を実行した後のプログラムを前記目的コードとするか否かを判定するものである、という態様がある。
【００３２】
このように構成すれば、部分コードの平均実行時間を基準とした判定だけでなく、また、実行経路上の変数が特定の値を保持する確率を関連付けた当該実行経路の平均実行時間を基準とした判定だけでもなく、これら両者の平均実行時間の比較に基づく判定を行って、いずれの選択肢を選ぶかを決定するので、処理時間の短縮化をより確実なものにすることができる。
【００３３】
（１２）また（１１）のコンパイラ装置において、第３の実行経路コード生成器と第２の分岐コード生成器とをさらに備え、
前記第３の実行経路コード生成器は、
前記指定される実行経路上で参照される変数が特定の値を保持することが多い場合には、当該指定される実行経路中の命令を複製したうえで、当該複製した実行経路において前記特定の値を保持することが多い変数を当該変数が保持する値に置き換え、前記指定される実行経路上で参照される変数が前記置き換えた値と異なる値を保持する場合には、当該指定される実行経路の外へ分岐するように条件を設定した条件分岐命令を当該指定される実行経路中の先頭に挿入してなる第３の実行経路コードを生成するものであり、
前記第２の分岐コード生成器は、前記指定される実行経路中の条件分岐命令に前記複製した実行経路上の条件分岐命令の条件が成立しない場合には、前記複製した実行経路上の条件分岐命令に、前記指定される実行経路コードの始点に分岐する第２の分岐コードを生成するものである、という態様がある。
【００３４】
このように構成すれば、指定された実行経路上で参照される変数が置き換えた特定の値と異なる値を保持する場合でも、部分コードに比べて高速化されている他の高速化ブロックへ実行制御が遷移するので、処理時間の短縮化をより確実なものにすることができる。
【００３５】
（１３）また（１２）のコンパイラ装置において、第７の実行経路変換判定器をさらに備え、
前記第７の実行経路変換判定器は、
前記指定される実行経路上で参照される変数が特定の値を保持する確率に基づいて、または前記指定される実行経路の実行確率と前記指定される実行経路上で参照される変数が特定の値を保持する確率とに基づいて変形後のプログラムの平均実行時間を算出したうえで、
算出する前記変形後のプログラムの平均実行時間に基づいて、前記第３の実行経路コード生成器と前記第２の分岐コード生成器とを実行するか否かを判定するものである、という態様がある。
【００３６】
このように構成すれば、特定の値を保持する確率、またはこの確率と指定された実行経路の実行確率とにより算出される変形後のプログラムの平均実行時間に基づく判定を行って、いずれの選択肢を選ぶかを決定するので、処理時間の短縮化をより確実なものにすることができる。
【００３７】
（１４）また、本発明によるコンパイラ装置は、
分岐命令を含むソースプログラムを目的コードの列である目的プログラムに変換するコンパイラ装置であって、
実行経路指定器と、実行経路コード生成器と、保証コード生成器と、部分コード生成器と、分岐コード生成器と、依存解析器と、並列化器とを備え、
前記実行経路指定器は、前記ソースプログラムを構成する、途中に分岐命令を含む一部命令列に含まれる複数の実行経路から一つを指定するものであり、
前記実行経路コード生成器は、前記実行経路指定器によって指定される実行経路上で定義されている変数であって当該指定される実行経路の入口において生存が必要とされる変数をその他の変数に置き換えてなる実行経路コードを生成するものであり、
前記保証コード生成器は、前記実行経路コード生成器によって置き換えられた前記その他の変数であって前記指定される実行経路の出口においても生存が必要とされるその他の変数を元の変数に復元する保証コードを生成するものであり、
前記部分コード生成器は、前記一部命令列に対応する部分コードを生成するものであり、
前記分岐コード生成器は、前記指定される実行経路上の条件分岐命令の条件に基づいて、前記指定される実行経路を実行するための分岐条件が成立しない場合には、前記指定される実行経路上の条件分岐命令の分岐先が前記部分コード中の当該分岐条件が成立しない場合の分岐先になるように、分岐コードを生成するものであり、
前記依存解析器は、前記指定される実行経路中の命令間の依存関係の解析に基づいて、命令間の依存関係を算出するとともに、前記指定される実行経路中の命令であって制御が合流する基本ブロック中に存在する命令から、前記実行経路の終点方向に向かって最初に見つかる前記条件分岐命令を越えて処理移動ができないように、当該基本ブロック中に存在する命令と前記条件分岐命令との間に依存を付加し、かつ、前記指定される実行経路中の命令であって前記基本ブロック中に存在しない命令から、前記条件分岐命令を越えて処理移動できないように、当該命令と前記条件分岐命令との間に依存を付加するものであり、
前記並列化器は、前記依存解析器が付加する前記命令間の依存に基づいて前記指定される実行経路中の命令の並び替えを行うものである。
【００３８】
この構成によれば、前記指定された実行経路を実行するための分岐条件が成立しない場合に、前記部分コードの途中へ分岐するので、前記指定される実行経路を実行するための分岐条件が成立しない場合であっても、前記部分コードの始点から実行する場合に比較して実行速度を向上させることができる。
【００３９】
（１５）また（１４）のコンパイラ装置において、合流定義変数置換器と、合流定義変数保証コード生成器とをさらに備え、
前記合流定義変数置換器は、前記ソースプログラムを構成する、途中に分岐命令を含む一部命令列において、制御が合流する基本ブロック中で定義される変数が存在する場合には、当該変数の定義箇所と参照箇所とをその他の変数に置き換えるものであり、
前記合流定義変数保証コード生成器は、前記合流定義変数置換器によって置き換えられたその他の変数であって前記一部命令列の出口で生存が必要とされるその他の変数を元の変数に復元する保証コードを、一部命令列の出口に生成するものである、という態様がある。
【００４０】
このように構成すれば、前記一部命令列において制御が合流する基本ブロック内に存在する命令が、制限なく指定された実行経路上を移動できるので、より命令の並列実行化が促進され実行速度を向上させることができる。
【００４１】
（１６）また上記（１５）のコンパイラ装置において、第１の実行経路変換判定器をさらに備え、
前記第１の実行経路変換判定器は、前記指定される実行経路の実行確率に基づいて、前記並列化器を実行した後のプログラムを目的コードとするか否かを判定するものである、という態様がある。
【００４２】
このように構成すれば、（３）の構成と同様に、指定される実行経路の実行確率が所定の閾値よりも大きいときは、並列化器を実行した後のプログラムを目的コードとして選択することで処理時間の短縮化を図ることができる。逆に、指定される実行経路の実行確率が所定の閾値以下のときは、並列化器は実行しない元のプログラムを目的コードとして選択することで、これも処理時間の短縮化を図ることができる。
【００４３】
（１７）また上記（１６）のコンパイラ装置において、第２の実行経路変換判定器をさらに備え、
前記第２の実行経路変換判定器は、
前記指定される実行経路の実行確率と前記部分コードの実行時間とに基づいて、前記部分コードの平均実行時間を算定し、
前記指定される実行経路の実行確率と前記並列化器を実行した後の実行経路における前記目的コードの実行時間とに基づいて、前記並列化器を実行した後の実行経路の平均実行時間を算定し、
前記部分コードの平均実行時間と前記並列化器を実行した後の実行経路の平均実行時間との比較に基づいて、前記並列化器を実行した後のプログラムを前記目的コードの列とするか否かを判定する、
ものである、という態様がある。
【００４４】
このように構成すれば、（４）の構成と同様に、並列化器による実行経路の平均実行時間が部分コードの平均実行時間よりも短いときには並列化器によるプログラムが目的コードとされることで、処理時間の短縮化をより確実なものにすることができる。
【００４５】
（１８）また、本発明によるコンパイラ装置は、分岐命令を含むソースプログラムを目的コードの列である目的プログラムに変換するコンパイラ装置であって、
実行経路指定器と、第１の実行経路コード生成器と、第１の保証コード生成器と、第２の実行経路コード生成器と、合流定義変数置換器と、合流定義変数保証コード生成器と、第３の実行経路コード生成器と、第２の保証コード生成器と、部分コード生成器と、第１の分岐コード生成器と、第２の分岐コード生成器と、第３の分岐コード生成器と、依存解析器と、並列化器とを備え、
前記実行経路指定器は、前記ソースプログラムを構成する、途中に分岐命令を含む一部命令列における複数の実行経路から一つを指定するものであり、
前記第１の実行経路コード生成器は、前記実行経路指定器によって指定される実行経路上における全命令列に対応する目的コードであって、前記指定される実行経路の入口において生存が必要とされかつ前記指定される実行経路上で定義されている変数が第１のその他の変数に置き換えられてなる第１の実行経路コードを生成するものであり、
前記第１の保証コード生成器は、前記第１のその他の変数であって前記指定される実行経路の出口で生存が必要とされる第１のその他の変数を元の変数に復元する第１の保証コードを生成するものであり、
第２の実行経路コード生成器は、前記第１の実行経路コード生成器と前記第１の保証コード生成器とによって生成されるコード列で参照される変数が特定の値を保持することが多い場合には、当該コード列を複製したうえで、当該複製したコード列における前記特定の値を保持することが多い変数を当該変数が保持する値に置き換え、前記コード列で参照される変数が置き換えた値と異なる値を保持する場合には、前記指定される実行経路の外へ分岐するように条件を設定した条件分岐命令を当該コード列の先頭に挿入してなる第２の実行経路コードを生成するものであり、
前記合流定義変数置換器は、前記一部命令列において制御が合流する基本ブロック中で定義される変数が存在する場合には、当該変数の定義箇所と参照箇所とを第２のその他の変数に置き換えるものであり、
前記合流定義変数保証コード生成器は、前記第２のその他の変数であって前記一部命令列の出口で生存が必要とされる第２のその他の変数については、当該第２のその他の変数を元の変数に復元する変数保証コードを一部命令列の出口に生成するものであり、
前記第３の実行経路コード生成器は、前記合流定義変数置換器と前記合流定義変数保証コード生成器とを実施した後の、前記指定される実行経路上における全命令列に対応する目的コードであって前記指定される実行経路の入口で生存が必要とされかつ当該指定される実行経路上で定義されている変数を第３のその他の変数に置き換えてなる第３の実行経路コードを生成するものであり、
前記第２の保証コード生成器は、前記第３のその他の変数であって前記指定される実行経路の出口で生存が必要とされる第３のその他の変数を元の変数に復元する第２の保証コードを生成するものであり、
前記部分コード生成器は、前記合流定義変数置換器と前記合流定義変数保証コード生成器とを実施した後の、前記一部命令列に対応する部分コードを生成するものであり、
前記第１の分岐コード生成器は、前記第３の実行経路コードの条件分岐命令の条件に基づいて、前記指定される実行経路を実行するための分岐条件が成立しない場合には、前記第３の実行経路コード中の条件分岐命令の分岐先を、前記部分コード中の当該分岐条件が成立しない場合における分岐先になるように第１の分岐コードを生成するものであり、
前記第２の分岐コード生成器は、前記第１の実行経路コード中の条件分岐命令の条件に基づいて、前記指定される実行経路を実行するための分岐条件が成立しない場合には、前記第１の実行経路コード中の分岐命令に、前記第３の実行経路コードの始点に分岐する第２の分岐コードを生成するものであり、
前記第３の分岐コード生成器は、前記第２の実行経路コード中の条件分岐命令の条件に基づいて、前記指定される実行経路を実行するための分岐条件が成立しない場合には、前記第２の実行経路コード中の分岐命令に、前記第１の実行経路コードの始点に分岐する第３の分岐コードを生成するものであり、
前記依存解析器は、前記第１の実行経路コード生成器と、前記第１の保証コード生成器と、前記第２の実行経路コード生成器と、前記第３の実行経路コード生成器と、前記第２の保証コード生成器とで生成される各コード列中の命令間の依存関係を解析して、当該命令間の依存関係を算出するものであり、
前記並列化器は、前記依存解析器が算出する前記命令間の依存関係に基づいて前記指定される実行経路中の命令の並び替えを行うものである。
【００４６】
これは上述した複数の技術内容を組み合わせたものに相当し、処理時間の短縮化をほぼ理想的に進めることができる。
【００４７】
（１９）本発明によるコンパイル方法は、上記（１）のコンパイラ装置に対応するもので、
分岐命令を含むソースプログラムを目的コードの列である目的プログラムに変換するコンパイル方法であって、
前記ソースプログラムを構成する、途中に分岐命令を含む一部命令列における複数の実行経路から一つを指定する実行経路指定ステップと、
前記実行経路指定ステップにおいて指定される実行経路上で定義されている変数であって当該指定される実行経路の入口において生存が必要とされる変数をその他の変数に置き換えてなる第１の実行経路コードを生成する第１の実行経路コード生成ステップと、
前記第１の実行経路コード生成ステップにおいて置き換えられたその他の変数であって前記指定される実行経路の出口においても生存が必要とされるその他の変数を元の変数に復元する保証コードを生成する保証コード生成ステップと、
前記一部命令列に対応する部分コードを生成する部分コード生成ステップと、
前記指定される実行経路上の条件分岐命令の条件に基づいて、前記指定される実行経路を実行するための分岐条件が成立しない場合には、前記指定される実行経路上の条件分岐命令に、前記部分コードの始点に分岐する第１の分岐コードを生成する第１の分岐コード生成ステップと、
前記指定される実行経路上の命令間の依存関係の解析に基づいて、命令間の依存関係を算出するとともに、前記保証コードが前記指定される実行経路上の条件分岐命令より後に実行されるように、前記保証コードと前記指定される実行経路上の条件分岐命令に対応する前記分岐コードとの間に依存を追加し、かつ、例外が発生しないように命令間の依存を付加する第１の依存解析ステップと、
前記第１の依存解析ステップにおいて付加する前記命令間の依存に基づいて前記指定される実行経路中の命令の並び替えを行う並列化ステップと、
を含む。
【００４８】
（２０）上記（１９）のコンパイル方法において、前記指定される実行経路の実行中に例外が発生した際の戻り場所を特定する命令コードを前記指定される実行経路上に追加する戻り場所設定命令コード生成ステップと、
前記指定される実行経路上の命令間の依存関係の解析に基づいて、前記保証コードが前記指定される実行経路上の条件分岐命令より後に実行されるように、前記保証コードと前記指定される実行経路上の条件分岐命令に対応する分岐コードとの間に依存を追加する第２の依存解析ステップと、
をさらに含み、
前記第２の依存解析ステップでは、前記第１の依存解析ステップが実施する、例外が発生しないように命令間に付加する依存については、それを付加しない、という態様がある。これは、上記（５）のコンパイラ装置に対応するものである。
【００４９】
（２１）上記（２０）のコンパイル方法において、例外が発生した際に、前記命令コードで指定する前記戻り場所に戻る処理ルーチンを前記目的コードに追加する割り込み発生時処理ルーチン付加ステップを、
さらに含む、という態様がある。これは、上記（６）のコンパイラ装置に対応するものである。
【００５０】
（２２）また、本発明によるコンパイル方法は、
分岐命令を含むソースプログラムを目的コードの列である目的プログラムに変換するコンパイラ方法であって、
前記ソースプログラムを構成する、途中に分岐命令を含む一部命令列における複数の実行経路から一つを指定する実行経路指定ステップと、
前記実行経路指定ステップにおいて指定される実行経路上における全命令列に対応する目的コードであって、前記指定される実行経路の入口において生存が必要とされかつ前記指定される実行経路上で定義されている変数が第１のその他の変数に置き換えられてなる第１の実行経路コードを生成する第１の実行経路コード生成ステップと、
前記第１のその他の変数であって前記指定される実行経路の出口で生存が必要とされる第１のその他の変数を元の変数に復元する第１の保証コードを生成する第１の保証コード生成ステップと、
前記第１の実行経路コード生成ステップと前記第１の保証コード生成ステップとにおいて生成されるコード列で参照される変数が特定の値を保持することが多い場合には、当該コード列を複製したうえで、複製したコード列における前記特定の値を保持することが多い変数を当該変数が保持する値に置き換え、前記コード列で参照される変数が置き換えた値と異なる値を保持する場合には、前記指定される実行経路の外へ分岐するように条件を設定した条件分岐命令を当該コード列の先頭に挿入してなる第２の実行経路コードを生成する第２の実行経路コード生成ステップと、
前記一部命令列において制御が合流する基本ブロック中で定義される変数が存在する場合には、当該変数の定義箇所と参照箇所とを第２のその他の変数に置き換える合流定義変数置換ステップと、
前記第２のその他の変数であって前記一部命令列の出口で生存が必要とされる第２のその他の変数については、当該第２のその他の変数を元の変数に復元する変数保証コードを一部命令列の出口に生成する合流定義変数保証コード生成ステップと、
前記合流定義変数置換ステップと前記合流定義変数保証コード生成ステップとを実施した後の、前記指定される実行経路上における全命令列に対応する目的コードであって前記指定される実行経路の入口で生存が必要とされかつ当該指定される実行経路上で定義されている変数を第３のその他の変数に置き換えてなる第３の実行経路コードを生成する第３の実行経路コード生成ステップと、
前記第３のその他の変数であって前記指定される実行経路の出口で生存が必要とされる第３のその他の変数を元の変数に復元する第２の保証コードを生成する第２の保証コード生成ステップと、
前記合流定義変数置換ステップと前記合流定義変数保証コード生成ステップとを実施した後の、前記一部命令列に対応する部分コードを生成する部分コード生成ステップと、
前記第３の実行経路コードの条件分岐命令の条件に基づいて、前記指定される実行経路を実行するための分岐条件が成立しない場合には、前記第３の実行経路コード中の条件分岐命令の分岐先を、前記部分コード中の当該分岐条件が成立しない場合における分岐先になるように第１の分岐コードを生成する第１の分岐コード生成ステップと、
前記第１の実行経路コード中の条件分岐命令の条件に基づいて、前記指定される実行経路を実行するための分岐条件が成立しない場合には、前記第１の実行経路コード中の分岐命令に、前記第３の実行経路コードの始点に分岐する第２の分岐コードを生成する第２の分岐コード生成ステップと、
前記第２の実行経路コード中の条件分岐命令の条件に基づいて、前記指定される実行経路を実行するための分岐条件が成立しない場合には、前記第２の実行経路コード中の分岐命令に、前記第１の実行経路コードの始点に分岐する第３の分岐コードを生成する第３の分岐コード生成ステップと、
前記第１の実行経路コード生成ステップと、前記第１の保証コード生成ステップと、前記第２の実行経路コード生成ステップと、前記第３の実行経路コード生成ステップと、前記第２の保証コード生成ステップとで生成される各コード列中の命令間の依存関係を解析して、当該命令間の依存関係を算出する依存解析ステップと、
前記依存解析ステップが算出する前記命令間の依存関係に基づいて前記指定される実行経路中の命令の並び替えを行う並列化ステップと、
を含む。これは、上記（１８）のコンパイラ装置に対応したものである。
【００５１】
（２３）本発明によるコンパイラプログラムは、上記（１９）のコンパイル方法に対応したもので、
分岐命令を含むソースプログラムを目的コードの列である目的プログラムに変換するコンパイラプログラムであって、
前記ソースプログラムを構成する、途中に分岐命令を含む一部命令列における複数の実行経路から一つを指定する実行経路指定ステップと、
前記実行経路指定ステップにおいて指定される実行経路上で定義されている変数であって当該指定される実行経路の入口において生存が必要とされる変数をその他の変数に置き換えてなる第１の実行経路コードを生成する第１の実行経路コード生成ステップと、
前記第１の実行経路コード生成ステップにおいて置き換えられたその他の変数であって前記指定される実行経路の出口においても生存が必要とされるその他の変数を元の変数に復元する保証コードを生成する保証コード生成ステップと、
前記一部命令列に対応する部分コードを生成する部分コード生成ステップと、
前記指定される実行経路上の条件分岐命令の条件に基づいて、前記指定される実行経路を実行するための分岐条件が成立しない場合には、前記指定される実行経路上の条件分岐命令に、前記部分コードの始点に分岐する第１の分岐コードを生成する第１の分岐コード生成ステップと、
前記指定される実行経路上の命令間の依存関係の解析に基づいて、命令間の依存関係を算出するとともに、前記保証コードが前記指定される実行経路上の条件分岐命令より後に実行されるように、前記保証コードと前記指定される実行経路上の条件分岐命令に対応する前記分岐コードとの間に依存を追加し、かつ、例外が発生しないように命令間の依存を付加する第１の依存解析ステップと、
前記第１の依存解析ステップにおいて付加する前記命令間の依存に基づいて前記指定される実行経路中の命令の並び替えを行う並列化ステップと、
をコンピュータに実行させるためのコンパイラプログラムである。
【００５２】
（２４）上記（２３）のコンパイラプログラムにおいて、コンピュータに実行させるためのステップとして、
前記指定される実行経路の実行中に例外が発生した際の戻り場所を特定する命令コードを前記指定される実行経路上に追加する戻り場所設定命令コード生成ステップと、
前記指定される実行経路上の命令間の依存関係の解析に基づいて、前記保証コードが前記指定される実行経路上の条件分岐命令より後に実行されるように、前記保証コードと前記指定される実行経路上の条件分岐命令に対応する分岐コードとの間に依存を追加する第２の依存解析ステップと、
をさらに含み、
前記第２の依存解析ステップでは、前記第１の依存解析ステップが実施する、例外が発生しないように命令間に付加する依存については、それを付加しない、という態様がある。これは、上記（２０）のコンパイル方法に対応したものである。
【００５３】
（２５）上記（２４）のコンパイラプログラムにおいて、コンピュータに実行させるためのステップとして、
例外が発生した際に、前記命令コードで指定する前記戻り場所に戻る処理ルーチンを前記目的コードに追加する割り込み発生時処理ルーチン付加ステップを、
さらに含む、という態様がある。これは、上記（２１）のコンパイル方法に対応したものである。
【００５４】
（２６）また本発明によるコンパイラプログラムは、
分岐命令を含むソースプログラムを目的コードの列である目的プログラムに変換するコンパイラプログラムであって、
前記ソースプログラムを構成する、途中に分岐命令を含む一部命令列における複数の実行経路から一つを指定する実行経路指定ステップと、
前記実行経路指定ステップにおいて指定される実行経路上における全命令列に対応する目的コードであって、前記指定される実行経路の入口において生存が必要とされかつ前記指定される実行経路上で定義されている変数が第１のその他の変数に置き換えられてなる第１の実行経路コードを生成する第１の実行経路コード生成ステップと、
前記第１のその他の変数であって前記指定される実行経路の出口で生存が必要とされる第１のその他の変数を元の変数に復元する第１の保証コードを生成する第１の保証コード生成ステップと、
前記第１の実行経路コード生成ステップと前記第１の保証コード生成ステップとにおいて生成されるコード列で参照される変数が特定の値を保持することが多い場合には、当該コード列を複製したうえで、当該複製したコード列における前記特定の値を保持することが多い変数を当該変数が保持する値に置き換え、前記コード列で参照される変数が置き換えた値と異なる値を保持する場合には、前記指定される実行経路の外へ分岐するように条件を設定した条件分岐命令を当該コード列の先頭に挿入してなる第２の実行経路コードを生成する第２の実行経路コード生成ステップと、
前記一部命令列において制御が合流する基本ブロック中で定義される変数が存在する場合には、当該変数の定義箇所と参照箇所とを第２のその他の変数に置き換える合流定義変数置換ステップと、
前記第２のその他の変数であって前記一部命令列の出口で生存が必要とされる第２のその他の変数については、当該第２のその他の変数を元の変数に復元する変数保証コードを一部命令列の出口に生成する合流定義変数保証コード生成ステップと、
前記合流定義変数置換ステップと前記合流定義変数保証コード生成ステップとを実施した後の、前記指定される実行経路上における全命令列に対応する目的コードであって前記指定される実行経路の入口で生存が必要とされかつ当該指定される実行経路上で定義されている変数を第３のその他の変数に置き換えてなる第３の実行経路コードを生成する第３の実行経路コード生成ステップと、
前記第３のその他の変数であって前記指定される実行経路の出口で生存が必要とされる第３のその他の変数を元の変数に復元する第２の保証コードを生成する第２の保証コード生成ステップと、
前記合流定義変数置換ステップと前記合流定義変数保証コード生成ステップとを実施した後の、前記一部命令列に対応する部分コードを生成する部分コード生成ステップと、
前記第３の実行経路コードの条件分岐命令の条件に基づいて、前記指定される実行経路を実行するための分岐条件が成立しない場合には、前記第３の実行経路コード中の条件分岐命令の分岐先を、前記部分コード中の当該分岐条件が成立しない場合における分岐先になるように第１の分岐コードを生成する第１の分岐コード生成ステップと、
前記第１の実行経路コード中の条件分岐命令の条件に基づいて、前記指定される実行経路を実行するための分岐条件が成立しない場合には、前記第１の実行経路コード中の分岐命令に、前記第３の実行経路コードの始点に分岐する第２の分岐コードを生成する第２の分岐コード生成ステップと、
前記第２の実行経路コード中の条件分岐命令の条件に基づいて、前記指定される実行経路を実行するための分岐条件が成立しない場合には、前記第２の実行経路コード中の分岐命令に、前記第１の実行経路コードの始点に分岐する第３の分岐コードを生成する第３の分岐コード生成ステップと、
前記第１の実行経路コード生成ステップと、前記第１の保証コード生成ステップと、前記第２の実行経路コード生成ステップと、前記第３の実行経路コード生成ステップと、前記第２の保証コード生成ステップとで生成される各コード列中の命令間の依存関係を解析して、当該命令間の依存関係を算出する依存解析ステップと、
前記依存解析ステップが算出する前記命令間の依存関係に基づいて前記定される実行経路中の命令の並び替えを行う並列化ステップと、
をコンピュータに実行させるためのコンパイラプログラム。これは、上記（２１）のコンパイル方法に対応したものである。
【００５５】
また、本発明におけるコンパイラ装置は、前記ソースプログラムを逐次実行するインタプリタ機能を有し、前記インタプリタ機能により前記一部命令列における実行経路の情報を収集し、実行頻度が高い実行経路抽出する経路抽出器を備え、前記実行経路指定器は、前記抽出器によって抽出された実行経路を指定することとしてもよい。また、前記インタプリタ機能により実行頻度が高い実行経路上で参照される変数が保持する値の情報を収集し、出現頻度が高い値を抽出する値抽出器を備え、抽出された変数と値を前記実行経路コード生成器において使用してもよい。
【００５６】
このように構成すれば、より実行時の動作形態に合致したより正確な、実行頻度の高い実行経路と、変数の保持する値の情報をインタプリタより得られるので、ユーザが指定する場合や特定の経験値で情報をコンパイラに与える場合と比較して実行速度を向上させることができる。
【発明の効果】
【００５７】
本発明によれば、指定された実行経路の基本ブロックを拡張するとともに、命令スケジューリングの対象範囲を広げるので、より効果的に最適化を行うことができる。また、実行経路の命令文が優先的に実行され、実行経路の途中に分岐を含まない構成であるため、実行経路の実行確率が他の実行経路より高い場合に、当該実行経路の実行速度を向上させることができる。
【００５８】
また、ホットパス上にある例外を発生する可能性のある命令も制限なくホットパス上を移動できるので、より命令の並列実行化が促進され、実行速度を向上させることができる。
【００５９】
また、実行経路上の変数が定数に置き換えられ得るので、定数伝播最適化を実施する機会が増え、さらなる実行速度を向上させることができる。
【００６０】
また、指定された実行経路を実行するための分岐条件が成立しない場合に、一部コードの途中へ分岐するので、実行経路を実行するための分岐条件が成立しない場合に、部分コードの始点から実行する場合に比較して実行速度を向上させることができる。
【００６１】
また、より実行時の動作形態に合致したより正確な、実行頻度の高い実行経路と、変数の保持する値の情報をインタプリタより得られるので、ユーザが指定する場合や特定の経験値で情報をコンパイラに与える場合と比較して実行速度を向上させることができる。
【発明を実施するための最良の形態】
【００６２】
以下、本発明の好ましい具体例について図面を参照して説明する。
【００６３】
＜実施の形態＞
本発明の実施の形態におけるコンパイラ装置は、ソースプログラムを読み込み、プログラムを字句列に分解する字句解析を行い、字句の列に基づいてプログラミング言語の構文木を構築する構文解析を行い、構文解析によって構築された構文木に基づいて装置内部の中間コードで記述された中間プログラムを生成し、中間プログラムについて命令スケジューリング等の最適化を行い、変数についてレジスタ等の資源割付を行った後の中間プログラムを実行形式プログラムに変換する。
【００６４】
＜構成＞
図１は、本発明の実施の形態におけるコンパイラ装置Ａの全体構成を示す機能ブロック図である。コンパイラ装置Ａは、構文解析部１,最適化部２,資源割付部３,および実行コード生成部４を備える。コンパイラ装置Ａは、具体的には、マイクロプロセッサ,ＲＯＭ（Read Only Memory）,ＲＡＭ（Random Access Memory）,ハードディスク装置等を用いて実現されるコンピュータシステムである。ＲＯＭまたはハードディスク装置は、コンピュータプログラムを記憶している。図１に示したコンパイラ装置Ａの各部の機能は、マイクロプロセッサがコンピュータプログラムを実行することにより実現される。また、情報の記憶および各部間での受け渡しは、ＲＡＭおよびハードディスク装置を用いて実現される。
【００６５】
以下、各部の機能について説明する。構文解析部１は、ソースプログラムＦ１を読み出し、構文解析を行ってソースプログラムＦ１中の制御構造を認識し、中間コード列である中間プログラムを生成し、コンパイラ装置Ａ内に格納する。中間プログラムの制御構造は、ソースプログラムＦ１の制御構造と等価な制御構造となるように条件分岐の中間コードと、分岐の中間コードと、ラベルの中間コードとを用いて表現される。なお、条件分岐中間コードは、条件の判定を示す判定中間コード（例えば図１１のＳ２０２のｔ１＜＝０）と、条件の判定が真である場合の分岐先を示す分岐中間コード（例えば図１１のＳ２０３のｇｏｔｏ Ｓ１）とにより構成される。
【００６６】
最適化部２は、プログラム変換部２Ａと中間コードスケジューリング部２Ｂを含んで構成され、構文解析部１で生成された中間プログラムの制御フロー解析およびデータフロー解析を行い、その解析結果を後述するプログラム変換部２Ａへ送出する。ここで、制御フロー解析とは、中間プログラムの制御の流れを解析して中間プログラムを基本ブロックに分割することであり、データフロー解析とは、変数の生存区間、定義箇所および参照箇所を解析することである。
【００６７】
変数の定義および参照は以下のように定められる。中間コードにおいて変数が保持する値が更新される場合に、その中間コードにおいて変数が定義されるといい、その中間コードを変数の定義箇所と呼ぶ。また、中間コードにおいて変数が保持する値が使われる場合、その変数は、その中間コードで参照されるといい、その中間コードを変数の参照箇所と呼ぶ。
【００６８】
次に、プログラム変換部２Ａについて説明する。プログラム変換部２Ａは、変数情報算出部２ａ,実行経路中間コード生成部２ｂ,判定中間コード生成部２ｃ,保証中間コード生成部２ｄ,および分岐中間コード生成部２ｅを備える。
【００６９】
プログラム変換部２Ａは、装置外からホットパス情報Ｆ２が入力されるとプログラム変換部２Ａの内部に格納し、ホットパスＨＰを含むサブルーチンプログラムについてプログラム変換を行う（実行経路指定）。
【００７０】
ここで、ホットパス情報Ｆ２は、ユーザによって予め定められた実行経路を表す情報がホットパス情報Ｆ２としてユーザによって入力される。なお、本実施の形態の説明において、ホットパスＨＰを含むサブルーチンプログラムを部分プログラムと呼び、部分プログラムはホットパスＨＰの始点と終点とを共通とする複数の実行経路を含む。また本実施の形態の説明において、部分プログラムに対応する中間コード列を部分中間コード列と呼ぶ。
【００７１】
変数情報算出部２ａは、最適化部２から送出された解析結果に基づき各基本ブロックにおける変数の生存情報および定義情報を算出し、算出した生存情報、定義情報,およびホットパス情報Ｆ２に基づいてパス入力変数Ｘ１,パス出力変数Ｘ２,パス置換対象変数Ｘ３,およびパス保証変数Ｘ４（例えば図９Ｂ参照）を算出する（図２ステップｎ１４参照）。また、変数情報算出部２ａは、算出したパス置換対象変数Ｘ３を実行経路中間コード生成部２ｂへ送出し、パス保証変数Ｘ４を保証中間コード生成部２ｄへ送出する。
【００７２】
ここで、変数の生存情報は、制御フロー解析によって生成された各基本ブロックの始点である入口で生存している変数（以下「生存情報ＩＮ」という）と、各基本ブロックの終点である出口で生存している変数（以下「生存情報ＯＵＴ」という）とを示す。生存情報ＩＮは、基本ブロックの入口以降で定義される前に参照される変数であり、生存情報ＯＵＴは基本ブロックの出口以降で定義される前に参照される変数である。また、変数の定義情報（以下「定義情報ＤＥＦ」という）は各基本ブロックにおいて定義されている変数を示す。なお、変数の生存については前述した非特許文献２に記載されているものと同様である。
【００７３】
パス入力変数Ｘ１はホットパスＨＰの入口において生存している変数であってホットパスＨＰの始点となる基本ブロックにおける生存情報ＩＮを示す。パス出力変数Ｘ２はホットパスＨＰの出口において生存している変数であって、ホットパスＨＰの終点となる基本ブロックにおける生存情報ＯＵＴを示す。
【００７４】
パス置換対象変数Ｘ３は、パス入力変数Ｘ１でありかつホットパスＨＰ上で定義されている変数を示し、パス保証変数Ｘ４は、パス置換対象変数Ｘ３でありかつパス出力変数Ｘ２である変数を示す。
【００７５】
実行経路中間コード生成部（第１の実行経路コード生成器）２ｂは、プログラム変換部２Ａに格納されたホットパス情報Ｆ２と、コンパイラ装置Ａ内に格納された中間プログラムとを読み出し、中間プログラムのホットパスＨＰ上の中間コード列について、変数情報算出部２ａから送出されたパス置換対象変数Ｘ３の識別子を置き換えた実行経路中間コード列を生成し、生成した実行経路中間コード列を判定中間コード生成部２ｃへ送出する（図２ステップｎ１５、図４参照）。
【００７６】
ここで、パス置換対象変数Ｘ３の識別子の置換について説明する。実行経路中間コード生成部２ｂは、パス置換対象変数Ｘ３の識別子を、変数の識別子等の情報を表した変数名表には存在しない識別子に置き換え、変数の置き換えと同時にパス置換対象変数Ｘ３と置換した変数のペアを生成して、生成した変数のペアをプログラム変換部２Ａ内部に格納する。変数名表は、字句解析の際にプログラム上で宣言されている変数の識別子と変数の型等の情報とを集めたものであり、コンパイラ装置Ａ内に格納される。なお、パス置換対象変数Ｘ３の識別子の置き換えについては、図１０のｔ１〜ｔ３が参照される。また、置換した変数のペアについては、図９Ｃ、図４ステップｎ４８が参照される。
【００７７】
判定中間コード生成部（部分コード生成器）２ｃは、実行経路中間コード生成部２ｂから送出された実行経路中間コード列に含まれる条件分岐中間コード中の判定中間コードを、ホットパスＨＰが実行されない条件となるように設定したうえで、変換後の実行経路中間コード列をプログラム変換部２Ａの内部に格納する。なお、ホットパスＨＰが実行されない条件となるように設定する際には、図１１に示すＳ２０２,Ｓ２０３からＢ１への移行が参照される。
【００７８】
保証中間コード生成部（保証コード生成器）２ｄは、変数情報算出部２ａから送出されたパス保証変数Ｘ４に基づいて、パス保証変数Ｘ４の識別子を元の識別子に復元する中間コードの列である保証中間コード列を生成し、実行経路中間コード列の直後に配置し、プログラム変換部２Ａの内部に格納する（図１１のＳ３０１参照）。なお、ここで、実行経路中間コード列と保証中間コード列で構成される中間コード列を、高速化ブロックと呼ぶ（図１１のＨ１参照）。高速化ブロックＨ１は、条件分岐中間コードにおいて、高速化ブロックＨ１の途中から高速化ブロックＨ１の外側に向けた分岐は存在するものの、高速化ブロックＨ１の中へ分岐することはないという特徴を有する。
【００７９】
分岐中間コード生成部（第１の分岐コード生成器）２ｅは、プログラム変換部２Ａの実行経路中間コード列に含まれる条件分岐中間コードを読み出し、当該条件分岐中間コードの判定中間コードの条件が真である場合に、当該条件分岐中間コードの分岐中間コードを、部分中間コードの始点に分岐する分岐中間コードとして設定するとともに、当該実行経路中間コード列をプログラム変換部２Ａの内部に格納する。また、分岐中間コード生成部２ｅは、コンパイラ装置Ａ内に格納されている部分中間コード列をサブルーチン化する。すなわち、当該部分中間コード列の終点に、部分中間コード列の終点の直後の中間コードへ分岐する分岐中間コードを挿入する。さらに、分岐中間コード生成部２ｅは、プログラム変換部２Ａの内部に格納されている高速化ブロックＨ１を、部分中間コード列の始点の直前の中間コードの直後と、部分中間コードの終点の直後の中間コードの直前との間に配置し、このように加工したもの（部分中間コード列）をコンパイラ装置Ａ内に格納する。なお、これについては、図１１のプログラム構成を参照することができる。部分中間コードの始点へ分岐することについては、図１１のプログラム構成におけるｇｏｔｏ Ｓ１を参照することができる。また、部分中間コード列の終点の直後の中間コードへ分岐する分岐中間コードを挿入することについては、図１１のプログラム構成におけるＳ１５１を参照することができる。
【００８０】
次に、中間コードスケジューリング部２Ｂについて説明する。中間コードスケジューリング部２Ｂは、コンパイラ装置Ａ内に格納されている中間プログラムを読み出し、中間コード命令間の実行順番を決定するように中間コード依存解析部２ｆにて依存解析を行い、さらに、中間プログラムの中間コードを、並列実行可能となるように中間コード並列化部２ｇにて並べ換える。なお、依存解析については図１２を参照することができる。また、中間コードの並べ換えについては図１１の高速化ブロックＨ１から図１３の高速化ブロックＨ１への変化を参照することができる。
【００８１】
ここでは特に、本発明に関係する高速化ブロックＨ１に対する中間コード依存解析部２ｆと中間コード並列化部２ｇとの処理について述べる。その他の部分に関しては非特許文献１に記載されている方法と同様である。
【００８２】
中間コード依存解析部（第１の依存解析器）２ｆは、高速化ブロックＨ１中の中間コード列における中間コード間の依存関係を解析し、解析結果である依存解析情報を中間コード並列化部２ｇへ送出する。なお、本発明では、上記解析等に基づいて中間コード間に特定の依存関係を設定することを依存の生成という。ここで、中間コード依存解析部２ｆは、通常の演算子に対しては、非特許文献１に記載されているものと同様の依存を生成させるが、一部の中間コードに関しては特別な依存を生成させる。以下、説明する。
【００８３】
まず、第一に、中間コード依存解析部２ｆは、高速化ブロックＨ１中の保証中間コードの実行に先だって、高速化ブロックＨ１中の分岐条件中間コードが実行されるように、分岐条件中間コードから保証中間コードへの依存を生成する。なお、これについては、図１２において、Ｓ３０１より上位にＳ２０２，Ｓ２０３を置くことを参照することができる。
【００８４】
第二に、中間コード依存解析部２ｆは、例外を引き起こす可能性のある中間コードである例外発生中間コードと例外の発生原因となる例外発生変数とを特定する。さらに中間コード依存解析部２ｆは、特定した例外発生変数を参照して判定を行う判定中間コードが、例外発生中間コードより先に実行されるか否かを判定し、判定中間コードが、例外発生中間コードより先に実行されると判定する場合には、その実行順番を保つべく、判定中間コードから例外発生中間コードへの依存を生成する。なお、これについては、図１２において、Ｓ１０２より上位にＳ２０３を置くことを参照することができる。また、例外を引き起こすとは、Ｓ１０２の代入文がＳ２０３より先行して実行される場合において除数ｆが０になること（ゼロ割算）により、例外、すなわち、処理不可能な状態が発生することをいう。
【００８５】
中間コード並列化部（並列化器）２ｇは、中間コード依存解析部２ｆから送出される依存解析情報を基にして、高速化ブロックＨ１中の中間コード列をスケジューリングして並列化する（図１３参照）。ここで、スケジューリング方法としては、非特許文献１に記載されているリストスケジューリング法が適用可能である。
【００８６】
資源割付部３は、生成された全中間コードを読み出し、中間コードから実行コードを生成する際に、全中間コードにおける変数の生存情報に基づいて各変数に、レジスタ,メモリなどのハードウェア資源を割当てる。実行コード生成部４は、資源割付が行われた全中間コードについて、機械語である実行コードに変換し、コンパイラ装置外に出力する。
【００８７】
＜データ＞
本実施の形態のコンパイラ装置Ａで用いるデータについて説明する。図９Ａは、変数情報算出部２ａが、図５Ｂに示す制御フローグラフの基本ブロック毎に、変数の生存情報であるＩＮ１２,ＯＵＴ１４と、定義情報であるＤＥＦ１３とを算出した結果を示す。図９Ｂは、変数情報算出部２ａが図９Ａの算出結果に基づいて、パス入力変数Ｘ１,パス出力変数Ｘ２,パス置換対象変数Ｘ３,およびパス保証変数Ｘ４を算出した結果を示す。図９Ｃは、実行経路中間コード生成部２ｂが図５Ｂに示す制御フローグラフの各基本ブロックにおいて、パス置換対象変数Ｘ３と置き換えた変数のペアの生成履歴を示す。図１０に示す制御フローグラフは、実行経路中間コード生成部２ｂが、図５ＢのホットパスＨＰの中間コードを複写し複写した中間コードについて変数置換処理を行うことで新たに生成する実行経路を示す。
【００８８】
＜動作＞
次に、本発明の特徴部分である最適化部２の内部の動作を中心に、図２に示す動作フローを説明する。まず、構文解析部１は、ソースプログラムＦ１が入力されると構文解析を行い、中間プログラムを生成し、コンパイラ装置Ａの内部に格納する（ステップｎ１１）。
【００８９】
次に、プログラム変換部２Ａは、ホットパス情報Ｆ２（図１）が入力されると、ホットパス情報Ｆ２をプログラム変換部２Ａの内部に格納する（ステップｎ１２）。
【００９０】
ステップｎ１２に続いて最適化部２は、中間プログラムを読み出したうえで、読み出した中間プログラムにおける制御フロー解析とデータフロー解析とを実施し、その解析結果を変数情報算出部２ａへ送出する。変数情報算出部２ａは、最適化部２による解析結果に基づいて部分プログラムの各基本ブロックにおける変数の生存情報（ＩＮ,ＯＵＴ）と定義情報（ＤＥＦ）とを算出する（ステップｎ１３）。
【００９１】
次に、変数情報算出部２ａはステップｎ１３で算出された生存情報（ＩＮ，ＯＵＴ）,定義情報ＤＥＦ,およびステップｎ１２において入力されたホットパス情報Ｆ２に基づいて、部分中間コード列のパス入力変数Ｘ１,パス出力変数Ｘ２,パス置換対象変数Ｘ３,およびパス保証変数Ｘ４を算出する。変数情報算出部２ａは、実行経路中間コード生成部２ｂへパス置換対象変数Ｘ３を送出し、保証中間コード生成部２ｄへパス保証変数Ｘ４を送出する（ステップｎ１４）。
【００９２】
ステップｎ１４に続いて、実行経路中間コード生成部２ｂは、ホットパス情報Ｆ２と部分中間コード列とを読み出したうえで、読み出した部分中間コード列におけるホットパスＨＰに対応する中間コード列を複製する。さらに実行経路中間コード生成部２ｂは、複製した中間コード列において、パス置換対象変数Ｘ３の識別子を置き換えた実行経路中間コード列を生成し、生成した実行経路中間コード列を判定中間コード生成部２ｃへ送出する（ステップｎ１５）。なお、これについては図１０のプログラムを参照することができる。パス置換対象変数Ｘ３の識別子の置き換えとは、ｃ→ｔ１,ｃ→ｔ２,ｄ→ｔ３に相当する。
【００９３】
次に、判定中間コード生成部２ｃは、実行経路中間コード列を受け取ると、実行経路中間コード列に含まれる条件分岐中間コード中の判定中間コードを、ホットパスＨＰが実行されない条件となるような判定中間コードに設定し、設定した判定中間コードをプログラム変換部２Ａの内部に格納する（ステップｎ１６）。
【００９４】
ここで、条件分岐中間コード中の判定中間コードとは、図１０のプログラムにおける、
Ｓ３２：Ｉｆ（ｔ１＞０）ｇｏｔｏ Ｓ４
Ｓ９２：Ｉｆ（ｆ＞０）ｇｏｔｏ Ｓ１０
に相当する。
【００９５】
ホットパスＨＰが実行されない条件となるような判定中間コードに設定するとは、図１１のプログラムにおける、
Ｓ２０２：Ｉｆ（ｔ１＜＝０）ｇｏｔｏ Ｓ１
Ｓ２０３：Ｉｆ（ｆ＜＝０）ｇｏｔｏ Ｓ１
に相当する。
【００９６】
ここでは、判定条件の論理を反転させることにより、その行き先を下流からサブルーチンの部分中間コード列の先頭Ｓ１に変更している。その結果として、論理反転後の判定条件が肯定的となるときには、ホットパスＨＰが実行されないことになる。
【００９７】
次に、保証中間コード生成部２ｄは、変数情報算出部２ａから受け取ったパス保証変数Ｘ４を復元する保証中間コード列を生成し、プログラム変換部２Ａの内部に格納する。さらに、保証中間コード生成部２ｄは、保証中間コード列を実行経路中間コード列の後に配置し、高速化ブロックを構築し、プログラム変換部２Ａの内部に格納する（ステップｎ１７）。これについては、図１１のプログラムおいて基本ブロックＢ１０３（Ｓ３０１：ｃ＝ｔ２）を生成したうえで、生成した基本ブロックＢ１０３を基本ブロックＢ１０４の後ろに配置することで、高速化ブロックＨ１を構築することに相当する。
【００９８】
ステップｎ１７に続いて、分岐中間コード生成部２ｅは、ステップｎ１６で格納された実行経路中間コード列中の条件分岐中間コードを読み出し、当該条件分岐中間コード中の分岐中間コードを部分中間コードの始点から実行するように設定し、そのように設定した条件分岐中間コードをプログラム変換部２Ａの内部に格納する。さらに、分岐中間コード生成部２ｅは、部分中間コード列をサブルーチン化し、結果をコンパイラ装置Ａ内に格納する（ステップｎ１８）。
【００９９】
これについては、図１１のプログラムにおいて、条件分岐中間コードＳ２０２と条件分岐中間コードＳ２０３とのそれぞれの分岐中間コードを、部分プログラムの始点であるブロックＢ１の中間コードＳ１に分岐することが対応する。実行経路中間コード列は図１１の左側の列に相当し、サブルーチン化された部分中間コードは図１１の右側の列に相当する。
【０１００】
ステップｎ１８に続いて最適化部２は、コンパイラ装置Ａ内に格納されている中間プログラムの冗長削除処理を行う。最適化部２は、冗長削除処理を行った後の中間プログラムをコンパイラ装置Ａ内に格納する（ステップｎ１９）。ここで、冗長削除処理は、前述の非特許文献に記載されているものと同様であって例えば無駄な演算を削除する処理などが例に挙げられる。
【０１０１】
ステップｎ１９に続いて、中間コード依存解析部２ｆは、コンパイラ装置Ａ内に格納されている中間プログラム中の中間コードの依存解析を行い（図１２参照）、その解析結果である依存解析情報を中間コード並列化部２ｇに送出する。中間コード依存解析部２ｆは、特に高速化ブロックＨ１に、前述の例外発生中間コードを考慮した依存解析を行う（ステップｎ２０）。
【０１０２】
ステップｎ２０に続いて、中間コード並列化部２ｇは、中間コード依存解析部２ｆから受け取った依存解析情報に基づいて、コンパイラ装置Ａ内に格納されている中間プログラムを並列化する（ステップｎ２１：図１３参照）。
【０１０３】
＜変数情報算出処理＞
次に、変数情報算出処理について図３を参照して説明する。これは、図２のステップｎ１３,ｎ１４に相当する。ステップｎ３１において、最適化部２は部分中間コードの制御フロー解析およびデータフロー解析を行う。次いでステップｎ３２において、変数情報算出部２ａは、制御フロー解析およびデータフロー解析の結果に基づいて部分プログラムの変数の生存情報（ＩＮ，ＯＵＴ）、定義情報（ＤＥＦ）を算出する。
【０１０４】
続いて、変数情報算出部２ａは、ステップｎ３２において算出された生存情報ＩＮのうちホットパスＨＰの始点となる基本ブロックにおける生存情報ＩＮをパス入力変数Ｘ１として算定し、ステップｎ３２において算定された生存情報ＯＵＴのうち、ホットパスＨＰの終点となる基本ブロックにおける生存情報ＯＵＴをパス出力変数Ｘ２として算定する（ステップｎ３３）。
【０１０５】
ステップｎ３３に続いて、変数情報算出部２ａは、ホットパスＨＰにおける定義情報ＤＥＦでありかつパス入力変数Ｘ１である変数を、パス置換対象変数Ｘ３として算定する（ステップｎ３４）。
【０１０６】
続いて、変数情報算出部２ａはステップｎ３４で算定したパス置換対象変数Ｘ３でありかつパス出力変数Ｘ２である変数をパス保証変数Ｘ４として算定し、実行経路中間コード生成部２ｂへパス保証変数Ｘ４およびパス置換対象変数Ｘ３を送出する（ステップｎ３５）。
【０１０７】
＜変数置換処理＞
実行経路中間コード生成部２ｂは、変数情報算出部２ａから送出されたパス置換対象変数Ｘ３のデータを受け取ると、部分中間コードとホットパス情報Ｆ２とを読み出し、部分中間コードのホットパスＨＰに対応する中間コードを複製し、複製した中間コードのパス置換対象変数Ｘ３に変数置換処理を繰り返し実施する。以上の処理を行うことで、実行経路中間コード生成部２ｂは、パス置換対象変数Ｘ３と、変数置換処理により得られる置換後変数とのペア（以下「変数のペア」という）を生成する。これは、図２のステップｎ１５に対応する。
【０１０８】
以下、図４を参照して実行経路中間コード生成部２ｂが行う変数置換処理について説明する。複製した中間コードについて繰り返し変数置換処理を行う（ステップｎ４１）。中間コードでパス置換対象変数Ｘ３が参照されているか否かを判断する（ステップｎ４２）。ステップｎ４２で参照されていないと判断する場合はステップｎ４５へ進む。
【０１０９】
ステップｎ４２で参照されていると判断する場合は、既に生成された変数のペアに当該パス置換対象変数Ｘ３が含まれているか否かを判断する（ステップｎ４３）。ステップｎ４３で、含まれていないと判断する場合はステップｎ４５へ進む。
【０１１０】
ステップｎ４３で、含まれていると判断する場合、当該命令文で参照されているパス置換対象変数Ｘ３の識別子をペアに含まれている変数に置き換えたうえで（ステップｎ４４）、ステップｎ４５へ進む。
【０１１１】
以上の処理（ステップｎ４２−ステップｎ４４）を実施したのち、中間コードでパス置換対象変数Ｘ３が定義されているか否かを判断する（ステップｎ４５）。ステップｎ４５で、定義されていないと判断する場合は、ループｎ４１−ｎ４９を抜ける。ステップｎ４５で、定義されていると判断する場合は、既存の変数のペアに当該パス置換対象変数Ｘ３が含まれているか否かを判断する（ステップｎ４６）。ステップｎ４６で含まれていると判断する場合は、当該パス置換対象変数Ｘ３のペアを削除したうえで（ステップｎ４７）、ステップｎ４８へ進む。ステップｎ４６で、含まれていないと判断する場合は、ステップｎ４７を実施することなくステップｎ４８へ進む。
【０１１２】
ステップｎ４８では、定義されているパス置換対象変数Ｘ３を置き換える変数を定めたうえで、定義されているパス置換対象変数Ｘ３を定めた変数に置き換える。そして、当該パス置換対象変数Ｘ３と置き換えた変数とのペアを新たに生成する。以上の処理を行ったのち、ループｎ４１−ｎ４９を抜ける。
【０１１３】
＜動作例＞
次に、図５ＡのソースプログラムＦ１の一部である部分プログラムを例にして、図２に示す動作フローの具体的な動作例を、図５,図９〜図１２を参照して説明する。なお、この例における中間コードは、ソースプログラムＦ１に近い中間コードで表したものとする。
【０１１４】
ステップｎ１１において、構文解析部１は、部分プログラムを構文解析することで、部分中間コードを生成してコンパイラ装置Ａの内部に格納する。次に、ステップｎ１２において、プログラム変換部２Ａは、制御フローグラフ（図５Ｂ参照）の基本ブロックＢ１,Ｂ２,Ｂ４,Ｂ５,Ｂ７の順に遷移する経路ＨＰをホットパスとするホットパス情報Ｆ２が入力されると、当該ホットパス情報Ｆ２をプログラム変換部２Ａ内に格納する。
【０１１５】
ステップｎ１３において、最適化部２は、制御フロー解析とデータフロー解析とを行い、変数情報算出部２ａは、制御フローグラフ（図５Ｂ参照）の基本ブロックＢ１〜Ｂ７における生存情報ＩＮ,生存情報ＯＵＴ,および定義情報ＤＥＦを算出する（図９Ａ）。例えば、基本ブロックＢ１（図５Ｂ参照）の生存情報ＩＮは、図９ＡのブロックＢ１のＩＮ１２に含まれる変数であり、同ブロックの生存情報ＯＵＴは同図のブロックＢ１のＯＵＴ１４に含まれる変数である。また、同基本ブロックにおける定義情報は同図の基本ブロックＢ１のＤＥＦ１３に含まれている変数である。
【０１１６】
次に、ステップｎ１４において、変数情報算出部２ａは、図９Ａに示す生存情報および定義情報と、ステップｎ１２で入力されたホットパス情報Ｆ２とに基づいてパス入力変数Ｘ１,パス出力変数Ｘ２,パス置換対象変数Ｘ３,およびパス保証変数Ｘ４を算出する（図９Ｂ参照）。
【０１１７】
パス入力変数Ｘ１は、ホットパスＨＰの入口で生存する変数、すなわち基本ブロックＢ１（図５Ｂ参照）の生存情報ＩＮであり、図９ＡのブロックＢ１のＩＮ１２に含まれている変数である。パス出力変数Ｘ２は、ホットパスＨＰの出口で生存する変数、すなわち基本ブロックＢ７（図５Ｂ参照）の生存情報ＯＵＴであり、図９Ａに示すブロックＢ７のＯＵＴ１４に含まれる変数である。パス置換対象変数Ｘ３は、パス入力変数Ｘ１と、ホットパスＨＰ上の基本ブロックＢ１,Ｂ２,Ｂ４,Ｂ５,Ｂ７におけるＤＥＦ１３（図９Ａ参照）に含まれる変数とを含む。パス保証変数Ｘ４は、パス出力変数Ｘ２とパス置換対象変数Ｘ３とに含まれる変数である。
【０１１８】
この例では、図９Ａに示すＤＥＦ１３に含まれる変数が｛ａ,ｃ,ｄ,ｆ,ｘ｝であり、パス入力変数Ｘ１が｛ｂ,ｃ,ｄ,ｅ,ｇ,ｚ,ｗ,ｙ｝であるので、その積集合｛ｃ,ｄ｝がパス置換対象変数Ｘ３となり、パス出力変数Ｘ２が｛ａ,ｃ，ｅ,ｆ,ｚ,ｗ,ｘ,ｙ｝であるので、｛ｃ｝がパス保証変数Ｘ４となる。変数情報算出部２ａは、算出したパス置換対象変数Ｘ３を実行経路中間コード生成部２ｂへ送出し、また算出したパス保証変数Ｘ４を保証中間コード生成部２ｄへ送出する。
【０１１９】
次に、ステップｎ１５において、実行経路中間コード生成部２ｂは、部分中間コードとホットパス情報Ｆ２とを読み出し、図５のホットパスＨＰ上の中間コードＳ１〜Ｓ１５を複製し、複製した中間コードを含む新たな基本ブロックＢ１２〜Ｂ１５２を生成する。そして、複製した中間コードのパス置換対象変数Ｘ３の変数置換処理を行って、変数のペアを生成する。複製した中間コードに変数置換処理を行うことで新たに生成される実行経路を図１０に示す。
【０１２０】
ここで、図１０の基本ブロックＢ１２,Ｂ２２を例に変数置換処理（図４）の動作を説明する。まず、変数置換処理前の基本ブロックＢ１２に含まれる複製した中間コードは、図５Ｂに示す基本ブロックＢ１に含まれる中間コードと同じである。基本ブロックＢ１２において複製された中間コードＳ１２では、パス置換対象変数Ｘ３（＝ｃ）は参照されている（図４のステップｎ４２：ＹＥＳ）が、変数ｃのペアが存在していない。すなわち、この段階ではまだ変数ｃのペアは生成されておらずステップｎ４３の判断はＮＯとなる（生成されるのはステップｎ４８）。したがって、実行経路中間コード生成部２ｂは、中間コードＳ１２の変数ｃの変数置換処理を行わない。
【０１２１】
また中間コードＳ１２ではパス置換対象変数Ｘ３を“ｃ”に定義されておらず、ここで定義されているのは“ａ”であってステップｎ４５の判断はＮＯである。そのため、次に複製する中間コードＳ２２における変数に注目する。実行経路中間コード生成部２ｂは、変数の置き換え前の中間コードＳ２２において、パス置換対象変数Ｘ３（＝ｃ）が定義されており（ステップｎ４５でＹＥＳ）、変数ｃのペアが存在しないと判断する（図４ステップｎ４６：ＮＯ）。以上の判断に基づいて実行経路中間コード生成部２ｂは、定義箇所の変数ｃの識別子を変数名表および変数のペアで使われていないｔ１に置き換えて、新たに変数のペア（ｃ,ｔ１）を生成する（ステップｎ４８）。
【０１２２】
次に中間コードＳ３２ではパス置換対象変数の参照も定義も存在しないので実行経路中間コード生成部２ｂは、変数置換処理は行うことなく次の基本ブロックＢ２２の実行文Ｓ４２に注目する。なお、基本ブロックＢ１２への変数置換処理を行った後のペアの生成状態は、図９ＣのＢ１２の行の置換変数ペアの生成履歴５０に示すとおりである。
【０１２３】
引き続き、実行経路中間コード生成部２ｂは、変数の置き換え前の命令文Ｓ４２において、パス置換対象変数Ｘ３（＝ｃ）が参照されており（ステップｎ４２でＹＥＳ）、図９ＣのＢ１２に示すように変数ｃのペア（ｃ,ｔ１）が存在しているため、参照箇所の変数ｃの識別子をｔ１に置き換える。次に、実行経路中間コード生成部２ｂは、中間コードＳ４２ではパス置換対象変数Ｘ３（＝ｃ）が定義もされており（ステップｎ４５でＹＥＳ）、変数ｃのペア（ｃ,ｔ１）が存在すると判断すると（ステップｎ４６でＹＥＳ）、ペア（ｃ,ｔ１）を削除したうえで（ステップｎ４７）、定義箇所の変数ｃの識別子を、変数名表および変数のペアで使われていないｔ２に置き換えることで、新たに変数のペア（ｃ,ｔ２）を生成する（ステップｎ４８）。
【０１２４】
この例において、実行経路中間コード生成部２ｂが、基本ブロックＢ７２の中間コードＳ１５２まで変数置換処理を繰り返し、生成された変数のペアの履歴５０を図９Ｃに示す。
【０１２５】
実行経路中間コード生成部２ｂは、図９Ｃに示すブロックＢ７２の変数ペア（ｃ,ｔ２）および（ｄ,ｔ３）を保証中間コード生成部２ｄへ送出し、図１０に示す実行経路中間コードの中間コードＳ１２〜中間コードＳ１５２を判定中間コード生成部２ｃへ送出する。
【０１２６】
次に、ステップｎ１６において、判定中間コード生成部２ｃは、受け取った中間コード中の条件分岐中間コードＳ３２（図１０のｉｆ（ｔ１＞０）ｇｏｔｏ Ｓ４）と条件分岐中間コードＳ９２（図１０のｉｆ（ｆ＞０）ｇｏｔｏ Ｓ１０）との判定条件を論理反転させることで、条件分岐中間コードＳ２０２（図１１のｉｆ（ｔ１＜＝０）ｇｏｔｏ Ｓ１）と条件分岐中間コードＳ２０３（図１１のｉｆ（ｆ＜＝０）ｇｏｔｏ Ｓ１）との判定中間コードを、ホットパスＨＰが実行されない条件を満たすように設定する。これにより基本ブロックＢ１０４が生成される。判定中間コード生成部２ｃは、このようにして作成した基本ブロックＢ１０４をプログラム変換部２Ａ内に格納する。
【０１２７】
次に、ステップｎ１７において、保証中間コード生成部２ｄは、変数情報算出部２ａから送出されたパス保証変数Ｘ４｛ｃ｝と変数のペア（ｃ,ｔ２）とに基づいて、識別子ｔ２を、変数ｃを示す識別子に戻す保証中間コードの中間コードＳ３０１を生成し、中間コードＳ３０１を含む基本ブロックＢ１０３を生成する（図１１）。また、保証中間コード生成部２ｄは、プログラム変換部２Ａ内の基本ブロックＢ１０４の直後に基本ブロックＢ１０３を配置する。ここで、高速化ブロックＨ１は、基本ブロックＢ１０４と基本ブロックＢ１０３とで構成されることになる（図１１のＨ１）。
【０１２８】
次に、ステップｎ１８において、分岐中間コード生成部２ｅは、基本ブロックＢ１０４を読み出し、条件分岐中間コードＳ２０２と条件分岐中間コードＳ２０３とのそれぞれの分岐中間コードを、部分プログラムの始点であるブロックＢ１の中間コードＳ１に分岐する分岐中間コードに設定したうえで、設定した分岐中間コードをプログラム変換部２Ａ内に格納する。
【０１２９】
また、分岐中間コード生成部２ｅは、部分中間コードの中間コードＳ１５から中間コードＳ１６に分岐する分岐中間コードＳ１５１を生成したうえで、生成した分岐中間コードＳ１５１を命令文Ｓ１５の直後（図１１のＳ１５１）に配置してコンパイラ装置Ａ内に格納する。さらに、分岐中間コード生成部２ｅは、図１１のプログラムに示すように中間コードＳ０の直後に基本ブロックＢ１０４を配置し、中間コードＳ１６の直前に基本ブロックＢ１０３を配置する。
【０１３０】
次に、ステップｎ１９において、最適化部２は、図１１の中間プログラムに冗長削除処理を行う。なお、ステップｎ１９の処理は本発明の主眼ではないので省略し、図１１自体が当該ステップを行った後の中間プログラムであるとして以降の説明を行う。
【０１３１】
次に、ステップｎ２０において、中間コード依存解析部２ｆは、図１１の高速化ブロックＨ１に、図１２に示す依存解析を行う。中間コード依存解析部２ｆは、分岐条件中間コードＳ２０２および分岐条件中間コードＳ２０３が保証中間コードＳ３０１より先に実行されるように、分岐条件中間コードＳ２０２および分岐条件中間コードＳ２０３から保証中間コードＳ３０１への依存を生成する。また、図１２において中間コード依存解析部２ｆは、例外を引き起こす例外発生中間コードＳ１０２と例外の発生原因となる例外発生変数ｆとを特定し（分母が０の除算は不可）、例外発生変数ｆに対応する判定中間コードＳ２０３が例外発生中間コードＳ１０２より先に実行されるように、判定中間コードＳ２０３から例外発生中間コードＳ１０２への依存を生成する。
【０１３２】
ここで例外が発生する場合について述べる。もし、中間コードＳ１０２が判定中間コードＳ２０３より先に実行され、かつ、変数ｆの値がゼロである場合は、中間コードＳ１０２においてゼロ割算が発生するため、プロセッサまたはオペレーティングシステムにおいて例外が発生する。なお、それ以外の例外事象としては次のようなものがある。すなわち、変数ｆがＣ言語におけるポインタ変数であり、かつ、中間コードＳ１０２によって変数ｆの間接参照が発生すると仮定する。このとき、同様にもし、中間コードＳ１０２が判定中間コードＳ２０３より先に実行され、かつ、未実装のアドレスやアクセスが禁止されているようなメモリのアドレスを変数ｆが保持している状態である。このような状態においても、プロセッサまたはオペレーティングシステムにおいて例外が発生する。
【０１３３】
次のステップｎ２１において、中間コード並列化部２ｇは、図１３に示すように、中間コード依存解析部２ｆから送出された依存解析情報（図１２参照）から中間コード列をスケジューリングして並列化する。図１３は図１２の依存の深さ優先でリストスケジューリング法を適用したプログラムである。なお、“／／”の表記は、この表記に後続する命令文が並列に実行されることを示す。
【０１３４】
＜変形例１＞（例外発生許容：図１４〜図１７参照）
上述した実施の形態では、中間コード依存解析部２ｆが不正に例外が発生しないように、図１２において判定中間コードＳ２０３から例外発生中間コードＳ１０２へ依存を生成したが、変形例１では、このような依存の生成は行われない。すなわち、実行経路中間コード生成部２ｂは、図１４のプログラムに示すように中間コードＳ４０１を新規に生成したうえで、図１５のプログラムに示すように中間コードＳ４０１から例外発生中間コードＳ１０２への依存を生成する。
【０１３５】
つまり、実行経路中間コード生成部２ｂは、
・割り込みルーチンから復帰する際の復帰先アドレスを保持する特別な変数である復帰先保持変数を生成し、
・復帰先保持変数へ復帰先アドレスを格納させる中間コードである復帰用途中間コードを生成し（戻り場所設定命令コード生成器）、
これら生成した変数とコードとを実行経路中間コード列の先頭に挿入する。
【０１３６】
また、中間コード依存解析部２ｆは、上述の例外発生変数に関連した判定中間コードと例外発生中間コードとの間の依存を生成しないようにしたうえで、復帰用途中間コードから例外発生中間コードへの依存を生成する（第２の依存解析器）。
【０１３７】
以下、上記の処理について、図１４〜図１７を参照してさらに具体的に説明する。まず、ステップｎ１５において実行経路中間コード生成部２ｂは、図１４の中間コードＳ４０１に示すように、復帰先保持変数ＲＡを生成し、かつ変数ＲＡへ復帰先アドレスＳ１を格納させる復帰用途中間コードＳ４０１を実行経路中間コード列の先頭に挿入する。
【０１３８】
次にステップｎ２０において、中間コード依存解析部２ｆは、復帰用途中間コードＳ４０１から例外発生中間コードＳ１０２への依存を生成する。このとき、中間コード依存解析部２ｆは、図１５に示すように、例外発生変数ｆに関係した判定中間コードＳ２０３と例外発生中間コードＳ１０２との間での依存を生成しない。
【０１３９】
図１６は図１５の依存解析情報を利用して、中間コード並列化部２ｇがスケジューリングを行った結果を示す。図中、例外発生中間コードＳ１０２が、判定中間コードＳ２０３より先に実行されるようにスケジューリングされている。
【０１４０】
図１７は、例外発生中間コードＳ１０２で例外が発生した際のコンピュータシステム上での実行動作を示す図である。まず、一連の割り込み処理に加えて、割り込みの種類を判定したうえで、復帰先保持変数に保持されているアドレスへ分岐する割り込みルーチンを予めコンピュータシステムに用意しておく（割り込み発生時処理ルーチン付加器）。そして、例外発生中間コードＳ１０２において例外が発生した際には、プロセッサまたはオペレーティングシステムにより割り込み処理ルーチンに制御が遷移し（図１７の点線Ａ１参照）、割り込み処理ルーチンから復帰先保持変数ＲＡに保持されているアドレスＳ１へと処理が分岐する（図１７の点線Ａ２参照）。なお、復帰先保持変数は資源割付部３にて、特定のメモリや特定のレジスタなどの記憶素子に割り付けられる。
【０１４１】
上述の図１６の高速化ブロックＨ２の例は、図１３の高速化ブロックＨ１と比較して実行ステップ数に変化がなく、とりわけ性能改善は見られない。しかしながら、一般に、
・例外発生の確率が低い、
・図１２のプログラム等によって生成される判定中間コードＳ２０３から例外発生中間コードＳ１０２への依存が生成される、
という条件の基では、高速化ブロックＨ１において更なる高速実行の障害が発生する場合がある。
【０１４２】
このような不具合に対して本変形例では、その高速実行の障害になり得る依存自体を取りやめることもできるので、高速化ブロックの更なる高速化を実現することができる。
【０１４３】
＜変形例２＞（定数伝播変形その１）
上述した実施の形態では、ホットパス情報Ｆ２（図１参照）は、ユーザによって予め定められた実行経路を表す情報の他に、ホットパスＨＰ中で参照される変数が保持する値の情報である変数保持情報をホットパス情報Ｆ２としてユーザによって入力されてもよい。変数保持情報中の変数の値は、変数が保持する可能性が高い値のことである。
【０１４４】
ホットパス情報Ｆ２中の変数保持情報を利用して、分岐中間コード生成部２ｅは、高速化ブロックＨ３中の変数の参照箇所を、変数保持情報が保持する値に置換し、かつ、変数の保持する値が、変数保持情報が保持する値と異なった場合に、部分中間コードの始点から実行するように条件分岐中間コード（定数値判定条件分岐中間コードと呼ぶ）を実行経路中間コード列の先頭に生成するようにしてもよい（第２の実行経路コード生成器）。
【０１４５】
以下、上記の場合の処理について、図１８〜図２０を参照して説明する。図１８は、ホットパス情報Ｆ２中の変数保持情報に変数ｂの値が「５」、変数ｅの値が「８」となっていた場合の分岐中間コード生成部２ｅでの処理結果を示す。図１８では、図１１において変数ｂと変数ｅの参照箇所とが、それぞれ値「５」,値「８」に置換されている。さらに、実行経路中間コード列の先頭に、変数ｂが保持する値が値「５」でなかった場合に、中間コードＳ１に分岐する定数値判定条件分岐中間コードＳ４１１が生成されている。また同様に変数ｅに対応して定数値判定条件分岐中間コードＳ４１２が生成されている。
【０１４６】
ステップｎ１８において、分岐中間コード生成部２ｅは、ホットパス情報Ｆ２中の変数保持情報を取り出して、高速化ブロックＨ３の変数の参照箇所を変数保持情報が保持する値で置換する。
【０１４７】
図１８は、変数保持情報中に変数ｂの値が「５」に、変数ｅの値が「８」にそれぞれなった状態を示す。図１１と比較すれば分かるとおり図１８では、変数ｂおよび変数ｅの参照箇所が、それぞれ値「５」,値「８」に置換されている。さらに、分岐中間コード生成部２ｅは、変数の保持する値が置換した値と異なる場合に、部分中間コードの始点から実行するように条件分岐中間コードを生成する。図１８においては、まず、分岐中間コード生成部２ｅは、変数ｂが保持する値が「５」でなかった場合に、中間コードＳ１に分岐する定数値判定条件分岐中間コードＳ４１１を実行経路中間コード列の先頭に生成する。また同様に変数ｅに対応して、分岐中間コード生成部２ｅは、定数値判定条件分岐中間コードＳ４１２を生成する。
【０１４８】
次のステップｎ１９において最適化部２は、図１８の中間プログラムに冗長性削除処理を行う。図１９は冗長性削除処理を行った結果を示す。定数伝播最適化の効果により、中間コードＳ５２１と中間コードＳ８２とが削除され、不要コード削除最適化により判定中間コード２０３が削除される。図２０はステップｎ２０,ステップｎ２１を実施した結果を示す。図１３と比較して実行ステップ数が１ステップ減少している。
【０１４９】
上述のように、ホットパスＨＰ中で参照される変数のうち、変数が保持する値が特定の値に偏っている場合に、更なる高速化ブロックの高速化を実現できる。
【０１５０】
＜変形例３＞（定数伝播変形その２）
上述した変形例２では、分岐中間コード生成部２ｅは、高速化ブロックＨ１に、定数値への置換処理と、定数値判定条件分岐中間コードの生成処理とを実施した。しかしながら分岐中間コード生成部２ｅは、高速化ブロックＨ１を複製したうえで、複製した高速化ブロックＨ１に、定数値への置換処理と定数値判定条件分岐中間コードの生成処理とを実施してもよい。さらに、分岐中間コード生成部２ｅは、複製前の高速化ブロックＨ１の始点の直前に、ラベルのみのダミーの中間コードを生成したうえで、定数値判定条件分岐中間コードの分岐先をダミーの中間コードにしてもよい。またさらに、複製前の高速化ブロックＨ１の終了点の直後に、部分中間コードの終了点の直後の中間コードへ分岐する分岐中間コードを挿入してもよい。
【０１５１】
以下、上記の場合の処理について、図２１〜図２２を参照して説明する。ステップｎ１８において、分岐中間コード生成部２ｅは、高速化ブロックＨ１を複製し、複製した高速化ブロックＨ１中の変数に定数値への置き換え処理を実施する。図２１では複製された高速化ブロックＨ４において、変数ｂ,変数ｅの参照箇所をそれぞれ定数値「５」,定数値「８」に変換している。
【０１５２】
さらに、分岐中間コード生成部２ｅは、複製前の高速化ブロックＨ１の前に、ラベルのみのダミーの中間コードを生成し、かつ複製前の高速化ブロックＨ１の後に部分中間コードの終了点の直後の中間コードへ分岐する分岐中間コードを生成する。図２１では、中間コードＳ５０１がラベルのみの中間コードであり、分岐中間コードＳ５０２が部分中間コードの終了点の直後の中間コードである中間コードＳ１６へ分岐する中間コードである（第２の分岐コード生成器）。
【０１５３】
また、分岐中間コード生成部２ｅは、複製した高速化ブロックＨ１中の定数値判定条件分岐中間コードの分岐先を、生成したダミーの中間コードに設定する（第３の実行経路コード生成器）。図２１では、定数値判定条件分岐中間コード４１３の分岐先を中間コードＳ５０１に設定し、同様に定数値判定条件分岐中間コード４１４の分岐先を中間コードＳ５０１に設定している。図２２は、ステップｎ１９,ステップｎ２０,およびステップｎ２１を実施した結果を示す。このようにプログラム変換することにより、変数が保持する値がホトパス情報Ｆ２に保持されている値と異なっている場合でも、部分中間コードに比べて高速化されている他の高速化ブロックへ実行制御が遷移されるので、ホットパスＨＰの高速実行が促進される。
【０１５４】
＜変形例４＞（部分中間コード列の途中箇所への分岐）
上述した＜動作例＞では、図１１の条件分岐中間コードＳ２０２,Ｓ２０３に示すように高速化ブロックＨ１から部分中間コード列の始点である中間コードＳ１に分岐するように分岐中間コードを設定した。しかしながら、部分中間コード列の途中箇所へ分岐するように高速化ブロックを構成することで、部分中間コード列の一部の実行を省略し、これによって部分プログラムの実行手順の短縮や部分中間コード列の削減を図ってもよい。
【０１５５】
さらに、部分中間コード列にも変換を施して、部分中間コード列中で制御が合流する基本ブロック、例えば図１１では基本ブロックＢ１,基本ブロックＢ４,および基本ブロックＢ７に存在する中間コードに対応する高速化ブロックＨ１中の中間コードを、条件分岐中間コードを跨って(超えて)移動できるようにしてもよい。以下ではさらに、本変換について詳細に説明する。
【０１５６】
図２３に示すように、図１のコンパイラ装置Ａの全体構成に合流ブロック定義置換部２ｈを追加する。合流ブロック定義置換部２ｈは、まず、ホットパスＨＰ上で制御が合流する基本ブロックである合流ブロックを算出する。正確にはホットパスＨＰの始点から終点に至る全ての経路に必ず含まれる基本ブロックが合流ブロックとなる（始点,終点を含む基本ブロックも合流ブロックである。）。
【０１５７】
次に合流ブロックで定義される変数が存在する場合、当該変数の定義箇所からホットパスＨＰの出口に至る全パス中に存在する当該変数の定義箇所と参照箇所とにおける識別子に次の処理を実施する。すなわち、変数の識別子等の情報を表した変数名表を参照することで、当該変数の識別子を、この変数名表に存在しない識別子に置き換える。ただし、当該変数が保持する値の生存区間が複数存在する場合は、それぞれの生存区間毎に、生存区間中の当該変数の定義箇所と参照箇所とにおける変数の識別子を、変数の識別子等の情報を表した変数名表に存在しない識別子に置き換える（合流定義変数置換器）。
【０１５８】
さらに、合流ブロックで定義される変数がホットパスＨＰの出口において生存している場合は、ホットパスＨＰの終点において、合流ブロックで定義される変数に識別子を元の識別子に復元する中間コードの列を生成する（合流定義変数保証コード生成器）。
【０１５９】
なお、合流ブロック定義置換部２ｈは、変更のあった識別子のデータフロー情報を変更する。なお、データフロー情報を変更する際には、再度全ての変数に関してデータフロー情報更新しても構わない。
【０１６０】
また、図２３に示す分岐中間コード生成部２ｅは、次の処理を実施してもよい。すなわち、分岐中間コード生成部２ｅは、プログラム変換部２Ａの実行経路中間コード列に含まれる条件分岐中間コードと、部分中間コード列上の条件分岐中間コードとを一組ずつ順番に読み出す。さらに分岐中間コード生成部２ｅは、読み出した条件分岐中間コードから、制御が遷移する中間コードであってかつホットパスＨＰ上にない中間コードを抽出する。そのうえで分岐中間コード生成部２ｅは、前記条件分岐中間コードの分岐中間コードを、当該ホットパスＨＰ上にない中間コードに設定する。これにより、実行経路中間コード列に含まれる条件分岐中間コードの条件が成立した場合には、本来、実行すべき部分中間コード列の途中の中間コードに分岐されるようになる。
【０１６１】
また、図２３に示す中間コード依存解析部２ｆは次の処理を実施してもよい。すなわち、中間コード依存解析部２ｆは、高速化ブロック中の中間コードのうち、合流ブロックから発生する中間コード（但し、条件分岐中間コードは除く）において、当該中間コードから高速ブロックの終点に向かって最初に見つかる条件分岐中間コードを抽出する。さらに中間コード依存解析部２ｆは、当該合流ブロックにおいて発生する中間コードから、上記抽出した条件分岐中間コードへの依存を生成する。これにより以下のような利点がある。
【０１６２】
中間コード並列化部２ｇは、合流ブロックから発生する中間コードに対して、高速化ブロックの始点に向かって見つかる条件分岐中間コードを越えたスケジューリングを実施する可能性があるが、上記制御を実施することで、高速化ブロックの終点に向かって最初に見つかる条件分岐中間コードを越えたスケジューリングを実施することができなくなる。
【０１６３】
また、図２３に示す中間コード依存解析部２ｆは次の処理を実施してもよい。すなわち、中間コード依存解析部２ｆは、高速化ブロック中の中間コードのうち、合流ブロックでない基本ブロックから発生する中間コードにおいて、当該中間コードから高速化ブロックの始点に向かって最初に見つかる条件分岐中間コードを抽出する。さらに中間コード依存解析部２ｆは、抽出した条件分岐中間コードから、当該合流ブロックでない基本ブロックから発生する中間コードへの依存を生成する。
【０１６４】
また、図２３に示す中間コード依存解析部２ｆは次の処理を実施してもよい。すなわち、中間コード依存解析部２ｆは、高速化ブロック中の中間コードのうち、合流ブロックでない基本ブロックから発生する中間コードにおいて、当該中間コードから高速ブロックの終点に向かって最初に見つかる条件分岐中間コードを抽出する。さらに中間コード依存解析部２ｆは、当該合流ブロックでない基本ブロックから発生する中間コードから抽出した条件分岐中間コードへの依存を生成する。これにより、中間コード並列化部２ｇは、当該合流ブロックでない基本ブロックから発生する中間コードや条件分岐中間コードを越えたスケジューリングを実施することができなくなる。
【０１６５】
以上の制御の改良に応じて図２の動作フローを改変する。すなわち、図２４に示すように、図２の動作フローに、合流ブロック内で定義される変数の識別子を置き換えた中間コードを生成するステップｎ４０を追加する。また、実行経路中間コード列の条件分岐中間コード中の分岐中間コードを、部分中間コードの途中で分岐するようにステップｎ１８を変更する。さらに、合流ブロックから発生した中間コードのみが、条件分岐中間コードを跨ったスケジューリングが行われる対象となるように、高速化ブロックＨ４中の中間コードの間に依存が発生するようにステップｎ２０を変更する。さらには、中間プログラムの並列化を実施した後に、再度、中間プログラムについて冗長性削除を行うステップｎ２２を追加する。
【０１６６】
これにより、合流ブロックから発生した中間コードおよび合流ブロックでない基本ブロックから発生した中間コードと、条件分岐中間コードとの間に依存を生成することにより、部分中間コード列の途中へ分岐するプログラム変換において、変換前と変換後のプログラムの等価性が保証されるようになる。
【０１６７】
図２５Ａ,図２５Ｂは、図５Ａ,図５ＢのソースプログラムＦ１を一部変更したソースプログラムＦ１の例である。図５Ａ,図５Ｂに示すプログラム構成から、中間コードＳ８と中間コードＳ９とが変更されている。以下では、図２４の主要ステップについて図２６〜図３２を参照して説明する。
【０１６８】
ステップｎ４０では、図２６に示すように図２５Ａ,図２５Ｂの中間プログラムを更新する。つまり図２５Ａ,図２５Ｂにおいて、変数ａは合流ブロックＢ１の中間コードＳ１で定義される。また、変数ａの定義である中間コードＳ１,中間コードＳ６において変数ａに保存される値は、中間コードＳ１２で参照され、かつ変数ａは基本ブロックＢ７の出口でも生存しているので、当該変数ａに保存される値は、基本ブロックＢ７以降でも参照される。さらに、変数ａが基本ブロックＢ７の出口でも生存しているので、変数ａの定義である中間コードＳ１０において変数ａに保存される値は基本ブロックＢ７以降でも参照される。
【０１６９】
よって、
・中間コードＳ１から基本ブロックＢ２,基本ブロックＢ４,および基本ブロックＢ６を経て基本ブロックＢ７の出口に至る区間と、
・中間コードＳ６から、基本ブロックＢ４と基本ブロックＢ６とを経て基本ブロックＢ７の出口に至る区間と、
・中間コードＳ１０から基本ブロックＢ７の出口に至る区間と
は、それぞれ変数ａの同一の生存区間を構成するものとなる。
【０１７０】
そのため、合流ブロック定義置換部２ｈは、変数ａの定義箇所と参照箇所とを（共に変数ａの生存区間中に存在する）、新たに発生した識別子ｔ１０に置き換えることになる。さらには、合流ブロック定義置換部２ｈは、ホットパスＨＰの終点において識別子ｔ１０を識別子ａに復元する中間コードＳ１５１を生成することになる。
【０１７１】
同様に、変数ｆにおいては、中間コードＳ８から基本ブロックＢ７の入口に至る区間と、中間コードＳ１５から基本ブロックＢ７の少なくとも出口に至る区間とが、それぞれ異なる変数ｆの生存区間になる。
【０１７２】
そのため、合流ブロック定義置換部２ｈは、
・中間コードＳ８から基本ブロックＢ７の入口に至る生存区間中に存在する変数ｆの定義箇所と参照箇所とを、新たに発生する識別子ｔ１２に置き換える、
・中間コードＳ１５から基本ブロックＢ７の出口に至る生存区間中に存在する定義箇所を新たに発生する識別子ｔ１３に置き換える、
という処理を実施する。
【０１７３】
さらに合流ブロック定義置換部２ｈは、ホットパスＨＰの終点において識別子ｔ１３を識別子ｆに復元する中間コードＳ１５３を生成する、
という処理を実施する。
【０１７４】
また、合流ブロック定義置換部２ｈは、変数ｃに関しても同様に置き換える。さらに、合流ブロック定義置換部２ｈは、図２７Ａに示す変更が生じた識別子のデータフロー情報を変更する。
【０１７５】
ステップｎ１４では、図２７Ｂに示すように、図２６の中間プログラムから、パス入力変数Ｘ１,パス出力変数Ｘ２,パス置換対象変数Ｘ３,およびパス保証変数Ｘ４を算定する。但し、今回の例では、パス保証変数Ｘ４となるものは存在しない。
【０１７６】
ステップｎ１５では、図２８の中間コードＳ５２,中間コードＳ２０３や図２７Ｃに示す、パス置換対象変数Ｘ３（＝ｄ）の識別子置換処理を行い、図２８に示す実行経路中間コード列Ｂ２００を生成する。
【０１７７】
ステップｎ１６では、図２８の条件分岐中間コードＳ２０２や条件分岐中間コードＳ２０３に示すように、図２６の条件分岐中間コードＳ３や条件分岐中間コードＳ９における判定中間コードの条件を論理反転した条件分岐中間コードを設定する。
【０１７８】
ステップｎ１８では、図２８の条件分岐中間コードＳ２０２と条件分岐中間コードＳ２０３との分岐先を部分中間コード列の途中で分岐する位置に設定する。つまり、条件分岐中間コードＳ２０２の分岐中間コードを中間コードＳ６に設定し、条件分岐中間コードＳ２０３の分岐中間コードを中間コードＳ１２に設定する。
【０１７９】
ステップｎ１９では、図２８の中間プログラムに、冗長性削除最適化処理を実施する。図２８では、基本ブロックＢ１１と基本ブロックＢ２１とに至るパスが存在しなくなるので、図２９に示すように、プログラムの一部が削除される。
【０１８０】
ステップｎ２０では、高速化ブロックＨ４の依存解析が行われる。その際、通常のデータの依存解析（依存生成）の他に、合流ブロックから発生した中間コードに高速化ブロックの終点方向に見つかる条件分岐中間コードを越えたスケジューリングがされないように依存解析（依存生成）が実施される。例えば、図３０に示すように、中間コードＳ１２,中間コードＳ２２,および中間コードＳ８２は合流ブロックから生成される中間コードであるので、
・中間コードＳ１２から条件分岐中間コードＳ２０２への依存と、
・中間コードＳ２２から条件分岐中間コードＳ２０２への依存と、
・中間コードＳ８２から条件分岐中間コードＳ２０３への依存とが、
それぞれ生成される。
【０１８１】
なお、中間コードＳ２２から条件分岐中間コードＳ２０２には変数ｔ１１に関連するデータ依存も存在する。また中間コードＳ８２から条件分岐中間コードＳ２０３には変数ｔ１２に関連するデータ依存も存在する。
【０１８２】
さらに、合流ブロックでない基本ブロックから発生した中間コードにおいては、条件分岐中間コードを越えたスケジューリングがされないように依存が生成される。例えば、図３０に示すように、中間コードＳ４２および中間コードＳ５２は合流ブロックでない基本ブロックから発生する中間コードであるので、
・条件分岐中間コードＳ２０２から中間コードＳ４２への依存と、
・条件分岐中間コードＳ２０２から中間コードＳ５２への依存と、
・中間コードＳ４２から条件分岐中間コードＳ２０３への依存と、
・中間コードＳ５２から条件分岐中間コードＳ２０３への依存とが、
それぞれ生成される。なお、中間コードＳ５２から条件分岐中間コードＳ２０３には変数ｔ３に関連するデータ依存も存在する。
【０１８３】
ステップｎ２１では、図３０の依存に従って、並列化ブロックＨ４では、図３１に示すように中間コード列がスケジューリングされる。ステップｎ２２では、さらに、図３１の中間プログラムに、冗長性削除最適化が実施される。ここで、前述した特許文献１に例示される等価式集合を使った最適化処理により、図３２の示すように、中間コードＳ８,中間コードＳ１５,および中間コードＳ１５３が削除される。例えば、図３１の中間コードＳ８２から中間コードＳ８に至る経路には、変数ｄ１を更新する中間コードも変数ｔ１２を更新する中間コードも存在しない。そのため、中間コードＳ８は冗長な計算であると判断されて削除される。また、図３１の中間コードＳ１５や中間コードＳ１５３は、中間コードＳ１５０や中間コードＳ１５３０より冗長な計算であると判断されて削除される。
【０１８４】
＜変形例５＞（確率）
上述した実施の形態において、最適化部２は、ホットパスＨＰ上の条件分岐中間コードの判定条件の成立の確率または非成立の確率や、例外が発生する確率、特定の変数が特定の値を保持する確率を基にして、変換の仕方を制御してもよい。なお、確率自体は、ホットパス情報Ｆ２より得られる。
【０１８５】
例えば、図５Ａ,図５Ｂのプログラムにおいて、条件分岐中間コードＳ３の判定が成立するときの確率がｐ１であり、また、条件分岐中間コードＳ９の判定が成立するときの確率がｐ２であるとする。そうするとホットパスＨＰが実行される確率は、確率ｐ１と確率ｐ２の乗算値ｐ１＊ｐ２となる。このとき、ある特定の閾値Ｔ１を適切な値に設定し、閾値Ｔ１より乗算値ｐ１＊ｐ２が大きいときには、図５Ａ,図５Ｂに示すプログラムから、図１３に示すプログラムに変換する（第１の実行経路変換判定器）。
【０１８６】
また、図５Ａ,図５Ｂに示す例外発生中間コードＳ１０において例外が発生する確率がｐ３であるときに、ある特定の閾値Ｔ２を適切な値に設定した結果として、確率ｐ３が閾値Ｔ２より大きいときには、図５Ａ,図５Ｂに示すプログラムから図１３に示すプログラムに変換し、小さいときには図５Ａ,図５Ｂに示すプログラムから図１６に示すプログラムに変換する（第３の実行経路変換判定器）。
【０１８７】
また、図５Ａ,図５Ｂに示す基本ブロックＢ１の入口において、変数ｂ,変数ｅが保持する値が、それぞれ、「５」,「８」である確率がそれぞれｐ４,ｐ５であるとする。このとき、ある特定の閾値Ｔ３を適切な値に設定した結果として、閾値Ｔ３より乗算値ｐ１＊ｐ２＊ｐ４＊ｐ５の値が大きいときには、図５Ａ,図５Ｂに示すプログラムから図２０に示すプログラムに変換する（第５の実行経路変換判定器）。
【０１８８】
なお、閾値Ｔ１,閾値Ｔ２,閾値Ｔ３は、ホットパス情報Ｆ２より得てもよいし、最適化部２が保持する値としてもよい。
【０１８９】
＜変形例６＞（平均実行時間）
上述７した実施の形態において、最適化部２は、実行時間の平均時間を使用して、最終的に出力する中間コードを決定してもよい。例えば５Ａ,図５Ｂにおいて、まず、条件分岐中間コードＳ３が真となるときの確率がｐ１であり、条件分岐中間コードＳ９が真となるときの確率がｐ２であるとすると、これらの確率は、ホットパス情報Ｆ２より得られる。
【０１９０】
また、図５Ａ,図５Ｂに示すプログラムにおいて、
・基本ブロックＢ１,基本ブロックＢ２,基本ブロックＢ４,基本ブロックＢ５,および基本ブロックＢ７を連続して実行する実行時間がＴ５１である、
・基本ブロックＢ１,基本ブロックＢ２,基本ブロックＢ４,基本ブロックＢ６,および基本ブロックＢ７を連続して実行する実行時間がＴ５２である、
・基本ブロックＢ１,基本ブロックＢ３,基本ブロックＢ４,基本ブロックＢ５,および基本ブロックＢ７を連続して実行する実行時間がＴ５３である、
・基本ブロックＢ１,基本ブロックＢ３,基本ブロックＢ４,基本ブロックＢ６,および基本ブロックＢ７を連続して実行する実行時間がＴ５４である、
とする。
このとき、図５Ａ,図５Ｂに示すプログラムの平均実行時間は、
ET1=T51*p1*p2+T52*p1*(1-p2)+T53*(1-p1)*p2+T54*(1-p1)*(1-p2)…(式１）
となる。
【０１９１】
さらに、
・図１３における中間コードＳ５２から中間コードＳ１１２までの実行時間がＴ１３１である、
・中間コードＳ５２から中間コードＳ２０３までの実行時間がＴ１３２である、
・中間コードＳ５２から中間コードＳ２０２までの実行時間がＴ１３３である、
とする。
【０１９２】
このとき、図１３に示すプログラムの平均実行時間は、
ET2 = T131*p1*p2+T132*(1-p2)+T52*p1*(1-p2)+T54*(1-p1)*(1-p2)
+T133*(1-p1)*p2+T53*(1-p1)*p2+T54*(1-p1)*(1-p2)…(式２)
となる。
【０１９３】
このとき、平均実行時間ＥＴ２が平均実行時間ＥＴ１より小さいと判断すると、図５Ａ,図５Ｂに示すプログラムから図１３に示すプログラムに変換する処理を実施する（第２の実行経路変換判定器）。同様に、図１６,図２０,図２２,図３２に示すプログラムに変換する処理においても、平均実行時間を算定したうえで、平均実行時間の小さいプログラムへの変換を選択してもよい。
【０１９４】
図１６に示すプログラムにおいて、
・中間コードＳ１２から中間コードＳ１１２までの実行時間がＴ１６１である、
・中間コードＳ１２から中間コードＳ２０２までの実行時間がＴ１６２である、
・中間コードＳ１２から中間コードＳ２０３までの実行時間がＴ１６３である、
・図５Ａ,図５Ｂに示す中間コードＳ１０において例外が発生する確率がｐ３である、
とする。
【０１９５】
このとき、図１６に示すプログラムの平均実行時間は、
ET3= [T161*p1*p2+T162*(1-p1)*p2+T53*(1-p1)*p2+T54*(1-p1)*(1-p2)
+T163*(1-p2)+T52*p1*(1-p2)+T54*(1-p1)*(1-p2)]*(1-p3)
+[T162+T52*p1*(1-p2)+T54*(1-p1)*(1-p2)]*p3…（式３）
となる（第４の実行経路変換判定器）。
【０１９６】
また、図２０に示すプログラムにおいて、
・中間コードＳ１２１から中間コードＳ１５２までの実行時間がＴ２０１である、
・中間コードＳ１２１から中間コードＳ４１１までの実行時間がＴ２０２である、
・中間コードＳ１２１から中間コードＳ４１２までの実行時間がＴ２０３である、
・中間コードＳ１２１から中間コードＳ２０２までの実行時間がＴ２０４である、
・図５の基本ブロックＢ１の入口において、変数ｂ,変数ｅが保持する値がそれぞれ「５」，「８」である確率がそれぞれｐ４,ｐ５である、
とする。
【０１９７】
このとき、図２０に示すプログラムの平均実行時間は、
ET4=T201*p1*p4*p5+(T202+ET1)*(1-p4)+(T203+ET1)*p4*(1-p5)
+[T204+T53*(1-p1)*p2+T54*(1-p1)*(1-p2)]*(1-p1)*p4*p5…(式４)
となる。
【０１９８】
また、図２２の示すプログラムにおいて、
・中間コードＳ１２１から中間コードＳ１５２までの実行時間がＴ２２１である、
・中間コードＳ１２１から中間コードＳ４１３までの実行時間がＴ２２２である、
・中間コードＳ１２１から中間コードＳ４１４までの実行時間がＴ２２３である、
・中間コードＳ１２１から中間コードＳ２０２までの実行時間がＴ２２４である、
・図５の基本ブロックＢ１の入口において、変数ｂ,変数ｅが保持する値が、それぞれ、「５」,「８」である確率がそれぞれｐ４,ｐ５である、
とする。
【０１９９】
このとき、図２２に示すプログラムの平均実行時間は、
ET5= T221*p1*p4*p5+(T222+ET2)*(1-p4)+(T223+ET2)*p4*(1-p5)
+[T224+T53*(1-p1)*p2+T54*(1-p1)*(1-p2)]*(1-p1)*p4*p5…(式５)
となる（第６の実行経路変換判定器）。
【０２００】
また、
・図３２における基本ブロックＢ３１,基本ブロックＢ４１,基本ブロックＢ５１,および基本ブロックＢ７１を連続して実行する実行時間がＴ３２１である、
・基本ブロックＢ３１,基本ブロックＢ４１,基本ブロックＢ６１,および基本ブロックＢ７１を連続して実行する実行時間がＴ３２２である、
・基本ブロックＢ６１,および基本ブロックＢ７１を連続して実行する実行時間がＴ３２３である、
・中間コードＳ１２から中間コードＳ１５１までの実行時間がＴ３２４である、
・中間コードＳ１２から中間コードＳ２０２までの実行時間がＴ３２５である、
・中間コードＳ１２から中間コードＳ２０３までの実行時間がＴ３２６である、とする。
【０２０１】
このとき、図３２に示すプログラムの平均実行時間は、
ET6=T324*p1*p2+T325*(1-p1)+T321*p2+T322*(1-p2)+
(T326+T322)*p1*(1-p2)…(式６)
となる。
【０２０２】
以上、算出した平均実行時間ＥＴ１,平均実行時間ＥＴ２,平均実行時間ＥＴ３,平均実行時間ＥＴ４,平均実行時間ＥＴ５,および平均実行時間ＥＴ６に比較に基づいて最適化部２は変換処理を次のように制御する。すなわち、これらの平均実行時間の中で、平均実行時間ＥＴ１が最も小さい場合には、図５のまま変換なしの出力が実施され、その他の平均実行時間が最も小さい場合には、最も平均実行時間が小さい変換が最終的な中間コードとして出力される。
【０２０３】
＜補足＞
以上、本発明におけるコンパイラ装置について、実施の形態および変形例に基づいて説明したが、本発明は実施の形態および変形例に限られないことは勿論である。
【０２０４】
（１）＜変形例２＞においては、図１１のプログラムに示すように、例外が発生しないことを条件にしてプログラム変換を行っているが、図１４のプログラムに示すように、例外の発生を考慮してプログラム変換を行ってもよい。また、図２９のプログラムに示すように、部分中間コード列の途中へ分岐することを条件にしてプログラム変換を行ってもよい。
【０２０５】
（２）＜変形例３＞においては、図１１のプログラムを基にして、図１３に示す例外が発生しないプログラムに変換し、このようにして変換したプログラムにさらに図２２のプログラムにおける基本ブロックＢ１７４を付加している。しかしながら、図１４のプログラムを基にして、図１６に示す例外の発生を考慮したプログラムに変換し、さらにこのようにして変換したプログラムにさらに図２２のプログラムにおける基本ブロックＢ１７４を付加してもよい。
【０２０６】
（３）本実施の形態では、＜変形例２＞と＜変形例４＞とを別々に説明したが、＜変形例２＞と＜変形例４＞を組み合わせてもよい。例えば、＜変形例２＞を行った後の図２０のプログラムにおいて、さらに、基本ブロックＢ１〜Ｂ７に＜変形例４＞のプログラム変換を行うことによって、図３３に示すプログラムに変換してもよい。
【０２０７】
同様に、＜変形例３＞と＜変形例４＞とを組み合わせてもよい。例えば、＜変形例３＞を行った後の図２２のプログラムにおいて、さらに、基本ブロックＢ１〜Ｂ７に＜変形例４＞のプログラム変換を行うことによって、図３４,図３５（両図でＢ２０１とＢ５０３は同じもの）に示すプログラムに変換してもよい。ただし、図３４,図３５のプログラムでは、高速化ブロックＨ７の途中から外に分岐する場合における処理は、図５のプログラムにおいてホットパスＨＰが実行されない場合の処理となる。よって、図３４,図３５のプログラムは、次に実行頻度が高いホットパスＨＰとして、基本ブロックＢ１,基本ブロックＢ３,ブロックＢ４,ブロックＢ５,およびブロックＢ７の経路を選んでこのパスを高速化したプログラムとなる。
【０２０８】
その他、＜実施の形態＞および＜変形例１＞〜＜変形例４＞を組み合わせることにより、他の変形を行ってもよい。なお、＜実施の形態＞および＜変形例１＞〜＜変形例４＞を組み合わせた新たなコンパイラ装置は、実施の形態で示した方法から容易に構成できる。
【０２０９】
（４）本実施の形態では、中間コードスケジューリング部２Ｂに引き続き資源割付部３を起動するようにしているが、逆に、先に資源割付部３を起動してから引き続き中間コードスケジューリング部２Ｂを起動してもよい。
【０２１０】
（５）本実施の形態では、ループを含むホットパスについて述べていないが、最内ループやループ展開後のプログラムに、本実施の形態のプログラム変換を適用することや、ループ全体を一つの中間コードと同等であるとして本実施の形態のプログラム変換を適用することも可能である。また、最内ループから外側のループに向かって段階的に本実施の形態のプログラム変換を適用することも可能である。例えば、図３６Ａのプログラムにおいて、最内ループＬ１のホットパスが中間コードＳ１,中間コードＳ２,および中間コードＳ４を通る経路である場合において、本実施の形態のプログラム変換を適用してもよい。そうすれば、図３６Ｂのプログラムに示されるように高速化ブロックＨ１２４が生成される。さらに、図３６Ｃのプログラムに示すように、ループＬ１全体を新規の中間コードＳ２０として扱い、例えば、ループＬ２内のホットパスが中間コードＳ６,中間コードＳ７,中間コードＳ２０,中間コードＳ８,中間コードＳ９,および中間コードＳ１１を通る経路である場合に、ループＬ１と同様に本実施の形態のプログラム変換を適用することが可能である。
【０２１１】
（６）また、本発明は、前記プログラムまたは前記デジタル信号を記録したコンピュータ読取り可能な記録媒体、例えば、フレキシブルディスク,ハードディスク,ＣＤ−ＲＯＭ,ＭＯ,ＤＶＤ,ＤＶＤ−ＲＯＭ,ＤＶＤ−ＲＡＭ,半導体メモリ等であるとしてもよい。また、本発明は、電気通信回線,無線または有線通信回線,若しくはインターネットに代表されるネットワーク等を経由して伝送される前記コンピュータプログラムまたは前記デジタル信号であるとしてもよい。
【産業上の利用可能性】
【０２１２】
発明のコンパイラ装置、コンパイル方法およびコンパイラプログラムは、複数の実行経路を含むプログラムにおいて実行頻度の高い実行経路の実行速度を上げるようにプログラム変換することが可能であり、デジタル家電製品等の情報処理装置に組み込んで使用することができる。
【図面の簡単な説明】
【０２１３】
【図１】本発明の実施の形態におけるコンパイラ装置の機能構成図。
【図２】本発明の実施の形態におけるコンパイラ装置の動作フロー図。
【図３】変数情報算出部によってなされる変数情報算出処理のフロー図。
【図４】実行経路中間コード生成部によってなされる変数置換処理のフロー図。
【図５Ａ】本発明の実施の形態におけるコンパイラ装置の動作説明に使用する図（その１）。
【図５Ｂ】本発明の実施の形態におけるコンパイラ装置の動作説明に使用する図（その２）。
【図６】背景技術および課題の説明に用いる図。
【図７】背景技術および課題の説明に用いる図。
【図８】背景技術および課題の説明に用いる図。
【図９Ａ】変数情報算出部によって算出される変数情報と、実行経路中間コード生成部によって生成される変数のペア生成履歴の構成と内容例を示す図（その１）。
【図９Ｂ】変数情報算出部によって算出される変数情報と、実行経路中間コード生成部によって生成される変数のペア生成履歴の構成と内容例を示す図（その２）。
【図９Ｃ】変数情報算出部によって算出される変数情報と、実行経路中間コード生成部によって生成される変数のペア生成履歴の構成と内容例を示す図（その３）。
【図１０】本発明の実施の形態におけるコンパイラ装置の動作説明に使用する図。
【図１１】本発明の実施の形態におけるコンパイラ装置の動作説明に使用する図。
【図１２】中間コード依存解析部によって生成される依存解析情報の説明図。
【図１３】中間コード並列化部によって命令スケジューリングがなされた実行経路中間コードを示す図。
【図１４】変形例１におけるコンパイラ装置の動作説明に使用する図。
【図１５】変形例１における中間コード依存解析部によって生成される依存解析情報の説明図。
【図１６】変形例１における中間コード並列化部によって命令スケジューリングがなされた実行経路中間コードを示す図。
【図１７】変形例１における例外発生時の目的プログラムの動作を示す図。
【図１８】変形例２におけるコンパイラ装置の動作説明に使用する図。
【図１９】変形例２における中間コード依存解析部によって生成される依存解析情報の説明図。
【図２０】変形例２における中間コード並列化部によって命令スケジューリングがなされた実行経路中間コードを示す図。
【図２１】変形例３におけるコンパイラ装置の動作説明に使用する図。
【図２２】変形例３における中間コード並列化部によって命令スケジューリングがなされた実行経路中間コードを示す図。
【図２３】変形例４におけるコンパイラ装置の機能構成図。
【図２４】変形例４におけるコンパイラ装置の動作フロー図。
【図２５Ａ】変形例４におけるコンパイラ装置の動作説明に使用する図（その１）。
【図２５Ｂ】変形例４におけるコンパイラ装置の動作説明に使用する図（その２）。
【図２６】変形例４におけるコンパイラ装置の動作説明に使用する図。
【図２７Ａ】変形例４におけるコンパイラ装置の変数情報算出部によって算出される変数情報と、実行経路中間コード生成部によって生成される変数のペア生成履歴の構成と内容例を示す図（その１）。
【図２７Ｂ】変形例４におけるコンパイラ装置の変数情報算出部によって算出される変数情報と、実行経路中間コード生成部によって生成される変数のペア生成履歴の構成と内容例を示す図（その２）。
【図２７Ｃ】変形例４におけるコンパイラ装置の変数情報算出部によって算出される変数情報と、実行経路中間コード生成部によって生成される変数のペア生成履歴の構成と内容例を示す図（その３）。
【図２８】変形例４におけるコンパイラ装置の動作説明に使用する図。
【図２９】変形例４におけるコンパイラ装置の動作説明に使用する図。
【図３０】変形例４におけるコンパイラ装置の中間コード依存解析部によって生成される依存解析情報の説明図。
【図３１】変形例４におけるコンパイラ装置の中間コード並列化部によって命令スケジューリングがなされた実行経路中間コードを示す図。
【図３２】変形例４におけるコンパイラ装置の動作説明に使用する図。
【図３３】本発明の実施の形態におけるコンパイラ装置の動作説明に使用する図。
【図３４】本発明の実施の形態におけるコンパイラ装置の動作説明に使用する図。
【図３５】本発明の実施の形態におけるコンパイラ装置の動作説明に使用する図。
【図３６Ａ】本発明の変形例におけるコンパイラ装置の動作説明に使用する図（その１）。
【図３６Ｂ】本発明の変形例におけるコンパイラ装置の動作説明に使用する図（その２）。
【図３６Ｃ】本発明の変形例におけるコンパイラ装置の動作説明に使用する図（その３）。
【符号の説明】
【０２１４】
Ａ  コンパイラ装置
１  構文解析部
２  最適化部
３  資源割付部
４  実行コード生成部
２Ａ  プログラム変換部
２Ｂ  中間コードスケジューリング部
２ａ  変数情報算出部
２ｂ  実行経路中間コード生成部
２ｃ  判定中間コード生成部
２ｄ  保証中間コード生成部
２ｅ  分岐中間コード生成部
２ｆ  中間コード依存解析部
２ｇ  中間コード並列化部
２ｈ  合流ブロック定義置換部
Ｆ１  ソースプログラム
Ｆ２  ホットパス情報
Ｆ３  実行プログラム
Ｈ１〜Ｈ７  高速化ブロック
【図１】
2008004082.tif 000003
【図２】
2008004082.tif 000004
【図３】
2008004082.tif 000005
【図４】
2008004082.tif 000006
【図５Ａ】
2008004082.tif 000007
【図５Ｂ】
2008004082.tif 000008
【図６】
2008004082.tif 000009
【図７】
2008004082.tif 000010
【図８】
2008004082.tif 000011
【図９Ａ】
2008004082.tif 000012
【図９Ｂ】
2008004082.tif 000013
【図９Ｃ】
2008004082.tif 000014
【図１０】
2008004082.tif 000015
【図１１】
2008004082.tif 000016
【図１２】
2008004082.tif 000017
【図１３】
2008004082.tif 000018
【図１４】
2008004082.tif 000019
【図１５】
2008004082.tif 000020
【図１６】
2008004082.tif 000021
【図１７】
2008004082.tif 000022
【図１８】
2008004082.tif 000023
【図１９】
2008004082.tif 000024
【図２０】
2008004082.tif 000025
【図２１】
2008004082.tif 000026
【図２２】
2008004082.tif 000027
【図２３】
2008004082.tif 000028
【図２４】
2008004082.tif 000029
【図２５Ａ】
2008004082.tif 000030
【図２５Ｂ】
2008004082.tif 000031
【図２６】
2008004082.tif 000032
【図２７Ａ】
2008004082.tif 000033
【図２７Ｂ】
2008004082.tif 000034
【図２７Ｃ】
2008004082.tif 000035
【図２８】
2008004082.tif 000036
【図２９】
2008004082.tif 000037
【図３０】
2008004082.tif 000038
【図３１】
2008004082.tif 000039
【図３２】
2008004082.tif 000040
【図３３】
2008004082.tif 000041
【図３４】
2008004082.tif 000042
【図３５】
2008004082.tif 000043
【図３６Ａ】
2008004082.tif 000044
【図３６Ｂ】
2008004082.tif 000045
【図３６Ｃ】
2008004082.tif 000046