JPH09265400A - コンパイル最適化方式 - Google Patents

コンパイル最適化方式

Info

Publication number
JPH09265400A
JPH09265400A JP8074548A JP7454896A JPH09265400A JP H09265400 A JPH09265400 A JP H09265400A JP 8074548 A JP8074548 A JP 8074548A JP 7454896 A JP7454896 A JP 7454896A JP H09265400 A JPH09265400 A JP H09265400A
Authority
JP
Japan
Prior art keywords
instruction
address register
update
compound
processing
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
JP8074548A
Other languages
English (en)
Inventor
隆裕 ▲廣▼▲瀬▼
Takahiro Hirose
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.)
Hitachi Ltd
Original Assignee
Hitachi 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 Hitachi Ltd filed Critical Hitachi Ltd
Priority to JP8074548A priority Critical patent/JPH09265400A/ja
Publication of JPH09265400A publication Critical patent/JPH09265400A/ja
Pending legal-status Critical Current

Links

Landscapes

  • Devices For Executing Special Programs (AREA)

Abstract

(57)【要約】 【課題】計算機の利用において、命令数を削減し、処理
速度を向上する。 【解決手段】最適化処理404は、中間コード501を
入力として受け取り、これに複合命令化処理を施して最
適化された中間コード507を出力する。まず始めに処
理502で、中間語の走査を行って、複合化対象の命令
を検出する。走査する範囲はループの内側である。検出
対象は配列要素のLD/ST命令と配列のアドレスレジ
スタを更新する命令である。検出した配列LD/ST命
令は、参照するアドレスレジスタごとに分類して解析グ
ラフに登録する。アドレスレジスタ更新命令もレジスタ
ごとに分類する。次に複合命令化解析503を行い、解
析結果は登録テーブル内のリストに記録する。最後に、
登録テーブル内を順に走査する。505で複合命令化で
きるかどうか判断し、複合命令化可能と判断された場合
は、506で中間語を書き換えて複合命令を作る。

Description

