JP3542538B2 - プログラム最適化処理装置及びプログラム最適化方法 - Google Patents
プログラム最適化処理装置及びプログラム最適化方法 Download PDFInfo
- Publication number
- JP3542538B2 JP3542538B2 JP2000040659A JP2000040659A JP3542538B2 JP 3542538 B2 JP3542538 B2 JP 3542538B2 JP 2000040659 A JP2000040659 A JP 2000040659A JP 2000040659 A JP2000040659 A JP 2000040659A JP 3542538 B2 JP3542538 B2 JP 3542538B2
- Authority
- JP
- Japan
- Prior art keywords
- instruction
- live information
- live
- dead
- variable
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Expired - Fee Related
Links
Images
Landscapes
- Devices For Executing Special Programs (AREA)
Description
【0001】
【発明の属する技術分野】
本発明は、プログラム最適化処理装置及びプログラム最適化方法に関する。
【0002】
【従来の技術】
従来、ソースプログラムをコンパイルする際に、コンパイルの結果として得られるオブジェクトプログラムの冗長性を減らすために最適化が行われている。このような最適化を行う方法として、例えば特開昭62-269238号公報は「コンパイル方式」を開示している。このコンパイル方式は、高級言語の整数型の式のコンパイルに適用され、式の各要素の取り得る値の範囲をビット数と符号で表すことによって、被演算子を拡張するための符号拡張命令のような余分な拡張命令をオブジェクトプログラムから除くことにより最適化を行う。
【0003】
また、特開昭63−25733号公報は「コンパイラ処理方式」を開示している。このコンパイラ処理方式は、プログラム内に出現する右辺が多項式の代入文によって定義される変数の使用が唯一であることを調べ、唯一であるという条件下において多項式のコピー伝播を行うことでそのコピー文を削除する。これにより、レジスタ割付対象変数を削減し、レジスタに保持できる変数を増加させることでオブジェクトプログラムの実行性能を向上させている。
【0004】
また、特開平7−168719号公報は「冗長式除去装置」を開示している。この冗長式除去装置は、プログラムの書き換え前後のコスト(最終的に作成する機械語プログラムの実行時間及びメモリサイズ)を比較した上で、プログラム中の演算を書き換え、冗長となる演算式を除去する。
【0005】
また、特開平9−6627号公報は「最適化装置」を開示している。この最適化装置は、定数保持変数定義検出部、使用式検出部により定数保持変数の定義及び使用情報を定数保持変数情報保持部に格納し、部分定数式書き換え部が、変数を定数に書き換えればその変数を含む式を定数に畳み込むことができる定数保持変数を定数に書き換え、コスト判定書き換え部が変数をレジスタに載せて使用するか、定数伝播するかを判断して、定数伝播する場合に変数を定数で書き換え、資源割り付け部が変数に資源を割り当て、メモリ変数書き換え部12がメモリに割り付けられた定数保持変数を定数値に書き換え、定数保持変数定義除去部が不要となった定数保持変数の定義を除去する。
【0006】
また、特開平10−289102号公報は「プログラムのデータフロー解析装置」を開示している。このプログラムのデータフロー解析装置では、C言語の標準ライブラリに含まれる手続のように仕様が明らかになっているライブラリに含まれる各手続きについて、その仕様から、データ依存関係を予め調べておいて、その結果だけを記述した定義/参照情報格納ファイルを用意する。ある手続きの呼び出しがあったらこのテーブルを参照し、「定義」であるのか、「参照」であるのかという情報を抽出する。これにより、ソースプログラムの内容を見ることができない手続きを含むプログラムについてもデータフロー解析を可能とし、また、ソースプログラムを見ることができる手続きを含むプログラムであってもそのデータフロー解析に要する時間を短縮することができる。
【0007】
更に、特開平11−212800号公報は「移送命令最適化装置および方法」を開示している。この移送命令最適化装置および方法は、移送命令を削除する複写伝播処理手段で削除できない移送命令に対して、該移送命令の右辺オペランドの値を決定する定義命令と移送命令を見つけ、その定義命令と移送命令の間に移送命令で使用するオペランドの使用がないことを判定し、移送命令以後の命令における移送命令の右辺オペランドの参照を左辺オペランドで置換し、最後に定義命令の左辺オペランドを移送命令の左辺オペランドで置換して移送命令を削除する。これにより、移送命令を含む命令列あるいは、中間テキスト列において、移送命令の右辺の定義命令が現れても移送命令を削除することができる。
【0008】
【発明が解決しようとする課題】
しかしながら、上記特開昭62-269238号公報に開示されたコンパイル方式では、数値の範囲は変数型に基づいて得られるので、ソースプログラムに記述されている情報を越えた判断はできない。また、この特開昭62-269238号公報以外の公報も最適化の技術を開示しているが、何れも以下に説明する本発明とは異なる手法で最適化を行っている。
【0009】
本発明の目的は、オブジェクトプログラムの実行時間を高速にすることができ、しかもそのオブジェクトプログラムのサイズを小さくできるログラム最適化処理装置及びプログラム最適化方法を提供することにある。
【0010】
【課題を解決するための手段】
本発明の第1の態様に係るプログラム最適化処理装置は、上記目的を達成するために、命令nが定義する変数のライブ情報をビット単位で設定するライブ情報設定手段と、前記ライブ情報設定手段で設定されたライブ情報のうち前記命令nが定義する変数の部分がデッドに設定されている場合に該命令nを削除する第1最適化手段と、前記第1最適化手段で前記命令nが削除されなかった場合に、前記ライブ情報設定手段で設定されたライブ情報のうち前記命令nが定義する部分をデッドに設定するデッド設定手段と、前記デッド設定手段でデッドに設定されたライブ情報に基づき前記命令nが参照する部分を計算する参照部計算手段と、前記参照部計算手段での計算により得られた参照部に基づき前記命令nを変更する第2最適化手段と、前記第2最適化手段で使用されたライブ情報のうち前記参照部をライブに設定するライブ設定手段、とを備えている。
【0011】
また、本発明の第2の態様に係るプログラム最適化処理方法は、命令nが定義する変数のライブ情報をビット単位で設定し、該設定されたライブ情報のうち前記命令nが定義する変数の部分がデッドに設定されている場合に該命令nを削除し、前記命令nが削除されなかった場合に、前記設定されたライブ情報のうち前記命令nが定義する部分をデッドに設定し、該デッドに設定されたライブ情報に基づき前記命令nが参照する部分を計算し、該計算により得られた参照部に基づき前記命令nを変更し、該変更で参照されたライブ情報のうち前記参照部をライブに設定する、各工程を含む。
【0012】
更に、本発明の第3の態様に係るコンピュータ読み取り可能な記録媒体は、命令nが定義する変数のライブ情報をビット単位で設定し、該設定されたライブ情報のうち前記命令nが定義する変数の部分がデッドに設定されている場合に該命令nを削除し、前記命令nが削除されなかった場合に、前記設定されたライブ情報のうち前記命令nが定義する部分をデッドに設定し、該デッドに設定されたライブ情報に基づき前記命令nが参照する部分を計算し、該計算により得られた参照部に基づき前記命令nを変更し、該変更で参照されたライブ情報のうち前記参照部をライブに設定する、ためのプログラムを記憶している。
【0013】
【発明の実施の形態】
以下、本発明の実施の形態を、図面を参照しながら説明する。
【0014】
図1は本発明の実施の形態に係るプログラム最適化処理装置が適用されるコンパイルシステムの機能ブロック図である。このコンパイルシステムは、コンパイラ10、ソースプログラムファイル20及びオブジェクトプログラムファイル30から構成されている。
【0015】
コンパイラ10は、通常は、例えばオブジェクトプログラムファイル30に格納されている。そして、このコンパイラ10が起動されることによってオブジェクトプログラムファイル30からCPUに接続されたメモリにロードされ、実行される。このコンパイラ10は、フロッピーディスクその他の記憶媒体に格納して他のコンピュータシステムで使用することができる。
【0016】
ソースプログラムファイル20は、例えば高級言語で記述されたソースプログラムを記憶する。オブジェクトプログラムファイル30は、コンパイラ10で生成された機械語のオブジェクトプログラムを記憶する。これらソースプログラムファイル20及びオブジェクトプログラムファイル30は、例えば、中央処理装置(CPU)に接続されたディスク上に形成することができる。
【0017】
上記コンパイラ10は、字句解析部11、構文解析部12、最適化部13及びコード生成部14から構成されている。字句解析部11は、ソースプログラムファイル20からソースプログラムを読み出して字句解析を行い、シンボルテーブルを作成する。構文解析部12は、字句解析部11からのシンボルテーブルに基づいてソースプログラムの構文解析を行い、中間言語を生成する。
【0018】
最適化部13は、構文解析部12で生成された中間言語に対して最適化処理を施す。具体的には、オブジェクトプログラムの実行速度を速くしたり、そのサイズを小さくするために、中間言語の削除、変更等を行う。この最適化部13の機能及び動作の詳細は後に説明する。
【0019】
コード生成部14は、最適化部13で最適化された中間言語に基づいてオブジェクトプログラムを生成する。このコード生成部14で生成されたオブジェクトプログラムは、オブジェクトプログラムファイル30に格納される。
【0020】
次に、上記最適化部13の機能の概略を説明する。この最適化部13は、詳細は後述するが、図2のフローチャートに示す機能を有する。
【0021】
この最適化部13には、分岐や合流が存在しない命令で構成された基本ブロックbが入力される。そして、最適化部13は、この基本ブロックbの最後の命令から先頭の命令の方向に遡りながら、以下の処理を行う。
【0022】
図2に示したフローチャートおける、命令nの定義する変数のライブ情報設定(ステップS303)、現在のライブ情報集合デッド設定(ステップS306)、命令nの参照部計算(ステップS307)及び現在のライブ情報集合ライブ設定(ステップS309)の各ステップで以下の事項を調査することにより、ライブ情報をビット単位で設定する。
【0023】
(1)注目する命令で定義される変数とその定義部分を、この命令より前では「デッド(参照されない)」とする。
(2)注目する命令で定義される変数の部分でライブである部分に影響する、参照される変数の部分を、この命令より前では「ライブ(参照される)」とする。入力される命令とライブ情報の関係を図3に示す。
【0024】
図2に示したフローチャートにおける最適化A(ステップS304)及び最適化B(ステップS308)で、このビット単位のライブ情報から次のような最適化が可能になる。
【0025】
(1)命令が定義する変数とその定義部分がライブでなければ、その命令は冗長であるので削除できる。図3の命令1がこのケースに相当する。
(2)命令が定義する変数のライブである部分から、そのライブである部分にだけ影響する即値オペランドの範囲が分かるので、命令をより小さいサイズに変更することができる。図3の命令2がこのケースに相当する。
【0026】
次に、上記最適化部13の詳細な機能及び動作を、図2に示したフローチャート及び図3に示した説明図を参照しながら説明する。なお、この最適化部13は、通常のコンパイラが有する最適化処理(説明は省略する)に加えて、図2のフローチャートに示す最適化処理を行う。
【0027】
入力される基本ブロックbは、図2に示すように、命令1、命令2及び命令3から構成されているものとする。命令1は符号拡張命令であり、「R<−sxh16,R」というシンボルで表される。この命令1は、変数Rの下位16ビットを残し、符号拡張して新たな変数Rを生成する機能を有する。また、命令2は演算命令であり、「R<−R xor 0xf0f0f0f0」というシンボルで表される。なお、第2オペランドの文字列の先頭に記載された「0x」は、それに続く文字列が16進数であることを表し、以下においても同じである。この命令2は、変数Rの内容と即値0xf0f0f0f0との排他的論理和演算を行って新たな変数Rを生成する機能を有する。更に、命令3はマスク命令であり、「R<−R and 0xff」というシンボルで表される。この命令3は、変数Rの内容と即値0xffとの論理積演算を行って新たな変数Rを生成する機能を有する。ここで、変数Rは32ビットで構成され、ビット名称は、LSBが「ビット0」、MSBが「ビット31」に定義されている。
【0028】
この最適化部13では、先ず、現在のライブ情報集合が設定される(ステップS301)。この処理では、基本ブロックbの最後の命令実行後のライブ情報が仮定される。初期状態では使用される全ての変数の全ての部分が参照されると仮定し、「ライブ」に設定される。以下、基本ブロックbの最後の命令から先頭の命令に向かって順次命令が注目される。現在のライブ情報集合は、或る命令が注目されている場合に、その時点のライブ情報である。図3に示す例では、基本ブロックbの中で利用される32ビットの変数Rの全ての部分がライブに設定される。
【0029】
次いで、基本ブロックbの最後の命令、つまり命令3が命令nとして指定される(ステップS302)。次いで、命令nが定義する変数のライブ情報が設定される(ステップS303)。この処理は、現在のライブ情報集合からライブ情報を得ることにより行われる。図3に示す例では、命令3が定義する変数Rのライブ情報は、32ビットの全てがライブに設定される。
【0030】
次いで、最適化Aが行われる(ステップS304)。この最適化Aでは、命令nの定義部分が全てデッドである場合、その命令nは冗長であると判断されて削除される。図3に示す例では、命令3が定義する上位24ビットに対応するライブ情報はライブに設定されているので、この命令3は削除されない。
【0031】
次いで、上記ステップS304の最適化Aで命令nが削除されたかどうかが調べられる(ステップS305)。ここで削除されたことが判断されると、シーケンスはステップS310へ分岐する。一方、削除されなかったことが判断されると、現在のライブ情報集合にデッドを設定する処理が行われる(ステップS306)。即ち、現在のライブ情報集合のうち、命令nが定義した部分がデッドに設定される。図3に示す例では、命令3によって変数Rの上位24ビットはゼロに定義されるので、現在のライブ情報集合は32ビットの全てがライブに設定された状態から、上位24ビットがデッドに設定され下位8ビットがライブに設定された状態に変化する。
【0032】
次いで、命令nの参照部計算が行われる(ステップS307)。ここでは、命令nが定義する変数でライブである部分に影響する部分を得るための計算が行われる。代表的な命令における「影響する部分」は次のように計算される。
【0033】
(1)加減算及び乗算では、定義する変数のライブである部分の最高位ビットから下位側が影響する参照部分になる。
(2)論理演算では、定義する変数のライブである部分と同じビット位置が影響する参照部分になる。
(3)シフト演算では、定数シフトのときは、定義する変数のライブである部分を、指定された方向と逆方向にシフトしたものが参照部分になる。
(4)可変シフトでは、右シフトであれば定義する変数のライブ部分の最低位ビットから上位側が参照部分になり、左シフトであれば定義する変数のライブ部分の最高位ビットから下位側が参照部分になる。
(5)符号拡張演算では、符号を示すビットが参照部分になる。
【0034】
なお、デフォルトは、参照する変数の全ての部分が参照されると仮定され、全ての部分がライブ部分になる。図3に示す例では、命令3には定義する変数でライブである部分に影響する参照部は存在しない。
【0035】
次いで、最適化Bが行われる(ステップS308)。この処理では、命令nの参照部計算で得られた「影響する部分」に基づいてオペランドやオペレーションコードをより冗長でない命令に最適化する処理が行われる。この最適化Bでは、即値オペランドを表すビット数を小さくできる。また、この命令nが定数に設定する部分だけが参照されるなら、命令を定数の代入に置き換えることができる。図3に示す例では、命令3に対する最適化は行われない。
【0036】
次いで、現在のライブ情報集合にライブが設定される(ステップS309)。即ち、命令nの参照部に対応する、現在のライブ情報集合の部分がライブに設定される。図3に示す例では、命令3に参照部がないのでなにも行われない。
【0037】
次いで、命令nが基本ブロックbの先頭の命令であるかどうかが調べられる(ステップS310)。そして、先頭の命令でないことが判断されると、基本ブロックb内の現在指定されている命令の1つ前の命令が命令nとして指定される(ステップS311)。その後、シーケンスはステップS303に分岐する。一方、先頭の命令であることが判断されると、この最適化処理は終了する。図3に示した例では、命令3は基本ブロックbの先頭の命令ではないので、ステップS303に戻り、次の命令2に対する最適化処理が行われる。
【0038】
即ち、命令nの定義する変数のライブ情報設定(ステップS303)では、命令2のライブ情報は、変数Rの下位8ビットのみ(命令3でデッドに設定された上位24ビットを除く)がライブに設定される。次の最適化A(ステップS304)では、命令2が定義する下位8ビット(0xf0のビットマスクで示される部分)に対応するライブ情報はライブに設定されているので、この命令2は削除されない。次のステップS305では、削除されなかったことが判断されるので、シーケンスはステップS306に進む。
【0039】
次の現在のライブ情報集合デッド設定(ステップS306)では、現在のライブ情報集合に0xf0f0f0f0を2進数で表した場合に「1」で示される部分がデッドに設定される。次の命令nの参照部計算(ステップS307)では、変数Rの0xf0f0f0f0を2進数で表した場合の「1」で示される部分が参照部とされる。
【0040】
次の最適化B(ステップS308)では、上位24ビットは参照されない(デッドである)ことが分かるので、より小さなコードにするために、オペランドが0xf0の8ビットに縮められる。これにより、小さいサイズの演算命令を使用することができる。
【0041】
次の現在のライブ情報集合ライブ設定(ステップS309)では、現在のライブ情報集合に変数Rの中の0xf0のビットマスクで示される部分がライブに設定される。その結果、下位8ビットがライブになる。次いで、ステップS310で、命令nが基本ブロックbの先頭の命令であるかどうかが調べられるが、命令2は基本ブロックbの先頭の命令ではないので、ステップS303に戻り、次の命令1に対する最適化処理が行われる。
【0042】
即ち、命令nの定義する変数のライブ情報設定(ステップS303)では、命令1のライブ情報は、変数Rの下位8ビットのみがライブに設定される。次に行われる最適化A(ステップS304)では、命令1はビット15を参照して上位16ビットを定義するが、この上位16ビットの部分はデッドである。従って、命令1は冗長な命令であるとして削除される。
【0043】
次のステップS305では、削除されたことが判断されるので、シーケンスはステップS310に進む。次いで、ステップS310で、命令nが基本ブロックbの先頭の命令であるかどうかが調べられ、命令1は基本ブロックbの先頭の命令であるので、最適化処理が終了する。
【0044】
次に、本発明の他の実施の形態について説明する。この他の実施の形態では、基本ブロックを越えて関数全体のビット単位のライブ情報が取得される。
【0045】
図2に示したフローチャートの現在のライブ情報集合設定(ステップS301)では、初期状態では、使用される全ての変数の全ての部分が参照されると仮定し、「ライブ」に設定される。そして、関数内の各基本ブロックについてライブ情報が取得される。
【0046】
これは、以下のようにして行われる。即ち、基本ブロックとフローが継っている他の基本ブロック先頭のライブ情報からライブである部分を集めた値Aが、先に現在のライブ情報集合設定(ステップS301)で設定した値と、同じ値に収束するまで、値Aを現在のライブ情報集合設定(ステップS301)で設定し、基本ブロックのライブ情報を取得を繰り返す。
【0047】
以上説明した本発明の実施の形態に係るプログラム最適化装置によれば、ソースプログラムを構成する命令の動作に基づいてビット単位でライブ情報を得るように構成されているので、より詳しい情報が得られる。その結果、ソースプログラム中の命令の削除や変更をきめ細かく制御できるので、オブジェクトプログラムの実行時間の高速化及びそのオブジェクトプログラムのサイズの減少化に寄与するところが大きい。
【0048】
【発明の効果】
以上詳述したように、本発明によれば、オブジェクトプログラムの実行時間を高速にすることができ、しかもそのオブジェクトプログラムのサイズを小さくできるプログラム最適化処理装置及びプログラム最適化方法を提供できる。
【図面の簡単な説明】
【図1】本発明の実施の形態に係るプログラム最適化処理装置が適用されるコンパイルシステムの機能ブロック図である。
【図2】図1に示した最適化部の動作を説明するためのフローチャートである。
【図3】本発明の実施の形態に係るプログラム最適化処理装置において、入力される命令とライブ情報の関係を示す説明図である。
【符号の説明】
10 コンパイラ
11 字句解析部
12 構文解析部
13 最適化部
14 コード生成部
20 ソースプログラムファイル
30 オブジェクトプログラムファイル
【発明の属する技術分野】
本発明は、プログラム最適化処理装置及びプログラム最適化方法に関する。
【0002】
【従来の技術】
従来、ソースプログラムをコンパイルする際に、コンパイルの結果として得られるオブジェクトプログラムの冗長性を減らすために最適化が行われている。このような最適化を行う方法として、例えば特開昭62-269238号公報は「コンパイル方式」を開示している。このコンパイル方式は、高級言語の整数型の式のコンパイルに適用され、式の各要素の取り得る値の範囲をビット数と符号で表すことによって、被演算子を拡張するための符号拡張命令のような余分な拡張命令をオブジェクトプログラムから除くことにより最適化を行う。
【0003】
また、特開昭63−25733号公報は「コンパイラ処理方式」を開示している。このコンパイラ処理方式は、プログラム内に出現する右辺が多項式の代入文によって定義される変数の使用が唯一であることを調べ、唯一であるという条件下において多項式のコピー伝播を行うことでそのコピー文を削除する。これにより、レジスタ割付対象変数を削減し、レジスタに保持できる変数を増加させることでオブジェクトプログラムの実行性能を向上させている。
【0004】
また、特開平7−168719号公報は「冗長式除去装置」を開示している。この冗長式除去装置は、プログラムの書き換え前後のコスト(最終的に作成する機械語プログラムの実行時間及びメモリサイズ)を比較した上で、プログラム中の演算を書き換え、冗長となる演算式を除去する。
【0005】
また、特開平9−6627号公報は「最適化装置」を開示している。この最適化装置は、定数保持変数定義検出部、使用式検出部により定数保持変数の定義及び使用情報を定数保持変数情報保持部に格納し、部分定数式書き換え部が、変数を定数に書き換えればその変数を含む式を定数に畳み込むことができる定数保持変数を定数に書き換え、コスト判定書き換え部が変数をレジスタに載せて使用するか、定数伝播するかを判断して、定数伝播する場合に変数を定数で書き換え、資源割り付け部が変数に資源を割り当て、メモリ変数書き換え部12がメモリに割り付けられた定数保持変数を定数値に書き換え、定数保持変数定義除去部が不要となった定数保持変数の定義を除去する。
【0006】
また、特開平10−289102号公報は「プログラムのデータフロー解析装置」を開示している。このプログラムのデータフロー解析装置では、C言語の標準ライブラリに含まれる手続のように仕様が明らかになっているライブラリに含まれる各手続きについて、その仕様から、データ依存関係を予め調べておいて、その結果だけを記述した定義/参照情報格納ファイルを用意する。ある手続きの呼び出しがあったらこのテーブルを参照し、「定義」であるのか、「参照」であるのかという情報を抽出する。これにより、ソースプログラムの内容を見ることができない手続きを含むプログラムについてもデータフロー解析を可能とし、また、ソースプログラムを見ることができる手続きを含むプログラムであってもそのデータフロー解析に要する時間を短縮することができる。
【0007】
更に、特開平11−212800号公報は「移送命令最適化装置および方法」を開示している。この移送命令最適化装置および方法は、移送命令を削除する複写伝播処理手段で削除できない移送命令に対して、該移送命令の右辺オペランドの値を決定する定義命令と移送命令を見つけ、その定義命令と移送命令の間に移送命令で使用するオペランドの使用がないことを判定し、移送命令以後の命令における移送命令の右辺オペランドの参照を左辺オペランドで置換し、最後に定義命令の左辺オペランドを移送命令の左辺オペランドで置換して移送命令を削除する。これにより、移送命令を含む命令列あるいは、中間テキスト列において、移送命令の右辺の定義命令が現れても移送命令を削除することができる。
【0008】
【発明が解決しようとする課題】
しかしながら、上記特開昭62-269238号公報に開示されたコンパイル方式では、数値の範囲は変数型に基づいて得られるので、ソースプログラムに記述されている情報を越えた判断はできない。また、この特開昭62-269238号公報以外の公報も最適化の技術を開示しているが、何れも以下に説明する本発明とは異なる手法で最適化を行っている。
【0009】
本発明の目的は、オブジェクトプログラムの実行時間を高速にすることができ、しかもそのオブジェクトプログラムのサイズを小さくできるログラム最適化処理装置及びプログラム最適化方法を提供することにある。
【0010】
【課題を解決するための手段】
本発明の第1の態様に係るプログラム最適化処理装置は、上記目的を達成するために、命令nが定義する変数のライブ情報をビット単位で設定するライブ情報設定手段と、前記ライブ情報設定手段で設定されたライブ情報のうち前記命令nが定義する変数の部分がデッドに設定されている場合に該命令nを削除する第1最適化手段と、前記第1最適化手段で前記命令nが削除されなかった場合に、前記ライブ情報設定手段で設定されたライブ情報のうち前記命令nが定義する部分をデッドに設定するデッド設定手段と、前記デッド設定手段でデッドに設定されたライブ情報に基づき前記命令nが参照する部分を計算する参照部計算手段と、前記参照部計算手段での計算により得られた参照部に基づき前記命令nを変更する第2最適化手段と、前記第2最適化手段で使用されたライブ情報のうち前記参照部をライブに設定するライブ設定手段、とを備えている。
【0011】
また、本発明の第2の態様に係るプログラム最適化処理方法は、命令nが定義する変数のライブ情報をビット単位で設定し、該設定されたライブ情報のうち前記命令nが定義する変数の部分がデッドに設定されている場合に該命令nを削除し、前記命令nが削除されなかった場合に、前記設定されたライブ情報のうち前記命令nが定義する部分をデッドに設定し、該デッドに設定されたライブ情報に基づき前記命令nが参照する部分を計算し、該計算により得られた参照部に基づき前記命令nを変更し、該変更で参照されたライブ情報のうち前記参照部をライブに設定する、各工程を含む。
【0012】
更に、本発明の第3の態様に係るコンピュータ読み取り可能な記録媒体は、命令nが定義する変数のライブ情報をビット単位で設定し、該設定されたライブ情報のうち前記命令nが定義する変数の部分がデッドに設定されている場合に該命令nを削除し、前記命令nが削除されなかった場合に、前記設定されたライブ情報のうち前記命令nが定義する部分をデッドに設定し、該デッドに設定されたライブ情報に基づき前記命令nが参照する部分を計算し、該計算により得られた参照部に基づき前記命令nを変更し、該変更で参照されたライブ情報のうち前記参照部をライブに設定する、ためのプログラムを記憶している。
【0013】
【発明の実施の形態】
以下、本発明の実施の形態を、図面を参照しながら説明する。
【0014】
図1は本発明の実施の形態に係るプログラム最適化処理装置が適用されるコンパイルシステムの機能ブロック図である。このコンパイルシステムは、コンパイラ10、ソースプログラムファイル20及びオブジェクトプログラムファイル30から構成されている。
【0015】
コンパイラ10は、通常は、例えばオブジェクトプログラムファイル30に格納されている。そして、このコンパイラ10が起動されることによってオブジェクトプログラムファイル30からCPUに接続されたメモリにロードされ、実行される。このコンパイラ10は、フロッピーディスクその他の記憶媒体に格納して他のコンピュータシステムで使用することができる。
【0016】
ソースプログラムファイル20は、例えば高級言語で記述されたソースプログラムを記憶する。オブジェクトプログラムファイル30は、コンパイラ10で生成された機械語のオブジェクトプログラムを記憶する。これらソースプログラムファイル20及びオブジェクトプログラムファイル30は、例えば、中央処理装置(CPU)に接続されたディスク上に形成することができる。
【0017】
上記コンパイラ10は、字句解析部11、構文解析部12、最適化部13及びコード生成部14から構成されている。字句解析部11は、ソースプログラムファイル20からソースプログラムを読み出して字句解析を行い、シンボルテーブルを作成する。構文解析部12は、字句解析部11からのシンボルテーブルに基づいてソースプログラムの構文解析を行い、中間言語を生成する。
【0018】
最適化部13は、構文解析部12で生成された中間言語に対して最適化処理を施す。具体的には、オブジェクトプログラムの実行速度を速くしたり、そのサイズを小さくするために、中間言語の削除、変更等を行う。この最適化部13の機能及び動作の詳細は後に説明する。
【0019】
コード生成部14は、最適化部13で最適化された中間言語に基づいてオブジェクトプログラムを生成する。このコード生成部14で生成されたオブジェクトプログラムは、オブジェクトプログラムファイル30に格納される。
【0020】
次に、上記最適化部13の機能の概略を説明する。この最適化部13は、詳細は後述するが、図2のフローチャートに示す機能を有する。
【0021】
この最適化部13には、分岐や合流が存在しない命令で構成された基本ブロックbが入力される。そして、最適化部13は、この基本ブロックbの最後の命令から先頭の命令の方向に遡りながら、以下の処理を行う。
【0022】
図2に示したフローチャートおける、命令nの定義する変数のライブ情報設定(ステップS303)、現在のライブ情報集合デッド設定(ステップS306)、命令nの参照部計算(ステップS307)及び現在のライブ情報集合ライブ設定(ステップS309)の各ステップで以下の事項を調査することにより、ライブ情報をビット単位で設定する。
【0023】
(1)注目する命令で定義される変数とその定義部分を、この命令より前では「デッド(参照されない)」とする。
(2)注目する命令で定義される変数の部分でライブである部分に影響する、参照される変数の部分を、この命令より前では「ライブ(参照される)」とする。入力される命令とライブ情報の関係を図3に示す。
【0024】
図2に示したフローチャートにおける最適化A(ステップS304)及び最適化B(ステップS308)で、このビット単位のライブ情報から次のような最適化が可能になる。
【0025】
(1)命令が定義する変数とその定義部分がライブでなければ、その命令は冗長であるので削除できる。図3の命令1がこのケースに相当する。
(2)命令が定義する変数のライブである部分から、そのライブである部分にだけ影響する即値オペランドの範囲が分かるので、命令をより小さいサイズに変更することができる。図3の命令2がこのケースに相当する。
【0026】
次に、上記最適化部13の詳細な機能及び動作を、図2に示したフローチャート及び図3に示した説明図を参照しながら説明する。なお、この最適化部13は、通常のコンパイラが有する最適化処理(説明は省略する)に加えて、図2のフローチャートに示す最適化処理を行う。
【0027】
入力される基本ブロックbは、図2に示すように、命令1、命令2及び命令3から構成されているものとする。命令1は符号拡張命令であり、「R<−sxh16,R」というシンボルで表される。この命令1は、変数Rの下位16ビットを残し、符号拡張して新たな変数Rを生成する機能を有する。また、命令2は演算命令であり、「R<−R xor 0xf0f0f0f0」というシンボルで表される。なお、第2オペランドの文字列の先頭に記載された「0x」は、それに続く文字列が16進数であることを表し、以下においても同じである。この命令2は、変数Rの内容と即値0xf0f0f0f0との排他的論理和演算を行って新たな変数Rを生成する機能を有する。更に、命令3はマスク命令であり、「R<−R and 0xff」というシンボルで表される。この命令3は、変数Rの内容と即値0xffとの論理積演算を行って新たな変数Rを生成する機能を有する。ここで、変数Rは32ビットで構成され、ビット名称は、LSBが「ビット0」、MSBが「ビット31」に定義されている。
【0028】
この最適化部13では、先ず、現在のライブ情報集合が設定される(ステップS301)。この処理では、基本ブロックbの最後の命令実行後のライブ情報が仮定される。初期状態では使用される全ての変数の全ての部分が参照されると仮定し、「ライブ」に設定される。以下、基本ブロックbの最後の命令から先頭の命令に向かって順次命令が注目される。現在のライブ情報集合は、或る命令が注目されている場合に、その時点のライブ情報である。図3に示す例では、基本ブロックbの中で利用される32ビットの変数Rの全ての部分がライブに設定される。
【0029】
次いで、基本ブロックbの最後の命令、つまり命令3が命令nとして指定される(ステップS302)。次いで、命令nが定義する変数のライブ情報が設定される(ステップS303)。この処理は、現在のライブ情報集合からライブ情報を得ることにより行われる。図3に示す例では、命令3が定義する変数Rのライブ情報は、32ビットの全てがライブに設定される。
【0030】
次いで、最適化Aが行われる(ステップS304)。この最適化Aでは、命令nの定義部分が全てデッドである場合、その命令nは冗長であると判断されて削除される。図3に示す例では、命令3が定義する上位24ビットに対応するライブ情報はライブに設定されているので、この命令3は削除されない。
【0031】
次いで、上記ステップS304の最適化Aで命令nが削除されたかどうかが調べられる(ステップS305)。ここで削除されたことが判断されると、シーケンスはステップS310へ分岐する。一方、削除されなかったことが判断されると、現在のライブ情報集合にデッドを設定する処理が行われる(ステップS306)。即ち、現在のライブ情報集合のうち、命令nが定義した部分がデッドに設定される。図3に示す例では、命令3によって変数Rの上位24ビットはゼロに定義されるので、現在のライブ情報集合は32ビットの全てがライブに設定された状態から、上位24ビットがデッドに設定され下位8ビットがライブに設定された状態に変化する。
【0032】
次いで、命令nの参照部計算が行われる(ステップS307)。ここでは、命令nが定義する変数でライブである部分に影響する部分を得るための計算が行われる。代表的な命令における「影響する部分」は次のように計算される。
【0033】
(1)加減算及び乗算では、定義する変数のライブである部分の最高位ビットから下位側が影響する参照部分になる。
(2)論理演算では、定義する変数のライブである部分と同じビット位置が影響する参照部分になる。
(3)シフト演算では、定数シフトのときは、定義する変数のライブである部分を、指定された方向と逆方向にシフトしたものが参照部分になる。
(4)可変シフトでは、右シフトであれば定義する変数のライブ部分の最低位ビットから上位側が参照部分になり、左シフトであれば定義する変数のライブ部分の最高位ビットから下位側が参照部分になる。
(5)符号拡張演算では、符号を示すビットが参照部分になる。
【0034】
なお、デフォルトは、参照する変数の全ての部分が参照されると仮定され、全ての部分がライブ部分になる。図3に示す例では、命令3には定義する変数でライブである部分に影響する参照部は存在しない。
【0035】
次いで、最適化Bが行われる(ステップS308)。この処理では、命令nの参照部計算で得られた「影響する部分」に基づいてオペランドやオペレーションコードをより冗長でない命令に最適化する処理が行われる。この最適化Bでは、即値オペランドを表すビット数を小さくできる。また、この命令nが定数に設定する部分だけが参照されるなら、命令を定数の代入に置き換えることができる。図3に示す例では、命令3に対する最適化は行われない。
【0036】
次いで、現在のライブ情報集合にライブが設定される(ステップS309)。即ち、命令nの参照部に対応する、現在のライブ情報集合の部分がライブに設定される。図3に示す例では、命令3に参照部がないのでなにも行われない。
【0037】
次いで、命令nが基本ブロックbの先頭の命令であるかどうかが調べられる(ステップS310)。そして、先頭の命令でないことが判断されると、基本ブロックb内の現在指定されている命令の1つ前の命令が命令nとして指定される(ステップS311)。その後、シーケンスはステップS303に分岐する。一方、先頭の命令であることが判断されると、この最適化処理は終了する。図3に示した例では、命令3は基本ブロックbの先頭の命令ではないので、ステップS303に戻り、次の命令2に対する最適化処理が行われる。
【0038】
即ち、命令nの定義する変数のライブ情報設定(ステップS303)では、命令2のライブ情報は、変数Rの下位8ビットのみ(命令3でデッドに設定された上位24ビットを除く)がライブに設定される。次の最適化A(ステップS304)では、命令2が定義する下位8ビット(0xf0のビットマスクで示される部分)に対応するライブ情報はライブに設定されているので、この命令2は削除されない。次のステップS305では、削除されなかったことが判断されるので、シーケンスはステップS306に進む。
【0039】
次の現在のライブ情報集合デッド設定(ステップS306)では、現在のライブ情報集合に0xf0f0f0f0を2進数で表した場合に「1」で示される部分がデッドに設定される。次の命令nの参照部計算(ステップS307)では、変数Rの0xf0f0f0f0を2進数で表した場合の「1」で示される部分が参照部とされる。
【0040】
次の最適化B(ステップS308)では、上位24ビットは参照されない(デッドである)ことが分かるので、より小さなコードにするために、オペランドが0xf0の8ビットに縮められる。これにより、小さいサイズの演算命令を使用することができる。
【0041】
次の現在のライブ情報集合ライブ設定(ステップS309)では、現在のライブ情報集合に変数Rの中の0xf0のビットマスクで示される部分がライブに設定される。その結果、下位8ビットがライブになる。次いで、ステップS310で、命令nが基本ブロックbの先頭の命令であるかどうかが調べられるが、命令2は基本ブロックbの先頭の命令ではないので、ステップS303に戻り、次の命令1に対する最適化処理が行われる。
【0042】
即ち、命令nの定義する変数のライブ情報設定(ステップS303)では、命令1のライブ情報は、変数Rの下位8ビットのみがライブに設定される。次に行われる最適化A(ステップS304)では、命令1はビット15を参照して上位16ビットを定義するが、この上位16ビットの部分はデッドである。従って、命令1は冗長な命令であるとして削除される。
【0043】
次のステップS305では、削除されたことが判断されるので、シーケンスはステップS310に進む。次いで、ステップS310で、命令nが基本ブロックbの先頭の命令であるかどうかが調べられ、命令1は基本ブロックbの先頭の命令であるので、最適化処理が終了する。
【0044】
次に、本発明の他の実施の形態について説明する。この他の実施の形態では、基本ブロックを越えて関数全体のビット単位のライブ情報が取得される。
【0045】
図2に示したフローチャートの現在のライブ情報集合設定(ステップS301)では、初期状態では、使用される全ての変数の全ての部分が参照されると仮定し、「ライブ」に設定される。そして、関数内の各基本ブロックについてライブ情報が取得される。
【0046】
これは、以下のようにして行われる。即ち、基本ブロックとフローが継っている他の基本ブロック先頭のライブ情報からライブである部分を集めた値Aが、先に現在のライブ情報集合設定(ステップS301)で設定した値と、同じ値に収束するまで、値Aを現在のライブ情報集合設定(ステップS301)で設定し、基本ブロックのライブ情報を取得を繰り返す。
【0047】
以上説明した本発明の実施の形態に係るプログラム最適化装置によれば、ソースプログラムを構成する命令の動作に基づいてビット単位でライブ情報を得るように構成されているので、より詳しい情報が得られる。その結果、ソースプログラム中の命令の削除や変更をきめ細かく制御できるので、オブジェクトプログラムの実行時間の高速化及びそのオブジェクトプログラムのサイズの減少化に寄与するところが大きい。
【0048】
【発明の効果】
以上詳述したように、本発明によれば、オブジェクトプログラムの実行時間を高速にすることができ、しかもそのオブジェクトプログラムのサイズを小さくできるプログラム最適化処理装置及びプログラム最適化方法を提供できる。
【図面の簡単な説明】
【図1】本発明の実施の形態に係るプログラム最適化処理装置が適用されるコンパイルシステムの機能ブロック図である。
【図2】図1に示した最適化部の動作を説明するためのフローチャートである。
【図3】本発明の実施の形態に係るプログラム最適化処理装置において、入力される命令とライブ情報の関係を示す説明図である。
【符号の説明】
10 コンパイラ
11 字句解析部
12 構文解析部
13 最適化部
14 コード生成部
20 ソースプログラムファイル
30 オブジェクトプログラムファイル
Claims (6)
- 命令nが定義する変数のライブ情報をビット単位で設定するライブ情報設定手段と、
前記ライブ情報設定手段で設定されたライブ情報のうち前記命令nが定義する変数の部分がデッドに設定されている場合に該命令nを削除する第1最適化手段と、
前記第1最適化手段で前記命令nが削除されなかった場合に、前記ライブ情報設定手段で設定されたライブ情報のうち前記命令nが定義する部分をデッドに設定するデッド設定手段と、
前記デッド設定手段でデッドに設定されたライブ情報に基づき前記命令nが参照する部分を計算する参照部計算手段と、
前記参照部計算手段での計算により得られた参照部に基づき前記命令nを変更する第2最適化手段と、
前記第2最適化手段で使用されたライブ情報のうち前記参照部をライブに設定するライブ設定手段、
とを備えたプログラム最適化処理装置。 - 請求項1において、更に、
分岐及び合流が存在しない複数の命令で構成された基本ブロックと、
前記基本ブロックの最後の命令から先頭の命令に向かって順次取り出す取出手段、とを含み、
前記命令nは、前記取出手段から供給されるプログラム最適化処理装置。 - 命令nが定義する変数のライブ情報をビット単位で設定し、
該設定されたライブ情報のうち前記命令nが定義する変数の部分がデッドに設定されている場合に該命令nを削除し、
前記命令nが削除されなかった場合に、前記設定されたライブ情報のうち前記命令nが定義する部分をデッドに設定し、
該デッドに設定されたライブ情報に基づき前記命令nが参照する部分を計算し、
該計算により得られた参照部に基づき前記命令nを変更し、
該変更で参照されたライブ情報のうち前記参照部をライブに設定する、プログラム最適化方法。 - 請求項3において、更に、
分岐及び合流が存在しない複数の命令で構成された基本ブロックの最後の命令から先頭の命令に向かって順次取り出す工程、とを含み、
該取り出された命令を前記命令nとして供給するプログラム最適化処理方法。 - 命令nが定義する変数のライブ情報をビット単位で設定し、
該設定されたライブ情報のうち前記命令nが定義する変数の部分がデッドに設定されている場合に該命令nを削除し、
前記命令nが削除されなかった場合に、前記設定されたライブ情報のうち前記命令nが定義する部分をデッドに設定し、
該デッドに設定されたライブ情報に基づき前記命令nが参照する部分を計算し、
該計算により得られた参照部に基づき前記命令nを変更し、
該変更で参照されたライブ情報のうち前記参照部をライブに設定する、ためのプログラムを記憶したコンピュータ読み取り可能な記録媒体。 - 請求項5において、更に、
分岐及び合流が存在しない複数の命令で構成された基本ブロックの最後の命令から先頭の命令に向かって順次取り出す工程、とを含み、
該取り出された命令を前記命令nとして供給する、ためのプログラムを記憶したコンピュータ読み取り可能な記録媒体。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2000040659A JP3542538B2 (ja) | 2000-02-18 | 2000-02-18 | プログラム最適化処理装置及びプログラム最適化方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2000040659A JP3542538B2 (ja) | 2000-02-18 | 2000-02-18 | プログラム最適化処理装置及びプログラム最適化方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
JP2001229030A JP2001229030A (ja) | 2001-08-24 |
JP3542538B2 true JP3542538B2 (ja) | 2004-07-14 |
Family
ID=18564008
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
JP2000040659A Expired - Fee Related JP3542538B2 (ja) | 2000-02-18 | 2000-02-18 | プログラム最適化処理装置及びプログラム最適化方法 |
Country Status (1)
Country | Link |
---|---|
JP (1) | JP3542538B2 (ja) |
Families Citing this family (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JP5039948B2 (ja) * | 2007-10-30 | 2012-10-03 | インターナショナル・ビジネス・マシーンズ・コーポレーション | プログラムを最適化するコンパイラ |
-
2000
- 2000-02-18 JP JP2000040659A patent/JP3542538B2/ja not_active Expired - Fee Related
Also Published As
Publication number | Publication date |
---|---|
JP2001229030A (ja) | 2001-08-24 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
JP3896087B2 (ja) | コンパイラ装置およびコンパイル方法 | |
JP3327818B2 (ja) | プログラム変換装置及び記録媒体 | |
US5790760A (en) | Program generating apparatus and method thereof | |
JP5967618B2 (ja) | 二進化十進数型変数へのアクセスを有する言語のバイナリコードを最適化する方法、並びにそのコンピュータ及びコンピュータ・プログラム | |
US7917899B2 (en) | Program development apparatus, method for developing a program, and a computer program product for executing an application for a program development apparatus | |
JP2004070531A (ja) | コンパイラ用プログラム、コンパイラ装置及びコンパイル方法 | |
JP3765923B2 (ja) | ハードウェア合成方法およびハードウェア合成装置並びにハードウェア合成プログラムを記録した記録媒体 | |
JPH0926884A (ja) | バイナリ操作を必要とするタスク中に必要なフロー情報を使用可能とする方法および装置 | |
JP3909073B2 (ja) | コンパイラ及び論理回路の設計方法 | |
US6308324B1 (en) | Multi-stage profiler | |
JP4045802B2 (ja) | プログラム処理装置及びプログラム処理方法、記憶媒体、並びにコンピュータ・プログラム | |
JP2008276735A (ja) | プログラムコード変換装置及びプログラムコード変換方法 | |
JP6481515B2 (ja) | 情報処理装置、コンパイル方法、及びコンパイラプログラム | |
JP3542538B2 (ja) | プログラム最適化処理装置及びプログラム最適化方法 | |
JP2012014526A (ja) | プログラムコードの構造変換装置、並びにコード構造変換プログラム | |
JP3840149B2 (ja) | コンパイラ、演算処理システム及び演算処理方法 | |
JP7407192B2 (ja) | フィールド・プログラマブル・ゲート・アレイのためのコードを最適化する方法および装置 | |
JPH10320212A (ja) | キャッシュ向け最適化方法 | |
Leupers | Novel code optimization techniques for DSPs | |
Ordaz et al. | On the hls design of bit-level operations and custom data types | |
JP2004013190A (ja) | ソフトウエア開発環境、シミュレータ及び記録媒体 | |
Ferreira | Restructuring Software Code for High-Level Synthesis Using a Graph-based Approach Targeting FPGAs | |
EP3827336B1 (en) | Method and apparatus for optimizing code for field programmable gate arrays | |
JP2000056981A (ja) | プログラム変換装置 | |
Richter-Gottfried et al. | FPGA-aware Transformations of LLVM-IR |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
TRDD | Decision of grant or rejection written | ||
A01 | Written decision to grant a patent or to grant a registration (utility model) |
Free format text: JAPANESE INTERMEDIATE CODE: A01 Effective date: 20040304 |
|
A61 | First payment of annual fees (during grant procedure) |
Free format text: JAPANESE INTERMEDIATE CODE: A61 Effective date: 20040331 |
|
R150 | Certificate of patent or registration of utility model |
Free format text: JAPANESE INTERMEDIATE CODE: R150 |
|
LAPS | Cancellation because of no payment of annual fees |