JPH0738158B2 - コード最適化方法およびコンパイラ・システム - Google Patents

コード最適化方法およびコンパイラ・システム

Info

Publication number
JPH0738158B2
JPH0738158B2 JP3040550A JP4055091A JPH0738158B2 JP H0738158 B2 JPH0738158 B2 JP H0738158B2 JP 3040550 A JP3040550 A JP 3040550A JP 4055091 A JP4055091 A JP 4055091A JP H0738158 B2 JPH0738158 B2 JP H0738158B2
Authority
JP
Japan
Prior art keywords
texture
node
parent
instruction
instructions
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
Application number
JP3040550A
Other languages
English (en)
Other versions
JPH04215133A (ja
Inventor
スチーヴン・マレー・ホクシー
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
International Business Machines Corp
Original Assignee
International Business Machines Corp
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 International Business Machines Corp filed Critical International Business Machines Corp
Publication of JPH04215133A publication Critical patent/JPH04215133A/ja
Publication of JPH0738158B2 publication Critical patent/JPH0738158B2/ja
Anticipated expiration legal-status Critical
Expired - Lifetime legal-status Critical Current

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/44Encoding
    • G06F8/445Exploiting fine grain parallelism, i.e. parallelism at instruction level
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/44Encoding
    • G06F8/445Exploiting fine grain parallelism, i.e. parallelism at instruction level
    • G06F8/4451Avoiding pipeline stalls

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)
  • Complex Calculations (AREA)

Description

