JPH07105013A - レジスタ割り付け方式 - Google Patents

レジスタ割り付け方式

Info

Publication number
JPH07105013A
JPH07105013A JP24680793A JP24680793A JPH07105013A JP H07105013 A JPH07105013 A JP H07105013A JP 24680793 A JP24680793 A JP 24680793A JP 24680793 A JP24680793 A JP 24680793A JP H07105013 A JPH07105013 A JP H07105013A
Authority
JP
Japan
Prior art keywords
register
variable
memory
code
allocation
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
JP24680793A
Other languages
English (en)
Inventor
Takako Kimura
隆子 木村
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.)
NEC Corp
Original Assignee
NEC 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 NEC Corp filed Critical NEC Corp
Priority to JP24680793A priority Critical patent/JPH07105013A/ja
Publication of JPH07105013A publication Critical patent/JPH07105013A/ja
Pending legal-status Critical Current

Links

Landscapes

  • Devices For Executing Special Programs (AREA)

Abstract

(57)【要約】 【目的】コンパイラのレジスタ割り付けにおいて、高速
メモリを準レジスタとして割り付け先の候補とすること
によって、レジスタだけの割り付けよりも命令長が短
く、実行速度の早いオブジェクトを生成する。 【構成】図1の105でコード生成の過程においてレジ
スタを確保しなくてはならない時に106にその要求を
出し、107で103の参照回数をもとに割り付け先の
候補として高速メモリも考えてコスト計算を行ない、そ
の結果によって最も命令長が短く、実行速度が早い割り
付け先を求め、108,109,110のいづれかに割
り付けを行ない、111でコードを生成する。

Description

