JPH09311792A - レジスタ割り付け方法 - Google Patents

レジスタ割り付け方法

Info

Publication number
JPH09311792A
JPH09311792A JP12684496A JP12684496A JPH09311792A JP H09311792 A JPH09311792 A JP H09311792A JP 12684496 A JP12684496 A JP 12684496A JP 12684496 A JP12684496 A JP 12684496A JP H09311792 A JPH09311792 A JP H09311792A
Authority
JP
Japan
Prior art keywords
register
cost
function
callee
profit
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
JP12684496A
Other languages
English (en)
Inventor
Hiroyuki Hashimoto
博幸 橋本
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 JP12684496A priority Critical patent/JPH09311792A/ja
Publication of JPH09311792A publication Critical patent/JPH09311792A/ja
Pending legal-status Critical Current

Links

Landscapes

  • Devices For Executing Special Programs (AREA)

Abstract

(57)【要約】 【課題】既に割り付けられたcalleeレジスタを有
効利用する。 【解決手段】レジスタの探索を行うときに、calle
eレジスタのプロフィット値から関数入口と出口で必要
になる退避・回復コードのコストを引いた値がcall
erレジスタのプロフィット値よりも大きいかを判定し
(ステップ607)、calleeレジスタのプロフィ
ット値から関数入口と出口で必要になる退避・回復コー
ドのコストを引いた値の方が大きい場合に、既に割り付
けられているcalleeレジスタの中から割り付けら
れるレジスタを探す(ステップ608)ようにする。

Description

