(57)【特許請求の範囲】
【請求項１】
プログラム言語で書かれたプログラムを機械語プログラムに翻訳するコンパイラに備えられ、プログラム言語で書かれたプログラムの最適化を行って最適化後のプログラムを出力する最適化装置であって、
プログラム中の定数が代入される変数である各定数保持変数について、その定数保持変数に定数を代入している式と、その定数保持変数を被演算子にしている式とを対応づけて定数保持変数の関連式集合として管理する管理手段と、
関連式集合中の定数保持変数を被演算子としている式のうち他の被演算子が全て定数である式、及び、定数保持変数を被演算子とした単項演算である式を、定数保持変数が保持する定数を被演算子とした式に書き換える第１の書換手段と、
第１の書換手段による書き換えの後、定数に書き換えられなかった定数保持変数を、その保持する定数即値データに置き換えて機械語演算の被演算子にした場合に、その定数保持変数の関連式集合の内、定数保持変数を被演算子としている式から生ずる機械語命令列の実行サイクルおよび／又はコードサイズを、その定数のバイト長に基づいて推定する第１の推定手段と、
第１の書換手段による書き換えの後、定数に書き換えられなかった定数保持変数が保持する定数を格納したレジスタを機械語演算の被演算子にした場合に、その定数保持変数の関連式集合の内、定数保持変数に定数を代入している式及び定数保持変数を被演算子としている式から生ずる機械語命令列の実行サイクルおよび／又はコードサイズを推定する第２の推定手段と、
第１の推定手段の推定結果と第２の推定手段の推定結果とを各関連式集合毎に比較する比較手段と、
比較手段による比較の結果、第１の推定手段の推定結果が第２の推定手段の推定結果以下の関連式集合はその中で被演算子になっている定数保持変数を全てその定数に書き換える第２の書換手段と
定数保持変数を被演算子として用いる式が全て定数保持変数が保持する定数値を被演算子として用いる式に書き換えられた場合に、当該定数保持変数に定数を代入している式を削除する第３の書換手段と
を備えることを特徴とする最適化装置。
【請求項２】
最適化装置は更に、
第１及び第２の書換手段による書き換えによって全ての被演算子が定数になった式をそれらの被演算子による演算結果を代入する式に書き換える第４の書換手段と、
第４の書換手段による書き換えによって生じた式で演算結果が代入されることになる新たな定数保持変数と、その定数保持変数に定数を代入している式と、その定数保持変数を被演算子にしている全ての式とを各定数保持変数の関連式集合として管理手段に管理させる制御手段と、
管理手段に新たに管理された関連式集合に対して、第１の書換手段を起動する起動手段と
を備えることを特徴とする請求項１記載の最適化装置。
【請求項３】
最適化装置は更に、
第２の書換手段による書き換え及び削除の後、各変数間の生存区間の重なり具合や各変数の使用頻度に基づいて、プログラム中の各変数をレジスタ又はメモリに割り付ける資源割付手段と、
資源割付手段によってメモリに割り付けられた変数のうち、定数保持変数であるものを判定し、判定された定数保持変数の関連式集合において被演算子になっている定数保持変数を全てその定数に書き換える第５の書換手段と、
を備えることを特徴とする請求項１又は２記載の最適化装置。
【請求項４】
最適化装置は、
複数個の機械語命令と、各機械語命令の実行サイクルおよび／又はコードサイズを示すコストとを対応づけて記憶するコスト記憶手段を備え、
第１の推定手段は、
第１の書換手段による書き換え後、関連式集合において定数保持変数を被演算子にしている各式を、定数保持変数を、その保持する値である定数を表す即値データとして被演算子とした機械語命令に置き換える第１の置き換え手段と、
置き換えられた各機械語命令に対応するコストをコスト記憶手段から読み出し、読み出したコストを集計し、集計結果を推定結果とする第１の集計手段
を備え
第２の推定手段は、
第１の書換手段による書き換え後、関連式集合において定数保持変数に定数を代入する式及び定数保持変数を被演算子にしている各式を、その定数を格納したレジスタを被演算子とした機械語命令に置き換える第２の置き換え手段と、
置き換えられた各機械語命令に対応するコストをコスト記憶手段から読み出し、読み出したコストを集計し、集計結果を推定結果とする第２の集計手段
を備えることを特徴とする請求項１〜３記載の何れかの最適化装置。
【発明の詳細な説明】
【０００１】
【産業上の利用分野】
本発明は、高級言語で書かれたソースプログラムを機械語プログラムに翻訳するコンパイラに備えられ、高効率の機械語プログラムを生成できるように、ソースプログラムあるいは中間言語プログラムを最適化する最適化装置に関する。
【０００２】
【従来の技術】
近年高級言語を用いてソースプログラムを記述することで、機械語プログラムの開発効率を向上させることが盛んに行われている。高級言語を用いて記述されたソースプログラムはコンパイラによって機械語プログラムに翻訳される。このコンパイラは最適化装置を備えており、プログラミング言語で記述されたプログラムはこの最適化装置によってターゲットマシンのMPU上で効率良く実行できるように書き換えられる
一方、機械語プログラムは、より高効率なものが求められるので、上記の最適化装置は、最終的に作成される機械語プログラムの総実行時間をより短く、総プログラムサイズをより小さくするためにも、プログラムに対して様々な書き換えを行う（尚、最終的に作成される機械語プログラムの実行時間、あるいは、機械語プログラムのメモリサイズはコストと総称される。）。
【０００３】
最適化装置によって行われる処理のうち、プログラムの書き換えによって機械語プログラムの実行時間、メモリサイズの向上を図る処理の一つに定数の伝播処理及び畳み込み処理がある。これらの処理を交互に繰り返せば、最適化装置はプログラムの中の式の数を大きく減らすことができる。この様子を図１３（ａ）〜（ｆ）の説明図を参照しながら説明する。
【０００４】
図１３（ａ）は、中間言語状態のプログラムを示している。本図において左端に付された記号ｓ１、ｓ２、ｓ３・・・で、プログラム中の各位置を指示している。本図において”ａ＋ｘ”、”20000＋ａ”のように、定数または変数である被演算子、および演算子から構成されるプログラムのコードは、演算式と称される。また”ａ”、”20000”のように定数または変数のみからなる式も演算式とする。
【０００５】
また、図１３（ｂ）中の”ａ１＝ａ＋ｘ”のように、等号の左辺に変数、右辺に演算式を持つプログラムのコード、あるいは、”ａ＝ｂ”のように、右辺が変数または定数である一連のコードは代入式と呼ばれる。更に、図１３（ｂ）の位置ｓ４にある全ての被演算子が定数である代入式”20000＋10000”は、特に定数式と呼ばれる。
【０００６】
加えて、代入式により、等号の左辺に記述される変数に、右辺の値を代入することを変数の定義という。演算式の被演算子として変数を用いることを変数の使用という。また、”ａ＝ｂ”のように、変数が代入式の右辺に現れることも使用という。
本図１３（ａ）において、位置ｓ１の代入式では、変数ａに定数10000を代入している。このように、定数が代入される変数は定数保持変数と称される。この変数ａからは４本の矢印が伸び、それらの矢先にも変数ａがあるが、これは変数ａが被演算子として使用されている演算式を指示している。最適化装置は、定数保持変数を全て検出し、更にその定数保持変数が被演算子として使用されている演算式を検出する。検出後、最適化装置は、これらの演算式において被演算子として使用されている定数保持変数をその保持値に書き換える。この書き換えによって、図１３（ａ）のプログラム中の各演算式は、定数保持変数ａを被演算子とした演算式からその保持値”10000”を被演算子にした演算式に書き換えられる。
【０００７】
この書き換えの結果を図１３（ｂ）に示す。尚、本図において、変数ｘ、ｙが書き換えられずに残っているが、これは、変数ｘ、ｙが定数保持変数ではない変数、例えば、関数の戻り値を保持する変数だからである。
またこのような書き換えを行えば、位置ｓ１の代入式”ａ＝10000”は冗長になることがわかる。最適化装置は、この代入式を冗長な代入式として削除し、式のコードサイズを低減する。以上の被演算子の書き換え処理と、この書き換え処理によって冗長となった代入式を削除する処理とが定数の伝播と称される。
【０００８】
上記の書き換えによって位置ｓ４の代入式は、『ｂ＝20000＋10000』になり、代入式『ｂ＝30000』と等価になったことがわかる。最適化装置は、プログラム中に『ｂ＝20000＋10000』のような定数式が表れると、それと等価の代入式『ｂ＝30000』に書き換える。このように、定数式を等価な定数に書き換えることを定数の畳み込みという。最適化装置によって定数の畳み込みが行われると、プログラム中に代入式『ｂ＝30000』が表れ、この位置ｓ４の代入式の変数ｂが新たに定数保持変数になる。
【０００９】
伝播及び畳み込みによって新たな定数保持変数が表れると、定数保持変数a同様、最適化装置は定数保持変数ｂが被演算子になっている演算式を探し出す。この変数ｂからは３本の矢印が伸び、その矢先にも変数ｂがあるが、これは変数ｂが被演算子として使用されている演算式を指示している。最適化装置は位置ｓ９、ｓ１０、ｓ１１の演算式を探し出し、これらの演算式において被演算子になっている定数保持変数ｂを、その保持値”30000”に書き換える。この書き換えによって位置ｓ９、ｓ１０、ｓ１１の演算式は図１３（ｄ）に示すように、『ｕ＝10000＋30000』、『ｚ＝30000＋45000』『ｖ＝30000＋ｚ』と書き換えられる。この書き換え後、最適化装置は定数の畳み込みを行い、位置ｓ９、ｓ１０の代入式を『ｕ＝40000』、『ｚ＝75000』に書き換える。この書き換えによって変数ｕ、ｚが定数保持変数になるので、これらの変数についての伝播、畳み込みを最適化装置は更に繰り返す。以上のように伝播、畳み込みを繰り返すと、図１３（ｅ）に示すように定数保持変数ｕについて値の伝播が行われ、位置ｓ４、ｓ９、ｓ１０の代入式が削除されて、図１３（ｆ）に示すように、プログラムは至って簡素になる。
【００１０】
以上のように定数の伝播および定数の畳み込みが行われた後、最適化装置は、資源割付処理を行い、プログラム中に残った変数をレジスタあるいはメモリに割り付ける。この資源割付を行うにあたって、最適化装置は、生存区間が重なり合う変数同士をそれぞれ、異なるレジスタに割り付ける。何故なら、生存区間とは変数が代入されてから、最後に使用されるまでのプログラム上の区間のことであり、これが重複し合うもの同士を同一のレジスタに割り付けると、レジスタの保持値の退避−復元処理が機械語プログラム中に多数必要となるからである。尚、ターゲットマシンのレジスタが少数であり、生存区間が重複し合う変数が多い場合、最適化装置は、それらの変数の何れかをメモリに割り付ける。このように、割り付け処理が行われた後、コンパイラは、この割り付け結果に基づいてコード生成を行い、機械語プログラムを生成する。
【００１１】
このように、定数の伝播処理、畳み込み処理を行い、定数保持変数を削除してから資源割付処理を行えば、その削除分だけ生存区間の重複数が低減するので、レジスタを有効に活用することができる。
【００１２】
【発明が解決しようとする課題】
しかしながら上記従来技術では、定数の伝播および定数の畳み込みによって代入式の被演算子がその保持値に書き換えられることで、バイト長が長い即値データをオペランドとした機械語コードが生成されてしまい、結果として機械語プログラムの実行時間が長く、メモリサイズが大きくなってしまうことが有り得るといった問題点があった。
【００１３】
定数の伝播および定数の畳み込みによって図１３（ｄ）のように書き換えられたプログラム中の、変数ａ１、ａ２がそれぞれ、レジスタＤ１、Ｄ２に割り付けられ、また、その結果、図１４に示す機械語コードが生成されたとする。
図１４中の機械語コード『add #10000,D1』、『add #10000,D2』の中の記号＃が付された数値『#10000』は２バイト長の即値であり、これらの機械語コードは２バイト長の即値が組み込まれたため、図１２に示すレジスタを被演算子にした機械語命令に比べれば、機械語プログラムの実行時間が長く、メモリサイズが大きくなっていることがわかる。
【００１４】
尚即値が組み込まれることを回避するには、変数ａの伝播を行わないことも考えられるが、この場合、『ｂ＝20000＋ａ』が、『ｂ＝30000』に畳み込めず、代入式『ｚ＝ｂ＋45000』、『ｖ＝ｂ＋ｚ』に、変数ｂの保持値”30000”を伝播することができなくなってしまう。変数ｂの伝播が行えなければ、変数ｚ、ｕをプログラムから削除することは不可能となり、プログラムの簡素化は望めなくなる。
【００１５】
本発明は、上記問題点に鑑み、定数の伝播、定数の畳み込みを有効に行いつつも、定数の伝播に伴うコスト増加を防止することができる最適化装置を提供することを目的とする。
【００１６】
【課題を解決するための手段】
上記目的を達成するために、請求項１の最適化装置は、
プログラム言語で書かれたプログラムを機械語プログラムに翻訳するコンパイラに備えられ、プログラム言語で書かれたプログラムの最適化を行って最適化後のプログラムを出力する最適化装置であって、
プログラム中の定数が代入される変数である各定数保持変数について、その定数保持変数に定数を代入している式と、その定数保持変数を被演算子にしている式とを対応づけて定数保持変数の関連式集合として管理する管理手段と、
関連式集合中の定数保持変数を被演算子としている式のうち他の被演算子が全て定数である式、及び、定数保持変数を被演算子とした単項演算である式を、定数保持変数が保持する定数を被演算子とした式に書き換える第１の書換手段と、第１の書換手段による書き換えの後、定数に書き換えられなかった定数保持変数を、その保持する定数即値データに置き換えて機械語演算の被演算子にした場合に、その定数保持変数の関連式集合の内、定数保持変数を被演算子としている式から生ずる機械語命令列の実行サイクルおよび／又はコードサイズを、その定数のバイト長に基づいて推定する第１の推定手段と、
第１の書換手段による書き換えの後、定数に書き換えられなかった定数保持変数が保持する定数を格納したレジスタを機械語演算の被演算子にした場合に、その定数保持変数の関連式集合の内、定数保持変数に定数を代入している式及び定数保持変数を被演算子としている式から生ずる機械語命令列の実行サイクルおよび／又はコードサイズを推定する第２の推定手段と、
第１の推定手段の推定結果と第２の推定手段の推定結果とを各関連式集合毎に比較する比較手段と、
比較手段による比較の結果、第１の推定手段の推定結果が第２の推定手段の推定結果以下の関連式集合はその中で被演算子になっている定数保持変数を全てその定数に書き換える第２の書換手段と、
定数保持変数を被演算子として用いる式が全て定数保持変数が保持する定数値を被演算子として用いる式に書き換えられた場合に、当該定数保持変数に定数を代入している式をプログラムから削除する第３の書換手段
を備えることを特徴としている。
【００１７】
請求項２の最適化装置は更に、
第１及び第２の書換手段による書き換えによって全ての被演算子が定数になった式をそれらの被演算子による演算結果を代入する式に書き換える第４の書換手段と、
第４の書換手段による書き換えによって生じた式で演算結果が代入されることになる新たな定数保持変数と、その定数保持変数に定数を代入している式と、その定数保持変数を被演算子にしている全ての式とを各定数保持変数の関連式集合として管理手段に管理させる制御手段と、
管理手段に新たに管理された関連式集合に対して、第１の書換手段を起動する起動手段と
を備えることを特徴としている。
【００１８】
請求項３の最適化装置は更に、
第２の書換手段による書き換え及び削除後、各変数間の生存区間の重なり具合や各変数の使用頻度に基づいて、プログラム中の各変数をレジスタ又はメモリに割り付ける資源割付手段と、
資源割付手段によってメモリに割り付けられた変数のうち、定数保持変数であるものを判定し、判定された定数保持変数の関連式集合において被演算子になっている定数保持変数を全てその定数に書き換える第５の書換手段と、
を備えることを特徴としている。
【００１９】
請求項４の最適化装置は、
複数個の機械語命令と、各機械語命令の実行サイクルおよび／又はコードサイズを示すコストとを対応づけて記憶するコスト記憶手段を備え、
第１の推定手段は、
第１の書換手段による書き換え後、関連式集合において定数保持変数を被演算子にしている各式を、定数保持変数の保持する定数を表す即値データを被演算子とした機械語命令に置き換える第１の置き換え手段と、
置き換えられた各機械語命令に対応するコストをコスト記憶手段から読み出し、読み出したコストを集計し、集計結果を推定結果とする第１の集計手段
を備え
第２の推定手段は、
第１の書換手段による書き換え後、関連式集合において定数保持変数に定数を代入する式及び定数保持変数を被演算子にしている各式を、その定数を格納したレジスタを被演算子とした機械語命令に置き換える第２の置き換え手段と、
置き換えられた各機械語命令に対応するコストをコスト記憶手段から読み出し、読み出したコストを集計し、集計結果を推定結果とする第２の集計手段
を備えることを特徴としている。
【００２０】
【作用】
上記請求項１の最適化装置によれば、
管理手段は、プログラム中の定数が代入される変数である各定数保持変数について、その定数保持変数に定数を代入している式と、その定数保持変数を被演算子にしている式とを対応づけて定数保持変数の関連式集合として管理している。関連式集合中の定数保持変数を被演算子としている式のうち他の被演算子が全て定数である式、及び、定数保持変数を被演算子とした単項演算である式は第１の書換手段によって定数保持変数が保持する定数を被演算子とした式に書き換えられる。
【００２１】
第１の書換手段による書き換えの後、定数に書き換えられなかった定数保持変数の関連式集合の内、定数保持変数を被演算子としている式から生ずる機械語命令列の実行サイクルおよび／又はコードサイズが第１の推定手段によって推定される。
当該機械語命令列は、定数保持変数が保持する定数を表す即値データが機械語演算の被演算子になるものである。例えば、関連式集合中のその定数保持変数を被演算子にしている式からは、一方の被演算子がレジスタあるいはメモリであり他方の被演算子が即値である機械語演算の機械語命令が生じる。この機械語命令の実行サイクルおよび／又はコードサイズを、第１の推定手段は関連式集合単位でその定数のバイト長に基づいて推定する。
【００２２】
一方、第１の書換手段による書き換えの後、定数に書き換えられなかった定数保持変数の関連式集合の内、定数保持変数に定数を代入している式、及び、定数保持変数を被演算子としている式から生ずる機械語命令列の実行サイクルおよび／又はコードサイズが第２の推定手段によって推定される。当該機械語命令列は、定数保持変数が保持する定数を格納したレジスタを機械語演算の被演算子にしたものである。例えば、関連式集合中の定数保持変数に定数を代入している式からはレジスタあるいはメモリへの定数即値の代入といった機械語命令が生じる。また、関連式集合中のその定数保持変数を被演算子にしている式からは、一方の被演算子がレジスタあるいはメモリであり、他方の被演算子が定数を格納したレジスタである機械語命令が生じる。これらの機械語命令の実行サイクルおよび／又はコードサイズを第２の推定手段は関連式集合単位で、その定数のバイト長に基づいて推定する。
【００２３】
第１の推定手段の推定結果と第２の推定手段の推定結果とが比較手段によって各関連式集合毎に比較され、比較手段による比較の結果、第１の推定手段の推定結果が第２の推定手段の推定結果以下の関連式集合は、第２の書換手段によってその中で被演算子になっている定数保持変数が全てその定数に書き換えられる。このように被演算子になっている定数保持変数が全て定数に書き換えられると、その定数保持変数に全ての定数を代入する式が冗長となるので、第３の書換手段によって定数保持変数に定数を代入している式がプログラムから削除される。
【００２４】
以上のように、一方の被演算子が定数保持変数である演算式に対しての定数の伝播は第１の推定手段による実行サイクル及びメモリサイズの推定結果が第２の推定手段による推定結果以下である場合にのみ行われるので、定数の伝播に伴うコスト増加を防止することができる。
請求項２の最適化装置によれば、
第１及び第２の書換手段による書き換えによって全ての被演算子が定数になった式が第４の書換手段によってそれらの被演算子による演算結果を代入する式に書き換えられる。全ての被演算子が定数になった式とは、例えば、『ｄ＝１００＋２００』、『ｓ＝３０＋１０＊４』等のように、等号の右辺側に変数が無い式であり、被演算子による演算結果とは、例えば、『１００＋２００』なら『３００』、『３０＋１０＊４』なら『７０』のように、定数式と等価である式である。第１の書換手段による書き換えによって、関連式集合において他の被演算子が全て定数である式、及び、定数保持変数を被演算子とした単項演算である式は畳み込める状態になっている。この式が畳み込まれると、この式で代入されている変数が定数保持変数になり、この定数保持変数に対して定数の伝播を行うことで、プログラムの簡素化を従来技術並みに行うことができる。
【００２５】
第４の書換手段による書き換えが行われると、その書き換えによって生じた式で演算結果が代入されることになる新たな定数保持変数と、その定数保持変数に定数を代入している式と、その定数保持変数を被演算子にしている全ての式とが制御手段によって各定数保持変数の関連式集合として管理手段に管理させられる。更に管理手段に新たに管理された関連式集合に対して、第１の書換手段が起動される。第１の書換手段が起動されると、第１の、第２の推定手段が起動され、第２の書換手段が起動されるので、その新たな定数保持変数の関連式集合についても、実行サイクルおよび／又はコードサイズの推定と、この推定結果に基づいた関連式集合中の各式の書き換えが行われる。
【００２６】
請求項３の最適化装置によれば、第２の書換手段による書き換え及び削除が全て行われた後、各変数間の生存区間の重なり具合や各変数の使用頻度に基づいて、資源割付手段によって、プログラム中の各変数がレジスタ又はメモリに割り付けられる。資源割付手段によってメモリに割り付けられた変数のうち、定数保持変数であるものが判定され、判定された定数保持変数の関連式集合において被演算子になっている定数保持変数が第５の書換手段によって全てその定数に書き換えられ、定数保持変数を被演算子として用いる式が全て定数保持変数が保持する定数値を被演算子として用いる式に書き換えられた場合に第３の書換手段によってその定数保持変数に定数を代入している式が削除される。
【００２７】
請求項４の最適化装置によれば、コスト記憶手段には、複数個の機械語命令と、各機械語命令の実行サイクルおよび／又はコードサイズを示すコストとが対応づけて記憶されている。
第１の書換手段による書き換えの後、関連式集合において定数保持変数を被演算子にしている各式は、第１の置き換え手段によって、定数保持変数を、その保持する定数即値データに置き換えて被演算子とした機械語命令に置き換えられる。置き換えられた各機械語命令に対応するコストがコスト記憶手段から読み出され、第１の集計手段によって、読み出されたコストが集計され、集計結果が推定結果とされる。
【００２８】
また第１の書換手段による書き換えの後、関連式集合において定数保持変数に定数を代入する式及び定数保持変数を被演算子にしている各式が第２の置き換え手段によって、その定数を格納したレジスタを被演算子とした機械語命令に置き換えられる。置き換えられた各機械語命令に対応するコストがコスト記憶手段から読み出され、読み出されたコストが集計され、第２の集計手段によって集計結果が推定結果とされる。
【００２９】
【実施例】
以下、本発明の最適化装置の一実施例を図面を用いて説明する。この最適化装置はＣ言語などの高級言語のコンパイラに備えられ、コンパイラが、ソースプログラムの字句解析、構文解析および意味解析をおこなった後に起動される。処理対象となるプログラムは、コンパイラが字句解析、構文解析および意味解析を行なった後に解析結果として出力する中間言語プログラムである。
【００３０】
＜コンパイラの構成＞
図１（ａ）は本発明の一実施例におけるコンパイラの構成図である。コンパイラは、構文解析装置１００と、最適化装置２００と、コード生成装置３００で構成される。
構文解析装置１００はファイルとして記憶されているソースプログラムの字句解析、構文解析、および意味解析をおこなう。解析結果は中間言語プログラムとして出力される。
【００３１】
最適化装置２００は最終的に生成される機械語プログラムのプログラムサイズを削減し、実行時間を短縮するように中間言語プログラムを最適化する。
コード生成装置３００は、最適化された中間言語プログラムを、ターゲットマシンの機械語命令に変換し、機械語プログラムとして出力する。
＜最適化装置２００の構成＞
図１（ｂ）は、図１（ａ）に示す最適化装置２００の構成図である。最適化装置２００は、最適化時使用情報検出装置４０、一般コード最適化装置５０、及び定数最適化装置６０で構成される。
【００３２】
最適化時使用情報検出装置４０は、プログラム内の変数についてのデータフロー解析および制御フロー解析を行ない、最適化処理に要する情報を検出する。ここでデータフロー解析とは、それぞれの変数がどこで定義され、どこに参照されているかについて解析することであり、制御フロー解析とは、プログラム中の制御の流れを解析することである。
【００３３】
一般コード最適化装置５０は、定数最適化を除く、不要コードの削除やインライン展開、ループ不変式のコード移動などの最適化を行う。不要コードの削除やインライン展開、ループ不変式のコード移動等の最適化は、本発明の主眼でないので説明を省略する。
＜定数最適化装置６０の内部構成＞
図２は定数最適化装置６０の構成図である。定数最適化装置６０は、定数保持変数情報保持部６、定数保持変数定義検出部７、使用式検出部８、部分定数式書き換え部９、コスト判定書き換え部１０、資源割り付け部１１、メモリ変数書き換え部１２、及び定数保持変数定義除去部１３で構成される。
【００３４】
定数保持変数情報保持部６には、プログラムで定義されている複数個の定数保持変数が保持する定数保持変数情報のデータベースが構築されてゆく。図中の定数保持変数情報保持部６を示す枠内に定数保持変数情報の一例を示す。定数保持変数情報は、定数保持変数の変数名と、プログラム内における位置情報で表された定数保持変数の定義位置と、定数保持変数に保持されている値と、その定数保持変数がどの資源に割り付けられているかを示す資源欄と、プログラム内における位置情報で表された定数保持変数の使用位置と、使用位置に保持値を伝播するかどうかを示す各使用位置の使用属性とで構成される。本図において、変数『ａ』から見て横方向には、『ｓ１』『２００』、『レジスタ』『ｓ２』『伝播』が順に並べられているが、これは、変数『ａ』の定義位置が『ｓ１』であり、また変数『ａ』の保持値が『２００』であり、変数『ａ』がレジスタに割り付けられ、位置『ｓ２』で使用され、その使用属性が『伝播』に代入されていることを示す。
【００３５】
また『ｂ』から見て横方向には、『ｓ３』『10200』、『メモリ』『ｓ４』『非伝播』が順に並べられ、その下の欄には『ｓ５』『非伝播』並べられているが、これは、変数『ｂ』の定義位置が『ｓ３』であり、また変数『ｂ』の保持値が『10200』であり、変数『ｂ』がメモリに割り付けられ、位置ｓ４での使用属性が『非伝播』に代入されていることを示す。その下欄の『ｓ５』『非伝播』は、変数『ｂ』がプログラムにおいて位置ｓ４の他に位置ｓ５で使用され、位置ｓ５は非伝播であることを示している。
【００３６】
尚、上記位置情報は、図１３の一例に示したような、演算式毎に与えられた情報であり、図のｓ１、ｓ２、ｓ３、ｓ４・・・がこれに該当する。
定数保持変数定義検出部７は、プログラムから変数に定数あるいは定数式を代入する代入式を検出し、検出した代入式において定義された定数保持変数の変数名、定数保持変数定義位置、定数保持変数に保持されている値を調べ、これらの情報を１つにまとめて、１つの定数保持変数情報にして定数保持変数情報保持部１４のデータベースに登録する。尚、定数保持変数については既に述べているが、定数保持変数でない変数とは、保持値が代入式によって一義的に定まらない変数をいう。例えば、従来例で述べたような関数の戻り値を格納する変数や、プログラム実行中に値が変化する変数等がこれに相当する。
【００３７】
使用式検出部８は、プログラムから定数保持変数情報保持部６に保持されている全ての定数保持変数について、その定数保持変数が被演算子の位置にある全ての演算式を検出し、検出した演算式の位置を定数保持変数情報保持部６のデータベースに登録し、その使用位置の使用属性を非伝播に設定する。
部分定数式書き換え部９は、プログラムにおいて被演算子になっている定数保持変数をその保持値に置き換えればその被演算子を含む演算式が定数又は定数式となるかを予測し、またデータフロー解析結果を鑑みて、その置き換えを行っても変数間の依存関係が保障できるかを検証する。このような一連の処理によって保持値に置き換えればその演算式が定数又は定数式になると予測され、変数間の依存関係が保障できると検証された場合、置き換えを実行する。置き換えの実行の後、定数保持変数情報保持部６に保持されている定数保持変数情報の使用属性に伝播を代入することで上記置き換えの形跡を残す。
【００３８】
コスト判定書き換え部１０は、定数保持変数情報保持部６に定義位置が保持されている各変数に対して、その変数の使用を定数の使用に置き換えた場合と、レジスタ変数（変数のうち、レジスタに割り付けられているものをいう。）として用いた場合とではどちらがコストが小さくなるかを予測し、かつ、データフロー解析結果によりその置き換えを行っても変数間の依存関係が保障できるかを検証する。以上の一連の処理によって定数に置き換えた方がコストが小さくなると予測され、変数間の依存関係が保障できると検証された場合、上記置き換えを実行し、定数保持変数情報保持部６に保持されている定数保持変数情報の使用属性に伝播を代入して置き換えの形跡を残す。
【００３９】
資源割り付け部１１は、プログラム中の変数をターゲットマシンのMPUが有しているレジスタまたはメモリに割り付ける。この資源割り付けにあたって、資源割り付け部１１は、値の伝播及び畳み込みを終えたプログラムにおいて、各変数の生存区間がどう重複し合っているかを調べ、その重複し合う変数にそれぞれ異なるレジスタを割り付ける。また、資源割り付け部１１は、各変数のネストレベルがどれだけであるか、あるいは、各変数の使用頻度がどれだけであるかを調べ、調べた結果に基づいて、各変数に優先度を与える。そしてこの優先度が高い順にレジスタを割り付けてゆく。その結果、レジスタに割り付けられなかった変数はメモリに割り付ける。資源割り付け部１１は、このような資源割付を終えた後、特に定数保持変数に関しては、定数保持変数がレジスタまたはメモリのどちらに割り付けられたかを定数保持変数情報保持部６の定数保持変数情報のデータベースに反映させる。
【００４０】
メモリ変数書き換え部１２は、レジスタに割り付けた方がコストが小さくなると予測され、また、保持値への書き換えを行っても変数間の依存関係が保障できると検証された定数保持変数であって、資源割り付け部１１でレジスタに割り付けられなかったものをその保持値である定数へと書き換える。またその書き換えの形跡を、定数保持変数情報保持部６に保持されている定数保持変数情報の使用属性に伝播を代入することで残す。
【００４１】
定数保持変数定義除去部１３は、定数保持変数情報保持部６に保持されている定数保持変数について、その定数保持変数に属する全ての定数保持変数の使用位置の使用属性が伝播となっている場合に、定数保持変数の定義をしている代入式を除去する。
図３は図２に示す部分定数式書き換え部９の処理過程を示すフローチャートである。
【００４２】
ステップａ１は、ステップａ１０と対になり、定数保持変数情報保持部６に保持されている全ての定数保持変数を１つ１つ処理対象にして以下の処理（ステップａ２〜ステップａ９）を繰り返す。
ステップａ２は、ステップａ９と対になり、ステップａ１で現在処理対象になっている定数保持変数が被演算子として含まれている演算式の全てについて、以下の処理（ステップａ３〜ステップａ８）を繰り返す。
【００４３】
ステップａ３では、現在処理対象になっている定数保持変数をその保持値に置き換えた場合、その定数保持変数を含む演算式が定数式になるかを調べる。具体的には、ステップａ３では、当該定数保持変数が単項演算子の被演算子であるか、当該定数保持変数が二項演算子の被演算子でもう一方の被演算子が定数もしくは定数保持変数であるかを調べる。ここで単項演算子とは、『ａ＝−ｂ』等、演算子及び被演算子が唯一つである代入式を言う。
【００４４】
ステップａ４では、プログラム中において被演算子の位置にある定数保持変数をその保持値に置き換える（定数の伝播の実行）。また定数保持変数情報保持部６に保持されている定数保持変数情報の使用位置の使用属性を伝播に設定する。
ステップａ５では、ステップａ４での置き換えの結果、プログラム中に定数式が新たに表れたかを調べ、新たにプログラム中に表れた定数式を定数に畳み込む。
【００４５】
ステップａ６では、ステップａ４、ａ５で書き換えられた式（代入式）が、定数保持変数を定義する代入式と合致するか否かを判定する。
ステップａ７では、ステップａ６で合致すると判定された定数保持変数を定義している代入式についての定数保持変数名、定数保持変数定義位置、定数保持変数値をひとまとめにして定数保持変数情報保持部６のデータベースに登録する。
【００４６】
ステップａ８では、ステップａ７で定数保持変数情報保持部６のデータベースに登録された定数保持変数について、その定数保持変数が被演算子の位置にある全ての演算式をプログラム中から検出し、検出した演算式の位置を定数保持変数情報保持部６に登録し、その定数保持変数情報の使用属性を非伝播に設定する。
以上ステップａ１からステップａ１０までの処理により、プログラムにおいて被演算子になっていた定数保持変数はその保持値に置き換えられ、更に畳み込まれた状態となる。
【００４７】
＜コスト判定書き換え部１０の内部構成＞
図４（ａ）はコスト判定書き換え部１０の内部構成図である。
コスト判定書き換え部１０は、図４（ａ）に示すように、制御部１４と、コスト計算の手掛かりになる情報を保持するコスト保持部１５と、レジスタ変数定義コスト計算部１６と、レジスタ変数使用コスト計算部１７と、定数使用コスト計算部１８と、これらの３つの計算部の計算結果に基づいて定数保持変数の書き換えを行うべきかを判定する書き換え判定部１９と、当該判定部の判定結果で書き換えを行う書き換え部２０とで構成される。
【００４８】
制御部１４は、図６（ａ）のフロ−チャ−トに基づいて処理を行う。
図６（ａ）は制御部１４の処理過程を示すフロ−チャ−トである。
ステップｂ１は、ステップｂ７と対になり、定数保持変数情報保持部６に情報が登録されている定数保持変数を１つ１つ処理対象にして以下の処理（ステップｂ２〜ステップｂ６）を繰り返す。
【００４９】
ステップｂ２は、現在処理対象になっている定数保持変数について、定数保持変数情報保持部６よりその定数保持変数定義位置を取り出し、この定数保持変数定義位置に含まれる代入式を取り出して、当該定数保持変数をレジスタ変数として定義した場合に当該代入式で費やされるコスト（以下レジスタ変数定義コストと呼ぶ）を推測する。
【００５０】
ステップｂ３では、現在処理対象になっている定数保持変数について、その定数保持変数の使用位置の内、使用属性が非伝播であるものの全てを定数保持変数情報保持部６より取り出し、取り出した使用位置で定数保持変数を被演算子として含んでいる演算式を取り出して、定数保持変数をレジスタ変数として使用した場合に当該演算式で費やされるコスト（以下レジスタ変数使用コストと呼ぶ。）を推測する。
【００５１】
ステップｂ４では、現在処理対象になっている定数保持変数について、その定数保持変数の使用位置の内、使用属性が非伝播であるものの全てを定数保持変数情報保持部６より取り出し、この使用位置において定数保持変数を被演算子として含んでいる演算式を取り出して、定数保持変数を定数に置き換えて使用した場合この演算式で費やされるコスト（以下定数使用コストと呼ぶ。）を推測する。
【００５２】
ステップｂ５では、ステップｂ２〜ｂ４で計算した各コストを用い、レジスタ変数定義コストとレジスタ変数使用コストとの和を計算し、この和と定数使用コストとの大きさを比較する。
ステップｂ６では、ステップｂ５において定数使用コストの方が小さいか、若しくは、等しかった場合に起動される。この場合には、定数保持変数を定数で書き換えた方が全体としてコストが小さくなるため、現在処理対象になっている定数保持変数の使用位置を定数保持変数情報保持部６より取り出し、この定数保持変数使用位置で定数保持変数を被演算子として含んでいる演算式を取り出して、演算式の被演算子になっている定数保持変数の使用を保持値である定数の使用に置き換え、その使用位置の使用属性を伝播に設定する。
【００５３】
以上ステップｂ１からステップｂ７までの処理により、プログラム中の定数保持変数は、レジスタとして使い回した方がコストが小さいものはレジスタ変数に、それ以外のものは定数保持変数の値である定数に置き換えられた状態となる。コスト保持部１５は、畳み込みにおいて定義、使用を行う機械語コードの典型例を表したパタンの全てと、各パタンで費やされるコストとを対応付けて保持している。コスト保持部１５の保持内容の一連を図５に示す。図５において、コスト保持部１５を示す枠内に『命令』、『Size』、『Cycle』が横方法に並べられ、その『命令』から下に向けて『定数保持変数定義』『8bit定数』『16bit定数』『24bit定数』が並んでいる。これらのうち、『8bit定数』から横方向に『２』『１』が並んでいるが、これらは、8bit長の定数保持変数の定義を行えば、その定数保持変数を含む代入式においてメモリサイズが『２』費やされ、実行サイクルが『１』費やされることを示す。また『24bit定数』から横方向に『５』『３』が並んでいるが、これらは、24bit長の定数保持変数の定義を行えば、その定数保持変数を含む代入式において、メモリサイズが『５』費やされ、実行サイクルが『３』費やされることを示す。
【００５４】
『レジスタ変数--定数加算    8bit』から横方向に『２』『１』が並んでいるが、これらは、8bit長の定数を保持する定数保持変数を定数として加算に使用すれば、その使用を行う演算式において、メモリサイズが『２』費やされ、実行サイクルが『１』費やされることを示す。『レジスタ−定数加算  16bit』から横方向に『４』『２』が並んでいるが、これらは、16bit長の定数を保持する定数保持変数を定数として加算に使用すれば、その使用を行う演算式において、メモリサイズが『４』費やされ、実行サイクルが『２』費やされることを示す。
【００５５】
『定数保持変数定義』、『レジスタ−定数式加算  8bit』の他に、本図には『レジスタ変数同士の加算』、『メモリからのロード』、『メモリへのストア』等が存在するが、コスト保持部１５はこれらの命令で費やされるコストをも保持し、プログラムに含まれるあらゆる式について、コストが計算されるようにしている。
【００５６】
レジスタ変数定義コスト計算部１６は、ステップｂ２での推測を行う。具体的には、定数保持変数の定義を行う代入式でコスト保持部１５を検索し、代入式とマッチングするコストを取り出し、これを推測結果とする。
レジスタ変数使用コスト計算部１７は、ステップｂ３での推測を行う。具体的には、定数保持変数使用位置の内、使用属性が非伝播であるものにおいて定数保持変数を被演算子として含んでいる演算式を検索項目としてコスト保持部１５を検索し、検索項目とマッチングするコストを取り出して、取り出したコストの集計をとり、これを推測結果とする。
【００５７】
定数使用コスト計算部１８は、ステップｂ４で起動され、定数保持変数使用位置の内、使用属性が非伝播であるもので定数保持変数を被演算子として含んでいる演算式について定数保持変数をその保持している定数値で置き換えた演算式を検索項目としてコスト保持部１５を検索し、検索項目とマッチングするコストを取り出して、取り出したコストの集計をとり、これを推測結果とする。
【００５８】
書き換え判定部１９は、ステップｂ５で起動され、レジスタ変数定義コスト計算部１６からレジスタ変数定義コストを受け取り、レジスタ変数使用コスト計算部１７からレジスタ変数使用コストを受け取り、定数使用コスト計算部１８から定数使用コストを受け取って、レジスタ変数定義コストとレジスタ変数使用コストとの和を計算し、この和と定数使用コストとの大きさを比較する。定数使用コストの方が小さいか、もしくは、等しい場合には、定数保持変数を保持値で書き換えた方が全体としてコストが小さくなるため書き換え部２０を呼び出し、定数保持変数を定数に書き換える。定数使用コストの方が大きかった場合には、定数保持変数をレジスタ変数とした方が全体としてコストが小さくなるため、書き換えを行なわない。
【００５９】
書き換え部２０は、現在処理対象になっている定数保持変数の使用位置を定数保持変数情報保持部６より取り出し、この定数保持変数使用位置において定数保持変数を被演算子として含んでいる演算式を取り出して、プログラム中の定数保持変数の使用を保持値の使用に置き換え、その使用位置の使用属性を伝播に設定する。
【００６０】
＜メモリ変数書き換え部１２の内部構成＞
図４（ｂ）はメモリ変数書き換え部１２の内部構成図である。
メモリ変数書き換え部１２は、制御部２２と、レジスタ変数判定部２３と、書き換え部２４から構成される。
制御部２２は、定数保持変数情報保持部６に保持されているそれぞれの定数保持変数について、レジスタ変数判定部２３を呼び出す。
【００６１】
図６（ｂ）は図４（ｂ）に示す制御部２２の処理過程を示すフロ−チャ−トである。
ステップｃ１はステップｃ７と対になり、定数保持変数情報保持部６に登録されている全ての定数保持変数の１つ１つについて以下の処理（ステップｃ２〜ステップｃ６）を繰り返す。
【００６２】
ステップｃ２は、現在処理対象になっている定数保持変数について、変数が割り付けられている資源を定数保持変数情報保持部６から取り出し、変数がメモリに割り付けられているかどうかを判定する。
ステップｃ３はステップｃ６と対になり、ステップｃ２でメモリに割り付けられていると判定された定数保持変数について、定数保持変数情報保持部からその使用を取り出し、定数保持変数の使用１つ１つについて以下の処理（ステップｃ４〜ステップｃ５）を繰り返す。
【００６３】
ステップｃ４では、現在処理対象になっている定数保持変数の使用について、変数の使用属性を定数保持変数情報保持部６から取り出し、使用属性が非伝播かどうかを判定する。
ステップｃ５では、ステップｃ２によりメモリに割り付けられていると判定された定数保持変数の内、ステップｃ４で使用属性が非伝播であると判定された定数保持変数の使用について、その使用位置を定数保持変数情報保持部６から取り出し、これらの使用位置で被演算子となっている定数保持変数をその保持値である定数値で置き換え、使用属性を伝播に設定する。
【００６４】
ステップｃ１からステップｃ７までの処理により、プログラム中の定数保持変数のうち、資源割り付け後に、メモリに割り付けられてしまったものが保持値に置き換えられた状態となる。
レジスタ変数判定部２３は、現在処理対象になっている定数保持変数について、定数保持変数の使用属性を定数保持変数情報保持部６から取り出し、その変数がレジスタに割り付けられたかメモリに割り付けられたかを定数保持変数情報保持部６の資源の欄より判定し、メモリに割り付けられたと判定された場合に、その変数の使用属性が非伝播が否かを判定して、非伝播の場合に、書き換え部２４を起動する。
【００６５】
書き換え部２４は、レジスタ変数判定部２３によって起動され、現在処理対象になっている定数保持変数の全ての使用位置を定数保持変数情報保持部６から取り出し、取り出した位置で被演算子の位置にある定数保持変数をその保持値に書き換え、定数保持変数の使用位置の使用属性を伝播に設定する。
＜図７（ａ）〜（ｆ）の中間言語プログラムを処理対象とした動作例＞
以上のように構成された最適化装置に、図７（ａ）に示されたプログラムを入力として与えた場合の動作を、動作例として説明する。
【００６６】
（１）定数保持変数定義検出部７は、図７（ａ）のプログラムにおいて位置ｓ１の定義式（定数保持変数に定数を設定する代入式）を検出し、定数保持変数名ａ、定義位置ｓ１、定数保持変数値２００を１つにまとめて１つの定数保持変数情報として、定数保持変数情報保持部６のデータベースに登録する。
（２）使用式検出部８は、プログラム中から定数保持変数情報保持部６に登録されている定数保持変数ａの使用式を探査し、位置ｓ２での定数保持変数ａの使用式を検出して、使用位置ｓ２、使用属性「非伝播」を１つにまとめて１つの定数保持変数情報として、定数保持変数情報保持部６のデータベースに登録する。同様に定数保持変数ａの使用を探査し、位置ｓ３の演算式を検出して、使用位置ｓ３及び使用位置ｓ３での使用属性として「非伝播」を定数保持変数情報保持部６の定数保持変数ａの欄に書き込む。この段階で定数保持変数情報保持部６に保持されている情報は図８（ａ）のようになる。
（３）部分定数式書き換え部９では、ステップａ１〜ａ１０のループが、定数保持変数情報保持部６の各定数保持変数について繰り返される。現段階での定数保持変数は定数保持変数ａのみであるので、ステップａ１〜ａ１０のループは定数保持変数ａについて実行される。
【００６７】
ステップａ２〜ａ９のループが、定数保持変数情報保持部６の定数保持変数ａのそれぞれの使用式（定数保持変数が被演算子になっている代入式）について繰り返し実行される。この例では、定数保持変数ａの定数保持変数情報には位置ｓ２、ｓ３の２つの位置情報が格納されているので、ループは２回実行される。
ステップａ３では、定数保持変数情報保持部６に保持された定数保持変数の使用が定数に畳み込めるかを判定する。定数保持変数ａの使用式の定数２００での置き換え後の式は、位置ｓ２「ａ１＝｛２００｝＋ｘ」、位置ｓ３「ｂ＝10000＋｛２００｝」（※、｛,｝内の数値は、書き換えによって生じた定数を示す。）となり、結果が定数に畳み込めるのは位置ｓ３の演算式のみである。従って以下ステップａ４〜ａ８の処理は定数保持変数の位置ｓ３の演算式についてのみ実行される。
【００６８】
ステップａ４では、プログラム中の位置ｓ３が「ｂ＝10000＋｛２００｝」と書き換えられ（定数の伝播）、定数保持変数情報保持部６中、定数保持変数ａの位置ｓ３を含む欄の使用属性が「伝播」に設定される。
ステップａ５では、プログラム中の位置ｓ３が、更に「ｂ＝｛10200｝」に畳み込まれる。
【００６９】
ステップａ６では、ステップａ５で書き換えによって、定数保持変数の定義式が新たに生成したかを判定する。この場合、代入式「ｂ＝｛10200｝」により定数保持変数ｂが新たに生成されたのでので、以下ステップａ７、ａ８が実行される。
ステップａ７では、ステップａ６で新たに生成したと判定された定義式についての定数保持変数情報として、定数保持変数情報保持部６のデータベースに、定数保持変数名ｂ、定数保持変数定義位置ｓ３を１つにまとめて１つの定数保持変数情報として定数保持変数値10200を登録する。
【００７０】
ステップａ８では、ステップａ７で新たに格納された定数保持変数ｂについて、その使用位置がプログラム中から探査される。処理は上記（２）の場合と同様なので説明は省略する。
ステップａ９では、ステップａ２と対になりループ処理を行なう。
ステップａ１０では、ステップａ１と対になりループ処理を行なう。この段階では、定数保持変数情報保持部６には、定数保持変数ｂの定義式も登録されているため、再びステップａ１に戻り、ループを行なうこととなる。つまり、途中で追加されたものを含む全ての定数保持変数ｂの定義式についてステップａ１〜ａ１０の処理が繰り返される。
【００７１】
部分定数式書き換え部９による書き換えの結果、中間プログラムは図７（ｂ）、定数保持変数情報保持部６に保持されている定数保持変数情報は図８（ｂ）のようになる。
（４）コスト判定書き換え部１０は、定数保持変数情報保持部６に保持されている定数保持変数ａ、ｂについて以下の処理を実行する。MPUの命令セットとして図９を仮定する。この場合、コスト保持部１５に格納されている情報は図１０になる。
【００７２】
｛定数保持変数ａの使用のコスト比較及び書き換え｝
レジスタ変数定義コスト計算部１６は、定数保持変数情報保持部６から定数保持変数ａの定義位置をとりだし、プログラム中から定数保持変数ａの定義式を取り出して、コスト保持部１５に格納されているパターンとマッチングを行ない、定数保持変数ａの定義コストを取り出す。この場合２００は8bit以内の定数であるため、コストとしてサイズ２、サイクル１が取り出される（ステップｂ２、図１０の矢符ｃ１）。
【００７３】
レジスタ変数使用コスト計算部１７は、定数保持変数情報保持部６から定数保持変数ａの使用の内、その使用属性が非伝播であるものの使用位置をとりだし、その使用位置での定数保持変数ａの使用式を取り出して、コスト保持部１５に格納されているパターンとマッチングを行ない、定数保持変数ａの使用コストを取り出す。この場合は定数保持変数ａの使用式は、どちらもレジスタ変数同士の加算とマッチングし、コストとしてサイズ１、サイクル１が取り出される（ステップｂ３、図１０の矢符ｃ２）。
【００７４】
定数使用コスト計算部１８は、定数保持変数情報保持部６から定数保持変数ａの使用の内、その使用属性が非伝播であるものの使用位置をとりだし、プログラム中から使用式を取り出して、使用式中の定数保持変数をその保持値に置き換えた場合の定数式と、コスト保持部１５に格納されているパターンとのマッチングを行ない、定数保持変数ａを定数に置き換えた場合の使用コストを取り出す。この例ではレジスタ変数--８ｂｉｔ定数の加算とマッチングし、コストとしてサイズ２、サイクル１が取り出される（ステップｂ４、図１０の矢符ｃ３）。
【００７５】
書き換え判定部１９は、上記レジスタ変数定義コスト計算部１６で計算されたコストと上記レジスタ変数使用コスト計算部１７で計算されたコストとの和をとり、これと、定数使用コスト計算部１８で計算されたコストとを比較する（ステップｂ５）。定数保持変数ａの例では、レジスタ変数として用いた場合には、
サイズ＝２＋１＝３
サイクル＝１＋１＝２
定数に置き換えた場合には、
サイズ＝２
サイクル＝１
となり、定数使用のコストの方が小さいので、書き換え部２０を起動し、位置ｓ２の演算式で被演算子になっている定数保持変数ａの使用式を定数保持変数値２００に書き換える（ステップｂ５）。この結果使用位置ｓ２の代入式は「ａ１＝２００＋ｘ」となる。
【００７６】
｛定数保持変数ｂについてのコスト比較及び書き換え｝
定数保持変数ａと同様の処理をおこなうが、定数保持変数ｂの場合には定数使用コストの方が大きくなる。従って書き換え部２０は起動されない。
以上、コスト判定書き換え部１０の処理により、プログラムは図７（ｃ）、定数保持変数情報保持部６に保持されている情報は図８（ｃ）になる。
【００７７】
（５）資源割り付け部５は各変数ａ、ａ１、ｘ、ｂ、ｂ１、ｂ２、ｙをレジスタまたはメモリに割り付ける。また定数保持変数であるａ、ｂについては定数保持変数情報保持部６の資源欄に割り付けられた資源（レジスタもしくはメモリ）を設定する。
（６）メモリ変数書き換え部１２は、定数保持変数情報保持部６に保持されている定数保持変数についてこの定数保持変数がレジスタに割り付けられているかどうかを調べる（ステップｃ２）。
【００７８】
（７−１  定数保持変数ｂがレジスタに割り付けられた場合）
定数保持変数がレジスタに割り付けられている場合にはここで処理を終了する。例において定数保持変数ｂがレジスタに割り付けられていたのでプログラムは図７（ｃ）に示すようになる。
（８）定数保持変数定義除去部７は、定数保持変数情報保持部６に保持されている定数保持変数について、その全ての定数保持変数使用属性が伝播となっている場合に、定数保持変数情報保持部６に登録されている定数保持変数定義位置の項の内容に基づいて、プログラムから定数保持変数の定義式を除去する。
【００７９】
例において定数保持変数ｂがレジスタに割り付けられた場合には、定数保持変数情報格納部内の情報は図８（ｄ）の様になっており、定義式が除去できる定数保持変数は定数保持変数ａのみである。従ってこの場合には定数保持変数ａの定義式（プログラム中の位置ｓ１）を除去する。結果、最終的にプログラムは図７（ｅ）に示すように書き換えられる。
【００８０】
（７−２  定数保持変数ｂがレジスタに割り付けられなかった場合）
定数保持変数ｂがレジスタに割り付けられていなかった場合には、更に定数保持変数情報の属性項を調べ、使用属性が非伝播となっているかどうかを調べる（ステップｃ４）。この例では図８（ｃ）に示されている通り、使用位置ｓ４、ｓ５で使用属性項が非伝播となっている。従って、書き換え部２４が起動され、定数保持変数の使用がその保持値の使用に書き換えられる（ステップｃ５）。例では、定数保持変数ｂがレジスタに割り付けられていないので、プログラムは図７（ｄ）に示すように書き換えられる。定数保持変数ｂがレジスタに割り付けられなかった場合には、定数保持変数情報格納部内の情報は図８（ｅ）の様になっており、定義式が除去できる定数保持変数はａ、ｂとなる。従ってこの場合には定数保持変数ａの定義式（プログラム中の位置ｓ１）および定数保持変数ｂの定義式（プログラム中の位置ｓ３）を除去する。結果、最終的にプログラムは図７（ｆ）に示すように書き換えられる。
【００８１】
＜図１１（ａ）〜（ｆ）の中間言語プログラムを処理対象とした動作例＞
最適化装置に図１１（ａ）〜（ｆ）に示されたプログラムが入力として与えられた場合の動作を以下に説明する。
（１）定数保持変数定義検出部７は、位置ｓ１においてプログラム中３１の定数保持変数の代入式を検出し、定数保持変数名ａ、定義位置ｓ１、定数保持変数値10000を定数保持変数情報保持部６のデータベースに登録する（ステップａ７）。
（２）使用式検出部８は、プログラム中から定数保持変数情報保持部６に保持されている定数保持変数ａの使用位置を探査し、位置ｓ２の使用式を検出して、使用位置ｓ２、使用属性「非伝播」を定数保持変数情報保持部６の定数保持変数ａの欄に登録する。また同様に定数保持変数ａの使用式、ｓ３、ｓ４を検出し、使用位置としてｓ３、ｓ４を使用属性として「非伝播」に設定する（ステップａ８）。
（３）部分定数式書き換え部９では、定数保持変数ａの使用ｓ４が書き換え条件に該当するので、図１１（ｂ）に示すように、使用ｓ４が「ｂ＝20000＋10000」更に「ｂ＝30000」と書き換えられ、定数保持変数情報保持部６中、定数保持変数ａの使用位置ｓ３の使用属性が「伝播」に設定される（ステップａ５）。またこの段階で変数ｂも新たな定数保持変数となりここで登録されるが、この例では変数ｂの使用式についての説明は省略し、以下変数ａについてのみ説明を行う。
（４）コスト判定書き換え部１０は、定数保持変数情報保持部６に保持されている定数保持変数ａについて以下の処理を実行する。MPUの命令セットとして図９を仮定する。この場合、コスト保持部１５に格納されている情報は図１０になる。
【００８２】
レジスタ変数定義コスト計算部１６は、定数保持変数情報保持部６から定数保持変数ａの定義位置を取り出し、プログラム中から定義式を取り出して、コスト保持部１５に格納されているパタンとのマッチングをとり、定数保持変数ａの定義コストを取り出す。この場合10000は１６bit以内の定数であるため、コストとしてサイズ３、サイクル１が取り出される（ステップｂ２）。
【００８３】
レジスタ使用コスト計算部１７は、定数保持変数情報保持部６から定数保持変数ａの使用位置の内、使用属性が非伝播であるものを取り出し、プログラム中から使用式を取り出して、コスト保持部１５に格納されているパタンとのマッチングをとり、定数保持変数ａの使用コストを取り出す。この場合は定数保持変数ａの使用式は、どちらも（ｓ２、ｓ３）レジスタ変数同士の加算とマッチングするので、コストとしてサイズ１、サイクル１が取り出される（ステップｂ３）。
【００８４】
定数使用コスト計算部１８は、定数保持変数情報保持部６から定数保持変数ａの使用位置を取り出し、その使用位置の使用式の内、使用属性が非伝播であるものを取り出して、使用式中の定数保持変数をその保持値で置き換えた場合の定数式と、コスト保持部１５に格納されているパタンとマッチングをとり、定数保持変数ａを保持値に置き換えた場合の使用コストを取り出す、この例ではどちらもレジスタ変数−−16bitｉｔ定数の加算とマッチングするので、コストとしてサイズ４、サイクル２が取り出される（ステップｂ４）。
【００８５】
書き換え判定部１９は、上記レジスタ変数定義コスト計算部１６で計算されたコストとレジスタ変数使用コスト計算部１７で計算されたコストの和をとり、これと、定数使用コスト計算部１８で計算されたコストとを変換する（ステップｂ５）。定数保持変数ａの例ではレジスタ変数として用いた場合には、
サイズ＝３＋１＋１＝５
サイクル＝１＋１＋１＝３
定数で置き換えた場合には、
サイズ＝４＋４＝８
サイクル＝２＋２＝４
となり、レジスタ変数として使用した場合のコストの方が小さいので、書き換え部２０は起動されず位置ｓ２、ｓ３はこのまま変化しない。
【００８６】
従って、図１１（ａ）の中間言語プログラムは図１１（ｂ）の形となる。図１１（ｂ）において、位置ｓ４では、代入式が『ｂ＝30000』となり、プログラム中に代入式『ｂ＝30000』が表れ、この位置ｓ４の代入式の変数ｂが新たに定数保持変数になる。
伝播及び畳み込みによって新たな定数保持変数が表れると、定数保持変数a同様、定数保持変数ｂが被演算子になっている代入式を探し出される。この変数ｂからは３本の矢印が伸び、その矢先にも変数ｂがあるが、これは変数ｂが被演算子として使用されている代入式を指示している。最適化装置は位置ｓ９、ｓ１０の代入式が探し出され、これらの代入式において被演算子になっている定数保持変数ｂが、その保持値”30000”に書き換えられる。この書き換えによって位置ｓ９、ｓ１０の代入式は図に示すように、『ｕ＝10000＋｛30000｝』、『ｚ＝｛30000｝＋45000』と書き換えられる。この書き換え後、最適化装置は、定数の畳み込みを行い、位置ｓ９、ｓ１０の代入式を『ｕ＝40000』、『ｚ＝75000』に書き換える。この書き換えによって変数ｕ、ｚが定数保持変数になるので、これらの変数についての伝播、畳み込みを最適化装置は更に繰り返す。以上のように伝播、畳み込みを繰り返すと、プログラムのように、位置ｓ４、ｓ９、ｓ１０の代入式が削除され、プログラムは至って簡素になる。
【００８７】
以上のように、書き換えが行われると、最適化装置は、定数の伝播および定数の畳み込み後、プログラム中に残った変数をレジスタあるいはメモリに割り付ける。この資源割付を行うにあたって、最適化装置は、生存区間が重なり合う変数同士をそれぞれ、異なるレジスタに割り付ける。
定数の伝播および定数の畳み込みによって図１１（ｄ）のように書き換えられたプログラム中の、変数ａ、ｘ、ｙがそれぞれ、レジスタＤ０、Ｄ１、Ｄ２に割り付けられたとする。変数ａ、ｘ、ｙがレジスタに割り付けられたので、図１１（ｄ）に示すプログラム中の各代入式はオペランドをレジスタにした機械語コードに変換される。
【００８８】
図１１（ｄ）で位置ｓ１〜ｓ３の中間言語プログラムから生成された機械語コードを図１２に示す。図中の『movi #10000,D0』、『add D0,D1』、『add D0,D2』は、伝播後の中間言語プログラムの代入式に対応している。これらの機械語コードの右隣に、メモリサイズ、実行サイクルが書かれているが、これらの機械語コードはレジスタを被演算子にしているから、『add D0,D1』は、メモリサイズが”１”、実行サイクルが”１”となり、『add D0,D2』は、メモリサイズが”１”、実行サイクルが”１”となる。これが従来例のようにこの機械語コードが即値『#10000』を含んだものであれば、図１４に示したようにメモリサイズが”４”、実行サイクルが”４”となる。そのため、本発明の伝播では、より低コストの機械語プログラムに書き換えられることがわかる。
【００８９】
以上説明したように本発明によれば、定数の伝播、定数の畳み込みを有効に行いつつも、定数の伝播に伴うコスト増加を防止することができる。
なお、上記実施例においてコストとして命令のサイズと実行時間（サイクル数）を並列に用いたが、これらを単独で用いてもよい。またこれらに演算を施した値をコストとして用いても良いことは言うまでもない。
【００９０】
【発明の効果】
以上説明してきたように請求項１に係る最適化装置においては、
第１の書換手段による書き換えでプログラムの簡素化を行うことができ、残りの式の書き換えは第１の推定手段の推定結果が第２の推定手段による推定結果以下である場合にのみ行うので、定数の伝播に伴うコスト増加を防止することができる。このようにコスト増加を伴わずに定数の伝播が行えれば、プログラムの冗長部が無くなるので、このプログラムに基づいて生成される機械語プログラムが至って高効率になる。
【００９１】
また、請求項２に係る最適化装置においては、請求項１の効果に加えて、
全ての被演算子が定数になった式はそれらの被演算子による演算結果を代入する式に書き換えられ、書き換えた式が管理手段に管理されるので、第１の及び第２の書換手段の書き換えによって定数保持変数を新たに生成することができ、定数保持変数が保持する定数を伝播することが可能となる。以上の処理が繰り返され、伝播及び畳み込みが順々に行われると、多くの式が削除されてプログラムが至って簡素になる。そのため、最終的に生成される機械語プログラムの実行時間及びメモリサイズを大きく低減することができる。
【００９２】
また、請求項３に係る最適化装置においては、請求項１の効果に加えて、
第１、第２及び第４の書換手段によって式が削除されたプログラム中の変数に対して資源割り付けが行われ、また、この資源割り付けの結果、メモリに割り付けらた変数のうち定数保持変数は、メモリが割り付けられる代わりに定数に書き換えられるので、定数保持変数が被演算子になっている式及び定数を代入している式についてはメモリアクセスが不要になる。そのため、そのメモリアクセスの分だけ、実行時間を短くすることができる。
【００９３】
また、請求項４に係る最適化装置においては、請求項１の効果に加えて、
関連式集合中の各式が機械語命令に置き換えられ、各機械語命令のコストが関連式集合単位に推定されることで推定が行われるので、より正確なコストを推定することができる。そのため、被演算子の書き換えを行うか否かの判断がより正確になる。
【図面の簡単な説明】
【図１】本発明の一実施例におけるコンパイラ及び最適化装置２００の構成図である。
（ａ）コンパイラの構成図である。
（ｂ）（ａ）に示したコンパイラの内部構成における最適化装置２００の構成図である。
【図２】本発明の一実施例における定数最適化装置６０の内部構成図である。
【図３】部分定数式書き換え部９の処理内容を示すフローチャートである。
【図４】定数最適化装置６０の内部構成におけるコスト判定書き換え部１０及びメモリ変数書き換え部１２の構成図である。
（ａ）コスト判定書き換え部１０の構成図である。
（ｂ）メモリ変数書き換え部１２の構成図である。
【図５】コスト保持部１５の保持内容の一例を示す図である。
【図６】定数最適化装置６０の内部構成におけるコスト判定書き換え部１０及びメモリ変数書き換え部１２の処理内容を示すフロ−チャ−トである。
（ａ）コスト判定書き換え部１０の処理内容を示すフロ−チャ−トである。
（ｂ）メモリ変数書き換え部１２の処理内容を示すフロ−チャ−トである。
【図７】ソースプログラム及び中間言語プログラムの一例と、その一例が如何に書き換えられるかを示した説明図である。
（ａ）ソースプログラムの一例である。
（ｂ）部分定数式書き換え部を経た後の中間言語プログラムの一例である。
（ｃ）コスト判定書き換え部を経た後の中間言語プログラムの一例である。
（ｄ）メモリ変数書き換え部を経た後の中間言語プログラムの一例である。
（ｅ）定数保持変数定義除去部を経た後の中間言語プログラムの一例である。
（ｆ）定数保持変数定義除去部を経た後の中間言語プログラムの一例である。
【図８】定数変数情報の内容が遷移してゆく様子を示した図である。
（ａ）使用式検出部８の処理を経た後の定数変数情報の一例である。
（ｂ）部分定数式書き換え部９の処理を経た後の定数変数情報の一例である。
（ｃ）コスト判定書き換え部１０の処理を経た後の定数変数情報の一例である。
（ｄ）メモリ変数書き換え部１２の処理を経た後の定数変数情報の一例である。
（ｅ）メモリ変数書き換え部１２の処理を経た後の定数変数情報の一例である。
【図９】  MPUの命令セットの一例である。
【図１０】コスト保持部１５において登録されている情報の一例である。
【図１１】ソースプログラム及び中間言語プログラムの一例と、その一例が如何に書き換えられるかを示した説明図である。
（ａ）ソースプログラムの一例である。
（ｂ）部分定数式書き換え部を経た後の中間言語プログラムの一例である。
（ｃ）定数の伝播及び畳み込みが行われた中間言語プログラムの一例である
（ｄ）定数の伝播及び畳み込みが行われた中間言語プログラムの一例である
（ｅ）定数の伝播及び畳み込みが行われた中間言語プログラムの一例である
（ｆ）定数の伝播及び畳み込みが行われた中間言語プログラムの一例である
【図１２】本発明の最適化装置を経た後の機械語プログラムの一例である。
【図１３】ソースプログラム及び中間言語プログラムの一例と、その一例が、従来の最適化装置によって如何に書き換えられるかを示した説明図である。
（ａ）中間言語プログラムの一例である。
（ｂ）定数の伝播及び畳み込みが行われた中間言語プログラムの一例である
（ｃ）定数の伝播及び畳み込みが行われた中間言語プログラムの一例である
（ｄ）定数の伝播及び畳み込みが行われた中間言語プログラムの一例である
（ｅ）定数の伝播及び畳み込みが行われた中間言語プログラムの一例である
（ｆ）定数の伝播及び畳み込みが行われた中間言語プログラムの一例である
【図１４】定数の伝播及び畳み込みが行われた後に、生成される機械語プログラムを示す図である。
【符号の説明】
１００    構文解析装置
２００    最適化装置
３００    コード生成装置
４００    最適化時使用情報検出装置
４０    最適化時使用情報検出装置
５０    一般コード最適化装置
６０    定数最適化装置
６    定数保持変数情報保持部
７    定数保持変数定義検出部
８    使用式検出部
９    部分定数式書き換え部
１０    コスト判定書き換え部
１１    資源割り付け部
１２    メモリ変数書き換え部
１３    定数保持変数定義除去部
１４    制御部
１５    コスト保持部
１６    レジスタ変数定義コスト計算部
１７    レジスタ変数使用コスト計算部
１８    定数使用コスト計算部
１９    書き換え判定部
２０    書き換え部
２２    制御部
２３    レジスタ変数判定部
２４    書き換え部
【図１】
0003650649.tif 000002
【図２】
0003650649.tif 000003
【図３】
0003650649.tif 000004
【図４】
0003650649.tif 000005
【図５】
0003650649.tif 000006
【図６】
0003650649.tif 000007
【図７】
0003650649.tif 000008
【図８】
0003650649.tif 000009
【図９】
0003650649.tif 000010
【図１０】
0003650649.tif 000011
【図１１】
0003650649.tif 000012
【図１２】
0003650649.tif 000013
【図１３】
0003650649.tif 000014
【図１４】
0003650649.tif 000015