JPH10275088A - リンク最適化方法 - Google Patents

リンク最適化方法

Info

Publication number
JPH10275088A
JPH10275088A JP7958997A JP7958997A JPH10275088A JP H10275088 A JPH10275088 A JP H10275088A JP 7958997 A JP7958997 A JP 7958997A JP 7958997 A JP7958997 A JP 7958997A JP H10275088 A JPH10275088 A JP H10275088A
Authority
JP
Japan
Prior art keywords
external
variable
variables
intermediate code
module
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.)
Pending
Application number
JP7958997A
Other languages
English (en)
Inventor
Kenichi Miyata
賢一 宮田
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.)
Hitachi Ltd
Original Assignee
Hitachi Ltd
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 Hitachi Ltd filed Critical Hitachi Ltd
Priority to JP7958997A priority Critical patent/JPH10275088A/ja
Publication of JPH10275088A publication Critical patent/JPH10275088A/ja
Pending legal-status Critical Current

Links

Landscapes

  • Devices For Executing Special Programs (AREA)

Abstract

(57)【要約】 【課題】本発明は異なる外部変数の参照を外部変数の数
よりも少ないレジスタで行なうためのリンカによる最適
化方法を提供する。 【解決手段】リンカによるロードモジュールの作成にお
いて、まず各ソースモジュール201〜203をコンパイラ20
4がコンパイルし、中間コード207〜209とモジュール内
外部記号表210〜212を作成する。次にモジュール内外部
記号表210〜212とライブラリ213〜214をリンカ215が読
み込み、外部記号表217を作成する。さらに外部記号表2
17と中間コード207〜209を用いて、対象CPUによって
決まる特定のアドレス範囲に含まれている複数の外部変
数の参照を、ベースレジスタ共通化処理220によってひ
とつの外部変数を用いた参照に中間コードを変換する。
最後にリンク処理222によってロードモジュール223を作
成する。

Description