【発明の詳細な説明】
【0001】
【産業上の利用分野】本発明は、最適化コンパイラに関
するものである。より具体的には、本発明は、コード・
ストリーム中の特定の命令の実行中にマイクロプロセッ
サによって導入されるパイプライン・インターロック遅
延を含むことが知られているコード・ストリーム中に、
選択された命令を挿入することにより、上記遅延を減少
させることに関するものである。
【0002】
【従来の技術】現在のほとんどのコンピュータ、特に縮
小命令セット・コンピュータ(RISC)は、演算論理
機構(ALU)が、理論的にはクロック速度と実行速度
を1対1で対応させながら、常に実行すべき次の命令を
手にすることができるように、命令パイプラインを使用
している。ハードウェア内のある種の明確な条件の下で
は、以前の計算の結果として命令オペランドが利用可能
になるまで、パイプライン・インターロックによって特
定の命令の実行が阻止される。このインターロックの作
用により、処理サイクルの損失が生じることがある。遅
延、すなわち処理サイクルの損失の最も頻繁な原因は、
条件付き分岐を処理する際に生ずる。この時点で、パイ
プライン中の分岐命令より後の命令はすべて、潜在的に
実行不能である。というのは、この分岐によって、プロ
グラムの制御が異なる命令ストリームに移る可能性があ
るからである。そうである場合には、それらの命令の代
りにその異なる命令ストリームを実行しなければならな
い。このパイプラインの再ロードの間、ALUは、イン
ターロックの作用により新しい命令ストリームを待ちな
がら、遊休状態でいる。方向変更された命令ストリーム
が、別の潜在的なインターロックを導入する別の条件付
き分岐命令を直接含んでいる場合には、問題はより複雑
になる。
【0003】常に満たされた命令パイプラインを実現す
るために、これまでにいくつかの試みがなされてきた。
【0004】初期のRISCマシンは、通常なら分岐の
前に実行されるある種の命令が、命令ストリーム中のそ
の分岐命令の後に現れる、後実行形式の分岐命令を提供
した。これによって、ある種の命令が、パイプラインの
再充填中に実行できるようになった。IBM RT P
Cコンピュータ・システムの場合がそうである。
【0005】命令事前取出し(pre-fetch)の機会を増
やすために、条件レジスタの定義位置と使用位置の間に
挿入すべき適当な命令を見つけることは、「命令スケジ
ューリング」と称する種類のコンパイラ最適化の一部で
あり、本発明の背景の一部である。通常、従来技術のコ
ード引上げ技法は、並行する実行経路に沿って発生する
計算を探し、これらを両方の経路を支配するノードに引
き上げる。その結果生ずるモジュールは、2つの計算を
1つに置き換えた結果、通常、サイズが小さくなる。本
発明は、パイプラインを満杯に保つため、改良された上
記技法を用いて、条件付き実行の経路に沿った命令を見
つけ、これを引き上げる。その結果、命令は、基本ブロ
ック境界をまたいでスケジューリングされる。下記の論
文は、命令パイプラインを実行可能な命令で満杯に保つ
いくつかの試みの概要を述べたものである。Arya S., O
ptimal Instruction Scheduling for a Class of Vecto
r Processors: An Integer Programming Approach, Tec
h. Rept. CRL-TR-19-83, ComputerResearch Laborator
y, Univ. of Mich., Ann Arbor、1983年4月。Ausl
ander M. and Hopkins M., An Overview of the PL.8 C
ompiler, Proc. ACM SIGPLAN Symp. on Compiler Const
ruction, Boston、1982年6月、pp.22〜31。Gi
bbons P. and Muchnick S., Efficient Instruction Sc
heduling for a Pipelined Architecture, Proc. SIGPL
AN'86 Symp. on Compiler Construction, Palo Alto、
1986年、pp.11〜16。Gross T.R., Code Optimi
zation of Pipeline Constraints, Tech. Rept. 83-25
5, Computer Systems Lab., Stanford Univ.、1983
年12月。Hennessy T. L. and Gross T.R., Postpass
Code Optimization of PipelineConstraints, ACM Tran
s. on Prog. Lang. and Sys, Vol. 5、1983年7
月、pp.422〜448。Sites, R.L., Instruction Or
dering for the Cray-1 Computer, Tech. Rept.78-CS-0
23, Univ. of Calif., San Diego、1978年7月。
【0006】コンパイル時パイプライン・スケジューリ
ングに関する研究は、比較的乏しい。Gibbons et al.
(1986年)、Gross(1983年)、Hennessey et
al.(1983年)および Sites(1978年)は、コ
ード生成およびレジスタ割振りの後のパスの間に行われ
るスケジューリングについて考察している。レジスタ割
振り前の命令スケジューリングは、Auslander et al.
(1982年)によって記述されたIBM PL.8コ
ンパイラを含めて、いくつかのコンパイラで実施されて
いるが、いずれの参照論文でも、スケジューリングは基
本ブロック内でのみインターロックを減少することに限
定されている。
【0007】
【発明が解決しようとする課題】これらの試みにも関わ
らず、プログラムの制御が多数の基本ブロック境界にま
たがって流れる際に命令パイプライン内に存在する、潜
在的に実行不能なコードによって引き起こされる遅延を
減少させる方法が必要である。
【0008】
【課題を解決するための手段】現在のところ、制御シー
ケンスの適当な位置にあるコードを制御シーケンスの他
の部分へ引き上げることによって、マイクロプロセッサ
が遊休状態となるクロック・サイクルの数を、減少でき
ることがわかっている。引上げは、計算を有向グラフの
任意のノードからそのノードを支配するノードへ移す、
コード移動技法の1種として定義される。
【0009】したがって、本発明は、コンピュータ内の
命令のシーケンスによるクロック・サイクルの利用を改
善する方法であって、 (a)前記命令を制御フローグラフ中で表すステップ
と、 (b)前記フローグラフ内の第1ノードから検索して、
オーダが少なくとも2のテキスチャである部分グラフを
識別するステップと、 (c)前記の各テキスチャについて、 (i)あるオーダのテキスチャを形成する子ノード内の
命令を検査し、 (ii)各命令が引上げ可能であるか否かを判定し、 (iii)前記命令が引上げ可能である場合、前記子ノ
ードからの前記命令をその親テキスチャに組み合わせる
ステップと、 (d)子ノードがなくなるか、または前記親ノードに固
有の遅延が除去されるまで、各子ノードについてステッ
プ(i)ないし(iii)を繰り返すステップとを含む
方法を含む。
【0010】また、本発明は、コンピュータ上で実行さ
れるプログラムを最適化するための改良されたコンパイ
ラであって、 (a)前記プログラムを命令のシーケンスとして表す手
段と、 (b)前記プログラムの制御フローを制御フローグラフ
として表す手段と、 (c)前記フローグラフ内の第1ノードから検索して、
オーダが少なくとも2のテキスチャである親ノードを識
別する手段と、 (d)前記親ノードの各子ノードを検査する手段と、 (e)各子ノードがその親ノードに移動できる命令を含
むか否かを判定する手段と、 (f)前記命令を前記親ノードに移動する手段と、 (g)前記の各子ノードのすべての命令が移動されたか
否かを判定する手段と (j)前記親ノードに固有の遅延が除去されたか否かを
判定する手段とを含む、コンパイラを含む。
【0011】
【実施例】本開示で用いる用語は、当業者には周知であ
るが、意味を明確にするためここで定義する。「基本ブ
ロック」とは、分岐、戻り、プロシージャの終わりもし
くは、ラベルまたは入口点の直前の命令で終わる、命令
のシーケンスである。「拡張基本ブロック」とは、プロ
シージャの入口点またはラベルから始まり、次の拡張基
本ブロックの境界またはプロシージャの終わりで終了す
る、命令のシーケンスである。「折り込み(collapsin
g)」とは、それによってエッジが取り去られ、ブロック
境界が拡張されて、その結果、各ノードが基本ブロック
ではなく拡張基本ブロックを表す、下記に定義するフロ
ーグラフが得られる、フローグラフ縮小の任意選択処理
である。基本ブロックではなく拡張基本ブロックからな
る縮小フローグラフが、当業者に理解される他のある種
の最適化に必要な前提条件となることがある。「フロー
グラフ」とは、最適化される部分プロシージャまたは関
数内の可能な制御フローを表すすべてのノードとエッジ
を含む有向グラフである。ただし、各ノードは基本ブロ
ックを表し、各エッジは可能な制御フローを表す。「戻
りエッジ」とは、フローグラフの任意のノードから出
て、支配ノードに入る、フローグラフ内のエッジであ
る。「支配」とは、フローグラフの最初のノードから、
支配されるノードへ向かうすべての経路が、支配ノード
を通るという、あるノードと別のノードとの関係であ
る。「部分グラフ」とは、有向グラフ内のノードとそれ
らのノードで始まるまたは終わるすべてのエッジとのサ
ブセットである。基本ブロックは、「ウィーブ」と「ウ
ェブ」の2つの成分に分割できる。分岐命令が存在する
場合、ウェブ成分は分岐命令であり、ウィーブはその基
本ブロックのそれ以外のすべての命令である。「ウィー
ブ」は、「入口エッジ」と称するそこに入るエッジをい
くつか備えた、フローグラフ内のノードであり、その後
に続くのは「ウェブ」だけである。任意のノードに入る
エッジは、それを含むフローグラフ内の戻りエッジでも
あるが、そのエッジが同じ基本ブロックから発している
のでない限り、そのノードの入口エッジとは見なされな
い。「ウェブ」とは、ただ1つの入口エッジと任意の数
の出口エッジを備えた、フローグラフ内のノードであ
る。この定義により、ウェブは必ず1つのウィーブによ
って支配される。このような出口エッジの1つは、「リ
ーディング・エッジ」と称し、そのウェブ内の最後の命
令のフォールスルー経路が存在する場合は、それを表す
エッジである。他のすべての出口エッジは、「トレーリ
ング・エッジ」と称する。「オーダ」とは、ウェブに適
用される用語であって、出口エッジの数を表す。「テク
スチャ」とは、ちょうど1つのウィーブ・ノードと1つ
のウェブ・ノードとを含む部分グラフであって、そのオ
ーダはそれに含まれるウェブのオーダによって定義さ
れ、その入口エッジはそのウィーブの入口エッジであ
る。すなわち、条件付き分岐命令で終わる入口エッジが
1つの基本ブロックは、オーダが2のテキスチャであ
る。そのウェブ成分はこの条件付き分岐のみを含み、こ
の基本ブロック内のそれ以前のすべての命令は、ウィー
ブ成分である。「親」とは、オーダが2のテキスチャで
ある。親テキスチャに続くものは、すべて子として識別
される。「適格な」(以下、「子」と呼ぶ)とは、ある
識別された親テキスチャに続く、フローグラフ内のノー
ドである。子ノードは、何らかのオーダのテキスチャと
して分類できるが、親が子を支配する場合にのみ適格と
見なされる。
【0012】上記の定義に従って定義した時、テキスチ
ャ、ウェブおよびウィーブは、データ・フロー解析で、
制御フローによってスケジューリングが導入される機会
を生み出す。
【0013】本発明は、当業者には容易に理解されるよ
うに、アセンブラまたは中間言語のレベルを含めて、ソ
フトウェア・プログラムをコンパイルする際に最適化ス
テップが実行される各レベルで適用することができる。
本発明は中間言語レベルで適用することが好ましい。当
技術分野で知られているように、中間レベルの言語と
は、人間がコード(しばしば「ソース」と称する)を書
く際に用いる高水準言語と、実際のプロセッサがプログ
ラミングされる機械コードの間のステップである。
【0014】新しいRISCシステムには、多数の条件
レジスタと分離式の分岐復号機構を備えたものがあり、
比較結果が実際の条件付き分岐よりも十分以前にわかる
場合には、命令取出しの方向を変更して、命令パイプラ
インが絶対に実行不能な命令を含まないようにすること
が可能である。本発明は、このようなシステムに特に適
している。というのは、分岐復号機構と演算論理機構が
分離していないシステムよりも、多くの形式の命令を引
き上げることができるからである。
【0015】図1を参照すると、本発明の好ましい実施
例が有向フローグラフで示されている。本発明の方法の
最初のステップでは、最適化すべきプログラムが、命令
のシーケンスとして表される。このプログラムは、固有
の制御フローを有し、それが分析された後フローグラフ
によって表される。開始ノード0から始めて、フローグ
ラフの深さ優先検索(DFS)を使用することによっ
て、オーダ2のテキスチャとして分類できる基本ブロッ
クが識別される。図1では、本発明でノードが検査され
る順序を示すために、ノードにDFSの順序で番号が付
けてある。ノード1、2、5および8はそれぞれ、2つ
の出口エッジを有するので、オーダが2のテキスチャで
ある。
【0016】本発明によって定義される最適化を実行す
る際、これらのノードは親として識別される。この識別
された親テキスチャの後継ノードのうち、オーダが幾つ
のテキスチャであってもよいが、その先行ノードが親だ
けであるノードは、その親の子ノードとなる。図1で
は、ノード1の後継ノードであるノード2と8、ノード
2の後継ノードであるノード3と7、およびノード8の
後継ノードであるノード9と10が、前記親テキスチャ
の子ノードである。
【0017】このグラフ内の各エッジは、任意のノード
の下端から出て、別の任意のノードの上端に入るものと
して図示されている。たとえば、ノード0からノード1
に向かうエッジは、ノード0から出てノード1に入ると
いわれる。
【0018】親テキスチャ・ノード5と子テキスチャ・
ノード1の間のエッジが戻りエッジであることを除い
て、親子関係はすべて同一である。しかしながら、この
場合には、戻りエッジが存在すると、親テキスチャ・ノ
ード5に固有の分岐遅延を減少させようと試みる際に、
ノード1のウィーブ成分が適格な候補命令を含んでいる
と見なされる資格を失うのに十分な理由となる。戻りエ
ッジのゆえに、テキスチャ・ノード5はノード1を支配
せず、したがってノード1は、テキスチャ・ノード5の
適格な子ノードではない。それ以外の場合は、両方の子
のウィーブ成分がなくなるか、または親に固有の分岐遅
延が除去されるまで、それぞれの子のウィーブ成分が、
引上げ可能な候補の命令があるかどうか交互に検査され
る。その後、引上げの候補である命令が、親のウィーブ
成分に組み合わされる。
【0019】この成分を組み合わせる処理は、子成分か
らの候補命令を、対応する親成分に連結することを伴
う。候補命令を識別する処理は、本来的に機械によって
変わり、したがって、本明細書に開示された判断基準と
方法が与えられれば、どの命令が候補になるかは、使用
される特定の機械用のコンパイラを記述する分野の当業
者には自明であろう。しかし、ほとんどの機械では、命
令セットのうちで、レジスタの内容のみに影響を及ぼし
て、疑似的な副作用を伴わないサブセットが引上げ可能
である。任意選択として、コンパイラ設計の対象となる
機械ごとにルックアップ・テーブルを設ける。このよう
なテーブルは、特定の機械上で引上げ可能であるタイプ
の命令のリストを含んでおり、これはその機械用のコン
パイラを書く当業者の手で容易に用意できる。あるコー
ド・シーケンス内の所与の命令が引上げ可能であるか否
かを判定するステップの間に、その機械用のルックアッ
プ・テーブルを参照して、合否の回答を得る。
【0020】親テキスチャのリーディング・エッジが子
の入口エッジであり、子のウィーブ成分がなくなった場
合、子のウェブ成分を親のウェブ成分と組み合わせて、
親の中により高いオーダのテキスチャを形成することに
よって、その子は親の中に折り込まれる。たとえば、図
1では、子ノード3または7のうちどちらかリーディン
グ・エッジ上にある方が、その子ノード内のすべての命
令がこの引上げ変換によってなくなった場合、親ノード
2に折り込まれることになる。親のトレーリング・エッ
ジが子の入口エッジである場合、子のウィーブ成分が親
のウィーブ成分と組み合わされる。ウェブ成分は変化し
ないままである。子ノードからの選択は、制御フローが
子ノードのうちの一方を優先することがわかっているか
否かに応じて、順に行っても、何らかの優先順序に従っ
てもよい。
【0021】一般に発生するコード構成は、IF−−T
HENステートメントである。図1に示したような制御
フローグラフで表すと、このようなステートメントのパ
ターンは、2つの子ノード9および10を有する親テキ
スチャ8として現れる。図示の構成は、親テキスチャが
2つの子ノードを有し、一方の子ノードがもう一方の子
ノードからの入口エッジを有する形式である。ノード9
を通る経路はノード10のみにつながり、したがってノ
ード10は、2つの親テキスチャすなわちノード8とノ
ード9の両方を有すると考えることができる。ノード9
に達するのは“IF”の条件が満足された場合であり、
ノード10は、その条件が満足されなかった場合のフォ
ールスルー経路を表している。ノード9はオーダが1で
ある、すなわち出口エッジが1つだけあり、これはノー
ド10につながっている。原則としては、子ノードが引
上げ可能と見なされるには、入口エッジを1つだけもた
なければならないのだが、それにもかかわらずこの“I
F−−THEN”型のフローグラフ・パターンは、引上
げ可能な命令を含むことができる。多くの形式のプログ
ラムでは、このようなパターンがかなりの数存在し、本
発明の方法に従った引上げにより、コンパイル済みのオ
ブジェクト・コード・プログラムを改善するための大き
な機会をもたらす。図1のノード8、9および10に示
すようなコード・パターンに出会った時、本発明による
コンパイラは、ノード9の命令をノード8に引き上げ、
かつノード10の命令をノード8に引き上げることがで
きる。ノード10からノード9への引上げは、ノード9
のオーダが1なので、この特別な場合でも有利にはなら
ないはずである。
【0022】プログラムは、その実行時間のほとんど
を、最も深くネストされた経路で費やすことが判明して
いる。したがって、深さ優先検索は、最も頻繁に発生す
る可能性の高い命令遅延を招くので、これを検索ステッ
プに使用することが好ましい。これらの遅延を最初に最
小にすると、より深いレベルの検索から引き上げられた
候補命令を使って、それより低いレベルの検索での遅延
を短縮することもできるという追加の利益が得られる。
下降形検索ではなく深さ優先検索が最も好ましいのは、
このためである。下降形検索を使用することも可能であ
るが、本発明の方法によって引き上げられる可能性のあ
る命令をすべて見つけるには、通常は、全レベルですべ
てのノードを数回検査する必要がある。
【0023】例1 本発明の好ましい実施例の1例では、多数の条件レジス
タを有するRISCマシンを使用する。これらの例で、
引上げの候補命令には、S(減算)、A(加算)、C
(算術比較)およびCL(論理比較)が含まれる。話を
簡単にするために、その他すべての命令は、引上げ不能
であると仮定する。本発明をコードの断片に適用する目
的は、比較命令と、プログラムの流れを異なる命令スト
リームに方向変更させる可能性のある条件付き分岐との
間のインターロックによって引き起こされる遅延を減少
させることである。比較命令は、条件付き分岐BTおよ
びBFで使用される条件レジスタ(crx)を定義す
る。
【0024】本発明の方法による最適化の好ましい実施
例の1例は、図2のCプログラムの断片によって表され
るプログラム・セグメントである。これは、3つの値域
(−1..10)、(20..30)、(50..9
0)のうちのいずれかの中にある試験変数の値に基づい
て、特定の処置を選択する。
【0025】コンパイルの最初のステップで、図2にC
で示した最適化すべきプログラムが、図3に中間コード
の形式で示すように、命令のシーケンスとして表され
る。制御の流れが、図4に示すように、分析された後、
フローグラフによって表される。開始ノード0から始め
てフローグラフの深さ優先検索(DFS)を用いること
によって、オーダ2のテキスチャとして分類できる基本
ブロックが識別される。図4では、ノード0、ノード1
およびノード2がそれぞれこのようなテキスチャであ
り、それぞれ2つの出口エッジを有する。ノード0の出
口エッジは記号(b)および(g)を付したエッジであ
り、ノード1の出口エッジは記号(d)および(h)を
付したエッジであり、ノード2の出口エッジは記号
(f)および(i)を付したエッジである。さらに、エ
ッジ(b)、(d)、(f)はリーディング・エッジで
あり、エッジ(g)、(h)、(i)はトレーリング・
エッジである。
【0026】DFS中にテキスチャとして識別された各
基本ブロックは、そのウィーブ成分およびウェブ成分に
再分割される。ノード0はノード8およびノード9に分
割される。ノード8は、この基本ブロックの終わりをマ
ークする条件付き分岐以外のすべての命令を含む、ウィ
ーブ成分である。ノード9は、その条件付き分岐だけを
含むウェブ成分である。図4で(a)として識別される
エッジは、テキスチャ・ノード0のウェブ成分とウィー
ブ成分を結び付けるエッジである。このエッジは、条件
付き分岐命令が条件レジスタcr134を規定する比較
命令に近接しているために存在する、パイプライン遅延
サイクルの数によって特徴づけられる。図3の命令番号
4にある原命令ストリームを参照すると、この遅延は3
サイクルであることがわかる。
【0027】DFSの後退の間に、この例で検査すべき
最初のテキスチャは、ノード2であり、このとき子ノー
ド3および6を有する親ノードであると見なされる。エ
ッジ(e)も、上記エッジ(a)と同様の3サイクルの
遅延を含むものとして特徴づけられる。この2つの子ノ
ードの命令ストリームを検査して、テキスチャ・ノード
2のウィーブ成分、すなわちノード12に引き上げるべ
き候補命令を識別する。この例では、どちらの子にも候
補命令が存在しない。しかし、ノード3は、実際には空
のウィーブ成分を有するテキスチャであり、親のリーデ
ィング・エッジが子の入口エッジであるという条件を満
足している。このエッジはエッジ(f)である。したが
って、ウェブ成分のノード13とノード3を連結した
後、エッジ(f)を取り除くことによって、ノード3が
親テキスチャ・ノード2に折り込まれる。
【0028】DFS後退の次の部分の間には、ノード1
が、子ノード2および5を有する親ノードと見なされ
る。ノード2の場合と同じく、子ノードを検査して候補
命令を探す。この例では、ノード5には候補が存在しな
いが、ノード12の内容全体、すなわちテキスチャ・ノ
ード2のウィーブ成分が引上げ可能な命令であり、この
それぞれが引き上げられて、ノード10、すなわち親テ
キスチャ1のウィーブ成分の一部になる。ウィーブ・ノ
ード12がなくなったので、子テキスチャの内容は、ノ
ード2、3および6に関して上記で見たものと同様にな
る。したがって、親テキスチャ・ノード1と子ノード2
のウェブ成分とは、親のリーディング・エッジが、空の
ウィーブを有する子の入口エッジであるという条件を満
足しているので、折り込まれる。次にそのエッジ、
(d)が除去される。図5は、この時点で得られた親テ
キスチャを示す図である。このテキスチャは、オーダが
3である。
【0029】最後に、DFSから後退して、テキスチャ
・ノード0を考慮にいれ、本発明の方法をノード2およ
び1と同様にして部分グラフ全体に適用すると、図6に
示した、最終的な最適化されたコード・ストリームが得
られる。図6では、条件付き分岐命令のほとんどのサイ
クル数が0に減らされたことがわかる。わかりやすくす
るために、図6には原命令番号が示してある。
【0030】例2 ロード命令Lも引上げ可能になるように、引上げ可能な
命令に関して異なる制約を仮定した場合、図4のフロー
グラフのエッジ(i)、(h)および(g)に沿って命
令を引き上げることから生ずる別のコード・ストリーム
が生成されるはずである。前の例では、これらのエッジ
上の子ノード、ノード6、5、4は、それぞれテキスチ
ャ・ノード2、1、0のウィーブ成分であるノード1
2、10、9に引き上げるべき候補命令を含んでいなか
った。例1の場合、ロードに対する制約が、これらの各
子ノードに含まれる加算命令に対して間接的な制約を加
えた。この制約は、ロードが引上げ不能であるため、先
行するロード命令が完了するまで加算オペランドの一方
が使用不能なので、加算を引き上げてはならないという
ことである。加算は引上げ可能な候補であるにもかかわ
らず、この場合の加算命令は、ロードに従属しており、
したがってそのロードより前に移動してはならない。こ
の型式の制約が特定の環境に適用されることは、その環
境でのプログラム作成の熟練者には明白である。ロード
命令に対する制約が緩和されたと仮定すると、ロードを
引き上げる場合、加算も引上げ可能になる。図7の、そ
の結果得られるコード・ストリームを参照すると、この
ような加算命令が1つ、すなわち命令番号22が引き上
げられたことがわかる。この最適化に続いて、条件付き
分岐命令10の遅延が0に減らされる。この遅延は、以
前の制約が有効であったときは1サイクルであった。
【0031】例3 3つではなく2つの命令の分岐遅延が除去されるとい
う、もう1つのより簡単な例を以下に示す。
【0032】例4 2つの命令の分岐遅延が除去されるという、もう1つの
例を以下に示す。この場合、ST命令は、変数への記憶
を表す。この例では、一部の当業者に知られているなん
らかの他の最適化では、効率を高めるため、ユーザ指定
のラベルLLに先行するすべての実行経路で、変数a、
b、cの値をそれぞれレジスタr100、r200、r
300に事前ロードすべきことがわかっていると仮定す
る。この結果パイプライン遅延が生ずるが、その遅延を
含む基本ブロックはスケジュール可能な命令を含んでい
ないので、この遅延は本発明の適用によってしか除去で
きない。
【0033】従来技術では、レジスタ割振りより以前の
コードの並べ替えは、いくつかの理由から奨励されなか
った。第1に、スケジューリングによってレジスタの寿
命が延びる傾向があり、レジスタの寿命が長いと、余分
なレジスタ・スピル・コードが導入される傾向があるの
で、「良好な」レジスタ割振りを得ることが難しくな
る。第2に、命令間に存在するある種のインターロック
の特性が、レジスタの割当てが完了するまでわからな
い。第3に、コード生成の時点で最適化を実行する場
合、特に異なる中間コードを用いる場合には、各コンパ
イラが何らかの形態の最適化を実施しなければならな
い。しかし、レジスタ割振りと命令選択の後に適用され
る技法が、ハンド・コーディングされたアセンブリ・コ
ードにも適用できる。
【0034】本発明は、いくつかの利益を提供すること
によって、これらの欠点を克服する。レジスタ寿命が引
き延ばされるにもかかわらず、この引き延ばしの性質
は、レジスタの「定義位置」が、単に直線状のコードの
前の方に移動するのではなくて、フローグラフの高位側
のノードに引き上げられることに起因している。これ
は、ループ外に、あるいは少なくとも「ジャム領域」
(レジスタ資源利用度が最大の領域)の中心から離れた
ところへ計算を移す効果に類似している。この引上げの
結果としてレジスタ・スピル・コードが発生する場合、
それは、「活領域分割」を用いてジャム領域を短くする
際に、フローグラフのより高い位置に挿入される可能性
が高い。第2に、現在の機械は、通常、旧式の装置より
も多数のレジスタ・セットを使用しており、十分なレジ
スタが利用可能な場合には、ほとんどのプログラムはス
ピル・コードを含まない。好ましい実施例では、レジス
タ割振り処理の前には未知であった新しいインターロッ
ク状況が、レジスタ割振り処理によって導入されない。
高水準言語に向かう傾向が増大し、汎用最適化機能およ
びコード生成機能が使用されるので、上述した複数の実
施様態のコストは、急速に小さくなってきている。本発
明の方法は、いかなる最適化コンパイラとも使用可能で
あり、例えばFORTRAN、C、PASCAL、PL
/Iなど、単一の最適化機能とコード生成機能を有する
いくつかのコンパイラで試験済みである。
【0035】テスト・ケースでの相対的な性能利得は、
この種のパイプライン遅延に起因して失われるサイクル
時間の量に応じて大きく変わる傾向がある。適当な量の
パイプライン遅延を含むテスト・ケースでは、性能利得
が30%もの高さになることがある。コンパイル時のコ
ストは、利用された機会の数と検索の固定オーバヘッド
との和に比例し、その合計は通常コンパイル時間の1%
以下である。上述したように、最も頻繁に実行される、
遅延を減少させる引上げの機会を最初に見つけるので、
深さ優先検索が下降形検索よりも好ましい。また、深さ
優先検索は、下降形検索よりもオーバヘッドが少ない。
【0036】本発明のスケジューリング技法は、プログ
ラムによって最終的に選択される実際の実行経路とは無
関係に、条件付き実行経路から計算の引上げを実行する
が、そうでなければ、引き上げられた計算を計算するの
に必要なサイクルが完全に失われるはずであるという利
益が、これを補って余りある。この技法は、外部から提
供される何らかのデータによって、特定の実行経路の確
率がコンパイル時にわかっている場合、当業者には既知
の方法によって、条件付き制御経路の適当な側からの引
上げが有利になるように、容易に修正することができ
る。
【0037】
【発明の効果】本発明は、コード・ストリーム内の特定
の命令の実行中に、マイクロプロセッサによって導入さ
れるパイプライン・インターロック遅延を含むことがわ
かっているコード・ストリーム内に、選択された命令を
挿入することによって、上記遅延の減少を実現する。
【図面の簡単な説明】
【図1】基本ブロックを形成する1つまたは複数の命令
を表すノードを有する、典型的なプログラムの断片の制
御フローグラフである。
【図2】3つの範囲(−1..10)、(20..3
0)、(50..90)のうちのいずれかに含まれる値
があるか否かをテストする多岐分岐を伴う、C言語のソ
ース・コードの断片を示す図である。
【図3】図2に含まれるソース・テキストの可能な、中
間言語表現を示す図である。
【図4】図3の中間言語表現から導出された制御フロー
グラフである。
【図5】図4のノード1に根を持つ部分グラフに本発明
を適用した後の、ノード1のテキスチャである。
【図6】本発明を適用した後の、図2に含まれるソース
・テキストの最適化された中間言語表現である。
【図7】本発明を適用した後の、図2に含まれるソース
・テキストの別の最適化された中間言語表現である。
───────────────────────────────────────────────────── フロントページの続き (56)参考文献 特開 昭63−186333(JP,A) 特開 昭61−55737(JP,A) 特開 平1−214936(JP,A)