【発明の詳細な説明】
【0001】
【産業上の利用分野】本発明は、マイクロコンピュータ
用のコンパイラの言語処理方式に関する。
【0002】
【従来の技術】マイクロコンピュータ用のコンパイラは
限られたROMとRAMを効率良く使用するために、コ
ードが小さく、実行速度の早いオブジェクトを生成する
ことが求められる。マイクロコンピュータには、メモリ
の一部に、その領域をアクセスする命令の命令長が短
く、実行速度が通常のメモリよりも早く、直接データを
割り付けることが可能で通常の外部メモリと同様に使用
することができる領域(以下、高速メモリと呼ぶ)を持
つアーキテクチャが存在する。コンパイラは、この高速
メモリを使用することによって出力されるオブジェクト
のサイズが小さく、実行速度の早いオブジェクトを生成
することができる。従来はユーザーのソースプログラム
中での記述により、高速メモリを変数の領域として使用
しており、コンパイラのレジスタ割り付けには使用して
いなかった。
【0003】以下、図面を参照して従来のレジスタ割り
付け法を説明する。
【0004】図9は従来の技術のシステムブロック図で
ある。従来のレジスタ割り付け法では、コード生成の過
程において変数をレジスタに割り付ける時に、レジスタ
が全て使用状態になっていると、スタック領域を使用せ
ざるを得なかった。スタック領域とはメモリの一時使用
領域を指示するスタックポインタにより管理され、プロ
グラム実行時に利用されるメモリの一時的な使用領域で
ある。ここで従来技術の流れを簡単に説明する。図9の
システムブロック図より、構文解析部901は入力され
たソースファイルの解析を行ない、中間コードを出力す
る。中間コードへの変形は図10に示す。次にデータフ
ロー解析部902において、プログラム中で変数がどこ
で代入され、どこで参照されているかという情報を収集
する。コード生成部903の過程においてレジスタ要求
部904より指定されたレジスタを一つ確保するという
要求が出された場合、レジスタ割り付け部905では指
定されたレジスタを使用可能な状態にするためにレジス
タへの割り付け906、スタック領域への退避907が
行なわれる。そして、コード生成部908によってコー
ドが生成される。
【0005】データフロー解析の詳細について以下に説
明する。
【0006】まず、構文解析部901によって解析され
たソースファイルの基本ブロックに分割する。基本ブロ
ックとは、連続するプログラムのかたまりが途中で分岐
してきたり分岐したりせずに先頭の文から最後の文まで
シーケンシャルに実行される文のならびを言う。次に各
基本ブロック内で、各変数の代入、参照を調べ、生変数
解析表図11の1101のフィールドにlive/de
adフラグを立てる。生成変数解析表とは、処理してい
く文の流れによって変化してゆく変数のlive/de
adの状態を表にまとめたものである。liveとは、
その変数の値が修正される前に再び参照されるというこ
とで、その変数に格納しているレジスタが使用不可能な
状態のことである。deadとは再び参照されない変数
のことで、その変数を格納しているレジスタが使用可能
な状態のことである。レジスタ割り付け部905の処理
について図12のフローチャートを用い、説明する。ま
ず、レジスタ要求部904より指定されたレジスタを一
つ確保するという要求を受け、指定されたレジスタにど
の変数が割り当たっているかをレジスタアソシエーショ
ンリストより求める。レジスタアソシエーションリスト
とは、それぞれのレジスタにその時点でどの変数が対応
しているかを示したものである。どの変数も割り当たっ
ていない未使用のレジスタは空のレジスタとみなす。レ
ジスタアソシエーションリストの内容を図13に示す。
レジスタアソシエーションリストより求められた変数が
liveかdeadかを図11の生変数解析表より調べ
(ステップ1201)、指定されたレジスタの変数がd
eadなら既にそのレジスタは使用可能な状態なのでそ
のままレジスタ割り付け部905を抜ける。指定された
レジスタの変数がliveであれば他のレジスタに使用
可能なレジスタが存在するかどうか調べ(ステップ12
02)、使用可能なレジスタが存在すれば指定されたレ
ジスタに入っているlive変数を使用可能なレジスタ
に転送する命令を出力し(ステップ1203)、レジス
タ割り付け部905を抜ける。使用可能なレジスタが存
在しなければ指定されたレジスタに入っている変数をス
タック領域に退避(ステップ1204)させてレジスタ
割り付け部905を抜ける。
【0007】以上の処理によって、図14の1401の
Cソース行が入力された場合、その過程で1401の右
辺の計算結果である変数vxがレジスタアソシエーショ
ンリストによると、AXレジスタに入っている(図1
3)。変数vxはその後も参照されているのでAXレジ
スタはliveであり、1402のCソース行でAXレ
ジスタを使用したいので、レジスタ要求部よりAXレジ
スタを使用可能な状態にするという要求が出される。そ
こで他のレジスタに使用可能な状態のレジスタが存在す
るかをレジスタアソシエーションリストと生変数解析表
より求め、あればそのレジスタにAXレジスタの内容を
退避させる。ここでは、AXレジスタ以外のレジスタは
全て空なのでBCレジスタに退避させる。従って、14
03のAXの内容をBCに退避するアセンブラコード
(MOVW BC,AX)が出力される。
【0008】
【発明が解決しようとする課題】上述した従来の方式で
は、レジスタが全て使用状態になった時に、変数の退避
先としてスタック領域が使用されてしまうので出力命令
が長く、プログラム実行速度が遅くなる。従って、スタ
ック領域に転送する命令を出力するよりも、変数が元々
存在したメモリから直接アクセスするようにした方が命
令の数が少なくて済むので、結局、再びメモリに書き戻
されることが多い。しかし、レジスタに比べるといづれ
の場合も、演算、転送に要するバイト数及びクロック数
が多いので、良いコードは生成されない。
【0009】
【課題を解決するための手段】本発明では、割り付け先
に高速メモリを候補として考えるために、ソースファイ
ル中の変数live/dead情報と参照回数を収集す
る手段と、収集した情報を元に割り付け先をどこにする
のが最も効率が良いかを計算する手段と、計算結果によ
りレジスタ、高速メモリへの割り付けを行なう手段を有
することにより、コードサイズが小さく、実行速度が早
いオブジェクトの生成を可能としたことを特徴とする。
【0010】
【実施例】以下、図面を参照して本発明の実施例を詳細
に説明する。
【0011】図1は本発明の一実施例のシステムブロッ
ク図である。構文解析部101は入力されたソースファ
イルの解析を行ない、次にデータフロー解析部102に
おいてプログラムの中で変数がどのように使われている
かという情報を収集する。コード生成部104では、変
数をレジスタに割り付けながら、コードを生成する。そ
の中の処理としてレジスタ要求部105では、コード生
成の過程においてレジスタを確保しなくてはならない時
に、レジスタ割り付け部106にその要求を出す。レジ
スタ割り付け部106は、コスト計算部107とそれぞ
れの割り付け108,109,110によって構成され
る。コスト計算部ではデータフロー解析によって収集さ
れた情報をもとに、指定されたレジスタが使用可能な状
態か否か、使用可能な状態でない場合に他のレジスタ、
高速メモリ、メモリのいずれに退避するのが最も良いコ
ードになるかをコスト計算によって求める。その結果に
従って必要な割り付け108,109,110を行な
う。
【0012】データフロー解析部では従来の処理に加
え、変数の参照回数を収集するという処理103を行な
う。従って、生変数解析表には、live/deadの
フラグに加え、変数の参照回数も書き込む。201のフ
ィールドはlive/deadのフラグ、202はその
変数のその時点以降のプログラム内での参照回数であ
る。ここで、参照回数のカウント方法について説明す
る。参照回数のカウントはlive/dead情報の収
集と共に行なう。まず、構文解析部101により解析さ
れ、中間コードに変形されたソースファイルを基本ブロ
ックに分割する。分割した基本ブロックの最初の文をそ
の基本ブロックの先頭の文とし、次の基本ブロックとの
境の文を最終文とする。各変数ごとに、基本ブロックに
分割されたソースプログラムの最終文から先頭の文に向
かって解析を行なう。初めて参照が出きた場合、その時
点での参照回数は0であり、最終文からその時点までの
参照回数も0となる。その上の文からは1となる。次に
参照が出きた場合、その時点までの参照回数は1で、そ
の上の文からは2となる。以上の処理の繰り返しによっ
てカウントを行なう。代入が出てきた場合、その時点で
の参照回数はそれまでの参照回数を引き継ぎ、その上の
文からはゼロにもどる。
【0013】以上のように参照回数を求めながら生変数
解析表に書き込む。
【0014】以下にレジスタ割り付け部106の詳細を
説明する。
【0015】まず、レジスタ要求部105によって指定
されたレジスタ(ここではR0を指定されたと仮定して
説明する)を一つ使用可能にするという要求が出た場
合、R0に割り当たっている変数をレジスタアソシエー
ションリストより求め、その変数がdeadかlive
かを生変数解析表より調べ(ステップ301)、もしd
eadであれば既に使用可能な状態なのでそのままレジ
スタ割り付け部を抜ける。liveであればR0に割り
付けられている変数がそれ以降参照される回数を生変数
解析表図2より求め、レジスタ、高速メモリ、メモリに
それぞれ退避させた場合のコストを計算する(ステップ
302)。ここでコストの計算方法を説明する。コスト
とは、命令の実行時に要するバイト数、またはクロック
数のことであり、コストが小さければ小さい程命令長は
短くなり、実行速度は早くなる。図4に示すようにデー
タがどこに格納されているかによって転送、演算にかか
るコストが異なる。変数をどこに退避させておくのが一
番コストがかからないかを求めたいので、退避先として
考えられるレジスタ、高速メモリ、メモリについてのコ
スト計算を行なうとする。変数が退避した後、何回参照
されるかによって、その変数についてのコストの合計も
変わってくるので、ここで使用するコスト関数を、その
レジスタに入っている変数の参照コストと変更コストと
の和として定義する。参照コストとはR0に割り付けら
れている変数が現時点以降において演算のオペランドと
して参照された時、参照している演算の実行に要するク
ロック数またはバイト数に参照回数を掛けたものとす
る。変更コストとはレジスタに割り付けられている変数
を退避先に移動するのに要するクロック数またはバイト
数である。
【0016】ステップ302の計算では、退避先の候補
となるレジスタがliveである時は、そのレジスタに
入っている変数を高速メモリに退避するという動作を考
慮して、その分のコストも加算しておく。その際に、高
速メモリに退避する変数の参照回数が必要となるので生
変数解析表より調べる。liveレジスタの計算以外に
も、deadレジスタ、高速メモリ、メモリに退避する
場合をそれぞれ計算し、コストが最小となる退避先を求
める(ステップ303)。最小となる退避先がレジスタ
であるかの判断(ステップ304)をし、レジスタであ
れば、liveかdeadかの判断(ステップ306)
をする。liveレジスタであれば、そのレジスタの中
の変数を高速メモリへ退避させ(ステップ307)、R
0の内容をそのレジスタに退避させる(ステップ30
8)。deadレジスタであれば、そのままR0の内容
を退避させる(ステップ308)。最小となる退避先が
レジスタではない場合、高速メモリが最小であれば(ス
テップ305)高速メモリへの退避を行ない(ステップ
309)、その変数が元々あったメモリ領域へ書き戻す
ことが最小であれば(ステップ305)、メモリへの書
き戻しを行なう(ステップ310)。この状態でR0は
使用可能な状態になる。
【0017】以上の処理により、図16のような場合、
1602のアセンブラコードでAXレジスタには変数v
yが入っており、liveの状態となっている。次の式
1603でAXレジスタを使用していたため、AXレジ
スタを使用可能な状態にするために図3のフローチャー
トに従い、処理を行なう。式1603の時点でレジスタ
アソシエーションリストの状態を図5の状態とする。そ
れぞれの変数の状態は図6の601の時点の通りとす
る。以上の条件で、バイト数を対象にコスト計算を行な
うと、図7のような結果になる。従って、高速メモリに
退避させておくのがコストが最小となるので、1604
のAXの内容を高速メモリに退避させるアセンブラコー
ド(MOVW STKSAD0,AX)が出力される。
以下、変数vyのアクセスは高速メモリから行なわれ、
命令長が短く、実行速度の早いコードが出力される。
【0018】上記実施例では、レジスタ割り付け部の説
明で、レジスタ要求部が指定されたレジスタを一つ使用
可能にするという要求を出した場合について説明した
が、本実施例では、レジスタを指定しないで、どのレジ
スタでも良いから一つだけ使用可能な状態にするという
要求を出した場合について説明する。
【0019】全体の流れを示したシステムブロック図は
実施例1のシステムブロック図と同じである。本実施例
は、レジスタ要求部からの要求が実施例1とは異なるの
で、レジスタ要求部以降の説明をフローチャートを用い
て説明する。
【0020】本実施例のフローチャートを図8に示す。
まず、レジスタアソシエーションリストより、レジスタ
に割り当たっている変数を求め、その変数の中でdea
dなものが存在するかを調べる(ステップ801)。も
しあれば、どのレジスタでも良いから一つだけ使用可能
な状態にするという要求が満たされているので、レジス
タ割り付け部を抜ける。deadのレジスタがなけれ
ば、それぞれのレジスタに格納されているliveな変
数をどれか一つ、退避させて使用可能なレジスタにしな
くてはならない。そこで考えられる退避先としては高速
メモリへの退避かメモリへの書き戻しのどちらかにな
る。従って、それぞれのレジスタに格納されているli
ve変数を、高速メモリに退避させた場合とメモリに書
き戻したをした場合の両方についてコスト計算を行ない
(ステップ802)、コストが最小となるレジスタと退
避先を求める(ステップ803)。最小となる退避先が
高速メモリであるか調べ(ステップ804)、高速メモ
リであれば、最小となるレジスタの変数を高速メモリへ
割り付け(ステップ805)、メモリに書き戻すのが最
小となれば、最小となるレジスタの変数をメモリに書き
戻す(ステップ806)。
【0021】以上の方法により、高速メモリを割り付け
先の候補として、レジスタを一つ使用可能な状態にする
ことができる。
【0022】
【発明の効果】本発明によってレジスタ割り付け時に、
変数の割り付け先の候補として高速メモリを加えること
によりコードサイズが小さく、実行速度の早いオブジェ
クトを生成することが可能である。従来の技術によって
出力されたアセンブラコードの例題を図15に示す。例
題は出力されたコードの一部を変数vyについて着目し
たものである。変数vyが出てきた時点で、レジスタは
全てliveで、使用状態とする。従って、vyの操作
はレジスタ以外からアクセスすることになり、この例題
の場合、コスト計算の結果からスタック領域を使用する
より、メモリから直接アクセスを行なった方がコストが
かからないということがわかったので、演算、転送を直
接メモリから行なうようにした。この場合、vyに関す
るコードだけのバイト数、クロック数の合計を求める
と、バイト数=15、クロック数=84となる。本発明
によって出力されたアセンブラコードを図16に示す。
変数vyをコスト計算によって高速メモリに割り付け、
演算、転送を高速メモリからアクセスするようにした。
すると、vyに関するコードのバイト数、クロック数の
合計が、バイト数=13、クロック数=64となり、従
来の技術よりコードサイズが小さく、実行速度が早いコ
ードを出力することが可能である。
【図面の簡単な説明】
【図1】コンパイラにおけるレジスタ割り付け方式全体
の構成図
【図2】生変数解析表
【図3】レジスタ獲得処理の流れ図
【図4】命令バイト数、クロック数の例
【図5】レジスタアソシエーションリストの例
【図6】生変数解析表の例
【図7】コスト計算の例
【図8】レジスタ獲得処理の流れ図
【図9】従来のコンパイラにおけるレジスタ割り付け方
式全体の構成図
【図10】中間ファイルへの変形方法
【図11】生変数解析表
【図12】スタック領域を用いたレジスタ獲得処理の流
れ図
【図13】レジスタアソシエーションリストの例
【図14】出力コードの例
【図15】出力コードの例
【図16】出力コードの例
【符号の説明】
101,901 構文解析部 102,902 データフロー解析部 103 参照回数収集部 104,903 コード生成部 105,904 レジスタ要求部 106,905 レジスタ割り付け部 107 コスト計算部 108,906 レジスタへの割り付け 109 高速メモリへの割り付け 110 メモリへの書き戻し 111,908 コード生成 301〜310,801〜806 レジスタ獲得処理 907 スタック領域への退避 1201〜1204 スタック領域を用いたレジスタ
獲得処理