【発明の詳細な説明】
【0001】
【発明の属する技術分野】本発明は、計算機の利用にお
いて、実行命令数を削減するリンク方法に関する。
【0002】
【従来の技術】複数のソースファイルからひとつのロー
ドモジュールを作成するために、コンパイラとリンカを
利用する。コンパイラは各ソースファイルをひとつずつ
コンパイルし、各ソースファイルに対応するオブジェク
トモジュールを生成する。そしてリンカは生成されたす
べてのオブジェクトモジュールと必要なライブラリとを
結合して最終的なロードモジュールを生成する。
【0003】ソースファイル中で使用する変数はその通
用範囲によって以下のように分類できる。
【0004】(1) ひとつの関数や手続き内でのみ通用す
る変数 (2) ひとつのモジュール内でのみ通用する変数 (3) モジュール間にわたって通用する変数 分類(1)と分類(2)の変数のメモリ位置(アドレス)はコン
パイル時に決定されるのに対して、分類(3)の変数はリ
ンク時にメモリ位置が決定する。分類(3)の変数を外部
変数と呼び、オブジェクトモジュールごとに外部変数の
メモリ位置を管理する表を備えている。このメモリ位置
管理表としてTOC(Table Of Contents)などがある。
リンカは各オブジェクトモジュールとライブラリのすべ
てのメモリ位置管理表を走査して各外部変数のメモリ位
置を決定し、メモリ位置管理表に決定した外部変数のア
ドレスを書き込む。
【0005】ここでTOCを通した外部変数の参照につ
いて説明する。外部変数のメモリ位置はコンパイル時に
は決められないため、TOCを通して間接的に行う必要
がある。図1に外部変数の間接参照の一般的な例を示
す。主記憶装置106に蓄えられている値107が外部変数A
とBの値とする。オブジェクトモジュール101は大きく
分けてプログラムを格納しているコード部102とプログ
ラムが参照するデータや変数のアドレスを格納している
データ部103から構成されている。たとえば外部変数A
を参照するためには、ふたつの命令108aと109aが必要で
ある。まず命令108aで外部変数Aの格納されている主記
憶上のアドレス110aをレジスタr1にロードする。次に命
令109aでロードしたアドレスから実際のAの値をレジス
タfr1にロードする。外部変数の格納されているアドレ
スを得るために、命令108aでは、TOC領域の先頭アド
レスを保持するレジスタRTOC(104)とAのアドレス
が格納されているTOC内位置を表わすオフセットoffs
etA(110a)を加える。外部変数Bについても同様で、ふ
たつの命令108bと109bによって外部変数Bを参照するこ
とになる。外部変数BのTOC内のオフセットはoffset
B(110b)であり、変数の値は107bに保存されている。
【0006】通常は異なる外部変数は異なる外部変数ア
ドレス保持用レジスタを通して参照しなければならな
い。たとえば図1ではふたつの外部変数AとBを参照し
ている。これらの外部変数の参照のために、外部変数A
に対しては108aでアドレス保持用レジスタr1を使用し、
外部変数Bに対しては108bでアドレス保持用レジスタr2
を使用している。外部変数AとBのアドレスはリンク時
に決定するが、リンク時に必要な複数のオブジェクトモ
ジュールとライブラリの指定順序によって外部変数のア
ドレスは変わりうる。またレジスタの割り付けはコンパ
イル時に行われる処理であるために、異なる外部変数に
対して共通のアドレス保持用レジスタをコンパイル時に
割り付けるわけにはいかない。
【0007】しかしメモリ位置が決定している変数同士
が同じ特定のアドレス範囲に属していれば、異なる変数
であっても特定のメモリ位置をベースとして参照するこ
とができる。ここで、「特定のアドレス範囲に属する」
とは、メモリを参照するためのCPUの命令において、
即値(レジスタを通した間接的な値ではなく、整数値そ
のもの)で表わせるメモリ範囲に収まることを意味す
る。ひとつのモジュール内であれば、C言語の構造体や
Fortran言語のCOMMONの中で宣言されている変数
は宣言の順にメモリ上に連続して並べられることが保証
されているため、構造体やCOMMONの先頭アドレス
をベースとして、そのベースからのオフセット(ベース
からの語数)を用いてそれぞれの要素変数を参照でき
る。この事実を利用したコンパイラの最適化はすでによ
く行われている。
【0008】外部変数のメモリ位置がリンク時に決定す
ることを利用して、リンク時に最適化を行なう方法やリ
ンクとコンパイルを一体化した方式が研究されている。
まず従来技術(1)として、A.Srivastava, D.W.W
all "Link-Time Optimization of Address Calcul
ation on a 64-bit Architecture" ACM SIGPL
AN '94がある。これは、オブジェクトモジュールごと
にもつ外部変数管理用テーブルを一体化しロードモジュ
ールにひとつもたせるというOSのコンベンションを利
用して、外部変数の参照を間接参照ではなく直接参照と
すること、つまりメモリ位置管理表に変数のアドレスで
はなく変数の値そのものを書き込んでおくことによって
余分なアドレス計算を省き、実行性能を高めるものであ
る。
【0009】また従来技術(2)として、V.Santhanam,
D.Odnert "Register Allocation Across Proce
dure and Module Boundaries" ACM SIGPLA
N '90がある。これは、複数の関数をグループ化し、グ
ループ内で共通して参照される外部変数に対してレジス
タを割り当てる。本来は関数が呼び出される毎に外部変
数のアドレスのロードが必要であるところを、グループ
内の関数が最初に呼び出されたときに外部変数のアドレ
スをロードし、それ以降のグループ内関数呼び出しでは
アドレスのロードを省略するというものである。
【0010】この方法は3つのフェーズに分かれてい
て、(1)各ソースファイルを中間コードに変換すると同
時に、外部変数や関数呼び出しなどに関するプログラム
情報を生成するフェーズと、(2)生成されたプログラム
情報を利用しながら外部変数にジスタを割り当て、オブ
ジェクトモジュールを出力するフェーズと、(3)各オブ
ジェクトモジュールとライブラリとから最終的なロード
モジュールを生成するフェーズ、から構成されている。
【0011】
【発明が解決しようとする課題】上記従来技術(1)は外
部変数表の参照を間接参照から直接参照に変えること
で、本来は2命令必要なところを1命令で済まそうとす
るものである。しかしリンク後も外部変数表をオブジェ
クトモジュール毎に持たせることを要求するOSで直接
参照をしようとすると、ひとつの外部変数の値が複数の
表に同時に存在することになり、外部変数の値の更新ご
とにすべての外部変数表の値を書き換えなければなら
ず、逆に性能を低下させるという問題がある。
【0012】また、従来技術(2)は外部変数のアドレス
のロード命令を削減しようとするものである。しかし外
部変数毎にひとつのレジスタを割り当てなければならな
いため、手続き内で多数の外部変数を使用している場合
はレジスタの数が足りなくなる。するとレジスタの待避
回復コードが多数生成されてしまうため、性能低下を引
き起こす。
【0013】上記従来技術の問題点の他に以下のような
問題がある。モジュール間で使用される外部変数の間の
メモリ配置はコンパイル時に決定できないため、外部変
数が最終的にメモリ上で隣接するように配置されたとし
ても、それらを参照するためには変数ごとに一時変数を
用意しなければならない。あらかじめメモリ上に隣接し
ていると分かっていれば、たとえば変数Xのアドレスが
Pだとすると、隣の変数YはアドレスP+1を参照する
ことで変数Yの値を取り出すことができるはずである。
ここで、一時変数は通常はCPUのレジスタに割り当て
られるので、一時変数の数が多くなることは、限られた
数しか持たないCPUのレジスタの多くを使用すること
を要求するということを意味するため、その他のコンパ
イル上重要な最適化のために使用できるレジスタの数を
制限してしまう。レジスタの数が足りなくなると、あふ
れたレジスタに蓄えられていた値を主記憶上に待避する
ためのストア命令と、必要に応じてレジスタの値を回復
するためのロード命令を生成することになる。その結
果、命令数の増加によるロードモジュールの実行速度の
低下を引き起こす。このような待避・回復命令がループ
中で生成されると、大幅な速度低下の原因となる。また
待避・回復命令が増加するとキャッシュミスがおこる可
能性も増加し、CPUのパイプラインの流れを乱す。そ
の結果さらにロードモジュールの実行速度を低下させ
る。
【0014】
【課題を解決するための手段】本発明はリンカが行なう
最適化において、リンカへの入力としてモジュール内で
参照される外部変数とロードモジュールを生成するのに
必要なライブラリを与えてコンパイル時には決定できな
いすべての外部変数のアドレスを求める。
【0015】この外部変数のアドレスを用いることによ
って、対象CPUによって決まるアドレス範囲に複数の
外部変数が入っていることが分かれば、従来は異なる外
部変数に対しては異なる一時変数を用いる必要があった
ものをひとつの一時変数で参照することができる。
【0016】そこで外部変数のアドレスから特定のアド
レス範囲に入っている変数のグループを求め、グループ
に属する外部変数の値の参照をひとつの一時変数で行な
うように中間コードを変換する。
【0017】その結果一時変数に割り当てなければなら
ないCPUレジスタの数を削減することができ、他の最
適化にあまったレジスタを使用することができる。
【0018】
【発明の実施の形態】以下、本発明の実施の形態を詳細
に説明する。
【0019】図2は本発明に係わるコンパイラ及びリン
カの構成を示したものである。
【0020】201〜203はロードモジュールを作成するた
めに必要なソースモジュールである。個々のソースモジ
ュールはひとつずつコンパイラ204に入力して、それぞ
れ独立に処理する。コンパイラ204の内部では、たとえ
ばソースモジュール201に対しては、構文解析処理204を
行なう。この処理ではソースモジュールの文法誤りを検
出しながらコンパイラ内部で処理しやすい中間コードを
生成する。続いて最適化処理206を行なうことによって
コンパイラの出力となる中間コード207とモジュール内
外部記号表210を生成する。中間コードはコンパイラが
処理しやすいように変換したものであると同時に、最適
化処理の途中結果としてコンパイラ内部で形を変えなが
ら流れてゆく。モジュール内外部記号表はソースモジュ
ール内で参照する外部記号(変数や関数)に関する情報を
含んでいる。
【0021】すべてのソースモジュールから生成された
中間コード207〜209とモジュール内外部記号表210〜212
と、ロードモジュールを生成するのに必要なライブラリ
213〜214をリンカ215に入力する。リンカ215では入力さ
れたモジュール内外部記号表と207〜209とライブラリ21
3〜214とから外部記号表作成処理215によって外部記号
表217を生成する。外部記号表217はロードモジュールを
作成するのに必要な外部変数すべての情報を含んでい
る。この外部記号表217と中間コード207〜209を最適化
処理218によって最適化する。最適化処理にはいくつか
のステップ219〜221があり、その中に本発明に係わるベ
ース変数共通化処理220がある。
【0022】最適化の結果得られた中間コードをリンク
処理222によって結合し最終的なロードモジュール223を
得る。
【0023】図3は外部変数を使用するソースモジュー
ルの例を示したものである。
【0024】301ではひとつの要素が4バイトのfloat
(浮動小数)型で、要素数が100個の1次元配列A・B・
Cを外部変数として記憶装置上に領域を確保することを
示している。これらの変数は他のソースモジュールから
も参照することができる。つまりこれらの変数の値を変
更すると、他のモジュールでは変更された値を使用する
ことができるということである。302〜307は関数func1
を宣言する。宣言された関数は他の関数から呼び出すこ
とができ、呼び出されるごとに関数内の処理が行われる
ことになる。303はint(整数)型の変数iを関数func1内で
使用することを宣言する。この変数は関数内でのみ通用
する変数であり、他の関数や他のソースモジュールから
は参照することはできない。304〜306が実行部分であ
る。304〜306はループで、iを0から99まで1ずつ変え
ながらA[i]+B[i]の値を計算し、その値をC[i]に代
入することを示している。
【0025】301で宣言された外部変数A・B・Cは記
憶装置上に連続して領域を割り当てられるとは限らず、
また宣言の順に並んでいるとも限らない。この並び方は
リンカが決定する。
【0026】図4は本発明に係わるコンパイラの構成を
示す。
【0027】コンパイラ204は記憶装置401からソースモ
ジュール201を読み込み、それをステップ205において構
文解析処理を行い、コンパイラが処理しやすい中間コー
ド402に変換するとともに、以下のステップで行われる
最適化に必要な情報(たとえば変数間の依存関係)を生
成する。この構文解析処理の詳細については、たとえば
「エイホ・セシィ・ウルマン著:コンパイラ1(サイエン
ス社 1990年)第30〜74ページ」に記載されているので説
明は省略する。
【0028】次にステップ206において上記中間コード4
02を読み込み最適化処理を行ない、改良された中間コー
ド207とモジュール内外部記号表210を出力する。このス
テップ206で行われる最適化はCPUのレジスタ数には
依存しない最適化を行なう。たとえばループ変換や部分
式削除のような最適化である。このような最適化につい
ては、たとえば「Michael Wolfe著:High Performan
ce Compilers ForParallel Computing(Addison-W
esley 1996)第307〜366ページ」に記載されているので
説明は省略する。
【0029】モジュール内外部記号表210については図
7で説明する。
【0030】図5は図3のプログラムを従来のコンパイ
ラでコンパイルしたときの中間コードの例を示したもの
である。中間コードは最初に構文解析処理によって作成
され、以後各最適化処理を適用するごとに形を変えてゆ
く。
【0031】図5の中間コードは基本ブロックを辺で結
んだグラフで表現されている。
【0032】501〜505は基本ブロックである。基本ブロ
ックは途中で分岐や飛び込みのない一連のコード列を表
わしていて、構文解析処理205によって構成される。辺
は基本ブロックの制御の流れを表わしていて、たとえば
基本ブロック504の処理が終わると次に基本ブロック503
に処理が移ることを意味している。504から503への処理
の移動により、503と504でループを形成していることが
分かる。
【0033】図6に基本ブロック502の内容を詳細に示
す。
【0034】基本ブロック502は4個の文からなり、各
文は文番号601・文の処理内容602・文が代入文のときに
代入文の左辺の変数名603と左辺の変数が使用される文
番号のリスト604からなっている。文番号601はひとつの
中間コード全体で一意につけられた番号である。また処
理内容602は3番地記法で書かれている。3番地記法に
ついてはたとえば「エイホ・セシィ・ウルマン著:コン
パイラ2(サイエンス社 1990年)第567〜568ページ」に
記されているので説明は省略する。
【0035】たとえば605〜608は基本ブロック502の内
容を示したものである。文605では一時変数t1に0を代
入することを意味している。ここで演算子「:=」は右
辺を計算した値を左辺の変数に代入することを表わす。
文606では変数Aのアドレスを変数t2に代入することを意
味している。演算子「&」は演算子のオペランドに現れ
る変数の記憶装置上のアドレスを求めることを表わす。
同様に文607では変数Bのアドレスを変数t3に代入し、文
608では変数Cのアドレスを変数t4に代入する。
【0036】また、基本ブロック504で現れる演算子
「*」はオペランドに現れる式を記憶装置上のアドレス
として、そのアドレスに含まれている値を取り出すもの
である。この「&」と「*」の演算子は図1のコード部
102の命令109aと110a(あるいは109bと110b)にそれぞれ
対応し、外部変数の値を求めるためには必ずこれらの演
算子が中間コード中に現れる。つまり演算子「*」を適
用する式の中に整数定数が含まれていると生成された命
令の即値部分にその定数が現れることになる。逆に命令
の即値部分に整数定数を指定するためには中間コードの
「*」演算子の式中に整数定数を置けばよい。
【0037】図7はモジュール内外部記号表の例であ
る。
【0038】モジュール内外部記号表はコンパイラが管
理しているモジュール内の変数や関数などの情報からス
テップ206で作成される。
【0039】モジュール内外部記号表は記号名701・記
号が変数か関数かを示す種類702・記号がモジュール内
で定義されているのか他のモジュール内で定義されてい
てそれを使用しているのかを示す参照形式703・変数が
記憶装置内で占める領域のサイズ704からなっている。
【0040】図8は本発明に係わるリンカの構成を示
す。
【0041】リンカ215は記憶装置401から上記コンパイ
ラで生成されたモジュール内外部記号表210〜212と必要
なライブラリ213〜214を読み込み、最終的にひとつのロ
ードモジュール222を出力する。外部記号表作成処理(ス
テップ216)においてはモジュール内外部記号表210〜212
と必要なライブラリ213〜214を読み込み、外部記号表21
7を作成する。外部記号表には外部記号名と外部記号間
の記憶装置上の位置を表わすアドレスが示されている。
この外部記号表の内容については図9で説明する。また
外部記号表の作成処理については、たとえば「村岡洋一
著:コンピュータ・アーキテクチャ(近代科学社 1985
年)第66ページ〜73ページ」に記載されているので、説
明は省略する。
【0042】次に最適化処理217で中間コード207〜209
とライブラリ213〜214を読み込み各種最適化218〜220を
行なう。ここで行なう最適化はCPUのレジスタ割り付
けに関係するものである。この最適化処理217の中で本
発明に係わるベースレジスタ共通化処理219を行なう。
ベースレジスタ共通化はCPUレジスタ割り当ての前に
行う最適化処理で、外部変数間の位置関係をもとに、複
数の一時変数をひとつのレジスタで参照できるように中
間コードを変換するものである。このベースレジスタ共
通化の流れについては図10〜図14で詳しく説明す
る。
【0043】その後、最終的な中間コード801〜803とラ
イブラリ213〜214と外部記号表217とからリンク処理221
によって最終的なロードモジュール222を生成する。コ
ード生成については、たとえば「エイホ・セシィ・ウル
マン著:コンパイラ2(サイエンス社 1990年)第624〜7
07ページ」に記載されているので、説明は省略する。
【0044】図9外部記号表217の内容を示したもので
ある。
【0045】外部記号表は外部記号名901・外部記号が
変数か関数かを表す種別902・記号が記憶装置内で占め
る領域の大きさを表すサイズ903・記号が記憶装置のど
の位置に格納されるかを表す位置(アドレス)904からな
る。
【0046】図10は本発明に係わるベース変数共通化
の流れをフローチャートで示したものである。
【0047】ベース変数共通化は中間コードに含まれる
基本ブロックごとに行なう。まずステップ1001で中間コ
ードをひとつとり、その中の基本ブロックをひとつ取る
(ステップ1002)。取り出した基本ブロックに外部変数
のアドレスの参照があるかどうかを検査し(ステップ100
3)、含まれていればその外部変数に対するベース変数を
求め(ステップ1004)、外部変数の値を使用する文を適切
に書き換える。
【0048】ベース変数共通化ができた場合、もともと
ある文のうちのいくつかは無用コードとなる。無用コー
ドとは、プログラム中でまったく使用されない値を計算
する文のことである。異なる変数それぞれの値を参照す
るためには異なる一時変数を必要とするが(たとえば図
5の基本ブロッ502など)、ベース変数共通化によりひと
つの一時変数で足りてしまうからである。したがって無
用コードを削除することによってベース変数共通化の効
果をあげることができる。無用コード削除についてはた
とえば「エイホ・セシィ・ウルマン著:コンパイラ2
(サイエンス社 1990年)第725〜726ページ」に記載され
ているので、説明は省略する。
【0049】基本ブロックに外部変数のアドレスの参照
が無い場合、あるいは外部変数の値を使用する文の更新
が終わったとき、次の基本ブロックがあるかどうかを検
査し(ステップ1007)、あればステップ1002にもどり、な
ければ次の中間コードがあるかどうかを検査する(ステ
ップ1008)。さらに中間コードがあればステップ1001に
もどり、なければベース変数共通化を終了する。
【0050】図11は各基本ブロックに対するベース変
数表を示したものである。
【0051】ベース変数表は図12(ステップ1004を詳
しく説明したもの)で説明する処理によって作られる。
【0052】ベース変数表はベース変数となる外部変数
1101・ベース変数の記憶装置上の位置1102・ベース変数
で表わせる範囲にある外部変数のリスト1103からなって
いる。
【0053】図12は図10のステップ1004のベース変
数を求める処理をフローチャートで示したものである。
【0054】まず外部変数を外部記号表からひとつとる
(ステップ1201)。取り出した外部変数名をXとすると外
部記号表217の記号名901の列から外部変数名Xに等しい
行を見つけ、その行の位置の欄904を参照すると外部変
数Xの位置がLXとわかったとする。もしXがすでにベ
ース変数表にベース変数として登録してある(図11の
ベース変数表の変数名1101の列に外部変数Xが登録され
ている)か、ベース変数で参照できる変数として登録し
てある(図11のベース変数表のメンバ1103の列に外部
変数Xが登録されている)ならば(ステップ1202)次の外
部変数を探す(ステップ1207)。
【0055】まだXがベース変数表に登録されていなけ
れば次にXがベース変数になりうるかどうかを検査す
る。ステップ1203でベース変数表からひとつベース変数
を取り出す。取り出した変数をY・位置をLYとする。
【0056】最終的に作成するロードモジュールの対象
CPUによって、命令の即値で表わせる記憶装置上の領
域の大きさは決まっている。この大きさをdispとする。
dispで表わせる範囲に複数の外部変数が入っている場
合、それらの外部変数はその領域内のある点ベースにし
てすべて参照することができる。本実施の形態では同じ
ベース変数で表わせる外部変数群のうち、基本ブロック
内で最初に現れる外部変数をベース変数として登録する
ことにする。つまりすでに登録済みのベース変数Yの位
置LYと現在処理中の外部変数Yの位置LYの差がdisp
よりも小さければ、変数Yは変数Xを用いて表わすこと
ができる。この検査を行なうのがステップ1204である。
【0057】ステップ1204の条件を満たせば、XをYの
メンバ変数としてベース変数表に登録する(ステップ120
5)。
【0058】ステップ1204の条件を満たさなければ、X
をあらたなベース変数としてベース変数表に登録する
(ステップ1206)。
【0059】以上の処理が終わったら次の外部変数が基
本ブロック内にあるかどうかを検査して(ステップ120
7)、あればステップ1201にもどって以上の処理を繰り返
す。なければベース変数の登録処理は終了である。
【0060】図13はベース変数を用いて外部変数の値
を使用するように更新する処理の流れを示したものであ
る。
【0061】初期状態1301は、外部変数Bが配列のとき
に、配列の要素B[i]の値を一時変数t4に求める典型的
な中間コードの例である。文1301aでBのアドレスを一
時変数t1に代入し、文1301bで一時変数t3に格納されて
いる添字値をBのアドレスに加え、文1301cでB[i]の値
を一時変数t4に代入する。
【0062】この外部変数Bがベース変数Aで表わすこ
とができる場合、つまりベース変数表にAのメンバとし
てBが登録されている場合は、BをAの参照に代えるこ
とができる。ここでBの位置とAの位置の差を400であ
るとすると、ベース変数化によって1302のように変換で
きる。つまり文1302aの「&」演算子の対象の式をBか
らAに変え、さらに400を加えればよい。
【0063】この文1302aに対してCPUの命令を生成
すると加算とTOCからのロードの2命令が必要となる
が、「400」という値を配列の値を参照する文1302cまで
伝搬することができれば、1302cに対するCPU命令で
「400」を吸収することができる。
【0064】整数定数の伝搬は、アドレスの加算のオペ
ランドを伝搬するものなので、伝搬する途中に文1302b
のような加算があってもそのまま通り抜けることができ
る。つまり1302cの「*」演算子に対する式はt2 = (A+4
00) + t3 = A + 400 + t3 =(A + t3) + 400であるか
ら、t1 = &Aとすれば文1302bには何も変更を加える必要
はなく、文1302aと文1302cだけを更新すればよいことに
なる。
【0065】伝搬できた結果を1303に示す。文1303cで
は演算子「*」に対する式の中に定数「400」が現れて
いる。
【0066】図14は図10のステップ1005のベース変
数を用いて外部変数の値を使用する文の更新の処理をフ
ローチャートで示したものである。
【0067】外部変数の値を使用する文の更新とは、ベ
ース変数共通化によって演算子「&」の中に現れる整数
定数を、変数の使用時に用いる演算子「*」の中に伝搬
することである。
【0068】まず基本ブロック内の文を走査して外部変
数のアドレスを使用している文をみつける(ステップ140
1)。この外部変数をYとすると外部記号表から位置がL
Yとわかる。
【0069】次にこの外部変数Yに対するベース変数を
ベース変数表からみつける(ステップ1402)。この外部変
数をX・位置をLXとする。
【0070】もしXとYが等しければベース変数共通化
を行なう必要はないので、ステップ1403でそれを検査
し、XとYが等しければステップ1410で次の外部変数が
あるかどうかを確かめる。
【0071】XとYが等しくなければ中間コードを走査
して変数Yの値を使用する部分をベース変数Xによる使
用に更新する処理を行なう。
【0072】まず変数Xの使用先の文を外部記号表から
ひとつ求める(ステップ1404)。ここで使用先の文の種類
によって処理が分かれる。
【0073】(1) 加減算の場合 この場合はそのまま通り抜けることができる。つまり加
減算の左辺の変数の使用先をたどればよい(ステップ120
6)。
【0074】(2) 変数の値の使用の場合(「*」演算の
場合) この場合はすでに「*」演算の中に現れている即値部分
とLY−LXを足した結果がCPUの命令で指定できる
即値の大きさの範囲に入っていれば、即値部分を即値+
(LY−LX)で置き換える(ステップ1209)。範囲を越
えていれば、外部変数Yに対するベース変数共通化をあ
きらめて、次の外部変数を探しにゆく(ステップ1411)。
【0075】(3) その他の場合 整数定数の伝搬ができないものとして、外部変数Yに対
するベース変数共通化をあきらめて、次の外部変数を探
しにゆく(ステップ1411)。
【0076】以上の処理を行なった後、次の使用先の文
があれば(ステップ1409)、ステップ1404にもどって処理
を繰り返す。なければ次の外部変数をみつけて(ステッ
プ1410)ステップ1401から繰り返す。
【0077】図15は本発明に係わるベース変数共通化
の効果を表わすために、図5の中間コードにベース変数
共通化処理220の中のロード命令更新処理1005を適用し
た直後の中間コードを示したものである。
【0078】基本ブロック1501は基本ブロック502に対
応する。502では3つの外部変数A・B・Cに対するア
ドレス保持用変数を使用しているが、1501では外部変数
Aのみに対するアドレス保持用変数になっている。基本
ブロック1502は基本ブロック504に対応する。504では上
記の3つのアドレス保持用変数を用いて配列要素を参照
していた。それに対して1502では1つのアドレス保持用
変数のみを使用するように変わっている。
【0079】図16は本発明に係わるベース変数共通化
の効果を表わすために、図5の中間コードにベース変数
共通化処理220の中の無用コード削除処理1006を適用し
たときの中間コードを示したものである。
【0080】基本ブロック1502中の変数t3とt4はループ
中で参照されることがないので削除してもプログラムの
実行には影響を及ぼさない。1502中のt3とt4の文の削除
の結果、1502は1602のように変化する。さらに基本ブロ
ック1501中の変数t3とt4も参照されることがなくなり、
これらも削除することができる。1501のt3とt4の削除の
結果、1501は1601のように変化する。
【0081】この結果、図5の中間コードからみて4つ
の代入文と2つの変数を削除できたことになる。図5の
中間コードに対して実行される文の数は4+1+8×100=805
個なのに対して、図16の中間コードに対して実行され
る文の数は2+1+6×100=602個となる。つまり約25%(1-60
2/805)の文を削除できたことになる。また変数t3とt4の
2つを削除できている。ひとつの変数はレジスタ割り付
け処理によってひとつのCPUレジスタが割り当てられ
ることになるので、レジスタ数も2個削減できたことに
なる。
【0082】
【発明の効果】異なる外部変数の参照に伴うロード・ス
トア命令の数を削減し実行命令数を削減し実行速度の向
上が得られる。また外部変数に割り当てるCPUのレジ
スタ数の削減により、他最適化の負担を軽減するととも
に最適化の機会を増加させ、実行速度が向上する。
【図面の簡単な説明】
【図1】外部変数の間接参照の仕方を示す。
【図2】本発明に係わるコンパイラとリンカの構成を示
したものである。
【図3】外部変数を使用するソースモジュールの例を示
したものである。
【図4】本発明にかかわるコンパイラの構成を示したも
のである。
【図5】中間コードの例を示したものである。
【図6】基本ブロックの内容を示したものである。。
【図7】モジュール内外部記号表を示したものである。
【図8】本発明に係わるリンカの構成を示したものであ
る。
【図9】外部記号表を示したものである。
【図10】本発明に係わるベース変数共通化の処理の流
れを示したフローチャートである。
【図11】ベース変数共通化で用いるベース変数表を示
したものである。
【図12】ベース変数の登録処理を示したフローチャー
トである。
【図13】ベース変数共通化による中間コードの変化を
示したものである。
【図14】ベース変数共通化による変数使用点の更新処
理を示したフローチャートである。
【図15】ロード命令更新処理直後の中間コードの例を
示したものである。
【図16】無用コード削除処理の直後の中間コードの例
を示したものである。
【符号の説明】
201…ソースモジュール、204…コンパイラ、20
5…構文解析ステップ、206…コンパイラによる最適
化ステップ、207…中間コード、 210…モジ
ュール内外部記号表、213…ライブラリ、215…リ
ンカ、 216…外部記号表作成ステップ、217…外
部記号表、220…ベース変数共通化ステップ、222
…リンクステップ、 223…ロードモジュール、10
04…ベース変数を求めるステップ、1005…ロード
命令を更新するステップ、1006…無用コードを削除
するステップ。

