JPH09106351A - 変数リネーム方法 - Google Patents

変数リネーム方法

Info

Publication number
JPH09106351A
JPH09106351A JP7263845A JP26384595A JPH09106351A JP H09106351 A JPH09106351 A JP H09106351A JP 7263845 A JP7263845 A JP 7263845A JP 26384595 A JP26384595 A JP 26384595A JP H09106351 A JPH09106351 A JP H09106351A
Authority
JP
Japan
Prior art keywords
variable
instruction
renaming
dependency
edge
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
JP7263845A
Other languages
English (en)
Inventor
Satoru Nishimoto
哲 西本
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 JP7263845A priority Critical patent/JPH09106351A/ja
Publication of JPH09106351A publication Critical patent/JPH09106351A/ja
Pending legal-status Critical Current

Links

Landscapes

  • Devices For Executing Special Programs (AREA)

Abstract

(57)【要約】 【課題】 命令スケジュールに有効な変数のみをリネー
ムし、かつ到達する定義が複数存在する場合も、効率良
く変数をリネームする。 【解決手段】 プログラムに対して、スーパーブロック
を生成し、実行頻度の高いスーパーブロックから順に、
依存グラフを作り、不要依存エッジを消去し、命令スケ
ジュールを行ない、順序が逆転した命令に対してのみ、
変数のリネームを行なう。さらに、到達する定義点が複
数ある場合に生じるコピー命令は、現在処理しているス
ーパーブロックよりも実行頻度の低いスーパーブロック
に出す。

Description

