JP2749039B2 - オブジェクト生成方法 - Google Patents
オブジェクト生成方法Info
- Publication number
- JP2749039B2 JP2749039B2 JP62279214A JP27921487A JP2749039B2 JP 2749039 B2 JP2749039 B2 JP 2749039B2 JP 62279214 A JP62279214 A JP 62279214A JP 27921487 A JP27921487 A JP 27921487A JP 2749039 B2 JP2749039 B2 JP 2749039B2
- Authority
- JP
- Japan
- Prior art keywords
- procedure
- call
- loop
- statement
- program
- 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 - Lifetime
Links
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/43—Checking; Contextual analysis
- G06F8/433—Dependency analysis; Data or control flow analysis
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)
Description
【発明の詳細な説明】
〔産業上の利用分野〕
本発明はソースプログラムを解析してオブジエクトプ
ログラムを生成するコンパイラに係り、特に手続き呼び
出しを含むプログラム部分の最適化に好適なオブジエク
ト生成方法に関する。 〔従来の技術〕 コンパイラにおいて、生成するオブジエクトプログラ
ムを高速化するための機能を最適化と呼ぶ。従来、最適
化の適用範囲は、サブループチン・関数などの1つの手
続き内に限られていたが、近年、プロシーデイングズ
オブ ザ シグプラン 1986 シンポジウム オン コ
ンパイラ コンストラクシヨン,シグプラン ノーテイ
シズ,第21巻 第7号,1986年 7月刊、第176頁から第
185頁において論じられているように、手続き間にまた
がつた最適化が行なわれるようになつてきた。その論文
においては、手続き呼び出しを含んだループの並列実行
性可否を判定するために必要な、手続き間にまたがつた
配列で参照解析の方法が述べられている。この方法で
は、手続き呼び出しの効果を該手続き呼び出しで値が変
更される可能性のある配列部分領域(Region)と、呼び
出し手続きの実行中に値が使用される可能性のある配列
部分領域の情報に要約し、手続き呼び出しを含むループ
の並列化に際しては、ループくり返しの別々の回りのそ
れぞれで参照される可能性のある配列部分領域どうしの
間に重なりが無ければ該ループは並列実行可能と判定さ
れる。より正確に言うと、ループくり返しのある回で値
を変更される可能性のある配列部分領域と、他の回で値
を変更又は使用される可能性のある配列部分領域の間に
重なりがないことを解析することにより、該ループはル
ープくり返しの各回の処理を並列に同時に実行できると
判定する。 〔発明が解決すようとする問題点〕 上記従来技術は、同一の配列部分領域が複数回参照さ
れる場合に最適化機能が低下するという問題があつた。
例えば、第20図の左側のプログラムにおいては、Vがサ
ブルーチンSUB1のISNが4の行と7の行で参照されてい
る。さて、ISNが4の行のサブルーチンSUB2の呼び出し
では配列Vの全要素が必ず再定義されることから、Vは
DO10の制御変数Jの各値ごとに独立に使われていること
が分る。そこで第20図右側のようにVの次元を拡張する
ことにより、DO10はJの各値ごとに並列に実行できる。
この並列化により、プログラムの実行速度は最大100倍
になる。しかしながら、従来技術では、DO10のループく
り返しにおいて配列Vの値がSUB2で毎回変更・使用され
る可能性があることを解析するのみだつたので、使用の
前に定義が必ず起ることは分らなかつた。そのため、上
記のような最適化はできなかつた。 本発明の目的は、手続き呼び出しを含むプログラムの
解析機能を拡張し、同一配列部分領域の参照が複数回起
る場合にも十分な最適化を可能とすることである。 〔問題点を解決するための手段〕 上記目的は、手続き呼び出し効果の要約情報におい
て、変数・配列部分領域の参照の可能性と必然性を区別
して扱かうことにより達成される。 参照には定義(値の変更)と使用の2種類あり、その
うち、使用の必然性はデータフローに影響しない。よつ
て、次のようにすれば良い。 手続き間データフロー解析を行なう際、各手続き呼び
出しにより値が変更(定義)される可能性のある変数・
配列部分領域と、呼び出し時の値が使用される可能性の
ある変数・配列部分領域と、値が必ず定義される変数・
配列部分領域とを手続き呼び出し効果を要約情報として
用い、手続き呼び出しを含む部分のデータフロー解析に
おいては該要約情報で該手続き呼び出しのデータ参照を
代表させ、参照の可能性と必然性を区別したデータフロ
ー解析を行なう。 〔作用〕 手続き呼び出しにより値が変更される可能性のある変
数・配列部分領域と、呼び出し時の値が使用される可能
性のある変数・配列部分領域を求めることにより、手続
き呼び出しを含めた文と文の間で、配列部分領域を含め
たデータの値がどこで設定され、どこで使用されるかが
分る。しかも、使用については呼び出し時の値の使用に
ついての情報なので、手続き内で一度再定義された値の
使用は除外することができる。よつて、複数回の手続き
呼び出しで同じ配列部分領域が参照されていても、該参
照が手続きの呼び出し時の値を使用せず該配列部分領域
を独立して使つていることが分るので、各呼び出しごと
に該配列部分領域を別の配列に変えることにより、該複
数の手続き呼び出しを並列に実行するなどの最適化を行
なえる。 また、手続き呼び出しにより値が必ず定義される変数
・配列部分領域を求めることにより、該手続きの前で設
定されていた値が該手続き呼び出しの後まで届くかを判
定できるので、手続き呼び出しの前後の文の並列性を従
来より詳しく求めることができ、最適化の範囲を拡大す
る。第21図を用いてこの作用を説明する。1は従来の技
術の解析による依存グラフであり、2は本発明の技術に
よる依存グラフである。 S1〜S3は文であり、それらを結ぶ矢印は文と文の間の
データ依存を表わす。2では、S2で必ず定義される変数
・配列部分領域の解析により、S1からS3へのフロー依存
が無いことが分つているとする。配列名のネームなどの
処理によりこれらよりS1からS2への逆依存を削除する
と、1は3のように、2は4のようになる。3では、S1
とS2が並列に実行できることが分るのみであるが、4で
はS1とS3も並列に実行できることが分る。よつて例え
ば、S2の実行時間がS1,S3に比べて小さい場合は、3に
比べて4の実行時間は約半分となり、実行時間が大巾に
減少する。 〔実施例〕 以下、本発明の一実施例を図面を用いて説明する。本
実施例では、手続き間データフロー解析結果を用いる最
適化の例として、新たな最適化であるCALL回数削減処理
を選んだ。しかし、本発明の実施効果は該最適化に限定
されるものではなく、既存のほとんどの最適化に対して
その適用範囲拡大に有効である。 CALL回数削減処理は、プログラムの実行における手続
き呼び出しの実行回数(CALL回数)を削減する最適化で
ある。例えば、第2図のFORTRANプログラムでは、手続
きWWQにおいて、手続きOPRODの呼び出しがDO10のループ
で100回×2ケ所=合計200回実行されることが分るが、
CALL回数削減処理により、第2図のプログラムを、第2
図と同じ処理を行ない手続き呼び出しが2回に削減され
た第3図のプログラムに変換することができる。 CALL回数削減処理は、第2図のプログラムから第3図
のプログラムへの変換例で示されるように、ループ内に
ある手続き呼び出しに着目し、該ループのくり返しを呼
び出し先手続きに移動することにより手続き呼び出しの
実行回数(CALL回数)を削減する。実際には、呼び出し
先手続きが他の手続きからも呼ばれていることを考慮し
て、呼び出し先手続きのコピーにループくり返しを移動
し、呼び出し先手続き自身は残しておく。また、呼び出
し先手続きのコピーの数を削減するために、ループくり
返しが同一の場合は、該コピーを共用する処理、ループ
くり返しの移動に際してループを分割する処理も行なつ
ている。 ループくり返しの前に行なわれるループ分割では、手
続き呼び出しを含むループを該手続き呼び出しの前後で
分割しているが、このループ分割によつて手続き呼び出
しを含まないループが生じ、新たにベクトル化,並列化
の対象とすることができる。 第1図は、本発明を実施したコンパイラを機能ブロツ
クで示すものである。40はコンパイラを示している。コ
ンパイラ40はソースプログラム10を入力して、最後にオ
ブジエクトプログラム30を出力する。本実施例では、更
に最適なCALL削減点を決定するために、各手続きからど
の手続きが何回呼ばれたかを示す情報であるCALL回数情
報15も入力している。CALL回数情報15はプログラムの動
的特性を解析する公知のコーテイリテイプログラムの出
力として得ることが出来る。 手続き名情報700,CALL点情報500,参照領域情報600はC
ALL回数削減のために用いる内部データであり、CALL回
数削減後ソースプログラム20は、ソースプログラム10に
対してCALL回数削減を行なつた後のソースプログラムで
ある。 コンパイラ40はCALL点解析部100,手続き間データフロ
ー解析部200,CALL回数削減部300,オブジエクトプログラ
ム生成部400、とから構成される。 CALL点解析部100は、ソースプログラム10を入力し、
ソースプログラム10中に含まれる全手続き名の一覧表で
ある手続き名情報700、および、各手続きの最内側ルー
プ内の手続き呼び出し点CALL点での実引数情報であるCA
LL点情報500を出力する部分である。 CALL点情報500の収集対象を最内側ループに限定して
いるのは、本発明の実施によつて増加するメモリ量を小
さくするためであり、この制限は取り除いても良い。 手続き間データフロー解析部200は、ソースプログラ
ム100を入力し、ソースプログラム100に含まれる全手続
きについて、該手続きの呼び出しにより値が変更される
可能性のある変数・配列部分領域(変更領域)と、呼び
出し時の値が使用される可能性のある変数・配列部分領
域(使用領域)と、値が必ず定義される変数・配列部分
領域(定義領域)とを解析し、結果として参照領域情報
600を出力する部分である。 CALL回数削減部300は、ソースプログラム10,手続き名
情報700,CALL点情報500,参照領域情報600,CALL回数情報
15とを入力し、ソースプログラム10に対してCALL点削減
を行なつた後のソースプログラムであるCALL回数削減後
ソースプログラム20を生成出力する部分である。 オブジエクトプログラム生成部400は、CALL回数削減
後ソースプログラム20を入力し、該入力からオブジエク
トプログラム30を生成・出力する部分である。 オブジエクト生成部400は公知なので詳細は省く。オ
ブジエクト生成部400では、CALL回数削減後ソースプロ
グラム200に対して既存の最適化も行なう。既存の最適
化でも参照領域情報600を利用することにより最適範囲
を拡大することができるが、詳細は述べない。 以下、コンパイラ40の各部分100〜400の動作を詳細に
説明する。 まず、第4図を用いて、CALL点解析部100の動作を説
明する。 105では、読み込むべきプログラム単位が残つている
かを判定し、これが真のときは110へ制御を移し、偽の
ときは処理を終了する。110では、プログラム単位を1
つ読み込んで115に制御を移す。115では、読み込んだプ
ログラム単位の手続き名を名表700に登録し、120に制御
を移す。第13図に手続き名表の構造を示す。710はプロ
グラム単位の手続き名を保持するフイールド、720は該
プログラム単位を呼び出しているCALL点情報500へのポ
インタを保持するフイールド、730は該プログラムの削
減属性(後述)を保持するフイールドであり、730のフ
イールドはCALL点解析部100では値を設定しない。120で
は、読み込んだプログラム単位の先頭の文をSに設定
し、125に制御を移す。125では、SがDO文かを判定し、
これが真のときは130に制御を移し、偽のときは165に制
御を移す。130では文Sで始まるDOループが最内側かを
判定し、これが真のときは135に制御を移し、偽のとき
は165に制御を移す。135では、該DOループの先頭の文を
Tに設定して、140に制御を移す。140では、TがCALL文
かを判定し、これが真のときには145に制御を移し、偽
のときは155に制御を移す。145では該CALL文が該DOルー
プの中で必ず実行される文であるかを判定し、これが真
のときは150へ制御を移し、偽のときは155へ制御を移
す。以上により、各クログラム単位の最内側DOループ中
の必らず実行されるCALL文のときのみ150に到達する。1
50では、CALL先の手続きのCALL点情報500に該CALL文の
実引数情報を追加する。第5図にCALL点情報の構造を示
す。510は各手続き情報ごとに作られ、該手続きの各呼
び出し元のCALL文(CALL点)についての情報を保持す
る。512は呼び出し元手続き名を保持するフイールド、5
14は該CALL点のISNを保持するフイールド、516は該CALL
点のグループ番号(後述)を保持するフイールド、517
は該CALL点を囲む最内側ループのループ長を保持するフ
イールド、518は該CALL点での実引数情報(520,530)へ
のポインタを保持するフイールドである。ISNとは各手
続きの何行目の文かを示す番号である。520を用いて実
引数情報の構造を説明する。522は仮数リスト中での実
引数の位置、即ち、何番目の実引数であるかを示すフイ
ールド、524は実引数となる変数・配列の名前を保持す
るフイールド、526は実引数の型を保持するフイール
ド、528は実引数の寸法宣言を保持するフイールド、529
は最内側ループの実行に従がつた実引数の添字値の変化
を示すものである。実引数が変数の場合には、長さ1の
配列とみなす。実引数が変数・配列以外のときは、名前
のない変数とみなす。528,529における(r1,r2,…,rn)
という表現で、各ri(1<i<n)はi次元めの添字情
報を示す。また、a:bという表現は、添字の値の下限が
a、上限がbであることを示し、a:b:cという表現は、
添字の値の初期値がa、終値がbで、cが増分であるこ
とを示す。 第4図にもどつて、CALL点解析部100の動作の説明を
つづける。150の処理を終えた後、155に制御を移す。15
5ではTが該DOループの最後の文かを判定し、これが真
のときは165に制御を移し、偽のときは160に制御を移
す。160では、Tの次の文をTに設定し直し、140に制御
を移して該DOループ内の文についての処理をつづける。
165では、Sが該プログラム単位の最後の文かを判定
し、これが真のときには170に制御を移して、次のプロ
グラム単位の処理に移り、偽のときには125に制御を移
して、該プログラム単位内の文についての処理をつづけ
る。以上で、CALL点解析部100の動作を説明した。 例えば、ソースプログラム10として第2図に示される
FORTRANが与えられたとき、CALL点解析部100は、第5図
で示されるCALL点情報500(ただし、手続きOPRODのCALL
点情報のみ示した)と第13図で示される手続き名情報70
0(ただし、削減属性は未設定とする)を出力する。 次に、手続き間デーフフロー解析部200について説明
する。手続き間データフロー解析部200は、ソースプロ
グラム100に含まれる全手続きに対して参照領域情報400
を生成する部分である。まず、参照領域情報400の構造
を第6図を用いて説明する。第6図で、401は第2図で
示されるFORTRANプログラムの手続きOPRODについての参
照領域情報である。参照領域情報400は、各手続き内で
参照される仮引数および大域変数について作られ、各変
数および配列ごとに、仮引数位置又は大域変数アドレス
410,名前420,型430,寸法宣言440,変更領域450,使用領域
460,定義領域470の情報を保持する。410は大域変数アド
レスの場合(b,d)の形式であり、bはコモンブロツク
名、dはコモンブロツク内アドレスを示す。変更領域45
0,使用領域460,定義領域470はそれぞれ、変数・配列の
うち手続き呼び出しにより値が変更される可能性のある
領域、呼び出し時の値が使われる可能性のある領域、必
ず定義される領域を、第5図の529のフイールドと同じ
形式で表現したものである。450,470でφは該当する領
域が無いことを示す。 さて、第22図を用いて手続き間データフロー解析部の
動作を説明しよう。210では手続き名表を逆実行順にソ
ートする。逆実行順とは、手続き呼び出しにおける呼び
出し元手続きが呼び出し先手続きよりも必ず後にくるよ
うな順序である。このようにソートすることにより、以
下の処理において呼び出し先手続は既に処理済であるこ
とを保持する。例えば、第2図のプログラムでの逆実行
順はOPROD,WWQの順である。本実施例では、プログラム
に再帰呼び出しが含まれることがないFORTRAN言語を対
象とするので、必ず逆実行順が存在する。次に220で
は、手続き名表の先頭にある手続きを読み込む。230で
は、参照領域情報を用いて、手続き呼び出しも含めて、
手続き内での最適化を行なう。該手続き内最適化230
は、手続き呼び出しの扱い方以外は公知である。しか
し、手続き呼び出しについては参照領域情報を用いるこ
とができるので、最適化の適用範囲は従来より広い。手
続き呼び出しは第23図のように処理する。まず、221で
は、該手続き呼び出し点での実引数と呼び出し先手続き
の参照領域情報から、該呼び出し点で参照される領域を
呼び出し元手続き内の変数を使つて表現する。(210に
おけるソート処理により、呼び出し先手続きは既に230
〜270の処理がされているので、参照領域情報400が既に
作られている)第24図の2000は、そのように求めた呼び
出し元での参照領域情報であり、第2図のプログラムの
手続きWWQのISN6の文の手続き呼び出しで参照される領
域を表現している。呼び出し先手続きでの参照領域情報
400との違いは、2000の情報は呼び出し元手続き(WWQ)
内の変数を使つて表現されている点である。2020〜2070
の各フイールドは、420〜470のフイールドに対応してい
る。手続き呼び出しがループ内に含まれるため複数回実
行される場合は、ループの何回めかによって該手続き呼
び出しで参照される領域が変化するので、各参照領域を
表わすフイールドのうち2050,2060,2070はループ制御変
数などの変数を含む表現とする。 さて、第23図の説明にもどつて、次に、222では、221
で作られた呼び出し点での参照領域情報2000を公知の手
続き内データフロー解析で利用する。このとき、手続き
内データフロー解析では、各手続き呼び出しが第25図の
2220の制御構造を持つた文の列と同等であるとみなして
手続き呼び出し点での参照領域情報2000を利用する。22
21は使用領域の全てが使用される文であり、2222は定義
領域の全てに対して代入が起る文であり、2223は変更領
域の全てに対して代入が起る文である。2223は2222より
の分岐下にあり、必ず実行されるとは限らず、変数・配
列の値が変更領域上で必ず書き換えられるとは限らない
ことを示している。また、2221は分岐下にないので、使
用領域の使用が必ず起ることを示しているが、使用につ
いては必然性と可能性の区別は不要なのでこれでよい。
以上で第25図および第23図の説明を終える。 さて、第22図にもどつて手続き間データフロー解析部
の動作の説明をつづける。 240では、変更領域の解析を行なう。この解析法は公
知例で述べた文献に示されているので、詳細は略す。 250では、定義領域の解析を行なう。本解析では、与
えれた手続き内の全ての文を含むループ回数1の仮想的
なループLPを考える。そして、第26図の2500に示され
る、引数として与えられるループLに対して該ループで
必ず定義される変数・配列部分領域(DEF(L)と名づ
ける)を求める処理を、LPを引数として呼び出すことに
よりDEF(LP)を求める。このDEP(LP)が与えられた手
続きの定義領域となる。 処理2500の対象は、特にことわりない限り、大域変数
及び仮引数である。 2510では、Lに直接含まれる全てのループlに対し
て、2500の処理を再帰的に呼び出すことによりDEF
(l)を求める。Lに直接含まれるループとは、Lに含
まれるループのうち最外側のものである。以下では、ル
ープLに直接含まれるループは、ループL内の1つの文
とみなして処理する。2520では、ループL内の文に付加
されたDFN番号を示す変数nに1を設定する。DFN番号と
は、深さ優先番号付け(Depth First Numbering)アル
ゴリズムによつて各文に付加された番号であり、ループ
入口からの制御の流れにおいて先に実行される文は、そ
の文よりも後に実行される文よりもDFN番号が小さいと
いう性質がある。DFN番号が1の文は、ループ入口の文
である。 次に2530および2540ではDEF_IN(n)とDEF_OUT
(n)を計算する。DEF_IN(n)はループ入口からDFN
番号がnの文(以下、Snで示すことにする)の直前ま
で、DEF_OUT(n)はSnの直後までの間で必ず定義され
る変数・配列部分領域の集合であり、配列部分領域の場
合は該ループの制御変数および該ループ内で変化する変
数を含んだままで表現される。例えば第28図のフローグ
ラフで表わされるプログラムでは、 DEF_OUT(5)={A(I,J),A(I,J+1)} DEF_IN(6)={A(I,J)} DEF_OUT(6)={A(I,J),B(I,J)} となる。 DEF_IN(n)および、DEF_OUT(n)は、次のように
計算する。 ただし、 は、制御の流れにおいて、Snの直前にある全ての文のDF
N番号pについてのx(p)の積集合を表現する。 DEF_OUT(n)= DEF_IN(n)∪DEF0(n) ただし、DEF0(n)は、文Snでの定義領域の集合であ
り、Snが代入文,入力文などの場合は、Snで代入先又は
入力先となる変数・配列部分領域であり、Snが手続き呼
び出しの場合は、該呼び出し点での定義領域の集合であ
り、SnがループLに直接含まれるループ(lとする)の
場合は、DEF(l)である。また、a∪bは、集合aと
bとの和であり、集合a,bの要素のうち配列部分領域に
ついては、同じ配列どうしの部分領域を加えたものを表
現する。 次に2550では、nを1増し、2560ではnがループL内
の最大DFN番号(DFNmaxと名づける)以下なら2530に制
御を移し、そうでないなら2570に制御を移す。 上記において、DEF_OUT(p)の値は2540の処理がDFN
番号の昇順に行なわれることと先に述べたDFN番号の性
質により、DEF_OUT(n)の値を求める際に既に計算済
であることが保証される。 2570では、ループLの入口から最後までの間で必ず定
義される変数・配列部分領域の集合DEF_OUT(DFNmax)
を用いて、ループLの定義領域DEF(L)を次のように
計算する。 DEF(L)=extend(DEF_OUT(DFNmax),L) ただし、extend(r,l)は、rの要素のうち配列部分
領域については、添字に現われる変数がループLの実行
に伴なつて変化する文を組み込んだ表現に変換したもの
である。 例えば、第28図のフローグラフで表わされるプログラ
ムでは、 DEF_OUT(DFNmax)=DEF_OUT(8) ={A(I,J),B(I,J)} であり、ループLではIが1から100まで1きざみで増
えるので、 DEF(L)={A(1:100:1,J),B(1:100:1,J)} となる。 以上で、定義領域の解析250をするための第26図の250
0の処理の説明を終える。先に述べたように、この2500
の処理を手続き全体を含む仮想ループLPを引数として呼
び出すことにより、該手続きの定義領域(DEF(LP)に
等しい)が求められる。 さて、第22図の説明にもどつて、260では、使用領域
の解析を行なう。本解析では、前記仮想ループLPを引数
として、与えられたループLに対して該ループの使用領
域(USE(L)と呼ぶことにする)を求める第27図の260
0の処理を呼び出すことによりUSE(LP)を求める。この
USE(LP)を与えられた手続きの使用領域とする。第27
図の処理は特にことわりのない限り大域変数および仮引
数のみを対象として行なう。以下、第27図の2600の処理
の説明をする。 2610では、ループLに直接含まれる全てのループlに
対して、2600の処理を再帰的に呼び出すことによりUSE
(l)を求める。2620では、iに1を設定する。iは、
ループ内の変数・配列部分領域の使用がループ回数を単
位として何回前までライブかを表わす変数である。本実
施例では、iの値が1の場合と2の場合しか解析せず、
2回前までライブな使用は、何回前まででもライブな可
能性があるとして扱かつている。 実用上は、本実施例のようにライブな使用を分類すれ
ば十分であるが、必要ならば、1回め,2回め,…,m回と
m+1回め以上という分け方にしてもよい。 2630では、DFN番号を保持する変数nにL内の最大DFN
番号を設定している。2635と2640では、USE_OUTi(n)
とUSE_INi(n)を計算する。USE_OUTi(n)は、DFN番
号nの文(Sn)の直後からi−1回のLのループくり返
しを終てLのループ出口までの間に使われる可能性のあ
る変数・配列部分領域の集合。USE_INi(n)は、Snの
直前からi−1回のループくり返しを経てLのループ出
口までの間に使われる可能性のある変数・配列部分領域
の集合である。例えば、第29図のフローグラフに表わさ
れるプログラムでは、 USE_IN1(5)={A(I−1,J)} USE_IN1(1)={A(I−1,J),A(I,J−1)} USE_OUT2(1)={A(I,J−1)} となる。 USE_OUT2(1)にA(I−1,J)が含まれないのは、
A(I−1,J)の値はループ1回前の、S5とS3における
A(I,J)への代入により必ず再定義されるため、ルー
プ1回前のS1の直後ではライブでなくなるためである。
USE_OUTi(n)およびUSE_INi(n)は次のように計算
する。 ただし、 は、制御の流れにおいて、Snの直後にある文のDFN番号
sについてのx(s)の和を表現する。 ただし、USE0(n)は、文Snでの使用領域の集合であ
り、Snが代入文,出力文などの場合は、Snで使用,出力
される変数・配列部分領域であり、Snが手続き呼び出し
の場合は、該呼び出し点での使用領域の集合であり、Sn
がループLに直接含まれるループ(lとする)の場合
は、USE(l)である。 また、 は、集合aから集合bを引いたものであり、集合a,bの
要素のうち配列部分領域については、aに含まれる配列
部分領域(raと名づける)から、bに含まれる同じ配列
の部分領域(rbと名づける)を引いたものである。ただ
し、raからrbに引く場合、rbはraよりもループLの実行
がi−1回前であるとして引く。例えば、第29図のフロ
ーグラフでは、USE_IN2(5)を計算するに際して、を計算するが、この値は次のようになる。 なぜならば、A(I−1,J)はループLの1回前の実
行におけるA(I,J)と一致するからである。 上記において、USE_IN(s)は2640の処理がDFN番号
の逆順に行なわれることとDFN番号について先に述べた
性質により既に計算済であることが保証される。 次に、2645ではnを1減らし、2650ではnが1以上な
ら2620に制御を移し、そうでないなら2660に制御を移
す。2660では、iを1増し、2670ではiが2以下なら26
20に制御を移し、そうでないなら2680に制御を移す。26
80では、USE(L)を次のように計算する。 extend(USE_IN2(1),L) ただし、const(r,l,c)は、r要素の配列部分領域の
添字のうち、ループlの実行につれて値が変る変数を、
ループlのc回めのときの該変数の値で置きかえたもの
を表現する。 例えば、第29図のフローグラフで表わされるプログラ
ム中のループ(Lと名づける)に対して、USE(L)は
次のように計算される。 extend({A(I,J−1)},L} =const({A(I−1,J),L,1)}∪ {A(I:100:1,J−1)} ={A(O,J)}∪{A(I:100:1,J−1)} ={A(O,J),A(I:100:1,J−1)} 以上で、使用領域の解析260をするための第26図の260
0の処理の説明を終える。先に述べたように、この2600
の処理を手続き全体を含む仮想ループLPに対して処理す
ることにより、該手続きの使用領域(=USE(LP))が
求められる。 さて、第22図にもどつて、手続き間データフロー解析
部200の動作の説明をつづける。 270では、240〜260で求めた、変更領域情報,定義領
域情報,使用領域情報を参照領域情報400に設定する。
先に述べたように、例えば第2図のプログラムの手続き
OPRODの参照領域情報400は、第6図の401のようにな
る。 次に、280では、手続き名表700に次の手続きがあるか
を判定し、これが真なら290に制御を移して手続き名表
の次の手続きを読み込んで230に制御を移して次の手続
きの解析を始め、これが偽なら処理を終える。 以上により、各手続きを1度ずつ、逆実行順に処理し
て、各手続きの参照領域情報400を求めることによつ
て、手続き間データフロー解析部200の処理が行なわれ
る。 以上で、手続き間データフロー解析部200の動作の説
明を終える。 次に、第1図の300のCALL回数削減部の動作を第7図
を用いて説明する。 3100では、手続き呼び出し点(CALL点)の前後でルー
プ分割が出来ないためにCALL回数の削減が出来ないCALL
点を以下の処理から除外すため、該CALL点のCALL点情報
を削除する。3200では、ループ移動先となる呼び出し先
手続きのコピーを共通して使えるCALL点を1つのグルー
プにまとめる。3300では、CALL回数情報をもとに、CALL
回数削減を行なうCALL点を決定する。3400では、実際に
ソースプログラム10を書き換えてCALL回数の削減を行な
い、CALL回数削減後ソースプログラム15へ出力する。 以下、3100〜3400のそれぞれの動作について、別の図
を用いて説明する。 まず第8図を用いて、CALL回数削減不能なCALL点のCA
LL点情報を削除する部分3100の動作を説明する。 3105〜3130及び3165〜3170は、第4図の105〜130及び
165〜170からプログラム単位の名前を手続き名表に登録
する部分115を除いたものと同じである。即ち、以上に
より、各プログラム単位の最内側ループのときのみ3140
〜3160が実行される。3140では、参照領域情報400を用
いて該ループ内の文について依存グラフを作成する。31
50では、該依存グラフより強連結成分を抽出する。依存
グラフとは、データの参照についての依存関係から、文
と文の間での実行順序関係を求めた有向グラフであり、
連結成分とは該有向グラフ中でサイクルを構成するサブ
グラフ部分である。 依存グラフの作成3140で手続き間データフロー解析20
0の出力結果である参照領域情報400を使う。依存グラフ
の作成3140の方法は、参照領域情報400の扱い方以外は
公知であり、参照領域情報400の扱い方は、第22図の手
続き内データフロー解析230で述べたのと同じである。 また、強連結成分の抽出法も公知であるので詳細は略
す。 例として、第2図のFORTRANソースプログラム500の手
続きWWQのISN5〜9についての依存グラフと強連結成分
を第9図で説明する。 910は、ソースプログラム内の各データ参照点間の依
存関係を示し、ISNが6の文で手続きOPRODの呼び出しに
より値の設定された配列TMPの各要素がISNが7の文で使
用されているというフロー依存関係、ISNが7の文で値
が設定された変数SQが該文の中で使用されているという
フロー依存関係、ISNが8の文で手続きOPRODの呼び出し
により値の設定された配列TMPの各要素がISNが9の文で
使用されているというフロー依存関係、ISNが9の文で
値が設定された変数SAが該文の中で使用されているとい
うフロー依存関係とを示す。 920は、910をともに作られた文と文との間で依存グラ
フおよび強連結成分を示す。 手続き呼び出しで参照されるデータの要約情報として
本発明では可能性と必然性を区別した参照領域情報を用
いているので、手続きOPRODでは第3番めの引数であるT
MPの全要素が必ず定義され、定義の前に該配列の要素は
使用されることが無いことが分り、ISNが6の文とINSが
8の文の間にはフロー依存が生じないことが分る。しか
し、従来は、ISNが6の文からISNが8の文へのフロー依
存と、ISNが8の文からISNが6の文へのフロー依存があ
ると解析されていた。そのため、ISNが6の文と8の文
も強連結成分を構成するように解析され、強連結成分中
に2つの手続き呼び出しを含むので各手続き呼び出しで
のループ分割ができず、CALL回数削減ができないと判定
されていた。 さて、第8図にもどつて、次に3160では、1つ以上の
文を含む強連結成分に含まれるCALL文のCALL点情報を削
除する。これを行なうのは、強連結成分はループ分割に
よつて2つに分けることが出来ないため、該強連結成分
に含まれる手続き呼び出しの前後ではループ分割が行な
えず、CALL回数を削減ができないためである。 次に、第10図を用いて、CALL点のグループ化を行なう
部分3200の動作を説明する。 3205では、手続き名情報700の先頭に登録された手続
きをPとし、PのCALL点情報をCとする。3210では、C
の全ての行のCALL点グループ番号516を0に設定し、CAL
L点グループ番号がまだ決つてないことを示す。3215で
は、CALL点グループの数を示す変数Gを0に設定し、C
中の何行めかを示す変数lを1に設定する。3220では、
lが「Cの全行数」より小さいかを判定し、これが真な
ら3225へ制御を移し、偽なら3275に制御を移す。3275で
は、Pが手続き名表700に登録された最後の手続きが判
定し、これが真ならば処理を終え、偽ならば、3280で、
手続き名表でPの次に登録されている手続きをPとし、
そのCALL点情報をCとして3210に制御を移して、次の手
続きについての処理に移る。3225では、Cのl行めのCA
LL点グループ番号が0かを判定し、これが真なら2320に
制御を移し、偽ならば、3270に制御を移して、lの値を
1増して3220に制御を移して、Cの次の行についての処
理に移る。3230では、Gの値を1増して、Cのl行めの
CALL点グループ番号にGの値を設定する。3235〜3260で
は、Cのl行めと同じCALL点グループにできるCALL点の
CALL点グループ番号にGの値を設定する。3235では、C
のl行めより後の行を指す変数mにl+1を設定する。
3240では、mが「Cの全行数」以下かを判定し、これが
真なら3240に制御を移し、偽なら3265に制御を移す。32
65では、CALL回数情報15を用いて、CALL点グループ番号
がGであるCALL点のCALL回数の総和を求め、選択表1200
に設定する。第12図は選択表1200の構造を示し、1210は
呼び出し先手続き名を、1220はCALL点グループ番号を、
12230は該CALL点グループ内のCALL点のCALL回数総和を
それぞれ示すフイールドである。さて、第10図の説明に
戻つて、3245では、Cのm行めのCALL点グループ番号が
0か(即ち、CALL点グループ番号が未定か)を判定し、
これが真なら3250に制御を移し、偽なら3260に制御を移
して、3260でmの値を1増して3240に制御を移してmに
ついての次の行の処理に移る。3250では、Cのl行めと
m行めの実引数情報(520,530)が名前のフイールドを
除いて全て一致するかを判定し、これが真のときは、C
のl行めとm行めが同じCALL点グループに属すると判断
し、3255においてCのm行めのCALL点グループ番号にG
の値を設定する。この実施例では3250で示される判断基
準でCALL点グループを決めたが、この判定基準を変える
ことにより、CALL点グループの大きさを大きく、数を少
なくすることもできる。そうすることにより、ループを
移動する先の手続きのコピーを減し、メモリをより減少
できる。 第2図のFORTRANプログラムでは、第5図に示される
ように、手続きWWQのISN6とISN8のCALL点が、CALL点グ
ループ番号が1のグループとなり、選択表は第12図のよ
うになる。 次に、第14図を用いて、CALL削減点の決定を行なう部
分3300の動作を説明する。 3305では、選択表1200を、グループ内CALL回数総和12
30の大きい順にソートする。3310では、手続き名表700
の全ての行を削減属性フイールド730にNULLを設定す
る。削減属性フイールド730の値は、NULL,CALLER,CALEE
のどれかであり、各手続きごとにどれか1つの値をと
る。NULLは、削減属性730がまだ決つてない、又は、対
応する手続きがCALL回数削減に関与しないことを示し、
CALLERは対応する手続きが手続き呼び出し元として該手
続き内のCALL点がCALL回数削減対象となることを示し、
CALLEEは対応する手続きが手続き呼び出し先としてCALL
回数削減の際のループ移動先となることを示す。1つの
手続きの削減属性730の値は、同時にCALLERとCALLEEに
はならないので、ループの移動先となる手続きおよびそ
のコピーからループを更に移動することはない。よつ
て、該コピーよりの呼び出し先のコピーを更に作ること
はない。これにより、本発明の実施によつて手続きのコ
ピーの数およびメモリ量が指数関数的に増加するのを防
いでいる。 次のステツプである3315では、選択表中の何行めかを
示す変数lを1に設定する。3320では、lの値が「選択
表の行数」以下かを判定し、これが真ならば3325に制御
を移し、偽ならば処理を終える。3325では、選択表1200
のl行めで表わされるCALL点グループの呼び出し先手続
き名1210で示される手続きをPと呼ぶことにし、CALL点
グループ番号1230をGに設定する。3330では、手続き名
情報700を参照してPの削減属性730がCALLEE又はNULLか
を判定し、これが真のときは3335に制御を移し、偽のと
きには3355に制御を移す。 3335では、PのCALL点情報500を参照して、CALL点グ
ループ番号516がGの値に一致する全CALL点の呼び出し
た手続きの削減属性730がCALLER又はNULLになつている
かを手続き名情報700を用いて判定し、これが真ならば3
340に制御を移し、該CALL点グループが選択された場合
の処理をする。 偽ならば3355に制御を移し、該CALL点グループが選択
されなかつた場合の処理をする。3340では、手続き名情
報700における手続きPの削減属性をCALLEEにする。 3345では、PのCALL点情報500を参照して、CALL点グ
ループ番号516がGの値に一致する全CALL点の呼び出し
元手続きの削減属性730をCALLERにする。 3350ではlの値を1増して、次の手続きの処理に移
る。3355では、選択表のl行目及びグループを削除した
後、PのCALL点情報500のうちCALL点グループ番号がG
の値と一致する行を全て削除して、次の手続きの処理に
移る。 以上により、例えばソースプログラム10として第2図
のFORTRANプログラムが与えられた場合、手続き名情報7
00中の削減属性730は第13図のように設定される。 次に、第15図を用いて、ソース変換部3400の動作を説
明する。 3405では、読み込むべきプログラム単位が残つている
かを判定し、これが真なら3410に制御を移し、偽ならば
処理を終える。3410ではプログラム単位を1つ読み込
む。3415では、読み込まれた手続きの削減属性730がNUL
Lかを判定し、これが真ならば、3420に制御を移して、
読み込まれたプログラム単位をそのままCALL回数削減後
ソースプログラム20へ出力する。3425では、読み込まれ
た手続きの削減属性730がCALLERかを判定し、これが真
なら3430に制御を移し、偽なら3445に制御を移す。3430
〜3440は、手続き呼び出し元の側に対する処理であり、
3445〜3460は、手続き呼び出し先の側に対する処理であ
る。 3430では、CALL点情報500が残つていることによりCAL
L回数削減対象が示されている各CALL文の前と後で、該C
ALL点を囲む最内側ループを分割する。この方法は公知
であるので詳細は述べない。第2図のFORTRANプログラ
ムの手続きWWQのISN6とISN8がCALL回数削減対象のCALL
点として選択されたことによりループ分割された後のソ
ースプログラムを第16図に示す。この例のように、ルー
プ分割に伴なつて、新しい配列(TMP#1)の導入1610
〜1619、新しく導入された該配列(TMP#1)から既存
の配列・変数(TMP)への値の複写1620などが行なわれ
る。 3435では、ループ分割によつて出来たループのうち、
ループ分割を引き起したCALLのみを含むループを、該CA
LL文の呼び出し先手続きのコピーを呼び出す1つのCALL
文で置き換える。これに際して、該コピーの手続き名
は、該コピーの複写元の手続き名とCALL点グループ番号
516より生成する。生成された名前は、既存の手続きの
名前と異なるものでなければならず、又、該コピーの他
の呼び出し点でも同じ名前を用いるようにしなければな
らない。このような名前の生成法は公知であるので詳細
は述べない。 また、実引数は、その添字式に表われる最内側ループ
の制御変数を該制御変数の初期値で置きかえる。 3440では、3430〜3435で書き換えられたプログラム単
位をCALL点削減後ソースプログラムへ出力する。 3445では、読み込んだプログラム単位をそのままCALL
回数削減後ソースプログラム20に出力する。3450では、
読み込んだ手続きのCALL点グループのうち未処理のもの
があるかを判定し、これが真のときは3455に制御を移
し、偽のときは3405に制御を移して次のプログラム単位
の処理に移る。3455では、該CALL点グループに対する呼
び出し先側手続きを作成する。3460では、3450〜3455で
作られた呼び出し先側手続きをCALL点削減後ソースプロ
グラム20に出力する。 3455の動作については、第17図を用いて、より詳しく
説明する。34522では、読み込んだときのままのプログ
ラム単位を複写して、以下での変換の対象とする。3455
4では、呼び出し元の実引数の寸法宣言に合わせて、仮
引数の寸法宣言を変更して次元を拡張する。 34556では、該コピーの実行文全体をDOループでかこ
む。該ループの制御変数は、初期値1,増分1で終値は、
該CALL点グループ内のCALL点と囲む最内側ループのルー
プ長517とする。これに際して、プログラム中のRETURN
文は、新しく追加した該DOループの末端となるCONTINUE
文へのCOTO文で置き換える。 34558では、34554で次元拡張された仮引数の添字を書
き換える。この書き換えでは、まず、次元拡張されて新
しく追加された次元の添字を0とおいた後、各次元の添
字に次の値を加える。 i*n ただし、iは、新しく追加されたDOループの制御変
数。nは、該CALL点グループ内のCALL点の処理対象の該
仮引数に対応した実引数の、最内側ループによる添字変
化529の、対応する次元の添字の増分である。 34559では、該コピーの手続き名を変更する。新しい
手続き名は、3435で説明したのと同じ方法で生成する。 以上で、第17図の説明を終り、第15図のソース変換部
3400の動作の説明を終える。 第2図のFORTRANプログラムに対してソース変換3400
を終えた後の、CALL回数削減後ソースプログラム20を第
3図に示す。 第2図の手続きWWQのISN5〜ISN10のループ内にあるCA
LL文(ISN6とISN7の文)は、第3図ではループくり返し
の外にあるCALL文(ISN5とISN8の文)で置き換えられて
おり、CALL回数が200回から2回に減少している。 次に、第18図〜第19図を用いて、オブジエクトプログ
ラム生成部400で行なわれるベクトル化・並列化がどの
ように促進されるかを説明する。 第18図は、CALL回数削減後ソースプログラム20の手続
きWWQとOPROD#1をベクトル化したものを、ソースプロ
グラムの形式で表わしたものである。 手続きWWQのISN6と8の文と手続きOPROD#1のISN4〜
ISN7の文がベクトル化された処理を表わしている。添字
に*が使われている配列は、該添字の値が該次元の寸法
の下限から上限までの全ての値をとつたときの、該配列
の部分配列を表わしており、代入および演算は部分配列
の各要素ごとに行なわれる。またVSUMは、部分配列の全
要素の和を計算するベクトル演算である。 これに対して、元のソースプログラム10である第2図
では、ベクトル化の対象となる得るのは手続きWWQのISN
5〜ISN10のDOループのみであり、該DOループは手続き呼
び出しを含むためベクトル化されない。 第18図の手続きWWQのISN6と8の文と手続きOPROD#1
のISN4〜ISN7の文は、第2図の手続きWWQのISN7と9の
文と手続きOPRODのISN4〜ISN7の文に対応しており、第
2図の該対応する部分はそれぞれ100回および200回実行
されるので、ベクトル化による高速化の効果は大きい。 このようにして、CALL回数削減部300の動作により、
ベクトル化が促進され、スーパーコンピユータの適用に
よるプログラムの高速化が図れる。 第19図は、CALL回数削減後ソースプログラム20の手続
きCPROD#1をマルチプロセツサ向けに並列化したもの
をソースプログラムの形式で表わしたものである。 ISN6〜ISN13の文が並列化された処理を表わしてお
り、これらの文の中でISN7〜ISN12の部分がNP個のプロ
セツサで並列に実行されることを表わしている。ISN2
は、NPとして8を選んだことを示し、ISN5はIが各プロ
セツサに局所的な変数であることを示している。 ISN6〜ISN13の文は、第2図の手続きOPRODのISN4〜IS
N7の文に対応しており、第2図の該対応する部分は200
回実行される。これに対して、第19図のISN6〜ISN12の
部分は、ISN7〜ISN12の部分がNP個のプロセツサで200/N
P回実行される。このとき、総実行回数は200/NP*NP=N
P回で、元のソースプログラムと同じだが、それぞれの
プロセツサの処理は1/NP倍となり、各プロセツサは並列
に実行されるので、経過時間は1/NPで済む。 このように、CALL回数削減部300の動作により、並列
化が促進され、マルチプロセツサの適用によるプログラ
ムの高速化が図れる。 本実施例によれば、特に次の効果がある。 (1)手続き間データフロー解析において、各手続きの
処理が1回で済むので、解析負荷を減すことができる。 (2)CALL回数削限対象を最内側ループ内に限定してい
るので、呼び出し先手続きのコピーの生成によるメモリ
量の増加を抑止しながら、CALL回数を大巾に減すことが
できる。 (3)呼び出し先手続きのコピーの共用化を図つている
ので、メモリ量の増加を抑止することができる。 (4)呼び出し先手続きのコピー内のCALL回数削除のた
めに、更に該コピーよりの呼び出し手続きのコピーが作
られることがないので、手続きのコピーの数が指数関数
的に増えるのを防止する。 (5)CALL回数削減点の決定でCALL回数情報を用いてい
るので、CALL回数削減効果の高いCALL点から優先的にCA
LL回数削減が行なわれる。 〔発明の効果〕 本発明によれば、手続き呼び出しを含むプログラムに
おいて、手続き呼び出しで使われる配列が他の手続き呼
び出し又は文で使われている場合に、正確なデータ依存
関係が解析できるので、該手続き呼び出し部分の最適化
を促進することができる。例えば、問題点の項で述べた
ように、第20図のプログラムでは、並列化が新たに可能
になることにより、実行速度が最大100倍になる。ま
た、作用の項で述べたように、第21図の依存グラフで示
されるプログラムでは、並列化の範囲が広がることによ
り、実行速度が最大2倍になる。また、実施例の項で述
べたように、第2図のプログラムでは、CALL回数削減が
可能になり、手続き呼び出しの回数が1/100になる。 CALL回数削減自体は、ループ内に手続き呼び出しがあ
る場合、該手続き呼び出しの実行回数が「1/ループのく
り返し回数」になるので、手続き呼び出しを含むプログ
ラムの実行時間を大巾に短縮する。また、本来DOループ
を含まない手続きにDOループが追加されるので、ベクト
ル化・並列化の対象が増加し、スーパーコンピユータ・
マルチプロセツサの適用によるプログラムの高速化を図
れる。
ログラムを生成するコンパイラに係り、特に手続き呼び
出しを含むプログラム部分の最適化に好適なオブジエク
ト生成方法に関する。 〔従来の技術〕 コンパイラにおいて、生成するオブジエクトプログラ
ムを高速化するための機能を最適化と呼ぶ。従来、最適
化の適用範囲は、サブループチン・関数などの1つの手
続き内に限られていたが、近年、プロシーデイングズ
オブ ザ シグプラン 1986 シンポジウム オン コ
ンパイラ コンストラクシヨン,シグプラン ノーテイ
シズ,第21巻 第7号,1986年 7月刊、第176頁から第
185頁において論じられているように、手続き間にまた
がつた最適化が行なわれるようになつてきた。その論文
においては、手続き呼び出しを含んだループの並列実行
性可否を判定するために必要な、手続き間にまたがつた
配列で参照解析の方法が述べられている。この方法で
は、手続き呼び出しの効果を該手続き呼び出しで値が変
更される可能性のある配列部分領域(Region)と、呼び
出し手続きの実行中に値が使用される可能性のある配列
部分領域の情報に要約し、手続き呼び出しを含むループ
の並列化に際しては、ループくり返しの別々の回りのそ
れぞれで参照される可能性のある配列部分領域どうしの
間に重なりが無ければ該ループは並列実行可能と判定さ
れる。より正確に言うと、ループくり返しのある回で値
を変更される可能性のある配列部分領域と、他の回で値
を変更又は使用される可能性のある配列部分領域の間に
重なりがないことを解析することにより、該ループはル
ープくり返しの各回の処理を並列に同時に実行できると
判定する。 〔発明が解決すようとする問題点〕 上記従来技術は、同一の配列部分領域が複数回参照さ
れる場合に最適化機能が低下するという問題があつた。
例えば、第20図の左側のプログラムにおいては、Vがサ
ブルーチンSUB1のISNが4の行と7の行で参照されてい
る。さて、ISNが4の行のサブルーチンSUB2の呼び出し
では配列Vの全要素が必ず再定義されることから、Vは
DO10の制御変数Jの各値ごとに独立に使われていること
が分る。そこで第20図右側のようにVの次元を拡張する
ことにより、DO10はJの各値ごとに並列に実行できる。
この並列化により、プログラムの実行速度は最大100倍
になる。しかしながら、従来技術では、DO10のループく
り返しにおいて配列Vの値がSUB2で毎回変更・使用され
る可能性があることを解析するのみだつたので、使用の
前に定義が必ず起ることは分らなかつた。そのため、上
記のような最適化はできなかつた。 本発明の目的は、手続き呼び出しを含むプログラムの
解析機能を拡張し、同一配列部分領域の参照が複数回起
る場合にも十分な最適化を可能とすることである。 〔問題点を解決するための手段〕 上記目的は、手続き呼び出し効果の要約情報におい
て、変数・配列部分領域の参照の可能性と必然性を区別
して扱かうことにより達成される。 参照には定義(値の変更)と使用の2種類あり、その
うち、使用の必然性はデータフローに影響しない。よつ
て、次のようにすれば良い。 手続き間データフロー解析を行なう際、各手続き呼び
出しにより値が変更(定義)される可能性のある変数・
配列部分領域と、呼び出し時の値が使用される可能性の
ある変数・配列部分領域と、値が必ず定義される変数・
配列部分領域とを手続き呼び出し効果を要約情報として
用い、手続き呼び出しを含む部分のデータフロー解析に
おいては該要約情報で該手続き呼び出しのデータ参照を
代表させ、参照の可能性と必然性を区別したデータフロ
ー解析を行なう。 〔作用〕 手続き呼び出しにより値が変更される可能性のある変
数・配列部分領域と、呼び出し時の値が使用される可能
性のある変数・配列部分領域を求めることにより、手続
き呼び出しを含めた文と文の間で、配列部分領域を含め
たデータの値がどこで設定され、どこで使用されるかが
分る。しかも、使用については呼び出し時の値の使用に
ついての情報なので、手続き内で一度再定義された値の
使用は除外することができる。よつて、複数回の手続き
呼び出しで同じ配列部分領域が参照されていても、該参
照が手続きの呼び出し時の値を使用せず該配列部分領域
を独立して使つていることが分るので、各呼び出しごと
に該配列部分領域を別の配列に変えることにより、該複
数の手続き呼び出しを並列に実行するなどの最適化を行
なえる。 また、手続き呼び出しにより値が必ず定義される変数
・配列部分領域を求めることにより、該手続きの前で設
定されていた値が該手続き呼び出しの後まで届くかを判
定できるので、手続き呼び出しの前後の文の並列性を従
来より詳しく求めることができ、最適化の範囲を拡大す
る。第21図を用いてこの作用を説明する。1は従来の技
術の解析による依存グラフであり、2は本発明の技術に
よる依存グラフである。 S1〜S3は文であり、それらを結ぶ矢印は文と文の間の
データ依存を表わす。2では、S2で必ず定義される変数
・配列部分領域の解析により、S1からS3へのフロー依存
が無いことが分つているとする。配列名のネームなどの
処理によりこれらよりS1からS2への逆依存を削除する
と、1は3のように、2は4のようになる。3では、S1
とS2が並列に実行できることが分るのみであるが、4で
はS1とS3も並列に実行できることが分る。よつて例え
ば、S2の実行時間がS1,S3に比べて小さい場合は、3に
比べて4の実行時間は約半分となり、実行時間が大巾に
減少する。 〔実施例〕 以下、本発明の一実施例を図面を用いて説明する。本
実施例では、手続き間データフロー解析結果を用いる最
適化の例として、新たな最適化であるCALL回数削減処理
を選んだ。しかし、本発明の実施効果は該最適化に限定
されるものではなく、既存のほとんどの最適化に対して
その適用範囲拡大に有効である。 CALL回数削減処理は、プログラムの実行における手続
き呼び出しの実行回数(CALL回数)を削減する最適化で
ある。例えば、第2図のFORTRANプログラムでは、手続
きWWQにおいて、手続きOPRODの呼び出しがDO10のループ
で100回×2ケ所=合計200回実行されることが分るが、
CALL回数削減処理により、第2図のプログラムを、第2
図と同じ処理を行ない手続き呼び出しが2回に削減され
た第3図のプログラムに変換することができる。 CALL回数削減処理は、第2図のプログラムから第3図
のプログラムへの変換例で示されるように、ループ内に
ある手続き呼び出しに着目し、該ループのくり返しを呼
び出し先手続きに移動することにより手続き呼び出しの
実行回数(CALL回数)を削減する。実際には、呼び出し
先手続きが他の手続きからも呼ばれていることを考慮し
て、呼び出し先手続きのコピーにループくり返しを移動
し、呼び出し先手続き自身は残しておく。また、呼び出
し先手続きのコピーの数を削減するために、ループくり
返しが同一の場合は、該コピーを共用する処理、ループ
くり返しの移動に際してループを分割する処理も行なつ
ている。 ループくり返しの前に行なわれるループ分割では、手
続き呼び出しを含むループを該手続き呼び出しの前後で
分割しているが、このループ分割によつて手続き呼び出
しを含まないループが生じ、新たにベクトル化,並列化
の対象とすることができる。 第1図は、本発明を実施したコンパイラを機能ブロツ
クで示すものである。40はコンパイラを示している。コ
ンパイラ40はソースプログラム10を入力して、最後にオ
ブジエクトプログラム30を出力する。本実施例では、更
に最適なCALL削減点を決定するために、各手続きからど
の手続きが何回呼ばれたかを示す情報であるCALL回数情
報15も入力している。CALL回数情報15はプログラムの動
的特性を解析する公知のコーテイリテイプログラムの出
力として得ることが出来る。 手続き名情報700,CALL点情報500,参照領域情報600はC
ALL回数削減のために用いる内部データであり、CALL回
数削減後ソースプログラム20は、ソースプログラム10に
対してCALL回数削減を行なつた後のソースプログラムで
ある。 コンパイラ40はCALL点解析部100,手続き間データフロ
ー解析部200,CALL回数削減部300,オブジエクトプログラ
ム生成部400、とから構成される。 CALL点解析部100は、ソースプログラム10を入力し、
ソースプログラム10中に含まれる全手続き名の一覧表で
ある手続き名情報700、および、各手続きの最内側ルー
プ内の手続き呼び出し点CALL点での実引数情報であるCA
LL点情報500を出力する部分である。 CALL点情報500の収集対象を最内側ループに限定して
いるのは、本発明の実施によつて増加するメモリ量を小
さくするためであり、この制限は取り除いても良い。 手続き間データフロー解析部200は、ソースプログラ
ム100を入力し、ソースプログラム100に含まれる全手続
きについて、該手続きの呼び出しにより値が変更される
可能性のある変数・配列部分領域(変更領域)と、呼び
出し時の値が使用される可能性のある変数・配列部分領
域(使用領域)と、値が必ず定義される変数・配列部分
領域(定義領域)とを解析し、結果として参照領域情報
600を出力する部分である。 CALL回数削減部300は、ソースプログラム10,手続き名
情報700,CALL点情報500,参照領域情報600,CALL回数情報
15とを入力し、ソースプログラム10に対してCALL点削減
を行なつた後のソースプログラムであるCALL回数削減後
ソースプログラム20を生成出力する部分である。 オブジエクトプログラム生成部400は、CALL回数削減
後ソースプログラム20を入力し、該入力からオブジエク
トプログラム30を生成・出力する部分である。 オブジエクト生成部400は公知なので詳細は省く。オ
ブジエクト生成部400では、CALL回数削減後ソースプロ
グラム200に対して既存の最適化も行なう。既存の最適
化でも参照領域情報600を利用することにより最適範囲
を拡大することができるが、詳細は述べない。 以下、コンパイラ40の各部分100〜400の動作を詳細に
説明する。 まず、第4図を用いて、CALL点解析部100の動作を説
明する。 105では、読み込むべきプログラム単位が残つている
かを判定し、これが真のときは110へ制御を移し、偽の
ときは処理を終了する。110では、プログラム単位を1
つ読み込んで115に制御を移す。115では、読み込んだプ
ログラム単位の手続き名を名表700に登録し、120に制御
を移す。第13図に手続き名表の構造を示す。710はプロ
グラム単位の手続き名を保持するフイールド、720は該
プログラム単位を呼び出しているCALL点情報500へのポ
インタを保持するフイールド、730は該プログラムの削
減属性(後述)を保持するフイールドであり、730のフ
イールドはCALL点解析部100では値を設定しない。120で
は、読み込んだプログラム単位の先頭の文をSに設定
し、125に制御を移す。125では、SがDO文かを判定し、
これが真のときは130に制御を移し、偽のときは165に制
御を移す。130では文Sで始まるDOループが最内側かを
判定し、これが真のときは135に制御を移し、偽のとき
は165に制御を移す。135では、該DOループの先頭の文を
Tに設定して、140に制御を移す。140では、TがCALL文
かを判定し、これが真のときには145に制御を移し、偽
のときは155に制御を移す。145では該CALL文が該DOルー
プの中で必ず実行される文であるかを判定し、これが真
のときは150へ制御を移し、偽のときは155へ制御を移
す。以上により、各クログラム単位の最内側DOループ中
の必らず実行されるCALL文のときのみ150に到達する。1
50では、CALL先の手続きのCALL点情報500に該CALL文の
実引数情報を追加する。第5図にCALL点情報の構造を示
す。510は各手続き情報ごとに作られ、該手続きの各呼
び出し元のCALL文(CALL点)についての情報を保持す
る。512は呼び出し元手続き名を保持するフイールド、5
14は該CALL点のISNを保持するフイールド、516は該CALL
点のグループ番号(後述)を保持するフイールド、517
は該CALL点を囲む最内側ループのループ長を保持するフ
イールド、518は該CALL点での実引数情報(520,530)へ
のポインタを保持するフイールドである。ISNとは各手
続きの何行目の文かを示す番号である。520を用いて実
引数情報の構造を説明する。522は仮数リスト中での実
引数の位置、即ち、何番目の実引数であるかを示すフイ
ールド、524は実引数となる変数・配列の名前を保持す
るフイールド、526は実引数の型を保持するフイール
ド、528は実引数の寸法宣言を保持するフイールド、529
は最内側ループの実行に従がつた実引数の添字値の変化
を示すものである。実引数が変数の場合には、長さ1の
配列とみなす。実引数が変数・配列以外のときは、名前
のない変数とみなす。528,529における(r1,r2,…,rn)
という表現で、各ri(1<i<n)はi次元めの添字情
報を示す。また、a:bという表現は、添字の値の下限が
a、上限がbであることを示し、a:b:cという表現は、
添字の値の初期値がa、終値がbで、cが増分であるこ
とを示す。 第4図にもどつて、CALL点解析部100の動作の説明を
つづける。150の処理を終えた後、155に制御を移す。15
5ではTが該DOループの最後の文かを判定し、これが真
のときは165に制御を移し、偽のときは160に制御を移
す。160では、Tの次の文をTに設定し直し、140に制御
を移して該DOループ内の文についての処理をつづける。
165では、Sが該プログラム単位の最後の文かを判定
し、これが真のときには170に制御を移して、次のプロ
グラム単位の処理に移り、偽のときには125に制御を移
して、該プログラム単位内の文についての処理をつづけ
る。以上で、CALL点解析部100の動作を説明した。 例えば、ソースプログラム10として第2図に示される
FORTRANが与えられたとき、CALL点解析部100は、第5図
で示されるCALL点情報500(ただし、手続きOPRODのCALL
点情報のみ示した)と第13図で示される手続き名情報70
0(ただし、削減属性は未設定とする)を出力する。 次に、手続き間デーフフロー解析部200について説明
する。手続き間データフロー解析部200は、ソースプロ
グラム100に含まれる全手続きに対して参照領域情報400
を生成する部分である。まず、参照領域情報400の構造
を第6図を用いて説明する。第6図で、401は第2図で
示されるFORTRANプログラムの手続きOPRODについての参
照領域情報である。参照領域情報400は、各手続き内で
参照される仮引数および大域変数について作られ、各変
数および配列ごとに、仮引数位置又は大域変数アドレス
410,名前420,型430,寸法宣言440,変更領域450,使用領域
460,定義領域470の情報を保持する。410は大域変数アド
レスの場合(b,d)の形式であり、bはコモンブロツク
名、dはコモンブロツク内アドレスを示す。変更領域45
0,使用領域460,定義領域470はそれぞれ、変数・配列の
うち手続き呼び出しにより値が変更される可能性のある
領域、呼び出し時の値が使われる可能性のある領域、必
ず定義される領域を、第5図の529のフイールドと同じ
形式で表現したものである。450,470でφは該当する領
域が無いことを示す。 さて、第22図を用いて手続き間データフロー解析部の
動作を説明しよう。210では手続き名表を逆実行順にソ
ートする。逆実行順とは、手続き呼び出しにおける呼び
出し元手続きが呼び出し先手続きよりも必ず後にくるよ
うな順序である。このようにソートすることにより、以
下の処理において呼び出し先手続は既に処理済であるこ
とを保持する。例えば、第2図のプログラムでの逆実行
順はOPROD,WWQの順である。本実施例では、プログラム
に再帰呼び出しが含まれることがないFORTRAN言語を対
象とするので、必ず逆実行順が存在する。次に220で
は、手続き名表の先頭にある手続きを読み込む。230で
は、参照領域情報を用いて、手続き呼び出しも含めて、
手続き内での最適化を行なう。該手続き内最適化230
は、手続き呼び出しの扱い方以外は公知である。しか
し、手続き呼び出しについては参照領域情報を用いるこ
とができるので、最適化の適用範囲は従来より広い。手
続き呼び出しは第23図のように処理する。まず、221で
は、該手続き呼び出し点での実引数と呼び出し先手続き
の参照領域情報から、該呼び出し点で参照される領域を
呼び出し元手続き内の変数を使つて表現する。(210に
おけるソート処理により、呼び出し先手続きは既に230
〜270の処理がされているので、参照領域情報400が既に
作られている)第24図の2000は、そのように求めた呼び
出し元での参照領域情報であり、第2図のプログラムの
手続きWWQのISN6の文の手続き呼び出しで参照される領
域を表現している。呼び出し先手続きでの参照領域情報
400との違いは、2000の情報は呼び出し元手続き(WWQ)
内の変数を使つて表現されている点である。2020〜2070
の各フイールドは、420〜470のフイールドに対応してい
る。手続き呼び出しがループ内に含まれるため複数回実
行される場合は、ループの何回めかによって該手続き呼
び出しで参照される領域が変化するので、各参照領域を
表わすフイールドのうち2050,2060,2070はループ制御変
数などの変数を含む表現とする。 さて、第23図の説明にもどつて、次に、222では、221
で作られた呼び出し点での参照領域情報2000を公知の手
続き内データフロー解析で利用する。このとき、手続き
内データフロー解析では、各手続き呼び出しが第25図の
2220の制御構造を持つた文の列と同等であるとみなして
手続き呼び出し点での参照領域情報2000を利用する。22
21は使用領域の全てが使用される文であり、2222は定義
領域の全てに対して代入が起る文であり、2223は変更領
域の全てに対して代入が起る文である。2223は2222より
の分岐下にあり、必ず実行されるとは限らず、変数・配
列の値が変更領域上で必ず書き換えられるとは限らない
ことを示している。また、2221は分岐下にないので、使
用領域の使用が必ず起ることを示しているが、使用につ
いては必然性と可能性の区別は不要なのでこれでよい。
以上で第25図および第23図の説明を終える。 さて、第22図にもどつて手続き間データフロー解析部
の動作の説明をつづける。 240では、変更領域の解析を行なう。この解析法は公
知例で述べた文献に示されているので、詳細は略す。 250では、定義領域の解析を行なう。本解析では、与
えれた手続き内の全ての文を含むループ回数1の仮想的
なループLPを考える。そして、第26図の2500に示され
る、引数として与えられるループLに対して該ループで
必ず定義される変数・配列部分領域(DEF(L)と名づ
ける)を求める処理を、LPを引数として呼び出すことに
よりDEF(LP)を求める。このDEP(LP)が与えられた手
続きの定義領域となる。 処理2500の対象は、特にことわりない限り、大域変数
及び仮引数である。 2510では、Lに直接含まれる全てのループlに対し
て、2500の処理を再帰的に呼び出すことによりDEF
(l)を求める。Lに直接含まれるループとは、Lに含
まれるループのうち最外側のものである。以下では、ル
ープLに直接含まれるループは、ループL内の1つの文
とみなして処理する。2520では、ループL内の文に付加
されたDFN番号を示す変数nに1を設定する。DFN番号と
は、深さ優先番号付け(Depth First Numbering)アル
ゴリズムによつて各文に付加された番号であり、ループ
入口からの制御の流れにおいて先に実行される文は、そ
の文よりも後に実行される文よりもDFN番号が小さいと
いう性質がある。DFN番号が1の文は、ループ入口の文
である。 次に2530および2540ではDEF_IN(n)とDEF_OUT
(n)を計算する。DEF_IN(n)はループ入口からDFN
番号がnの文(以下、Snで示すことにする)の直前ま
で、DEF_OUT(n)はSnの直後までの間で必ず定義され
る変数・配列部分領域の集合であり、配列部分領域の場
合は該ループの制御変数および該ループ内で変化する変
数を含んだままで表現される。例えば第28図のフローグ
ラフで表わされるプログラムでは、 DEF_OUT(5)={A(I,J),A(I,J+1)} DEF_IN(6)={A(I,J)} DEF_OUT(6)={A(I,J),B(I,J)} となる。 DEF_IN(n)および、DEF_OUT(n)は、次のように
計算する。 ただし、 は、制御の流れにおいて、Snの直前にある全ての文のDF
N番号pについてのx(p)の積集合を表現する。 DEF_OUT(n)= DEF_IN(n)∪DEF0(n) ただし、DEF0(n)は、文Snでの定義領域の集合であ
り、Snが代入文,入力文などの場合は、Snで代入先又は
入力先となる変数・配列部分領域であり、Snが手続き呼
び出しの場合は、該呼び出し点での定義領域の集合であ
り、SnがループLに直接含まれるループ(lとする)の
場合は、DEF(l)である。また、a∪bは、集合aと
bとの和であり、集合a,bの要素のうち配列部分領域に
ついては、同じ配列どうしの部分領域を加えたものを表
現する。 次に2550では、nを1増し、2560ではnがループL内
の最大DFN番号(DFNmaxと名づける)以下なら2530に制
御を移し、そうでないなら2570に制御を移す。 上記において、DEF_OUT(p)の値は2540の処理がDFN
番号の昇順に行なわれることと先に述べたDFN番号の性
質により、DEF_OUT(n)の値を求める際に既に計算済
であることが保証される。 2570では、ループLの入口から最後までの間で必ず定
義される変数・配列部分領域の集合DEF_OUT(DFNmax)
を用いて、ループLの定義領域DEF(L)を次のように
計算する。 DEF(L)=extend(DEF_OUT(DFNmax),L) ただし、extend(r,l)は、rの要素のうち配列部分
領域については、添字に現われる変数がループLの実行
に伴なつて変化する文を組み込んだ表現に変換したもの
である。 例えば、第28図のフローグラフで表わされるプログラ
ムでは、 DEF_OUT(DFNmax)=DEF_OUT(8) ={A(I,J),B(I,J)} であり、ループLではIが1から100まで1きざみで増
えるので、 DEF(L)={A(1:100:1,J),B(1:100:1,J)} となる。 以上で、定義領域の解析250をするための第26図の250
0の処理の説明を終える。先に述べたように、この2500
の処理を手続き全体を含む仮想ループLPを引数として呼
び出すことにより、該手続きの定義領域(DEF(LP)に
等しい)が求められる。 さて、第22図の説明にもどつて、260では、使用領域
の解析を行なう。本解析では、前記仮想ループLPを引数
として、与えられたループLに対して該ループの使用領
域(USE(L)と呼ぶことにする)を求める第27図の260
0の処理を呼び出すことによりUSE(LP)を求める。この
USE(LP)を与えられた手続きの使用領域とする。第27
図の処理は特にことわりのない限り大域変数および仮引
数のみを対象として行なう。以下、第27図の2600の処理
の説明をする。 2610では、ループLに直接含まれる全てのループlに
対して、2600の処理を再帰的に呼び出すことによりUSE
(l)を求める。2620では、iに1を設定する。iは、
ループ内の変数・配列部分領域の使用がループ回数を単
位として何回前までライブかを表わす変数である。本実
施例では、iの値が1の場合と2の場合しか解析せず、
2回前までライブな使用は、何回前まででもライブな可
能性があるとして扱かつている。 実用上は、本実施例のようにライブな使用を分類すれ
ば十分であるが、必要ならば、1回め,2回め,…,m回と
m+1回め以上という分け方にしてもよい。 2630では、DFN番号を保持する変数nにL内の最大DFN
番号を設定している。2635と2640では、USE_OUTi(n)
とUSE_INi(n)を計算する。USE_OUTi(n)は、DFN番
号nの文(Sn)の直後からi−1回のLのループくり返
しを終てLのループ出口までの間に使われる可能性のあ
る変数・配列部分領域の集合。USE_INi(n)は、Snの
直前からi−1回のループくり返しを経てLのループ出
口までの間に使われる可能性のある変数・配列部分領域
の集合である。例えば、第29図のフローグラフに表わさ
れるプログラムでは、 USE_IN1(5)={A(I−1,J)} USE_IN1(1)={A(I−1,J),A(I,J−1)} USE_OUT2(1)={A(I,J−1)} となる。 USE_OUT2(1)にA(I−1,J)が含まれないのは、
A(I−1,J)の値はループ1回前の、S5とS3における
A(I,J)への代入により必ず再定義されるため、ルー
プ1回前のS1の直後ではライブでなくなるためである。
USE_OUTi(n)およびUSE_INi(n)は次のように計算
する。 ただし、 は、制御の流れにおいて、Snの直後にある文のDFN番号
sについてのx(s)の和を表現する。 ただし、USE0(n)は、文Snでの使用領域の集合であ
り、Snが代入文,出力文などの場合は、Snで使用,出力
される変数・配列部分領域であり、Snが手続き呼び出し
の場合は、該呼び出し点での使用領域の集合であり、Sn
がループLに直接含まれるループ(lとする)の場合
は、USE(l)である。 また、 は、集合aから集合bを引いたものであり、集合a,bの
要素のうち配列部分領域については、aに含まれる配列
部分領域(raと名づける)から、bに含まれる同じ配列
の部分領域(rbと名づける)を引いたものである。ただ
し、raからrbに引く場合、rbはraよりもループLの実行
がi−1回前であるとして引く。例えば、第29図のフロ
ーグラフでは、USE_IN2(5)を計算するに際して、を計算するが、この値は次のようになる。 なぜならば、A(I−1,J)はループLの1回前の実
行におけるA(I,J)と一致するからである。 上記において、USE_IN(s)は2640の処理がDFN番号
の逆順に行なわれることとDFN番号について先に述べた
性質により既に計算済であることが保証される。 次に、2645ではnを1減らし、2650ではnが1以上な
ら2620に制御を移し、そうでないなら2660に制御を移
す。2660では、iを1増し、2670ではiが2以下なら26
20に制御を移し、そうでないなら2680に制御を移す。26
80では、USE(L)を次のように計算する。 extend(USE_IN2(1),L) ただし、const(r,l,c)は、r要素の配列部分領域の
添字のうち、ループlの実行につれて値が変る変数を、
ループlのc回めのときの該変数の値で置きかえたもの
を表現する。 例えば、第29図のフローグラフで表わされるプログラ
ム中のループ(Lと名づける)に対して、USE(L)は
次のように計算される。 extend({A(I,J−1)},L} =const({A(I−1,J),L,1)}∪ {A(I:100:1,J−1)} ={A(O,J)}∪{A(I:100:1,J−1)} ={A(O,J),A(I:100:1,J−1)} 以上で、使用領域の解析260をするための第26図の260
0の処理の説明を終える。先に述べたように、この2600
の処理を手続き全体を含む仮想ループLPに対して処理す
ることにより、該手続きの使用領域(=USE(LP))が
求められる。 さて、第22図にもどつて、手続き間データフロー解析
部200の動作の説明をつづける。 270では、240〜260で求めた、変更領域情報,定義領
域情報,使用領域情報を参照領域情報400に設定する。
先に述べたように、例えば第2図のプログラムの手続き
OPRODの参照領域情報400は、第6図の401のようにな
る。 次に、280では、手続き名表700に次の手続きがあるか
を判定し、これが真なら290に制御を移して手続き名表
の次の手続きを読み込んで230に制御を移して次の手続
きの解析を始め、これが偽なら処理を終える。 以上により、各手続きを1度ずつ、逆実行順に処理し
て、各手続きの参照領域情報400を求めることによつ
て、手続き間データフロー解析部200の処理が行なわれ
る。 以上で、手続き間データフロー解析部200の動作の説
明を終える。 次に、第1図の300のCALL回数削減部の動作を第7図
を用いて説明する。 3100では、手続き呼び出し点(CALL点)の前後でルー
プ分割が出来ないためにCALL回数の削減が出来ないCALL
点を以下の処理から除外すため、該CALL点のCALL点情報
を削除する。3200では、ループ移動先となる呼び出し先
手続きのコピーを共通して使えるCALL点を1つのグルー
プにまとめる。3300では、CALL回数情報をもとに、CALL
回数削減を行なうCALL点を決定する。3400では、実際に
ソースプログラム10を書き換えてCALL回数の削減を行な
い、CALL回数削減後ソースプログラム15へ出力する。 以下、3100〜3400のそれぞれの動作について、別の図
を用いて説明する。 まず第8図を用いて、CALL回数削減不能なCALL点のCA
LL点情報を削除する部分3100の動作を説明する。 3105〜3130及び3165〜3170は、第4図の105〜130及び
165〜170からプログラム単位の名前を手続き名表に登録
する部分115を除いたものと同じである。即ち、以上に
より、各プログラム単位の最内側ループのときのみ3140
〜3160が実行される。3140では、参照領域情報400を用
いて該ループ内の文について依存グラフを作成する。31
50では、該依存グラフより強連結成分を抽出する。依存
グラフとは、データの参照についての依存関係から、文
と文の間での実行順序関係を求めた有向グラフであり、
連結成分とは該有向グラフ中でサイクルを構成するサブ
グラフ部分である。 依存グラフの作成3140で手続き間データフロー解析20
0の出力結果である参照領域情報400を使う。依存グラフ
の作成3140の方法は、参照領域情報400の扱い方以外は
公知であり、参照領域情報400の扱い方は、第22図の手
続き内データフロー解析230で述べたのと同じである。 また、強連結成分の抽出法も公知であるので詳細は略
す。 例として、第2図のFORTRANソースプログラム500の手
続きWWQのISN5〜9についての依存グラフと強連結成分
を第9図で説明する。 910は、ソースプログラム内の各データ参照点間の依
存関係を示し、ISNが6の文で手続きOPRODの呼び出しに
より値の設定された配列TMPの各要素がISNが7の文で使
用されているというフロー依存関係、ISNが7の文で値
が設定された変数SQが該文の中で使用されているという
フロー依存関係、ISNが8の文で手続きOPRODの呼び出し
により値の設定された配列TMPの各要素がISNが9の文で
使用されているというフロー依存関係、ISNが9の文で
値が設定された変数SAが該文の中で使用されているとい
うフロー依存関係とを示す。 920は、910をともに作られた文と文との間で依存グラ
フおよび強連結成分を示す。 手続き呼び出しで参照されるデータの要約情報として
本発明では可能性と必然性を区別した参照領域情報を用
いているので、手続きOPRODでは第3番めの引数であるT
MPの全要素が必ず定義され、定義の前に該配列の要素は
使用されることが無いことが分り、ISNが6の文とINSが
8の文の間にはフロー依存が生じないことが分る。しか
し、従来は、ISNが6の文からISNが8の文へのフロー依
存と、ISNが8の文からISNが6の文へのフロー依存があ
ると解析されていた。そのため、ISNが6の文と8の文
も強連結成分を構成するように解析され、強連結成分中
に2つの手続き呼び出しを含むので各手続き呼び出しで
のループ分割ができず、CALL回数削減ができないと判定
されていた。 さて、第8図にもどつて、次に3160では、1つ以上の
文を含む強連結成分に含まれるCALL文のCALL点情報を削
除する。これを行なうのは、強連結成分はループ分割に
よつて2つに分けることが出来ないため、該強連結成分
に含まれる手続き呼び出しの前後ではループ分割が行な
えず、CALL回数を削減ができないためである。 次に、第10図を用いて、CALL点のグループ化を行なう
部分3200の動作を説明する。 3205では、手続き名情報700の先頭に登録された手続
きをPとし、PのCALL点情報をCとする。3210では、C
の全ての行のCALL点グループ番号516を0に設定し、CAL
L点グループ番号がまだ決つてないことを示す。3215で
は、CALL点グループの数を示す変数Gを0に設定し、C
中の何行めかを示す変数lを1に設定する。3220では、
lが「Cの全行数」より小さいかを判定し、これが真な
ら3225へ制御を移し、偽なら3275に制御を移す。3275で
は、Pが手続き名表700に登録された最後の手続きが判
定し、これが真ならば処理を終え、偽ならば、3280で、
手続き名表でPの次に登録されている手続きをPとし、
そのCALL点情報をCとして3210に制御を移して、次の手
続きについての処理に移る。3225では、Cのl行めのCA
LL点グループ番号が0かを判定し、これが真なら2320に
制御を移し、偽ならば、3270に制御を移して、lの値を
1増して3220に制御を移して、Cの次の行についての処
理に移る。3230では、Gの値を1増して、Cのl行めの
CALL点グループ番号にGの値を設定する。3235〜3260で
は、Cのl行めと同じCALL点グループにできるCALL点の
CALL点グループ番号にGの値を設定する。3235では、C
のl行めより後の行を指す変数mにl+1を設定する。
3240では、mが「Cの全行数」以下かを判定し、これが
真なら3240に制御を移し、偽なら3265に制御を移す。32
65では、CALL回数情報15を用いて、CALL点グループ番号
がGであるCALL点のCALL回数の総和を求め、選択表1200
に設定する。第12図は選択表1200の構造を示し、1210は
呼び出し先手続き名を、1220はCALL点グループ番号を、
12230は該CALL点グループ内のCALL点のCALL回数総和を
それぞれ示すフイールドである。さて、第10図の説明に
戻つて、3245では、Cのm行めのCALL点グループ番号が
0か(即ち、CALL点グループ番号が未定か)を判定し、
これが真なら3250に制御を移し、偽なら3260に制御を移
して、3260でmの値を1増して3240に制御を移してmに
ついての次の行の処理に移る。3250では、Cのl行めと
m行めの実引数情報(520,530)が名前のフイールドを
除いて全て一致するかを判定し、これが真のときは、C
のl行めとm行めが同じCALL点グループに属すると判断
し、3255においてCのm行めのCALL点グループ番号にG
の値を設定する。この実施例では3250で示される判断基
準でCALL点グループを決めたが、この判定基準を変える
ことにより、CALL点グループの大きさを大きく、数を少
なくすることもできる。そうすることにより、ループを
移動する先の手続きのコピーを減し、メモリをより減少
できる。 第2図のFORTRANプログラムでは、第5図に示される
ように、手続きWWQのISN6とISN8のCALL点が、CALL点グ
ループ番号が1のグループとなり、選択表は第12図のよ
うになる。 次に、第14図を用いて、CALL削減点の決定を行なう部
分3300の動作を説明する。 3305では、選択表1200を、グループ内CALL回数総和12
30の大きい順にソートする。3310では、手続き名表700
の全ての行を削減属性フイールド730にNULLを設定す
る。削減属性フイールド730の値は、NULL,CALLER,CALEE
のどれかであり、各手続きごとにどれか1つの値をと
る。NULLは、削減属性730がまだ決つてない、又は、対
応する手続きがCALL回数削減に関与しないことを示し、
CALLERは対応する手続きが手続き呼び出し元として該手
続き内のCALL点がCALL回数削減対象となることを示し、
CALLEEは対応する手続きが手続き呼び出し先としてCALL
回数削減の際のループ移動先となることを示す。1つの
手続きの削減属性730の値は、同時にCALLERとCALLEEに
はならないので、ループの移動先となる手続きおよびそ
のコピーからループを更に移動することはない。よつ
て、該コピーよりの呼び出し先のコピーを更に作ること
はない。これにより、本発明の実施によつて手続きのコ
ピーの数およびメモリ量が指数関数的に増加するのを防
いでいる。 次のステツプである3315では、選択表中の何行めかを
示す変数lを1に設定する。3320では、lの値が「選択
表の行数」以下かを判定し、これが真ならば3325に制御
を移し、偽ならば処理を終える。3325では、選択表1200
のl行めで表わされるCALL点グループの呼び出し先手続
き名1210で示される手続きをPと呼ぶことにし、CALL点
グループ番号1230をGに設定する。3330では、手続き名
情報700を参照してPの削減属性730がCALLEE又はNULLか
を判定し、これが真のときは3335に制御を移し、偽のと
きには3355に制御を移す。 3335では、PのCALL点情報500を参照して、CALL点グ
ループ番号516がGの値に一致する全CALL点の呼び出し
た手続きの削減属性730がCALLER又はNULLになつている
かを手続き名情報700を用いて判定し、これが真ならば3
340に制御を移し、該CALL点グループが選択された場合
の処理をする。 偽ならば3355に制御を移し、該CALL点グループが選択
されなかつた場合の処理をする。3340では、手続き名情
報700における手続きPの削減属性をCALLEEにする。 3345では、PのCALL点情報500を参照して、CALL点グ
ループ番号516がGの値に一致する全CALL点の呼び出し
元手続きの削減属性730をCALLERにする。 3350ではlの値を1増して、次の手続きの処理に移
る。3355では、選択表のl行目及びグループを削除した
後、PのCALL点情報500のうちCALL点グループ番号がG
の値と一致する行を全て削除して、次の手続きの処理に
移る。 以上により、例えばソースプログラム10として第2図
のFORTRANプログラムが与えられた場合、手続き名情報7
00中の削減属性730は第13図のように設定される。 次に、第15図を用いて、ソース変換部3400の動作を説
明する。 3405では、読み込むべきプログラム単位が残つている
かを判定し、これが真なら3410に制御を移し、偽ならば
処理を終える。3410ではプログラム単位を1つ読み込
む。3415では、読み込まれた手続きの削減属性730がNUL
Lかを判定し、これが真ならば、3420に制御を移して、
読み込まれたプログラム単位をそのままCALL回数削減後
ソースプログラム20へ出力する。3425では、読み込まれ
た手続きの削減属性730がCALLERかを判定し、これが真
なら3430に制御を移し、偽なら3445に制御を移す。3430
〜3440は、手続き呼び出し元の側に対する処理であり、
3445〜3460は、手続き呼び出し先の側に対する処理であ
る。 3430では、CALL点情報500が残つていることによりCAL
L回数削減対象が示されている各CALL文の前と後で、該C
ALL点を囲む最内側ループを分割する。この方法は公知
であるので詳細は述べない。第2図のFORTRANプログラ
ムの手続きWWQのISN6とISN8がCALL回数削減対象のCALL
点として選択されたことによりループ分割された後のソ
ースプログラムを第16図に示す。この例のように、ルー
プ分割に伴なつて、新しい配列(TMP#1)の導入1610
〜1619、新しく導入された該配列(TMP#1)から既存
の配列・変数(TMP)への値の複写1620などが行なわれ
る。 3435では、ループ分割によつて出来たループのうち、
ループ分割を引き起したCALLのみを含むループを、該CA
LL文の呼び出し先手続きのコピーを呼び出す1つのCALL
文で置き換える。これに際して、該コピーの手続き名
は、該コピーの複写元の手続き名とCALL点グループ番号
516より生成する。生成された名前は、既存の手続きの
名前と異なるものでなければならず、又、該コピーの他
の呼び出し点でも同じ名前を用いるようにしなければな
らない。このような名前の生成法は公知であるので詳細
は述べない。 また、実引数は、その添字式に表われる最内側ループ
の制御変数を該制御変数の初期値で置きかえる。 3440では、3430〜3435で書き換えられたプログラム単
位をCALL点削減後ソースプログラムへ出力する。 3445では、読み込んだプログラム単位をそのままCALL
回数削減後ソースプログラム20に出力する。3450では、
読み込んだ手続きのCALL点グループのうち未処理のもの
があるかを判定し、これが真のときは3455に制御を移
し、偽のときは3405に制御を移して次のプログラム単位
の処理に移る。3455では、該CALL点グループに対する呼
び出し先側手続きを作成する。3460では、3450〜3455で
作られた呼び出し先側手続きをCALL点削減後ソースプロ
グラム20に出力する。 3455の動作については、第17図を用いて、より詳しく
説明する。34522では、読み込んだときのままのプログ
ラム単位を複写して、以下での変換の対象とする。3455
4では、呼び出し元の実引数の寸法宣言に合わせて、仮
引数の寸法宣言を変更して次元を拡張する。 34556では、該コピーの実行文全体をDOループでかこ
む。該ループの制御変数は、初期値1,増分1で終値は、
該CALL点グループ内のCALL点と囲む最内側ループのルー
プ長517とする。これに際して、プログラム中のRETURN
文は、新しく追加した該DOループの末端となるCONTINUE
文へのCOTO文で置き換える。 34558では、34554で次元拡張された仮引数の添字を書
き換える。この書き換えでは、まず、次元拡張されて新
しく追加された次元の添字を0とおいた後、各次元の添
字に次の値を加える。 i*n ただし、iは、新しく追加されたDOループの制御変
数。nは、該CALL点グループ内のCALL点の処理対象の該
仮引数に対応した実引数の、最内側ループによる添字変
化529の、対応する次元の添字の増分である。 34559では、該コピーの手続き名を変更する。新しい
手続き名は、3435で説明したのと同じ方法で生成する。 以上で、第17図の説明を終り、第15図のソース変換部
3400の動作の説明を終える。 第2図のFORTRANプログラムに対してソース変換3400
を終えた後の、CALL回数削減後ソースプログラム20を第
3図に示す。 第2図の手続きWWQのISN5〜ISN10のループ内にあるCA
LL文(ISN6とISN7の文)は、第3図ではループくり返し
の外にあるCALL文(ISN5とISN8の文)で置き換えられて
おり、CALL回数が200回から2回に減少している。 次に、第18図〜第19図を用いて、オブジエクトプログ
ラム生成部400で行なわれるベクトル化・並列化がどの
ように促進されるかを説明する。 第18図は、CALL回数削減後ソースプログラム20の手続
きWWQとOPROD#1をベクトル化したものを、ソースプロ
グラムの形式で表わしたものである。 手続きWWQのISN6と8の文と手続きOPROD#1のISN4〜
ISN7の文がベクトル化された処理を表わしている。添字
に*が使われている配列は、該添字の値が該次元の寸法
の下限から上限までの全ての値をとつたときの、該配列
の部分配列を表わしており、代入および演算は部分配列
の各要素ごとに行なわれる。またVSUMは、部分配列の全
要素の和を計算するベクトル演算である。 これに対して、元のソースプログラム10である第2図
では、ベクトル化の対象となる得るのは手続きWWQのISN
5〜ISN10のDOループのみであり、該DOループは手続き呼
び出しを含むためベクトル化されない。 第18図の手続きWWQのISN6と8の文と手続きOPROD#1
のISN4〜ISN7の文は、第2図の手続きWWQのISN7と9の
文と手続きOPRODのISN4〜ISN7の文に対応しており、第
2図の該対応する部分はそれぞれ100回および200回実行
されるので、ベクトル化による高速化の効果は大きい。 このようにして、CALL回数削減部300の動作により、
ベクトル化が促進され、スーパーコンピユータの適用に
よるプログラムの高速化が図れる。 第19図は、CALL回数削減後ソースプログラム20の手続
きCPROD#1をマルチプロセツサ向けに並列化したもの
をソースプログラムの形式で表わしたものである。 ISN6〜ISN13の文が並列化された処理を表わしてお
り、これらの文の中でISN7〜ISN12の部分がNP個のプロ
セツサで並列に実行されることを表わしている。ISN2
は、NPとして8を選んだことを示し、ISN5はIが各プロ
セツサに局所的な変数であることを示している。 ISN6〜ISN13の文は、第2図の手続きOPRODのISN4〜IS
N7の文に対応しており、第2図の該対応する部分は200
回実行される。これに対して、第19図のISN6〜ISN12の
部分は、ISN7〜ISN12の部分がNP個のプロセツサで200/N
P回実行される。このとき、総実行回数は200/NP*NP=N
P回で、元のソースプログラムと同じだが、それぞれの
プロセツサの処理は1/NP倍となり、各プロセツサは並列
に実行されるので、経過時間は1/NPで済む。 このように、CALL回数削減部300の動作により、並列
化が促進され、マルチプロセツサの適用によるプログラ
ムの高速化が図れる。 本実施例によれば、特に次の効果がある。 (1)手続き間データフロー解析において、各手続きの
処理が1回で済むので、解析負荷を減すことができる。 (2)CALL回数削限対象を最内側ループ内に限定してい
るので、呼び出し先手続きのコピーの生成によるメモリ
量の増加を抑止しながら、CALL回数を大巾に減すことが
できる。 (3)呼び出し先手続きのコピーの共用化を図つている
ので、メモリ量の増加を抑止することができる。 (4)呼び出し先手続きのコピー内のCALL回数削除のた
めに、更に該コピーよりの呼び出し手続きのコピーが作
られることがないので、手続きのコピーの数が指数関数
的に増えるのを防止する。 (5)CALL回数削減点の決定でCALL回数情報を用いてい
るので、CALL回数削減効果の高いCALL点から優先的にCA
LL回数削減が行なわれる。 〔発明の効果〕 本発明によれば、手続き呼び出しを含むプログラムに
おいて、手続き呼び出しで使われる配列が他の手続き呼
び出し又は文で使われている場合に、正確なデータ依存
関係が解析できるので、該手続き呼び出し部分の最適化
を促進することができる。例えば、問題点の項で述べた
ように、第20図のプログラムでは、並列化が新たに可能
になることにより、実行速度が最大100倍になる。ま
た、作用の項で述べたように、第21図の依存グラフで示
されるプログラムでは、並列化の範囲が広がることによ
り、実行速度が最大2倍になる。また、実施例の項で述
べたように、第2図のプログラムでは、CALL回数削減が
可能になり、手続き呼び出しの回数が1/100になる。 CALL回数削減自体は、ループ内に手続き呼び出しがあ
る場合、該手続き呼び出しの実行回数が「1/ループのく
り返し回数」になるので、手続き呼び出しを含むプログ
ラムの実行時間を大巾に短縮する。また、本来DOループ
を含まない手続きにDOループが追加されるので、ベクト
ル化・並列化の対象が増加し、スーパーコンピユータ・
マルチプロセツサの適用によるプログラムの高速化を図
れる。
【図面の簡単な説明】
第1図は本発明の一実施例の構成図、第2図は入力例の
FORTRANソースプログラム、第3図は第2図のプログラ
ムのCALL回数削減後ソースプログラム、第4図はCALL点
解析部のフローチヤート、第5図はCALL点情報の構造
図、第6図は参照領域情報の構造図、第7図はCALL回数
削減部の概略フロー図、第8図はCALL回数削減不能なCA
LL点情報削除のフローチヤート、第9図は依存グラフお
よび強連結成分の説明図、第10図はCALL点のグループ化
のフローチヤート、第11図はCALL回数情報の構造図、第
12図は選択表の構造図、第13図は手続き名情報の構造
図、第14図はCALL回数削減の決定のフローチヤート、第
15図はソース変換のフローチヤート、第16図はループ分
割後のソースプログラム、第17図はCALEE手続き作成の
フローチヤート、第18図はベクトル化促進後のソースプ
ログラム、第19図は並列化促進後のソースプログラム、
第20図は従来技術の問題点を説明するための例題プログ
ラム、第21図は従来技術の問題点を説明するための依存
グラフ、第22図は手続き間データフロー解析部のフロー
チヤート、第23図は手続き内最適化のフローチヤート、
第24図は手続き呼び出し点での参照領域情報の例、第25
図は手続き内最適化における参照領域情報の扱い方を説
明するための図、第26図は定義領域解析のフローチヤー
ト、第27図は使用領域解析のフローチヤート、第28図は
定義領域解析の動作を説明するための例題プログラムで
あり、フローグラフで表現してある、第29図は使用領域
解析の動作を説明するための例題プログラムであり、フ
ローグラフで表現してある。 10……ソースプログラム、15……CALL回数情報、20……
CALL回数削減後ソースプログラム、30……オブジエクト
プログラム、40……コンパイラ、100……CALL点解析
部、200……手続き間データフロー解析部、300……CALL
回数削減部、400……オブジエクトプログラム生成部、5
00……CALL点情報、600……参照領域情報、700……手続
き名表、3100……CALL回数削減不能なCALL点のCALL点情
報削除部、3200……CALL点のグルー化部、3300……CALL
回数削減点の決定部、3400……ソース変換部、1200……
選択表、3455……CALEE手続き作成ステツプ、230……手
続き内最適化、240……変更領域解析、250……定義領域
解析、260……使用領域解析、2000……手続き呼び出し
点での参照領域情報、2500……定義領域解析のための処
理手続き、2600……使用領域解析のための処理手続き。
FORTRANソースプログラム、第3図は第2図のプログラ
ムのCALL回数削減後ソースプログラム、第4図はCALL点
解析部のフローチヤート、第5図はCALL点情報の構造
図、第6図は参照領域情報の構造図、第7図はCALL回数
削減部の概略フロー図、第8図はCALL回数削減不能なCA
LL点情報削除のフローチヤート、第9図は依存グラフお
よび強連結成分の説明図、第10図はCALL点のグループ化
のフローチヤート、第11図はCALL回数情報の構造図、第
12図は選択表の構造図、第13図は手続き名情報の構造
図、第14図はCALL回数削減の決定のフローチヤート、第
15図はソース変換のフローチヤート、第16図はループ分
割後のソースプログラム、第17図はCALEE手続き作成の
フローチヤート、第18図はベクトル化促進後のソースプ
ログラム、第19図は並列化促進後のソースプログラム、
第20図は従来技術の問題点を説明するための例題プログ
ラム、第21図は従来技術の問題点を説明するための依存
グラフ、第22図は手続き間データフロー解析部のフロー
チヤート、第23図は手続き内最適化のフローチヤート、
第24図は手続き呼び出し点での参照領域情報の例、第25
図は手続き内最適化における参照領域情報の扱い方を説
明するための図、第26図は定義領域解析のフローチヤー
ト、第27図は使用領域解析のフローチヤート、第28図は
定義領域解析の動作を説明するための例題プログラムで
あり、フローグラフで表現してある、第29図は使用領域
解析の動作を説明するための例題プログラムであり、フ
ローグラフで表現してある。 10……ソースプログラム、15……CALL回数情報、20……
CALL回数削減後ソースプログラム、30……オブジエクト
プログラム、40……コンパイラ、100……CALL点解析
部、200……手続き間データフロー解析部、300……CALL
回数削減部、400……オブジエクトプログラム生成部、5
00……CALL点情報、600……参照領域情報、700……手続
き名表、3100……CALL回数削減不能なCALL点のCALL点情
報削除部、3200……CALL点のグルー化部、3300……CALL
回数削減点の決定部、3400……ソース変換部、1200……
選択表、3455……CALEE手続き作成ステツプ、230……手
続き内最適化、240……変更領域解析、250……定義領域
解析、260……使用領域解析、2000……手続き呼び出し
点での参照領域情報、2500……定義領域解析のための処
理手続き、2600……使用領域解析のための処理手続き。
フロントページの続き
(56)参考文献 「ACM SIGPLAN Noti
ce」vol.20,No.7(1985)
p.107−116
「ACM SIGPLAN Noti
ce」vol.21,No.7(1986)
p.162−175
Aho,Ullman,Sethi
「Compilers Princip
les,Techpiques and
Tools」Addison−Wes
ley(1986)P.648−660
Claims (1)
- (57)【特許請求の範囲】 1.ソースプログラムを入力してオブジェクトプログラ
ムを生成するコンパイラのオブジェクト生成方法におい
て、 手続き呼び出しを含む繰り返しループ毎に、サブルーチ
ン、関数、初期値設定副プログラムなどの手続き間にま
たがって変数及び配列のデータフロー解析を行い、 各ループ毎に、前記ループに含まれる最後の文から先頭
の文に向かって順次それぞれの文について、当該文及び
それ以降の文の実行によって値が変更される可能性のあ
る変数及び配列部分領域の第1の集合と、当該文及びそ
れ以降の文によって値が必ず変更される変数及び配列部
分領域の第2の集合と、当該文及びそれ以降の文によっ
て値が変更されるよりも前に呼び出し時の値が使用され
る可能性のある変数及び配列部分領域の第3の集合と
を、既に求まった当該文以降の文に対する前記第1、第
2、及び第3の集合を用いてを求め、 前記第1の集合に属するが前記第3の集合に属さない変
数又は配列部分領域を、各ループ毎にそれぞれ別のメモ
リ領域に割り当てるための情報を生成し、 前記情報に基づいて、前記ループを並列に実行するコー
ドを含むオブジェクトを生成することを特徴とするオブ
ジェクト生成方法。
Priority Applications (3)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP62279214A JP2749039B2 (ja) | 1987-11-06 | 1987-11-06 | オブジェクト生成方法 |
US07/266,479 US5146594A (en) | 1987-11-06 | 1988-11-02 | Method of producing object program based on interprocedural dataflow analysis of a source program |
US07/938,758 US5396627A (en) | 1987-11-06 | 1992-09-01 | Method of producing object program based on interprocedural dataflow analysis of a source program |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP62279214A JP2749039B2 (ja) | 1987-11-06 | 1987-11-06 | オブジェクト生成方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
JPH01121938A JPH01121938A (ja) | 1989-05-15 |
JP2749039B2 true JP2749039B2 (ja) | 1998-05-13 |
Family
ID=17608019
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
JP62279214A Expired - Lifetime JP2749039B2 (ja) | 1987-11-06 | 1987-11-06 | オブジェクト生成方法 |
Country Status (2)
Country | Link |
---|---|
US (1) | US5146594A (ja) |
JP (1) | JP2749039B2 (ja) |
Families Citing this family (36)
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 |
JPH03150636A (ja) * | 1989-11-08 | 1991-06-27 | Matsushita Electric Ind Co Ltd | コンパイル方法 |
CA2010056C (en) * | 1990-02-14 | 1998-05-12 | Charles Brian Hall | Method for improving the efficiency of arithmetic code generation in an optimizing compiler using machine independent update instruction generation |
US5412799A (en) * | 1990-02-27 | 1995-05-02 | Massachusetts Institute Of Technology | Efficient data processor instrumentation for systematic program debugging and development |
EP0463732A3 (en) * | 1990-06-28 | 1992-10-14 | International Business Machines Corporation | Method and system for animating the execution of a computer program |
JP3062266B2 (ja) * | 1991-03-20 | 2000-07-10 | 富士通株式会社 | 支援装置 |
JP3049814B2 (ja) * | 1991-04-09 | 2000-06-05 | 日本電気株式会社 | マイクロコンピュータの言語処理装置 |
JPH04343140A (ja) * | 1991-05-21 | 1992-11-30 | Hitachi Ltd | コンパイラの最適化処理方法 |
US5278986A (en) * | 1991-12-13 | 1994-01-11 | Thinking Machines Corporation | System and method for compiling a source code supporting data parallel variables |
US5410701A (en) * | 1992-01-29 | 1995-04-25 | Devonrue Ltd. | System and method for analyzing programmed equations |
JPH05257709A (ja) * | 1992-03-16 | 1993-10-08 | Hitachi Ltd | 並列化判別方法およびそれを用いた並列化支援方法 |
US5448737A (en) * | 1992-03-17 | 1995-09-05 | International Business Machines Corporation | System and method for optimizing computer code using a compact data flow representation |
US6044407A (en) * | 1992-11-13 | 2000-03-28 | British Telecommunications Public Limited Company | Interface for translating an information message from one protocol to another |
US5555412A (en) * | 1992-12-09 | 1996-09-10 | International Business Machines Corporation | Complier and method for alias checking in a complier |
JP3280449B2 (ja) * | 1993-03-01 | 2002-05-13 | 富士通株式会社 | コンパイル装置 |
US5548761A (en) * | 1993-03-09 | 1996-08-20 | International Business Machines Corporation | Compiler for target machine independent optimization of data movement, ownership transfer and device control |
CA2159001A1 (en) * | 1993-03-26 | 1994-10-13 | David Alan Spurgeon Brown | Generic managed object model for lan domain |
WO1994025917A1 (en) * | 1993-04-26 | 1994-11-10 | Comdisco Systems, Inc. | Method for scheduling synchronous data flow graphs |
CA2123924A1 (en) * | 1993-06-02 | 1994-12-03 | Charles Douglas Blewett | Specifying contexts in callback style programming |
JPH07110800A (ja) * | 1993-10-13 | 1995-04-25 | Matsushita Electric Ind Co Ltd | 最適化並列コンパイル装置及び最適化並列コンパイル方法 |
US5805894A (en) * | 1995-02-13 | 1998-09-08 | Kuck & Associates, Inc. | Method inside an optimizing compiler for analyzing assertions and redirecting control flow in programs |
GB2299422B (en) * | 1995-03-30 | 2000-01-12 | Sony Uk Ltd | Object code allocation in multiple processor systems |
JPH09198254A (ja) * | 1996-01-17 | 1997-07-31 | Nec Ic Microcomput Syst Ltd | コンパイラの最適化装置及びその方法 |
US6041181A (en) * | 1997-07-23 | 2000-03-21 | International Business Machines Corporation | Method of, system for, and computer program product for providing quick fusion in WHERE constructs |
US6341368B1 (en) * | 1997-08-22 | 2002-01-22 | Cirrus Logic, Inc. | Method and systems for creating multi-instanced software with a preprocessor |
US6077313A (en) * | 1997-10-22 | 2000-06-20 | Microsoft Corporation | Type partitioned dataflow analyses |
JP3539613B2 (ja) * | 1997-12-03 | 2004-07-07 | 株式会社日立製作所 | ループ飛び出し文を含むループに対する配列サマリ解析方法 |
US6922830B1 (en) * | 2000-03-10 | 2005-07-26 | International Business Machines Corporation | Skip list data storage during compilation |
JP3933380B2 (ja) * | 2000-10-05 | 2007-06-20 | 富士通株式会社 | コンパイラ |
US7353521B1 (en) | 2002-10-19 | 2008-04-01 | Borland Software Corporation | Object oriented distributed software system with methodology for piggybacked reflective callbacks |
US7624387B2 (en) * | 2003-04-10 | 2009-11-24 | Panasonic Corporation | Compiler, program product, compilation device, communication terminal device, and compilation method |
JP4559937B2 (ja) * | 2005-09-01 | 2010-10-13 | 株式会社東芝 | プログラム生成装置 |
JP4957729B2 (ja) * | 2007-01-25 | 2012-06-20 | 日本電気株式会社 | プログラム並列化方法、プログラム並列化装置及びプログラム |
JP4952317B2 (ja) * | 2007-03-16 | 2012-06-13 | 富士通株式会社 | 退避データ判別方法、退避データ判別プログラムおよび退避データ判別装置 |
US8799880B2 (en) * | 2011-04-08 | 2014-08-05 | Siemens Aktiengesellschaft | Parallelization of PLC programs for operation in multi-processor environments |
US11656797B2 (en) * | 2021-07-28 | 2023-05-23 | Western Digital Technologies, Inc. | Data storage device executing runt write commands as free commands |
Family Cites Families (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US4710872A (en) * | 1985-08-07 | 1987-12-01 | International Business Machines Corporation | Method for vectorizing and executing on an SIMD machine outer loops in the presence of recurrent inner loops |
US4847755A (en) * | 1985-10-31 | 1989-07-11 | Mcc Development, Ltd. | Parallel processing method and apparatus for increasing processing throughout by parallel processing low level instructions having natural concurrencies |
JPS62159274A (ja) * | 1986-01-08 | 1987-07-15 | Hitachi Ltd | 条件分岐の分割・複写によるベクトル化方式 |
JPH0685148B2 (ja) * | 1986-03-07 | 1994-10-26 | 株式会社日立製作所 | 配列デ−タフロ−解析装置 |
JPH0814817B2 (ja) * | 1986-10-09 | 1996-02-14 | 株式会社日立製作所 | 自動ベクトル化方法 |
-
1987
- 1987-11-06 JP JP62279214A patent/JP2749039B2/ja not_active Expired - Lifetime
-
1988
- 1988-11-02 US US07/266,479 patent/US5146594A/en not_active Expired - Lifetime
Non-Patent Citations (3)
Title |
---|
「ACM SIGPLAN Notice」vol.20,No.7(1985)p.107−116 |
「ACM SIGPLAN Notice」vol.21,No.7(1986)p.162−175 |
Aho,Ullman,Sethi「Compilers Principles,Techpiques and Tools」Addison−Wesley(1986)P.648−660 |
Also Published As
Publication number | Publication date |
---|---|
US5146594A (en) | 1992-09-08 |
JPH01121938A (ja) | 1989-05-15 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
JP2749039B2 (ja) | オブジェクト生成方法 | |
Zima et al. | SUPERB: A tool for semi-automatic MIMD/SIMD parallelization | |
Click | Global code motion/global value numbering | |
US5396627A (en) | Method of producing object program based on interprocedural dataflow analysis of a source program | |
Gross et al. | Structured dataflow analysis for arrays and its use in an optimizing compiler | |
Duesterwald et al. | A practical data flow framework for array reference analysis and its use in optimizations | |
EP0735468B1 (en) | Method and apparatus for an optimizing compiler | |
JP3311462B2 (ja) | コンパイル処理装置 | |
KR100188499B1 (ko) | 인터프로시쥬어 데이타 흐름 분석 방법 | |
JPH0814817B2 (ja) | 自動ベクトル化方法 | |
US20140053129A1 (en) | Parallelization of Dataflow Actors with Local State | |
US5790859A (en) | Method of, system for, and computer program product for efficient identification of private variables in program loops by an optimizing compiler | |
US6117185A (en) | Skip list data storage during compilation | |
US7089545B2 (en) | Detection of reduction variables in an assignment statement | |
JP4346316B2 (ja) | 複数の意味レベルによるアスペクト指向プログラミングのための方法 | |
Reddy et al. | Reduction drawing: Language constructs and polyhedral compilation for reductions on gpu | |
Eigenmann et al. | Restructuring fortran programs for cedar | |
Chow et al. | The design of a data flow analyzer | |
Moon et al. | Predicated array data-flow analysis for run-time parallelization | |
RU2411569C2 (ru) | Способ автоматического распараллеливания программ | |
Sathyanathan et al. | Incremental whole program optimization and compilation | |
Kremer et al. | Advanced tools and techniques for automatic parallelization | |
Tayeb et al. | Autovesk: Automatic vectorized code generation from unstructured static kernels using graph transformations | |
JP3405696B2 (ja) | コンパイル装置およびその方法 | |
Sassa et al. | Static single assignment form in the COINS compiler infrastructure |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
EXPY | Cancellation because of completion of term | ||
FPAY | Renewal fee payment (event date is renewal date of database) |
Free format text: PAYMENT UNTIL: 20080220 Year of fee payment: 10 |