JP3280449B2 - コンパイル装置 - Google Patents
コンパイル装置Info
- Publication number
- JP3280449B2 JP3280449B2 JP03984193A JP3984193A JP3280449B2 JP 3280449 B2 JP3280449 B2 JP 3280449B2 JP 03984193 A JP03984193 A JP 03984193A JP 3984193 A JP3984193 A JP 3984193A JP 3280449 B2 JP3280449 B2 JP 3280449B2
- Authority
- JP
- Japan
- Prior art keywords
- optimization
- intermediate representation
- expression
- compiler
- phase
- 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 - Fee Related
Links
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/44—Encoding
- G06F8/443—Optimisation
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
イラの最適化効果を促進させるコンパイル装置に関す
る。
求に伴い,1サイクルで同時に複数命令を実行できるプ
ロセッサやベクトル演算が可能なマシンが数多く開発さ
れている。それに伴い,最適化コンパイラへの要求が高
まっている。
FORTRAN,COBOL等のプログラミング言語)
から,他の言語B(例えば,アセンブラ言語)へ変換す
るものと考えることができる。一方,コンパイラにおけ
る「最適化」とは,変換後の言語Bが,元の言語Aの意
味を変えずに高機能(実行速度が速い,または必要とす
るメモリ領域を少なくする等)であるように,変換を行
う機能を意味するものとして用いられる。
グラムを実行するマシン(コンピュータ,ワークステー
ション等)と独立した中間表現(中間言語,中間テキス
ト,内部表現等と同義)ベースで行われる。つまり,必
要のない中間表現を削除したり,効率的な処理のために
移動したり,同様な処理を共通化することによって,実
際の目的コードの最適化が図られる。従って,中間表現
の選択は,最適化処理の能力や,処理自体にかかるスピ
ードに影響する。しかし,最適化にはさまざまな種類が
存在し,それぞれが,最終目的とするものが異なること
が多いので,ある特定の観点から,中間表現の形態や情
報を固定してしまっては,促進できない最適化が存在す
る。
ブラ言語(または機械語)に変換する場合の,一般的に
使用されているコンパイラにおける最適化に関するもの
である。
うに中間表現を削除したり,移動したり,共通化するこ
とによって実際の目的コードを高速に,またはサイズを
小さくして効率のよいものにすることを目標としてい
る。
け独立に設計することにより最適化やコード生成部の共
通化,部品化を図るのが一般的である。例えば,文献
1:A.V.エイホ他著「コンパイラ−原理・技法・ツ
ール」サイエンス社発行,文献2:「中間言語の考え
方」,インタフェース,1989,Mar.p211−
219に記載されている。
図である。図中,100はソースプログラムをコンパイ
ルに適用するための中間表現の形式で保持するフロント
エンド部であり,このフロントエンド部の中間表現は,
最適化部101において最適化が施されて,高速化及び
サイズの縮小が行われて,最適化の結果はコード出力部
102に供給されると,コード出力部102はマシンに
依存したプログラム言語(各マシンに対応するマシン語
等)のコード出力を行う。
理は,言語・マシンに独立な中間表現に対して行うよう
に設計されている。なお,途中で中間表現の構造等を変
化させるコンパイラも存在する,例えば,文献3として
S.S.Muchnick,`Optimizing Compilers For SPARC’,
Technology,1988 , 文献4としてGhodssi,Vida, S.S. M
uchnick, Alex Wu, `A Global Optimizer for Sun FOR
TRAN, C and Pascal', USENIX Conference ,1986 に記
載されている。しかし,これらは主として,コンパイル
時のある部分の処理を既存のもので置き換えるために用
いられる。また,これらは,中間表現のデータ構造の物
理的メモリマップ構造が変化している。
号公報に,最適化コンパイラの構造に関して開示され,
その目的として,処理効率のよい最適化処理の実現,
最適化の情報収集の処理効率の向上,最適化項目の
検出時間の短縮,原子プログラムの副作用の要因の排
除,原子プログラムの副作用の排除を挙げ,中間語
(中間表現)の変換や最適化をそれぞれ一回ずつ行って
いる。
に,ある決まった中間表現のまま最適化部を設計し,実
現する方式では,以下のような問題点が存在する。
するとは限らないので,命令スケジューリングのように
各マシン命令を何処に持って行くかの判断を行う機能を
コンパイルするような場合,1つの中間表現が複数のマ
シン命令に対応するとマシン命令に依存した最適化を中
間表現により効率的に適用できない。
全ての中間表現をマシン命令と1対1に対応付けて構成
すると,次のような問題が発生する。 a.フロントエンドは,一般にターゲット(マシン)
に,無依存に中間表現を作成する。もし,そのようにし
ないと,各ターゲット毎に中間表現が変わるため,コン
パイラを作成するたびに,フロントエンド部分を作成す
る必要が出てくるからである。
1対1にしてしまうと,最適化処理の実現が難しくな
る。まず,中間表現の数が増えるために,最適化処理の
時間がかかるようになる。さらに,処理自体も複雑にな
る。
いて説明する。仮にマシンのアーキテクチュアが,命令
語が32ビットであり,32ビットのアドレスを1回で
ロード・ストアできないような場合,ロードやストアの
命令で32ビットをアドレスする場合,2つの命令を組
み合わせて一つのロードやストアの命令となる。この場
合,フロントエンドで中間表現と命令を1対1に対応さ
せるということは,最適化の処理が,2つの特定の命令
については一つの命令であることを識別する必要があ
る。これは,ロード命令という一つの命令だけを識別す
るだけでは済まないので,処理が複雑になることは明ら
かである。
現にのみ適用されることにより, 最適化処理の適用の制
限事項(フロントエンドに対する制限等)が大きくな
る。また,上記の文献3,文献4に記載されたような中
間表現の構造等を変化させる手法は,中間表現のデータ
構造の物理的構造が全く異なるため,最適化処理の共通
化を適用することによる効率が悪い。
最適化処理への要求を満たすために,コンパイラがその
ターゲットアーキテクチャと入力ソース及び,それらの
必要な最適化に応じて,高性能のオブジェクトを出力す
ることができるコンパイラ構成方式を提供することを目
的とする。また,中間表現の変換や最適化処理を共通化
してコンパイラ自身を効率化できるコンパイル装置を提
供することを目的とする。
成図である。図1において,1はソースプログラム,2
はソースプログラムSに対応する中間表現を出力するフ
ロントエンド部,3は最適化の構造決定を行う通常の処
理ではオン状態であるスイッチ,4は最適化構造決定手
段,5は最適化手段,6は中間表現変換手段,7は判定
手段,8はコード出力手段,9はオブジェクトプログラ
ムである。なお,最適化構造決定手段4は,コンパイラ
内部または外部に設けることができ,決定した内容は最
適化手段5,中間表現変換手段6に指示される。
表現やオブジェクトプログラムを出力するための中間表
現の情報を格納した中間表現データファイル,11は最
適化構造決定に必要なデータや,決定された最適化情報
を格納する最適化処理データファイル,12はフロント
エンドの中間表現構造情報,13は中間表現変換手段6
における変換により発生した中間表現構造情報である。
ントエンド部のソースレベルとターゲット(マシン)を
元に,最適化の項目とその最適化を実行するのに必要な
中間表現の変換回数を決定し,最適化手段及び中間表現
変換手段によるループ動作を決定した回数を実行して最
適化を行い,必要なら同じ最適化を複数回適用すること
により,各ターゲットや入力ソースに対応した高性能の
オブジェクトを得るものである。
ラムがフロントエンド部2によって中間表現に変換され
る。スイッチ3は,最適化構造決定手段4における処理
を省略することができるように選択を行うスイッチであ
り,このスイッチ3のオン・オフは最適化レベルまたは
オプションにより決定することができる。
プログラム(ソースプログラム)に対し予め用意された
最適化フェーズ(最適化と中間表現の組み合わせ)の回
数とその処理内容(最適化の内容と中間表現の仕様)
が,最適化手段5と中間表現変換手段6により予め設定
され,その設定された内容により処理を行い,判定手段
7により予め決められた回数の動作後にコード出力手段
8でコード出力が行われてオブジェクトプログラム9が
得られる。
コンパイラの内部または外部に設けられた最適化構造決
定手段4は,予め供給されるフロントエンドの中間表現
とオブジェクトプログラム(ターゲットマシン)の情報
を中間表現データファイル10から得て,要求される最
適化の項目(内容)等の最適化情報を最適化処理データ
ファイル11から得て,最適化と中間表現変換の回数を
決定する。例えば,単純な構造の場合,ソースレベル
(ソースプログラム依存)の最適化と中間表現変換,及
びオブジェクトレベル(ターゲットまたはマシン依存)
の最適化と中間表現変換の合計2回実行するよう決定す
る。
目と中間表現の変換回数が決まると,最適化手段5,中
間表現変換手段6及び判定手段7に対して指示が行われ
て最適化動作が実行される。最初はフロントエンド部2
からの中間表現構造情報12に対して,ソースレベルで
実行される最適化を最適化手段5において実行し,その
結果を中間表現変換手段6により,中間表現の全部また
は一部を変換して中間表現構造情報13を得る。判定手
段7は最適化構造決定手段4から指示された,回数だけ
ループ動作を実行するよう判断し,最適化手段5,中間
表現変換手段6は各ループにおいてそれぞれ指定された
最適化及び中間表現の変換を行う。
ことを判定すると,最後に得られた中間表現構造情報1
3(マシン依存の中間表現)をコード出力手段8におい
てコード出力に変換し,オブジェクトプログラム(マシ
ン言語)が得られる。なお,この判定手段7は,最適化
手段5及び中間表現変換手段6のそれぞれが,予め指定
された回数の最適化及び中間表現変換を実行したか否か
を判定する機能を備えることにより実現することがで
き,その場合は判定手段7を別に設ける必要がない。
指定して,最初の中間表現に対する最適化では適用でき
なかった最適化を後の中間表現に対して適用でき,また
命令スケジューリングを行う場合にも,マシン命令と中
間表現が1対1に対応する段階で実行して,各最適化の
項目に適した中間表現において最適化を施すことができ
るため,コンパイラの最適化の効果を上げることが期待
できる。
変換機能を備える場合は,独立したフェーズとして中間
表現変換手段6を必ずしも別に設ける必要がない。
図2には最適化構造決定の処理フローと関連するデータ
を示し,20はソースプログラムにより作成したフロン
トエンドから出力される中間表現(入力プログラム言語
に依存)の特性(種別)を表すデータ(図1の10に対
応),21は最適化終了後にオブジェクトのコードを出
力する機能を持つコード出力部が入力すべき中間表現
(マシン依存)の特性(種別)を表すデータ,22は最
適化処理の決定に必要なデータ及び決定された最適化及
び中間表現変換のループの回数,それぞれの内容を含む
最適化処理データ(図1の11に対応)である。
適化処理のピックアップが行われる(図2のS1),こ
の処理では,最適化コンパイラを作成するためには,そ
のコンパイラが持つべき最適化の項目をピックアップす
る。すなわち,フロントエンドの中間表現,最後のコー
ド出力部へ入力する中間表現を表すデータ20,21に
対応して種々の最適化処理の項目が最適化処理データ2
2に予めリストされており,最適化コンパイラによって
実施すべき最適化の対象となる項目が選択される。この
選択はコンパイラ作成者により選択できる。
いて,どの段階で実施するかを分類する(図2のS
2)。すなわち,各項目が,フロントエンド出力である
中間表現に対して最適化するか,コード出力の前段階で
ある最後の中間表現に対して最適化するか,それらの中
間の段階で最適化するか,またはスケジューリングの段
階か等に分類分けする。この時,次の,の観点に基
づいて分類を行う。
の物理的メモリマップ構造の違いに対応して分類する。 適用する最適化が影響するものに対応して分類する。
の構造(ループ構造,条件文等)に依存しているもの
か,ターゲットマシンのアーキテクチャ(並列構造か,
レジスタ構造等)に依存しているものか,両方に有効な
ものかを識別してそれぞれに分類する。分類された結果
は,最適化処理データ22の中に設定される。
2のS3)。この処理は,2つの段階で構成され,最初
に中間表現の変換回数の決定が行われる(同S30)。
この場合,原則的には,上記最適化処理の分類により得
られた分類の個数に対応した変換回数に決定されるが,
他に,中間表現の形態や最適化処理の中間表現の依存条
件により中間表現の変換回数が考慮される。
S31)。この最適化適用の決定は次の3つの処理によ
り構成される。最初に,中間表現の形態や中間表現依存
条件に対応して各フェーズにおいて適用可能な最適化を
挙げる(同S310)。次に各項目の適用条件に照らし
て,適用可能なものを絞りこむ(同S311)。最後
に,依存関係(フロントエンドの中間表現に依存か,タ
ーゲットの中間表現に依存か等)により,最適化が実行
される順序を決定する(同S312)。
と,その決定結果により最適化及び中間表現変換が実行
されて,各フェーズに応じた最適化が行われると共に,
中間表現が変化して,最後に最適化されたオブジェクト
プログラムがコード出力される。
を図3乃至図6に示す具体例により説明する。この具体
例は,並列RISC(Reduced Instruction Set Comput
er) 向けのコンパイラである。RISCアーキテクチャ
は,一般にメモリの参照はロード・ストア命令のみが行
うことができ,演算は全てレジスタ間で行うことによっ
てハードウェアの高速化を図っている。並列RISCア
ーキテクチャは,RISCアーキテクチャのうち命令を
同時に複数個実行できる機能をもったものであり,その
ようなアーキテクチャ向けのコンパイラの例について説
明するが,他のあらゆるプロセッサに関しても同様に実
施することができる。また, この具体例では,フロント
エンドはターゲットに関係なく言語毎に一つである,と
いう前提条件がある。この前提条件は,対象となるアー
キテクチャが異なっても,言語自体の仕様は変わらない
ので当然の正当な条件である。
間表現のデータの例であり,Aはフロントエンドが出力
する中間表現の集合,Bはコード出力のための中間表現
の集合を表し,Aは入力となるプログラム言語に依存
し,Bはターゲットアーキテクチャに依存する。各集合
は上記図2の各データ20,21として最適化構造決定
のための既知情報として用意される。
した中間表現の属性が記述され,最初に,フロントエン
ドが出力する中間表現の形態(LINDA という中間表現の
総称名を持つ),次にLOADというコード(演算子) ,
データの型(i1〜i4は1乃至4バイトのサインデータ,u
1 〜u4は1乃至4バイトのアン・サインデータ,r8〜r1
6 は8乃至16バイトの浮動小数点データ,c8〜c32 は
8乃至32バイトの固定小数点データ),オペランド
(1つ持つ型と2つ持つ型がある),条件としてバウン
ダリ(×は保障しないことを表示),アドレス表現(3
つの値でアドレスを表す)が規定され,以下,コード
(演算子)のLOAD,cmove等(他のコードにつ
いては図示省略)について同様なデータが用意される。
に依存するコード出力のための中間表現が,Aと同様の
形式で用意されているが,その内容は必ずしも一致しな
い。例えば,LOADでは,データの型が制限(r16 ,
c8〜c32 は使用できない)され,cmoveのコードが
無くなっている。
処理をピックアップすると,図4に示すようにこの実施
例で実現すべき最適化の項目が得られる。図4におい
て,NO.1〜NO.22の各番号に対し,最適化の名
称が示され,例えば,NO.1の「CONSTANT FOLDING」
は定数をまとめる最適化(例えば,「1+3」とあった
ら,「4」として扱う)であり,NO.2の「CONSTANT
PROPAGATION」は定数を伝播する最適化である,等の各
項目がある。なお,図4のMPA,MPB,SCHの説
明は後述する。これらの情報も既知情報として,図2の
最適化処理データ22中に入・出力の中間表現に関する
既知情報と共に,適用される最適化に関する情報を格納
したテーブル(データベース)として格納される。
一部の例である。図5にはエントリ番号(図4のNOに
対応)1,4,14,16,18及び22の各情報だけ
示す。エントリ番号1の場合,最適化名はconstant fol
ding (定数をまとめる) という最適化で, 適用する中間
表現の形態,演算子は「*」と表示され( *はDon'tcar
e,すなわち当該最適化の処理では無関係であることを
表す),オペランドはcnt(定数),中間表現依存条
件,等の各データが設定されている。また,エントリ番
号4の最適化名CSE(Common Sub-expression Elimin
ation:共通部分式を除去する最適化)では,中間表現依
存条件の中に,バウンダリについて「×」と表示されて
いる(×は,保障しないことを意味する)。以下,各最
適化の番号(エントリ番号)14,16,18,22に
関して図5のような情報が作成されている。
に図2に示す構造決定の処理フローが実行される。な
お,フロントエンドが出力する中間表現の集合aとコー
ド出力のための中間表現の集合bが,全て一致した場合
は,中間表現の変更は不要であるが,図3の例のように
一致しない場合は,図2に示す構造決定の処理が行われ
る。
うにピックアップされ(図2のS1の処理),それぞれ
の最適化処理を上記図2の最適化処理の分類(図2のS
2)について説明した,の観点に従って分類する。
この具体例では,後述するように,中間表現のデータ構
造の物理的メモリマップ構造を同じにしているため,上
記の観点での分類は行う必要が無い。については,
言語及びプログラム構造に依存している最適化とは,最
適化が実施される項目が,入力するプログラムの構造や
変数であるようなものである。またアーキテクチャに依
存した最適化とは,実際のターゲットとなるマシンのア
ーキテクチャの仕様を意識した最適化である。
スタ割り付けや,命令スケジューリング等に代表される
が,アーキテクチャによって異なるので,これらの命令
に関する最適化もアーキテクチャ依存の最適化に属す
る。この実施例では,アーキテクチャ依存の最適化を更
に2つに分類した。すなわち,イ.命令数を減らす,よ
り高速の命令に変更する等(例えば,乗算を加算の繰り
返しに変更する等),命令自体を出力するまたは出力し
ないに関する最適化ロ.命令の出力する順序に関する最
適化上記したことを基準にして,図4の番号1〜22の
各最適化の項目について分類すると,図4の右側に示す
MPA,MPB,SCHに分類される。ここで,MPA
は言語依存(ソースプログラム言語に依存)の最適化で
あり,MPAの欄に○が付されている最適化の項目は,
言語依存の最適化として実施されることを示す。
マシンのマシン命令)の最適化であり,MPBに○が付
された最適化の項目は命令の出力に関連する最適化とし
て実施する。SCHに○が付された最適化は,アーキテ
クチャ依存の最適化の内,命令実行順序に関する最適化
として実行するものである。なお,図4の中で,複数の
分類で○が付された最適化は,同じような最適化を,異
なった中間表現をターゲットとして複数回実行すること
を意味している。
ンパイラ構造の決定が行われる(図2のS3)。ここ
で,最初に中間表現を何回変更するか決定する(図2の
S30),各最適化処理テーブル(図5参照)の中間表
現の形態の種類と中間表現依存条件の場合の数の組み合
わせで求められる。すなわち,中間表現の形態は,「LI
NDA 」という1種類であり,中間表現依存条件の場合の
数は,無関係を表す「*」が付された要素を除外する
と,「バウンダリ」に関して,次の2つのパターンがあ
る。
ズ3とする) バウンダリ:× アドレス 2 (フェー
ズ2とする) これと,フロントエンド時の出力である バウンダリ:× アドレス 3 (フェー
ズ1とする) を合わせて,全部で3形式必要であることが分かる。
か設定する(図2のS31)。ここでは,最適化処理テ
ーブル(図5)の中間表現の形態,及び中間表現依存条
件から,フェーズ1,フェーズ2,フェーズ3で適用可
能な最適化を選ぶ(図2の310)。この図5の各最適
化の項目(エントリ番号)については,次のように選択
できる。なお,1,4,14・・の各数字はエントリ番
号を表す。
て,適用を絞りこみ(図2の311),次のようにな
る。
2の312)。
但し,(1,4)は何れを先に行っても良いことを意味
する。 フェーズ2:(1,4),18 フェーズ3:22 このようにしてこの具体例における,最適化構造が決定
される。この決定による最適化及び中間表現の変更の処
理は自動化される。自動化した場合に備えるデータは次
のようなものである。
データ構造を定義する。 2)各データは,記号化(文字列または番号化)するこ
とにより,コンパイラの内部構造として持つ。
ルと最適化処理のテーブルのデータ構造を示す。A.は
中間表現のテーブルであり,「IML」は中間表現を意
味し,中間表現形態(IML-TYPE) ,演算コード(CODE-TY
PE),型のリスト, オペランドのリスト等の各項目が定義
される。B.は最適化処理のテーブルの構造であり,最
適化番号,最適化名,中間表現の形態,適用演算子リス
ト等の各項目が定義される。なお,これらのデータは,
図1に示す構成において,最適化処理データファイル1
1に格納される。
いて説明する。図7は実施例のコンパイラの構成図であ
る。このコンパイラの構成は,上記,図2に示す最適化
構造決定のフローにより以下のように決定された結果得
られる。
のプログラムに関するコンパイラの最適化構造が決定さ
れることにより,最適化コンパイラの構造が決定され,
これに基づいて,図7に示す実施例の最適化コンパイラ
の構成が得られる。
乃至フェーズ3(各フェーズは上記図4のMPA,MP
B及びSCHの各分類に対応する)の3回であり,中間
表現の変換が3回行われる。但し,最初の変換は,ソー
スプログラムからフロントエンドにより最初の中間表現
に変換することであるから,その後2回の中間表現の変
換が行われる。
はソースプログラムレベルの中間表現(これを1回目の
中間表現とする)が格納されている。このフロントエン
ド70の後の中間表現に対し,71で示す最適化Aが実
行される。この最適化処理Aは図4の分類MPA(フェ
ーズ1)に属する各最適化の項目について実行される。
この後,IE (Interface Expansion)1で示す中間表現
変換72で2回目の中間表現の変換が行われる。この変
換でターゲット命令レベルの最適化用の中間表現に変換
され,この中間表現に対し73で示す最適化Bが実行さ
れる。
ェーズ2)に属する各最適化が実行され,その結果に対
し次にIE2で示す3回目の中間表現変換74が行われ
る。この変換で命令スケジューリング用の中間表現が得
られ,この中間表現に対し命令スケジューリング75が
実行される。この命令スケジューリング75では,上記
図4の分類SCH(フェーズ3)の最適化(図4の番号
22)が実行され,その結果はコード出力76の処理が
実行される。
上記に示したように第1回目の中間表現とした。フロン
トエンドは,一般にターゲットに無依存に中間表現を作
成する。もし,そのようにしないと,各ターゲット毎に
中間表現が変わるため,コンパイラを作成するたびに,
フロントエンド部分を作成する必要があるからである。
追加する場合,または最適化の仕様が変更になった時
は,図2に示す最適化構造決定の処理フローのS1〜S
3で示すステップを繰り返して,コンパイラの構造を決
定すればよい。これにより,最適化の分類が増加する場
合には,新たに,中間表現を変更する部分を設けること
により高性能なオブジェクトを出力するためのコンパイ
ラの構造を得ることができる。
ら選択等の入力設定により実現することもできるが,上
記図6のように最適化処理の仕様をテーブルに登録して
おくことにより,条件に合う最適化処理を取り出すよう
にして自動化することができる。この場合,最適化構造
決定の処理が不用となり,コンパイラの構成は,図1の
構成においてスイッチ3がオフに設定された状態に対応
する。
候補を選び,それぞれについて最適化処理を独立して行
い,その中から最適なものを選ぶことによって,高性能
オブジェクトを得ることができる。
ぞれ独立に最適化効果処理を行う場合は,プロセッサ
が複数ある時は,各プロセッサにそれぞれの最適化処理
をアサインする。一つのプロセッサで行う時は,コー
ド出力の直前から,最適化にループする。ループの回数
は候補の数でもある。各候補について,結果の中間表現
列をリストにして格納しておく。
に対して,実行時間を見積もり,最短のものをコード化
する。実行時間の見積もりは,各中間テキストに対応す
る命令が分かるのでその命令の実行時間がわかる(これ
は,命令スケジューリング時に必要なアーキテクチャ情
報である)。ループに関しては,ループの数が静的に分
かっている場合は,その数だけ掛け算をする。分からな
い場合は,同じ定数を掛ければ,どのコードも条件は同
じなので,大きく誤ることはない。
ーズとして,コンパイラ内部に持つことにより,入力プ
ログラムに応じて最適化処理の適用を制御することがで
きる。
いて説明する。上記図7の実施例では,フロントエンド
の出力は,最適化及び中間表現変換の各処理を通過する
ようになっているが,各フェーズにおける各最適化処理
を実行するか否かを切替える選択スイッチ(図1のスイ
ッチ3と異なる)を,各最適化処理及び中間表現変換処
理の前段に設ける。この選択スイッチは,コンパイラの
外部から操作することにより任意のフェーズの任意の最
適化を止めるように切替えられる。このような,機能を
コンパイラのオプションとして備え,そのオプションが
立っていると,その最適化をパスする(リターンす
る)。これにより,翻訳時間の短縮や,コンパイラ作成
時のデバッグを効率的化する。
中間表現をプリントする処理を付加することができる。
すなわち,各フェーズにおける中間表現をプリント機能
に対し出力してプリントアウトするか否かを選択する選
択スイッチを設ける。この選択スイッチは,上記各フェ
ーズにおける最適化処理を実行するか否かを選択する選
択スイッチと異なる。この中間表現のプリント機能を,
プログラムのデバッグまたはコンパイラの処理中に,オ
プション制御により呼び出すことにより,任意のフェー
ズの任意の場所における中間表現を出力することがで
き,デバッグ効率を向上することができる。
用いた具体的なプログラムの例に対する各最適化のフェ
ーズにおける中間表現の例を図8乃至図15に示す。図
8は実施例のコンパイラの動作を説明するためのプログ
ラム例,図9は実施例のプログラム例に対するフロント
エンドの出力,図10は実施例のプログラム例に対する
最適化A後の出力,図11及び図12は実施例のプログ
ラム例に対する中間表現変換(IE1)後の中間表現,
図13及び図14は実施例のプログラム例に対する最適
化B後の出力である。
かの主要な符号について説明する。Slabel-n(0<=n)
は,基本ブロックを示し,そのブロックを構成する中間
テキストが,それ以下に羅列される。
タ) オペランドの並び」というように表現され,オペ
ランドとオペレータの間は空白で区切られている。各オ
ペランドに関して説明すると,以下の通りである。
フロントエンド終了後に,中間表現として図9に示すよ
うなフロントエンド出力が発生する。このフロントエン
ドの出力は,完全に命令と中間表現が1対1に対応して
なく,この状態では最適化処理が不十分な状態である。
化A(図7の71)において,図4のMPAの欄に○が
付された各項目の最適化が実行される。この最適化A後
の出力は図10のようになる。図9と図10を参照する
と最適化の効果が分かる。すなわち,この中間表現形態
では,例えば,変数XXや,配列要素dd(i) 等は,それら
を一まとまりとして扱うことができることが分かる。ま
た,構造体の代入に関しては,1つの中間表現で実現さ
れている。
E1(図7の72)において,中間表現が変換されて図
11,図12に示す中間表現が得られる。このIE1で
は,最適化Aの結果得られる中間表現をターゲットの命
令セット及び次に行われる最適化B(図7の73)の最
適化機能に応じて変換し,IE1の目的は,最適化Bの
対象となるものを,中間表現として明確に表すことであ
る。
XXとかdd(i)というように表現されていたもの
が,そのアドレッシングに応じて,中間表現の数が増え
たり,オペランドの表現が変換していることが示されて
いる。また,構造体の代入文は,ループ構造になってい
ることも示されている。さらに,IE1の変換の実現に
関しては,入力された中間表現のコードとオペランドが
決まれば,出力は一意に決まるので,テーブル分岐の手
法を用いることによって実現できる。これ以外の方法を
利用しても良い。
に対して最適化B(図7の73)が実行される。この最
適化Bで行う最適化の対象は,ソース上では直接現れな
かったり,フロントエンドでは解析しなかったターゲッ
トに依存した部分であるが,図4に示すように上記最適
化Aと重なる部分が含まれている。また,この実施例で
は,例えば,以下の項目も最適化Bの対象となる。
Aと同じである。従って,最適化Bは最適化Aで仕様し
た同じ関数をできる限り呼ぶようにして実現する。その
ためには,中間表現の形態について考慮し,また,最適
化を繰り返し施すことについての説明は後述する。
Bのフェーズが存在しない場合,上記の各項目に関する
最適化が行われないことになり,ターゲットがRISC
アーキテクチャのような場合は,高性能なオブジェクト
を得られないことになる。従って,IE1(図7の7
2)及び最適化Bのフェーズは,必須の処理である。最
適化Bによって,最適化された結果を図13,図14に
示す。図11,12のIE1の中間表現の出力と図1
3,図14の最適化Bの出力を参照すると,基本的な最
適化がIE1の後に施されたことが分かる。
では最適化Aの各関数と最適化Bの各関数の共通化を図
っているが,それぞれ別個のものとして実現する他の実
施例を構成することができる。
の中間表現変換のフェーズにおいて,完全に命令と中間
表現を1対1にしていない。これは,IE1のフェーズ
以降の処理を,その機能や利用する情報によって,次の
ように大きく2つに分けることができるからである。
ものである。
いるものをまとめる。c.より高速な命令に変更する。 これにより,は命令が出る/出ないということより
も,1つ1つの命令の順序を意識して,ハードウェアの
効率化を図ることを主たる目的にしている。従って,次
に示すように,IE1の中間表現変換の直後で,命令を
1対1にしない方が,コンパイラの構成上,優れてい
る。
えば,倍精度の load/store を2つの単精度命令に分け
ることが必要である。なぜならば,これらの load/stor
e を並列に実行できるために,連続させて実行させるよ
りも,離して実行させた方が,早く命令が終了するから
である。しかし,レジスタ割り付けや最適化を考えた場
合,もともとこのデータは1つの実体を指しているた
め,これを分離して扱うことは,最適化Aに関して上記
したようにコンパイラの処理を複雑にするだけである。
その上,レジスタ割り付けを考えると,連続したレジス
タを割り当てる必要のあるデータが2つに分離されてし
まうことになり,レジスタ割り付けのために「データが
連続している」という何らかの情報を持つ必要が出てく
る。
は,命令スケジューリングに対応するために,中間表現
と実際の命令を1対1に分解する。この実現方式はIE
1(図7の72)と同じである。
は,レジスタ割り付け後に,命令スケジューリングを行
う。命令スケジューリングの技法は,公知の方法を用い
る。また,この他の実施例では,命令スケジューリング
をレジスタ割り付け後に位置付けたが,次の1〜4のよ
うに配置しても良い。なお,これらのどの場合も,命令
スケジューリングの前に,命令と中間表現を1対1に対
応させることを意識することにより,中間表現をどのよ
うに変換するか(命令スケジューリングをどのタイミン
グで行うか)を決定することができる。
行う。 3.レジスタ割り付けと命令スケジューリングを任意の
順序で繰り返す。
ングを任意の順序で繰り返し,その間に最適化を行う。 次に中間表現の形態について説明する。この実施例では
中間表現は図15に示すようなデータ構造を持つ。図1
5を実際にプログラム化する時は,構造体宣言を次のよ
うにすることにより, この部分を可変化することがで
き, オペランドの数は, 演算子によって可変にすること
ができる。
ンパイラのフェーズ間で固定して扱うことが可能とな
る。
1.〜3.のような内容を意味する。なお,以下の説明
において,「言(げん)」という表現を用いるが,
「言」とは中間表現のうち命令に相当するものを意味す
る。例えば,図9の#label-2において, move var:("1") cnt: 0 bqe #label-9 var:("1") var:("n") という部分があるが,「move var:("1") cnt: 0 」が1
つの言を表す。ここで,moveは演算子(または,言コー
ド)といい,var:("1") はオペランド1(第1オペラン
ド),cnt: 0はオペランド2(第2オペランド)とい
う。
ドを変更する。この例は,図8〜図14において,言の
オペランドの変化により示されている。これはポインタ
の付け換えだけの処理により行われる。上記,図9の例
により言のオペランドの変更を説明すると,図9(フロ
ントエンド後の出力)のラベル2(#label-2)の「move
var:("1") cnt: 0 」が,図10(最適化A後の出
力)の#label-2では,「move prg:#17cddc("1") cnt:0
」と変化している。
複数の言になったり,ループ構造になったりすることで
ある。この例は, 図9,図10までは cmoveで表すされ
た部分が,図11(IE1後の中間表現),図13(最
適化B後の出力)では,ラベル14(#label-14) のルー
プになっている。
タ構造を変化させることなく,しかし意図している意味
の変更を行うことが可能となる。次に最適化の繰り返し
について説明する。
ような最適化を行うことができるようにするため,上記
したように,最適化の対象となる中間表現の物理表現を
統一させる。そして,現在の処理フェーズを覚えておく
ための変数を使用することにより,個々の最適化ルーチ
ンの共通化を実現する。
中でも,これらの各最適化を繰り返し呼び出すことがで
きる。この呼び出しに関しては,以下の方法が考えられ
る。 1.コンパイラ作成者がコンパイラ作成時に判断する。
グ(初期値はオフ)を設け,最適化処理において,中間
表現の変更があった場合は,これをオンにする。このフ
ラグがオンである間,フラグを初期化して最適化処理を
トライする。
定するか,オプションで外から与える),最適化を繰り
返す。 4.以上1〜3の方式を組み合わせる。
施例では,上記1の方法を用いているが,最適化レベル
に応じて,上記1〜4の最適化繰り返しを実現するよう
にし,ユーザが最適化レベルで切り分けることができる
ようにしても良い。
る最適化コンパイラにより,コンパイラの構造を決め
て,その構成に従って最適化を行うようにすれば,ソー
スプログラムの特性や,アーキテクチャの特徴を意識し
た最適化を,好適な位置で適用できるので,高性能のオ
ブジェクトを得ることができる。
れの中で繰り返し適用することが可能となり,高性能の
オブジェクトを得ることができる。さらに,同じ最適化
処理や,中間表現変換処理を,各部で適用するのでコン
パイラ自身の処理効率が向上する。
ータ例である。
図である。
ある。
処理のテーブルのデータ構造を示す図である。
ログラム例である。
の出力である。
出力である。
(IE1)後の中間表現(その1)である。
(IE1)後の中間表現(その2)である。
出力(その1)である。
出力(その2)である。
る。
Claims (3)
- 【請求項1】 ソースプログラムに基づき中間表現を出
力するフロントエンド部と, 中間表現に対し最適化を施す最適化手段と, 最適化により得られた結果に対し中間表現の形式を変換
する一段以上の中間表現変換手段と, 最後に得られた中間表現をコード出力するコード出力手
段と, 前記最適化手段と中間表現変換手段による最適化フェー
ズの繰り返し回数と各フェーズにおける最適化の処理内
容を決定する最適化構造決定手段とを有し, 前記最適化構造決定手段により決定された内容に基づい
て各最適化フェーズと共に中間表現の形式を変更して最
適化を行うことを特徴とするコンパイル装置。 - 【請求項2】 請求項1において, 上記最適化構造決定手段は,フロントエンド部の出力す
るプログラムに依存する中間表現及び対象となるアーキ
テクチャに依存する中間表現及び適用される最適化の項
目に基づいて,中間表現の形式を変化させる回数及び各
フェーズで適用する最適化処理を決定することを特徴と
するコンパイル装置。 - 【請求項3】 請求項1または2において, 前記最適化処理及び中間表現変換における中間表現を管
理するためのデータの主要部分についてはメモリ上のデ
ータ構造を固定的なものとし, 該データ構造により 中間表現の変換処理及び最適化を共
通化することを特徴とするコンパイル装置。
Priority Applications (2)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP03984193A JP3280449B2 (ja) | 1993-03-01 | 1993-03-01 | コンパイル装置 |
US08/113,810 US5396631A (en) | 1993-03-01 | 1993-08-31 | Compiling apparatus and a compiling method |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP03984193A JP3280449B2 (ja) | 1993-03-01 | 1993-03-01 | コンパイル装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
JPH06250846A JPH06250846A (ja) | 1994-09-09 |
JP3280449B2 true JP3280449B2 (ja) | 2002-05-13 |
Family
ID=12564196
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
JP03984193A Expired - Fee Related JP3280449B2 (ja) | 1993-03-01 | 1993-03-01 | コンパイル装置 |
Country Status (2)
Country | Link |
---|---|
US (1) | US5396631A (ja) |
JP (1) | JP3280449B2 (ja) |
Families Citing this family (37)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JP3190773B2 (ja) * | 1993-09-30 | 2001-07-23 | 日本電気株式会社 | 言語処理プログラムのコンパイル処理方法 |
JPH07110800A (ja) * | 1993-10-13 | 1995-04-25 | Matsushita Electric Ind Co Ltd | 最適化並列コンパイル装置及び最適化並列コンパイル方法 |
US5706503A (en) * | 1994-05-18 | 1998-01-06 | Etak Inc | Method of clustering multi-dimensional related data in a computer database by combining the two verticles of a graph connected by an edge having the highest score |
US6397380B1 (en) * | 1994-10-21 | 2002-05-28 | International Business Machines Corporation | Computer-program compilers comprising a program augmentation capability |
US5659754A (en) * | 1995-03-31 | 1997-08-19 | Sun Microsystems, Inc. | Method and apparatus for an improved optimizing compiler |
US5819082A (en) * | 1995-06-07 | 1998-10-06 | Sierra On-Line, Inc. | Data storage optimization using an access order resource list |
JP3650649B2 (ja) * | 1995-06-16 | 2005-05-25 | 松下電器産業株式会社 | 最適化装置 |
US6074433A (en) * | 1995-08-25 | 2000-06-13 | Fujitsu Limited | Optimization control apparatus and optimization control method for array descriptions |
US6035123A (en) * | 1995-11-08 | 2000-03-07 | Digital Equipment Corporation | Determining hardware complexity of software operations |
US6535903B2 (en) | 1996-01-29 | 2003-03-18 | Compaq Information Technologies Group, L.P. | Method and apparatus for maintaining translated routine stack in a binary translation environment |
US5930509A (en) * | 1996-01-29 | 1999-07-27 | Digital Equipment Corporation | Method and apparatus for performing binary translation |
US6091897A (en) | 1996-01-29 | 2000-07-18 | Digital Equipment Corporation | Fast translation and execution of a computer program on a non-native architecture by use of background translator |
US5812854A (en) * | 1996-03-18 | 1998-09-22 | International Business Machines Corporation | Mechanism for integrating user-defined instructions with compiler-generated instructions and for optimizing the integrated instruction stream |
US5940620A (en) * | 1997-03-07 | 1999-08-17 | Ncr Corporation | Compiler with intermediate compiling mechanism |
US6059840A (en) * | 1997-03-17 | 2000-05-09 | Motorola, Inc. | Automatic scheduling of instructions to reduce code size |
EP0988591A1 (en) | 1997-06-09 | 2000-03-29 | Intertrust, Incorporated | Obfuscation techniques for enhancing software security |
US5903761A (en) * | 1997-10-31 | 1999-05-11 | Preemptive Solutions, Inc. | Method of reducing the number of instructions in a program code sequence |
US6223337B1 (en) * | 1997-12-12 | 2001-04-24 | Hewlett-Packard Company | Random test generation for compiler optimization |
JP4027482B2 (ja) * | 1997-12-24 | 2007-12-26 | 富士通株式会社 | 暗号復元を行う翻訳装置およびその方法 |
US6247174B1 (en) * | 1998-01-02 | 2001-06-12 | Hewlett-Packard Company | Optimization of source code with embedded machine instructions |
US6158048A (en) * | 1998-05-29 | 2000-12-05 | Intel Corporation | Method for eliminating common subexpressions from java byte codes |
US6389590B1 (en) * | 1999-06-22 | 2002-05-14 | Microsoft Corporation | Indefinite-size variables within an intermediate language |
JP4462676B2 (ja) * | 1999-10-27 | 2010-05-12 | 富士通株式会社 | プログラム変換装置、コンパイラ装置およびプログラム変換プログラムを記録したコンピュータ読み取り可能な記録媒体 |
US6986128B2 (en) * | 2000-01-07 | 2006-01-10 | Sony Computer Entertainment Inc. | Multiple stage program recompiler and method |
US20020038453A1 (en) * | 2000-08-09 | 2002-03-28 | Andrew Riddle | Method and system for software optimization |
US7000227B1 (en) * | 2000-09-29 | 2006-02-14 | Intel Corporation | Iterative optimizing compiler |
GB2411990B (en) * | 2003-05-02 | 2005-11-09 | Transitive Ltd | Improved architecture for generating intermediate representations for program code conversion |
US7367023B2 (en) * | 2003-07-10 | 2008-04-29 | International Business Machines Corporation | Method and apparatus for generating computer programming code selectively optimized for execution performance and not optimized for serviceability |
US7765539B1 (en) | 2004-05-19 | 2010-07-27 | Nintendo Co., Ltd. | System and method for trans-compiling video games |
JP4983801B2 (ja) * | 2006-09-28 | 2012-07-25 | 富士通株式会社 | プログラム性能解析装置 |
US20080092113A1 (en) * | 2006-10-12 | 2008-04-17 | Weinstein Randall K | System and method for configuring a programmable electronic device to include an execution engine |
US8813057B2 (en) * | 2007-03-31 | 2014-08-19 | Intel Corporation | Branch pruning in architectures with speculation support |
US20090193400A1 (en) * | 2008-01-30 | 2009-07-30 | Ivan Baev | Interprocedural register allocation for global variables |
US9207921B2 (en) * | 2009-06-22 | 2015-12-08 | Oracle America, Inc. | Fault tolerant compilation with automatic optimization adjustment |
JP6201788B2 (ja) | 2014-01-29 | 2017-09-27 | 富士通株式会社 | ループ分割検出プログラム及びループ分割検出方法 |
WO2016116132A1 (en) * | 2015-01-19 | 2016-07-28 | Huawei Technologies Co., Ltd. | Systems and methods for execution of algorithms on parallel heterogeneous systems |
US10156825B2 (en) | 2016-02-29 | 2018-12-18 | Canon Kabushiki Kaisha | Developing apparatus with independently rotatable members supporting a developing frame body, process cartridge, and image forming apparatus |
Family Cites Families (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US4667290A (en) * | 1984-09-10 | 1987-05-19 | 501 Philon, Inc. | Compilers using a universal intermediate language |
US4763255A (en) * | 1984-10-31 | 1988-08-09 | International Business Machines Corporation | Method for generating short form instructions in an optimizing compiler |
JP2749039B2 (ja) * | 1987-11-06 | 1998-05-13 | 株式会社日立製作所 | オブジェクト生成方法 |
JPH0281137A (ja) * | 1988-09-19 | 1990-03-22 | Hitachi Ltd | 最適化コンパイラ及びコンパイル方法 |
US5193190A (en) * | 1989-06-26 | 1993-03-09 | International Business Machines Corporation | Partitioning optimizations in an optimizing compiler |
US5212794A (en) * | 1990-06-01 | 1993-05-18 | Hewlett-Packard Company | Method for optimizing computer code to provide more efficient execution on computers having cache memories |
US5293631A (en) * | 1991-08-06 | 1994-03-08 | Hewlett-Packard Company | Analysis and optimization of array variables in compiler for instruction level parallel processor |
-
1993
- 1993-03-01 JP JP03984193A patent/JP3280449B2/ja not_active Expired - Fee Related
- 1993-08-31 US US08/113,810 patent/US5396631A/en not_active Expired - Lifetime
Also Published As
Publication number | Publication date |
---|---|
US5396631A (en) | 1995-03-07 |
JPH06250846A (ja) | 1994-09-09 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
JP3280449B2 (ja) | コンパイル装置 | |
WO2021114530A1 (en) | Hardware platform specific operator fusion in machine learning | |
JP3896087B2 (ja) | コンパイラ装置およびコンパイル方法 | |
US5293631A (en) | Analysis and optimization of array variables in compiler for instruction level parallel processor | |
JP2755154B2 (ja) | プログラム変換処理装置およびプログラム変換処理方法 | |
CN100465895C (zh) | 编译器、编译方法 | |
US20080141229A1 (en) | Processor, program conversion apparatus, program conversion method, and computer program | |
KR100325658B1 (ko) | 프로세서 | |
US5339420A (en) | Partitioning case statements for optimal execution performance | |
EP0743599A2 (en) | Method of generating code for programmable processor, code generator and application thereof | |
EP0843257A2 (en) | Improved code optimiser for pipelined computers | |
JPH08507889A (ja) | スーパースカラマイクロプロセッサ用のプログラムから並行的に処理可能な命令グループを機械的に生成する方法 | |
JPH05143332A (ja) | 命令スケジユーラを備えたコンピユータ・システム及び入力命令シーケンスを再スケジユールする方法 | |
JP2002024011A (ja) | プロセッサにおける命令の叙述された実行 | |
JPH1173325A (ja) | プログラム変換装置及び記録媒体 | |
US20020083423A1 (en) | List scheduling algorithm for a cycle-driven instruction scheduler | |
EP0795821A1 (en) | Optimization apparatus using global analysis to remove redundant transfer instructions | |
JP2015201119A (ja) | コンパイルプログラム、コンパイル方法およびコンパイル装置 | |
US5781777A (en) | Optimization method for computation partitioning oriented to a distributed memory | |
US7979853B2 (en) | Compiler device, method, program and recording medium | |
Kessler | Compiling for VLIW DSPs | |
EP0096574B1 (en) | System and method of renaming data items for dependency free code | |
Huang et al. | ASIA: Automatic synthesis of instruction-set architectures | |
JP4721975B2 (ja) | コンパイラ装置およびコンパイル方法 | |
JPH02176938A (ja) | 機械語命令最適化方式 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
A01 | Written decision to grant a patent or to grant a registration (utility model) |
Free format text: JAPANESE INTERMEDIATE CODE: A01 Effective date: 20020205 |
|
FPAY | Renewal fee payment (event date is renewal date of database) |
Free format text: PAYMENT UNTIL: 20080222 Year of fee payment: 6 |
|
FPAY | Renewal fee payment (event date is renewal date of database) |
Free format text: PAYMENT UNTIL: 20090222 Year of fee payment: 7 |
|
FPAY | Renewal fee payment (event date is renewal date of database) |
Free format text: PAYMENT UNTIL: 20090222 Year of fee payment: 7 |
|
FPAY | Renewal fee payment (event date is renewal date of database) |
Free format text: PAYMENT UNTIL: 20100222 Year of fee payment: 8 |
|
FPAY | Renewal fee payment (event date is renewal date of database) |
Free format text: PAYMENT UNTIL: 20110222 Year of fee payment: 9 |
|
LAPS | Cancellation because of no payment of annual fees |