【発明の詳細な説明】
【0001】
【発明の属する技術分野】本発明は最適化コンパイラに
おける変数のリネーム方法に関し、特に並列/パイプラ
イン式のコンピュータと共に使用する場合に適した方法
で、命令スケジュール後に必要な場合に限り、変数をリ
ネームすることで、不要な変数のリネームによる、コン
パイル時の無駄なメモリ使用を削減ことを可能にし、か
つ定義点が複数存在する場合も、コピー命令を実行頻度
の低い実行パス上に出すことにより、効率の良い変数の
リネームを可能にする、変数のリネーム方法に関するも
のである。
【0002】
【従来の技術】近年、複数の命令を同時実行可能なスー
パースカラ方式のプロセッサが主流になり、このような
計算機上で、高速にプログラムを実行するために、プロ
グラム中から、より多くの並列実行可能な命令を抽出す
ることが、最適化コンパイラに対して求められている。
【0003】最適化コンパイラにおける命令スケジュー
ラは、プログラム中からできるだけ多くの並列実行可能
な命令を抽出することを試みる。しかし並列実行可能な
命令の数は、プログラマによる変数の再定義や、コンパ
イラが、コンパイル中に生成する一時変数や、レジスタ
を再利用することにより生じる、人工的な逆依存や出力
依存によって制限される。
【0004】この人工的な依存による並列性減少の問題
を解決するために、従来から変数のリネーム処理が行な
われている。変数のリネーム後、リネームによって不要
な依存を削除したプログラムに対して、命令スケジュー
ラが命令の再配置を行ない、プロセッサの並列度にみあ
ったオブジェクトコードを生成する。
【0005】変数のリネームは、例えば次に示す処理で
ある。例として次の命令列を考える。命令S1で、変数X
を定義し、S1の後続命令S2において、S1で定義した変数
Xを使用している。またS2の後続命令S3で、再び変数Xを
定義している。この場合、S2はS1にフロー依存、S3はS2
に逆依存、S3はS1に出力依存している。
【0006】S1からS2へのフロー依存は真の依存とも呼
ばれ、プログラム実行上必ず守られなければならない命
令間の順序関係を表している。一方S1、S3間の出力依
存、及びS1、S2間の逆依存は、人工的な依存であり、変
数のリネームにより削除できる依存である。
【0007】リネーム処理ではまず、逆依存および出力
依存している、S3で定義される変数Xの名前を新たな名
前Yに変更する。次にS3の後続命令のうち、S3で定義さ
れるXの値を使用する命令S4があれば、S4内の変数XをY
に変更する。上記リネームにより、文S1、S2、S3の間
で、守らなければならない順序関係はS1、S2だけとな
り、S1、S3間、及びS2、S3間の順序はスケジューラが任
意に決定することが可能となる。
【0008】リネーム後に行なうスケジュール処理は、
従来から基本ブロックを単位として行なわれている。し
かし基本ブロックを単位としたスケジューリングでは、
抽出できる並列性に限界がある。そのためより多くの並
列性を抽出するために、近年、スーパーブロックスケジ
ューリングと呼ばれる、基本ブロックを越えた命令スケ
ジューリング方式が開発されている。スーパーブロック
スケジューリングについては「Wen-mei W.Hwu, Scott
A.Mahlke, William T.Chen, Pohua P.Chang, Nancy J.W
arter, Roger A.Bringmann, Roland G.Ouellette,Richa
rd E.Hank, Tokuzo Kiyohara, Grant E.Haab, John G.H
olm, Daniel,M.Lavery. The Superblock:An Effective
Technique for VLIW and Superscalar Compilation. Jo
urnal ofSupercomputing 1993」において詳しく論じら
れている。
【0009】これによると、スーパーブロックとは、''
制御の出口は複数あるが、制御の入口は一箇所である''
という性質を持つ基本ブロックの列である。スーパーブ
ロックは、分岐確率に基づいて行なわれる。図4は、ス
ーパーブロックの例である。図4におけるスーパーブロ
ック408は、基本ブロック401と402から構成さ
れる。スーパーブロック408への制御の入口は、先頭
の基本ブロック401の一箇所のみであり、出口は、基
本ブロック401と402の2箇所ある。
【0010】スーパーブロックスケジューリングとは、
従来から行なわれている基本ブロック内のスケジューリ
ングを、複数の基本ブロックから構成される、スーパー
ブロックに対して行なうスケジュール方法である。
【0011】
【発明が解決しようとする課題】従来のリネームには2
つの問題点がある。第1に、スケジュールに有効でない
変数のリネームも行なうという点が挙げられる。ここで
スケジュールに有効であるとは、変数のリネームによっ
て順序制約が解消された命令が、実際にスケジューラに
よって、並列実行されるように再配置される場合をい
う。従来のリネーム処理は、スケジュール処理の前に行
われており、リネーム処理の時点では、どの変数のリネ
ームが実際のスケジュールに有効かが分からない。この
ため従来のリネーム処理では、リネーム可能な全ての変
数のネームを行なう。これはコンパイル時に不要なメモ
リを使用することにつながる。
【0012】従来のリネームの第2の問題点として、到
達する定義が複数ある場合、変数のリネームを行なわな
いという点が挙げられる。例えば、従来の技術での例を
用いると、S4でのXの使用に到達する定義が、S3におけ
るXの定義だけならば、S3及びS4の変数Xを新たな変数Y
に変更することで、リネーム処理は終了する。
【0013】しかし、命令S5におけるXの定義もS4に到
達する場合、S3、S4におけるXのリネームに加え、S5か
らS4への実行パス上にS5で定義されるXの値を、リネー
ムによって新たに生成した変数Yにコピーする、コピー
命令を挿入する必要がある。このように使用に到達する
定義が複数ある場合もリネームを行なおうとすると、そ
のリネームがスケジュールに有効であるかどうかに関わ
らず、元のプログラムにないコピー命令を追加しなけれ
ばならない。したがって、実行命令数の増加という点か
ら、従来の変数のリネーム処理では、使用に到達する定
義が複数ある場合のリネームは行なわれていない。
【0014】本発明の目的は、これらの課題を解決し、
(1)スケジュールに必要な場合だけ、変数のリネームを
行ない、かつ(2)変数の使用点に到達する定義点が複数
ある場合も、効率良く変数のリネームを行なう、ことを
可能にする変数リネーム方法を提供することである。
【0015】
【課題を解決するための手段】上記の目的は、従来、命
令スケジュール処理の前で行なわれていたリネーム処理
を、スーパーブロックの実行頻度を考慮して、スケジュ
ール処理の後で行なうこと、具体的にはプログラム中か
らスケジュール単位としてスーパーブロックを生成し、
実行頻度の高いスーパーブロックから順に、以下の処理
を施すことで達成される。
【0016】(1)現在のスーパーブロックに対する依存
グラフを生成する。依存グラフのノードは、スーパーブ
ロックを構成する命令であり、ノード間のエッジは命令
間の依存を表す。
【0017】(2)生成された依存グラフから、逆依存、
出力依存エッジの消去可能性を検査し、消去可能なエッ
ジを消去する。また消去されたエッジが張られていた命
令対を、スケジュール後に順序が逆転可能な命令対とし
て登録する。ここで、依存エッジの消去条件としては、 a)リネーム対象の変数の使用点に到達する定義がただ一
つである、または b)リネーム対象の変数の使用点に到達する定義が複数あ
り、かつ、本使用点に到達する全て定義が現在処理して
いるスーパーブロック内にあるか、または、現在処理し
ているスーパーブロックより実行頻度の低いスーパーブ
ロック内にある、の2つを考慮する。
【0018】(3)不要な依存エッジが切られた依存グラ
フに対して、命令のスケジュールを行なう。
【0019】(4)スケジュール済み命令列内で、(2)で登
録した命令対の順序が、スケジュール前の順序と逆転し
ていれば、逆転した命令に対して、変数のリネーム処理
を行なう。この時、リネーム対象の変数の使用点に到達
する定義点が複数あるならば、コピー命令を生成し、現
在スケジュール中のスーパーブロック外、すなわち現在
スケジュールしているスーパーブロックよりも実行頻度
の低いスーパーブロックに、このコピー命令を挿入す
る。
【0020】新たに生成されたコピー命令は、後に実施
される、より実行頻度の低いスーパーブロックのスケジ
ュールにおいて、スーパーブロック内の他の命令と共に
スケジュールされる。
【0021】実行頻度の高いスーパーブロックから順
に、(1)〜(4)の処理を行なうことで、現在処理中のスー
パーブロックの実行頻度は、未処理スーパーブロックの
実行頻度よりも高いことが保証される。これによりリネ
ーム時に生じる可能性のあるコピー命令を、より実行頻
度の低いパスに挿入することが可能になる。また、より
実行頻度の高い実行パスを優先した最適化が可能にな
る。
【0022】スーパーブロックに対する依存グラフの生
成処理(1)により、命令スケジュールに必要な情報を、
複数の基本ブロックに跨って得ることが可能になる。逆
依存、出力依存エッジの消去処理(2)により、エッジが
切られた命令を、スケジューラが自由に移動することが
可能となり、より効果的なスケジュールが可能になる。
またエッジの消去時に実施する依存エッジ消去可能性検
査により、処理(4)で生じる可能性のあるコピー命令
を、現在の処理中のスーパーブロックよりも、実行頻度
の低いスーパーブロックに挿入できることが保証され
る。
【0023】命令スケジュール(3)により、基本ブロッ
クを越えた、大域的な命令スケジュールが可能になる。
スケジュール後のリネーム処理(4)により、スケジュー
ル後に順序が逆転した命令、すなわちリネームが必要に
なった変数に対してのみ、リネーム処理を行なうことが
可能になる。またこの処理では、リネーム時にコピー命
令の挿入が必要な場合、このコピー命令をより実行頻度
の低いパスに挿入する。新たに出されたコピー命令は、
本来ある命令と依存しないので、挿入されたスーパーブ
ロックを後にスケジュールすることにより、コピー命令
による影響を最小限に押えたオブジェクトコードを生成
でき、プログラムの高速な実行が可能になる。
【0024】
【発明の実施の形態】以下、本発明の1実施例を図面を
用いて説明する。
【0025】図1は、本発明の適用対象である計算機シ
ステムを表す概略構成図である。本発明である変数リネ
ーム方法は、最適化コンパイラに実装され、ディスク装
置103もしくは主記憶102に格納され、CPU101
で実行される。
【0026】図2は、本発明が実装される最適化コンパ
イラの構成を示している。プログラム202は、最適化
コンパイラ201へ入力され、例えば図1で示される計
算機で実行されるオブジェクトコード206に変換され
る。最適化コンパイラ201は、入力されたプログラム
202に対して、構文解析203などの前処理を行な
い、中間語204を生成する。その後、中間語204に
対して、最適化処理205を行ない、オブジェクトコー
ド206を生成する。
【0027】図3は、最適化処理部205内のリネーム
処理部、およびスケジュール処理部の構成を示したもの
である。リネームおよびスケジュール処理301は、ス
ケジュール単位に対して呼び出される。以下では、スケ
ジュール単位としてスーパブロックを考える。ここで、
301は、スーパーブロックの実行頻度の高い順に呼び
出される。依存グラフ生成部302では、与えられたス
ーパーブロック306に対する、依存グラフ307を生
成する。不要依存エッジ消去部303では、依存グラフ
307を入力として、307から不要な依存エッジを消
去した、依存グラフ307を生成する。ここで消去候補
となる依存エッジは、逆依存、出力依存、および制御依
存エッジである。スケジュール部304では、依存グラ
フ307を入力として、スケジュールを行ない、スケジ
ュールされた命令列である、命令スケジュール308を
生成する。最後のリネーム部305では、命令スケジュ
ール308から、リネームが必要な変数を検出し、それ
らをリネームし、最終的な命令スケジュール308を生
成する。また、ここでは、定義点が複数ある場合は、補
償コードとしてコピー命令を生成する。
【0028】図4は、301への入力となるスーパーブ
ロック306を示したものである。例えばスーパーブロ
ック408は、基本ブロック401及び402から構成
され、スーパーブロック408への制御の入口は、基本
ブロック401の先頭ただ1つで、出口は基本ブロック
401の末尾及び基本ブロック402の末尾の2箇所で
ある。図4では408、409、410、411、41
2がスーパーブロックである。これらのスーパーブロッ
クが実行頻度が高い順に301に入力される。
【0029】以下では、本発明における特徴的な処理で
ある、不要依存エッジ消去部303および、リネーム処
理305について説明する。
【0030】図5は、図3における不要依存エッジ消去
部303の動作を、PAD図を用いて表したものである。
不要依存エッジ消去部への入力は、図1における、スー
パーブロック306に対する依存グラフ307である。
まず501では、依存グラフ中の全てのノードを辿り、
各ノードをparentとして502以下の処理を行なう。5
02では、parentの全ての子供ノードを辿り、各子供ノ
ードをchildとして、503以下の処理を行なう。ここ
で依存グラフ内のノードchildが、ノードparentの子供
であるとは、parentからchildへの何らかの依存があ
り、ノード間に依存エッジが張られていることを表す。
以降の処理は、このノード対(parent,child)に対して行
なう。
【0031】503から510では、(parent,child)間
に制御依存エッジの消去可能性を検査する。511から
516では、(parent,child)間のデータ依存エッジの消
去可能性を検査する。517、518では、この結果に
基づいて実際のエッジの消去を行なう。
【0032】まず、503では、parentが分岐命令かど
うかを検査する。分岐命令でない場合、(parent,child)
間には制御依存エッジはないので、510において(par
ent,child)間の制御依存エッジは消去可能とする。pare
ntが分岐命令ならば、504に制御を移す。504で
は、childのターゲット変数が、parentの分岐先で生き
ているかどうかを調べる。ここでターゲット変数とは、
命令によって値が定義される変数を表し、変数が生きて
いるとは、実行パス上で、その変数が再定義される前
に、使用があることをいう。childで定義される全ての
ターゲット変数が、parentの全ての分岐先で生きていな
ければ、505に制御を移し、parentとchild間の
制御依存エッジは消去可能とする。いずれかのターゲッ
ト変数が、いずれかの分岐先で生きているならば、50
6以下の処理を行なう。
【0033】506では、図6に示す依存エッジの消去
可能性検出部を呼び出し、制御依存が消去可能かどうか
を検査する。図6の処理は、スーパーブロックの実行頻
度を考慮して、制御依存エッジが消去可能かどうかを決
定する。507では、506の結果に基づき、制御依存
エッジが消去可能ならば、508においてparent
とchild間の制御依存エッジは消去可能とする。エッジ
が消去不可能ならば、509において、parentとchild
間の制御依存エッジは削除不可能とする。以上で(paren
t,child)間の制御依存エッジの消去可能性検査が終了す
る。
【0034】次に(parent,child)間のデータ依存エッジ
が消去可能かどうかを検査する。511では、まずchil
dがparentにフロー依存しているかどうかを検査する。
フロー依存とは、parentで定義するデータをchildで使
用する場合に生じる、消去不可能な依存のことである。
フロー依存しているならば、512において、(parent,
child)間のデータ依存エッジは消去不可能とする。フロ
ー依存でない場合、513に制御を移す。513では、
図6に示すエッジ消去可能性検出部を呼び出すことによ
り、データ依存エッジが消去可能かどうかを検査する。
エッジが消去不可能ならば、515において、(parent,
child)間のデータ依存は消去不可能とする。消去可能な
らば、516ににおいてデータ依存エッジは、消去可能
とする。以上で(parent,child)間の、データ依存の消去
可能性検査が終了する。
【0035】最後に、517において、(parent,child)
間の制御依存とデータ依存が、共に消去可能かどうかを
検査する。共に消去可能ならば、518に制御を移し、
図7に示す依存エッジ消去部を呼び出し、(parent,chil
d)間の依存エッジの消去及び(parent,child)のノード対
の逆転可能リストへの登録処理を行なう。
【0036】図6は、図5の506および513から呼
び出される依存エッジ消去可能性検出部の動作を表して
いる。依存エッジ消去可能性検出部では、2つのノード
間の依存エッジを消去できるかどうかを、スーパーブロ
ックの実行頻度に基づいて判定する。
【0037】601では、依存元のノードをparentと
し、602では、依存先のノードをchildとする。60
3では、現在処理しているスーパーブロックをcurrent_
spbとする。604では、childのターゲット変数を辿
り、各ターゲット変数をtargetとして、605以下の処
理を実行する。605では、targetにフロー依存してい
る全ての使用点を辿り、各使用点をuseとして、606
以下の処理を実行する。606では、useに到達する全
ての定義点を辿り、各定義点をdefとし、607以下の
処理を実行する。607では、defが所属するスーパー
ブロックをspbとし、608では、このspbの実行回数
と、603で定義したcurrent_spbの実行回数を比較す
る。spbの実行回数がcurrent_spbの実行回数よりも多け
れば、609に制御を移す。609では、エッジが消去
不可能であることを呼び側に返し、エッジ消去可能性テ
ストを終了する。
【0038】607、608、609の処理をuseの全
ての定義点defに対しておこない、全ての定義点で、6
08の条件が成り立たなければ、610に制御を移す。
610では、エッジが消去可能であることを呼び側に返
し、エッジ消去可能性テストを終了する。608の条件
によって、リネーム時に生成される全てのコピー命令
が、現在処理しているスーパーブロックより実行頻度の
低いスーパーブロックに、出されることが保証される。
【0039】図7は、518から呼び出される依存エッ
ジ消去および逆転可能リストへの登録処理の動作を表
す。この処理でまず701で、与えあられた2つのノー
ド間の依存エッジを消去する。次の702で、エッジを
消去したノードを、逆転可能リストに登録する。逆転可
能リストとは、エッジを切ることで、スケジュール時
に、順序が逆転する可能性のあるノードを登録したもの
である。このリストは、スケジュール後のリネーム処理
305で使用される。
【0040】図8は、図3のリネーム処理部305の動
作を表している。リネーム処理部には、スケジュール済
みの命令列308が入力として与えあられる。801で
は、518で生成した逆転可能リストを辿り、リスト中
の各逆転可能リストノードreversibleに対して、802
以下の処理を行なう。ここでreversibleには逆転可能な
依存グラフのノード対が登録されている。802では、
reversibleに設定されている、エッジを切る前の依存元
ノードをfirstとし、依存先ノードsecondとする。次に
803において、入力された命令スケジュール308内
で、firstと、secondの順序が逆転しているかどうかを
検査する。逆転しているならば、first,secondに対し
て、制御依存によるリネーム処理804、805、80
6と、データ依存によるリネーム処理807、808を
施す。
【0041】804では、(first,second)間に制御依存
があるかどうかを検査する。この検査は、reversibleに
設定されている依存クラスを参照することによって行な
う。制御依存があるならば、805に制御を移す。firs
tとsecondの間に制御依存があるということは、firstが
分岐命令であることを意味する。805では、分岐命令
firstの分岐先の基本ブロックの入口で、secondのター
ゲット変数が生きているかどうかを検査する。いずれか
の分岐先基本ブロックの先頭で、いずれかのターゲット
変数が生きているならば、806に制御を移し、second
のターゲット変数に対して、図9に示す1変数のリネー
ム処理を呼び出す。以上で制御依存によるリネーム処理
は終了する。
【0042】次に、807以下の処理により、データ依
存によるリネーム処理を行なう。807では、secondの
ターゲットを辿り、各ターゲット変数defに対して、8
08を実行する。808では、defに対して図9に示す
1変数のリネーム処理を呼び出す。以上でデータ依存に
よるリネーム処理は終了する。
【0043】図9は、806、808で呼び出される1
変数のリネーム処理の動作を表す。901では、現在処
理しているスーパーブロックをspbとし、902では、
リネームする変数をdefとする。903では、defへの全
ての逆依存、出力依存を消去する。904では、defの
リネーム用に新しい変数名new_nameを生成する。905
では、defをnew_nameに変更する。以上で定義点のリネ
ームおよび逆依存出力依存の処理は終了する。
【0044】906以下の処理では、defの値を使用す
る変数のリネームを行なう。906では、defの使用点
を辿り、各使用点をuseとし、907以下の処理を実行
する。907では、useの全ての逆依存、出力依存を消
去する。908では、useを905で生成した新たな変
数new_nameに変更する。以上で、defの使用点のリネー
ムは終了する。
【0045】最後に、909以下で、useの定義点が複
数あるならば、補償コードとしてコピー命令を挿入す
る。909では、useの全ての定義点を辿り、各定義点
をdef_2とし、def_2に対して910以下の処理を実行す
る。910では、defとdef_2が一致するかどうかを検査
する。一致しないならば、911に制御を移す。911
では、def_2が現在処理しているスーパーブロックspb内
にあるかどうかを検査する。spb内にないならば912
に制御を移す。912ではdef_2の直後に(new_name = d
ef)なるコピー命令を挿入する。def_2がspb内にあるな
らば、913に制御を移す。913ではスケジュール済
みのスーパーブロック内で、def_2からdefの間にある全
ての分岐命令の、全ての分岐先基本ブロックを辿り、各
分岐先基本ブロックをbbとし、914以下の処理を実行
する。914では、def_2がuseの先祖かどうかを検査す
る。ここでdef_2がuseの先祖であるとは、def_2からuse
への実行パスが存在することを意味する。先祖ならば9
15に制御を移す。915では、bbの先頭にコピー命令
(new_name = def)を挿入する。続いて、図10から図1
7により、以上の変数リネーム処理を簡単な例題に適用
して、その機能と効果を確認する。
【0046】図10は、例題プログラムである。図11
は、図10を基本ブロックの形で表したものである。1
101、1102、1103、1104、1105は基
本ブロックを表す。1106および1107は分岐確率
を表す。図11は、BB1からBB2への分岐確率が0.9で、B
B3への分岐確率よりも大きいことを表している。
【0047】図12は、図11の基本ブロック1004
を複写した後のプログラムである。基本ブロック100
4が複写され、基本ブロック1205が新たに生成され
ている。
【0048】図13は、図12からスーパーブロックを
構成した状態を表す。1301、1302、1303は
生成されたスーパーブロックである。スーパーブロック
1301は図12の基本ブロック1201、1202、
1203から生成され、スーパーブロック1302は基
本ブロック1204、1205から生成され、スーパー
ブロック1303は1206から生成される。図3の、
スケジュールおよびリネーム処理301への入力は、こ
れらのスーパーブロックである。処理順序は実行頻度の
高い順で、この例では1303、1301、1302の
順に処理する。以下ではスーパーブロック1301の処
理を例に、図3の依存エッジ消去部303およびリネー
ム部305の処理を説明する。
【0049】図14は、図13のスーパーブロック13
01に、図3の依存グラフ生成処理302を施したもの
である。1401は、スーパーブロック1301に対す
る依存グラフを表し、図3の307に対応する。依存グ
ラフ1401内の各ノードは、1301内の各命令に対
応しており、ノード間のエッジは依存を表している。1
404と1406の間には、変数Yの定義と使用によ
り、フロー依存エッジが張られている。1406と14
07の間には、変数Yの使用と定義により逆依存エッジ
が張られている。1408と1412の間には、Xの定
義と使用により、フロー依存エッジが張られている。ま
た1409と1406、1407、1408の間には制
御依存エッジが張られている。
【0050】図15は、依存グラフ1401に、図3の
不要依存エッジ消去処理303を施した後の依存グラフ
であり、1501は、図3の不要依存エッジを消去し
た、依存グラフ307に対応する。
【0051】不要依存エッジ消去処理における、依存エ
ッジ消去可能性検査の過程を、図14の逆依存エッジ1
420が消去される場合を例に説明する。まず依存先で
ある命令1408のターゲット変数Xの定義が到達する
使用点1412を考える。これは図6における処理60
5に対応する。次に1412に到達するX定義140
8、1411が、現在処理しているスーパーブロック1
401よりも実行頻度の低いスーパーブロックに含まれ
ているかどうかを検査する。これは図6における処理6
06、607、608に対応する。この例では、140
8は現在処理しているスーパーブロック1401に含ま
れており、1411は、スーパーブロック1401より
も実行頻度の低いスーパーブロックに含まれている。こ
の結果、処理610により、依存エッジ消去候補である
1420は消去可能となる。
【0052】前述の不要依存エッジ消去処理により、図
14の逆依存エッジ、出力依存エッジ、制御依存エッ
ジ、1419、1420、1423、1424、142
5、1426が、図15では消去され、図14で存在し
た1406、1407、1408間のデータ依存による
順序関係は、図で15はなくなる。また制御依存によっ
て、1409と1406、1407、1408の間に存
在した順序関係も、図15ではなくなる。これにより、
スケジューラが自由に移動できる命令数が増加する。
【0053】図16は、1501に図3のスケジュール
処理304を適用したものである。1601は、130
1のスケジュール後の命令列である。。1301の命令
列と比較すると、1601内の命令1612と命令16
14の順序が逆転している。このため、本来1614で
使用されるXの値は、1610で定義されたXの値でなけ
ればならないところが、スケジュール後では、1612
で定義されたXの値を使用することになっている。正し
い結果を得るために、スケジュール済み命令列1601
に対して、図3のリネーム処理305を施す必要があ
る。
【0054】図17は、1601に、リネーム処理を適
用したの結果であり、1701は、変数リネーム処理後
の命令スケジュール308に対応する。リネーム処理で
は、まず1612のターゲット変数Xのリネームを行な
い、新たな名前X1に変更する。この結果が1711であ
る。この処理は図9の処理905に対応する。次に、1
612で定義されたXの値を使用する1617のXを、新
たな名前X1に変更する。この結果が1717である。こ
れは処理908に対応する。次に、1617のXに到達
するXの定義を考える。この例では、1616と161
2が到達する定義である。1612で定義されるXは、
すでにX1に変更したので何もしない。1616は、現在
処理しているスーパーブロック内にないので、図9の処
理912により、1616の直後にコピー命令(X1 = X)
を挿入する。これは、909以下の処理に対応する。以
上でリネーム処理は終了する。
【0055】通常のリネームでは、変数を再定義してい
る1713の変数Yもリネームしてしまう。しかし、こ
の変数のリネームは、実際のスケジュールには貢献しな
い。すなわちリネームしても実際のスケジュールで、並
列実行するような命令列が生成されない。このように従
来のリネームでは、無駄なリネームを行なうことにな
る。一方本発明では、スケジュールの後に、変数のリネ
ーム処理を行なうことで、図17に示すように、スケジ
ュールに貢献するリネームだけを行なうことができる。
さらに図17における1711のように、到達する定義
点が複数ある場合でも、リネームを行なっている。これ
により従来のリネームよりも多くの有用な変数をリネー
ムすることができる。複数の定義点がある場合、もとの
ソースプログラム上にないコピー命令1716が生成さ
れる。しかしこのコピー命令は、リネーム処理を行なっ
たスーパーブロック1701よりも、実行頻度の低いス
ーパーブロック1702に挿入され、1702に対する
スケジュールはまだ行なっていないため、後で実施され
るスーパーブロック1702のスケジュールにより、他
の命令1715と共にスケジュールされる。従って、リ
ネームにより生成されるコピー命令によるペナルティー
を低く押えることが出来る。
【0056】以上の説明から分かるように、図3のスー
パーブロック306から、スケジューリングおよびリネ
ーム処理301により、命令スケジュール310を生成
することができる。
【0057】
【発明の効果】本発明によれば、スケジューリングに必
要な場合だけ、変数のリネームを行ない、かつ変数の使
用点に到達する定義点が複数ある場合も、スーパーブロ
ックの実行頻度を考慮することにより、少ないペナルテ
ィーのコードを生成することが可能である。これによ
り、より多くの並列性を抽出可能となり、計算機プログ
ラムの実行時間を短縮できる。
【図面の簡単な説明】
【図1】本発明による変数のリネーム方法が実行される
計算機システムの概略構成図。
【図2】本発明による変数のリネーム方法が実装される
最適化コンパイラの概略構成図。
【図3】本発明の変数リネーム方法の概観を与える概要
ブロック図。
【図4】図3の変数リネーム部及びスケジュール部への
入力となるスーパーブロックの概要図。
【図5】図3の変数リネーム方法における、不要な依存
エッジ消去部の動作を表すPAD図。
【図6】図5の不要依存エッジ消去部における、依存エ
ッジ消去可能性検査部の動作を表すPAD図。
【図7】図5の不要依存エッジ消去部における依存エッ
ジ消去部の動作を表すPAD図。
【図8】図3の変数リネーム方法における、変数リネー
ム部の動作を表すPAD図。
【図9】図8の変数リネーム部における、1変数リネー
ム処理の動作を表すPAD図。
【図10】本発明を具体例を用いて説明するためのソー
スプログラム。
【図11】図10のソースプログラムの基本ブロックに
よる表現。
【図12】図11における基本ブロックを複写した後の
プログラム。
【図13】図12のプログラムのスーパーブロックによ
る表現。
【図14】図12のスーパーブロックの依存グラフによ
る表現。
【図15】図14の依存グラフから不要依存エッジを消
去した依存グラフ。
【図16】図15の依存グラフから得られる命令スケジ
ュール。
【図17】図17の命令スケジュールに変数リネームを
施した後の命令スケジュール。