Claims (3)

    【特許請求の範囲】
  1. 【請求項1】リンカによるロードモジュール生成の際
    に、 コンパイラの生成したモジュール内外部記号表とライブ
    ラリを読み込むステップと、 コンパイラの生成した中間コードを読み込むステップ
    と、 中間コードを走査して最適化を行なうステップと、 中間コードとライブラリとからロードモジュールを生成
    するステップとを有し、上記中間コード最適化を行なう
    ステップでは外部変数を参照するためのレジスタ数を削
    減することを特徴とする、リンク最適化方法。
  2. 【請求項2】請求項1のリンク最適化方法であって、上
    記中間コードを最適化するステップでは、使用レジスタ
    数を削減するために、 ベースレジスタを共通化することを特徴とする、リンク
    最適化方法。
  3. 【請求項3】コンパイラによる中間コード生成の際に、 ソースファイルを入力するステップと、 ソースファイルを構文解析し中間コードを生成するステ
    ップと、 中間コードを走査して外部変数情報を生成するステップ
    と、 中間コードを最適化して中間コードを生成するステップ
    とを有し、 リンカに外部変数情報に基づく最適化を行なわせるため
    に外部変数情報を生成することを特徴とする、リンク最
    適化方法。
JP7958997A 1997-03-31 1997-03-31 リンク最適化方法 Pending JPH10275088A (ja)

