(57)【要約】【課題】  複数の実行経路を有するプログラムにおいて、プログラムの整合性を保持しつつ、特定の実行経路について基本ブロックを拡張するようにプログラム変換するコンパイラ装置を提供することを目的とする。【解決手段】コンパイラ装置1は、元の部分プログラム(基本ブロックB1〜B7)のホットパス200上における命令文のパス置換対象変数に変数置換処理を施した命令文と、ホットパス200上の分岐条件をホットパスが実行される条件となるように変換した分岐条件文とを含む新たな基本ブロックB104と、パス置換対象変数のうちパス保証変数の値を元の変数の値に復元する命令文の基本ブロックB103を生成し、基本ブロックB104の分岐条件文の実行結果が真である場合には、基本ブロックB104に後続して基本ブロックB103を実行し、実行結果が偽である場合には、基本ブロックB104に後続して基本ブロックB1を実行するように元のプログラムを変換する。【選択図】  図11
2006120124.tif 000002
【特許請求の範囲】
【請求項１】
分岐命令を含むソースプログラムを目的コード列である目的プログラムに変換するコンパイラ装置であって、
前記ソースプログラムのうち、途中に分岐命令を含む一部命令列についての複数の実行経路の一つを指定する実行経路指定手段と、
前記指定された実行経路上における、分岐命令以外の各命令列に対応する各目的コードを少なくとも含む実行経路コードであって、前記指定された実行経路の入口で生存が必要とされる変数でありかつ前記指定された実行経路上で定義されている変数を、その他の変数に置換えた実行経路コードを生成する実行経路コード生成手段と、
前記置換えられた変数のうち、前記指定された実行経路の出口で生存が必要とされる変数については、当該置換後の変数から元の変数へ値の復元をする保証コードを生成する保証コード生成手段と、
前記一部命令列に対応する部分コードを生成する部分コード生成手段と、
前記指定された実行経路中の分岐命令に分岐条件に基づいて、前記指定された実行経路を実行するための分岐条件が成立する場合には前記実行経路コードの終点から前記保証コードの始点に進み、前記分岐条件が成立しない場合には前記実行経路コードの終点から前記部分コードの始点に分岐する分岐コードを生成する分岐コード生成手段と
を備えることを特徴とするコンパイラ装置。
【請求項２】
前記実行経路コード生成手段は、更に、前記一部命令列における始点の直前に配置された命令列の直後に生成した前記実行経路コードを配置し、
前記保証コード生成手段は、更に、前記実行経路コードの終点の直後に前記保証コードを配置し、前記一部命令列の終点に後続する命令列を保証コードの後に配置し、
前記分岐コード生成手段は、更に、前記部分コードの終点から、前記一部命令列の終点に後続する命令列に分岐する分岐コードを生成すること
を特徴とする請求項1記載のコンパイラ装置。
【請求項３】
前記コンパイラ装置は、ソースプログラムを構文解析して中間コードに変換し、中間コードを目的プログラムに変換するコンパイラ装置であり、
前記実行経路コード生成手段は、前記一部命令列が前記構文解析によって変換された中間コードである部分中間コード上の変数に基づいて、前記変数の置換え対象である置換対象変数を算出する変数情報算出部と、
前記部分中間コードの前記指定された実行経路に係る、分岐命令以外の各中間コードを少なくとも含む実行経路中間コードであって、前記置換対象変数をその他の変数に置換えた実行経路中間コードを生成する実行経路中間コード生成部と、
前記実行経路中間コードに含まれる各分岐条件を、前記指定された実行経路を実行できることを判定する一つの分岐条件に変換し、その分岐条件に基づいて判定を行う判定中間コードに変換する判定中間コード生成部を備え、
前記保証コード生成手段は、前記置換対象変数が前記指定された実行経路の出口で生存が必要とされる変数の場合に、当該置換対象変数から元の変数へ値の復元をする保証中間コードを生成する保証中間コード生成部を備え、
前記分岐コード生成手段は、前記判定中間コードの分岐条件が成立しない場合に、前記部分中間コードの始点に分岐する分岐中間コードを生成する分岐中間コード生成部と、
前記部分中間コードと、前記実行経路中間コードと、前記判定中間コードと、前記保証中間コードと前記分岐中間コードを目的プログラムである実行コードに変換する実行コード生成部とを備えること
を特徴とする請求項2記載のコンパイラ装置。
【請求項４】
前記コンパイラ装置は、ソースプログラムを構文解析して中間コードに変換し、中間コードを目的プログラムに変換するコンパイラ装置であり、
前記実行経路コード生成手段は、前記一部命令列が前記構文解析によって変換された中間コードである部分中間コード上の変数に基づいて、前記変数の置換え対象である置換対象変数を算出する変数情報算出部と、
前記部分中間コードの前記指定された実行経路に係る、分岐命令以外の各中間コードを少なくとも含む実行経路中間コードであって、前記置換対象変数をその他の変数に置換えた実行経路中間コードを生成する実行経路中間コード生成部と、
前記実行経路中間コードに含まれる分岐条件毎に、前記指定された実行経路を実行できることを判定する分岐条件に変換し、各分岐条件に基づいて判定を行う判定中間コードに各々変換する判定中間コード生成部を備え、
前記保証コード生成手段は、前記置換対象変数が前記指定された実行経路の出口で生存が必要とされる変数の場合に、当該置換対象変数から元の変数へ値の復元をする保証中間コードを生成する保証中間コード生成部を備え、
前記分岐コード生成手段は、前記判定中間コードの分岐条件が成立しない場合に、前記部分中間コードの始点に分岐し、前記分岐条件が成立する場合に、前記保証中間コードの始点に向けて進む分岐中間コードを生成する分岐中間コード生成部と、
前記部分中間コードと、前記実行経路中間コードと、前記判定中間コードと、前記保証中間コードと前記分岐中間コードを目的プログラムである実行コードに変換する実行コード生成部とを備えること
を特徴とする請求項2記載のコンパイラ装置。
【請求項５】
前記コンパイラ装置は、前記ソースプログラムを逐次実行するインタプリタ機能を有し、
前記インタプリタ機能により前記一部命令列における実行経路の情報を収集し、実行頻度が高い実行経路を抽出する抽出手段を備え、
前記実行経路指定手段は、前記抽出手段によって抽出された実行経路を指定することを特徴とする請求項1記載のコンパイラ装置。
【請求項６】
前記コンパイラ装置は、前記部分コード生成手段と、前記実行経路コード生成手段と、前記保証コード生成手段と、前記分岐コード生成手段によって生成された目的コードに最適化を施すことを特徴とする請求項１記載のコンパイラ装置。
【請求項７】
分岐命令を含むソースプログラムを目的コード列である目的プログラムに変換するコンパイル方法であって、
前記ソースプログラムのうち、途中に分岐命令を含む一部命令列についての複数の実行経路の一つを指定する実行経路指定ステップと、
前記指定された実行経路上における、分岐命令以外の各命令列に対応する各目的コードを少なくとも含む実行経路コードであって、前記指定された実行経路の入口で生存が必要とされる変数でありかつ前記指定された実行経路上で定義されている変数を、その他の変数に置換えた実行経路コードを生成する実行経路コード生成ステップと、
前記置換えられた変数のうち、前記指定された実行経路の出口で生存が必要とされる変数については、当該置換後の変数から元の変数へ値の復元をする保証コードを生成する保証コード生成ステップと、
前記一部命令列に対応する部分コードを生成する部分コード生成ステップと、
前記指定された実行経路中の分岐命令の分岐条件に基づいて、前記指定された実行経路を実行するための分岐条件が成立する場合には前記実行経路コードの終点から前記保証コードの始点に進み、前記分岐条件が成立しない場合には前記実行経路コードの終点から前記部分コードの始点に分岐する分岐コードを生成する分岐コード生成ステップと
を含むことを特徴とするコンパイル方法。
【請求項８】
ＣＰＵを備える装置に分岐命令を含むソースプログラムを目的コード列である目的プログラムに変換させるためのコンパイラプログラムであって、
前記ソースプログラムのうち、途中に分岐命令を含む一部命令列についての複数の実行経路の一つを指定する実行経路指定ステップと、
前記指定された実行経路上における、分岐命令以外の各命令列に対応する各目的コードを少なくとも含む実行経路コードであって、前記指定された実行経路の入口で生存が必要とされる変数でありかつ前記指定された実行経路上で定義されている変数を、その他の変数に置換えた実行経路コードを生成する実行経路コード生成ステップと、
前記置換えられた変数のうち、前記指定された実行経路の出口で生存が必要とされる変数については、当該置換後の変数から元の変数へ値の復元をする保証コードを生成する保証コード生成ステップと、
前記一部命令列に対応する部分コードを生成する部分コード生成ステップと、
前記指定された実行経路中の分岐命令の分岐条件に基づいて、前記指定された実行経路を実行するための分岐条件が成立する場合には前記実行経路コードの終点から前記保証コードの始点に進み、前記分岐条件が成立しない場合には前記実行経路コードの終点から前記部分コードの始点に分岐する分岐コードを生成する分岐コード生成ステップと
を前記装置に実行させることを特徴とするコンパイラプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、コンパイラ装置に関し、特に実行速度面に関する最適化コンパイル技術に関する。
【背景技術】
【０００２】
従来、大量のデータを処理するコンピュータシステムに搭載されるプログラムの性能を上げるため、プログラムの実行時間を短縮するように最適化を行うコンパイラ装置が利用されている。
最適化の方法として、プログラムの実行効率を上げるように命令の順序を並び替える命令スケジューリングが用いられる。
【０００３】
また、コンパイラ装置は最適化の際に、プログラム中の分岐の命令文および分岐先の命令文に着目した制御フロー解析により、プログラムを基本ブロック単位に分割する。基本ブロックとは命令文の列であり、基本ブロックの先頭の命令文から最後の命令文へ順に実行され、命令文の列の途中に分岐や合流を含まないものをいう。但し、基本ブロックの最後に分岐命令を含んでいてもよい。
【０００４】
基本ブロックの途中には分岐や合流がないため、基本ブロック毎の命令スケジューリングは容易に行うことができるが、基本ブロック毎の局所的な最適化では最適化の効果が限られる。そのため、基本ブロックを拡張し命令スケジューリングの対象範囲を広げることが必要とされる。
また、複数の分岐を含むプログラムにおいて、実行頻度が高い実行経路(以下「ホットパス」という)が分かっている場合がある。そのような場合、ホットパス上の命令文を移動させてホットパスの基本ブロックを拡大し、ホットパスの実行効率を上げる方法が知られている。(非特許文献1参照)
ここで、ホットパス上の基本ブロックを拡張する方法について図5(ａ)のプログラムを例に説明する。図5(ａ)はプログラムの一部を示しており、図5(b)はこのプログラムの制御の流れを示す制御フローグラフを表している。制御フローグラフは、基本ブロックB1〜B7の間を分岐や合流を表す有向辺で接続した有向グラフである。また、この例では破線矢印200上の基本ブロックB1、B2、B4、B5、B7を順に遷移する実行経路をホットパスとして説明する。
【０００５】
例えば、図6において基本ブロックB4の命令文S8を基本ブロックB2に移動させ、基本ブロックB3から基本ブロックB4へ遷移する場合を考慮して命令文S8をコピーした命令文S81を基本ブロックB3に挿入する(図7)。この操作によって、プログラムの整合性を保持しつつホットパス上の基本ブロックB2を拡張することができる。
【非特許文献１】中田育男著「コンパイラの構成と最適化」朝倉出版、2004年、P358−381
【発明の開示】
【発明が解決しようとする課題】
【０００６】
しかし、図8において基本ブロックB5の命令文S10を基本ブロックB2に移動させたとき、基本ブロックB1、B2、B4の順に遷移し、基本ブロックB4の分岐命令S9の判定が偽である場合に、基本ブロックB6の命令文S12の変数aは、本来なら基本ブロックB1の命令文S1の変数aの値を参照しなければならないが、移動させた命令文S10の変数aの値を参照することになり、プログラムの整合性が保たれなくなる。
【０００７】
このように、最後に分岐命令を含む基本ブロックを跨って命令文を移動させることにより元のプログラムのデータ依存関係が保たれなくなる場合、命令文の移動が制限され基本ブロックを拡張することができない。
そこで、本発明は上記問題に鑑みてなされたものであり、プログラムの整合性を保持しつつ、ある実行経路の基本ブロックを拡張することができるようにプログラムを変換するコンパイラ装置を提供することを目的とする。
【課題を解決するための手段】
【０００８】
本発明のコンパイラ装置は、分岐命令を含むソースプログラムを目的コード列である目的プログラムに変換するコンパイラ装置であって、前記ソースプログラムのうち、途中に分岐命令を含む一部命令列についての複数の実行経路の一つを指定する実行経路指定手段と、前記指定された実行経路上における、分岐命令以外の各命令列に対応する各目的コードを少なくとも含む実行経路コードであって、前記指定された実行経路の入口で生存が必要とされる変数でありかつ前記指定された実行経路上で定義されている変数を、その他の変数に置換えた実行経路コードを生成する実行経路コード生成手段と、前記置換えられた変数のうち、前記指定された実行経路の出口で生存が必要とされる変数については、当該置換後の変数から元の変数へ値の復元をする保証コードを生成する保証コード生成手段と、前記一部命令列に対応する部分コードを生成する部分コード生成手段と、前記指定された実行経路中の分岐命令の分岐条件に基づいて、前記指定された実行経路を実行するための分岐条件が成立する場合には前記実行経路コードの終点から前記保証コードの始点に進み、前記分岐条件が成立しない場合には前記実行経路コードの終点から前記部分コードの始点に分岐する分岐コードを生成する分岐コード生成手段とを備えることを特徴とする。
【０００９】
尚、前記実行経路コードの終点から前記保証コードの始点に進みとは、実行経路コードの終点に続いて保証コードの始点に進むことと、実行経路コードの終点から保証コードの始点に分岐することを含む。
【発明の効果】
【００１０】
この構成によれば、指定された実行経路の基本ブロックを拡張することができ、命令スケジューリングの対象範囲を広げることができるので、より効果的に最適化を行うことができる。また、当該実行経路の命令文が優先的に実行され、実行経路の途中に分岐を含まない構成であるため、当該実行経路の実行確率が他の実行経路より高い場合に当該実行経路の実行速度を向上させることができる。
【００１１】
また、前記実行経路コード生成手段は、更に、前記一部命令列における始点の直前に配置された命令列の直後に生成した前記実行経路コードを配置し、前記保証コード生成手段は、更に、前記実行経路コードの終点の直後に前記保証コードを配置し、前記一部命令列の終点に後続する命令列を保証コードの後に配置し、前記分岐コード生成手段は、更に、前記部分コードの終点から、前記一部命令列の終点に後続する命令列に分岐する分岐コードを生成することとしてもよい。
【００１２】
この構成によれば、一部分を除くソースプログラムと連続するように新たに生成した実行経路コードを配置することができるので、ソースプログラム実行の際、キャッシュメモリ領域を効率的に割り当てることができ、また、実行経路の実行確率が高い場合には、実行経路コードからソースプログラムへの分岐もないため、プログラム全体の実行速度を上げることができる。
【００１３】
また、前記コンパイラ装置は、ソースプログラムを構文解析して中間コードに変換し、中間コードを目的プログラムに変換するコンパイラ装置であり、前記実行経路コード生成手段は、前記一部命令列が前記構文解析によって変換された中間コードである部分中間コード上の変数に基づいて、前記変数の置換え対象である置換対象変数を算出する変数情報算出部と、前記部分中間コードの前記指定された実行経路に係る、分岐命令以外の各中間コードを少なくとも含む実行経路中間コードであって、前記置換対象変数をその他の変数に置換えた実行経路中間コードを生成する実行経路中間コード生成部と、前記実行経路中間コードに含まれる各分岐命令を、前記指定された実行経路を実行できることを判定する一つの分岐条件に変換し、その分岐条件に基づいて判定を行う判定中間コードに変換する判定中間コード生成部を備え、前記保証コード生成手段は、前記置換対象変数が前記指定された実行経路の出口で生存が必要とされる変数の場合に、当該置換対象変数から元の変数へ値の復元をする保証中間コードを生成する保証中間コード生成部を備え、  前記分岐コード生成手段は、前記判定中間コードの分岐条件が成立しない場合に、前記部分中間コードの始点に分岐する分岐中間コードを生成する分岐中間コード生成部と、前記部分中間コードと、前記実行経路中間コードと、前記判定中間コードと、前記保証中間コードと前記分岐中間コードを目的プログラムである実行コードに変換する実行コード生成部とを備えることとしてもよい。
【００１４】
この構成によれば、ソースプログラムをコンパイラが処理しやすい中間プログラムに変換するため、実行形式プログラムの生成を効率よく行うことができ、また、複数の分岐命令を一つの分岐命令に変換した中間プログラムにおいて最適化を効率良く行うことができる。
また、前記コンパイラ装置は、ソースプログラムを構文解析して中間コードに変換し、中間コードを目的プログラムに変換するコンパイラ装置であり、前記実行経路コード生成手段は、前記一部命令列が前記構文解析によって変換された中間コードである部分中間コード上の変数に基づいて、前記変数の置換え対象である置換対象変数を算出する変数情報算出部と、前記部分中間コードの前記指定された実行経路に係る、分岐命令以外の各中間コードを少なくとも含む実行経路中間コードであって、前記置換対象変数をその他の変数に置換えた実行経路中間コードを生成する実行経路中間コード生成部と、前記実行経路中間コードに含まれる分岐命令毎に、前記指定された実行経路を実行できることを判定する分岐条件に変換し、各分岐条件に基づいて判定を行う判定中間コードに各々変換する判定中間コード生成部を備え、前記保証コード生成手段は、前記置換対象変数が前記指定された実行経路の出口で生存が必要とされる変数の場合に、当該置換対象変数から元の変数へ値の復元をする保証中間コードを生成する保証中間コード生成部を備え、前記分岐コード生成手段は、前記判定中間コードの分岐条件が成立しない場合に、前記部分中間コードの始点に分岐し、前記分岐条件が成立する場合に、前記保証中間コードの始点に向けて進む分岐中間コードを生成する分岐中間コード生成部と、前記部分中間コードと、前記実行経路中間コードと、前記判定中間コードと、前記保証中間コードと前記分岐中間コードを目的プログラムである実行コードに変換する実行コード生成部とを備えることとしてもよい。
【００１５】
この構成によれば、判定中間コード生成部により、実行経路コードに含まれる複数の分岐条件毎に、実行経路の実行を判定するための分岐条件に変換し、分岐条件毎に判定中間コードに変換することができる。従って、例えば、実行経路の実行確率が高くない場合には、早く他の経路へ分岐することができる。
また、本発明に係るコンパイラ装置は、前記ソースプログラムを逐次実行するインタプリタ機能を有し、前記インタプリタ機能により前記一部命令列における実行経路の情報を収集し、実行頻度が高い実行経路を抽出する抽出手段を備え、前記実行経路指定手段は、前記抽出手段によって抽出された実行経路を指定することとしてもよい。
【００１６】
この構成によれば、プログラムを実行して得られた実行経路の情報から実行頻度の高い実行経路を指定するので、当該実行経路における基本ブロックを拡張することができる。
また、本発明に係るコンパイラ装置は、前記部分コード生成手段と、前記実行経路コード生成手段と、前記保証コード生成手段と、前記分岐コード生成手段によって生成された目的コードに最適化を施すこととしてもよい。
【００１７】
この構成によれば、生成した目的プログラムについて実行効率の向上等を目的とする最適化を行うことができる。
＜実施の形態＞
本実施の形態に係るコンパイラ装置は、ソースプログラムを読み込み、プログラムを字句列に分解する字句解析を行い、字句の列に基づいてプログラミング言語の構文木を構築する構文解析を行い、構文解析によって構築された構文木に基づいて装置内部の中間語で記述された中間プログラムを生成し、中間プログラムについて命令スケジューリング等の最適化を行い、変数についてレジスタ等の資源割付を行った後の中間プログラムを実行形式プログラムに変換する。
＜構成＞
図１は、実施の形態におけるコンパイラ装置1の全体構成を示す機能ブロック図である。
【００１８】
コンパイラ装置1は、構文解析部11、最適化部12、資源割付部13、実行コード生成部14を含んで構成される。
コンパイラ装置1は、具体的には、マイクロプロセッサ、ＲＯＭ（Ｒｅａｄ Ｏｎｌｙ Ｍｅｍｏｒｙ）、ＲＡＭ（Ｒａｎｄｏｍ Ａｃｃｅｓｓ Ｍｅｍｏｒｙ）、ハードディスク装置等を用いて実現されるコンピュータシステムである。前記ＲＯＭ又は前記ハードディスク装置は、コンピュータプログラムを記憶している。
【００１９】
図1に示したコンパイラ装置1の各部の機能は、前記マイクロプロセッサが、前記コンピュータプログラムを実行することにより実現される。また、情報の記憶及び各部間での受け渡しは、前記ＲＡＭ及びハードディスク装置を用いて実現される。
以下、各部の機能について説明する。
構文解析部11は、ソースプログラム51を読み出し、構文解析を行ってソースプログラム51中の制御構造を認識し、中間コード列である中間プログラムを生成し、コンパイラ装置１内に格納する。中間コードは、ソースプログラムの制御構造と等価な制御構造となるように条件分岐文とラベルとを用いて表したものである。
【００２０】
最適化部12は、プログラム変換部120を含んで構成され、構文解析部11で生成された中間プログラムについて、制御フロー解析及びデータフロー解析を行い、その解析結果を後述するプログラム変換部120へ送出する。また、プログラム変換部120によって生成された中間コードから実行コードに変換する際に最適化処理を行う。
ここで、制御フロー解析は、中間プログラムの制御の流れを解析して中間プログラムを基本ブロックに分割することであり、データフロー解析は、変数の生存区間、定義箇所及び参照箇所を解析することである。
【００２１】
尚、変数の定義及び参照について以下の様に定める。
命令文において変数が保持する値が更新される場合に、その命令文において変数が定義されると言い、その命令文を変数の定義箇所と呼ぶ。また、命令文において変数が保持する値が使われる場合、その変数は、その命令文で参照されると言い、その命令文を変数の参照箇所と呼ぶ。
【００２２】
次に、プログラム変換部120について説明する。
プログラム変換部120は、変数情報算出部121、実行経路中間コード生成部122、判定中間コード生成部123、保証中間コード生成部124と分岐中間コード生成部125を含んで構成される。
プログラム変換部120は、装置外からホットパス情報が入力されるとプログラム変換部120の内部に格納し、ホットパスを含むサブルーチンプログラムについてプログラム変換を行う。
【００２３】
ここで、ホットパス情報は、ユーザによって予め定められた実行経路を表す情報を、ホットパス情報としてユーザから入力される。
変数情報算出部121は、最適化部12から送出された解析結果に基づき各基本ブロックにおける変数の生存情報及び定義情報を算出し、算出した生存情報と定義情報、及びホットパス情報に基づいてパス入力変数、パス出力変数、パス置換対象変数、パス保証変数を算出する。また、変数情報算出部121は、算出したパス置換対象変数を実行経路中間コード生成部122へ送出し、パス保証変数を保証中間コード生成部124へ送出する。
【００２４】
ここで、変数の生存情報は制御フロー解析によって生成された各基本ブロックの入口で生存している変数(以下「生存情報IN」という)と出口で生存している変数(以下「生存情報OUT」という)を示している。生存情報INは、基本ブロックの入口以降で定義される前に参照される変数であり、生存情報OUTは基本ブロックの出口以降で定義される前に参照される変数である。また、変数の定義情報(以下「定義情報DEF」という)は各基本ブロックにおいて定義されている変数を示している。
【００２５】
尚、変数の生存については文献A.V.Aho, R.Sethi, J.D.Ullman“Compilers,Principle,Techniques, and Tool”，Addison  Wesley  Publishing  Company  Inc.,1986,(邦訳)原田賢一“コンパイラI、II”サイエンス社，1990，P631，63
2に記載されているものと同様である。
【００２６】
パス入力変数はホットパスの入口において生存している変数であり、すなわちホットパスの始点となる基本ブロックにおける生存情報INを示している。パス出力変数はホットパスの出口において生存している変数であり、すなわちホットパスの終点となる基本ブロックにおける生存情報OUTを示している。
パス置換対象変数は、パス入力変数であり、かつホットパス上で定義されている変数を示しており、パス保証変数は、パス置換対象変数であり、かつパス出力変数である変数を示している。
【００２７】
次に、実行経路中間コード生成部122は、プログラム変換部120に格納されたホットパス情報52と、コンパイラ装置内に格納された中間プログラムを読み出し、中間プログラムのホットパスに対応する命令文について、変数情報算出部121から送出されたパス置換対象変数の識別子を置換えた実行経路中間コードを生成し、実行経路中間コードを判定中間コード生成部123へ送出する。
【００２８】
ここで、パス置換対象変数の識別子の置換について説明する。
実行経路中間コード生成部122は、変数の識別子等の情報を表した変数名表に存在しない識別子に置換え、変数の置換えと同時にパス置換対象変数と置換した変数のペアを生成してプログラム変換部120内部に格納する。変数名表は、字句解析の際にプログラム上で宣言されている変数の識別子と変数の型等の情報を集めたものであり、コンパイラ装置１内に格納される。
【００２９】
判定中間コード生成部123は、実行経路中間コード生成部122から送出された実行経路中間コードに含まれる分岐命令を、ホットパスが実行される条件となるように変換して判定中間コードを生成し、分岐命令を除く実行経路中間コードに続いて判定中間コードが実行されるように、判定中間コードを実行経路中間コードに挿入し、挿入した実行経路中間コードをプログラム変換部120の内部に格納する。
【００３０】
保証中間コード生成部124は、変数情報算出部121から送出されたパス保証変数に基づいて、パス保証変数の識別子を元の識別子に復元する保証中間コードを生成し、プログラム変換部120の内部に格納する。
分岐中間コード生成部125は、プログラム変換部120の実行経路中間コードに含まれる判定中間コードを読み出し、判定中間コードの条件が真である場合に、実行経路中間コードの実行に続いて保証中間コードを実行し、当該条件が偽である場合に、実行経路中間コードの実行に続いて部分中間コードを実行する分岐中間コードを生成する。また、分岐中間コード生成部125は、判定中間コードの実行に続いて分岐中間コードが実行されるように、判定中間コードを実行経路中間コードに挿入し、挿入後の実行経路中間コードをプログラム変換部120の内部に格納する。
【００３１】
資源割付部13は、生成された全中間コードを読み出し、中間コードから実行コードを生成する際に、全中間コードにおける変数の生存情報に基づいて各変数にレジスタ、メモリなどのハードウェア資源を割当てる。
実行コード生成部14は、資源割付が行われた全中間コードについて、機械語である実行コードに変換しコンパイラ装置外に出力する。
【００３２】
＜データ＞
本実施の形態のコンパイラ装置1で用いるデータについて説明する。
図10(ａ)は、変数情報算出部121が図5(b)に示す制御フローグラフの基本ブロック毎に、変数の生存情報であるIN302，OUT304、定義情報であるDEF303を算出した結果を示している。
【００３３】
次に、図10(b)は、変数情報算出部121が同図(ａ)の算出結果に基づいてパス入力変数401、パス出力変数402、パス置換対象変数403、パス保証変数404を算出した結果を示している。
図10(ｃ)は、実行経路中間コード生成部122が図９に示す制御フローグラフの各基本ブロックにおいて、パス置換対象変数と置換えた変数のペアの生成履歴を示している。図9に示す制御フローグラフは、実行経路中間コード生成部122が図5(b)のホットパス200の命令文を複写し、複写した命令文について変数置換処理を行い、新たに生成した実行経路を示している。
＜動作＞
次に、本発明の特徴部分であるプログラム変換部120内部の動作を中心に、図2に示す動作フローを説明する。
【００３４】
尚、本実施の形態の説明においてプログラム変換部120は、サブルーチンプログラムを処理対象とし、このサブルーチンプログラムを部分プログラムと呼ぶ。部分プログラム中には、部分プログラムの始点と終点を共通とする複数の実行経路があるものとする。
まず、構文解析部11は、部分プログラムが入力されると構文解析を行い、部分プログラムに対応する部分中間コードを生成し、コンパイラ装置1の内部に格納する(ステップS11)。
【００３５】
次に、プログラム変換部120は、ホットパス情報52(図1)が入力されると、ホットパス情報をプログラム変換部120の内部に格納する(ステップS12)。
ステップS12に続いて最適化部12は、部分中間コードを読み出し、制御フロー解析、データフロー解析を行い、解析結果を変数情報算出部121へ送出し、変数情報算出部121は部分プログラムの各基本ブロックにおける変数の生存情報（IN,OUT）、定義情報（DEF）を算出する(ステップS13)。
【００３６】
次に、変数情報算出部121はステップS13で算出された生存情報（IN,OUT）、定義情報DEF、及びステップS12において入力されたホットパス情報に基づいてパス入力変数、パス出力変数、パス置換対象変数、及びパス保証変数を算出する。変数情報算出部121は、実行経路中間コード生成部122へパス置換対象変数を送出し、保証中間コード生成部124へパス保証変数を送出する(ステップS14)。
【００３７】
ステップS14に続いて、実行経路中間コード生成部122はホットパス情報と部分中間コードを読み出し、部分中間コードのホットパスに対応する命令文を複製し、複製した命令文についてパス置換対象変数の識別子を置換えた実行経路中間コードを生成し、判定中間コード生成部123へ実行経路中間コードを送出する(ステップS15)。
次に、判定中間コード生成部123は、実行経路中間コードを受け取ると、実行経路中間コードに含まれている分岐命令をホットパスが実行される条件となるように変換した判定中間コードを生成し、分岐命令以外の命令文に続いて判定中間コードが実行されるように、判定中間コードを実行経路中間コードに挿入し、判定中間コードを含む実行経路中間コードをプログラム変換部120の内部に格納する(ステップS16)。
【００３８】
次に、保証中間コード生成部124は、変数情報算出部121から受け取ったパス保証変数を復元する保証中間コードを生成し、プログラム変換部120の内部に格納する(ステップS17)。
ステップS17に続いて、分岐中間コード生成部125は、ステップS16において格納された実行経路中間コードを読み出し、当該判定中間コードの条件が成立しない場合には、判定中間コードに続いてステップS11で生成された部分中間コードの始点から実行する。また、条件が成立する場合には、判定中間コードに続いてステップS17で生成された保証中間コードを実行するように分岐中間コードを生成し、実行経路中間コードに挿入する (ステップS18)。
【００３９】
最適化部12は、ステップS11において格納された部分中間コードと、ステップS16において格納された実行経路中間コードと、S17で格納された保証中間コードを読み出して最適化処理を行う(ステップS19)。
＜変数情報算出処理＞
次に、変数情報算出処理について図3を用いて説明する。
【００４０】
ステップS21において変数情報算出部121は、最適化部12が部分中間コードについて制御フロー解析、データフロー解析を行った結果に基づいて部分プログラムの変数の生存情報(IN、OUT)、定義情報(DEF)を算出する(ステップS22)。
続いて、変数情報算出部121は、ステップS22において算出された生存情報INのうちホットパスの始点となる基本ブロックにおける生存情報INをパス入力変数として算出し、ステップS22において算出された生存情報OUTのうち、ホットパスの終点となる基本ブロックにおける生存情報OUTをパス出力変数として算出する(ステップS23)。
【００４１】
ステップS23に続いて、変数情報算出部121は、ホットパスにおける定義情報DEF且つパス入力変数である変数をパス置換対象変数として算出する(ステップS24)。
続いて、変数情報算出部121はステップS24で算出したパス置換対象変数であり且つパス出力変数である変数をパス保証変数として算出し実行経路中間コード生成部122へパス保証変数及びパス置換対象変数を送出する(ステップS25)。
＜変数置換処理＞
実行経路中間コード生成部122は、変数情報算出部121から送出されたパス置換対象変数のデータを受け取ると、部分中間コードとホットパス情報を読み出し、部分中間コードのホットパスに対応する命令文を複製し、複製した命令文のパス置換対象変数に対し変数置換処理を繰り返し行い、パス置換対象変数と置換した変数のペア(以下「変数のペア」と言う)を生成する。
【００４２】
以下、図４を用いて変数置換処理について説明する。
実行経路中間コード生成部122は、複製した命令文について繰り返し変数置換処理を行う(ステップS30)。
実行経路中間コード生成部122が、命令文でパス置換対象変数が参照され(ステップS31：YES)、既に生成された変数のペアに当該パス置換対象変数が含まれていると判断した場合(ステップS32：YES)、当該命令文で参照されているパス置換対象変数の識別子をペアに含まれている変数に置換え(ステップS33)、ステップS34へ進む。 また、ステップS31及びステップS32の判定においてパス置換対象変数が参照されていないと判断(ステップS31：NO)した場合もステップS34へ進む。
【００４３】
次に、命令文でパス置換対象変数が定義され(ステップS34：YES)、既存の変数のペアに当該パス置換対象変数が含まれていると判断した場合(ステップS35：YES)、当該パス置換対象変数のペアを削除し(ステップS36)、ステップS37へ進む。またステップS35において変数のペアが存在しないと判断した場合(ステップS35：NO)、ステップS37へ進む。
ステップS3７において、定義されているパス置換対象変数を置換える変数を定め、定めた変数に置換え、当該パス置換対象変数と置換えた変数とのペアを新たに生成する。
＜動作例＞
次に、図５(ａ)のソースプログラムの一部である部分プログラムを例に、前述した図2に示す動作フローについて図5、図9〜図12を用いて説明する。尚、この例における中間コードはソースプログラムに近い中間コードで表したものとして説明する。
【００４４】
ステップS11において構文解析部11は、部分プログラムを構文解析し、部分中間コードを生成してコンパイラ装置1の内部に格納する。
次に、ステップS12においてプログラム変換部120は、制御フローグラフ(図５(ｂ))の基本ブロックB1、B2、B4、B5、B7の順に遷移する経路200をホットパスとするホットパス情報が入力されると、当該ホットパス情報をプログラム変換部120内に格納する。
【００４５】
ステップS13において最適化部12は、制御フロー解析、データフロー解析を行い、変数情報算出部121は、制御フローグラフ(図5(b))の基本ブロックB1〜B7における生存情報IN、生存情報OUT、定義情報DEFを算出する(図10(ａ))。例えば、基本ブロックB1(図5(ｂ))の生存情報INは、図10(a)のブロックB1のIN302に含まれる変数であり、同ブロックの生存情報OUTは同図のブロックB1のOUT304に含まれる変数である。また、同ブロックにおける定義情報は同図のブロックB1のDEF303に含まれている変数である。
【００４６】
次に、ステップS14において変数情報算出部121は、図10(ａ)に示す生存情報、定義情報と、ステップS12で入力されたホットパス情報に基づいてパス入力変数401、パス出力変数402、パス置換対象変数403及びパス保証変数404を算出する(図10(b))。
パス入力変数401は、ホットパスの入口で生存する変数、すなわち基本ブロックB1(図5(b))の生存情報INであり、図10(a)のブロックB1のIN302に含まれている変数である。
【００４７】
パス出力変数402は、ホットパスの出口で生存する変数、すなわち基本ブロックB7(図5(b))の生存情報OUTであり、図10(a)のブロックB7のOUT304に含まれている変数である。
パス置換対象変数403は、パス入力変数401とホットパス200上の基本ブロックB1、B2、B4、B5、B7におけるDEF303(図10(ａ))に含まれる変数である。
また、パス保証変数404は、パス出力変数402とパス置換対象変数403に含まれる変数である
この例では、図10(a)のDEF303に含まれる変数が｛a,c,d,f,x｝であり、パス入力変数が｛b,c,d,e,g,z,w,y,｝であるので｛c,d｝がパス置換対象変数となり、パス出力変数が[a,c,e,f,z,w,x,y]であるので、｛c｝がパス保証変数となる。
【００４８】
変数情報算出部121は、算出したパス置換対象変数を実行経路中間コード生成部122へ送出し、パス保証変数を保証中間コード生成部124へ送出する。
次に、ステップS15において実行経路中間コード生成部122は、部分中間コードとホットパス情報を読み出し、図5のホットパス200上の命令文S１〜命令文S15を複製し、複製した命令文を含む新たな基本ブロックB12〜B72を生成する。複製した命令文のパス置換対象変数について変数置換処理を行い、変数のペアを生成する。複製した命令文に変数置換処理を行い、新たに生成された実行経路を図9に示す。
【００４９】
ここで、図9の基本ブロックB12、B22を例に変数置換処理(図4)の動作を説明する。
変数置換処理前の基本ブロックB12に含まれる複製した命令文は、図５(b)に示す基本ブロックB1に含まれる命令文と同じである。基本ブロックB12の複製した命令文S12において、パス置換対象変数ｃは参照されているが(図4ステップS31:YES)、変数ｃのペアが存在していないため(図4ステップS32:NO)、実行経路中間コード生成部122は命令文S12の変数ｃについて変数置換処理を行わず、また命令文S12ではパス置換対象変数は定義されていないため（図４ステップS34:NO）、次の複製した命令文S22における変数に注目する。実行経路中間コード生成部122は、変数の置換え前の命令文S22において、パス置換対象変数ｃが定義されており(図４ステップS34:YES)、変数ｃのペアが存在しないと判断し(図４ステップS35:NO)、定義箇所の変数ｃの識別子を変数名表及び変数のペアで使われていないt1に定めて置換え、新たに変数のペア(ｃ,t1)を生成する(図4ステップS37)。 次に命令文S32ではパス置換変数の参照も定義も存在しないので変数置換処理は行わず、次の基本ブロックB22の実行文S42に注目する。（なお、基本ブロックB12への変数置換処理を行った後のペアの生成状態は図10(c)のB12行の502に示すとおりである。）
引き続き、実行経路中間コード生成部122は、変数の置換え前の命令文S42において、パス置換変数ｃが参照されており（図４ステップS31:YES）、変数ｃのペア(ｃ,t1)が存在しているので（図10(c)のB12行の502）、参照箇所の変数ｃの識別子をt1で置き換える。次に命令文S42ではパス置換対象変数ｃが定義もされており(図４ステップS34:YES)、変数ｃのペア(ｃ,t1)が存在すると判断し(図４ステップS35:YES)、ペア(ｃ,t1)を削除し(図４ステップS36)、定義箇所の変数ｃの識別子を変数名表及び変数のペアで使われていないt2に定めて置換え、新たに変数のペア(ｃ,t2)を生成する(図4ステップS37)。
【００５０】
この例において、実行経路中間コード生成部122が、基本ブロックB72の命令文S152まで変数置換処理を繰り返し、生成された変数のペアの履歴500を図10(c)に示す。
実行経路中間コード生成部122は、図10(c)に示すブロック501がB72の変数ペア（ｃ,t2）及び(ｄ,t3)を保証中間コード生成部124へ送出し、図9に示す実行経路中間コードの命令文S12〜命令文S152を判定中間コード生成部123へ送出する。
【００５１】
次に、ステップS16において判定中間コード生成部123は、受け取った命令文中の分岐条件S32と分岐条件S92を、ホットパスが実行される条件となる判定中間コードS201(図11の基本ブロックB104)に変換して基本ブロックB104を生成し、基本ブロックB104をプログラム変換部120内に格納する。
次に、ステップS17において保証中間コード生成部124は、変数情報算出部121から送出されたパス保証変数｛ｃ｝と変数のペア（c,t2）より、t2をｃに戻す保証中間コードの命令文S301を生成し、命令文S301を含む基本ブロックB103(図11)を生成する。
【００５２】
ステップS18において分岐中間コード生成部125は、図11の基本ブロックB104を読み出し、命令文S201の判定が真である場合に基本ブロックB103の命令文S301を実行し、判定が偽である場合に基本ブロックB1の命令文S1から実行する分岐中間コードを生成し、実行経路中間コードに挿入する。
ステップS19において最適化部12は、ステップS18までの処理で生成された中間コードについて実行速度を向上させるように最適化を行う。
【００５３】
図12は基本ブロックB104の命令文について命令スケジューリングを行った後の基本ブロックB124を示している。尚、“//”の表記はこの表記に後続する命令文が並列に実行されることを示している。
＜変形例1＞
上述した実施の形態では、判定中間コード生成部123は、ホットパス200が実行される条件となるように、図９に示す分岐条件S32と分岐条件S92を論理積で結合して分岐命令S201の分岐条件を生成したが、図13の命令文S202に示す様に、分岐条件S32及び分岐条件S92の各条件を反転させてもよい。
【００５４】
また、図13に示す様に、部分プログラムをサブルーチンプログラムとして、新たに生成された基本ブロックB114から基本ブロックB103の経路が主経路となるように、基本ブロックB114を、部分プログラムの直前に配置された基本ブロックB0の命令文S0の直後に配置し、基本ブロックB103を、部分プログラムの直後に配置された基本ブロックB8の命令文S17の直前に配置することとしてもよい。
【００５５】
以下、上記の場合の処理について、図２を用いて説明する。
尚、部分プログラムの前後に配置された命令文の中間コードは、予めプログラム変換部120内部に格納されているものとする。
ステップS15において、実行経路中間コード生成部122は、ホットパス200上の命令文S１〜命令文S15を複製して変数置換処理を行い、実行経路中間コードの命令文S12〜命令文S152(図9)を生成する。
【００５６】
また、実行経路中間コード生成部122は、命令文S0の直後に命令文S12〜命令文S152(図9)を配置してプログラム変換部120内に格納し、判定中間コード生成部123へ命令文S12〜命令文S152を送出する。
ステップＳ16において、判定中間コード生成部123は、受け取った命令文中の分岐条件S32と分岐条件S92の条件を反転させ、反転させた各分岐条件を複合した判定中間コードに変換する。判定中間コード生成部123は、プログラム変換部120内の命令文S12〜命令文S152と上記判定中間コードを含む基本ブロックB114を格納する。
【００５７】
次に、ステップS17において保証中間コード生成部124は、保証中間コードの命令文S301を含む基本ブロックB103を生成する。また、プログラム変換部120内の基本ブロックB114の直後に基本ブロックB103を配置し、基本ブロックB103の直後に命令文S17以下の命令文を配置する。
ステップS18において分岐中間コード生成部125は、基本ブロックB114を読み出し、上記判定中間コードの分岐条件が成立する場合に、ブロックB1の命令文S1に分岐する分岐中間コードを生成して判定中間コードに挿入することにより命令文S202を生成し、命令文S202を含む基本ブロックB114をプログラム変換部120内に格納する。
【００５８】
また、部分中間コードの命令文S15から命令文S17に分岐する分岐中間コードS16を生成し、命令文S15の直後に命令文S16を配置してプログラム変換部120内に格納する。
上述の様に、部分プログラムをサブルーチンプログラムとし、部分プログラムを除くソースプログラムのコードと実行経路コードを主経路となるように配置することにより、実行経路コードの終点からソースプログラムへ分岐する命令が無いため、実行経路コードの実行確率が高い場合には、メモリ領域を効率良く割当てることができ、主経路全体の実行速度を向上させることができる。
＜変形例２＞
上述の変形例１では、判定中間コード生成部123によって生成された命令文S202は、分岐条件S3と分岐条件S9を複合させて生成したが、図14の命令文S202及び命令文S203に示す様に、分岐条件毎に判定中間コードに変換してもよい。
【００５９】
この場合、ステップＳ16において、判定中間コード生成部123は、受け取った命令文中の分岐条件S32と分岐条件S92の条件を反転させ、反転させた各命令文を判定中間コードに変換する。
また、ステップS18において分岐中間コード生成部125は、命令文S32と命令文S92に係る上記各判定中間コードの条件が成立する場合に、ブロックB1の命令文S1に分岐する分岐中間コードを各々生成して、各判定中間コードに挿入することにより、命令文S202及び命令文S203を生成する。分岐中間コード生成部125は、命令文S202及び命令文S203を含む基本ブロックB134を生成してプログラム変換部120内に格納する。
【００６０】
尚、ステップS19において最適化部12により、基本ブロックB144の命令文について命令スケジューリング法による最適化を行った例を図15に示す。
図15に示す様に、分岐条件毎に判定中間コード及び分岐中間コードを生成することにより、ホットパスを実行できる条件の判定を早く行うことができるように最適化することができるので、ホットパスの実行確率が高くない場合には、他の経路を早く実行することができる。
＜補足＞
以上、本発明に係るコンパイラ装置について、実施の形態及び変形例に基づいて説明したが、本発明は実施の形態及び変形例に限られないことは勿論である。
（1）本実施の形態では、実行経路中間コード生成部122が変数置換処理を行う際に、中間コードのホットパスに対応する命令文を複製し、複製した命令文についてパス置換対象変数の変数置換処理を行っているが、ホットパスに対応する命令文を複製せず当該命令文を順次参照しながら変数置換処理を行い、実行経路中間コードを生成することとしてもよい。
（2）また、本実施の形態の変数置換処理では、定義されている場合は変数を置換え、置換える毎に変数のペアを生成し、参照されている場合は参照箇所を既存の変数のペアに含まれている識別子に置換えているが、パス置換対象変数の定義箇所と参照箇所を同じ識別子に置換えてもよい。
（3）本実施の形態では、ホットパス情報はユーザからプログラム変換部120へ入力されることとしているが、コンパイラ装置がプログラムを逐次実行するインタプリタ機能を有している場合や、コンパイラ装置がデバッガ装置などプログラム実行可能な装置と統合され動作する場合は、ソースプログラムを逐次実行して実行経路の情報を収集してメモリ等に格納し、プログラム変換部120が格納された実行経路の情報から実行頻度の高い経路を抽出することとしてもよい。
（４）本実施の形態では、プログラム変換部120は構文解析部11で変換した中間プログラムの中間コードについて変数置換処理を施してプログラム変換を行っているが、ソースプログラムのホットパスに係る命令文について変数置換処理を施し、プログラム変換を行うこととしてもよい。
（５）また、本発明は、プログラム又はデジタル信号を記録したコンピュータ読取り可能な記録媒体、例えば、フレキシブルディスク、ハードディスク、ＣＤ―ＲＯＭ、ＭＯ、ＤＶＤ、ＤＶＤ−ＲＯＭ、ＤＶＤ−ＲＡＭ、半導体メモリ等であるとしてもよい。また、本発明は、電気通信回線、無線又は有線通信回線、若しくはインターネットに代表されるネットワーク等を経由して伝送される前記コンピュータプログラム又は前記デジタル信号であるとしてもよい。
【産業上の利用可能性】
【００６１】
本発明に係るコンパイラ装置は、複数の実行経路を含むプログラムにおいて実行頻度の高い実行経路の実行速度を上げるようにプログラム変換することが可能であり、デジタル家電製品等の情報処理装置に組み込んで使用することができる。
【図面の簡単な説明】
【００６２】
【図１】本実施の形態に係るコンパイラ装置の機能構成図を示している。
【図２】本実施の形態に係るコンパイラ装置の動作フロー図を示している。
【図３】変数情報算出部121によってなされる変数情報算出処理のフローを示している。
【図４】実行経路中間コード生成部122によってなされる変数置換処理のフローを示している。
【図５】本実施の形態に係るコンパイラ装置の動作説明に使用する図である。
【図６】背景技術及び課題の説明に用いる図である。
【図７】背景技術及び課題の説明に用いる図である。
【図８】背景技術及び課題の説明に用いる図である。
【図９】本実施の形態に係るコンパイラ装置の動作説明に使用する図である。
【図１０】変数情報算出部121によって算出される変数情報と、実行経路中間コード生成部122によって生成される変数のペア生成履歴の構成と内容例を示す図である。
【図１１】実施の形態において、プログラム変換部120によりプログラム変換された後の制御フローグラフを示す図である。
【図１２】実施の形態において、最適化部12により命令スケジューリングがなされた実行経路中間コードを示す図である。
【図１３】変形例１における制御フローグラフを示す図である。
【図１４】変形例２における制御フローグラフを示す図である。
【図１５】変形例２において最適化部12によって命令スケジューリングがなされた実行経路中間コードを示す図である。
【符号の説明】
【００６３】
1   コンパイラ装置
11  構文解析部
12  最適化部
13  資源割付部
14  実行コード生成部14
51  ソースプログラム
52  ホットパス情報
53  実行プログラム
120 プログラム変換部
121 変数情報算出部
122 実行経路中間コード生成部
123 判定中間コード生成部
124 保証中間コード生成部
125 分岐中間コード生成部
【図１】
2006120124.tif 000003
【図２】
2006120124.tif 000004
【図３】
2006120124.tif 000005
【図４】
2006120124.tif 000006
【図５】
2006120124.tif 000007
【図６】
2006120124.tif 000008
【図７】
2006120124.tif 000009
【図８】
2006120124.tif 000010
【図９】
2006120124.tif 000011
【図１０】
2006120124.tif 000012
【図１１】
2006120124.tif 000013
【図１２】
2006120124.tif 000014
【図１３】
2006120124.tif 000015
【図１４】
2006120124.tif 000016
【図１５】
2006120124.tif 000017