JPH11161500A - 実行時依存解析を行う目的プログラムの生成方法 - Google Patents

実行時依存解析を行う目的プログラムの生成方法

Info

Publication number
JPH11161500A
JPH11161500A JP9327623A JP32762397A JPH11161500A JP H11161500 A JPH11161500 A JP H11161500A JP 9327623 A JP9327623 A JP 9327623A JP 32762397 A JP32762397 A JP 32762397A JP H11161500 A JPH11161500 A JP H11161500A
Authority
JP
Japan
Prior art keywords
variable
loop
alias
program
array
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
JP9327623A
Other languages
English (en)
Inventor
Shigehisa Sato
茂久 佐藤
Takayoshi Iizuka
孝好 飯塚
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
Real World Computing Partnership
Original Assignee
Hitachi Ltd
Real World Computing Partnership
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, Real World Computing Partnership filed Critical Hitachi Ltd
Priority to JP9327623A priority Critical patent/JPH11161500A/ja
Publication of JPH11161500A publication Critical patent/JPH11161500A/ja
Pending legal-status Critical Current

Links

Landscapes

  • Devices For Executing Special Programs (AREA)

Abstract

(57)【要約】 【課題】変数間に動的な別名関係があるために、特にル
ープ中で参照されるデータの依存関係について、静的な
解析では十分な解析精度の得られないプログラムに対し
て最適化を行うこと。 【解決手段】フロントエンド104がソースプログラム
101から生成した中間コードに対して、制御フローと
変数間の別名関係を静的に解析し(105)、得られた
別名関係を元に変数の集合を同値類に分割し(10
7)、各同値類に属する変数の参照をその同値類の代表
変数を用いて表すことでプログラム中の別名変数の参照
を消去し(108)、別名変数の参照のない中間コード
に対して依存関係の成立する条件の付加されたデータ依
存情報を求め(109)、実行時に依存関係の有無を判
断して最適なコードを選択実行できるような目的プログ
ラム103を生成する(110,111)。

Description

