JPH09198254A - コンパイラの最適化装置及びその方法 - Google Patents

コンパイラの最適化装置及びその方法

Info

Publication number
JPH09198254A
JPH09198254A JP8005908A JP590896A JPH09198254A JP H09198254 A JPH09198254 A JP H09198254A JP 8005908 A JP8005908 A JP 8005908A JP 590896 A JP590896 A JP 590896A JP H09198254 A JPH09198254 A JP H09198254A
Authority
JP
Japan
Prior art keywords
variable
loop
function
syntax
invariant
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.)
Pending
Application number
JP8005908A
Other languages
English (en)
Inventor
Shinji Hirai
真二 平井
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
NEC IC Microcomputer Systems Co Ltd
Original Assignee
NEC IC Microcomputer Systems Co Ltd
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by NEC IC Microcomputer Systems Co Ltd filed Critical NEC IC Microcomputer Systems Co Ltd
Priority to JP8005908A priority Critical patent/JPH09198254A/ja
Priority to EP97100474A priority patent/EP0785506A1/en
Priority to US08/783,061 priority patent/US5862384A/en
Publication of JPH09198254A publication Critical patent/JPH09198254A/ja
Pending legal-status Critical Current

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/44Encoding
    • G06F8/443Optimisation

Landscapes

  • Engineering & Computer Science (AREA)
  • General Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Software Systems (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Devices For Executing Special Programs (AREA)

Abstract

(57)【要約】 【課題】ループ内で関数呼出しを含む原始プログラム中
のループ内不変式をループの外に移動することにより実
行速度の速いコードを生成する。 【解決手段】コード最適化手段3が、ループ内不変式に
含まれる関数毎に更新変数を抽出し更新変数管理テーブ
ル300に登録する更新変数抽出手段4と、呼出元関数
による他関数の呼出時に呼出先で更新される変数を更新
変数として更新変数管理テーブル300に登録する更新
変数見直し手段5と、更新変数の更新変数管理テーブル
300の参照による認識に基づきループ内不変式を抽出
してループ外に移動する参照ループ内不変式移動手段6
とを備える。

Description

【発明の詳細な説明】
【0001】
【発明の属する技術分野】本発明はコンパイラの最適化
装置及びその方法に関し、特に特にループ内不変式の移
動の最適方式を有するコンパイラの最適化装置及びその
方法に関する。
【0002】
【従来の技術】一般に、コンパイラは、プログラム記述
用言語の翻訳プログラムとしてソフトウェア開発の分野
において広く用いられており、より速い実行速度のオブ
ジェクトコードを生成するために様々な最適化手法が考
案されている。その一つにループ内不変式の移動があ
る。
【0003】一般に、プログラム記述用言語の多くはル
ープ文と呼ぶ反復処理の記述を許しているが、プログラ
ム記述者はプログラムの可読性を重視するためループ内
で反復処理しても結果が変化しない式すなわちループ内
不変式を記述する場合があり、このような式は一回処理
すればよいので、ループ文の外に出すことができる。こ
のようなプログラム記述者が記述したループ内不変式を
コンパイル時にループ文の外に移動することにより、無
駄な繰り返しを行わず、より速い実行速度のコードを生
成する最適化手法がループ内不変式の移動である。
【0004】しかしながら、一般にプログラム記述用言
語ではモジュール化設計を考慮し、一連の処理を関数と
呼ぶ機能単位でまとめ、この関数をプログラム中から任
意に呼び出せる仕様が殆どである。従来の処理ではルー
プ内で関数呼出しを行うと、関数内でどの変数が変化し
ているか認識できなかったため結果が変化しない式を判
別することが出来ず、関数呼出しを含むループ文のルー
プ内不変式の移動は不可能であった。
【0005】また、プログラム記述用言語では条件文と
呼ぶ条件式による分岐実行処理の記述を許しているが、
条件によっては実行しない分岐処理の可能性があるの
で、条件文中の式は移動しないのが一般である。
【0006】A.V.エイホ,J.D.ウルマン著/土
井範久訳,コンパイラ(情報処理シリーズ7),培風
館,昭和61年(文献1)第5〜7頁および図1.2記
載の従来のこの種のコンパイラの最適化装置をブロック
で示す図12を参照すると、この従来のコンパイラの最
適化装置は、原始プログラムを字句に分解する字句解析
手段1と、字句解析結果を受けて構文を構築しこの構文
を認識する構文解析手段2と、構文解析結果を受けてル
ープ内不変式をループの外に移動するループ内不変式移
動手段131を含むコード最適化手段103と、最適化
結果を受けてオブジェクトコードを生成するコード生成
手段7とを備える。
【0007】次に、図12を参照して、従来のコンパイ
ラの最適化装置の動作について説明すると、字句解析手
段1は、外部から原始プログラムの供給を受けこの原始
プログラムを字句に分解する字句解析を行う。構文解析
手段2は、字句解析手段1の字句解析結果を受けて、構
文を構築しその構文を認識する。次にコード最適化手段
103の1構成要素であるループ内不変式移動手段13
1は構文解析結果を受けて、ループ内で移動可能な不変
式すなわちループ内不変式をループの外に移動する。最
後にコード生成手段7は、最適化結果を受けて、オブジ
ェクトコードを生成する。
【0008】次に、ループ内不変式移動手段131の処
理手順の一例をフローチャートで示す図13を参照する
と、ループ内不変式移動手段131は、各ループ中の不
変変数を抽出し、参照代入および反復処理による値の変
化の有無を調べ、ループ中変数状態テーブルに登録する
処理を行う。そして、その情報を元に不変式を検出し
て、この不変式をループの外に移動する処理を行う。
【0009】まず、図13(B)を参照してこの手順に
おいて生成するループ中変数状態テーブル410の構成
を説明すると、このループ中変数状態テーブル410
は、ループ文中の各式を構成する各変数の変数名を記入
する変数名411と、その変数が参照されている場合に
1を記入する参照412と、代入されている場合に1を
記入する代入413と、代入される変数で反復処理毎に
値が変化する可能性のある場合に1を記入する変更41
4との4つの領域から成る。
【0010】図13(A)を参照して処理手順について
説明すると、まず、構文ファイルのオープン処理ステッ
プP1で、構文ファイルをオープンする。次に1行分の
構文読み込み処理ステップP2で、1行文の構文を読み
込む。次に構文ファイルの終了判定処理ステップP3
で、構文ファイルが終了であるか否かを判定する。構文
ファイルの終了であれば、構文ファイルクローズ処理ス
テップP9で構文ファイルをクローズして、この処理ス
テップを終了する。構文ファイルの終了でなければ、ル
ープ文先頭判定処理ステップP4で、読み込んだ構文が
ループ文の先頭であるか否かを判定する。ループ文の先
頭でなければステップP2に戻る。ループ文の先頭であ
れば、関数呼出しフラグFを0に設定する処理ステップ
P101でループ文中で関数呼出しが行われているか否
かの認識用のフラグFを0で初期化する。
【0011】次に、ループ中変数状態テーブル初期化処
理ステップP5で、変数名411,参照412,代入4
13,変更414から成るループ中変数状態テーブル4
10の全ての領域を0で初期化する。次に、不変数検出
処理ステップP6で、ループ文中で反復処理しても値の
変わらない変数すなわち不変数を検出する。このP6で
は、ループ文中の各式において、その式を構成する各変
数に対し、参照及び代入の有無を調べ、それぞれループ
中変数状態テーブル410の変数名411,参照41
2,代入413に記入し、参照の後に代入の行われる変
数は反復処理の1回目と2回目以降では値が変わるの
で、変更414にも記入する。
【0012】次に、不変変数検出処理ステップP6の処
理内容をフローチャートで示す図14を参照して処理手
順について説明すると、まず、ステップP61で条件文
処理中であることの認識用フラグIを0で初期化する。
次に、1行文の構文読み込み処理ステップP62で1行
分の構文を読み込む。次にステップP63で、読み込ん
だ構文がループ文の終了を示す文であるか否かを判定す
る。ループ文の終了を示す文であれば、この不変変数検
出処理ステップP6を終了する。
【0013】ステップP63でループ文の終了でなけれ
ば、ステップP64で読み込んだ構文が関数呼出し文で
あるか否かを判定する。関数呼出し文であれば、ループ
内不変式の移動は行えないので、ステップP201で、
ループ文中に関数呼出しを行っているか否かを認識する
ためにフラグFを1に設定して、この不変変数検出処理
ステップP6を終了する。
【0014】ステップP64で関数呼出し文でなけれ
ば、ステップP65で読み込んだ構文が条件文の先頭の
文であるか否かを判定する。条件文の先頭の文でなけれ
ば、条件文終了判定処理ステップP66へ処理を進め
る。条件文の先頭の文であれば条件文中の式は実行され
ない可能性があるので、ステップP71で条件文処理中
であることを示すフラグIを1増やす。
【0015】次に、ステップP66で、読み込んだ構文
が条件文の終了の文であるか否かを判定する。条件文の
終了の文でなければ、参照式フラグSを0に設定する処
理ステップP67へ処理を進める。条件文の終了の文で
あれば、条件文処理中フラグIを1減らす処理ステップ
P72で、条件文処理中であることを認識するためのフ
ラグIを1減らす。
【0016】次に、処理ステップP67で、現在処理中
の構文が参照のみの式あることを認識するためのフラグ
Sを0で初期化する。
【0017】次に、参照のみの式判定処理ステップP6
8で、読み込んだ構文が参照のみの式であるか否かを判
定する。参照のみの式であれば、代入される変数が含ま
れないので、参照式フラグSを1に設定する処理ステッ
プP73で、代入式に対する処理が必要か否かを判定す
るための参照式フラグに1を設定し、式中の参照対象の
変数の数をNに設定する処理ステップP75以降で、ル
ープ中変数状態テーブル410への登録および式中の各
変数に対する参照,代入,変更の各情報を記入するルー
プ中変数状態テーブル設定処理処理を行なう。
【0018】ステップP68で参照のみの式でなけれ
ば、代入文判定処理ステップP69で、読み込んだ構文
が変数への代入対象文であるか否かを判定する。変数へ
の代入対象文でなければ、ステップP62に戻る。変数
への代入対象文であれば、ステップP75以降で、ルー
プ中変数状態テーブル設定処理を行う。
【0019】このループ中変数状態テーブル設定処理
は、まず、不変変数検出処理の未了の変数の数を確認す
るため、式中の参照される変数の数をNに設定する処理
ステップP75で、代入元式中の参照対象の変数の数を
カウンタNに設定する。次に、カウンタNが0であるか
否かの判定処理ステップP76で、カウンタNが0か否
かを判定する。0でなければ、N番目の変数は不変変数
検出処理が未了であるので、ループ中変数状態テーブル
に登録済みであるか否かの判定処理ステップP77で、
変数名411にN番目の変数の変数名が登録済みである
か否かの判定を行う。登録されていれば、N番目の変数
の変数名に対する参照に1を記入する処理ステップP7
8へ処理を進める。登録されていなければ、ループ中変
数状態テーブルに登録する処理ステップP85で、変数
名411に、N番目の変数の変数名を登録する。
【0020】次に、ステップP78で、N番目の変数の
変数名に対する参照412に1を記入する。
【0021】次に、カウンタNを1減らす処理ステップ
P79で、カウンタNを1減らし、ステップP76に戻
り、カウンタNが0になるまで、残りの変数に対して処
理を反復する。カウンタNが0の時は、不変変数検出処
理を未了の変数がないので、参照式フラグSが0である
か否かの判定処理ステップP80で、参照式フラグSが
0であるか否かの判定を行なう。0でなければ、現在処
理中の構文は参照のみの式であるので代入文に対する処
理は行なわず、ステップP62に戻る。0であれば、代
入先変数名がループ中変数状態テーブルに登録済みであ
るか否かの判定処理ステップP81で、変数名411に
代入先変数名が登録されているか否かを判定する。登録
されていれば、条件文処理中フラグIが0であるか否か
の判定処理ステップP82へ処理を進める。登録されて
いなければ、代入先変数の変数名をループ中変数状態テ
ーブルに登録する処理ステップP86で、変数名411
に代入先変数名を登録する。
【0022】次にステップP82で、条件文処理中フラ
グIが0であるか否かの判定を行なう。0でなければ、
その構文は条件文処理中であるので、式の移動を行わな
いために、代入先変数の変数名に対する変更に1を記入
する処理ステップP87で、代入先変数の変数名に対す
る変更414に1を記入し、ステップP62に戻る。条
件文処理中フラグIが0であれば、次に代入先変数の変
数名に対する参照または代入が1であるか否かの判定処
理ステップP83で、代入先の変数名に対する参照41
2または代入413に1が記入されているか否かの判定
を行う。記入されていれば、この変数は反復処理の1回
目と2回目以降で、値が変わる可能性があるので、上記
変数を含む式を移動しないためステップP87で、代入
先変数の変数名に対する変更414に1を記入し、ステ
ップP62に戻る。記入されていなければ、代入先の変
数の変数名に対する代入に1を記入する処理ステップP
84で、代入先変数の変数名に対する代入413に1を
記入し、ステップP62に戻る。
【0023】ループ文の終わりに到達するまで、以上の
ループ内不変変数検出処理ステップを反復する。
【0024】以上の処理をループ文の終わりまで反復
し、ステップP6を終了して図13に戻る。
【0025】図13において、ステップP6の不変変数
検出後、関数呼出しフラグFが1であるか否かの判定処
理ステップP102を行う。1であれば、ループ処理中
で関数呼出しが行われているため、不変式の移動を行え
ないのでステップP2に戻る。1でなければ、構文ファ
イル位置をループの先頭に戻す処理ステップP7で構文
ファイルの読み込み位置をループの先頭の位置に戻す。
【0026】次に不変式移動処理ステップP8で、ルー
プ中変数状態テーブル410を参照し、反復処理で値の
変わる変数を含む代入式の代入先変数も含めて、値の変
わらない式のみで構成される不変式をループの外に移動
する。
【0027】不変式移動処理ステップP8の処理内容を
フローチャートで示す図15を参照して処理手順につい
て説明すると、まず、1行分の構文読み込み処理ステッ
プP91で、1行文の構文を読み込む。
【0028】次に、ループ文終了判定処理ステップP9
2で読み込んだ構文がループ文の終了の文であるか否か
を判定する。ループ文の終了の文であれば、不変式移動
処理を終了する。ループ文の終了の文でなければ、代入
文判定処理ステップP93で、読み込んだ構文が代入文
であるか否かを判定する。代入文でなければ、ステップ
P91に戻る。代入文であれば、代入文を構成する全て
の変数の変数名に対する変更が0でないか否かの判定処
理ステップP94で、変更414を参照して、全ての変
数の変更が0であるか否かの判定を行う。
【0029】ステップP94で全ての変数の変更が0で
あれば、この代入文の結果は反復処理において変わらな
いので、代入文をループの外に移動する処理ステップP
95で、この代入文の構文をループ文の外に移動し、ス
テップP91に戻る。
【0030】ステップP94で変更が0でない変数があ
る場合は、その代入先変数の値も変わるので、代入先変
数の変数名に対する変更に1を記入する処理ステップP
96で、代入先変数の変数名に対応する変更414に1
を記入しステップP91に戻る。
【0031】そして、ループ文の終了に到達するまで、
不変式移動処理を反復する。
【0032】不変式を移動した後に、図13のステップ
P2に戻る。
【0033】そして、構文ファイルの終了に到達するま
で、ループ内不変式お移動手段の処理ステップを反復す
る。
【0034】従来のコンパイラに、図7に示す関数呼出
しを含むループ文で構成される原始プログラム1001
を入力した場合のループ内不変式移動結果の一例を示す
図16(A)を参照すると、原始プログラム1001の
ループブロック1005のループ内不変式移動結果は構
文1601となる。
【0035】また、図11に示す非同期に動作する割込
関数(非同期割込関数)の定義を含む原始プログラム1
101を入力した場合のループ内不変式移動結果の一例
を示す図16(A)を参照すると、原始プログラム11
01のループブロック1105のループ内不変式移動結
果は構文1701となる。
【0036】なお、非同期割込関数の定義を含む原始プ
ログラムに対して、ループ内不変式の移動を行なうと、
誤った移動を行なうことがあるので、図16(B)のル
ープ内不変式移動結果の構文1701は、ループ内不変
式の移動を抑制した場合の結果を示す。
【0037】なお、上述のループ最適化に関しては、文
献1の第398〜429頁の記載を参照している。
【0038】
【発明が解決しようとする課題】上述した従来のコンパ
イラの最適化装置及びその方法は、ループ内で関数呼出
しが行なわれていると、関数内でどの変数か変化してい
るのか認識できないことにより不変式の判別ができない
ため、ループ内不変式の移動がいっさい行なわれないと
いう欠点があった。
【0039】また、非同期割込関数が原始プログラムに
含まれる場合は、更新対象の変数を不変式の検出の際に
認識していないため上記変数を含むループ内の不変式を
誤ってループ外に移動してしまうので、ループ内不変式
移動の最適化を抑制しなければならないという欠点があ
った。
【0040】本発明の目的は、上記の問題点を解決し、
ループ内で関数呼出しが行なわれる場合および原始プロ
グラムに非同期に動作する割込関数を含む場合でも、ル
ープ文内の不変式の移動を可能にすることにより、生成
オブジェクトの実行速度を向上することができるコンパ
イラの最適化装置及びその方法を提供することにある。
【0041】
【課題を解決するための手段】本発明のコンパイラの最
適化装置は、入力した原始プログラムを字句に分解し字
句解析結果を出力する字句解析手段と、前記字句解析結
果の供給を受けて構文を構築しこの構文を認識して構文
解析結果を出力する構文解析手段と、前記構文解析結果
の供給を受けて不要な構文の削除処理とループ処理構文
中のループ処理に影響を受けない構文であるループ内不
変式をこのループ処理構文の外に移動するループ内不変
式移動処理とを含む最適化処理を行い最適化結果を出力
するコード最適化手段と、前記コード最適化結果の供給
を受けて翻訳対象プロセッサ用のオブジェクトコードを
生成するコード生成手段とを備えるコンパイラの最適化
装置において、前記コード最適化手段が、前記ループ内
不変式に含まれる関数毎に更新対象の変数である更新変
数を抽出しこの更新変数を管理するための更新変数管理
テーブルに登録する更新変数抽出手段と、任意の呼出元
関数による他関数の呼出時に呼出先で更新される変数を
前記呼出元関数で更新される更新変数として前記更新変
数管理テーブルに登録する更新変数見直し手段と、前記
更新変数の前記更新変数管理テーブルの参照による認識
に基づき前記ループ内不変式を抽出してループ外に移動
する更新変数参照ループ内不変式移動手段とを備えて構
成されている。
【0042】本発明のコンパイラの最適化方法は、入力
した原始プログラムを字句に分解し字句解析結果を出力
する字句解析ステップと、前記字句解析結果の供給を受
けて構文を構築しこの構文を認識して構文解析結果を出
力する構文解析ステップと、前記構文解析結果の供給を
受けて不要な構文の削除処理とループ処理構文中のルー
プ処理に影響を受けない構文であるループ内不変式をこ
のループ処理構文の外に移動するループ内不変式移動処
理とを含む最適化処理を行い最適化結果を出力するコー
ド最適化ステップと、前記コード最適化結果の供給を受
けて翻訳対象プロセッサ用のオブジェクトコードを生成
するコード生成ステップとを含るコンパイラの最適化方
法において、前記コード最適化ステップが、前記ループ
内不変式に含まれる関数毎に更新対象の変数である更新
変数を抽出しこの更新変数を管理するための更新変数管
理テーブルに登録する更新変数抽出処理ステップと、任
意の呼出元関数による他関数の呼出時に呼出先で更新さ
れる変数を前記呼出元関数で更新される更新変数として
前記更新変数管理テーブルに登録する更新変数見直し処
理ステップと、前記更新変数の前記更新変数管理テーブ
ルの参照による認識に基づき前記ループ内不変式を抽出
してループ外に移動する更新変数参照ループ内不変式移
動処理ステップとを含むことを特徴とするものである。
【0043】
【発明の実施の形態】次に、本発明のコンパイラの最適
化装置の実施の形態を図12と共通の構成要素は共通の
文字を付して同様にブロックで示す図1を参照すると、
この図に示す本実施の形態のコンパイラの最適化装置
は、従来と共通の字句解析手段1と、構文解析手段2
と、コード生成手段7とに加えて、コード最適化手段1
03の代りに更新変数抽出手段4と更新変数見直し手段
5と参照ループ内不変式移動手段6とを含むコード最適
化手段3を備える。
【0044】更新変数抽出手段4は各関数毎に更新され
る変数を抽出し後述する更新変数管理テーブル300に
登録する。
【0045】更新変数見直し手段5は任意関数(呼出元
関数)による他関数呼出時に呼出先で更新される変数
も、呼出元関数で更新される変数として更新変数管理テ
ーブル300に登録する。
【0046】参照ループ内不変式移動手段6は、非同期
割込関数や呼出関数で更新される変数を更新変数管理テ
ーブル300の参照による認識に基づき不変式を抽出し
てループ外に移動する。
【0047】次に、図1を参照して本実施の形態の動作
について説明すると、従来と同様に字句解析手段1,構
文解析手段2は、外部から原始プログラムの供給を受け
この原始プログラムを字句に分解する字句解析し、その
結果から構文を構築しその構文を認識する。次に構文認
識結果を受けて最適化手段3は、まず、更新変数抽出手
段4が各関数毎に更新される変数を抽出し、更新変数管
理テーブル300に登録する。次に、更新変数見直し手
段5は、任意関数(呼出元関数)Aが別の関数(呼出先
関数)Bを呼出す場合に、呼出先で更新される変数も呼
出元関数Aで更新される変数として更新変数管理テーブ
ル300に登録する。参照ループ内不変式移動手段6
は、非同期割込関数が定義されていたり、ループ処理構
文中に呼出関数の存在があっても、これら非同期割込関
数や呼出関数で更新される変数を、更新変数抽出手段
4,更新変数見直し手段5により生成された更新変数管
理テーブル300を参照することによって認識し、その
情報を基に不変式を抽出し、この不変式をループ外に移
動し、最適化結果をコード生成手段7に供給する。最後
にコード生成手段7は、最適化手段3の最適化結果を受
けて、翻訳対象プロセッサ用のオブジェクトコードを生
成する。
【0048】次に、図1,図2,図3,及び図4を参照
して、本実施の形態を特徴ずける最適化手段3の各構成
要素の更新変数抽出手段4,更新変数見直し手段5,及
び参照ループ内不変式移動手段6の処理手順の内容につ
き説明する。
【0049】更新変数抽出手段4の処理手順の一例をフ
ローチャートで示す図2を参照すると、更新変数抽出手
段4は、各関数毎に、代入文により更新される変数名、
及び関数呼出し文により呼出される関数名を抽出し、更
新変数管理テーブル300に登録する処理を行う。
【0050】まず、図2(B)を参照してこの手順にお
いて生成する更新変数管理テーブル300の構成を説明
すると、この更新変数管理テーブル300は、更新変数
管理テーブルの位置を示す位置301と、更新対象変数
名及び呼出される関数(呼出関数)名を調べる関数の名
称を示す関数名302と、関数名302所属の関数にお
いて更新対象の全ての変数名を示す変数名303と、関
数名302所属の関数において関数の呼出しがあった場
合にその全ての関数名を示す呼出し関数名304との4
つの領域から成る。
【0051】図2(A)を参照して処理手順について説
明すると、まず、構文ファイルのオープン処理ステップ
S1で、構文解析手段2により構文解析結果を示す構文
ファイルをオープンし、この情報を読出できるようにす
る。次に、更新変数管理テーブル初期化処理ステップS
2で、更新変数管理テーブル300の位置301,関数
名302,変数名303,呼出し関数名304の全領域
を0で初期化する。次に、位置Iを1に設定する処理ス
テップS3で、変数Iを1に初期化する。次に、1行分
の構文読み込み処理ステップS4で1行分の構文を読み
込む。次に、構文ファイルの終了判定処理ステップS5
で、構文ファイルが終了であるか否かを判定する。構文
ファイルの終了であれば、構文ファイルのクローズ処理
ステップS12で構文ファイルをクローズして、更新変
数抽出手段の処理ステップを終了する。
【0052】ステップS5で、構文ファイルの終了でな
ければ、関数先頭文判定処理ステップS6で、読み込ん
だ構文が関数の先頭の文であるか否かを判定する。関数
の先頭の文でなければ1行分の構文読み込み処理ステッ
プS4に戻る。関数の先頭文であれば、関数名を位置I
の関数名に登録する処理ステップS7で、位置301の
I番目の関数名302に、その関数名を登録する。
【0053】次に、1行分の構文読み込み処理ステップ
S8で1行分の構文を読み込む。次に、関数終了判定処
理ステップS9で、読み込んだ構文が関数の終了の文か
否かを判定する。関数の終了の文であれば、位置Iを1
増やす処理ステップS13で、変数Iを1増やし、ステ
ップS4に戻る。
【0054】関数の終了文でなければ、代入文判定処理
ステップS10で、読み込んだ構文が代入文であるか否
かを判定する。代入文でなければ、関数呼出し文判定処
理ステップS11へ処理を進める。代入文であれば、代
入先変数名が位置Iの変数名に登録済みであるか否かの
判定処理ステップS14で、代入先変数名が位置301
のI番目の変数名303に、既に登録されているか否か
を判定する。登録されていれば、ステップS11へ処理
を進める。登録されていなければ、位置Iの変数名に代
入先変数名を登録する処理ステップS16で、位置30
1のI番目の変数名303に代入先変数名を登録し、ス
テップS11へ処理を進める。
【0055】次に、ステップS11で、読み込んだ構文
が関数の呼出し文であるか否かを判定する。関数の呼出
し文でなければステップS8へ戻る。関数の呼出し文で
あれば、呼出し関数名が位置Iの呼出し関数名に登録済
みであるか否かの判定処理ステップS15で、呼出し関
数名が位置301のI番目の呼出し関数名304に登録
されているか否かを判定する。登録されていればステッ
プS8に戻る。登録されていなければ、位置Iの呼出し
関数名に登録する処理ステップS17で、位置301の
I番目に対する呼出し関数名304に呼出し関数名を登
録し、ステップS8に戻る。
【0056】構文ファイルの終了に到達するまで、以上
の更新変数抽出手段の処理ステップを反復する。
【0057】更新変数見直し手段5の処理手順の一例を
フローチャートで示す図3を参照すると、更新変数見直
し手段5は、更新変数抽出手段4で生成した更新変数管
理テーブル300を読込み、ある関数が別の関数を呼出
す場合に、呼出し先で更新される変数も、呼出し元の関
数で更新される変数として、更新変数管理テーブル30
0を修正する処理を行う。
【0058】次に、図3を参照して更新変数見直し手段
5の処理手順について説明すると、まず、更新変数管理
テーブル位置Iを1に設定する処理ステップS21で、
変数Iを1に初期化する。次に、テーブルの終了判定処
理ステップS22で、位置301のI番目の関数名30
2が0か否かを判定する。0であれば、更新変数見直し
手段を終了する。0でなければ、位置Iを引数に設定す
る処理ステップS3で、位置を示す変数Iを引数に設定
し、関数集計処理部呼出し処理ステップS24で、関数
集計処理を行うサブルーチンを呼出す。
【0059】次に、更新変数管理テーブル位置Iを1増
やす処理ステップS25で、変数Iを1増やし、ステッ
プS22に戻る。
【0060】以上の処理をテーブルの終了まで繰り返
す。次に、ステップS24で呼出した関数集計処理のサ
ブルーチンについて説明する。
【0061】関数集計処理のサブルーチンでは、引数を
Pで受け取る処理ステップS26で位置を示す引数を変
数Pで受け取る。次に、位置P登録の呼出し関数名の数
をNに設定する処理ステップS27で、位置301のP
番目の呼出し関数名304に登録されている関数名の数
をカウンタNに設定する。
【0062】次に、カウンタNが0か否かの判定処理ス
テップS28で、カウンタNが0か否かの判定を行な
う。0であれば、関数集計処理のサブルーチンを終了す
る。0でなければ、位置PのN番目の呼出し関数名を取
得し、その関数名の位置をJに設定する処理ステップS
29で、位置301のP番目の呼出し関数名304に登
録されているN番目の呼出し関数名を取得して、その関
数名が関数名302に登録されている位置301の値を
Jに設定する。
【0063】次に、位置PのN番目の呼出し関数を消去
する処理ステップS30で、位置301のP番目の呼び
出し関数名304のN番目に登録されている呼出し関数
名を消去する。
【0064】次に、Jを引数に設定する処理ステップS
31で、変数Jを引数に設定し、関数集計部呼出し処理
ステップS32で、関数集計を行なうサブルーチンを再
帰呼出しする。
【0065】次に、位置Pの変数名に位置Jの変数名を
追加登録する処理ステップS33で、位置301のJ番
目に対する変数名303に登録されている変数名を、位
置301に対するP番目の変数名303に追加登録す
る。
【0066】次に、カウンタNを1減らす処理ステップ
S34で、カウンタNを1減らし、ステップS28に戻
る。
【0067】以上の処理をカウンタNが0になるまで反
復する。
【0068】次に、参照ループ内不変式移動手段6の処
理手順の一例を示すフロチャートである図4を参照する
と、参照ループ内不変式移動手段6は、上述したように
ループ処理構文中に関数の呼出しの存在があっても、こ
れらの関数で更新される変数を、更新変数抽出手段4,
更新変数見直し手段5により生成された更新変数管理テ
ーブルを参照することによって認識し、その情報を基に
不変式を抽出して、この不変式をループの外に移動する
処理を行う。
【0069】まず、この手順において生成し、変数名4
11,参照412,代入413,変更414から成るル
ープ中変数状態テーブル410は従来の技術で説明した
ものと同様であるので説明を省略する。
【0070】図4を参照して処理手順について説明する
と、まず、構文ファイルのオープン処理ステップS41
で構文ファイルをオープンする。次に1行分の構文読み
込み処理ステップS42で1行文の構文を読み込む。次
に構文ファイルの終了判定処理ステップS43で、構文
ファイルが終了であるか否かを判定する。構文ファイル
の終了であれば、構文ファイルのクローズ処理ステップ
S43で構文ファイルをクローズして、参照ループ内不
変式移動手段の処理ステップを終了する。構文ファイル
の終了でなければ、ループ文先頭判定処理ステップS4
4で、読み込んだ構文がループ文の先頭であるか否かを
判定する。ループ文の先頭でなければステップS42に
戻る。 ループ文の先頭であれば、ループ中変数状態テ
ーブルを0で初期化する処理ステップS45で、ループ
中変数状態テーブル410の全領域を0で初期化する。
【0071】次に不変変数検出処理ステップS46で、
ループ文中で反復処理しても値の変わらない変数を検出
する。ステップS46では、ループ文中の各式におい
て、その式を構成する各変数に対し、参照,代入の有無
を調べ、それぞれ変数名411,参照412,代入41
3に記入し、参照412の後に代入の行われる変数は反
復処理の1回目と2回目以降では値が変わるので、変更
414にも記入する。
【0072】次に、不変変数検出処理ステップS46の
処理手順を従来の不変数検出処理ステップを示す図14
と共通の処理は共通の文字を付して同様にフロチャート
で示す図5を参照すると、このステップS46は、関数
呼出し判定処理ステップP64で関数呼出し文である場
合に、従来のステップP201の代りに、更新変数管理
テーブルを参照してループ中変数状態テーブルを更新す
る処理ステップS70を行うことが従来との相違点であ
る。
【0073】まず、従来と共通のステップP61〜P6
3で条件文処理中であることを認識するためのフラグI
を0で初期化し、1行文の構文を読み込み、読み込んだ
構文がループ文の終了を示す文であるか否かを判定す
る。ループ文の終了であれば、不変変数検出処理を終了
する。ループ文の終了でなければ、ステップP64で、
読み込んだ構文が、関数呼出し文であるか否かを判定す
る。関数呼出し文でなければ、条件文先頭判定処理ステ
ップP65へ処理を進める。関数呼出し文であれば、更
新変数管理テーブルを参照してループ中変数状態テーブ
ルを更新する処理ステップS70で、更新変数管理テー
ブル300を参照し、その関数で更新される変数のう
ち、ループ中変数状態テーブル410の変数名411に
登録されていないものを登録し、同時に変更414に1
を記入する。
【0074】次に、従来と共通のステップP65〜P8
7を実行し、ループ文の終わりに到達するまで、以上の
ループ内不変変数検出処理ステップを反復し、この不変
変数検出処理ステップS46を終了する。
【0075】再度図4を参照すると、構文ファイル位置
をループの先頭に戻す処理ステップS47で構文ファイ
ルの読み込み位置をループの先頭の位置に戻す。
【0076】次に不変式移動処理ステップS48で、ル
ープ中変数状態テーブル410を参照し、繰り返し処理
で値の変わる変数を含む代入式の代入先変数も含めて、
値の変わらない式のみで構成される不変式をループの外
に移動する。
【0077】次に、不変式移動処理ステップS48の処
理手順を従来の不変式移動処理ステップを示す図15と
共通の処理は共通の文字を付して同様にフロチャートで
示す図6を参照すると、このステップS48は従来のス
テップP8と同一であるので処理の細部の説明は省略す
る。
【0078】従来と共通のステップP91〜P96の処
理を実行し、ループ文の終了に到達するまで反復する。
【0079】ステップS48の不変式移動処理終了後
に、図4のステップS42に戻る。
【0080】そして、構文ファイルの終了に到達するま
で、参照ループ内不変式の移動手段の処理ステップを反
復する。
【0081】次に、関数呼出しを含むループ文で構成さ
れる原始プログラムと本実施の形態で生成する更新変数
管理テーブル300A,310Aとループ中変数状態テ
ーブル410Aの各処理ステップの過程を示す図7,図
8を併せて参照して本実施の形態のコンパイラの最適化
方法について詳細に説明する。
【0082】最初に図2を再度参照して、更新変数抽出
手段4の処理ステップを説明する。
【0083】まず、ステップS1で、図7(A)の原始
プログラム1001に対する構文ファイルをオープンす
る。次に、ステップS2で、位置301A,関数名30
2A,変数名303A,呼出し関数名304Aで構成さ
れる更新変数管理テーブル300Aの全ての領域を0で
初期化する。次に、ステップS3で、更新変数管理テー
ブル位置Iを1で初期化する。次に、関数先頭文100
3に到達するまでステップS4〜S6を反復する。
【0084】関数先頭文1003はステップS6で関数
先頭文と判定し、この関数名mainをステップS7で
更新変数管理テーブル300Aの位置301Aの1番目
対応の関数名302Aの欄に登録する。
【0085】次に、関数終了文1017に到達するま
で、ステップS8〜S11を反復する。
【0086】代入文1004,1007,1010,1
011,1013,1015は代入文であるため、ステ
ップS10で代入文と判定し、代入先変数名の位置Iの
変数名への登録の有無判定ステップS14を行なう。各
代入文1004,1007,1010,1011,10
13の代入先変数名は、位置301Aの1番目対応の変
数名303Aの欄には登録されていないので、ステップ
S16で、代入先変数名i,a,b,e,hをこの変数
名303Aの欄に登録する。代入文1015の代入先変
数名iは、変数名303Aの上記欄に既に登録済みであ
るため、登録は行なわない。
【0087】関数呼出し文1008,1009は、関数
呼出し文であるため、ステップS11で、関数呼出し文
と判定し、位置Iの呼出し関数名に既に登録済みか否か
の判定処理ステップS15を行なう。関数呼出し文10
08、1009の呼出し関数名は、位置301Aの1番
目対応の呼出し関数名304Aの欄には登録されていな
いので、ステップS17で、呼出し関数名func1,
func2を、呼出し関数名304Aの上記欄に登録す
る。
【0088】関数終了文1017に到達した時点で、ス
テップS9で関数終了文と判定し、ステップS13で、
位置Iを1増やし、構文ファイルの終了判定処理ステッ
プS4に戻る。
【0089】以後、関数先頭文1018,代入文101
9,関数呼出し文1020,関数終了文1021,関数
先頭文1022,代入文1023,関数終了文102
4,関数先頭文1025,代入文1026,関数終了文
1027に関しても同様の処理を行なう。関数終了文1
027の処理を終了後、ステップS4で1行文の構文を
読み込み、ステップS5で構文ファイルの終了と判定
し、ステップS12で構文ファイルをクローズして、こ
の一連の更新変数抽出手段の処理ステップを終了する。
【0090】以上の処理により生成した更新変数管理テ
ーブル300Aを図8(A)に示す。
【0091】次に、図3を再度参照して、更新変数見直
し手段5の処理ステップを説明する。
【0092】まず、更新変数管理テーブル位置Iを1に
設定する処理ステップS21を行なう。次に、ステップ
S22〜S25を、更新変数管理テーブル300Aの終
了まで繰り返す。
【0093】まず最初に、引数にIの値である1が設定
されて、関数集計処理のサブルーチンであるステップS
24を呼び出す。
【0094】このステップS24では、ステップS26
でPに引数の値1を設定する。次に、更新変数管理テー
ブル位置Pに登録されている呼出し関数名の数をNに設
定する処理ステップS27を行なう。位置301AのP
=1(番目)対応の呼出し関数名304Aの欄には、f
unc1,func2の2つの関数名が登録されている
ので、カウンタNには2を設定する。
【0095】次に、カウンタNが0であるか否かの判定
処理ステップS28を行なう。カウンタNは0ではない
ので、位置PのN番目の呼び出し関数を取得し、その関
数名の位置をJに設定する処理ステップS29を行な
う。Nの設定値は2であるので、位置301AのP=1
対応の呼出し関数名304Aの欄に登録のN=2の関数
名はfunc2であり、この関数名func2は位置3
01Aの3番目対応の関数名302Aに登録されている
ので、Jには3を設定する。
【0096】次に、ステップS30で、位置301Aの
P=1対応の呼出し関数名304Aの欄に登録されてい
るN=2番目の関数名func2を消去する。
【0097】次に、ステップS31で、引数にJの値で
ある3を設定する。
【0098】次に、ステップS32で、関数集計のサブ
ルーチンを再帰呼出しする。
【0099】関数集計のサブルーチンでは、ステップS
26で、Pに引数の値3を設定する。
【0100】次に、ステップS27を行う。位置301
AのP=3対応の呼出し関数名304Aの欄には関数名
が未登録であるので、カウンタNには0を設定する。次
に、判定処理ステップS28を行なう。カウンタNは0
なので、関数集計のサブルーチンを終了する。
【0101】P,N,Jは関数集計のサブルーチンの呼
出し前の値である、1,2,3に戻す。
【0102】次に、更新変数管理テーブル位置Jの変数
名に変数名を追加登録する処理ステップS33を行う。
位置301AのJ=3番目対応の変数名303Aの欄に
登録されている変数名hを、位置301AのP=1番目
対応の変数名303Aの欄に追加登録する処理を行なう
のだが、既に変数hは登録済みであるため、ここでは特
に何も行なわない。
【0103】次に、カウンタNを1減らす処理ステップ
S34により、Nが2であるので、カウンタNを1と
し、N=0の判定ステップS28に戻る。カウンタNは
0ではないので、更新変数管理テーブル位置PのN番目
の呼出し関数名を取得し、その関数名の位置をJに設定
する処理ステップS29を行う。位置301AのP=1
番目対応の呼出し関数名304Aの欄に登録のN=1の
関数名はfunc1で、この関数名func1は位置3
01Aの2番目対応の関数名302Aの欄に登録されて
いるので、Jには2を設定する。
【0104】次に、テップS30で、位置301AのP
=1対応の呼出し関数名304Aの欄に登録されたN=
1番目の関数名func1を消去する。
【0105】次に、ステップS31で、引数にJの値で
ある2を設定する。
【0106】次に、ステップS32で、関数集計のサブ
ルーチンを再帰呼出しする。
【0107】関数集計のサブルーチンでは、ステップS
26で、Pに引数の値2を設定する。次に、処理ステッ
プS27を行なう。位置301AのP=2対応の呼出し
関数名304Aの欄には、func3の1つの関数名が
登録されているので、Nには1が設定される。判定処理
ステップS28を行なう。Nは0ではないので、ステッ
プS29を行なう。位置301AのP=2対応の呼出し
関数名304Aの欄に登録されているN=1番目の関数
名はfunc3で、この関数名func3は位置301
AのP=4番目に対する関数名302Aの欄に登録済で
あるので、Jには4を設定する。
【0108】次に、ステップS30で、位置301Aの
P=2対応の呼出し関数名304Aの欄に登録のN=1
番目の関数名func3を消去する。
【0109】次に、ステップS31で、引数にJの値で
ある4を設定する。
【0110】次に、ステップS32で、関数集計のサブ
ルーチンを再帰呼出しする。
【0111】関数集計のサブルーチンでは、ステップS
26でPに引数の値4を設定する。
【0112】次に、ステップS27を行う。位置301
AのP=4対応の呼出し関数名304Aの欄には関数名
が登録されていないのでNには0を設定する。
【0113】次に判定処理ステップS28を行なう。カ
ウンタNは0なので、関数集計のサブルーチンを終了す
る。P,N,Jは関数集計のサブルーチンを呼び出す前
の値である、2,1,4に戻す。
【0114】次に、ステップS33で、位置301Aの
J=4対応の変数名303Aの欄に登録された変数名f
を、位置301AのP=2対応の変数名303Aの欄に
追加登録する。
【0115】次に、ステップS34により、Nが1であ
るのでカウンタNを0とし、判定処理ステップS28に
戻る。カウンタNは0なので、関数集計サブルーチンを
終了する。P,N,Jは関数集計のサブルーチンを呼び
出す前の値である、1,1,2に戻す。
【0116】次に、ステップS33で、位置301Aの
J=2対応の変数名303Aの欄に登録の変数名g,f
を位置301AのP=1対応の変数名303Aの欄に追
加登録する。次に、ステップS34により、Nが1であ
るのでカウンタNを0とし、判定処理ステップS34に
戻る。カウンタNは0なので、関数集計サブルーチンを
終了する。
【0117】次に、ステップS25で、Iが1であるの
で位置Iを2とし、テーブルの終了判定処理ステップS
22に戻る。
【0118】以後、同様にステップS23で、位置2,
3,4を引数に設定して、関数集計処理部の呼出し処理
ステップS24を反復し、更新変数見直し手段の処理ス
テップを終了する。
【0119】図8(B)に更新変数見直し手段の処理ス
テップを行った結果見直した更新変数管理テーブル30
0Bを示す。
【0120】次に、図4,図5,図6を再度参照して、
参照ループ内不変式移動手段6の処理ステップを説明す
る。
【0121】まず、構文ファイルのオープン処理ステッ
プS41で、原始プログラム1001に対する構文ファ
イルをオープンする。
【0122】次に、ループ先頭文1006に到達するま
で、1行文の構文読み込み処理ステップS42,構文フ
ァイルの終了判定処理ステップS43,ループ文先頭判
定処理ステップS44を繰り返す。
【0123】次に、ループ中変数状態テーブルを0で初
期化する処理ステップS45で、ループ中変数状態テー
ブル410Aの変数名411A,参照412A,代入4
13A,変更414Aの全領域を0で初期化する。
【0124】次に、不変変数検出処理ステップS46を
行なう。
【0125】図5を再度参照して不変変数検出処理ステ
ップS46の処理内容について説明すると、ステップP
61で、条件式処理中フラグIを0で初期化する。次
に、ループ終了文1016に到達するまで、1行文の構
文読み込み処理ステップP62,ループ文終了判定処理
ステップP63,関数呼出し文判定処理ステップP6
4,条件文先頭判定処理ステップP65,条件文終了判
定処理ステップP66,参照式フラグSを0に設定する
処理ステップP67、参照のみの式判定処理ステップP
68、代入文判定処理ステップP69を反復する。
【0126】代入文1007は、ステップP69で、代
入文と判定され、式中の参照される変数の数をNに設定
する処理ステップP85を行なう。代入文1007は、
定数の代入文で、参照される変数はないので、カウンタ
Nには0を設定する。次に、判定処理ステップP76を
行ない、カウンタNは0なので、判定処理ステップP8
0を行なう。参照式フラグSは0なので、代入先変数の
変数名の登録判定処理ステップP81を行なう。変数名
411Aには、代入文1007の代入先変数名aは登録
されていないので、テップP86で、代入先変数名aを
変数名411Aに登録する。
【0127】次に、条件文処理中フラグIが0であるか
否かの判定処理ステップP82を行なう。条件文処理中
フラグIは0なので、判定処理ステップP83を行な
う。変数名411Aの変数名aに対する参照412A,
代入413Aにはともに1が記入されていないので、ス
テップP84で、変数名411Aの変数名aに対する代
入413Aに1を記入する。
【0128】関数呼出し文1008は、ステップP64
で関数呼出し文と判定され、ステップP70で、関数呼
出し文1008の関数名func1を基に更新変数管理
テーブル300Bを参照し、関数名302Aのfunc
1に対応する変数名303Aの変数名g,fをループ中
変数状態テーブル410Aの変数名411Aに追加登録
し、同時にg,fに対する変更414Aにそれぞれ1を
記入する。
【0129】関数呼出し文1009も関数呼出し文10
08と同様の処理を行ない、変数hをループ中変数状態
テーブル410Aの変数名411Aに登録し同時にhの
変更414Aに1を記入する。
【0130】代入文1010は、ステップP69で、代
入文と判定され、式中の参照される変数の数をNに設定
する処理ステップP85を行なう。代入文1010の参
照される変数は、cとdの2つがあるので、カウンタN
には2を設定する。
【0131】次に、判定処理ステップP76を行ない、
カウンタNは0ではないので、ステップP77を行な
う。変数名411Aには参照される変数のNの値=2の
dは登録されていないので、ステップP85で変数名d
を変数名411Aに追加登録する。
【0132】次に、N番目の変数の変数名に対する参照
に1を記入する処理ステップP78で、変数名411A
のdに対する参照412Aに1を記入する。
【0133】次に、ステップP79で、Nが2であるの
でカウンタNを1とし、判定処理ステップP76に戻
る。カウンタNは0ではないので、判定処理ステップP
77を行なう。変数名411Aには参照される変数のN
=1番目のcは登録されていないので、ステップP85
で、変数名411Aに変数名cを追加登録する。
【0134】次に、ステップP78で、変数名411A
のcに対する参照412Aに1を記入する。次に、ステ
ップP79で、Nが1であるのでカウンタNを0とし、
ステップP86に戻る。カウンタNは0なので、ステッ
プP80を行なう。参照式フラグSは0なので、判定処
理ステップP81を行なう。変数名411Aには、代入
先変数名bは登録されていないので、ステップP86を
行い、代入先変数名bを変数名411Aに追加登録す
る。
【0135】次に、判定処理ステップP82を行なう。
条件文処理中フラグIは0なので、判定処理ステップP
83を行なう。変数名411Aの変数名bに対する参照
412A,代入413Aはともに1が記入されていない
ので、ステップP84で、変数名411Aの変数名bに
対する代入413Aに1を記入する。
【0136】代入文1011も代入文1010と同様の
処理を行ない、ループ中変数状態テーブル410Aの変
数aおよび変数名fに対応する参照412Aにそれぞれ
1を記入し、また変数名411Aにeを追加登録し、対
応する代入413Aに1を記入する。
【0137】条件判定文1012は、判定処理ステップ
P75で、条件文と判定され、ステップP81で、Iを
1とする。また、条件文1012には、参照のみの式が
含まれているので、判定処理ステップP68で、参照の
みの式と判定され、ステップP73で、参照式フラグS
を1に設定する。ステップP75で、条件文1012で
は、参照される変数がgのみなので、カウンタNには1
を設定する。次に、判定処理ステップP76を行ない、
カウンタNは1なので、判定処理ステップP77を行な
う。変数名411Aにはgが登録されているので、次
に、ステップP78で、変数名411Aのgに対する参
照412Aに1を記入する。次に、ステップP79で、
Nが1なので、カウンタNを0とし、ステップP76に
戻る。カウンタNは0なので、ステップP80を行な
う。参照式フラグSは1なので、ステップP62に戻
る。
【0138】代入文1013についても、代入文101
0と同様の処理が行なわれるが、ステップP82で、条
件文処理中フラグIは1なので、ステップP87で、変
数名411Aのhに対する変更414Aに1を記入す
る。
【0139】条件式の終了文1014は、終了判定処理
ステップP76で、条件式の終了と見なされるので、ス
テップP71で、Iを0とする。
【0140】代入文1015も代入文1010と同様の
処理を行なうが、ステップP84で、変数名411Aの
iに対する参照412Aには、式中の参照される変数を
登録する処理で1が既に記入されているので、ステップ
P87で、変数名411Aのiに対する変更414Aに
1を記入する。
【0141】ループ終了文1016に到達した時点で、
ステップP63で、ループ文の終了と判定され、不変変
数検出処理を終了し、図4に戻る。
【0142】次に、構文ファイル位置をループの先頭に
戻す処理ステップS47で、ループ文の先頭文1006
に、構文ファイルの読み込み位置を戻す。
【0143】次に、不変式移動処理ステップS48を行
なう。
【0144】次に、図6を参照して不変式移動処理ステ
ップS48の処理内容を説明すると、この不変式移動処
理は、ループ終了文1016に到達するまで、1行文の
構文読み込み処理ステップP91,ループ文の終了判定
処理ステップP92,代入文判定処理ステップP93を
繰り返す。
【0145】代入文1007は、ステップP93で、代
入文と判定され、ステップP94を行なう。代入文10
07の変数名aは、変数名411Aのa対応の変更41
4Aの欄には1が記入されていないので、代入文をルー
プの外に移動する処理ステップP95で、この代入文1
007をループの外に移動する。
【0146】代入文1010は、ステップP93で、代
入文と判定され、ステップP94を行なう。代入文10
10の変数名b,c,dは、変数名411Aのb,cお
よびdの各々に対応の変数名411Aのいずれの欄にも
1が記入されていないので、ステップP95で、この代
入文1010をループの外に移動する。
【0147】代入文1011は、ステップP93で、代
入文と判定され、ステップP94を行なう。代入文10
11の変数名e,a,fは、変数名412Aのfに対応
の変更414Aに1が記入されているのでステップP9
6で、代入先変数名eの変数名411Aのeに対する変
更414Aが指す欄1040上に1を記入する。
【0148】代入文1013は、ステップP93で、代
入文と判定され、ステップP94を行なう。この代入文
1013の変数名hは、変数名411Aのh対応の変更
414Aに1が記入されているので、ステップP96
で、代入先変数名hの変数名411Aのhに対する変更
414Aが指す欄1039上に1を記入する。
【0149】代入文1015は、ステップP93で代入
文と判定され、ステップP94を行なう。この代入文1
015の変数名iは、変数名411Aのiに対する変更
414Aに1が記入されているので、ステップP96
で、代入先変数名iの変数名411Aのi対応の変更4
14Aが指す欄1041上に1を記入する。
【0150】そして、ループ終了文1016に到達した
時点で、終了判定処理ステップP91で、ループ文の終
了と判定され、不変式移動部の処理を終了し、図4に戻
る。
【0151】この処理結果のループ中変数状態テーブル
を図8(C)に示す。
【0152】次に、構文ファイルの終了判定処理ステッ
プS42に戻る。
【0153】構文ファイルの終了に到達した時点で、構
文ファイルのクローズ処理ステップS49で構文ファイ
ルをクローズして参照ループ内不変式移動手段の処理ス
テップを終了する。
【0154】図7(B)に、原始プログラム1001内
のループブロック1005の最適化した結果得られたル
ープブロック1042を示す。
【0155】本実施の形態において、関数呼出し文を含
むループブロック1005中の、代入文1007,10
10に対して、従来技術ではできなかったループ外への
移動が行なわれている。
【0156】従来技術によるコンパイラが生成する図1
6(A)のループ内不変式移動結果のループブロック1
601と、本実施の形態のコンパイラが生成する図7
(B)のループ内不変式移動結果のループブロック10
42とを比較する。
【0157】従来技術によるループブロック1601
は、関数呼出しが含まれているためループ内不変式の移
動が一切行なわれず、総実行文数が181になるのに対
し、本実施によるループフロック1042は、呼出し関
数内で変化する変数を認識することにより、ループ内不
変式の移動が行なわれ、総実行文数が153となり、実
行速度が1.18倍速くコードを生成している。
【0158】次に、本発明の第2の実施の形態のコンパ
イラの最適化方法を示す図9,図10を参照すると、こ
の図に示す本実施の形態の上述の第1の実施の形態との
相違点は、非同期割込関数を定義可能な処理系を想定
し、この割込関数に対しての処理を付加したことであ
る。
【0159】まず、本実施の形態の更新変数抽出手段4
Aの処理手順を図2と共通の処理は共通の文字を付して
同様にフロチャートで示す図9を参照すると、この図に
示す本実施の形態の更新変数抽出手段4Aの第1の実施
の形態との相違点は、まず、図9(B)に示すように、
本実施の形態の更新変数管理テーブル310が位置31
1,関数名312,変数名313,呼出し関数名314
に加えて、関数名312の関数が割込み関数の場合にそ
れを示す割込315を付加したことと、これに伴なっ
て、図9(A)のフローチャートにおいて関数名を位置
Iの関数名に登録する処理ステップS7の後に、割込関
数判定処理ステップS101と、判定結果割込関数であ
る場合に位置Iの割込に1を記入する処理ステップS1
02とを付加したことである。
【0160】次に、本実施の形態の更新変数見直し手段
5は第1の実施の形態と共通である。
【0161】次に、本実施の形態の参照ループ内不変式
移動手段6Aの第1の実施の形態との相違点は、図4の
不変変数検出処理ステップS46の代りにステップS4
6Aを含むことである。
【0162】本実施の形態の不変変数検出処理ステップ
S46Aの処理手順を図5と共通の処理は共通の文字を
付して同様にフロチャートで示す図10を参照すると、
このステップS46Aの第1の実施の形態との相違点
は、ステップP61とP62との間に、更新変数管理テ
ーブルを参照してループ中変数状態テーブルに登録する
処理ステップS201が付加されることである。
【0163】このステップS201は、更新変数管理テ
ーブル310の割込315に1が記入されている関数名
に登録されている変数名を、ループ中変数状態テーブル
400の変数411に追加登録し、変更414に1を記
入する処理を行う。
【0164】次に、非同期に動作する割込関数すなわち
非同期割込関数の定義を含む原始プログラムと本実施の
形態で生成する更新変数管理テーブル310Aとループ
中変数状態テーブル410Bの各処理ステップの過程を
示す図11を併せて参照して本実施の形態のコンパイラ
の最適化方法について第1の実施の形態との相違点を中
心に詳細に説明する。
【0165】最初に図9(A)を再度参照して、更新変
数抽出手段4Aの処理ステップを説明する。
【0166】まず、ステップS1で、図11(A)の原
始プログラム1101に対する構文ファイルをオープン
する。次に、ステップS2で、位置311A,関数名3
12A,変数名313A,呼出し関数名314Aで構成
される更新変数管理テーブル310Aの全ての領域を0
で初期化する。次に、ステップS3で、更新変数管理テ
ーブル位置Iを1で初期化する。次に、関数先頭文11
03に到達するまでステップS4〜S6を反復する。
【0167】関数先頭文1103はステップS6で関数
先頭文と判定し、この関数名mainをステップS7で
更新変数管理テーブル310Aの位置311Aの1番目
対応の関数名312Aの欄に登録する。
【0168】次に、割込関数の判定処理ステップS10
1で、割込関数か否かを判定する。main関数は割込
関数ではないので、ステップS8で1行文の構文を読み
込む。
【0169】次に、関数終了文1115に到達するま
で、ステップS8〜S11を反復する。
【0170】代入文1104,1107,1108,1
109,1111,1113は代入文であるため、ステ
ップS10で代入文と判定し、ステップS14を行な
う。代入文1104,1107,1108,1109,
1111の代入先変数名は、位置311Aの1番目対応
の変数名313Aの欄には登録されていないので、ステ
ップS16で、代入先変数名i,a,b,e,hを位置
311Aの1番目対応の変数313Aに登録する。代入
文1113の代入先変数名iは、位置311Aの1番目
に対する変数313Aに既に登録済みであるため、登録
は行なわない。
【0171】関数終了文1115に到達した時点で、ス
テップS9で関数終了文と判定し、ステップS13で、
更新変数管理テーブル位置Iを1増やし、ステップS4
に戻り、1行文の構文読み込み処理を行なう。
【0172】次に、ステップS5を行ない、構文ファイ
ルの終了ではないので、ステップS6を行なう。割込関
数先頭文1116は関数先頭文なので、ステップS7
で、割込関数先頭文1116の関数名funcを位置3
11Aの2番目に対する関数名312Aに登録する。
【0173】次に、ステップS101で割込関数か否か
を判定する。func関数は割込関数を意味するキーワ
ードinterruptが付加された関数のため、割込
関数と判定され、位置Iの割込に1を記入する処理ステ
ップS102で、位置311Aの2番目対応の割込31
5Aに1を記入する。
【0174】以後、代入文1117,関数終了文111
8に関しても同様の処理を行なう。関数終了文1118
の処理の終了後、ステップS4で、1行文の構文を読み
込み、ステップS5で構文ファイルの終了と判定し、ス
テップS12で、構文ファイルをクローズして、更新変
数抽出手段の処理ステップを終了する。この結果生成さ
れた更新変数管理テーブル310Aを図11(B)に示
す。
【0175】次に、第1の実施の形態と共通の更新変数
見直し手段5の処理ステップS21〜S34を実行す
る。この結果、見直された更新変数管理テーブル310
Aはその内容が変化しない。
【0176】次に、参照ループ内不変式移動手段の処理
ステップを図4,図6,図8を参照して説明する。ま
ず、ステップS41で、原始プログラム1101に対す
る構文ファイルをオープンする。次に、ループ先頭文1
106に到達するまで、ステップS42〜S44を繰り
返す。
【0177】次に、ループ中変数状態テーブルを0で初
期化する処理ステップS45で、ループ中変数状態テー
ブル410Bの変数名411B,参照412B,代入4
13B,変更414Bの全領域を0で初期化する。
【0178】次に、不変変数検出処理ステップS46を
行なう。
【0179】図9を再度参照して不変変数検出処理ステ
ップS46の処理内容について説明すると、ステップP
61で、条件式処理中フラグIを0で初期化する。
【0180】次に、更新変数管理テーブルを参照してル
ープ中変数状態テーブル410に登録する処理ステップ
S201を行なう。位置311Aの2番目対応の割込3
15Aに1が記入されているので、位置311Aの2番
目対応の変数名313Aに登録されている変数名fを、
変数名411Bに登録し、同時に変更414Bに1を記
入する。
【0181】次に、ループ終了文1114に到達するま
で、ステップP62〜P69を反復する。
【0182】以下第1の実施の形態と同様に処理を行
い、ループ終了文1114に到達した時点で、ステップ
P63でループ終了と判定し、不変変数検出処理ステッ
プS46Aを終了する。
【0183】次に、ステップS47でループ文の先頭文
1106に構文ファイル位置を戻す。
【0184】次に、第1の実施の形態と共通の不変式移
動処理ステップS48を行う。
【0185】ステップS48では、ステップP91〜P
93を繰り返す。
【0186】代入文1107は、ステップP93で、代
入文と判定されステップP95でループの外に移動す
る。同様に、代入文1108をループの外に移動する。
【0187】代入文1109は、変数名e,a,fが、
変数名411Bのfに対する変更414Bに1が記入さ
れているので、ステップP96で変数名411Bのeに
対する変更414Bが指す欄1131上に1を記入す
る。
【0188】代入文1111は、変数名hが、変数名4
11Bのhに対する変更414Bに1が記入されている
ので、ステップP96で、代入先変数名hの変数名41
1Bのhに対する変更414Bが指す欄1132上に1
を記入する。
【0189】同様に、代入文1113は、ステップP9
6で、変更414Bが指す欄1133上に1を記入す
る。
【0190】ループ終了文1116に到達した時点で、
ステップP91で、ループ文の終了と判定し、不変式移
動部の処理を終了し、図4に戻る。
【0191】次に、終了判定処理ステップS42に戻
る。
【0192】構文ファイルの終了に到達した時点で、ス
テップS49で構文ファイルをクローズして参照ループ
内不変式移動手段の処理ステップを終了する。
【0193】図11(C)に原始プログラム1101内
のループブロック1105の最適化結果であるループブ
ロック1134を示す。
【0194】本実施の形態において、ループブロック1
105中の代入文1107,1108に対して、従来技
術ではできなかったループ外への移動を行なっている。
【0195】従来技術によるコンパイラが生成する図1
6(B)のループ内不変式移動結果のループブロック1
701と、本実施の形態のコンパイラが生成する図11
(C)のループ内不変式移動結果のループブロック11
34とを比較する。
【0196】従来技術によるループブロック1701
は、非同期割込関数の定義が含まれているためループ内
不変式の移動が一切行なわれず、総実行文数が60にな
るのに対し、本実施によるループフロック1134は、
非同期割込関数内で更新される変数を認識することによ
り、ループ内不変式の移動が行なわれ、総実行文数が3
2で済み、実行速度が1.88倍速くコードを生成して
いる。
【0197】
【発明の効果】以上説明したように、本発明のコンパイ
ラの最適化装置は、コード最適化手段が、ループ内不変
式に含まれる関数毎に更新変数を抽出し更新変数管理テ
ーブルに登録する更新変数抽出手段と、呼出元関数によ
る他関数の呼出時に呼出先で更新される変数を更新変数
として更新変数管理テーブルに登録する更新変数見直し
手段と、更新変数管理テーブルの参照による更新変数の
認識に基づきループ内不変式を抽出してループ外に移動
する更新変数参照ループ内不変式移動手段とを備え、関
数呼出しを含む原始プログラムの最適化処理において呼
出し関数内で変化する変数を認識することにより、実行
回数が多いループ内不変式の移動を実行できるので総実
行文数を削減でき、したがって処理速度を高速化できる
という効果がある。
【図面の簡単な説明】
【図1】本発明の第1の実施の形態のコンパイラの最適
化装置を示すブロック図である。
【図2】本実施の形態の更新変数抽出手段のフローチャ
ートと更新管理テーブルとを示す図である。
【図3】本実施の形態の更新変数見直し手段の処理を示
すフロチャートである。
【図4】本実施の形態の参照ループ内不変式移動手段の
処理を示すフロチャートである。
【図5】本実施の形態の不変変数検出処理を示すフロチ
ャートである。
【図6】本実施の形態の不変式移動処理を示すフロチャ
ートである。
【図7】本実施の形態の最適化処理対象の原始プログラ
ムとループブロックの最適化結果とを示す図である。
【図8】本実施の形態の更新変数管理テーブルとループ
中変数状態テーブルとの内容を示す図である。
【図9】本発明の第2の実施の形態のコンパイラの最適
化方法を示す更新変数抽出手段のフローチャートと更新
管理テーブルとを示す図である。
【図10】本実施の形態の不変変数検出処理を示すフロ
チャートである。
【図11】本実施の形態の最適化処理対象の原始プログ
ラムと更新変数管理テーブルとループ中変数状態テーブ
ルとループブロックの最適化結果とを示す図である。
【図12】従来のコンパイラの最適化装置の一例を示す
ブロック図である。
【図13】従来のループ内不変式移動手段の処理を示す
フロチャートである。
【図14】従来の不変変数検出処理を示すフロチャート
である。
【図15】従来の不変式移動処理を示すフロチャートで
ある。
【図16】従来の関数呼出し及び非同期割込関数を有す
る原始プログラムの各々のループブロックの最適化結果
をそれぞれ示す図である。
【符号の説明】
1 字句解析手段 2 構文解析手段 3,103 コード最適化手段 4 更新変数抽出手段 5 更新変数見直し手段 6 参照ループ内不変式移動手段 7 コード生成手段 131 ループ内不変式移動手段 300,300A,300B,310,310A,31
0B 更新変数管理テーブル 301,301A,301B,311,311A,31
1B 位置 302,302A,302B,312,312A,31
2B 関数名 303,303A,303B,313,313A,31
3B 変数名 304,304A,304B,314,314A,31
4B 呼出し関数名 315,315A,315B 割込 410,410A,410B ループ中変数状態テー
ブル 411,411A,411B 変数名 412,412A,412B 参照 413,413A,413B 代入 414,414A,414B 変更 1001,1101 原始プログラム 1005,1105,1042,1134 ループブ
ロック

Claims (10)

    【特許請求の範囲】
  1. 【請求項1】 入力した原始プログラムを字句に分解し
    字句解析結果を出力する字句解析手段と、前記字句解析
    結果の供給を受けて構文を構築しこの構文を認識して構
    文解析結果を出力する構文解析手段と、前記構文解析結
    果の供給を受けて不要な構文の削除処理とループ処理構
    文中のループ処理に影響を受けない構文であるループ内
    不変式をこのループ処理構文の外に移動するループ内不
    変式移動処理とを含む最適化処理を行い最適化結果を出
    力するコード最適化手段と、前記コード最適化結果の供
    給を受けて翻訳対象プロセッサ用のオブジェクトコード
    を生成するコード生成手段とを備えるコンパイラの最適
    化装置において、 前記コード最適化手段が、前記ループ内不変式に含まれ
    る関数毎に更新対象の変数である更新変数を抽出しこの
    更新変数を管理するための更新変数管理テーブルに登録
    する更新変数抽出手段と、 任意の呼出元関数による他関数の呼出時に呼出先で更新
    される変数を前記呼出元関数で更新される更新変数とし
    て前記更新変数管理テーブルに登録する更新変数見直し
    手段と、 前記更新変数の前記更新変数管理テーブルの参照による
    認識に基づき前記ループ内不変式を抽出してループ外に
    移動する更新変数参照ループ内不変式移動手段とを備え
    ることを特徴とするコンパイラの最適化装置。
  2. 【請求項2】 入力した原始プログラムを字句に分解し
    字句解析結果を出力する字句解析ステップと、前記字句
    解析結果の供給を受けて構文を構築しこの構文を認識し
    て構文解析結果を出力する構文解析ステップと、前記構
    文解析結果の供給を受けて不要な構文の削除処理とルー
    プ処理構文中のループ処理に影響を受けない構文である
    ループ内不変式をこのループ処理構文の外に移動するル
    ープ内不変式移動処理とを含む最適化処理を行い最適化
    結果を出力するコード最適化ステップと、前記コード最
    適化結果の供給を受けて翻訳対象プロセッサ用のオブジ
    ェクトコードを生成するコード生成ステップとを含るコ
    ンパイラの最適化方法において、 前記コード最適化ステップがが、前記ループ内不変式に
    含まれる関数毎に更新対象の変数である更新変数を抽出
    しこの更新変数を管理するための更新変数管理テーブル
    に登録する更新変数抽出処理ステップと、 任意の呼出元関数による他関数の呼出時に呼出先で更新
    される変数を前記呼出元関数で更新される更新変数とし
    て前記更新変数管理テーブルに登録する更新変数見直し
    処理ステップと、 前記更新変数の前記更新変数管理テーブルの参照による
    認識に基づき前記ループ内不変式を抽出してループ外に
    移動する更新変数参照ループ内不変式移動処理ステップ
    とを含むことを特徴とするコンパイラの最適化方法。
  3. 【請求項3】 前記更新変数抽出処理ステップが、前記
    構文解析結果から構文ファイルを開くステップと、 前記更新変数管理テーブルを初期化するステップと、 前記更新変数管理テーブルの更新変数の登録用の登録位
    置を設定するステップと、 1行文の第1の構文を読み込む第1のステップと、 前記構文ファイルの終了か否かを判断する第2のステッ
    プと、 前記第2のステップの判断結果が終了でない場合に前記
    第1の構文が関数の先頭か否かを判断する第3のステッ
    プと、 前記第3のステップの判断結果が関数の先頭である場合
    にこの関数名を前記登録位置対応の関数名の欄に登録す
    る第4のステップと、 次の1行分の第2の構文を読み込む第5のステップと、 前記第2の構文が関数の終了か否かを判断する第6のス
    テップと、 前記第6のステップの判断結果が終了の場合前記登録位
    置の設定を変更し前記第1のステップへ戻るステップ
    と、 前記第6のステップの判断結果が否の場合に前記第2の
    構文が代入文か否かを判断する第7のステップと、 前記第7のステップの判断結果が否の場合に関数呼出し
    であるか否かを判断する第8のステップと、 前記第7のステップの判断結果が代入文である場合この
    代入文が前記登録位置の変数名に登録済みであるか否か
    を判断する第9のステップと、 前記第9のステップの判断結果が否である場合に前記登
    録位置に前記代入文の代入先変数名を登録するステップ
    と、 前記第9のステップの判断結果が登録済みの場合前記第
    8のステップへ移行するステップと、 前記第8のステップで関数呼出しの場合にこの呼出し関
    数名が前記登録位置の呼出し関数名に登録済みであるか
    否かを判断する第10のステップと、 前記第10のステップの判断結果が否である場合に前記
    登録位置に前記呼び出し関数名を登録するステップと、 前記第10のステップの判断結果が登録済みである場合
    に前記第5のステップへ戻るステップとを含むことを特
    徴とする請求項2記載のコンパイラの最適化方法。
  4. 【請求項4】 前記更新変数見直し処理ステップが、前
    記更新変数管理テーブルの前記登録位置を設定するステ
    ップと、 前記登録位置が最後か否かを判断する第11のステップ
    と、 前記第11のステップの判断結果が最後であれば更新変
    数見直し処理を終了するステップと、 前記第11のステップの判断結果が否の場合前記登録位
    置を引数に設定するステップと、 関数集計処理を行う関数集計処理ステップと、 前記引数に1を加え前記第11のステップへ戻るステッ
    プとを含むことを特徴とする請求項2記載のコンパイラ
    の最適化方法。
  5. 【請求項5】 前記更新変数参照ループ内不変式移動処
    理ステップが、前記構文ファイルを開くステップと、 1行文の構文を読み込む第14のステップと、 前記構文ファイルが終了か否かを判断する第15のステ
    ップと、 前記第15のステップの判断結果が終了の場合前記構文
    ファイルを閉じるステップと、 前記第15のステップの判断結果が終了でない場合前記
    構文ファイルがループ文の先頭か否かを判断する第16
    のステップと、 前記第16のステップの判断結果が否の場合前記第14
    のステップへ戻るステップと、 前記第16のステップの判断結果が先頭である場合前記
    ループ文の変数の状態を管理するループ中変数状態テー
    ブルを0で初期化するステップと、 前記ループ文に含まれる不変変数を検出する不変変数検
    出ステップと、 前記構文ファイル位置をループの先頭へ戻すステップ
    と、 前記不変変数を含む不変式を移動するループ内不変式移
    動ステップとを有することを特徴とする請求項2記載の
    コンパイラの最適化方法。
  6. 【請求項6】 前記更新変数管理テーブルが割込関数を
    登録する割込の欄をさらに含み、前記更新変数抽出手段
    が、前記第4のステップの処理後前記関数が割込関数で
    あるか否かを判断し割込関数であると判断した場合に前
    記登録位置対応の前記割込の欄に1を設定するステップ
    を含むことを特徴とする請求項3記載の最適化方法。
  7. 【請求項7】 前記関数集計処理ステップが、前記引数
    を受け取り受け取り引数を設定するステップと、 前記登録位置を前記受け取り引数とし前記登録位置に登
    録されている呼出し関数名の数をNに設定するステップ
    と、 前記Nが0か否かを判断する第12のステップと、 前記第12のステップで前記Nの数が0であれば前記関
    数集計処理ステップを終了するステップと、 前記第12のステップで前記Nが0以外であれば前記受
    け取り引数対応の前記登録位置のN番目の呼出し関数名
    を取得し前記登録位置を変更するステップと、 前記登録位置の変更前の第1の登録位置のN番目の呼び
    出し関数名を消去するステップと、 前記変更された第2の登録位置を引数に設定する第13
    のステップと、 前記第13のステップで設定された更新変数管理テーブ
    ルを用いて関数集計処理を行うステップと、 前記第1の登録位置の変数名に前記第2の登録位置の変
    数名を追加登録するステップと、 前記Nから1を減算し前記第12のステップへ戻るステ
    ップとを含むことを特徴とする請求項4記載のコンパイ
    ラの最適化方法。
  8. 【請求項8】 前記不変変数検出ステップが、条件処理
    中フラグを設定する第21のステップと、 読込んだ構文が前記ループ文の終了か否かを判断する第
    22のステップと、 前記第22のステップの判断結果が否の場合前記構文が
    関数呼出しか否かを判断する第23のステップと、 前記第23のステップの判断結果が呼出し関数の場合前
    記更新変数管理テーブルを参照し参照された関数で更新
    される変数のうち前記ループ中変数状態テーブルに未登
    録の変数を登録するとともに前記ループ中変数状態テー
    ブルの変更の欄に1を記入するステップとを含むことを
    特徴とする請求項5記載のコンパイラの最適化方法。
  9. 【請求項9】 前記ループ内不変式移動ステップが、読
    込んだ構文が前記ループ文の終了か否かを判断する第3
    1のステップと、 前記第31のステップの判断結果が否の場合前記構文が
    代入文か否かを判断する第32のステップと、 前記第32のステップの判断結果が代入文である場合前
    記代入文を構成する全変数の変数名対応の前記ループ中
    変数状態テーブル中の変更の欄が0であるか否かを判断
    する第33のステップと、 前記第33のステップの判断結果が否の場合前記代入先
    変数の変数名対応の前記変更の欄に1を記入するステッ
    プと、 前記第33のステップの判断結果が0の場合前記代入文
    を前記ループの外に移動するステップとを有することを
    特徴とする請求項5記載のコンパイラの最適化方法。
  10. 【請求項10】 前記不変変数検出ステップが、前記第
    21のステップの処理後前記更新変数管理テーブルの割
    込の欄に1が記入されている関数名に登録されている変
    数名を前記ループ中変数状態テーブルに登録するととも
    に前記ループ中変数状態テーブルの変更の欄に1を記入
    するステップをさらに含むことを特徴とする請求項8記
    載のコンパイラの最適化方法。
JP8005908A 1996-01-17 1996-01-17 コンパイラの最適化装置及びその方法 Pending JPH09198254A (ja)

Priority Applications (3)

Application Number Priority Date Filing Date Title
JP8005908A JPH09198254A (ja) 1996-01-17 1996-01-17 コンパイラの最適化装置及びその方法
EP97100474A EP0785506A1 (en) 1996-01-17 1997-01-14 Optimizing compiler using interprocedural dataflow analysis
US08/783,061 US5862384A (en) 1996-01-17 1997-01-15 Compiler optimizer that moves loop invariant expressions

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP8005908A JPH09198254A (ja) 1996-01-17 1996-01-17 コンパイラの最適化装置及びその方法

Publications (1)

Publication Number Publication Date
JPH09198254A true JPH09198254A (ja) 1997-07-31

Family

ID=11624005

Family Applications (1)

Application Number Title Priority Date Filing Date
JP8005908A Pending JPH09198254A (ja) 1996-01-17 1996-01-17 コンパイラの最適化装置及びその方法

Country Status (3)

Country Link
US (1) US5862384A (ja)
EP (1) EP0785506A1 (ja)
JP (1) JPH09198254A (ja)

Cited By (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US8949808B2 (en) 2010-09-23 2015-02-03 Apple Inc. Systems and methods for compiler-based full-function vectorization
US9529574B2 (en) 2010-09-23 2016-12-27 Apple Inc. Auto multi-threading in macroscalar compilers

Families Citing this family (19)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US6226790B1 (en) * 1997-02-28 2001-05-01 Silicon Graphics, Inc. Method for selecting optimal parameters for compiling source code
US6567976B1 (en) 1997-03-20 2003-05-20 Silicon Graphics, Inc. Method for unrolling two-deep loops with convex bounds and imperfectly nested code, and for unrolling arbitrarily deep nests with constant bounds and imperfectly nested code
US6151704A (en) * 1997-04-01 2000-11-21 Intel Corporation Method for optimizing a loop in a computer program by speculatively removing loads from within the loop
US6539541B1 (en) 1999-08-20 2003-03-25 Intel Corporation Method of constructing and unrolling speculatively counted loops
US6748589B1 (en) 1999-10-20 2004-06-08 Transmeta Corporation Method for increasing the speed of speculative execution
JP3356742B2 (ja) * 1999-11-17 2002-12-16 インターナショナル・ビジネス・マシーンズ・コーポレーション プログラム実行方法
US6671878B1 (en) * 2000-03-24 2003-12-30 Brian E. Bliss Modulo scheduling via binary search for minimum acceptable initiation interval method and apparatus
US7131119B2 (en) * 2001-05-30 2006-10-31 International Business Machines Corporation Code optimization
KR20040111650A (ko) * 2002-05-22 2004-12-31 코닌클리즈케 필립스 일렉트로닉스 엔.브이. 인스트럭션 시퀀스 디코딩 방법 및 장치
US7454747B2 (en) * 2003-02-07 2008-11-18 Sun Microsystems, Inc. Determining maximum acceptable scheduling load latency using hierarchical search
US7669193B1 (en) 2003-09-25 2010-02-23 Lantronix, Inc. Program transformation using flow-sensitive type constraint analysis
GB0325553D0 (en) * 2003-11-01 2003-12-03 Ibm Method and apparatus for activating/deactivating run-time determined software routines in Java compiled bytecode applications
US8645938B2 (en) * 2006-11-17 2014-02-04 International Business Machines Corporation System and method for replacing code
MX2013003339A (es) * 2010-09-23 2013-06-24 Apple Inc Sistemas y metodos para la vectorizacion basada en compilador de codigo no hoja.
US8621448B2 (en) 2010-09-23 2013-12-31 Apple Inc. Systems and methods for compiler-based vectorization of non-leaf code
US9767004B2 (en) * 2014-06-16 2017-09-19 Symantec Corporation Dynamic call tracking method based on CPU interrupt instructions to improve disassembly quality of indirect calls
US9904549B2 (en) * 2015-12-26 2018-02-27 Intel Corporation Method and apparatus for loop-invariant instruction detection and elimination
KR102195103B1 (ko) 2017-06-26 2020-12-24 삼성전자주식회사 프로그램 컴파일 방법
US11327733B2 (en) 2020-05-27 2022-05-10 Blaize, Inc. Method of using multidimensional blockification to optimize computer program and device thereof

Family Cites Families (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US5396627A (en) * 1987-11-06 1995-03-07 Hitachi, Ltd. Method of producing object program based on interprocedural dataflow analysis of a source program
JP2749039B2 (ja) * 1987-11-06 1998-05-13 株式会社日立製作所 オブジェクト生成方法
JPH01214936A (ja) * 1988-02-24 1989-08-29 Hitachi Ltd 最適化コンパイラ

Cited By (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US8949808B2 (en) 2010-09-23 2015-02-03 Apple Inc. Systems and methods for compiler-based full-function vectorization
US9529574B2 (en) 2010-09-23 2016-12-27 Apple Inc. Auto multi-threading in macroscalar compilers

Also Published As

Publication number Publication date
US5862384A (en) 1999-01-19
EP0785506A1 (en) 1997-07-23

Similar Documents

Publication Publication Date Title
JPH09198254A (ja) コンパイラの最適化装置及びその方法
US5737608A (en) Per-keystroke incremental lexing using a conventional batch lexer
US6367068B1 (en) Dynamic parsing
US6802059B1 (en) Transforming character strings that are contained in a unit of computer program code
JPS6375835A (ja) 目的コ−ド、プログラム・リスト及び設計文書を生成する装置
US8332833B2 (en) Procedure control descriptor-based code specialization for context sensitive memory disambiguation
CN108595171B (zh) 对象的模型生成方法、装置、设备及存储介质
CN110673854A (zh) Sas语言编译方法、装置、设备及可读存储介质
US10839124B1 (en) Interactive compilation of software to a hardware language to satisfy formal verification constraints
Koskimies et al. The design of a language processor generator
Costagliola et al. Visual language implementation through standard compiler–compiler techniques
Krishnamurthy et al. Ease: Enabling hardware assertion synthesis from english
CN112965909B (zh) 测试数据、测试用例生成方法及系统、存储介质
JPH1173328A (ja) コーディング規約チェックシステム
US5649201A (en) Program analyzer to specify a start position of a function in a source program
Harris et al. Generation of Verification Artifacts from Natural Language Descriptions
Xiao Design of Chinese Programming Language Compiler Based on LLVM Framework
Chavan et al. Proposing a Semantic Analysis based Sanskrit Compiler by mapping Sanskrit's linguistic features with Compiler phases
JPS6041166A (ja) 機械翻訳方式
Dabrowski On Single-Valuedness in Textually Aligned SPMD Programs
Dempsey et al. A regular expression pattern matching processor for APL
Doumler Portable assumptions
Cyre et al. A rapid modeling tool for virtual prototypes
Tanaka Processing Left Extraposition in a Bottom-Up Parsing System
JP3098076B2 (ja) 機械翻訳装置

Legal Events

Date Code Title Description
A02 Decision of refusal

Free format text: JAPANESE INTERMEDIATE CODE: A02

Effective date: 19980916