(57)【特許請求の範囲】
【請求項１】
複数の命令からなるプログラムを、機械語プログラムに翻訳するコンパイル装置であって、
前記プログラム中の飛び越し命令と、当該飛び越し命令の飛び越し先の命令とを検出する飛び越し検出手段と、
飛び越し検出手段が検出した命令に基づいて、前記プログラムを基本ブロックに分割する分割手段と、
プログラム中の各変数について、変数の設定値が有効となるプログラム中の区間である生存区間を検出し、検出結果を、生存区間内に含まれる命令の位置を示す命令位置情報の集合で表す生存区間検出手段と、
生存区間検出手段が検出した生存区間が１つの基本ブロック内に収まる変数を全て検出し、検出結果を、当該基本ブロックに対応づけた基本ブロック内生存変数集合で表す基本ブロック内生存変数検出手段と、
生存区間検出手段が検出した生存区間が、複数の基本ブロック間におよぶ変数を全て検出し、検出結果を、基本ブロック間生存変数集合で表す基本ブロック間生存変数検出手段と、
基本ブロック間生存変数集合から変数を２つずつ取り出し、当該２変数の生存区間に対応する命令位置情報集合の集合積を算出することで、生存区間の重複を判定する第１の生存区間重複判定手段と、
同一の基本ブロックに対応づけられた基本ブロック内生存変数集合から変数を２つずつ取り出し、当該２変数の生存区間に対応する命令位置情報集合の集合積を算出することで、生存区間の重複を判定する第２の生存区間重複判定手段と、
前記基本ブロックに対応づけられた基本ブロック内生存変数集合と、基本ブロック間生存変数とから変数を１つずつ取り出し、当該２変数の生存区間に対応する命令位置情報集合の集合積を算出することで、生存区間の重複を判定する第３の生存区間重複判定手段と、
前記第１、第２、第３の生存区間重複判定手段の判定結果を用いて資源割付を行うことを特徴とするコンパイル装置。
【請求項２】
前記コンパイル装置は更に、
変数の値を設定する命令である定義命令と、当該定義命令で設定された変数の値を使用する命令である参照命令とが、少なくとも一組順に並ぶ命令列である単純ブロックを、基本ブロック内に形成する単純ブロック形成手段と、
前記基本ブロック内生存変数集合から、生存区間が一つの単純ブロック内に収まる変数を全て検出し、検出結果を、当該単純ブロックに対応づけた単純ブロック内生存変数集合で表す単純ブロック内生存変数検出手段と、
前記基本ブロック内生存変数集合から生存区間が複数の単純ブロック間におよぶ変数を検出し、検出結果を、単純ブロック間生存変数集合で表す単純ブロック間生存変数検出手段と、
を備え、
前記第２の生存区間重複判定手段は、前記単純ブロック間生存変数集合から変数を２つずつ取り出し、当該２変数の生存区間に対応する命令位置情報集合の集合積を算出することで、生存区間の重複を判定する第１の生存区間重複判定部と、
同一の単純ブロックに対応づけられた単純ブロック内変数集合から変数を２つずつ取り出し、当該２変数の生存区間に対応する命令位置情報集合の集合積を算出することで、生存区間の重複を判定する第２の生存区間重複判定部と、
前記単純ブロックに対応づけられた単純ブロック内変数集合と、単純ブロック間生存変数集合とから変数を１つずつ取り出し、当該２変数の生存区間に対応する命令位置情報集合の集合積を算出することで、生存区間の重複を判定する第３の生存区間重複判定部と、
を備えることを特徴とする請求項１記載のコンパイル装置。
【請求項３】
前記第３の生存区間重複判定手段は、基本ブロック間生存変数集合と、前記単純ブロックに対応づけられた単純ブロック内生存変数集合とから変数を１つずつ取り出し、当該２変数の生存区間に対応する命令位置集合の集合積を算出することで、生存区間の重複を判定する第４の生存区間重複判定部と、
基本ブロック間生存変数集合と、単純ブロック間生存変数集合とから変数を１つずつ取り出し、当該２変数の生存区間に対応する命令位置集合の集合積を算出することで、生存区間の重複を判定する第５の生存区間重複判定部と、
を備えることを特徴とする請求項２記載のコンパイル装置。
【請求項４】
前記単純ブロック形成手段は、基本ブロックから、定義命令を１つずつ取り出す定義命令取り出し手段と、
定義命令取り出し手段が取り出した定義命令が含まれる基本ブロックから、その定義命令に対応する参照命令を検出する対応参照命令検出手段と、
対応参照命令検出手段が検出した参照命令の位置に、当該参照命令に対応する定義命令が移動可能か否かを判定する定義命令移動可否判定手段と、
定義命令移動可否判定手段が可能と判定した場合、定義命令移動可否判定手段が可能と判定した定義命令を、当該定義命令に対応する参照命令の直前に移動し、当該定義命令及び参照命令を一つの単純ブロックに統合する定義命令移動手段と、
定義命令移動手段が移動した定義命令が、移動前において、単純ブロック内の最後の命令である場合、移動前の単純ブロックの残りの命令の全てを当該定義命令の移動先の直前に移動し、移動した残命令を、移動先の単純ブロックに統合する単純ブロック残命令移動手段と、
を備えることを特徴とする請求項２又は３記載のコンパイル装置。
【請求項５】
前記定義命令移動可否判定手段は、前記定義命令取り出し手段が取り出した定義命令によって値が設定される変数が一つであるか否かを判定する変数単複判定部と、
前記変数単複判定部が一つであると判定した場合、前記対応参照命令検出手段が検出した参照命令が一つか否かを判定する参照命令単複判定部と、
前記参照命令単複判定部が一つであると判定した場合、当該参照命令に対応する定義命令で値が設定される変数が、当該定義命令から当該参照命令までの区間において再設定されるか否かを判定する第１の再設定有無判定部と、
前記第１の再設定有無判定部が再設定がないと判定した場合、当該定義命令において使用される変数を検出する定義命令内使用変数検出部と、
前記定義命令内使用変数検出部が検出した変数が、当該定義命令から当該参照命令までの間に再設定されないことを判定する第２の再設定有無判定部と、
前記第２の再設定有無判定部が再設定が無いと判定した場合、当該定義命令が、当該参照命令の位置に移動可能と判定する移動可否判定部と、
からなることを特徴とする請求項４記載のコンパイル装置。
【請求項６】
前記コンパイル装置は更に、
前記プログラム中の各基本ブロックと、当該基本ブロックの入口において有効となる変数及び出口において有効となる変数とを対応させて記憶する有効変数情報記憶手段を備え、前記生存区間検出手段は、前記プログラムから定義命令を１つずつ取り出す定義命令取り出し部と、
前記定義命令取り出し部によって取り出された定義命令を含む基本ブロックと、当該定義命令によって設定される変数とを検出し、検出した変数の設定値が当該基本ブロックの出口で無効か否かを、前記有効変数情報記憶手段の記憶内容に基づき判定する出口無効判定部と、
前記出口無効判定部が設定値無効と判定した場合、当該基本ブロックから、当該定義命令に対応する参照命令であって、当該基本ブロックの出口に最も近いものを検出する出口最近参照命令検出部と、
当該定義命令の次の命令から出口最近参照命令検出部が検出した参照命令までの命令位置情報を全て検出する基本ブロック内命令位置検出部と、
命令位置情報が検出された変数についての生存区間を、基本ブロック内命令位置検出部が検出した命令位置情報の集合で表す基本ブロック内生存区間表現部と、
を備え、
前記基本ブロック内生存変数検出手段は、前記基本ブロック内生存区間表現部が生存区間を表現した変数を、当該変数が含まれる基本ブロックに対応する基本ブロック内生存変数集合のメンバーにする
ことを特徴とする請求項１から５記載のコンパイル装置。
【請求項７】
前記コンパイル装置は更に、
基本ブロックと、当該基本ブロックにおいて設定される変数とを対応させて記憶する基本ブロック内定義情報記憶手段を備え、
前記生存区間検出手段は、
前記出口無効判定部が有効と判定した場合、前記基本ブロック内定義情報記憶手段の記憶内容に基づいて、前記出口無効判定部によって有効と判定された定義命令において設定される変数が、当該定義命令から当該定義命令を含む基本ブロックの出口までの間に再設定されるか否かを判定する再設定有無判定部と、
前記再設定値有無判定部が再設定無しと判定した場合、当該定義命令の次の命令から当該基本ブロックの出口までの命令位置情報を検出する出口有効時位置情報検出部と、
前記再設定有無判定部が再設定無しと判定した場合、前記有効変数情報記憶手段および基本ブロック内定義情報記憶手段の記憶内容に基づいて、当該定義命令が含まれる基本ブロックの次順の基本ブロックのうち、当該変数がその入口及び出口で有効であり、かつその内部で、当該変数が再設定されないものを全て検出する生存基本ブロック検出部と、
前記基本ブロック内定義情報記憶手段の記憶内容に基づいて、前記生存基本ブロック検出部が検出した基本ブロック内に含まれる命令位置情報を全て検出する基本ブロック間位置情報検出部と、
前記再設定有無判定部が再設定無しと判定した場合、当該定義命令が含まれる基本ブロックの次順の基本ブロックのうち、その入口で当該変数の値が有効であり、その出口で無効である基本ブロックを検出する末尾基本ブロック検出部と、
前記末尾基本ブロック検出部が検出した基本ブロックから、当該定義命令に対応する最後の参照命令を検出する末尾参照命令検出部と、
前記末尾基本ブロック検出部が検出した基本ブロックの入口から前記末尾参照命令検出部が検出した参照命令までの命令位置情報を全て検出する入口有効時位置情報検出部と、
再設定有無判定部が再設定なしと判定した変数に対応する生存区間の集合を、出口有効時位置情報検出手段の検出結果と、入口有効時位置情報検出手段の検出結果と、基本ブロック間位置情報検出手段の検出結果とをあわせた集合で表す基本ブロック間生存区間表現部と、
を備え、前記基本ブロック間生存変数検出手段は、前記再設定有無判定部が再設定無しと判定した変数を、基本ブロック間生存変数集合のメンバーにすることを特徴とする請求項６記載のコンパイル装置。
【請求項８】
前記コンパイル装置は更に、
プログラム中の各命令位置と、当該命令位置の命令において使用される変数と、当該変数が設定される命令の命令位置情報とを対応させて記憶する参照−定義情報記憶手段を備え、前記生存区間検出手段は、前記定義命令取り出し部が取り出した定義命令の位置に識別情報を付するマーキング部と、
前記定義命令取り出し部が取り出した定義命令に対応する参照命令で使用される変数を検出する参照変数検出部と、
参照−定義情報記憶手段の記憶内容に基づいて、前記参照変数検出部が検出した変数に設定値を設定する定義命令を全て検出する定義命令検出部と、
前記定義命令検出部が検出した定義命令のうち、前記マーキング部によって付された識別情報が無いものを検出する無マーク定義命令検出部と、
前記無マーク定義命令検出部が検出した定義命令の次の命令から、その定義命令を含む基本ブロックの出口までの命令位置情報を全て検出する第１の分岐ブロック内位置情報検出部と、
基本ブロック間生存区間表現部が表した命令位置情報の集合に、前記第１の分岐ブロック内位置情報検出部が検出した命令位置情報を付加する第１の命令位置情報付加部と、
を備えることを特徴とする請求項７記載のコンパイル装置。
【請求項９】
前記コンパイル装置は更に、
プログラム中の各命令位置と、当該命令位置の命令において設定される変数と、当該変数が使用される命令の命令位置情報とを対応させて記憶する定義−参照情報記憶手段を備え、前記生存区間検出手段は、前記定義−参照情報記憶手段の記憶内容に基づいて、前記無マーク定義命令検出部が検出した定義命令に対応する参照命令を検出する分岐ブロック内参照命令検出部と、
前記分岐ブロック内参照命令検出部が検出した参照命令を含む基本ブロックを検出する分岐ブロック検出部と、
前記分岐ブロック検出部が検出した基本ブロックの入口から、前記分岐ブロック内参照命令検出部が検出した参照命令までの命令位置情報を全て検出する第２の分岐ブロック内位置情報検出部と、
前記基本ブロック間生存区間表現部が表した命令位置情報の集合に、前記第２の分岐ブロック内位置情報検出部が検出した命令位置情報を付加する第２の命令位置情報付加部と、
を備えることを特徴とする請求項８記載のコンパイル装置。
【発明の詳細な説明】
【０００１】
【産業上の利用分野】
本発明は高級プログラミング言語で書かれたソースプログラムを機械語プログラムにコンパイルするコンパイル装置に関する。
【０００２】
【従来の技術】
近年、Ｃ言語などの高級プログラミング言語でプログラムを記述し、プログラムの開発効率を高めることが盛んに行なわれている。
高級プログラミング言語を用いれば、プログラマは、プログラム中の数値の保持、演算、転送等の処理を、変数を被演算子とした演算（ステップ）で表現できる。この変数はプログラマによって任意に定義され、また必要な個数だけ用いられるため、プログラマは自由にプログラムを記述できる。また記述されたプログラム（ソースプログラムと称す。）は、コンパイルされることにより、コンピュータが理解可能な機械語プログラムとなる。当該機械語プログラム中の演算は、機械語命令によって表現され、また当該機械語命令は、レジスタあるいはメモリを被演算子とするので、上記変数には、レジスタあるいはメモリを割り付ける必要がある。この割り付け処理は資源割付処理と称される。この資源割付処理が最適であれば、上記機械語命令のコードサイズは最小、実行時間は最短となる。
【０００３】
一方、レジスタとメモリとを比較すれば、レジスタを被演算子とする方が機械語命令の小サイズ化、実行時間の最短化が図れる。
但しレジスタは、使用できる個数が少数であるため、上記資源割付を行う前に同一レジスタを割り付け得る変数はどれとどれであるかを生存区間に基づき検査し、当該検査の検査結果によって、資源割付を行うことが一般的である。生存区間とは、それぞれの変数に格納されている値が有効となる区間のことであり、プログラムと、当該プログラムにおいて使用されている変数の生存区間を図２３（ａ）に示す。
【０００４】
本図において、変数ｘ４と、変数ｔ３は、生存区間が重なっていることから、同一レジスタを割り付け得ないことがわかる。変数ｔ１と、変数ｔ３は、この生存区間が重なっていないことから、同一レジスタを割り付け得ることがわかる。
次に、プログラム中の各変数の生存区間を、中間言語ステップの集合で表現する。中間言語ステップは、図２３（ａ）の一例では、ｓ１，ｓ２，ｓ３，ｓ４，ｓ５・・・・で表される。また中間言語ステップ集合での生存区間の表現を図２３（ｂ）の一例に示す。図２３（ｂ）の一例では、変数ｔ１の生存区間は、中間言語ステップｓ２のみであり、変数ｘの生存区間は、中間言語ステップｓ８，ｓ９，ｓ１０，ｓ１１であることが示される。
【０００５】
次に、プログラム中の任意の２変数について、中間言語ステップ集合の集合積をとる。この集合積が空であれば、その２変数の生存区間は重ならないと判定でき、空でなければ重なると判定できる。図２３（ｂ）の一例では、変数ｘと変数ｘ４とは、生存区間の集合に共通要素がないため上記集合積が空となり、非重複が判定される。また、変数ｘ４と変数ｔ３とは、生存区間の集合に共通要素ｓ４が存在するため、上記集合積の結果が空でなくなる。そのため、変数ｘ４と変数ｔ３とは生存区間の重複が判定される。
【０００６】
このように、集合積の算出を繰り返し、各変数の生存区間の重複、非重複を、図２３（ｃ）に示すように判定する。本図において、変数ｔ１は、変数ｐ１，ｐ２，ｐ３と生存区間が重なることが示される。また変数ｘ４も、変数ｐ１，ｐ２，ｐ３と生存区間が重なることが示される。
以上に述べた重複調査を行うと、レジスタに割り付ける変数の数を、より多くすることができる。
【０００７】
【発明が解決しようとする課題】
しかしながら上記従来技術によれば、生存区間の重複検査に要する処理時間が多大なものとなるという問題点があった。上述のように、変数はプログラマの都合によって作成される。そのため、複数人のプログラマによって作成されるソフトウェア中の変数の総数は、百個前後になることが一般的である。これに加えて、中間言語プログラムの生成時には、変数が、コンパイル装置によって自動的に生成されるので、結果として重複検査の対象となる変数の総数は、数百個単位になる。
【０００８】
変数の生存区間の重複検査は、集合積の算出によって求められるが、この集合積の、ｎ個の変数についての計算回数は、nＣ2＝ｎ（ｎ−１）／２回であり、個数ｎが数百個である場合、集合積の計算回数が非常に大きな数となる。例えば変数の個数ｎが１００個だとすると、nＣ2＝４９５０となり、コンパイル装置は、上記集合積の計算を４９５０回行うことになる。個数ｎが３００個だとすると、nＣ2＝４４８５０となり、コンパイル装置は、集合積の計算を４４８５０回行うことになる。
【０００９】
本発明は、上記問題点に鑑み、生存区間の重複検査に要する処理時間を大きく低減できるコンパイル装置を提供することを目的とする。
【００１０】
【課題を解決するための手段】
上記目的を達成するために請求項１のコンパイル装置は、複数の命令からなるプログラムを、機械語プログラムに翻訳するコンパイル装置であって、
前記プログラム中の飛び越し命令と、当該飛び越し命令の飛び越し先の命令とを検出する飛び越し検出手段と、
飛び越し検出手段が検出した命令に基づいて、前記プログラムを基本ブロックに分割する分割手段と、
プログラム中の各変数について、変数の設定値が有効となるプログラム中の区間である生存区間を検出し、検出結果を、生存区間内に含まれる命令の位置を示す位置情報の集合で表す生存区間検出手段と、
生存区間検出手段が検出した生存区間が１つの基本ブロック内に収まる変数を全て検出し、検出結果を、当該基本ブロックに対応づけた基本ブロック内生存変数集合で表す基本ブロック内生存変数検出手段と、
生存区間検出手段が検出した生存区間が、複数の基本ブロック間におよぶ変数を全て検出し、検出結果を、基本ブロック間生存変数集合で表す基本ブロック間生存変数検出手段と、
基本ブロック間生存変数集合から変数を２つずつ取り出し、当該２変数の生存区間に対応する命令位置情報集合の集合積を算出することで、生存区間の重複を判定する第１の生存区間重複判定手段と、
同一の基本ブロックに対応づけられた基本ブロック内生存変数集合から変数を２つずつ取り出し、当該２変数の生存区間に対応する命令位置情報集合の集合積を算出することで、生存区間の重複を判定する第２の生存区間重複判定手段と、
前記基本ブロックに対応づけられた基本ブロック内生存変数集合と、基本ブロック間生存変数とから変数を１つずつ取り出し、当該２変数の生存区間に対応する命令位置情報集合の集合積を算出することで、生存区間の重複を判定する第３の生存区間重複判定手段と、
前記第１、第２、第３の生存区間重複判定手段の判定結果を用いて資源割付を行うことを特徴としている。
【００１１】
請求項２のコンパイル装置は更に、
変数の値を設定する命令である定義命令と、当該定義命令で設定された変数の値を使用する命令である参照命令とが、少なくとも一組順に並ぶ命令列である単純ブロックを、基本ブロック内に形成する単純ブロック形成手段と、
前記基本ブロック内生存変数集合から、生存区間が一つの単純ブロック内に収まる変数を全て検出し、検出結果を、当該単純ブロックに対応づけた単純ブロック内生存変数集合で表す単純ブロック内生存変数検出手段と、
前記基本ブロック内生存変数集合から生存区間が複数の単純ブロック間におよぶ変数を検出し、検出結果を、単純ブロック間生存変数集合で表す単純ブロック間生存変数検出手段と、
を備え、
前記第２の生存区間重複判定手段は、前記単純ブロック間生存変数集合から変数を２つずつ取り出し、当該２変数の生存区間に対応する命令位置情報集合の集合積を算出することで、生存区間の重複を判定する第１の生存区間重複判定部と、
同一の単純ブロックに対応づけられた単純ブロック内変数集合から変数を２つずつ取り出し、当該２変数の生存区間に対応する命令位置情報集合の集合積を算出することで、生存区間の重複を判定する第２の生存区間重複判定部と、
前記単純ブロックに対応づけられた単純ブロック内変数集合と、単純ブロック間生存変数集合とから変数を１つずつ取り出し、当該２変数の生存区間に対応する命令位置情報集合の集合積を算出することで、生存区間の重複を判定する第３の生存区間重複判定部と、
を備えることを特徴としている。
【００１２】
請求項３のコンパイル装置は、
前記第３の生存区間重複判定手段は、
基本ブロック間生存変数集合と、前記単純ブロックに対応づけられた単純ブロック内生存変数集合とから変数を１つずつ取り出し、当該２変数の生存区間に対応する命令位置集合の集合積を算出することで、生存区間の重複を判定する第４の生存区間重複判定部と、
基本ブロック間生存変数集合と、単純ブロック間生存変数集合とから変数を１つずつ取り出し、当該２変数の生存区間に対応する命令位置集合の集合積を算出することで、生存区間の重複を判定する第５の生存区間重複判定部と、
を備えることを特徴としている。
【００１３】
請求項４のコンパイル装置は、
前記単純ブロック形成手段として、
基本ブロックから、定義命令を１つずつ取り出す定義命令取り出し手段と、
定義命令取り出し手段が取り出した定義命令が含まれる基本ブロックから、その定義命令に対応する参照命令を検出する対応参照命令検出手段と、
対応参照命令検出手段が検出した参照命令の位置に、当該参照命令に対応する定義命令が移動可能か否かを判定する定義命令移動可否判定手段と、
定義命令移動可否判定手段が可能と判定した場合、定義命令移動可否判定手段が可能と判定した定義命令を、当該定義命令に対応する参照命令の直前に移動し、当該定義命令及び参照命令を一つの単純ブロックに統合する定義命令移動手段と、
定義命令移動手段が移動した定義命令が、移動前において、単純ブロック内の最後の命令である場合、移動前の単純ブロックの残りの命令の全てを当該定義命令の移動先の直前に移動し、移動した残命令を、移動先の単純ブロックに統合する単純ブロック残命令移動手段と、
を備えることを特徴としている。
【００１４】
請求項５のコンパイル装置は、
前記定義命令移動可否判定手段として、
前記定義命令取り出し手段が取り出した定義命令によって値が設定される変数が一つであるか否かを判定する変数単複判定部と、
前記変数単複判定部が一つであると判定した場合、前記対応参照命令検出手段が検出した参照命令が一つか否かを判定する参照命令単複判定部と、
前記参照命令単複判定部が一つであると判定した場合、当該参照命令に対応する定義命令で値が設定される変数が、当該定義命令から当該参照命令までの区間において再設定されるか否かを判定する第１の再設定有無判定部と、
前記第１の再設定有無判定部が再設定がないと判定した場合、当該定義命令において使用される変数を検出する定義命令内使用変数検出部と、
前記定義命令内使用変数検出部が検出した変数が、当該定義命令から当該参照命令までの間に、再設定されないことを判定する第２の再設定有無判定部と、
前記第２の再設定有無判定部が再設定が無いと判定した場合、当該定義命令が、当該参照命令の位置に移動可能と判定する移動可否判定部と、
からなることを特徴としている。
【００１５】
請求項６のコンパイル装置は更に、
前記プログラム中の各基本ブロックと、当該基本ブロックの入口において有効となる変数及び出口において有効となる変数とを対応させて記憶する有効変数情報記憶手段を備え、
前記生存区間検出手段は、前記プログラムから定義命令を１つずつ取り出す定義命令取り出し部と、
前記定義命令取り出し部によって取り出された定義命令を含む基本ブロックと、当該定義命令によって設定される変数とを検出し、検出した変数の設定値が当該基本ブロックの出口で無効か否かを、前記有効変数情報記憶手段の記憶内容に基づき判定する出口無効判定部と、
前記出口無効判定部が設定値無効と判定した場合、当該基本ブロックから、当該定義命令に対応する参照命令であって、当該基本ブロックの出口に最も近いものを検出する出口最近参照命令検出部と、
当該定義命令の次の命令から出口最近参照命令検出部が検出した参照命令までの命令位置情報を全て検出する基本ブロック内命令位置検出部と、
命令位置情報が検出された変数についての生存区間を、基本ブロック内命令位置検出部が検出した命令位置情報の集合で表す基本ブロック内生存区間表現部と、
を備え、
前記基本ブロック内生存変数検出手段は、前記基本ブロック内生存区間表現部が生存区間を表現した変数を、当該変数が含まれる基本ブロックに対応する基本ブロック内生存変数集合のメンバーにする
ことを特徴としている。
【００１６】
請求項７のコンパイル装置は更に、
基本ブロックと、当該基本ブロックにおいて設定される変数とを対応させて記憶する基本ブロック内定義情報記憶手段を備え、
前記生存区間検出手段は、
前記出口無効判定部が有効と判定した場合、前記基本ブロック内定義情報記憶手段の記憶内容に基づいて、前記出口無効判定部によって有効と判定された定義命令において設定される変数が、当該定義命令から当該定義命令を含む基本ブロックの出口までの間に再設定されるか否かを判定する再設定有無判定部と、
前記再設定値有無判定部が再設定無しと判定した場合、当該定義命令の次の命令から当該基本ブロックの出口までの命令位置情報を検出する出口有効時位置情報検出部と、
前記再設定有無判定部が再設定無しと判定した場合、前記有効変数情報記憶手段および基本ブロック内定義情報記憶手段の記憶内容に基づいて、当該定義命令が含まれる基本ブロックの次順の基本ブロックのうち、当該変数がその入口及び出口で有効であり、かつその内部で、当該変数が再設定されないものを全て検出する生存基本ブロック検出部と、
前記基本ブロック内定義情報記憶手段の記憶内容に基づいて、前記生存基本ブロック検出部が検出した基本ブロック内に含まれる命令位置情報を全て検出する基本ブロック間位置情報検出部と、
前記再設定有無判定部が再設定無しと判定した場合、当該定義命令が含まれる基本ブロックの次順の基本ブロックのうち、その入口で当該変数の値が有効であり、その出口で無効である基本ブロックを検出する末尾基本ブロック検出部と、
前記末尾基本ブロック検出部が検出した基本ブロックから、当該定義命令に対応する最後の参照命令を検出する末尾参照命令検出部と、
前記末尾基本ブロック検出部が検出した基本ブロックの入口から前記末尾参照命令検出部が検出した参照命令までの命令位置情報を全て検出する入口有効時位置情報検出部と、
前記再設定有無判定部が再設定無しと判定した変数に対応する生存区間の集合を、出口有効時位置情報検出手段の検出結果と、入口有効時位置情報検出手段の検出結果と、基本ブロック間位置情報検出手段の検出結果とをあわせた集合で表す基本ブロック間生存区間表現部と、
を備え、
前記基本ブロック間生存変数検出手段は、前記再設定有無判定部が再設定無しと判定した変数を、基本ブロック間生存変数集合のメンバーにする
ことを特徴としている。
【００１７】
請求項８のコンパイル装置は、
プログラム中の各命令位置と、当該命令位置の命令において使用される変数と、当該変数が設定される命令の命令位置情報とを対応させて記憶する参照−定義情報記憶手段を備え、
前記生存区間検出手段は、
前記定義命令取り出し部が取り出した定義命令の位置に識別情報を付するマーキング部と、
前記定義命令取り出し部が取り出した定義命令に対応する参照命令で使用される変数を検出する参照変数検出部と、
参照−定義情報記憶手段の記憶内容に基づいて、前記参照変数検出部が検出した変数に設定値を設定する定義命令を全て検出する定義命令検出部と、
前記定義命令検出部が検出した定義命令のうち、前記マーキング部によって付された識別情報が無いものを検出する無マーク定義命令検出部と、
前記無マーク定義命令検出部が検出した定義命令の次の命令から、その定義命令を含む基本ブロックの出口までの命令位置情報を全て検出する第１の分岐ブロック内位置情報検出部と、
前記基本ブロック間生存区間表現部が表した命令位置情報の集合に、前記第１の分岐ブロック内位置情報検出部が検出した命令位置情報を付加する第１の命令位置情報付加部と、
を備えることを特徴としている。
【００１８】
請求項９のコンパイル装置は、
プログラム中の各命令位置と、当該命令位置の命令において設定される変数と、当該変数が使用される命令の命令位置情報とを対応させて記憶する定義−参照情報記憶手段を備え、
前記生存区間検出手段は、
前記定義−参照情報記憶手段の記憶内容に基づいて、前記無マーク定義命令検出部が検出した定義命令に対応する参照命令を検出する分岐ブロック内参照命令検出部と、
前記分岐ブロック内参照命令検出部が検出した参照命令を含む基本ブロックを検出する分岐ブロック検出部と、
前記分岐ブロック検出部が検出した基本ブロックの入口から、前記分岐ブロック内参照命令検出部が検出した参照命令までの命令位置情報を全て検出する第２の分岐ブロック内位置情報検出部と、
前記基本ブロック間生存区間表現部が表した命令位置情報の集合に、前記第２の分岐ブロック内位置情報検出部が検出した命令位置情報を付加する第２の命令位置情報付加部と、
を備えることを特徴としている。
【００１９】
【作用】
請求項１のコンパイル装置によれば、飛び越し検出手段によって前記プログラム中の飛び越し命令と、当該飛び越し命令の飛び越し先の命令とが検出される。飛び越し検出手段が検出を行うと、飛び越し検出手段が検出した命令に基づいて、前記プログラムが、分割手段によって、基本ブロックに分割される。分割後、プログラム中の各変数について、変数の設定値が有効となるプログラム中の区間である生存区間が生存区間検出手段によって検出され、検出結果が、生存区間内に含まれる命令の位置を示す命令位置情報の集合で表される。検出後、生存区間検出手段によって検出された生存区間が１つの基本ブロック内に収まる変数が基本ブロック内生存変数検出手段によって全て検出され、検出結果が、当該基本ブロックに対応づけられた基本ブロック内生存変数集合で表される。また前記生存区間が複数の基本ブロック間におよぶ変数が基本ブロック間生存変数検出手段によって全て検出され、検出結果が、基本ブロック間生存変数集合で表される。
【００２０】
検出後、基本ブロック間生存変数集合から、変数が第１の生存区間重複判定手段によって２つずつ取り出され、当該２変数の生存区間に対応する命令位置情報集合の集合積が算出されて、生存区間の重複が判定される。また同一の基本ブロックに対応づけられた基本ブロック内生存変数集合と、第２の生存区間重複判定手段によって、変数が２つずつ取り出され、当該２変数の生存区間に対応する命令位置情報集合の集合積が算出されることで、生存区間の重複が判定される。更に、前記基本ブロックに対応づけられた基本ブロック内生存変数集合から、基本ブロック間生存変数とから変数が第３の生存区間重複判定手段によって１つずつ取り出され、当該２変数の生存区間に対応する命令位置情報集合の集合積が算出されることで、生存区間の重複が判定される。プログラム中の変数の生存区間の重複判定は以上の判定処理によって全て完了する。以上の判定処理では、基本ブロック内のみに生存区間が収まる変数のうち、異なる基本ブロック内に属するもの同士の重複判定処理が結果として省かれる。このような判定処理の後、第１、第２、第３の生存区間重複判定手段の判定結果を用いて資源割付が行われる。
【００２１】
また、請求項２において、
変数の値を設定する命令である定義命令と当該定義命令で設定された変数の値を使用する命令である参照命令とが少なくとも一組順に並ぶ命令列である単純ブロックが単純ブロック形成手段によって基本ブロック内に形成される。単純ブロックは、定義命令と参照命令とが順に並ぶ命令列であるため、当該定義命令で定義される変数の生存区間は最短になる。プログラマが作成したソ−スプログラムおよび中間言語プログラムには、設定および使用が一回限りの変数が大多数を占めるので、プログラム中の大多数の変数が、上記単純ブロック内に納められる。
【００２２】
単純ブロック形成後、前記基本ブロック内生存変数集合から生存区間が一つの単純ブロック内に収まる変数が単純ブロック内生存変数検出手段によって全て検出され、検出結果は当該単純ブロックに対応づけた単純ブロック内生存変数集合で表される。また前記基本ブロック内生存変数集合から生存区間が複数の単純ブロック間におよぶ変数が単純ブロック間生存変数検出手段によって全て検出され、検出結果が単純ブロック間生存変数集合で表される。
【００２３】
単純ブロック内生存変数集合、単純ブロック間生存変数集合生成後、変数が、前記単純ブロック間生存変数集合から第１の生存区間重複判定部によって、２つずつ取り出され、当該２変数の生存区間に対応する命令位置情報集合の集合積が算出されることで、生存区間の重複が判定される。また、同一の単純ブロックに対応づけられた単純ブロック内変数集合から、第２の生存区間重複判定部によって、変数が２つずつ取り出され、当該２変数の生存区間に対応する命令位置情報集合の集合積が算出されることで、生存区間の重複を判定される。上記のように、単純ブロックにおいては、変数の生存区間は最短となり、上記集合積の算出は簡略なものとなる。更に前記単純ブロックに対応づけられた単純ブロック内変数集合と、単純ブロック間生存変数集合とから、第３の生存区間重複判定部によって、変数が１つずつ取り出され、当該２変数の生存区間に対応する命令位置情報集合の集合積が算出することで、生存区間の重複が判定される。
【００２４】
また請求項３において、
基本ブロック間生存変数集合と前記単純ブロックに対応づけられた単純ブロック内生存変数集合とから第４の生存区間重複判定部によって変数が１つずつ取り出され、当該２変数の生存区間に対応する命令位置集合の集合積が算出されることで、生存区間の重複が判定される。また、基本ブロック間生存変数集合と単純ブロック間生存変数集合とから、第５の生存区間重複判定部によって変数が１つずつ取り出され、当該２変数の生存区間に対応する命令位置集合の集合積を算出することで、生存区間の重複が判定される。
【００２５】
また請求項４において、
前記単純ブロック形成手段は、
定義命令取り出し手段によって、基本ブロックから、定義命令が１つずつ取り出される。定義命令取り出し手段によって取り出された定義命令が含まれる基本ブロックから、対応参照命令検出手段によって定義命令取り出し手段が取り出した定義命令に対応する参照命令が検出される。検出後、対応参照命令検出手段が検出を行った定義命令が、対応参照命令検出手段が検出した参照命令の位置に移動可能か否かが定義命令移動可否判定手段によって判定される。この判定において定義命令移動可否判定手段が可能と判定した場合、定義命令移動可否判定手段が可能と判定した定義命令が定義命令移動手段によって当該定義命令に対応する参照命令の直前に移動され、当該定義命令及び参照命令が一つの単純ブロックに統合される。定義命令移動手段が移動した定義命令が移動前において単純ブロック内の最後の命令である場合、単純ブロック残命令移動手段によって移動前の単純ブロックの残りの命令の全てが当該定義命令の移動先の直前に移動され、移動した残命令が、移動先の単純ブロックに統合される。
【００２６】
また請求項５において、
前記定義命令取り出し手段が取り出した定義命令によって値が設定される変数が一つであるか否かが変数単複判定部によって判定される。前記変数単複判定部が一つであると判定した場合、前記対応参照命令検出手段が検出した参照命令が一つか否かが参照命令単複判定部によって判定される。前記参照命令単複判定部が一つであると判定した場合、当該参照命令に対応する定義命令で値が設定される変数が、当該定義命令から当該参照命令までの区間において再設定されるか否かが、第１の再設定有無判定部によって判定される。前記第１の再設定有無判定部が再設定がないと判定すると当該定義命令において使用される変数が定義命令内使用変数検出部によって検出される。当該定義命令から当該参照命令までの間において、前記定義命令内使用変数検出部が検出した変数が再設定されないことが第２の再設定有無判定部によって判定される。前記第２の再設定有無判定部が再設定が無いと判定すると、当該定義命令が、当該参照命令の位置に移動可能であることが移動可否判定部によって判定される。    また、請求項６において、
前記定義命令取り出し部によって前記プログラムから定義命令が１つずつ取り出される。取り出された定義命令を含む基本ブロックと、当該定義命令によって設定される変数とが出口無効判定部によって検出され、検出された変数の設定値が当該基本ブロックの出口で無効か否かが、前記有効変数情報記憶手段の記憶内容に基づき判定される。前記出口無効判定部が設定値無効と判定した場合、当該基本ブロックから、当該定義命令に対応する参照命令であって、当該基本ブロックの出口に最も近いものが出口最近参照命令検出部によって検出される。参照命令の検出後、当該定義命令の次の命令から出口最近参照命令検出部が検出した参照命令までの命令位置情報が、基本ブロック内命令位置検出部によって全て検出される。命令位置情報の検出後、命令位置情報が検出された変数についての生存区間が、基本ブロック内生存区間表現部によって基本ブロック内命令位置検出部が検出した命令位置情報の集合で表される。一方、前記基本ブロック内生存区間表現部が生存区間を表現した変数が、前記基本ブロック内生存変数検出手段によって、当該変数が含まれる基本ブロックに対応する基本ブロック内生存変数集合のメンバーに加えられる。
【００２７】
また、請求項７において、
前記出口無効判定部が有効と判定した場合、前記基本ブロック内定義情報記憶手段の記憶内容に基づいて、前記出口無効判定部によって有効と判定された定義命令において設定される変数が、再設定有無判定部によって当該定義命令から当該定義命令を含む基本ブロックの出口までの間に再設定されるか否かが判定される。前記再設定値有無判定部が再設定無しと判定した場合、出口有効時位置情報検出部によって当該定義命令の次の命令から当該基本ブロックの出口までの命令位置情報が検出される。前記再設定有無判定部が再設定無しと判定することで、前記有効変数情報記憶手段および基本ブロック内定義情報記憶手段の記憶内容に基づいて、当該定義命令が含まれる基本ブロックの次順の基本ブロックのうち、当該変数がその入口及び出口で有効であり、かつその内部で、当該変数が再設定されないものの全てが、生存基本ブロック検出部によって検出される。前記基本ブロック内定義情報記憶手段の記憶内容に基づいて、基本ブロック間位置情報検出部によって、前記生存基本ブロック検出部が検出した基本ブロック内に含まれる命令位置情報が全て検出される。
【００２８】
前記再設定有無判定部が再設定無しと判定することで、当該定義命令が含まれる基本ブロックの次順の基本ブロックのうち、その入口で当該変数の値が有効であり、その出口で無効である基本ブロックが末尾基本ブロック検出部によって検出される。基本ブロックの検出後、前記末尾基本ブロック検出部が検出した基本ブロックから、末尾参照命令検出部により該定義命令に対応する参照命令が検出される。参照命令の検出後、前記末尾基本ブロック検出部が検出した基本ブロックの入口から前記末尾参照命令検出部が検出した参照命令までの命令位置情報が、入口有効時位置情報検出部によって全て検出される。命令位置情報の検出後、命令位置情報が検出された変数に対応する生存区間の集合が、基本ブロック間生存区間表現部によって出口有効時位置情報検出手段の検出結果と、入口有効時位置情報検出手段の検出結果と、基本ブロック間位置情報検出手段の検出結果とをあわせた集合で表される。
【００２９】
一方、再設定有無判定部が再設定なしと判定した変数は、前記基本ブロック間生存変数検出手段によって基本ブロック間生存変数集合のメンバーに加えられる。
また、請求項８において、
マーキング部によって、前記定義命令取り出し部が取り出した定義命令の位置に識別情報が付される。マーキング部によるマーキング後、当該定義命令に対応する参照命令で使用される変数が、参照変数検出部によって検出される。変数の検出後、参照−定義情報記憶手段の記憶内容に基づいて、前記参照変数検出部が検出した変数に設定値を設定する定義命令が、定義命令検出部によって全て検出される。定義命令の検出後、前記定義命令検出部が検出した定義命令のうち、前記マーキング部によって付された識別情報が無いものが無マーク定義命令検出部によって全て検出される。識別情報無し定義命令の検出後、前記無マーク定義命令検出部が検出した定義命令の次の命令から、その定義命令を含む基本ブロックの出口までの命令位置情報が、第１の分岐ブロック内位置情報検出部によって全て検出される。命令位置情報の検出後、基本ブロック間生存区間表現部が表した命令位置情報の集合に、第１の命令位置情報付加部によって、前記第１の分岐ブロック内位置情報検出部が検出した命令位置情報が付加される。
【００３０】
また、請求項９において、
前記定義−参照情報記憶手段の記憶内容に基づいて、分岐ブロック内参照命令検出部によって前記無マーク定義命令検出部が検出した定義命令に対応する参照命令が検出される。参照命令の検出後、前記分岐ブロック内参照命令検出部が検出した参照命令を含む基本ブロックが分岐ブロック検出部によって検出される。参照命令の検出後、前記分岐ブロック検出部が検出した基本ブロックの入口から、前記分岐ブロック内参照命令検出部が検出した参照命令までの命令位置情報が、第２の分岐ブロック内位置情報検出部によって全て検出される。命令位置情報の検出後、前記基本ブロック間生存区間表現部が表した命令位置情報の集合に、前記第２の分岐ブロック内位置情報検出部が検出した命令位置情報が第２の命令位置情報付加部によって付加される。
【００３１】
【実施例】
以下、本発明のコンパイル装置の一実施例を図面を用いて説明する。先ず、本明細書においてので引用する用語を、以下に説明しておく。
・基本ブロックプログラム中の連続命令列であって、列の途中に飛び越しもなく、また途中への飛び越しもないものをいう。この基本ブロックの一例を図１６に示す。本実施例では処理対象を中間言語プログラムとしているので、上記命令列は、中間言語のものが与えられる。
【００３２】
更に、判断処理、あるいは、多方向分岐処理内の基本ブロックを、図１３を参照しながら説明する。
図１３（ａ）に示すように、基本ブロックとは列の途中に飛び越しもなく、また途中への飛び越しもないものを指すから、Ｃ言語風のｉｆ（ｐ）文で表される判断処理において、選択的に実行される処理Ｓ１、Ｓ２は、それぞれ１つの基本ブロックＢ１、Ｂ２となる。このように処理Ｓ１、Ｓ２に相当する基本ブロックＢ１、Ｂ２を、分岐基本ブロックと称する。
【００３３】
更に図１３（ｂ）に示すように、Ｃ言語でｓｗｉｔｃｈ（ｐ）文で表される多方向分岐処理において、選択的に実行される処理Ｓ１、Ｓ２、Ｓ３、Ｓ４・・・・は、それぞれ１つの基本ブロックＢ１、Ｂ２、Ｂ３、Ｂ４・・・・となる。
また、プログラム中の一つの文あるいは中間コード命令など、中間言語プログラムの１実行単位を中間言語ステップと呼ぶことにする。
・変数の定義、参照
ある変数に値を設定している中間言語ステップをその変数の定義といい、定義された値を使っている中間言語ステップを変数の参照という。逆に変数に値を設定することを、変数を定義するという。更に変数の値を使うことを、変数を参照するという。
・生存変数に関する情報
ソースプログラム、中間言語プログラムを問わず、プログラム中のステップの狭間を点といい、その点において変数に格納されている値が有効であるとき、その点で当該変数は生きているという。更に基本ブロックＢの入口の点で生きている変数の集合は、ＬｉｖｅＩｎ［Ｂ］と表され、基本ブロックＢの出口の点で生きている変数の集合は、ＬｉｖｅＯｕｔ［Ｂ］と表される。また、基本ブロックＢ内に定義がある変数の集合をＤｅｆ［Ｂ］で表す。尚この変数集合Ｄｅｆ［Ｂ］は、生存変数に関する情報を求める過程に得られる。図１６に示したプログラム例での、集合ＬｉｖｅＩｎ［Ｂ］、集合ＬｉｖｅＯｕｔ［Ｂ］を、図１７（ａ）に示す。本図において、基本ブロックＢ１の入口で生きている変数は「ｐ１，ｐ２，ｐ３」であることが判り、出口で生きている変数は「ｚ１，ａ，ｂ」であることが示される。
・定義−参照情報、参照−定義情報
定義−参照情報とは、定義によって設定された設定値がどこで使用されているかが示される情報であり、その一例を図１７（ｂ）に示す（定義によって設定された設定値を参照によって使用することを、定義が参照に到達するという。）。図１７（ｂ）の一例では、中間言語ステップｓ１で定義されている変数ｔ１は、中間言語ステップｓ２で参照されることが判る。
【００３４】
参照−定義情報とは、参照によって使用された設定値がどこで定義されているかが示される情報であり、その一例を図１７（ｃ）に示す。本図において、中間言語ステップｓ２で参照される変数は、変数ｔ１，ｐ３であり、これらの何れかは、中間言語ステップｓ１で定義される。
・変数についての注意
変数の中には、その生存区間を複数持つものがある。この場合、生存区間毎に異なるレジスタを割り付けることができ、また、そうした方がオブジェクトプログラムをより良くすることができる。そのため生存区間が複数ある場合は、生存区間毎に１つの変数が存在するものとする。これを図１３（ｃ）を参照しながら説明する。図１３（ｃ）において、「ｘ＝１０」で定義される変数ｘは、「ｙ＝ｘ＋５」で参照されるから、「ｘ＝１０」で定義される変数ｘの生存区間は図中のＬ５となる。一方「ｘ＝２０」で定義される変数ｘは、「ｙ＝ｘ＋３０」で参照されるから、「ｘ＝２０」で定義される変数ｘの生存区間は図中のＬ６となる。
【００３５】
一方、図１３（ｄ）において、「ｘ＝４０」で定義される変数ｘは、参照されないまま、「ｘ＝３０」で再定義されるので、「ｘ＝４０」で定義される変数ｘの生存区間は、存在しないことになる。即ち、「ｘ＝４０」で定義される変数ｘは生存しないと判定される。「ｘ＝３０」で定義される変数ｘは「ｙ＝ｘ＋５０」で参照されるから、「ｘ＝３０」で定義される変数ｘの生存区間は図中のＬ７となる。
・生存区間についての注意
生存区間は、基本ブロックの集合、中間言語ステップの集合で表される。本実施例では、詳細な情報が必要とされるため、後者のものが採用されている。また、生存区間の重複、非重複を集合積で判定するため、生存区間の終始が一致する中間言語ステップでは、生存区間は重ならないとしている。そのため、変数の生存区間をステップ集合で表す場合、定義のステップは、当該集合に含まない。
【００３６】
以上の変数及び生存区間に関する情報、定義-参照情報、参照-定義情報については、以下の文献に詳細が記されている。
A.Aho, R.Sethi, J.Ulman:"Compilers Principles, Techniques, and Tools",Addison Wesley, 1988
以下、本発明の生存区間重複検査装置の一実施例を図面を用いて説明する。図１は、本発明の第１の実施例におけるコンパイラ装置(図中では単にコンパイラと記載している)の構成図である。コンパイル装置は、構文解析装置１と、最適化装置２と、資源割付装置３と、コード生成装置４とで構成されている。
【００３７】
構文解析装置１は、ファイルとして記憶されているソースプログラムの字句解析、構文解析、および意味解析を行なう。解析結果は、中間言語プログラムとして出力される。ソースプログラムの一例を図１４に示し、当該ソースプログラムに対応する中間言語プログラムの一例を図１５に示す。
最適化装置２は最終的に生成される機械語プログラムのプログラムサイズを削減し、実行時間を短縮させる目的で中間言語プログラムの最適化を行なう。
【００３８】
資源割付装置３は、プログラムの変数の生存区間を求め、生存区間毎に変数に資源であるレジスタやメモリを割り付ける。
コード生成装置４は、最適化された中間言語プログラムを、資源割付装置３の割り付け結果に従って、ターゲットマシンの機械語命令に変換し、オブジェクトプログラムとして出力する。
【００３９】
図２は、図１に示す最適化装置２の構成図である。この最適化装置２の詳細については本発明の主眼でないので説明を省略し、本発明のコンパイル装置と特に関係のある点のみを説明する。最適化装置２は、制御フロー解析部５と、データフロー解析部６と、最適化処理部７と、単純ブロック生成部８とで構成される。制御フロー解析部５およびデータフロー解析部６では、基本ブロック化、制御フロー解析、データフロー解析という作業を行う。基本ブロック化とは、処理対象のプログラムを、以後の処理単位である基本ブロックに分割することである。図１５に示した中間言語プログラムについての基本ブロックを図１６に示す。また制御フロー解析とは、各基本ブロック間の制御の流れを解析することである。更にデータフロー解析とは各基本ブロックの内部を調べ、それぞれの変数がどこで定義され、どこで参照されているかについて解析することである。これらの処理によって、データ情報、定義-参照情報、及び参照-定義情報が得られる。以上の３情報の一例を図１７（ａ）（ｂ）（ｃ）に図示する。本一例は図１６に示した中間言語プログラムについてのものである。図１７（ａ）に示すデータフロ−情報において、基本ブロックB1の入り口では、変数p1,p2,p3が生きていることが示される。また、基本ブロックB1の出口では、変数z,a,bが生きていることが示される。図１７（ｂ）において、中間言語ステップs1で定義される変数t1は、中間言語ステップs2で参照されることが示される。図１７（ｃ）の参照−定義情報において、中間言語ステップs2で参照される変数t1,p3は、中間言語ステップs1で定義されることが示される。
【００４０】
最適化処理部７は、制御フロー解析部５およびデータフロー解析部６の処理結果を使って中間言語プログラムに対する最適化を行う。この部分は本発明の主眼でないのでその詳細は省略する。
単純ブロック生成部８は、基本ブロックを複数個の小ブロックに分割し、分割後、小ブロック同士の統合が可能か否を判定して、当該判定で可能と判定されたもの同士を統合し、定義と参照とが少なくとも一組順に並ぶステップ列を形成する。単純ブロック生成部８は、この統合処理によって基本ブロック内の生存区間の重複をより単純なものとする。このような統合処理によって、最終的に形成される小ブロックは単純ブロックと称される。単純ブロック生成前の生存区間の重複を図１８に図示し、生成後の生存区間の重複を図２０に図示する。図２０と図１８では、図２０のほうが、比較的に生存区間の重複がより単純になり、生存区間の重複数が減少するので、資源割付部で必要とするレジスタ数も少ないもので済む。
【００４１】
単純ブロック生成部８の処理過程を図３のフロ−チャ−ト、図４の説明図を参照しながら説明する。図３は単純ブロックを生成する手順を示すフローチャートであり、図４は、図３のフロ−チャ−トの各ステップでの処理を図的に表した説明図である。
ステップＡ１において単純ブロック生成部８は、基本ブロック内の各中間言語ステップを１つの小ブロックにする。図１８に示したプログラムの基本ブロックＢ１に対して、この処理を行うと、基本ブロックＢ１内部は、図１９（ａ）に示すものとなる。図１９（ａ）において、中間言語ステップｓ１は小ブロックＰＢ１となる。また、中間言語ステップｓ２は小ブロックＰＢ２となる。同様に中間言語ステップｓ３、ｓ４、ｓ５・・・は小ブロックＰＢ３、ＰＢ４、ＰＢ５・・・となる。
【００４２】
ステップＡ２において、単純ブロック生成部８は小ブロックを、図４（ａ）の矢符ｂ１１、１２、１３に示すように、実行順に小ブロックを一つずつ取り出す。
ステップＡ３において単純ブロック生成部８は、取り出した小ブロックｂ１が基本ブロック内で最後のものであるかを判定し、最後の場合、処理を終了する。小ブロックｂ１が最後でない場合、ステップＡ４を行う。
【００４３】
ステップＡ４において単純ブロック生成部８は、小ブロックｂ１の最後にある中間言語ステップｓ１を取り出す。
ステップＡ５において単純ブロック生成部８は、図４（ｂ）に示すように、取り出した中間言語ステップｓ１で定義される変数ｖが一つか複数かの判定を行い、複数の場合、ステップＡ２を行う。単数の場合、ステップＡ６を行う。
【００４４】
ステップＡ６において、単純ブロック生成部８は、図４（ｃ）に示すように変数ｖの参照が基本ブロック内に存在するか否か、即ち、変数の生存区間の長さが他の基本ブロックに及ぶか否かを判定する。及ぶ場合ステップＡ２を行い、及ばない場合、ステップＡ７を行う。
ステップＡ７において、図４（ｄ）に示すように、その変数ｖの参照が一回限りであることを判定する。この判定は、定義−参照情報から変数ｖの参照回数を調べることで行われる。複数回であればステップＡ２を行い、一回限りであれば、ステップＡ８を行う。
【００４５】
ステップＡ８において、単純ブロック生成部８は、図４（ｅ）に示すように、定義ｓ１から変数ｖの参照までに、変数ｖが再定義されているかを判定する。定義されている場合はステップＡ２を行う。定義されていない場合は、ステップＡ９を行う。
ステップＡ９において、単純ブロック生成部８は、図４（ｆ）に示すように、変数ｖが依存する変数ｖｘ、即ち、小ブロックｂ１内で参照される変数が、定義ｓ１から変数ｖの参照までに再定義されるか否かを判定する。再定義されるときはステップＡ２を行い、再定義がない場合はステップＡ１０を行う。ここで依存がある変数とは、当該変数の設定値に、影響を及ぼし得る全ての変数をいう。上述のように、小ブロックｂ１は参照と定義とが順に並ぶステップ列に形成されてゆくから、小ブロックｂ１は、変数ｖが依存する変数を全て含んでいる。例えば、図１９（ｄ）の小ブロックＰＢ７に示す変数ｘの設定値は、変数ｘ４、ｔ１、ｐ３、ｐ１、ｐ２の設定値の影響を受けるので、変数ｘは、変数ｘ４、ｔ１、ｐ３、ｐ１、ｐ２に依存するという。もし依存変数の定義、即ち、変数ｘ４、ｔ１、ｐ３、ｐ１、ｐ２の定義が、変数ｘの定義から参照までの区間に存在すると、変数ｘの定義命令を参照命令の位置に移動することは上記依存関係を損なうことになる。このような依存関係の損失を考慮して、単純ブロック生成部８は移動可、移動不可を判定する。
【００４６】
ステップＡ１０、ステップＡ１１、ステップＡ１２において、単純ブロック生成部８は小ブロックｂ１を抜き出し、抜き出した小ブロックｂ１を、変数ｖの参照（中間言語ステップｓ２）が属する小ブロックｂ２の先頭に挿入する。または小ブロックｂ１をステップＳ２の直前に挿入してもよい。この抜き出し及び挿入処理で、小ブロックｂ１及びｂ２が、１つの小ブロックに統合される。このような統合をおこなった後、単純ブロック生成部８は小ブロックｂ１を削除する。図１９（ａ）に示した一例では、小ブロックＰＢ１が抜き出され、小ブロックＰＢ２の直前に挿入されて、図１９（ａ）に示した小ブロックＰＢ１、ＰＢ２は小ブロックＰＢ２に統合される（矢線ｇ１２参照）。その結果、小ブロックＰＢ２は、図１９（ｂ）に示すように、中間言語ステップｓ１、ｓ２をメンバーに含むようになる。更に、小ブロックＰＢ２が抜き出され、小ブロックＰＢ７の直前に挿入されて、図１９（ｂ）に示した小ブロックＰＢ２、ＰＢ７は、小ブロックＰＢ７に統合される（矢線ｇ２７参照）。その結果、小ブロックＰＢ７は、図１９（ｃ）に示すように、中間言語ステップｓ１、ｓ２、ｓ７をメンバーに含むようになる。同様に、矢線ｇ３８に示すように小ブロックＰＢ３及びＰＢ４がＰＢ８に統合され、更に矢線ｇ５９に示すように、小ブロックＰＢ５及びＰＢ６がＰＢ９に統合されるので、小ブロックＰＢ８は、中間言語ステップｓ３、ｓ４、ｓ８をメンバーとして含むようになり、小ブロックＰＢ９は、中間言語ステップｓ５、ｓ６、ｓ９をメンバーとして含むようになる。以上の統合によって、小ブロックＰＢ７，ＰＢ８，ＰＢ９が単純ブロックとなる。
【００４７】
以上のステップＡ１〜ステップＡ１２の手順を、単純ブロック生成部８は、図４（ａ）の矢符ｂ１１、ｂ１２に示すように、残りの小ブロックについて繰り返す。これらの単純ブロックにおいて、その内部の中間言語ステップは、始めから終りの一ステップ前まで、変数の参照が１回きりのもののみで構成されるようになる。また、その変数の参照が行われる中間言語ステップは、変数の定義が行われる中間言語ステップと同一の単純ブロックとなる。
【００４８】
図５は、図１に示した資源割付装置３の構成図である。
生存区間重複判定部９は、生存区間を生成しその生存区間の重複を検出する。
変数資源割付部１０は、生存区間重複判定部９が求めた生存区間の情報を用いて、資源であるレジスタやメモリを変数に割り付ける。このとき、生存区間が重なる変数においては異なるレジスタを変数に割付ける。
【００４９】
図５は、図１の資源割付装置３の構成図である。
資源割付装置３は、生存区間保持部１１、単純ブロック内生存変数集合保持部１２、基本ブロック内生存変数集合保持部１３、基本ブロック間生存変数集合保持部１４、生存区間生成部１５、生存区間重複検査部１６とで構成される。
生存区間保持部１１は、中間言語ステップによって表現された生存区間を、変数と対応づけて保持する。また、各変数がどの単純ブロックにあるか、更に、どの基本ブロックにあるかを対応づけている。生存区間保持部１１の保持内容の一例を図２１（ａ）に示す。これは、図２０に示したプログラム例と対応している。本図を参照すれば、変数ｔ１の生存区間は中間言語ステップｓ２のみであり、また、変数ｔ１は単純ブロックＰＢ７に属し、基本ブロックＢ１に属することが明確になる。
【００５０】
単純ブロック内生存変数集合保持部１２は、単純ブロック内のみに生存区間が存在する変数を、当該単純ブロックと対応づけて保持する。このように単純ブロック内のみに生存区間が存在する変数は、単純ブロック内変数集合と称される。単純ブロック内生存変数集合保持部１２の保持内容の一例を図２１（ｂ）に示す。本図も図２０に示したプログラム例と対応づけられている。本図を参照すれば、単純ブロックＰＢ７は、変数ｔ１と、変数ｘ４とを含むことがわかる。
【００５１】
基本ブロック内生存変数集合保持部１３は、基本ブロック内のみに生存区間が存在する変数であって、その生存区間が、複数の単純ブロック間にわたるものを当該基本ブロックと対応づけて保持する。この基本ブロック内生存変数集合保持部１３が保持する変数の集合は、基本ブロック内変数集合と称される。基本ブロック内生存変数集合保持部１３の保持内容の一例を図２１（ｃ）に示す。本図も図２０に示したプログラム例と対応づけられている。本図を参照すれば、単純ブロックＢ１の基本ブロック内変数集合は、変数ｘと、変数ｙとを含むことがわかる。
【００５２】
基本ブロック間生存変数集合保持部１４は、変数のうち、生存区間が、複数の基本ブロック間にわたるものの集合を保持する。基本ブロック間生存変数集合保持部１４が保持する変数の集合は基本ブロック間変数集合と称される。基本ブロック間生存変数集合保持部１４の保持内容の一例を図２１（ｄ）に示す。本図も図２０に示したプログラム例と対応づけられている。本図を参照すれば、変数ｚ，ａ，ｂは、その生存区間が、複数の基本ブロック間にまたがっていることがわかる。
【００５３】
生存区間生成部１５は、変数の生存区間を中間言語ステップの集合で表現し、当該生存区間の範囲によって、変数を３つの集合に分類する。生存区間生成部１５の処理は、生存区間生成処理、定義毎生存区間検出処理、及び後続ブロック生存区間検出処理に大別され、また上記の３つの集合とは、先に述べた単純ブロック内変数集合、基本ブロック内変数集合、基本ブロック間生存変数集合である。この分類は、変数の格納先を、単純ブロック内生存変数集合保持部１２、基本ブロック内生存変数集合保持部１３、基本ブロック間生存変数集合保持部１４に切り換えることで行われる。
【００５４】
生存区間生成部１５の処理過程を図７、図８、図９、図１０のフロ−チャ−トを参照しながら説明する。
図７は生存区間生成処理のフロ−チャ−ト、図８は定義毎生存区間検出処理のフロ−チャ−ト、図９は後続ブロック探索処理のフロ−チャ−ト、図１０は後続ブロック生存区間検出処理のフロ−チャ−トである。
【００５５】
図７のステップＢ１において、生存区間生成部１５は、未処理の定義が存在するか否かを判定する。処理済みか未処理かは、定義に付されるマークで判別される。存在するとき、ステップＢ２を行い、そうでないときは処理を終了する。
ステップＢ２、Ｂ３、Ｂ４、Ｂ５において、生存区間生成部１５は、先ず全ての基本ブロックを未探索にして、未マークの定義ｓ１を取り出し、定義ｓ１にマークをつけ、定義毎生存区間検出処理を行なう。
【００５６】
以上のステップＢ１、Ｂ２、Ｂ３、Ｂ４、Ｂ５の処理は、全ての中間言語ステップがマークされるまで繰り返される。
図８に示すステップＣ２において、生存区間生成部１５は、中間言語ステップｓで定義される変数ｖが基本ブロックＢの出口において生きていること、つまり、変数ｖがＬｉｖｅＯｕｔ［Ｂ］に属することを判定し、存在する場合、ステップＣ１８を行ない、存在しない場合、ステップＣ３〜ステップＣ７を行う。
【００５７】
ステップＣ１８において生存区間生成部１５は、定義ｓの次の中間言語ステップからＢの最後の中間言語ステップまでに定義ｓ以外の変数ｖの定義が存在しないことを判定する。存在しないときステップＣ８〜ステップＣ１６を行ない、存在するときステップＣ３〜ステップＣ７を行う。
ステップＣ３、Ｃ４において、生存区間生成部１５は、基本ブロックＢの出口から入口に向かう方向に向けて探索を行い、変数ｖの参照ｓ１を見つける。この探索作業は、定義ｓの定義−参照情報を参照することで行われる。参照ｓ１を見つけると、生存区間生成部１５は、定義ｓの次の中間言語ステップから参照ｓ１までの中間言語ステップを変数ｖの生存区間として生存区間保持部１１に格納する。
【００５８】
ステップＣ５、ステップＣ６、ステップＣ７において、生存区間生成部１５は、定義ｓが属する単純ブロックｐｂと、参照ｓ１が属する単純ブロックが同じかどうか判定し、同じ場合（ステップＣ５）、生存区間生成部１５は、定義ｓを単純ブロック内生存変数集合保持部１２に格納し（ステップＣ６）、そうでない場合、即ち、定義ｓが属する単純ブロックｐｂと参照ｓ１が属する単純ブロックとが異なる場合（ステップＣ５）、変数ｖを基本ブロック内生存変数集合保持部１３に格納し（ステップＣ７）、ステップＣ１７へ進む。
【００５９】
ステップＣ８、Ｃ９において、生存区間生成部１５は、変数ｖを基本ブロック間生存変数集合保持部１４に格納し（ステップＣ８）、定義ｓの次の中間言語ステップから基本ブロックＢの最後の中間言語ステップまでを、変数ｖの生存区間として生存区間保持部１１に格納する（ステップＣ９）。ただし、定義ｓ自体が基本ブロックＢの最後の中間言語ステップのときは、生存区間保持部１１には何にも格納しない。
【００６０】
ステップＣ１０において、生存区間生成部１５は、実行順が基本ブロックＢの次のもの（後続基本ブロック）を取り出し、その後続基本ブロックＢ１のＬｉｖｅＩｎ［Ｂ１］を参照して、後続の基本ブロックＢ１が未探索であり、かつその入口で変数ｖが生きていることを確認する。確認後、定義ｓ及び基本ブロックＢ１を処理対象にして、後続ブロック探索処理を行なう。
【００６１】
図９は、後続ブロック探索処理のフロ−チャ−トである。
ステップＦ１、Ｆ２、Ｆ３、Ｆ４、Ｆ５において、生存区間生成部１５は、ＬｉｖｅＩｎ［Ｂ１］に変数ｖが属するかを判定し（ステップＦ２）、属する場合基本ブロックＢ１は未探索であるかどうかを判定する（ステップＦ３）。未探索であると、後続ブロック生存区間検出処理を行う（ステップＦ４）。もし未探索でないなら、基本ブロックＢの後続基本ブロックＢ１がみつかるまで（ステップＦ３）、以上の処理を繰り返す（ステップＦ１、Ｆ５）。
【００６２】
図１０は後続ブロック生存区間検出処理の手順を示すフローチャートである。
ステップＤ１において、生存区間生成部１５は、基本ブロックＢを探索済みとする。
ステップＤ２において、生存区間生成部１５は、中間言語ステップｓで定義される変数ｖが、基本ブロックＢの出口で生きていることを判定する。生きている場合ステップＤ８を行い、そうでない場合ステップＤ５〜ステップＤ６を行なう。上記判定は、具体的には、生存区間生成部１５が、変数ｖがＬｉｖｅＯｕｔ［Ｂ］にｖが属していることを確認することで行われる。
【００６３】
ステップＤ８において、生存区間生成部１５は、基本ブロックＢに変数ｖの定義が存在しないことを判定し、この場合、ステップＤ３〜ステップＤ４を行なう、そうでないときステップＤ５〜Ｄ６を行う。この判定は、具体的には、Ｄｅｆ［Ｂ］に変数ｖが属さないことを確認することで行われる。
ステップＤ３において、生存区間生成部１５は、基本ブロックＢ１の入口から出口までの中間言語ステップを変数ｖの生存区間にする（ステップＤ３）。
【００６４】
ステップＤ４において、生存区間生成部１５は、後続ブロック探索処理を行う。
ステップＤ５において、生存区間生成部１５は、定義ｓの定義−参照情報に基づいて、基本ブロックＢの出口から入口に向けて探索を行い、変数ｖの参照ｓ１を見つける。
【００６５】
ステップＤ６では、Ｂの先頭の中間言語ステップから参照ｓ１までをｖの生存区間として生存区間保持部１１に格納し、図１０に示した後続ブロック生存区間検出処理を終了する。
ステップＣ１２、Ｃ１３、Ｃ１４のループ処理において、生存区間生成部１５は、参照ｓ２に到達する残り全ての定義である定義ｓ３について、生存区間生成処理を再帰的に行い、変数ｖの生存区間の情報に、この定義ｓ３についての生存区間の情報を付け加える。この定義ｓ３の所在の探し出しは、参照ｓ２の参照−定義情報を参照することで行われる。上記定義ｓ３は、上述の分岐基本ブロック内にあり、これらを全て探し出すため、ステップＣ１２、Ｃ１３、Ｃ１４の処理は繰り返えされる。
【００６６】
ステップＣ１１、Ｃ１５、Ｃ１６において、生存区間生成部１５は、プログラム中の判断分岐処理あるいは多方向分岐処理が存在し、更に、上記参照ｓ２が一つの分岐先基本ブロック内にある場合、生存区間生成部１５は、残りの分岐基本ブロック内にある残り全ての参照を求める。それぞれの参照ｓ２について、ステップＣ１２、Ｃ１３、Ｃ１４のループ処理を繰り返し行う。
【００６７】
ステップＣ１７では、定義毎生存区間検出処理を終了する。
以上の手順により、変数は、単純ブロック内生存変数集合保持部１２か、基本ブロック内生存変数集合保持部１３か、基本ブロック間生存変数集合保持部１４のどれかに格納され、これらの保持部の保持内容が、図２１（ｂ）、（ｃ）、（ｄ）に示したものとなる。
【００６８】
生存区間重複検査部１６は、変数の生存区間の重複を検査する。当該検査は、単純ブロック内生存変数集合保持部１２、基本ブロック内生存変数集合保持部１３、基本ブロック間生存変数集合保持部１４、生存区間保持部１１の情報を使用して行われる。この重複検査処理を、図１１のフロ−チャ−トを参照しながら説明する。
【００６９】
ステップＥ２では、単純ブロック毎変数集合ｐｓ１に属する変数間に対して、生存区間の重複を検査する。（単純ブロック内にのみ生存区間がある変数間での生存区間重複検査）
ステップＥ３、Ｅ４、Ｅ５のループ処理において、生存区間重複検査部１６は、図１２（ｃ）に示すように、基本ブロックｐｂ１が基本ブロックｂｓ１に属するか否かを判定し、基本ブロックｂｂ１の基本ブロック内変数集合ｂｓ１に属する変数ｖ１の生存区間が単純ブロックｐｂ１に存在するか否かを判定して（ステップＥ４）、更に図１２（ｄ）に示すように、単純ブロック内変数集合ｐｓ１に属する変数と、変数ｖ１の間で生存区間の重複を検査する（ステップＥ５  これは、単純ブロック内にのみ生存区間がある変数と、基本ブロック内にのみ生存区間がある変数での生存区間重複検査となる。）。このステップＥ４、Ｅ５の処理を、生存区間重複検査部１６は、基本ブロックｂｂ１の基本ブロック毎変数集合ｂｓ１に属するすべて変数について繰り返す（ステップＥ３）。
【００７０】
ステップＥ６、Ｅ７のループ処理において、生存区間重複検査部１６は、単純ブロック内変数集合ｐｓ１に属する変数と、基本ブロック間生存変数集合保持部１４に保持されている変数ｖ２のとで生存区間の重複を検査する（ステップＥ７）。ステップＥ７の処理を、全ての基本ブロック間生存変数集合保持部１４に保持されている残り全ての変数ｖ２について繰り返す（ステップＥ６）。
【００７１】
ステップＥ１において生存区間重複検査部１６は、ステップＥ２からＥ７までの処理が単純ブロック内生存変数集合保持部１２にある単純ブロックｐｂ１の単純ブロック毎変数集合ｐｓ１の全ての変数について行ったか否かを判定し、処理済みならば、ステップＥ８からＥ１２までの処理を行う。
ステップＥ８において生存区間重複検査部１６は、基本ブロック内生存変数集合保持部１３にある全ての基本ブロックｂｂ２の基本ブロック内変数集合ｂｓ２についてステップＥ９からＥ１１を行う。
【００７２】
ステップＥ９において生存区間重複検査部１６は、基本ブロック内変数集合ｂｓ２に属する変数についての生存区間重複を検査する。
ステップＥ１０、Ｅ１１では、基本ブロック内変数集合ｂｓ２に属する変数ｖと、基本ブロック間変数集合に属する変数ｖ３との間で生存区間の重複を検査し（ステップＥ１１）、基本ブロック間生存変数集合保持部１４に保持されている変数ｖ３のうち、基本ブロックｂｂ２内に生存区間が存在するものの全てについて、ステップＥ１１の検査を繰り返す（ステップＥ１０）。
【００７３】
ステップＥ１２では、基本ブロック間生存変数集合保持部１４にある変数間について生存区間の重複を検査する。
以上のように生存区間重複検査部１６が検査処理を行うと、生存区間の重複が検査される。図２０のプログラム例についての検査結果を図２２に示す。
以上のように構成される本実施例の資源割付装置における具体的な動作を図１４から図２０を使用して説明する。
【００７４】
図１４は、Ｃ言語記述のプログラムの一部分の例である。本図において、変数ｐ１，  ｐ２，  ｐ３の定義は、プログラム例の１行目より以前にあるものとし、４行目以降は使用がないものする。また、変数ｓの参照が、この例の後に存在するとする。
図１５は、図１４のソースプログラムに対する構文解析装置１の出力である中間言語プログラムである。この中間言語プログラムは２番地形式のもので与えられる。
【００７５】
図１５の中間言語プログラムに対して制御フロー解析部５が基本ブロック化を行い、図１６に示した基本ブロックが生成される。図１６において、中間言語ステップｓ１からｓ１１までが基本ブロックＢ１、中間言語ステップｓ１２からｓ１５までが基本ブロックＢ２、中間言語ステップｓ１６からｓ１８までが基本ブロックＢ３である。
図１６に示した基本ブロック化後の中間言語プログラムに対して、データフロー解析部６がデータフロー解析を行うと、図１７に示した生存変数に関する情報、定義−参照情報、及び参照−定義情報が求められる。
【００７６】
単純ブロック生成部８が、単純ブロック生成処理の手順により、図１６中の基本ブロックＢ１を単純ブロックに分割する過程を図１９に示す。
先ず単純ブロック生成部８は、図１９（ａ）に示すように、基本ブロックＢ１を、中間言語ステップを一つだけ含む単純ブロックに分割する（単純ブロック生成処理のステップＡ１）。
【００７７】
単純ブロック生成部８が、図３に示したフロ−チャ−トのステップＡ２からステップＡ１２までの処理を行い、小ブロックＰＢ１に含まれている中間言語ステップｓ１を小ブロックＰＢ２の先頭に移動する。
詳しくは、単純ブロック生成部８は、小ブロックＰＢ１を取りだし（単純ブロック生成処理のステップＡ２）、小ブロックＰＢ１が基本ブロックＢ１の最後の小ブロックでないことを検出し（単純ブロック生成処理のステップＡ３）、小ブロックＰＢ１の最後の中間言語ステップｓ１を検出する（単純ブロック生成処理のステップＡ４）。次に、中間言語ステップｓ１で定義される変数が変数ｔ１の唯一つであることを検出し（単純ブロック生成処理のステップＡ５）、変数ｔ１の参照が１回であり、基本ブロックＢ１内にあることを定義−参照情報から検出する（単純ブロック生成処理のステップＡ６、Ａ７）。次に、定義ｓ１の次の中間言語ステップから変数ｔ１の参照までに、変数ｔ１の定義がないことを検出し、定義ｓ１で参照される変数ｐ１，  ｐ２の定義が、定義ｓ１の次の中間言語ステップから変数ｔ１の参照までにないことを検出し、変数ｔ１の参照が属する小ブロックＰＢ２を検出する（単純ブロック生成処理のステップＡ１０）。そして、小ブロックＰＢ２の先頭に小ブロックＰＢ１の要素である定義ｓ１を挿入する（単純ブロック生成処理のステップＡ１１）。
【００７８】
同様に、図１９（ａ）の小ブロックＰＢ２に属する中間言語ステップｓ１，ｓ２を、小ブロックＰＢ７の先頭に移動した様子を図１９（ｃ）に示す。以上の処理を小ブロックＰＢ３，  ＰＢ４，  ＰＢ５，  ＰＢ６の順に繰り返すと、基本ブロックＢ１の内部は、図１９（ｃ）に示したものから、図１９（ｄ）に示したものへと変遷する。
続いて、単純ブロック生成部８が、小ブロックＰＢ７の最後の中間言語ステップｓ７で定義される変数ｘと、小ブロックＰＢ８の最後の中間言語ステップｓ８で定義される変数ｙとを移動しようとするが、これらの変数ｘ，ｙは、参照回数が２回なので小ブロックＰＢ７，  ＰＢ８の移動を行わないと判定する（単純ブロック生成処理のステップＡ７）。同じく小ブロックＰＢ９を移動しようとするが、小ブロックＰＢ９は、最後の定義ｓ９で定義される変数ｚの参照が基本ブロックＢ２に存在するため、移動を行わないと判定する（単純ブロック生成処理のステップＡ６）。小ブロックＰＢ１０は最後の中間言語ステップｓ１０で定義される変数ａが基本ブロックＢ２で参照されるので移動を行わないと判定し（単純ブロック生成処理のステップＡ６）、小ブロックＰＢ１１は基本ブロックＢ１の最後の小ブロックであるので移動を行わないと判定する（単純ブロック生成処理のステップＡ３）。結局、基本ブロックＢ１の単純ブロック化は、図１９（ｄ）に示した状態に留まる。
【００７９】
単純ブロック生成部８が、単純ブロック化を基本ブロックＢ２，Ｂ３についても行った様子を、図２０に示す。
単純ブロック生成部８による単純ブロック形成後、生存区間生成部１５が、生存区間の表現を行い、かつ、各変数を、３つの集合に分類する。
この様子を、代表的な変数ｔ１，  ｙ，  ａ，  ｂ  を一例にして説明する。
【００８０】
始めに変数ｔ１について説明する。
１）生存区間生成部１５によって、マーク済みでない中間言語ステップｓ１が選択される。生存区間生成部１５は、中間言語ステップｓ１にマークし、定義毎生存区間検出処理へ移る（生存区間生成処理のステップＢ１〜Ｂ５）。
２）全ての基本ブロックを未探索にする（生存区間生成処理のステップＢ４）。
【００８１】
３）次に変数ｔ１がＬｉｖｅＯｕｔ［Ｂ１］に含まれているか検査する。変数ｔ１は含まれていないので定義毎生存区間検出処理のステップＣ３へ移る（定義毎生存区間検出処理のステップＣ２、Ｃ１８）。
４）定義ｓ１の定義−参照情報から、基本ブロックＢ１の出口から入口に向かって探索を行い、最初に見つかる変数ｔ１の参照ｓ２を見つける（定義毎生存区間検出処理のステップＣ３）。
【００８２】
５）生存区間生成部１５は、中間言語ステップｓ２を取り出し、これを、変数ｔ１に対応づけて、変数ｔ１の生存区間の一部にする（定義毎生存区間検出処理のステップＣ４）。
６）生存区間生成部１５は、中間言語ステップｓ１とｓ２は同じ単純ブロックＰＢ８に属しているので、変数ｔ１を単純ブロック内生存変数集合保持部１２の単純ブロックＰＢ７の単純ブロック毎変数集合に格納する（定義毎生存区間検出処理のステップＣ５）。
【００８３】
以上により、変数ｔ１の生存区間が求められ、また変数ｔ１は、単純ブロック内生存変数集合保持部１２に格納される。
次に変数ｙについて説明する。
１）マーク済みでない中間言語ステップｓ８が、生存区間生成部１５によって選択される。生存区間生成部１５は、中間言語ステップｓ８にマークし、生存区間生成処理を行う（生存区間生成処理のステップＢ１〜Ｂ５）。
【００８４】
２）全ての基本ブロックを未探索にする（生存区間生成処理のステップＢ４）。
３）次に変数ｙがＬｉｖｅＯｕｔ［Ｂ１］に含まれているか検査する。生存区間生成部１５は、変数ｙは含まれていないので定義毎生存区間検出処理のステップＣ３を行う（定義毎生存区間検出処理のステップＣ２、Ｃ１８）。
４）生存区間生成部１５は、中間言語ステップｓ８の定義−参照情報に基づいて、基本ブロックＢ１の出口から入口に向けての探索を行い、変数ｙの参照である中間言語ステップｓ１０を見つける（定義毎生存区間検出処理のステップＣ３）。
【００８５】
５）生存区間生成部１５は、変数ｙの生存区間を、中間言語ステップｓ５，ｓ６，ｓ９，ｓ１０までにする（定義毎生存区間検出処理のステップＣ４）。
６）生存区間生成部１５は、中間言語ステップｓ８とｓ１０は異なる単純ブロックに属していることを判定し、変数ｙを、基本ブロック内生存変数集合保持部１３の保持集合のうち、基本ブロックＢ１に対応するものに格納する（定義毎生存区間検出処理のステップＣ５）。
【００８６】
以上により、変数ｙの生存区間が求められ、生存区間生成部１５は、変数ｙを基本ブロック内生存変数集合保持部１３に格納した。
次に変数ａについて説明する。
１）先ずマーク済みでない中間言語ステップｓ１０が、生存区間生成部１５によって選択される。生存区間生成部１５は、中間言語ステップｓ１０をマークし、定義毎生存区間検出処理へ移る（生存区間生成処理ステップＢ１〜Ｂ５）。
【００８７】
２）生存区間生成部１５は、全ての基本ブロックを未探索にする（生存区間生成処理ステップＢ４）。
３）次に生存区間生成部１５は、変数ａがＬｉｖｅＯｕｔ［Ｂ１］に含まれており、中間言語ステップｓ１１には変数ａの定義がないことを判定して、変数ａを基本ブロック間生存変数集合保持部１４に格納し、定義毎生存区間検出処理ステップＣ９へ移る（定義毎生存区間検出処理ステップＣ２、Ｃ１８、Ｃ８）。
【００８８】
４）生存区間生成部１５は、中間言語ステップｓ１１を変数ａの生存区間にする（定義毎生存区間検出処理ステップＣ９）。
５）生存区間生成部１５は、基本ブロックＢ２が探索済みであり、変数ａがＬｉｖｅＩｎ［Ｂ２］に属していることを判定し、基本ブロックＢ２と中間言語ステップｓ１０に関して後続ブロック生存区間検出処理を行う（定義毎生存区間探索処理ステップＣ１０）。
【００８９】
６）生存区間生成部１５は、基本ブロックＢ２を探索済みにする（後続ブロック生存区間検出処理ステップＤ１）。
７）生存区間生成部１５は、変数ａがＬｉｖｅＯｕｔ［Ｂ２］に属することを判定し、また、変数ａが、Ｄｅｆ［Ｂ２］には属さないことを判定して、後続ブロック生存区間検出処理のステップＤ３の処理を行う（後続ブロック生存区間検出処理ステップＤ２、Ｄ８）。
【００９０】
８）生存区間生成部１５は、中間言語ステップｓ１３，ｓ１２，ｓ１４，ｓ１５  を、変数ａの生存区間にする（後続ブロック生存区間検出処理ステップＤ３）。
９）基本ブロックＢ２の後続基本ブロックＢ３が探索済みでなく、かつ、ＬｉｖｅＩｎ［Ｂ３］に変数ａが属していることを判定し、基本ブロックＢ３と定義ｓ１０に関して、後続ブロック生存区間検出処理を行なう（後続ブロック生存区間検出処理ステップＤ４）。
【００９１】
１０）生存区間生成部１５は、基本ブロックＢ３を探索済みにする（後続ブロック生存区間検出処理ステップＤ１）。
１１）生存区間生成部１５は、変数ａがＬｉｖｅＯｕｔ［Ｂ３］に属さないことを判定し、後続ブロック生存区間検出処理のステップＤ５を行う（後続ブロック生存区間検出処理ステップＤ２）。
【００９２】
１２）生存区間生成部１５は、基本ブロックＢ３の出口から入口に向かって探索を行い、変数ａの参照ｓ１６を見つけ出す（後続ブロック生存区間検出処理ステップＤ５）。
１３）参照ｓ１６を変数ａの生存区間にする（後続ブロック生存区間検出処理ステップＤ６）。
【００９３】
１４）後続ブロック生存区間検出処理を終了し、先の９）の状態に戻る（後続ブロック生存区間検出処理ステップＤ７）。
１５）基本ブロックＢ２に関して後続ブロック生存区間検出処理を終了し、先の５）の状態に戻る（後続ブロック生存区間検出処理ステップＤ７）。
１６）生存区間生成部１５は、中間言語ステップｓ１０の定義−参照情報を参照し、本情報内に存在する変数ａの参照ｓ１２を取り出す。更に参照ｓ１２の参照−定義情報を参照し、参照ｓ１２に到達する変数ａの定義ｓ１０を取り出す。但し参照ｓ１０はマーク済みなので、生存区間生成部１５は、後続ブロック生存区間検出処理ステップＣ１０、Ｃ１１を行なわない。
【００９４】
１７）定義毎生存区間検出処理を終了して、１）の状態へ戻る。以上により、変数ａの生存区間が求められ、変数ａを基本ブロック間生存変数集合保持部１４に格納する。
次に変数ｂについて説明する。
１）生存区間生成部１５は、マーク済みでない中間言語ステップｓ１１を選択し、中間言語ステップｓ１１をマークして、生存区間生成処理を行う（生存区間生成処理ステップＢ１〜Ｂ５）。
【００９５】
２）生存区間生成部１５は、全ての基本ブロックを未探索にする（生存区間生成処理ステップＢ４）。
３）生存区間生成部１５は、変数ｂがＬｉｖｅＯｕｔ［Ｂ１］に含まれており、定義ｓ１１自体がＢ１の最後の中間言語ステップであることを判定して、変数ｂを基本ブロック間生存変数集合保持部１４へ格納する。格納後、定義毎生存区間検出処理ステップＣ６を行う（定義毎生存区間検出処理ステップＣ２、Ｃ１８、Ｃ８）。
【００９６】
４）生存区間生成部１５は、中間言語ステップｓ１１が、基本ブロックＢ１の最後の中間言語ステップであることを判定し、変数ｂの生存区間になにも格納しない（定義毎生存区間検出処理ステップＣ９）。
５）生存区間生成部１５は、変数ｂがＬｉｖｅＩｎ［Ｂ２］に属していることを判定し、基本ブロックＢ２と中間言語ステップｓ１１に関して後続ブロック生存区間検出処理を行う（定義毎生存区間検出処理ステップＣ７）。
【００９７】
６）生存区間生成部１５は、基本ブロックＢ２を探索済みとする（後続ブロック生存区間検出処理ステップＤ１）。
７）生存区間生成部１５は、変数ｂがＤｅｆ［Ｂ２］に属することを判定し、後続ブロック生存区間検出処理のステップＤ５を行う（後続ブロック生存区間検出処理ステップＤ２）。
【００９８】
８）生存区間生成部１５は、中間言語ステップｓ１１の定義−参照情報を参照し、基本ブロックＢ２の出口から入口に向けて探索を行い、最初に見つかる変数ｂの参照ｓ１３を見つ出す（後続ブロック生存区間検出処理ステップＤ５）。
９）生存区間生成部１５は、中間言語ステップｓ１３を変数ｂの生存区間にする（後続ブロック生存区間検出処理ステップＤ６）。
【００９９】
１０）後続ブロック生存区間検出処理を終了し、先の５）の状態に戻る。１１）変数ｂの参照ｓ１３について、生存区間生成部１５は、ステップＣ１１〜Ｃ１６を行なう（定義毎生存区間検出処理ステップＣ１１）。
１２）生存区間生成部１５は、参照ｓ１３の参照−定義情報に存在する変数ｂの定義のうち、マーク済みでない定義ｓ１３を見つ出す（定義毎生存区間検出処理ステップＣ１２）。
【０１００】
１３）生存区間生成部１５は、参照ｓ１３をマークし、定義毎生存区間検出処理へ移る（定義毎生存区間検出処理ステップＣ１３、Ｃ１４）。
１５）生存区間生成部１５は、変数ｂがＬｉｖｅＯｕｔ［Ｂ２］に含まれており、基本ブロックＢ２の最後までに変数ｂの定義がないことを判定し、定義毎生存区間検出処理ステップＣ９へ移る（定義毎生存区間検出処理ステップＣ２、Ｃ１８、Ｃ８）。
【０１０１】
１６）生存区間生成部１５は、中間言語ステップｓ１２，ｓ１４，ｓ１５を変数ｂの生存区間にする（定義毎生存区間検出処理ステップＣ９）。
１７）生存区間生成部１５は、変数ｂがＬｉｖｅＩｎ［Ｂ３］に属していることを判定し、基本ブロックＢ３が未探索であり、基本ブロックＢ３と中間言語ステップｓ１３に関して後続ブロック生存区間検出処理を行う（定義毎生存区間検出処理ステップＣ１０）。
【０１０２】
１８）生存区間生成部１５は、基本ブロックＢ３を探索済みとする（後続ブロック生存区間検出処理ステップＤ１）。
１９）生存区間生成部１５は、変数ｂがＬｉｖｅＯｕｔ［Ｂ３］に属さないことを判定し、後続ブロック生存区間検出処理ステップＤ５へ移る（後続ブロック生存区間検出処理ステップＤ２）。
【０１０３】
２０）生存区間生成部１５は、基本ブロックＢ３の出口から入口に向かって探索を行い、定義ｓ１３の定義−参照情報に存在する変数ｂの参照ｓ１７を見つける（後続ブロック生存区間検出処理ステップＤ５）。
２１）生存区間生成部１５は、中間言語ステップｓ１６，ｓ１７を変数ｂの生存区間にする（後続ブロック生存区間検出処理ステップＤ６）。
【０１０４】
２２）後続ブロック生存区間検出処理を終了し、先の１７）の状態に戻る（後続ブロック生存区間検出処理ステップＤ７）。
２３）生存区間生成部１５は、定義ｓ１３の定義−参照情報に存在する参照ｓ１３，ｓ１４，ｓ１７を取り出す。参照ｓ１４，ｓ１７の参照−定義情報に存在する変数ｂの定義ｓ１３だけであり、この定義ｓ１３はマーク済みである。また参照ｓ１３の参照−定義情報に存在する変数ｂの定義ｓ１１，ｓ１３はともにマーク済みであるので、定義毎生存区間検出処理を終了し、先の１３）の状態に戻る（定義毎生存区間検出処理ステップＣ１１〜Ｃ１６）。
【０１０５】
２４）生存区間生成部１５は、更に参照ｓ１３の参照−定義情報に存在するが、定義ｓ１１はマーク済みであるので、生存区間生成部１５は定義毎生存区間検出処理を終了し、先の１）の状態に戻る。以上により、変数ｂの生存区間が求められ、変数ｂを基本ブロック間生存変数集合保持部１４に格納する。
同様にして他の変数についても、生存区間生成部１５の生存区間検出処理を行うと図２１のようになる。
【０１０６】
次に、図９の生存区間重複検査処理によって変数の重複が検査される過程を示す。
まず、生存区間重複検査部１６は、単純ブロック内にのみ生存区間が存在する変数について重複検査を行う。例えば、同じ単純ブロックＰＢ８のみに存在する変数ｔ３と、変数ｙ４との生存区間の重複検査を行い、変数ｔ３と変数ｙ４とは、生存区間が重ならないと検査結果を下す（生存区間重複検査処理ステップＥ２）。
【０１０７】
次に生存区間重複検査部１６は、単純ブロック内にのみ生存区間が存在する変数と、基本ブロック内にのみ生存区間が存在する変数との生存区間の重複検査を行う。例えば、基本ブロックＢ１内にのみ生存区間が存在する変数ｙと、単純ブロックＰＢ９，  ＰＢ１０内にのみ生存区間が存在する変数との重複検査を行い、変数ｔ５，  ｚ４は、生存区間が重なると検出結果を下す（生存区間重複検査処理ステップＥ３〜Ｅ５）。
【０１０８】
次に生存区間重複検査部１６は、単純ブロック内にのみ生存区間が存在する変数と、基本ブロック間にまたがって生存区間が存在する変数との重複検査を行う。例えば、基本ブロックＢ２に生存区間が存在する変数ａと、単純ブロックＰＢ１５内にのみ生存区間が存在する変数ｃとの重複検査を行い、重複するという検査結果を下す（生存区間重複検査処理ステップＥ６、Ｅ７）。
【０１０９】
次に生存区間重複検査部１６は、基本ブロック内にのみ生存区間が存在する変数間の重複検査を行う。例えば、生存区間重複検査部１６は、基本ブロックＢ１内のみに生存区間が存在する変数ｘ，ｙについて重複検査を行い、変数ｘ，ｙは、生存区間が重複することを検出する（生存区間重複検査処理ステップＥ９）。
次に、生存区間重複検査部１６は、基本ブロック内にのみ生存区間が存在する変数と、基本ブロック間にまたがって生存区間が存在する変数との重複検査を行う。例えば、生存区間重複検査部１６は、基本ブロックＢ１に生存区間が存在する変数ａと、Ｂ１内にのみ生存区間が存在する変数ｘ，  ｙとの重複検査を行い、変数ｘ，ｙは、とは生存区間が重なることが検出され、ｙとは生存区間が重ならないことが検出される（生存区間重複検査処理ステップＥ１０、Ｅ１１）。
【０１１０】
次に、生存区間重複検査処理ステップＥ１２により、生存区間重複検査部１６は、基本ブロック間にまたがって生存区間が存在する変数間での生存区間の重複検査を行う。例えば、生存区間重複検査部１６は、変数ａと、変数ｂとの重複検査を行い、生存区間が重なると検査結果を下す。
【０１１１】
【発明の効果】
以上説明してきたように請求項１の発明に係るコンパイル装置によれば、基本ブロック内のみに生存区間が収まる変数のうち、異なる基本ブロック内に属するもの同士の重複判定処理が結果として省かれるので、生存区間の重複判定処理が無駄の無いものとなり、コンパイル時間を短縮することができる。
【０１１２】
また、請求項２に係るコンパイル装置によれば、プログラム中の大多数の変数が単純ブロック内に納められる。生存区間の重複判定処理は、同一の単純ブロックに納められたもの同士で行われるため、生存区間の重複判定処理が極めて無駄の無いものとなり、重複判定に要する処理時間を大きく短縮できる。具体的には、ｎ個の変数について、nＣ2回行われた生存区間の重複判定処理の処理時間は、この簡略化によって、約１／１０となる。
【０１１３】
また、請求項３に係るコンパイル装置によれば、生存区間が単純ブロック内に属するか属しないかで、生存区間の重複判定処理を個別化するので、冗長部な重複判定処理が徹底して省かれる。また、請求項４に係るコンパイル装置によれば、基本ブロック中の各定義命令について統合可能か否かを判定するので、元のプログラムのデータ依存関係を損なわずにプログラム中に単純ブロックを形成できる。
【０１１４】
また、請求項５に係るコンパイル装置によれば、基本ブロック内のみに生存区間が存在する変数の生存区間を、単純なアルゴリズムによって検出することができる。単純ブロック形成のために処理量が増加し、コンパイル処理の高速性の低下を招くことは無い。また、請求項６に係るコンパイル装置によれば、基本ブロック内のみに生存区間が存在する変数の生存区間を、単純なアルゴリズムによって表現することができる。
【０１１５】
また、請求項７に係るコンパイル装置によれば、基本ブロック間に生存区間が存在する変数の生存区間を、単純なアルゴリズムによって表現することができる。また、請求項８に係るコンパイル装置によれば、分岐処理内で値が設定される変数の生存区間を、単純なアルゴリズムによって表現することができる。また、請求項９に係るコンパイル装置によれば、分岐処理内で値が使用される変数の生存区間を、単純なアルゴリズムによって表現することができる。
【図面の簡単な説明】
【図１】本発明に係るコンパイル装置の構成を示す図である。
【図２】最適化装置２の構成を示す図である。
【図３】単純ブロック生成処理のフローチャートである。
【図４】単純ブロック生成の過程を示した図である。
【図５】資源割付装置３の構成を示す図である。
【図６】生存区間重複判定部９の構成を示す図である。
【図７】生存区間生成処理のフローチャートである。
【図８】定義毎生存区間検出処理のフローチャートである。
【図９】後続ブロック検索処理のフローチャートである。
【図１０】後続ブロック生存区間検出処理のフローチャートである。
【図１１】生存区間重複検査処理のフローチャートである。
【図１２】生存区間重複検査処理の処理過程を示す図である。
【図１３】基本ブロックを説明するための説明図である。
【図１４】ソースプログラムの一例である。
【図１５】中間言語プログラムの一例である。
【図１６】基本ブロック化された中間言語プログラムの一例である。
【図１７】データフロー情報、定義−参照情報、参照−定義情報の一例である。
【図１８】中間言語プログラム中の、各変数の生存区間を図示したものである。
【図１９】単純ブロック生成の過程を示した図である。
【図２０】単純ブロック生成後の、各変数の生存区間を図示したものある。
【図２１】生存区間保持部１１、単純ブロック内生存変数集合保持部１２、基本ブロック内生存変数保持部１３、基本ブロック間生存変数集合保持部１４の保持内容の一例を図示したものである。
【図２２】生存区間重複検査の検査結果を示したものである。
【図２３】生存区間、および、生存区間の重複検査の検査結果を示す図である。
【図１】
0003606387.tif 000002
【図２】
0003606387.tif 000003
【図３】
0003606387.tif 000004
【図４】
0003606387.tif 000005
【図５】
0003606387.tif 000006
【図６】
0003606387.tif 000007
【図７】
0003606387.tif 000008
【図８】
0003606387.tif 000009
【図９】
0003606387.tif 000010
【図１０】
0003606387.tif 000011
【図１１】
0003606387.tif 000012
【図１２】
0003606387.tif 000013
【図１３】
0003606387.tif 000014
【図１４】
0003606387.tif 000015
【図１５】
0003606387.tif 000016
【図１６】
0003606387.tif 000017
【図１７】
0003606387.tif 000018
【図１８】
0003606387.tif 000019
【図１９】
0003606387.tif 000020
【図２０】
0003606387.tif 000021
【図２１】
0003606387.tif 000022
【図２２】
0003606387.tif 000023
【図２３】
0003606387.tif 000024