JP2838855B2 - コンパイラの最適化方法 - Google Patents

コンパイラの最適化方法

Info

Publication number
JP2838855B2
JP2838855B2 JP3040549A JP4054991A JP2838855B2 JP 2838855 B2 JP2838855 B2 JP 2838855B2 JP 3040549 A JP3040549 A JP 3040549A JP 4054991 A JP4054991 A JP 4054991A JP 2838855 B2 JP2838855 B2 JP 2838855B2
Authority
JP
Japan
Prior art keywords
instruction
memory reference
update
instructions
loop
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
JP3040549A
Other languages
English (en)
Other versions
JPH04215132A (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 JPH04215132A publication Critical patent/JPH04215132A/ja
Application granted granted Critical
Publication of JP2838855B2 publication Critical patent/JP2838855B2/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/443Optimisation

Description

【発明の詳細な説明】
【0001】
【産業上の利用分野】本発明は、コンパイラの最適化段
階で有用である。コンピュータ・プログラムのコードを
コンパイルするとき、生成されるコードの品質を向上さ
せるためにコンパイラ内部で最適化技法を使用する。品
質の向上とは、プログラムに必要なコードのサイズの直
接的節減、またはプログラムの実行性能の増大のいずれ
かである。本発明は、コンパイラが、コンピュータの命
令アーキテクチャ、特に自動インデクシング能力を有す
る命令をより一層利用できるようにするものである。
【0002】
【従来の技術】命令アーキテクチャのなかには、前増分
及び後増分、または前減分及び後減分の形式のメモリ参
照命令を提供するものがある。これらの命令は、メモリ
を参照し、メモリ・アドレス計算で使用されるアドレス
・レジスタの内容を修正するという特徴をもつ。アドレ
ス・レジスタの副作用は、指定または暗示された量を自
動的にアドレス・レジスタの量に加算し、またはアドレ
ス・レジスタの量から減算することである。このクラス
のメモリ参照操作は、特殊命令またはアドレス指定モー
ドと見なすことができる。これらの操作は、「更新命
令」、自動インデクシング操作、及び自動増分または自
動減分アドレス指定モードと呼ばれている。
【0003】本発明を、その他の最適化方法と組み合わ
せて使用するとき、メモリ内のオブジェクトのアレイを
処理するループ内で、ある種の加算または減算が不要に
なる。これは、「帰納変数強度削減」として知られる最
適化法でアドレス計算における乗算を加算または減算で
置き換えた後に、しばしば起きる。Fortran、C
言語、PL/I、ADAなどの高級言語は、一般に、こ
のようなコード改良のための多くの機会を提供する。
【0004】本発明の説明を容易にするために都合のよ
いように、本明細書及び各請求項を通じて使用される以
下の用語を定義する。これらの用語の多くは、最適化コ
ンパイラの分野ではよく理解されているが、他のものは
本明細書で開示する本発明で特別な用途をもつ。
【0005】メモリ参照命令とは、コンピュータの主記
憶装置を参照する命令であり、たとえばメモリからのデ
ータをプロセッサのレジスタにロードする命令や、デー
タをレジスタからメモリに記憶する命令がそれに含まれ
る。
【0006】更新命令とは、二次的作用すなわち副作用
として、少なくとも1つのアドレス表現の1つまたは複
数の入力を予想可能な形で修正する特性をもつメモリ参
照命令である。更新命令はまた、自動インデクシング操
作、前増分または後増分アドレス指定モード、もしくは
前減分または後減分アドレス指定モード、及び自動増分
または自動減分アドレス指定モードとも呼ばれている。
【0007】基本ブロックとは、開始時にだけそこに入
ることができ、終了時にだけそこから出ることができ
る、プログラム・コードの一部分である。
【0008】フロー・グラフとは、プログラムの制御構
造を有向グラフで表したもので、エッジによって接続さ
れた基本ブロックから構成される。ブロックはプログラ
ムの非分岐部分を表し、エッジはそれらの非分岐部分の
間の制御の流れまたは分岐を表す。
【0009】ノードとは、基本ブロックのことである。
【0010】部分グラフとは、フロー・グラフ内のノー
ドのサブセット、及びそれらのノードを起点または終点
とするエッジのすべてである。
【0011】経路とは、ノードのシーケンスであり、場
合によっては反復したシーケンスであり、グラフのある
ノードから出発し、グラフ内のエッジをたどっていくこ
とによって生成される。
【0012】強く接続された領域とは、部分グラフの外
部にはノードを含まない部分グラフ内の、任意のノード
間の経路を有する部分グラフである。
【0013】入口が1つの強く接続された領域とは、た
だ1つのノードを残して強く接続された領域であって、
先行ノードはこの強く接続された領域の外部にある。参
照しやすいように、この領域を本明細書ではループと呼
ぶ。
【0014】ヘッダ・ノードとは、入口が1つの強く接
続された領域の唯一の入口点である。
【0015】プレヘッダ・ノードとは、入口が1つの強
く接続された領域のヘッダ・ノードの唯一の先行ノード
である。
【0016】アーティキュレーション・ノードとは、ヘ
ッダから出発するすべての経路上で発生する、ループ内
のノードである。
【0017】ワール・セット・ノードとは、ヘッダから
出発するすべての経路上で発生する、ループ内のノード
であって、そのループから出ないものである。
【0018】サイド・ノードとは、ワール・セット・ノ
ードでないループ内のノードである。
【0019】バック・ノミネータとは、ループ内の選択
されたノードについて、ヘッダ・ノードから出発する上
記ノードへのすべての経路上に現れるノードである。
【0020】領域定数(RC)とは、入口が1つの強く
接続された領域内では計算されないオブジェクトであ
る。
【0021】帰納変数(IV)とは、入口が1つの強く
接続された領域内でv=w+RC、v=wなどの線形関
係によって定義される変数である。上式で、RCは領域
定数、wは帰納変数である。wがvと同じであることが
最も一般的である。
【0022】「再関連づけ」として知られる技法は、積
の和の計算効率を高めるためにいくつかの変換を組み合
わせる技法である。これらの計算の多くは、記憶装置中
で量をアドレスする際に行われる。再関連づけの特に有
利な技法は、米国特許第4802091号に記載されて
いる。
【0023】再関連づけは、帰納変数の強度削減を実行
し、メモリ参照命令をターゲット・マシン上で利用でき
るアドレス指定モードに変換するために、アドレス計算
の際に共通の部分表現の利用を試みるものである。再関
連づけを使用すると、計算を配列し直し、単純化する問
題が、別の言語に翻訳するため、または別のターゲット
・マシン用のコードを生成するためにコンパイラを修正
するときにも有効な抽象的観点から対処できる。
【0024】更新命令の生成は、この開示で説明するよ
うに、再関連づけの拡張として実施されてきた。更新命
令を生成するために指定される必要な前提条件の多く
は、再関連づけによって実行される機能、たとえば帰納
変数を識別する機能、帰納変数を使用するメモリ参照命
令を見つける機能、及び強度削減を実行する機能などで
ある。
【0025】しかしながら、更新命令の生成は、再関連
づけ技法の使用に依存しない。更新命令の生成は、必要
なデータを集め、本明細書に述べる方法を実施するのに
必要な変換を実行する、何らかの技法を利用することに
のみ依存する。
【0026】更新命令を生成するというアイディアは、
周知である。C.N.Fischer及びR.J.Le
Blancの著書“Crafting a Compi
ler”のp.554で「自動増分」及び「自動減分」
アドレス指定モードが考察されているが、これらのアド
レス指定モードは、C言語の場合と同様に、原始言語で
直接的に表現されていない限り、しばしば生成されたコ
ード内で利用するのが難しいことが指摘されている。同
書には、基本ブロック内での順方向探索を示唆するこ
と、メモリ参照命令から開始すること、及び索引変数へ
の加算を探すことを除き、更新命令生成の技法は指定さ
れていない。場合によっては、そのような加算を除去
し、メモリ参照命令を自動インデクシング操作に変更す
ることができる。
【0027】本発明の更新命令生成技法は、自動インデ
クシング操作が原始プログラム内に存在しなければなら
ないという制限を有しない。この技法はまた、索引(帰
納)変数への加算または減算とは異なる基本ブロック内
での自動インデクシング操作の生成を可能にする。
【0028】P.Anklam、D.Cutler、
R.Heinen、及びM.D.MacLeanの著書
“Engineering a Compiler,V
AX−11 Code Generation and
Optimization”のp.130に、更新命
令生成用のアルゴリズムが記載されている。しかしなが
ら、このアルゴリズムは、最も単純なケースを処理する
のにしか十分でない。たとえば、このアルゴリズムは、
ループ増分(帰納変数に加えられる量)を1または−1
だけに制限している。このアルゴリズムはまた、更新形
式に変換すべきメモリ参照命令の探索を、ループ内のい
くつかの基本ブロックだけに制限している。
【0029】
【発明が解決しようとする課題】本明細書で述べる更新
命令生成の方法は、このどちらの制限もない。この技法
は、コードの極めて複雑なセクションを解析することが
でき、この更新命令生成技法を使用して、以前に最適と
考えられたコードを最適化することができる。
【0030】
【課題を解決するための手段】本発明は、コンピュータ
・プログラムをコンパイルするための方法の改良を提供
する。この方法は、コンピュータ・プログラムを原始コ
ードで書く段階と、中間言語で操作する段階と、適当な
プロセッサで実行するため、コンパイラを使用してプロ
グラムを目的コードで生成する段階を含む。コンパイラ
は、コンパイルされたプログラムが、すべての自動イン
デクシング命令を実行できるように設計されている。コ
ンパイラは、4つの自動インデクシング形式のどれが適
当なプロセッサによって実行できるかに関する情報を提
供され、目的コードが適当なプロセッサによって実行で
きる自動インデクシング命令しかもたないように原始コ
ード・プログラムをコンパイルする。このコンパイル法
は、コンパイラがコンパイル操作を実行する際に制限を
課されていない場合にそのコンパイラによって生成され
るはずの、プロセッサが受け入れることのできない自動
インデクシング命令を、プロセッサが受け入れることの
できる自動インデクシング命令に変換するという改良を
含んでいる。
【0031】このコンパイラは、プログラム内のループ
の実行を改善する。より具体的には、このコンパイラ
は、選択された各ループ内で、帰納変数を使用するメモ
リ参照命令を見つける手段と、選択されたループ内で、
その選択されたループ内の帰納変数に対してある値を加
算または減算する命令シーケンスを識別する手段と、更
新命令に変換すべき、ループ内の少なくとも1つの命令
を選択する手段と、更新命令を形成するようにメモリ参
照命令を修正する手段と、更新命令を生成する効果を補
償するため、ループ内でオフセット補償を適用する手段
とを含む。
【0032】本発明はさらに、プログラム内のループの
実行が改善されるようにコンピュータ・プログラムをコ
ンパイルする、改良された方法を提供する。この方法
は、選択された各ループ内で帰納変数を使用してメモリ
を参照するすべての命令を見つける段階と、選択された
ループ内で、メモリ参照命令が使用する帰納変数の値を
修正する命令シーケンスを識別する段階と、更新命令に
変換すべき、ループ内の少なくとも1つの命令を選択す
る段階と、更新命令を形成するため、前記の少なくとも
1つの選択された命令を修正する段階と、更新命令を生
成する効果を補償するためにループ内でオフセット補償
を適用する段階とを含む。
【0033】本発明はさらに、潜在的に更新命令に変換
するのに適したメモリ参照命令を選択し、適切と判断さ
れたそれらの命令を更新命令に変換することによって、
コンピュータ・コードを最適化する方法を提供する。特
定の帰納変数を使用するループ内のすべてのメモリ参照
命令が検査され、帰納変数定義点に達するループの横断
(traversal)上で出会わない、または帰納変数定義点
に達せず、かつループから出ない前記ループの横断上で
出会った、すべてのメモリ参照命令が、変換に適してい
ないとして拒否される。残りの拒否されなかったメモリ
参照命令のうち少なくとも1つが、更新命令に変換すべ
き候補として選択される。候補が選択されると、その変
換を補償するのに必要な、メモリ参照命令に対するオフ
セット補償が試みられる。それに成功すると、候補命令
は更新命令に変換される。不成功の場合は、候補命令は
拒否される。変換に適した少なくとも1つのメモリ参照
命令が見つかるか、あるいはすべてのメモリ参照命令が
拒否されるまで、この選択及び拒否処理を繰り返す。
【0034】好ましい実施例では、残りの拒否されなか
ったメモリ参照命令のうち最初に選択されたものが、帰
納変数定義点に最も近い命令であり、不成功の場合に
は、次に近いメモリ参照命令が候補として選択される。
【0035】
【実施例】コンパイラは、高級言語をアセンブリ言語ま
たは機械語にマップする。高級コンピュータ言語は、機
械語に翻訳しないと実行できない。
【0036】コンパイラは、分析と合成のパラダイム
(範列)を支援する。原始言語は、まず分析してその語
彙、文法、及び意味上の諸成分に分解され、いくつかの
段階の完了後に、最終的に目的言語による機能的に同等
の構成体に合成される。通常のコンパイラ構造を図1に
示すが、6つの主要段階が示してある。高級言語の原始
コードが、コンパイラに入力され、その結果アセンブリ
・コードが出力される。各コンパイラ段階は、追加のよ
り小さな部分段階を有することがある。たとえば、最適
化コンパイラでは、多数の最適化戦略を別々のモジュー
ルに分割することは稀ではない。
【0037】図1に示すように、通常のコンパイラ構造
からオプティマイザ段階を削除した場合、中間レベルの
テキストが直接アセンブリ言語に変換される。この場
合、このアセンブリ言語は、実行時間または記憶空間に
関しては効率的ではない。
【0038】図2に示したC言語によるコンピュータ・
プログラムの断片を考えてみる。コンピュータ・プログ
ラムのこの部分は、ポインタpが指す連続したメモリ位
置に値0を記憶する。ディジタル・エクイップメント・
コーポレーションのPDP−11コンピュータというそ
のターゲット・マシン用の直接的アセンブリ・コード
を、図3に示す。最初の命令は、そのメモリ位置を値0
で更新し、第2の命令はメモリ・ポインタを次のメモリ
位置に合わせる。同じターゲット・マシン用の最適化さ
れたアセンブリ・コードを、図4に示す。この場合、こ
の単一命令は、PDP−11アーキテクチャの自動イン
デクシング能力を利用して、値0をメモリ内に移し、ポ
インタを次のメモリ位置に更新する。これは、メモリ位
置を参照し、次にメモリ・ポインタとして使用されるレ
ジスタを調節するアドレス指定モードである。自動増分
及び自動減分アドレス指定モードは、一連のアドレスを
通じてインデックス・レジスタ値の自動ステッピングを
行い、性能の大きな改善をもたらす。
【0039】最適化戦略には、特定のターゲット・マシ
ン、または自動インデクシング機能などアーキテクチャ
上の特徴に依存するものがある。ディジタル・エクイッ
プメント・コーポレーションのVAX−11及びモート
ローラのMC68000は、ある形式の自動インデクシ
ング機能を有するアーキテクチャをもつ。
【0040】他の最適化戦略は、特にターゲット・アー
キテクチャとは独立に設計されている。その一例は、あ
る種の計算をループの境界内からそのループの外部へ移
すものである。
【0041】原始言語の特徴はまた、特に最適化が行わ
れない場合に、コードの品質を向上させるように設計さ
れている。たとえば、C言語によるポインタ、増分演算
子及び減分演算子の使用は、インデクシングされたアレ
イを使用する方法の代替法であり、自動インデクシング
の機会を示す。
【0042】本発明は、最適化コンパイラの最適化段階
で、アドレス・レジスタを修正するという副作用を有す
るメモリ参照命令を、更新命令に変換するための方法を
提供する。これらの変換は、自動インデクシング操作を
使用して、帰納変数を明示的に修正する命令を削除する
ことにより、ループ内の命令の数を減らすように設計さ
れている。
【0043】本発明は、4つの形式の自動インデクシン
グ、すなわち前増分、後増分、前減分、及び後減分をす
べて利用する。ほとんどのコンピュータ命令アーキテク
チャはこれらの4つの形式のうちの一部しか支援しない
ので、本発明では、必要ならば前増分形式と後増分形式
の間の変換を適用する。またほとんどのアーキテクチャ
では、副作用の符号または大きさが制限され、特定のア
ドレス指定モードでの自動インデクシングしか許されな
い。本発明は、そのような制限を規定し、それらが満足
されることを保証する。
【0044】更新命令生成は、自動インデクシング命令
が適用できる各ケースを決定し、更新を適用すべき各ケ
ースを選択し、更新が適用された帰納変数を使用するメ
モリ参照命令を調節する。
【0045】更新命令生成の好ましい方法を、図5に概
略的に示す。この方法は、以下の段階を実行することに
よって達成される。
【0046】1.コンピュータ・プログラムの流れ図を
決定し、すべてのループを識別する。各ループ内で、ノ
ードをアーティキュレーション・ノード、ワール・セッ
ト・ノード、及びサイド・ノードとして分類する。各ル
ープ内のすべてのノードについて、バック・デノミネー
タ関係を決定する。次に、各ループの帰納変数を識別
し、該当する場合は強度削減を適用する。すべてのメモ
リ参照命令を、目標命令アーキテクチャのアドレス指定
モード制限に従うように修正する。アドレスはレジスタ
と整数の変位を加算することによって形成することが望
ましい。このようにして形成されたアドレスに対して更
新命令生成を実行することが好ましい。
【0047】2.選択されたループを検査する。
【0048】3.アドレス指定のために特定の帰納変数
を使用する、選択されたループ内のすべてのメモリ参照
命令を探し出す。選択される帰納変数は、そのループ内
のある点でだけ修正されるものであることが好ましい。
こうすると、必要な計算量が少ない、より簡単な方法が
可能になる。しかしながら、これは本発明を限定するこ
とを意図するものではない。この更新命令法は、より複
雑な計算を扱う場合に、帰納変数が多数の点で修正され
るケースを処理できるように、容易に拡張することがで
きる。
【0049】4.選択されたループ内で、ある値を帰納
変数に加算または帰納変数から減算する1つまたは一連
の命令を見つける。この値は、目標アーキテクチャ上の
自動インデクシング操作に使用できるものでなければな
らない。たとえば、ある種の目標アーキテクチャに対す
る制限は、特定の定数値だけを許すものである。こうし
て見つかった命令を、「帰納変数定義点」として識別す
る。帰納変数が変化した量が「更新量」である。正の量
は増分であり、負の量は減分である。
【0050】5.更新命令に変換すべきメモリ参照命令
を識別する。
【0051】6.更新命令に変換するために識別された
各メモリ参照命令を、更新命令に修正する。各更新操作
で、元の帰納変数が、新しく作成された帰納変数で置き
換えられる。元の帰納変数の値を新しく作成された帰納
変数に割り当てる命令が、ループのプリヘッダに挿入さ
れる。
【0052】7.元の帰納変数の代わりに新しく作成さ
れた帰納変数を使用するように、残りの各メモリ参照命
令を修正し、新しく作成された帰納変数の値が元の帰納
変数の値と異なる領域に現れる、残りのメモリ参照命令
にオフセット補償を適用する。
【0053】8.選択されたループ内の各帰納変数につ
いてこの過程を繰り返す。
【0054】9.コンピュータ・プログラム全体内の各
ループについてこの過程を繰り返す。
【0055】図6は、図5の段階5に広義に示すよう
に、更新形式に変換すべきメモリ参照命令を選択するの
に使用される方法の詳細を示す。この方法の各段階は、
以下の通りである。
【0056】1.アドレス指定のために特定の帰納変数
を使用する、ループ内のすべてのメモリ参照命令を検査
する。帰納変数定義点に達し、かつループを出ない、ル
ープの部分グラフの横断上で出会わないメモリ参照命令
は、更新形式に変換する候補として拒否される。帰納変
数定義点に達しておらず、かつループから出ない部分グ
ラフの横断上で出会ったメモリ参照命令は、変換の候補
として拒否される。それらの制約により、帰納変数定義
点に達した場合に限って、ループから出ない部分グラフ
の横断上で適当な候補に達することが保証される。
【0057】ただ1つの更新点または帰納変数定義点に
達し、その後ループから出る、部 分グラフを通る経路
があるかどうかは問題ではないので、ループ脱出は無視
される。これによって、更新が作成されたときに導入さ
れた新しい帰納変数の値は、ループから出た後に、元の
帰納変数の値とは異なったものになるが、この新しい帰
納変数は、脱出後には決して使用されない。
【0058】好ましい実施例では、この拒否過程は以下
のように進行する。帰納変数更新点がサイド・ノード内
にある場合は、そのサイド・ノード内にないどのメモリ
参照命令も拒否される。帰納変数定義点がワール・セッ
ト・ノード内にある場合は、そのワール・セット・ノー
ド内にないどのメモリ参照命令も拒否される。
【0059】候補を選択するための、これより制限的で
ない方法も可能である。候補は、帰納変数定義点に達す
るがループから出ない部分グラフの横断上で、グループ
内でただ1つのメモリ参照命令に出会うような、メモリ
参照命令の任意のグループを含むことができる。こうす
ると、あるグループを選択し、そのグループのすべての
メンバを更新形式に変換することが可能になる。図9の
例1は、この拡張によって、更新点の選択の自由度がよ
り大きくなるケースを示している。このことについては
後で検討する。
【0060】2.前の段階で見つかった候補のリストか
ら、ターゲット機械上で適当な更新形式に変換できなか
ったすべてのメモリ参照命令を拒否する。この過程は、
本質的に機械によって変わる。というのは、アーキテク
チャが異なると、違った形式の自動インデクシングが支
援されるからである。PDP−11、VAX−11、及
びMC68000のアーキテクチャに見られる1つの共
通した制限は、メモリ内で参照されたオブジェクトのサ
イズに対応する更新量しか支援されないということであ
る。
【0061】ターゲット・ハードウェアが、更新形式に
変換されるアドレス指定モードを制限することもある。
これは、更新命令生成過程の第1段階によって実行され
る事前処理の影響を受ける。自動インデクシングを使用
したいことが早期に認識されると、メモリ参照命令が適
当なアドレス指定モードに変換されること、または更新
に適したその他のモードにされることを保証するよう
に、この事前処理を動機づけることができた。
【0062】ここで考えているターゲット機械では、事
前処理を用いて、可能な候補命令のアドレス指定モード
を、1つのレジスタ及び1つの整数の変位に還元する。
これは、更新命令を作成しオフセット補償を実行する諸
過程が期待する、アドレス指定モードである。
【0063】3.帰納変数定義点に「最も近い」候補メ
モリ参照命令を選択する。3つのケースが可能である。
【0064】a.帰納変数定義点がサイド・ノード内に
ある場合、基本ブロック内の定義点の直前または直後に
ある候補メモリ参照命令が選択される。これは、基本ブ
ロック内の命令の単純な走査によって見つけることがで
きる。
【0065】b.帰納変数定義点がワール・セット・ノ
ード内にあり、かつそのワール・セット・ノード内に候
補メモリ参照命令がある場合、基本ブロック内の定義点
の直前または直後にある候補メモリ参照命令が選択され
る。
【0066】c.帰納変数定義点を含むワール・セット
・ノード内に候補がない場合は、ある候補を含み、ルー
プから出ないループ部分グラフの横断上の定義点の直前
または直後にあるワール・セット内の候補が選択され
る。これは、バック・ドミネータ情報を使用して以下の
ようにして見つける。定義点に先行する候補を含むすべ
てのワール・セット・ノードについて(これらのブロッ
クは、それらのブロックのすべてが定義点ブロックをバ
ック・ドミネートすることによって識別される)、他の
すべてのブロックによって支配されるブロックが選択さ
れる。定義点に後続する候補を含むすべてのワール・セ
ット・ノードについて(これらのブロックは、それらの
ブロックのすべてが定義点ブロックによって支配される
ことによって識別される)、他のすべてのブロックを支
配するブロックが選択される。両方のケースでブロック
が1つずつ見つかった場合は、いずれかのブロックを選
択する。選択されたブロック内で、そのブロックが定義
点の前にあるかそれとも後にあるかに応じて、定義点の
直前または直後にある候補メモリ参照命令が適宜に選択
される。
【0067】この方法は、さらに改良することができ
る。上記の方法は、帰納変数定義点の前または後にある
候補を任意に選択するが、この選択は、ターゲット機械
の特性によって動機付けしなければならない。必要なタ
イプの前更新(正の更新量が正の場合は前増分、負の場
合は前減分)機能を有する機械では、定義点の後にある
候補を選択することがより好ましい。必要なタイプの後
更新を有する機械では、定義点の前にある候補を選択す
ることがより好ましい。こうすると、前更新形式と後更
新形式の間の変換を適用しなければならないケースの数
が減る。
【0068】4.図8に示したオフセット補償過程を適
用しようと試みても、どのメモリ参照命令も実際には修
正されない。
【0069】5.オフセット補償がうまく適用できない
場合、候補として選択されたメモリ参照命令を拒否し、
最も近い候補の選択及びテストを繰り返す。
【0070】図7は、図5の段階6に示すように、選択
された候補メモリ参照命令を更新命令形式に変換するの
に使用される過程を示す。この過程の諸段階は、以下の
通りである。
【0071】1.新しい帰納変数を作成し、この新しい
帰納変数に元の帰納変数の値を割り当てる命令を、ルー
プのプリヘッダに挿入する。
【0072】2.選択された候補の変位を新しい帰納変
数に加算する命令を、ループのプリヘッダに挿入する。
事前処理で、可能な候補命令のアドレス指定モードが、
1つのレジスタ(これは元の帰納変数でなければならな
い)及び1つの整数の変位に還元された。帰納変数と変
位を加算すると、選択された候補アドレス指定モードを
1つのレジスタ(新しい帰納変数)に還元する効果があ
る。
【0073】3.選択された候補メモリ参照命令の形式
がターゲット・ハードウェア上で支援されていない場
合、前更新形式と後更新形式の間で変換を行う。必要な
更新命令の形式、すなわち前更新形式か後更新形式か
は、選択された候補メモリ参照命令と帰納変数定義点の
相対的位置によって決まる。候補が部分グラフの横断上
の定義点の前にある場合には、後更新が必要である。候
補が定義点の後にある場合には、前更新が必要である。
ターゲット・ハードウェアが必要な形式を支援していな
い場合には、以下のような変換過程が適用される。
【0074】a.後増分から前増分へ、または前減分か
ら後減分への変換。新しい帰納変数から更新量を減算す
る命令を、ループのプリヘッダに挿入する。
【0075】b.後減分から前減分へ、または前増分か
ら後増分への変換。新しい帰納変数に更新量を加算する
命令を、ループのプリヘッダに挿入する。
【0076】4.選択された候補メモリ参照命令をター
ゲット機械上の更新命令に修正する。
【0077】PDP−11、VAX−11、及びMC6
8000を含めて、更新形式を支援するほとんどのアー
キテクチャ上では、レジスタ間接アドレス指定モードを
使用しなければならない。これらのアーキテクチャにつ
いては、更新量は、暗示的に参照されたメモリ・オブジ
ェクトのサイズに等しい。このタイプのターゲット機械
では、レジスタ間接アドレス指定モード更新形式の新し
い帰納変数を使用して、単にメモリ参照命令を書き直
す。
【0078】図8は、図5の段階7に広義に示したよう
に、更新命令形式に変換すべき候補メモリ参照命令が選
択された後に、他のメモリ参照命令を修正するための方
法を示す。この方法の諸段階は、以下の通りである。
【0079】1.更新形式に変換するために選択された
候補以外の、検討中の帰納変数を使用する任意のメモリ
参照命令を選択する。
【0080】2.選択されたメモリ参照命令の変位から
候補メモリ参照命令の元の変位を減算する。
【0081】3.候補メモリ参照命令が前更新形式と後
更新形式の間の変換を必要とする場合、以下のように、
候補変換のタイプに基づいて、このメモリ参照命令に対
して逆変換を適用する。
【0082】a.後増分から前増分へ、または前減分か
ら後減分への変換。このメモリ参照命令の変位に更新量
を加算する。
【0083】b.後減分から前減分へ、または前増分か
ら後増分への変換。このメモリ参照命令の変位から更新
量を減算する。
【0084】4.現メモリ参照命令が、候補メモリ参照
命令と部分グラフのある横断上の帰納変数定義点との間
にある場合、必要に応じて現メモリ参照命令の変位に更
新量を加算またはその変位から減算する。まず、現メモ
リ参照命令が候補と定義点の間にあるかどうか判定す
る。4つのケースが可能である。
【0085】a.現メモリ参照命令と候補メモリ参照命
令が同じノード内にある場合は、基本ブロック内の命令
の走査を実行して、それらの命令の相対的位置を見つけ
る。それが候補と定義点の相対的位置の知識とあいまっ
て、現メモリ参照命令がそれらのうちにはいるかどうか
が判定される。
【0086】b.現メモリ参照命令と帰納変数定義点が
同じノード内にある場合は、基本ブロック内の命令の走
査を実行して、それらの命令の相対的位置を見つける。
それが候補と定義点の相対的位置の知識とあいまって、
現メモリ参照命令がそれらの間にはいるかどうかが判定
される。
【0087】c.帰納変数定義点が、候補メモリ参照命
令を含むノードを支配するワール・セット・ノード内に
ある場合は、定義点ノードによって支配されるが、候補
ノードによっては支配されないすべてのノードが、これ
らの2つのノードの間になければならない。
【0088】d.候補メモリ参照命令が、帰納変数定義
点を含むノードを支配するワール・セット・ノード内に
ある場合は、候補ノードによって支配されるが、定義点
ノードによっては支配されないすべてのノードが、これ
らの2つのノードの間になければならない。
【0089】現メモリ参照命令が、候補メモリ参照命令
の後が、帰納変数定義点の前にある場合は、現メモリ参
照命令の変位から更新量を減算する。現メモリ参照命令
が、定義点の後、候補メモリ参照命令の前にある場合
は、現メモリ参照命令の変位に更新量を加算する。
【0090】5.元の帰納変数を、候補メモリ参照命令
が更新形式に修正されたときに作成された新しい帰納変
数で置き換え、計算された新しい変位値を使用して、現
メモリ参照命令を書き直す。
【0091】新しい変位値は、ターゲット機械上のレジ
スタ変位アドレス指定モードによって許容される範囲内
になければならない。そうでない場合は、この候補メモ
リ参照命令に対してオフセット補償を適切に適用するこ
とができない。これは、新しい候補が前述のように選択
されなければならないことを意味する。
【0092】指定されたこの更新命令生成方法は、ほと
んどのアーキテクチャで見られる形式の更新命令にとっ
て十分であり、特定のターゲット機械上で見られる、ア
ドレス指定モードに対する各種の制限、変位の範囲、及
び更新量を考慮に入れている。
【0093】しかしながら、ある種のアーキテクチャ
は、それほど制限的な更新命令の形式をもたない。この
ような場合、それらのアーキテクチャを支援するため、
通常は独自な状態の更新形式を生成するように、更新命
令生成過程を拡張することが望ましい。
【0094】好ましい実施例に加えられる拡張の1例
は、以下の通りである。特定の目標アーキテクチャは、
更新命令においてレジスタ−変位アドレス指定モードま
たはレジスタ間アドレス指定モードのいずれかが可能で
あり、更新量は変位または第2レジスタによって明示的
に与えられる。そのレジスタと変位、または2つのレジ
スタを加算することによって、有効アドレスが形成され
る。更新形式命令の副作用は、その有効アドレスを第1
レジスタにバック・ストアすることである。変位または
第2レジスタの値に応じて前増分形式または前減分形式
の自動インデクシングが実施される。
【0095】この拡張により、更新のレジスタ−レジス
タ・アドレス指定モード形式を使用して、コンパイル時
に未知である更新量が許容される。このため、更新形式
に変換すべき命令を識別する過程の拡張、及びオフセッ
ト補償を適用する過程の拡張が必要となる。これらの拡
張により、以下のように、更新量がコンパイル時に未知
であるときに更新命令が生成されるケースが制限され
る。
【0096】まず、更新形式に変換すべき命令を識別す
る過程は、図6の段階1の前に追加された予備段階を有
する。すなわち、更新量がコンパイル時に既知の値でな
い場合、特定の帰納変数を使用するすべてのメモリ参照
命令が同じ変位を有しない限り、失敗の指示が戻され
る。また、更新のタイプが減分(すなわち、その帰納変
数から減算された値)でない場合は、新しいレジスタに
更新量を割り当て、次にこの新しいレジスタを無効にす
る命令をループ・プリヘッダに挿入することによって、
そのタイプが増分に変換される。
【0097】次に、コンパイル時の変位修正が必ず適用
できるとは限らないので、オフセット補償を適用する過
程が修正される。今や、図8に示すようにオフセット補
償を適用する過程の段階2は、コンパイル時に更新量が
未知である場合、必ず変位0をもたらす。図8の段階3
は、必要ならば、レジスタ−レジスタ・アドレス指定モ
ードを使用して更新量を加算するように修正される(必
要とされる可能な変換は、後増分から前増分への変換だ
けであることに留意されたい)。図8の段階4は、更新
量を加算しなければならない場合はレジスタ−変位アド
レス指定モードをレジスタ−レジスタ・アドレス指定モ
ードに変更するように、また更新量を減算しなければな
らない場合はレジスタ−レジスタ・アドレス指定モード
をレジスタ−変位アドレス指定モードに戻すように修正
される。更新量を加算しなければならないケースは、帰
納変数定義点が選択された更新点の前にある場合だけで
あることに留意されたい。この場合には、段階3の変更
は不要である(すなわち、更新量を二度加算しなければ
ならない場合はない)。同様に、更新量を減算しなけれ
ばならないケースは、更新点が帰納変数定義点の前にあ
るときだけであり、後増分から前増分への変換が段階3
で適用される(すなわち、段階3で更新量が加算された
ときだけ、段階4で更新量を減算しなければならな
い)。
【0098】図9の例1は、C言語によるプログラムの
断片を示す。この例について、上述の機械をターゲット
として、更新命令生成の過程を例示する。
【0099】この例の場合のデータのメモリ・マップを
図10に示す。アレイa、b,cはレジスタR2によっ
て参照される領域内の隣接ブロック内に割り振られてい
る。アレイaはR2からオフセット100、アレイbは
オフセット140、アレイcはオフセット180の所か
ら始まっている。すべてのアレイ要素は4バイトのサイ
ズである。
【0100】このコンピュータ・プログラム断片の中間
コードの1つの形式を図11に示す。この時点で、更新
命令生成過程を適用するのに必要な事前処理はまだ行わ
れていない。このコード中のレジスタR3は帰納変数i
に使用され、レジスタR5は変数xに使用される。
【0101】図12に、事前処理後のコードを示す。こ
の時点で、いくつかの標準の周知の最適化が適用されて
いる。すべてのメモリ参照命令は、レジスタ−変位アド
レス指定モードに還元され、強度削減及び線形テスト置
換が適用されている。これらの段階があいまって、レジ
スタR6内で帰納変数が作成されている。ループ・プリ
ヘッダ内で、R6はR2とi*4の和に初期設定され、
コンパイル時算術演算でそれがただのR2に還元され
る。変数iが1だけ増分された場合、R6は今度は4だ
け増分される。線形テスト置換は、新しい帰納変数R6
を使用するようにループ終了検査を変更し、適当な比較
値を含むようにループ・プリヘッダ内でR7を初期設定
した。
【0102】図13は図12と同じコードを部分グラフ
の形式で示す。ノード1は、ループ・プリヘッダ基本ブ
ロックであり、ノード2はループ・ヘッダである。ノー
ド2はループ内の唯一のアーティキュレーション・ノー
ドであり、ノード2、3、6はワール・セット・ノード
である。ノード4及び5はサイド・ノードである。
【0103】最終的な最適化されたコードを、図14に
示す。更新命令生成の過程は、以下のように機能した。
まず、ループ内の唯一の帰納変数(R6)を使用するメ
モリ参照命令、すなわちノード2内のアレイaへの記
憶、ノード2内のアレイbからのロード、ノード4及び
5内のアレイcへの記憶を識別した。ノード6のADD
命令は、更新量4を有する帰納変数定義点として識別さ
れている。
【0104】更新点を選択する際、アレイcへの記憶は
サイド・ノード内にあり、帰納変数定義点はワール・セ
ット・ノード内にあるので、この記憶は拒否される。こ
れは、前記過程の提案された拡張が適用できるケースで
ある。更新形式に変換するため、ノード4及び5内の記
憶命令を両方とも選択することが可能である。その代
り、アレイbからのロードが一時的に選択され、オフセ
ット補償過程が試みられる。この過程が成功したとき、
そのロードは更新形式に変換される。
【0105】更新変換過程で新しい帰納変数R8が作成
され、それがループ・ヘッダ内のR6の値に割り当てら
れる。次に、bの元の変位140が、R8に加算され
る。次に、ターゲット・ハードウェアは知識更新形式し
か支援しないので、R8から更新量(4)を減算するこ
とによって、後増分が前増分に変換される。この場合
も、コンパイル時評価で、これがR2と136の加算、
及びその値のR8への割当てに還元された。
【0106】次に、他のすべてのメモリ参照命令が、必
要に応じて修正される。アレイaへの記憶の変位から、
140が減算され、次に4が加算されて、値−36を生
ずる。アレイcへの記憶は両方とも、選択された更新点
と帰納変数定義点の間にあることがわかっている。した
がって、aへの記憶に適用される変更に加えて、変位か
ら4が減算されて、値40を生ずる。
【0107】更新命令生成過程後、線形テスト置換を使
用して、新しい帰納変数R8に基づくようにループ終了
テストを修正することにより、R6の残りの使用を削除
した。
【発明の効果】本発明によって、コンパイラが、コンピ
ュータの命令アーキテクチャ、特に自動インデクシング
能力を有する命令をよりよく利用することができる。
【図面の簡単な説明】
【図1】 通常のコンパイラの構造を示す図である。
【図2】C言語によるコンピュータ・プログラムの例を
示す図である。
【図3】直接的アセンブリ・コードの例を示す図であ
る。
【図4】最適化されたアセンブリ・コードの例を示す図
である。
【図5】本発明による更新命令生成の過程を示す図であ
る。
【図6】図5の拡張された段階を示す図である。
【図7】図5の拡張された段階を示す図である。
【図8】図5の拡張された段階を示す図である。
【図9】例1を原始コードで示す図である。
【図10】例1のメモリ・マップを示す図である。
【図11】事前処理前の中間コードの例1を示す図であ
る。
【図12】事前処理後の中間コードの例1を示す図であ
る。
【図13】部分グラフとしての例1を示す図である。
【図14】図7上で、例1を最適化されたコードで示す
図である。
───────────────────────────────────────────────────── フロントページの続き (72)発明者 ピーター・ウィリー・マークステイン アメリカ合衆国、テキサス州、オースチ ン、ノース・ヒルズ・ドライブ 4202番 地 (72)発明者 ジェー・ケヴィン・オーブリアン アメリカ合衆国、ニューヨーク州、サウ スセイラム、ホイト・ストリート 3番 地 (56)参考文献 特開 昭64−41969(JP,A) 特開 昭62−40539(JP,A)

Claims (43)

    (57)【特許請求の範囲】
  1. 【請求項1】コンピュータ・プログラムをコンパイラを
    使用してコンパイルする方法であって、適当なプロセッ
    サで実行すべきプログラムを目的コードで生成する段階
    含み、前記コンパイラは、コンパイルされたプログラ
    ムが自動前増分命令、自動後増分命令、自動前減分命
    令、または自動後減分命令のいずれをも実行可能にさせ
    るように設計されており、前記の増分命令及び減分命令
    のいずれが前記の適当なプロセッサによって実行できる
    かに関する情報を前記コンパイラに提供すること、及び
    前記コンパイラがコンパイルする際に制限を課されてい
    なかった場合に前記コンパイラが生成するはずの、前記
    プロセッサが受け入れできない自動増分命令または減分
    命令を前記プロセッサが受け入れできる自動増分命令ま
    たは減分命令に変換することにより、前記目的コードが
    前記の適当なプロセッサによって実行できる増分命令ま
    たは減分命令だけを有するように原始コード・プログラ
    ム中のメモリ参照命令を変換してコンパイルする段階を
    含む、コンピュータ・プログラムをコンパイルする方
    法。
  2. 【請求項2】コンピュータ・プログラムをコンパイラを
    使用してコンパイルする方法であって、適当なプロセッ
    サで実行すべきプログラムを目的コードで生成する段階
    含み、前記コンパイラは、コンパイルされたプログラ
    ムが自動インデクシング命令を実行可能にさせるように
    設計されており、自動インデクシングのいずれが前記の
    適当なプロセッサによって実行できるかに関する情報を
    前記コンパイラに提供すること、及び前記コンパイラが
    コンパイルする際に制限を課されていなかった場合に前
    記コンパイラが生成するはずの、前記プロセッサが受け
    入れできない自動インデクシング命令を前記プロセッサ
    が受け入れできる自動インデクシング命令に変換するこ
    とにより、前記目的コードが前記の適当なプロセッサに
    よって実行できる自動インデクシング命令だけを有する
    ように原始コード・プログラム中のメモリ参照命令を変
    換してコンパイルする段階を含む、コンピュータ・プロ
    グラムをコンパイルする方法。
  3. 【請求項3】コンピュータ・プログラム内のループの実
    行を改善するためのコンピュータ・プログラム用の改良
    されたコンパイラ・システムであって、 各ループ内のメモリ参照命令を見つける手段と、 ある値をループ内の帰納変数と加算または減算する、選
    択されたループ内の命令シーケンスを識別する手段と、 更新命令に変換すべき、前記ループ内のメモリ参照命令
    を選択する手段と、 前記の選択された更新命令を形成するように、前記メモ
    リ参照命令を修正する手段と、 前記更新命令を形成するように前記メモリ参照命令を修
    正することの補償をするように、前記の選択されたルー
    プ内の他のメモリ参照命令を修正する手段とを含むコン
    パイラ・システム。
  4. 【請求項4】変換すべき命令を選択する前記手段が、帰
    納変数を使用して各メモリ参照命令を選択する手段を含
    む、請求項3に記載のコンパイラ・システム。
  5. 【請求項5】前記メモリ参照命令を修正する前記手段
    が、前記命令のアドレスが変化しないように前記命令に
    関する変位またはインデックスの変化を計算する手段
    と、前記の計算された変化に応じて、命令を前記ループ
    のプリヘッダに加える手段とを含む、請求項3または請
    求項4に記載のコンパイラ・システム。
  6. 【請求項6】オフセット補償を適用する前記手段が、更
    新命令となるように選択されたメモリ参照命令以外の、
    前記帰納変数を使用する各メモリ参照命令を選択する手
    段と、前記更新命令の形成によって各メモリ参照命令の
    前記帰納変数が変更されたかどうかを判定する手段と、
    前記変化を補償するように、変化した帰納変数を有する
    各命令を修正する手段とを含む、請求項3、4、または
    5に記載のコンパイラ・システム。
  7. 【請求項7】コンピュータ・プログラム内のループの実
    行を改善するようにコンピュータ・プログラムをコンパ
    イルする方法であって、 あるメモリ位置を参照する、選択された各ループ内のす
    べての命令を見つける段階と、 前記の選択されたループに対する帰納変数の値を修正す
    る、前記ループ内の命令シーケンスを識別する段階と、 更新命令に変換すべき、前記ループ内の命令を選択する
    段階と、 前記更新命令を形成するように、前記の選択された命令
    を修正する段階と、 前記命令シーケンスのアドレス更新を補償するために、
    オフセット補償を前記ループに適用する段階とを含む方
    法。
  8. 【請求項8】更新命令となるべき命令を選択する前記段
    階が、帰納変数を使用して各メモリ参照命令を選択する
    段階と、更新命令生成のために前記命令うち1つの命令
    を選択する段階とを含む、請求項7に記載のコンパイル
    する方法。
  9. 【請求項9】前記メモリ参照命令を修正する前記段階
    が、各命令アドレス参照が変化しないように各前記命令
    に関する変位またはインデックスの変化を計算する段階
    と、前記の計算された変化に応じて、命令を前記ループ
    のプリヘッダに加える段階とを含む、請求項7または8
    に記載のコンパイルする方法。
  10. 【請求項10】オフセット補償を適用する前記手段が、
    更新命令生成のために選択されたメモリ参照命令以外
    の、前記帰納変数を使用する各メモリ参照命令を選択す
    る段階と、前記更新命令の生成によって各メモリ参照命
    令の前記帰納変数が修正されたかどうかを判定する段階
    と、前記帰納変数の前記修正を補償するように各命令を
    修正する段階とを含む、請求項7、8、または9に記載
    コンパイルする方法。
  11. 【請求項11】潜在的に更新命令に変換するのに適した
    メモリ参照命令を選択することによってコンピュータ・
    コードを最適化し、適切なことがわかった命令を更新命
    令に変換するための方法であって、 特定の帰納変数を使用する、ループ内のすべてのメモリ
    参照命令を検査し、帰納変数定義点に達する前記ループ
    の横断上で出会わない、または前記帰納変数定義点に達
    しておらず、かつ前記ループから出ない前記ループの横
    断上で出会った、すべてのメモリ参照命令を拒否し、拒
    否されなかった残りのメモリ参照命令から前記帰納変数
    定義点に最も近いメモリ参照命令を、更新命令に変換す
    べき候補として選択する段階と、 前記の選択された候補命令の前記変換を補償するのに必
    要な、前記メモリ参照命令に対するオフセット補償を試
    み、成功した場合は、前記候補命令を更新命令に変換
    し、不成功であった場合は、前記候補命令を拒否して、
    次に近いメモリ参照命令を候補として選択する段階と、 変換するのに適した少なくとも1つのメモリ参照命令が
    見つかるか、またはすべてのメモリ参照命令が拒否され
    るまで、前記の選択及び拒否の過程を繰り返す段階とを
    含む方法。
  12. 【請求項12】さらに、前記帰納変数更新点を内部に含
    むサイド・ノードの外部にあるすべてのメモリ参照命令
    を拒否する段階を含む、請求項11に記載の方法。
  13. 【請求項13】さらに、前記帰納変数更新点を内部に含
    むワール・セット・ノードの外部にあるすべてのメモリ
    参照命令を拒否する段階を含む、請求項11に記載の方
    法。
  14. 【請求項14】予め選択されたターゲット機械が受け入
    れできる更新命令形式に変換できないすべてのメモリ参
    照命令を候補として拒否する段階を含む、請求項11に
    記載の方法。
  15. 【請求項15】前記帰納変数定義点がワール・セット・
    ノード内にあり、かつ候補メモリ参照命令が前記ワール
    ・セット・ノード内で見つからない場合に、前記ループ
    から出ない前記ループの横断上の前記定義点の直前また
    は直後のワール・セット・ノードから、最も近い候補が
    選択される、請求項11に記載の方法。
  16. 【請求項16】適当な候補のメモリ参照命令が見つかっ
    たとき、前記命令が更新命令に変換される請求項11に
    記載の方法であって、さらに、 新しい帰納変数を作成し、前記の元の帰納変数の値を前
    記の新しい帰納変数に割り当てる命令を、前記ループの
    プリヘッダに挿入する段階と、 前記の選択された候補の変位に等しい量を前記の新しい
    帰納変数に加算する命令を、前記プリヘッダに挿入する
    段階と、 前記の選択された候補メモリ参照命令を、選択されたタ
    ーゲット機械上の更新命令に変換する段階とを含む方
    法。
  17. 【請求項17】さらに、前記更新命令を、必要に応じて
    前記の選択されたターゲット機械によって支援される形
    式に変換する段階を含む、請求項16に記載の方法。
  18. 【請求項18】前記の変換段階が、 後増分命令を前増分命令に、または前減分命令を後減分
    命令に変換するように前記の新しい帰納変数から更新量
    を減算する命令を、前記ループの前記プリヘッダに挿入
    する段階と、 後減分命令を前減分命令に、または前増分命令を後増分
    命令に変換するように前記の新しい帰納変数に更新量を
    加算する命令を、前記ループの前記プリヘッダに挿入す
    る段階とのうちの1つを選択する段階を含む、請求項1
    7に記載の方法。
  19. 【請求項19】さらに、メモリ参照命令が更新命令に変
    換するために選択されたとき、前記ループ内のすべての
    メモリ参照命令を修正する段階を含む、請求項11、1
    2または13のいずれかに記載の方法。
  20. 【請求項20】さらに、メモリ参照命令が更新命令に変
    換するために選択されたとき、前記ループ内のすべての
    メモリ参照命令を修正する段階を含む、請求項14、1
    5または16のいずれか記載の方法。
  21. 【請求項21】さらに、メモリ参照命令が更新命令に変
    換するために選択されたとき、前記ループ内のすべての
    メモリ参照命令を修正する段階を含む、請求項17また
    は18のいずれかに記載の方法。
  22. 【請求項22】さらに、メモリ参照命令が更新命令に変
    換するために選択されたとき、前記ループ内のすべての
    メモリ参照命令を修正する段階を含む、請求項11、1
    2または13のいずれか1つに記載の方法であって、前
    記段階が、修正すべき各メモリ参照命令の変位から前記
    の選択されたメモリ参照命令の元の変位を減算する段階
    と、修正された各メモリ参照命令を、必要に応じて選択
    されたターゲット機械が受け入れできる更新形式に変換
    する段階とを含む方法。
  23. 【請求項23】さらに、メモリ参照命令が更新命令に変
    換するために選択されたとき、前記ループ内のすべての
    メモリ参照命令を修正する段階を含む、請求項14、1
    5または16のいずれか1つに記載の方法であって、前
    記段階が、修正すべき各メモリ参照命令の変位から前記
    の選択されたメモリ参照命令の元の変位を減算する段階
    と、修正された各メモリ参照命令を、必要に応じて選択
    されたターゲット機械が受け入れできる更新形式に変換
    する段階とを含む方法。
  24. 【請求項24】さらに、メモリ参照命令が更新命令に変
    換するために選択されたとき、前記ループ内のすべての
    メモリ参照命令を修正する段階を含む、請求項17また
    は18のいずれかに記載の方法であって、前記段階が、
    修正すべき各メモリ参照命令の変位から前記の選択され
    たメモリ参照命令の元の変位を減算する段階と、修正さ
    れた各メモリ参照命令を、必要に応じて選択されたター
    ゲット機械が受け入れできる更新形式に変換する段階と
    を含む方法。
  25. 【請求項25】さらに、メモリ参照命令が更新命令に変
    換するために選択されたとき、前記ループ内のすべての
    メモリ参照命令を修正する段階を含む、請求項11、1
    2または13のいずれかに記載の方法であって、前記段
    階が、修正すべき各メモリ参照命令の変位から前記の選
    択されたメモリ参照命令の元の変位を減算する段階と、
    修正された各メモリ参照命令を、必要に応じて選択され
    たターゲット機械が受け入れできる更新形式に変換する
    段階とを含み、前記の変換手段が、後増分命令を前増分
    命令に、または前減分命令を後減分命令に変換するため
    に修正すべきメモリ参照命令の変位値に更新量を加算す
    る段階、もしくは後減分命令を前減分命令に、または前
    増分命令を後増分命令に変換するために前記変位値から
    更新量を減算する段階を含む方法。
  26. 【請求項26】さらに、メモリ参照命令が更新命令に変
    換するために選択されたとき、前記ループ内のすべての
    メモリ参照命令を修正する段階を含む、請求項14、1
    5または16のいずれかに記載の方法であって、前記段
    階が、修正すべき各メモリ参照命令の変位から前記の選
    択されたメモリ参照命令の元の変位を減算する段階と、
    修正された各メモリ参照命令を、必要に応じて選択され
    たターゲット機械が受け入れできる更新形式に変換する
    段階とを含み、前記の変換段階が、後増分命令を前増分
    命令に、または前減分命令を後減分命令に変換するため
    に修正すべきメモリ参照命令の変位値に更新量を加算す
    る段階、もしくは後減分命令を前減分命令に、または前
    増分命令を後増分命令に変換するために前記変位値から
    更新量を減算する段階を含む方法。
  27. 【請求項27】さらに、メモリ参照命令が更新命令に変
    換するために選択されたとき、前記ループ内のすべての
    メモリ参照命令を修正する段階を含む、請求項17また
    は18のいずれかに記載の方法であって、前記段階が、
    修正すべき各メモリ参照命令の変位から前記の選択され
    たメモリ参照命令の元の変位を減算する段階と、修正さ
    れた各メモリ参照命令を、必要に応じて選択されたター
    ゲット機械が受け入れできる更新形式に変換する段階と
    を含み、前記の変換段階が、後増分命令を前増分命令
    に、または前減分命令を後減分命令に変換するために修
    正すべきメモリ参照命令の変位値に更新量を加算する段
    階、もしくは後減分命令を前減分命令に、または前増分
    命令を後増分命令に変換するために前記変位値から更新
    量を減算する段階を含む方法。
  28. 【請求項28】潜在的に更新命令に変換するのに適した
    メモリ参照命令を選択することによってコンピュータ・
    コードを最適化し、適切なことがわかった命令を更新命
    令に変換するための方法であって、 特定の帰納変数を使用する、ループ内のすべてのメモリ
    参照命令を検査し、帰納変数定義点に達する前記ループ
    の横断上で出会わない、または前記帰納変数定義点に達
    しておらず、かつ前記ループから出ない前記ループの横
    断上で出会った、すべてのメモリ参照命令を拒否する段
    階と、 拒否されなかった残りのメモリ参照命令から、前記の残
    りのメモリ参照命令のうちの少なくとも1つを、更新命
    令に変換すべき候補として選択する段階と、 前記の選択された候補命令の前記変換を補償するのに必
    要な、前記メモリ参照命令に対するオフセット補償を試
    み、成功した場合は、前記候補命令を更新命令に変換
    し、不成功であった場合は、前記候補命令を拒否する段
    階と、 変換するのに適した少なくとも1つのメモリ参照命令が
    見つかるか、またはすべてのメモリ参照命令が拒否され
    るまで、前記の選択及び拒否の過程を繰り返す段階とを
    含む方法。
  29. 【請求項29】さらに、前記帰納変数更新点を内部に含
    むサイド・ノードの外部にあるすべてのメモリ参照命令
    を拒否する段階を含む、請求項28に記載の方法。
  30. 【請求項30】さらに、前記帰納変数更新点を内部に含
    むワール・セット・ノードの外部にあるすべてのメモリ
    参照命令を拒否する段階を含む、請求項28に記載の方
    法。
  31. 【請求項31】予め選択されたターゲット機械が受け入
    れできる更新命令形式に変換できないすべてのメモリ参
    照命令を候補として拒否する段階を含む、請求項28に
    記載の方法。
  32. 【請求項32】適当な候補のメモリ参照命令が見つかっ
    たとき、前記命令が更新命令に変換される請求項28に
    記載の方法であって、さらに、 新しい帰納変数を作成し、前記の元の帰納変数の値を前
    記の新しい帰納変数に割り当てる命令を、前記ループの
    プリヘッダに挿入する段階と、 前記の選択された候補の変位に等しい量を前記の新しい
    帰納変数へ加算する命令を、前記プリヘッダに挿入する
    段階と、 前記の選択された候補メモリ参照命令を、選択されたタ
    ーゲット機械上の更新命令に変換する段階とを含む方
    法。
  33. 【請求項33】さらに、前記更新命令を、必要に応じて
    前記の選択されたターゲット機械によって支援される形
    式に変換する段階を含む、請求項32に記載の方法。
  34. 【請求項34】前記の変換段階が、 後増分命令を前増分命令に、または前減分命令を後減分
    命令に変換するように前記の新しい帰納変数から更新量
    を減算する命令を、前記ループの前記プリヘッダに挿入
    する段階と、 後減分命令を前減分命令に、または前増分命令を後増分
    命令に変換するように前記の新しい帰納変数に更新量を
    加算する命令を、前記ループの前記プリヘッダに挿入す
    る段階とのうちの1つを選択する段階を含む、請求項3
    3に記載の方法。
  35. 【請求項35】さらに、メモリ参照命令が更新命令に変
    換するために選択されたとき、前記ループ内のすべての
    メモリ参照命令を修正する段階を含む、請求項28、2
    9または30のいずれかに記載の方法。
  36. 【請求項36】さらに、メモリ参照命令が更新命令に変
    換するために選択されたとき、前記ループ内のすべての
    メモリ参照命令を修正する段階を含む、請求項31、3
    2または33のいずれかに記載の方法。
  37. 【請求項37】さらに、メモリ参照命令が更新命令に変
    換するために選択されたとき、前記ループ内のすべての
    メモリ参照命令を修正する段階を含む、請求項34に記
    載の方法。
  38. 【請求項38】さらに、メモリ参照命令が更新命令に変
    換するために選択されたとき、前記ループ内のすべての
    メモリ参照命令を修正する段階を含む、請求項28、2
    9または30のいずれかに記載の方法であって、前記段
    階が、修正すべき各メモリ参照命令の変位から前記の選
    択されたメモリ参照命令の元の変位を減算する段階と、
    修正された各メモリ参照命令を、必要に応じて選択され
    た目的機械が受け入れできる更新形式に変換する段階と
    を含む方法。
  39. 【請求項39】さらに、メモリ参照命令が更新命令に変
    換するために選択されたとき、前記ループ内のすべての
    メモリ参照命令を修正する段階を含む、請求項31、3
    2、または33のいずれかに記載の方法であって、前記
    段階が、修正すべき各メモリ参照命令の変位から前記の
    選択されたメモリ参照命令の元の変位を減算する段階
    と、修正された各メモリ参照命令を、必要に応じて選択
    されたターゲット機械が受け入れできる更新形式に変換
    する段階とを含む方法。
  40. 【請求項40】さらに、メモリ参照命令が更新命令に変
    換するために選択されたとき、前記ループ内のすべての
    メモリ参照命令を修正する段階を含む、請求項34に記
    載の方法であって、前記段階が、修正すべき各メモリ参
    照命令の変位から前記の選択されたメモリ参照命令の元
    の変位を減算する段階と、修正された各メモリ参照命令
    を、必要に応じて選択されたターゲット機械が受け入れ
    できる更新形式に変換する段階とを含む方法。
  41. 【請求項41】さらに、メモリ参照命令が更新命令に変
    換するために選択されたとき、前記ループ内のすべての
    メモリ参照命令を修正する段階を含む、請求項28、2
    9または30のいずれかに記載の方法であって、前記段
    階が、修正すべき各メモリ参照命令の変位から前記の選
    択されたメモリ参照命令の元の変位を減算する段階と、
    修正された各メモリ参照命令を、必要に応じて選択され
    たターゲット機械が受け入れできる更新形式に変換する
    段階とを含み、前記変換段階が、後増分命令を前増分命
    令に、または前減分命令を後減分命令に変換するために
    修正すべきメモリ参照命令の変位値に更新量を加算する
    段階、もしくは後減分命令を前減分命令に、または前増
    分命令を後増分命令に変換するために前記変位値から更
    新量を減算する段階を含む方法。
  42. 【請求項42】さらに、メモリ参照命令が更新命令に変
    換するために選択されたとき、前記ループ内のすべての
    メモリ参照命令を修正する段階を含む、請求項31、3
    2または33のいずれかに記載の方法であって、前記段
    階が、修正すべき各メモリ参照命令の変位から前記の選
    択されたメモリ参照命令の元の変位を減算する段階と、
    修正された各メモリ参照命令を、必要に応じて選択され
    たターゲット機械が受け入れできる更新形式に変換する
    段階とを含み、前記変換段階が、後増分命令を前増分命
    令に、または前減分命令を後減分命令に変換するために
    修正すべきメモリ参照命令の変位値に更新量を加算する
    段階と、もしくは後減分命令を前減分命令に、または前
    増分命令を後増分命令に変換するために前記変位値から
    更新量を減算する段階を含む方法。
  43. 【請求項43】さらに、メモリ参照命令が更新命令に変
    換するために選択されたとき、前記ループ内のすべての
    メモリ参照命令を修正する段階を含む、請求項34に記
    載の方法であって、前記段階が、修正すべき各メモリ参
    照命令の変位から前記の選択されたメモリ参照命令の元
    の変位を減算する段階と、修正された各メモリ参照命令
    を、必要に応じて選択されたターゲット機械が受け入れ
    できる更新形式に変換する段階とを含み、前記変換段階
    が、後増分命令を前増分命令に、または前減分命令を後
    減分命令に変換するために修正すべきメモリ参照命令の
    変位値に更新量を加算する段階、もしくは後減分命令を
    前減分命令に、または前増分命令を後増分命令に変換す
    るために前記変位値から更新量を減算する段階を含む方
    法。
JP3040549A 1990-02-14 1991-02-13 コンパイラの最適化方法 Expired - Lifetime JP2838855B2 (ja)

Applications Claiming Priority (2)

Application Number Priority Date Filing Date Title
CA002010056A CA2010056C (en) 1990-02-14 1990-02-14 Method for improving the efficiency of arithmetic code generation in an optimizing compiler using machine independent update instruction generation
CA2010056 1990-02-14

Publications (2)

Publication Number Publication Date
JPH04215132A JPH04215132A (ja) 1992-08-05
JP2838855B2 true JP2838855B2 (ja) 1998-12-16

Family

ID=4144296

Family Applications (1)

Application Number Title Priority Date Filing Date
JP3040549A Expired - Lifetime JP2838855B2 (ja) 1990-02-14 1991-02-13 コンパイラの最適化方法

Country Status (4)

Country Link
US (1) US5287510A (ja)
EP (1) EP0442622A3 (ja)
JP (1) JP2838855B2 (ja)
CA (1) CA2010056C (ja)

Families Citing this family (28)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US5418959A (en) * 1992-11-30 1995-05-23 Intel Corporation Instruction operation size optimization
JPH06314203A (ja) * 1993-04-28 1994-11-08 Fujitsu Ltd コンパイラの最適化方法および装置
US5485619A (en) * 1993-12-29 1996-01-16 International Business Machines Corporation Array variable transformation system employing subscript table mapping to scalar loop indices
US5537620A (en) * 1994-09-16 1996-07-16 International Business Machines Corporation Redundant load elimination on optimizing compilers
US5854933A (en) * 1996-08-20 1998-12-29 Intel Corporation Method for optimizing a computer program by moving certain load and store instructions out of a loop
US6031994A (en) * 1997-04-01 2000-02-29 Intel Corporation Method for determining the set of variables that may be ambiguously defined at a point in a computer program
US6002879A (en) * 1997-04-01 1999-12-14 Intel Corporation Method for performing common subexpression elimination on a rack-N static single assignment language
US5991540A (en) * 1997-04-01 1999-11-23 Intel Corporation Method for identifying partial redundancies in existing processor architectures
US6151704A (en) * 1997-04-01 2000-11-21 Intel Corporation Method for optimizing a loop in a computer program by speculatively removing loads from within the loop
US5999735A (en) * 1997-04-01 1999-12-07 Intel Corporation Method for constructing a static single assignment language accommodating complex symbolic memory references
US6029005A (en) * 1997-04-01 2000-02-22 Intel Corporation Method for identifying partial redundancies in a new processor architecture
JP4739465B2 (ja) 1997-06-09 2011-08-03 インタートラスト テクノロジーズ コーポレイション ソフトウェアセキュリティを増強するための混乱化技術
US5903761A (en) * 1997-10-31 1999-05-11 Preemptive Solutions, Inc. Method of reducing the number of instructions in a program code sequence
US6463579B1 (en) * 1999-02-17 2002-10-08 Intel Corporation System and method for generating recovery code
US6598221B1 (en) * 2000-04-13 2003-07-22 Koninklijke Philips Electronics N.V. Assembly code performance evaluation apparatus and method
US6862730B1 (en) * 2000-04-26 2005-03-01 Lucent Technologies Inc. Register allocation in code translation between processors
US7278137B1 (en) * 2001-12-26 2007-10-02 Arc International Methods and apparatus for compiling instructions for a data processor
JPWO2004068342A1 (ja) * 2003-01-28 2006-05-25 カテナ株式会社 ソフトウェア開発前処理方法、ソフトウェア制御方法、ソフトウェア開発方法並びにソフトウェア開発装置
US20040184070A1 (en) * 2003-03-18 2004-09-23 Microsoft Corporation Network printer connection update scheme for printer clients
US7409678B2 (en) * 2004-01-28 2008-08-05 International Business Machines Corporation Compiler, compilation and storage
US8266608B2 (en) * 2005-02-18 2012-09-11 Green Hills Software, Inc. Post-compile instrumentation of object code for generating execution trace data
US9152531B2 (en) * 2005-02-18 2015-10-06 Green Hills Sofware, Inc. Post-compile instrumentation of object code for generating execution trace data
US7594223B2 (en) * 2005-06-27 2009-09-22 Hewlett-Packard Development Company, L.P. Straight-line post-increment optimization for memory access instructions
US8087011B2 (en) * 2007-09-26 2011-12-27 International Business Machines Corporation Domain stretching for an advanced dual-representation polyhedral loop transformation framework
US8087010B2 (en) * 2007-09-26 2011-12-27 International Business Machines Corporation Selective code generation optimization for an advanced dual-representation polyhedral loop transformation framework
US8060870B2 (en) * 2007-09-26 2011-11-15 International Business Machines Corporation System and method for advanced polyhedral loop transformations of source code in a compiler
US8056065B2 (en) * 2007-09-26 2011-11-08 International Business Machines Corporation Stable transitions in the presence of conditionals for an advanced dual-representation polyhedral loop transformation framework
US8732679B2 (en) * 2010-03-16 2014-05-20 Qualcomm Incorporated Loop transformation for computer compiler optimization

Family Cites Families (7)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPS6240539A (ja) * 1985-08-19 1987-02-21 Fujitsu Ltd コンパイラにおける最適化処理方式
JPH0795274B2 (ja) * 1986-09-19 1995-10-11 株式会社日立製作所 配列添字解析方法
US4802091A (en) * 1986-10-31 1989-01-31 International Business Machines Corporation Method for improving the efficiency of arithmetic code generation in an optimizing compiler using the technique of reassociation
JPS6441969A (en) * 1987-08-10 1989-02-14 Hitachi Ltd Multiplex loop processing method
JP2749039B2 (ja) * 1987-11-06 1998-05-13 株式会社日立製作所 オブジェクト生成方法
US5170465A (en) * 1989-06-30 1992-12-08 Digital Equipment Corporation Incremental-scanning compiler for source-code development system
US5182806A (en) * 1989-06-30 1993-01-26 Digital Equipment Corporation Incremental compiler for source-code development system

Also Published As

Publication number Publication date
EP0442622A2 (en) 1991-08-21
CA2010056C (en) 1998-05-12
JPH04215132A (ja) 1992-08-05
CA2010056A1 (en) 1991-08-14
EP0442622A3 (en) 1993-06-23
US5287510A (en) 1994-02-15

Similar Documents

Publication Publication Date Title
JP2838855B2 (ja) コンパイラの最適化方法
EP0273130B1 (en) Reassociation process for code optimization
US8024718B2 (en) System and method for optimizing source code
US5606697A (en) Compiler system for language processing program
EP0735468B1 (en) Method and apparatus for an optimizing compiler
JP2834171B2 (ja) コンパイル方法
EP0118829A2 (en) Compilation of perform statements
US5367683A (en) Smart recompilation of performing matchup/difference after code generation
US7823139B2 (en) Method and system for translating programming languages
JPH0814817B2 (ja) 自動ベクトル化方法
JPH05257709A (ja) 並列化判別方法およびそれを用いた並列化支援方法
US6317873B1 (en) Assembly language translator
US6029005A (en) Method for identifying partial redundancies in a new processor architecture
US20020166115A1 (en) System and method for computer program compilation using scalar register promotion and static single assignment representation
JP3539613B2 (ja) ループ飛び出し文を含むループに対する配列サマリ解析方法
US5446899A (en) Hint generation in smart recompilation
US5418959A (en) Instruction operation size optimization
EP1164477A2 (en) A loop optimization method and a compiler
US5560010A (en) Method for automatically generating object declarations
US6256782B1 (en) Compile apparatus, compile method and computer-readable medium storing compiler
JP3266097B2 (ja) 非リエントラントプログラムの自動リエントラント化方法及びシステム
US6351849B1 (en) Compiler optimization through combining of memory operations
EP0856789A2 (en) Smart recompilation of source program
Henin et al. A LIS compiler for GCOS‐7
JPH11161500A (ja) 実行時依存解析を行う目的プログラムの生成方法