(57)【特許請求の範囲】
【請求項１】
中間言語プログラムを解釈して実行し、中間言語プログラムの分岐命令を実行するごとに、実行結果が分岐か非分岐かを識別して、各該分岐命令ごとに実行結果の分岐及び非分岐別に実行回数を累積し、該実行回数の情報をプロファイル情報格納部に出力する情報収集部と、
前記プロファイル情報格納部に出力された実行回数から、各分岐命令についての分岐確率、及びループの回転数の、少なくとも何れか一方を、該中間言語プログラムに対応させて算出し、分岐確率の算出値が０又は１になる場合、及び回転数の算出値が０になる場合には、当該算出値を非０の所定値に設定し直した分岐確率及び回転数に基づく所定の最適化処理を該中間言語プログラムについて行って、中間言語プログラムから目的プログラムを生成する後処理部に渡す最適化部と
を有することを特徴とするコンパイラ装置。
【発明の詳細な説明】
【０００１】
【産業上の利用分野】
本発明は、計算機における原始プログラムの翻訳処理において、分岐やループについて分岐回数を減少する最適化を行う場合に、最適化の資料とするために、実行パス上の各所要点の実行回数を示すプロファイル情報を収集し、又、収集したプロファイル情報を使用して最適化を行うためのコンパイラ装置に関する。
【０００２】
【従来の技術と発明が解決しようとする課題】
計算機の原始プログラムから目的プログラムを生成するコンパイラの処理では、よく知られているように、先ず前処理部が原始プログラムの構文解析を行い、解析結果に基づいて原始プログラムを、中間言語プログラムに変換し、次に後処理部が中間言語プログラムから目的プログラムを生成する。
【０００３】
ここで、中間言語プログラムとは、コンパイル処理の便宜のために、目的プログラムを実行するプロセッサの機械語命令に、より近い表現として定めた言語で記述されたプログラムである。
【０００４】
又、そのようなコンパイラの処理において、各種の観点からの最適化が行われ、最適化には分岐を少なくする最適化があることも、よく知られているとおりである。
【０００５】
ここで分岐減少化による最適化とは、分岐命令において分岐の発生を少なくして、シーケンシャルな実行を多くすることと、ループの場合（ループも通常は、ループの末端から先頭への分岐と考えることができる）にループの繰り返し回数（以下に回転数という）を少なくするように、ループ長を延長する等の方法で行われる最適化を言っている。
【０００６】
特に、プログラムの実行装置として、常にシーケンシャルに複数命令を先読みして並行実行することにより高速化する機構を持つマイクロプロセッサが使用される場合等には、分岐によって並行実行の流れが乱されることによるペナルティが大きいために、前記のような分岐減少化による最適化が特に要求される。
【０００７】
分岐減少化による最適化には、実際の実行において、各分岐点について分岐と非分岐（シーケンシャル進行）との何れが多いかを判断することが必要であり、そのために分岐と非分岐との割合を示す分岐確率が用いられる。
【０００８】
又、ループを延長する最適化の場合には、最適化の結果として実行時間を短縮する効果を得る反面に、目的プログラムを大きくするという損失を伴うので、ループの長さ等と、実行時の回転数とを勘案して、最適化の適否を判断する必要がある。
【０００９】
そこで、例えば図５（ａ）  のような原始プログラムがある場合に、原始プログラム上で分岐を生じるｉｆ文等に着目して、例えば各ｉｆ文の判定条件が真の場合の分岐路を観測点として検出し、例えば図５（ｂ）  に示すように、それらの観測点ごと、及びプログラムの開始点に例えば実行回数を計数する関数（図に関数名ｃｏｕｎｔｅｒとして示す）  を挿入して、プログラムの実行状態を示す情報、いわゆるプロファイル情報を収集するためのプログラムとする。
【００１０】
このプロファイル情報収集プログラムは、例えば図５（ｃ）に示すような中間言語プログラムに変換されるので、それによって生成される目的プログラムを繰り返し実行し、各実行において適当に異なる各種入力データを与えることにより、各ｃｏｕｎｔｅｒ  関数を実行した回数を計数するようにすれば、それぞれの観測点の実行回数を収集することが可能である。
【００１１】
なお図５において、Ａ、Ｂ、Ｃはラベル、＝は代入演算の記号、＝＝、！＝、＜＝は比較演算の記号、ｒｅｔ  は呼出元への復帰命令であり、例えば「ｘ  ！＝  ｙ  ｔｈｅｎ  ｇｏｔｏ  Ａ」はｘとｙとが等しくなければラベルＡ  のアドレスへ分岐し、等しければ次に続く命令を実行することを示す命令である。又、ラベルの値は、その直後の命令のアドレスである。
【００１２】
以上により収集した実行回数から、各ｉｆ分岐について分岐確率を求めて、コンパイラに与えることにより、コンパイラは各分岐点について、分岐確率の大きい方の分岐路をシーケンシャルな命令実行によって通るように最適化する。
【００１３】
又、ループについては、例えば対象のプログラムの実行ごとにおける繰り返し実行回数の平均を求め、回転数が或る所定値を越え、例えばループ長が制限値より短い場合に、最適化の対象とする。
【００１４】
以上の分岐減少化による最適化は、前記のとおりマイクロプロセッサのアーキテクチャに対応するものであり、従ってマイクロプロセッサの、いわゆる機械語命令に対応した目的プログラムのレベルでの分岐の発生に対応させることが必要である。
【００１５】
しかし、前記のような原始プログラムのレベルで設定される観測点によって得られるプロファイル情報では、それを目的プログラム上の分岐に適切に反映させることが困難な場合がある。
【００１６】
本発明は、適切な観測点によるプロファイル情報の収集を可能にし、それによってプロファイル情報を収集し、収集したプロファイル情報を使用して最適化を行うことのできるコンパイラ装置を目的とする。
【００１７】
【課題を解決するための手段】
図１は、本発明の構成を示すブロック図である。
図１（ａ）の第１の発明のコンパイラ装置は、前処理部１が原始プログラムを翻訳して中間言語プログラム５を生成し、後処理部２が中間言語プログラムから目的プログラム６を生成するコンパイラ装置であって、ブロック構造解析部３及び中間言語変換部４を有する。
【００１８】
ブロック構造解析部３は、中間言語プログラム５を所定のブロックの並びに区分する。各該ブロックは、１個以上の命令からなる命令列であって、該命令列の先頭以外に分岐先となる命令が無く、該命令列の末尾以外に分岐命令が無い命令列とする。
【００１９】
中間言語変換部４は、中間言語プログラム５に、各該ブロックが各１個のラベルを持つように所要のラベルを設け、後処理部２は、中間言語プログラム５から生成する目的プログラム６に、各該ラベルに対応する目的プログラム６上のアドレスを示すラベル情報１２を付加する。
【００２０】
第２の発明では、第１の発明のコンパイラ装置が情報収集部７を有する。
情報収集部７は、前記後処理部２が出力する目的プログラム６を実行させ、目的プログラム６のラベル情報１２に示される各該アドレス別に、当該アドレスに位置する命令が実行された実行回数を収集して、プロファイル情報格納部８に出力する。
【００２１】
図１（ｂ）に示す第３の発明では、前処理部１が原始プログラムを翻訳して中間言語プログラム５を生成する。
次に情報収集部１１が、中間言語プログラム５を解釈して実行し、当該中間言語プログラム５の分岐命令を実行するごとに、実行結果が分岐か非分岐かを識別して、各該分岐命令ごとに実行結果の分岐及び非分岐別を示す実行回数を累積し、該実行回数の情報をプロファイル情報格納部８に出力する
図１（ｃ）に示す第４の発明は、前処理部１が原始プログラムを翻訳して中間言語プログラム５を生成し、後処理部２が中間言語プログラムから目的プログラム９を生成するコンパイラ装置であって、最適化部１０を有する。
【００２２】
最適化部１０は、第２又は第３の発明の前記プロファイル情報格納部８に出力された実行回数から、各分岐命令についての分岐確率、及びループの回転数の、少なくとも何れか一方を、該中間言語プログラムに対応させて算出し、該算出した分岐確率及び回転数に基づく所定の最適化処理を中間言語プログラム５について行って後処理部２に渡す。
【００２３】
又、第５の発明では、前記最適化部１０は、プロファイル情報格納部８に出力された実行回数か各分岐命令についての分岐確率及びループの回転数を算出する場合に、分岐確率の算出値が０又は１になる場合、及び回転数の算出値が０になる場合には、当該算出値を非０の所定値とする。
【００２４】
【作用】
本発明のコンパイラ装置により、プロファイル情報の観測点が、機械語命令に近い中間言語プログラムについて設定される。
【００２５】
その観測点設定のために必要な場合は、中間言語プログラムに、分岐命令等を区切りとする適当なブロック分けをして、そのブロックを単位として、観測点をラベルで示し、その目的プログラムを実行した場合に、ラベルのアドレスにある命令を実行した回数を収集できるようにする。
【００２６】
従って、収集される実行回数から求める、分岐確率やループ回転数を、ブロックに直接対応付けて、適切な最適化を行うことができる。
【００２７】
【実施例】
図１（ａ）の前処理部１は、例えば前記図５（ａ）に例示した原始プログラムを解析して、中間言語プログラムを生成する。その場合の中間言語プログラムは、図６（ｄ）のようになる。
【００２８】
その中間言語プログラムをブロック構造解析部３が解析することにより、図６（ｅ）のようにブロックに分ける。
図２はブロック構造解析部３によるブロック分けの処理の流れの一例を示す図である。
【００２９】
前処理部１が所与の原始プログラムを解析して中間言語プログラム５を生成すると、ブロック構造解析部３は図２の処理ステップ２０で、中間言語プログラムの命令を指示するポインタを先頭の命令アドレスとし、ブロック番号を１とし、先頭命令のアドレスをブロックの開始番地として記録する等の初期設定を行って処理を開始する。
【００３０】
先ず処理ステップ２１で中間言語プログラム５から、ポインタの指示する命令を取り出し、処理ステップ２２でその命令が分岐命令か識別し、分岐命令でなければ、処理ステップ２３でその命令のアドレスが他の分岐命令の分岐先になっているかを、例えばその命令にラベルが付けられているか否かにより識別する。
【００３１】
分岐先でもなければ処理ステップ２４で、中間言語プログラムの終了かを、たとえばｒｅｔ  命令か否かで識別し、終了でなければ処理ステップ２５でポインタを次の命令に進めて処理ステップ２１からの処理を繰り返す。
【００３２】
処理ステップ２２で分岐命令と識別したときは、処理ステップ２５で現に取り出した分岐命令のアドレスを現ブロックの終了番地として記録すると共に、次のブロックに番号を進めて、現命令に続くアドレスを開始番地とする等の次のブロックの記録を準備した後処理ステップ２４に進む。
【００３３】
処理ステップ２３で分岐先と判定したときは、処理ステップ２７で現命令がブロックの先頭かを、ポインタと現ブロックの開始番地とを比較して識別し、先頭であれば特別の処理を要しないので処理ステップ２４へ進む。
【００３４】
処理ステップ２７で先頭で無いと判定したときは、処理ステップ２８で現に取り出した命令の直前の命令のアドレスを復元して、前命令のアドレスを現ブロックの終了番地として記録すると共に、ブロックの記録のブロック番号を次へ進めて、現に取り出した命令のアドレスを次のブロックの開始番地とした後処理ステップ２４に進む。
【００３５】
以上のようにして、処理ステップ２４で中間言語プログラムの終了を検出すると、処理ステップ２９で、現ブロックの記録に終了番地の設定が無ければ、現命令のアドレスを終了番地として処理を終わる。
【００３６】
以上の処理により、分岐先となっている命令をａ、分岐命令をｃ、ａでもｃでもない命令のみ１個以上からなる命令列をｂとすると、ａ、ａ−ｂ、ａ−ｂ−ｃ、ｂ、ｂ−ｃ、ｃ  の何れかのタイプのブロックによって、中間言語プログラムが区分され、例えば図５（ａ）のプログラム例から生成される中間言語プログラム（図６（ｄ））は、図６（ｅ）に示すように７ブロックになる。
【００３７】
中間言語変換部４はブロック分けされた中間言語プログラムについて、各ブロックにラベルを持つように、必要なラベルを付加する。
同時に、各分岐命令ごとの分岐確率の算出を容易にするために、例えば先ず分岐命令で終わるブロックが続く場合等に、そのようなブロックの連続する２ブロック間ごとに仮のブロックを挿入する。
【００３８】
図３は中間言語変換部４の処理の流れの一例を示す図であって、中間言語変換部４は、ブロック構造解析部３によってブロック分けされた中間言語プログラムと前記ブロックの記録を参照して、先ず処理ステップ３０で未処理の先頭の１ブロックを取り出す。
【００３９】
処理ステップ３１で、そのブロックにラベルが有るか識別し、ラベルが無ければ、処理ステップ３２で仮のラベルを付加する。
次に処理ステップ３３で、ブロックが分岐命令で終わっているか識別し、分岐命令でなければ、そのブロックの処理を終わり処理ステップ３７に進んで、未処理のブロックがあるか識別し、未処理があれば処理ステップ３０に戻って次のブロックを取り出す。
【００４０】
処理ステップ３３で分岐命令であった場合には、処理ステップ３４で次ブロックの最後が分岐命令か識別し、分岐命令であった場合は、分岐命令のブロックが連続するので、処理ステップ３６で仮ブロックを現処理ブロックと次のブロックとの間に挿入して、処理ステップ３７に進む。
【００４１】
この仮ブロックは、後述のようにして分岐確率計算等の処理を容易にするために挿入するものであって、ブロックの内容は無効命令（ｎｏｐと表す）とし、この仮ブロックにも仮のラベルを設ける。
【００４２】
処理ステップ３４で次のブロックの最後が分岐命令でなければ、処理ステップ３５で次ブロックの先頭が分岐先となっているか識別し、分岐先となっている場合も処理ステップ３６に進んで上記のように仮ブロックの挿入を行う。
【００４３】
次のブロックが分岐先にもなっていなければ、このブロックの処理は終わり、処理ステップ３５から処理ステップ３７に進んで前記のように処理する。
この中間言語変換部４による処理により、例えば図６（ｅ）のブロック分けされた中間言語プログラムが、例えば図６（ｆ）に示すように変換される。
【００４４】
この例から明らかなように、分岐命令のブロック（例えばブロック１）には、その直後に分岐命令の無いブロック（例えばブロック１に対するブロックＸ）が対になり、分岐命令のブロックのラベルのある命令  （例えばラベルＸ１における命令ａ＝ｋ）の実行回数が、分岐命令の全実行回数を示し、その後のブロックのラベルのある命令  （例えばラベルＸＸにおける命令ｎｏｐ）の実行回数が、分岐命令で分岐が発生しない場合の回数を示すというように、特定のラベルの対ごとに明確な対応関係が設けられ、実行回数から分岐確率を算出する場合の処理を容易にする。
【００４５】
図１の後処理部２は、以上でプロファイル情報収集用に変換された中間言語プログラムにより、所定の機械語命令からなる目的プログラム６と、ラベル情報１２とを生成する。ラベル情報は、各ラベルと、そのラベルの目的プログラム上のアドレスとを対応付けて示す項からなるテーブル情報である。
【００４６】
後処理部２は又、プロファイル情報収集のための情報収集テーブルを作成して、以上に付加しておく。
情報収集テーブルは、例えば図８（ａ）のように、キー、実行回数、対応識別番号の欄からなり、キー欄には各ラベル値が記録され、実行回数は実行時に累積記録されるための欄であり、対応識別番号は前記の分岐確率算出の便のための対応を、対応するラベルの項に同じ番号を付して識別するようにしたものである（図８（ａ）  は、図６（ｆ）のプログラム例の場合の情報収集テーブル例である）。
【００４７】
情報収集部７は、所定のプロファイル情報収集のための実行指定を受けると、指定の入力データにより目的プログラム６を実行させて、プロファイル情報を収集する。
【００４８】
そのための情報収集部７の一実施例としては、情報収集部７に通常のいわゆるトレース機能を設け、目的プログラム６の実行を１命令づつトレースすることにより、実行される命令のアドレスを監視し、ラベル情報１２を参照してラベルのアドレスが検出されると、ラベルをキーとして情報収集テーブルの該当項を索引し、その回数をラベル別に実行回数として累積して情報収集テーブルに記録するようにする。
【００４９】
又、他の実施例としては、情報収集部７は情報収集のために目的プログラム６を実行する場合の前処理として、先ずラベル情報１２を参照して、各ラベルに対応するアドレスにある各命令を例えばｔｒａｐ命令に置き換えて、概念的に図７に示すようなプログラムにし、元の命令はそのアドレスに対応付けて保存しておく。ここで、ｔｒａｐ命令とは、プログラム割込みを発生させる命令とする。
【００５０】
以上の前処理の後、命令置き換えを行った目的プログラムを実行させると、前記ｔｒａｐ命令実行ごとに割込みが発生するので、そこで情報収集部７は、割込みを発生したｔｒａｐ命令のアドレスを取得し、ラベル情報１２を参照してアドレスに対応するラベルを得、ラベルをキーとして情報収集テーブルの該当項を索引し、その回数をラベル別に実行回数として累積して情報収集テーブルに記録する。
【００５１】
その後、現アドレスにたいおう付けて保存してある命令を復元するようにｔｒａｐ命令を置き換えた後、その命令から目的プログラムの実行を再開する。
情報収集部７は、このようにして、指定のｎ回のプログラム実行をすべて終わると、プログラム観測回数ｎと情報収集テーブルとをプロファイル情報格納部８に出力する。
【００５２】
プロファイル情報格納部８は、原始プログラムのファイルの中に設けてもよく、又は別のファイルとして、例えばファイル名によって原始プログラムのファイルと関連付けるようにしてもよい。
【００５３】
図１（ｃ）の最適化部１０は、前処理部１が原始プログラムから生成する中間言語プログラム５について、その原始プログラムに対応するプロファイル情報格納部８から取り出す情報収集テーブルのプロファイル情報に基づく最適化を行う。
【００５４】
そのために最適化部１０は、先ずプロファイル情報格納部８に格納された、前記情報収集テーブルにより、分岐確率及びループの回転数を算出する。
図４は最適化部１０がプロファイル情報格納部８の、情報収集テーブルによる分岐確率及びループ回転数算出処理の流れの一例を示す図であり、先ず処理ステップ４０でプロファイル情報格納部８からプログラム観測回数ｎと情報収集テーブルを読み出す。
【００５５】
処理ステップ４１で情報収集テーブルの未処理の項の先頭から１項を処理対象に取り出し（これをａ項とする）、処理ステップ４２でその実行回数欄の値をａとする。
【００５６】
処理ステップ４３で、現ａ項と同じ対応識別番号を持つ別の項（これをｂ項とする）を取り出し、処理ステップ４４でその実行回数欄の値をｂとする。
処理ステップ４５で、ａ項のキー欄の値によって中間言語プログラム上の対応する分岐命令を識別し、それがループを構成するための分岐命令か、単なる分岐命令か解析する。
【００５７】
その結果、ループでなければ、処理ステップ４６で「（ａ−ｂ）／ａ  」を計算して、当該分岐命令の分岐確率とする。
ループの場合には、処理ステップ４７で「（ａ−ｂ）／ｎ  」を計算して、ループの平均回転数とする。
【００５８】
なお、第５の発明のとおり、以上で計算した分岐確率が１又は０の場合、及びａ＝０の場合（即ち、ａ＝０、ｂ＝０又はａ＝ｂの場合）には、分岐確率又は回転数を強制的に所定の非０値に設定するものとする。
【００５９】
例えば、分岐確率を算出する場合には、ａ＝０（当然ｂ＝０）であれば確率計算値を例えば０．５とし、ａ≠０でｂ＝０であれば算出値を例えば０．９とし、又回転数の計算値が０になる場合には、強制的に例えば１とし、分岐／非分岐確率や回転数を０にしないようにする。
【００６０】
これは、実行回数や分岐確率又は非分岐確率に０を指定することにより、強制的に該当パスを削除する機能をコンパイラが持っている場合等に対処するためである。
【００６１】
以上で算出した分岐確率又は回転数を、処理ステップ４８で中間言語プログラムの該当分岐命令のアドレスに対応付けて記録する。
処理ステップ４９で、情報収集テーブルの全項を処理したことを識別するまで、以上の処理を反復することにより、中間言語プログラムの各分岐命令ごとに対応して分岐確率又は回転数を算出して処理を終わる。
【００６２】
なお、以上の処理のために、最適化部１０は、予め中間言語プログラム５について、前記と同様のブロック分けと変換を行って図６（ｆ）に相当する中間言語プログラムを参照して、情報収集テーブルのキー欄のラベルと中間言語プログラム５との対応を付ける。
【００６３】
最適化部１０は、以上で求めた分岐確率及び回転数を参照することにより、前記従来と同様に分岐減少化の最適化を行うが、最適化処理の詳細は省略する。
第３の発明によりプロファイル情報を収集する場合に、図１（ｂ）の情報収集部１１は、中間言語プログラム５をそのまま解釈して実行するための、いわゆるインタプリタを主体に構成される。
【００６４】
即ち、情報収集部１１は、通常のインタプリタのように、中間言語プログラムの文字列を解釈して、１命令の文字列を取り出し、命令を解析して解析結果に従い、その命令の実行すべき処理を代行し、その処理結果で定まる次命令アドレスから、前記の文字列解釈を繰り返すことにより、中間言語プログラムの実行を進める。
【００６５】
情報収集部１１は、以上のようにして中間言語プログラムを一命令づつ実行する過程で、命令が分岐命令であった場合には、その分岐命令の実行を終わって次の命令に進む前に、実行の結果分岐が発生したか（分岐）、シーケンシャルに次の命令に進むか（非分岐）を識別して、分岐命令別に情報収集テーブルに実行回数と分岐であった場合の分岐回数とを累積して記録する。
【００６６】
情報収集テーブルは例えば図８（ｂ）  のように、アドレス、実行回数、分岐回数の欄を有し、アドレス欄には分岐命令のアドレスが記録され、実行回数欄にはその命令の実行回数を累積し、分岐回数欄には分岐が発生した回数を累積する。
【００６７】
図８（ｂ）が図６（ｄ）の中間言語プログラム（但し、この場合にはブロック分けの必要は無い）の情報収集テーブルの場合に、各項には図に参考として示す各分岐命令に対応して、アドレスが記録され、実行回数と分岐回数が累積される。
【００６８】
情報収集部１１は、以上のようにして、指定の回数のプログラム実行をすべて終わると、プログラム観測回数ｎと情報収集テーブルとをプロファイル情報格納部８に出力する。
【００６９】
この情報収集テーブルによって、最適化部１０が分岐確率及び回転数を算出する場合には、情報収集テーブルのアドレス欄によって中間言語プログラムとの対応をつけ、各項から直接に分岐確率又は回転数を算出して処理する。
【００７０】
【発明の効果】
以上の説明から明らかなように本発明によれば、分岐減少化による最適化を行うコンパイラ装置において、プロファイル情報の観測点が、機械語命令に近い中間言語プログラムについて設定され、適切な観測点によるプロファイル情報の収集および、そのデータに基づく適切な最適化が可能になるという著しい工業的効果がある。
【図面の簡単な説明】
【図１】本発明の構成を示すブロック図
【図２】ブロック構造解析部の処理の流れ図
【図３】中間言語変換部の処理の流れ図
【図４】分岐確率等の算出処理の流れ図
【図５】プログラム例による説明図（その１）
【図６】プログラム例による説明図（その２）
【図７】プログラム例による説明図（その３）
【図８】情報収集テーブルを説明する図
【符号の説明】
１  前処理部
２  後処理部
３  ブロック構造解析部
４  中間言語変換部
５  中間言語プログラム
６、９  目的プログラム
７、１１  情報収集部
１２  ラベル情報
８  プロファイル情報格納部
１０  最適化部
２０〜２９、３０〜３７、４０〜４９  処理ステップ
【図１】
0003550748.tif 000002
【図２】
0003550748.tif 000003
【図３】
0003550748.tif 000004
【図４】
0003550748.tif 000005
【図５】
0003550748.tif 000006
【図６】
0003550748.tif 000007
【図７】
0003550748.tif 000008
【図８】
0003550748.tif 000009