(57)【特許請求の範囲】
【請求項１】
プログラムを最適化するコンパイラ装置であって、
前記プログラム中の変数に値を代入する命令について、当該命令が実行された場合における当該変数の値域として、当該命令が当該変数に代入し得る値の範囲を解析する値域解析部と、
解析した前記変数の値域に基づいて、当該命令が前記変数の値域内の何れの値を当該変数に代入しても、前記プログラムの実行結果が変化しないか判断する判断部と、
前記判断部による判断が成立することを条件に、当該変数に値を代入する当該命令を、前記変数の値域内の定数値を当該変数に代入する命令に置換する置換部と
を備えるコンパイラ装置。
【請求項２】
前記プログラムを記憶する記憶装置を更に備え、
前記値域解析部は、前記記憶装置にアクセスして前記プログラムを走査することで、当該変数の値域を解析すると共に、さらに、前記プログラム中の当該変数を参照するそれぞれの命令について、当該命令が実行された場合における当該変数の値域を解析し、
前記判断部は、当該変数に値を代入するある命令についての前記変数の値域が、代入された当該変数の値に基づいて条件分岐するある命令についての前記変数の値域に包含され、かつ、当該変数を参照する他の何れの命令についての前記変数の値域とも重複しないかを判断し、
前記置換部は、前記判断部による判断が成立することを条件に、前記記憶装置にアクセスして、当該変数に値を代入する当該命令を、当該命令についての前記変数の値域の中から選択した定数値を当該変数に代入する命令に置換することにより、前記プログラムを変更する、請求項１に記載のコンパイラ装置。
【請求項３】
前記値域解析部は、当該変数の値に基づいて条件分岐する命令については、当該条件分岐によるそれぞれの分岐先に対応付けて、当該分岐先における当該変数の値域を解析し、
前記判断部は、当該変数に値を代入するある命令についての前記変数の値域が、当該変数の値に基づいて条件分岐するある命令の何れかの分岐先における前記変数の値域に包含され、かつ、他の何れの分岐先における前記変数の値域および当該変数を参照する他の何れの命令についての前記変数の値域とも重複しないかを判断する、請求項２に記載のコンパイラ装置。
【請求項４】
前記値域解析部は、
前記プログラム中のある変数を参照するそれぞれの命令について、当該命令が実行される直前における当該変数の値域、当該命令が実行された直後における当該変数の値域、および、当該命令が当該変数を定数と比較する命令かどうかを示す論理値、を含む、値域データを生成して前記記憶装置に格納するデータ生成部と、
前記記憶装置にアクセスして、命令が実行される直前における変数の値域、及び、命令が実行された直後における変数の値域の組が相互に等しく、前記論理値が異なる複数の値域データを検出したことを条件に、前記論理値が変数を定数と比較する命令であることを示す値域データを前記記憶装置から除外する第１データ除外部と、
前記記憶装置にアクセスして、第１の前記値域データに含まれる、対応する命令が実行された直後の当該変数の値域、が、第２の前記値域データに含まれる、対応する命令が実行される直前の当該変数の値域と一致し、かつ、前記第１の値域データに含まれる前記論理値が、対応する命令が変数を定数と比較する命令であることを示すことを条件に、前記第１の値域データを前記記憶装置から除外する第２データ除外部と
を有し、
前記判断部は、前記記憶装置にアクセスして、変数を定数と比較することを示す論理値を含むある値域データを読み出し、当該値域データに含まれる、命令が実行された直後における当該変数の値域が、当該変数に値を代入する命令についての前記変数の値域を包含するかどうか、および、他の値域データに含まれる、命令が実行された直後における当該変数の値域が、当該変数に値を代入する命令についての前記変数の値域と重複しないかどうかを判断する、請求項３に記載のコンパイラ装置。
【請求項５】
複数の配列変数のそれぞれから予め定められた数の要素を読み出して比較して、異なる要素値が検出された場合には要素値の差を変数に代入する一方で、異なる要素値が検出されない場合には数値０を変数に代入する処理、を、前記プログラムを走査することで検出するイディオム検出部、を更に備え、
前記判断部は、前記イディオム検出部により当該処理が検出されたことを条件に、当該変数の値に基づいて条件分岐するある命令の第１の分岐先における当該変数の値域が、数値０のみを含み、かつ、当該命令の第２の分岐先における当該変数の値域が０以外のみを含むかどうかを判断し、
前記置換部は、前記イディオム検出部により検出された当該処理についての前記判断部による判断が成立することを条件に、複数の配列変数のそれぞれから予め定められた数の要素を読み出して比較して、異なる要素値が検出された場合には０以外の所定の定数を変数に代入する一方で、異なる要素値が検出されない場合には数値０を変数に代入する処理により、前記イディオム検出部により検出された当該処理を置換する、請求項３に記載のコンパイラ装置。
【請求項６】
複数の配列変数のそれぞれから予め定められた数の要素を読み出して比較して、異なる要素値が検出された場合には要素値の差を変数に代入する一方で、異なる要素値が検出されない場合には数値０を変数に代入する処理、を、前記プログラムを走査することで検出するイディオム検出部、を更に備え、
前記判断部は、前記イディオム検出部により当該処理が検出されたことを条件に、当該変数の値に基づいて条件分岐するある命令の第１の分岐先における当該変数の値域が、数値０のみを含み、当該命令の第２の分岐先における当該変数の値域が正の数のみを含み、かつ、当該命令の第３の分岐先における当該変数の値域が負の数のみを含むかどうかを判断し、
前記置換部は、前記イディオム検出部により検出された当該処理についての前記判断部による判断が成立することを条件に、複数の配列変数のそれぞれから予め定められた数の要素を読み出して比較して、異なる要素値が検出されない場合には数値０を変数に代入し、一方の配列変数の要素が他方の配列変数の要素より大きい場合には所定の正の定数を変数に代入する一方で、他方の配列変数の要素が一方の配列変数の要素より大きい場合には所定の負の定数を変数の代入する処理により、前記イディオム検出部により検出された当該処理を置換する、請求項３に記載のコンパイラ装置。
【請求項７】
前記イディオム検出部により検出された当該処理は、コンディション・コード・フラグに処理結果を格納する処理に置換され、
前記置換部は、前記イディオム検出部により検出された当該処理から当該変数の値に基づいて条件分岐する命令までの間にコンディション・コード・フラグが変更されないことを条件に、当該変数の値に基づいて条件分岐するある命令を、当該コンディション・コード・フラグに基づいて条件分岐する命令に置換する、請求項５または請求項６に記載のコンパイラ装置。
【請求項８】
前記置換部は、置換すべき当該命令についての前記変数の値域の中から、前記プログラムをコンパイルした実行コードを実行するコンピュータにおいて、１命令でレジスタにロードすることができる即値（イミディエート・バリュー）の範囲内の値を選択して、当該選択した値を変数に代入する命令に置換する、請求項２に記載のコンパイラ装置。
【請求項９】
前記置換部は、置換すべき当該命令についての前記変数の値域の中から、絶対値の最も小さい値を選択して、当該命令を、当該選択した値を変数に代入する命令に置換する、請求項２に記載のコンパイラ装置。
【請求項１０】
前記置換部は、置換すべき当該命令についての前記変数の値域の中から、２のべき乗の値を選択して、当該命令を、当該選択した値を変数に代入する命令に置換する、請求項２に記載のコンパイラ装置。
【請求項１１】
前記置換部は、前記判断部による判断が成立することを条件に、変数に値を代入する当該命令を、当該命令についての前記変数の値域外から選択した定数値を当該変数に代入する命令に置換すると共に、当該変数の値に基づいて条件分岐するある命令についての前記変数の値域が、当該選択した定数値を含むように、当該条件分岐する命令を変更する、請求項２に記載のコンパイラ装置。
【請求項１２】
前記値域解析部は、前記プログラム中のある変数に加えて、更に当該変数の値が代入される他の変数のそれぞれについても、当該変数を参照するそれぞれの命令について、当該命令が実行された場合における当該変数の値域を解析し、
前記判断部は、当該変数に値を代入するある命令についての前記変数の値域が、当該変数または当該変数の値が代入される他の変数の値に基づいて条件分岐するある命令についての前記変数の値域に包含され、かつ、当該変数または当該変数の値が代入される他の変数を参照する他の何れの命令についての前記変数の値域とも重複しないかを判断する、請求項２に記載のコンパイラ装置。
【請求項１３】
コンピュータを、
プログラム中の変数に値を代入する命令について、当該命令が実行された場合における当該変数の値域として、当該命令が当該変数に代入し得る値の範囲を解析する値域解析部と、
解析した前記変数の値域に基づいて、当該命令が前記変数の値域内の何れの値を当該変数に代入しても、前記プログラムの実行結果が変化しないか判断する判断部と、
前記判断部による判断が成立することを条件に、当該変数に値を代入する当該命令を、前記変数の値域内の定数値を当該変数に代入する命令に置換する置換部
として機能させるコンパイラプログラム。
【請求項１４】
コンピュータによりプログラムを最適化するコンパイル方法であって、
前記コンピュータにより、プログラム中の変数に値を代入する命令について、当該命令が実行された場合における当該変数の値域として、当該命令が当該変数に代入し得る値の範囲を解析するステップと、
前記コンピュータにより、解析した前記変数の値域に基づいて、当該命令が前記変数の値域内の何れの値を当該変数に代入しても、前記プログラムの実行結果が変化しないか判断するステップと、
前記判断するステップによる判断が成立することを条件に、当該変数に値を代入する当該命令を、前記変数の値域内の定数値を当該変数に代入する命令に置換するステップと
を備えるコンパイル方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、プログラムを最適化するコンパイラに関する。特に、本発明は、変数に値を代入する命令を最適化するコンパイラに関する。
【背景技術】
【０００２】
プログラム言語の言語処理系、または、オペレーティング・システムは、ライブラリ・プログラムと呼ばれる、よく使われる機能を集めたプログラム群を有している。ライブラリ・プログラムは、ユーザ・プログラムから呼び出されて処理を開始し、その処理結果を戻り値としてユーザ・プログラムにリターンする。
【０００３】
例えば、Ｊａｖａ（登録商標）言語のＳｔｒｉｎｇクラスのｉｎｄｅｘＯｆメソッドは、引数として指定された文字を、引数として指定された文字列の中から検索して、その文字のインデックス（例えば先頭から何番目かを示す数値）をリターンする。その文字が検索されなければ、検索されない旨を示す−１という数値をリターンする。
【０００４】
また、他の例として、引数として指定された条件を満たすオブジェクトを生成するメソッドは、オブジェクトの生成に成功した場合にはそのオブジェクトのポインタをリターンする。一方、そのオブジェクトの生成に失敗すれば、オブジェクトの生成に失敗する旨を示す定数ＮＵＬＬをリターンする。
【０００５】
これらの例のように、戻り値は、場合によって複数の性質を有する場合がある。即ち、戻り値は、インデックスまたはポインタなどの処理結果のみならず、−１またはＮＵＬＬなどの特別な数値によって処理の成否を表す。
なお、参考文献として、代入命令に関する各種の最適化については以下の特許文献１を参照されたい。非特許文献１−２については、後に参照する。
【特許文献１】特開２００３−１９６１０６号公報
【非特許文献１】M. Kawahito et al, A new idiom recognition framework for exploiting hardware-assist instructions, ASPLOS'06.
【非特許文献２】W. Harrison. "Compiler Analysis of the Value Ranges for Variables" In IEEE Transactions on Software Engineering, Vol. 3, No. 3, pp.243-250, 1977.
【発明の開示】
【発明が解決しようとする課題】
【０００６】
リターンされた数値は、変数に代入されて、その後の処理において参照される。例えば、ユーザ・プログラムにおいて、その変数は定数と比較される。また、その変数は四則演算に用いられてもよい。しかしながら、ユーザ・プログラムによっては、その変数を−１またはＮＵＬＬなどの特別な定数値のみと比較し、他の変数との比較または四則演算には使用しない場合がある。この場合、その変数に代入すべき具体的な数値、例えばインデックスまたはオブジェクトへのポインタなど、を求める処理は無駄になっていた。
【０００７】
そこで本発明は、上記の課題を解決することのできるコンパイラ装置、コンパイル方法およびコンパイラプログラムを提供することを目的とする。この目的は特許請求の範囲における独立項に記載の特徴の組み合わせにより達成される。また従属項は本発明の更なる有利な具体例を規定する。
【課題を解決するための手段】
【０００８】
上記課題を解決するために、本発明の第１の形態においては、プログラムを最適化するコンパイラ装置であって、前記プログラム中の変数に値を代入する命令について、当該命令が実行された場合における当該変数の値域として、当該命令が当該変数に代入し得る値の範囲を解析する値域解析部と、解析した前記変数の値域に基づいて、当該命令が前記変数の値域内の何れの値を当該変数に代入しても、前記プログラムの実行結果が変化しないか判断する判断部と、前記判断部による判断が成立することを条件に、当該変数に値を代入する当該命令を、前記変数の値域内の定数値を当該変数に代入する命令に置換する置換部とを備えるコンパイラ装置を提供する。また、当該コンパイラ装置としてコンピュータを機能させるコンパイラプログラム、および、当該コンパイラ装置によってプログラムを最適化するコンパイル方法を提供する。
なお、上記の発明の概要は、本発明の必要な特徴の全てを列挙したものではなく、これらの特徴群のサブコンビネーションもまた、発明となりうる。
【発明を実施するための最良の形態】
【０００９】
以下、発明の実施の形態を通じて本発明を説明するが、以下の実施形態は特許請求の範囲にかかる発明を限定するものではなく、また実施形態の中で説明されている特徴の組み合わせの全てが発明の解決手段に必須であるとは限らない。
【００１０】
図１は、本実施形態に係るコンパイラ装置１０の全体構成を示す。コンパイラ装置１０は、プログラムを読み込んで実行するコンピュータにより実現される。具体的には、コンパイラ装置１０は、基本的なハードウェアとしてＣＰＵ１０００と、記憶装置１０４０とを備える。そして、ＣＰＵ１０００が記憶装置１０４０からコンパイラプログラム１５を読み出して実行することで、コンピュータはコンパイラ装置１０として機能する。
【００１１】
コンパイラ装置１０は、例えばＪａｖａ（登録商標）言語などの高級言語で記述された入力プログラム２０をコンパイルし、コンピュータにより実行可能な実行コードを生成して出力する。その実行コードは、例えばＩＢＭコーポレーションのＳｙｓｔｅｍ  ｚアーキティクチャまたはＳｙｓｔｅｍ  ｐアーキティクチャを構成するコンピュータにより実行可能な実行コードであってよい。その実行コードのことを出力プログラム２８と呼ぶ。
【００１２】
コンパイル機能の具体例として、コンパイラ装置１０は、ＣＰＵ１０００にコンパイラプログラム１５を実行させることで、前段最適化部１００と、代入最適化部１１０と、後段最適化部１２０として機能する。前段最適化部１００は、予め記憶装置１０４０に記憶されていたライブラリ・プログラム２２から、入力プログラム２０の実行に必要な部分を選択する。そして、前段最適化部１００は、その選択した部分および入力プログラム２０を結合したプログラムを最適化する。
【００１３】
例えば、前段最適化部１００は、入力プログラム２０の字句解析または構文解析などのいわゆるフロントエンドのコンパイル処理を行ってもよいし、これに加えて、例えばメソッド・インライニング、または、メソッド間解析などの最適化を行ってもよい。最適化したプログラムは中間プログラム２４として記憶装置１０４０に記憶される。
【００１４】
代入最適化部１１０は、記憶装置１０４０にアクセスして中間プログラム２４を読み出し、読み出したその中間プログラム２４に含まれる、変数に値を代入する命令を最適化する。例えば、代入最適化部１１０は、中間プログラム２４を走査することで、例えばデータフロー解析などの手法により、中間プログラム２４中の各命令の実行時における各変数の値域（ｓｕｂｒａｎｇｅ）を解析してよい。一例として、代入最適化部１１０は、変数の値域として、ある代入命令が変数に代入し得る値の範囲を解析する。
【００１５】
その結果を利用して、代入最適化部１１０は、その代入命令を最適化する。例えば、代入最適化部１１０は、その代入命令が、その変数の値域内の何れの値を当該変数に代入したとしても、出力プログラム２８の実行結果が入力プログラム２０の元の意味から変化しないかを判断する。変化しないとすれば、代入最適化部１１０は、当該代入命令を、当該変数の値域を代表する所定の定数値を当該変数に代入する命令に置換する。これにより、代入すべき値を生成する処理、例えば、演算によって値を算出する処理が不要とすることができる。
【００１６】
最適化されたプログラムは中間プログラム２６として記憶装置１０４０に格納される。続いて、後段最適化部１２０は、中間プログラム２６について各種の最適化を行う。後段最適化部１２０は、上記代入命令が最適化された結果として副次的に可能となった最適化を行う。例えば、演算によって値を算出する処理が不要となった場合には、その結果として、その演算に用いていた他の変数も使用されなくなっている場合がある。その場合には、後段最適化部１２０は、当該他の変数の値を算出するための処理を削除できる。
【００１７】
その他に、後段最適化部１２０は、最適化したプログラムを、具体的な機械語に置き換える処理などの、いわゆるバックエンドのコンパイル処理を行ってよい。コンパイルされたプログラムは、出力プログラム２８として外部に出力される。
このように、本実施形態に係るコンパイラ装置１０は、代入命令を最適化することで、代入すべき値を生成するための処理を不要とし、さらに、その処理が不要となったことにより追加的に各種の最適化を行うことができる。以降、詳しく説明する。
【００１８】
まず、代入命令の最適化の第１例を、図２−４を参照して説明する。この例において入力プログラム２０を入力プログラム２０Ａとし、ライブラリ・プログラム２２をライブラリ・プログラム２２Ａとし、中間プログラム２４を中間プログラム２４Ａとし、中間プログラム２６を中間プログラム２６Ａとする。
図２は、本実施形態に係る入力プログラム２０Ａおよびライブラリ・プログラム２２Ａの具体例を示す。入力プログラム２０Ａは、１行目に、ｍｅｔｈｏｄＡというメソッドを呼び出して、その戻り値をａｎｓｗｅｒという変数の代入する命令を含む。また、入力プログラム２０Ａは、３−５行目に、その変数ａｎｓｗｅｒの値がｎｕｌｌポインタと等しければ、オブジェクトの生成に失敗したとして、所定の処理を行う命令を含む。
【００１９】
一方、ライブラリ・プログラム２２Ａは、１−７行目に、ｍｅｔｈｏｄＡの定義を含む。具体的には、ライブラリ・プログラム２２Ａは、２行目に、変数ａｎｓｗｅｒにｎｕｌｌポインタを代入する処理を含む。また、ライブラリ・プログラム２２Ａは、３−５行目に、所定の条件が成立した場合には新たなオブジェクトを生成して、そのポインタを変数ａｎｓｗｅｒに代入する処理を含む。また、ライブラリ・プログラム２２Ａは、６行目に、変数ａｎｓｗｅｒの値を戻り値としてリターンする命令を含む。
【００２０】
前段最適化部１００は、このｍｅｔｈｏｄＡをインライン展開することで、中間プログラム２４Ａを生成する。
図３は、本実施形態に係る中間プログラム２４Ａの具体例を示す。１−４行目には、ｍｅｔｈｏｄＡ内の各命令が、戻り値をリターンする命令を除きそのまま展開されている。
【００２１】
この中間プログラム２４Ａを参照すると、１行目または３行目で値が代入された変数ａｎｓｗｅｒは、その後６行目の条件分岐命令のみによって参照されている。そして、その条件分岐命令は、変数ａｎｓｗｅｒを単にｎｕｌｌポインタと比較している。このように、メソッドをインライン展開すると、同一のプログラムが変数の代入および参照の双方を含むようになる場合が多い。
【００２２】
この中間プログラム２４Ａにおいて、変数ａｎｓｗｅｒが単に定数値と比較され、かつ、他の用途で使用されない場合には、変数ａｎｓｗｅｒに代入する値を生成する具体的な処理、例えばここではオブジェクトを生成する処理は無駄になってしまう。代入最適化部１１０は、このような代入命令を、単に定数値を変数に代入する命令に置換する。代入命令を置換したプログラムを中間プログラム２６Ａとして図４に示す。
【００２３】
図４は、本実施形態に係る中間プログラム２６Ａの具体例を示す。中間プログラム２４Ａの３行目に含まれる代入命令は、中間プログラム２６Ａにおいて、定数０ｘ００００ｂｅｅｆを変数に代入する命令に置換されている。命令をこのように置換しても、変数ａｎｓｗｅｒはｎｕｌｌとの比較のみに用いられるので、中間プログラム２６Ａの実行結果は中間プログラム２４Ａと相違しない。
以上、この第１例に示すように、コンパイラ装置１０によれば、記憶領域の確保および初期化などの、オブジェクトの生成に伴う各種の処理を省略して、プログラムの実行を効率化できる。
【００２４】
次に、代入命令の最適化の第２例を、図５−７を参照して説明する。
図５は、本実施形態に係る入力プログラム２０Ｂおよびライブラリ・プログラム２２Ｂの具体例を示す。入力プログラム２０Ｂは、１行目に、ｍｅｔｈｏｄＢというメソッドを呼び出して、その戻り値をａｎｓｗｅｒという変数の代入する命令を含む。また、入力プログラム２０Ａは、３−５行目に、その変数ａｎｓｗｅｒの値が整数−１という定数値と等しければ、文字の検索に失敗したとして、所定の処理を行う命令を含む。
【００２５】
一方、ライブラリ・プログラム２２Ｂは、１−９行目に、ｍｅｔｈｏｄＢの定義を含む。このｍｅｔｈｏｄＢは、Ｊａｖａ（登録商標）言語のＳｔｒｉｎｇクラスに定義されたｉｎｄｅｘＯｆメソッドの一部を示す。
【００２６】
具体的には、ライブラリ・プログラム２２Ｂは、２行目に、変数ｉを変数ｏｆｆｓｅｔの値で初期化する処理を含む。また、ライブラリ・プログラム２２Ｂは、３−７行目に、配列変数ａの各要素を変数ｃｈと順次比較する命令群を含む。たとえば、ライブラリ・プログラム２２Ｂは、４行目に、配列変数ａのｉ番目の要素が所定の変数ｃｈと等しければ、変数ｉと変数ｏｆｆｓｅｔとの差を変数ａｎｓｗｅｒに代入する命令を含む。
【００２７】
また、ライブラリ・プログラム２２Ｂは、６行目に、変数ｌｅｎの値と等しい個数の、配列変数ａの要素を走査しても、変数ｃｈの等しい要素が検索されなければ、変数ａｎｓｗｅｒに数値−１を代入する命令を含む。ライブラリ・プログラム２２Ｂは、また、８行目に、変数ａｎｓｗｅｒの値を戻り値としてリターンする命令を含む。
【００２８】
前段最適化部１００は、このｍｅｔｈｏｄＢをインライン展開することで、中間プログラム２４Ｂを生成する。
図６は、本実施形態に係る中間プログラム２４Ｂの具体例を示す。１−６行目には、ｍｅｔｈｏｄＢ内の各命令が、戻り値をリターンする命令を除きそのまま展開されている。
【００２９】
この中間プログラム２４Ｂを参照すると、３行目または５行目で値が代入された変数ａｎｓｗｅｒは、その後８行目の条件分岐命令のみによって参照されている。そして、その条件分岐命令は、変数ａｎｓｗｅｒを単に定数−１と比較している。このように、この例でも、メソッドをインライン展開することで、同一のプログラムが変数の代入および参照の双方を含むようになる。
【００３０】
この中間プログラム２４Ｂにおいて、変数ａｎｓｗｅｒが単に定数値と比較され、かつ、他の用途で使用されない場合には、変数ａｎｓｗｅｒに代入する値を生成する具体的な処理、例えばここでは３行目の、変数ｉから変数ｏｆｆｓｅｔの値を減じる演算は無駄になってしまう。代入最適化部１１０は、このような代入命令を、単に定数値を変数に代入する命令に置換する。代入命令を置換したプログラムを中間プログラム２６Ｂとして図７に示す。
【００３１】
図７は、本実施形態に係る中間プログラム２６Ｂの具体例を示す。中間プログラム２４Ｂの３行目に含まれる代入命令は、中間プログラム２６Ｂにおいて、定数値である整数１を変数に代入する命令に置換されている。命令をこのように置換しても、変数ａｎｓｗｅｒは定数−１との比較のみに用いられるので、中間プログラム２６Ｂの実行結果は中間プログラム２４Ｂと相違しない。この結果、中間プログラム２４Ｂと比較して中間プログラム２６Ｂにおいては、演算処理を省略することができる。
【００３２】
第２例として説明したこの最適化は、プログラムを特定のアーキティクチャで実行させようとする場合には特に効果的である。例えば、ＩＢＭコーポレーションのＳｙｓｔｅｍ  ｐなどでは、配列変数の８つの要素の中に特定の要素値が含まれるかどうかを、極めて高速に判断する機械語命令を有する。但し、この機械語命令は、その要素値が、配列変数の何番目の要素に含まれているかを判断することはできない。
【００３３】
中間プログラム２４Ｂの３行目において、特定の要素値ｃｈと等しい要素が検索されると、その要素が配列変数ａの何番目にあるかが算出されて、その値が変数ａｎｓｗｅｒに代入されている。このため、後段最適化部１２０は、中間プログラム２４Ｂを、上記機械語命令を使用した実行コードに置き換えることは難しい。
【００３４】
一方で、中間プログラム２６Ｂの３行目においては、特定の要素値ｃｈと等しい要素が検索されても、特定の定数値１が変数ａｎｓｗｅｒに代入されるだけである。このため、後段最適化部１２０は、中間プログラム２６Ｂを、上記機械語命令を使用した高速処理可能な実行コードに置き換えることができる。
このように、本実施形態に係る代入最適化部１１０によれば、値を算出する演算を単に削除できるだけでなく、演算を削除した結果として他の最適化の機会を拡大することができる。
【００３５】
続いて、代入命令の最適化の機能について更に詳しく説明する。
図８は、本実施形態に係る代入最適化部１１０の機能構成を示す。代入最適化部１１０は、値域解析部８００と、判断部８３０と、置換部８４０と、イディオム検出部８５０とを備える。値域解析部８００は、記憶装置１０４０にアクセスして中間プログラム２４を読み出す。そして、値域解析部８００は、中間プログラム２４中の変数に値を代入する命令について、その命令が実行された場合におけるその変数の値域として、その命令がその変数に代入し得る値の範囲を解析する。
【００３６】
例えば、図３の中間プログラム２４Ａの３行目のように、ある命令がオブジェクトのポインタを変数に代入する場合において、その変数に代入される値は、ｎｕｌｌポインタ以外の範囲であることが解析される。また、図６の中間プログラム２４Ｂの１行目および４行目を参照すると、変数ｉは変数ｏｆｆｓｅｔの値で初期化された後に順次インクリメントされるので、変数ｉの値は変数ｏｆｆｓｅｔの値以上であることが分かる。その結果、３行目で変数ａｎｓｗｅｒに代入される値（ｉ−ｏｆｆｓｅｔ）は、０以上の範囲であることが解析される。
【００３７】
また、値域解析部８００は、中間プログラム２４を走査することで、中間プログラム２４中のその変数を参照するそれぞれの命令について、その命令が実行された場合におけるその変数の値域を解析する。その変数の値に基づいて条件分岐する命令については、値域解析部８００は、当該条件分岐によるそれぞれの分岐先に対応付けて、当該分岐先における当該変数の値域を解析してよい。例えば、図３の中間プログラム２４Ａの６行目のように、変数を定数と比較して条件分岐する命令について、値域解析部８００は、一方の分岐先における変数の値域を「ｎｕｌｌ以外の全域」と解析し、他方の分岐先における変数の値域を「ｎｕｌｌ」と解析する。解析結果は値域データ５０として記憶装置１０４０に格納されてもよいし、判断部８３０に対し出力されてもよい。
【００３８】
以上の解析の実現には、変数値の範囲分析（ｖａｌｕｅ  ｒａｎｇｅ  ａｎａｌｙｓｉｓ）の技術が利用される（例えば上記非特許文献２を参照。）。この技術は当該技術分野において周知であり、その概要は以下の通りである。まず、値域解析部８００は、中間プログラム２４を複数の基本ブロックに分割する。そして、値域解析部８００は、それぞれの基本ブロックについて、変数値の範囲を決定付ける命令を検出する。そして、値域解析部８００は、検出したその命令に基づいてその変数値の範囲を基本ブロック毎に決定付ける。
【００３９】
例えば、変数ａが定数０より大きいことを条件とする条件分岐命令が検出された場合に、値域解析部８００は、その分岐先の基本ブロックにおいて、その変数ａの値の範囲は正の数であると決定付ける。また、プログラム言語の仕様によって、配列変数の添え字が正の数であることが、予め定められている場合において、変数を添え字とする配列変数の参照命令が検出された場合に、値域解析部８００は、その添え字の変数値の範囲は正の数であると決定付ける。変数に四則演算の結果が代入される場合など、その変数の範囲が不定の場合には、その変数の値の範囲は全域と決定付けられる。
【００４０】
そして、値域解析部８００は、解析したその範囲の情報を、プログラムの実行方向に沿って、他の基本ブロックに順次伝播させる。例えば、第１の基本ブロックにおいてある変数ａの値の範囲が正の数と決定付けられた場合において、その第１の基本ブロックの次に実行される第２の基本ブロックにおいても、その変数ａの値は正の数である。また、その第１の基本ブロックの末尾が条件分岐命令であり、その次に第２の基本ブロックおよび第３の基本ブロックの何れかが実行される場合においては、それら第２および第３の基本ブロックのそれぞれにおいてその変数ａの値は正の数である。
【００４１】
但し、その条件分岐命令がその変数ａの値に基づく場合にはこの限りでない。例えば、その変数ａの値が定数１０より大きい場合には第２の基本ブロックが実行され、その他の場合において第３の基本ブロックが実行される場合において、第２の基本ブロックにおける変数ａの値は定数１０より大きい。一方、第３の基本ブロックにおける変数ａの値は０より大きく、かつ、１０以下である。
値域解析部８００は、以上のような、変数の値の範囲の伝播を、変数の値の範囲が変更されなくなるまで繰り返す。
【００４２】
このような解析の結果は、その後の処理において効率的に参照可能とするために、所定のデータ構造に整形されて管理されることが望ましい。また、このような解析の結果の一部は、その後の処理を効率化する観点から不要となる場合がある。これらの目的を実現するため、値域解析部８００は、データ生成部８０５と、第１データ除外部８１０と、第２データ除外部８２０とを備える。これらの各部の処理については、後に詳しく説明する。
【００４３】
次に、判断部８３０、置換部８４０およびイディオム検出部８５０について説明する。判断部８３０は、値域解析部８００により解析された変数の値域に基づいて、代入命令が当該変数の値域内の何れの値を当該変数に代入したとしても、中間プログラム２４の実行結果が変化しないかを判断する。
【００４４】
具体的には、判断部８３０は、当該変数の値を代入するある命令についての当該変数の値域が、代入された当該変数の値に基づいて条件分岐するある命令の何れかの分岐先における当該変数の値域に包含され、かつ、他の何れの分岐先における当該変数の値域および当該変数を参照する他の何れの命令についての当該変数の値域とも重複しないかを判断する。
【００４５】
例えば、図３の中間プログラム２４Ａは、３行目に、変数ａｎｓｗｅｒにオブジェクトへのポインタを代入する命令を含む。この変数ａｎｓｗｅｒの値域は、上記分析の結果、ｎｕｌｌ以外である。一方、図３の中間プログラム２４Ａは、６行目に、変数ａｎｓｗｅｒを定数ｎｕｌｌと比較する条件分岐命令を含む。この条件分岐命令の一方の分岐先において、変数ａｎｓｗｅｒの値域はｎｕｌｌ以外であり、他方の分岐先において、変数ａｎｓｗｅｒの値域はｎｕｌｌのみである。
【００４６】
この例において、代入命令における変数ａｎｓｗｅｒの値域は、一方の分岐先における変数ａｎｓｗｅｒの値域を包含しており、かつ、他方の分岐先における変数ａｎｓｗｅｒの値域と重複しない。また、変数ａｎｓｗｅｒを参照する他の命令は存在しない。このため、判断部８３０による判断は成立する。
【００４７】
他の例として、図６の中間プログラム２４Ｂは、３行目に、変数ａｎｓｗｅｒに数式（ｉ−ｏｆｆｓｅｔ）の値を代入する命令を含む。この変数ａｎｓｗｅｒの値域は、上記分析の結果、０以上の整数である。一方、図６の中間プログラム２４Ｂは、８行目に、変数ａｎｓｗｅｒを定数−１と比較する条件分岐命令を含む。この条件分岐命令の一方の分岐先において、変数ａｎｓｗｅｒの値域は−１以外であり、他方の分岐先において、変数ａｎｓｗｅｒの値域は−１のみである。
【００４８】
この例において、代入命令における変数ａｎｓｗｅｒの値域は、一方の分岐先における変数ａｎｓｗｅｒの値域を包含しており、かつ、他方の分岐先における変数ａｎｓｗｅｒの値域と重複しない。また、変数ａｎｓｗｅｒを参照する他の命令は存在しない。このため、判断部８３０による判断は成立する。
【００４９】
置換部８４０は、判断部８３０による判断が成立することを条件に、記憶装置１０４０にアクセスして、当該変数に値を代入する当該命令を、当該命令についての当該変数の値域内の定数値を当該変数に代入する命令に置換することで、中間プログラム２４を変更する。例えば、中間プログラム２４Ａにおいて、３行目の代入命令により代入される値の範囲は０以上なので、置換部８４０は、この代入命令を、０以上の定数である１を代入する命令に置換する。
【００５０】
他の例として、中間プログラム２４Ｂにおいて、３行目の代入命令により代入される値の範囲はｎｕｌｌ以外なので、置換部８４０は、この代入命令を、ｎｕｌｌ以外のポインタである０ｘ００００ｂｅｅｆを代入する命令に置換する。変更されたプログラムは中間プログラム２６として記憶装置１０４０に格納される。
【００５１】
イディオム検出部８５０は、単なる代入文ではなく、予め定められた一連の処理（このことをイディオムと呼ぶ）の結果を変数に代入する処理を検出する。イディオムの検出について、詳しくは、非特許文献１を参照されたい。そして、イディオム検出部８５０は、判断部８３０および置換部８４０と共に、検出したこのイディオムを最適化する。この処理の詳細については後に詳しく述べる。
【００５２】
図９は、本実施形態に係る代入最適化部１１０により代入命令が最適化される処理の流れを示す。まず、値域解析部８００は、中間プログラム２４中のある変数ｖに値を代入する命令ｓを選択する（Ｓ９００）。そして、値域解析部８００は、変数ｖおよびこの選択した命令ｕについて、以下の処理を行う。
【００５３】
値域解析部８００は、その命令ｓがその変数ｖに代入し得る値の範囲を、その命令ｓが実行された場合におけるその変数ｖの値域として解析する（Ｓ９０５）。また、データ生成部８０５は、その変数ｖを参照する中間プログラム２４中の全ての命令のそれぞれについて、当該命令が実行された場合における当該変数の値域を解析する（Ｓ９１０）。解析結果は値域データ５０として判断部８３０に対し出力される。この処理の詳細を、図１０を参照して説明する。
【００５４】
図１０は、図９のＳ９１０における処理の詳細を示す。まず、データ生成部８０５は、変数ｖを参照するある命令ｕを選択する（Ｓ１０００）。次に、データ生成部８０５は、命令ｕが、変数ｖを他の変数ｗに代入する命令かどうかを判断する（Ｓ１０１０）。
【００５５】
命令ｕが、変数ｖを他の変数ｗに代入する命令である場合に（Ｓ１０１０：ＹＥＳ）、データ生成部８０５は、変数ｗを新たな変数ｖとみなして、Ｓ９１０を再帰的に処理する（Ｓ１０２０）。
【００５６】
次に、データ生成部８０５は、命令ｕが変数ｖを定数値と比較する命令かどうかを判断する（Ｓ１０３０）。データ生成部８０５は、命令ｕが変数ｖを定数値と比較する命令の場合に（Ｓ１０３０：ＹＥＳ）、後の処理により利用される論理値をＦＡＬＳＥに設定する（Ｓ１０５０）。この論理値ＦＡＬＳＥは、変数ｖの値を所定の他の定数で置き換える可能性がある状態を示す。
【００５７】
一方、データ生成部８０５は、命令ｕが変数ｖを定数値と比較する命令でない場合に（Ｓ１０３０：ＮＯ）、後の処理により利用される論理値をＴＲＵＥに設定する（Ｓ１０４０）。この論理値ＴＲＵＥは、変数ｖの値を他の値では一切代用できない状態を示す。
【００５８】
次に、データ生成部８０５は、命令ｕが変数ｖの値に基づく条件分岐命令であるかを判断する（Ｓ１０６０）。条件分岐命令ではない場合に（Ｓ１０６０：ＮＯ）、データ生成部８０５は、この命令ｕについての値域データを１つ生成する。値域データは、命令ｕが実行される直前における変数ｖの値域、命令ｕが実行された直後における変数ｖの値域、および、命令ｕが変数ｖを定数と比較する命令かどうかを示す上記論理値、の３つを要素とするデータである。
【００５９】
一方、命令ｕが変数ｖの値に基づく条件分岐命令である場合に（Ｓ１０６０：ＹＥＳ）、データ生成部８０５は、その条件分岐命令それぞれの分岐先について次の処理を繰り返す（Ｓ１０８０−Ｓ１０９０）。その処理とは、その条件分岐命令が実行される直前における変数ｖの値域、当該分岐先におけるその条件分岐命令が実行された直後の変数ｖの値域、および、上記論理値、の３つを要素とするデータを、値域データとして生成する処理である（Ｓ１０８５）。
【００６０】
図３の中間プログラム２４Ａの例で、変数ａｎｓｗｅｒが変数ｖとして選択されたとすると、変数ａｎｓｗｅｒの値に基づく６行目の条件分岐命令について、（全域、ｎｕｌｌ以外、ＦＡＬＳＥ）という値域データと、（全域、ｎｕｌｌ、ＦＡＬＳＥ）という値域データが生成される。また、図６の中間プログラム２４Ｂの例で、変数ａｎｓｗｅｒが変数ｖとして選択されたとすると、変数ａｎｓｗｅｒの値に基づく８行目の条件分岐命令について、（全域、−１以外、ＦＡＬＳＥ）という値域データと、（全域、−１、ＦＡＬＳＥ）という値域データが生成される。
【００６１】
生成された値域データは、値域データの集合を示す値域データ５０に順次追加される。また、上記Ｓ１０２０として説明した再帰的な処理によって生成された値域データも、値域データ５０に併合される。全く同じ複数の値域データが値域データ５０に含まれる場合には、データ生成部８０５は、それらをそのうち１つを除き値域データ５０から除外する。次に、データ生成部８０５は、変数ｖを使用する全ての命令を命令ｕとして選択済みかどうかを判断する（Ｓ１０９５）。選択してない命令があれば（Ｓ１０９５：ＮＯ）、データ生成部８０５は、Ｓ１０００に処理を戻して処理を繰り返す。選択済みであれば（Ｓ１０９５：ＹＥＳ）、データ生成部８０５は、Ｓ９１０の処理を終了する。
【００６２】
図９の説明に戻る。次に、第１データ除外部８１０は、除外処理１として、値域データ５０の中から不要な値域データを削除する（Ｓ９２０）。
図１１は、図９のＳ９２０における処理の詳細を示す。まず、第１データ除外部８１０は、論理値がＦＡＬＳＥの値域データを１つ、値域データ５０の中から選択する（Ｓ１１００）。そして、第１データ除外部８１０は、選択したその値域データが、他の何れかの値域データと比較して、実行直前および実行直後における変数の値域の組が相互に等しいかを判断する（Ｓ１１１０）。
【００６３】
等しい場合には（Ｓ１１１０：ＹＥＳ）、第１データ除外部８１０は、選択したその値域データの論理値がＴＲＵＥかどうかを判断する（Ｓ１１２０）。論理値がＴＲＵＥの場合に（Ｓ１１２０：ＹＥＳ）、第１データ除外部８１０は、選択したその値域データを削除する（Ｓ１１３０）。そして、次に、第１データ除外部８１０は、論理値がＦＡＬＳＥである全ての値域データを選択済みであるかどうかを判断する（Ｓ１１４０）。
【００６４】
選択済みでなければ（Ｓ１１４０：ＮＯ）、第１データ除外部８１０は、Ｓ１１００に処理を戻して次の値域データを選択する（Ｓ１１００）。選択済みであれば（Ｓ１１４０：ＹＥＳ）、第１データ除外部８１０は、Ｓ９２０の処理を終了する。
以上、Ｓ９２０の処理によれば、変数ｖが条件分岐命令のために定数と比較され、かつ、その分岐先で四則演算に用いられているような場合には、変数ｖの値が具体的に必要であることを示す情報のみを残して、最適化を適切に制御できる。
【００６５】
図９の説明に戻る。次に、第２データ除外部８２０は、第２の除外処理として、値域データ５０の中から不要な値域データをさらに削除する（Ｓ９３０）。
図１２は、図９のＳ９３０における処理の詳細を示す。まず、第２データ除外部８２０は、論理値がＦＡＬＳＥの値域データを１つ、値域データ５０の中から選択する（Ｓ１２００）。そして、第２データ除外部８２０は、選択したその値域データに含まれる、実行後の変数の値域が、他の何れかの値域データに含まれる、実行前の変数の値域と等しいかどうかを判断する（Ｓ１２１０）。
【００６６】
等しい場合には（Ｓ１２１０：ＹＥＳ）、第２データ除外部８２０は、選択したその値域データを削除する（Ｓ１２２０）。そして、第２データ除外部８２０は、論理値がＦＡＬＳＥの全ての値域データを既に値域データ５０から全て選択済みかどうかを判断する（Ｓ１２３０）。選択済みでなければ（Ｓ１２３０：ＮＯ）、第２データ除外部８２０は、Ｓ１２００に処理を戻して他の値域データを選択する。選択済みであれば（Ｓ１２３０：ＹＥＳ）、第２データ除外部８２０は、Ｓ９３０の処理を終了する。
【００６７】
以上、この第２の除外処理によれば、ある値域データの「実行後の変数の値域」が、他の値域データの「実行後の変数の値域」と一部重複する場合には、より狭い値域を有する一方の値域データのみを値域データ５０中に残し、他方の値域データを削除することができる。これにより、例えばバイナリ・サーチ（２分検索）などのような、条件分岐の入れ子構造について、中間的な判断を表す条件分岐を判断の対象から除外できる。
【００６８】
図９の説明に戻る。次に、判断部８３０は、値域データ５０に基づいて、代入命令ｓについてＳ９０５において解析した値域内の何れの値を命令ｓが変数ｖに代入したとしても、中間プログラム２４の実行結果が変化しないかを判断する（Ｓ９４０）。
図１３は、図９のＳ９４０における処理の詳細を示す。まず、判断部８３０は、記憶装置１０４０にアクセスして、論理値がＦＡＬＳＥの値域データを値域データ５０の中から選択して読み出す（Ｓ１３００）。
【００６９】
次に、判断部８３０は、選択したその値域データの、実行後の変数の値域が、命令ｓの変数の値域を包含するかどうかを判断する（Ｓ１３１０）。包含しなければ（Ｓ１３１０：ＮＯ）、判断部８３０は、論理値がＦＡＬＳＥである全ての値域データを値域データ５０から選択済みかどうかを判断する（Ｓ１３１５）。
【００７０】
選択済みでなければ（Ｓ１３１５：ＮＯ）、判断部８３０は、Ｓ１３００に処理を戻して次の値域データを選択する。選択済みであれば（Ｓ１３１５：ＹＥＳ）、判断部８３０は、代入命令（ｓ）を定数値の代入命令に置換することはできないと判断して（Ｓ１３４０）、Ｓ９４０の処理を終了する。
【００７１】
一方で、判断部８３０は、選択したその値域データに含まれる、実行後の変数の値域が、命令ｓの変数の値域を包含することを条件に（Ｓ１３１０：ＹＥＳ）、当該実行後の変数の値域が、他の何れかの値域データに含まれる、実行後の変数の値域と重複するかどうかを判断する（Ｓ１３２０）。重複しないことを条件に（Ｓ１３２０：ＮＯ）、判断部８３０は、命令ｓを定数値の代入命令に置換可能と判断する（Ｓ１３３０）。一方、重複することを条件に（Ｓ１３２０：ＹＥＳ）、判断部８３０は、命令ｓを当該代入命令に置換不能と判断する（Ｓ１３４０）。
【００７２】
図９の説明に戻る。置換部８４０は、判断部８３０による判断が成立することを条件に、変数ｖに値を代入する命令ｓを、当該命令ｓにより代入される値の範囲内の定数値を変数ｖに代入する命令に置換する（Ｓ９５０）。
図１４は、図９のＳ９５０における処理の詳細を示す。まず、置換部８４０は、命令ｓにより代入される変数ｖの値の範囲内から、定数値を選択し（Ｓ１４００）、選択したその定数値を変数ｖに代入する命令により、命令ｓを置換する（Ｓ１４１０）。
【００７３】
例えば、置換部８４０は、置換すべき当該命令ｓについての変数の値域の中から、中間プログラム２４をコンパイルした実行コードを実行するコンピュータにおいて、１命令でレジスタにロードすることができる即値（イミディエート・バリュー）の範囲内の値を選択する。好ましくは、置換部８４０は、置換すべき当該命令ｓについての変数の値域の中から、絶対値の最も小さい値を選択してもよい。
【００７４】
また、置換部８４０は、置換すべき当該命令ｓについての変数の値域の中から、２のべき乗の値を選択してもよい。そして、置換部８４０は、命令ｓを、当該選択した値を変数に代入する命令に置換する。これにより、コンピュータは命令ｓに対応する実行コードを、例えば１命令分の実行サイクルなどの、極めて短い時間で実行することができる。
【００７５】
図９の説明に戻る。次に、イディオム検出部８５０は、最適化の機会を広げるべく、上記命令ｓに加えて、予め定められた第１イディオムを中間プログラム２４から更に検出する（Ｓ９６０）。
図１５は、図９のＳ９６０における処理の詳細を示す。イディオム検出部８５０は、中間プログラム２４を走査することで、変数ｖに処理結果を代入する第１イディオムを検出する（Ｓ１５００）。この第１イディオムは、複数の配列変数のそれぞれから予め定められた数の要素を読み出して先頭側から順次比較して、異なる要素値が検出された場合には最初に検出された要素値の差を変数ｖに代入する一方で、異なる要素値が検出されない場合には数値０を変数ｖに代入する処理である。
【００７６】
この第１イディオムの例を図１６−１７に示す。
図１６は、本実施形態に係る入力プログラム２０Ｃおよびライブラリ・プログラム２２Ｃの具体例を示す。入力プログラム２０Ｃは、１行目に、ｍｅｔｈｏｄＣというメソッドを呼び出して、その戻り値をｄｉｆｆという変数の代入する命令を含む。また、入力プログラム２０Ｃは、３−７行目に、その変数ｄｉｆｆの値が定数０と等しければ処理１を、変数ｄｉｆｆの値が定数０と異なれば処理２を行う命令を含む。
【００７７】
一方、ライブラリ・プログラム２２Ｃは、１−７行目に、ｍｅｔｈｏｄＣの定義を含む。具体的には、ライブラリ・プログラム２２Ｃは、２行目から５行目に、ｓｒｃ１およびｓｒｃ２という２つの配列変数のそれぞれから予め定められたｌｅｎ個の要素を読み出して比較して、異なる要素値が検出された場合には要素値の差を変数ｄｉｆｆに代入する一方で、異なる要素値が検出されない場合には数値０を変数ｄｉｆｆに代入する命令群を含む。また、ライブラリ・プログラム２２Ｃは、６行目に、変数ｄｉｆｆの値をリターンする命令を含む。
【００７８】
図１７は、本実施形態に係る中間プログラム２４Ｃの具体例を示す。１−４行目には、ｍｅｔｈｏｄＣ内の各命令が、戻り値をリターンする命令を除きそのまま展開されている。従って、イディオム検出部８５０は、中間プログラム２４Ｃの１−４行目の命令群を、第１イディオムとして検出することができる。
【００７９】
図１５の説明に戻る。第１イディオムが検出された場合に（Ｓ１５１０：ＹＥＳ）、判断部８３０は、変数ｖの値に基づく条件分岐命令が第１条件を満たすかを判断する（Ｓ１５２０）。その第１条件とは、変数ｖの値に基づいて条件分岐するその命令の第１の分岐先における当該変数ｖの値域が数値０のみを含み、かつ、当該命令の第２の分岐先における当該変数ｖの値域が数値０以外のみを含む、という条件である。
【００８０】
例えば図１７の中間プログラム２４Ｃは、５−９行目に、変数ｄｉｆｆが定数０と等しいかという条件を判断する条件分岐命令を含む。この条件分岐命令の第１の分岐先、例えば６行目において、変数ｄｉｆｆの値域は数値０のみを含む。一方、この条件分岐命令の第２の分岐先、例えば９行目において、変数ｄｉｆｆの値域は数値０以外のみを含む。従って、この変数ｄｉｆｆを変数ｖとして選択するとすれば、判断部８３０は、この５−９行目の命令群が第１条件を満たすと判断できる。
【００８１】
この５−９行目において、変数ｄｉｆｆの値は、定数０との比較のみに使用され、その他の目的では使用されていない。従って、中間プログラム２４Ｃの２行目に示したような、要素値の差分を算出する処理は無駄になっている。このため、配列変数ｓｒｃ１およびｓｒｃ２を比較して要素値の異なる要素があるかどうかが分かれば、その差分がどのような大きさであるかを算出する必要はない。このような性質を利用して、置換部８４０は、第１イディオムを所定の処理に置換することができる。
【００８２】
図１５の説明に戻る。
第１イディオムが検出され、かつ、変数ｖの値に基づく条件分岐命令が第１条件を満たすことを条件に（Ｓ１５２０：ＹＥＳ）、置換部８４０は、検出されたその第１イディオムを、その第１イディオムに基づいて定まる所定の処理に置換する（Ｓ１５３０）。この所定の処理は、複数の配列変数のそれぞれから予め定められた数の要素を読み出して比較して、異なる要素値が検出された場合には０以外の所定の定数を変数ｖに代入する一方で、異なる要素値が検出されない場合には数値０を変数ｖに代入する処理である。
【００８３】
この所定の処理は、これをＩＢＭコーポレーションのＳｙｓｔｅｍ  ｚまたはＳｙｓｔｅｍ  ｐ用にコンパイルするとすれば、Ｓｙｓｔｅｍ  ｚまたはＳｙｓｔｅｍ  ｐが有するＣＬＣ命令を利用して実現される。但し、ＣＬＣ命令は、処理結果を、コンディション・コード（ＣＣ）フラグと呼ばれる特別な記憶領域に格納する。従って、置換部８４０は、変数ｖ（より正確には、変数ｖに割り付けられたレジスタまたはメモリ領域）に、このＣＣフラグの内容をロードする命令を生成する（Ｓ１５４０）。この命令のことを命令ｔと呼ぶ。
【００８４】
このようにして置換部８４０により生成されたプログラムの一例を図１８に示す。
図１８は、本実施形態に係る中間プログラム２６Ｃの具体例を示す。１行目はＣＬＣ命令を示す。ここでは説明の明確化のため、ＣＬＣ命令の実行コードではなく、その処理内容を記載した。また、２−６行目全体が、ＣＣフラグの内容を変数ｄｉｆｆにロードする命令ｔを示す。７−１１行目は、図１７の中間プログラム２４Ｃの５−９行目と同一である。
【００８５】
図１５の説明に戻る。第１イディオムは検出されたものの条件分岐命令が第１条件を満たさない場合に（Ｓ１５２０：ＮＯ）、判断部８３０は、その条件分岐命令が第２条件を満たすかを判断する（Ｓ１５７０）。その第２条件とは、変数ｖの値に基づいて条件分岐するその条件分岐命令の第１の分岐先における当該変数ｖの値域が、数値０のみを含み、当該条件分岐命令の第２の分岐先における当該変数ｖの値域が正の数のみを含み、かつ、当該条件分岐命令の第３の分岐先における当該変数ｖの値域が負の数のみを含む、という条件である。
【００８６】
この条件分岐命令の例を図１９−２０に示す。
図１９は、本実施形態に係る入力プログラム２０Ｄおよびライブラリ・プログラム２２Ｄの具体例を示す。入力プログラム２０Ｄは、１行目に、ｍｅｔｈｏｄＣというメソッドを呼び出して、その戻り値をｄｉｆｆという変数の代入する命令を含む。また、入力プログラム２０Ｄは、３−７行目に、その変数ｄｉｆｆの値が定数０と等しければ処理１を、変数ｄｉｆｆの値が正の数ならば処理２を、変数ｄｉｆｆの値が負の数ならば処理３を、それぞれ行う命令を含む。ライブラリ・プログラム２２Ｄは、１−７行目に、ｍｅｔｈｏｄＣの定義を含む。この定義は、ライブラリ・プログラム２２Ｃの１−７行目に示したＭｍｅｔｈｏｄＣの定義と同一であるから説明を省略する。
【００８７】
図２０は、本実施形態に係る中間プログラム２４Ｄの具体例を示す。１−４行目には、ｍｅｔｈｏｄＣ内の各命令が、戻り値をリターンする命令を除きそのまま展開されている。また、５−１１行目の条件分岐命令は、入力プログラム２０Ｄの３−９行目の条件分岐命令と同一である。この条件分岐命令は、変数ｄｉｆｆを定数０と比較する条件分岐命令である。
【００８８】
この条件分岐命令の第１の分岐先、例えば６行目において、変数ｄｉｆｆの値域は数値０のみを含む。一方、この条件分岐命令の第２の分岐先、例えば８行目において、変数ｄｉｆｆの値域は正の数のみを含む。また、この条件分岐命令の第３の分岐先、例えば１０行目において、変数ｄｉｆｆの値は負の数のみを含む。従って、この変数ｄｉｆｆを変数ｖとして選択するとすれば、判断部８３０は、この３−９行目の命令群が第２条件を満たすと判断できる。
【００８９】
図１５の説明に戻る。
第１イディオムが検出され、かつ、変数ｖの値に基づく条件分岐命令が第２条件を満たすことを条件に（Ｓ１５７０：ＹＥＳ）、置換部８４０は、検出されたその第１イディオムを、その第１イディオムに基づいて定まる所定の処理に置換する（Ｓ１５８０）。この所定の処理は、複数の配列変数のそれぞれから予め定められた数の要素を読み出して比較して、異なる要素値が検出されない場合には数値０を変数ｖに代入し、一方の配列変数の要素が他方の配列変数の要素より大きい場合には所定の正の定数を変数ｖに代入する一方で、他方の配列変数の要素が一方の配列変数の要素より大きい場合には所定の負の定数を変数ｖの代入する処理である。
【００９０】
この所定の処理は、これをＩＢＭコーポレーションのＳｙｓｔｅｍ  ｚ用にコンパイルするとすれば、Ｓｙｓｔｅｍ  ｚが有するＣＬＣ命令を利用して実現される。但し、ＣＬＣ命令は、処理結果を、コンディション・コード（ＣＣ）フラグと呼ばれる特別な記憶領域に格納する。従って、置換部８４０は、変数ｖ（より正確には、変数ｖに割り付けられたレジスタまたはメモリ領域）に、このＣＣフラグの内容に基づく定数をロードする命令を生成する（Ｓ１５９０）。この命令のことを命令ｔと呼ぶ。
【００９１】
このようにして置換部８４０により生成されたプログラムの一例を図２１に示す。
図２１は、本実施形態に係る中間プログラム２６Ｄの具体例を示す。１行目はＣＬＣ命令を示す。ここでは説明の明確化のため、ＣＬＣ命令の実行コードではなく、その処理内容を記載した。また、２−８行目全体が、ＣＣフラグの内容を変数ｄｉｆｆにロードする命令ｔを示す。９−１５行目は、図２０の中間プログラム２４Ｃの５−１１行目と同一である。
【００９２】
以上、第１イディオムの検出によれば、数値を算出して変数に代入する命令だけでなく、複数の配列変数を要素ごとに比較する命令群全体を最適化することで、プログラムの実行効率を大幅に向上できる。更に、この最適化により、特定のアーキティクチャによりサポートされる特別な命令を利用して、プログラムの実行効率を一層高めことができる。
【００９３】
次に、以上の最適化によって生成されたプログラムをより一層効率化するための追加的な処理について説明する。この処理は、ＣＣフラグを変数に代入することなくそのまま利用して条件分岐させること、を第１の目的とする。また、変数の代入する定数を、その変数の値域外から選択すること、を第２の目的とする。
【００９４】
図２２は、図９のＳ９７０における処理の詳細を示す。まず、置換部８４０は、変数ｖに代入される定数値が、ＣＣフラグの内容をそのまま表した数値かどうかを判断する（Ｓ２２００）。変数ｖに定数値を代入する命令のことを命令ｔと呼ぶ。命令ｔにより代入されるその定数値がＣＣフラグの内容をそのまま表した数値であることを条件に（Ｓ２２００：ＹＥＳ）、置換部８４０は、命令ｔの実行から、変数ｖを使用する何れの命令の実行までの間においても、ＣＣフラグの内容が変更されないかどうかを判断する（Ｓ２２１０）。
【００９５】
例えば図１８の中間プログラム２６Ｃの例において、２−６行目の命令は、変数ｄｉｆｆにＣＣフラグの内容をそのまま表した定数を代入する命令ｔである。また、７行目の命令は、変数ｄｉｆｆを参照する命令である。そして、この命令ｔの実行からこの変数ｄｉｆｆを参照する命令の実行までの間において、ＣＣフラグの内容は変更されていない。したがって、Ｓ２２００およびＳ２２１０における判断は成立する。
【００９６】
図２２の説明に戻る。ＣＣフラグの内容が変更されないことを条件に（Ｓ２２１０：ＹＥＳ）、置換部８４０は、変数ｖの値に基づいて条件分岐する命令ｕを、ＣＣフラグに基づいて条件分岐する命令に置換する（Ｓ２２２０）。そして、置換部８４０は、不要となった命令ｔを削除する（Ｓ２２３０）。以上の処理を適用した結果のプログラムを図２３に示す。
【００９７】
図２３は、本実施形態に係る中間プログラム２６Ｃの他の具体例を示す。１行目は、図１８の中間プログラム２６Ｃの１行目と同様である。一方、命令ｔに相当する図１８の２−７行目は削除されている。また、変数ｄｉｆｆに基づく条件分岐命令に相当する図１８の７−１１行目は、ＣＣフラグに基づく条件分岐命令に置換されている。
【００９８】
このように、以上の処理によれば、ＣＣフラグの内容を変数に格納する処理を省略して、プログラムの実行効率を改善できる。また、変数値に基づく条件分岐命令よりも、ＣＣフラグの内容に基づく条件分岐命令の方が、一般に高速動作可能なことから、条件分岐命令自体の実行を高速化することもできる。
【００９９】
図２２の説明に戻る。次に、置換部８４０は、変数ｖを参照する命令ｕについて、その命令ｕについての変数の値域内の定数値をその変数ｖに代入するよりも、その変数の値域外の定数値をその変数ｖに代入する方が、中間プログラム２４が全体として高速動作するかどうかを判断する（Ｓ２２４０）。この判断の一例を、図２４−２５および図２１を参照して説明する。
【０１００】
図２１に示すように、中間プログラム２６Ｄの９−１５行目では、変数ｄｉｆｆが０、正の数および負の数の何れであるかが判断されている。従って、２−８行目では、変数ｄｉｆｆに、０、正の定数および負の定数のいずれかが代入されている。この２−８行目の代入命令が、例えばＩＢＭコーポレーションのＳｙｓｔｅｍ  ｚ用にコンパイルされると、例えば図２４のような実行コードに変換される。
【０１０１】
図２４は、本実施形態に係る中間プログラム２６Ｄの第２行から第８行の命令に対応する実行コードの一例を示す。１行目の命令は、ＩＰＭ（ＩＮＳＥＲＴ  ＰＲＯＧＲＡＭ  ＭＡＳＫ）命令であり、ＣＣフラグの内容をレジスタＲ１の第２−第３ビットに格納する。第０および第１ビットは０で初期化される。
【０１０２】
２行目の命令は、ＳＬＬ命令であり、Ｒ１を２ビットシフトする。３行目の命令は、ＳＲＡ命令であり、Ｒ１を３０ビット右に算術シフトする。４行目の命令は、ＬＣＲ命令であり、Ｒ１を整数とみなして符号を反転させる。これにより、変数ｄｉｆｆの内容を格納するために割り当てたレジスタＲ１には、ＣＣフラグの内容に応じて、０、−１または２が代入される。
【０１０３】
一方で、例えば変数ｄｉｆｆに、その変数の値域外の値を代入する場合における中間プログラム２６Ｄの例を図２５（ａ）に示す。
図２５は、本実施形態に係る中間プログラム２６Ｄの他の具体例を、第２行から第８行の命令に対応する実行コードと対比して示す。図２５（ａ）に示すように、２−８行目において、変数ｄｉｆｆには、ＣＣフラグの内容に基づき、０、１または２が代入されている。即ち、変数ｄｉｆｆの値域が０、正の数、または、負の数であるのに対し、代入される定数値は０、正の数である１、または、正の数である２である。
【０１０４】
ただし、変数ｄｉｆｆに基づく条件分岐も、プログラムの意味を変更させないように変更されている。即ち、１１行目において、処理２を実行すべきかどうかは、変数ｄｉｆｆが正の数であるという条件ではなく、変数ｄｉｆｆが定数２と等しいという条件に基づき判断されている。この中間プログラム２６ＤをＩＢＭコーポレーションのＳｙｓｔｅｍ  ｚ用にコンパイルした実行コードの例を図２５（ｂ）に示す。
【０１０５】
１行目は、１行目の命令は、ＩＰＭ（ＩＮＳＥＲＴ  ＰＲＯＧＲＡＭ  ＭＡＳＫ）命令であり、ＣＣフラグの内容をレジスタＲ１の第２−第３ビットに格納する。第０および第１ビットは０で初期化される。３行目の命令は、ＳＲＡ命令であり、Ｒ１を２８ビット右に算術シフトする。
【０１０６】
以上のように、図２５（ｂ）を図２４と対比すると、実行コードに含まれる機械語の命令数は４つから２つに減少している。置換部８４０は、変数ｖに代入する定数値を変更することで、このような命令数の減少が生じる場合には、プログラムが高速化すると判断する。判断の具体的な実現方法として、置換部８４０は、プログラムをこれら２つの場合のそれぞれについてコンパイルして、機械語の命令数を比較してよい。
【０１０７】
また、置換部８４０は、予め定められたコンパイル前の複数の命令列のそれぞれに対応付けて、その命令列をコンパイルしたならば生成されるであろう実行コードの実行の所要時間を記録していてもよい。そして、置換部８４０は、変数ｖに代入する定数値を変更する前と変更した後のそれぞれのプログラムが、当該予め記録した命令列に一致するかどうかを判断する。そして、置換部８４０は、それぞれのプログラムに一致した当該命令列に対応する所要時間を比較してよい。
【０１０８】
図２２の説明に戻る。次に、変数ｖを参照する命令ｕについて、その命令ｕについての変数の値域内の定数値をその変数ｖに代入するよりも、その変数の値域外の定数値をその変数ｖに代入する方が、中間プログラム２４が全体として高速動作する場合に（Ｓ２２４０：ＹＥＳ）、置換部８４０は、当該変数ｖに代入する定数値、および、当該命令ｕが変数ｖと比較する定数値を変更する。
【０１０９】
具体的には、置換部８４０は、変数ｖに値を代入する当該命令を、当該命令についての変数ｖの値域外から選択した定数値を当該変数ｖに代入する命令に置換する。これと共に、置換部８４０は、当該変数ｖの値に基づいて条件分岐するある命令についての変数ｖの値域が、当該選択した定数値を含むように、当該条件分岐する命令を変更する。これにより、例えば図２１に示す中間プログラム２６Ｄが、図２５（ａ）に示す中間プログラム２６Ｄに変更される。この結果、図２５（ｂ）に示す実行コードが出力プログラム２８に含めて生成される。
【０１１０】
最後に、図２６−２９を参照して、代入命令の最適化によって他の最適化の機会が拡大する例を説明する。
図２６は、本実施形態に係る入力プログラム２０Ｅおよびライブラリ・プログラム２２Ｅの具体例を示す。入力プログラム２０Ｅに示すように、ｍｅｔｈｏｄＤが呼び出されて、その戻り値が変数ａｎｓｗｅｒに格納される。そして、変数ａｎｓｗｅｒの値は定数−１と比較されて、等しい場合には所定の処理が実行される。
【０１１１】
ライブラリ・プログラム２２Ｅは、そのｍｅｔｈｏｄＤの定義を示す。２行目から８行目に示すように、所定の条件が成立する場合には、配列変数ａの中から要素値が０ｘ８０である要素が検索されて、その要素がその配列変数の何番目であるかを示す数値が変数ａｎｓｗｅｒに代入される。一方、上記所定の条件が成立しない場合には、変数ａｎｓｗｅｒには数値−１が代入される。
【０１１２】
前段最適化部１００は、このｍｅｔｈｏｄＤをインライン展開することで、中間プログラム２４Ｅを生成する。
図２７は、本実施形態に係る中間プログラム２４Ｅの具体例を示す。１−９行目には、ｍｅｔｈｏｄＤ内の各命令が、戻り値をリターンする命令を除きそのまま展開されている。６行目を参照すると、変数ａｎｓｗｅｒには変数ｉが代入されている。そして、その変数ｉの取りうる値の範囲は、３行目などの処理より、０以上である。
【０１１３】
１０行目を参照すると、変数ａｎｓｗｅｒの値に基づく条件分岐命令について、第１の分岐先における変数の値域は−１のみを含み、第２の分岐先における変数の値域は−１以外のみを含む。従って、第２の分岐先における変数の値域は、６行目の代入命令による変数の値域を包含している。このため、６行目の代入命令は、定数値を変数の代入する命令に置換される。
【０１１４】
図２８は、本実施形態に係る中間プログラム２６Ｅの具体例を示す。置換により、６行目に示すように、変数ａｎｓｗｅｒには定数値０が代入されている。ここで、中間プログラム２６Ｅにおいて変数ｉは、３−５行目においてのみ参照されて、その後の処理においては一切参照されていない。従って、変数ｉに関する演算そのものが不要となったことが分かる。
【０１１５】
図２９は、本実施形態に係る中間プログラム２６Ｆの具体例を示す。これにより、変数ｉに関する３−４行目の演算それ自体が不要となって削除される。このような不使用変数の値を生成する処理の削除は、例えば、配列境界チェック除去手法、および、デッドストア・エリミネーション（ＤＳＥ：Ｄｅａｄ  Ｓｔｏｒｅ  Ｅｌｉｍｉｎａｔｉｏｎ）またはデッドコード・エリミネーション（ＤＣＥ：Ｄｅａｄ  Ｃｏｄｅ  Ｅｌｉｍｉｎａｔｉｏｎ）として当該技術分野において周知であるから、その実現方法の説明を省略する。
【０１１６】
以上図２６−図２９を参照して説明したように、代入命令の最適化は、単に１つの演算処理を省略するのみならず、その他の最適化の阻害要因を取り除き、その他の様々な最適化を促進して、プログラムの実行効率を大幅に向上させることができる。例えば、ループ処理によって順次更新される変数の値を定数に変更できれば、ループのベクトル化などの並列化を促進できることも期待される。実際に、本願発明者らの計測によれば、実用的なプログラムの最適化により大幅な速度向上が確かめられた。
【０１１７】
図３０は、本実施形態に係るコンパイラ装置１０として機能するコンピュータ７００のハードウェア構成の一例を示す。コンピュータ７００は、ホストコントローラ１０８２により相互に接続されるＣＰＵ１０００、ＲＡＭ１０２０、及びグラフィックコントローラ１０７５を有するＣＰＵ周辺部と、入出力コントローラ１０８４によりホストコントローラ１０８２に接続される通信インターフェイス１０３０、ハードディスクドライブ１０４０、及びＣＤ−ＲＯＭドライブ１０６０を有する入出力部と、入出力コントローラ１０８４に接続されるＲＯＭ１０１０、フレキシブルディスクドライブ１０５０、及び入出力チップ１０７０を有するレガシー入出力部とを備える。
【０１１８】
ホストコントローラ１０８２は、ＲＡＭ１０２０と、高い転送レートでＲＡＭ１０２０をアクセスするＣＰＵ１０００及びグラフィックコントローラ１０７５とを接続する。ＣＰＵ１０００は、ＲＯＭ１０１０及びＲＡＭ１０２０に格納されたプログラムに基づいて動作し、各部の制御を行う。グラフィックコントローラ１０７５は、ＣＰＵ１０００等がＲＡＭ１０２０内に設けたフレームバッファ上に生成する画像データを取得し、表示装置１０８０上に表示させる。これに代えて、グラフィックコントローラ１０７５は、ＣＰＵ１０００等が生成する画像データを格納するフレームバッファを、内部に含んでもよい。
【０１１９】
入出力コントローラ１０８４は、ホストコントローラ１０８２と、比較的高速な入出力装置である通信インターフェイス１０３０、ハードディスクドライブ１０４０、及びＣＤ−ＲＯＭドライブ１０６０を接続する。通信インターフェイス１０３０は、ネットワークを介して外部の装置と通信する。ハードディスクドライブ１０４０は、コンピュータ７００が使用するプログラム及びデータを格納する。ＣＤ−ＲＯＭドライブ１０６０は、ＣＤ−ＲＯＭ１０９５からプログラム又はデータを読み取り、ＲＡＭ１０２０又はハードディスクドライブ１０４０に提供する。
【０１２０】
また、入出力コントローラ１０８４には、ＲＯＭ１０１０と、フレキシブルディスクドライブ１０５０や入出力チップ１０７０等の比較的低速な入出力装置とが接続される。ＲＯＭ１０１０は、コンピュータ７００の起動時にＣＰＵ１０００が実行するブートプログラムや、コンピュータ７００のハードウェアに依存するプログラム等を格納する。フレキシブルディスクドライブ１０５０は、フレキシブルディスク１０９０からプログラム又はデータを読み取り、入出力チップ１０７０を介してＲＡＭ１０２０またはハードディスクドライブ１０４０に提供する。入出力チップ１０７０は、フレキシブルディスク１０９０や、例えばパラレルポート、シリアルポート、キーボードポート、マウスポート等を介して各種の入出力装置を接続する。
【０１２１】
コンピュータ７００に提供されるプログラムは、フレキシブルディスク１０９０、ＣＤ−ＲＯＭ１０９５、又はＩＣカード等の記録媒体に格納されて利用者によって提供される。プログラムは、入出力チップ１０７０及び/又は入出力コントローラ１０８４を介して、記録媒体から読み出されコンピュータ７００にインストールされて実行される。プログラムがコンピュータ７００等に働きかけて行わせる動作は、図１から図２９において説明したコンパイラ装置１０における動作と同一であるから、説明を省略する。
【０１２２】
以上に示したプログラムは、外部の記憶媒体に格納されてもよい。記憶媒体としては、フレキシブルディスク１０９０、ＣＤ−ＲＯＭ１０９５の他に、ＤＶＤやＰＤ等の光学記録媒体、ＭＤ等の光磁気記録媒体、テープ媒体、ＩＣカード等の半導体メモリ等を用いることができる。また、専用通信ネットワークやインターネットに接続されたサーバシステムに設けたハードディスク又はＲＡＭ等の記憶装置を記録媒体として使用し、ネットワークを介してプログラムをコンピュータ７００に提供してもよい。
【０１２３】
以上、本発明を実施の形態を用いて説明したが、本発明の技術的範囲は上記実施の形態に記載の範囲には限定されない。上記実施の形態に、多様な変更または改良を加えることが可能であることが当業者に明らかである。例えば、本実施形態において、最適化の対象はインライン展開等の技術を適用したプログラムであったが、最適化の対象は、インライン展開等の技術を適用しないプログラムであってもよい。その場合においては、変数の値域を示す情報をメソッド間に伝播させて、メソッドを特殊化（クローニング）させることで、本実施形態と同様の作用・効果を得ることができる。また、本実施形態において、最適化の対象は実行コード生成前のプログラムであり、そのプログラムにおける変数に値を代入する命令であったが、最適化の対象はこれに限られない。例えば、最適化の対象が実行コードである場合においては、変数をメモリ内の特定領域とみなし、代入命令をその特定領域へのストア命令とみなして最適化が行われてよい。その様な変更または改良を加えた形態も本発明の技術的範囲に含まれ得ることが、特許請求の範囲の記載から明らかである。
【図面の簡単な説明】
【０１２４】
【図１】図１は、本実施形態に係るコンパイラ装置１０の全体構成を示す。
【図２】図２は、本実施形態に係る入力プログラム２０Ａおよびライブラリ・プログラム２２Ａの具体例を示す。
【図３】図３は、本実施形態に係る中間プログラム２４Ａの具体例を示す。
【図４】図４は、本実施形態に係る中間プログラム２６Ａの具体例を示す。
【図５】図５は、本実施形態に係る入力プログラム２０Ｂおよびライブラリ・プログラム２２Ｂの具体例を示す。
【図６】図６は、本実施形態に係る中間プログラム２４Ｂの具体例を示す。
【図７】図７は、本実施形態に係る中間プログラム２６Ｂの具体例を示す。
【図８】図８は、本実施形態に係る代入最適化部１１０の機能構成を示す。
【図９】図９は、本実施形態に係る代入最適化部１１０により代入命令が最適化される処理の流れを示す。
【図１０】図１０は、図９のＳ９１０における処理の詳細を示す。
【図１１】図１１は、図９のＳ９２０における処理の詳細を示す。
【図１２】図１２は、図９のＳ９３０における処理の詳細を示す。
【図１３】図１３は、図９のＳ９４０における処理の詳細を示す。
【図１４】図１４は、図９のＳ９５０における処理の詳細を示す。
【図１５】図１５は、図９のＳ９６０における処理の詳細を示す。
【図１６】図１６は、本実施形態に係る入力プログラム２０Ｃおよびライブラリ・プログラム２２Ｃの具体例を示す。
【図１７】図１７は、本実施形態に係る中間プログラム２４Ｃの具体例を示す。
【図１８】図１８は、本実施形態に係る中間プログラム２６Ｃの具体例を示す。
【図１９】図１９は、本実施形態に係る入力プログラム２０Ｄおよびライブラリ・プログラム２２Ｄの具体例を示す。
【図２０】図２０は、本実施形態に係る中間プログラム２４Ｄの具体例を示す。
【図２１】図２１は、本実施形態に係る中間プログラム２６Ｄの具体例を示す。
【図２２】図２２は、図９のＳ９７０における処理の詳細を示す。
【図２３】図２３は、本実施形態に係る中間プログラム２６Ｃの他の具体例を示す。
【図２４】図２４は、本実施形態に係る中間プログラム２６Ｄの第２行から第８行の命令に対応する実行コードの一例を示す。
【図２５（ａ）】図２５（ａ）は、本実施形態に係る中間プログラム２６Ｄの他の具体例を示す。
【図２５（ｂ）】図２５（ｂ）は、本実施形態に係る中間プログラム２６Ｄの第２行から第８行の命令に対応する実行コードを示す。
【図２６】図２６は、本実施形態に係る入力プログラム２０Ｅおよびライブラリ・プログラム２２Ｅの具体例を示す。
【図２７】図２７は、本実施形態に係る中間プログラム２４Ｅの具体例を示す。
【図２８】図２８は、本実施形態に係る中間プログラム２６Ｅの具体例を示す。
【図２９】図２９は、本実施形態に係る中間プログラム２６Ｆの具体例を示す。
【図３０】図３０は、本実施形態に係るコンパイラ装置１０として機能するコンピュータ７００のハードウェア構成の一例を示す。
【符号の説明】
【０１２５】
１０  コンパイラ装置
１５  コンパイラプログラム
２０  入力プログラム
２２  ライブラリ・プログラム
２４  中間プログラム
２６  中間プログラム
２８  出力プログラム
５０  値域データ
１００  前段最適化部
１１０  代入最適化部
１２０  後段最適化部
７００  コンピュータ
８００  値域解析部
８０５  データ生成部
８１０  第１データ除外部
８２０  第２データ除外部
８３０  判断部
８４０  置換部
８５０  イディオム検出部
１０００  ＣＰＵ
１０４０  記憶装置
【図１】
0005039948.tif 000002
【図２】
0005039948.tif 000003
【図３】
0005039948.tif 000004
【図４】
0005039948.tif 000005
【図５】
0005039948.tif 000006
【図６】
0005039948.tif 000007
【図７】
0005039948.tif 000008
【図８】
0005039948.tif 000009
【図９】
0005039948.tif 000010
【図１０】
0005039948.tif 000011
【図１１】
0005039948.tif 000012
【図１２】
0005039948.tif 000013
【図１３】
0005039948.tif 000014
【図１４】
0005039948.tif 000015
【図１５】
0005039948.tif 000016
【図１６】
0005039948.tif 000017
【図１７】
0005039948.tif 000018
【図１８】
0005039948.tif 000019
【図１９】
0005039948.tif 000020
【図２０】
0005039948.tif 000021
【図２１】
0005039948.tif 000022
【図２２】
0005039948.tif 000023
【図２３】
0005039948.tif 000024
【図２４】
0005039948.tif 000025
【図２５（ａ）】
0005039948.tif 000026
【図２５（ｂ）】
0005039948.tif 000027
【図２６】
0005039948.tif 000028
【図２７】
0005039948.tif 000029
【図２８】
0005039948.tif 000030
【図２９】
0005039948.tif 000031
【図３０】
0005039948.tif 000032