【発明の詳細な説明】
【0001】
【発明の属する技術分野】計算機の利用技術において、
実行命令数を削減する、コンパイル方法に関する。
【0002】
【従来の技術】コンパイラの生成する目的プログラムの
実行速度を向上させるための最適化方式は、これまでに
も数多く開発されている。A.V.エイホ、R.セシィ、
J.D.ウルマン著「コンパイラ」等で詳しく述べられて
いる。最適化方式の一つとして、複合命令を利用する方
法がある。複合命令とは複数の機能を1命令で処理する
命令である。複合命令を使えば実行命令数を削減できる
ので、処理の高速化を図ることができる。
【0003】多くのアーキテクチャーでは、メモリをア
クセスすると同時に、アドレスを指定するレジスタを更
新する複合命令を備えている。このタイプの複合命令に
は2種類ある。一つはメモリをアクセスする前にアドレ
スレジスタを更新するタイプ。もう一つは、メモリをア
クセスした後にアドレスレジスタを更新するタイプであ
る。これらは各社でいろいろな名前で呼ばれているが、
ここでは便宜的に、前者をupdate命令、後者をmodify命
令と呼ぶことにする。図1は、update命令とmodify命令
の動作を擬似的なアセンブラコードで示している。2命
令必要なところを1命令でまとめて実行できる。通常、
複合命令は1命令と同じ時間で実行できるので、1命令
分の実行時間を削減することができる。
【0004】例題を使ってコンパイラの処理を示す。処
理手順は以下のようになる。
【0005】(1)対象となるLD/ST命令とアドレ
スレジスタ更新命令を検出する。
【0006】(2)アドレスレジスタ更新命令をLD/
ST命令の直後に移動する。移動ができる条件は、LD
/ST命令からアドレスレジスタ更新命令に至る経路
に、命令の移動を妨げるようなデータ依存がないことで
ある。一般に、依存関係のない命令の実行順序は任意で
ある。例えば、z=x+yという命令と、c=a+bと
いう命令は、依存関係がないので、実行順序は任意であ
る。c=a+bをz=x+yの前に移動しても、なんら
問題は起きない。しかし、z=x+yとc=z+bは、
変数zの依存関係があるので、実行順序を換えると結果
不正になってしまう。
【0007】(3)二つの命令をまとめて、複合命令に
変換する。
【0008】この様子を図2に示す。煩雑さを避けるた
め、複合命令化に関係したループ内部の命令のみを示し
ている。図2のプログラムは、ループ処理によって、配
列aを連続アクセスしている。複合命令はこのような場
合に特に有効である。図2(b)は、プログラムを擬似
アセンブラコードで示し、データフローグラフを使って
制御の流れを表現している。このプログラムに対して
(2)を適用し、レジスタ更新命令をLD命令の直後に
移動する。その結果が図2(c)である。図では省略し
てあるが、ADD命令を移動する経路にr1の参照がな
いことを確認しておかなくてはならない。もし、r1の
参照があればADD命令の移動はできないので、複合命
令化もできない。移動ができたら、(3)を適用し、mo
dify命令を生成する。
【0009】update命令しか持っていない処理系の場合
は、手順(2)と(3)の間にもう一段処理が必要にな
る。
【0010】(2′)LD/ST命令とレジスタ更新命
令を交換し、複合命令に適した順序にする。
【0011】LD/ST命令とレジスタ更新命令は、デ
ータ依存関係があるので、本来交換できない。それを交
換するためには、アドレスレジスタの初期値を補正した
り、ループ脱出条件を修正したりという、特別な補正処
理が必要である。例題では、r1の初期値を補正する命
令SUBr1,4,r1をループの前に追加しなくては
ならない。ただし、図はループ内部を示しているので、
補正コードは示されていない。
【0012】処理(2′)が必要になるかどうかはプロ
グラムのデータフロー構造に依存する。modify命令でも
必要になる場合がある。一般的なプログラムの慣習で
は、ループの最後にまとめてレジスタの更新を行う場合
が多い。そのため、update命令を使う場合は、(2′)
が必要になることが多い。
【0013】
【発明が解決しようとする課題】処理系がupdate命令し
か持っていない場合に、図3のようなプログラムを考え
る。プログラムの構造を判り易くするために、フローグ
ラフを使ってプログラムの命令コードを示す。図4はそ
のフローグラフである。このプログラムは図5のように
変換すれば、update命令を使って最適化できる。しか
し、従来の処理方式では、変換することができない。
【0014】(1)を適用した後に、(2)を適用して
更新命令を移動することを考える。図6に示すように、
移動する場所としては2ヵ所考えられる。(i)地点に
移動すると、ブロック2に処理が流れた場合に不正にな
ってしまう。ブロック2のLD命令に、更新した後のア
ドレスレジスタが渡ってしまうからである。(ii)地点
に移動すると、ブロック1からブロック3に直接処理が
流れた場合に不正になってしまう。アドレスレジスタの
更新が全く行われないので、次のループ繰り返し回に、
不正なアドレスレジスタが渡ってしまう。(i)と(i
i)の両方に挿入しても、やはり不正になってしまう。
【0015】結局、アドレスレジスタ更新命令を移動す
ることができないので、(2)の段階で処理を中止せざ
るを得ない。当然のことながら、(3)の処理には進め
ない。従来方式では、最適化することができない。
【0016】
【課題を解決するための手段】上記の課題を解決するた
め、以下のような手段を設ける。
【0017】(1)データフロー解析を行って、LD/
ST命令をupdate命令に変換できるかどうか調べる。変
換できる場合はLD/ST命令をupdate命令に置換し、
アドレスレジスタ更新命令を削除する。
【0018】これにより、命令を移動する段階を経るこ
となく、直接update命令を生成することができる。命令
の移動ができないプログラムであっても、最適化するこ
とができる。
【0019】
【発明の実施の形態】発明のための例題プログラムとし
て、先に挙げた図3を用いる。
【0020】図7にコンパイラの全体構成を示す。原始
プログラム401をコンパイラ402に入力し、目的プ
ログラム406を出力する。取り込まれたプログラム
は、403で構文解析を行った後に、中間コードに変換
される。次に、最適化部404は、中間コードに対して
データフロー解析を含む様々な最適化処理を行う。最後
に、コード生成部405が、中間コードを目的プログラ
ム406に変換して出力する。
【0021】図8に最適化処理の内部構成を示す。最適
化処理部では複合命令化以外にも多数の最適化を行って
いるが、説明のため、複合命令生成に関係する最適化処
理のみを示している。
【0022】最適化処理404は、中間コード501を
入力として受け取り、これに複合命令化処理を施して最
適化された中間コード507を出力する。
【0023】まず始めに処理502で、中間語の走査を
行って、複合化対象の命令を検出する。走査する範囲は
ループの内側である。検出対象は配列要素のLD/ST
命令と配列のアドレスレジスタを更新する命令である。
検出した配列LD/ST命令は、参照するアドレスレジ
スタごとに分類して解析グラフに登録する。アドレスレ
ジスタ更新命令もレジスタごとに分類する。同一のアド
レスレジスタを参照しているLD/ST命令と更新命令
は同一のグループに分類する。登録するテーブルの詳細
は後に述べる。
【0024】次に複合命令化解析503を行い、解析結
果は登録テーブル内のリストに登録する。解析方式の詳
細も後に述べる。
【0025】最後に、登録テーブルを順に辿って、実際
に複合命令を生成する。テーブルのリストの中には対応
する中間語へのポインタを格納するフィールドがあるの
で、これを利用して、中間語を書き換えて、複合命令を
生成する。まず504で、登録テーブル内を順に走査す
る。505で、複合命令化できるかどうか、解析結果を
記録したフィールドを見て判断する。ここで複合命令化
可能と判断された場合は、506で中間語を書き換え
て、複合命令を作る。これらの処理の詳細も後に述べ
る。
【0026】解析グラフとは、データフロー構造を反映
したグラフと、検出した命令を登録するエントリーから
なる。例題プログラムの場合で言えば、図4に相当す
る。グラフの詳細は解析の実装方式に依存するので、様
々な実例が存在する。解析する命令が多い場合は、アド
レスレジスタごとにグラフを作るよりも、グラフを一つ
だけ作成して、ビットベクトルを使ってまとめて解析し
たほうが効率的である。ここで使用するアルゴリズムは
available expressionと呼ばれるもので、共通式削除の
アルゴリズムとし広く利用されている。解析の詳細は後
で述べる。
【0027】図9は登録部のデータ構造を示している。
600は登録するテーブルである。登録する命令は、ま
ず、参照しているアドレスレジスタによって分類され
る。例題では、R1を参照しているので、601のエン
トリーに登録することになる。アドレスレジスタに対応
するエントリーは、2つのリストを持っている。一つは
LD/ST命令の位置を格納しておくためのリストであ
り、もう一つはアドレスレジスタ更新命令の位置を覚え
ておくためのリストである。602、603はLD/S
T命令を登録するリストであり、604はアドレスレジ
スタ更新命令を登録するリストである。リストの要素に
は、中間語を指すポインタのフィールドがあり、これで
登録した命令のプログラム上の位置を知ることができ
る。もう一つ、解析結果を格納しておくためのフィール
ドも持っている。解析が終わった後、このフィールドの
内容を参照しながら、複合命令を生成する。
【0028】ここで利用するavailable expressionと呼
ばれる解析アルゴリズムについて述べる。available ex
pressionは共通式削除と呼ばれる最適化のために開発さ
れたものであり、コンパイラの教科書でも扱われている
標準的なものである。アルゴリズムの原理や詳細な方式
はA.V.エイホ、R.セシィ、J.D.ウルマン著「コン
パイラ」等で詳しく解説されている。ここでは、アルゴ
リズムの詳細ではなく、概要のみを述べる。
【0029】図7に共通式削除の例を示す。図10
(a)の701は、共通式削除を説明するための例題プ
ログラムである。図10(b)は、例題プログラムのフ
ローグラフである。図の中には、参考のために、availa
ble expression解析の結果も示してある。例題プログラ
ムは、711,712,713という3つの基本ブロッ
クからなる。この中には、A+Bという同じ演算が3ヵ
所にある。これらはいずれも同じ結果を与えるので、最
初の1回だ計算を実行して、2回目以降は1回目の結果
を参照すればよい。このような変換を行うと、演算数を
削減できるので、プログラムの実行を高速化することが
できる。available expressionは、検出した部分式のう
ち、どの部分式が削除可能で、どの部分式の計算結果を
保存しておくべきかを判定するアルゴリズムである。例
題プログラムの解析を行った結果を図10(b)の右側
に示してある。DEFINEと判定された部分式は計算
結果を保存しておくべきことを示している。DELET
Eと判定された部分式は、実際に計算を行う必要はな
く、保存しておいた計算結果を参照すれば良いことを示
している。available expressionは任意の制御構造を持
つプログラムに適用可能な汎用アルゴリズムである。
【0030】available expressionを用いて、複合命令
を生成する方式を述べる。LD/ST命令とアドレスレ
ジスタ更新命令を部分式であるかのようにみなして解析
を行う。命令を移動することなく、どのLD/ST命令
をupdate命令に変換すれば良いかを直接判定する。
【0031】計算を実行すると、それぞれ登録した点に
ついて解析結果が得られる。先に述べたように解析結果
は3通りある。
【0032】(1)この部分式は削除可能。(DELE
TE) (2)この部分式の位置に一時変数の定義をつける。
(DEFINE) (3)この部分式は削除不可能。
【0033】これは共通式削除のときの解釈である。複
合命令生成処理に利用するときは以下のように解釈す
る。
【0034】(1)と判定された配列参照はupdate命令
に変換する。(2)と判定された配列参照はそのままで
良い。アドレスレジスタ更新命令はすべて(1)でなく
てはならない。もし、(2)(3)と判定されたアドレ
スレジスタ更新命令があったら、そのアドレスレジスタ
に対応する配列参照は、複合命令に変換することができ
ない。
【0035】この解釈を複合命令生成処理に適用した例
を図11に示す。プログラムの制御構造は図10の例題
と同じである。部分式演算の代わりに、基本ブロック8
01、802にはLD命令があり、基本ブロック803
にはアドレスレジスタ更新命令がある。801は、DE
FINEと解析結果が出ているので、update命令に変換
すれば良いことが判る。802は、DELETEなので
そのままで良い。803は、更新命令でかつDELET
Eなので、命令を削除しなくてはならない。
【0036】解釈の一覧表を図12の901にまとめて
ある。複合命令化の変換を行ったら、アドレスレジスタ
の初期値を補正しなくてはならない。更新と参照の順序
が逆になるので、更新値を引いた値を新しい初期値とし
て設定する。
【0037】これまでに述べたような解釈ができる理由
を簡単に述べる。update命令を生成するとき問題となる
のは、どのLD/ST命令をupdate命令化するかという
問題である。updateしたアドレスレジスタは、対象とな
るすべてのLD/ST命令に行き渡ってくれなくてはな
らない。漏れがあると、誤ったアドレスをアクセスして
しまう。available expressionでDELETEと判定さ
れた命令は、DEFINEと判定された命令から正しい
データを受け取ることができると保証されている。共通
式削除で渡すデータは演算結果であるが、複合命令化処
理で渡すデータは更新済みのアドレスレジスタである。
つまり、DEFINEと判定された命令でアドレスレジ
スタを更新しておけば、DELETEと判定された命令
は更新済みのアドレスレジスタを参照することができる
のである。update命令でアドレスレジスタを更新するこ
とができれば、元のアドレスレジスタ更新命令は不要に
なる。
【0038】複合命令化できるどうか判定する手順を図
13に示す。処理は、available expression解析が終わ
った後に、アドレスレジスタごとに作成したエントリー
単位で実施する。1001でエントリーが保持している
更新命令のリストを順番に辿る。次に、1002で、リ
ストの中の解析結果のフィールドを調べる。この結果が
DELETEになっていれば、その更新命令は削除でき
るので、さらに次のリストを辿る。もし、DELETE
になっていない更新命令があれば、複合命令化はできな
いので、処理を抜けて504に戻る。エントリー内のす
べての更新命令がDELETEになっていれば、複合命
令化可能なので、判定処理を抜けて、次の複合化変換処
理に移る。
【0039】実際に複合命令に変換する処理の手順を図
14に示す。まず、1102で登録されている更新命令
をすべて削除する。エントリーから更新命令のリストを
順に辿る。登録リストのポインタから、対応する中間語
命令を削除する。この手順を繰り返して、登録されてい
る更新命令をすべて削除する。
【0040】次に、1103でLD/ST命令のリスト
を手繰る。1104で、リストの中の解析結果のフィー
ルドを調べる。もし、解析結果フィールドにDEFIN
Eが設定されているLD/ST命令を見つけたら処理1
105に移り、そうでなければ1103に戻る。110
5では、登録リストのポインタから対応する中間語命令
を見つけ、複合命令型の中間語命令に変換する。参照す
るレジスタ等はそのままで、命令をupdate命令に変換す
るだけで良い。
【0041】リストの処理が終わったら、最後に110
6で初期値の修正を行う。ループプリヘッダーの中を走
査して、アドレスレジスタの値を設定している命令を捜
す。初期値の補正方式は2通りある。アドレスレジスタ
の初期化命令が、定数の代入命令であれば、定数値を修
正すれば良い。そうでないならば、更新値の分だけアド
レスレジスタの値を減分する命令を挿入する。
【0042】図12に最適化前と最適化後のプログラム
を示す。図15(a)の1201は最適化前のプログラ
ムのループ部分を擬似的なアセンブラコードで示してい
る。図15(b)の1202は最適化後のプログラムの
ループ部分を擬似的なアセンブラコードで示している。
最適化の前後のコードを比較すると、LDとADDが複
合命令LDuに統合されたので、命令数にして約17%
削除されている。プログラムの実行時間は、実行環境や
アーキテクチャの詳細に依存するので、必ずしも、命令
数に比例するわけではない。しかし、大まかに最適化の
効果を見積もるのであれば、約17%程度の速度向上を
期待して良いであろう。
【0043】
【発明の効果】実行命令数が減り、目的プログラムの実
行速度が高速化される。
【図面の簡単な説明】
【図1】複合命令の動作の説明図である。
【図2】従来方式による複合命令生成方式の説明図であ
る。
【図3】従来方式では最適化できないプログラムの例題
図である。
【図4】例題のループ内側をフローグラフで表現した図
である。
【図5】update命令を使って最適化した図である。
【図6】命令の移動ができないことを説明するための図
である。
【図7】コンパイラの全体構成を示す図である。
【図8】複合命令生成による最適化処理の構成を示す図
である。
【図9】最適化対象命令を登録するテーブルの構造の説
明図である。
【図10】available expressionによる共通式削除方式
を説明する図である。
【図11】available expressionを複合命令生成向けに
解釈することを説明する図である。
【図12】available expressionの解釈をまとめた図で
ある。
【図13】複合命令生成の可否を決定する手順を説明す
る図である。
【図14】中間語を書き換えて複合命令を生成する手順
を説明する図である。
【図15】最適化の効果を説明するために擬似的なアセ
ンブラコードである。
【符号の説明】
401…原始プログラム、402…コンパイラ、406
…目的プログラム。