Claims (6)

    【特許請求の範囲】
  1. 【請求項1】最適化コンパイラおいて変数をリネームす
    る、変数リネーム方法であって、 a)命令スケジュール単位中の複数の命令間のデータ依存
    性と制御依存性を表す、依存グラフを生成するステップ
    と、 b)前記依存グラフを構成する逆依存、出力依存、制御依
    存を表すエッジのなかで、変数をリネームすることによ
    り削除可能な依存エッジを削除し、エッジを削除された
    依存グラフのノード対を、依存エッジ削除ノード対とし
    て登録するステップと、 c)前記不要依存エッジを削除した依存グラフをもとに、
    命令をスケジュールするステップと、 d)前記ステップでスケジュールされた命令列内で、ステ
    ップc)で登録した依存エッジ削除ノード対のうち、順序
    が逆転したものに対して、変数のリネームを行なうステ
    ップと、からなる変数リネーム方法。
  2. 【請求項2】請求項1のステップa)への入力となるスケ
    ジュール単位が、基本ブロックすなわちその入口に制御
    が到達すると、基本ブロック中の全ての命令が必ず実行
    されて、基本ブロック出口まで制御が到達する構造であ
    る、請求項1の変数リネーム方法。
  3. 【請求項3】請求項1のステップa)への入力となるスケ
    ジュール単位が、スーパーブロックすなわち基本ブロッ
    クのシーケンシャルな列から構成されかつ、そのスーパ
    ーブロックを構成する基本ブロック列へのスーパーブロ
    ック外からの制御の到達は、スーパーブロックの先頭基
    本ブロック一箇所のみでありかつ、スーパーブロック内
    から、スーパーブロック外の基本ブロックへの制御の出
    口を複数持つ構造、である請求項1の変数リネーム方
    法。
  4. 【請求項4】請求項1において基本ブロックあるいは、
    スーパーブロックの予測実行頻度を解析し、予測実行頻
    度が高いスケジュール単位から順に処理することを特徴
    とする変数リネーム方法。
  5. 【請求項5】請求項1のステップb)における、依存エッ
    ジ削除可能条件を、削除候補エッジが削除され、かつス
    テップ c)の命令スケジュールによって順序が逆転した
    とき、b1)変数のリネームのみが必要で、コピー命令は
    不要な場合、または b2)コピー命令は必要だが、そのコピー命令を現在処理
    しているスケジュール単位よりも実行頻度の低い実行パ
    ス上に出すことができる場合、とする請求項1のリネー
    ム方法。
  6. 【請求項6】請求項1のステップb)の依存エッジ削除条
    件を請求項5であたえる条件とする請求項2、あるいは
    請求項3、あるいは請求項4の変数リネーム方法。