Claims (1)

    【特許請求の範囲】
  1. 【請求項1】 ソースプログラム情報を入力して解析す
    る手段と、データの流れを解析する手段と、コードを生
    成する過程でレジスタを割り付ける手段と、メモリとを
    有し、前記メモリの一部に、当該部分をアクセスする命
    令の命令長が短いか、あるいは実行速度が通常のメモリ
    よりも早いメモリ領域を持つマイクロコンピュータ用の
    コンパイラにおいて、ソースプログラム中の変数の参照
    回数を収集する手段と、前記参照回数情報を使用し、割
    り付け先を評価する手段と、前記評価結果により前記レ
    ジスタ、前記メモリ領域への割り付けを行なう手段とを
    設けたことを特徴とするレジスタ割り付け方式。
JP24680793A 1993-10-01 1993-10-01 レジスタ割り付け方式 Pending JPH07105013A (ja)

Priority Applications (1)

Application Number Priority Date Filing Date Title
JP24680793A JPH07105013A (ja) 1993-10-01 1993-10-01 レジスタ割り付け方式

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP24680793A JPH07105013A (ja) 1993-10-01 1993-10-01 レジスタ割り付け方式

Publications (1)

Publication Number Publication Date
JPH07105013A true JPH07105013A (ja) 1995-04-21

