JP3004340B2 - プログラム最適化装置 - Google Patents

プログラム最適化装置

Info

Publication number
JP3004340B2
JP3004340B2 JP2273183A JP27318390A JP3004340B2 JP 3004340 B2 JP3004340 B2 JP 3004340B2 JP 2273183 A JP2273183 A JP 2273183A JP 27318390 A JP27318390 A JP 27318390A JP 3004340 B2 JP3004340 B2 JP 3004340B2
Authority
JP
Japan
Prior art keywords
register
instruction
registers
program
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.)
Expired - Fee Related
Application number
JP2273183A
Other languages
English (en)
Other versions
JPH04149738A (ja
Inventor
耕基 川村
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.)
Oki Electric Industry Co Ltd
Original Assignee
Oki Electric Industry 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 Oki Electric Industry Co Ltd filed Critical Oki Electric Industry Co Ltd
Priority to JP2273183A priority Critical patent/JP3004340B2/ja
Publication of JPH04149738A publication Critical patent/JPH04149738A/ja
Application granted granted Critical
Publication of JP3004340B2 publication Critical patent/JP3004340B2/ja
Anticipated expiration legal-status Critical
Expired - Fee Related legal-status Critical Current

Links

Landscapes

  • Devices For Executing Special Programs (AREA)

Description