【発明の詳細な説明】
【0001】
【発明の属する技術分野】本発明は、プログラミング言
語で記述されたソースプログラムを、同じあるいは別の
プログラミング言語や機械語で記述された目的プログラ
ムに変換する言語処理系において、より実行速度の優れ
た目的プログラムを生成するための最適化を行う方法に
関し、特にポインタに起因する別名関係の存在するプロ
グラムに対して実行時依存解析を行うコードを生成する
方法に関する。
【0002】
【従来の技術】最適化コンパイラ等の言語処理系が目的
プログラムの実行性能を改善するためにプログラムの最
適化を行う際には、プログラムの制御の流れやデータの
流れ等の情報を出来るだけ正確に解析する必要がある。
最適化の効果が顕著であるループは配列の参照を含むこ
とが多いため、ループの最適化のために、ループの各繰
り返しで参照される配列の要素を解析する配列依存解析
が行われる。つまり、ループ中に配列要素の参照a
〔i〕,b〔i〕があり、iの値が1からnに変わる場
合に、そのループを並列化するにはそれぞれの繰り返し
が独立に実行できる必要があるが、a〔i〕やb〔i〕
という式で参照するメモリ上の位置が重なっていると、
前の繰り返しで参照したメモリ位置が他の繰り返しでも
参照されることになり、繰り返し間の依存関係が生じる
ので、この関係を解析する必要がある。C言語のように
ポインタを自由に使用できる言語の最適化のためには、
ポインタに起因する別名関係の解析(以下、ポインタ解
析とする)を精度よく行うことが重要である。ポインタ
に起因する別名関係は、例えば二つのポインタa,bが
同じアドレスを指している場合に、それらの指示先の参
照*aと*bの間に生じる。また、ポインタaが変数x
のアドレスを指している場合には、*aとbとの間に別
名関係が生じる。
【0003】C言語では、配列が引数として渡される
と、実際には配列の先頭アドレスを指すポインタが渡さ
れる。また、配列の大きさをプログラム実行時に決めら
れるように、配列を動的メモリ割り付けによって作成す
る場合には、その配列の要素は配列の先頭要素を指すポ
インタを介して参照される。このように配列の要素がポ
インタを用いて参照されることが多いため、ポインタ解
析と配列依存解析は密接に関係している。ポインタ解析
と配列依存解析は、どちらも一般にはコンパイル時に正
確な解を得ることは出来ない。そのため、コンパイル時
の解析(静的な解析)だけでなく、実行時の解析(動的
な解析)によって、データ依存関係の有無を実行時に判
定し、その結果に応じて異なるコードを実行するように
コード変換を行う最適化が知られている。配列依存関係
の実行時解析の方法は、例えばMichael Wol
fe,High Performance Compi
lers for Parallel Computi
ng,Addison−Wesley Publish
ers,1996年(文献1)の254頁から255頁
に記載されている。この方法では、ループ中に同一の配
列の参照が複数ある時に、それらの参照の間の依存関係
を実行時に判定することが出来る。しかし、この方法で
は、ある配列の参照とその配列と別名関係にある可能性
のある別の配列の参照がある場合、それらの間の依存関
係を調べることはできない。
【0004】一方、ループ中で参照される配列がポイン
タに起因した別名関係を持つときの実行時解析法として
は、例えばJ.W.Davidson and S.J
inturkar, Improving Instr
uction−levelParalelism by
Loop Unrolling and Dynam
ic Memory Disambiguation,
Proceedings of MICRO−28,p
p.125−132,1995年(文献2)の方法があ
る。この方法では、ループ中で参照される二つの配列の
参照が別名である可能性があるとき、それらの配列の先
頭アドレスと参照する添字の範囲から、二つの配列で参
照されるメモリ領域の範囲が重なり得るか否かを実行時
に判定する。
【0005】
【発明が解決しようとする課題】先ず、(文献1)の方
法では、同一の配列の参照の依存関係を実行時に判定す
ることが出来る。一方(文献2)の方法では、別名関係
にあり得る二つの配列の参照するメモリ領域が重なるか
を実行時に解析することが出来る。しかし、別名関係に
ある二つの配列を参照するループでは、これらの方法を
用いても十分な解析精度が得られない場合がある。図2
(a)のC言語で記述されたプログラムを並列化するこ
とを例に説明する。このプログラムは、引数として渡さ
れる配列a[]とb[]に対して、b[]の1番からn
番までの要素をそれぞれa[]の1番からn番までの要
素にコピーする。並列化を行う前に、並列化可能な条件
について簡単に説明する。ループの繰り返し間にまたが
る依存関係(ループ運搬依存)には、フロー依存・逆依
存・出力依存の三種類がある。ループ運搬フロー依存は
前の繰り返しで定義した値を、後の繰り返しで使用す
る。ループ運搬逆依存は前の繰り返しで値を使用した変
数に、後の繰り返しで値を定義する。ループ運搬出力依
存は異なる繰り返しで同じ変数に値を定義する場合に生
じる。このうち、ループ運搬フロー依存のあるループ
は、ある繰り返しで定義した結果を別の繰り返しで使用
するため、異なる繰り返しの文の間の実行順序が制約さ
れる。一方、ループ運搬逆依存やループ運搬出力依存は
変数のリネーミングなどの方法でこれらの依存関係を取
り除き、各繰り返しを独立に実行可能にできる。そこ
で、ここではループ運搬フロー依存のないループを並列
化可能なループとする。
【0006】従来の(文献2)の実行時依存解析の方法
では、配列a[]とb[]の参照される要素、即ちそれ
ぞれの配列の1番からn番までの要素が重ならないかど
うかを実行時に判定し、重ならないならばa[]の参照
とb[]の参照には依存関係がないものとして並列化を
行い、重なる場合には並列化されないコードを選択実行
する。この判定の条件は、具体的には(&a[n]<&
b[1])||(&b[n]<&a[1])のような式
になる。この条件を満たさない場合は、依存があるもの
と見なされる。図2(a)のループの依存関係を詳しく
分類すると、以下の4通りに分けられる。 (1)依存のない場合:(&a[n]<&b[1])|
|(&b[n]<&a[1])が成り立つとき。 (2)ループ独立依存のある場合:(&a[1]==&
b[1])が成り立つとき。 (3)ループ運搬フロー依存のある場合:(&b[1]
<&a[1])&&(&a[1]<&b[n])が成り
立つとき。 (4)ループ運搬逆依存のある場合:(&a[1]<&
b[1])&&(&b[1]<&a[n])が成り立つ
とき。
【0007】次に、(文献2)の方法では、(1)の場
合は依存がないものとして扱われるが、(2)(3)
(4)の場合は依存があり得るものとして並列化しない
ことになる。しかし、(2)の場合はループ運搬依存が
ないので並列化は可能であり、(4)の場合は適当なコ
ード変換を行うことにより、ループ運搬依存をなくすこ
とが出来る。(4)の条件が成り立つ場合に並列化を行
うための方法を以下に示す。図2(a)のプログラムで
(4)の条件が成り立つのは、配列a[]の後半部分と
配列b[]の前半部分が重なっている場合である。説明
しやすくするために、配列の大きさnを4とし、a
[3]とb[1]が同じデータを表しているものとす
る。このとき、自動的にa[4]とb[2]も同じデー
タを表すことになる。
【0008】図2(b)は、このときのメモリ上でのデ
ータの配置と、各繰り返しで参照されるデータを示す図
である。図の横軸はメモリ上でのデータの配置であり、
縦軸はループ制御変数iの値である。図中で「d」は値
の定義を、「u」は値の使用を表す。iが1の時は、a
[1]の定義と、b[1]の使用が生じる。iが2の時
は、a[2]の定義と、b[2]の使用が生じる。iが
3の時は、a[3]の定義と、b[3]の使用が生じる
が、このa[3]はiが1の時に値を使用したb[1]
と同じデータであるため、1回目の繰り返しと3回目の
繰り返しの間で、ループ運搬逆依存が生じる。2回目の
繰り返しと4回目の繰り返しの間にも同様の関係が生じ
る。そのため、このままではループを並列化できない。
しかし、図2(c)に示すようにコード変換を行うと、
ループ運搬逆依存を取り除くことが出来る。すなわち、
新たに一時記憶用に大きさnの配列c[]を追加し、b
[]の各要素を一旦c[]にコピーし、その後でc[]
からa[]にコピーする。その結果、b[]からc[]
へのコピーと、c[]からa[]へのコピーは、どちら
もループ運搬依存がないため、並列化可能になる。この
変換したコードは、実行時に(&a[1]<&b
[1])&&(&b[1]<&a[n])という条件が
成立したときに実行されるようにすればよいが、従来の
方法では、このように別名関係があるが並列化の妨げに
はならないという場合の条件を求めることができない。
【0009】以上述べたように、従来の実行時依存解析
法ではループ運搬依存がない場合は並列化できたが、ル
ープ運搬依存がある場合にはその依存の種類に関わらず
並列化できなかった。しかし、依存の有無だけでなく依
存の種類も区別した解析を行えば、より効果的な最適化
が可能となる。本発明の目的は、上記のような従来の課
題を解決し、動的な別名を持つ変数の参照を含むような
プログラムに対する、配列依存解析等のデータ依存解析
の問題に対して、精度の良い実行時解析を行うことによ
って最適化の機会を増大させ、より実行性能の優れた目
的プログラムを生成することを可能にすることにある。
本発明の他の目的は、既存の配列依存解析部(コンパイ
ラ)に手を加えることなく、別名を持つ配列に対しても
実行時解析を行えるようにすることで、コンパイラへの
実装を容易に行うことにある。
【0010】
【課題を解決するための手段】上記目的を達成するた
め、本発明の実行時依存解析を行う目的プログラムの生
成方法では、ソースプログラムから実行時依存解析を行
うコードを含む目的プログラムを生成する場合に、ソ
ースプログラムを解析して中間コードを生成するステッ
プと、中間コードから制御およびデータの流れに関す
るフロー情報を抽出するステップと、フロー情報に基
づいて前記中間コードにおける変数の参照を、該変数の
参照と等価な別の変数の参照に置換するステップと、
置換を行った中間コードに対して実行時依存解析を行う
コードの生成を含む最適化を行うステップとを有してい
る。また、ステップによって抽出されるフロー情報
は、プログラム中で参照する変数間の別名関係を表す別
名情報を含んでおり、ステップでは、(−1)変数
の集合上の同値関係を、前記別名情報を用いて別名関係
にある変数どうしは必ず同値となるように定めるステッ
プと、(−2)同値関係に基づいて変数の集合を同値
類に分割するステップと、(−3)各同値類に対し
て、その同値類に属する変数の1つを代表変数として選
択するステップと、(−4)各同値類に対して、同値
類に属する前記代表変数以外の変数の参照を代表変数を
用いた参照に置換するステップとを有している。また、
ステップ(−4)において、前記代表変数の先頭アド
レスと代表変数以外の変数の先頭アドレスが一致しない
ときは、それらの先頭アドレスの差を保持する一時変数
である差分変数を導入し、代表変数以外の変数の参照
を、代表変数の先頭アドレスと前記差分変数を用いて表
した参照に置換する。さらに、ステップで抽出される
フロー情報が、プログラム中のループ構造を表すループ
情報を含んでおり、ステップおよびステップの処理
を前記ループ情報を用いてループ毎に個別に適用する。
【0011】
【発明の実施の形態】以下、本発明の原理および実施例
を、図面により詳細に説明する。 (原理)本発明の第一の方法は、(a)フロントエンド
(104)が、ソースプログラムを読み込み、字句解析
・構文解析・意味解析を行い、中間コードを生成するス
テップ、(b)静的解析部(105)が、中間コードに
対して制御フロー解析と別名解析を行い、ループ情報と
別名情報を生成するステップ、(c)ループ最適化部
(106)が、プログラム中の各ループに対して、以下
のステップ(c1)から(c4)を実施するステップ、
(c1)同値類分割部(107)が、ループ中で参照さ
れる変数を、別名情報を元に同値類に分割し、各同値類
の中から変数を一つ選び代表変数とし、代表変数でない
各変数について、その変数と代表変数とのアドレスの差
を保持する一時変数を作成するステップ、(c2)別名
参照置換部(108)が、ステップ(c1)で求めた各
同値類に対して、前記代表変数でない変数のループ中で
の参照を前記代表変数を用いた参照に置換し、前記一時
変数の値を前記代表変数と前記代表変数でない変数との
アドレスの差として初期化する文をループのプリヘッダ
に追加するステップ、(c3)配列依存解析部(10
9)が、ループ中の配列要素の参照に対して配列依存関
係をその依存関係の成立する条件付きで求め、条件付き
配列依存情報を生成するステップ、(c4)ループ変換
部(110)が、条件付き配列依存情報を用いてループ
の最適化を行い、ある条件の元でのみ実施可能な最適化
を行う場合には、その条件が成立するか否かを実行時に
判定して、その最適化を実施したコードと実施しないコ
ードを選択実行するようにコード変換を行うステップ、
(d)コード生成部(111)が、中間コードから目的
プログラムを生成するステップからなる。
【0012】上記ステップ(a)、ステップ(b)およ
びステップ(d)は、従来の最適化コンパイラと同様の
処理を行う。別名を持たない配列の実行時依存解析を行
うコードを生成できるコンパイラには、ステップ(c
3)とステップ(c4)の機能が含まれている。そのた
め、新規に開発する必要があるのは、ステップ(c1)
とステップ(c2)のみである。ステップ(c1)は、
ループ中で参照(変数の値の定義または使用)される変
数の集合を求め、その集合を別名関係を元に同値類に分
割する。しかし、別名関係は反射的かつ対称的である
が、一般には推移的ではない。そこで、これを推移的に
なるように拡張して得られる同値関係を定義し、その同
値関係を元に同値類へ分割する。ループ中の変数間の別
名関係をAlias、求める同値関係をEquivと
し、変数aとbとの別名関係があるときこれを<a,b
>で表し、求める同値関係Equivの要素を[a,
b]で表すことにする。このとき、別名関係の同値関係
への拡張は、以下の手順で行う。 (c11)先ず、Equivの初期値をAliasとす
る。即ち、全ての別名関係<a,b>に対して、同値関
係[a,b]をEquivに加える。 (c12)Equivの要素に[a,b]と[a,c]
があるとき、もし[a,c]がEquivになければ、
Equivに[a,c]を追加する。 (c13)(c12)の操作を新たに追加できる関係が
なくなるまで続ける。Equivの要素は最大でも変数
の数の二乗の個数までしか存在し得ないので、この操作
は有限回で終了する。同値関係が定義されれば、同値類
は一意に定まる。
【0013】ステップ(c2)では、まず各同値類から
代表変数を一つずつ選択する。ステップ(c1)で求め
た同値類の一つECの代表変数をrとすると、ECに属
する他の変数vに対してrとvとのアドレスの差を表す
一時変数t(整数型)を作成し、その値を(&v−&
r)で初期化する文をループのプリヘッダに追加する。
この一時変数を差分変数と呼ぶことにする。ただし、v
が配列要素の参照を表す場合には、&vは配列要素の先
頭のアドレスとする。つまり、vが配列a[]ならば、
&vとは&a[0]を意味している。rについても同様
である。この時、以下の関係が成り立つ。 v=*(&v) =(&v)[0] =((&r)+(&v−&r))[0] =(&r+t)[0] =(&r)[t] 従って、vの参照は(&r)[t]の参照と等価である
から、ループのvの参照を全て(&r)[t]の参照に
置換する。vが配列要素の参照の時は、v[i]を(&
r)[t+i]に置換する。ステップ(c2)の変換を
行うことによりループ中で参照される変数の間には、別
名関係が存在しなくなる。代わりに、(&r)[t1]
と(&r)[t2]のように、同一の配列の添字が異な
る参照が生じている。これによって、(文献1)にある
ような、別名を持たない同一配列の実行時依存解析の方
法が適用できるようになる。
【0014】本発明の第二の方法では、上記ステップ
(c2)の処理の際に、代表変数を含めて、ポインタの
指示先の参照があれば等価な配列要素の参照に置換す
る。例えば、rをポインタ、expを整数型の式とした
とき、ステップ(c2)で行うコード変換の前後または
変換の過程で、*(r+exp)のようなポインタ指示
先の間接参照が現れたとき、その式をr[exp]とい
う等価な式に置換する。さらに、本発明の第三の方法で
は、上記第一の方法における、別名関係にある可能性の
ある二つの変数に対して、その一方の変数の参照を他方
の変数の参照に置換するか否か、および、置換するなら
ばどちらの変数の参照とするか、の決定を他の基準で行
う。例えば、特定の最適化を行う際に、別名関係が正確
にわからないためにその最適化の妨げになる依存関係が
生じるとき、その依存関係に関連する変数の集合につい
て、その変数の集合の中から変数を一つ選び代表変数と
し、集合内の他の変数の参照を代表変数の参照に置換す
ることで実現する。
【0015】(実施例)図1は、本発明の第一の実施例
を示すコンパイラの構成の図である。図1において、各
ブロックのうち、本発明により新たに構成した新規な部
分はループ最適化部106であり、その他の部分は従来
から存在するものをそのまま使用する。フロントエンド
104はソースプログラム101を読み込み、字句解析
・構文解析・意味解析を行い、中間コード112を出力
する。この中間コードは、木構造や三つ組等で表したプ
ログラムの中間表現とシンボル辞書などからなる。静的
解析部105は、中間コード112を入力として、先ず
プログラムの制御フローの解析を行い、ループ情報11
3を出力する。さらに、プログラム中で参照される変数
の間の別名関係を解析し、別名情報114を出力する。
【0016】図3は、本発明のループテーブルの構成を
示す図である。図3(b)は、図3(a)のC言語のプ
ログラムのループ情報113の構造を示す。ループテー
ブル302は、ループヘッダ303、ループプリヘッダ
304、構成基本ブロック集合305、参照変数集合3
06、およびその他のフィールドから構成される。ルー
プヘッダ303は、ループの入口となる基本ブロックで
ある。基本ブロックとは、その内側に分岐や分岐先とな
る文のない、連続して実行される文の集まりである。一
般にはループの入口は一つ以上あるが、複数の入口を持
ったループは多くのループ最適化が困難であるため、そ
のような場合はループテーブルを作成せず、ループ最適
化の対象とはしないものとする。
【0017】ループプリヘッダ304は、ループヘッダ
への分岐を持つ基本ブロックで、ループの構成基本ブロ
ック集合305に含まれない基本ブロックである。その
ような基本ブロックは一つのループに対して一般には複
数存在しうるが、複数ある時には制御フロー解析の際に
空の基本ブロックを設けてループヘッダの前に挿入する
ことにより、ループプリヘッダを一つしか持たないよう
にする。ループプリヘッダを一つだけ持つように出来な
いループがあれば、ループテーブルを作成せずに、ルー
プ最適化の対象としないものとする。構成基本ブロック
集合305は、ループ内に含まれる基本ブロックの集合
である。図3(a)のプログラムには、BB1・BB2
・BB3の三つの基本ブロックがある。BB1はループ
を始める前に、ループ制御変数iの値を1に初期化して
いる。BB2はループの終了判定を行う条件分岐文から
なる。BB3は、ソースプログラム上では離れている
が、配列要素の代入を行う文とループ制御変数の更新文
からなる。参照変数集合306は、ループ中で参照され
る変数の集合である。図3(a)のプログラムでは、変
数a[]、b[]、i、nの四つの変数が参照されてい
る。以上は、ループ情報113についての説明である。
【0018】図4は、図1における別名テーブルの構成
を示す図である。別名情報114を保持するためには、
プログラム中で参照されている各変数の別名に関する情
報を保持する別名テーブル401を作成する。この別名
テーブル401では、C言語での*pのようなポインタ
の指示先の間接参照も変数として扱われる。従って、こ
こで言う変数とメモリ領域の対応は動的(実行時に変化
しうる)な関係である。また、配列要素を参照する場
合、要素間の区別は行われず、例えば、a[1]とa
[2]は同一の変数として扱われる(a[]で表す)。
同様にポインタ指示先の間接参照も、ポインタに加えら
れる整数の値は区別せずに、ポインタpに対する*pと
*(p+1)は同一の変数として扱う。C言語で配列が
仮引数の場合のように、配列の先頭アドレスを表すメモ
リ領域が配列要素とは別に取られる場合には、その配列
の要素とは別の変数として扱われる。別名関係は、反射
的かつ対称的な変数間の二項関係として求められるが、
その結果は各変数に対してその変数と別名関係にある他
の変数の集合として別名テーブルに登録する。ポインタ
解析の方法によっては、別名関係が推移的なものとして
求められることもある。また、静的な別名解析の精度は
高い方が好ましいが、以下の処理の実現方法は別名解析
の精度には依存しない。
【0019】図4は、図2(a)に示したC言語のプロ
グラムに対するに別名情報114の表現方法を示してい
る。図2(a)のプログラムでは、仮引数として配列a
[]とb[]が宣言されている。このとき実際に引数と
して渡されるのは、それぞれの配列の先頭アドレスであ
り、それらはポインタaとbとして参照できる。ポイン
タaとbは実引数の情報がなければ、同一のメモリ領域
を指すことができると考える必要があるため、配列
a[]とb[]の間に別名関係が生じる。この別名関係
についての情報は、別名テーブル401に保持される。
別名テーブルは各変数毎にエントリがあり、各エントリ
には変数の名前402、別名変数集合403、同値変数
集合404のフィールドからなる。別名変数集合403
は、別名関係にある変数の集合を保持する。同値変数集
合」404は同値関係にある変数の集合を保持するが、
静的解析部105では使用しない。別名関係は反射的で
あるため、全ての変数はその変数自身と別名になるが、
自明なので別名テーブルの別名変数集合403と同値変
数集合404では省略する。変数a[]の別名変数集合
は{a[],b[]}であるから、別名テーブル401
のa[]のエントリ405の別名変数集合403には、
b[]のみを登録する。以上は、別名情報114の説明
である。
【0020】図1に戻って、ループ最適化部106で
は、目的コードの実行性能が向上するようにループの最
適化を行う。ここでは、ループテーブル302の作成さ
れているループのみを対象にする。ループ最適化部10
6は、同値類分割部107、別名参照置換部108、配
列依存解析部109、およびループ変換部110の4つ
のステップから構成される。以下、これらのステップの
処理内容について説明する。同値類分割部107では、
別名関係を推移的になるように拡張することで得られる
同値関係から、ループ中で参照される変数の集合を同値
類に分割する。同値類分割部107の出力である同値類
情報115は、同値類テーブル501で表わされる。図
5に、同値類テーブル501の構造を示す。同値類テー
ブル501は、変数毎にエントリが作成され、フィール
ドとして変数名502、代表変数503、差分変数50
4、初期化文505、および参照式506が備えられ
る。同値類テーブル501の各エントリは、ループテー
ブルの参照変数集合306に登録された各変数毎に作ら
れ、変数名502にはその変数の名前が登録される。そ
の他のフィールドの意味は、その値を設定する処理の説
明の中で述べる。
【0021】図6に、同値類分割部107の処理の流れ
を示す。図中の601、602、603からなる処理
は、前述の原理の欄の段落番号〔0012〕で示した
(c11),(c12)、(c13)の各ステップから
なる処理に対応し、これらの処理で別名関係から同値関
係を作る。ステップ601では、同値関係Equivを
別名関係Aliasで初期化する。このことは、別名テ
ーブル401の各エントリで、別名変数集合403に登
録された変数の集合を、同じエントリの同値変数集合4
04にコピーすることで実現される。ステップ602で
は、同値関係[a,b]と[a,c]が既に登録されて
いるが、[b,c]がまだ登録されていないような同値
関係[b,c]を検索する。このことは、別名テーブル
401の各エントリについて、同値変数集合404に登
録された変数の全ての組み合わせについて、その組み合
わせからなる同値関係が登録されているかを調べること
で実現できる。このとき、未登録の同値関係を発見でき
なければ、ステップ604へ移る。ステップ603で
は、ステップ602で検出された未登録の同値関係
[b,c]を登録する。[b,c]を登録するとは、別
名テーブル401のbのエントリの同値変数集合404
にcを加え、同様にcのエントリの同値変数集合404
にbを加えることである。
【0022】次に、得られた同値関係から、ループ中で
参照される変数の集合を同値類に分割する。ステップ6
04では、ループ中で参照される各変数vについて、F
lag(v)という変数を用意し、これを0で初期化す
る。このFlag(v)は変数vの所属する同値類が決
まると1に設定される。ステップ605では、Flag
(v)が0である変数vを検索する。条件を満たす変数
が複数ある場合は、ポインタ指示先の間接参照かあるい
は配列要素の参照を優先的に選ぶ。そのようなvがなけ
れば、全ての変数の所属する同値類が求められたので、
同値類分割部107の処理を終える。ステップ606で
は、ステップ605で求めた変数vに対するFlag
(v)を1に設定する。このvは所属する同値類の代表
変数とするので、同値類テーブル501のvのエントリ
の代表変数503をv自身に設定する。また、vは代表
変数であるから、同値類テーブル501のvのエントリ
の差分変数504、初期化文505、参照式506には
何も設定しない(あるいは、空であることを示す値を設
定する)。
【0023】ステップ607では、vと同値関係にある
変数でまだ所属する同値類の設定されていない変数を探
し、これをuとする。そのような変数がなければ、ステ
ップ605からの処理を繰り返す。ステップ608で
は、ステップ607で求められた変数uの所属する同値
類を、変数vが代表変数である同値類に決定する。その
ため、以下の処理を行う。まず、Flag(u)を1に
設定して、所属する同値類が決まったことを示す。次
に、同値類テーブル501のuのエントリの代表変数5
03をvに設定する。さらに、uとvとのアドレスの差
を表す一時変数tを作成し、同値類テーブル501のu
のエントリの差分変数504にtに設定する。さらに、
tの値を&u−&vに設定する文を同値類テーブル50
1のuのエントリの初期化文505に設定する。このと
き、uがポインタの指示先の間接参照であるとき、つま
りあるポインタpに対して*pで表される変数であると
き、&uをそのまま表すと&(*p)であるが、これは
式pと同じ意味なので、t=p−&vとして初期化文を
作成する。また、uが配列要素の参照であるとき、つま
りある配列aに対してa[]で表される変数であると
き、&uは配列の先頭要素のアドレスとみなして、t=
&(a[0])−&vとして初期化文を作成する。vが
ポインタの指示先の間接参照や配列要素の場合も同様で
ある。ステップ608の最後に、同値類テーブル501
のuのエントリの参照式506に(&v)[t]という
式を設定する。vがポインタの指示先の間接参照や配列
要素の場合は、初期化文の場合と同様の式に置き換え
る。
【0024】図2(a)の変数b[]に対する同値類テ
ーブル501のエントリ507を例に同値類分割部10
7の処理の例を説明する。変数b[]は仮引数配列であ
るため、配列要素を表す変数b[]とは別に、配列の先
頭アドレスを保持するポインタbが存在する。配列
a[]とb[]は別名関係があるため、同じ同値類に属
する。a[]が先に代表変数に選ばれたとすると、同値
類テーブル501のb[]のエントリの各フィールドは
以下のように設定される。代表変数503は配列a[]
を設定する。差分変数504は新たに作成する一時変数
tを設定する。初期化文505はt=b−aという式が
設定される。配列a[]とb[]に対する初期化文は一
般には、&b[0]−&a[0]となるが、この場合は
仮引数配列であるため、&b[0]と&a[0]はそれ
ぞれポインタbとaと同じ値を表している。そのため、
tの初期値はb−aとなる。参照式506は、まず(&
a[0])[t]という式が得られるが、aがポインタ
であることからa[t]という式に簡略化されて登録さ
れる。以上が、同値類分割107の処理の説明である。
【0025】図1に戻って、別名参照置換部108の処
理内容を説明する。図7は、別名参照置換部108の処
理の流れを示す。ステップ701では、ループ中で参照
される各変数vについてFlag(v)という変数を設
け、これを0で初期化する。このFlag(v)は変数
vの参照の置換を行うと1に設定される。なお、図6で
使用された同名の変数とは関係ない。ステップ702で
は、未処理の代表変数rを探す。ある変数が代表変数で
あるか否かは、同値類テーブル501で変数名502と
代表変数503が同一の変数であるかどうかを調べれば
わかる。全ての代表変数の処理が終われば、別名参照置
換部108の処理を終える。ステップ703では、ステ
ップ702で検出された代表変数rに対して、Flag
(r)を1に設定し、処理済みであることを示す。ステ
ップ704では、代表変数rがポインタの指示先の間接
参照であるか否かを判定する。これは、rの変数名があ
るポインタpに対して*pであるか否かを判定すればよ
い。
【0026】ステップ705では、rがポインタの指示
先の間接参照である場合に、rの参照を配列要素の参照
に置換する。rがあるポインタpに対して*pという変
数名であったとき、その参照は一般にはある整数型の式
expに対して、*(p+exp)となる。そのとき、
p[exp]という配列要素の参照に置き換える。ステ
ップ706では、rと同じ同値類に属する他の変数で未
処理のものを探す。それには、同値類テーブル501で
代表変数503がrであり、Flag(v)が0である
ような変数vを探せばよい。そのような変数が見つから
ないときは、ステップ702からの処理を繰り返す。ス
テップ707では、ステップ706で検出された変数v
に対して、Flag(v)を1とし、処理済みであるこ
とを示す。ステップ708では、vをrを用いた参照に
置換可能であるかを判定する。置換できないのは、例え
ば以下のような場合である。 (1)vまたはrの変数名に現れるポインタの定義文が
ループ中にある場合、(2)vとrの型が違う場合、
(3)vとrがユーザー空間とシステム空間のように異
なるアドレス空間にある可能性がある場合、(4)vと
rのアドレスの差が整数型変数では表せない値になる可
能性がある場合、これらの場合にはvの参照を置換せ
ず、ステップ706からの処理を繰り返す。
【0027】以下では、全ての変数の参照を置換できる
ものとして説明する。ステップ709では、同値類テー
ブル501のvのエントリの初期化文505に登録され
た、差分変数504の初期値を設定する文を、最適化を
行っているループのプリヘッダに挿入する。挿入すべき
基本ブロックはループテーブル302のループプリヘッ
ダ304から知ることが出来る。挿入する初期化文はプ
リヘッダの基本ブロック中の他の文とは依存関係がない
ため、基本ブロック中のどこに挿入しても良い。ステッ
プ710では、ループ中のvの参照を、同値類テーブル
501のvのエントリの参照式506に登録された式を
用いた参照に置換する。vがスカラ変数の場合、参照式
506の式がそのまま使用できる。vがポインタ指示先
の場合、ポインタをp、参照する際の添字をexp、差
分変数をtとすると、*(p+exp)の参照は(&
r)[exp+t]に置換する。vが配列要素の場合、
配列をa、参照する際の添字をexp、差分変数をtと
すると、a[exp]の参照は(&r)[exp+t]
に置換する。ただし、rがポインタ指示先の場合、ポイ
ンタをqとすると、(&r)[exp+t]は(&(*
q))[exp+t]となるから、それと等価なq[e
xp+t]という参照に置換する。同様にrが配列要素
の場合、配列をbとすると、(&r)[exp+t]は
(&(b[0])[exp+t]となるから、それと等
価なb[exp+t]という参照に置換する。以上で、
別名参照置換部108の説明を終える。
【0028】配列依存解析部109では、配列要素の参
照の間の依存関係を解析し、条件付きの配列依存情報1
16を出力する。別名参照置換部108の処理を行った
後では、元のプログラムでは別名関係にある変数の参照
であったものが、同一配列の参照として表されている。
そのため、同一配列の参照に対する実行時依存解析を行
う時と同じように配列依存解析を行えばよい。配列依存
解析の方法は(文献1)などに記載されている既存の方
法でよいので、詳細な説明は省略する。次に、ループ変
換部110では、条件付き配列依存情報116を元に、
ループ変換を行う。このとき、条件付き依存関係の有無
により適用できるか否かが異なるループ変換を行う際に
は、実施可能な条件が成り立つか否かを実行時に判定す
るように条件分岐文を作成し、条件を満たす一方にはそ
のループ変換を行い、他方にはそのループ変換を行わな
いようにする。ループ変換の具体的な方法は(文献1)
などに記載されている既存の方法でよいので、詳細な説
明は省略する。
【0029】図8(a)(b)(c)は、本発明による
プログラムの変換例を示す図である。図8(a)のプロ
グラムを例に、ループ最適化の効果を説明する。このプ
ログラムは図2(a)のプログラムと似ているが、配列
のコピーではなく、配列a[]の各要素に配列b[]の
各要素を加える。しかし、参照される変数は図2(a)
のプログラムと同様であり、別名情報と同値類情報は図
3と図4のようになる。別名参照置換部108で変数の
参照を置換した結果をC言語のプログラムに戻して表す
と、図8(b)のようになる。その結果、ループ中では
配列a[]としか参照されなくなるので、別名変数の参
照がなくなる。このループの配列依存関係は次のように
求められる。まず、a[i]の定義と使用は添字が同一
であるため、同一繰り返し内の逆依存が生じる。しか
し、これは並列化の妨げとならない。一方、a[i]の
定義とa[i+t]の使用との間には、tの値に応じて
依存関係が生じる。まず、t<−nまたはt>nの時に
は、a[i]の添字の範囲とa[i+t]の添字の範囲
は重ならないため、依存は生じない。t==0の場合
は、添字が常に同一なので、ループ運搬依存は生じな
い。0<tかつt<nの場合は、前の繰り返しで定義し
た要素を後の繰り返しで使用するため、ループ運搬フロ
ー依存が生じ、並列化は出来ない。最後に、0>tかつ
t>−nの場合は、前の繰り返しで使用した要素を後の
繰り返しで定義するため、ループ運搬逆依存が生じる。
この場合、図2(a)のプログラムと同様に、新たに大
きさnの配列c[]を加えて、加算と代入を別のループ
で行うことにより、並列化が可能になる。
【0030】図8(c)はループ変換を行った後のコー
ドをC言語で表現したものである。ループ運搬依存のな
い場合804は二つの配列の加算を行う並列実行ライブ
ラリ(vec_add())の呼び出しに置き換えられ
る。ループ運搬フロー依存のある場合805には、並列
化は行われない。ループ運搬逆依存のある場合806に
は、一時記憶用の配列c[]に並列に行った加算の結果
を一旦保持し、全ての加算の終了後にc[]からa[]
への代入を並列に行う。これは並列実行ライブラリを用
いて、配列の加算(vec_add()と配列のコピー
(vec_copy())の呼び出しにより実現され
る。
【0031】
【発明の効果】以上説明したように、本発明によれば、
変数間に別名関係がある場合でも最適化の妨げとなるデ
ータ依存関係がないことを検出することにより、従来よ
りも適用範囲の広い実行時依存解析方法を実現すること
ができ、より効果的な最適化が可能である。また、別名
のない場合に実行時配列依存解析を行えるコンパイラに
対しては、その配列依存解析部に手を加えることなく、
配列依存解析と別名関係を統合した実行時解析を実現可
能とすることにより、コンパイラの開発工数を軽減する
ことができる。
【図面の簡単な説明】
【図1】本発明の一実施例を示すコンパイラの処理の流
れを示す図である。
【図2】別名関係と並列化との関係を示す図である。
【図3】本発明におけるループテーブルの構成を示す図
である。
【図4】本発明における別名テーブルの構成を示す図で
ある。
【図5】本発明における同値類テーブルの構成を示す図
である。
【図6】本発明における同値類分割部の処理の流れを示
す図である。
【図7】本発明における別名参照置換部の処理の流れを
示す図である。
【図8】本発明におけるプログラムの変換例を示す図で
ある。
【符号の説明】
101…ソースプログラム、102…コンパイラ、10
3…目的プログラム、104…フロントエンド、105
…静的解析部、106…ループ最適化部、107…同値
類分割部、108…別名参照置換部、109…配列依存
解析部、110…ループ変換部、111…コード生成
部、112…中間コード、113…ループ情報、114
…別名情報、115…同値類情報、116…条件付き配
列依存情報、201…別名関係にある配列の参照を含む
Cプログラムの例、202…ループ運搬逆依存がある場
合に並列化可能に変換したプログラム、801…最適化
しようとするプログラムのループ部分、802…別名参
照置換処理を行った後のプログラムのC言語による表
現、803…実行時依存解析を行うように最適化した後
のプログラムのC言語による表現、804…ループ運搬
依存のない場合に実行されるコード、805…ループ運
搬フロー依存のある場合に実行されるコード、806…
ループ運搬逆依存のある場合に実行されるコード。

Claims (4)

    【特許請求の範囲】
  1. 【請求項1】 ソースプログラムから実行時依存解析を
    行うコードを含む目的プログラムを生成する方法であっ
    て、(a)ソースプログラムを解析して中間コードを生
    成するステップと、(b)該中間コードから制御および
    データの流れに関するフロー情報を抽出するステップ
    と、(c)該フロー情報に基づいて前記中間コードにお
    ける変数の参照を、該変数の参照と等価な別の変数の参
    照に置換するステップと、(d)前記置換を行った中間
    コードに対して実行時依存解析を行うコードの生成を含
    む最適化を行うステップとを有することを特徴とする実
    行時依存解析を行う目的プログラムの生成方法。
  2. 【請求項2】 請求項1に記載の実行時依存解析を行う
    目的プログラムの生成方法において、 前記ステップ(b)によって抽出されるフロー情報は、
    プログラム中で参照する変数間の別名関係を表す別名情
    報を含み、 前記ステップ(c)において、(c1)変数の集合上の
    同値関係を、前記別名情報を用いて別名関係にある変数
    どうしは必ず同値となるように定めるステップと、(c
    2)前記同値関係に基づいて変数の集合を同値類に分割
    するステップと、(c3)前記各同値類に対して、その
    同値類に属する変数の1つを代表変数として選択するス
    テップと、(c4)前記各同値類に対して、同値類に属
    する前記代表変数以外の変数の参照を代表変数を用いた
    参照に置換するステップとを有することを特徴とする実
    行時依存解析を行う目的プログラムの生成方法。
  3. 【請求項3】 請求項2に記載の実行時依存解析を行う
    目的プログラムの生成方法において、 前記ステップ(c4)において、前記代表変数の先頭ア
    ドレスと代表変数以外の変数の先頭アドレスが一致しな
    いときは、それらの先頭アドレスの差を保持する一時変
    数である差分変数を導入し、代表変数以外の変数の参照
    を、代表変数の先頭アドレスと前記差分変数を用いて表
    した参照に置換することを特徴とする実行時依存解析を
    行う目的プログラムの生成方法。
  4. 【請求項4】 請求項1から3のいずれかに記載の実行
    時依存解析を行う目的プログラムの生成方法において、 前記ステップ(b)で抽出されるフロー情報が、プログ
    ラム中のループ構造を表すループ情報を含み、前記ステ
    ップ(c)およびステップ(d)の処理を前記ループ情
    報を用いてループ毎に個別に適用することを特徴とする
    実行時依存解析を行う目的プログラムの生成方法。
JP9327623A 1997-11-28 1997-11-28 実行時依存解析を行う目的プログラムの生成方法 Pending JPH11161500A (ja)

Priority Applications (1)

Application Number Priority Date Filing Date Title
JP9327623A JPH11161500A (ja) 1997-11-28 1997-11-28 実行時依存解析を行う目的プログラムの生成方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP9327623A JPH11161500A (ja) 1997-11-28 1997-11-28 実行時依存解析を行う目的プログラムの生成方法

Publications (1)

Publication Number Publication Date
JPH11161500A true JPH11161500A (ja) 1999-06-18

Family

ID=18201126

Family Applications (1)

Application Number Title Priority Date Filing Date
JP9327623A Pending JPH11161500A (ja) 1997-11-28 1997-11-28 実行時依存解析を行う目的プログラムの生成方法

Country Status (1)

Country Link
JP (1) JPH11161500A (ja)

Cited By (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
WO2012086148A1 (ja) * 2010-12-21 2012-06-28 パナソニック株式会社 コンパイル装置、コンパイルプログラム及びループ並列化方法
CN110795106A (zh) * 2019-10-30 2020-02-14 中国人民解放军战略支援部队信息工程大学 程序向量化过程中动静结合的内存别名分析处理方法及装置

Cited By (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
WO2012086148A1 (ja) * 2010-12-21 2012-06-28 パナソニック株式会社 コンパイル装置、コンパイルプログラム及びループ並列化方法
US8881124B2 (en) 2010-12-21 2014-11-04 Panasonic Corporation Compiler device, compiler program, and loop parallelization method
JP5810316B2 (ja) * 2010-12-21 2015-11-11 パナソニックIpマネジメント株式会社 コンパイル装置、コンパイルプログラム及びループ並列化方法
CN110795106A (zh) * 2019-10-30 2020-02-14 中国人民解放军战略支援部队信息工程大学 程序向量化过程中动静结合的内存别名分析处理方法及装置
CN110795106B (zh) * 2019-10-30 2022-10-04 中国人民解放军战略支援部队信息工程大学 程序向量化过程中动静结合的内存别名分析处理方法及装置

Similar Documents

Publication Publication Date Title
US5293631A (en) Analysis and optimization of array variables in compiler for instruction level parallel processor
JP3311462B2 (ja) コンパイル処理装置
US7571427B2 (en) Methods for comparing versions of a program
US5146594A (en) Method of producing object program based on interprocedural dataflow analysis of a source program
US20080178149A1 (en) Inferencing types of variables in a dynamically typed language
US20090113404A1 (en) Optimum code generation method and compiler device for multiprocessor
JP2500079B2 (ja) プログラムの最適化方法及びコンパイラ・システム
JPH05257709A (ja) 並列化判別方法およびそれを用いた並列化支援方法
US5396627A (en) Method of producing object program based on interprocedural dataflow analysis of a source program
JP2001166949A (ja) シンボリック実行を用いてソースコードをコンパイルするための方法及び装置
JPH10161884A (ja) パイプラインコンピュータのための改善されたコードオプティマイザ
US5790859A (en) Method of, system for, and computer program product for efficient identification of private variables in program loops by an optimizing compiler
JP3651774B2 (ja) コンパイラ及びそのレジスタ割付方法
US20020166115A1 (en) System and method for computer program compilation using scalar register promotion and static single assignment representation
CA2010067C (en) Reducing pipeline delays in compilers by code hoisting
US6009273A (en) Method for conversion of a variable argument routine to a fixed argument routine
JPH0926884A (ja) バイナリ操作を必要とするタスク中に必要なフロー情報を使用可能とする方法および装置
US6016398A (en) Method for using static single assignment to color out artificial register dependencies
JP2001166946A (ja) 階層の平坦化によりソースコードをコンパイルする方法及び装置
US5999735A (en) Method for constructing a static single assignment language accommodating complex symbolic memory references
CN108920149B (zh) 编译方法和编译装置
JPH11161500A (ja) 実行時依存解析を行う目的プログラムの生成方法
JP3266097B2 (ja) 非リエントラントプログラムの自動リエントラント化方法及びシステム
Brandner et al. Computing liveness sets for ssa-form programs
JPH07244647A (ja) 間接参照ループの並列化方法、並列化装置、並列実行方法および並列実行装置

Legal Events

Date Code Title Description
A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A131

Effective date: 20040312

A02 Decision of refusal

Free format text: JAPANESE INTERMEDIATE CODE: A02

Effective date: 20040706