Family

ID=17153980

Family Applications (1)

Application Number Title Priority Date Filing Date
JP24680793A Pending JPH07105013A (ja) 1993-10-01 1993-10-01 レジスタ割り付け方式

Country Status (1)

Country Link
JP (1) JPH07105013A (ja)

Cited By (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPH0934725A (ja) * 1995-07-15 1997-02-07 Nec Corp 言語処理装置及び言語処理方法
US6334212B1 (en) 1998-04-01 2001-12-25 Matsushita Electric Industrial Co., Ltd. Compiler
JP2007272672A (ja) * 2006-03-31 2007-10-18 Nec Corp コンパイル最適化方法およびコンパイラ
US7669378B2 (en) 2004-09-24 2010-03-02 Honda Motor Co., Ltd. Openinged polygonal rib structure and polygonal rib structure

Citations (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPS6481035A (en) * 1987-09-22 1989-03-27 Nec Corp C compiler

Patent Citations (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPS6481035A (en) * 1987-09-22 1989-03-27 Nec Corp C compiler

Cited By (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPH0934725A (ja) * 1995-07-15 1997-02-07 Nec Corp 言語処理装置及び言語処理方法
US5845127A (en) * 1995-07-15 1998-12-01 Nec Corporation Language processor and language processing method to generate object programs by compiling source programs
US6334212B1 (en) 1998-04-01 2001-12-25 Matsushita Electric Industrial Co., Ltd. Compiler
US7669378B2 (en) 2004-09-24 2010-03-02 Honda Motor Co., Ltd. Openinged polygonal rib structure and polygonal rib structure
JP2007272672A (ja) * 2006-03-31 2007-10-18 Nec Corp コンパイル最適化方法およびコンパイラ

Similar Documents

Publication Publication Date Title
JP3311462B2 (ja) コンパイル処理装置
US10866806B2 (en) Uniform register file for improved resource utilization
US7028291B2 (en) Debugging method and debugging device
EP0428084A2 (en) Method and apparatus for compiling computer programs with interprocedural register allocation
US20100107174A1 (en) Scheduler, processor system, and program generation method
US5367684A (en) Register allocation using an improved register candidate usage matrix
US5946491A (en) Register allocation method and apparatus for gernerating spill code as a function of register pressure compared to dual thresholds
US20060095894A1 (en) Method and apparatus to provide graphical architecture design for a network processor having multiple processing elements
US6496924B2 (en) Data processing apparatus including a plurality of pipeline processing mechanisms in which memory access instructions are carried out in a memory access pipeline
JPH07319710A (ja) コンパイル処理方法
JPH07105013A (ja) レジスタ割り付け方式
Ng et al. Improving system predictability and performance via hardware accelerated data structures
CN112463389A (zh) 分布式机器学习任务的资源管理方法及装置
US6029003A (en) Method of assigning external variables to memories when compiling source program
CN116880775B (zh) 存储空间的硬件管理模组、芯片、电子设备及方法
JPH0371233A (ja) コンパイラにおける最適データ割付け方式
Huemer Approximation-aware Partitioning for Periodic Tasks on an Approximate-Exact MPSoC
JPH08212081A (ja) メモリ割り付け方法、並びにコンパイル方法およびコンパイラ
JP2004094581A (ja) 並列拡張機能を備えたコンパイラプログラム、その記録媒体、コンパイル方法、およびコンパイル装置
JPH06324882A (ja) コンパイラ装置
JPH07129410A (ja) コンパイラにおけるメモリ割り付け方法
Lincoln Analysis of recursive cache-adaptive algorithms
CN113835852A (zh) 任务数据的调度方法及装置
JPH02105224A (ja) コンパイラにおけるデータ割付け方式
JPH07129408A (ja) 言語処理プログラムの実行方式