【発明の詳細な説明】 (産業上の利用分野) 本発明は、高水準言語で記述されたソースプログラム
を、アセンブリ言語で記述されたオブジェクトプログラ
ムに変換するコンパイラに設けられ、レジスタ割付けの
効果等を向上させるプログラム最適化装置に関する。
(従来の技術) フォートラン,ベーシック,コボルプログラム等の高
水準言語で記述されたソースプログラムは、コンピュー
タ中で、その実行のために、コンパイラによりアセンブ
リ言語で記述されたオブジェクトプログラムに変換され
る。
このオブジェクトプログラムへの変換時には、先ず、
一旦、実際に使用可能なレジスタ数を考慮しない、仮想
的な機械命令から成る擬似コードに変換される。その
後、プログラムの演算順序を変えたり、コードを変えた
りすることによって、実際のレジスタ割付け処理を考慮
した目的コードに変換される。これにより、目的コード
により構成されるオブジェクトプログラムの全体のサイ
ズを縮小したり、プログラム実行時間を短縮することが
できる。この処理を最適化処理と予んでいる。
このような最適化処理の1つに、不変命令移動を利用
したものがある。これは、プログラムの実行中、ある区
間で同じ結果をもたらす命令を、目的コードのサイズ縮
小や実行時間短縮につながる位置まで移動するといった
処理である。尚、不変命令とは、定数値での値を定義す
る定義命令等のことをいう。
例えば、ループ命令中に、不変命令、例えばレジスタ
Aに3をロードするという命令が含まれている場合、こ
れはループの実行内容によらず、常に一定の結果を得
る。従って、このような不変命令は、ループの入口側に
移動させる。これにより、不変命令の実行回数が減少
し、実行時間の短縮を図ることができる。
一方、コンパイラは、この他に、実際に使用可能なレ
ジスタ数を考慮したレジスタ割付けを行なう。この処理
は、擬似コードから目的コードを生成する際に、擬似コ
ード上の仮想レジスタを、どのように割当てるか決める
ための処理である。実レジスタの数は有限であるため、
レジスタ割付け処理では、使用する実レジスタ数をでき
るだけ節約するような処理を行なう。
(発明が解決しようとする課題) ところで、上記のようなプログラムの最適化とレジス
タ割付け処理とは、それぞれ、従来別個の観点から行な
われており、次のような解決すべき問題点が生じてい
た。
第2図に、従来のレジスタ割付け方法説明図を示す。
図に示すソースプログラムは、定数aに“1"を、定数
bに“2"を定義し、関数f(a)及び関数g(b)を処
理する内容のものである。これを擬似コード化すると、
中央に示すように、レジスタVR1に定数“1"を、レジス
タVR2に定数“2"を格納し、次に、レジスタVR1の内容を
レジスタR0に格納して関数fを呼出す。関数fは、レジ
スタR0に格納された定数を用いて演算を実行する。
次に、レジスタR0にレジスタVR2の内容を格納し、そ
の後、関数gを実行する。この場合、各仮想レジスタVR
1,VR2,R0は、図中の黒丸●と黒丸●を実線で結んだ間、
それぞれ有効に使用されることになる。
この擬似コードにおいて、実レジスタの使用を効率化
するために、関数の使用する定数を格納するための実レ
ジスタR0と、ソースプログラムにおけるbを定義するた
めの実レジスタR4のみを設定し、目的コードを作成す
る。これにより、実レジスタは、同時に最大2つ使用す
ればよいことになる。
第3図に、従来の最適化処理方法の説明図を示す。
図のプログラムは、左側が擬似コード、右側が目的コ
ードである。
この擬似コードでは、仮想レジスタVR0に“1"、VR1に
“a"を格納し、関数fを実行してから、次のレジスタVR
1,VR2,VR0を用いた加算処理を実行するという内容のも
のである。尚、このプログラムにおいては、,に示
した不変命令は、プログラム中で1度定義され、その
後、1度だけ使用される。
しかしながら、図の擬似コードに示すように、定義位
置と使用時の間が離れていると、その間で、必要以上に
他のレジスタと干渉することになる。尚、干渉とは、あ
るレジスタと他のレジスタとが同時に使用される場合を
いい、この場合、仮想レジスタは、それぞれ異なる実レ
ジスタに割付ける必要が生じる。
また、レジスタR0は、関数fの実行のための定数を格
納するレジスタであって、不変命令とその使用命令の間
にこのような関数呼出しがあると、レジスタR0中の定数
の退避と復元が必要となる。
そこで、従来、このような場合に、定数伝播という方
法で、プログラムの最適化を行なうようにしていた。こ
れは、定数値で定義されたレジスタがある場合に、その
レジスタの使用位置をその定義した定数値と置換えると
いうものである。これにより、レジスタの使用が減り、
不要となった定義命令を削除できる。しかしながら、そ
の場合には、定数で定義されたレジスタの使用位置を調
べるといった処理が必要となり、又、定義命令が不要と
なったか否かを判断するために、レジスタのlive解析が
必要となる。尚、このlive解析というのは、レジスタや
メモリへの定数の定義位置から、そのレジスタの最終使
用位置までの区間であるlive区間をレジスタ毎に調べれ
ば、干渉等の有無を解析することができる。
尚、具体的には、第3図の目的コードに示したよう
に、不変命令及びを、その結果を使用する命令の
直前に移動させるようにしても、その効果は同じであ
り、これによって、レジスタのlive区間を短縮し、レジ
スタ割付けも容易になる。しかしながら、従来、このよ
うな動作を簡便に行なう装置は提供されていなかった。
本発明は以上の点に着目してなされたもので、不変命
令を含むプログラムの最適化を図り、よりレジスタ使用
の少ないオブジェクトプログラムへの変換を行なうと共
に、コンパイル時間の短縮を図ったプログラム最適化装
置を提供することを目的とするものである。
(課題を解決するための手段) 本発明のプログラム最適化装置は、高水準言語で記述
されたソースプログラムをアセンブリ言語で記述された
オブジェクトプログラムに変換するコンパイラに設けら
れるプログラム最適化装置において、前記オブジェクト
プログラムにおける1度の定義で1度の使用がされる不
変命令を検出する検出手段と、前記不変命令を検出する
たびに前記不変命令の定義位置から前記不変命令の使用
位置までの間におけるレジスタ割付け状態を解折して、
レジスタの干渉を少なくするようなレジスタの割付けが
可能か否かの判定を行う解折手段と、前記レジスタの割
付けが可能な場合に、前記不変命令の定義位置を前記不
変命令の使用位置直前に移動する最適化手段とを備えた
ことを特徴とするものである。
(作用) 以上の装置は、コンパイラにおいて、1度の定義で、
その後、1度だけの使用がされる不変命令を検出し、そ
の定義位置を不変命令の使用位置直前まで移動する。こ
の場合に、予めオブジェクトプログラムの不変命令の定
義位置から、その不変命令の使用位置までの間における
レジスタ割付け状態を解析する。この場合に、レジスタ
の干渉を少なくするようなレジスタの割付けが可能かど
うかの判定を行ない、その結果に基づき、不変命令の移
動を行なうようにすれば、最適化処理を、機械的に自動
的に行なうことができる。
(実施例) 以下、本発明を図の実施例を用いて詳細に説明する。
第1図は、本発明のプログラム最適化装置実施例を示
す動作説明図である。
この装置では、コンパイラ10が、不変命令検出のため
の検出手段1と、レジスタ割付け状態解析のための解析
手段2と、不変命令移動のための最適化手段3を備えて
いる。
本発明の装置は、図に示した左側の目的コード(イ)
について、右側の目的コード(ロ)のように最適化を行
なう例を説明する。
この目的コードは、レジスタR0に“1"を格納し、レジ
スタR4に“2"を格納した後、関数fを実行し、次にレジ
スタR0にレジスタR4の内容を格納した後、関数gを実行
するといった内容のものである。この場合に、この目的
コードをそのまま実行するとすれば、実レジスタR0とR4
とは、図の●と●とを線で結んだ間、それぞれ有効に使
用されることになる。図のレジスタR0,R4のそれぞれのl
ive区間は、この●と●の間に該当する。
第4図に、このlive区間の説明図を示す。
live区間というのは、先に説明したように、図の定義
位置A0から使用位置A1を経て最終使用位置A2に至るまで
の区間をいう。
また、第5図は、干渉の説明図を示す。
図のように、2つのレジスタVR0とVR1があり、そのli
ve区間が、それぞれB0からB2あるいはC0からC2とする
と、2つのレジスタのlive区間が、図のハッチング部分
で重なることになる。この重なりを干渉という。従っ
て、第1図の左側の目的コードによれば、実レジスタを
必ず2つ使用しなければならない。
本発明の装置は、このように実レジスタの干渉を減少
させると共に、不変命令の移動を行なって、その最適化
を図る。
第6図は、本発明の装置全体の動作フローチャートで
あり、主としてレジスタ割付け動作を実行する部分であ
る。また、第7図は、本発明の装置の動作のフローチャ
ートであって、不変命令の移動による最適化を行なう部
分である。
先ず、本発明の装置は、検出手段1によって、不変命
令の検出とその位置の検出を行なう。第1図左側の目的
コード(イ)は、レジスタR0とR4に定数を設定する不変
命令が存在する。この命令の検出は、予めリストアップ
された不変命令と目的コードとの比較を行なえばよく、
又、不変命令の位置は、その命令のアドレスにより検出
できる。これが第6図のステップS1の処理である。
次に、仮想レジスタのlive解析を行なう(ステップS
2)。これは、第4図で示したように、レジスタの定義
位置,最終使用位置等を判定し、各レジスタ毎に、その
使用された行番号等を対応付け、テーブルデータを作成
することにより実行される。
次に、ステップS3において、不変命令移動の最適化が
行なわれる。これは、例えば、ループ中に含まれる不変
命令をループの外側に出したりする処理を含む。これに
は、第7図の処理も含まれる。
即ち、第7図において、先ず仮想レジスタを1つ取出
し、これが移動できるか否かを判断する(ステップS
2)。移動できる場合には、不変命令をその使用直前位
置に移動する(ステップS3)。移動できない場合には、
ステップS4に直接移行する。そして、ステップS4におい
て、他に仮想レジスタがあるか否かが判断され、他の仮
想レジスタがある場合には、ステップS1〜ステップS3の
判断や処理を繰返す。また、ステップS4で仮想レジスタ
が他にない場合には、ステップS5に移行し、移動した命
令があったか否かを判断し、なければ不変命令の移動処
理は終了し、移動した命令があった場合には、第6図の
ステップS1へ移行する。
第6図において、不変命令移動最適化処理を実行した
後には、ステップS4において、命令が移動できたか否か
を判断し、移動できた場合にはステップS1に戻る。
即ち、命令の移動を行なう度に、レジスタの使用状況
把握を行なってlive解析をし、不変命令移動という処理
を繰返して、プログラムの最適化を行なう。これは、命
令の移動によって、その都度変わるレジスタのlive区間
に従って、レジスタの割付けが適当か否かを判断するた
めである。
ステップS4において、既に移動できるものがなくなっ
た場合には、ステップS5に移行し、干渉グラフの作成が
行なわれる。
第8図に、干渉グラフの説明図を示す。
干渉グラフというのは、図のように、プログラム中で
使用されるレジスタが、例えば、図(a)のように、VR
1,VR2,VR0の3つであるとする。このとき、プログラム
中で相互に干渉する場合のあるレジスタ同士を図のよう
に直線で結ぶ。即ち、相互に直線で結ばれたレジスタ同
士は、プログラム中で干渉する場合があり、同一の実レ
ジスタに割当てることができない。従って、VR1とVR2は
同一のレジスタに割当てることができず、又、VR2とVR0
も同一のレジスタに割当てることはできない。
しかしながら、VR1とVR0は、干渉しないため、同一の
レジスタに割当てることができる。その結果、第8図
(a)の場合、2つの実レジスタがあればよいことにな
る。このような干渉グラフは、テーブルデータにより容
易に作成できる。
ここで、直線で結ばれた2つのレジスタに、それぞれ
異なる色を付けるようにし、実レジスタ数で色分けが可
能であるかを調べれば、この処理では、実際にレジスタ
割付けが可能かどうかの判定ができる。
これは、例えば第8図(b)に示すように、先ず、レ
ジスタVR1,VR2,VR3,VR0を使用したレジスタ干渉グラフ
を作成すると、何れかのレジスタに着目し、実レジスタ
数をnとした場合に、そのレジスタから出ている直線の
数がnより小さい場合、このノードを取去る。そして、
同様の処理を終束するまで繰返し、この処理によってグ
ラフが空になれば、グラフのn色の色分けが可能という
判断ができる。
第8図(b)の例の場合、レジスタVR1に着目する
と、直線の数は1本で、ここで、例えば実レジスタ数を
“2"とすると、この直線は“2"より小さいため消去で
き、図の矢印の方向に示すように、レジスタVR0,VR2,VR
3の干渉グラフに書換えられる。更に、レジスタVR0につ
いて同様の処理を行なえば、又、矢印の向きに示すよう
に、レジスタVR2,VR3のみの干渉グラフに書き換わる。
最後に、レジスタVR3について同様の処理を行なえ
ば、この干渉グラフは空になり、2色の色分けが可能と
いう判定ができる。従って、実レジスタが“2"の場合、
レジスタ割付けが可能という判断ができる。このような
処理も、プログラム上、テーブルの比較等により容易に
できる。
一方、第8図(c)に示したように、例えば、それぞ
れのレジスタVR1,VR2,VR3,VR0に接続された直線が何れ
も3本の場合、実レジスタ数が“2"では、直線の消去が
できない。従って、このような場合には、割付けが不可
能となる。
第6図のフローチャートにおいて、ステップS5におい
て、先に示した干渉グラフを作成し、ステップS6におい
て、先に説明した要領で直線を消去していく干渉グラフ
の縮退を行なった後(ステップS6)、色分けができたか
否かの判断を行なう(ステップS7)。そして、色分けが
できた場合には、実レジスタの割付けが完了し、色分け
のできない場合には、ステップS8に移行し、spillコー
ドの挿入が行なわれる。
第9図に、spillコード挿入例を示す。
このspillコード挿入というのは、仮想レジスタの値
の退避/復元を行なう擬似コードを挿入することによっ
て、仮想レジスタのlive区間を変更させる処理である。
即ち、プログラムがある位置で干渉している仮想レジ
スタの数が、実際の装置の実レジスタの数を越えている
場合、その位置で干渉している仮想レジスタ数を減らす
必要が生じる。この場合の処理を、spillコード挿入処
理といい、挿入したコードのことをspillコードとい
う。spillコードは、レジスタの値をメモリへ一旦退避
し、メモリからレジスタへ復元するようなコードであ
る。退避するspillコードは、値を定義した命令のすぐ
後に挿入し、値の使用の前に挿入する。
即ち、例えば、第9図に示すものの場合、最大3つの
レジスタが干渉しているが、実レジスタが2つしかない
場合に、ここで、最初のロード命令と最後の加算命令ま
でのレジスタVR0のlive区間を短縮するよう作用する。
即ち、最初のレジスタVR0の内容は、図中、の命令に
よりメモリに退避される。そして、最後の加算命令の直
前で、レジスタVR0に退避された内容が復帰される。こ
れによって、レジスタVR0を、2番目の命令から最後の
命令の値までの間に他の用途に使用することができ、実
レジスタ数を減少できる。
以上のような処理の結果、第1図に示したように、第
1図左側の目的コード(イ)が、右側の目的コード
(ロ)に変換される。
図から明らかなように、上記処理によって、実レジス
タを、R0のみで使用した右側に示した目的コード(ロ)
が実行される。しかも、その目的コードの全体のサイズ
を縮小することができ、処理の効率化と高速化を図るこ
とができる。このような処理は、不変命令の移動による
最適化を繰返すと共に、仮想レジスタのlive解析を行な
って、レジスタの割付け状態を把握するといった作業
を、不変命令の移動が可能な限り実行することにより達
成できる。
尚、不変命令の移動ができるか否かの条件としては、
先に説明したように、1回の定義がなされ、その使用が
1回であることが条件となる。また、移動先は、ループ
外であることが必要となる。不変命令をループ内へ移動
すれば、無駄な処理が繰返されることは明らかだからで
ある。
上記実施例によれば、不変命令の検出,レジスタ割付
け状態の解析等をテーブルデータ等を用いて容易に実施
できる。
(発明の効果) 以上説明した本発明のプログラム最適化装置によれ
ば、不変命令の移動によってレジスタのlive区間が短縮
され、他の仮想レジスタとの干渉を減らし、干渉呼出し
を跨ぐような動作が避けられるため、レジスタの使用を
減らすことができる。また、余剰のレジスタを使用し
て、新たな処理も可能となる。
更に、上記処理によって、目的コードのサイズを小さ
くすることができ、高速動作する実行特性を持つ目的コ
ードを生成できる。更に、従来のような定数伝播の最適
化といった複雑な処理を必要とせず、コンパイル時間の
短縮を図ることができる。
【図面の簡単な説明】
第1図は本発明のプログラム最適化装置動作説明図、第
2図は従来のレジスタ割付け方法説明図、第3図は従来
の最適化処理方法説明図、第4図はlive区間の説明図、
第5図は干渉グラフの説明図、第6図は本発明の装置の
全体動作フローチャート、第7図は本発明の装置の最適
化動作フローチャート、第8図は干渉グラフ例説明図、
第9図はspillコード挿入例説明図である。 1……検出手段、2……解析手段、3……最適化手段。

