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

コード最適化方法

Info

Publication number
JPS6149241A
JPS6149241A JP60174440A JP17444085A JPS6149241A JP S6149241 A JPS6149241 A JP S6149241A JP 60174440 A JP60174440 A JP 60174440A JP 17444085 A JP17444085 A JP 17444085A JP S6149241 A JPS6149241 A JP S6149241A
Authority
JP
Japan
Prior art keywords
base
code
register
compiler
symbol
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.)
Granted
Application number
JP60174440A
Other languages
English (en)
Other versions
JPH0695310B2 (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 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)

Abstract

(57)【要約】本公報は電子出願前の出願データであるた
め要約のデータは記録されません。

Description

【発明の詳細な説明】 A、産業上の利用分野 本発明は、コードの品質を改善するために最適化アルゴ
リズムを用いたコンパイラに特に有用である。よシ具木
的には、大域的な共通部分式の削除及びコード移動のた
めに「基底」項目の概念を用いる時、本発明は、中間コ
ード生成の工程中に「基底」を求めるための最適な方法
を提供するっB、開示の概要 大域的な共通部分式の削除及びコード移動の手続λ中に
使用される基底項目及びキル集合を生成するために最適
化コンパイラ内で動作可能な方法が開示される。より具
体的には、この方法は、計算されるべき各非基底要素に
下記のように記号レジスタを割り当てるステップを含む
。即ち、コンパイラによって機械命令に変換すべき各計
算毎に徂(v)Q形成し、コノパイルされるプログラム
中の全ての組に関する記入項目を有する表(ハノノユ表
が最適)を形成する。表の中に入れられる組の中のあら
ゆる基底要素毎に、その組に一意的に割り当てられた記
号レジスタがその基底要素に関するキル集合に付加され
る。表の中に入れられるg目の中の非基底要素「nJ毎
に、その組に関して一意的に割り当てられた記号レジス
タが、上記非基底要素「n」がそのキル集合中に現れる
全ての基底要素に関するキル集合に付加されるう表の中
の組に対i−て割り当てられた記号レジスタは、非基底
要素の計算の結果を保持するために選ばれる。そして、
最後に、記号レジスタが与えられると、それが表わして
いる計算が検索できるように、第2の表が構成されるっ C4従来技術 ]ンパイラによって生成されるコードの品質は、最初の
コンパイラが作成されて以来、議論の対象であった。I
BMのFOR,TR,AN  Iコンパイラ(最初の商
業的に利用可能なコンパイラ)の主要な目的の1つは、
アセンブリ言語のプログラマが手でコーディングする事
によって直接的に作成されたコードに対してコード品質
において匹敵するオブジェクト・コードを、科学技術計
算の分野において、生成する事であった。
今日、計算機が利用可能なあらゆる分野において使用さ
れるように種々の高水準言語が設計されているう最初の
FOR,TRAN言語でさ對、も、広範囲のプログラミ
ング・タスクに適用できるようにするために機能強化が
行なわれてきている。しかしながら、コンパイラによっ
て生成されるコードの品質は、特に結果として生じるコ
ードが生産環境で使用される場合には、高い事が依然と
して重要である。有能なアセンブリ言語プログラマによ
って作成されるコードは、依然として、コンパイラの生
成したコードの比較基準である。
1950年代以来、コンパイラの生成するコードの品質
を改善するために、多数の最適化技術が開発され改良さ
れてきた。実際、これらの最適化の多くは、最初のFO
R,TRANコンパイラを作成したチームによって原理
的には知られ且つある方式で用いられていた。
最適化コンパイラにおいてしばしば採用される最適化技
術には、共通部分式の消去、高い実行頻度の場所から低
い実行頻度の場所へのコードの移動、無用コードの消去
、遅い動作から等価な速い動作への置きかえ、及び定数
伝播が含まれる。これらの@適化技術についての説明は
、下記の文献に見い出される。
、J、T、ンユ!7 /l/ ッ(Schwartz 
) 、  「プログラミングについて一8ETL言語に
関する中間報告。
第2部:5ETL言語とその使用例(Onprogra
mming−An Interim Report o
n theSBTL  Language、 In5t
a!1rnent fl : TheSETL  La
nguage and Examples of It
sUse ) J、Courant In5titut
e of MathSciences、 NYU、 1
983年発行、293〜31O頁。
E、モレル外(g、Morel  and C,Ren
voise )、[部分的な冗長性の抑圧による大域的
な最適化(Global Optimization 
by 8uppressi、onof Partial
 Redundancies ) J 、 CACM、
第22巻、第2号、96〜103頁、(1979年)。
A、エイホ、J、ウルマン(A、Aho、J 、Ul 
1man)、「コンパイラ設計の原理(Pr1ncip
les ofCompiler Design ) J
、アデインンーウエスレ−(Addison−Wesl
ey )社、1977年発行。
大域的な共通部分式の消去及びコードの移動は最も重要
な最適化技術に属する。測定結果によれば、これらの最
適化は他の最適化技術のどれよりも大きな影響をコード
の改善に対して有する。多くの文献がこの最適化をいか
にして行なうかを説明している。上記引用文献の最初の
2つは、元のコードを冗長なものにし消去できるように
するためにプログラム中にコードのコピーが挿入される
べき場所をいかにして決定するかについてすぐれた説明
を含んでいる。また、これらの文献は冗長なコードの存
在する場所を判定する方法についても説明している。そ
の方法は、基本ブロックを1度に1つづつ調査する事に
よって決定し得るある特注についての知識及びプログラ
ムのフロー・グラフに依存している。それらの特性は次
のようなものである。
DEX 下方に露出された式(downwardexp
osed expressions )基本ブロックの
終りに実行された場合に、「本来の場所」即ち基本ブロ
ック中にそれらが存在する場所で実行された時と同じ結
果を与える計算の集まり。
UEX  上方に露出された式(upward exp
osedexpressions ) 基本ブロックの始めに実行された場合に「本来の場所」
で実行された時と同じ結果を与える計算の集まり。
THI(、U  基本ブロックの始め又は終シに計算き
れた場合に同じ結果を与える計算の集まり。
上記参考文献は、上述の集まりが基本ブロック毎に知ら
れているという前提に基いて、いかに大域的な共通部分
式の消去やコードの移動を行なうかを説明している。特
に、これらの参考文献は、集合DEX、UEX及びT 
HR,Uに基いて、コード移動の効果を達成するために
、ある基本ブロックの終りに挿入すべき計算の集合及び
基本ブロックへの入口において既に利用可能な計算の集
合を計算する方法を説明している。これらの計算は当業
者に周知のものである。
D、従来技術の問題点 しかしながら、UEX、DEX及びT Hrl、 Uを
計算する時に注意を払わなければ、共涌化及びコード移
動のアルゴリズムは、関係した計算のシーケンスの最初
の部分しか共通化及び/又は移動しない可能性がある。
例えば表■のコード断片を考察する。
表■ 表I中のコードより成る基本ブロックに関して、R,1
02の計算(動作3)をUEXに含めない事は容易であ
る。というのは基本ブロックに入った時にR・100及
びR・101は、ADD命令に出合った時と同じ値を持
っていない可能性があるからである。しかし例えば、も
し表Iが、A及びBが変化しないような内部ループ中の
コードであれば、動作1及び動作2は明らかにUEX 
(これはコード移動を決定する時の道具になる集合であ
る)に属する。この時、コード移動及び共通化を適用し
た後、動作3は依然としてループ中にとどまり、それを
ループ外に移動させようとすれば他のアルゴリズムの適
用が必要であろう。
次にいくつかの従来技術を概観する。
米国特許第4309756号は、ある論理的計算を評価
する方法を開示しているうそこに開示された概念はスコ
ープが狭く、1982年に発行された特許としては時代
錯誤的である。これは、イ・−ミ/グ計算について何ら
明らかにする事はなく従って同じ名前に冗長な計算が行
なわれる可能性がある。
英国特許第1413’938号は、コンパイラの出力の
正しさをテストする技術に関係している。
これは最適化コンパイラによって生成されたコードの正
しさをテストするために使う事もできる。
しかしこの特許は、最適化コンパイラが一般にどのよう
にしてコードを生成するかという事、又はそれが最適化
をいかにして達成するかについては何の関連もない。
米国特許第4277826号は仮想アドレス変換機構を
維持するためにハツシングを用いている。
本発明は、コンパイルの過程で以前に出会った計算を迅
速に参照するためにノ・ツシングを用いるが、・・ツ7
ングは本発明の実施例における些細な要素でしかない。
1984年8月13日付の米国特許出願第640283
号は、計算に関する基底を判定するという概念を導入す
る事によって、表■のコードを最適化する上での困難を
避ける方法を示している。
共通化及びコード移動に必要なデータの別の集まりが、
基底から導き出される。その方法によれば、標準的な大
域的な共通化及びコード移動の際に、1回だけの適用で
コードの改善のための全ての機会を利用する事が可能に
なる。
本発明は、構文解析及び中間言語コードの生成中に計算
の基底を容易に求める方法を開示する。
また、潜在的に冗長な計算が同じ記号レジスタに割り当
てられるような方式で、記号レジスタを非基底項目に割
り当てる方法も示す。
Cocke、 J、及びMarkstein、 P、、
 ” Measurement ofProgram 
Improvement Algorithms”、 
Proc、 IFIPCong−80、Tokyo、J
apan Oct、 6−9.1980.He1fou
rneaustralia Oct、 14−17.1
980.pp、 221−228に説明されているPL
/LLコンパイラは中間言語コード生成の時に同時に基
底要素を判定するという概念を開示していない。
E0問題点を解決するための手段 本発明は、構文解析及び中間言語コード生成の工程中に
、計算に関する基底が決定されるような  ゛最適化コ
ンパイラを提供する。
また本発明によれば、非基底計算に関する形式的同一性
の概念が導入される。
さらに、基底要素上で行なわれる同じ計算に常に同じ名
前が与えられるように、非基底計算(即ち非基底計算を
表わす形式的同一性)に名前が割り当てられる。この方
法においては、共通部分式削除の候補である計算に同じ
名前が与えられる。
非基底計算の名前は本明細書中では記号レジスタと呼ば
れる。
演算子とオペランドの列とから成る組に関する記号レジ
スタ又は形式的同一性が導き出される。
また、各々の基底要素毎に1基底要素の値に依存する非
基底計算(又は記号レジスタ)であるキル集合が計算さ
れる。
大域的な共通部分式の削除及びコード移動の手続き中に
2用きれる基底項目及びキル集合を生成するために最適
化コンパイラ内で動作可能な方法が開示されるうより具
体的には、この方法は、計算をれるべき各非基底要素に
下記のように記号レジスタを割り当てるステップを含む
。即ち、コンパイラによって機械命令に変換すべき各計
算毎に組(V)を形成し、コンパイルされるプログラム
中の全ての組に関する記入項目を有する表(ハツシュ表
が最適)を形成する。表の中に入れられる組の中のあら
ゆる基底要素毎に、その組に一意的に割り当てられた記
号レジスタがその基底要素に関するキル集合に付加され
るっ表の中に入れられる組の中の非基底要素1’−nJ
毎に、その組に関して一意的に割り当てられた記号レジ
スタが、上記非基底要素rnJがそのキル集合中に現れ
る全ての基底要素に関するキル集合に付加される。表の
中の組に対して割り当てられた記号レジスタは、非基底
要素の計算の結果を保持するために選ばれる。そして、
最後に、記号レジスタが4斤−られると1それが表わし
ている計算が検索できるように、第2の表で構成される
っ F、実施例 本発明は、コンパイルされるプログラム中の計算に関す
る基底及び基底に関するキル集合を構文解析及びコード
生成時に判定できるような方法を提供する。本発明を用
いれば、コンパイラの初期のフェーズによって形成され
たプログラムを後で解析する事によって基底及びキル集
合を判定する事が不必要になる。
次に、本発明についての説明中で使われる多くの用語の
定義を与える。
基本ブロック −外部から骨切の命令を経て入る事しか
できない命令の集合。基本ブロック中の各命令は最後の
ものを除いて、基本ブロック中に正確に1つの先行命令
及び後続命令を有している。
これはまた直線的コードとも呼ばれる。
中間言語−翻訳されるプログラムを表現するためにコン
パイラによって使用される言語。これは通常、ソース言
語よシも低レベルであシ、そしてターゲット言語よりも
高レベルである。最適化コンパイラは、中間言語プログ
ラムを等価ではあるがより良い中間言語プログラムに変
換する。
基底−各基本ブロックに関する基底は、その基本ブロッ
ク内で以前に定義される事なしにオペランドとして使わ
れる項目から成る。全ての基本ブロックにわたるそのよ
うな項目の集まシは、そのプログラムに関する基底と呼
ばれる。
非基底−逆に、非基底項目とは、使用される以前にその
基本ブロック内であらかじめ定義されていたオペランド
である。
キル集合−基底の各メンバー毎に、それに依存する非基
底項目の集合が、その基底要素のキル集合と呼ばれる。
基底要素が(再計算される事によって)その値を変化さ
せたならば、キル集合の全てのメンバーは、その後再計
算される場合に異なった値を受は取る。
説明を続けるために、次の項目を計算の基底と考える。
l 全てのユーザー変数及び全てのユーザー変数の記述
子。
2、データ・オブジェクトが割9尚てられる実行時スタ
ッフ及びヒープへのポインタ。
3、 オブジェクト・コードへのポインタ。
4 式が計算される時に式の値を保持する、コンパイラ
によって生成された区別された一時的変数。(そのよう
な一時的変数は、その一時的変数を計算するために使わ
れたオペランドがその値を後に変化させたとしても、値
が変化しない。)例えば、次の命令を翻訳するために、 do  i=a  to  b  by  c :多く
言語では、ループに入った時点で、変数増分Cが固定さ
れる。例えCがループ内で変化したとしても、そのよう
な言語の意味論は、ループに入った時点でCが持ってい
た値が増分である事を要求する。従ってCのその初期値
は、区別された一時的変数内に保持される。
従って、ユーザー変数が使用されるか、又はユーザー変
数の宣言陀出会うか、又はユーザー変数が実行時に記述
子を要求するか、又は実行時環境に属するヒープ又はス
タックに対する参照が行なわれるか、又はコンパイラが
区別された一時的変数を生成しなければならないか、又
はコンパイラがオブジェクト・コードの参照(即ち分岐
命令)を行なわなければならないかのいずれかの原因に
より、基底要素は、出会った時に判定する事ができる。
非基底要素が計算される時は常に、下記のように記号レ
ジスタに割り当てられるっ 1 非基底要素を計算するために使われるオペレーショ
ン・コードとオペランドとの組(tuple)が構成さ
れる。
2、 この組が存在するかどうがが表(通常はハツシュ
表として最も良く実現きれる)により検索される。
a、もしも組が見つからなければ、それは表の中に入れ
られ、割り当てられていない記号レジスタがその表記大
項目に割り当てられるっ従ってこの時、その絹は表の中
に見い出す事ができる。
51表の中に入れられた組の中のあらゆる基底要素毎に
、その割り当てられた記号レジスタを、基底要素毎のキ
ル集合に加算する。
C1表の中に入れられた組の中のあらゆる非基底要素n
毎K、その割り当てられた記号レジスタを、その非基底
要素nが現れるキル集合に対応する全ての基底要素に関
するキル集合に加算する。
3、 表中の組に割υ当てられた記号レジスタが、非基
底要素の計算の結果を保持するために運ばれる。
4 記号レジスタが与えられた時にそれが表現している
計算が検索できるように、第2の表が構成できる。
このようにして、2つの便利な表又はマツプが用意され
る。(・・ソシュ表として最も良く実現される)1つの
表は、動作を記述した組から記号レジスタへの対応を与
え、第2の表は記号レジスタからgJ作を定義する組へ
の対応を与えている。
記号レジスタは、基底要素に対する計算に関する「形式
的同一性」とみなす事ができる。記号レジスタの上記構
成によって、各記号レジスタは、オペランドとして基底
要素を使用した特有の計算を表わしている。各記号レジ
スタは、それが表わしている計算中の基底要素毎のキル
集合のメンバーになる。
記号レジスタが基底から構成される方式のため、記号レ
ジスタがプログラム中で計算される場所に無関係に、そ
れらは常に同じ計算を表わす。従って、それらは、大域
的な共通部分式削除及びコード移動の自然な対象物であ
る。
第2図は従来周知の、コンパイラに関する非常に高レベ
ルの流れ図である。ブロック1.2.4及び5は周知の
ものであるうブロック3のコード最適化は、本発明が適
用されるコンパイラの動作のフェーズである。
第3図はそのような最適化コンパイラに関する最適化フ
ェーズの流れ図である。ブロック1.3及び4で行なわ
れる動作は周知である。ブロック2は本発明が適用され
る最適化コンパイラの領域である。このブロックは第4
図に詳しく示されている。
第4図はコンパイラの大域的共通化及びコード移動のフ
ェーズに関する流れ図である。以前に述べたように、こ
の全体的な目的はコンパイラ設計において周知である。
この機能が実行される具体的な方式は、前記米国特許出
願第640283号に一般的に示されている。その特許
出願には1全体的なコンパイル手続き並びに基底及びキ
ル集合の項目を求めるという概念、並びにUEX、DE
X、THRUIJストヲ決定するためにそれらの項目を
使用するための手段(本明細書の第4図のブロック2参
照)が詳細に議論され、説明されているう また、第4図のブロック3.4及び5は従来技術に萬し
、参考のために示されている。従って、基底及びキル集
合を決定するブロック1の方法が本発明の対象であり、
第1図に詳細に説明されている。
第1図は第4図のブロック1の詳細な流れ図であり、こ
の工程で、プログラムを構成する各基本ブロックに関す
る基底項目及びキル集合のリストが形成てれる。
この図のブロック1は、各基本ブロック毎に順次にコン
パイラ動作のこのフェーズに供給される組の系列の定義
である。
最初の実際の手続きステップはブロック2にある。ここ
では、/ステムが完全な組(V)のデータ内容から、あ
る通常の手段によってハツシュ関数を計算する。周知の
ように、このハツシュ関数はある種の表又はメモリへの
アドレスとして使用され、その特定のアドレスにおける
データの存在がブロック3でテストされる。もしも表の
中のアドレスが組■を含んでいれば、それはこの組が以
前に処理された事を意味し、システムはブロック4に進
む。このブロックは組Vと記号レジスタrを関連付けさ
せる。従って、ブロック4の出力は記号レジスタのリス
トであり、その各々は組が異なれば本質的に異なってい
る。明らかに、もし組が同一であれば、同じ記号レジス
タの指示が与えられる。
ブロック3からの出力が「ノー」で、!bしt、−1’
、 システムはブロック5に進む。ここでは、ハッ′/
ユ表の適当なアドレスに特定の組が記憶され、新しい記
号レジスタrがその組に割り当てられ、その組から導出
されたハツシュ・アドレスにおいてハツシュ表に記憶さ
れる。次にシステムはブロック6に進み、ここでその組
に関するパラメータkが1にセットされる。次にシステ
ムはブロック7に進み、゛そこではレジスタにの現在の
値が組Vのオペランドの数と比較される。これに関連し
て御庄意願いたい事は、特定の組の中のオペランドの数
は事前に処理され組と一緒にハツシュ表の中に記憶され
ているか、又は当業者に明らかなようにブロック7にお
いてその場で計算し得る事である。
いずれにせよ、(直kが糸且の中のオペランドの数より
も大きい事が判明すれば、システムは組を評価し終えた
事を知り、ブロック4へ分岐する。一方もし値1(が組
の中のオペランドの数よりも小さいか又は等しければ、
フローはブロック8に続く。
ブロック8において、k番目のオペランドが基底項目の
リスト中にあるかがテストされる。この基底項目のリス
トは第4図のブロック1で計算されている。基底リスト
は前に述べたように中間言語リストから容易に導き出す
事ができるうもしに番目のオペランドが基底の中にある
事が判明すると、システムはブロック9に分岐する。そ
こでは特定の記号レジスタrが1(番目のオペランドの
キル集合に付加される。一方、もしオペランドが基底中
に見つからなければ、システムはブロック10に進み、
そこでキル集合のリストが調べられ、k番目のオペラン
ドを含んでいるもの毎に現在の組と関連付けられた記号
レジスタrが付加される。
ブロック9及び10は共にブロック11に進む。
ブロック11は、全てのオペランドが評価された時にブ
ロック4への出口を与えるため又は次のオペランドを評
価するために/ステムをインデックスするために1(の
値を増加させる。
第1図についての上記の説明は、本発明の動作を機能的
に説明してお9、記号レジスタが種々の組に割り当てら
れる方法及び特定のプログラム・シーケンスが評価され
る時に徐々にキル集合が形成されてゆく方法を示してい
るう 第1図に関するサブプログラムてついての下記の説明は
本発明の動作のより詳細な説明である。
下記のPL/1サブプログラムは、非基底項目を計算す
るための命令の記述を受は取り、結果を保持する記号レ
ジスタを返すコードを示している。
また、このプログラムは各基底項目毎にキル集合を構成
し、そして記号レジスタによって表現された命令が検索
できるようなマツプを構成する。
ある配列のサイズが決定される方法、配列が割り当てら
れる方法、及び配列のサイズが小さすぎるときにコンパ
イラが回復を行なう方法についての詳細はこの例示すブ
プログラムの中では扱われていない。これは、それらの
問題が本発明とは独立なものだからであろうコンパイラ
の全体的な記憶管理方式に適合した標準的なスペース割
り尚でアルゴリズムも、必要に応じて用いることができ
るう R,esult :proc(v)  returns
(fixed bin) ;/*入カニパラメータV:
非基底要素の計算にって記述したベクトル。■(1)は
オペレーション・コードであり、ベクトルVの他の全て
の要素はオペランド、即ち記号レジスタ又は基底要素の
いずれかである。*/ el V(*)  fixed bin。
/*計算を記述したベクトル*/ 1 hash table(0,+s)  contr
olled 5taticexternal。
/*非基底項目の計算の速い索引のための表*/ 2 symbolic register fixed
 bin。
/*計算に対して与えられる記号レジスタ名*/ 25tart 1ndex fixed bin。
7本計算の記述を見つける場所*/ 21nstruction 5ize fixed b
in。
/*計算を記述するベクトルの長さ*/kil!(*、
 *)  bit controlled exter
nal。
/*i番目の行は1番目の基底要素に対応し、j番目の
列はj番目の非基底要素に対応する。
kill(i、j>  は、記号レジスタjを計算する
ために、(直接又は間接に)基底項目が使われているか
否かを示す。
operands(*)  fixed bin co
ntrolledexternal。
/*全ての形式的同一性をその中に保つ大きなベクトル
。ハツシュ表は各々の同一性がどこで始まるか及びその
長ざを示す。本/formal  1dentity(
本)  fixed  bincontrolled 
external。
/*記号レジスタからハツシュ表へのマツプ。
これから形式的同一性を見つけることができる。*/ lop of 1ist fixed bin ext
ernal。
/*割り当てるべきオペランド中の次のスロッ ト *
/ new symbolic register fix
ed binexternal。
/*割り当てるべき次の記号レジスタ*/hash=Q
; do i=1 to hbound(v、 l) ;/
*サーチされる計算の・・ツシュ関数を計算する。率/ hash=hash+v(i) : end ; start=mod(hash、 table 5iz
e) ;/*ハツンユ表中の計算に関するサーチを始め
る場所*/ do 1=start repeat mod(i+1
. tablesize) until  (mod(
i+1. table−size)=start ) 
; /*i番目の形式的同一性がベクトル中に記述された命
令と一致するかどうかを検査するっ最初に、1番目のス
ロットが空であれば、1番目のスロットにはまだ何もハ
ツシュされていす、従っでVは新しい計算を記述してい
る。*/−:(symbolic  register
(i) =Othengo  to new comp
utation/*次に、もし一致すれば、1番目の同
一性ばVによって記述された命令と同じ長さを有してい
なければならない。*/ if 、1nstruction 5ize  =hb
ound(v、 I)then go to next
 i ;/*最後に、■の各成分は、1番目の形式的同
一性の各成分と一致しなければならない。*/ do k=1  to  hbound(v、I);j
=start  1ndex(i) ;if  ope
rands(k−1−j)  =v(j)then  
g。
to  next  i  ; end  ; return(i); nexti: end  ; /*もし■に関するdOループが終端すれば、それはハ
ツシュ表が一杯である事を意味する。
この時は、放棄するか又はハツシュ表拡張手続を適用す
る。このコードは本発明とは独立なので、ここには示さ
ないウ */ new computation : /*サーチされる計算がそれまでに見つからなければ、
制御はこの点に到達する。計算は最初、ハツシュ表に入
シ、記号レジスタを割り当てられる。変数new sy
mbolic−registerは割り当てることので
きる次の記号レジスタの番号を含んでいる。マツプfo
rmal  1dentityは記号レジスタを定義す
るハツシュ表記入項目に記号レジスタを対応づける。ハ
ツシュ表から、記号レジスタが形式的に表現している実
際の計算を見つけることができる。*/ symbol ic register(i) =ne
w symbol ic−register ; formal identity(symbolic 
register(i))=I ; new symbolic register=new
 symbolic−register+1 : j、 5tart  1ndex(i) =top 6
f 1ist ;1nstruction 5ize(
i) =hbound(v、 I) ;top of 
1ist=top of l1st+hbound(v
、 l) ;/*ハツシュ表中のこの記入項目に関して
、計算記憶ヒープ中のどこに、この計算のコピーが記憶
きれているかを示す。*/ do k=1 to hbound(v、 l) ;o
perands(k+j)=V(k) :/*オペラン
ド例関する要素をコピーする。
*/ if  k  >  1  then /*オペランドに関する要素をコピーする。
*/ if in basis(v(k))  then/*
基底に関するテスト*/ ki I l (v(k)、 symbol ic r
egister (i)) =/、/ B; /*基底オペランドであれば、その基底項目に関するキ
ル集合中に記号レジスタを入れる。*/ else /*基底項目でなければ、即ちオペランドが記号レジス
タならば、解析されている計算の結果を受は取る記号レ
ジスタが、記号レジスタ・オペランドv(J)を含む全
てのキル集合に入れられる。*/ kill (*、 symbolic registe
r(i))=ki11(*、 formal 1den
tity(i))lkill (本、v(k)): end/車do   k=l   to   hbou
nd(v、  I)*/;return(symbol
ic  register(i)) ;in basi
s:proc(x)  returns(bit) ;
/*このルーチンは、オペランドXが、コンパイルされ
るプログラムの基底中にあれば、真の論理値を返す。こ
れはオペランドがどのように符号化されるかに依存する
。この例は1基底項目が負、非基底項目が正という仮定
Oもとに符号化されている。実際の符号化はより複雑で
あろう。 */ if x < Othen return(true)
 :else  return(false);end
 /*in basis’/ ;end ;
【図面の簡単な説明】
第1図は本発明の1実施方法を示す流れ図、第2図は最
適化コンパイラの非常に高レベルの機能の流れ図、 第3図は最適化コンパイラの最適化フェーズの流れ図、 第4図は最適化コンパイラの大域的な共通部分式の削除
及びコード移動のアルゴリズムの流れ図である。 出!頂人   インターナショナノいビジネス・マシ←
ンズ・コー仕b−ンヨン第2図 第4図

Claims (1)

  1. 【特許請求の範囲】 コンパイラによつて機械命令に変換されるべき各計算毎
    に組を形成する手段と、 コンパイルされるプログラム中の全ての組に関する記入
    項目を有する表を形成し、上記形成された組の各々に記
    号レジスタを割り当てる手段と、上記表の中に入れられ
    る組の中の全ての基底項目毎に、上記組に一意的に割り
    当てられた記号レジスタを、上記基底項目に関するキル
    集合に付加する手段と、 上記表の中に入れられる組の中の全ての非基底項目毎に
    、上記組に一意的に割り当てられた記号レジスタを、上
    記非基底項目が現れるキル集合を有する全ての基底項目
    に関するキル集合に付加する手段と、 上記表の中の組に割り当てられた記号レジスタを非基底
    要素の計算の結果に指定し、割り当てられた記号レジス
    タの第2の表を構成する手段とを有する最適化コンパイ
    ラ。
JP60174440A 1984-08-13 1985-08-09 コード最適化方法 Expired - Lifetime JPH0695310B2 (ja)

Applications Claiming Priority (2)

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

Publications (2)

Publication Number Publication Date
JPS6149241A true JPS6149241A (ja) 1986-03-11
JPH0695310B2 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
US5598560A (en) * 1991-03-07 1997-01-28 Digital Equipment Corporation Tracking condition codes in translation code for different machine architectures
US5307492A (en) * 1991-03-07 1994-04-26 Digital Equipment Corporation Mapping assembly language argument list references in translating 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
EP0826181A4 (en) * 1995-04-11 2005-02-09 Kinetech Inc IDENTIFYING DATA IN A DATA PROCESSING SYSTEM
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
US6883165B1 (en) 2000-09-28 2005-04-19 International Business Machines Corporation Apparatus and method for avoiding deadlocks in a multithreaded environment
US6779106B1 (en) 2000-09-28 2004-08-17 International Business Machines Corporation Apparatus and method for an enhanced integer divide in an IA64 architecture
US6912647B1 (en) 2000-09-28 2005-06-28 International Business Machines Corportion Apparatus and method for creating instruction bundles in an explicitly parallel architecture
US6886094B1 (en) 2000-09-28 2005-04-26 International Business Machines Corporation Apparatus and method for detecting and handling exceptions
US6799262B1 (en) 2000-09-28 2004-09-28 International Business Machines Corporation Apparatus and method for creating instruction groups for explicity parallel architectures
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

Also Published As

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

Similar Documents

Publication Publication Date Title
JPS6149241A (ja) コード最適化方法
US5956512A (en) Computer program debugging in the presence of compiler synthesized variables
JP5419325B2 (ja) プログラム・コードを変換するための共用コード・キャッシングの方法および装置
Paleczny et al. The java {HotSpot™} server compiler
US5768592A (en) Method and apparatus for managing profile data
US5815720A (en) Use of dynamic translation to collect and exploit run-time information in an optimizing compilation system
JP2007531075A5 (ja)
US10275226B2 (en) Structural representation of generic type variable in a nominally typed virtual machine
US20040255279A1 (en) Block translation optimizations for program code conversation
US20090249307A1 (en) Program analysis apparatus, program analysis method, and program storage medium
JPH0695311B2 (ja) コード最適化方法
US11573894B2 (en) Tracking garbage collection states of references
Gurfinkel et al. A context-sensitive memory model for verification of C/C++ programs
JP2018510445A (ja) プログラム性能を向上させる領域特化システムおよび方法
US10983771B1 (en) Quality checking inferred types in a set of code
US11741004B2 (en) Colorless roots implementation in Z garbage collector
Dragos Compiling Scala for performance
US6721945B1 (en) Optimization of calls in programming languages using pointers for passing reference parameters
US7568191B2 (en) Method and apparatus for superword register value numbering
Bhatt et al. Peephole Optimization Technique for analysis and review of Compile Design and Construction
Abrahamsson et al. Automatically introducing tail recursion in CakeML
US10402320B1 (en) Verifying the validity of a transition from a current tail template to a new tail template for a fused object
Bird An implementation of a code generator specification language for table driven code generators
US7975121B2 (en) Simple stack types
JP2006202134A (ja) プロファイル情報収集方法および装置