【発明の詳細な説明】
【0001】
【発明の属する技術分野】本発明はコンパイラのレジス
タ割り付け方法に関する。
【0002】
【従来の技術】ソースプログラムを目的コードに変換す
るコンパイラにおいて、目的コードの実行性能を向上さ
せるための最適化方式は、これまでも数多く開発されて
おり、A.V.エイホ、R.セシィ、J.D.ウルマン
著「コンパイラ」等で詳しく述べられている。
【0003】その中の最適化方式の1つとして、ソース
プログラム中で参照されている変数に対し、メモリへの
参照回数を削減し、限られた資源であるレジスタにデー
タを乗せたまま実行を行い、目的コードの実行時間を向
上させるための処理として、レジスタ割り付けと呼ばれ
る処理が存在する。
【0004】この限られた資源であるレジスタを有効に
割り付けるための様々な方法のうち1つとしてプロフィ
ット値(レジスタを割り付けるときの指標となる)を用
いた割り付け方法がある。
【0005】プロフィット値を用いた割り付けは、まず
レジスタを2つのクラスに分類することを始める。この
2つの分類により分けられたレジスタの集合をそれぞれ
callee退避レジスタ、caller退避レジスタ
と呼ぶ。
【0006】(1)callee退避レジスタ レジスタクラスのうち1つであり、呼び出し先の関数で
レジスタの内容を保証しなければならないレジスタのこ
とである。呼び出し先の関数でこのクラスのレジスタを
参照する場合は、関数の入口でレジスタ内容の退避を、
関数の出口でレジスタ内容の回復を行わなければならな
い。したがって、呼び出し元では関数呼び出しを跨って
このクラスのレジスタを割り付けることができる。ca
llee退避レジスタを単にcalleeレジスタと呼
ぶ。
【0007】(2)caller退避レジスタ レジスタクラスのうちの1つであり、呼び出し元の関数
でレジスタの内容を保証しなければならないレジスタの
ことである。つまり、関数呼び出しがある場合呼び出す
直前と呼び出した後にこのクラスのレジスタは内容が変
更されている可能性があるということである。したがっ
て、呼び出し元では関数呼び出しを跨ってこのクラスの
レジスタを割り付けることはできない。関数呼び出しを
跨って生きている変数にこのクラスのレジスタを割り付
けた場合は、関数呼び出しの直前までにレジスタの値を
メモリなどに退避するコードを(この退避を行うことを
セーブすると呼び、セーブを行う参照点をセーブ点と呼
ぶ)、関数呼び出しの直後の値をメモリなどから回復す
るコードを(この回復を行うことをリストアすると呼
び、リストアを行う参照点をリストア点と呼ぶ)生成し
なければならない。caller退避レジスタを単にc
allerレジスタと呼ぶ。
【0008】この2つのクラスのレジスタ集合に対し
て、変数の参照点で必ずロード・ストア命令を作成する
場合に比べて、レジスタに割り付けることによりどれく
らい得をするかを示すものがプロフィット値である。c
alleeレジスタに対するプロフィット値をcall
eeプロフィット。callerレジスタに対するプロ
フィット値をcallerプロフィットとそれぞれ呼
ぶ。
【0009】次に、コストについて説明する。コストと
は、何命令でその処理を完了することができるかを示し
たものである。以下、議論を簡単にするために3つのコ
ストだけを考慮した場合で説明する。
【0010】(1)ロードコスト あるレジスタにメモリから値を読み込む場合に必要な命
令数。
【0011】(2)ストアコスト あるレジスタからメモリに値を格納する場合に必要な命
令数。
【0012】(3)コピーコスト あるレジスタから別のレジスタに値を移動させる場合に
必要な命令数。
【0013】まず。calleeレジスタを割り付ける
場合のプロフィット値の計算手順について説明する。c
alleeレジスタは関数呼び出しを跨って参照する場
合、呼び出し先がレジスタの内容を保証しなければなら
ない。したがって、呼び出された先の関数内でこのクラ
スのレジスタを参照する場合は、関数の入口でレジスタ
の内容の退避、つまりメモリへのストア命令を、関数の
出口でレジスタの内容の回復、つまりメモリからのロー
ド命令を生成しなければならない。したがって、cal
leeレジスタをある関数内で割り付けようとする場合
は、手続きの入口と出口で退避・回復が必要になるの
で、ロードコストとストアコストが必ず必要になる。
【0014】次に、callerレジスタを割り付ける
場合のプロフィット値の計算について説明する。cal
lerレジスタは関数呼び出しを跨って参照する場合、
呼び出し元がレジスタの内容を保証しなければならな
い。したがって、calleeレジスタは呼び出された
関数では、calleeレジスタで必要になる関数入口
と出口での退避・回復は必要ないのでロードコストとス
トアコストは必要ない。しかし、関数呼び出しを跨って
生きている変数に割り付けようとする場合は、レジスタ
のセーブ・リストアが必要になるため、関数の直前の定
義点でセーブのためのストアコストが、関数直後の使用
点でリストアのためのロードコストが必要になる。
【0015】また、関数の引数や戻り値として参照され
ている場合、それらの参照点では必ず決まったレジスタ
を使わなければならない。このレジスタは通常call
erレジスタになる。したがって、このような文脈で変
数が参照されている場合は、calleeを割り付ける
とこれらの参照点でcalleeレジスタからcall
erレジスタへのコピーが必要になるため、コピーコス
トを考慮する必要がある。
【0016】このようにして、レジスタを割り付ける前
に、各変数が参照されている文脈よりcalleeプロ
フィットとcallerプロフィットを計算しておくこ
とになる。
【0017】
【発明が解決しようとする課題】上記従来技術では、割
り付け前にcalleeプロフィットとcallerプ
ロフィットを計算しておくため、以下のような問題が発
生する。関数内で既にcalleeレジスタが割り付け
られた場合は、それ以降に割り付ける変数では関数入口
と出口で必要な退避・回復のコストは、既にcalle
eレジスタが退避・回復されることが決定しているので
考えなくても良いことになる。この点を考慮しないまま
レジスタの割り付けを行うとcalleeレジスタを割
り付けた方がcallerレジスタを割り付けるより良
いような場合でも、calleeプロフィットが関数入
口と出口で必要な退避・回復のコストを含んだままにな
っているので、callerレジスタが割り付けられる
ことがある。
【0018】これを図12を用いて説明する。関数呼び
出し(1202)の前後に変数aの定義(1201)と
使用(1203)がある場合を例に取る。変数aは、関
数呼び出しを跨って生きているため、callerレジ
スタを割り付けた場合には、定義点でストア命令が、使
用点でロード命令が生成されることになる。次に、ca
lleeレジスタを割り付けた場合には、関数の呼出し
先でレジスタの内容が保証されるためメモリの参照をす
ることなく定義点と使用点で値を参照することができ
る。ただし、calleeレジスタがこの関数内で初め
て割り付けられた場合には、関数の入口と出口でレジス
タの値の退避と回復が必要になる。しかし、あるcal
leeレジスタが既に割り付けられており、そのcal
leeレジスタをこの変数に割り付ける場合は、既にそ
のcalleeレジスタを退避・回復することが決定し
ているので変数aには、ルモリの参照をすることはなく
値を参照できるcalleeレジスタを割り付けた方が
よいことになる。
【0019】上記従来技術の課題は、既に割り付けられ
ているcalleeレジスタを考慮した割り付けが行え
ないことになる。
【0020】本発明の目的は、既に割り付けられている
calleeレジスタを考慮した割り付けが行うことに
ある。
【0021】
【課題を解決するための手段】上記目的は、関数内で割
り付けられたレジスタを記憶しておくテーブルを用意
し、割り付けるレジスタを探すときに、calleeプ
ロフィットから関数入口と出口で必要なコストを引いた
値がcallerプロフィットより大きいときに、既に
割り付けられているcalleeレジスタから割り付け
られるレジスタを探すようにすることで達成することが
できる。
【0022】
【発明の実施の形態】本発明は、コンパイラにおけるレ
ジスタ割り付け方法に関するものである。
【0023】以下では、本発明の一実施例を図面を用い
て説明する。なお、これにより本発明が限定されるもの
ではない。
【0024】図1は、本発明のレジスタ割り付け方法の
一実施例のシステム構成図である。
【0025】本システムは、CPU装置1、メモリ装置
2、入力装置3、表示装置4から構成されている。コン
パイラ10はCPU装置1により処理、実行される。コ
ンパイラ10は、ソースプログラム30を入力し、幾度
か中間コード40を生成しながら、最終的に目的コード
50を生成する。目的コード50は、実行20で実行さ
れ結果を表示装置4に表示したり、実行結果60に結果
を出力する。
【0026】図2は、コンパイラ10における処理構成
図である。
【0027】コンパイラ10は、中間コード生成部20
1、中間コード最適化部202、レジスタ割り付け部2
03、目的コード生成部207からなる。さらに、レジ
スタ割り付け部203は、参照転属性の設定204、プ
ロフィットの計算205、レジスタ割り付け206から
なる。中間コード生成部201では、ソースプログラム
を入力し、字句解析と構文解析を行った後中間コード4
0を生成する。中間コード最適化部202は、中間コー
ド40を入力し、いくつかの最適化を行った後中間コー
ド40を生成する。レジスタ割り付け部203は、中間
コード40を入力し各変数の参照をレジスタの参照また
はメモリからの参照にした中間コード40を生成する。
目的コード生成部207は、中間コード40を入力しそ
れぞれのマシンで実行させるため目的コード50を生成
する。
【0028】レジスタ割り付け部203は、参照点属性
の設定204、プロフィットの計算205、レジスタ割
り付け206からなる。
【0029】図3は、レジスタ割り付け部203の処理
の一例を示したものである。
【0030】ステップ301の参照点属性の設定では、
中間コード40を入力し、各変数に対しそれぞれの参照
点の意味を考慮して参照点属性を設定する。ステップ3
02では、ステップ301の参照点属性の設定で設定さ
れた参照点属性に対してそれぞれの参照点属性に対して
予め設定されているプロフィット値を設定し、各変数ご
とにプロフィットを計算する。ステップ303は、ステ
ップ302で設定された各変数のプロフィット値をもと
に、よりプロフィットの高い変数からレジスタを割り付
けていく。
【0031】図4は、参照点属性の設定301の処理の
一例を示したものである。
【0032】参照点属性の設定処理は、ある変数が参照
されている箇所の意味を解析し、それぞれの意味に対し
て属性を設定する。例えば、関数間に跨って参照可能な
変数(以下グローバル変数と呼ぶ)は、関数呼び出しが
ある場合、呼び出した先の関数で参照することが可能な
ので、関数を呼び出す直前までにメモリに現在の値をス
トアしておかなければならない。さらに、関数呼び出し
後にその変数の値を使用する場合は、メモリから現在の
値をロードしなければならない。したがって、ある参照
点が使用点で、その直前の参照点との間に関数呼び出し
が存在する場合、その参照点にロード属性を設定する
(ステップ404,405,406)。ある参照点が定
義点で、その直後の参照点との間に関数呼び出しが存在
する場合、その参照点にストア属性を設定する(ステッ
プ408,409,410)。さて、グローバル変数に
ついては上記のステップロード、ストア属性を設定する
ことになる。グローバル変数に対して、関数内のみで参
照可能な変数(以下ローカル変数と呼ぶ)が、関数を跨
って参照されている場合の処理について説明する。ロー
カル変数呼び出し先の関数で定義されることはないので
関数呼び出しを跨ってレジスタを割り付けても良いこと
になる。しかし、割り付けるレジスタのクラスによって
は、関数呼び出し前後にメモリへの退避・回復コードが
必要になる。ここで、callerレジスタを割り付け
た場合、callerレジスタは関数呼び出しを跨って
参照できないので、関数呼び出し前後にメモリへの退避
・回復コードが必要になる。したがって、ローカル変数
に対しては、この退避・回復が必要な参照点を求めて属
性を設定する必要がある(ステップ404,405,4
07とステップ408,409,411,412)。
【0033】この他に考慮する参照点としては、変数が
関数呼び出しの引数に使用されている場合や、関数の戻
り値を受け取る場合がある。これはこのような参照点で
は特定のレジスタに値を載せていなければならない(こ
れを関数呼び出しにおけるコンベンションと呼ぶ)から
である。したがって、特定のレジスタ以外のレジスタを
割り付けた場合は、特定レジスタへのコピーコードを生
成しなければならない。このような参照点の属性を引数
・戻り値属性と呼ぶ。
【0034】この他にも使用するマシンにより考慮しな
ければならない項目もあるのだが、ここでは議論を簡単
にするため以上の3つの参照点についてのみ考慮するこ
とにする。
【0035】図5は、プロフィット値の計算302の処
理の一例を示したものである。
【0036】プロフィットの計算方法について説明す
る。プロフィットはcalleeプロフィット、cal
lerプロフィットの2つがある。それぞれの意味は、
その変数にレジスタが割り付かなかった場合に比べ、そ
のクラスのレジスタを割り付けることでどれだけの得に
なるかを示す値である。この値が大きければ大きいほど
そのクラスのレジスタを割り付けた方がより速く実行で
きることになる。
【0037】プロフィットは、変数にレジスタが割り付
かなかった場合のコスト(以下、base_costと
呼ぶ)からcalleeまたはcallerを割り付け
た場合のコスト(以下、callee_cost,ca
ller_costと呼ぶ)を引くことにより求める。
callee_costとcaller_costは参
照点属性の設定301で設定した各参照点の属性を元に
もとめる。
【0038】ステップ501では、base_cos
t,callee_cost,caller_cost
の初期化を行う。callee_costが‘load
_cost+store_cost’になっていること
について説明する。calleeレジスタは、自関数で
内容を変更する場合、呼び出し元に対する値の保証をし
なければならないため、関数の入口に退避コードとなる
ストア命令、関数の出口に回復コードとなるロード命令
が必要になる。したがって、callee_costは
必ず‘load_cost+store_cost’を
初期値として計算を始めなければならない。
【0039】ステップ505,506,507では、b
ase_costを計算する。base_costはレ
ジスタが割り付かない場合のコストなので、使用点では
load_costを定義点ではstore_cost
をそれぞれ加える。
【0040】ステップ508,509では、参照点の属
性がロード属性の場合の処理を行う。ロード属性の場合
は、calleeレジスタcallerレジスタのどち
らかのクラスのレジスタを割り付けても必ずロード命令
が必要になるので、callee_costとcall
er_costにload_costを加える。
【0041】ステップ510,511では、参照点の属
性がストア属性の場合の処理を行う。ロード属性の場合
と同じようにストア属性がある参照点では必ずストア命
令が必要になるので、callee_costとcal
ler_costにstore_costを加える。
【0042】ステップ512,513では、参照点の属
性がリストア属性の場合の処理を行う。リストア属性は
callerレジスタを割り付けた場合のみ必要なコス
トであるので、caller_costにのみload
_costを加える。
【0043】ステップ514,515では、参照点の属
性がセーブ属性の場合の処理を行う。セーブ属性はリス
トア属性と同じようにcalleeレジスタを割り付け
た場合のみ必要なコストであるので、caller_c
ostにのみstore_costを加える。
【0044】ステップ516,517では、参照点の属
性が引数・戻り値属性の場合の処理を行う。通常、引数
・戻り値として決められているレジスタはcaller
クラスのレジスタなので、calleeクラスのレジス
タを割り付けた場合は、特定のcallerレジスタへ
のコピーが必要になる。したがって、この場合はcal
lee_costにcopy_costを加える。
【0045】ステップ519では、base_cost
からcallee_costまたはcaller_co
stを引いてcallee_profit,calle
r_profitを求める。この2つの値は、変数情報
テーブル700の、calleeプロフィットフィール
ドとcallerプロフィットフィールドにそれぞれ設
定する。
【0046】図6は、図5で求めたプロフィットから変
数に割り付けるレジスタを探すためのレジスタ探索処理
の一例を示したものである。
【0047】図7は、変数情報テーブル700のテーブ
ル構造を示したものである。このテーブルは、参照点情
報リストを示すポインタフィールド701と、call
eeプロフィットを記憶するcalleeプロフィット
フィールド702と、callerプロフィットを記憶
するcallerプロフィットフィールドと、変数に割
り付けられたレジスタ番号を記憶する割り付けレジスタ
フィールド704と、次の変数情報テーブルを示すポイ
ンタフィールド705とからなる。
【0048】図8は、参照テーブル800のテーブル構
造を示したものである。このテーブルは、中間コードを
示すポインタフィールド801と、参照点の属性を記憶
する参照点の属性フィールド802と、次の参照点テー
ブルを示すポインタフィールド803とからなる。
【0049】図9は、変数情報テーブル700と参照点
テーブル800の結合状態を示した概念図である。1つ
の変数情報テーブル700には、複数の参照点テーブル
800が接続される。さらに、変数情報テーブル700
は、他の変数情報テーブル700と接続されている。
【0050】図10は、レジスタ情報テーブル1000
のテーブル構造を示したものである。このテーブルは、
レジスタ番号を示すレジスタ番号フィールドと、レジス
タクラスの種別を示すレジスタ種別フィールドと、関数
内でそのレジスタが割り付けられたかどうかを示す割り
付け済みフラグフィールドからなる。
【0051】図11は、コスト情報テーブル1100の
テーブル構造を示したものである。このテーブルは、コ
ストを考慮する参照点の種別であるコスト種別フィール
ドと、そのコスト種別でのコストを示したコストフィー
ルドからなる。
【0052】
【発明の効果】既に割り付けられたcalleeレジス
タを有効利用することで、関数呼び出しを跨って生きて
いる変数にcalleeレジスタを割り付けることによ
り、callerを割り付けた場合に生成するメモリへ
のストア命令とロード命令を生成しなくても良いことに
なり、目的コードの実行性能を向上させることができ
る。
【図面の簡単な説明】
【図1】本発明の一実施例のシステム構成図である。
【図2】コンパイラの処理構成図である。
【図3】レジスタ割り付け処理手順を示すフローチャー
ト図である。
【図4】参照点の属性設定処理手順を示すフローチャー
ト図である。
【図5】プロフィットの計算処理手順を示すフローチャ
ート図である。
【図6】レジスタ探索処理手順を示すフローチャート図
である。
【図7】変数情報テーブルの構成図である。
【図8】参照点テーブルの構成図である。
【図9】変数情報テーブルと参照点テーブルの結合状態
を示す概念図。
【図10】レジスタ情報テーブルの構成図である。
【図11】コスト情報テーブルの構成図である。
【図12】ソースプログラム例である。
【符号の説明】
10…コンパイラ、 30…ソースプログラム。
40…中間コード、50…目的コード。