Claims (8)

    【特許請求の範囲】
  1. 【請求項1】コンピュータ内の命令を実行するパイプラ
    イン処理におけるクロック・サイクルの利用を改善する
    ためのコード最適化方法であって、 (a)前記命令を、少なくとも1つの関連する子ノード
    をもつ親テキスチャをそれぞれが含んだ1または複数の
    部分グラフを有する制御フローグラフ中で表すステップ
    と、 (b)前記フローグラフを検索して、出口エッジの数が
    少なくとも2であるテキスチャを含む部分グラフを識別
    するステップと、 (c)前記識別された各部分グラフについて、 (i)前記識別された部分グラフの少なくとも1つの子
    ノード内の命令を検査し、 (ii)各命令が引上げ可能であるか否かを判定し、 (iii)前記命令が引上げ可能である場合、該命令
    を、前記子ノードからその親テキスチャにおいてパイプ
    ライン遅延が生じる位置に移動するステップと、 (d)子ノードからのすべての候補命令がなくなるか、
    あるいは前記親テキスチャに固有のパイプライン遅延が
    除去されるまで、各子ノードについてステップ(i)な
    いし(iii)を続行するステップと を含む方法。
  2. 【請求項2】前記検索が深さ優先検索である、請求項1
    に記載の方法。
  3. 【請求項3】前記検索が下降形検索である、請求項1に
    記載の方法。
  4. 【請求項4】前記子ノード内のすべての命令が親テキス
    チャに移動されたか否かを判定し、そうである場合には
    前記子ノードを前記親テキスチャに折り込むステップを
    含む、請求項1に記載の方法。
  5. 【請求項5】命令が引上げ可能であるか否かを判定する
    前記ステップが、引上げ可能な命令のリストを含むルッ
    クアップ・テーブルを選択するステップと、前記命令が
    前記ルックアップ・テーブル内で見つかるか否かを判定
    するステップを含む、請求項1に記載の方法。
  6. 【請求項6】コンピュータ内のプログラムを実行するパ
    イプライン処理におけるクロック・サイクルの利用を改
    善するためのコード最適化を行うコンパイラ・システム
    であって、 (a)前記プログラムを命令のシーケンスとして表す手
    段と、 (b)前記プログラムの制御フローを、少なくとも1つ
    の関連する子ノードをもつ親テキスチャをそれぞれが含
    んだ1または複数の部分グラフを有する制御フローグラ
    フとして表す手段と、 (c)前記フローグラフ中の第1ノードから検索して、
    出口エッジの数が少なくとも2のテキスチャを含む部分
    グラフを識別する手段と、 (d)前記識別された部分グラフの各子ノードを検査す
    る手段と、 (e)各子ノードが、前記識別された部分グラフの親テ
    キスチャに移動できる引上げ可能な命令を含むか否かを
    判定する手段と、 (f)前記命令を前記親テキスチャにおいてパイプライ
    ン遅延が生じる位置に移動する手段と、 (g)前記の各子ノード内のすべての命令が移動された
    か否かを判定する手段と (h)前記親テキスチャに固有のパイプライン遅延が除
    去されたか否かを判定する手段と を含むコンパイラ・システム。
  7. 【請求項7】前記子ノード内のすべての命令が親テキス
    チャに移動された場合に、該子ノードを前記親テキスチ
    ャに折り込む手段を含む、請求項6に記載のコンパイラ
    ・システム。
  8. 【請求項8】前記引上げ可能な命令のリストを含むルッ
    クアップ・テーブルを含む、請求項6に記載の改良され
    たコンパイラ・システム。