Claims (1)

    (57)【特許請求の範囲】
  1. 【請求項1】高水準言語で記述されたソースプログラム
    をアセンブリ言語で記述されたオブジェクトプログラム
    に変換するコンパイラに設けられるプログラム最適化装
    置において、 前記オブジェクトプログラムにおける1度の定義で1度
    の使用がされる不変命令を検出する検出手段と、 前記不変命令を検出するたびに前記不変命令の定義位置
    から前記不変命令の使用位置までの間におけるレジスタ
    割付け状態を解折して、レジスタの干渉を少なくするよ
    うなレジスタの割付けが可能か否かの判定を行う解折手
    段と、 前記レジスタの割付けが可能な場合に、前記不変命令の
    定義位置を前記不変命令の使用位置直前に移動する最適
    化手段と を備えたことを特徴とするプログラム最適化装置。
JP2273183A 1990-10-15 1990-10-15 プログラム最適化装置 Expired - Fee Related JP3004340B2 (ja)

Priority Applications (1)

Application Number Priority Date Filing Date Title
JP2273183A JP3004340B2 (ja) 1990-10-15 1990-10-15 プログラム最適化装置

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP2273183A JP3004340B2 (ja) 1990-10-15 1990-10-15 プログラム最適化装置

Publications (2)

Publication Number Publication Date
JPH04149738A JPH04149738A (ja) 1992-05-22
JP3004340B2 true JP3004340B2 (ja) 2000-01-31