Claims (1)

    【特許請求の範囲】
  1. 【請求項1】呼び出し先で退避回復するレジスタである
    callee退避レジスタが、割り付け単位内で割り付
    けられたかを記憶するテーブルと、割り付け時に割り付
    け指標となる値を再計算し、該テーブルから既に割り付
    けられているcallee退避レジスタを探し該cal
    lee退避レジスタが割り付けられるかどうかを調べる
    処理とを有するレジスタ割り付け方法。
JP12684496A 1996-05-22 1996-05-22 レジスタ割り付け方法 Pending JPH09311792A (ja)

Priority Applications (1)

Application Number Priority Date Filing Date Title
JP12684496A JPH09311792A (ja) 1996-05-22 1996-05-22 レジスタ割り付け方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP12684496A JPH09311792A (ja) 1996-05-22 1996-05-22 レジスタ割り付け方法

Publications (1)

Publication Number Publication Date
JPH09311792A true JPH09311792A (ja) 1997-12-02

Family

ID=14945276

Family Applications (1)

Application Number Title Priority Date Filing Date
JP12684496A Pending JPH09311792A (ja) 1996-05-22 1996-05-22 レジスタ割り付け方法

Country Status (1)

Country Link
JP (1) JPH09311792A (ja)

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2007511817A (ja) * 2003-11-05 2007-05-10 ローベルト ボッシュ ゲゼルシャフト ミット ベシュレンクテル ハフツング 駆動シーケンスを制御するための機能を適合させる方法および装置

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2007511817A (ja) * 2003-11-05 2007-05-10 ローベルト ボッシュ ゲゼルシャフト ミット ベシュレンクテル ハフツング 駆動シーケンスを制御するための機能を適合させる方法および装置