JP3040550A 1990-02-14 1991-02-13 コード最適化方法およびコンパイラ・システム Expired - Lifetime JPH0738158B2 (ja)

Applications Claiming Priority (2)

Application Number Priority Date Filing Date Title
CA2010067 1990-02-14
CA002010067A CA2010067C (en) 1990-02-14 1990-02-14 Reducing pipeline delays in compilers by code hoisting

Publications (2)

Publication Number Publication Date
JPH04215133A JPH04215133A (ja) 1992-08-05
JPH0738158B2 true JPH0738158B2 (ja) 1995-04-26

Family

ID=4144297

Family Applications (1)

Application Number Title Priority Date Filing Date
JP3040550A Expired - Lifetime JPH0738158B2 (ja) 1990-02-14 1991-02-13 コード最適化方法およびコンパイラ・システム

Country Status (5)

Country Link
US (1) US5450588A (ja)
EP (1) EP0442623A3 (ja)
JP (1) JPH0738158B2 (ja)
BR (1) BR9100576A (ja)
CA (1) CA2010067C (ja)

Families Citing this family (17)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPH06259262A (ja) * 1993-03-08 1994-09-16 Fujitsu Ltd 分岐確率を設定するコンパイラの処理方法および処理装置
JPH0844561A (ja) * 1994-07-28 1996-02-16 Fujitsu Ltd ブースティング制御方法及びブースティング制御機構を備えたプロセッサ装置
EP0755003A2 (en) * 1995-07-19 1997-01-22 Sun Microsystems, Inc. Method and apparatus for reordering components of computer programs
US5721893A (en) * 1996-05-14 1998-02-24 Hewlett-Packard Company Exploiting untagged branch prediction cache by relocating branches
JP3237693B2 (ja) * 1996-08-19 2001-12-10 日本電気株式会社 言語処理装置および言語処理方法
US5999736A (en) * 1997-05-09 1999-12-07 Intel Corporation Optimizing code by exploiting speculation and predication with a cost-benefit data flow analysis based on path profiling information
US6230317B1 (en) * 1997-07-11 2001-05-08 Intel Corporation Method and apparatus for software pipelining of nested loops
US6487715B1 (en) 1999-04-16 2002-11-26 Sun Microsystems, Inc. Dynamic code motion optimization and path tracing
WO2002005144A1 (en) * 2000-07-03 2002-01-17 Cadence Design Systems, Inc. Circuit component interface
US6701518B1 (en) * 2000-08-03 2004-03-02 Hewlett-Packard Development Company, L.P. System and method for enabling efficient processing of a program that includes assertion instructions
GB0025053D0 (en) * 2000-10-12 2000-11-29 Sgs Thomson Microelectronics Compiling computer programs including branch instructions
GB0025052D0 (en) * 2000-10-12 2000-11-29 Sgs Thomson Microelectronics Compiling computer programs including branch instructions
WO2008019528A1 (en) * 2006-08-08 2008-02-21 Intel Corporation Methods and apparatus to optimize computer instruction
US8484630B2 (en) * 2008-12-23 2013-07-09 International Business Machines Corporation Code motion based on live ranges in an optimizing compiler
US9043921B2 (en) * 2013-04-12 2015-05-26 Fujitsu Limited Determining software metrics
CN112035116B (zh) * 2020-08-26 2021-07-16 大连理工大学 多目标编译优化序列选择的代理建模方法
US11500673B2 (en) * 2020-09-02 2022-11-15 International Business Machines Corporation Dynamically generating an optimized processing pipeline for tasks