Family

ID=17524258

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2273183A Expired - Fee Related JP3004340B2 (ja) 1990-10-15 1990-10-15 プログラム最適化装置

Country Status (1)

Country Link
JP (1) JP3004340B2 (ja)

Families Citing this family (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP4778286B2 (ja) * 2005-09-28 2011-09-21 パナソニック株式会社 コンパイラ装置

Non-Patent Citations (1)

* Cited by examiner, † Cited by third party
Title
「インターフェイス」No.142(1989−3)CQ出版社、p.204−207

Also Published As

Publication number Publication date
JPH04149738A (ja) 1992-05-22

Similar Documents

Publication Publication Date Title
JP3220055B2 (ja) 機械語命令列またはアセンブリ言語命令列を最適化する最適化装置、及び、高級言語で記載されたソースプログラムを機械語またはアセンブリ言語の命令列に変換するコンパイラ装置。
KR101360512B1 (ko) 기록 마스크를 사용하는 simd 아키텍처에 의한 레지스터 할당
JP4573189B2 (ja) プログラムコード変換方法
JP3311462B2 (ja) コンパイル処理装置
US20110119660A1 (en) Program conversion apparatus and program conversion method
JPH01121938A (ja) オブジェクト生成方法
EP0533813A4 (en) Method for representing scala data dependencies for an optimizing compiler
JP3606387B2 (ja) コンパイル装置
JPH04503416A (ja) データフローマルチプロセサシステム
JP3651774B2 (ja) コンパイラ及びそのレジスタ割付方法
JPS6325733A (ja) コンパイラ処理方式
JP3004340B2 (ja) プログラム最適化装置
JP3318051B2 (ja) 翻訳処理方法
JP2002297399A (ja) 静的単一代入を行うためのφ関数を与える方法
JP2003216442A (ja) プログラム変換方法、これを用いたコンピュータ装置及びプログラム
JP2003256215A (ja) プログラム変換方法、これを用いたデータ処理装置及びプログラム
JP2019164704A (ja) コンパイラ
JPH02236638A (ja) レジスタ割付け管理方式
JPS58149567A (ja) ベクトル・レングス制御範囲融合処理方式
JPS63163636A (ja) 並列処理実行方式
JPH06324882A (ja) コンパイラ装置
JPH0373026A (ja) コンパイル方式
JPH04178738A (ja) レジスタアロケーション方式
JPH05158707A (ja) 実レジスタ割付け方法
JPH06301549A (ja) プログラム翻訳装置

Legal Events

Date Code Title Description
LAPS Cancellation because of no payment of annual fees