(57)【特許請求の範囲】
【請求項１】
命令ｎが定義する変数のライブ情報をビット単位で設定するライブ情報設定手段と、
前記ライブ情報設定手段で設定されたライブ情報のうち前記命令ｎが定義する変数の部分がデッドに設定されている場合に該命令ｎを削除する第１最適化手段と、
前記第１最適化手段で前記命令ｎが削除されなかった場合に、前記ライブ情報設定手段で設定されたライブ情報のうち前記命令ｎが定義する部分をデッドに設定するデッド設定手段と、
前記デッド設定手段でデッドに設定されたライブ情報に基づき前記命令ｎが参照する部分を計算する参照部計算手段と、
前記参照部計算手段での計算により得られた参照部に基づき前記命令ｎを変更する第２最適化手段と、
前記第２最適化手段で使用されたライブ情報のうち前記参照部をライブに設定するライブ設定手段、
とを備えたプログラム最適化処理装置。
【請求項２】
請求項１において、更に、
分岐及び合流が存在しない複数の命令で構成された基本ブロックと、
前記基本ブロックの最後の命令から先頭の命令に向かって順次取り出す取出手段、とを含み、
前記命令ｎは、前記取出手段から供給されるプログラム最適化処理装置。
【請求項３】
命令ｎが定義する変数のライブ情報をビット単位で設定し、
該設定されたライブ情報のうち前記命令ｎが定義する変数の部分がデッドに設定されている場合に該命令ｎを削除し、
前記命令ｎが削除されなかった場合に、前記設定されたライブ情報のうち前記命令ｎが定義する部分をデッドに設定し、
該デッドに設定されたライブ情報に基づき前記命令ｎが参照する部分を計算し、
該計算により得られた参照部に基づき前記命令ｎを変更し、
該変更で参照されたライブ情報のうち前記参照部をライブに設定する、プログラム最適化方法。
【請求項４】
請求項３において、更に、
分岐及び合流が存在しない複数の命令で構成された基本ブロックの最後の命令から先頭の命令に向かって順次取り出す工程、とを含み、
該取り出された命令を前記命令ｎとして供給するプログラム最適化処理方法。
【請求項５】
命令ｎが定義する変数のライブ情報をビット単位で設定し、
該設定されたライブ情報のうち前記命令ｎが定義する変数の部分がデッドに設定されている場合に該命令ｎを削除し、
前記命令ｎが削除されなかった場合に、前記設定されたライブ情報のうち前記命令ｎが定義する部分をデッドに設定し、
該デッドに設定されたライブ情報に基づき前記命令ｎが参照する部分を計算し、
該計算により得られた参照部に基づき前記命令ｎを変更し、
該変更で参照されたライブ情報のうち前記参照部をライブに設定する、ためのプログラムを記憶したコンピュータ読み取り可能な記録媒体。
【請求項６】
請求項５において、更に、
分岐及び合流が存在しない複数の命令で構成された基本ブロックの最後の命令から先頭の命令に向かって順次取り出す工程、とを含み、
該取り出された命令を前記命令ｎとして供給する、ためのプログラムを記憶したコンピュータ読み取り可能な記録媒体。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明は、プログラム最適化処理装置及びプログラム最適化方法に関する。
【０００２】
【従来の技術】
従来、ソースプログラムをコンパイルする際に、コンパイルの結果として得られるオブジェクトプログラムの冗長性を減らすために最適化が行われている。このような最適化を行う方法として、例えば特開昭６２-２６９２３８号公報は「コンパイル方式」を開示している。このコンパイル方式は、高級言語の整数型の式のコンパイルに適用され、式の各要素の取り得る値の範囲をビット数と符号で表すことによって、被演算子を拡張するための符号拡張命令のような余分な拡張命令をオブジェクトプログラムから除くことにより最適化を行う。
【０００３】
また、特開昭６３−２５７３３号公報は「コンパイラ処理方式」を開示している。このコンパイラ処理方式は、プログラム内に出現する右辺が多項式の代入文によって定義される変数の使用が唯一であることを調べ、唯一であるという条件下において多項式のコピー伝播を行うことでそのコピー文を削除する。これにより、レジスタ割付対象変数を削減し、レジスタに保持できる変数を増加させることでオブジェクトプログラムの実行性能を向上させている。
【０００４】
また、特開平７−１６８７１９号公報は「冗長式除去装置」を開示している。この冗長式除去装置は、プログラムの書き換え前後のコスト（最終的に作成する機械語プログラムの実行時間及びメモリサイズ）を比較した上で、プログラム中の演算を書き換え、冗長となる演算式を除去する。
【０００５】
また、特開平９−６６２７号公報は「最適化装置」を開示している。この最適化装置は、定数保持変数定義検出部、使用式検出部により定数保持変数の定義及び使用情報を定数保持変数情報保持部に格納し、部分定数式書き換え部が、変数を定数に書き換えればその変数を含む式を定数に畳み込むことができる定数保持変数を定数に書き換え、コスト判定書き換え部が変数をレジスタに載せて使用するか、定数伝播するかを判断して、定数伝播する場合に変数を定数で書き換え、資源割り付け部が変数に資源を割り当て、メモリ変数書き換え部１２がメモリに割り付けられた定数保持変数を定数値に書き換え、定数保持変数定義除去部が不要となった定数保持変数の定義を除去する。
【０００６】
また、特開平１０−２８９１０２号公報は「プログラムのデータフロー解析装置」を開示している。このプログラムのデータフロー解析装置では、Ｃ言語の標準ライブラリに含まれる手続のように仕様が明らかになっているライブラリに含まれる各手続きについて、その仕様から、データ依存関係を予め調べておいて、その結果だけを記述した定義／参照情報格納ファイルを用意する。ある手続きの呼び出しがあったらこのテーブルを参照し、「定義」であるのか、「参照」であるのかという情報を抽出する。これにより、ソースプログラムの内容を見ることができない手続きを含むプログラムについてもデータフロー解析を可能とし、また、ソースプログラムを見ることができる手続きを含むプログラムであってもそのデータフロー解析に要する時間を短縮することができる。
【０００７】
更に、特開平１１−２１２８００号公報は「移送命令最適化装置および方法」を開示している。この移送命令最適化装置および方法は、移送命令を削除する複写伝播処理手段で削除できない移送命令に対して、該移送命令の右辺オペランドの値を決定する定義命令と移送命令を見つけ、その定義命令と移送命令の間に移送命令で使用するオペランドの使用がないことを判定し、移送命令以後の命令における移送命令の右辺オペランドの参照を左辺オペランドで置換し、最後に定義命令の左辺オペランドを移送命令の左辺オペランドで置換して移送命令を削除する。これにより、移送命令を含む命令列あるいは、中間テキスト列において、移送命令の右辺の定義命令が現れても移送命令を削除することができる。
【０００８】
【発明が解決しようとする課題】
しかしながら、上記特開昭６２-２６９２３８号公報に開示されたコンパイル方式では、数値の範囲は変数型に基づいて得られるので、ソースプログラムに記述されている情報を越えた判断はできない。また、この特開昭６２-２６９２３８号公報以外の公報も最適化の技術を開示しているが、何れも以下に説明する本発明とは異なる手法で最適化を行っている。
【０００９】
本発明の目的は、オブジェクトプログラムの実行時間を高速にすることができ、しかもそのオブジェクトプログラムのサイズを小さくできるログラム最適化処理装置及びプログラム最適化方法を提供することにある。
【００１０】
【課題を解決するための手段】
本発明の第１の態様に係るプログラム最適化処理装置は、上記目的を達成するために、命令ｎが定義する変数のライブ情報をビット単位で設定するライブ情報設定手段と、前記ライブ情報設定手段で設定されたライブ情報のうち前記命令ｎが定義する変数の部分がデッドに設定されている場合に該命令ｎを削除する第１最適化手段と、前記第１最適化手段で前記命令ｎが削除されなかった場合に、前記ライブ情報設定手段で設定されたライブ情報のうち前記命令ｎが定義する部分をデッドに設定するデッド設定手段と、前記デッド設定手段でデッドに設定されたライブ情報に基づき前記命令ｎが参照する部分を計算する参照部計算手段と、前記参照部計算手段での計算により得られた参照部に基づき前記命令ｎを変更する第２最適化手段と、前記第２最適化手段で使用されたライブ情報のうち前記参照部をライブに設定するライブ設定手段、とを備えている。
【００１１】
また、本発明の第２の態様に係るプログラム最適化処理方法は、命令ｎが定義する変数のライブ情報をビット単位で設定し、該設定されたライブ情報のうち前記命令ｎが定義する変数の部分がデッドに設定されている場合に該命令ｎを削除し、前記命令ｎが削除されなかった場合に、前記設定されたライブ情報のうち前記命令ｎが定義する部分をデッドに設定し、該デッドに設定されたライブ情報に基づき前記命令ｎが参照する部分を計算し、該計算により得られた参照部に基づき前記命令ｎを変更し、該変更で参照されたライブ情報のうち前記参照部をライブに設定する、各工程を含む。
【００１２】
更に、本発明の第３の態様に係るコンピュータ読み取り可能な記録媒体は、命令ｎが定義する変数のライブ情報をビット単位で設定し、該設定されたライブ情報のうち前記命令ｎが定義する変数の部分がデッドに設定されている場合に該命令ｎを削除し、前記命令ｎが削除されなかった場合に、前記設定されたライブ情報のうち前記命令ｎが定義する部分をデッドに設定し、該デッドに設定されたライブ情報に基づき前記命令ｎが参照する部分を計算し、該計算により得られた参照部に基づき前記命令ｎを変更し、該変更で参照されたライブ情報のうち前記参照部をライブに設定する、ためのプログラムを記憶している。
【００１３】
【発明の実施の形態】
以下、本発明の実施の形態を、図面を参照しながら説明する。
【００１４】
図１は本発明の実施の形態に係るプログラム最適化処理装置が適用されるコンパイルシステムの機能ブロック図である。このコンパイルシステムは、コンパイラ１０、ソースプログラムファイル２０及びオブジェクトプログラムファイル３０から構成されている。
【００１５】
コンパイラ１０は、通常は、例えばオブジェクトプログラムファイル３０に格納されている。そして、このコンパイラ１０が起動されることによってオブジェクトプログラムファイル３０からＣＰＵに接続されたメモリにロードされ、実行される。このコンパイラ１０は、フロッピーディスクその他の記憶媒体に格納して他のコンピュータシステムで使用することができる。
【００１６】
ソースプログラムファイル２０は、例えば高級言語で記述されたソースプログラムを記憶する。オブジェクトプログラムファイル３０は、コンパイラ１０で生成された機械語のオブジェクトプログラムを記憶する。これらソースプログラムファイル２０及びオブジェクトプログラムファイル３０は、例えば、中央処理装置（ＣＰＵ）に接続されたディスク上に形成することができる。
【００１７】
上記コンパイラ１０は、字句解析部１１、構文解析部１２、最適化部１３及びコード生成部１４から構成されている。字句解析部１１は、ソースプログラムファイル２０からソースプログラムを読み出して字句解析を行い、シンボルテーブルを作成する。構文解析部１２は、字句解析部１１からのシンボルテーブルに基づいてソースプログラムの構文解析を行い、中間言語を生成する。
【００１８】
最適化部１３は、構文解析部１２で生成された中間言語に対して最適化処理を施す。具体的には、オブジェクトプログラムの実行速度を速くしたり、そのサイズを小さくするために、中間言語の削除、変更等を行う。この最適化部１３の機能及び動作の詳細は後に説明する。
【００１９】
コード生成部１４は、最適化部１３で最適化された中間言語に基づいてオブジェクトプログラムを生成する。このコード生成部１４で生成されたオブジェクトプログラムは、オブジェクトプログラムファイル３０に格納される。
【００２０】
次に、上記最適化部１３の機能の概略を説明する。この最適化部１３は、詳細は後述するが、図２のフローチャートに示す機能を有する。
【００２１】
この最適化部１３には、分岐や合流が存在しない命令で構成された基本ブロックｂが入力される。そして、最適化部１３は、この基本ブロックｂの最後の命令から先頭の命令の方向に遡りながら、以下の処理を行う。
【００２２】
図２に示したフローチャートおける、命令ｎの定義する変数のライブ情報設定（ステップＳ３０３）、現在のライブ情報集合デッド設定（ステップＳ３０６）、命令ｎの参照部計算（ステップＳ３０７）及び現在のライブ情報集合ライブ設定（ステップＳ３０９）の各ステップで以下の事項を調査することにより、ライブ情報をビット単位で設定する。
【００２３】
（１）注目する命令で定義される変数とその定義部分を、この命令より前では「デッド（参照されない）」とする。
（２）注目する命令で定義される変数の部分でライブである部分に影響する、参照される変数の部分を、この命令より前では「ライブ（参照される）」とする。入力される命令とライブ情報の関係を図３に示す。
【００２４】
図２に示したフローチャートにおける最適化Ａ（ステップＳ３０４）及び最適化Ｂ（ステップＳ３０８）で、このビット単位のライブ情報から次のような最適化が可能になる。
【００２５】
（１）命令が定義する変数とその定義部分がライブでなければ、その命令は冗長であるので削除できる。図３の命令１がこのケースに相当する。
（２）命令が定義する変数のライブである部分から、そのライブである部分にだけ影響する即値オペランドの範囲が分かるので、命令をより小さいサイズに変更することができる。図３の命令２がこのケースに相当する。
【００２６】
次に、上記最適化部１３の詳細な機能及び動作を、図２に示したフローチャート及び図３に示した説明図を参照しながら説明する。なお、この最適化部１３は、通常のコンパイラが有する最適化処理（説明は省略する）に加えて、図２のフローチャートに示す最適化処理を行う。
【００２７】
入力される基本ブロックｂは、図２に示すように、命令１、命令２及び命令３から構成されているものとする。命令１は符号拡張命令であり、「Ｒ＜−ｓｘｈ１６，Ｒ」というシンボルで表される。この命令１は、変数Ｒの下位１６ビットを残し、符号拡張して新たな変数Ｒを生成する機能を有する。また、命令２は演算命令であり、「Ｒ＜−Ｒ  ｘｏｒ  ０ｘｆ０ｆ０ｆ０ｆ０」というシンボルで表される。なお、第２オペランドの文字列の先頭に記載された「０ｘ」は、それに続く文字列が１６進数であることを表し、以下においても同じである。この命令２は、変数Ｒの内容と即値０ｘｆ０ｆ０ｆ０ｆ０との排他的論理和演算を行って新たな変数Ｒを生成する機能を有する。更に、命令３はマスク命令であり、「Ｒ＜−Ｒ  ａｎｄ  ０ｘｆｆ」というシンボルで表される。この命令３は、変数Ｒの内容と即値０ｘｆｆとの論理積演算を行って新たな変数Ｒを生成する機能を有する。ここで、変数Ｒは３２ビットで構成され、ビット名称は、ＬＳＢが「ビット０」、ＭＳＢが「ビット３１」に定義されている。
【００２８】
この最適化部１３では、先ず、現在のライブ情報集合が設定される（ステップＳ３０１）。この処理では、基本ブロックｂの最後の命令実行後のライブ情報が仮定される。初期状態では使用される全ての変数の全ての部分が参照されると仮定し、「ライブ」に設定される。以下、基本ブロックｂの最後の命令から先頭の命令に向かって順次命令が注目される。現在のライブ情報集合は、或る命令が注目されている場合に、その時点のライブ情報である。図３に示す例では、基本ブロックｂの中で利用される３２ビットの変数Ｒの全ての部分がライブに設定される。
【００２９】
次いで、基本ブロックｂの最後の命令、つまり命令３が命令ｎとして指定される（ステップＳ３０２）。次いで、命令ｎが定義する変数のライブ情報が設定される（ステップＳ３０３）。この処理は、現在のライブ情報集合からライブ情報を得ることにより行われる。図３に示す例では、命令３が定義する変数Ｒのライブ情報は、３２ビットの全てがライブに設定される。
【００３０】
次いで、最適化Ａが行われる（ステップＳ３０４）。この最適化Ａでは、命令ｎの定義部分が全てデッドである場合、その命令ｎは冗長であると判断されて削除される。図３に示す例では、命令３が定義する上位２４ビットに対応するライブ情報はライブに設定されているので、この命令３は削除されない。
【００３１】
次いで、上記ステップＳ３０４の最適化Ａで命令ｎが削除されたかどうかが調べられる（ステップＳ３０５）。ここで削除されたことが判断されると、シーケンスはステップＳ３１０へ分岐する。一方、削除されなかったことが判断されると、現在のライブ情報集合にデッドを設定する処理が行われる（ステップＳ３０６）。即ち、現在のライブ情報集合のうち、命令ｎが定義した部分がデッドに設定される。図３に示す例では、命令３によって変数Ｒの上位２４ビットはゼロに定義されるので、現在のライブ情報集合は３２ビットの全てがライブに設定された状態から、上位２４ビットがデッドに設定され下位８ビットがライブに設定された状態に変化する。
【００３２】
次いで、命令ｎの参照部計算が行われる（ステップＳ３０７）。ここでは、命令ｎが定義する変数でライブである部分に影響する部分を得るための計算が行われる。代表的な命令における「影響する部分」は次のように計算される。
【００３３】
（１）加減算及び乗算では、定義する変数のライブである部分の最高位ビットから下位側が影響する参照部分になる。
（２）論理演算では、定義する変数のライブである部分と同じビット位置が影響する参照部分になる。
（３）シフト演算では、定数シフトのときは、定義する変数のライブである部分を、指定された方向と逆方向にシフトしたものが参照部分になる。
（４）可変シフトでは、右シフトであれば定義する変数のライブ部分の最低位ビットから上位側が参照部分になり、左シフトであれば定義する変数のライブ部分の最高位ビットから下位側が参照部分になる。
（５）符号拡張演算では、符号を示すビットが参照部分になる。
【００３４】
なお、デフォルトは、参照する変数の全ての部分が参照されると仮定され、全ての部分がライブ部分になる。図３に示す例では、命令３には定義する変数でライブである部分に影響する参照部は存在しない。
【００３５】
次いで、最適化Ｂが行われる（ステップＳ３０８）。この処理では、命令ｎの参照部計算で得られた「影響する部分」に基づいてオペランドやオペレーションコードをより冗長でない命令に最適化する処理が行われる。この最適化Ｂでは、即値オペランドを表すビット数を小さくできる。また、この命令ｎが定数に設定する部分だけが参照されるなら、命令を定数の代入に置き換えることができる。図３に示す例では、命令３に対する最適化は行われない。
【００３６】
次いで、現在のライブ情報集合にライブが設定される（ステップＳ３０９）。即ち、命令ｎの参照部に対応する、現在のライブ情報集合の部分がライブに設定される。図３に示す例では、命令３に参照部がないのでなにも行われない。
【００３７】
次いで、命令ｎが基本ブロックｂの先頭の命令であるかどうかが調べられる（ステップＳ３１０）。そして、先頭の命令でないことが判断されると、基本ブロックｂ内の現在指定されている命令の１つ前の命令が命令ｎとして指定される（ステップＳ３１１）。その後、シーケンスはステップＳ３０３に分岐する。一方、先頭の命令であることが判断されると、この最適化処理は終了する。図３に示した例では、命令３は基本ブロックｂの先頭の命令ではないので、ステップＳ３０３に戻り、次の命令２に対する最適化処理が行われる。
【００３８】
即ち、命令ｎの定義する変数のライブ情報設定（ステップＳ３０３）では、命令２のライブ情報は、変数Ｒの下位８ビットのみ（命令３でデッドに設定された上位２４ビットを除く）がライブに設定される。次の最適化Ａ（ステップＳ３０４）では、命令２が定義する下位８ビット（０ｘｆ０のビットマスクで示される部分）に対応するライブ情報はライブに設定されているので、この命令２は削除されない。次のステップＳ３０５では、削除されなかったことが判断されるので、シーケンスはステップＳ３０６に進む。
【００３９】
次の現在のライブ情報集合デッド設定（ステップＳ３０６）では、現在のライブ情報集合に０ｘf０f０f０f０を２進数で表した場合に「１」で示される部分がデッドに設定される。次の命令ｎの参照部計算（ステップＳ３０７）では、変数Ｒの０ｘf０f０f０f０を２進数で表した場合の「１」で示される部分が参照部とされる。
【００４０】
次の最適化Ｂ（ステップＳ３０８）では、上位２４ビットは参照されない（デッドである）ことが分かるので、より小さなコードにするために、オペランドが０ｘf０の８ビットに縮められる。これにより、小さいサイズの演算命令を使用することができる。
【００４１】
次の現在のライブ情報集合ライブ設定（ステップＳ３０９）では、現在のライブ情報集合に変数Ｒの中の０ｘf０のビットマスクで示される部分がライブに設定される。その結果、下位８ビットがライブになる。次いで、ステップＳ３１０で、命令ｎが基本ブロックｂの先頭の命令であるかどうかが調べられるが、命令２は基本ブロックｂの先頭の命令ではないので、ステップＳ３０３に戻り、次の命令１に対する最適化処理が行われる。
【００４２】
即ち、命令ｎの定義する変数のライブ情報設定（ステップＳ３０３）では、命令１のライブ情報は、変数Ｒの下位８ビットのみがライブに設定される。次に行われる最適化Ａ（ステップＳ３０４）では、命令１はビット１５を参照して上位１６ビットを定義するが、この上位１６ビットの部分はデッドである。従って、命令１は冗長な命令であるとして削除される。
【００４３】
次のステップＳ３０５では、削除されたことが判断されるので、シーケンスはステップＳ３１０に進む。次いで、ステップＳ３１０で、命令ｎが基本ブロックｂの先頭の命令であるかどうかが調べられ、命令１は基本ブロックｂの先頭の命令であるので、最適化処理が終了する。
【００４４】
次に、本発明の他の実施の形態について説明する。この他の実施の形態では、基本ブロックを越えて関数全体のビット単位のライブ情報が取得される。
【００４５】
図２に示したフローチャートの現在のライブ情報集合設定（ステップＳ３０１）では、初期状態では、使用される全ての変数の全ての部分が参照されると仮定し、「ライブ」に設定される。そして、関数内の各基本ブロックについてライブ情報が取得される。
【００４６】
これは、以下のようにして行われる。即ち、基本ブロックとフローが継っている他の基本ブロック先頭のライブ情報からライブである部分を集めた値Ａが、先に現在のライブ情報集合設定（ステップＳ３０１）で設定した値と、同じ値に収束するまで、値Ａを現在のライブ情報集合設定（ステップＳ３０１）で設定し、基本ブロックのライブ情報を取得を繰り返す。
【００４７】
以上説明した本発明の実施の形態に係るプログラム最適化装置によれば、ソースプログラムを構成する命令の動作に基づいてビット単位でライブ情報を得るように構成されているので、より詳しい情報が得られる。その結果、ソースプログラム中の命令の削除や変更をきめ細かく制御できるので、オブジェクトプログラムの実行時間の高速化及びそのオブジェクトプログラムのサイズの減少化に寄与するところが大きい。
【００４８】
【発明の効果】
以上詳述したように、本発明によれば、オブジェクトプログラムの実行時間を高速にすることができ、しかもそのオブジェクトプログラムのサイズを小さくできるプログラム最適化処理装置及びプログラム最適化方法を提供できる。
【図面の簡単な説明】
【図１】本発明の実施の形態に係るプログラム最適化処理装置が適用されるコンパイルシステムの機能ブロック図である。
【図２】図１に示した最適化部の動作を説明するためのフローチャートである。
【図３】本発明の実施の形態に係るプログラム最適化処理装置において、入力される命令とライブ情報の関係を示す説明図である。
【符号の説明】
１０  コンパイラ
１１  字句解析部
１２  構文解析部
１３  最適化部
１４  コード生成部
２０  ソースプログラムファイル
３０  オブジェクトプログラムファイル
【図１】
0003542538.tif 000002
【図２】
0003542538.tif 000003
【図３】
0003542538.tif 000004