Similar Documents

Publication Publication Date Title
US5790862A (en) Resource assigning apparatus which assigns the variable in a program to resources
JP3110040B2 (ja) 手順間レジスタ割付けを伴うコンピュータプログラムのコンパイル方法及び装置
US8972959B2 (en) Method of converting program code of program running in multi-thread to program code causing less lock collisions, computer program and computer system for the same
JP2000347874A (ja) レジスタ割当器を用いた呼出規則プロローグ・エピローグコード構築方法及び装置
US20010047511A1 (en) Method of reducing unnecessary barrier instructions
JP3299611B2 (ja) 資源割付装置
EP0806725A2 (en) Method and apparatus for easy insertion of assembler code for optimization
JPH05204656A (ja) スレッド固有データ保持方法
CN115705294B (zh) 用于获取函数调用信息的方法、装置、电子设备和介质
CN111796865A (zh) 一种字节码文件修改方法、装置、终端设备及介质
US20110167415A1 (en) Language processing apparatus, language processing method, and computer program product
US6625806B1 (en) Language processing method and language processing system improving use efficiency of cache memory
US8769498B2 (en) Warning of register and storage area assignment errors
US11435989B2 (en) Thread-local return structure for asynchronous state machine
US5826087A (en) Method and apparatus for cross calling programs of different lexical scoping methodology
CN111475226B (zh) 电子装置、微服务调用方法和计算机可读存储介质
JPH09311792A (ja) レジスタ割り付け方法
JPH10293691A (ja) レジスタ割り付け方法
US7770152B1 (en) Method and apparatus for coordinating state and execution context of interpreted languages
JP3241214B2 (ja) 分散処理装置及びプロセス実行方法
CN114296774A (zh) 一种应用程序的存储方法、调用方法、装置及存储介质
US6311227B1 (en) Procedure calling method
CN114139079A (zh) 一种api请求的处理方法、装置、设备及存储介质
JP3166699B2 (ja) オブジェクト指向プログラム設計支援装置、方法および記録媒体
CN113626110A (zh) 数据动态处理方法、设备、存储介质及装置