Family Cites Families (15)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US4435758A (en) * 1980-03-10 1984-03-06 International Business Machines Corporation Method for conditional branch execution in SIMD vector processors
US4656583A (en) * 1984-08-13 1987-04-07 International Business Machines Corporation Method for improving global common subexpression elimination and code motion in an optimizing compiler
US4642764A (en) * 1984-08-13 1987-02-10 International Business Machines Corporation Method of developing formal identities and program bases in an optimizing compiler
JPS6155737A (ja) * 1984-08-27 1986-03-20 Fujitsu Ltd 不変式の移動方式
US4667290A (en) * 1984-09-10 1987-05-19 501 Philon, Inc. Compilers using a universal intermediate language
JPS6226535A (ja) * 1985-07-22 1987-02-04 インタ−ナショナル ビジネス マシ−ンズ コ−ポレ−ション プログラム内の変換テ−ブルの修正方法
US4782444A (en) * 1985-12-17 1988-11-01 International Business Machine Corporation Compilation using two-colored pebbling register allocation method such that spill code amount is invariant with basic block's textual ordering
US5021947A (en) * 1986-03-31 1991-06-04 Hughes Aircraft Company Data-flow multiprocessor architecture with three dimensional multistage interconnection network for efficient signal and data processing
US5133072A (en) * 1986-11-13 1992-07-21 Hewlett-Packard Company Method for improved code generation in reduced instruction set computers
JPS63186333A (ja) * 1987-01-28 1988-08-01 Nec Corp 局所的分岐命令に対する命令のスケジユ−リング処理方式
JPH01214936A (ja) * 1988-02-24 1989-08-29 Hitachi Ltd 最適化コンパイラ
US5050068A (en) * 1988-10-03 1991-09-17 Duke University Method and apparatus for using extracted program flow information to prepare for execution multiple instruction streams
US5202995A (en) * 1989-10-12 1993-04-13 International Business Machines Corporation Method for removing invariant branches from instruction loops of a computer program
US5119495A (en) * 1989-12-21 1992-06-02 Bull Hn Information Systems Inc. Minimizing hardware pipeline breaks using software scheduling techniques during compilation
US5107418A (en) * 1990-06-11 1992-04-21 Supercomputer Systems Limited Partnership Method for representing scalar data dependences for an optimizing compiler

