JPH0695310B2 - コード最適化方法 - Google Patents

コード最適化方法

Info

Publication number
JPH0695310B2
JPH0695310B2 JP60174440A JP17444085A JPH0695310B2 JP H0695310 B2 JPH0695310 B2 JP H0695310B2 JP 60174440 A JP60174440 A JP 60174440A JP 17444085 A JP17444085 A JP 17444085A JP H0695310 B2 JPH0695310 B2 JP H0695310B2
Authority
JP
Japan
Prior art keywords
base
kill
item
basic
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
Application number
JP60174440A
Other languages
English (en)
Other versions
JPS6149241A (ja
Inventor
マーク・アラン・オースランダー
マーチン・エドワード・ホプキンス
ピーター・ウイリー・マークスタイン
Original Assignee
インタ−ナショナル ビジネス マシ−ンズ コ−ポレ−ション
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 インタ−ナショナル ビジネス マシ−ンズ コ−ポレ−ション filed Critical インタ−ナショナル ビジネス マシ−ンズ コ−ポレ−ション
Publication of JPS6149241A publication Critical patent/JPS6149241A/ja
Publication of JPH0695310B2 publication Critical patent/JPH0695310B2/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/43Checking; Contextual analysis
    • G06F8/433Dependency 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

【発明の詳細な説明】 A.産業上の利用分野 本発明は、コードの品質を改善するために最適化アルゴ
リズムを用いたコンパイラに特に有用である。より具体
的には、大域的な共通部分式の削除及びコード移動のた
めに「基底」項目の概念を用いる時、本発明は、中間コ
ード生成の工程中に「基底」を求めるための最適な方法
を提供する。
B.開示の概要 大域的な共通部分式の削除及びコード移動の手続き中に
使用される基底項目及びキル集合を生成するために最適
化コンパイラ内で動作可能な方法が開示される。より具
体的には、この方法は、計算されるべき各非基底要素に
下記のように記号レジスタを割り当てるステツプを含
む。即ち、コンパイラによつて機械命令に変換すべき各
計算毎に組(v)を形成し、コンパイルされるプログラ
ム中の全ての組に関する記入項目を有する表(ハツシユ
表が最適)を形成する。表の中に入れられる組の中のあ
らゆる基底要素毎に、その組に一意的に割り当てられた
記号レジスタがその基底要素に関するキル集合に付加さ
れる。表の中に入れられる組の中の非基底要素「n」毎
に、その組に関して一意的に割り当てられた記号レジス
タが、上記非基底要素「n」がそのキル集合中に現れる
全ての基底要素に関するキル集合に付加される。表の中
の組に対して割り当てられた記号レジスタは、非基底要
素の計算の結果を保持するために選ばれる。そして、最
後に、記号レジスタが与えられると、それが表わしてい
る計算が検索できるように、第2の表が構成される。
C.従来技術 コンパイラによつて生成されるコードの品質は、最初の
コンパイラが作成されて以来、議論の対象であつた。IB
MのFORTRAN Iコンパイラ(最初の商業的に利用可能な
コンパイラ)の主要な目的の1つは、アセンブリ言語の
プログラマが手でコーデイングする事によつて直接的に
作成されたコードに対してコード品質において匹敵する
オブジエクト・コードを、科学技術計算の分野におい
て、生成する事であつた。
今日、計算機が利用可能なあらゆる分野において使用さ
れるように種々の高水準言語が設計されている。最初の
FORTRAN言語でさえも、広範囲のプログラミング・タス
クに適用できるようにするために機能強化が行なわれて
きている。しかしながら、コンパイラによつて生成され
るコードの品質は、特に結果として生じるコードが生産
環境で使用される場合には、高い事が依然として重要で
ある。有用なアセンブリ言語プログラムマによつて作成
されるコードは、依然として、コンパイラの生成したコ
ードの比較基準である。
1950年代以来、コンパイラの生成するコードの品質を改
善するために、多数の最適化技術が開発され改良されて
きた。実際、これらの最適化の多くは、最初のFORTRAN
コンパイラを作成したチームによつて原理的には知られ
且つある方式で用いられていた。
最適化コンパイラにおいてしばしば採用される最適化技
術には、共通部分式の消去、高い実行頻度の場所から低
い実行頻度の場所へのコードの移動、無用コードの消
去、遅い動作から等価な速い動作への置きかえ、及び定
数伝播が含まれる。これらの最適化技術についての説明
は、下記の文献に見い出される。
J.T.シユワルツ(Schwartz)、「プログラミングについ
て−SETL言語に関する中間報告。
第2部:SETL言語とその使用例(On programming−An
Interim Report on the SETL Language.Installme
nt II:The SETL Language and Examples of Its
Use)」、Courant Institute of Math Science
s、NYU、1983年発行、293〜310頁。
E.モレル外(E.Morel and C.Renvoise)、「部分的な
冗長性の抑圧による大域的な最適化(Global Optimiza
tion by Suppression of Partial Redundancie
s)」、CACM、第22巻、第2号、96〜103頁、(1979
年)。
A.エイホ、J.ウルマン(A.Aho、J.Ullman)、「コンパ
イラ設計の原理(Principles of Compiler Desig
n)」、アデイソン−ウエスレー(Addison−Wesley)
社、1977年発行。
大域的な共通部分式の消去及びコードの移動は最も重要
な最適化技術に属する。測定結果によれば、これらの最
適化は他の最適化技術のどれよりも大きな影響をコード
の改善に対して有する。多くの文献がこの最適化をいか
にして行なうかを説明している。上記引用文献の最初の
2つは、元のコードを冗長なものにし消去できるように
するためにプログラム中にコードのコピーが挿入される
べき場所をいかにして決定するかについてすぐれた説明
を含んでいる。また、これらの文献は冗長なコードの存
在する場所を判定する方法についても説明している。そ
の方法は、基本ブロツクを1度に1つづつ調査する事に
よつて決定し得るある特性についての知識及びプログラ
ムのフロー・グラフに依存している。それらの特性は次
のようなものである。
DEX 下方に露出された式(downward exposed expres
sions) 基本ブロツクの終りに実行された場合に、「本来の場
所」即ち基本ブロツク中にそれらが存在する場所で実行
された時と同じ結果を与える計算の集まり。
UEX 上方に露出された式(upward exposed expressi
ons) 基本ブロツクの始めに実行された場合に「本来の場所」
で実行された時と同じ結果を与える計算の集まり。
THRU 基本ブロツクの始め又は終りに計算された場合に
同じ結果を与える計算の集まり。
上記参考文献は、上述の集まりが基本ブロツク毎に知ら
れているという前提に基いて、いかに大域的な共通部分
式の消去やコードの移動を行なうかを説明している。特
に、これらの参考文献は、集合DEX、UEX及びTHRUに基い
て、コード移動の効果を達成するために、ある基本ブロ
ツクの終りに挿入すべき計算の集合及び基本ブロツクへ
の入口において既に利用可能な計算の集合を計算する方
法を説明している。これらの計算は当業者に周知のもの
である。
D.従来技術の問題点 しかしながら、UEX、DEX及びTHRUを計算する時に注意を
払わなければ、共通化及びコード移動のアルゴリズム
は、関係した計算のシーケンスの最初の部分しか共通化
及び/又は移動しない可能性がある。例えば表Iのコー
ド断片を考察する。
表I中のコードより成る基本ブロツクに関して、R102の
計算(動作3)をUEXに含めない事は容易である。とい
うのは基本ブロツクに入つた時にR100及びR101は、ADD
命令に出合つた時と同じ値を持つていない可能性がある
からである。しかし例えば、もし表Iが、A及びBが変
化しないような内部ループ中のコードであれば、R100及
びR101は明らかにUEX(これはコード移動を決定する時
の道具になる集合である)に属する。この時、コード移
動及び共通化を適用した後、R102の計算は依然としてル
ープ中にとどまり、それをループ外に移動させようとす
れば他のアルゴリズムの適用が必要であろう。
次にいくつかの従来技術を概観する。
米国特許第4309756号は、ある理論的計算を評価する方
法を開示している。そこに開示された概念はスコープが
狭く、1982年に発行された特許としては時代錯誤的であ
る。これは、ネーミング計算について何ら明らかにする
事はなく従つて同じ名前に冗長な計算が行なわれる可能
性がある。
英国特許第1413938号は、コンパイラの出力の正しさを
テストする技術に関係している。これは最適化コンパイ
ラによつて生成されたコードの正しさをテストするため
に使う事もできる。しかしこの特許は、最適化コンパイ
ラが一般にどのようにしてコードを生成するかという
事、又はそれが最適化をいかにして達成するかについて
は何の関連もない。
米国特許第4277826号は仮想アドレス変換機構を維持す
るためにハツシングを用いている。本発明は、コンパイ
ルの過程で以前に出会つた計算を迅速に参照するために
ハツシングを用いるが、ハツシングは本発明の実施例に
おける些細な要素でしかない。
1984年8月13日付の米国特許出願第640283号は、計算に
関する基底を判定するという概念を導入する事によつ
て、表Iのコードを最適化する上での困難を避ける方法
を示している。共通化及びコード移動に必要なデータの
別の集まりが、基底から導き出される。その方法によれ
ば、標準的な大域的な共通化及びコード移動の際に、1
回だけの適用でコードの改善のための全ての機会を利用
する事が可能になる。
本発明は、構文解析及び中間言語コードの生成中に計算
の基底を容易に求める方法を開示する。また、潜在的に
冗長な計算が同じ記号レジスタに割り当てられるような
方式で、記号レジスタを非基底項目に割り当てる方法も
示す。
Cocke,J.及びMarkstein,P.,“Measurement of Progra
m Improvement Algorithms",Proc.IFIP Cong.'80,To
kyo,Japan Oct.6−9,1980,Helfourne australia Oc
t.14−17,1980,pp.221−228に説明されているPL/1Lコン
パイラは中間言語コード生成の時に同時に基底要素を判
定するという概念を開示していない。
E.問題点を解決するための手段 本発明は、構文解析及び中間言語コード生成の工程中
に、計算に関する基底が決定されるような最適化コンパ
イラを提供する。
また本発明によれば、非基底計算に関する形式的同一性
の概念が導入される。
さらに、基底要素に基づいて行なわれる同じ計算に常に
同じ名前が与えられるように、非基底計算(即ち非基底
計算を表わす形式的同一性)に名前が割り当てられる。
この方法においては、共通部分式削除の候補である計算
に同じ名前が与えられる。非基底計算の名前は本明細書
中では記号レジスタと呼ばれる。
すなわち記号レジスタとは、非基底計算の計算の結果を
保持するために割り当てられたレジスタであり、従って
それ自身、非基底項目として扱うことができる(当該計
算によって、基本ブロック内ではじめて定義される特性
を有するからである)。同じ形を有する冗長な計算に
は、同じ記号レジスタの名前が割り当てられるように構
成されている。
演算子とオペランドの列とから成る組に関する記号レジ
スタ又は形式的同一性が導き出される。
また、各々の基底要約毎に、基底要素の値に依存する非
基底計算(又は記号レジスタ)であるキル集合が計算さ
れる。
大域的な共通部分式の削除及びコード移動の手続き中に
使用される基底項目及びキル集合を生成するために最適
化コンパイラ内で動作可能な方法が開示される。より具
体的には、この方法は、計算されるべき各非基底要素に
下記のように記号レジスタを割り当てるステツプを含
む。即ち、コンパイラによつて機械命令に変換すべき各
計算毎に組(v)を形成し、コンパイルされるプログラ
ム中の全ての組に関する記入項目を有する表(ハツシユ
表が最適)を形成する。表の中に入れられる組の中のあ
らゆる基底要素毎に、その組に一意的に割り当てられた
記号レジスタがその基底要素に関するキル集合に付加さ
れる。表の中に入れられる組の中の非基底要素「n」毎
に、その組に関して一意的に割り当てられた記号レジス
タが、上記非基底要素「n」がそのキル集合中に現れる
全ての基底要素に関するキル集合に付加される。表の中
の組に対して割り当てられた記号レジスタは、非基底要
素の計算の結果を保持するために選ばれる。そして、最
後に、記号レジスタが与えられると、それが表わしてい
る計算が検索できるように、第2の表で構成される。
F.実施例 本発明は、プログラムを記憶するメモリとプログラム中
の命令を実行するプロセッサ部とを具備するコンピュー
タシステムにおいて、当該メモリ中のソース・プログラ
ムを取り出して目的プログラムを生成するコンパイラの
最適化フェーズにおいて実行される大域的なコードの最
適化方法に関する技術であり、コンパイルされるプログ
ラム中の計算に関する基底及び基底に関するキル集合を
構文解析及びコード生成時に判定できるような方法を提
供する。本発明を用いれば、コンパイラの初期のフエー
ズによつて形成されたプログラムを後で解析する事によ
つて基底及びキル集合を判定する事が不必要になる。
次に、本発明についての説明中で使われる多くの用語の
定義を与える。
基本ブロツク−外部からの最初の命令を経て入る事しか
できない命令の集合。基本ブロツク中の各命令は最後の
ものを除いて、基本ブロツク中に正確に1つの先行命令
及び後続命令を有している。これはまた直線的コードと
も呼ばれる。
中間言語−翻訳されるプログラムを表現するためにコン
パイラによつて使用される言語。これは通常、ソース言
語よりも低レベルであり、そしてターゲツト言語よりも
高レベルである。最適化コンパイラは、中間言語プログ
ラムを等価ではあるがより良い中間言語プログラムに変
換する。
基底−各基本ブロツクに関する基底は、その基本ブロツ
ク内で以前に定義される事なしにオペランドとして使わ
れる項目から成る。全ての基本ブロツクにわたるそのよ
うな項目の集まりは、そのプログラムに関する基底と呼
ばれる。
非基底−逆に、非基底項目とは、使用される以前にその
基本ブロツク内であらかじめ定義されていたオペランド
である。
キル集合−基底の各メンバー毎に、それに依存する非基
底項目の集合が、その基底要素のキル集合と呼ばれる。
基底要素が(再計算される事によつて)その値を変化さ
せたならば、キル集合の全てのメンバーは、その後再計
算される場合に異なつた値を受け取る。
説明を続けるために、次の項目を計算の基底と考える。
1.全てのユーザー変数及び全てのユーザー変数の記述
子。
2.データ・オブジエクトが割り当てられる実行時スタツ
フ及びヒープへのポインタ。
3.オブジエクト・コードへのポインタ。
4.式が計算される時に式の値を保持する、コンパイラに
よつて生成された区別された一時的変数。(そのような
一時的変数は、その一時的変数を計算するために使われ
たオペランドがその値を後に変化させたとしても、値が
変化しない。)例えば、次の命令を翻訳するために、 do i=a to b by c; 多く言語では、ループに入つた時点で、変数増分cが固
定される。例えcがループ内で変化したとしても、その
ような言語の意味論は、ループに入つた時点でcが持つ
ていた値が増分である事を要求する。従つてcのその初
期値は、区別された一時的変数内に保持される。
従つて、ユーザー変数が使用されるか、又はユーザー変
数の宣言に出会うか、又はユーザー変数が実行時に記述
子を要求するか、又は実行時環境に属するヒープ又はス
タツクに対する参照が行なわれるか、又はコンパイラが
区別された一時的変数を生成しなければならないか、又
はコンパイラがオブジエクト・コードの参照(即ち分岐
命令)を行なわなければならないかのいずれの原因によ
り、基底要素は、出会つた時に判定する事ができる。
非基底要素が計算される時に常に、下記のように記号レ
ジスタに割り当てられる。
1.非基底要素を計算するために使われるオペレーシヨン
・コードとオペランドとの組(tuple)が構成される。
2.この組が存在するかどうかが表(通常はハツシユ表と
して最も良く実現される)により検索される。
a.もしも組が見つからなければ、それは表の中に入れら
れ、割り当てられていない記号レジスタがその表記入項
目に割り当てられる。
従つてこの時、その組は表の中に見い出す事ができる。
b.表の中に入れられた組の中のあらゆる基底要素毎に、
その割り当てられた記号レジスタを、基底要素毎のキル
集合に加算する。
c.表の中に入れられた組の中のあらゆる非基底要素n毎
に、その割り当てられた記号レジスタを、その非基底要
素nが現れるキル集合に対応する全ての基底要素に関す
るキル集合に加算する。
3.表中の組に割り当てられた記号レジスタが、非基底要
素の計算の結果を保持するために選ばれる。
4.記号レジスタが与えられた時にそれが表現している計
算が検索できるように、第2の表が構成できる。
このようにして、2つの便利な表又はマツプが用意され
る。(ハツシユ表として最も良く実現される)1つの表
は、動作を記述した組から記号レジスタへの対応を与
え、第2の表は記号レジスタから動作を定義する組への
対応を与えている。
記号レジスタは、基底要素に基づく計算に関する「形式
的同一性」とみなす事ができる。記号レジスタの上記構
成によつて、各記号レジスタは、オペランドとして基底
要素を使用した特有の計算を表わしている。各記号レジ
スタは、それが表わしている計算中の基底要素毎のキル
集合のメンバーになる。
記号レジスタが基底から構成される方式のため、記号レ
ジスタがプログラム中で計算される場所に無関係に、記
号レジスタは常に同じ計算を表わす。従つて、記号レジ
スタは、大域的な共通部分式削除及びコード移動の自然
な対象物である。
第2図は従来周知の、コンパイラに関する非常に高レベ
ルの流れ図である。ブロツク1、2、4及び5は周知の
ものである。ブロツク3のコード最適化は、本発明が適
用されるコンパイラの動作のフエーズである。
第3図はそのような最適化コンパイラに関する最適化フ
エーズの流れ図である。ブロツク1、3及び4で行なわ
れる動作は周知である。ブロツク2は本発明が適用され
る最適化コンパイラの領域である。このブロツクは第4
図に詳しく示されている。
第4図はコンパイラの大域的共通化及びコード移動のフ
エーズに関する流れ図である。以前に述べたように、こ
の全体的な目的はコンパイラ設計において周知である。
この機能が実行される具体的な方式は、前記米国特許出
願第640283号に一般的に示されている。その特許出願に
は、全体的なコンパイル手続き並びに基底及びキル集合
の項目を求めるという概念、並びにUEX、DEX、THRUリス
トを決定するためにそれらの項目を使用するための手段
(本明細書の第4図のブロツク2参照)が詳細に議論さ
れ、説明されている。
また、第4図のブロツク3、4及び5は従来技術に属
し、参考のために示されている。従つて、基底及びキル
集合を決定するブロツク1の方法が本発明の対象であ
り、第1図に詳細に説明されている。
第1図は第4図のブロツク1の詳細な流れ図であり、こ
の工程で、プログラムを構成する各基本ブロツクに関す
る基底項目及びキル集合のリストが形成される。
この図のブロツク1は、各基本ブロツク毎に順次にコン
パイラ動作のこのフエーズに供給される組の系列の定義
である。
最初の実際の手続きステツプはブロツク2にある。ここ
では、システムが完全な組(v)のデータ内容から、あ
る通常の手段によつてハツシユ関数を計算する。周知の
ように、このハツシユ関数はある種の表又はメモリへの
アドレスとして使用され、その特定のアドレスにおける
データの存在がブロツク3でテストされる。もしも表の
中のアドレスが組vを含んでいれば、それはこの組が以
前に処理された事を意味し、システムはブロツク4に進
む。このブロツクは組vと記号レジスタrを関連付けさ
せる。従つて、ブロツク4の出力は記号レジスタのリス
トであり、その各々は組が異なれば本質的に異なつてい
る。明らかに、もし組が同一であれば、同じ記号レジス
タの指示が与えられる。
ブロツク3からの出力が「ノー」であれば、システムは
ブロツク5に進む。ここでは、ハツシユ表の適当なアド
レスに特定の組が記憶され、新しい記号レジスタrがそ
の組に割り当てられ、その組から導出されたハツシユ・
アドレスにおいてハツシユ表に記憶される。次にシステ
ムはブロツク6に進み、ここでその組に関するパラメー
タkが1にセツトされる。次にシステムはブロツク7に
進み、そこではレジスタkの現在の値が組vのオペラン
ドの数と比較される。これに関連して御注意願いたい事
は、特定の組の中のオペランドの数は事前に処理され組
と一緒にハツシユ表の中に記憶されているか、又は当業
者に明らかなようにブロツク7においてその場で計算し
得る事である。いずれにせよ、値kが組の中のオペラン
ドの数よりも大きい事が判明すれば、システムは組を評
価し終えた事を知り、ブロツク4へ分岐する。一方もし
値kが組の中のオペランドの数よりも小さいか又は等し
ければ、フローはブロツク8に続く。
ブロツク8において、k番目のオペランドが基底項目の
リスト中にあるかがテストされる。この基底項目のリス
トは第4図のブロツク1で計算されている。基底リスト
は前に述べたように中間言語リストから容易に導き出す
事ができる。もしk番目のオペランドが基底の中にある
事が判明すると、システムはブロツク9に分岐する。そ
こでは特定の記号レジスタrがk番目のオペランドのキ
ル集合に付加される。一方、もしオペランドが基底中に
見つからなければ、システムはブロツク10に進み、そこ
でキル集合のリストが調べられ、k番目のオペランドを
含んでいるもの毎に現在の組と関連付けられた記号レジ
スタrが付加される。ブロツク9及び10は共にブロツク
11に進む。ブロツク11は、全てのオペランドが評価され
た時にブロツク4への出口を与えるため又は次のオペラ
ンドを評価するためにシステムをインデツクスするため
にkの値を増加させる。
第1図についての上記の説明は、本発明の動作を機能的
に説明しており、記号レジスタが種々の組に割り当てら
れる方法及び特定のプログラム・シーケンス評価される
時に徐々にキル集合が形成されてゆく方法を示してい
る。
第1図に関するサブプログラムについての下記の説明は
本発明の動作のより詳細な説明である。
下記のPL/1サブプログラムは、非基底項目を計算するた
めの命令の記述を受け取り、結果を保持する記号レジス
タを返すコードを示している。また、このプログラムは
各基底項目毎にキル集合を構成し、そして記号レジスタ
によつて表現された命令が検索できるようなマツプを構
成する。
ある配列のサイズが決定される方法、配列が割り当てら
れる方法、及び配列のサイズが小さすぎるときにコンパ
イラが回復を行なう方法についての詳細はこの例示サブ
プログラムの中では扱われていない。これは、それらの
問題が本発明とは独立なものだからである。コンパイラ
の全体的な記憶管理方式に適合した標準的なスペース割
り当てアルゴリズムも、必要に応じて用いることができ
る。
プログラム例 Result:proc(v)returns(fixed bin); /*入力:パラメータv:非基底要素の計算につて記述し
たベクトル。v(1)はオペレーシヨン・コードであ
り、ベクトルvの他の全ての要素はオペランド、即ち記
号レジスタ又は基底要素のいずれかである。*/ dcl V(*)fixed bin, /*計算を記述したベクトル*/ 1 hash_table(0,*)controlled static externa
l, /*非基底項目の計算の速い索引のための表*/ 2 symbolic_register fixed bin, /*計算に対して与えられる記号レジスタ名*/ 2 start_index fixed bin, /*計算の記述を見つける場所*/ 2 instruction_size fixed bin, /*計算を記述するベクトルの長さ*/ kill(*,*)bit controlled external, /*i番目の行はi番目の基底要素に対応し、j番目の
列はj番目の非基底要素に対応する。kill(i,j)は、
記号レジスタjを計算するために、(直接又は間接に)
基底項目iが使われているか否かを示す。
operands(*)fixed bin controlled external, /*全ての形式的同一性をその中に保つ大きなベクト
ル。ハツシユ表は各々の同一性がどこで始まるか及びそ
の長さを示す。*/ formal_identity(*)fixed bin controlled exter
nal, /*記号レジスタからハツシユ表へのマツプ。これから
形式的同一性を見つけることができる。*/ top_of_list fixed bin external, /*割り当てるべきオペランド中の次のスロツト*/ new_symbolic_register fixed bin external, /*割り当てるべき次の記号レジスタ*/ ; hash=0; do i=1 to hbound(v,l); /*サーチされる計算のハツシユ関数を計算する。*/ hash=hash+v(i); end; table_size=hbound(hash_table,l); start=mod(hash,table_size); /*ハツシユ表中の計算に関するサーチを始める場所*
/ do i=start repeat mod(i+1,table_size)unti
l(mod(i+1,table_size)=start); /*i番目の形式的同一性がベクトル中に記述された命
令と一致するかどうかを検査する。最初に、i番目のス
ロツトが空であれば、i番目のスロツトにはまだ何もハ
ツシユされていず、従つてvは新しい計算を記述してい
る。*/ if symbolic_register(i)=0 then go to new
_computation /*次に、もし一致すれば、i番目の同一性はvによつ
て記述された命令と同じ長さを有していなければならな
い。*/ if instruction_size=hbound(v,l)then go to n
ext_i; /*最後に、vの各成分は、i番目の形式的同一性の各
成分と一致しなければならない。*/ do k=1 to hbound(v,l); j=start_index(i); if operands(k+j)=v(j)then go to next
_i; end; return(i); next_i: end; /*もしiに関するdoループが終端すれば、それはハツ
シユ表が一杯である事を意味する。この時は、放棄する
か又はハツシユ表拡張手続を適用する。このコードは本
発明とは独立なので、ここには示さない。*/ new_computation: /*サーチされる計算がそれまでに見つからなければ、
制御はこの点に到達する。計算は最初、ハツシユ表に入
り、記号レジスタを割り当てられる。変数new_symbolic
_registerは割り当てることのできる次の記号レジスタ
の番号を含んでいる。マツプformal_identityは記号レ
ジスタを定義するハツシユ表記入項目に記号レジスタを
対応づける。ハツシユ表から、記号レジスタが形式的に
表現している実際の計算を見つけることができる。*/ symbolic_register(i)=new_symbolic_register; formal_identity(symbolic_register(i))=i; new_symbolic_register=new_symbolic_register+1; j,start_index(i)=top_of_list; instruction_size(i)=hbound(v,l); top_of_list=top_of list+hbound(v,l); /*ハツシユ表中のこの記入項目に関して、計算記憶ヒ
ープ中のどこに、この計算のコピーが記憶されているか
を示す。*/ do k=1 to hbound(v,l); operands(k+j)=v(k); /*オペランドに関する要素をコピーする。*/ if k>1 then /*オペランドに関する要素をコピーする。*/ if in_basis(v(k))then /*基底に関するテスト*/ kill(v(k),symbolic_register(i))=′1′B; /*基底オペランドであれば、その基底項目に関するキ
ル集合中に記号レジスタを入れる。*/ eles /*基底項目でなければ、即ちオペランドが記号レジス
タならば、解析されている計算の結果を受け取る記号レ
ジスタが、記号レジスタ・オペランドv(j)を含む全
てのキル集合に入れられる。*/ kill(*,symbolic_register(i))= kill(*,formal identity(i))| kill(*,v(k)); end/*do k=1 to hbound(v,l)*/; return(symbolic_register(i)); in_basis:proc(x)returns(bit); /*このルーチンは、オペランドxが、コンパイルされ
るプログラムの基底中にあれば、真の論理値を返す。こ
れはオペランドがどのように符号化されるかに依存す
る。この例は、基素項目が負、非基底項目が正という仮
定のもとに符号化されている。実際の符号化はより複雑
であろう。*/ if x<0 then return(true); else return(false); end/*inーbasis*/; end;
【図面の簡単な説明】
第1図は本発明の1実施方法を示す流れ図、 第2図は最適化コンパイラの非常に高レベルの機能の流
れ図、 第3図は最適化コンパイラの最適化フエーズの流れ図、 第4図は最適化コンパイラの大域的な共通部分式の削除
及びコード移動のアルゴリズムの流れ図である。
───────────────────────────────────────────────────── フロントページの続き (56)参考文献 中田 育男著、「コンピューター サイ エンス・ライブラリー コンパイラ」(昭 56−9−10)産業図書株式会社、P.237 −241,247−250

Claims (1)

    【特許請求の範囲】
  1. 【請求項1】プログラムを記憶する記憶部とプログラム
    中の命令を実行するプロセッサ部とを具備するコンピュ
    ータシステム上で、該記憶部中のソース・プログラムを
    取り出して目的プログラムを生成するコンパイラにおい
    て、基底項目(基本ブロック内で実行される計算のオペ
    ランドのうち、その値を先行する計算の結果に依存しな
    いオペランド。依存するものは非基底項目という)及び
    該基底項目のキル集合(所定の基底項目にその値を依存
    する非基底項目の集合)を用いてコード最適化を行う方
    法において、該キル集合のリストを生成するために、 (a)プログラム中の上記基底項目のリストを生成する
    ステップと、 (b)上記コンパイラによって機械命令に変換される各
    計算毎に、該計算に必要なオペレーションコード及びオ
    ペランドからなる組を形成するステップと、 (c)コンパイルされるプログラム中の各組と記号レジ
    スタとの対応を与えるハッシュ表において、形成した上
    記組が含まれているかどうかを判定し、含まれていなか
    った場合には該組をハッシュ表に入れて新たな記号レジ
    スタを割り当てるステップと、 (d)ハッシュ表に入れられる上記組中のオペランドが
    基底項目であることが上記基底項目リストから判別され
    た場合、それぞれの基底項目について、この組に割り当
    てられた記号レジスタを該基底項目のキル集合に付加す
    るステップと、 (e)ハッシュ表に入れられる上記組中のオペランドが
    非基底項目であることが判別された場合、それぞれの非
    基底項目について、該組に割り当てられた記号レジスタ
    を、該非基底項目をキル集合として含む全ての基底項目
    のキル集合に付加するステップとを具備する、 コード最適化方法。
JP60174440A 1984-08-13 1985-08-09 コード最適化方法 Expired - Lifetime JPH0695310B2 (ja)

Applications Claiming Priority (2)

Application Number Priority Date Filing Date Title
US06/640,285 US4642764A (en) 1984-08-13 1984-08-13 Method of developing formal identities and program bases in an optimizing compiler
US640285 1984-08-13

Publications (2)

Publication Number Publication Date
JPS6149241A JPS6149241A (ja) 1986-03-11
JPH0695310B2 true JPH0695310B2 (ja) 1994-11-24

Family

ID=24567627

Family Applications (1)

Application Number Title Priority Date Filing Date
JP60174440A Expired - Lifetime JPH0695310B2 (ja) 1984-08-13 1985-08-09 コード最適化方法

Country Status (4)

Country Link
US (1) US4642764A (ja)
EP (1) EP0171592B1 (ja)
JP (1) JPH0695310B2 (ja)
DE (1) DE3582974D1 (ja)

Families Citing this family (28)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPS6325733A (ja) * 1986-07-18 1988-02-03 Hitachi Ltd コンパイラ処理方式
JP2539385B2 (ja) * 1986-08-08 1996-10-02 株式会社日立製作所 情報処理装置
JP3053092B2 (ja) * 1987-06-05 2000-06-19 株式会社日立製作所 並列化コンパイル方法
US5193190A (en) * 1989-06-26 1993-03-09 International Business Machines Corporation Partitioning optimizations in an optimizing compiler
WO1991001530A2 (en) * 1989-07-11 1991-02-07 Bell Communications Research, Inc. Methods and apparatus for checking the integrity of data base data entries
US5428793A (en) * 1989-11-13 1995-06-27 Hewlett-Packard Company Method and apparatus for compiling computer programs with interproceduural register allocation
CA2010067C (en) * 1990-02-14 1993-10-26 Steven Murray Hoxey Reducing pipeline delays in compilers by code hoisting
US5107418A (en) * 1990-06-11 1992-04-21 Supercomputer Systems Limited Partnership Method for representing scalar data dependences for an optimizing compiler
US5307492A (en) * 1991-03-07 1994-04-26 Digital Equipment Corporation Mapping assembly language argument list references in translating code for different machine architectures
US5598560A (en) * 1991-03-07 1997-01-28 Digital Equipment Corporation Tracking condition codes in translation code for different machine architectures
US5339428A (en) * 1991-09-04 1994-08-16 Digital Equipment Corporation Compiler allocating a register to a data item used between a use and store of another data item previously allocated to the register
US5469572A (en) * 1992-12-01 1995-11-21 Taylor; James M. Post compile optimizer for linkable object code
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
JPH0721033A (ja) * 1993-07-07 1995-01-24 Nec Corp 言語処理装置及びその方法
US5613121A (en) * 1994-10-19 1997-03-18 International Business Machines Corporation Method and system of generating combined storage references
US5802375A (en) * 1994-11-23 1998-09-01 Cray Research, Inc. Outer loop vectorization
JP3865775B2 (ja) * 1995-04-11 2007-01-10 キネテック インコーポレイテッド データ処理システムにおけるデータの識別
US6202203B1 (en) * 1995-12-06 2001-03-13 International Business Machines Corporation Method of, system for, and computer program product for providing global value numbering
US6035124A (en) * 1995-12-06 2000-03-07 International Business Machines Corporation Method of, system for, and computer program product for providing extended global value numbering
US6077314A (en) * 1995-12-06 2000-06-20 International Business Machines Corporation Method of, system for, and computer program product for providing improved code motion and code redundancy removal using extended global value numbering
US6158048A (en) * 1998-05-29 2000-12-05 Intel Corporation Method for eliminating common subexpressions from java byte codes
US6351849B1 (en) * 1999-05-21 2002-02-26 Intel Corporation Compiler optimization through combining of memory operations
US6779106B1 (en) 2000-09-28 2004-08-17 International Business Machines Corporation Apparatus and method for an enhanced integer divide in an IA64 architecture
US6799262B1 (en) 2000-09-28 2004-09-28 International Business Machines Corporation Apparatus and method for creating instruction groups for explicity parallel architectures
US6883165B1 (en) 2000-09-28 2005-04-19 International Business Machines Corporation Apparatus and method for avoiding deadlocks in a multithreaded environment
US6886094B1 (en) 2000-09-28 2005-04-26 International Business Machines Corporation Apparatus and method for detecting and handling exceptions
US6912647B1 (en) 2000-09-28 2005-06-28 International Business Machines Corportion Apparatus and method for creating instruction bundles in an explicitly parallel architecture
US7366914B2 (en) * 2003-08-29 2008-04-29 Intel Corporation Source code transformation based on program operators

Family Cites Families (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US4567574A (en) * 1983-03-14 1986-01-28 International Business Machines Corporation Optimizing cobol object code instruction path length with respect to perform statements

Non-Patent Citations (1)

* Cited by examiner, † Cited by third party
Title
中田育男著、「コンピューターサイエンス・ライブラリーコンパイラ」(昭56−9−10)産業図書株式会社、P.237−241,247−250

Also Published As

Publication number Publication date
EP0171592B1 (en) 1991-05-29
JPS6149241A (ja) 1986-03-11
DE3582974D1 (de) 1991-07-04
US4642764A (en) 1987-02-10
EP0171592A2 (en) 1986-02-19
EP0171592A3 (en) 1988-07-06

Similar Documents

Publication Publication Date Title
JPH0695310B2 (ja) コード最適化方法
US5815720A (en) Use of dynamic translation to collect and exploit run-time information in an optimizing compilation system
EP0171631B1 (en) A method for performing global common subexpression elimination and code motion in an optimizing compiler
Paleczny et al. The java {HotSpot™} server compiler
KR101107797B1 (ko) 프로그램 코드 변환을 위한 공유 코드 캐싱 방법 및 장치
US7725883B1 (en) Program interpreter
Chow A portable machine-independent global optimizer--Design and measurements
US6317869B1 (en) Method of run-time tracking of object references in Java programs
US5966539A (en) Link time optimization with translation to intermediate program and following optimization techniques including program analysis code motion live variable set generation order analysis, dead code elimination and load invariant analysis
US6721943B2 (en) Compile-time memory coalescing for dynamic arrays
EP0273130B1 (en) Reassociation process for code optimization
Freudenberger et al. Experience with the SETL optimizer
JP2007531075A5 (ja)
WO1993025964A1 (en) Computer program debugging in the presence of compiler synthesized variables
Johnston The dynamic incremental compiler of APL\3000
JP2000035893A (ja) デ―タ処理システムの配列の静的初期化方法、デ―タ処理方法、並びにデ―タ処理システム及びその制御手順をコンピュ―タに実行させるプログラムを記憶したコンピュ―タ読み取り可能な記憶媒体
GB2404043A (en) Shared code caching for program code conversion
US6347318B1 (en) Method, system, and apparatus to improve performance of tree-based data structures in computer programs
US6016398A (en) Method for using static single assignment to color out artificial register dependencies
US20030079210A1 (en) Integrated register allocator in a compiler
US7568191B2 (en) Method and apparatus for superword register value numbering
Krall et al. Fast Prolog with a VAM1P based Prolog compiler
US7565646B2 (en) Method for compression of object code interpreted by tree-structured expression factorization
Terashima et al. HLisp—its concept, implementation and applications
Liu A New Compiler Framework based on Superword Level Parallel