Priority Applications (1)

Application Number Priority Date Filing Date Title
JP7958997A JPH10275088A (ja) 1997-03-31 1997-03-31 リンク最適化方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP7958997A JPH10275088A (ja) 1997-03-31 1997-03-31 リンク最適化方法

Publications (1)

Publication Number Publication Date
JPH10275088A true JPH10275088A (ja) 1998-10-13

Family

ID=13694193

Family Applications (1)

Application Number Title Priority Date Filing Date
JP7958997A Pending JPH10275088A (ja) 1997-03-31 1997-03-31 リンク最適化方法

Country Status (1)

Country Link
JP (1) JPH10275088A (ja)

Cited By (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2014531680A (ja) * 2011-10-03 2014-11-27 インターナショナル・ビジネス・マシーンズ・コーポレーションInternational Business Machines Corporation デコード時間命令最適化を用いた、強化されたアプリケーション・バイナリ・インターフェース(abi)のためのコードのコンパイル
JP2014533394A (ja) * 2011-10-03 2014-12-11 インターナショナル・ビジネス・マシーンズ・コーポレーションInternational Business Machines Corporation デコード時間命令最適化を用いた、強化されたアプリケーション・バイナリ・インターフェース(abi)のためのコードのリンク
US8959502B2 (en) 2011-07-27 2015-02-17 International Business Machines Corporation Processing table of content access overflow in an application
CN109918074A (zh) * 2017-12-08 2019-06-21 中标软件有限公司 编译链接优化方法
US10489131B2 (en) 2017-01-25 2019-11-26 Fujitsu Limited Efficient compilation for link time optimization

Cited By (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US8959502B2 (en) 2011-07-27 2015-02-17 International Business Machines Corporation Processing table of content access overflow in an application
JP2014531680A (ja) * 2011-10-03 2014-11-27 インターナショナル・ビジネス・マシーンズ・コーポレーションInternational Business Machines Corporation デコード時間命令最適化を用いた、強化されたアプリケーション・バイナリ・インターフェース(abi)のためのコードのコンパイル
JP2014533394A (ja) * 2011-10-03 2014-12-11 インターナショナル・ビジネス・マシーンズ・コーポレーションInternational Business Machines Corporation デコード時間命令最適化を用いた、強化されたアプリケーション・バイナリ・インターフェース(abi)のためのコードのリンク
US10489131B2 (en) 2017-01-25 2019-11-26 Fujitsu Limited Efficient compilation for link time optimization
CN109918074A (zh) * 2017-12-08 2019-06-21 中标软件有限公司 编译链接优化方法
CN109918074B (zh) * 2017-12-08 2022-09-27 中标软件有限公司 编译链接优化方法

Similar Documents

Publication Publication Date Title
US6427234B1 (en) System and method for performing selective dynamic compilation using run-time information
JP3220055B2 (ja) 機械語命令列またはアセンブリ言語命令列を最適化する最適化装置、及び、高級言語で記載されたソースプログラムを機械語またはアセンブリ言語の命令列に変換するコンパイラ装置。
US5999737A (en) Link time optimization via dead code elimination, code motion, code partitioning, code grouping, loop analysis with code motion, loop invariant analysis and active variable to register analysis
Van Put et al. Diablo: a reliable, retargetable and extensible link-time rewriting framework
Wimmer et al. Linear scan register allocation on SSA form
JP3311462B2 (ja) コンパイル処理装置
Wimmer et al. Optimized interval splitting in a linear scan register allocator
US6973644B2 (en) Program interpreter
US20090113404A1 (en) Optimum code generation method and compiler device for multiprocessor
JPH04322329A (ja) 多機種対応型情報処理システム、および、方法
US20180157470A1 (en) Compilation method and information processing apparatus
Novillo Design and implementation of Tree SSA
JP2018510445A (ja) プログラム性能を向上させる領域特化システムおよび方法
US7155707B2 (en) Compiling computer programs including branch instructions
Barua et al. OMPSan: static verification of OpenMP’s data mapping constructs
JPH10275088A (ja) リンク最適化方法
Ashcraft et al. Compiler optimization of accelerator data transfers
US7007272B2 (en) Compiling computer programs including branch instructions
US6721945B1 (en) Optimization of calls in programming languages using pointers for passing reference parameters
Sampaio et al. Spill code placement for simd machines
JP2022140995A (ja) 情報処理装置、コンパイルプログラムおよびコンパイル方法
Doerfert et al. Polyhedral expression propagation
Chatarasi et al. A unified approach to variable renaming for enhanced vectorization
Böckle Exploitation of fine-grain parallelism
Mogensen Data-Flow Analysis and Optimisation