Also Published As

Publication number Publication date
CA2010067A1 (en) 1991-08-14
EP0442623A2 (en) 1991-08-21
US5450588A (en) 1995-09-12
CA2010067C (en) 1993-10-26
JPH04215133A (ja) 1992-08-05
EP0442623A3 (en) 1993-01-07
BR9100576A (pt) 1991-10-29

Similar Documents

Publication Publication Date Title
US6718541B2 (en) Register economy heuristic for a cycle driven multiple issue instruction scheduler
JP3337174B2 (ja) コンパイル方法
US5797013A (en) Intelligent loop unrolling
US6988183B1 (en) Methods for increasing instruction-level parallelism in microprocessors and digital system
US5202975A (en) Method for optimizing instruction scheduling for a processor having multiple functional resources
JP3311462B2 (ja) コンパイル処理装置
US5901308A (en) Software mechanism for reducing exceptions generated by speculatively scheduled instructions
US5761514A (en) Register allocation method and apparatus for truncating runaway lifetimes of program variables in a computer system
Hoogerbrugge et al. Transport-triggering vs. operation-triggering
US5894576A (en) Method and apparatus for instruction scheduling to reduce negative effects of compensation code
US5526499A (en) Speculative load instruction rescheduler for a compiler which moves load instructions across basic block boundaries while avoiding program exceptions
JPH0738158B2 (ja) コード最適化方法およびコンパイラ・システム
Chang et al. The importance of prepass code scheduling for superscalar and superpipelined processors
US6345384B1 (en) Optimized program code generator, a method for compiling a source text and a computer-readable medium for a processor capable of operating with a plurality of instruction sets
JPH08123685A (ja) 推測的実行を支援する方法
US5854933A (en) Method for optimizing a computer program by moving certain load and store instructions out of a loop
Schlansker et al. Height reduction of control recurrences for ILP processors
JP3311381B2 (ja) コンパイラにおける命令スケジューリング処理方法
Briggs et al. Goal-directed interprocedural optimization
Mantripragada et al. A new framework for integrated global local scheduling
Lee et al. Software pipelining and superblock scheduling: compilation techniques for VLIW machines
US7114151B2 (en) Code conversion method and apparatus
Nakatani et al. Making compaction-based parallelization affordable
WO1991020031A1 (en) Method for optimizing instruction scheduling
Liao et al. Code generation and optimization techniques for embedded digital signal processors