Claims (1)

    【特許請求の範囲】
  1. 【請求項1】コンパイル方式において、入力プログラム
    内の、配列要素アクセス命令と配列アドレスレジスタ更
    新命令を複数の基本ブロックにまたがって検出し、配列
    アクセスと更新を同時に実行する命令に置換することを
    特徴とするコンパイル方法。
JP8074548A 1996-03-28 1996-03-28 コンパイル最適化方式 Pending JPH09265400A (ja)

Priority Applications (1)

Application Number Priority Date Filing Date Title
JP8074548A JPH09265400A (ja) 1996-03-28 1996-03-28 コンパイル最適化方式

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP8074548A JPH09265400A (ja) 1996-03-28 1996-03-28 コンパイル最適化方式

Publications (1)

Publication Number Publication Date
JPH09265400A true JPH09265400A (ja) 1997-10-07

Family

ID=13550425

Family Applications (1)

Application Number Title Priority Date Filing Date
JP8074548A Pending JPH09265400A (ja) 1996-03-28 1996-03-28 コンパイル最適化方式

Country Status (1)

Country Link
JP (1) JPH09265400A (ja)

Cited By (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2002527815A (ja) * 1998-10-10 2002-08-27 ヴィクトリア・ユニバーシティ・オブ・マンチェスター プログラムコード変換方法
JP2004272927A (ja) * 2004-04-26 2004-09-30 Matsushita Electric Ind Co Ltd プロセッサ及びコンパイル装置
US7076638B2 (en) 2001-09-20 2006-07-11 Matsushita Electric Industrial Co., Ltd. Processor, compiler and compilation method
JP2018500657A (ja) * 2014-12-23 2018-01-11 インテル・コーポレーション 融合された単一のサイクルのインクリメント−比較−ジャンプを実施するための命令及びロジック

Cited By (12)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2002527815A (ja) * 1998-10-10 2002-08-27 ヴィクトリア・ユニバーシティ・オブ・マンチェスター プログラムコード変換方法
JP2010198629A (ja) * 1998-10-10 2010-09-09 Internatl Business Mach Corp <Ibm> プログラムコード変換方法
JP2010198628A (ja) * 1998-10-10 2010-09-09 Internatl Business Mach Corp <Ibm> プログラムコード変換方法
JP2010211816A (ja) * 1998-10-10 2010-09-24 Internatl Business Mach Corp <Ibm> プログラムコード変換方法
JP2010225162A (ja) * 1998-10-10 2010-10-07 Internatl Business Mach Corp <Ibm> プログラムコード変換方法
US8006237B2 (en) 1998-10-10 2011-08-23 International Business Machines Corporation Program code conversion
US8037461B2 (en) 1998-10-10 2011-10-11 International Business Machines Corporation Program code conversion
US7076638B2 (en) 2001-09-20 2006-07-11 Matsushita Electric Industrial Co., Ltd. Processor, compiler and compilation method
CN100392596C (zh) * 2001-09-20 2008-06-04 松下电器产业株式会社 编译装置及编译方法
US7761692B2 (en) 2001-09-20 2010-07-20 Panasonic Corporation Processor, compiler and compilation method
JP2004272927A (ja) * 2004-04-26 2004-09-30 Matsushita Electric Ind Co Ltd プロセッサ及びコンパイル装置
JP2018500657A (ja) * 2014-12-23 2018-01-11 インテル・コーポレーション 融合された単一のサイクルのインクリメント−比較−ジャンプを実施するための命令及びロジック

Similar Documents

Publication Publication Date Title
JP4573189B2 (ja) プログラムコード変換方法
US5650948A (en) Method and system for translating a software implementation with data-dependent conditions to a data flow graph with conditional expressions
US20210089283A1 (en) Direct function call substitution using preprocessor
US7793270B2 (en) Method and apparatus for performing incremental validation of program code conversion
JPH05257709A (ja) 並列化判別方法およびそれを用いた並列化支援方法
JPH06314203A (ja) コンパイラの最適化方法および装置
JP4346316B2 (ja) 複数の意味レベルによるアスペクト指向プログラミングのための方法
US20050028148A1 (en) Method for dynamic recompilation of a program
JPH06324881A (ja) メモリデータの重なり判定機能を備えたコンパイラ装置
US6519768B1 (en) Instruction translation method
JP3539613B2 (ja) ループ飛び出し文を含むループに対する配列サマリ解析方法
US5854928A (en) Use of run-time code generation to create speculation recovery code in a computer system
JPH09265400A (ja) コンパイル最適化方式
JP2002527816A (ja) プログラム最適化装置および方法
JPH06309193A (ja) 機械語プログラムの動作検証方法および装置
JP3266097B2 (ja) 非リエントラントプログラムの自動リエントラント化方法及びシステム
JPH10320212A (ja) キャッシュ向け最適化方法
JPH09282173A (ja) プログラムの静的解析方法
EP1033651B1 (en) Instruction translation method
JP3424596B2 (ja) シンボル参照情報のキャッシュ方法ならびに装置
JP3018783B2 (ja) コンパイル方式
JPH11161500A (ja) 実行時依存解析を行う目的プログラムの生成方法
JPH06119203A (ja) デバック行削除装置
JPH11194947A (ja) ループ分割方法
GB2347526A (en) Instruction translation method using templates