JP7263845A 1995-10-12 1995-10-12 変数リネーム方法 Pending JPH09106351A (ja)

Priority Applications (1)

Application Number Priority Date Filing Date Title
JP7263845A JPH09106351A (ja) 1995-10-12 1995-10-12 変数リネーム方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP7263845A JPH09106351A (ja) 1995-10-12 1995-10-12 変数リネーム方法

Publications (1)

Publication Number Publication Date
JPH09106351A true JPH09106351A (ja) 1997-04-22

Family

ID=17395030

Family Applications (1)

Application Number Title Priority Date Filing Date
JP7263845A Pending JPH09106351A (ja) 1995-10-12 1995-10-12 変数リネーム方法

Country Status (1)

Country Link
JP (1) JPH09106351A (ja)

Cited By (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2006120124A (ja) * 2004-09-22 2006-05-11 Matsushita Electric Ind Co Ltd コンパイラ装置、コンパイル方法、コンパイラプログラム
JP2007511835A (ja) * 2003-11-14 2007-05-10 インテル・コーポレーション パイプライン変換を通じて自動的にネットワークアプリケーションを並列化する装置及び方法
JPWO2022249236A1 (ja) * 2021-05-24 2022-12-01

Cited By (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2007511835A (ja) * 2003-11-14 2007-05-10 インテル・コーポレーション パイプライン変換を通じて自動的にネットワークアプリケーションを並列化する装置及び方法
JP2006120124A (ja) * 2004-09-22 2006-05-11 Matsushita Electric Ind Co Ltd コンパイラ装置、コンパイル方法、コンパイラプログラム
JPWO2022249236A1 (ja) * 2021-05-24 2022-12-01
WO2022249236A1 (ja) * 2021-05-24 2022-12-01 三菱電機株式会社 ソフトウェア設計支援システム、ソフトウェア設計支援方法およびソフトウェア設計支援プログラム

Similar Documents

Publication Publication Date Title
Aiken et al. Perfect pipelining: A new loop parallelization technique
JP3311462B2 (ja) コンパイル処理装置
US6044222A (en) System, method, and program product for loop instruction scheduling hardware lookahead
Moon et al. An efficient resource-constrained global scheduling technique for superscalar and VLIW processors
US5202975A (en) Method for optimizing instruction scheduling for a processor having multiple functional resources
US7571427B2 (en) Methods for comparing versions of a program
Mahlke Exploiting instruction level parallelism in the presence of conditional branches
US20020095667A1 (en) Optimizing compilation by forward store movement
JPH05143332A (ja) 命令スケジユーラを備えたコンピユータ・システム及び入力命令シーケンスを再スケジユールする方法
Srinivasan et al. Static single assignment for explicitly parallel programs
EP0633526B1 (en) Language processing system and method therefor
Ebcioglu et al. VLIW compilation techniques in a superscalar environment
Çiçek et al. A type theory for incremental computational complexity with control flow changes
JPH0738158B2 (ja) コード最適化方法およびコンパイラ・システム
Puschner Transforming execution-time boundable code into temporally predictable code
Danelutto et al. Data stream processing via code annotations
Chow et al. The design of a data flow analyzer
Day Compiler assignment of data items to registers
Chambers et al. Frameworks for intra-and interprocedural dataflow analysis
US6367070B1 (en) Means and method for establishing loop-level parallelism
Lutz et al. Helium: a transparent inter-kernel optimizer for opencl
JPH09106351A (ja) 変数リネーム方法
Blainey Instruction scheduling in the TOBEY compiler
Potasman Percolation-based compiling for evaluation of parallelism and hardware design trade-offs
Nicolau et al. Realistic scheduling: compaction for pipelined architectures