(57)【要約】【課題】プログラムの各処理が実行される頻度を高速に収集する。【解決手段】最適化対象のプログラムにおける各処理が実行される頻度に基づいてプログラムを最適化するコンパイラ装置は、プログラムのうち、繰り返し実行されるループ処理を検出するループ処理検出部と、プログラムにおいて、ループ処理が実行されるループ処理頻度を収集するループ処理頻度収集部と、ループ処理が実行される回数に対する、ループ処理に含まれる複数のループ内処理のそれぞれが実行される頻度であるループ内処理頻度を収集するループ内処理頻度収集部と、ループ処理頻度及びループ内処理頻度に基づき、プログラムが実行された場合における、複数のループ内処理のそれぞれが実行される頻度を示すループ内実行情報を生成するループ内実行情報生成部と、ループ内実行情報に基づき、プログラムを最適化する最適化部とを備える。【選択図】  図１
2004272826.tif 000002
【特許請求の範囲】
【請求項１】
最適化対象のプログラムにおける各処理が実行される頻度を収集し、収集した当該頻度に基づいて前記プログラムを最適化するコンパイラ装置であって、
前記プログラムのうち、繰り返し実行されるループ処理を検出するループ処理検出部と、
前記プログラムにおいて、前記ループ処理が実行されるループ処理頻度を収集するループ処理頻度収集部と、
前記ループ処理が実行される回数に対する、前記ループ処理に含まれる複数のループ内処理のそれぞれが実行される頻度であるループ内処理頻度を収集するループ内処理頻度収集部と、
前記ループ処理頻度及び前記ループ内処理頻度に基づき、前記プログラムが実行された場合における、前記複数のループ内処理のそれぞれが実行される頻度を示すループ内実行情報を生成するループ内実行情報生成部と、
前記ループ内実行情報生成部により生成された前記ループ内実行情報に基づき、前記プログラムを最適化する最適化部と
を備えるコンパイラ装置。
【請求項２】
前記ループ内処理頻度収集部は、前記ループ処理頻度が予め定められた頻度より高い場合に、前記ループ内処理頻度を収集する請求項１記載のコンパイラ装置。
【請求項３】
前記ループ内実行情報生成部は、前記ループ処理頻度に前記ループ内処理頻度を乗じることにより、前記ループ内実行情報を生成する請求項１記載のコンパイラ装置。
【請求項４】
前記ループ処理は、更に内側のループ処理である内側ループ処理を含む外側ループ処理であり、
前記ループ処理検出部は、前記内側ループ処理を更に検出し、
前記ループ処理頻度収集部は、前記プログラムにおいて、前記内側ループ処理が実行されるループ処理頻度を前記ループ内実行情報に基づいて更に収集し、
前記ループ内処理頻度収集部は、前記内側ループ処理のループ内処理頻度を収集し、
前記ループ内実行情報生成部は、前記内側ループ処理におけるループ内処理頻度に、前記内側ループ処理のループ処理頻度を乗じることにより、前記内側ループ処理のループ内実行情報を生成する請求項１記載のコンパイラ装置。
【請求項５】
前記ループ処理頻度収集部は、前記ループ処理が実行される回数を測定するカウンタを、前記プログラムが予め定められた回数実行された時点で停止して、当該カウンタにより測定された回数を前記ループ処理頻度として収集し、
前記ループ内処理頻度収集部は、前記複数のループ内処理のそれぞれが実行される回数を測定するカウンタを、前記複数のループ内処理の測定値の合計が予め定められた回数となった時点で停止する請求項１記載のコンパイラ装置。
【請求項６】
前記プログラムにおける、複数の命令列のそれぞれをノードとして生成し、前記複数の命令列間の実行順序を前記ノード間の有向エッジとして生成した制御フローグラフを生成する制御フローグラフ生成部と、
前記制御フローグラフにおいて、前記ループ処理を形成するノードの集合に代えて、前記ループ処理全体を示す単一のループノードを生成した外郭構造グラフと、前記ループ処理を形成するノードの集合の制御フローグラフであるループ内構造グラフとを生成する構造グラフ生成部と、
前記外郭構造グラフ及び前記ループ内構造グラフのそれぞれにおいて、当該構造グラフにおける各実行パスが実行される回数をカウントするべく、前記プログラムにカウンタを挿入するカウンタ挿入部と
を更に備え、
前記ループ処理頻度収集部は、前記プログラムが実行される回数に対する、前記ループノードが実行される回数を、前記ループ処理頻度として生成し、
前記ループ内処理頻度収集部は、前記ループ処理が実行される回数に対する、前記ループ内構造グラフにおける各実行パスが実行された回数を、前記ループ内処理頻度として収集する請求項１記載のコンパイラ装置。
【請求項７】
前記ループ処理頻度収集部は、前記プログラムが予め定められた回数実行された場合において、前記ループノードを含む実行パスが実行される回数をカウントするべく挿入されたカウンタの測定値を、ループ処理頻度として収集し、
前記ループ内処理頻度収集部は、前記複数のループ内処理の合計測定値が予め定められた回数となった場合において、前記ループ内構造グラフにおける各実行パスが実行される回数をカウントするべく挿入されたカウンタの測定値に基づき、ループ内処理頻度を収集する請求項６記載のコンパイラ装置。
【請求項８】
前記カウンタ挿入部は、前記外郭構造グラフの各実行パスが実行される回数を測定するべくカウンタを挿入する前記プログラム中の挿入位置が、前記ループ内構造グラフの各実行パスが実行される回数を測定するべくカウンタを挿入する前記プログラム中の位置と同一であり、かつ前記外郭構造グラフ及び前記ループ内構造グラフのうち多くとも一方におけるカウンタが起動される場合に、当該挿入位置において、前記外郭構造グラフ及び前記ループ内構造グラフの双方における実行パスが実行される回数を測定するカウンタを挿入する請求項６記載のコンパイラ装置。
【請求項９】
前記カウンタ挿入部は、前記外郭構造グラフの各実行パスが実行される回数を測定するべくカウンタを挿入する前記プログラム中の挿入位置が、前記ループ内構造グラフの各実行パスが実行される回数を測定するべくカウンタを挿入する前記プログラム中の位置と同一であり、かつ前記外郭構造グラフ及び前記ループ内構造グラフのうち多くとも一方におけるカウンタが起動される場合に、前記外郭構造グラフ及び前記ループ内構造グラフのそれぞれにおいて各実行パスの実行の回数を測定する複数の測定処理を生成し、
前記ループ内処理頻度収集部は、処理を他の部分に移すジャンプ命令を前記挿入位置に挿入し、当該ジャンプ命令のジャンプ先を、前記複数の測定処理の何れかに設定することにより、前記外郭構造グラフ及び前記ループ内構造グラフの双方における実行パスが実行される回数を測定する請求項６記載のコンパイラ装置。
【請求項１０】
前記ループ処理は、更に内側のループ処理である内側ループ処理を含む外側ループ処理であり、
前記ループ処理検出部は、前記内側ループ処理を更に検出し、
前記構造グラフ生成部は、前記外側ループ処理の制御フローグラフにおいて、前記内側ループ処理を形成するノードの集合に代えて、単一の内側ループノードを生成したグラフを外側ループ内構造グラフとして生成し、前記内側ループ処理を構成するノードの集合の制御フローグラフである内側ループ内構造グラフを生成し、
前記カウンタ挿入部は、前記内側ループ内構造グラフの各実行パスが実行される回数を測定するカウンタを更に挿入し、
前記ループ処理頻度収集部は、前記プログラムにおいて、前記内側ループ処理が実行されるループ処理頻度を前記ループ内実行情報に基づいて更に収集し、
前記ループ内処理頻度収集部は、前記内側ループ処理が実行される回数に対する、前記内側ループ内構造グラフにおける各実行パスが実行される頻度を、前記内側ループ処理におけるループ内処理頻度として収集し、
前記ループ内実行情報生成部は、前記内側ループ処理におけるループ内実行情報を、前記内側ループ処理におけるループ内処理頻度に、前記内側ループ処理のループ処理頻度を乗じることにより更に生成する請求項６記載のコンパイラ装置。
【請求項１１】
前記カウンタ挿入部は、前記外側ループ内構造グラフの各実行パスが実行される回数を測定するべくカウンタを挿入する前記プログラム中の挿入位置が、前記内側ループ内構造グラフの各実行パスが実行される回数を測定するべくカウンタを挿入する前記プログラム中の位置と同一であり、かつ前記外側ループ内構造グラフ及び前記内側ループ内構造グラフのうち多くとも一方におけるカウンタが起動される場合に、当該挿入位置において、前記外側ループ内構造グラフ及び前記内側ループ内構造グラフの双方における実行パスが実行される回数を測定するカウンタを挿入する請求項１０記載のコンパイラ装置。
【請求項１２】
前記カウンタ挿入部は、前記外側ループ内構造グラフの各実行パスが実行される回数を測定するべくカウンタを挿入する前記プログラム中の挿入位置が、前記内側ループ内構造グラフの各実行パスが実行される回数を測定するべくカウンタを挿入する前記プログラム中の位置と同一であり、かつ前記外側ループ内構造グラフ及び前記内側ループ内構造グラフのうち多くとも一方におけるカウンタが起動される場合に、前記外側ループ内構造グラフ及び前記内側ループ内構造グラフのそれぞれにおいて各実行パスの実行の回数を測定する複数の測定処理を生成し、
前記ループ内処理頻度収集部は、処理を他の部分に移すジャンプ命令を前記挿入位置に挿入し、当該ジャンプ命令のジャンプ先を、前記複数の測定処理の何れかに設定することにより、前記外側ループ内構造グラフ及び前記内側ループ内構造グラフの双方における実行パスが実行される回数を測定する請求項１０記載のコンパイラ装置。
【請求項１３】
最適化対象のプログラムにおける各処理が実行される頻度を収集し、収集した当該頻度に基づいて前記プログラムを最適化するコンパイラ装置としてコンピュータを機能させるコンパイラプログラムであって、
前記コンピュータを、
前記プログラムのうち、繰り返し実行されるループ処理を検出するループ処理検出部と、
前記プログラムにおいて、前記ループ処理が実行されるループ処理頻度を収集するループ処理頻度収集部と、
前記ループ処理が実行される回数に対する、前記ループ処理に含まれる複数のループ内処理のそれぞれが実行される頻度であるループ内処理頻度を収集するループ内処理頻度収集部と、
前記ループ処理頻度及び前記ループ内処理頻度に基づき、前記プログラムが実行された場合における、前記複数のループ内処理のそれぞれが実行される頻度を示すループ内実行情報を生成するループ内実行情報生成部と、
前記ループ内実行情報生成部により生成された前記ループ内実行情報に基づき、前記プログラムを最適化する最適化部と
して機能させるコンパイラプログラム。
【請求項１４】
請求項１３に記載のコンパイラプログラムを記録した記録媒体。
【請求項１５】
最適化対象のプログラムにおける各処理が実行される頻度を収集し、収集した当該頻度に基づいて前記プログラムを最適化するコンパイル方法であって、
前記プログラムのうち、繰り返し実行されるループ処理を検出するループ処理検出段階と、
前記プログラムにおいて、前記ループ処理が実行されるループ処理頻度を収集するループ処理頻度収集段階と、
前記ループ処理が実行される回数に対する、前記ループ処理に含まれる複数のループ内処理のそれぞれが実行される頻度であるループ内処理頻度を収集するループ内処理頻度収集段階と、
前記ループ処理頻度及び前記ループ内処理頻度に基づき、前記プログラムが実行された場合における、前記複数のループ内処理のそれぞれが実行される頻度を示すループ内実行情報を生成するループ内実行情報生成段階と、
前記ループ内実行情報生成部により生成された前記ループ内実行情報に基づき、前記プログラムを最適化する最適化段階と
を備えるコンパイル方法。
【請求項１６】
最適化対象のプログラムにおける各処理が実行される頻度を収集する実行時情報生成装置であって、
前記プログラムのうち、繰り返し実行されるループ処理を検出するループ処理検出部と、
前記プログラムにおいて、前記ループ処理が実行されるループ処理頻度を収集するループ処理頻度収集部と、
前記ループ処理が実行される回数に対する、前記ループ処理に含まれる複数のループ内処理のそれぞれが実行される頻度であるループ内処理頻度を収集するループ内処理頻度収集部と、
前記ループ処理頻度及び前記ループ内処理頻度に基づき、前記プログラムが実行された場合における、前記複数のループ内処理のそれぞれが実行される頻度を示すループ内実行情報を生成するループ内実行情報生成部と
を備え、前記ループ内実行情報生成部により生成された前記ループ内実行情報に基づき、前記プログラムを最適化させる実行時情報生成装置。
【請求項１７】
最適化対象のプログラムにおける各処理が実行される頻度を収集する実行時情報生成装置としてコンピュータを機能させる実行時情報生成プログラムであって、
前記コンピュータを、
前記プログラムのうち、繰り返し実行されるループ処理を検出するループ処理検出部と、
前記プログラムにおいて、前記ループ処理が実行されるループ処理頻度を収集するループ処理頻度収集部と、
前記ループ処理が実行される回数に対する、前記ループ処理に含まれる複数のループ内処理のそれぞれが実行される頻度であるループ内処理頻度を収集するループ内処理頻度収集部と、
前記ループ処理頻度及び前記ループ内処理頻度に基づき、前記プログラムが実行された場合における、前記複数のループ内処理のそれぞれが実行される頻度を示すループ内実行情報を生成するループ内実行情報生成部と
して機能させ、前記ループ内実行情報生成部により生成された前記ループ内実行情報に基づき、前記プログラムを最適化させる実行時情報生成プログラム。
【請求項１８】
請求項１７に記載の実行時情報生成プログラムを記録した記録媒体。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明は、コンパイラ装置、コンパイラプログラム、記録媒体、コンパイル方法、実行時情報生成装置、及び実行時情報生成プログラムに関する。特に本発明は、プログラムを実行させた場合に得られる実行情報を用いて最適化を行うコンパイラ装置、コンパイラプログラム、記録媒体、コンパイル方法、実行時情報生成装置、及び実行時情報生成プログラムに関する。
【０００２】
【従来の技術】
従来、プログラムにおける複数の実行パスのそれぞれが実行される回数を収集する技術が用いられている。例えば、非特許文献１に記載の技術によると、コンパイラは、複数の実行パスが実行される回数をカウントするべく、カウンタを適切な位置に挿入することができる。
【０００３】
【非特許文献１】
Ｂａｌｌ，Ｔ及びＬａｒｕｓ，Ｊ．Ｒ．著”Ｅｆｆｉｃｉｅｎｔ  Ｐａｔｈ  Ｐｒｏｆｉｌｉｎｇ”第２９回マイクロアーキテクチャ国際会議（ＭＩＣＲＯ−２９）会議録、４６ページ−５７ページ、平成８年１２月、邦題「効率的パスプロファイル」
【０００４】
【発明が解決しようとする課題】
しかしながら、上記技術は、各実行パスが実行される回数を適切に収集できるものの、収集の処理に長い時間を要する。
そこで本発明は、上記の課題を解決することのできるコンパイラ装置、コンパイラプログラム、記録媒体、コンパイル方法、実行時情報生成装置、及び実行時情報生成プログラムを提供することを目的とする。この目的は特許請求の範囲における独立項に記載の特徴の組み合わせにより達成される。また従属項は本発明の更なる有利な具体例を規定する。
【０００５】
【課題を解決するための手段】
即ち、本発明の第１の形態によると、最適化対象のプログラムにおける各処理が実行される頻度を収集し、収集した当該頻度に基づいてプログラムを最適化するコンパイラ装置は、プログラムのうち、繰り返し実行されるループ処理を検出するループ処理検出部と、プログラムにおいて、ループ処理が実行されるループ処理頻度を収集するループ処理頻度収集部と、ループ処理が実行される回数に対する、ループ処理に含まれる複数のループ内処理のそれぞれが実行される頻度であるループ内処理頻度を収集するループ内処理頻度収集部と、ループ処理頻度及びループ内処理頻度に基づき、プログラムが実行された場合における、複数のループ内処理のそれぞれが実行される頻度を示すループ内実行情報を生成するループ内実行情報生成部と、ループ内実行情報生成部により生成されたループ内実行情報に基づき、プログラムを最適化する最適化部とを備えるコンパイラ装置、コンパイル方法、コンパイラプログラム、実行時情報生成装置、実行時情報生成プログラム、及び記録媒体を提供する。
なお上記の発明の概要は、本発明の必要な特徴の全てを列挙したものではなく、これらの特徴群のサブコンビネーションも又発明となりうる。
【０００６】
【発明の実施の形態】
以下、発明の実施の形態を通じて本発明を説明するが、以下の実施形態は特許請求の範囲にかかる発明を限定するものではなく、又実施形態の中で説明されている特徴の組み合わせの全てが発明の解決手段に必須であるとは限らない。
図１は、コンパイラ装置１０の機能ブロック図を示す。コンパイラ装置１０は、最適化対象のプログラムにおける各処理が実行される頻度を収集する実行時情報生成装置２０と、実行時情報生成装置２０により収集された当該頻度に基づいてプログラムを最適化する最適化部３０とを備える。実行時情報生成装置２０は、制御フローグラフ生成部１００と、ループ検出部１１０と、構造グラフ生成部１２０と、カウンタ挿入部１３０と、ループ処理頻度収集部１４０と、ループ内処理頻度収集部１５０と、ループ内実行情報生成部１６０とを備え、ループ内実行情報生成部１６０により生成されたループ内実行情報に基づき、最適化部３０によりプログラムを最適化させる。
【０００７】
制御フローグラフ生成部１００は、コンパイル対象のプログラムを受け取ると、当該プログラムにおける、複数の命令列のそれぞれをノードとして生成し、当該複数の命令列間の実行順序をノード間の有向エッジとして生成した制御フローグラフを生成する。そして、制御フローグラフ生成部１００は、制御フローグラフをプログラムと共にループ検出部１１０に送る。
【０００８】
なお、コンパイル対象のプログラムは、最適化を効率良く行うべくソースプログラムから生成された中間表現であり、例えば、Ｊａｖａ（登録商標）言語のバイトコードである。これに代えて、プログラムは、ＲＴＬ（Ｒｅｇｉｓｔｅｒ  Ｔｒａｎｓｆｅｒ  Ｌａｎｇｕａｇｅ）であってもよいし、四つ組表現であってもよい。
また、命令列とは、連続して実行される命令の集合である。一例としては、命令列は、最初に実行される命令及び最後に実行される命令以外の命令が、分岐命令の分岐元及び分岐命令の分岐先の何れでもない命令の集合である基本ブロック（Ｂａｓｉｃ  Ｂｌｏｃｋ）である。他の例としては、命令列は、最初に実行される命令及び最後に実行される命令以外の命令が、分岐命令の分岐先とならない命令の集合であるスーパーブロック（Ｓｕｐｅｒ  Ｂｌｏｃｋ）であってよい。
【０００９】
ループ検出部１１０は、制御フローグラフ及びプログラムを制御フローグラフ生成部１００から受け取ると、プログラムのうち、繰り返し実行されるループ処理を検出する。ループ検出部１１０は、検出したループ処理が、更に内側のループ処理である内側ループ処理を含む場合に、当該内側ループ処理を更に検出する。そして、ループ検出部１１０は、検出したループ処理の情報を、制御フローグラフ及びプログラムと共に、構造グラフ生成部１２０に送る。なお、ループ処理とは、制御フローグラフにおいて、互いに到達可能なノードの集合である強連結成分に対応する命令の集合である。
【００１０】
構造グラフ生成部１２０は、制御フローグラフにおいて、外側ループ処理を形成するノードの集合に代えて、外側ループ処理全体を示す単一のノードである外側ループノードを生成した外郭構造グラフを生成する。また、構造グラフ生成部１２０は、外側ループ処理の制御フローグラフにおいて、内側ループ処理を形成するノードの集合に代えて、内側ループ処理全体を示す単一のノードである内側ループノードを生成した外側ループ内構造グラフを生成する。更に、構造グラフ生成部１２０は、内側ループ処理の制御フローグラフである内側ループ内構造グラフを生成する。そして、構造グラフ生成部１２０は、外郭構造グラフ、外側ループ内構造グラフ、内側ループ内構造グラフ、及びプログラムを、カウンタ挿入部１３０に送る。
【００１１】
カウンタ挿入部１３０は、外郭構造グラフ、外側ループ内構造グラフ、及び内側ループ内構造グラフのそれぞれにおいて、当該構造グラフにおける各実行パスが実行される回数をカウントするべく、プログラムにカウンタを挿入する。そして、カウンタ挿入部１３０は、カウンタを挿入したプログラムを、外郭構造グラフ、外側ループ内構造グラフ、及び内側ループ内構造グラフと共にループ処理頻度収集部１４０に送る。
【００１２】
ループ処理頻度収集部１４０は、外郭構造グラフ、外側ループ内構造グラフ、及び内側ループ内構造グラフをカウンタ挿入部１３０から受け取る。そして、ループ処理頻度収集部１４０は、カウンタを挿入したプログラムをカウンタ挿入部１３０から受け取った場合に、外郭構造グラフの各実行パスが実行される回数をカウントするべく挿入されたカウンタを起動し、受け取ったプログラムを実行する。その後、ループ処理頻度収集部１４０は、起動したカウンタを、プログラムが予め定められた回数実行された時点で停止する。そして、ループ処理頻度収集部１４０は、停止した時点でカウンタにより測定された、外側ループ処理が実行された回数を、外側ループ処理が実行される外側ループ処理頻度として収集し、収集結果をプログラムと共にループ内処理頻度収集部１５０に送る。また、ループ処理頻度収集部１４０は、プログラムが実行された回数に対する、外郭構造グラフの各実行パスが実行された頻度である外郭構造グラフ頻度情報を、プログラムと共に、最適化部３０に送る。
【００１３】
好ましくは、ループ処理頻度収集部１４０は、タイマー・サンプリング・プロファイラ等の、プログラムの実行頻度を測定する装置を用いて、より頻繁に実行されるプログラム片を検出し、当該プログラム片の外郭構造グラフについてのみ、カウンタを起動する。ここで、プログラム片とは、例えば、メソッド（ｍｅｔｈｏｄ）、関数（ｆｕｎｃｔｉｏｎ）、又は手続（ｐｒｏｃｅｄｕｒｅ）である。この場合、より頻繁に実行されるプログラム片を優先して最適化することができるので、プログラムの処理速度を向上できると共に、コンパイラ装置１０を高速に動作させることができる。
【００１４】
一方、ループ処理頻度収集部１４０は、外側ループ処理のループ内実行情報をループ内実行情報生成部１６０から受け取った場合に、当該ループ内実行情報に基づき、内側ループ処理のループ処理頻度を収集し、収集結果をループ内処理頻度収集部１５０に送る。
【００１５】
ループ内処理頻度収集部１５０は、外側ループ処理頻度の収集結果をループ処理頻度収集部１４０から受け取ると、外側ループ処理の処理頻度が、予め定められた基準頻度より高いか否かを判断する。外側ループ処理の処理頻度が基準頻度より高い場合に、ループ内処理頻度収集部１５０は、外側ループ内構造グラフの各実行パスが実行される回数をカウントするべく挿入されたカウンタを起動することにより、外側ループ処理における複数のループ内処理のそれぞれが実行される回数を測定する。その後、ループ内処理頻度収集部１５０は、起動としておいたカウンタを、複数のループ内処理の測定値の合計が予め定められた回数となった時点で停止する。そして、ループ内処理頻度収集部１５０は、停止したカウンタの測定値に基づいて、外側ループ内処理が実行される回数に対する、各外側ループ内処理が実行された回数を、外側ループ内処理頻度として収集し、収集結果をループ内実行情報生成部１６０に送る。
【００１６】
ループ内処理頻度収集部１５０が、内側ループ処理頻度の収集結果をループ処理頻度収集部１４０から受け取った場合の処理は、ループ内処理頻度収集部１５０が、外側ループ処理に対して行う処理と略同一であるので説明を省略する。
【００１７】
ここで、例えば、ループ内処理とは、構造グラフの実行パス上にある命令の集合である。これに代えて、ループ内処理とは、構造グラフの各ノードが示す命令列であってもよいし、構造グラフ中の分岐命令であってもよい。即ち、ループ内処理頻度収集部１５０は、プログラム中の命令から、予め設定した方法で複数の命令グループを生成し、各命令グループが実行される回数を各ループ内処理が実行される回数として測定する。
【００１８】
ループ内実行情報生成部１６０は、外側ループ処理頻度及び外側ループ内処理頻度を受け取った場合に、プログラムが実行された場合における、複数の外側ループ内処理のそれぞれが実行される頻度を示すループ内実行情報を生成し、ループ処理頻度収集部１４０及び最適化部３０に送る。また、ループ内実行情報生成部１６０は、内側ループ処理頻度及び内側ループ内処理頻度を受け取った場合に、プログラムが実行された場合における、複数の内側ループ内処理のそれぞれが実行される頻度を示すループ内実行情報を生成し、最適化部３０に送る。
【００１９】
なお、ループ内実行情報生成部１６０は、内側ループ処理の更に内側にループ処理がある場合には、内側ループ処理のループ内実行情報を、ループ処理頻度収集部１４０に更に送ってもよい。この場合、ループ処理頻度収集部１４０及びループ内処理頻度収集部１５０は、内側ループ処理の更に内側にあるループ処理について略同一の動作を繰り返す。
【００２０】
最適化部３０は、ループ内実行情報及び外郭構造グラフ頻度情報に基づき、ループ処理頻度収集部１４０から受け取ったプログラムを最適化する。なお、これに代えて、最適化部３０は、カウンタ挿入部１３０によりカウンタが挿入される以前のプログラムを最適化してもよい。そして、最適化部３０は、最適化した後のプログラムを、コンパイル結果のプログラムとして出力する。
【００２１】
図２は、コンパイラ装置１０のフローチャートを示す。制御フローグラフ生成部１００は、コンパイル対象のプログラムを受け取ると、当該プログラムの制御フローグラフを生成する（Ｓ２００）。そして、ループ検出部１１０は、プログラムのうち、繰り返し実行されるループ処理を検出する（Ｓ２１０）。ループ検出部１１０は、検出したループ処理が、更に内側のループ処理である内側ループ処理を含む場合に、当該内側ループ処理を更に検出する。
【００２２】
構造グラフ生成部１２０は、制御フローグラフにおいて、外側ループ処理を形成するノードの集合に代えて、外側ループ処理全体を示す単一のノードである外側ループノードを生成した外郭構造グラフを生成する（Ｓ２２０）。また、構造グラフ生成部１２０は、外側ループ処理の制御フローグラフにおいて、内側ループ処理を形成するノードの集合に代えて、内側ループ処理全体を示す単一のノードである内側ループノードを生成した外側ループ内構造グラフを生成する。更に、構造グラフ生成部１２０は、内側ループ処理の制御フローグラフである内側ループ内構造グラフを生成する。
【００２３】
カウンタ挿入部１３０は、外郭構造グラフ、外側ループ内構造グラフ、及び内側ループ内構造グラフのそれぞれにおいて、当該構造グラフにおける各実行パスが実行される回数をカウントするべく、プログラムにカウンタを挿入する（Ｓ２３０）。そして、ループ処理頻度収集部１４０は、プログラムを実行することにより、ループ処理の処理頻度、例えば、外側ループ処理頻度を生成する（Ｓ２４０）。また、ループ処理頻度収集部１４０は、外側ループ処理のループ内処理頻度に基づいて内側ループ処理頻度を生成する。ループ内処理頻度収集部１５０は、ループ処理の処理頻度が、予め定められた基準頻度より高い場合に（Ｓ２５０：ＹＥＳ）、ループ処理が実行される回数に対する、ループ処理における複数のループ内処理のそれぞれが実行されるループ内処理頻度を収集する（Ｓ２６０）。ループ内実行情報生成部１６０は、ループ処理頻度及びループ内処理頻度に基づいて、ループ内実行情報を生成する（Ｓ２７０）。ループ内実行情報生成部１６０は、ループ処理が更に内側にループ処理を含む場合に（Ｓ２８０：ＹＥＳ）、内側のループ処理の処理頻度を収集するべく、Ｓ２４０に処理を移す。
【００２４】
ループ処理の処理頻度が、予め定められた基準頻度より低い場合（Ｓ２５０：ＮＯ）、又は、ループ処理が更に内側にループ処理を含まない場合に（Ｓ２８０：ＮＯ）、最適化部３０は、ループ内実行情報に基づき、プログラムを最適化し、コンパイル結果のプログラムとして出力する（Ｓ２９０）。
【００２５】
なお、ループ内処理頻度収集部１５０が、ループ内処理頻度を収集するタイミングは、本フローチャートにおけるタイミングに限定されない。例えば、ループ処理頻度収集部１４０が、外郭構造グラフの各実行パスが実行される回数の収集を開始する時点で、ループ内処理頻度収集部１５０は、外側ループ内構造グラフ及び内側ループ内構造グラフのそれぞれについても、ループ内処理頻度の収集を開始してもよい。また、他の例としては、外側ループ内構造グラフ及び内側ループ内構造グラフ間に、ループ内処理頻度を収集する順序を予め定めておき、ループ内処理頻度収集部１５０は、当該予め定められた順序に応じて、ループ内処理頻度を収集してもよい。
【００２６】
更に他の例としては、プログラム内に複数の外側ループ処理が存在する場合には、ループ内処理頻度収集部１５０は、ループ処理の階層の深さ毎に、ループ内処理頻度の収集を開始してもよい。例えば、ループ内処理頻度収集部１５０は、一の外側ループ処理におけるループ内処理頻度の収集を開始する場合には、他の外側ループ処理におけるループ内処理頻度の収集を開始し、一の内側ループ処理におけるループ内処理頻度の収集を開始する場合には、他の内側ループ処理におけるループ内処理頻度の収集を開始してもよい。
【００２７】
図３は、最適化対象のプログラムの一例を示す。この最適化対象のプログラムは、１行目から１４行目の文が示すメソッド「ｍ」を有する。メソッド「ｍ」は、４行目から１２行目までの外側ループ処理を有する。そして、外側ループ処理は、６行目から１０行目までの内側ループ処理を有する。９行目の文は、８行目に示した条件が成立した場合に、メソッド「ｍ」の処理を終了する処理を示す。
【００２８】
また、３行目の文、５行目の文、６行目の文、７から８行目の文、９行目の文、１１から１２行目の文、及び１３行目の文は、それぞれ、第１から第７基本ブロックを構成する。
【００２９】
図４は、制御フローグラフの一例を示す。制御フローグラフ生成部１００は、図３に示したプログラムを受け取ると、本図で示す制御フローグラフを生成する。本図において、丸印は、プログラムの命令列を示すノードであり、矢印は、命令列間の実行順序を示す有向エッジである。また、本図における命令列は基本ブロックであり、ノード中に記載の番号は、図３で示した基本ブロックを識別するノード番号である。一例としては、第３ノードから第４ノード及び第６ノードに向かう有向エッジは、第３基本ブロックの後に、第４基本ブロック又は第６基本ブロックが実行される旨を示している。
【００３０】
図５（ａ）は、構造グラフを生成する対象となる制御フローグラフの一例を示す。本図に示した制御フローグラフによると、ループ前処理が行われた後に、ヘッダノード５００及びラッチノード５１０が順次実行される。続いて、ラッチノード５１０の処理結果に応じて、ヘッダノード５００又はループ後処理が実行される。即ち、ヘッダノード５００及びラッチノード５１０は、ループ処理を形成している。
【００３１】
図５（ｂ）は、制御フローグラフの実行パスを示す。図５（ａ）に示した制御フローグラフは、ループ前処理からヘッダノード５００及びラッチノード５１０を順次実行し繰り返し実行することなくループ後処理に移る実行パス５２０と、ループ前処理からヘッダノード５００及びラッチノード５１０を順次実行し繰り返し処理に移る実行パス５３０と、ラッチノード５１０からヘッダノード５００に至る実行パスが更にラッチノード５１０を処理する実行パス５４０と、ヘッダノード５００及びラッチノード５１０を順次実行した後にループ後処理に移る実行パス５５０とを有する。
【００３２】
図５（ｃ）は、制御フローグラフから生成した構造グラフの実行パスを示す。構造グラフ生成部１２０は、外郭構造グラフと、ループ内構造グラフとを生成する。ループ内構造グラフは、実行パス５３０と、実行パス５４０と、実行パス５５０と、ヘッダノード５００からラッチノード５１０に至る制御フロー５６０とを有する。外郭構造グラフは、ループ前処理からループ処理を経てループ後処理に至る実行パス５２０を有する。このように、構造グラフ生成部１２０は、外郭構造グラフとして、制御フローグラフにおいて、ループ処理を形成するノードの集合に代えて、ループ処理全体を単一のループノードとして生成したグラフを生成する。即ち、本図における外郭構造グラフの実行パスは、実行パス５２０である。また、構造グラフ生成部１２０は、ループ内構造グラフとして、ループ処理を形成するノードの集合の制御フローグラフを生成する。即ち、本図におけるループ内構造グラフの実行パスは、実行パス５３０、実行パス５４０、実行パス５５０、及び制御フロー５６０である。
【００３３】
より具体的には、構造グラフ生成部１２０は、ループ内構造グラフを生成するべく、以下の処理を行う。構造グラフ生成部１２０は、ループ処理の外からループ処理が開始されるエントリーノードであるヘッダノード５００と、ループ処理からループ処理の外に処理を移すエグジットノードであるラッチノード５１０とを、ループ内構造グラフとして生成する。そして、構造グラフ生成部１２０は、制御フローグラフにおいてヘッダノード５００からラッチノード５１０に至る全てのエッジ及びノードを、ループ内構造グラフに含める。そして、構造グラフ生成部１２０は、ループ前処理に代えて、ループ内構造グラフの開始点を示すダミーノードから、ヘッダノード５００にエッジを生成する。また、構造グラフ生成部１２０は、ラッチノード５１０から、ループ後処理に代えて、ループ内構造グラフの終了点を示すダミーノードへのエッジを生成する。
【００３４】
図６（ａ）は、図４に示した制御フローグラフから生成される外郭構造グラフの一例を示す。本図における太線の丸印は、ループ処理に代えて生成されたループノードを示す。例えば、構造グラフ生成部１２０は、以下の処理により外郭構造グラフを生成する。構造グラフ生成部１２０は、図４に示した制御フローグラフにおいて、外側ループ処理を形成するノードの集合、即ち、第２ノード、第３ノード、第４ノード、及び第６ノードに代えて、外側ループ処理全体を示す外側ループノードである第２ノードを生成する。
【００３５】
続いて、構造グラフ生成部１２０は、第２ノードから、第２ノードの後に実行される第５ノード及び第７ノードに向けて、点線の有向エッジを生成する。ここで、点線の有向エッジは、図４で示した制御フローグラフに実際には存在せず、制御フローグラフにおける複数の有向エッジの組合せにより実現される仮想的な実行経路を示している。例えば、第２ノードから第５ノードに向かう有向エッジは、外側ループの実行の後に第４ノードを介して第５ノードに至る実行経路を示している。なお、外郭構造グラフの開始点及び終了点を示す仮想的なノードを、それぞれ、Ｅ１及びＸ１と示した。
【００３６】
図６（ｂ）は、図４に示した制御フローグラフから生成される外側ループ内構造グラフの一例を示す。構造グラフ生成部１２０は、以下の処理により外側ループ内構造グラフを生成する。構造グラフ生成部１２０は、外側ループ処理の制御フローグラフにおいて、内側ループ処理を構成するノードの集合、即ち、第３ノード及び第４ノードに代えて、内側ループ処理全体を示す内側ループノードである第３ノードを生成する。
【００３７】
そして、構造グラフ生成部１２０は、外側ループ内構造グラフの開始点Ｅ２から外側ループ処理の入り口である第２ノードへ至る点線の有向エッジと、第３ノードから外側ループ内構造グラフの終了点Ｘ２に至る点線の有向エッジと、第６ノードからＸ２に至る点線の有向エッジとを生成する。
【００３８】
図６（ｃ）は、図４に示した制御フローグラフから生成される内側ループ内構造グラフの一例を示す。構造グラフ生成部１２０は、以下の処理により内側ループ内構造グラフを生成する。構造グラフ生成部１２０は、内側ループ処理を構成するノードの集合の制御フローグラフを生成する。そして、構造グラフ生成部１２０は、内側ループ内構造グラフの開始点Ｅ３から内側ループ処理の入り口である第３ノードへ至る点線の有向エッジと、第３ノードから内側ループ内構造グラフの終了点Ｘ３に至る点線の有向エッジと、第４ノードからＸ３に至る点線の有向エッジとを生成する。
【００３９】
なお、本図の例とは異なり、コンパイル対象のプログラムが、既約グラフ（ｉｒｒｅｄｕｃｉｂｌｅ  ｇｒａｐｈ）である場合には、構造グラフ生成部１２０は、各構造グラフの開始点を示すノードから、ループ処理の開始点となり得る複数のノードのそれぞれに対して、有向エッジを生成する。
【００４０】
カウンタ挿入部１３０は、以上のように生成された構造グラフのそれぞれにおいて、各実行パスが実行される回数をカウントするべく、プログラムにカウンタを挿入する。カウンタ挿入部１３０により挿入されたカウンタの位置の一例を黒点で示した。例えば、外郭構造グラフにおいて、カウンタ挿入部１３０は、ノード４からノード５に至る有向エッジと、ノード６からノード７に至る有向エッジとに、カウンタを挿入する。また、外側ループ内構造グラフにおいて、カウンタ挿入部１３０は、ノード１からノード２に至る有向エッジと、ノード４からノード５に至る有向エッジと、ノード６からノード２に至る有向エッジと、ノード６からノード７に至る有向エッジとにカウンタを挿入する。また、内側ループ内構造グラフにおいて、カウンタ挿入部１３０は、ノード２からノード３に至る有向エッジと、ノード３からノード６に至る有向エッジと、ノード４からノード５に至る有向エッジとに、カウンタを挿入する。
【００４１】
なお、カウンタを挿入する位置は、本図の例に限定されない。例えば、非特許文献１には、各実行パスが実行される回数を効率的に測定する方法が提案されており、当該方法を用いてカウンタを挿入する位置を決定してもよい。即ち、カウンタ挿入部１３０は、各構造グラフにおいて、各実行パスが実行される回数をカウントできる位置に、カウンタを挿入する。また、カウンタ挿入部１３０は、必要に応じて、カウンタを初期化する初期化処理を挿入してもよい。また、プログラムに複数のカウンタが挿入される場合には、カウンタ挿入部１３０は、当該複数のカウンタの中から、測定対象のカウンタを変更する処理をプログラムに更に挿入してもよい。例えば、カウンタ挿入部１３０は、当該複数のカウンタを、それぞれが１つのカウンタである配列変数として生成した場合には、測定対象のカウンタを変更するべく、配列変数の添え字を変更する処理をプログラムに更に挿入してもよい。即ち、カウンタ挿入部１３０は、各実行パスが実行される回数をカウントするべく、カウンタを制御する処理を、プログラムに挿入する。
【００４２】
図７（ａ）は、プログラムに挿入されたカウンタが停止されている例を示す。カウンタ挿入部１３０は、構造グラフの各実行パスが実行される回数をカウントするべくカウンタを挿入するプログラム中の挿入位置に、ＮＯＰ命令７００を挿入する。そして、カウンタ挿入部１３０は、実行の回数を測定する測定処理７１０を生成する。カウンタ挿入部１３０は、ＮＯＰ命令７００の直後に実行される命令に処理を移すジャンプ命令を、測定処理７１０の最後に実行される箇所に生成する。
なお、より詳しくは、カウンタ挿入部１３０は、コンパイル対象のプログラムにおける基本ブロック内に、ＮＯＰ命令７００又はジャンプ命令７２０を挿入する。しかしながら、測定対象である実行パスによっては、ＮＯＰ命令７００又はジャンプ命令７２０を既存の基本ブロックに挿入できない場合がある。この場合、カウンタ挿入部１３０は、新たな基本ブロック、例えば、ＮＯＰ命令７００又はジャンプ命令７２０等の、カウンタを実現する命令を挿入する基本ブロックを、生成してもよい。
【００４３】
図７（ｂ）は、プログラムに挿入されたカウンタが起動されている例を示す。ループ内実行情報生成部１６０は、ＮＯＰ命令７００に代えて、処理を測定処理７１０にジャンプさせるジャンプ命令７２０を生成する。これにより、ループ内実行情報生成部１６０は、ジャンプ命令７２０を含む実行パスが実行された回数を、測定処理７１０により測定させることができる。
【００４４】
図７（ｃ）は、同一の挿入位置に複数のカウンタを生成する例を示す。本図を用いて、外郭構造グラフの各実行パスが実行される回数を測定するべくカウンタを挿入するプログラム中の挿入位置が、ループ内構造グラフの各実行パスが実行される回数を測定するべくカウンタを挿入するプログラム中の位置と同一であり、かつ外郭構造グラフ及びループ内構造グラフのうち多くとも一方におけるカウンタが起動される場合における、コンパイラ装置１０の処理を説明する。
【００４５】
カウンタ挿入部１３０は、外郭構造グラフ及びループ内構造グラフのそれぞれにおいて各実行パスが実行される回数を測定する複数の測定処理を生成する。例えば、カウンタ挿入部１３０は、外郭構造グラフの各実行パスが実行される回数を測定する測定処理７１０と、ループ内構造グラフの各実行パスが実行される回数を測定する測定処理７３０とを生成する。更に、カウンタ挿入部１３０は、カウンタの挿入位置（例えば、ジャンプ命令７２０の位置）の次に実行される命令にジャンプするジャンプ命令を、測定処理７１０及び測定処理７３０のそれぞれの最後に実行される位置に挿入する。
【００４６】
ループ内実行情報生成部１６０は、処理を測定処理７１０にジャンプさせるジャンプ命令７２０を、カウンタの挿入位置に生成することにより、外郭構造グラフの各実行パスが実行される回数を測定させる。また、ループ内実行情報生成部１６０は、処理を測定処理７３０にジャンプさせるジャンプ命令７２０を、カウンタの挿入位置に生成することにより、ループ内構造グラフ各実行パスが実行される回数を測定させる。このように、カウンタ挿入部１３０は、ジャンプ命令のジャンプ先を、複数の測定処理の何れかに設定することにより、当該挿入位置において、外郭構造グラフ及びループ内構造グラフの双方における実行パスが実行される回数を測定することができる。
【００４７】
また、外側ループ内構造グラフの各実行パスが実行される回数を測定するべくカウンタを挿入するプログラム中の挿入位置が、内側ループ内構造グラフの各実行パスが実行される回数を測定するべくカウンタを挿入するプログラム中の位置と同一であり、かつ外側ループ内構造グラフ及び内側ループ内構造グラフのうち多くとも一方におけるカウンタが起動される場合においても、以下に示すように、コンパイラ装置１０は、本図と略同一に動作する。
【００４８】
具体的には、カウンタ挿入部１３０は、外側ループ内構造グラフ及び内側ループ内構造グラフのそれぞれにおいて各実行パスが実行される回数を測定する複数の測定処理を生成する。例えば、カウンタ挿入部１３０は、外側ループ内構造グラフの各実行パスが実行される回数を測定する測定処理７１０と、内側ループ内構造グラフの各実行パスが実行される回数を測定する測定処理７３０とを生成する。更に、カウンタ挿入部１３０は、カウンタの挿入位置（例えば、ジャンプ命令７２０の位置）の次に実行される命令にジャンプするジャンプ命令を、測定処理７１０及び測定処理７３０のそれぞれの最後に実行される位置に挿入する。
【００４９】
そして、ループ内実行情報生成部１６０は、処理を測定処理７１０にジャンプさせるジャンプ命令７２０を、カウンタの挿入位置に生成することにより、外側ループ内構造グラフの各実行パスが実行される回数を測定させる。また、ループ内実行情報生成部１６０は、処理を測定処理７３０にジャンプさせるジャンプ命令７２０を、カウンタの挿入位置に生成することにより、内側ループ内構造グラフ各実行パスが実行される回数を測定させる。このように、カウンタ挿入部１３０は、ジャンプ命令のジャンプ先を、複数の測定処理の何れかに設定することにより、当該挿入位置において、外側ループ内構造グラフ及び内側ループ内構造グラフの双方における実行パスが実行される回数を測定することができる。
【００５０】
以上、本図で示したように、カウンタ挿入部１３０は、２つの構造グラフのうち多くとも一方におけるカウンタが起動される場合、即ち、２つの構造グラフの双方において同時にカウンタが使用されないことが保証される場合に、挿入位置において、２つの構造グラフの双方における実行パスが実行される回数を測定することができる。３つ以上の構造グラフについても同様に、コンパイラ装置１０は、多くとも一の構造グラフにおけるカウンタのみが起動される場合には、カウンタを共用することができる。
なお、カウンタ挿入部１３０は、同時に使用される２つのカウンタについては、当該２つのカウンタのそれぞれを挿入位置に生成する。例えば、外郭構造グラフにおいて各実行パスが実行される回数の収集が開始された時点で、外側ループ内構造グラフにおけるループ内処理頻度の収集を開始する場合には、カウンタ挿入部１３０は、外郭構造グラフ及び外側ループ内構造グラフのそれぞれにおけるカウンタのそれぞれを、挿入位置に生成する。このように、カウンタ挿入部１３０は、ループ内処理頻度を収集するタイミングに応じて、カウンタを挿入する方式を変更してもよい。
【００５１】
また、測定処理の実行に排他制御が行われず、複数のスレッドが同時に測定処理を実行する場合には、カウンタの値が不正確となる場合がある。しかしながら、スレッドの数が測定値に比べて充分小さい場合には、測定値の誤差はわずかであるので、コンパイラ装置１０は、各実行パスが実行される回数を略正確に測定することができる。
【００５２】
図８は、コンパイラ装置１０が生成した実行情報の一例を示す。より詳細には、本図は、実行パスを識別する識別番号に、実行パスを構成するノードの順列と、カウンタにより測定された実行パスの実行回数である測定値と、測定値に基づき生成された実行情報（例えば、ループ内実行情報）と、実際に実行された実行回数とを対応付けて、構造グラフ毎に示す。
【００５３】
ループ処理頻度収集部１４０は、プログラムを予め定められた１００回実行した時点で、外郭構造グラフの実行パスが実行される回数を測定するカウンタを停止する。この時点で、ノードＥ１から、第１ノード、第２ノード、及び第７ノードを順次実行し、ノードＸ１に至る第１実行パスが実行された回数は、１００回と測定される。即ち、第２実行パスは一度も実行されていない。この場合、ループ内実行情報生成部１６０は、プログラムが１００回実行された場合における、第１パスが実行される頻度である実行情報として１００．０を生成する。
【００５４】
続いて、ループ内処理頻度収集部１５０は、外側ループ処理頻度、即ち、第２ノードが実行される頻度が、予め定められた頻度より高い場合に、外側ループ内処理頻度を収集する。まず、ループ内処理頻度収集部１５０は、外側ループ内構造グラフにおける複数の実行パスのそれぞれが実行される回数を測定するカウンタを起動し、複数の実行パスにおける測定値の合計が予め定められた１００回となった時点で停止する。そして、ループ内処理頻度収集部１５０は、外側ループ処理が実行される回数に対する、各実行パスが実行される頻度である外側ループ内処理頻度を収集する。
【００５５】
例えば、外側ループ処理が実行された回数は、Ｅ２ノードから外側ループに処理が移った回数であるので、第３から第５実行パスの合計値である５１回となる。一方、例えば、第８実行パスが実行された回数は、４８回である。即ち、ループ内処理頻度収集部１５０は、外側ループ内処理頻度として、外側ループ処理が５１回実行された場合に、第８実行パスが４８回実行される旨を示す情報を収集する。
【００５６】
そして、ループ内実行情報生成部１６０は、外側ループ処理の処理頻度である１００．０に、外側ループ内処理頻度、例えば、第８実行パスの処理頻度である４８／５１を乗じることにより、外側ループ処理のループ内実行情報である９４．１を生成する。ループ内実行情報生成部１６０は、第３実行パスから第７実行パスにおいても、第８実行パスにおける方法と略同一の方法により、ループ内実行情報を生成するので、説明を省略する。
【００５７】
続いて、ループ処理頻度収集部１４０は、外側ループ処理のループ内実行情報に基づいて、内側ループ処理頻度、即ち、第３ノードが実行される頻度を算出する。例えば、ループ処理頻度収集部１４０は、外側ループ内構造グラフの第３ノードが実行される全ての実行パス、即ち、第３から第８パスを選択する。そして、ループ処理頻度収集部１４０は、選択したこれらのパスにおけるループ内実行情報の合計値である１９６．１を、内側ループ処理頻度として生成する。
【００５８】
続いて、ループ内処理頻度収集部１５０は、内側ループ処理頻度、即ち、第３ノードが実行される頻度が、予め定められた頻度より高い場合に、以下に示す処理により、内側ループ内処理頻度を収集する。ループ内処理頻度収集部１５０は、内側ループ内構造グラフにおける複数の実行パスのそれぞれが実行される回数を測定するカウンタを起動し、複数の実行パスにおける測定値の合計が予め定められた１００回となった時点で停止する。そして、ループ内処理頻度収集部１５０は、内側ループ処理が実行される回数に対する、各実行パスが実行される頻度である内側ループ内処理頻度を収集する。
【００５９】
例えば、内側ループ処理が実行された回数は、Ｅ３ノードから内側ループに処理が移った回数であるので、第９から第１１実行パスの合計値である５８回となる。一方、例えば、第１３実行パスが実行された回数は、４０回である。即ち、ループ内処理頻度収集部１５０は、内側ループ内処理頻度として、内側ループ処理が５８回実行された場合に、第１３実行パスが４０回実行される旨を示す情報を収集する。
【００６０】
そして、ループ内実行情報生成部１６０は、内側ループ処理の処理頻度である１９６．１に、内側ループ内処理頻度、例えば、第１３実行パスの処理頻度である４０／５８を乗じることにより、内側ループ処理のループ内実行情報である１３５．２を生成する。ループ内実行情報生成部１６０は、第９実行パスから第１２実行パス及び第１４実行パスにおいても、第１３実行パスにおける方法と略同一の方法により、ループ内実行情報を生成するので、説明を省略する。
【００６１】
以上で説明したループ内実行情報を生成する方法を、数式により示す。
ループ内実行情報生成部１６０は、構造グラフＸにおける各実行パスの実行情報を、各実行パスが実行された回数である測定値に、以下の式で示す補正係数Ｃｘを乗じることにより生成する。
【００６２】
【数１】
2004272826.tif 000003
【００６３】
ここで、ｔｈｒｅｓｈｏｌｄＣｏｕｎｔ（Ｘ）は、構造グラフＸに対応付けて予め設定され、構造グラフＸにおいて収集する測定値の合計値を示す。また、Ｃｐは、経路ｐに対して収集された実行回数の測定値、Ｐｘ（ａ）は、構造グラフＸ中のノードａを通る経路の集合、Ｐｘ（ｅｎｔｒｙ）は、構造グラフＸにおいてループ外からループへ入る経路の集合、Ｎｘは構造グラフＸに対応する上位階層の構造グラフ中のループノード、をそれぞれ表す。また、Ｃｙは、構造グラフＸの上位階層の構造グラフにおける補正係数である。ここで、上位階層とは、例えば、より外側のループ処理における構造グラフである。例えば、内側ループ内構造グラフの上位階層は、外側ループ内構造グラフであり、外側ループ内構造グラフの上位階層は、外郭構造グラフである。
【００６４】
なお、本図は、他の方法により測定され、各実行パスが実際に実行された実行回数を、実行情報に対応付けて更に示す。当該他の方法は、プログラムを１００００回実行した場合の、各実行パスが実行された回数を測定している。
【００６５】
これに対し、本実施形態に係るコンパイラ装置１０は、実行パスが実行される回数を構造グラフ毎に１００回、計３００回測定することにより、実際の実行回数と略同一な実行情報を生成することができる。従って、コンパイラ装置１０は、コンパイル処理に要する時間を短縮することができる。
【００６６】
図９（ａ）は、外郭構造グラフにおいて測定された、各実行パスの実行回数を示す。プログラムが１００回実行された場合に、ノードＥ１から、第１ノード、第２ノード、及び第７ノードを経由してノードＸ１に至る第１実行パスは、１００回実行される。
【００６７】
図９（ｂ）は、外側ループ処理内構造グラフにおいて測定された、各実行パスの実行回数を示す。各実行パスの実行回数の合計が１００回となった場合に、ノードＥ２から、第２ノード、第３ノード、及び第６ノードを経由してノードＸ２に至る第４実行パスは、５０回実行される。また、第６ノード、第２ノード、及び第３ノードを経由して第６ノードに至る第８実行パスは、４８回実行される。
【００６８】
図９（ｃ）は、内側ループ処理内構造グラフにおいて測定された、各実行パスの実行回数を示す。各実行パスの実行回数の合計が１００回となった場合に、ノードＥ３から、第３ノードを経由してノードＸ３に至る第１１実行パスは、５６回実行される。また、第４ノード及び第３ノードを経由して第４ノードに至る第１３実行パスは、４０回実行される。
【００６９】
図９（ｄ）は、ループ内実行情報生成部１６０により生成されたループ内実行情報の一例を示す。ループ内実行情報生成部１６０は、プログラムが１００回実行された場合における、第８実行パスが実行される頻度を示すループ内実行情報を９４．１と生成する。また、ループ内実行情報生成部１６０は、プログラムが１００回実行された場合における、第４実行パスが実行される頻度を示すループ内実行情報を９８．０と生成する。また、ループ内実行情報生成部１６０は、プログラムが１００回実行された場合における、第１３実行パスが実行される頻度を示すループ内実行情報を１３５．２と生成する。即ち、コンパイラ装置１０によると、コンパイル対象のプログラムは、ループ処理を行わないままプログラムの開始点から終了点まで連続して実行する第４実行パスと、外側ループ処理を繰り返す第８実行パスと、内側ループ処理を繰り返す第１３実行パスとを、他の実行パスに比べてより高い頻度で実行する。
【００７０】
図１０（ａ）は、最適化部３０によりプログラムが最適化される例を示す。最適化部３０は、ループ内実行情報に基づき、より高い頻度で実行される複数の実行パス（ホットパス、Ｈｏｔ  Ｐａｔｈ）のそれぞれを、連続した領域に配置するべく、最適化を行う。例えば、最適化部３０は、第１ノード、第２ノード、第３ノード、第６ノード、及び第７ノードを連続して実行する第４実行パスを効率的に最適化するべく、外側ループ処理及び内側ループ処理を分離させる。最適化部３０は、外側ループ処理として、それぞれに斜線が付された第２ノード、第３ノード、第６ノード、及び第７ノードを、制御フローグラフから分離する。また、最適化部３０は、外側ループ処理に対してループピーリング（Ｌｏｏｐ  Ｐｅｅｌｉｎｇ）を行うことにより、それぞれに斜線が付された第３ノード及び第６ノードを、内側ループ処理として制御フローグラフから分離する。
【００７１】
図１０（ｂ）は、最適化部３０により最適化されたプログラムにおいて命令列が配置された結果を示す。最適化部３０は、第１ノードから第７ノードに至る命令列と、第２ノードから第７ノードに至る命令列と、第４ノードから第６ノードに至る命令列とを、それぞれ連続した領域に配置する。なお、連続して配置されないために実行される分岐処理を矢印で示す。また、各分岐処理における実行情報を矢印に付した。最適化部３０は、本図のように、分岐命令により分岐処理が行う頻度を低減することができる。これにより、ハードウェアによる分岐予測処理の効率を高めることができる。更に、プロセッサにおける命令（インストラクション）用のキャッシュメモリのヒット率が向上する。また、冗長な無条件分岐及び冗長な前方分岐の数を減らすことができる。
【００７２】
図１１は、第１の他の例において、実行情報を生成する方法を示す。本例のコンパイラ装置は、構造グラフを作ることなく、制御フローグラフの全ての実行パスについて、実行頻度を測定する。例えば、本例のコンパイラ装置は、図１１の黒点の位置、即ち、第１ノードから第２ノードに至るエッジ、第４ノードから第３ノードに至るエッジ、第４ノードから第５ノードに至るエッジ、第６ノードから第２ノードに至るエッジ、及び第６ノードから第７ノードに至るエッジのそれぞれに、カウンタを挿入し、各カウンタにおける測定値を収集する。
【００７３】
図１２（ａ）は、第１の他の例において収集された実行情報の例を制御フローグラフ上に示す。図１２（ｂ）は、第１の他の例において収集された実行情報の例を表で示す。本例のコンパイラ装置は、コンパイルに要する時間を短縮するべく、プログラムを３００回実行した時点で、カウンタを停止する。本例のコンパイラ装置は、本図に示すとおり、第１ノードから、第２ノード、第３ノード、及び第６ノードを介して第７ノードに至る第３実行パスと、第４ノードから、第３ノード及び第４ノードを介して第３ノードに至る第６実行パスとが、他の実行パスより高い頻度で実行されるホットパスである旨を検出することができる。しかしながら、プログラムを実行させる回数が少ないので、本例のコンパイラ装置は、第６ノードから、第２ノード、第３ノード、及び第６ノードを介して第２ノードに至る第１２実行パスが、ホットパスである旨を検出することができない。従って、図１０（ｂ）の例とは異なり、第２ノード、第３ノード、第６ノード、及び第７ノードを連続して配置する最適化を行うことができない。
【００７４】
これに対し、本実施形態におけるコンパイラ装置１０は、第１の他の例と同様コンパイルに要する時間を短縮しつつ、第１２実行パスがホットパスであることを検出することができる。
【００７５】
図１３は、第２の他の例において最適化されたプログラムの例を示す。本例のコンパイラ装置は、制御フローグラフにおける各有向エッジが処理される回数を測定するエッジプロファイル方式により、プログラムの実行情報を収集する。本例によると、第１ノードから、第２ノード、第３ノード、及び第６ノードを介して第７ノードに至る実行パスと、第４ノードから第５ノードに至る実行パスとが、ホットパスであるとして、それぞれ連続した命令列として配置される。しかしながら、第３ノードから第４ノードに至る前方分岐命令及び第４ノードから第３ノードに至る分岐命令が生成され、効率が悪い。
【００７６】
これに対し、図１０（ｂ）によると、コンパイラ装置１０により最適化されたプログラムは、頻繁に実行される前方分岐命令を有しておらず、実行効率が高い。
【００７７】
図１４は、以上で示した実施形態におけるコンパイラ装置１０のハードウェア構成の一例を示す。実施形態又は変形例に係るコンパイラ装置１０は、ホストコントローラ１０８２により相互に接続されるＣＰＵ１０００、ＲＡＭ１０２０、グラフィックコントローラ１０７５、及び表示装置１０８０を有するＣＰＵ周辺部と、入出力コントローラ１０８４によりホストコントローラ１０８２に接続される通信インターフェイス１０３０、ハードディスクドライブ１０４０、及びＣＤ−ＲＯＭドライブ１０６０を有する入出力部と、入出力コントローラ１０８４に接続されるＲＯＭ１０１０、フレキシブルディスクドライブ１０５０、及び入出力チップ１０７０を有するレガシー入出力部とを備える。
【００７８】
ホストコントローラ１０８２は、ＲＡＭ１０２０と、高い転送レートでＲＡＭ１０２０をアクセスするＣＰＵ１０００及びグラフィックコントローラ１０７５とを接続する。ＣＰＵ１０００は、ＲＯＭ１０１０及びＲＡＭ１０２０に格納されたコンパイラプログラム又は実行時情報生成プログラムに基づいて動作し、各部の制御を行う。グラフィックコントローラ１０７５は、ＣＰＵ１０００等がＲＡＭ１０２０内に設けたフレームバッファ上に生成する画像データを取得し、表示装置１０８０上に表示させる。これに代えて、グラフィックコントローラ１０７５は、ＣＰＵ１０００等が生成する画像データを格納するフレームバッファを、内部に含んでもよい。
【００７９】
入出力コントローラ１０８４は、ホストコントローラ１０８２と、比較的高速な入出力装置である通信インターフェイス１０３０、ハードディスクドライブ１０４０、及びＣＤ−ＲＯＭドライブ１０６０を接続する。通信インターフェイス１０３０は、ネットワークを介して他の装置と通信する。ハードディスクドライブ１０４０は、コンパイラ装置１０が使用するコンパイラプログラム又は実行時情報生成プログラム及びデータを格納する。ＣＤ−ＲＯＭドライブ１０６０は、ＣＤ−ＲＯＭ１０９５からコンパイラプログラム若しくは実行時情報生成プログラム又はデータを読み取り、ＲＡＭ１０２０を介して入出力チップ１０７０に提供する。
【００８０】
また、入出力コントローラ１０８４には、ＲＯＭ１０１０と、フレキシブルディスクドライブ１０５０や入出力チップ１０７０等の比較的低速な入出力装置とが接続される。ＲＯＭ１０１０は、コンパイラ装置１０の起動時にＣＰＵ１０００が実行するブートプログラムや、コンパイラ装置１０のハードウェアに依存するプログラム等を格納する。フレキシブルディスクドライブ１０５０は、フレキシブルディスク１０９０からコンパイラプログラム若しくは実行時情報生成プログラム又はデータを読み取り、ＲＡＭ１０２０を介して入出力チップ１０７０に提供する。入出力チップ１０７０は、フレキシブルディスク１０９０や、例えばパラレルポート、シリアルポート、キーボードポート、マウスポート等を介して各種の入出力装置を接続する。
【００８１】
コンパイラ装置１０に提供されるコンパイラプログラム又は実行時情報生成プログラムは、フレキシブルディスク１０９０、ＣＤ−ＲＯＭ１０９５、又はＩＣカード等の記録媒体に格納されて利用者によって提供される。コンパイラプログラム又は実行時情報生成プログラムは、記録媒体から読み出され、入出力チップ１０７０を介してコンパイラ装置１０にインストールされ、コンパイラ装置１０において実行される。
【００８２】
コンパイラ装置１０にインストールされて実行されるコンパイラプログラム又は実行時情報生成プログラムは、制御フローグラフ生成モジュールと、ループ検出モジュールと、構造グラフ生成モジュールと、カウンタ挿入モジュールと、ループ処理頻度収集モジュールと、ループ内処理頻度収集モジュールと、ループ内実行情報生成モジュールと、最適化モジュールとを含む。各モジュールがコンパイラ装置１０に働きかけて行わせる動作は、図１から図１３において説明したコンパイラ装置１０における、対応する部材の動作と同一であるから、説明を省略する。
【００８３】
以上に示したプログラム又はモジュールは、外部の記憶媒体に格納されてもよい。記憶媒体としては、フレキシブルディスク１０９０、ＣＤ−ＲＯＭ１０９５の他に、ＤＶＤやＰＤ等の光学記録媒体、ＭＤ等の光磁気記録媒体、テープ媒体、ＩＣカード等の半導体メモリ等を用いることができる。また、専用通信ネットワークやインターネットに接続されたサーバシステムに設けたハードディスク又はＲＡＭ等の記憶装置を記録媒体として使用し、ネットワークを介してコンパイラプログラム又は実行時情報生成プログラムをコンパイラ装置１０に提供してもよい。
【００８４】
上記説明から明らかなように、コンパイラ装置１０は、ループ内実行情報を高速に収集し、プログラムを適切に最適化することができる。例えば、コンパイラ装置１０が実行時コンパイラである場合には、コンパイルに多くの時間をかけることができないので、より効率的にプログラムを最適化することができる。
【００８５】
以上、本発明を実施形態を用いて説明したが、本発明の技術的範囲は上記実施形態に記載の範囲には限定されない。上記実施形態に、多様な変更または改良を加えることができる。そのような変更または改良を加えた形態も本発明の技術的範囲に含まれ得ることが、特許請求の範囲の記載から明らかである。
【００８６】
以上に示した実施形態によると、各項目に示すコンパイラ装置、コンパイラプログラム、記録媒体、コンパイル方法、実行時情報生成装置、及び実行時情報生成プログラムが実現される。
【００８７】
（項目１）  最適化対象のプログラムにおける各処理が実行される頻度を収集し、収集した当該頻度に基づいて前記プログラムを最適化するコンパイラ装置であって、前記プログラムのうち、繰り返し実行されるループ処理を検出するループ処理検出部と、前記プログラムにおいて、前記ループ処理が実行されるループ処理頻度を収集するループ処理頻度収集部と、前記ループ処理が実行される回数に対する、前記ループ処理に含まれる複数のループ内処理のそれぞれが実行される頻度であるループ内処理頻度を収集するループ内処理頻度収集部と、前記ループ処理頻度及び前記ループ内処理頻度に基づき、前記プログラムが実行された場合における、前記複数のループ内処理のそれぞれが実行される頻度を示すループ内実行情報を生成するループ内実行情報生成部と、前記ループ内実行情報生成部により生成された前記ループ内実行情報に基づき、前記プログラムを最適化する最適化部とを備えるコンパイラ装置。
（項目２）  前記ループ内処理頻度収集部は、前記ループ処理頻度が予め定められた頻度より高い場合に、前記ループ内処理頻度を収集する項目１記載のコンパイラ装置。
【００８８】
（項目３）  前記ループ内実行情報生成部は、前記ループ処理頻度に前記ループ内処理頻度を乗じることにより、前記ループ内実行情報を生成する項目１記載のコンパイラ装置。
（項目４）  前記ループ処理は、更に内側のループ処理である内側ループ処理を含む外側ループ処理であり、前記ループ処理検出部は、前記内側ループ処理を更に検出し、前記ループ処理頻度収集部は、前記プログラムにおいて、前記内側ループ処理が実行されるループ処理頻度を前記ループ内実行情報に基づいて更に収集し、前記ループ内処理頻度収集部は、前記内側ループ処理のループ内処理頻度を収集し、前記ループ内実行情報生成部は、前記内側ループ処理におけるループ内処理頻度に、前記内側ループ処理のループ処理頻度を乗じることにより、前記内側ループ処理のループ内実行情報を生成する項目１記載のコンパイラ装置。
（項目５）  前記ループ処理頻度収集部は、前記ループ処理が実行される回数を測定するカウンタを、前記プログラムが予め定められた回数実行された時点で停止して、当該カウンタにより測定された回数を前記ループ処理頻度として収集し、前記ループ内処理頻度収集部は、前記複数のループ内処理のそれぞれが実行される回数を測定するカウンタを、前記複数のループ内処理の測定値の合計が予め定められた回数となった時点で停止する項目１記載のコンパイラ装置。
【００８９】
（項目６）  前記プログラムにおける、複数の命令列のそれぞれをノードとして生成し、前記複数の命令列間の実行順序を前記ノード間の有向エッジとして生成した制御フローグラフを生成する制御フローグラフ生成部と、前記制御フローグラフにおいて、前記ループ処理を形成するノードの集合に代えて、前記ループ処理全体を示す単一のループノードを生成した外郭構造グラフと、前記ループ処理を形成するノードの集合の制御フローグラフであるループ内構造グラフとを生成する構造グラフ生成部と、前記外郭構造グラフ及び前記ループ内構造グラフのそれぞれにおいて、当該構造グラフにおける各実行パスが実行される回数をカウントするべく、前記プログラムにカウンタを挿入するカウンタ挿入部とを更に備え、前記ループ処理頻度収集部は、前記プログラムが実行される回数に対する、前記ループノードが実行される回数を、前記ループ処理頻度として生成し、前記ループ内処理頻度収集部は、前記ループ処理が実行される回数に対する、前記ループ内構造グラフにおける各実行パスが実行された回数を、前記ループ内処理頻度として収集する項目１記載のコンパイラ装置。
（項目７）  前記ループ処理頻度収集部は、前記プログラムが予め定められた回数実行された場合において、前記ループノードを含む実行パスが実行される回数をカウントするべく挿入されたカウンタの測定値を、ループ処理頻度として収集し、前記ループ内処理頻度収集部は、前記複数のループ内処理の合計測定値が予め定められた回数となった場合において、前記ループ内構造グラフにおける各実行パスが実行される回数をカウントするべく挿入されたカウンタの測定値に基づき、ループ内処理頻度を収集する項目６記載のコンパイラ装置。
【００９０】
（項目８）  前記カウンタ挿入部は、前記外郭構造グラフの各実行パスが実行される回数を測定するべくカウンタを挿入する前記プログラム中の挿入位置が、前記ループ内構造グラフの各実行パスが実行される回数を測定するべくカウンタを挿入する前記プログラム中の位置と同一であり、かつ前記外郭構造グラフ及び前記ループ内構造グラフのうち多くとも一方におけるカウンタが起動される場合に、当該挿入位置において、前記外郭構造グラフ及び前記ループ内構造グラフの双方における実行パスが実行される回数を測定するカウンタを挿入する項目６記載のコンパイラ装置。
（項目９）  前記カウンタ挿入部は、前記外郭構造グラフの各実行パスが実行される回数を測定するべくカウンタを挿入する前記プログラム中の挿入位置が、前記ループ内構造グラフの各実行パスが実行される回数を測定するべくカウンタを挿入する前記プログラム中の位置と同一であり、かつ前記外郭構造グラフ及び前記ループ内構造グラフのうち多くとも一方におけるカウンタが起動される場合に、前記外郭構造グラフ及び前記ループ内構造グラフのそれぞれにおいて各実行パスの実行の回数を測定する複数の測定処理を生成し、前記ループ内処理頻度収集部は、処理を他の部分に移すジャンプ命令を前記挿入位置に挿入し、当該ジャンプ命令のジャンプ先を、前記複数の測定処理の何れかに設定することにより、前記外郭構造グラフ及び前記ループ内構造グラフの双方における実行パスが実行される回数を測定する項目６記載のコンパイラ装置。
【００９１】
（項目１０）  前記ループ処理は、更に内側のループ処理である内側ループ処理を含む外側ループ処理であり、前記ループ処理検出部は、前記内側ループ処理を更に検出し、前記構造グラフ生成部は、前記外側ループ処理の制御フローグラフにおいて、前記内側ループ処理を形成するノードの集合に代えて、単一の内側ループノードを生成したグラフを外側ループ内構造グラフとして生成し、前記内側ループ処理を構成するノードの集合の制御フローグラフである内側ループ内構造グラフを生成し、前記カウンタ挿入部は、前記内側ループ内構造グラフの各実行パスが実行される回数を測定するカウンタを更に挿入し、前記ループ処理頻度収集部は、前記プログラムにおいて、前記内側ループ処理が実行されるループ処理頻度を前記ループ内実行情報に基づいて更に収集し、前記ループ内処理頻度収集部は、前記内側ループ処理が実行される回数に対する、前記内側ループ内構造グラフにおける各実行パスが実行される頻度を、前記内側ループ処理におけるループ内処理頻度として収集し、前記ループ内実行情報生成部は、前記内側ループ処理におけるループ内実行情報を、前記内側ループ処理におけるループ内処理頻度に、前記内側ループ処理のループ処理頻度を乗じることにより更に生成する項目６記載のコンパイラ装置。
（項目１１）  前記カウンタ挿入部は、前記外側ループ内構造グラフの各実行パスが実行される回数を測定するべくカウンタを挿入する前記プログラム中の挿入位置が、前記内側ループ内構造グラフの各実行パスが実行される回数を測定するべくカウンタを挿入する前記プログラム中の位置と同一であり、かつ前記外側ループ内構造グラフ及び前記内側ループ内構造グラフのうち多くとも一方におけるカウンタが起動される場合に、当該挿入位置において、前記外側ループ内構造グラフ及び前記内側ループ内構造グラフの双方における実行パスが実行される回数を測定するカウンタを挿入する項目１０記載のコンパイラ装置。
（項目１２）  前記カウンタ挿入部は、前記外側ループ内構造グラフの各実行パスが実行される回数を測定するべくカウンタを挿入する前記プログラム中の挿入位置が、前記内側ループ内構造グラフの各実行パスが実行される回数を測定するべくカウンタを挿入する前記プログラム中の位置と同一であり、かつ前記外側ループ内構造グラフ及び前記内側ループ内構造グラフのうち多くとも一方におけるカウンタが起動される場合に、前記外側ループ内構造グラフ及び前記内側ループ内構造グラフのそれぞれにおいて各実行パスの実行の回数を測定する複数の測定処理を生成し、前記ループ内処理頻度収集部は、処理を他の部分に移すジャンプ命令を前記挿入位置に挿入し、当該ジャンプ命令のジャンプ先を、前記複数の測定処理の何れかに設定することにより、前記外側ループ内構造グラフ及び前記内側ループ内構造グラフの双方における実行パスが実行される回数を測定する項目１０記載のコンパイラ装置。
（項目１３）  最適化対象のプログラムにおける各処理が実行される頻度を収集し、収集した当該頻度に基づいて前記プログラムを最適化するコンパイラ装置としてコンピュータを機能させるコンパイラプログラムであって、前記コンピュータを、前記プログラムのうち、繰り返し実行されるループ処理を検出するループ処理検出部と、前記プログラムにおいて、前記ループ処理が実行されるループ処理頻度を収集するループ処理頻度収集部と、前記ループ処理が実行される回数に対する、前記ループ処理に含まれる複数のループ内処理のそれぞれが実行される頻度であるループ内処理頻度を収集するループ内処理頻度収集部と、前記ループ処理頻度及び前記ループ内処理頻度に基づき、前記プログラムが実行された場合における、前記複数のループ内処理のそれぞれが実行される頻度を示すループ内実行情報を生成するループ内実行情報生成部と、前記ループ内実行情報生成部により生成された前記ループ内実行情報に基づき、前記プログラムを最適化する最適化部として機能させるコンパイラプログラム。
【００９２】
（項目１４）  項目１３に記載のコンパイラプログラムを記録した記録媒体。
（項目１５）  最適化対象のプログラムにおける各処理が実行される頻度を収集し、収集した当該頻度に基づいて前記プログラムを最適化するコンパイル方法であって、前記プログラムのうち、繰り返し実行されるループ処理を検出するループ処理検出段階と、前記プログラムにおいて、前記ループ処理が実行されるループ処理頻度を収集するループ処理頻度収集段階と、前記ループ処理が実行される回数に対する、前記ループ処理に含まれる複数のループ内処理のそれぞれが実行される頻度であるループ内処理頻度を収集するループ内処理頻度収集段階と、前記ループ処理頻度及び前記ループ内処理頻度に基づき、前記プログラムが実行された場合における、前記複数のループ内処理のそれぞれが実行される頻度を示すループ内実行情報を生成するループ内実行情報生成段階と、前記ループ内実行情報生成部により生成された前記ループ内実行情報に基づき、前記プログラムを最適化する最適化段階とを備えるコンパイル方法。
【００９３】
（項目１６）  最適化対象のプログラムにおける各処理が実行される頻度を収集する実行時情報生成装置であって、前記プログラムのうち、繰り返し実行されるループ処理を検出するループ処理検出部と、前記プログラムにおいて、前記ループ処理が実行されるループ処理頻度を収集するループ処理頻度収集部と、前記ループ処理が実行される回数に対する、前記ループ処理に含まれる複数のループ内処理のそれぞれが実行される頻度であるループ内処理頻度を収集するループ内処理頻度収集部と、前記ループ処理頻度及び前記ループ内処理頻度に基づき、前記プログラムが実行された場合における、前記複数のループ内処理のそれぞれが実行される頻度を示すループ内実行情報を生成するループ内実行情報生成部とを備え、前記ループ内実行情報生成部により生成された前記ループ内実行情報に基づき、前記プログラムを最適化させる実行時情報生成装置。
（項目１７）  最適化対象のプログラムにおける各処理が実行される頻度を収集する実行時情報生成装置としてコンピュータを機能させる実行時情報生成プログラムであって、前記コンピュータを、前記プログラムのうち、繰り返し実行されるループ処理を検出するループ処理検出部と、前記プログラムにおいて、前記ループ処理が実行されるループ処理頻度を収集するループ処理頻度収集部と、前記ループ処理が実行される回数に対する、前記ループ処理に含まれる複数のループ内処理のそれぞれが実行される頻度であるループ内処理頻度を収集するループ内処理頻度収集部と、前記ループ処理頻度及び前記ループ内処理頻度に基づき、前記プログラムが実行された場合における、前記複数のループ内処理のそれぞれが実行される頻度を示すループ内実行情報を生成するループ内実行情報生成部として機能させ、前記ループ内実行情報生成部により生成された前記ループ内実行情報に基づき、前記プログラムを最適化させる実行時情報生成プログラム。
（項目１８）  項目１７に記載の実行時情報生成プログラムを記録した記録媒体。
【００９４】
【発明の効果】
上記説明から明らかなように、本発明によれば、プログラムの各処理が実行される頻度を収集する処理を、高速に行うことができる。
【図面の簡単な説明】
【図１】図１は、コンパイラ装置１０の機能ブロック図を示す。
【図２】図２は、コンパイラ装置１０のフローチャートを示す。
【図３】図３は、最適化対象のプログラムの一例を示す。
【図４】図４は、制御フローグラフの一例を示す。
【図５】図５（ａ）は、構造グラフを生成する対象となる制御フローグラフの一例を示す。
図５（ｂ）は、制御フローグラフの実行パスを示す。
図５（ｃ）は、制御フローグラフから生成した構造グラフの実行パスを示す。
【図６】図６（ａ）は、図４に示した制御フローグラフから生成される外郭構造グラフの一例を示す。
図６（ｂ）は、図４に示した制御フローグラフから生成される外側ループ内構造グラフの一例を示す。
図６（ｃ）は、図４に示した制御フローグラフから生成される内側ループ内構造グラフの一例を示す。
【図７】図７（ａ）は、プログラムに挿入されたカウンタが停止されている例を示す。図７（ｂ）は、プログラムに挿入されたカウンタが起動されている例を示す。
図７（ｃ）は、同一の挿入位置に複数のカウンタを生成する例を示す。
【図８】図８は、コンパイラ装置１０が生成した実行情報の一例を示す。
【図９】図９（ａ）は、外郭構造グラフにおいて測定された、各実行パスの実行回数を示す。
図９（ｂ）は、外側ループ処理内構造グラフにおいて測定された、各実行パスの実行回数を示す。
図９（ｃ）は、内側ループ処理内構造グラフにおいて測定された、各実行パスの実行回数を示す。
図９（ｄ）は、ループ内実行情報生成部１６０により生成されたループ内実行情報の一例を示す。
【図１０】図１０（ａ）は、最適化部３０によりプログラムが最適化される例を示す。
図１０（ｂ）は、最適化部３０により最適化されたプログラムにおいて命令列が配置された結果を示す。
【図１１】図１１は、第１の他の例における実行情報の一例を示す。
【図１２】図１２（ａ）は、第１の他の例において収集された実行情報の例を制御フローグラフ上に示す。
図１２（ｂ）は、第１の他の例において収集された実行情報の例を表で示す。
【図１３】図１３は、第２の他の例において最適化されたプログラムの例を示す。
【図１４】図１４は、以上で示した実施形態におけるコンパイラ装置１０のハードウェア構成の一例を示す。
【符号の説明】
１０  コンパイラ装置
２０  実行時情報生成装置
３０  最適化部
１００  制御フローグラフ生成部
１１０  ループ検出部
１２０  構造グラフ生成部
１３０  カウンタ挿入部
１４０  ループ処理頻度収集部
１５０  ループ内処理頻度収集部
１６０  ループ内実行情報生成部
５００  ヘッダノード
５１０  ラッチノード
５２０  実行パス
５３０  実行パス
５４０  実行パス
５５０  実行パス
５６０  実行パス
７００  ＮＯＰ命令
７１０  測定処理
７２０  ジャンプ命令
７３０  測定処理
【図１】
2004272826.tif 000004
【図２】
2004272826.tif 000005
【図３】
2004272826.tif 000006
【図４】
2004272826.tif 000007
【図５】
2004272826.tif 000008
【図６】
2004272826.tif 000009
【図７】
2004272826.tif 000010
【図８】
2004272826.tif 000011
【図９】
2004272826.tif 000012
【図１０】
2004272826.tif 000013
【図１１】
2004272826.tif 000014
【図１２】
2004272826.tif 000015
【図１３】
2004272826.tif 000016
【図１４】
2004272826.tif 000017