(57)【要約】      （修正有）【課題】これまでより多くの種類のプログラムに対し、命令列をより高速に実行可能な命令に置換する最適化を行う。【解決手段】最適化対象の対象プログラムの中から、予め定められた複数の命令を有する置換対象パターンを検出し、検出した置換対象パターンを、置換対象パターンに対応して定められた置換先命令列に置換して最適化するコンパイラ装置を提供する。この装置は、対象プログラムが有する複数の部分プログラムのうち、置換対象パターンが含まれる部分プログラムを検索して格納し、格納された対象部分プログラムに対し、条件分岐命令よりも先に実行される命令を当該条件分岐命令の分岐先のそれぞれに移動させる変形を行って、対象部分プログラムに含まれる命令間の依存関係を置換対象パターンに一致させ、変形された対象部分プログラムを、置換対象パターンに対応して定められた置換先命令列に置換して、最適化後の対象プログラムに含めて出力する。【選択図】図１
2008097249.tif 000002
【特許請求の範囲】
【請求項１】
最適化対象の対象プログラムの中から、予め定められた複数の命令を有する置換対象パターンを検索し、検索した前記置換対象パターンを、前記置換対象パターンに対応して定められた置換先命令列に置換して最適化するコンパイラ装置であって、
前記対象プログラムが有する複数の部分プログラムのうち、前記置換対象パターンに含まれる全ての命令に対応する命令を含む部分プログラムをＣＰＵの動作により検索して、最適化対象の対象部分プログラムとして記憶装置に格納する対象部分プログラム検索部と、
前記記憶装置に格納された前記対象部分プログラムに対し、条件分岐命令よりも先に実行される命令を当該条件分岐命令の分岐先のそれぞれに移動させる変形をＣＰＵの動作によって行って、前記対象部分プログラムに含まれる命令間の依存関係を前記置換対象パターンに一致させる命令列変形部と、
前記命令列変形部により変形された前記対象部分プログラムを、前記置換対象パターンに対応して定められた置換先命令列に、ＣＰＵの動作により置換して、最適化後の対象プログラムに含めて出力する命令列置換部と
を備えるコンパイラ装置。
【請求項２】
前記命令列変形部は、
前記対象部分プログラム内の基本ブロック毎に、ＣＰＵの動作により、当該基本ブロック内の各命令を走査して、前記対象部分プログラム内の複数の命令のうち、当該基本ブロック内の何れかの命令との間でデータ依存関係を有する命令の集合を選択して、当該命令の集合を示すＫＩＬＬデータを生成し記憶装置に格納する第１ＫＩＬＬデータ生成部と、
前記置換対象パターンにおける各命令の実行順序の関係に基づいて、前記置換対象パターン内の各命令を先行命令とし、当該先行命令を、前記置換対象パターンにおいて当該先行命令の次に実行される後続命令に対応付けた対応データをＣＰＵの動作により生成し記憶装置に格納する対応データ生成部と、
前記対象部分プログラム内の基本ブロック毎に、ＣＰＵの動作により、当該基本ブロック内の各命令を走査して、前記対応データ中の後続命令を検索したことを条件に、前記対応データにおいて当該後続命令に対応する先行命令を、当該基本ブロックに対応する前記ＫＩＬＬデータに追加する第１ＫＩＬＬデータ追加部と、
前記対象部分プログラム内の基本ブロック毎に、ＣＰＵの動作により、当該基本ブロックの末尾から順に各命令を実行とは逆順に走査し、走査するそれぞれの命令を、当該命令が前記ＫＩＬＬデータに含まれていないか、または、未走査の他の命令の存在を理由に前記ＫＩＬＬデータに含まれていることを条件に順次選択して、選択した当該命令の集合を示すＧＥＮデータを生成して記憶装置に格納する第１ＧＥＮデータ生成部と、
前記対象部分プログラム内の基本ブロック毎に、当該基本ブロックのＫＩＬＬデータおよびＧＥＮデータを記憶装置から読み出して、当該基本ブロックの先頭にコード移動することのできる命令の集合を示すＩＮデータから当該ＫＩＬＬデータを除外して当該ＧＥＮデータとの集合和を算出する演算を行うことにより、当該基本ブロックの末尾にコード移動することのできる命令の集合を示すＯＵＴデータをＣＰＵの動作により生成する第１ＯＵＴデータ生成部と、
前記対象部分プログラム内の基本ブロック毎に、当該基本ブロックの直前に実行される各基本ブロックのＯＵＴデータの集合積を算出する演算をＣＰＵの動作により行うことにより、当該基本ブロックの前記ＩＮデータを生成する第１ＩＮデータ生成部と、
前記対象部分プログラム内の基本ブロック毎に、当該基本ブロックのＩＮデータおよび当該基本ブロックの直前に実行される各基本ブロックのＯＵＴデータを記憶装置から読み出して、当該ＩＮデータから当該ＯＵＴデータの集合積を除外する演算をＣＰＵの動作により行うことにより、当該基本ブロック内に生成すべき命令の集合を示すＩＮＳＥＲＴデータを生成するＩＮＳＥＲＴデータ生成部と、
前記対象部分プログラムをＣＰＵの動作により変形して、前記対象部分プログラム内の基本ブロック毎に、当該基本ブロックのＩＮＳＥＲＴデータに含まれる命令を、当該基本ブロックにおいて当該命令とデータ依存関係を有する他の命令よりも先に実行される部分に挿入する第１コード変形部と
を有する請求項１に記載のコンパイラ装置。
【請求項３】
前記命令列変形部は、ＣＰＵの動作による前記対象部分プログラムの変形として、さらに、前記対象部分プログラム内のループ処理の先頭で実行される一部の命令を前記ループ処理の開始前に複写し、当該一部の命令を除く他の命令を前記ループ処理の先頭に移動し、当該一部の命令を前記ループ処理内の当該他の命令の後に移動することにより、前記対象部分プログラムに含まれる命令間の依存関係を前記置換対象パターンに一致させる
請求項１に記載のコンパイラ装置。
【請求項４】
前記命令列変形部は、
ＣＰＵの動作によって、前記対象部分プログラム内のループ処理の先頭から、前記置換対象パターン内のループ処理の先頭に対応する命令を検索するまで、前記ループ処理内の命令を順次走査する先頭部検索部と、
前記先頭部検索部により走査されたそれぞれの命令のうち、前記置換対象パターン内のループ処理の先頭に対応する命令を除いた命令のそれぞれを、前記対象部分プログラム内のループ処理の開始前に実行させる部分に、ＣＰＵの動作により複製する先頭部複製部と、
ＣＰＵの動作により、前記ループ処理の先頭の命令を、前記対象部分プログラムにおいて前記置換対象パターン内のループ処理の先頭に対応する命令に変更する開始命令変更部と
を有する請求項３に記載のコンパイラ装置。
【請求項５】
前記命令列変形部は、さらに、前記対象部分プログラム内のループ処理に、演算結果を変数に代入する第１命令を含み、かつ、当該変数の内容を参照する命令を前記ループ処理の後に実行される部分に含むことを条件に、前記対象部分プログラムに対し、前記第１命令を複製して当該ループ処理の終了条件が成立した場合に実行される部分に挿入する変形を行い、
前記命令列置換部は、前記対象部分プログラムおよび前記置換対象パターンの間で命令間の依存関係が、変形によりループ処理外では参照されなくなった変数へ値を代入する前記第１命令を除き一致したことを条件に、前記対象部分プログラムを、前記置換対象パターンに対応して定められた置換先命令列に置換する
請求項１に記載のコンパイラ装置。
【請求項６】
前記対象部分プログラム中の命令は、当該命令の処理の内容を示す右辺式、および、当該処理の結果を格納する変数を示す左辺式の組であり、
前記命令列変形部は、
前記対象部分プログラム内の基本ブロック毎に、当該基本ブロック内の各命令を走査して、前記対象部分プログラム内の複数の命令のうち当該基本ブロック内の何れかの命令によって右辺式に示す処理の結果又は左辺式に示す変数の値が変更され得る命令の集合を選択して、当該命令の集合を示すＫＩＬＬデータをＣＰＵの動作により生成して記憶装置に格納する第２ＫＩＬＬデータ生成部と、
前記対象部分プログラム内の基本ブロック毎に、ＣＰＵの動作によって、当該基本ブロックの末尾から順に各命令を実行とは逆順に走査し、走査するそれぞれの命令を、当該命令が前記ＫＩＬＬデータに含まれていないか、または、未走査の他の命令の存在を理由に前記ＫＩＬＬデータに含まれていることを条件に順次選択して、選択した当該命令の集合を示すＧＥＮデータを生成して記憶装置に格納する第２ＧＥＮデータ生成部と、
前記対象部分プログラム内の基本ブロック毎に、ＣＰＵの動作によって当該基本ブロックのＫＩＬＬデータおよびＧＥＮデータを記憶装置から読み出して、当該基本ブロックの先頭にコード移動することのできる命令の集合を示すＩＮデータから当該ＫＩＬＬデータを除外して当該ＧＥＮデータとの集合和を算出する演算を行うことにより、当該基本ブロックの末尾にコード移動することのできる命令の集合を示すＯＵＴデータをＣＰＵの動作によって生成して記憶装置に格納する第２ＯＵＴデータ生成部と、
前記対象部分プログラム内の基本ブロック毎に、ＣＰＵの動作によって当該基本ブロックの直前に実行される各基本ブロックのＯＵＴデータを記憶装置から読み出して、当該ＯＵＴデータの集合積を算出する演算を行うことにより、当該基本ブロックの前記ＩＮデータを生成する第２ＩＮデータ生成部と、
前記対象部分プログラムにおいて前記ループ処理の終了条件が成立した場合に実行される基本ブロックに、当該基本ブロックの前記ＩＮデータに含まれる命令をＣＰＵの動作により挿入する第２コード変形部と
を有する請求項５に記載のコンパイラ装置。
【請求項７】
前記置換対象パターンは、前記置換対象パターンに含まれる複数の命令の各々をノードとし、前記複数の命令間の実行の依存関係を有向エッジとした依存グラフであり、
前記対象部分プログラム検索部は、各々の当該部分プログラムについて、当該部分プログラムに含まれる複数の命令の各々をノードとし、当該複数の命令の実行の依存関係を有向エッジとした依存グラフを生成し、当該依存グラフ及び前記置換対象パターンを示す依存グラフに基づいて、当該部分プログラムを前記対象部分プログラムとして検索するか否かをＣＰＵの動作により判断する
請求項１記載のコンパイラ装置。
【請求項８】
前記置換対象パターンは、
ループ処理の先頭で実行され、第１変数の値として与えられるアドレスに第２変数の値として与えられるオフセット値を加えたアドレスのメモリからデータを読み出す読出命令、
前記読出命令の後に実行され、読み出したデータを定数値と比較して比較結果に基づき前記ループ処理外の命令実行に分岐する少なくとも１つの条件分岐命令、および
前記条件分岐命令における条件が不成立の場合に実行され、前記第２変数の値をインクリメントしてから前記ループ処理に先頭に処理を戻すインクリメント命令を含み、
前記置換先命令列は、第１変数の値として与えられるアドレスを先頭としてメモリを順次走査して、予め設定した何れかの定数値と一致するデータが格納されているアドレスを出力するＴＲＴ命令を含む命令列である
請求項１に記載のコンパイラ装置。
【請求項９】
最適化対象の対象プログラムの中から、予め定められた複数の命令を有する置換対象パターンを検索し、検索した前記置換対象パターンを、前記置換対象パターンに対応して定められた置換先命令列に置換して最適化する方法であって、
前記対象プログラムが有する複数の部分プログラムのうち、前記置換対象パターンに含まれる全ての命令に対応する命令を含む部分プログラムをＣＰＵの動作により検索して、最適化対象の対象部分プログラムとして記憶装置に格納し、
前記記憶装置に格納された前記対象部分プログラムに対し、条件分岐命令よりも先に実行される命令を当該条件分岐命令の分岐先のそれぞれに移動させる変形をＣＰＵの動作によって行って、前記対象部分プログラムに含まれる命令間の依存関係を前記置換対象パターンに一致させ、
変形された前記対象部分プログラムを、前記置換対象パターンに対応して定められた置換先命令列に、ＣＰＵの動作により置換して、最適化後の対象プログラムに含めて出力する、方法。
【請求項１０】
最適化対象の対象プログラムの中から、予め定められた複数の命令を有する置換対象パターンを検索し、検索した前記置換対象パターンを、前記置換対象パターンに対応して定められた置換先命令列に置換して最適化するコンパイラ装置として、コンピュータを機能させるコンパイラプログラムであって、
前記コンピュータを、
前記対象プログラムが有する複数の部分プログラムのうち、前記置換対象パターンに含まれる全ての命令に対応する命令を含む部分プログラムをＣＰＵの動作により検索して、最適化対象の対象部分プログラムとして記憶装置に格納する対象部分プログラム検索部と、
前記記憶装置に格納された前記対象部分プログラムに対し、条件分岐命令よりも先に実行される命令を当該条件分岐命令の分岐先のそれぞれに移動させる変形をＣＰＵの動作によって行って、前記対象部分プログラムに含まれる命令間の依存関係を前記置換対象パターンに一致させる命令列変形部と、
前記命令列変形部により変形された前記対象部分プログラムを、前記置換対象パターンに対応して定められた置換先命令列に、ＣＰＵの動作により置換して、最適化後の対象プログラムに含めて出力する命令列置換部と
して機能させるコンパイラプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、最適化コンパイラに関する。特に、本発明は、プログラム中の命令列をより高速な命令に置換するコンパイラの技術に関する。
【背景技術】
【０００２】
従来、最適化対象のプログラムの中から、予め定められたパターンに一致する命令列を検出し、その命令列を、そのパターンに対応して定められた他の命令列に置換する技術が提案されている。この技術によると、例えば、ある処理を実現する一連の命令群を、その処理と同一の処理結果を得る単一の命令に置換することにより、プログラムを最適化できる。置換先の命令の一例として、ＩＢＭコーポレーションのＳ／３９０アーキテクチャにおけるＴＲＴ命令が挙げられる。
【０００３】
ＴＲＴ命令は、所定の記憶領域を先頭から順次走査して、所定の条件を満たす値が格納されているアドレス等を出力する命令である（非特許文献３参照。）。図１５は、ＴＲＴ命令による処理に対応する制御フローグラフである。ＴＲＴ命令による処理は、記憶領域bytearrayの先頭から順に記憶領域に格納された値を変数chに順次読み出し、その値が条件cond1からcondNの何れかを満たす場合に終了する一連の処理に対応する。コンパイラは、このような一連の処理を、単一のＴＲＴ命令に置換することにより、プログラムを最適化できる。
【０００４】
以下に参考文献を挙げる。非特許文献１および非特許文献２については実施例において参照する。
【特許文献１】特開２００５−３３９０２１号公報
【非特許文献１】Jianghai Fu. Directed graph pattern matching and topological e mbedding.Journal of Algorithms, 22(2):372-391, February 1997.
【非特許文献２】S.S. Muchnick. Advanced compiler design and implementation, Morgan Kaufmann Publishers, Inc., 1997.
【非特許文献３】http://publibz.boulder.ibm.com/epubs/pdf/dz9zr002.pdf のページ7-180
【非特許文献４】Ａ．Ｖ．エイホ、Ｒ．セシィ、Ｊ．Ｄ．ウルマン著、原田賢一訳、株式会社サイエンス社  発行、「コンパイラＩＩ−原理・技法・ツール−」、１９９３年初版第３刷
【発明の開示】
【発明が解決しようとする課題】
【０００５】
しかしながら、最適化対象のプログラムが、予め定められたパターンと完全に一致することは稀である。このような場合、従来は最適化を諦めていた。この結果、ＴＲＴ命令等のアーキテクチャが独自に有している命令を有効に利用できない場合があった。これに対し、本願発明者は、上記特許文献１に記載したように、命令を置換する機会を拡大する技術を提案している。しかしながら、ＴＲＴ命令等を有効利用するためには、さらに多くの種類のプログラムに対してこのような最適化を行えることが望ましい。
【０００６】
そこで本発明は、上記の課題を解決することのできるコンパイラ装置、コンパイラプログラムおよび方法を提供することを目的とする。この目的は特許請求の範囲における独立項に記載の特徴の組み合わせにより達成される。また従属項は本発明の更なる有利な具体例を規定する。
【課題を解決するための手段】
【０００７】
上記課題を解決するために、本発明の一側面においては、最適化対象の対象プログラムの中から、予め定められた複数の命令を有する置換対象パターンを検出し、検出した置換対象パターンを、置換対象パターンに対応して定められた置換先命令列に置換して最適化するコンパイラ装置であって、対象プログラムが有する複数の部分プログラムのうち、置換対象パターンに含まれる全ての命令に対応する命令を含む部分プログラムをＣＰＵの動作により検索して、最適化対象の対象部分プログラムとして記憶装置に格納する対象部分プログラム検出部と、記憶装置に格納された対象部分プログラムに対し、条件分岐命令よりも先に実行される命令を当該条件分岐命令の分岐先のそれぞれに移動させる変形をＣＰＵの動作によって行って、対象部分プログラムに含まれる命令間の依存関係を置換対象パターンに一致させる命令列変形部と、命令列変形部により変形された対象部分プログラムを、置換対象パターンに対応して定められた置換先命令列に、ＣＰＵの動作により置換して、最適化後の対象プログラムに含めて出力する命令列置換部とを備えるコンパイラ装置。
なお、上記の発明の概要は、本発明の必要な特徴の全てを列挙したものではなく、これらの特徴群のサブコンビネーションもまた、発明となりうる。
【発明を実施するための最良の形態】
【０００８】
以下、発明の実施の形態を通じて本発明を説明するが、以下の実施形態は特許請求の範囲にかかる発明を限定するものではなく、また実施形態の中で説明されている特徴の組み合わせの全てが発明の解決手段に必須であるとは限らない。
【０００９】
図１は、コンパイラ装置１０の全体構成を示す。コンパイラ装置１０は、最適化候補検索部１００と、対象部分プログラム検索部１１０と、命令列変形部１２０と、命令列置換部１３０とを有する。コンパイラ装置１０は、予め定められた複数の命令を有する置換対象パターンに対応する命令列を検索し、検索したその命令列を、置換対象パターンに対応して定められた置換先命令列に置換する。置換先命令列は、置換対象パターンと比較して高速に実行される命令列であり、一例として、アーキテクチャ独自の高速な命令を含む。即ちこれにより、最適化対象の対象プログラムを、より効率的に実行される命令列に最適化することを目的とする。
【００１０】
コンパイラ装置１０は、後述のＣＰＵ１５００および後述のＲＡＭ１５２０（以下、単にメモリと称す）の動作により実現される、最適化候補検索部１００と、対象部分プログラム検索部１１０と、命令列変形部１２０と、命令列置換部１３０を備える。最適化候補検索部１００は、最適化の対象となる部分プログラムの候補をＣＰＵ１５００の動作により検索する。例えば、最適化候補検索部１００は、部分プログラムとして、メソッド、関数、又は手続きと呼ばれるプログラムの処理単位ごとの命令列を検索してもよいし、ループ処理等のように制御フローの性質に基づいて定まる命令列を検索してもよい。
【００１１】
そして、対象部分プログラム検索部１１０は、最適化候補検索部１００により検索された複数の部分プログラムのうち、置換対象パターン２０に類似する部分プログラムを対象部分プログラム４０として検索する。例えば、対象部分プログラム検索部１１０は、置換対象パターン２０に含まれる全ての命令に対応する命令を含む部分プログラムをＣＰＵ１５００の動作により検索して、最適化対象の対象部分プログラム４０としてメモリに格納する。より具体的には、対象部分プログラム検索部１１０は、置換対象パターン２０に含まれるある命令と部分プログラムに含まれるある命令について、処理内容が互いに同一であり、その命令から出力する制御フローの数が互いに同一であり、かつ、制御フローの移行先の命令が互いに同一である場合に、それらの命令が互いに対応すると判断する。置換対象パターン２０に類似する部分プログラムを検索する処理については、後に図１２を参照してさらに詳しく説明する。
【００１２】
命令列変形部１２０は、メモリに格納された対象部分プログラム４０のうち、置換対象パターン２０に含まれる命令に対応する命令以外の命令、及び、置換対象パターン２０と異なる実行の依存関係を有する命令に対して、対象部分プログラム４０に含まれる命令間の依存関係を置換対象パターン２０に一致させる変形を行う。命令列変形部１２０は、必要に応じてその他の命令に対して変形を行ってもよい。変形された対象部分プログラムを対象部分プログラム５０とする。
【００１３】
命令列置換部１３０は、命令列変形部１２０により変形された対象部分プログラム５０と置換対象パターン２０との間で命令間の依存関係が一致したことを条件に、その対象部分プログラム５０を、置換対象パターン２０に対応して定められた置換先命令列に、ＣＰＵ１５００の動作により置換する。例えば、命令列変形部１３０は、置換先命令列の構造を示す置換先命令テンプレート３０における各変数を、その変数に対応する対象部分プログラム５０における変数に置き換えることにより、置換先命令列を生成してもよい。置換先命令列を含む対象プログラムは最適化後の対象プログラムに含めて出力される。
【００１４】
図２は、命令列変形部１２０の機能構成を示す。命令列変形部１２０は、ループ変形部２００と、第１変形部２１０と、第２変形部２２０と、判定部２３０とを有する。ループ変形部２００は、メモリに格納された対象部分プログラム４０を読み出して、その対象部分プログラム４０に対し、ループ処理を複数命令の周期的実行とみなした場合の命令実行の位相を変更する処理を行う。具体的には、ループ変形部２００は、対象部分プログラム４０内のループ処理の先頭で実行される一部の命令をそのループ処理の開始前に実行される部分に複写する。そして、ループ変形部２００は、当該一部の命令を除く他の命令をそのループ処理の先頭に移動し、当該一部の命令を当該ループ処理内の当該他の命令の後に移動する。これにより、ループ変形部２００は、対象部分プログラム４０に含まれる命令間の依存関係を置換対象パターンに一致させる。ループ処理の先頭からどの命令までを複写の対象とするかについては、置換対象パターン内のループ処理の先頭がどの命令であるかによって定められる。変形後の命令はメモリに格納される。
【００１５】
次に、第１変形部２１０は、条件分岐命令よりも先に実行される命令をその条件分岐命令の分岐先のそれぞれに移動させる変形を、ＣＰＵ１５００の動作によって行って、対象部分プログラム４０に含まれる命令間の依存関係を置換対象パターン２０に一致させる。この変形は、データ依存関係を保持する範囲内において命令の移動可能範囲を探索するデータフロー方程式を、置換対象パターン２０における命令間の依存関係に基づいて変更することにより実現される。
【００１６】
続いて、置換対象パターン２０が、ループ処理内に、演算結果を変数に代入する第１命令を含み、かつ、当該変数の内容を参照する命令をそのループ処理の後に実行される部分に含むことを条件に、第２変形部２２０による変形を試みる。第２変形部２２０は、変形後の対象部分プログラム４０をメモリから読み出す。そして、第２変形部２２０は、ＣＰＵ１５００の動作により、その第１命令を複製してそのループ処理の終了条件が成立した場合に実行される部分に挿入する変形を行う。
【００１７】
判定部２３０は、以上の処理により対象部分プログラム４０に含まれる命令間の依存関係が置換対象パターン２０に一致したかを判定する。判定に際し、対象部分プログラム４０および置換対象パターン２０の間で命令間の依存関係が、変形によりループ処理外では参照されなくなった変数へ値を代入する第１命令を除き一致したか否かが判断される。一致していない場合には、判定部２３０は、変形後の対象部分プログラム４０をさらにループ変形部２００、第１変形部２１０および第２変形部２２０によって変形させるべく、ループ変形部２００に通知をする。なお、一致していない場合であっても、ループ変形部２００、第１変形部２１０および第２変形部２２０による変形の結果が、前回にループ変形部２００、第１変形部２１０および第２変形部２２０によって変形された結果と同一である場合には、判定部２３０は、変形が失敗したものとして処理を終了する。一致した場合には、判定部２３０は、変形後の対象部分プログラムを命令列置換部１３０に対し出力する。
【００１８】
なお、本図に示す各変形処理の適用順序や回数は一例である。即ち、命令列変形部１２０は、対象部分プログラム４０に対しループ変形部２００、第１変形部２１０および第２変形部２２０による変形を行う順序を変更してもよい。また、図２において、判定部２３０による判定ごとに行う変形の回数は１回ずつであるが、この回数は２回以上であってもよい。さらに、命令列変形部１２０は、対象部分プログラムを直接変更しない方が好ましい。すなわち、図２に示す諸機能による変形は、最終的に変形が失敗したと判定された場合には、対象プログラム全体としての処理速度を低下させるおそれがある。このため、命令列変形部１２０は、対象部分プログラム４０を複写して複写プログラムを生成した上で、複写プログラムに対して上記の処理を行う。なお、複写プログラムは、解析を容易にするため、命令をノードとし実行の依存関係を有向エッジとした依存グラフに変換されてその後の処理に供することが望ましい。そして、命令列変形部１２０は、変形が成功した場合には、複写プログラムにより対象部分プログラム４０を上書きする。変形が失敗した場合には、命令列変形部１２０は、対象部分プログラム４０を変更せずに維持する。これにより、変形の成否によって結果コードを選択的に用いることができる。
【００１９】
図３ａは、置換対象パターン２０のグラフ表現を示し、図３ｂは、置換対象パターン２０のグラフ表現を簡略化して示し、図３ｃは、置換対象パターン２０の処理内容を示す擬似コードを示す。図３ａ中の実線の有向エッジは制御フローを示し、点線の有向エッジはデータ依存関係を示す。また、図３ａにおける命令ｂａｌｏａｄは、図３ｂにおけるシンボルａに対応し、図３ａにおける命令ｂｏｏｌｔａｂｌｅは、図３ｂにおけるシンボルｂに対応し、図３ａにおける命令ｉａｄｄおよびｉｓｔｏｒｅは、図３ｂにおけるシンボルｃに対応する。また、第１変数である変数ｖ０は、走査の起点となるアドレスを示し、第２変数である変数ｖ１は、走査位置のオフセット値を示す。
【００２０】
この置換対象パターン２０は、ループ処理の先頭に読出命令（ｂａｌｏａｄ）を含む。この読出命令は、変数ｖ０の値として与えられるアドレスに変数ｖ１の値として与えられるオフセット値を加えたアドレスのメモリからデータを読み出す。また、置換対象パターン２０は、読出命令の後に実行され、読み出したデータを定数値と比較して比較結果に基づきループ処理外の命令実行に分岐する条件分岐命令（ｂｏｏｌｔａｂｌｅ）を含む。この条件分岐命令（ｂｏｏｌｔａｂｌｅ）は、対象部分プログラム４０との比較においてワイルドカードとしての役割を果たし、対象部分プログラム４０における１または複数の条件分岐命令に対応し得る。以上の読出命令および条件分岐命令が図３ｃにおける第２行目に対応する。
【００２１】
また、置換対象パターン２０は、条件分岐命令における条件が不成立の場合に実行され、変数ｖ１の値をインクリメントしてから（ｉａｄｄ）変数ｖ１に対応するメモリ上の領域に格納し（ｉｓｔｏｒｅ）、ループ処理の先頭に処理を戻す命令を含む。これらの命令は、図３ｃにおける１、３および４行目に対応する。
このように、命令間の依存関係が図３に示すものと一致する場合には、ＴＲＴ命令を含む高速実行可能な命令列に置換可能となる。しかしながら、対象部分プログラム４０を何ら変形しないままでは、命令間の依存関係が図３に示すものと一致しない場合がある。
【００２２】
図４は、置換先命令テンプレート３０の一例を示す。なお、本図は、置換先命令テンプレート３０に含まれる命令による処理内容を示すプログラムソースコードを示している。実際には、置換先命令テンプレート３０は、所定の中間コード又は機械語により記述されていてもよい。置換先命令テンプレート３０において、変数bytearrayは、TRT命令が比較の対象とする値を格納する記憶領域のアドレスを示す。また、変数iは、その記憶領域を走査するためのインデックスを示す。図４を参照して、置換対象パターン２０と依存関係が一致する対象部分プログラム４０を置換先命令列に置換する処理の一例を説明する。
【００２３】
命令列置換部１３０は、対象部分プログラム４０内の、置換対象パターン２０における条件分岐命令（ｂｏｏｌｔａｂｌｅ）に一致した少なくとも１つの条件分岐命令に基づき、ＴＲＴ命令用のテーブル（ｔａｂｌｅ）の記憶領域を確保する命令を１行目に生成する。このテーブルは、条件判断において比較対象となる定数値をインデックスとして、そのインデックスによって指定された領域に論理値１を格納し、その他の領域に論理値０を格納する。また、命令列置換部１３０は、置換先命令テンプレート３０における変数ｂｙｔｅａｒｒａｙを、対象部分プログラム４０内の、置換対象パターン２０における変数ｖ０に対応する変数に置換する。また、命令列置換部１３０は、置換先命令テンプレート３０における変数ｉを、対象部分プログラム４０内の、置換対象パターン２０における変数ｖ１に対応する変数に置換する。また、命令列置換部１３０は、対象部分プログラム４０内の、メモリ内のデータが定数値に一致した場合に実行される命令列によって、置換先命令テンプレート３０内の、第１２行目から第１９行目を置換する。
【００２４】
以上の置換処理によって、対象部分プログラム４０は、変数ｖ０の値として与えられるアドレスを先頭としてメモリを順次走査して、予め設定した何れかの定数値と一致するデータが格納されているアドレスを出力するＴＲＴ命令を含む命令列に置換される。この命令例の処理によれば、変数ｖ０によって指定されるメモリ上の領域は２５６バイト毎に一括して定数値と比較され、何れの定数値とも一致しない場合には２５６ずつ添え字がインクリメントされる。何れかの定数値と一致した場合にはループ処理外の命令列に実行が移される。また、２５６バイト未満の端数サイズの領域は、第２２行目において最適化前の命令列によって比較される。
【００２５】
図５ａは、対象部分プログラム４０の一例を示し、図５ｂは、対象部分プログラム４０のグラフ表現を示す。対象部分プログラム４０は、例えば、Ｊａｖａ言語で記述された命令列の断片である（Ｊａｖａは登録商標である）。図５ａの２〜６行目に示すループ処理内で、まず変数ｉがインクリメントされる。この処理は図５ｂに示すように定数１および変数ｉに依存する。その次に、図５ａの４行目に示すように、変数ａによって示されるアドレスに変数ｉによって示されるオフセット値を加えたアドレスから変数ｃｈにデータが読み出される。図５ｂに示すように、この処理は変数ａおよび変数ｃｈに依存する。そして、そのデータは定数値０ｘ２０および'＜'と比較される。なお、記号''は、文字コードを算出する演算子を示すから、'＜'は、文字＜の文字コードを示す定数値０ｘ３ｃを示す。これらの比較処理は変数ｃｈおよび対応する定数値に依存する。何れかの条件が成立するとループ処理は終了する。なお、この変数ｃｈはループ処理終了後にも参照される。
【００２６】
図５ｃは、対象部分プログラム４０のグラフ表現を簡略化して示す。シンボルｃおよびａについては図３ｂに示したから説明を省略する。シンボルｂ１およびｂ２は、これら２つで、図３ｂに示したシンボルｂに対応する。一方、シンボルＳは、変数ｃｈの値をメモリに記憶する命令に対応する。この命令は置換対象パターン２０には含まれていない。また、対象部分プログラム４０においてシンボルの配列順序はｃ、ａ、ｂであるのに対し、置換対象パターン２０においてはａ、ｂ、ｃである。このため、このままでは対象部分プログラム４０を置換先命令列に置換することはできない。この対象部分プログラム４０を置換可能とするべく、まずループ変形部２００が命令列の変形を試みる。
【００２７】
図６は、ループ変形部２００の機能構成を示す。ループ変形部２００は、先頭部検索部６００と、先頭部複製部６１０と、開始命令変更部６２０とを有する。先頭部検索部６００は、ＣＰＵ１５００の動作によって、対象部分プログラム４０内の各命令を走査して、ループ処理の先頭部分を検索する。先頭部分が検索されると、先頭部検索部６００は、順次走査を続け、検索されたその先頭部分から、置換対象パターン２０内のループ処理の先頭に対応する命令を検索する。図５ｃの例では、先頭部検索部６００は、シンボルｃの命令からシンボルａの命令までをループ処理の先頭部分として検出する。この走査処理は、対象部分プログラム４０中の命令列を順次制御フローに沿って読み出すことによって実現される。対象部分プログラム４０および走査の結果は先頭部複製部６１０に対し出力される。
【００２８】
次に、先頭部複製部６１０は、先頭部検索部６００により走査されたそれぞれの命令のうち、置換対象パターン２０内のループ処理の先頭に対応する命令を除いた命令のそれぞれ（図５ｃの例ではシンボルｃのみ）を、対象部分プログラム４０内のループ処理の開始前に実行させる部分に、ＣＰＵ１５００の動作により複製する。そして、開始命令変更部６２０は、ＣＰＵ１５００の動作により、このループ処理の先頭の命令を、対象部分プログラム４０において置換対象パターン２０内のループ処理の先頭に対応する命令に変更する。図５ｃの例では、開始命令変更部６２０は、ループ処理の先頭がシンボルａとなるよう、制御フローを変更する。命令の生成や制御フローの変更は、あらたに命令を格納するための記憶領域をメモリに確保したうえで、条件分岐命令や無条件分岐命令の分岐先アドレスをその記憶領域に変更することによって実現される。
【００２９】
図７ａは、ループ変形部２００によって対象部分プログラム４０が変形される処理の概要を示す。先頭部検索部６００が、ループ処理の先頭部分としてシンボルｃおよびａに対応する命令列を検出したので、先頭部複製部６１０はそのうちシンボルａを除くシンボルｃをループ処理の開始前に実行させる部分に複製する。そして、開始命令変更部６２０は、ループ処理の先頭をシンボルａに対応する命令に変更する。
【００３０】
図７ｂは、ループ変形部２００によって変形された対象部分プログラム４０の擬似コードを示す。２行目に示すように、ループ処理の先頭部分からループ処理の開始前の部分に命令ｉ＋＋が複製されている。また、４から６行目に示すように、ループ処理内の命令実行順序は、読出命令、条件分岐命令、および、インクリメント命令の順となったことがわかる。
【００３１】
以上の変形により、ループ処理内の命令の実行順序（あるいは制御依存関係）は、置換対象パターン２０内の命令の実行順序と一致した。しかしながら、対象部分プログラム４０は、置換対象パターン２０内には存在しない命令（シンボルＳ）を含んでおり、依然として置換先命令列に置換することはできない。続いて、変形後の対象部分プログラム４０に対しさらに第２変形部２２０により行われる変形の概要を説明する。なお、図７に示す変形後の対象部分プログラム４０に対しては、第１変形部２１０によっては何らの変形を行うことはできないから、ここでは第１変形部２１０による処理の説明は省略して第２変形部２２０の処理を説明する。
【００３２】
図８ａは、第２変形部２２０によって対象部分プログラム４０が変形される処理の概要を示す。ループ変形部２００による変形後の対象部分プログラム４０は、演算結果を変数に代入する第１命令を含んでいる。この第１命令は、シンボルａによって示すメモリからの読出命令、および、シンボルＳによって示すメモリへの格納命令の組合せによって表される。そして、このシンボルＳによって示される格納命令が、対象部分プログラム４０が置換対象パターン２０内の命令群との不一致である原因となっている。また、ループ処理外でこの変数への参照が存在するから、この格納命令は、既存の最適化処理によっても削除することができない。
【００３３】
この場合、第２変形部２２０は、この第１命令を複製してループ処理の終了条件が成立した場合に実行される部分に挿入する変形を行う。即ち、図８ａ右に示す対象部分プログラム５０において、シンボルｂ１およびｂ２によって表される第２命令において終了条件が成立した場合に実行される部分に、第１命令の複製を示すシンボルａおよびシンボルＳが挿入される。この結果、シンボルＳが示す格納命令によってメモリに格納された変数値は、ループ処理内においてのみ参照されることとなり、この格納命令は置換対象パターン２０におけるループ内代入命令に一致する。
【００３４】
図８ｂは、ループ変形部２００によって対象部分プログラム４０が変形された結果である対象部分プログラム５０の擬似コードを示す。図７ｂと比較して、８行目に、メモリから読み出した値を変数ｃｈに代入する命令が追加された。また、４行目の代入命令は図７ｂの代入命令と同一であるが、代入の結果はループ処理外で参照されないこととなった。この結果、第２変形部２２０は、対象部分プログラム４０に含まれる命令間の依存関係を置換対象パターン２０に一致させることができた。
【００３５】
図９は、第２変形部２２０の機能構成を示す。図９を参照して、図８ａおよびｂに示した変形をより一般化してより広範な種類のプログラムに適用可能とする処理機能を説明する。第２変形部２２０は、第２ＫＩＬＬデータ生成部９００と、第２ＧＥＮデータ生成部９１０と、第２ＯＵＴデータ生成部９２０と、第２ＩＮデータ生成部９３０と、第２コード変形部９４０とを有し、前進データフローにおけるデータフロー方程式の反復解法によりコード移動の最適化を行うことを目的とする。なお、ここではデータフロー方程式の定義について主に説明し、その解法の詳細については説明しない。データフロー方程式を解く情報処理の実現手段については、例えば、当該技術分野で著名な基本書である非特許文献４の８４４ページを参照されたい。
【００３６】
以下、データフロー方程式のＫＩＬＬデータ、ＧＥＮデータ、ＯＵＴデータ、ＩＮデータの生成について述べる。各データは、対象部分プログラム４０中の命令を要素とした集合を示す。各命令は、当該命令の処理の内容を示す右辺式、および、当該処理の結果を格納する変数を示す左辺式の組として表される。まず、第２ＫＩＬＬデータ生成部９００は、ＣＰＵ１５００の動作によって、対象部分プログラム４０内の基本ブロック毎に、当該基本ブロック内の各命令を走査する。そして、第２ＫＩＬＬデータ生成部９００は、基本ブロック毎に、対象部分プログラム４０内の複数の命令のうち当該基本ブロック内の何れかの命令によって右辺式に示す処理の結果又は左辺式に示す変数の値が変更され得る命令の集合を選択して、選択した当該命令の集合を示すＫＩＬＬデータをメモリに格納する。
【００３７】
例えば、対象部分プログラム４０内にある変数ｘに基づく演算命令ａがあり、ある基本ブロックにその変数ｘへの代入命令があれば、その基本ブロックのＫＩＬＬデータには、その演算命令ａが加えられる。また、対象部分プログラム４０内にメモリからの読出命令ｂがあり、ある基本ブロックに正体不明の関数を呼び出す命令があれば、その基本ブロックのＫＩＬＬデータには、その読出命令ｂが加えられる。正体不明の関数によってメモリの内容が書き換えられた結果、読出命令ｂの右辺式の結果（即ち読み出されるデータの内容）が変更され得るからである。
【００３８】
次に、第２ＧＥＮデータ生成部９１０は、対象部分プログラム４０内の基本ブロック毎に、ＣＰＵ１５００の動作によって、当該メモリブロックの末尾から順に各命令を実行とは逆順に走査する。そして、第２ＧＥＮデータ生成部９１０は、走査するそれぞれの命令がＫＩＬＬデータに含まれていないか、または、未走査の他の命令の存在を理由にＫＩＬＬデータに含まれていることを条件に順次選択する。例えば、ある基本ブロックに命令ａがあり、その基本ブロックには命令ａの右辺式の結果や左辺式の変数値を変更する他の命令が存在しなければ、その命令ａはその基本ブロックのＧＥＮデータに加えられる。一方、命令ａの右辺式の結果や左辺式の変数値を変更する他の命令があっても、当該他の命令が命令ａより後に走査される場合、即ち、当該他の命令が先に実行される場合には、命令ａはその基本ブロックのＧＥＮデータに加えられる。
【００３９】
第２ＯＵＴデータ生成部９２０は、対象部分プログラム４０の基本ブロック毎に、ＣＰＵ１５００の動作によって当該基本ブロックのＫＩＬＬデータおよびＧＥＮデータをメモリから読み出す。そして、基本ブロック毎に、当該基本ブロックの先頭にコード移動することのできる命令の集合を示すＩＮデータから当該ＫＩＬＬデータを除外して当該ＧＥＮデータとの集合和を算出する演算を行う。そして、第２ＯＵＴデータ生成部９２０は、その集合演算の結果を、当該基本ブロックの末尾にコード移動することのできる命令の集合を示すＯＵＴデータとして生成してメモリに格納する。この処理は以下の式（１）に示すデータフロー方程式として表される。
【数１】
2008097249.tif 000003
【００４０】
なお、対象部分プログラム４０において最も先に実行される基本ブロックのＩＮデータは、空集合であってもよいし、対象部分プログラム４０外のプログラムを予め解析した結果として得られる命令の集合であってもよい。
【００４１】
第２ＩＮデータ生成部９３０は、対象部分プログラム４０の基本ブロック毎に、ＣＰＵ１５００の動作によって当該基本ブロックの直前に実行される各基本ブロックのＯＵＴデータをメモリから読み出す。そして、第２ＩＮデータ生成部９３０は、当該ＯＵＴデータの集合積を算出する演算を行うことにより、当該基本ブロックのＩＮデータを生成する。この処理は以下の式（２）に示すデータフロー方程式として表される。
【数２】
2008097249.tif 000004
【００４２】
なお、第２ＯＵＴデータ生成部９２０の処理結果および第２ＩＮデータ生成部９３０の処理結果は相互に影響する。このため、第２ＩＮデータ生成部９３０により生成されたＩＮデータに基づき第２ＯＵＴデータ生成部９２０が再度ＯＵＴデータを生成すると、前回生成したＯＵＴデータとは異なる結果が得られる場合がある。したがって、第２ＯＵＴデータ生成部９２０および第２ＩＮデータ生成部９３０は、生成されるＩＮデータおよびＯＵＴデータが前回のＩＮデータおよびＯＵＴデータと同一となり収束するまで、互いの生成結果に基づく処理を繰り返す。データフロー方程式の反復解法および収束判定の方法については従来公知であるから説明を省略する。
【００４３】
続いて、第２コード変形部９４０は、対象部分プログラム４０においてループ処理の終了条件が成立した場合に実行される基本ブロックに対応するＩＮデータを、ＣＰＵ１５００の動作によりメモリから読み出す。ループ処理の出口が複数存在する場合には、終了条件が成立した場合に実行される基本ブロックも複数となる場合がある。その場合には、そのそれぞれの基本ブロックについてのＩＮデータが読み出される。そして、第２コード変形部９４０は、そのＩＮデータに含まれる各命令を、その基本ブロックに挿入する。挿入の処理は、メモリに格納された対象部分プログラム４０をＣＰＵ１５００により書き換えることによって実現される。
【００４４】
以上、図１から図９によれば、ループ処理の位相を変更し、かつ、ループ処理外で参照される変数をループ処理内のみで参照されるように変更することで、対象部分プログラム４０内の命令間の依存関係を置換対象パターン２０に一致させることができた。次に、他のプログラム例を対象部分プログラム４０として参照して、第１変形部２１０による最適化について説明する。なお、ループ変形部２００および第２変形部２２０による処理はこの対象部分プログラム４０には影響しないから説明を省略する。
【００４５】
図１０ａは、第１変形部２１０によって対象部分プログラム４０が変形される処理の概要を示し、図１０ｂは、第１変形部２１０によって変形される対象部分プログラム４０の擬似コードを示す。図１０ｂ左の２行目に示すように、この対象部分プログラム４０は、変数ａの値として与えられるアドレスに変数ｉの値として与えられるオフセット値を加えたアドレスのメモリからデータを読み出した後に、変数ｉをインクリメントし、読み出したデータを定数値と比較する処理を示している。そして、図１０ａ左に示すように、図３ｂと比較するとシンボルｃおよびｂの順序が逆である。このため、このままでは置換先命令列に置換することはできない。
【００４６】
この対象部分プログラム４０に対し、第１変形部２１０は、条件分岐命令よりも先に実行される命令を、その命令と他の命令との間のデータ依存関係に反しない範囲内において、その条件分岐命令の分岐先のそれぞれに移動させる変形を行う。具体的には、第１変形部２１０は、シンボルｃとして表される命令を、シンボルｂとして表される条件分岐命令の分岐先のそれぞれに移動する。移動した結果を対象部分プログラム５０とする。図１０ａ右に示すようにシンボルｃはシンボルｂの分岐先に移動した結果、ループ処理内でシンボルｂとシンボルｃとは入れ替わり、シンボルｃがループ処理外にも複製されている。同様に、図１０ｂ右に示すように、変数ｉのインクリメント命令はループ処理外の第５行目に複製されている。
【００４７】
図１１は、第１変形部２１０の機能構成を示す。図１１を参照して、図１０に示した処理を一般化して多様なプログラムに対し適用可能とする処理について説明する。図９に示す処理機能と同様に、図１１に示す処理機能も、前進データフローにおけるデータフロー方程式の反復解法によりコード移動の最適化を行う。ここではデータフロー方程式の定義について主に説明するので、反復解法については図９および非特許文献４を参照されたい。
【００４８】
第１変形部２１０は、第１ＫＩＬＬデータ生成部１１００と、対応データ生成部１１１０と、第１ＫＩＬＬデータ追加部１１２０と、第１ＧＥＮデータ生成部１１３０と、第１ＯＵＴデータ生成部１１４０と、第１ＩＮデータ生成部１１５０と、ＩＮＳＥＲＴデータ生成部１１６０と、第１コード変形部１１７０とを有する。第１ＫＩＬＬデータ生成部１１００は、メモリから対象部分プログラム４０を読み出し、対象部分プログラム４０の基本ブロック毎に、ＣＰＵ１５００の動作により、当該基本ブロックの各命令を走査する。そして、第１ＫＩＬＬデータ生成部１１００は、基本ブロック毎に、対象部分プログラム４０内の複数の命令のうち、当該基本ブロック内の何れかの命令との間でデータ依存関係を有する命令の集合を選択して、当該命令の集合を示すＫＩＬＬデータを生成しメモリに格納する。データ依存関係は、例えば、真の依存（true dependence）、逆依存（anti dependence）、および出力依存（output dependence）を含む。
【００４９】
そして、対応データ生成部１１１０は、置換対象パターン２０をメモリから読み出し、置換対象パターン２０における各命令の実行順序に基づいて、置換対象パターン２０内の各命令を先行命令とし、当該先行命令を、置換対象パターン２０において当該先行命令の次に実行される後続命令に対応付けた対応データをＣＰＵ１５００の動作により生成し、メモリに格納する。例えば、置換対象パターン２０において、シンボルａが示す命令を先行命令とするとその後続命令はシンボルｂにより表される。したがってシンボルａおよびシンボルｂが対応付けられる。同様にシンボルｂおよびシンボルｃが対応付けられ、シンボルｃおよびシンボルａが対応付けられる。生成された対応データは第１ＫＩＬＬデータ追加部１１２０に対し出力される。
【００５０】
第１ＫＩＬＬデータ追加部１１２０は、対象部分プログラム４０内の基本ブロック毎に、ＣＰＵ１５００の動作により、当該基本ブロック内の各命令を走査する。そして、第１ＫＩＬＬデータ追加部１１２０は、基本ブロック毎に、対応データの中の後続命令を検索したことを条件に、対応データにおいてその後続命令に対応する先行命令を、当該基本ブロックに対応するＫＩＬＬデータに追加する。ＫＩＬＬデータに対する命令の追加処理は、メモリに格納されたＫＩＬＬデータを書き換えることによって実現される。
【００５１】
第１ＧＥＮデータ生成部１１３０は、対象部分プログラム４０内の基本ブロック毎に、ＣＰＵ１５００の動作により、その基本ブロックの末尾から順に各命令を実行とは逆順に走査する。そして、第１ＧＥＮデータ生成部１１３０は、走査するそれぞれの命令を、当該命令がＫＩＬＬデータに含まれていないか、または、当該命令が未走査の他の命令の存在を理由にＫＩＬＬデータに含まれていることを条件に順次選択して、選択した当該命令の集合を示すＧＥＮデータを生成してメモリに格納する。
【００５２】
例えば、ある基本ブロックの命令ａが、その基本ブロック内の他の何れの命令との間にデータ依存関係を有しておらず、かつ、対応データにおいてその命令ａを先行命令とする後続命令が、その基本ブロックに含まれない場合には、その命令ａはその基本ブロックのＧＥＮデータに加えられる。一方で、命令ａの後続命令、または、命令ａとの間でデータ依存関係を有する他の命令がその基本ブロックに含まれる場合であっても、当該後続命令または当該他の命令が未走査の場合（即ち、命令ａより先に実行される場合）には、その命令ａはその基本ブロックのＧＥＮデータに加えられる。
【００５３】
第１ＯＵＴデータ生成部１１４０は、対象部分プログラム４０の基本ブロック毎に、当該基本ブロックのＫＩＬＬデータおよびＧＥＮデータをメモリから読み出す。そして、第１ＯＵＴデータ生成部１１４０は、基本ブロック毎に、その基本ブロックの先頭にコード移動することのできる命令の集合を示すＩＮデータから当該ＫＩＬＬデータを除外して当該ＧＥＮデータとの集合和を算出する演算を行うことにより、当該基本ブロックの末尾にコード移動することのできる命令の集合を示すＯＵＴデータをＣＰＵ１５００の動作により生成する。この処理は、以下の式（３）に示すデータフロー方程式として表される。
【数３】
2008097249.tif 000005
【００５４】
第１ＩＮデータ生成部１１５０は、対象部分プログラム４０内の基本ブロック毎に、当該基本ブロックの直前に実行される各基本ブロックのＯＵＴデータをメモリから読み出す。そして、第１ＩＮデータ生成部１１５０は、各基本ブロックの集合積を算出する演算をＣＰＵ１５００の動作により行うことにより、当該基本ブロックのＩＮデータを生成する。この処理は、以下の式（４）に示すデータフロー方程式として表される。
【数４】
2008097249.tif 000006
【００５５】
第１ＯＵＴデータ生成部１１４０および第１ＩＮデータ生成部１１５０は、演算結果が相互に影響するものであるから、第１ＯＵＴデータ生成部１１４０および第１ＩＮデータ生成部１１５０は演算結果が収束するまで相互に処理を繰り返す。
【００５６】
ＩＮＳＥＲＴデータ生成部１１６０は、対象部分プログラム４０の基本ブロック毎に、当該基本ブロックのＩＮデータおよび当該基本ブロックの直前に実行される各基本ブロックのＯＵＴデータをメモリから読み出す。そして、ＩＮＳＥＲＴデータ生成部１１６０は、当該ＩＮデータから当該ＯＵＴデータの集合積を除外する演算をＣＰＵ１５００の動作により行うことにより、当該基本ブロック内に生成すべき命令の集合を示すＩＮＳＥＲＴデータを生成する。この処理は、以下の式（５）により表される。
【数５】
2008097249.tif 000007
【００５７】
そして、第１コード変形部１１７０は、対象部分プログラム４０をＣＰＵ１５００の動作により変形して、対象部分プログラム４０内の基本ブロック毎に、当該基本ブロックのＩＮＳＥＲＴデータに含まれる命令を、当該基本ブロックにおいて当該命令とデータ依存関係を有する他の命令よりも先に実行される部分に挿入する。当該命令とデータ依存関係を有する他の命令が存在しない場合には、当該基本ブロックの何れの部分に挿入してもよい。命令挿入の処理は、ＣＰＵ１５００の動作によってメモリに格納された対象部分プログラム４０を書き換えることによって実現される。
【００５８】
図１２は、コンパイラ装置１０により対象プログラムをコンパイルする処理のフローチャートである。最適化候補検索部１００は、最適化の対象となる部分プログラムの候補をＣＰＵ１５００の動作により検索する（Ｓ１２００）。例えば、最適化候補検索部１００は、部分プログラムとして、メソッド、関数、又は手続きと呼ばれるプログラムの処理単位ごとの命令列を部分プログラムの候補として検索してもよいし、ループ処理等のように制御フローの性質に基づいて定まる命令列を部分プログラムの候補として検索してもよい。
【００５９】
そして、対象部分プログラム検索部１１０は、最適化候補検索部１００により検索された複数の部分プログラムのうち、置換対象パターン２０に類似する部分プログラムを対象部分プログラム４０として検索する（Ｓ１２１０）。詳細には、対象部分プログラム検索部１１０は、非特許文献１に記載のtopological embeddingの技術により、置換対象パターン２０と同型の依存グラフを検出してもよい。これに代えて、対象部分プログラム検索部１１０は、非特許文献２に記載の方法に基づき、置換対象パターン２０との共通部分が最大のプログラム片を検出することにより、置換対象パターン２０と同型の依存グラフを検出してもよい。これらの技術によると、置換対象パターン２０の依存グラフにおけるノードとノードとの間に、任意のノードが含まれている場合であっても、同型性があると判断できる。
【００６０】
これらの技術を適用して同型の依存グラフを検出する処理例についてさらに詳細に説明する。まず、対象部分プログラム検索部１１０は、置換対象パターン２０に含まれる命令間の依存関係を解析することにより、各命令をノードとし、命令間の実行の依存関係を有向エッジとした依存グラフを生成する。なお、置換対象パターン２０は命令コードであり対象部分プログラム検索部１１０は必要に応じてその命令コードを依存グラフに変換してもよいし、コンパイラ装置１０が予め命令コードを依存グラフに変換したデータを置換対象パターン２０として格納していてもよい。同様に、対象部分プログラム検索部１１０は、最適化の対象となる部分プログラムの候補についても、命令間の実行の依存関係を解析することにより、各々の命令をノードとし、当該複数の命令の実行の依存関係を有向エッジとした依存グラフを生成する。
【００６１】
そして、対象部分プログラム検索部１１０は、ループ処理については、その依存グラフを、無限に続く木構造として取り扱う。例えば、図５ｃに示す命令列は、ｃ->a->->S->b1->b2->c->a->S->b1->b2->……として取り扱う。この命令列に対し、任意のノードを間に含んでいても同型と判断する技術を適用すると、ｃ->a->->S->b1->b2->c->a->S->b1->b2->において下線を付して示すように、命令a、命令b1、命令b2、命令cがこの順に検索される。図３ｂに示すように、置換対象パターン２０は命令a、命令ｂ、命令cをこの順に含むループ処理であり、命令bは任意の数の条件分岐命令(例えばb1およびb2)と同型と判断されるから、置換対象パターン２０および対象部分プログラム４０は同型性があると判断される。
【００６２】
このように、対象部分プログラム検索部１１０は、各々の当該部分プログラムにおいて、置換対象パターン２０に含まれる全ての命令に対応する命令が、置換対象パターン２０における各命令の実行の依存関係の示す実行順序で実行されるかを依存グラフに基づいて判断する。そして、コンパイラ装置１０は、全ての命令に対応する命令が実行されると判断した場合に、部分プログラムを対象部分プログラムとして検出する。これにより、例えば、図５ｃや図１０ａ左側に示す部分プログラムが、対象プログラムの中から適切に検索され、対象部分プログラム４０として検出される。
【００６３】
続いて、命令列変形部１２０は、メモリに格納された対象部分プログラム４０のうち、置換対象パターン２０に含まれる命令に対応する命令以外の命令、及び、置換対象パターン２０と異なる実行の依存関係を有する命令に対して、対象部分プログラム４０に含まれる命令間の依存関係を置換対象パターン２０に一致させる変形を行う（Ｓ１２２０）。命令列変形部１２０は、必要に応じてその他の命令に対して変形を行ってもよい。変形された対象部分プログラムを対象部分プログラム５０とする。
【００６４】
命令列置換部１３０は、命令列変形部１２０により変形された対象部分プログラム５０を、置換対象パターン２０に対応して定められた置換先命令列に、ＣＰＵ１５００の動作により置換する（Ｓ１２３０）。例えば、コンパイラ装置１０は、置換先命令列の構造を示す置換先命令テンプレート３０における各変数を、その変数に対応する対象部分プログラム５０における変数に置き換えることにより、置換先命令列を生成してもよい。詳しくは図４を参照して説明したとおりである。
【００６５】
図１３は、Ｓ１２２０における処理の詳細を示す。ループ変形部２００は、メモリに格納された対象部分プログラム４０を読み出して、その対象部分プログラム４０に対し、ループ処理を複数命令の周期的実行とみなした場合の命令実行の位相を変更する処理を行う（Ｓ１３００）。具体的には、ループ変形部２００は、対象部分プログラム４０内のループ処理の先頭で実行される一部の命令をそのループ処理の開始前に実行される部分に複写する。そして、ループ変形部２００は、当該一部の命令を除く他の命令をそのループ処理の先頭に移動し、当該一部の命令を当該ループ処理内の当該他の命令の後に移動する。これにより、ループ変形部２００は、対象部分プログラム４０に含まれる命令間の依存関係を置換対象パターンに一致させることができる。ループ処理の先頭からどの命令までを複写の対象とするかについては、置換対象パターン内のループ処理の先頭がどの命令であるかによって定められる。変形後の命令はメモリに格納される。
【００６６】
次に、第１変形部２１０は、条件分岐命令よりも先に実行される命令をその条件分岐命令の分岐先のそれぞれに移動させる変形を、ＣＰＵ１５００の動作によって行って、対象部分プログラム４０に含まれる命令間の依存関係を置換対象パターン２０に一致させる（Ｓ１３１０）。この変形は、データ依存関係を保持する範囲内において命令の移動可能範囲を探索するデータフロー方程式を、置換対象パターン２０における命令間の依存関係に基づいて変更することにより実現される。
【００６７】
続いて、置換対象パターン２０が、ループ処理内に演算結果を変数に代入する第１命令を含み、かつ、当該変数の内容を参照する命令をそのループ処理の後に実行される部分に含むことを条件に、第２変形部２２０による変形を試みる（Ｓ１３２０）。第２変形部２２０は、変形後の対象部分プログラム４０をメモリから読み出す。そして、第２変形部２２０は、ＣＰＵ１５００の動作により、その第１命令を複製してそのループ処理の終了条件が成立した場合に実行される部分に挿入する変形を行う。これにより、対象部分プログラム４０に含まれる命令間の依存関係は、第１命令を除き、置換対象パターン２０に含まれる命令間の依存関係に一致する。
【００６８】
判定部２３０は、以上の処理により対象部分プログラム４０に含まれる命令間の依存関係が置換対象パターン２０に一致したかを判定する（Ｓ１３３０）。一致していない場合には（Ｓ１３３０：ＮＯ）、判定部２３０は、ループ変形部２００、第１変形部２１０および第２変形部２２０による変形の結果が、前回にループ変形部２００、第１変形部２１０および第２変形部２２０によって変形された結果と同一であって変形処理が収束したかを判断する（Ｓ１３５０）。収束した場合には（Ｓ１３５０：ＹＥＳ）、判定部２３０は、変形処理が失敗した旨を命令列置換部１３０に通知して処理を終了する（Ｓ１３６０）。収束していなければ（Ｓ１３５０：ＮＯ）、変形後の対象部分プログラム４０をさらにループ変形部２００、第１変形部２１０および第２変形部２２０によって変形させるべく、Ｓ１３００に処理を戻す。対象部分プログラム４０に含まれる命令間の依存関係が置換対象パターン２０に一致した場合には（Ｓ１３３０：ＹＥＳ）、命令列変形部１２０は、一致した旨を命令列置換部１３０に通知して命令列を置換させる（Ｓ１３４０）。
【００６９】
図１４は、コンパイラ装置１０として機能する情報処理装置５００のハードウェア構成の一例を示す。情報処理装置５００は、ホストコントローラ１５８２により相互に接続されるＣＰＵ１５００、ＲＡＭ１５２０、及びグラフィックコントローラ１５７５を有するＣＰＵ周辺部と、入出力コントローラ１５８４によりホストコントローラ１５８２に接続される通信インターフェイス１５３０、ハードディスクドライブ１５４０、及びＣＤ−ＲＯＭドライブ１５６０を有する入出力部と、入出力コントローラ１５８４に接続されるＲＯＭ１５１０、フレキシブルディスクドライブ１５５０、及び入出力チップ１５７０を有するレガシー入出力部とを備える。
【００７０】
ホストコントローラ１５８２は、ＲＡＭ１５２０と、高い転送レートでＲＡＭ１５２０をアクセスするＣＰＵ１５００及びグラフィックコントローラ１５７５とを接続する。ＣＰＵ１５００は、ＲＯＭ１５１０及びＲＡＭ１５２０に格納されたプログラムに基づいて動作し、各部の制御を行う。グラフィックコントローラ１５７５は、ＣＰＵ１５００等がＲＡＭ１５２０内に設けたフレームバッファ上に生成する画像データを取得し、表示装置１５８０上に表示させる。これに代えて、グラフィックコントローラ１５７５は、ＣＰＵ１５００等が生成する画像データを格納するフレームバッファを、内部に含んでもよい。
【００７１】
入出力コントローラ１５８４は、ホストコントローラ１５８２と、比較的高速な入出力装置である通信インターフェイス１５３０、ハードディスクドライブ１５４０、及びＣＤ−ＲＯＭドライブ１５６０を接続する。通信インターフェイス１５３０は、ネットワークを介して外部の装置と通信する。ハードディスクドライブ１５４０は、情報処理装置５００が使用するプログラム及びデータを格納する。ＣＤ−ＲＯＭドライブ１５６０は、ＣＤ−ＲＯＭ１５９５からプログラム又はデータを読み取り、ＲＡＭ１５２０又はハードディスクドライブ１５４０に提供する。
【００７２】
また、入出力コントローラ１５８４には、ＲＯＭ１５１０と、フレキシブルディスクドライブ１５５０や入出力チップ１５７０等の比較的低速な入出力装置とが接続される。ＲＯＭ１５１０は、情報処理装置５００の起動時にＣＰＵ１５００が実行するブートプログラムや、情報処理装置５００のハードウェアに依存するプログラム等を格納する。フレキシブルディスクドライブ１５５０は、フレキシブルディスク１５９０からプログラム又はデータを読み取り、入出力チップ１５７０を介してＲＡＭ１５２０またはハードディスクドライブ１５４０に提供する。入出力チップ１５７０は、フレキシブルディスク１５９０や、例えばパラレルポート、シリアルポート、キーボードポート、マウスポート等を介して各種の入出力装置を接続する。
【００７３】
情報処理装置５００に提供されるプログラムは、フレキシブルディスク１５９０、ＣＤ−ＲＯＭ１５９５、又はＩＣカード等の記録媒体に格納されて利用者によって提供される。プログラムは、入出力チップ１５７０及び/又は入出力コントローラ１５８４を介して、記録媒体から読み出され情報処理装置５００にインストールされて実行される。コンパイラプログラムが情報処理装置５００等に働きかけて行わせる動作は、図１から図１３において説明したコンパイラ装置１０における動作と同一であるから、説明を省略する。
【００７４】
以上に示したプログラムは、外部の記憶媒体に格納されてもよい。記憶媒体としては、フレキシブルディスク１５９０、ＣＤ−ＲＯＭ１５９５の他に、ＤＶＤやＰＤ等の光学記録媒体、ＭＤ等の光磁気記録媒体、テープ媒体、ＩＣカード等の半導体メモリ等を用いることができる。また、専用通信ネットワークやインターネットに接続されたサーバシステムに設けたハードディスク又はＲＡＭ等の記憶装置を記録媒体として使用し、ネットワークを介してプログラムを情報処理装置５００に提供してもよい。
【００７５】
以上、本実施形態に係るコンパイラ装置１０によれば、最適化対象のプログラム中に、より高速に実行可能な命令に置換できる命令列のパターンが検索された場合のみならず、そのようなパターンと類似しているものの完全には一致していない場合であっても、必要なコード変形によりパターンに一致させることができる。これにより、高性能なコンピュータに備わっている特別な命令を有効に利用して、プログラムの実行効率を一層高めることができる。実際に、文字コード変換を行うベンチマークプログラムにて性能評価を行ったところ、プログラムの種類によっては、従来と比較して２．３５倍から４．５４倍の性能向上が観測された。
【００７６】
以上、本発明を実施の形態を用いて説明したが、本発明の技術的範囲は上記実施の形態に記載の範囲には限定されない。上記実施の形態に、多様な変更または改良を加えることが可能であることが当業者に明らかである。その様な変更または改良を加えた形態も本発明の技術的範囲に含まれ得ることが、特許請求の範囲の記載から明らかである。
【図面の簡単な説明】
【００７７】
【図１】図１は、コンパイラ装置１０の全体構成を示す。
【図２】図２は、命令列変形部１２０の機能構成を示す。
【図３ａ】図３ａは、置換対象パターン２０のグラフ表現を示す。
【図３ｂ】図３ｂは、置換対象パターン２０のグラフ表現を簡略化して示す。
【図３ｃ】図３ｃは、置換対象パターン２０の処理内容を示す擬似コードである。
【図４】図４は、置換先命令テンプレート３０の一例を示す。
【図５ａ】図５ａは、対象部分プログラム４０の一例を示す。
【図５ｂ】図５ｂは、対象部分プログラム４０のグラフ表現を示す。
【図５ｃ】図５ｃは、対象部分プログラム４０のグラフ表現を簡略化して示す。
【図６】図６は、ループ変形部２００の機能構成を示す。
【図７ａ】図７ａは、ループ変形部２００によって対象部分プログラム４０が変形される処理の概要を示す。
【図７ｂ】図７ｂは、ループ変形部２００によって変形された対象部分プログラム４０の擬似コードを示す。
【図８ａ】図８ａは、第２変形部２２０によって対象部分プログラム４０が変形される処理の概要を示す。
【図８ｂ】図８ｂは、ループ変形部２００によって対象部分プログラム４０が変形された結果である対象部分プログラム５０の擬似コードを示す。
【図９】図９は、第２変形部２２０の機能構成を示す。
【図１０ａ】図１０ａは、第１変形部２１０によって対象部分プログラム４０が変形される処理の概要を示す。
【図１０ｂ】図１０ｂは、第１変形部２１０によって変形される対象部分プログラム４０の擬似コードを示す。
【図１１】図１１は、第１変形部２１０の機能構成を示す。
【図１２】図１２は、コンパイラ装置１０により対象プログラムをコンパイルする処理のフローチャートである。
【図１３】図１３は、Ｓ１２２０における処理の詳細を示す。
【図１４】図１４は、コンパイラ装置１０として機能する情報処理装置５００のハードウェア構成の一例を示す。
【図１５】図１５は、ＴＲＴ命令による処理に対応する制御フローグラフである。
【符号の説明】
【００７８】
１０  コンパイラ装置
２０  置換対象パターン
３０  置換先命令テンプレート
４０  対象部分プログラム
５０  対象部分プログラム
１００  最適化候補検索部
１１０  対象部分プログラム検索部
１２０  命令列変形部
１３０  命令列置換部
２００  ループ変形部
２１０  第１変形部
２２０  第２変形部
２３０  判定部
５００  情報処理装置
６００  先頭部検索部
６１０  先頭部複製部
６２０  開始命令変更部
９００  第２ＫＩＬＬデータ生成部
９１０  第２ＧＥＮデータ生成部
９２０  第２ＯＵＴデータ生成部
９３０  第２ＩＮデータ生成部
９４０  第２コード変形部
１１００  第１ＫＩＬＬデータ生成部
１１１０  対応データ生成部
１１２０  第１ＫＩＬＬデータ追加部
１１３０  第１ＧＥＮデータ生成部
１１４０  第１ＯＵＴデータ生成部
１１５０  第１ＩＮデータ生成部
１１６０  ＩＮＳＥＲＴデータ生成部
１１７０  第１コード変形部
【図１】
2008097249.tif 000008
【図２】
2008097249.tif 000009
【図３ａ】
2008097249.tif 000010
【図３ｂ】
2008097249.tif 000011
【図３ｃ】
2008097249.tif 000012
【図４】
2008097249.tif 000013
【図５ａ】
2008097249.tif 000014
【図５ｂ】
2008097249.tif 000015
【図５ｃ】
2008097249.tif 000016
【図６】
2008097249.tif 000017
【図７ａ】
2008097249.tif 000018
【図７ｂ】
2008097249.tif 000019
【図８ａ】
2008097249.tif 000020
【図８ｂ】
2008097249.tif 000021
【図９】
2008097249.tif 000022
【図１０ａ】
2008097249.tif 000023
【図１０ｂ】
2008097249.tif 000024
【図１１】
2008097249.tif 000025
【図１２】
2008097249.tif 000026
【図１３】
2008097249.tif 000027
【図１４】
2008097249.tif 000028
【図１５】
2008097249.tif 000029