JP3606387B2 - コンパイル装置 - Google Patents
コンパイル装置 Download PDFInfo
- Publication number
- JP3606387B2 JP3606387B2 JP21881194A JP21881194A JP3606387B2 JP 3606387 B2 JP3606387 B2 JP 3606387B2 JP 21881194 A JP21881194 A JP 21881194A JP 21881194 A JP21881194 A JP 21881194A JP 3606387 B2 JP3606387 B2 JP 3606387B2
- Authority
- JP
- Japan
- Prior art keywords
- instruction
- variable
- definition
- survival
- block
- 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
- 230000004083 survival effect Effects 0.000 claims description 289
- 238000001514 detection method Methods 0.000 claims description 201
- 238000000605 extraction Methods 0.000 claims description 19
- 238000013468 resource allocation Methods 0.000 claims description 17
- 239000000284 extract Substances 0.000 claims description 10
- 238000000034 method Methods 0.000 description 120
- 238000012545 processing Methods 0.000 description 79
- 238000007689 inspection Methods 0.000 description 32
- 238000010586 diagram Methods 0.000 description 13
- 238000005206 flow analysis Methods 0.000 description 13
- 238000012360 testing method Methods 0.000 description 8
- 238000004458 analytical method Methods 0.000 description 7
- 238000005457 optimization Methods 0.000 description 7
- 238000004364 calculation method Methods 0.000 description 5
- 230000010354 integration Effects 0.000 description 4
- 230000015572 biosynthetic process Effects 0.000 description 2
- 238000012790 confirmation Methods 0.000 description 1
- 230000001419 dependent effect Effects 0.000 description 1
- 230000000694 effects Effects 0.000 description 1
- 238000003780 insertion Methods 0.000 description 1
- 230000037431 insertion Effects 0.000 description 1
- 238000011835 investigation Methods 0.000 description 1
- 230000014759 maintenance of location Effects 0.000 description 1
- 230000000717 retained effect Effects 0.000 description 1
- 238000012546 transfer Methods 0.000 description 1
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/43—Checking; Contextual analysis
- G06F8/433—Dependency analysis; Data or control flow analysis
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/30—Arrangements for executing machine instructions, e.g. instruction decode
- G06F9/38—Concurrent instruction execution, e.g. pipeline or look ahead
- G06F9/3836—Instruction issuing, e.g. dynamic instruction scheduling or out of order instruction execution
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Devices For Executing Special Programs (AREA)
- Debugging And Monitoring (AREA)
Description
【0001】
【産業上の利用分野】
本発明は高級プログラミング言語で書かれたソースプログラムを機械語プログラムにコンパイルするコンパイル装置に関する。
【0002】
【従来の技術】
近年、C言語などの高級プログラミング言語でプログラムを記述し、プログラムの開発効率を高めることが盛んに行なわれている。
高級プログラミング言語を用いれば、プログラマは、プログラム中の数値の保持、演算、転送等の処理を、変数を被演算子とした演算(ステップ)で表現できる。この変数はプログラマによって任意に定義され、また必要な個数だけ用いられるため、プログラマは自由にプログラムを記述できる。また記述されたプログラム(ソースプログラムと称す。)は、コンパイルされることにより、コンピュータが理解可能な機械語プログラムとなる。当該機械語プログラム中の演算は、機械語命令によって表現され、また当該機械語命令は、レジスタあるいはメモリを被演算子とするので、上記変数には、レジスタあるいはメモリを割り付ける必要がある。この割り付け処理は資源割付処理と称される。この資源割付処理が最適であれば、上記機械語命令のコードサイズは最小、実行時間は最短となる。
【0003】
一方、レジスタとメモリとを比較すれば、レジスタを被演算子とする方が機械語命令の小サイズ化、実行時間の最短化が図れる。
但しレジスタは、使用できる個数が少数であるため、上記資源割付を行う前に同一レジスタを割り付け得る変数はどれとどれであるかを生存区間に基づき検査し、当該検査の検査結果によって、資源割付を行うことが一般的である。生存区間とは、それぞれの変数に格納されている値が有効となる区間のことであり、プログラムと、当該プログラムにおいて使用されている変数の生存区間を図23(a)に示す。
【0004】
本図において、変数x4と、変数t3は、生存区間が重なっていることから、同一レジスタを割り付け得ないことがわかる。変数t1と、変数t3は、この生存区間が重なっていないことから、同一レジスタを割り付け得ることがわかる。
次に、プログラム中の各変数の生存区間を、中間言語ステップの集合で表現する。中間言語ステップは、図23(a)の一例では、s1,s2,s3,s4,s5・・・・で表される。また中間言語ステップ集合での生存区間の表現を図23(b)の一例に示す。図23(b)の一例では、変数t1の生存区間は、中間言語ステップs2のみであり、変数xの生存区間は、中間言語ステップs8,s9,s10,s11であることが示される。
【0005】
次に、プログラム中の任意の2変数について、中間言語ステップ集合の集合積をとる。この集合積が空であれば、その2変数の生存区間は重ならないと判定でき、空でなければ重なると判定できる。図23(b)の一例では、変数xと変数x4とは、生存区間の集合に共通要素がないため上記集合積が空となり、非重複が判定される。また、変数x4と変数t3とは、生存区間の集合に共通要素s4が存在するため、上記集合積の結果が空でなくなる。そのため、変数x4と変数t3とは生存区間の重複が判定される。
【0006】
このように、集合積の算出を繰り返し、各変数の生存区間の重複、非重複を、図23(c)に示すように判定する。本図において、変数t1は、変数p1,p2,p3と生存区間が重なることが示される。また変数x4も、変数p1,p2,p3と生存区間が重なることが示される。
以上に述べた重複調査を行うと、レジスタに割り付ける変数の数を、より多くすることができる。
【0007】
【発明が解決しようとする課題】
しかしながら上記従来技術によれば、生存区間の重複検査に要する処理時間が多大なものとなるという問題点があった。上述のように、変数はプログラマの都合によって作成される。そのため、複数人のプログラマによって作成されるソフトウェア中の変数の総数は、百個前後になることが一般的である。これに加えて、中間言語プログラムの生成時には、変数が、コンパイル装置によって自動的に生成されるので、結果として重複検査の対象となる変数の総数は、数百個単位になる。
【0008】
変数の生存区間の重複検査は、集合積の算出によって求められるが、この集合積の、n個の変数についての計算回数は、nC2=n(n−1)/2回であり、個数nが数百個である場合、集合積の計算回数が非常に大きな数となる。例えば変数の個数nが100個だとすると、nC2=4950となり、コンパイル装置は、上記集合積の計算を4950回行うことになる。個数nが300個だとすると、nC2=44850となり、コンパイル装置は、集合積の計算を44850回行うことになる。
【0009】
本発明は、上記問題点に鑑み、生存区間の重複検査に要する処理時間を大きく低減できるコンパイル装置を提供することを目的とする。
【0010】
【課題を解決するための手段】
上記目的を達成するために請求項1のコンパイル装置は、複数の命令からなるプログラムを、機械語プログラムに翻訳するコンパイル装置であって、
前記プログラム中の飛び越し命令と、当該飛び越し命令の飛び越し先の命令とを検出する飛び越し検出手段と、
飛び越し検出手段が検出した命令に基づいて、前記プログラムを基本ブロックに分割する分割手段と、
プログラム中の各変数について、変数の設定値が有効となるプログラム中の区間である生存区間を検出し、検出結果を、生存区間内に含まれる命令の位置を示す位置情報の集合で表す生存区間検出手段と、
生存区間検出手段が検出した生存区間が1つの基本ブロック内に収まる変数を全て検出し、検出結果を、当該基本ブロックに対応づけた基本ブロック内生存変数集合で表す基本ブロック内生存変数検出手段と、
生存区間検出手段が検出した生存区間が、複数の基本ブロック間におよぶ変数を全て検出し、検出結果を、基本ブロック間生存変数集合で表す基本ブロック間生存変数検出手段と、
基本ブロック間生存変数集合から変数を2つずつ取り出し、当該2変数の生存区間に対応する命令位置情報集合の集合積を算出することで、生存区間の重複を判定する第1の生存区間重複判定手段と、
同一の基本ブロックに対応づけられた基本ブロック内生存変数集合から変数を2つずつ取り出し、当該2変数の生存区間に対応する命令位置情報集合の集合積を算出することで、生存区間の重複を判定する第2の生存区間重複判定手段と、
前記基本ブロックに対応づけられた基本ブロック内生存変数集合と、基本ブロック間生存変数とから変数を1つずつ取り出し、当該2変数の生存区間に対応する命令位置情報集合の集合積を算出することで、生存区間の重複を判定する第3の生存区間重複判定手段と、
前記第1、第2、第3の生存区間重複判定手段の判定結果を用いて資源割付を行うことを特徴としている。
【0011】
請求項2のコンパイル装置は更に、
変数の値を設定する命令である定義命令と、当該定義命令で設定された変数の値を使用する命令である参照命令とが、少なくとも一組順に並ぶ命令列である単純ブロックを、基本ブロック内に形成する単純ブロック形成手段と、
前記基本ブロック内生存変数集合から、生存区間が一つの単純ブロック内に収まる変数を全て検出し、検出結果を、当該単純ブロックに対応づけた単純ブロック内生存変数集合で表す単純ブロック内生存変数検出手段と、
前記基本ブロック内生存変数集合から生存区間が複数の単純ブロック間におよぶ変数を検出し、検出結果を、単純ブロック間生存変数集合で表す単純ブロック間生存変数検出手段と、
を備え、
前記第2の生存区間重複判定手段は、前記単純ブロック間生存変数集合から変数を2つずつ取り出し、当該2変数の生存区間に対応する命令位置情報集合の集合積を算出することで、生存区間の重複を判定する第1の生存区間重複判定部と、
同一の単純ブロックに対応づけられた単純ブロック内変数集合から変数を2つずつ取り出し、当該2変数の生存区間に対応する命令位置情報集合の集合積を算出することで、生存区間の重複を判定する第2の生存区間重複判定部と、
前記単純ブロックに対応づけられた単純ブロック内変数集合と、単純ブロック間生存変数集合とから変数を1つずつ取り出し、当該2変数の生存区間に対応する命令位置情報集合の集合積を算出することで、生存区間の重複を判定する第3の生存区間重複判定部と、
を備えることを特徴としている。
【0012】
請求項3のコンパイル装置は、
前記第3の生存区間重複判定手段は、
基本ブロック間生存変数集合と、前記単純ブロックに対応づけられた単純ブロック内生存変数集合とから変数を1つずつ取り出し、当該2変数の生存区間に対応する命令位置集合の集合積を算出することで、生存区間の重複を判定する第4の生存区間重複判定部と、
基本ブロック間生存変数集合と、単純ブロック間生存変数集合とから変数を1つずつ取り出し、当該2変数の生存区間に対応する命令位置集合の集合積を算出することで、生存区間の重複を判定する第5の生存区間重複判定部と、
を備えることを特徴としている。
【0013】
請求項4のコンパイル装置は、
前記単純ブロック形成手段として、
基本ブロックから、定義命令を1つずつ取り出す定義命令取り出し手段と、
定義命令取り出し手段が取り出した定義命令が含まれる基本ブロックから、その定義命令に対応する参照命令を検出する対応参照命令検出手段と、
対応参照命令検出手段が検出した参照命令の位置に、当該参照命令に対応する定義命令が移動可能か否かを判定する定義命令移動可否判定手段と、
定義命令移動可否判定手段が可能と判定した場合、定義命令移動可否判定手段が可能と判定した定義命令を、当該定義命令に対応する参照命令の直前に移動し、当該定義命令及び参照命令を一つの単純ブロックに統合する定義命令移動手段と、
定義命令移動手段が移動した定義命令が、移動前において、単純ブロック内の最後の命令である場合、移動前の単純ブロックの残りの命令の全てを当該定義命令の移動先の直前に移動し、移動した残命令を、移動先の単純ブロックに統合する単純ブロック残命令移動手段と、
を備えることを特徴としている。
【0014】
請求項5のコンパイル装置は、
前記定義命令移動可否判定手段として、
前記定義命令取り出し手段が取り出した定義命令によって値が設定される変数が一つであるか否かを判定する変数単複判定部と、
前記変数単複判定部が一つであると判定した場合、前記対応参照命令検出手段が検出した参照命令が一つか否かを判定する参照命令単複判定部と、
前記参照命令単複判定部が一つであると判定した場合、当該参照命令に対応する定義命令で値が設定される変数が、当該定義命令から当該参照命令までの区間において再設定されるか否かを判定する第1の再設定有無判定部と、
前記第1の再設定有無判定部が再設定がないと判定した場合、当該定義命令において使用される変数を検出する定義命令内使用変数検出部と、
前記定義命令内使用変数検出部が検出した変数が、当該定義命令から当該参照命令までの間に、再設定されないことを判定する第2の再設定有無判定部と、
前記第2の再設定有無判定部が再設定が無いと判定した場合、当該定義命令が、当該参照命令の位置に移動可能と判定する移動可否判定部と、
からなることを特徴としている。
【0015】
請求項6のコンパイル装置は更に、
前記プログラム中の各基本ブロックと、当該基本ブロックの入口において有効となる変数及び出口において有効となる変数とを対応させて記憶する有効変数情報記憶手段を備え、
前記生存区間検出手段は、前記プログラムから定義命令を1つずつ取り出す定義命令取り出し部と、
前記定義命令取り出し部によって取り出された定義命令を含む基本ブロックと、当該定義命令によって設定される変数とを検出し、検出した変数の設定値が当該基本ブロックの出口で無効か否かを、前記有効変数情報記憶手段の記憶内容に基づき判定する出口無効判定部と、
前記出口無効判定部が設定値無効と判定した場合、当該基本ブロックから、当該定義命令に対応する参照命令であって、当該基本ブロックの出口に最も近いものを検出する出口最近参照命令検出部と、
当該定義命令の次の命令から出口最近参照命令検出部が検出した参照命令までの命令位置情報を全て検出する基本ブロック内命令位置検出部と、
命令位置情報が検出された変数についての生存区間を、基本ブロック内命令位置検出部が検出した命令位置情報の集合で表す基本ブロック内生存区間表現部と、
を備え、
前記基本ブロック内生存変数検出手段は、前記基本ブロック内生存区間表現部が生存区間を表現した変数を、当該変数が含まれる基本ブロックに対応する基本ブロック内生存変数集合のメンバーにする
ことを特徴としている。
【0016】
請求項7のコンパイル装置は更に、
基本ブロックと、当該基本ブロックにおいて設定される変数とを対応させて記憶する基本ブロック内定義情報記憶手段を備え、
前記生存区間検出手段は、
前記出口無効判定部が有効と判定した場合、前記基本ブロック内定義情報記憶手段の記憶内容に基づいて、前記出口無効判定部によって有効と判定された定義命令において設定される変数が、当該定義命令から当該定義命令を含む基本ブロックの出口までの間に再設定されるか否かを判定する再設定有無判定部と、
前記再設定値有無判定部が再設定無しと判定した場合、当該定義命令の次の命令から当該基本ブロックの出口までの命令位置情報を検出する出口有効時位置情報検出部と、
前記再設定有無判定部が再設定無しと判定した場合、前記有効変数情報記憶手段および基本ブロック内定義情報記憶手段の記憶内容に基づいて、当該定義命令が含まれる基本ブロックの次順の基本ブロックのうち、当該変数がその入口及び出口で有効であり、かつその内部で、当該変数が再設定されないものを全て検出する生存基本ブロック検出部と、
前記基本ブロック内定義情報記憶手段の記憶内容に基づいて、前記生存基本ブロック検出部が検出した基本ブロック内に含まれる命令位置情報を全て検出する基本ブロック間位置情報検出部と、
前記再設定有無判定部が再設定無しと判定した場合、当該定義命令が含まれる基本ブロックの次順の基本ブロックのうち、その入口で当該変数の値が有効であり、その出口で無効である基本ブロックを検出する末尾基本ブロック検出部と、
前記末尾基本ブロック検出部が検出した基本ブロックから、当該定義命令に対応する最後の参照命令を検出する末尾参照命令検出部と、
前記末尾基本ブロック検出部が検出した基本ブロックの入口から前記末尾参照命令検出部が検出した参照命令までの命令位置情報を全て検出する入口有効時位置情報検出部と、
前記再設定有無判定部が再設定無しと判定した変数に対応する生存区間の集合を、出口有効時位置情報検出手段の検出結果と、入口有効時位置情報検出手段の検出結果と、基本ブロック間位置情報検出手段の検出結果とをあわせた集合で表す基本ブロック間生存区間表現部と、
を備え、
前記基本ブロック間生存変数検出手段は、前記再設定有無判定部が再設定無しと判定した変数を、基本ブロック間生存変数集合のメンバーにする
ことを特徴としている。
【0017】
請求項8のコンパイル装置は、
プログラム中の各命令位置と、当該命令位置の命令において使用される変数と、当該変数が設定される命令の命令位置情報とを対応させて記憶する参照−定義情報記憶手段を備え、
前記生存区間検出手段は、
前記定義命令取り出し部が取り出した定義命令の位置に識別情報を付するマーキング部と、
前記定義命令取り出し部が取り出した定義命令に対応する参照命令で使用される変数を検出する参照変数検出部と、
参照−定義情報記憶手段の記憶内容に基づいて、前記参照変数検出部が検出した変数に設定値を設定する定義命令を全て検出する定義命令検出部と、
前記定義命令検出部が検出した定義命令のうち、前記マーキング部によって付された識別情報が無いものを検出する無マーク定義命令検出部と、
前記無マーク定義命令検出部が検出した定義命令の次の命令から、その定義命令を含む基本ブロックの出口までの命令位置情報を全て検出する第1の分岐ブロック内位置情報検出部と、
前記基本ブロック間生存区間表現部が表した命令位置情報の集合に、前記第1の分岐ブロック内位置情報検出部が検出した命令位置情報を付加する第1の命令位置情報付加部と、
を備えることを特徴としている。
【0018】
請求項9のコンパイル装置は、
プログラム中の各命令位置と、当該命令位置の命令において設定される変数と、当該変数が使用される命令の命令位置情報とを対応させて記憶する定義−参照情報記憶手段を備え、
前記生存区間検出手段は、
前記定義−参照情報記憶手段の記憶内容に基づいて、前記無マーク定義命令検出部が検出した定義命令に対応する参照命令を検出する分岐ブロック内参照命令検出部と、
前記分岐ブロック内参照命令検出部が検出した参照命令を含む基本ブロックを検出する分岐ブロック検出部と、
前記分岐ブロック検出部が検出した基本ブロックの入口から、前記分岐ブロック内参照命令検出部が検出した参照命令までの命令位置情報を全て検出する第2の分岐ブロック内位置情報検出部と、
前記基本ブロック間生存区間表現部が表した命令位置情報の集合に、前記第2の分岐ブロック内位置情報検出部が検出した命令位置情報を付加する第2の命令位置情報付加部と、
を備えることを特徴としている。
【0019】
【作用】
請求項1のコンパイル装置によれば、飛び越し検出手段によって前記プログラム中の飛び越し命令と、当該飛び越し命令の飛び越し先の命令とが検出される。飛び越し検出手段が検出を行うと、飛び越し検出手段が検出した命令に基づいて、前記プログラムが、分割手段によって、基本ブロックに分割される。分割後、プログラム中の各変数について、変数の設定値が有効となるプログラム中の区間である生存区間が生存区間検出手段によって検出され、検出結果が、生存区間内に含まれる命令の位置を示す命令位置情報の集合で表される。検出後、生存区間検出手段によって検出された生存区間が1つの基本ブロック内に収まる変数が基本ブロック内生存変数検出手段によって全て検出され、検出結果が、当該基本ブロックに対応づけられた基本ブロック内生存変数集合で表される。また前記生存区間が複数の基本ブロック間におよぶ変数が基本ブロック間生存変数検出手段によって全て検出され、検出結果が、基本ブロック間生存変数集合で表される。
【0020】
検出後、基本ブロック間生存変数集合から、変数が第1の生存区間重複判定手段によって2つずつ取り出され、当該2変数の生存区間に対応する命令位置情報集合の集合積が算出されて、生存区間の重複が判定される。また同一の基本ブロックに対応づけられた基本ブロック内生存変数集合と、第2の生存区間重複判定手段によって、変数が2つずつ取り出され、当該2変数の生存区間に対応する命令位置情報集合の集合積が算出されることで、生存区間の重複が判定される。更に、前記基本ブロックに対応づけられた基本ブロック内生存変数集合から、基本ブロック間生存変数とから変数が第3の生存区間重複判定手段によって1つずつ取り出され、当該2変数の生存区間に対応する命令位置情報集合の集合積が算出されることで、生存区間の重複が判定される。プログラム中の変数の生存区間の重複判定は以上の判定処理によって全て完了する。以上の判定処理では、基本ブロック内のみに生存区間が収まる変数のうち、異なる基本ブロック内に属するもの同士の重複判定処理が結果として省かれる。このような判定処理の後、第1、第2、第3の生存区間重複判定手段の判定結果を用いて資源割付が行われる。
【0021】
また、請求項2において、
変数の値を設定する命令である定義命令と当該定義命令で設定された変数の値を使用する命令である参照命令とが少なくとも一組順に並ぶ命令列である単純ブロックが単純ブロック形成手段によって基本ブロック内に形成される。単純ブロックは、定義命令と参照命令とが順に並ぶ命令列であるため、当該定義命令で定義される変数の生存区間は最短になる。プログラマが作成したソ−スプログラムおよび中間言語プログラムには、設定および使用が一回限りの変数が大多数を占めるので、プログラム中の大多数の変数が、上記単純ブロック内に納められる。
【0022】
単純ブロック形成後、前記基本ブロック内生存変数集合から生存区間が一つの単純ブロック内に収まる変数が単純ブロック内生存変数検出手段によって全て検出され、検出結果は当該単純ブロックに対応づけた単純ブロック内生存変数集合で表される。また前記基本ブロック内生存変数集合から生存区間が複数の単純ブロック間におよぶ変数が単純ブロック間生存変数検出手段によって全て検出され、検出結果が単純ブロック間生存変数集合で表される。
【0023】
単純ブロック内生存変数集合、単純ブロック間生存変数集合生成後、変数が、前記単純ブロック間生存変数集合から第1の生存区間重複判定部によって、2つずつ取り出され、当該2変数の生存区間に対応する命令位置情報集合の集合積が算出されることで、生存区間の重複が判定される。また、同一の単純ブロックに対応づけられた単純ブロック内変数集合から、第2の生存区間重複判定部によって、変数が2つずつ取り出され、当該2変数の生存区間に対応する命令位置情報集合の集合積が算出されることで、生存区間の重複を判定される。上記のように、単純ブロックにおいては、変数の生存区間は最短となり、上記集合積の算出は簡略なものとなる。更に前記単純ブロックに対応づけられた単純ブロック内変数集合と、単純ブロック間生存変数集合とから、第3の生存区間重複判定部によって、変数が1つずつ取り出され、当該2変数の生存区間に対応する命令位置情報集合の集合積が算出することで、生存区間の重複が判定される。
【0024】
また請求項3において、
基本ブロック間生存変数集合と前記単純ブロックに対応づけられた単純ブロック内生存変数集合とから第4の生存区間重複判定部によって変数が1つずつ取り出され、当該2変数の生存区間に対応する命令位置集合の集合積が算出されることで、生存区間の重複が判定される。また、基本ブロック間生存変数集合と単純ブロック間生存変数集合とから、第5の生存区間重複判定部によって変数が1つずつ取り出され、当該2変数の生存区間に対応する命令位置集合の集合積を算出することで、生存区間の重複が判定される。
【0025】
また請求項4において、
前記単純ブロック形成手段は、
定義命令取り出し手段によって、基本ブロックから、定義命令が1つずつ取り出される。定義命令取り出し手段によって取り出された定義命令が含まれる基本ブロックから、対応参照命令検出手段によって定義命令取り出し手段が取り出した定義命令に対応する参照命令が検出される。検出後、対応参照命令検出手段が検出を行った定義命令が、対応参照命令検出手段が検出した参照命令の位置に移動可能か否かが定義命令移動可否判定手段によって判定される。この判定において定義命令移動可否判定手段が可能と判定した場合、定義命令移動可否判定手段が可能と判定した定義命令が定義命令移動手段によって当該定義命令に対応する参照命令の直前に移動され、当該定義命令及び参照命令が一つの単純ブロックに統合される。定義命令移動手段が移動した定義命令が移動前において単純ブロック内の最後の命令である場合、単純ブロック残命令移動手段によって移動前の単純ブロックの残りの命令の全てが当該定義命令の移動先の直前に移動され、移動した残命令が、移動先の単純ブロックに統合される。
【0026】
また請求項5において、
前記定義命令取り出し手段が取り出した定義命令によって値が設定される変数が一つであるか否かが変数単複判定部によって判定される。前記変数単複判定部が一つであると判定した場合、前記対応参照命令検出手段が検出した参照命令が一つか否かが参照命令単複判定部によって判定される。前記参照命令単複判定部が一つであると判定した場合、当該参照命令に対応する定義命令で値が設定される変数が、当該定義命令から当該参照命令までの区間において再設定されるか否かが、第1の再設定有無判定部によって判定される。前記第1の再設定有無判定部が再設定がないと判定すると当該定義命令において使用される変数が定義命令内使用変数検出部によって検出される。当該定義命令から当該参照命令までの間において、前記定義命令内使用変数検出部が検出した変数が再設定されないことが第2の再設定有無判定部によって判定される。前記第2の再設定有無判定部が再設定が無いと判定すると、当該定義命令が、当該参照命令の位置に移動可能であることが移動可否判定部によって判定される。 また、請求項6において、
前記定義命令取り出し部によって前記プログラムから定義命令が1つずつ取り出される。取り出された定義命令を含む基本ブロックと、当該定義命令によって設定される変数とが出口無効判定部によって検出され、検出された変数の設定値が当該基本ブロックの出口で無効か否かが、前記有効変数情報記憶手段の記憶内容に基づき判定される。前記出口無効判定部が設定値無効と判定した場合、当該基本ブロックから、当該定義命令に対応する参照命令であって、当該基本ブロックの出口に最も近いものが出口最近参照命令検出部によって検出される。参照命令の検出後、当該定義命令の次の命令から出口最近参照命令検出部が検出した参照命令までの命令位置情報が、基本ブロック内命令位置検出部によって全て検出される。命令位置情報の検出後、命令位置情報が検出された変数についての生存区間が、基本ブロック内生存区間表現部によって基本ブロック内命令位置検出部が検出した命令位置情報の集合で表される。一方、前記基本ブロック内生存区間表現部が生存区間を表現した変数が、前記基本ブロック内生存変数検出手段によって、当該変数が含まれる基本ブロックに対応する基本ブロック内生存変数集合のメンバーに加えられる。
【0027】
また、請求項7において、
前記出口無効判定部が有効と判定した場合、前記基本ブロック内定義情報記憶手段の記憶内容に基づいて、前記出口無効判定部によって有効と判定された定義命令において設定される変数が、再設定有無判定部によって当該定義命令から当該定義命令を含む基本ブロックの出口までの間に再設定されるか否かが判定される。前記再設定値有無判定部が再設定無しと判定した場合、出口有効時位置情報検出部によって当該定義命令の次の命令から当該基本ブロックの出口までの命令位置情報が検出される。前記再設定有無判定部が再設定無しと判定することで、前記有効変数情報記憶手段および基本ブロック内定義情報記憶手段の記憶内容に基づいて、当該定義命令が含まれる基本ブロックの次順の基本ブロックのうち、当該変数がその入口及び出口で有効であり、かつその内部で、当該変数が再設定されないものの全てが、生存基本ブロック検出部によって検出される。前記基本ブロック内定義情報記憶手段の記憶内容に基づいて、基本ブロック間位置情報検出部によって、前記生存基本ブロック検出部が検出した基本ブロック内に含まれる命令位置情報が全て検出される。
【0028】
前記再設定有無判定部が再設定無しと判定することで、当該定義命令が含まれる基本ブロックの次順の基本ブロックのうち、その入口で当該変数の値が有効であり、その出口で無効である基本ブロックが末尾基本ブロック検出部によって検出される。基本ブロックの検出後、前記末尾基本ブロック検出部が検出した基本ブロックから、末尾参照命令検出部により該定義命令に対応する参照命令が検出される。参照命令の検出後、前記末尾基本ブロック検出部が検出した基本ブロックの入口から前記末尾参照命令検出部が検出した参照命令までの命令位置情報が、入口有効時位置情報検出部によって全て検出される。命令位置情報の検出後、命令位置情報が検出された変数に対応する生存区間の集合が、基本ブロック間生存区間表現部によって出口有効時位置情報検出手段の検出結果と、入口有効時位置情報検出手段の検出結果と、基本ブロック間位置情報検出手段の検出結果とをあわせた集合で表される。
【0029】
一方、再設定有無判定部が再設定なしと判定した変数は、前記基本ブロック間生存変数検出手段によって基本ブロック間生存変数集合のメンバーに加えられる。
また、請求項8において、
マーキング部によって、前記定義命令取り出し部が取り出した定義命令の位置に識別情報が付される。マーキング部によるマーキング後、当該定義命令に対応する参照命令で使用される変数が、参照変数検出部によって検出される。変数の検出後、参照−定義情報記憶手段の記憶内容に基づいて、前記参照変数検出部が検出した変数に設定値を設定する定義命令が、定義命令検出部によって全て検出される。定義命令の検出後、前記定義命令検出部が検出した定義命令のうち、前記マーキング部によって付された識別情報が無いものが無マーク定義命令検出部によって全て検出される。識別情報無し定義命令の検出後、前記無マーク定義命令検出部が検出した定義命令の次の命令から、その定義命令を含む基本ブロックの出口までの命令位置情報が、第1の分岐ブロック内位置情報検出部によって全て検出される。命令位置情報の検出後、基本ブロック間生存区間表現部が表した命令位置情報の集合に、第1の命令位置情報付加部によって、前記第1の分岐ブロック内位置情報検出部が検出した命令位置情報が付加される。
【0030】
また、請求項9において、
前記定義−参照情報記憶手段の記憶内容に基づいて、分岐ブロック内参照命令検出部によって前記無マーク定義命令検出部が検出した定義命令に対応する参照命令が検出される。参照命令の検出後、前記分岐ブロック内参照命令検出部が検出した参照命令を含む基本ブロックが分岐ブロック検出部によって検出される。参照命令の検出後、前記分岐ブロック検出部が検出した基本ブロックの入口から、前記分岐ブロック内参照命令検出部が検出した参照命令までの命令位置情報が、第2の分岐ブロック内位置情報検出部によって全て検出される。命令位置情報の検出後、前記基本ブロック間生存区間表現部が表した命令位置情報の集合に、前記第2の分岐ブロック内位置情報検出部が検出した命令位置情報が第2の命令位置情報付加部によって付加される。
【0031】
【実施例】
以下、本発明のコンパイル装置の一実施例を図面を用いて説明する。先ず、本明細書においてので引用する用語を、以下に説明しておく。
・基本ブロックプログラム中の連続命令列であって、列の途中に飛び越しもなく、また途中への飛び越しもないものをいう。この基本ブロックの一例を図16に示す。本実施例では処理対象を中間言語プログラムとしているので、上記命令列は、中間言語のものが与えられる。
【0032】
更に、判断処理、あるいは、多方向分岐処理内の基本ブロックを、図13を参照しながら説明する。
図13(a)に示すように、基本ブロックとは列の途中に飛び越しもなく、また途中への飛び越しもないものを指すから、C言語風のif(p)文で表される判断処理において、選択的に実行される処理S1、S2は、それぞれ1つの基本ブロックB1、B2となる。このように処理S1、S2に相当する基本ブロックB1、B2を、分岐基本ブロックと称する。
【0033】
更に図13(b)に示すように、C言語でswitch(p)文で表される多方向分岐処理において、選択的に実行される処理S1、S2、S3、S4・・・・は、それぞれ1つの基本ブロックB1、B2、B3、B4・・・・となる。
また、プログラム中の一つの文あるいは中間コード命令など、中間言語プログラムの1実行単位を中間言語ステップと呼ぶことにする。
・変数の定義、参照
ある変数に値を設定している中間言語ステップをその変数の定義といい、定義された値を使っている中間言語ステップを変数の参照という。逆に変数に値を設定することを、変数を定義するという。更に変数の値を使うことを、変数を参照するという。
・生存変数に関する情報
ソースプログラム、中間言語プログラムを問わず、プログラム中のステップの狭間を点といい、その点において変数に格納されている値が有効であるとき、その点で当該変数は生きているという。更に基本ブロックBの入口の点で生きている変数の集合は、LiveIn[B]と表され、基本ブロックBの出口の点で生きている変数の集合は、LiveOut[B]と表される。また、基本ブロックB内に定義がある変数の集合をDef[B]で表す。尚この変数集合Def[B]は、生存変数に関する情報を求める過程に得られる。図16に示したプログラム例での、集合LiveIn[B]、集合LiveOut[B]を、図17(a)に示す。本図において、基本ブロックB1の入口で生きている変数は「p1,p2,p3」であることが判り、出口で生きている変数は「z1,a,b」であることが示される。
・定義−参照情報、参照−定義情報
定義−参照情報とは、定義によって設定された設定値がどこで使用されているかが示される情報であり、その一例を図17(b)に示す(定義によって設定された設定値を参照によって使用することを、定義が参照に到達するという。)。図17(b)の一例では、中間言語ステップs1で定義されている変数t1は、中間言語ステップs2で参照されることが判る。
【0034】
参照−定義情報とは、参照によって使用された設定値がどこで定義されているかが示される情報であり、その一例を図17(c)に示す。本図において、中間言語ステップs2で参照される変数は、変数t1,p3であり、これらの何れかは、中間言語ステップs1で定義される。
・変数についての注意
変数の中には、その生存区間を複数持つものがある。この場合、生存区間毎に異なるレジスタを割り付けることができ、また、そうした方がオブジェクトプログラムをより良くすることができる。そのため生存区間が複数ある場合は、生存区間毎に1つの変数が存在するものとする。これを図13(c)を参照しながら説明する。図13(c)において、「x=10」で定義される変数xは、「y=x+5」で参照されるから、「x=10」で定義される変数xの生存区間は図中のL5となる。一方「x=20」で定義される変数xは、「y=x+30」で参照されるから、「x=20」で定義される変数xの生存区間は図中のL6となる。
【0035】
一方、図13(d)において、「x=40」で定義される変数xは、参照されないまま、「x=30」で再定義されるので、「x=40」で定義される変数xの生存区間は、存在しないことになる。即ち、「x=40」で定義される変数xは生存しないと判定される。「x=30」で定義される変数xは「y=x+50」で参照されるから、「x=30」で定義される変数xの生存区間は図中のL7となる。
・生存区間についての注意
生存区間は、基本ブロックの集合、中間言語ステップの集合で表される。本実施例では、詳細な情報が必要とされるため、後者のものが採用されている。また、生存区間の重複、非重複を集合積で判定するため、生存区間の終始が一致する中間言語ステップでは、生存区間は重ならないとしている。そのため、変数の生存区間をステップ集合で表す場合、定義のステップは、当該集合に含まない。
【0036】
以上の変数及び生存区間に関する情報、定義-参照情報、参照-定義情報については、以下の文献に詳細が記されている。
A.Aho, R.Sethi, J.Ulman:"Compilers Principles, Techniques, and Tools",Addison Wesley, 1988
以下、本発明の生存区間重複検査装置の一実施例を図面を用いて説明する。図1は、本発明の第1の実施例におけるコンパイラ装置 ( 図中では単にコンパイラと記載している )の構成図である。コンパイル装置は、構文解析装置1と、最適化装置2と、資源割付装置3と、コード生成装置4とで構成されている。
【0037】
構文解析装置1は、ファイルとして記憶されているソースプログラムの字句解析、構文解析、および意味解析を行なう。解析結果は、中間言語プログラムとして出力される。ソースプログラムの一例を図14に示し、当該ソースプログラムに対応する中間言語プログラムの一例を図15に示す。
最適化装置2は最終的に生成される機械語プログラムのプログラムサイズを削減し、実行時間を短縮させる目的で中間言語プログラムの最適化を行なう。
【0038】
資源割付装置3は、プログラムの変数の生存区間を求め、生存区間毎に変数に資源であるレジスタやメモリを割り付ける。
コード生成装置4は、最適化された中間言語プログラムを、資源割付装置3の割り付け結果に従って、ターゲットマシンの機械語命令に変換し、オブジェクトプログラムとして出力する。
【0039】
図2は、図1に示す最適化装置2の構成図である。この最適化装置2の詳細については本発明の主眼でないので説明を省略し、本発明のコンパイル装置と特に関係のある点のみを説明する。最適化装置2は、制御フロー解析部5と、データフロー解析部6と、最適化処理部7と、単純ブロック生成部8とで構成される。制御フロー解析部5およびデータフロー解析部6では、基本ブロック化、制御フロー解析、データフロー解析という作業を行う。基本ブロック化とは、処理対象のプログラムを、以後の処理単位である基本ブロックに分割することである。図15に示した中間言語プログラムについての基本ブロックを図16に示す。また制御フロー解析とは、各基本ブロック間の制御の流れを解析することである。更にデータフロー解析とは各基本ブロックの内部を調べ、それぞれの変数がどこで定義され、どこで参照されているかについて解析することである。これらの処理によって、データ情報、定義-参照情報、及び参照-定義情報が得られる。以上の3情報の一例を図17(a)(b)(c)に図示する。本一例は図16に示した中間言語プログラムについてのものである。図17(a)に示すデータフロ−情報において、基本ブロックB1の入り口では、変数p1,p2,p3が生きていることが示される。また、基本ブロックB1の出口では、変数z,a,bが生きていることが示される。図17(b)において、中間言語ステップs1で定義される変数t1は、中間言語ステップs2で参照されることが示される。図17(c)の参照−定義情報において、中間言語ステップs2で参照される変数t1,p3は、中間言語ステップs1で定義されることが示される。
【0040】
最適化処理部7は、制御フロー解析部5およびデータフロー解析部6の処理結果を使って中間言語プログラムに対する最適化を行う。この部分は本発明の主眼でないのでその詳細は省略する。
単純ブロック生成部8は、基本ブロックを複数個の小ブロックに分割し、分割後、小ブロック同士の統合が可能か否を判定して、当該判定で可能と判定されたもの同士を統合し、定義と参照とが少なくとも一組順に並ぶステップ列を形成する。単純ブロック生成部8は、この統合処理によって基本ブロック内の生存区間の重複をより単純なものとする。このような統合処理によって、最終的に形成される小ブロックは単純ブロックと称される。単純ブロック生成前の生存区間の重複を図18に図示し、生成後の生存区間の重複を図20に図示する。図20と図18では、図20のほうが、比較的に生存区間の重複がより単純になり、生存区間の重複数が減少するので、資源割付部で必要とするレジスタ数も少ないもので済む。
【0041】
単純ブロック生成部8の処理過程を図3のフロ−チャ−ト、図4の説明図を参照しながら説明する。図3は単純ブロックを生成する手順を示すフローチャートであり、図4は、図3のフロ−チャ−トの各ステップでの処理を図的に表した説明図である。
ステップA1において単純ブロック生成部8は、基本ブロック内の各中間言語ステップを1つの小ブロックにする。図18に示したプログラムの基本ブロックB1に対して、この処理を行うと、基本ブロックB1内部は、図19(a)に示すものとなる。図19(a)において、中間言語ステップs1は小ブロックPB1となる。また、中間言語ステップs2は小ブロックPB2となる。同様に中間言語ステップs3、s4、s5・・・は小ブロックPB3、PB4、PB5・・・となる。
【0042】
ステップA2において、単純ブロック生成部8は小ブロックを、図4(a)の矢符b11、12、13に示すように、実行順に小ブロックを一つずつ取り出す。
ステップA3において単純ブロック生成部8は、取り出した小ブロックb1が基本ブロック内で最後のものであるかを判定し、最後の場合、処理を終了する。小ブロックb1が最後でない場合、ステップA4を行う。
【0043】
ステップA4において単純ブロック生成部8は、小ブロックb1の最後にある中間言語ステップs1を取り出す。
ステップA5において単純ブロック生成部8は、図4(b)に示すように、取り出した中間言語ステップs1で定義される変数vが一つか複数かの判定を行い、複数の場合、ステップA2を行う。単数の場合、ステップA6を行う。
【0044】
ステップA6において、単純ブロック生成部8は、図4(c)に示すように変数vの参照が基本ブロック内に存在するか否か、即ち、変数の生存区間の長さが他の基本ブロックに及ぶか否かを判定する。及ぶ場合ステップA2を行い、及ばない場合、ステップA7を行う。
ステップA7において、図4(d)に示すように、その変数vの参照が一回限りであることを判定する。この判定は、定義−参照情報から変数vの参照回数を調べることで行われる。複数回であればステップA2を行い、一回限りであれば、ステップA8を行う。
【0045】
ステップA8において、単純ブロック生成部8は、図4(e)に示すように、定義s1から変数vの参照までに、変数vが再定義されているかを判定する。定義されている場合はステップA2を行う。定義されていない場合は、ステップA9を行う。
ステップA9において、単純ブロック生成部8は、図4(f)に示すように、変数vが依存する変数vx、即ち、小ブロックb1内で参照される変数が、定義s1から変数vの参照までに再定義されるか否かを判定する。再定義されるときはステップA2を行い、再定義がない場合はステップA10を行う。ここで依存がある変数とは、当該変数の設定値に、影響を及ぼし得る全ての変数をいう。上述のように、小ブロックb1は参照と定義とが順に並ぶステップ列に形成されてゆくから、小ブロックb1は、変数vが依存する変数を全て含んでいる。例えば、図19(d)の小ブロックPB7に示す変数xの設定値は、変数x4、t1、p3、p1、p2の設定値の影響を受けるので、変数xは、変数x4、t1、p3、p1、p2に依存するという。もし依存変数の定義、即ち、変数x4、t1、p3、p1、p2の定義が、変数xの定義から参照までの区間に存在すると、変数xの定義命令を参照命令の位置に移動することは上記依存関係を損なうことになる。このような依存関係の損失を考慮して、単純ブロック生成部8は移動可、移動不可を判定する。
【0046】
ステップA10、ステップA11、ステップA12において、単純ブロック生成部8は小ブロックb1を抜き出し、抜き出した小ブロックb1を、変数vの参照(中間言語ステップs2)が属する小ブロックb2の先頭に挿入する。または小ブロックb1をステップS2の直前に挿入してもよい。この抜き出し及び挿入処理で、小ブロックb1及びb2が、1つの小ブロックに統合される。このような統合をおこなった後、単純ブロック生成部8は小ブロックb1を削除する。図19(a)に示した一例では、小ブロックPB1が抜き出され、小ブロックPB2の直前に挿入されて、図19(a)に示した小ブロックPB1、PB2は小ブロックPB2に統合される(矢線g12参照)。その結果、小ブロックPB2は、図19(b)に示すように、中間言語ステップs1、s2をメンバーに含むようになる。更に、小ブロックPB2が抜き出され、小ブロックPB7の直前に挿入されて、図19(b)に示した小ブロックPB2、PB7は、小ブロックPB7に統合される(矢線g27参照)。その結果、小ブロックPB7は、図19(c)に示すように、中間言語ステップs1、s2、s7をメンバーに含むようになる。同様に、矢線g38に示すように小ブロックPB3及びPB4がPB8に統合され、更に矢線g59に示すように、小ブロックPB5及びPB6がPB9に統合されるので、小ブロックPB8は、中間言語ステップs3、s4、s8をメンバーとして含むようになり、小ブロックPB9は、中間言語ステップs5、s6、s9をメンバーとして含むようになる。以上の統合によって、小ブロックPB7,PB8,PB9が単純ブロックとなる。
【0047】
以上のステップA1〜ステップA12の手順を、単純ブロック生成部8は、図4(a)の矢符b11、b12に示すように、残りの小ブロックについて繰り返す。これらの単純ブロックにおいて、その内部の中間言語ステップは、始めから終りの一ステップ前まで、変数の参照が1回きりのもののみで構成されるようになる。また、その変数の参照が行われる中間言語ステップは、変数の定義が行われる中間言語ステップと同一の単純ブロックとなる。
【0048】
図5は、図1に示した資源割付装置3の構成図である。
生存区間重複判定部9は、生存区間を生成しその生存区間の重複を検出する。
変数資源割付部10は、生存区間重複判定部9が求めた生存区間の情報を用いて、資源であるレジスタやメモリを変数に割り付ける。このとき、生存区間が重なる変数においては異なるレジスタを変数に割付ける。
【0049】
図5は、図1の資源割付装置3の構成図である。
資源割付装置3は、生存区間保持部11、単純ブロック内生存変数集合保持部12、基本ブロック内生存変数集合保持部13、基本ブロック間生存変数集合保持部14、生存区間生成部15、生存区間重複検査部16とで構成される。
生存区間保持部11は、中間言語ステップによって表現された生存区間を、変数と対応づけて保持する。また、各変数がどの単純ブロックにあるか、更に、どの基本ブロックにあるかを対応づけている。生存区間保持部11の保持内容の一例を図21(a)に示す。これは、図20に示したプログラム例と対応している。本図を参照すれば、変数t1の生存区間は中間言語ステップs2のみであり、また、変数t1は単純ブロックPB7に属し、基本ブロックB1に属することが明確になる。
【0050】
単純ブロック内生存変数集合保持部12は、単純ブロック内のみに生存区間が存在する変数を、当該単純ブロックと対応づけて保持する。このように単純ブロック内のみに生存区間が存在する変数は、単純ブロック内変数集合と称される。単純ブロック内生存変数集合保持部12の保持内容の一例を図21(b)に示す。本図も図20に示したプログラム例と対応づけられている。本図を参照すれば、単純ブロックPB7は、変数t1と、変数x4とを含むことがわかる。
【0051】
基本ブロック内生存変数集合保持部13は、基本ブロック内のみに生存区間が存在する変数であって、その生存区間が、複数の単純ブロック間にわたるものを当該基本ブロックと対応づけて保持する。この基本ブロック内生存変数集合保持部13が保持する変数の集合は、基本ブロック内変数集合と称される。基本ブロック内生存変数集合保持部13の保持内容の一例を図21(c)に示す。本図も図20に示したプログラム例と対応づけられている。本図を参照すれば、単純ブロックB1の基本ブロック内変数集合は、変数xと、変数yとを含むことがわかる。
【0052】
基本ブロック間生存変数集合保持部14は、変数のうち、生存区間が、複数の基本ブロック間にわたるものの集合を保持する。基本ブロック間生存変数集合保持部14が保持する変数の集合は基本ブロック間変数集合と称される。基本ブロック間生存変数集合保持部14の保持内容の一例を図21(d)に示す。本図も図20に示したプログラム例と対応づけられている。本図を参照すれば、変数z,a,bは、その生存区間が、複数の基本ブロック間にまたがっていることがわかる。
【0053】
生存区間生成部15は、変数の生存区間を中間言語ステップの集合で表現し、当該生存区間の範囲によって、変数を3つの集合に分類する。生存区間生成部15の処理は、生存区間生成処理、定義毎生存区間検出処理、及び後続ブロック生存区間検出処理に大別され、また上記の3つの集合とは、先に述べた単純ブロック内変数集合、基本ブロック内変数集合、基本ブロック間生存変数集合である。この分類は、変数の格納先を、単純ブロック内生存変数集合保持部12、基本ブロック内生存変数集合保持部13、基本ブロック間生存変数集合保持部14に切り換えることで行われる。
【0054】
生存区間生成部15の処理過程を図7、図8、図9、図10のフロ−チャ−トを参照しながら説明する。
図7は生存区間生成処理のフロ−チャ−ト、図8は定義毎生存区間検出処理のフロ−チャ−ト、図9は後続ブロック探索処理のフロ−チャ−ト、図10は後続ブロック生存区間検出処理のフロ−チャ−トである。
【0055】
図7のステップB1において、生存区間生成部15は、未処理の定義が存在するか否かを判定する。処理済みか未処理かは、定義に付されるマークで判別される。存在するとき、ステップB2を行い、そうでないときは処理を終了する。
ステップB2、B3、B4、B5において、生存区間生成部15は、先ず全ての基本ブロックを未探索にして、未マークの定義s1を取り出し、定義s1にマークをつけ、定義毎生存区間検出処理を行なう。
【0056】
以上のステップB1、B2、B3、B4、B5の処理は、全ての中間言語ステップがマークされるまで繰り返される。
図8に示すステップC2において、生存区間生成部15は、中間言語ステップsで定義される変数vが基本ブロックBの出口において生きていること、つまり、変数vがLiveOut[B]に属することを判定し、存在する場合、ステップC18を行ない、存在しない場合、ステップC3〜ステップC7を行う。
【0057】
ステップC18において生存区間生成部15は、定義sの次の中間言語ステップからBの最後の中間言語ステップまでに定義s以外の変数vの定義が存在しないことを判定する。存在しないときステップC8〜ステップC16を行ない、存在するときステップC3〜ステップC7を行う。
ステップC3、C4において、生存区間生成部15は、基本ブロックBの出口から入口に向かう方向に向けて探索を行い、変数vの参照s1を見つける。この探索作業は、定義sの定義−参照情報を参照することで行われる。参照s1を見つけると、生存区間生成部15は、定義sの次の中間言語ステップから参照s1までの中間言語ステップを変数vの生存区間として生存区間保持部11に格納する。
【0058】
ステップC5、ステップC6、ステップC7において、生存区間生成部15は、定義sが属する単純ブロックpbと、参照s1が属する単純ブロックが同じかどうか判定し、同じ場合(ステップC5)、生存区間生成部15は、定義sを単純ブロック内生存変数集合保持部12に格納し(ステップC6)、そうでない場合、即ち、定義sが属する単純ブロックpbと参照s1が属する単純ブロックとが異なる場合(ステップC5)、変数vを基本ブロック内生存変数集合保持部13に格納し(ステップC7)、ステップC17へ進む。
【0059】
ステップC8、C9において、生存区間生成部15は、変数vを基本ブロック間生存変数集合保持部14に格納し(ステップC8)、定義sの次の中間言語ステップから基本ブロックBの最後の中間言語ステップまでを、変数vの生存区間として生存区間保持部11に格納する(ステップC9)。ただし、定義s自体が基本ブロックBの最後の中間言語ステップのときは、生存区間保持部11には何にも格納しない。
【0060】
ステップC10において、生存区間生成部15は、実行順が基本ブロックBの次のもの(後続基本ブロック)を取り出し、その後続基本ブロックB1のLiveIn[B1]を参照して、後続の基本ブロックB1が未探索であり、かつその入口で変数vが生きていることを確認する。確認後、定義s及び基本ブロックB1を処理対象にして、後続ブロック探索処理を行なう。
【0061】
図9は、後続ブロック探索処理のフロ−チャ−トである。
ステップF1、F2、F3、F4、F5において、生存区間生成部15は、LiveIn[B1]に変数vが属するかを判定し(ステップF2)、属する場合基本ブロックB1は未探索であるかどうかを判定する(ステップF3)。未探索であると、後続ブロック生存区間検出処理を行う(ステップF4)。もし未探索でないなら、基本ブロックBの後続基本ブロックB1がみつかるまで(ステップF3)、以上の処理を繰り返す(ステップF1、F5)。
【0062】
図10は後続ブロック生存区間検出処理の手順を示すフローチャートである。
ステップD1において、生存区間生成部15は、基本ブロックBを探索済みとする。
ステップD2において、生存区間生成部15は、中間言語ステップsで定義される変数vが、基本ブロックBの出口で生きていることを判定する。生きている場合ステップD8を行い、そうでない場合ステップD5〜ステップD6を行なう。上記判定は、具体的には、生存区間生成部15が、変数vがLiveOut[B]にvが属していることを確認することで行われる。
【0063】
ステップD8において、生存区間生成部15は、基本ブロックBに変数vの定義が存在しないことを判定し、この場合、ステップD3〜ステップD4を行なう、そうでないときステップD5〜D6を行う。この判定は、具体的には、Def[B]に変数vが属さないことを確認することで行われる。
ステップD3において、生存区間生成部15は、基本ブロックB1の入口から出口までの中間言語ステップを変数vの生存区間にする(ステップD3)。
【0064】
ステップD4において、生存区間生成部15は、後続ブロック探索処理を行う。
ステップD5において、生存区間生成部15は、定義sの定義−参照情報に基づいて、基本ブロックBの出口から入口に向けて探索を行い、変数vの参照s1を見つける。
【0065】
ステップD6では、Bの先頭の中間言語ステップから参照s1までをvの生存区間として生存区間保持部11に格納し、図10に示した後続ブロック生存区間検出処理を終了する。
ステップC12、C13、C14のループ処理において、生存区間生成部15は、参照s2に到達する残り全ての定義である定義s3について、生存区間生成処理を再帰的に行い、変数vの生存区間の情報に、この定義s3についての生存区間の情報を付け加える。この定義s3の所在の探し出しは、参照s2の参照−定義情報を参照することで行われる。上記定義s3は、上述の分岐基本ブロック内にあり、これらを全て探し出すため、ステップC12、C13、C14の処理は繰り返えされる。
【0066】
ステップC11、C15、C16において、生存区間生成部15は、プログラム中の判断分岐処理あるいは多方向分岐処理が存在し、更に、上記参照s2が一つの分岐先基本ブロック内にある場合、生存区間生成部15は、残りの分岐基本ブロック内にある残り全ての参照を求める。それぞれの参照s2について、ステップC12、C13、C14のループ処理を繰り返し行う。
【0067】
ステップC17では、定義毎生存区間検出処理を終了する。
以上の手順により、変数は、単純ブロック内生存変数集合保持部12か、基本ブロック内生存変数集合保持部13か、基本ブロック間生存変数集合保持部14のどれかに格納され、これらの保持部の保持内容が、図21(b)、(c)、(d)に示したものとなる。
【0068】
生存区間重複検査部16は、変数の生存区間の重複を検査する。当該検査は、単純ブロック内生存変数集合保持部12、基本ブロック内生存変数集合保持部13、基本ブロック間生存変数集合保持部14、生存区間保持部11の情報を使用して行われる。この重複検査処理を、図11のフロ−チャ−トを参照しながら説明する。
【0069】
ステップE2では、単純ブロック毎変数集合ps1に属する変数間に対して、生存区間の重複を検査する。(単純ブロック内にのみ生存区間がある変数間での生存区間重複検査)
ステップE3、E4、E5のループ処理において、生存区間重複検査部16は、図12(c)に示すように、基本ブロックpb1が基本ブロックbs1に属するか否かを判定し、基本ブロックbb1の基本ブロック内変数集合bs1に属する変数v1の生存区間が単純ブロックpb1に存在するか否かを判定して(ステップE4)、更に図12(d)に示すように、単純ブロック内変数集合ps1に属する変数と、変数v1の間で生存区間の重複を検査する(ステップE5 これは、単純ブロック内にのみ生存区間がある変数と、基本ブロック内にのみ生存区間がある変数での生存区間重複検査となる。)。このステップE4、E5の処理を、生存区間重複検査部16は、基本ブロックbb1の基本ブロック毎変数集合bs1に属するすべて変数について繰り返す(ステップE3)。
【0070】
ステップE6、E7のループ処理において、生存区間重複検査部16は、単純ブロック内変数集合ps1に属する変数と、基本ブロック間生存変数集合保持部14に保持されている変数v2のとで生存区間の重複を検査する(ステップE7)。ステップE7の処理を、全ての基本ブロック間生存変数集合保持部14に保持されている残り全ての変数v2について繰り返す(ステップE6)。
【0071】
ステップE1において生存区間重複検査部16は、ステップE2からE7までの処理が単純ブロック内生存変数集合保持部12にある単純ブロックpb1の単純ブロック毎変数集合ps1の全ての変数について行ったか否かを判定し、処理済みならば、ステップE8からE12までの処理を行う。
ステップE8において生存区間重複検査部16は、基本ブロック内生存変数集合保持部13にある全ての基本ブロックbb2の基本ブロック内変数集合bs2についてステップE9からE11を行う。
【0072】
ステップE9において生存区間重複検査部16は、基本ブロック内変数集合bs2に属する変数についての生存区間重複を検査する。
ステップE10、E11では、基本ブロック内変数集合bs2に属する変数vと、基本ブロック間変数集合に属する変数v3との間で生存区間の重複を検査し(ステップE11)、基本ブロック間生存変数集合保持部14に保持されている変数v3のうち、基本ブロックbb2内に生存区間が存在するものの全てについて、ステップE11の検査を繰り返す(ステップE10)。
【0073】
ステップE12では、基本ブロック間生存変数集合保持部14にある変数間について生存区間の重複を検査する。
以上のように生存区間重複検査部16が検査処理を行うと、生存区間の重複が検査される。図20のプログラム例についての検査結果を図22に示す。
以上のように構成される本実施例の資源割付装置における具体的な動作を図14から図20を使用して説明する。
【0074】
図14は、C言語記述のプログラムの一部分の例である。本図において、変数p1, p2, p3の定義は、プログラム例の1行目より以前にあるものとし、4行目以降は使用がないものする。また、変数sの参照が、この例の後に存在するとする。
図15は、図14のソースプログラムに対する構文解析装置1の出力である中間言語プログラムである。この中間言語プログラムは2番地形式のもので与えられる。
【0075】
図15の中間言語プログラムに対して制御フロー解析部5が基本ブロック化を行い、図16に示した基本ブロックが生成される。図16において、中間言語ステップs1からs11までが基本ブロックB1、中間言語ステップs12からs15までが基本ブロックB2、中間言語ステップs16からs18までが基本ブロックB3である。
図16に示した基本ブロック化後の中間言語プログラムに対して、データフロー解析部6がデータフロー解析を行うと、図17に示した生存変数に関する情報、定義−参照情報、及び参照−定義情報が求められる。
【0076】
単純ブロック生成部8が、単純ブロック生成処理の手順により、図16中の基本ブロックB1を単純ブロックに分割する過程を図19に示す。
先ず単純ブロック生成部8は、図19(a)に示すように、基本ブロックB1を、中間言語ステップを一つだけ含む単純ブロックに分割する(単純ブロック生成処理のステップA1)。
【0077】
単純ブロック生成部8が、図3に示したフロ−チャ−トのステップA2からステップA12までの処理を行い、小ブロックPB1に含まれている中間言語ステップs1を小ブロックPB2の先頭に移動する。
詳しくは、単純ブロック生成部8は、小ブロックPB1を取りだし(単純ブロック生成処理のステップA2)、小ブロックPB1が基本ブロックB1の最後の小ブロックでないことを検出し(単純ブロック生成処理のステップA3)、小ブロックPB1の最後の中間言語ステップs1を検出する(単純ブロック生成処理のステップA4)。次に、中間言語ステップs1で定義される変数が変数t1の唯一つであることを検出し(単純ブロック生成処理のステップA5)、変数t1の参照が1回であり、基本ブロックB1内にあることを定義−参照情報から検出する(単純ブロック生成処理のステップA6、A7)。次に、定義s1の次の中間言語ステップから変数t1の参照までに、変数t1の定義がないことを検出し、定義s1で参照される変数p1, p2の定義が、定義s1の次の中間言語ステップから変数t1の参照までにないことを検出し、変数t1の参照が属する小ブロックPB2を検出する(単純ブロック生成処理のステップA10)。そして、小ブロックPB2の先頭に小ブロックPB1の要素である定義s1を挿入する(単純ブロック生成処理のステップA11)。
【0078】
同様に、図19(a)の小ブロックPB2に属する中間言語ステップs1,s2を、小ブロックPB7の先頭に移動した様子を図19(c)に示す。以上の処理を小ブロックPB3, PB4, PB5, PB6の順に繰り返すと、基本ブロックB1の内部は、図19(c)に示したものから、図19(d)に示したものへと変遷する。
続いて、単純ブロック生成部8が、小ブロックPB7の最後の中間言語ステップs7で定義される変数xと、小ブロックPB8の最後の中間言語ステップs8で定義される変数yとを移動しようとするが、これらの変数x,yは、参照回数が2回なので小ブロックPB7, PB8の移動を行わないと判定する(単純ブロック生成処理のステップA7)。同じく小ブロックPB9を移動しようとするが、小ブロックPB9は、最後の定義s9で定義される変数zの参照が基本ブロックB2に存在するため、移動を行わないと判定する(単純ブロック生成処理のステップA6)。小ブロックPB10は最後の中間言語ステップs10で定義される変数aが基本ブロックB2で参照されるので移動を行わないと判定し(単純ブロック生成処理のステップA6)、小ブロックPB11は基本ブロックB1の最後の小ブロックであるので移動を行わないと判定する(単純ブロック生成処理のステップA3)。結局、基本ブロックB1の単純ブロック化は、図19(d)に示した状態に留まる。
【0079】
単純ブロック生成部8が、単純ブロック化を基本ブロックB2,B3についても行った様子を、図20に示す。
単純ブロック生成部8による単純ブロック形成後、生存区間生成部15が、生存区間の表現を行い、かつ、各変数を、3つの集合に分類する。
この様子を、代表的な変数t1, y, a, b を一例にして説明する。
【0080】
始めに変数t1について説明する。
1)生存区間生成部15によって、マーク済みでない中間言語ステップs1が選択される。生存区間生成部15は、中間言語ステップs1にマークし、定義毎生存区間検出処理へ移る(生存区間生成処理のステップB1〜B5)。
2)全ての基本ブロックを未探索にする(生存区間生成処理のステップB4)。
【0081】
3)次に変数t1がLiveOut[B1]に含まれているか検査する。変数t1は含まれていないので定義毎生存区間検出処理のステップC3へ移る(定義毎生存区間検出処理のステップC2、C18)。
4)定義s1の定義−参照情報から、基本ブロックB1の出口から入口に向かって探索を行い、最初に見つかる変数t1の参照s2を見つける(定義毎生存区間検出処理のステップC3)。
【0082】
5)生存区間生成部15は、中間言語ステップs2を取り出し、これを、変数t1に対応づけて、変数t1の生存区間の一部にする(定義毎生存区間検出処理のステップC4)。
6)生存区間生成部15は、中間言語ステップs1とs2は同じ単純ブロックPB8に属しているので、変数t1を単純ブロック内生存変数集合保持部12の単純ブロックPB7の単純ブロック毎変数集合に格納する(定義毎生存区間検出処理のステップC5)。
【0083】
以上により、変数t1の生存区間が求められ、また変数t1は、単純ブロック内生存変数集合保持部12に格納される。
次に変数yについて説明する。
1)マーク済みでない中間言語ステップs8が、生存区間生成部15によって選択される。生存区間生成部15は、中間言語ステップs8にマークし、生存区間生成処理を行う(生存区間生成処理のステップB1〜B5)。
【0084】
2)全ての基本ブロックを未探索にする(生存区間生成処理のステップB4)。
3)次に変数yがLiveOut[B1]に含まれているか検査する。生存区間生成部15は、変数yは含まれていないので定義毎生存区間検出処理のステップC3を行う(定義毎生存区間検出処理のステップC2、C18)。
4)生存区間生成部15は、中間言語ステップs8の定義−参照情報に基づいて、基本ブロックB1の出口から入口に向けての探索を行い、変数yの参照である中間言語ステップs10を見つける(定義毎生存区間検出処理のステップC3)。
【0085】
5)生存区間生成部15は、変数yの生存区間を、中間言語ステップs5,s6,s9,s10までにする(定義毎生存区間検出処理のステップC4)。
6)生存区間生成部15は、中間言語ステップs8とs10は異なる単純ブロックに属していることを判定し、変数yを、基本ブロック内生存変数集合保持部13の保持集合のうち、基本ブロックB1に対応するものに格納する(定義毎生存区間検出処理のステップC5)。
【0086】
以上により、変数yの生存区間が求められ、生存区間生成部15は、変数yを基本ブロック内生存変数集合保持部13に格納した。
次に変数aについて説明する。
1)先ずマーク済みでない中間言語ステップs10が、生存区間生成部15によって選択される。生存区間生成部15は、中間言語ステップs10をマークし、定義毎生存区間検出処理へ移る(生存区間生成処理ステップB1〜B5)。
【0087】
2)生存区間生成部15は、全ての基本ブロックを未探索にする(生存区間生成処理ステップB4)。
3)次に生存区間生成部15は、変数aがLiveOut[B1]に含まれており、中間言語ステップs11には変数aの定義がないことを判定して、変数aを基本ブロック間生存変数集合保持部14に格納し、定義毎生存区間検出処理ステップC9へ移る(定義毎生存区間検出処理ステップC2、C18、C8)。
【0088】
4)生存区間生成部15は、中間言語ステップs11を変数aの生存区間にする(定義毎生存区間検出処理ステップC9)。
5)生存区間生成部15は、基本ブロックB2が探索済みであり、変数aがLiveIn[B2]に属していることを判定し、基本ブロックB2と中間言語ステップs10に関して後続ブロック生存区間検出処理を行う(定義毎生存区間探索処理ステップC10)。
【0089】
6)生存区間生成部15は、基本ブロックB2を探索済みにする(後続ブロック生存区間検出処理ステップD1)。
7)生存区間生成部15は、変数aがLiveOut[B2]に属することを判定し、また、変数aが、Def[B2]には属さないことを判定して、後続ブロック生存区間検出処理のステップD3の処理を行う(後続ブロック生存区間検出処理ステップD2、D8)。
【0090】
8)生存区間生成部15は、中間言語ステップs13,s12,s14,s15 を、変数aの生存区間にする(後続ブロック生存区間検出処理ステップD3)。
9)基本ブロックB2の後続基本ブロックB3が探索済みでなく、かつ、LiveIn[B3]に変数aが属していることを判定し、基本ブロックB3と定義s10に関して、後続ブロック生存区間検出処理を行なう(後続ブロック生存区間検出処理ステップD4)。
【0091】
10)生存区間生成部15は、基本ブロックB3を探索済みにする(後続ブロック生存区間検出処理ステップD1)。
11)生存区間生成部15は、変数aがLiveOut[B3]に属さないことを判定し、後続ブロック生存区間検出処理のステップD5を行う(後続ブロック生存区間検出処理ステップD2)。
【0092】
12)生存区間生成部15は、基本ブロックB3の出口から入口に向かって探索を行い、変数aの参照s16を見つけ出す(後続ブロック生存区間検出処理ステップD5)。
13)参照s16を変数aの生存区間にする(後続ブロック生存区間検出処理ステップD6)。
【0093】
14)後続ブロック生存区間検出処理を終了し、先の9)の状態に戻る(後続ブロック生存区間検出処理ステップD7)。
15)基本ブロックB2に関して後続ブロック生存区間検出処理を終了し、先の5)の状態に戻る(後続ブロック生存区間検出処理ステップD7)。
16)生存区間生成部15は、中間言語ステップs10の定義−参照情報を参照し、本情報内に存在する変数aの参照s12を取り出す。更に参照s12の参照−定義情報を参照し、参照s12に到達する変数aの定義s10を取り出す。但し参照s10はマーク済みなので、生存区間生成部15は、後続ブロック生存区間検出処理ステップC10、C11を行なわない。
【0094】
17)定義毎生存区間検出処理を終了して、1)の状態へ戻る。以上により、変数aの生存区間が求められ、変数aを基本ブロック間生存変数集合保持部14に格納する。
次に変数bについて説明する。
1)生存区間生成部15は、マーク済みでない中間言語ステップs11を選択し、中間言語ステップs11をマークして、生存区間生成処理を行う(生存区間生成処理ステップB1〜B5)。
【0095】
2)生存区間生成部15は、全ての基本ブロックを未探索にする(生存区間生成処理ステップB4)。
3)生存区間生成部15は、変数bがLiveOut[B1]に含まれており、定義s11自体がB1の最後の中間言語ステップであることを判定して、変数bを基本ブロック間生存変数集合保持部14へ格納する。格納後、定義毎生存区間検出処理ステップC6を行う(定義毎生存区間検出処理ステップC2、C18、C8)。
【0096】
4)生存区間生成部15は、中間言語ステップs11が、基本ブロックB1の最後の中間言語ステップであることを判定し、変数bの生存区間になにも格納しない(定義毎生存区間検出処理ステップC9)。
5)生存区間生成部15は、変数bがLiveIn[B2]に属していることを判定し、基本ブロックB2と中間言語ステップs11に関して後続ブロック生存区間検出処理を行う(定義毎生存区間検出処理ステップC7)。
【0097】
6)生存区間生成部15は、基本ブロックB2を探索済みとする(後続ブロック生存区間検出処理ステップD1)。
7)生存区間生成部15は、変数bがDef[B2]に属することを判定し、後続ブロック生存区間検出処理のステップD5を行う(後続ブロック生存区間検出処理ステップD2)。
【0098】
8)生存区間生成部15は、中間言語ステップs11の定義−参照情報を参照し、基本ブロックB2の出口から入口に向けて探索を行い、最初に見つかる変数bの参照s13を見つ出す(後続ブロック生存区間検出処理ステップD5)。
9)生存区間生成部15は、中間言語ステップs13を変数bの生存区間にする(後続ブロック生存区間検出処理ステップD6)。
【0099】
10)後続ブロック生存区間検出処理を終了し、先の5)の状態に戻る。11)変数bの参照s13について、生存区間生成部15は、ステップC11〜C16を行なう(定義毎生存区間検出処理ステップC11)。
12)生存区間生成部15は、参照s13の参照−定義情報に存在する変数bの定義のうち、マーク済みでない定義s13を見つ出す(定義毎生存区間検出処理ステップC12)。
【0100】
13)生存区間生成部15は、参照s13をマークし、定義毎生存区間検出処理へ移る(定義毎生存区間検出処理ステップC13、C14)。
15)生存区間生成部15は、変数bがLiveOut[B2]に含まれており、基本ブロックB2の最後までに変数bの定義がないことを判定し、定義毎生存区間検出処理ステップC9へ移る(定義毎生存区間検出処理ステップC2、C18、C8)。
【0101】
16)生存区間生成部15は、中間言語ステップs12,s14,s15を変数bの生存区間にする(定義毎生存区間検出処理ステップC9)。
17)生存区間生成部15は、変数bがLiveIn[B3]に属していることを判定し、基本ブロックB3が未探索であり、基本ブロックB3と中間言語ステップs13に関して後続ブロック生存区間検出処理を行う(定義毎生存区間検出処理ステップC10)。
【0102】
18)生存区間生成部15は、基本ブロックB3を探索済みとする(後続ブロック生存区間検出処理ステップD1)。
19)生存区間生成部15は、変数bがLiveOut[B3]に属さないことを判定し、後続ブロック生存区間検出処理ステップD5へ移る(後続ブロック生存区間検出処理ステップD2)。
【0103】
20)生存区間生成部15は、基本ブロックB3の出口から入口に向かって探索を行い、定義s13の定義−参照情報に存在する変数bの参照s17を見つける(後続ブロック生存区間検出処理ステップD5)。
21)生存区間生成部15は、中間言語ステップs16,s17を変数bの生存区間にする(後続ブロック生存区間検出処理ステップD6)。
【0104】
22)後続ブロック生存区間検出処理を終了し、先の17)の状態に戻る(後続ブロック生存区間検出処理ステップD7)。
23)生存区間生成部15は、定義s13の定義−参照情報に存在する参照s13,s14,s17を取り出す。参照s14,s17の参照−定義情報に存在する変数bの定義s13だけであり、この定義s13はマーク済みである。また参照s13の参照−定義情報に存在する変数bの定義s11,s13はともにマーク済みであるので、定義毎生存区間検出処理を終了し、先の13)の状態に戻る(定義毎生存区間検出処理ステップC11〜C16)。
【0105】
24)生存区間生成部15は、更に参照s13の参照−定義情報に存在するが、定義s11はマーク済みであるので、生存区間生成部15は定義毎生存区間検出処理を終了し、先の1)の状態に戻る。以上により、変数bの生存区間が求められ、変数bを基本ブロック間生存変数集合保持部14に格納する。
同様にして他の変数についても、生存区間生成部15の生存区間検出処理を行うと図21のようになる。
【0106】
次に、図9の生存区間重複検査処理によって変数の重複が検査される過程を示す。
まず、生存区間重複検査部16は、単純ブロック内にのみ生存区間が存在する変数について重複検査を行う。例えば、同じ単純ブロックPB8のみに存在する変数t3と、変数y4との生存区間の重複検査を行い、変数t3と変数y4とは、生存区間が重ならないと検査結果を下す(生存区間重複検査処理ステップE2)。
【0107】
次に生存区間重複検査部16は、単純ブロック内にのみ生存区間が存在する変数と、基本ブロック内にのみ生存区間が存在する変数との生存区間の重複検査を行う。例えば、基本ブロックB1内にのみ生存区間が存在する変数yと、単純ブロックPB9, PB10内にのみ生存区間が存在する変数との重複検査を行い、変数t5, z4は、生存区間が重なると検出結果を下す(生存区間重複検査処理ステップE3〜E5)。
【0108】
次に生存区間重複検査部16は、単純ブロック内にのみ生存区間が存在する変数と、基本ブロック間にまたがって生存区間が存在する変数との重複検査を行う。例えば、基本ブロックB2に生存区間が存在する変数aと、単純ブロックPB15内にのみ生存区間が存在する変数cとの重複検査を行い、重複するという検査結果を下す(生存区間重複検査処理ステップE6、E7)。
【0109】
次に生存区間重複検査部16は、基本ブロック内にのみ生存区間が存在する変数間の重複検査を行う。例えば、生存区間重複検査部16は、基本ブロックB1内のみに生存区間が存在する変数x,yについて重複検査を行い、変数x,yは、生存区間が重複することを検出する(生存区間重複検査処理ステップE9)。
次に、生存区間重複検査部16は、基本ブロック内にのみ生存区間が存在する変数と、基本ブロック間にまたがって生存区間が存在する変数との重複検査を行う。例えば、生存区間重複検査部16は、基本ブロックB1に生存区間が存在する変数aと、B1内にのみ生存区間が存在する変数x, yとの重複検査を行い、変数x,yは、とは生存区間が重なることが検出され、yとは生存区間が重ならないことが検出される(生存区間重複検査処理ステップE10、E11)。
【0110】
次に、生存区間重複検査処理ステップE12により、生存区間重複検査部16は、基本ブロック間にまたがって生存区間が存在する変数間での生存区間の重複検査を行う。例えば、生存区間重複検査部16は、変数aと、変数bとの重複検査を行い、生存区間が重なると検査結果を下す。
【0111】
【発明の効果】
以上説明してきたように請求項1の発明に係るコンパイル装置によれば、基本ブロック内のみに生存区間が収まる変数のうち、異なる基本ブロック内に属するもの同士の重複判定処理が結果として省かれるので、生存区間の重複判定処理が無駄の無いものとなり、コンパイル時間を短縮することができる。
【0112】
また、請求項2に係るコンパイル装置によれば、プログラム中の大多数の変数が単純ブロック内に納められる。生存区間の重複判定処理は、同一の単純ブロックに納められたもの同士で行われるため、生存区間の重複判定処理が極めて無駄の無いものとなり、重複判定に要する処理時間を大きく短縮できる。具体的には、n個の変数について、nC2回行われた生存区間の重複判定処理の処理時間は、この簡略化によって、約1/10となる。
【0113】
また、請求項3に係るコンパイル装置によれば、生存区間が単純ブロック内に属するか属しないかで、生存区間の重複判定処理を個別化するので、冗長部な重複判定処理が徹底して省かれる。また、請求項4に係るコンパイル装置によれば、基本ブロック中の各定義命令について統合可能か否かを判定するので、元のプログラムのデータ依存関係を損なわずにプログラム中に単純ブロックを形成できる。
【0114】
また、請求項5に係るコンパイル装置によれば、基本ブロック内のみに生存区間が存在する変数の生存区間を、単純なアルゴリズムによって検出することができる。単純ブロック形成のために処理量が増加し、コンパイル処理の高速性の低下を招くことは無い。また、請求項6に係るコンパイル装置によれば、基本ブロック内のみに生存区間が存在する変数の生存区間を、単純なアルゴリズムによって表現することができる。
【0115】
また、請求項7に係るコンパイル装置によれば、基本ブロック間に生存区間が存在する変数の生存区間を、単純なアルゴリズムによって表現することができる。また、請求項8に係るコンパイル装置によれば、分岐処理内で値が設定される変数の生存区間を、単純なアルゴリズムによって表現することができる。また、請求項9に係るコンパイル装置によれば、分岐処理内で値が使用される変数の生存区間を、単純なアルゴリズムによって表現することができる。
【図面の簡単な説明】
【図1】本発明に係るコンパイル装置の構成を示す図である。
【図2】最適化装置2の構成を示す図である。
【図3】単純ブロック生成処理のフローチャートである。
【図4】単純ブロック生成の過程を示した図である。
【図5】資源割付装置3の構成を示す図である。
【図6】生存区間重複判定部9の構成を示す図である。
【図7】生存区間生成処理のフローチャートである。
【図8】定義毎生存区間検出処理のフローチャートである。
【図9】後続ブロック検索処理のフローチャートである。
【図10】後続ブロック生存区間検出処理のフローチャートである。
【図11】生存区間重複検査処理のフローチャートである。
【図12】生存区間重複検査処理の処理過程を示す図である。
【図13】基本ブロックを説明するための説明図である。
【図14】ソースプログラムの一例である。
【図15】中間言語プログラムの一例である。
【図16】基本ブロック化された中間言語プログラムの一例である。
【図17】データフロー情報、定義−参照情報、参照−定義情報の一例である。
【図18】中間言語プログラム中の、各変数の生存区間を図示したものである。
【図19】単純ブロック生成の過程を示した図である。
【図20】単純ブロック生成後の、各変数の生存区間を図示したものある。
【図21】生存区間保持部11、単純ブロック内生存変数集合保持部12、基本ブロック内生存変数保持部13、基本ブロック間生存変数集合保持部14の保持内容の一例を図示したものである。
【図22】生存区間重複検査の検査結果を示したものである。
【図23】生存区間、および、生存区間の重複検査の検査結果を示す図である。
【産業上の利用分野】
本発明は高級プログラミング言語で書かれたソースプログラムを機械語プログラムにコンパイルするコンパイル装置に関する。
【0002】
【従来の技術】
近年、C言語などの高級プログラミング言語でプログラムを記述し、プログラムの開発効率を高めることが盛んに行なわれている。
高級プログラミング言語を用いれば、プログラマは、プログラム中の数値の保持、演算、転送等の処理を、変数を被演算子とした演算(ステップ)で表現できる。この変数はプログラマによって任意に定義され、また必要な個数だけ用いられるため、プログラマは自由にプログラムを記述できる。また記述されたプログラム(ソースプログラムと称す。)は、コンパイルされることにより、コンピュータが理解可能な機械語プログラムとなる。当該機械語プログラム中の演算は、機械語命令によって表現され、また当該機械語命令は、レジスタあるいはメモリを被演算子とするので、上記変数には、レジスタあるいはメモリを割り付ける必要がある。この割り付け処理は資源割付処理と称される。この資源割付処理が最適であれば、上記機械語命令のコードサイズは最小、実行時間は最短となる。
【0003】
一方、レジスタとメモリとを比較すれば、レジスタを被演算子とする方が機械語命令の小サイズ化、実行時間の最短化が図れる。
但しレジスタは、使用できる個数が少数であるため、上記資源割付を行う前に同一レジスタを割り付け得る変数はどれとどれであるかを生存区間に基づき検査し、当該検査の検査結果によって、資源割付を行うことが一般的である。生存区間とは、それぞれの変数に格納されている値が有効となる区間のことであり、プログラムと、当該プログラムにおいて使用されている変数の生存区間を図23(a)に示す。
【0004】
本図において、変数x4と、変数t3は、生存区間が重なっていることから、同一レジスタを割り付け得ないことがわかる。変数t1と、変数t3は、この生存区間が重なっていないことから、同一レジスタを割り付け得ることがわかる。
次に、プログラム中の各変数の生存区間を、中間言語ステップの集合で表現する。中間言語ステップは、図23(a)の一例では、s1,s2,s3,s4,s5・・・・で表される。また中間言語ステップ集合での生存区間の表現を図23(b)の一例に示す。図23(b)の一例では、変数t1の生存区間は、中間言語ステップs2のみであり、変数xの生存区間は、中間言語ステップs8,s9,s10,s11であることが示される。
【0005】
次に、プログラム中の任意の2変数について、中間言語ステップ集合の集合積をとる。この集合積が空であれば、その2変数の生存区間は重ならないと判定でき、空でなければ重なると判定できる。図23(b)の一例では、変数xと変数x4とは、生存区間の集合に共通要素がないため上記集合積が空となり、非重複が判定される。また、変数x4と変数t3とは、生存区間の集合に共通要素s4が存在するため、上記集合積の結果が空でなくなる。そのため、変数x4と変数t3とは生存区間の重複が判定される。
【0006】
このように、集合積の算出を繰り返し、各変数の生存区間の重複、非重複を、図23(c)に示すように判定する。本図において、変数t1は、変数p1,p2,p3と生存区間が重なることが示される。また変数x4も、変数p1,p2,p3と生存区間が重なることが示される。
以上に述べた重複調査を行うと、レジスタに割り付ける変数の数を、より多くすることができる。
【0007】
【発明が解決しようとする課題】
しかしながら上記従来技術によれば、生存区間の重複検査に要する処理時間が多大なものとなるという問題点があった。上述のように、変数はプログラマの都合によって作成される。そのため、複数人のプログラマによって作成されるソフトウェア中の変数の総数は、百個前後になることが一般的である。これに加えて、中間言語プログラムの生成時には、変数が、コンパイル装置によって自動的に生成されるので、結果として重複検査の対象となる変数の総数は、数百個単位になる。
【0008】
変数の生存区間の重複検査は、集合積の算出によって求められるが、この集合積の、n個の変数についての計算回数は、nC2=n(n−1)/2回であり、個数nが数百個である場合、集合積の計算回数が非常に大きな数となる。例えば変数の個数nが100個だとすると、nC2=4950となり、コンパイル装置は、上記集合積の計算を4950回行うことになる。個数nが300個だとすると、nC2=44850となり、コンパイル装置は、集合積の計算を44850回行うことになる。
【0009】
本発明は、上記問題点に鑑み、生存区間の重複検査に要する処理時間を大きく低減できるコンパイル装置を提供することを目的とする。
【0010】
【課題を解決するための手段】
上記目的を達成するために請求項1のコンパイル装置は、複数の命令からなるプログラムを、機械語プログラムに翻訳するコンパイル装置であって、
前記プログラム中の飛び越し命令と、当該飛び越し命令の飛び越し先の命令とを検出する飛び越し検出手段と、
飛び越し検出手段が検出した命令に基づいて、前記プログラムを基本ブロックに分割する分割手段と、
プログラム中の各変数について、変数の設定値が有効となるプログラム中の区間である生存区間を検出し、検出結果を、生存区間内に含まれる命令の位置を示す位置情報の集合で表す生存区間検出手段と、
生存区間検出手段が検出した生存区間が1つの基本ブロック内に収まる変数を全て検出し、検出結果を、当該基本ブロックに対応づけた基本ブロック内生存変数集合で表す基本ブロック内生存変数検出手段と、
生存区間検出手段が検出した生存区間が、複数の基本ブロック間におよぶ変数を全て検出し、検出結果を、基本ブロック間生存変数集合で表す基本ブロック間生存変数検出手段と、
基本ブロック間生存変数集合から変数を2つずつ取り出し、当該2変数の生存区間に対応する命令位置情報集合の集合積を算出することで、生存区間の重複を判定する第1の生存区間重複判定手段と、
同一の基本ブロックに対応づけられた基本ブロック内生存変数集合から変数を2つずつ取り出し、当該2変数の生存区間に対応する命令位置情報集合の集合積を算出することで、生存区間の重複を判定する第2の生存区間重複判定手段と、
前記基本ブロックに対応づけられた基本ブロック内生存変数集合と、基本ブロック間生存変数とから変数を1つずつ取り出し、当該2変数の生存区間に対応する命令位置情報集合の集合積を算出することで、生存区間の重複を判定する第3の生存区間重複判定手段と、
前記第1、第2、第3の生存区間重複判定手段の判定結果を用いて資源割付を行うことを特徴としている。
【0011】
請求項2のコンパイル装置は更に、
変数の値を設定する命令である定義命令と、当該定義命令で設定された変数の値を使用する命令である参照命令とが、少なくとも一組順に並ぶ命令列である単純ブロックを、基本ブロック内に形成する単純ブロック形成手段と、
前記基本ブロック内生存変数集合から、生存区間が一つの単純ブロック内に収まる変数を全て検出し、検出結果を、当該単純ブロックに対応づけた単純ブロック内生存変数集合で表す単純ブロック内生存変数検出手段と、
前記基本ブロック内生存変数集合から生存区間が複数の単純ブロック間におよぶ変数を検出し、検出結果を、単純ブロック間生存変数集合で表す単純ブロック間生存変数検出手段と、
を備え、
前記第2の生存区間重複判定手段は、前記単純ブロック間生存変数集合から変数を2つずつ取り出し、当該2変数の生存区間に対応する命令位置情報集合の集合積を算出することで、生存区間の重複を判定する第1の生存区間重複判定部と、
同一の単純ブロックに対応づけられた単純ブロック内変数集合から変数を2つずつ取り出し、当該2変数の生存区間に対応する命令位置情報集合の集合積を算出することで、生存区間の重複を判定する第2の生存区間重複判定部と、
前記単純ブロックに対応づけられた単純ブロック内変数集合と、単純ブロック間生存変数集合とから変数を1つずつ取り出し、当該2変数の生存区間に対応する命令位置情報集合の集合積を算出することで、生存区間の重複を判定する第3の生存区間重複判定部と、
を備えることを特徴としている。
【0012】
請求項3のコンパイル装置は、
前記第3の生存区間重複判定手段は、
基本ブロック間生存変数集合と、前記単純ブロックに対応づけられた単純ブロック内生存変数集合とから変数を1つずつ取り出し、当該2変数の生存区間に対応する命令位置集合の集合積を算出することで、生存区間の重複を判定する第4の生存区間重複判定部と、
基本ブロック間生存変数集合と、単純ブロック間生存変数集合とから変数を1つずつ取り出し、当該2変数の生存区間に対応する命令位置集合の集合積を算出することで、生存区間の重複を判定する第5の生存区間重複判定部と、
を備えることを特徴としている。
【0013】
請求項4のコンパイル装置は、
前記単純ブロック形成手段として、
基本ブロックから、定義命令を1つずつ取り出す定義命令取り出し手段と、
定義命令取り出し手段が取り出した定義命令が含まれる基本ブロックから、その定義命令に対応する参照命令を検出する対応参照命令検出手段と、
対応参照命令検出手段が検出した参照命令の位置に、当該参照命令に対応する定義命令が移動可能か否かを判定する定義命令移動可否判定手段と、
定義命令移動可否判定手段が可能と判定した場合、定義命令移動可否判定手段が可能と判定した定義命令を、当該定義命令に対応する参照命令の直前に移動し、当該定義命令及び参照命令を一つの単純ブロックに統合する定義命令移動手段と、
定義命令移動手段が移動した定義命令が、移動前において、単純ブロック内の最後の命令である場合、移動前の単純ブロックの残りの命令の全てを当該定義命令の移動先の直前に移動し、移動した残命令を、移動先の単純ブロックに統合する単純ブロック残命令移動手段と、
を備えることを特徴としている。
【0014】
請求項5のコンパイル装置は、
前記定義命令移動可否判定手段として、
前記定義命令取り出し手段が取り出した定義命令によって値が設定される変数が一つであるか否かを判定する変数単複判定部と、
前記変数単複判定部が一つであると判定した場合、前記対応参照命令検出手段が検出した参照命令が一つか否かを判定する参照命令単複判定部と、
前記参照命令単複判定部が一つであると判定した場合、当該参照命令に対応する定義命令で値が設定される変数が、当該定義命令から当該参照命令までの区間において再設定されるか否かを判定する第1の再設定有無判定部と、
前記第1の再設定有無判定部が再設定がないと判定した場合、当該定義命令において使用される変数を検出する定義命令内使用変数検出部と、
前記定義命令内使用変数検出部が検出した変数が、当該定義命令から当該参照命令までの間に、再設定されないことを判定する第2の再設定有無判定部と、
前記第2の再設定有無判定部が再設定が無いと判定した場合、当該定義命令が、当該参照命令の位置に移動可能と判定する移動可否判定部と、
からなることを特徴としている。
【0015】
請求項6のコンパイル装置は更に、
前記プログラム中の各基本ブロックと、当該基本ブロックの入口において有効となる変数及び出口において有効となる変数とを対応させて記憶する有効変数情報記憶手段を備え、
前記生存区間検出手段は、前記プログラムから定義命令を1つずつ取り出す定義命令取り出し部と、
前記定義命令取り出し部によって取り出された定義命令を含む基本ブロックと、当該定義命令によって設定される変数とを検出し、検出した変数の設定値が当該基本ブロックの出口で無効か否かを、前記有効変数情報記憶手段の記憶内容に基づき判定する出口無効判定部と、
前記出口無効判定部が設定値無効と判定した場合、当該基本ブロックから、当該定義命令に対応する参照命令であって、当該基本ブロックの出口に最も近いものを検出する出口最近参照命令検出部と、
当該定義命令の次の命令から出口最近参照命令検出部が検出した参照命令までの命令位置情報を全て検出する基本ブロック内命令位置検出部と、
命令位置情報が検出された変数についての生存区間を、基本ブロック内命令位置検出部が検出した命令位置情報の集合で表す基本ブロック内生存区間表現部と、
を備え、
前記基本ブロック内生存変数検出手段は、前記基本ブロック内生存区間表現部が生存区間を表現した変数を、当該変数が含まれる基本ブロックに対応する基本ブロック内生存変数集合のメンバーにする
ことを特徴としている。
【0016】
請求項7のコンパイル装置は更に、
基本ブロックと、当該基本ブロックにおいて設定される変数とを対応させて記憶する基本ブロック内定義情報記憶手段を備え、
前記生存区間検出手段は、
前記出口無効判定部が有効と判定した場合、前記基本ブロック内定義情報記憶手段の記憶内容に基づいて、前記出口無効判定部によって有効と判定された定義命令において設定される変数が、当該定義命令から当該定義命令を含む基本ブロックの出口までの間に再設定されるか否かを判定する再設定有無判定部と、
前記再設定値有無判定部が再設定無しと判定した場合、当該定義命令の次の命令から当該基本ブロックの出口までの命令位置情報を検出する出口有効時位置情報検出部と、
前記再設定有無判定部が再設定無しと判定した場合、前記有効変数情報記憶手段および基本ブロック内定義情報記憶手段の記憶内容に基づいて、当該定義命令が含まれる基本ブロックの次順の基本ブロックのうち、当該変数がその入口及び出口で有効であり、かつその内部で、当該変数が再設定されないものを全て検出する生存基本ブロック検出部と、
前記基本ブロック内定義情報記憶手段の記憶内容に基づいて、前記生存基本ブロック検出部が検出した基本ブロック内に含まれる命令位置情報を全て検出する基本ブロック間位置情報検出部と、
前記再設定有無判定部が再設定無しと判定した場合、当該定義命令が含まれる基本ブロックの次順の基本ブロックのうち、その入口で当該変数の値が有効であり、その出口で無効である基本ブロックを検出する末尾基本ブロック検出部と、
前記末尾基本ブロック検出部が検出した基本ブロックから、当該定義命令に対応する最後の参照命令を検出する末尾参照命令検出部と、
前記末尾基本ブロック検出部が検出した基本ブロックの入口から前記末尾参照命令検出部が検出した参照命令までの命令位置情報を全て検出する入口有効時位置情報検出部と、
前記再設定有無判定部が再設定無しと判定した変数に対応する生存区間の集合を、出口有効時位置情報検出手段の検出結果と、入口有効時位置情報検出手段の検出結果と、基本ブロック間位置情報検出手段の検出結果とをあわせた集合で表す基本ブロック間生存区間表現部と、
を備え、
前記基本ブロック間生存変数検出手段は、前記再設定有無判定部が再設定無しと判定した変数を、基本ブロック間生存変数集合のメンバーにする
ことを特徴としている。
【0017】
請求項8のコンパイル装置は、
プログラム中の各命令位置と、当該命令位置の命令において使用される変数と、当該変数が設定される命令の命令位置情報とを対応させて記憶する参照−定義情報記憶手段を備え、
前記生存区間検出手段は、
前記定義命令取り出し部が取り出した定義命令の位置に識別情報を付するマーキング部と、
前記定義命令取り出し部が取り出した定義命令に対応する参照命令で使用される変数を検出する参照変数検出部と、
参照−定義情報記憶手段の記憶内容に基づいて、前記参照変数検出部が検出した変数に設定値を設定する定義命令を全て検出する定義命令検出部と、
前記定義命令検出部が検出した定義命令のうち、前記マーキング部によって付された識別情報が無いものを検出する無マーク定義命令検出部と、
前記無マーク定義命令検出部が検出した定義命令の次の命令から、その定義命令を含む基本ブロックの出口までの命令位置情報を全て検出する第1の分岐ブロック内位置情報検出部と、
前記基本ブロック間生存区間表現部が表した命令位置情報の集合に、前記第1の分岐ブロック内位置情報検出部が検出した命令位置情報を付加する第1の命令位置情報付加部と、
を備えることを特徴としている。
【0018】
請求項9のコンパイル装置は、
プログラム中の各命令位置と、当該命令位置の命令において設定される変数と、当該変数が使用される命令の命令位置情報とを対応させて記憶する定義−参照情報記憶手段を備え、
前記生存区間検出手段は、
前記定義−参照情報記憶手段の記憶内容に基づいて、前記無マーク定義命令検出部が検出した定義命令に対応する参照命令を検出する分岐ブロック内参照命令検出部と、
前記分岐ブロック内参照命令検出部が検出した参照命令を含む基本ブロックを検出する分岐ブロック検出部と、
前記分岐ブロック検出部が検出した基本ブロックの入口から、前記分岐ブロック内参照命令検出部が検出した参照命令までの命令位置情報を全て検出する第2の分岐ブロック内位置情報検出部と、
前記基本ブロック間生存区間表現部が表した命令位置情報の集合に、前記第2の分岐ブロック内位置情報検出部が検出した命令位置情報を付加する第2の命令位置情報付加部と、
を備えることを特徴としている。
【0019】
【作用】
請求項1のコンパイル装置によれば、飛び越し検出手段によって前記プログラム中の飛び越し命令と、当該飛び越し命令の飛び越し先の命令とが検出される。飛び越し検出手段が検出を行うと、飛び越し検出手段が検出した命令に基づいて、前記プログラムが、分割手段によって、基本ブロックに分割される。分割後、プログラム中の各変数について、変数の設定値が有効となるプログラム中の区間である生存区間が生存区間検出手段によって検出され、検出結果が、生存区間内に含まれる命令の位置を示す命令位置情報の集合で表される。検出後、生存区間検出手段によって検出された生存区間が1つの基本ブロック内に収まる変数が基本ブロック内生存変数検出手段によって全て検出され、検出結果が、当該基本ブロックに対応づけられた基本ブロック内生存変数集合で表される。また前記生存区間が複数の基本ブロック間におよぶ変数が基本ブロック間生存変数検出手段によって全て検出され、検出結果が、基本ブロック間生存変数集合で表される。
【0020】
検出後、基本ブロック間生存変数集合から、変数が第1の生存区間重複判定手段によって2つずつ取り出され、当該2変数の生存区間に対応する命令位置情報集合の集合積が算出されて、生存区間の重複が判定される。また同一の基本ブロックに対応づけられた基本ブロック内生存変数集合と、第2の生存区間重複判定手段によって、変数が2つずつ取り出され、当該2変数の生存区間に対応する命令位置情報集合の集合積が算出されることで、生存区間の重複が判定される。更に、前記基本ブロックに対応づけられた基本ブロック内生存変数集合から、基本ブロック間生存変数とから変数が第3の生存区間重複判定手段によって1つずつ取り出され、当該2変数の生存区間に対応する命令位置情報集合の集合積が算出されることで、生存区間の重複が判定される。プログラム中の変数の生存区間の重複判定は以上の判定処理によって全て完了する。以上の判定処理では、基本ブロック内のみに生存区間が収まる変数のうち、異なる基本ブロック内に属するもの同士の重複判定処理が結果として省かれる。このような判定処理の後、第1、第2、第3の生存区間重複判定手段の判定結果を用いて資源割付が行われる。
【0021】
また、請求項2において、
変数の値を設定する命令である定義命令と当該定義命令で設定された変数の値を使用する命令である参照命令とが少なくとも一組順に並ぶ命令列である単純ブロックが単純ブロック形成手段によって基本ブロック内に形成される。単純ブロックは、定義命令と参照命令とが順に並ぶ命令列であるため、当該定義命令で定義される変数の生存区間は最短になる。プログラマが作成したソ−スプログラムおよび中間言語プログラムには、設定および使用が一回限りの変数が大多数を占めるので、プログラム中の大多数の変数が、上記単純ブロック内に納められる。
【0022】
単純ブロック形成後、前記基本ブロック内生存変数集合から生存区間が一つの単純ブロック内に収まる変数が単純ブロック内生存変数検出手段によって全て検出され、検出結果は当該単純ブロックに対応づけた単純ブロック内生存変数集合で表される。また前記基本ブロック内生存変数集合から生存区間が複数の単純ブロック間におよぶ変数が単純ブロック間生存変数検出手段によって全て検出され、検出結果が単純ブロック間生存変数集合で表される。
【0023】
単純ブロック内生存変数集合、単純ブロック間生存変数集合生成後、変数が、前記単純ブロック間生存変数集合から第1の生存区間重複判定部によって、2つずつ取り出され、当該2変数の生存区間に対応する命令位置情報集合の集合積が算出されることで、生存区間の重複が判定される。また、同一の単純ブロックに対応づけられた単純ブロック内変数集合から、第2の生存区間重複判定部によって、変数が2つずつ取り出され、当該2変数の生存区間に対応する命令位置情報集合の集合積が算出されることで、生存区間の重複を判定される。上記のように、単純ブロックにおいては、変数の生存区間は最短となり、上記集合積の算出は簡略なものとなる。更に前記単純ブロックに対応づけられた単純ブロック内変数集合と、単純ブロック間生存変数集合とから、第3の生存区間重複判定部によって、変数が1つずつ取り出され、当該2変数の生存区間に対応する命令位置情報集合の集合積が算出することで、生存区間の重複が判定される。
【0024】
また請求項3において、
基本ブロック間生存変数集合と前記単純ブロックに対応づけられた単純ブロック内生存変数集合とから第4の生存区間重複判定部によって変数が1つずつ取り出され、当該2変数の生存区間に対応する命令位置集合の集合積が算出されることで、生存区間の重複が判定される。また、基本ブロック間生存変数集合と単純ブロック間生存変数集合とから、第5の生存区間重複判定部によって変数が1つずつ取り出され、当該2変数の生存区間に対応する命令位置集合の集合積を算出することで、生存区間の重複が判定される。
【0025】
また請求項4において、
前記単純ブロック形成手段は、
定義命令取り出し手段によって、基本ブロックから、定義命令が1つずつ取り出される。定義命令取り出し手段によって取り出された定義命令が含まれる基本ブロックから、対応参照命令検出手段によって定義命令取り出し手段が取り出した定義命令に対応する参照命令が検出される。検出後、対応参照命令検出手段が検出を行った定義命令が、対応参照命令検出手段が検出した参照命令の位置に移動可能か否かが定義命令移動可否判定手段によって判定される。この判定において定義命令移動可否判定手段が可能と判定した場合、定義命令移動可否判定手段が可能と判定した定義命令が定義命令移動手段によって当該定義命令に対応する参照命令の直前に移動され、当該定義命令及び参照命令が一つの単純ブロックに統合される。定義命令移動手段が移動した定義命令が移動前において単純ブロック内の最後の命令である場合、単純ブロック残命令移動手段によって移動前の単純ブロックの残りの命令の全てが当該定義命令の移動先の直前に移動され、移動した残命令が、移動先の単純ブロックに統合される。
【0026】
また請求項5において、
前記定義命令取り出し手段が取り出した定義命令によって値が設定される変数が一つであるか否かが変数単複判定部によって判定される。前記変数単複判定部が一つであると判定した場合、前記対応参照命令検出手段が検出した参照命令が一つか否かが参照命令単複判定部によって判定される。前記参照命令単複判定部が一つであると判定した場合、当該参照命令に対応する定義命令で値が設定される変数が、当該定義命令から当該参照命令までの区間において再設定されるか否かが、第1の再設定有無判定部によって判定される。前記第1の再設定有無判定部が再設定がないと判定すると当該定義命令において使用される変数が定義命令内使用変数検出部によって検出される。当該定義命令から当該参照命令までの間において、前記定義命令内使用変数検出部が検出した変数が再設定されないことが第2の再設定有無判定部によって判定される。前記第2の再設定有無判定部が再設定が無いと判定すると、当該定義命令が、当該参照命令の位置に移動可能であることが移動可否判定部によって判定される。 また、請求項6において、
前記定義命令取り出し部によって前記プログラムから定義命令が1つずつ取り出される。取り出された定義命令を含む基本ブロックと、当該定義命令によって設定される変数とが出口無効判定部によって検出され、検出された変数の設定値が当該基本ブロックの出口で無効か否かが、前記有効変数情報記憶手段の記憶内容に基づき判定される。前記出口無効判定部が設定値無効と判定した場合、当該基本ブロックから、当該定義命令に対応する参照命令であって、当該基本ブロックの出口に最も近いものが出口最近参照命令検出部によって検出される。参照命令の検出後、当該定義命令の次の命令から出口最近参照命令検出部が検出した参照命令までの命令位置情報が、基本ブロック内命令位置検出部によって全て検出される。命令位置情報の検出後、命令位置情報が検出された変数についての生存区間が、基本ブロック内生存区間表現部によって基本ブロック内命令位置検出部が検出した命令位置情報の集合で表される。一方、前記基本ブロック内生存区間表現部が生存区間を表現した変数が、前記基本ブロック内生存変数検出手段によって、当該変数が含まれる基本ブロックに対応する基本ブロック内生存変数集合のメンバーに加えられる。
【0027】
また、請求項7において、
前記出口無効判定部が有効と判定した場合、前記基本ブロック内定義情報記憶手段の記憶内容に基づいて、前記出口無効判定部によって有効と判定された定義命令において設定される変数が、再設定有無判定部によって当該定義命令から当該定義命令を含む基本ブロックの出口までの間に再設定されるか否かが判定される。前記再設定値有無判定部が再設定無しと判定した場合、出口有効時位置情報検出部によって当該定義命令の次の命令から当該基本ブロックの出口までの命令位置情報が検出される。前記再設定有無判定部が再設定無しと判定することで、前記有効変数情報記憶手段および基本ブロック内定義情報記憶手段の記憶内容に基づいて、当該定義命令が含まれる基本ブロックの次順の基本ブロックのうち、当該変数がその入口及び出口で有効であり、かつその内部で、当該変数が再設定されないものの全てが、生存基本ブロック検出部によって検出される。前記基本ブロック内定義情報記憶手段の記憶内容に基づいて、基本ブロック間位置情報検出部によって、前記生存基本ブロック検出部が検出した基本ブロック内に含まれる命令位置情報が全て検出される。
【0028】
前記再設定有無判定部が再設定無しと判定することで、当該定義命令が含まれる基本ブロックの次順の基本ブロックのうち、その入口で当該変数の値が有効であり、その出口で無効である基本ブロックが末尾基本ブロック検出部によって検出される。基本ブロックの検出後、前記末尾基本ブロック検出部が検出した基本ブロックから、末尾参照命令検出部により該定義命令に対応する参照命令が検出される。参照命令の検出後、前記末尾基本ブロック検出部が検出した基本ブロックの入口から前記末尾参照命令検出部が検出した参照命令までの命令位置情報が、入口有効時位置情報検出部によって全て検出される。命令位置情報の検出後、命令位置情報が検出された変数に対応する生存区間の集合が、基本ブロック間生存区間表現部によって出口有効時位置情報検出手段の検出結果と、入口有効時位置情報検出手段の検出結果と、基本ブロック間位置情報検出手段の検出結果とをあわせた集合で表される。
【0029】
一方、再設定有無判定部が再設定なしと判定した変数は、前記基本ブロック間生存変数検出手段によって基本ブロック間生存変数集合のメンバーに加えられる。
また、請求項8において、
マーキング部によって、前記定義命令取り出し部が取り出した定義命令の位置に識別情報が付される。マーキング部によるマーキング後、当該定義命令に対応する参照命令で使用される変数が、参照変数検出部によって検出される。変数の検出後、参照−定義情報記憶手段の記憶内容に基づいて、前記参照変数検出部が検出した変数に設定値を設定する定義命令が、定義命令検出部によって全て検出される。定義命令の検出後、前記定義命令検出部が検出した定義命令のうち、前記マーキング部によって付された識別情報が無いものが無マーク定義命令検出部によって全て検出される。識別情報無し定義命令の検出後、前記無マーク定義命令検出部が検出した定義命令の次の命令から、その定義命令を含む基本ブロックの出口までの命令位置情報が、第1の分岐ブロック内位置情報検出部によって全て検出される。命令位置情報の検出後、基本ブロック間生存区間表現部が表した命令位置情報の集合に、第1の命令位置情報付加部によって、前記第1の分岐ブロック内位置情報検出部が検出した命令位置情報が付加される。
【0030】
また、請求項9において、
前記定義−参照情報記憶手段の記憶内容に基づいて、分岐ブロック内参照命令検出部によって前記無マーク定義命令検出部が検出した定義命令に対応する参照命令が検出される。参照命令の検出後、前記分岐ブロック内参照命令検出部が検出した参照命令を含む基本ブロックが分岐ブロック検出部によって検出される。参照命令の検出後、前記分岐ブロック検出部が検出した基本ブロックの入口から、前記分岐ブロック内参照命令検出部が検出した参照命令までの命令位置情報が、第2の分岐ブロック内位置情報検出部によって全て検出される。命令位置情報の検出後、前記基本ブロック間生存区間表現部が表した命令位置情報の集合に、前記第2の分岐ブロック内位置情報検出部が検出した命令位置情報が第2の命令位置情報付加部によって付加される。
【0031】
【実施例】
以下、本発明のコンパイル装置の一実施例を図面を用いて説明する。先ず、本明細書においてので引用する用語を、以下に説明しておく。
・基本ブロックプログラム中の連続命令列であって、列の途中に飛び越しもなく、また途中への飛び越しもないものをいう。この基本ブロックの一例を図16に示す。本実施例では処理対象を中間言語プログラムとしているので、上記命令列は、中間言語のものが与えられる。
【0032】
更に、判断処理、あるいは、多方向分岐処理内の基本ブロックを、図13を参照しながら説明する。
図13(a)に示すように、基本ブロックとは列の途中に飛び越しもなく、また途中への飛び越しもないものを指すから、C言語風のif(p)文で表される判断処理において、選択的に実行される処理S1、S2は、それぞれ1つの基本ブロックB1、B2となる。このように処理S1、S2に相当する基本ブロックB1、B2を、分岐基本ブロックと称する。
【0033】
更に図13(b)に示すように、C言語でswitch(p)文で表される多方向分岐処理において、選択的に実行される処理S1、S2、S3、S4・・・・は、それぞれ1つの基本ブロックB1、B2、B3、B4・・・・となる。
また、プログラム中の一つの文あるいは中間コード命令など、中間言語プログラムの1実行単位を中間言語ステップと呼ぶことにする。
・変数の定義、参照
ある変数に値を設定している中間言語ステップをその変数の定義といい、定義された値を使っている中間言語ステップを変数の参照という。逆に変数に値を設定することを、変数を定義するという。更に変数の値を使うことを、変数を参照するという。
・生存変数に関する情報
ソースプログラム、中間言語プログラムを問わず、プログラム中のステップの狭間を点といい、その点において変数に格納されている値が有効であるとき、その点で当該変数は生きているという。更に基本ブロックBの入口の点で生きている変数の集合は、LiveIn[B]と表され、基本ブロックBの出口の点で生きている変数の集合は、LiveOut[B]と表される。また、基本ブロックB内に定義がある変数の集合をDef[B]で表す。尚この変数集合Def[B]は、生存変数に関する情報を求める過程に得られる。図16に示したプログラム例での、集合LiveIn[B]、集合LiveOut[B]を、図17(a)に示す。本図において、基本ブロックB1の入口で生きている変数は「p1,p2,p3」であることが判り、出口で生きている変数は「z1,a,b」であることが示される。
・定義−参照情報、参照−定義情報
定義−参照情報とは、定義によって設定された設定値がどこで使用されているかが示される情報であり、その一例を図17(b)に示す(定義によって設定された設定値を参照によって使用することを、定義が参照に到達するという。)。図17(b)の一例では、中間言語ステップs1で定義されている変数t1は、中間言語ステップs2で参照されることが判る。
【0034】
参照−定義情報とは、参照によって使用された設定値がどこで定義されているかが示される情報であり、その一例を図17(c)に示す。本図において、中間言語ステップs2で参照される変数は、変数t1,p3であり、これらの何れかは、中間言語ステップs1で定義される。
・変数についての注意
変数の中には、その生存区間を複数持つものがある。この場合、生存区間毎に異なるレジスタを割り付けることができ、また、そうした方がオブジェクトプログラムをより良くすることができる。そのため生存区間が複数ある場合は、生存区間毎に1つの変数が存在するものとする。これを図13(c)を参照しながら説明する。図13(c)において、「x=10」で定義される変数xは、「y=x+5」で参照されるから、「x=10」で定義される変数xの生存区間は図中のL5となる。一方「x=20」で定義される変数xは、「y=x+30」で参照されるから、「x=20」で定義される変数xの生存区間は図中のL6となる。
【0035】
一方、図13(d)において、「x=40」で定義される変数xは、参照されないまま、「x=30」で再定義されるので、「x=40」で定義される変数xの生存区間は、存在しないことになる。即ち、「x=40」で定義される変数xは生存しないと判定される。「x=30」で定義される変数xは「y=x+50」で参照されるから、「x=30」で定義される変数xの生存区間は図中のL7となる。
・生存区間についての注意
生存区間は、基本ブロックの集合、中間言語ステップの集合で表される。本実施例では、詳細な情報が必要とされるため、後者のものが採用されている。また、生存区間の重複、非重複を集合積で判定するため、生存区間の終始が一致する中間言語ステップでは、生存区間は重ならないとしている。そのため、変数の生存区間をステップ集合で表す場合、定義のステップは、当該集合に含まない。
【0036】
以上の変数及び生存区間に関する情報、定義-参照情報、参照-定義情報については、以下の文献に詳細が記されている。
A.Aho, R.Sethi, J.Ulman:"Compilers Principles, Techniques, and Tools",Addison Wesley, 1988
以下、本発明の生存区間重複検査装置の一実施例を図面を用いて説明する。図1は、本発明の第1の実施例におけるコンパイラ装置 ( 図中では単にコンパイラと記載している )の構成図である。コンパイル装置は、構文解析装置1と、最適化装置2と、資源割付装置3と、コード生成装置4とで構成されている。
【0037】
構文解析装置1は、ファイルとして記憶されているソースプログラムの字句解析、構文解析、および意味解析を行なう。解析結果は、中間言語プログラムとして出力される。ソースプログラムの一例を図14に示し、当該ソースプログラムに対応する中間言語プログラムの一例を図15に示す。
最適化装置2は最終的に生成される機械語プログラムのプログラムサイズを削減し、実行時間を短縮させる目的で中間言語プログラムの最適化を行なう。
【0038】
資源割付装置3は、プログラムの変数の生存区間を求め、生存区間毎に変数に資源であるレジスタやメモリを割り付ける。
コード生成装置4は、最適化された中間言語プログラムを、資源割付装置3の割り付け結果に従って、ターゲットマシンの機械語命令に変換し、オブジェクトプログラムとして出力する。
【0039】
図2は、図1に示す最適化装置2の構成図である。この最適化装置2の詳細については本発明の主眼でないので説明を省略し、本発明のコンパイル装置と特に関係のある点のみを説明する。最適化装置2は、制御フロー解析部5と、データフロー解析部6と、最適化処理部7と、単純ブロック生成部8とで構成される。制御フロー解析部5およびデータフロー解析部6では、基本ブロック化、制御フロー解析、データフロー解析という作業を行う。基本ブロック化とは、処理対象のプログラムを、以後の処理単位である基本ブロックに分割することである。図15に示した中間言語プログラムについての基本ブロックを図16に示す。また制御フロー解析とは、各基本ブロック間の制御の流れを解析することである。更にデータフロー解析とは各基本ブロックの内部を調べ、それぞれの変数がどこで定義され、どこで参照されているかについて解析することである。これらの処理によって、データ情報、定義-参照情報、及び参照-定義情報が得られる。以上の3情報の一例を図17(a)(b)(c)に図示する。本一例は図16に示した中間言語プログラムについてのものである。図17(a)に示すデータフロ−情報において、基本ブロックB1の入り口では、変数p1,p2,p3が生きていることが示される。また、基本ブロックB1の出口では、変数z,a,bが生きていることが示される。図17(b)において、中間言語ステップs1で定義される変数t1は、中間言語ステップs2で参照されることが示される。図17(c)の参照−定義情報において、中間言語ステップs2で参照される変数t1,p3は、中間言語ステップs1で定義されることが示される。
【0040】
最適化処理部7は、制御フロー解析部5およびデータフロー解析部6の処理結果を使って中間言語プログラムに対する最適化を行う。この部分は本発明の主眼でないのでその詳細は省略する。
単純ブロック生成部8は、基本ブロックを複数個の小ブロックに分割し、分割後、小ブロック同士の統合が可能か否を判定して、当該判定で可能と判定されたもの同士を統合し、定義と参照とが少なくとも一組順に並ぶステップ列を形成する。単純ブロック生成部8は、この統合処理によって基本ブロック内の生存区間の重複をより単純なものとする。このような統合処理によって、最終的に形成される小ブロックは単純ブロックと称される。単純ブロック生成前の生存区間の重複を図18に図示し、生成後の生存区間の重複を図20に図示する。図20と図18では、図20のほうが、比較的に生存区間の重複がより単純になり、生存区間の重複数が減少するので、資源割付部で必要とするレジスタ数も少ないもので済む。
【0041】
単純ブロック生成部8の処理過程を図3のフロ−チャ−ト、図4の説明図を参照しながら説明する。図3は単純ブロックを生成する手順を示すフローチャートであり、図4は、図3のフロ−チャ−トの各ステップでの処理を図的に表した説明図である。
ステップA1において単純ブロック生成部8は、基本ブロック内の各中間言語ステップを1つの小ブロックにする。図18に示したプログラムの基本ブロックB1に対して、この処理を行うと、基本ブロックB1内部は、図19(a)に示すものとなる。図19(a)において、中間言語ステップs1は小ブロックPB1となる。また、中間言語ステップs2は小ブロックPB2となる。同様に中間言語ステップs3、s4、s5・・・は小ブロックPB3、PB4、PB5・・・となる。
【0042】
ステップA2において、単純ブロック生成部8は小ブロックを、図4(a)の矢符b11、12、13に示すように、実行順に小ブロックを一つずつ取り出す。
ステップA3において単純ブロック生成部8は、取り出した小ブロックb1が基本ブロック内で最後のものであるかを判定し、最後の場合、処理を終了する。小ブロックb1が最後でない場合、ステップA4を行う。
【0043】
ステップA4において単純ブロック生成部8は、小ブロックb1の最後にある中間言語ステップs1を取り出す。
ステップA5において単純ブロック生成部8は、図4(b)に示すように、取り出した中間言語ステップs1で定義される変数vが一つか複数かの判定を行い、複数の場合、ステップA2を行う。単数の場合、ステップA6を行う。
【0044】
ステップA6において、単純ブロック生成部8は、図4(c)に示すように変数vの参照が基本ブロック内に存在するか否か、即ち、変数の生存区間の長さが他の基本ブロックに及ぶか否かを判定する。及ぶ場合ステップA2を行い、及ばない場合、ステップA7を行う。
ステップA7において、図4(d)に示すように、その変数vの参照が一回限りであることを判定する。この判定は、定義−参照情報から変数vの参照回数を調べることで行われる。複数回であればステップA2を行い、一回限りであれば、ステップA8を行う。
【0045】
ステップA8において、単純ブロック生成部8は、図4(e)に示すように、定義s1から変数vの参照までに、変数vが再定義されているかを判定する。定義されている場合はステップA2を行う。定義されていない場合は、ステップA9を行う。
ステップA9において、単純ブロック生成部8は、図4(f)に示すように、変数vが依存する変数vx、即ち、小ブロックb1内で参照される変数が、定義s1から変数vの参照までに再定義されるか否かを判定する。再定義されるときはステップA2を行い、再定義がない場合はステップA10を行う。ここで依存がある変数とは、当該変数の設定値に、影響を及ぼし得る全ての変数をいう。上述のように、小ブロックb1は参照と定義とが順に並ぶステップ列に形成されてゆくから、小ブロックb1は、変数vが依存する変数を全て含んでいる。例えば、図19(d)の小ブロックPB7に示す変数xの設定値は、変数x4、t1、p3、p1、p2の設定値の影響を受けるので、変数xは、変数x4、t1、p3、p1、p2に依存するという。もし依存変数の定義、即ち、変数x4、t1、p3、p1、p2の定義が、変数xの定義から参照までの区間に存在すると、変数xの定義命令を参照命令の位置に移動することは上記依存関係を損なうことになる。このような依存関係の損失を考慮して、単純ブロック生成部8は移動可、移動不可を判定する。
【0046】
ステップA10、ステップA11、ステップA12において、単純ブロック生成部8は小ブロックb1を抜き出し、抜き出した小ブロックb1を、変数vの参照(中間言語ステップs2)が属する小ブロックb2の先頭に挿入する。または小ブロックb1をステップS2の直前に挿入してもよい。この抜き出し及び挿入処理で、小ブロックb1及びb2が、1つの小ブロックに統合される。このような統合をおこなった後、単純ブロック生成部8は小ブロックb1を削除する。図19(a)に示した一例では、小ブロックPB1が抜き出され、小ブロックPB2の直前に挿入されて、図19(a)に示した小ブロックPB1、PB2は小ブロックPB2に統合される(矢線g12参照)。その結果、小ブロックPB2は、図19(b)に示すように、中間言語ステップs1、s2をメンバーに含むようになる。更に、小ブロックPB2が抜き出され、小ブロックPB7の直前に挿入されて、図19(b)に示した小ブロックPB2、PB7は、小ブロックPB7に統合される(矢線g27参照)。その結果、小ブロックPB7は、図19(c)に示すように、中間言語ステップs1、s2、s7をメンバーに含むようになる。同様に、矢線g38に示すように小ブロックPB3及びPB4がPB8に統合され、更に矢線g59に示すように、小ブロックPB5及びPB6がPB9に統合されるので、小ブロックPB8は、中間言語ステップs3、s4、s8をメンバーとして含むようになり、小ブロックPB9は、中間言語ステップs5、s6、s9をメンバーとして含むようになる。以上の統合によって、小ブロックPB7,PB8,PB9が単純ブロックとなる。
【0047】
以上のステップA1〜ステップA12の手順を、単純ブロック生成部8は、図4(a)の矢符b11、b12に示すように、残りの小ブロックについて繰り返す。これらの単純ブロックにおいて、その内部の中間言語ステップは、始めから終りの一ステップ前まで、変数の参照が1回きりのもののみで構成されるようになる。また、その変数の参照が行われる中間言語ステップは、変数の定義が行われる中間言語ステップと同一の単純ブロックとなる。
【0048】
図5は、図1に示した資源割付装置3の構成図である。
生存区間重複判定部9は、生存区間を生成しその生存区間の重複を検出する。
変数資源割付部10は、生存区間重複判定部9が求めた生存区間の情報を用いて、資源であるレジスタやメモリを変数に割り付ける。このとき、生存区間が重なる変数においては異なるレジスタを変数に割付ける。
【0049】
図5は、図1の資源割付装置3の構成図である。
資源割付装置3は、生存区間保持部11、単純ブロック内生存変数集合保持部12、基本ブロック内生存変数集合保持部13、基本ブロック間生存変数集合保持部14、生存区間生成部15、生存区間重複検査部16とで構成される。
生存区間保持部11は、中間言語ステップによって表現された生存区間を、変数と対応づけて保持する。また、各変数がどの単純ブロックにあるか、更に、どの基本ブロックにあるかを対応づけている。生存区間保持部11の保持内容の一例を図21(a)に示す。これは、図20に示したプログラム例と対応している。本図を参照すれば、変数t1の生存区間は中間言語ステップs2のみであり、また、変数t1は単純ブロックPB7に属し、基本ブロックB1に属することが明確になる。
【0050】
単純ブロック内生存変数集合保持部12は、単純ブロック内のみに生存区間が存在する変数を、当該単純ブロックと対応づけて保持する。このように単純ブロック内のみに生存区間が存在する変数は、単純ブロック内変数集合と称される。単純ブロック内生存変数集合保持部12の保持内容の一例を図21(b)に示す。本図も図20に示したプログラム例と対応づけられている。本図を参照すれば、単純ブロックPB7は、変数t1と、変数x4とを含むことがわかる。
【0051】
基本ブロック内生存変数集合保持部13は、基本ブロック内のみに生存区間が存在する変数であって、その生存区間が、複数の単純ブロック間にわたるものを当該基本ブロックと対応づけて保持する。この基本ブロック内生存変数集合保持部13が保持する変数の集合は、基本ブロック内変数集合と称される。基本ブロック内生存変数集合保持部13の保持内容の一例を図21(c)に示す。本図も図20に示したプログラム例と対応づけられている。本図を参照すれば、単純ブロックB1の基本ブロック内変数集合は、変数xと、変数yとを含むことがわかる。
【0052】
基本ブロック間生存変数集合保持部14は、変数のうち、生存区間が、複数の基本ブロック間にわたるものの集合を保持する。基本ブロック間生存変数集合保持部14が保持する変数の集合は基本ブロック間変数集合と称される。基本ブロック間生存変数集合保持部14の保持内容の一例を図21(d)に示す。本図も図20に示したプログラム例と対応づけられている。本図を参照すれば、変数z,a,bは、その生存区間が、複数の基本ブロック間にまたがっていることがわかる。
【0053】
生存区間生成部15は、変数の生存区間を中間言語ステップの集合で表現し、当該生存区間の範囲によって、変数を3つの集合に分類する。生存区間生成部15の処理は、生存区間生成処理、定義毎生存区間検出処理、及び後続ブロック生存区間検出処理に大別され、また上記の3つの集合とは、先に述べた単純ブロック内変数集合、基本ブロック内変数集合、基本ブロック間生存変数集合である。この分類は、変数の格納先を、単純ブロック内生存変数集合保持部12、基本ブロック内生存変数集合保持部13、基本ブロック間生存変数集合保持部14に切り換えることで行われる。
【0054】
生存区間生成部15の処理過程を図7、図8、図9、図10のフロ−チャ−トを参照しながら説明する。
図7は生存区間生成処理のフロ−チャ−ト、図8は定義毎生存区間検出処理のフロ−チャ−ト、図9は後続ブロック探索処理のフロ−チャ−ト、図10は後続ブロック生存区間検出処理のフロ−チャ−トである。
【0055】
図7のステップB1において、生存区間生成部15は、未処理の定義が存在するか否かを判定する。処理済みか未処理かは、定義に付されるマークで判別される。存在するとき、ステップB2を行い、そうでないときは処理を終了する。
ステップB2、B3、B4、B5において、生存区間生成部15は、先ず全ての基本ブロックを未探索にして、未マークの定義s1を取り出し、定義s1にマークをつけ、定義毎生存区間検出処理を行なう。
【0056】
以上のステップB1、B2、B3、B4、B5の処理は、全ての中間言語ステップがマークされるまで繰り返される。
図8に示すステップC2において、生存区間生成部15は、中間言語ステップsで定義される変数vが基本ブロックBの出口において生きていること、つまり、変数vがLiveOut[B]に属することを判定し、存在する場合、ステップC18を行ない、存在しない場合、ステップC3〜ステップC7を行う。
【0057】
ステップC18において生存区間生成部15は、定義sの次の中間言語ステップからBの最後の中間言語ステップまでに定義s以外の変数vの定義が存在しないことを判定する。存在しないときステップC8〜ステップC16を行ない、存在するときステップC3〜ステップC7を行う。
ステップC3、C4において、生存区間生成部15は、基本ブロックBの出口から入口に向かう方向に向けて探索を行い、変数vの参照s1を見つける。この探索作業は、定義sの定義−参照情報を参照することで行われる。参照s1を見つけると、生存区間生成部15は、定義sの次の中間言語ステップから参照s1までの中間言語ステップを変数vの生存区間として生存区間保持部11に格納する。
【0058】
ステップC5、ステップC6、ステップC7において、生存区間生成部15は、定義sが属する単純ブロックpbと、参照s1が属する単純ブロックが同じかどうか判定し、同じ場合(ステップC5)、生存区間生成部15は、定義sを単純ブロック内生存変数集合保持部12に格納し(ステップC6)、そうでない場合、即ち、定義sが属する単純ブロックpbと参照s1が属する単純ブロックとが異なる場合(ステップC5)、変数vを基本ブロック内生存変数集合保持部13に格納し(ステップC7)、ステップC17へ進む。
【0059】
ステップC8、C9において、生存区間生成部15は、変数vを基本ブロック間生存変数集合保持部14に格納し(ステップC8)、定義sの次の中間言語ステップから基本ブロックBの最後の中間言語ステップまでを、変数vの生存区間として生存区間保持部11に格納する(ステップC9)。ただし、定義s自体が基本ブロックBの最後の中間言語ステップのときは、生存区間保持部11には何にも格納しない。
【0060】
ステップC10において、生存区間生成部15は、実行順が基本ブロックBの次のもの(後続基本ブロック)を取り出し、その後続基本ブロックB1のLiveIn[B1]を参照して、後続の基本ブロックB1が未探索であり、かつその入口で変数vが生きていることを確認する。確認後、定義s及び基本ブロックB1を処理対象にして、後続ブロック探索処理を行なう。
【0061】
図9は、後続ブロック探索処理のフロ−チャ−トである。
ステップF1、F2、F3、F4、F5において、生存区間生成部15は、LiveIn[B1]に変数vが属するかを判定し(ステップF2)、属する場合基本ブロックB1は未探索であるかどうかを判定する(ステップF3)。未探索であると、後続ブロック生存区間検出処理を行う(ステップF4)。もし未探索でないなら、基本ブロックBの後続基本ブロックB1がみつかるまで(ステップF3)、以上の処理を繰り返す(ステップF1、F5)。
【0062】
図10は後続ブロック生存区間検出処理の手順を示すフローチャートである。
ステップD1において、生存区間生成部15は、基本ブロックBを探索済みとする。
ステップD2において、生存区間生成部15は、中間言語ステップsで定義される変数vが、基本ブロックBの出口で生きていることを判定する。生きている場合ステップD8を行い、そうでない場合ステップD5〜ステップD6を行なう。上記判定は、具体的には、生存区間生成部15が、変数vがLiveOut[B]にvが属していることを確認することで行われる。
【0063】
ステップD8において、生存区間生成部15は、基本ブロックBに変数vの定義が存在しないことを判定し、この場合、ステップD3〜ステップD4を行なう、そうでないときステップD5〜D6を行う。この判定は、具体的には、Def[B]に変数vが属さないことを確認することで行われる。
ステップD3において、生存区間生成部15は、基本ブロックB1の入口から出口までの中間言語ステップを変数vの生存区間にする(ステップD3)。
【0064】
ステップD4において、生存区間生成部15は、後続ブロック探索処理を行う。
ステップD5において、生存区間生成部15は、定義sの定義−参照情報に基づいて、基本ブロックBの出口から入口に向けて探索を行い、変数vの参照s1を見つける。
【0065】
ステップD6では、Bの先頭の中間言語ステップから参照s1までをvの生存区間として生存区間保持部11に格納し、図10に示した後続ブロック生存区間検出処理を終了する。
ステップC12、C13、C14のループ処理において、生存区間生成部15は、参照s2に到達する残り全ての定義である定義s3について、生存区間生成処理を再帰的に行い、変数vの生存区間の情報に、この定義s3についての生存区間の情報を付け加える。この定義s3の所在の探し出しは、参照s2の参照−定義情報を参照することで行われる。上記定義s3は、上述の分岐基本ブロック内にあり、これらを全て探し出すため、ステップC12、C13、C14の処理は繰り返えされる。
【0066】
ステップC11、C15、C16において、生存区間生成部15は、プログラム中の判断分岐処理あるいは多方向分岐処理が存在し、更に、上記参照s2が一つの分岐先基本ブロック内にある場合、生存区間生成部15は、残りの分岐基本ブロック内にある残り全ての参照を求める。それぞれの参照s2について、ステップC12、C13、C14のループ処理を繰り返し行う。
【0067】
ステップC17では、定義毎生存区間検出処理を終了する。
以上の手順により、変数は、単純ブロック内生存変数集合保持部12か、基本ブロック内生存変数集合保持部13か、基本ブロック間生存変数集合保持部14のどれかに格納され、これらの保持部の保持内容が、図21(b)、(c)、(d)に示したものとなる。
【0068】
生存区間重複検査部16は、変数の生存区間の重複を検査する。当該検査は、単純ブロック内生存変数集合保持部12、基本ブロック内生存変数集合保持部13、基本ブロック間生存変数集合保持部14、生存区間保持部11の情報を使用して行われる。この重複検査処理を、図11のフロ−チャ−トを参照しながら説明する。
【0069】
ステップE2では、単純ブロック毎変数集合ps1に属する変数間に対して、生存区間の重複を検査する。(単純ブロック内にのみ生存区間がある変数間での生存区間重複検査)
ステップE3、E4、E5のループ処理において、生存区間重複検査部16は、図12(c)に示すように、基本ブロックpb1が基本ブロックbs1に属するか否かを判定し、基本ブロックbb1の基本ブロック内変数集合bs1に属する変数v1の生存区間が単純ブロックpb1に存在するか否かを判定して(ステップE4)、更に図12(d)に示すように、単純ブロック内変数集合ps1に属する変数と、変数v1の間で生存区間の重複を検査する(ステップE5 これは、単純ブロック内にのみ生存区間がある変数と、基本ブロック内にのみ生存区間がある変数での生存区間重複検査となる。)。このステップE4、E5の処理を、生存区間重複検査部16は、基本ブロックbb1の基本ブロック毎変数集合bs1に属するすべて変数について繰り返す(ステップE3)。
【0070】
ステップE6、E7のループ処理において、生存区間重複検査部16は、単純ブロック内変数集合ps1に属する変数と、基本ブロック間生存変数集合保持部14に保持されている変数v2のとで生存区間の重複を検査する(ステップE7)。ステップE7の処理を、全ての基本ブロック間生存変数集合保持部14に保持されている残り全ての変数v2について繰り返す(ステップE6)。
【0071】
ステップE1において生存区間重複検査部16は、ステップE2からE7までの処理が単純ブロック内生存変数集合保持部12にある単純ブロックpb1の単純ブロック毎変数集合ps1の全ての変数について行ったか否かを判定し、処理済みならば、ステップE8からE12までの処理を行う。
ステップE8において生存区間重複検査部16は、基本ブロック内生存変数集合保持部13にある全ての基本ブロックbb2の基本ブロック内変数集合bs2についてステップE9からE11を行う。
【0072】
ステップE9において生存区間重複検査部16は、基本ブロック内変数集合bs2に属する変数についての生存区間重複を検査する。
ステップE10、E11では、基本ブロック内変数集合bs2に属する変数vと、基本ブロック間変数集合に属する変数v3との間で生存区間の重複を検査し(ステップE11)、基本ブロック間生存変数集合保持部14に保持されている変数v3のうち、基本ブロックbb2内に生存区間が存在するものの全てについて、ステップE11の検査を繰り返す(ステップE10)。
【0073】
ステップE12では、基本ブロック間生存変数集合保持部14にある変数間について生存区間の重複を検査する。
以上のように生存区間重複検査部16が検査処理を行うと、生存区間の重複が検査される。図20のプログラム例についての検査結果を図22に示す。
以上のように構成される本実施例の資源割付装置における具体的な動作を図14から図20を使用して説明する。
【0074】
図14は、C言語記述のプログラムの一部分の例である。本図において、変数p1, p2, p3の定義は、プログラム例の1行目より以前にあるものとし、4行目以降は使用がないものする。また、変数sの参照が、この例の後に存在するとする。
図15は、図14のソースプログラムに対する構文解析装置1の出力である中間言語プログラムである。この中間言語プログラムは2番地形式のもので与えられる。
【0075】
図15の中間言語プログラムに対して制御フロー解析部5が基本ブロック化を行い、図16に示した基本ブロックが生成される。図16において、中間言語ステップs1からs11までが基本ブロックB1、中間言語ステップs12からs15までが基本ブロックB2、中間言語ステップs16からs18までが基本ブロックB3である。
図16に示した基本ブロック化後の中間言語プログラムに対して、データフロー解析部6がデータフロー解析を行うと、図17に示した生存変数に関する情報、定義−参照情報、及び参照−定義情報が求められる。
【0076】
単純ブロック生成部8が、単純ブロック生成処理の手順により、図16中の基本ブロックB1を単純ブロックに分割する過程を図19に示す。
先ず単純ブロック生成部8は、図19(a)に示すように、基本ブロックB1を、中間言語ステップを一つだけ含む単純ブロックに分割する(単純ブロック生成処理のステップA1)。
【0077】
単純ブロック生成部8が、図3に示したフロ−チャ−トのステップA2からステップA12までの処理を行い、小ブロックPB1に含まれている中間言語ステップs1を小ブロックPB2の先頭に移動する。
詳しくは、単純ブロック生成部8は、小ブロックPB1を取りだし(単純ブロック生成処理のステップA2)、小ブロックPB1が基本ブロックB1の最後の小ブロックでないことを検出し(単純ブロック生成処理のステップA3)、小ブロックPB1の最後の中間言語ステップs1を検出する(単純ブロック生成処理のステップA4)。次に、中間言語ステップs1で定義される変数が変数t1の唯一つであることを検出し(単純ブロック生成処理のステップA5)、変数t1の参照が1回であり、基本ブロックB1内にあることを定義−参照情報から検出する(単純ブロック生成処理のステップA6、A7)。次に、定義s1の次の中間言語ステップから変数t1の参照までに、変数t1の定義がないことを検出し、定義s1で参照される変数p1, p2の定義が、定義s1の次の中間言語ステップから変数t1の参照までにないことを検出し、変数t1の参照が属する小ブロックPB2を検出する(単純ブロック生成処理のステップA10)。そして、小ブロックPB2の先頭に小ブロックPB1の要素である定義s1を挿入する(単純ブロック生成処理のステップA11)。
【0078】
同様に、図19(a)の小ブロックPB2に属する中間言語ステップs1,s2を、小ブロックPB7の先頭に移動した様子を図19(c)に示す。以上の処理を小ブロックPB3, PB4, PB5, PB6の順に繰り返すと、基本ブロックB1の内部は、図19(c)に示したものから、図19(d)に示したものへと変遷する。
続いて、単純ブロック生成部8が、小ブロックPB7の最後の中間言語ステップs7で定義される変数xと、小ブロックPB8の最後の中間言語ステップs8で定義される変数yとを移動しようとするが、これらの変数x,yは、参照回数が2回なので小ブロックPB7, PB8の移動を行わないと判定する(単純ブロック生成処理のステップA7)。同じく小ブロックPB9を移動しようとするが、小ブロックPB9は、最後の定義s9で定義される変数zの参照が基本ブロックB2に存在するため、移動を行わないと判定する(単純ブロック生成処理のステップA6)。小ブロックPB10は最後の中間言語ステップs10で定義される変数aが基本ブロックB2で参照されるので移動を行わないと判定し(単純ブロック生成処理のステップA6)、小ブロックPB11は基本ブロックB1の最後の小ブロックであるので移動を行わないと判定する(単純ブロック生成処理のステップA3)。結局、基本ブロックB1の単純ブロック化は、図19(d)に示した状態に留まる。
【0079】
単純ブロック生成部8が、単純ブロック化を基本ブロックB2,B3についても行った様子を、図20に示す。
単純ブロック生成部8による単純ブロック形成後、生存区間生成部15が、生存区間の表現を行い、かつ、各変数を、3つの集合に分類する。
この様子を、代表的な変数t1, y, a, b を一例にして説明する。
【0080】
始めに変数t1について説明する。
1)生存区間生成部15によって、マーク済みでない中間言語ステップs1が選択される。生存区間生成部15は、中間言語ステップs1にマークし、定義毎生存区間検出処理へ移る(生存区間生成処理のステップB1〜B5)。
2)全ての基本ブロックを未探索にする(生存区間生成処理のステップB4)。
【0081】
3)次に変数t1がLiveOut[B1]に含まれているか検査する。変数t1は含まれていないので定義毎生存区間検出処理のステップC3へ移る(定義毎生存区間検出処理のステップC2、C18)。
4)定義s1の定義−参照情報から、基本ブロックB1の出口から入口に向かって探索を行い、最初に見つかる変数t1の参照s2を見つける(定義毎生存区間検出処理のステップC3)。
【0082】
5)生存区間生成部15は、中間言語ステップs2を取り出し、これを、変数t1に対応づけて、変数t1の生存区間の一部にする(定義毎生存区間検出処理のステップC4)。
6)生存区間生成部15は、中間言語ステップs1とs2は同じ単純ブロックPB8に属しているので、変数t1を単純ブロック内生存変数集合保持部12の単純ブロックPB7の単純ブロック毎変数集合に格納する(定義毎生存区間検出処理のステップC5)。
【0083】
以上により、変数t1の生存区間が求められ、また変数t1は、単純ブロック内生存変数集合保持部12に格納される。
次に変数yについて説明する。
1)マーク済みでない中間言語ステップs8が、生存区間生成部15によって選択される。生存区間生成部15は、中間言語ステップs8にマークし、生存区間生成処理を行う(生存区間生成処理のステップB1〜B5)。
【0084】
2)全ての基本ブロックを未探索にする(生存区間生成処理のステップB4)。
3)次に変数yがLiveOut[B1]に含まれているか検査する。生存区間生成部15は、変数yは含まれていないので定義毎生存区間検出処理のステップC3を行う(定義毎生存区間検出処理のステップC2、C18)。
4)生存区間生成部15は、中間言語ステップs8の定義−参照情報に基づいて、基本ブロックB1の出口から入口に向けての探索を行い、変数yの参照である中間言語ステップs10を見つける(定義毎生存区間検出処理のステップC3)。
【0085】
5)生存区間生成部15は、変数yの生存区間を、中間言語ステップs5,s6,s9,s10までにする(定義毎生存区間検出処理のステップC4)。
6)生存区間生成部15は、中間言語ステップs8とs10は異なる単純ブロックに属していることを判定し、変数yを、基本ブロック内生存変数集合保持部13の保持集合のうち、基本ブロックB1に対応するものに格納する(定義毎生存区間検出処理のステップC5)。
【0086】
以上により、変数yの生存区間が求められ、生存区間生成部15は、変数yを基本ブロック内生存変数集合保持部13に格納した。
次に変数aについて説明する。
1)先ずマーク済みでない中間言語ステップs10が、生存区間生成部15によって選択される。生存区間生成部15は、中間言語ステップs10をマークし、定義毎生存区間検出処理へ移る(生存区間生成処理ステップB1〜B5)。
【0087】
2)生存区間生成部15は、全ての基本ブロックを未探索にする(生存区間生成処理ステップB4)。
3)次に生存区間生成部15は、変数aがLiveOut[B1]に含まれており、中間言語ステップs11には変数aの定義がないことを判定して、変数aを基本ブロック間生存変数集合保持部14に格納し、定義毎生存区間検出処理ステップC9へ移る(定義毎生存区間検出処理ステップC2、C18、C8)。
【0088】
4)生存区間生成部15は、中間言語ステップs11を変数aの生存区間にする(定義毎生存区間検出処理ステップC9)。
5)生存区間生成部15は、基本ブロックB2が探索済みであり、変数aがLiveIn[B2]に属していることを判定し、基本ブロックB2と中間言語ステップs10に関して後続ブロック生存区間検出処理を行う(定義毎生存区間探索処理ステップC10)。
【0089】
6)生存区間生成部15は、基本ブロックB2を探索済みにする(後続ブロック生存区間検出処理ステップD1)。
7)生存区間生成部15は、変数aがLiveOut[B2]に属することを判定し、また、変数aが、Def[B2]には属さないことを判定して、後続ブロック生存区間検出処理のステップD3の処理を行う(後続ブロック生存区間検出処理ステップD2、D8)。
【0090】
8)生存区間生成部15は、中間言語ステップs13,s12,s14,s15 を、変数aの生存区間にする(後続ブロック生存区間検出処理ステップD3)。
9)基本ブロックB2の後続基本ブロックB3が探索済みでなく、かつ、LiveIn[B3]に変数aが属していることを判定し、基本ブロックB3と定義s10に関して、後続ブロック生存区間検出処理を行なう(後続ブロック生存区間検出処理ステップD4)。
【0091】
10)生存区間生成部15は、基本ブロックB3を探索済みにする(後続ブロック生存区間検出処理ステップD1)。
11)生存区間生成部15は、変数aがLiveOut[B3]に属さないことを判定し、後続ブロック生存区間検出処理のステップD5を行う(後続ブロック生存区間検出処理ステップD2)。
【0092】
12)生存区間生成部15は、基本ブロックB3の出口から入口に向かって探索を行い、変数aの参照s16を見つけ出す(後続ブロック生存区間検出処理ステップD5)。
13)参照s16を変数aの生存区間にする(後続ブロック生存区間検出処理ステップD6)。
【0093】
14)後続ブロック生存区間検出処理を終了し、先の9)の状態に戻る(後続ブロック生存区間検出処理ステップD7)。
15)基本ブロックB2に関して後続ブロック生存区間検出処理を終了し、先の5)の状態に戻る(後続ブロック生存区間検出処理ステップD7)。
16)生存区間生成部15は、中間言語ステップs10の定義−参照情報を参照し、本情報内に存在する変数aの参照s12を取り出す。更に参照s12の参照−定義情報を参照し、参照s12に到達する変数aの定義s10を取り出す。但し参照s10はマーク済みなので、生存区間生成部15は、後続ブロック生存区間検出処理ステップC10、C11を行なわない。
【0094】
17)定義毎生存区間検出処理を終了して、1)の状態へ戻る。以上により、変数aの生存区間が求められ、変数aを基本ブロック間生存変数集合保持部14に格納する。
次に変数bについて説明する。
1)生存区間生成部15は、マーク済みでない中間言語ステップs11を選択し、中間言語ステップs11をマークして、生存区間生成処理を行う(生存区間生成処理ステップB1〜B5)。
【0095】
2)生存区間生成部15は、全ての基本ブロックを未探索にする(生存区間生成処理ステップB4)。
3)生存区間生成部15は、変数bがLiveOut[B1]に含まれており、定義s11自体がB1の最後の中間言語ステップであることを判定して、変数bを基本ブロック間生存変数集合保持部14へ格納する。格納後、定義毎生存区間検出処理ステップC6を行う(定義毎生存区間検出処理ステップC2、C18、C8)。
【0096】
4)生存区間生成部15は、中間言語ステップs11が、基本ブロックB1の最後の中間言語ステップであることを判定し、変数bの生存区間になにも格納しない(定義毎生存区間検出処理ステップC9)。
5)生存区間生成部15は、変数bがLiveIn[B2]に属していることを判定し、基本ブロックB2と中間言語ステップs11に関して後続ブロック生存区間検出処理を行う(定義毎生存区間検出処理ステップC7)。
【0097】
6)生存区間生成部15は、基本ブロックB2を探索済みとする(後続ブロック生存区間検出処理ステップD1)。
7)生存区間生成部15は、変数bがDef[B2]に属することを判定し、後続ブロック生存区間検出処理のステップD5を行う(後続ブロック生存区間検出処理ステップD2)。
【0098】
8)生存区間生成部15は、中間言語ステップs11の定義−参照情報を参照し、基本ブロックB2の出口から入口に向けて探索を行い、最初に見つかる変数bの参照s13を見つ出す(後続ブロック生存区間検出処理ステップD5)。
9)生存区間生成部15は、中間言語ステップs13を変数bの生存区間にする(後続ブロック生存区間検出処理ステップD6)。
【0099】
10)後続ブロック生存区間検出処理を終了し、先の5)の状態に戻る。11)変数bの参照s13について、生存区間生成部15は、ステップC11〜C16を行なう(定義毎生存区間検出処理ステップC11)。
12)生存区間生成部15は、参照s13の参照−定義情報に存在する変数bの定義のうち、マーク済みでない定義s13を見つ出す(定義毎生存区間検出処理ステップC12)。
【0100】
13)生存区間生成部15は、参照s13をマークし、定義毎生存区間検出処理へ移る(定義毎生存区間検出処理ステップC13、C14)。
15)生存区間生成部15は、変数bがLiveOut[B2]に含まれており、基本ブロックB2の最後までに変数bの定義がないことを判定し、定義毎生存区間検出処理ステップC9へ移る(定義毎生存区間検出処理ステップC2、C18、C8)。
【0101】
16)生存区間生成部15は、中間言語ステップs12,s14,s15を変数bの生存区間にする(定義毎生存区間検出処理ステップC9)。
17)生存区間生成部15は、変数bがLiveIn[B3]に属していることを判定し、基本ブロックB3が未探索であり、基本ブロックB3と中間言語ステップs13に関して後続ブロック生存区間検出処理を行う(定義毎生存区間検出処理ステップC10)。
【0102】
18)生存区間生成部15は、基本ブロックB3を探索済みとする(後続ブロック生存区間検出処理ステップD1)。
19)生存区間生成部15は、変数bがLiveOut[B3]に属さないことを判定し、後続ブロック生存区間検出処理ステップD5へ移る(後続ブロック生存区間検出処理ステップD2)。
【0103】
20)生存区間生成部15は、基本ブロックB3の出口から入口に向かって探索を行い、定義s13の定義−参照情報に存在する変数bの参照s17を見つける(後続ブロック生存区間検出処理ステップD5)。
21)生存区間生成部15は、中間言語ステップs16,s17を変数bの生存区間にする(後続ブロック生存区間検出処理ステップD6)。
【0104】
22)後続ブロック生存区間検出処理を終了し、先の17)の状態に戻る(後続ブロック生存区間検出処理ステップD7)。
23)生存区間生成部15は、定義s13の定義−参照情報に存在する参照s13,s14,s17を取り出す。参照s14,s17の参照−定義情報に存在する変数bの定義s13だけであり、この定義s13はマーク済みである。また参照s13の参照−定義情報に存在する変数bの定義s11,s13はともにマーク済みであるので、定義毎生存区間検出処理を終了し、先の13)の状態に戻る(定義毎生存区間検出処理ステップC11〜C16)。
【0105】
24)生存区間生成部15は、更に参照s13の参照−定義情報に存在するが、定義s11はマーク済みであるので、生存区間生成部15は定義毎生存区間検出処理を終了し、先の1)の状態に戻る。以上により、変数bの生存区間が求められ、変数bを基本ブロック間生存変数集合保持部14に格納する。
同様にして他の変数についても、生存区間生成部15の生存区間検出処理を行うと図21のようになる。
【0106】
次に、図9の生存区間重複検査処理によって変数の重複が検査される過程を示す。
まず、生存区間重複検査部16は、単純ブロック内にのみ生存区間が存在する変数について重複検査を行う。例えば、同じ単純ブロックPB8のみに存在する変数t3と、変数y4との生存区間の重複検査を行い、変数t3と変数y4とは、生存区間が重ならないと検査結果を下す(生存区間重複検査処理ステップE2)。
【0107】
次に生存区間重複検査部16は、単純ブロック内にのみ生存区間が存在する変数と、基本ブロック内にのみ生存区間が存在する変数との生存区間の重複検査を行う。例えば、基本ブロックB1内にのみ生存区間が存在する変数yと、単純ブロックPB9, PB10内にのみ生存区間が存在する変数との重複検査を行い、変数t5, z4は、生存区間が重なると検出結果を下す(生存区間重複検査処理ステップE3〜E5)。
【0108】
次に生存区間重複検査部16は、単純ブロック内にのみ生存区間が存在する変数と、基本ブロック間にまたがって生存区間が存在する変数との重複検査を行う。例えば、基本ブロックB2に生存区間が存在する変数aと、単純ブロックPB15内にのみ生存区間が存在する変数cとの重複検査を行い、重複するという検査結果を下す(生存区間重複検査処理ステップE6、E7)。
【0109】
次に生存区間重複検査部16は、基本ブロック内にのみ生存区間が存在する変数間の重複検査を行う。例えば、生存区間重複検査部16は、基本ブロックB1内のみに生存区間が存在する変数x,yについて重複検査を行い、変数x,yは、生存区間が重複することを検出する(生存区間重複検査処理ステップE9)。
次に、生存区間重複検査部16は、基本ブロック内にのみ生存区間が存在する変数と、基本ブロック間にまたがって生存区間が存在する変数との重複検査を行う。例えば、生存区間重複検査部16は、基本ブロックB1に生存区間が存在する変数aと、B1内にのみ生存区間が存在する変数x, yとの重複検査を行い、変数x,yは、とは生存区間が重なることが検出され、yとは生存区間が重ならないことが検出される(生存区間重複検査処理ステップE10、E11)。
【0110】
次に、生存区間重複検査処理ステップE12により、生存区間重複検査部16は、基本ブロック間にまたがって生存区間が存在する変数間での生存区間の重複検査を行う。例えば、生存区間重複検査部16は、変数aと、変数bとの重複検査を行い、生存区間が重なると検査結果を下す。
【0111】
【発明の効果】
以上説明してきたように請求項1の発明に係るコンパイル装置によれば、基本ブロック内のみに生存区間が収まる変数のうち、異なる基本ブロック内に属するもの同士の重複判定処理が結果として省かれるので、生存区間の重複判定処理が無駄の無いものとなり、コンパイル時間を短縮することができる。
【0112】
また、請求項2に係るコンパイル装置によれば、プログラム中の大多数の変数が単純ブロック内に納められる。生存区間の重複判定処理は、同一の単純ブロックに納められたもの同士で行われるため、生存区間の重複判定処理が極めて無駄の無いものとなり、重複判定に要する処理時間を大きく短縮できる。具体的には、n個の変数について、nC2回行われた生存区間の重複判定処理の処理時間は、この簡略化によって、約1/10となる。
【0113】
また、請求項3に係るコンパイル装置によれば、生存区間が単純ブロック内に属するか属しないかで、生存区間の重複判定処理を個別化するので、冗長部な重複判定処理が徹底して省かれる。また、請求項4に係るコンパイル装置によれば、基本ブロック中の各定義命令について統合可能か否かを判定するので、元のプログラムのデータ依存関係を損なわずにプログラム中に単純ブロックを形成できる。
【0114】
また、請求項5に係るコンパイル装置によれば、基本ブロック内のみに生存区間が存在する変数の生存区間を、単純なアルゴリズムによって検出することができる。単純ブロック形成のために処理量が増加し、コンパイル処理の高速性の低下を招くことは無い。また、請求項6に係るコンパイル装置によれば、基本ブロック内のみに生存区間が存在する変数の生存区間を、単純なアルゴリズムによって表現することができる。
【0115】
また、請求項7に係るコンパイル装置によれば、基本ブロック間に生存区間が存在する変数の生存区間を、単純なアルゴリズムによって表現することができる。また、請求項8に係るコンパイル装置によれば、分岐処理内で値が設定される変数の生存区間を、単純なアルゴリズムによって表現することができる。また、請求項9に係るコンパイル装置によれば、分岐処理内で値が使用される変数の生存区間を、単純なアルゴリズムによって表現することができる。
【図面の簡単な説明】
【図1】本発明に係るコンパイル装置の構成を示す図である。
【図2】最適化装置2の構成を示す図である。
【図3】単純ブロック生成処理のフローチャートである。
【図4】単純ブロック生成の過程を示した図である。
【図5】資源割付装置3の構成を示す図である。
【図6】生存区間重複判定部9の構成を示す図である。
【図7】生存区間生成処理のフローチャートである。
【図8】定義毎生存区間検出処理のフローチャートである。
【図9】後続ブロック検索処理のフローチャートである。
【図10】後続ブロック生存区間検出処理のフローチャートである。
【図11】生存区間重複検査処理のフローチャートである。
【図12】生存区間重複検査処理の処理過程を示す図である。
【図13】基本ブロックを説明するための説明図である。
【図14】ソースプログラムの一例である。
【図15】中間言語プログラムの一例である。
【図16】基本ブロック化された中間言語プログラムの一例である。
【図17】データフロー情報、定義−参照情報、参照−定義情報の一例である。
【図18】中間言語プログラム中の、各変数の生存区間を図示したものである。
【図19】単純ブロック生成の過程を示した図である。
【図20】単純ブロック生成後の、各変数の生存区間を図示したものある。
【図21】生存区間保持部11、単純ブロック内生存変数集合保持部12、基本ブロック内生存変数保持部13、基本ブロック間生存変数集合保持部14の保持内容の一例を図示したものである。
【図22】生存区間重複検査の検査結果を示したものである。
【図23】生存区間、および、生存区間の重複検査の検査結果を示す図である。
Claims (9)
- 複数の命令からなるプログラムを、機械語プログラムに翻訳するコンパイル装置であって、
前記プログラム中の飛び越し命令と、当該飛び越し命令の飛び越し先の命令とを検出する飛び越し検出手段と、
飛び越し検出手段が検出した命令に基づいて、前記プログラムを基本ブロックに分割する分割手段と、
プログラム中の各変数について、変数の設定値が有効となるプログラム中の区間である生存区間を検出し、検出結果を、生存区間内に含まれる命令の位置を示す命令位置情報の集合で表す生存区間検出手段と、
生存区間検出手段が検出した生存区間が1つの基本ブロック内に収まる変数を全て検出し、検出結果を、当該基本ブロックに対応づけた基本ブロック内生存変数集合で表す基本ブロック内生存変数検出手段と、
生存区間検出手段が検出した生存区間が、複数の基本ブロック間におよぶ変数を全て検出し、検出結果を、基本ブロック間生存変数集合で表す基本ブロック間生存変数検出手段と、
基本ブロック間生存変数集合から変数を2つずつ取り出し、当該2変数の生存区間に対応する命令位置情報集合の集合積を算出することで、生存区間の重複を判定する第1の生存区間重複判定手段と、
同一の基本ブロックに対応づけられた基本ブロック内生存変数集合から変数を2つずつ取り出し、当該2変数の生存区間に対応する命令位置情報集合の集合積を算出することで、生存区間の重複を判定する第2の生存区間重複判定手段と、
前記基本ブロックに対応づけられた基本ブロック内生存変数集合と、基本ブロック間生存変数とから変数を1つずつ取り出し、当該2変数の生存区間に対応する命令位置情報集合の集合積を算出することで、生存区間の重複を判定する第3の生存区間重複判定手段と、
前記第1、第2、第3の生存区間重複判定手段の判定結果を用いて資源割付を行うことを特徴とするコンパイル装置。 - 前記コンパイル装置は更に、
変数の値を設定する命令である定義命令と、当該定義命令で設定された変数の値を使用する命令である参照命令とが、少なくとも一組順に並ぶ命令列である単純ブロックを、基本ブロック内に形成する単純ブロック形成手段と、
前記基本ブロック内生存変数集合から、生存区間が一つの単純ブロック内に収まる変数を全て検出し、検出結果を、当該単純ブロックに対応づけた単純ブロック内生存変数集合で表す単純ブロック内生存変数検出手段と、
前記基本ブロック内生存変数集合から生存区間が複数の単純ブロック間におよぶ変数を検出し、検出結果を、単純ブロック間生存変数集合で表す単純ブロック間生存変数検出手段と、
を備え、
前記第2の生存区間重複判定手段は、前記単純ブロック間生存変数集合から変数を2つずつ取り出し、当該2変数の生存区間に対応する命令位置情報集合の集合積を算出することで、生存区間の重複を判定する第1の生存区間重複判定部と、
同一の単純ブロックに対応づけられた単純ブロック内変数集合から変数を2つずつ取り出し、当該2変数の生存区間に対応する命令位置情報集合の集合積を算出することで、生存区間の重複を判定する第2の生存区間重複判定部と、
前記単純ブロックに対応づけられた単純ブロック内変数集合と、単純ブロック間生存変数集合とから変数を1つずつ取り出し、当該2変数の生存区間に対応する命令位置情報集合の集合積を算出することで、生存区間の重複を判定する第3の生存区間重複判定部と、
を備えることを特徴とする請求項1記載のコンパイル装置。 - 前記第3の生存区間重複判定手段は、基本ブロック間生存変数集合と、前記単純ブロックに対応づけられた単純ブロック内生存変数集合とから変数を1つずつ取り出し、当該2変数の生存区間に対応する命令位置集合の集合積を算出することで、生存区間の重複を判定する第4の生存区間重複判定部と、
基本ブロック間生存変数集合と、単純ブロック間生存変数集合とから変数を1つずつ取り出し、当該2変数の生存区間に対応する命令位置集合の集合積を算出することで、生存区間の重複を判定する第5の生存区間重複判定部と、
を備えることを特徴とする請求項2記載のコンパイル装置。 - 前記単純ブロック形成手段は、基本ブロックから、定義命令を1つずつ取り出す定義命令取り出し手段と、
定義命令取り出し手段が取り出した定義命令が含まれる基本ブロックから、その定義命令に対応する参照命令を検出する対応参照命令検出手段と、
対応参照命令検出手段が検出した参照命令の位置に、当該参照命令に対応する定義命令が移動可能か否かを判定する定義命令移動可否判定手段と、
定義命令移動可否判定手段が可能と判定した場合、定義命令移動可否判定手段が可能と判定した定義命令を、当該定義命令に対応する参照命令の直前に移動し、当該定義命令及び参照命令を一つの単純ブロックに統合する定義命令移動手段と、
定義命令移動手段が移動した定義命令が、移動前において、単純ブロック内の最後の命令である場合、移動前の単純ブロックの残りの命令の全てを当該定義命令の移動先の直前に移動し、移動した残命令を、移動先の単純ブロックに統合する単純ブロック残命令移動手段と、
を備えることを特徴とする請求項2又は3記載のコンパイル装置。 - 前記定義命令移動可否判定手段は、前記定義命令取り出し手段が取り出した定義命令によって値が設定される変数が一つであるか否かを判定する変数単複判定部と、
前記変数単複判定部が一つであると判定した場合、前記対応参照命令検出手段が検出した参照命令が一つか否かを判定する参照命令単複判定部と、
前記参照命令単複判定部が一つであると判定した場合、当該参照命令に対応する定義命令で値が設定される変数が、当該定義命令から当該参照命令までの区間において再設定されるか否かを判定する第1の再設定有無判定部と、
前記第1の再設定有無判定部が再設定がないと判定した場合、当該定義命令において使用される変数を検出する定義命令内使用変数検出部と、
前記定義命令内使用変数検出部が検出した変数が、当該定義命令から当該参照命令までの間に再設定されないことを判定する第2の再設定有無判定部と、
前記第2の再設定有無判定部が再設定が無いと判定した場合、当該定義命令が、当該参照命令の位置に移動可能と判定する移動可否判定部と、
からなることを特徴とする請求項4記載のコンパイル装置。 - 前記コンパイル装置は更に、
前記プログラム中の各基本ブロックと、当該基本ブロックの入口において有効となる変数及び出口において有効となる変数とを対応させて記憶する有効変数情報記憶手段を備え、前記生存区間検出手段は、前記プログラムから定義命令を1つずつ取り出す定義命令取り出し部と、
前記定義命令取り出し部によって取り出された定義命令を含む基本ブロックと、当該定義命令によって設定される変数とを検出し、検出した変数の設定値が当該基本ブロックの出口で無効か否かを、前記有効変数情報記憶手段の記憶内容に基づき判定する出口無効判定部と、
前記出口無効判定部が設定値無効と判定した場合、当該基本ブロックから、当該定義命令に対応する参照命令であって、当該基本ブロックの出口に最も近いものを検出する出口最近参照命令検出部と、
当該定義命令の次の命令から出口最近参照命令検出部が検出した参照命令までの命令位置情報を全て検出する基本ブロック内命令位置検出部と、
命令位置情報が検出された変数についての生存区間を、基本ブロック内命令位置検出部が検出した命令位置情報の集合で表す基本ブロック内生存区間表現部と、
を備え、
前記基本ブロック内生存変数検出手段は、前記基本ブロック内生存区間表現部が生存区間を表現した変数を、当該変数が含まれる基本ブロックに対応する基本ブロック内生存変数集合のメンバーにする
ことを特徴とする請求項1から5記載のコンパイル装置。 - 前記コンパイル装置は更に、
基本ブロックと、当該基本ブロックにおいて設定される変数とを対応させて記憶する基本ブロック内定義情報記憶手段を備え、
前記生存区間検出手段は、
前記出口無効判定部が有効と判定した場合、前記基本ブロック内定義情報記憶手段の記憶内容に基づいて、前記出口無効判定部によって有効と判定された定義命令において設定される変数が、当該定義命令から当該定義命令を含む基本ブロックの出口までの間に再設定されるか否かを判定する再設定有無判定部と、
前記再設定値有無判定部が再設定無しと判定した場合、当該定義命令の次の命令から当該基本ブロックの出口までの命令位置情報を検出する出口有効時位置情報検出部と、
前記再設定有無判定部が再設定無しと判定した場合、前記有効変数情報記憶手段および基本ブロック内定義情報記憶手段の記憶内容に基づいて、当該定義命令が含まれる基本ブロックの次順の基本ブロックのうち、当該変数がその入口及び出口で有効であり、かつその内部で、当該変数が再設定されないものを全て検出する生存基本ブロック検出部と、
前記基本ブロック内定義情報記憶手段の記憶内容に基づいて、前記生存基本ブロック検出部が検出した基本ブロック内に含まれる命令位置情報を全て検出する基本ブロック間位置情報検出部と、
前記再設定有無判定部が再設定無しと判定した場合、当該定義命令が含まれる基本ブロックの次順の基本ブロックのうち、その入口で当該変数の値が有効であり、その出口で無効である基本ブロックを検出する末尾基本ブロック検出部と、
前記末尾基本ブロック検出部が検出した基本ブロックから、当該定義命令に対応する最後の参照命令を検出する末尾参照命令検出部と、
前記末尾基本ブロック検出部が検出した基本ブロックの入口から前記末尾参照命令検出部が検出した参照命令までの命令位置情報を全て検出する入口有効時位置情報検出部と、
再設定有無判定部が再設定なしと判定した変数に対応する生存区間の集合を、出口有効時位置情報検出手段の検出結果と、入口有効時位置情報検出手段の検出結果と、基本ブロック間位置情報検出手段の検出結果とをあわせた集合で表す基本ブロック間生存区間表現部と、
を備え、前記基本ブロック間生存変数検出手段は、前記再設定有無判定部が再設定無しと判定した変数を、基本ブロック間生存変数集合のメンバーにすることを特徴とする請求項6記載のコンパイル装置。 - 前記コンパイル装置は更に、
プログラム中の各命令位置と、当該命令位置の命令において使用される変数と、当該変数が設定される命令の命令位置情報とを対応させて記憶する参照−定義情報記憶手段を備え、前記生存区間検出手段は、前記定義命令取り出し部が取り出した定義命令の位置に識別情報を付するマーキング部と、
前記定義命令取り出し部が取り出した定義命令に対応する参照命令で使用される変数を検出する参照変数検出部と、
参照−定義情報記憶手段の記憶内容に基づいて、前記参照変数検出部が検出した変数に設定値を設定する定義命令を全て検出する定義命令検出部と、
前記定義命令検出部が検出した定義命令のうち、前記マーキング部によって付された識別情報が無いものを検出する無マーク定義命令検出部と、
前記無マーク定義命令検出部が検出した定義命令の次の命令から、その定義命令を含む基本ブロックの出口までの命令位置情報を全て検出する第1の分岐ブロック内位置情報検出部と、
基本ブロック間生存区間表現部が表した命令位置情報の集合に、前記第1の分岐ブロック内位置情報検出部が検出した命令位置情報を付加する第1の命令位置情報付加部と、
を備えることを特徴とする請求項7記載のコンパイル装置。 - 前記コンパイル装置は更に、
プログラム中の各命令位置と、当該命令位置の命令において設定される変数と、当該変数が使用される命令の命令位置情報とを対応させて記憶する定義−参照情報記憶手段を備え、前記生存区間検出手段は、前記定義−参照情報記憶手段の記憶内容に基づいて、前記無マーク定義命令検出部が検出した定義命令に対応する参照命令を検出する分岐ブロック内参照命令検出部と、
前記分岐ブロック内参照命令検出部が検出した参照命令を含む基本ブロックを検出する分岐ブロック検出部と、
前記分岐ブロック検出部が検出した基本ブロックの入口から、前記分岐ブロック内参照命令検出部が検出した参照命令までの命令位置情報を全て検出する第2の分岐ブロック内位置情報検出部と、
前記基本ブロック間生存区間表現部が表した命令位置情報の集合に、前記第2の分岐ブロック内位置情報検出部が検出した命令位置情報を付加する第2の命令位置情報付加部と、
を備えることを特徴とする請求項8記載のコンパイル装置。
Priority Applications (6)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP21881194A JP3606387B2 (ja) | 1994-09-13 | 1994-09-13 | コンパイル装置 |
CN95106164A CN1097226C (zh) | 1994-09-13 | 1995-05-30 | 编译程序器 |
US08/508,136 US5642512A (en) | 1994-09-13 | 1995-07-27 | Compiler with improved live range interference investigation |
EP95305885A EP0702293B1 (en) | 1994-09-13 | 1995-08-23 | Compiler with improved live range interference investigation |
DE69524511T DE69524511T2 (de) | 1994-09-13 | 1995-08-23 | Kompiler mit verbesserter Untersuchung von Interferenz von Lebendigkeitsbereichen |
KR1019950029734A KR100226233B1 (ko) | 1994-09-13 | 1995-09-13 | 컴파일러 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP21881194A JP3606387B2 (ja) | 1994-09-13 | 1994-09-13 | コンパイル装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
JPH0883185A JPH0883185A (ja) | 1996-03-26 |
JP3606387B2 true JP3606387B2 (ja) | 2005-01-05 |
Family
ID=16725719
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
JP21881194A Expired - Fee Related JP3606387B2 (ja) | 1994-09-13 | 1994-09-13 | コンパイル装置 |
Country Status (6)
Country | Link |
---|---|
US (1) | US5642512A (ja) |
EP (1) | EP0702293B1 (ja) |
JP (1) | JP3606387B2 (ja) |
KR (1) | KR100226233B1 (ja) |
CN (1) | CN1097226C (ja) |
DE (1) | DE69524511T2 (ja) |
Families Citing this family (22)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1149476C (zh) * | 1995-03-16 | 2004-05-12 | 松下电器产业株式会社 | 资源分配装置 |
JP3060907B2 (ja) * | 1995-07-28 | 2000-07-10 | 日本電気株式会社 | 言語処理プログラムの処理方式 |
US5787287A (en) * | 1995-12-27 | 1998-07-28 | Intel Corporation | Representation of control flow and data dependence for machine |
TW470915B (en) * | 1996-03-12 | 2002-01-01 | Matsushita Electric Ind Co Ltd | Optimization apparatus which removes transfer instructions by a global analysis of equivalence relations |
US5778233A (en) * | 1996-10-11 | 1998-07-07 | International Business Machines Corporation | Method and apparatus for enabling global compiler optimizations in the presence of exception handlers within a computer program |
US5946492A (en) * | 1997-02-19 | 1999-08-31 | International Business Machines Corporation | Compiler that reduces call stack size through identification of stackless variables |
JPH11327879A (ja) * | 1998-05-15 | 1999-11-30 | Fujitsu Ltd | 変数検索装置及び方法並びに変数検索プログラムを記録したコンピュータ読取り可能な記録媒体 |
US6421824B1 (en) * | 1999-04-23 | 2002-07-16 | Sun Microsystems, Inc. | Method and apparatus for producing a sparse interference graph |
JP4041248B2 (ja) * | 1999-07-09 | 2008-01-30 | 松下電器産業株式会社 | コンパイラ装置、コンパイルプログラムが記録されたコンピュータ読み取り可能な記録媒体及びコンパイル方法 |
US6381691B1 (en) * | 1999-08-13 | 2002-04-30 | International Business Machines Corporation | Method and apparatus for reordering memory operations along multiple execution paths in a processor |
CN100430896C (zh) * | 2002-10-29 | 2008-11-05 | 洛克希德马丁公司 | 硬件解析器加速器 |
CN100380323C (zh) * | 2003-02-28 | 2008-04-09 | Bea系统公司 | 用于确定何时需要运行ejb编译器的系统和方法 |
US7210135B2 (en) | 2003-08-26 | 2007-04-24 | Microsoft Corporation | Data flow analysis of transactional processes |
US7784039B2 (en) * | 2004-09-22 | 2010-08-24 | Panasonic Corporation | Compiler, compilation method, and compilation program |
US7539983B2 (en) * | 2005-01-14 | 2009-05-26 | Microsoft Corporation | Tool for processing software programs using modified live-ness definition |
JP4778286B2 (ja) * | 2005-09-28 | 2011-09-21 | パナソニック株式会社 | コンパイラ装置 |
US8543992B2 (en) * | 2005-12-17 | 2013-09-24 | Intel Corporation | Method and apparatus for partitioning programs to balance memory latency |
CN101361039A (zh) * | 2006-01-20 | 2009-02-04 | 松下电器产业株式会社 | 处理器 |
JP2008305337A (ja) * | 2007-06-11 | 2008-12-18 | Panasonic Corp | プログラム変換装置、プログラム変換方法、プログラム、記憶媒体、デバッグ装置、デバッグ方法及びプログラム開発システム |
EP2022601B1 (de) | 2007-08-03 | 2013-03-20 | TRUMPF Werkzeugmaschinen GmbH + Co. KG | Laserbearbeitungsmaschine zum Bearbeiten von Werkstücken sowie maschinelles Verfahren zum Bearbeiten von Werkstücken mittels eines Laserstrahls |
JP5058063B2 (ja) * | 2008-04-30 | 2012-10-24 | 三菱電機株式会社 | 制御システム開発支援装置 |
EP3106982B1 (en) * | 2015-06-18 | 2021-03-10 | ARM Limited | Determination of branch convergence in a sequence of program instructions |
Family Cites Families (10)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US4571678A (en) * | 1982-11-05 | 1986-02-18 | International Business Machines Corporation | Register allocation and spilling via graph coloring |
US4782444A (en) * | 1985-12-17 | 1988-11-01 | International Business Machine Corporation | Compilation using two-colored pebbling register allocation method such that spill code amount is invariant with basic block's textual ordering |
US5428793A (en) * | 1989-11-13 | 1995-06-27 | Hewlett-Packard Company | Method and apparatus for compiling computer programs with interproceduural register allocation |
US5107418A (en) * | 1990-06-11 | 1992-04-21 | Supercomputer Systems Limited Partnership | Method for representing scalar data dependences for an optimizing compiler |
US5249295A (en) * | 1990-06-20 | 1993-09-28 | Rice University | Digital computer register allocation and code spilling using interference graph coloring |
US5530866A (en) * | 1991-07-30 | 1996-06-25 | Tera Computer Company | Register allocation methods having upward pass for determining and propagating variable usage information and downward pass for binding; both passes utilizing interference graphs via coloring |
US5355494A (en) * | 1991-12-12 | 1994-10-11 | Thinking Machines Corporation | Compiler for performing incremental live variable analysis for data-parallel programs |
US5418958A (en) * | 1992-07-15 | 1995-05-23 | Sun Microsystems, Inc. | Register allocation by decomposing, re-connecting and coloring hierarchical program regions |
US5367684A (en) * | 1992-11-30 | 1994-11-22 | Intel Corporation | Register allocation using an improved register candidate usage matrix |
JPH06250837A (ja) * | 1993-02-25 | 1994-09-09 | Ricoh Co Ltd | スケジューリング処理方式 |
-
1994
- 1994-09-13 JP JP21881194A patent/JP3606387B2/ja not_active Expired - Fee Related
-
1995
- 1995-05-30 CN CN95106164A patent/CN1097226C/zh not_active Expired - Fee Related
- 1995-07-27 US US08/508,136 patent/US5642512A/en not_active Expired - Fee Related
- 1995-08-23 EP EP95305885A patent/EP0702293B1/en not_active Expired - Lifetime
- 1995-08-23 DE DE69524511T patent/DE69524511T2/de not_active Expired - Fee Related
- 1995-09-13 KR KR1019950029734A patent/KR100226233B1/ko not_active IP Right Cessation
Also Published As
Publication number | Publication date |
---|---|
EP0702293A3 (en) | 1997-05-02 |
US5642512A (en) | 1997-06-24 |
DE69524511T2 (de) | 2002-05-08 |
JPH0883185A (ja) | 1996-03-26 |
CN1118899A (zh) | 1996-03-20 |
CN1097226C (zh) | 2002-12-25 |
KR960011768A (ko) | 1996-04-20 |
EP0702293B1 (en) | 2001-12-12 |
KR100226233B1 (ko) | 1999-10-15 |
DE69524511D1 (de) | 2002-01-24 |
EP0702293A2 (en) | 1996-03-20 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
JP3606387B2 (ja) | コンパイル装置 | |
US6662354B1 (en) | Determining destinations of a dynamic branch | |
US4710872A (en) | Method for vectorizing and executing on an SIMD machine outer loops in the presence of recurrent inner loops | |
US6286135B1 (en) | Cost-sensitive SSA-based strength reduction algorithm for a machine with predication support and segmented addresses | |
JP3220055B2 (ja) | 機械語命令列またはアセンブリ言語命令列を最適化する最適化装置、及び、高級言語で記載されたソースプログラムを機械語またはアセンブリ言語の命令列に変換するコンパイラ装置。 | |
US7725883B1 (en) | Program interpreter | |
US7308680B2 (en) | Intermediate representation for multiple exception handling models | |
JP3650649B2 (ja) | 最適化装置 | |
US20080178149A1 (en) | Inferencing types of variables in a dynamically typed language | |
US7917899B2 (en) | Program development apparatus, method for developing a program, and a computer program product for executing an application for a program development apparatus | |
US5923883A (en) | Optimization apparatus which removes transfer instructions by a global analysis of equivalence relations | |
JPH06324881A (ja) | メモリデータの重なり判定機能を備えたコンパイラ装置 | |
CN102099786A (zh) | 程序优化方法 | |
JP6845429B2 (ja) | コンパイラプログラム、情報処理装置およびコンパイル方法 | |
CN108027748A (zh) | 指令集模拟器及其模拟器生成方法 | |
US20010044930A1 (en) | Loop optimization method and a compiler | |
EP1202171A2 (en) | Compile method and program recording medium | |
Olschanowsky et al. | Pir: Pmac's idiom recognizer | |
Wang et al. | Capitalizing on live variables: new algorithms for efficient Hessian computation via automatic differentiation | |
Goubault | Generalized boxings, congruences and partial inlining | |
JP2017033342A (ja) | コンパイル装置、コンパイル方法およびコンパイルプログラム | |
JPWO2017204139A1 (ja) | データ処理装置、データ処理方法、およびプログラム記録媒体 | |
Sharma et al. | Can we run in parallel? Automating loop parallelization for TornadoVM | |
JP2006202134A (ja) | プロファイル情報収集方法および装置 | |
Bransen | On the Incremental Evaluation of Higher-Order Attribute Grammars |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
A131 | Notification of reasons for refusal |
Free format text: JAPANESE INTERMEDIATE CODE: A131 Effective date: 20040706 |
|
A521 | Request for written amendment filed |
Free format text: JAPANESE INTERMEDIATE CODE: A523 Effective date: 20040827 |
|
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: 20040928 |
|
A61 | First payment of annual fees (during grant procedure) |
Free format text: JAPANESE INTERMEDIATE CODE: A61 Effective date: 20040930 |
|
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 |