JP2011181114A - プログラム変換装置、プログラム変換方法及び記録媒体 - Google Patents

プログラム変換装置、プログラム変換方法及び記録媒体 Download PDF

Info

Publication number
JP2011181114A
JP2011181114A JP2011139789A JP2011139789A JP2011181114A JP 2011181114 A JP2011181114 A JP 2011181114A JP 2011139789 A JP2011139789 A JP 2011139789A JP 2011139789 A JP2011139789 A JP 2011139789A JP 2011181114 A JP2011181114 A JP 2011181114A
Authority
JP
Japan
Prior art keywords
register
program
variable
virtual
real
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
JP2011139789A
Other languages
English (en)
Inventor
Akira Tanaka
旭 田中
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.)
Panasonic Corp
Original Assignee
Panasonic 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 Panasonic Corp filed Critical Panasonic Corp
Priority to JP2011139789A priority Critical patent/JP2011181114A/ja
Publication of JP2011181114A publication Critical patent/JP2011181114A/ja
Pending legal-status Critical Current

Links

Images

Abstract

【課題】転送命令の生成を低減するプログラム変換装置を提供する。
【解決手段】プログラム変換装置は、ソースプログラムをオブジェクトプログラムに変換するプログラム変換装置であって、実レジスタの代わりに仮想レジスタより記述されたプログラム部分を含むソースプログラムをメモリに記憶し、プログラム部分を跨ぐ生存区間を有する変数を検出し(ステップc2)、検出された変数に対して実レジスタを割り当てた場合の得失値を実レジスタ毎に算出し(ステップc3)、前記得失値が最小の実レジスタを前記仮想レジスタに割り当てる(ステップc4)。
【選択図】図4

Description

本発明は、高級プログラミング言語で書かれたソースプログラムを機械語プログラムやアセンブラプログラムなどの目的プログラム(オブジェクトプログラム)に翻訳するプログラム言語処理系において、高級プログラミング言語で書かれたプログラム部分と、プログラムの特定部分を高速実行するために、より機械語に近いアセンブラ言語で記述した部分の両方を含むソースプログラムを翻訳するプログラム変換装置、プログラム変換方法及び記録媒体に関する。
近年、機器組み込み用プロセッサとともに機器に搭載されるプログラム(以下、組み込みプログラムと呼ぶ)の規模が増大し、組み込みプログラムと言えども、そのプログラム開発はC言語などの高級言語で行なわれるのが一般的である。特に、近年急速に発展している通信、画像、文字、音声処理などを扱う、マルチメディア処理を行なう情報機器に搭載される組み込みプログラムでは、プログラムサイズが増大し、高級言語開発は必須となっている。
ところで、これらマルチメディア処理は、大量のデータを高速に処理する事が要求されるため、頻繁に実行されかつ短時間実行を強く要求されるプログラム部分は、高級言語を用いた記述をせずに、機械語に近いアセンブラ言語による記述を行なうことが多い。これは、高級言語記述を用いたプログラム部分は、コンパイラによって、より機械語に近いアセンブラ言語などに変換されるが、コンパイラでは高級言語記述された様々な形のプログラムを想定して翻訳処理を行なうので、どうしても冗長なアセンブラ言語プログラムに変換してしまう場合があるからである。
そこで高級言語の拡張機能として、高級言語記述部分とアセンブラ言語記述部分との値の受渡しを行なえる機能を備えかつ、高級言語記述部分にアセンブラ言語記述部分を埋め込むことができる、「インラインアセンブラ機能」を有するコンパイラが多数存在している。インラインアセンブラ機能の実現方式に関しては、様々な方式が存在するが、その中でも、より使い勝手の良い文献3(後述)の方式について次に述べる。ここでは、説明の簡単化のために、文献3の方式説明でも扱っているC言語の除算、剰余算を例にした説明を行なう。
まず、コンパイラがターゲットとするマイクロプロセッサが2オペランド形式のロードストア方式(オペランドのアドレシングにおいて、メモリ間演算命令は転送命令しかない)であり、かつ、除算命令divが次のような仕様であるとする。
div rm,rn
ここにおいて除算命令divは、レジスタrmをレジスタrnで除算し、除算結果をrnに格納し、剰余結果を特殊レジスタmdrに格納する。
このように多くのマイクロプロセッサの除算命令は、除算と剰余算を1命令で同時に算出することが可能である。また図12などに記述されている転送命令movは第1オペランドの値を第2オペランドに転送することを示すとする。そこで、図12(a)のように「asm」キーワードを用いた「asm文」(後述するが、正確には「asm文ブロック」)を使用して、アセンブラルーチンをマクロ定義し、同図(b)のように複数箇所で使用する。マクロ定義されたマクロdmは同図(c)のように展開される。文献3の方式では、変数のうちマクロdmの間、値が保存される変数(マクロdmに跨って生きている変数と言う)には、マクロdmで値が壊されるレジスタ(この場合はレジスタr0, r1)が割り付けられないことをコンパイラが保証するので、マクロdmを任意の場所に記述することが可能となり、プログラミングの自由度が向上する。
なお、図12(a)のasm文の記述例は、文献3の例と若干異なっており、複数のasm文の集合を「{」「}」で囲むことによって表現している。このように、複数のasm文の集合を「asmブロック」と呼ぶことにする。一つのasmブロックを一つのasm文と同様に扱うことによって、文献3の方式をasmブロックにも容易に適用できる。
しかしながら、文献3の方式では、マクロdmの使用箇所によっては、コンパイラが必ずしも効率のよいアセンブラコードに変換できないという問題がある。この点を具体的な例で示す。図13は、図12(c)の関数f2をさらにコンパイラ内部で処理しやすいように内部変換したものである。特に図13の(s1)のように関数hの呼び出しの前に、コンパイラが生成した一時変数tに変数mの値を格納し、変数tを関数hの引数としている。これは、コンパイラが関数の引数の値を確実にレジスタで渡すために導入したものであり、一時変数tにはレジスタr0が割り付けられているものとする。(引数をレジスタで渡すことは、高速な関数呼び出しを行なうために、広くコンパイラで行なわれている方式である。)このとき図13の変数mは、asmブロックに跨って生きているので、レジスタr0,r1は変数mには割り付けることができない。その結果、変数mにはレジスタr0,r1以外のレジスタが割り付けられることになり、図13の(s1)において転送命令が生成されることとなる。
そこで本発明の目的は、転送命令の生成を低減するプログラム変換装置(コンパイラ装置)、プログラム変換方法及び記録媒体を提供することを目的とする。
上記目的を達成するため、本発明に係るプログラム変換装置は、高級言語で記載されたソースプログラムをオブジェクトプログラムに変換するプログラム変換装置であって、任意の実レジスタに割り当てられうる複数の仮想レジスタを用いて、各仮想レジスタが区別して記述されたプログラム部分を含むソースプログラムを入力として受け付ける入力部と、ソースプログラム中の変数であって、プログラム部分を跨ぐ生存区間を有する変数を検出する検出手段と、プログラム部分に出現する複数の仮想レジスタのそれぞれに対して、同一の仮想レジスタには同一の実レジスタを割り当て、相互に異なる仮想レジスタには異なる実レジスタを割り当てるようにしながら、プログラム部分を跨ぐ生存区間を有するソースプログラム中の変数に割り当てられる実レジスタとは異なるレジスタを割り当てる割り当て手段と、割り当て手段によって割り当てられた実レジスタに従って、オブジェクトプログラムを生成する生成手段とを備える。
本構成によれば、プログラム部分を跨ぐ生存区間の変数と、当該変数と資源継承関係にある別の変数とに同じレジスタが割り当てられる可能性が高くなり、同じレジスタが割り当てられた場合には、資源継承関係にある変数と別の変数との間の転送命令を削除することができるので、無用な転送命令の数を低減することができるという効果がある。
また、本発明に係るプログラム変換装置は、上記割り当て手段が、優先的に仮想レジスタに実レジスタを割り当てた後、ソースプログラム中の変数へのレジスタ割り当てを行うものであってもよい。
また、本発明に係るプログラム変換装置は、上記割り当て手段が、すべての実レジスタのうち特定の機能を有する実レジスタ群のうちの1つの実レジスタを仮想レジスタに割り当てるものであってもよい。
本構成によれば、仮想レジスタに割り当てられる実レジスタを特定の機能を有する実レジスタに限定することができるという効果がある。
第1の実施形態に係るコンパイラ装置1の構成図である。 asmブロック定義レジスタ検出部17の処理フローチャートである。 asmブロック生存区間生成部19の処理フローチャートである。 資源割付部14の処理フローチャートである。 asmブロックで定義されたマクロの例と、マクロの使用プログラム例と、マクロの展開プログラムの例を示す図である。 asmブロックを含む中間プログラムと、レジスタ引数置換部16の処理を行なった後の中間プログラムの例を示す図である。 asmブロックを含む中間プログラムと、中間プログラムの生存区間と、割り付け後の中間プログラムを示す図である。 asmブロック定義レジスタ保持部18の保持内容の図である。 asmブロックで定義されたマクロの例と、マクロの使用プログラム例と、マクロの展開プログラムの例を示す図である。 asmブロックを含む中間プログラムと、レジスタ引数置換部16の処理を行なった後の中間プログラムの例を示す図である。 asmブロックを含む中間プログラムと、中間プログラムの生存区間と、割り付け後の中間プログラムを示す図である。 asmブロックで定義されたマクロの例と、マクロの使用プログラム例と、マクロの展開プログラムの例を示す図である。 asmブロックを含む中間プログラムの例である。
本発明の実施形態の説明に先だって、本発明に関連する文献を挙げ、以下で用いる用語について説明しておく。
<文献>
1.A.V.Aho, R.Sethi, J.D.Ullman:”Compilers, Principle, Techniques, andTool”, Addison Wesley Publishing Company Inc.,1986,(邦訳)原田賢一:”コンパイラI、II”,サイエンス社,1990
2.田中:”資源割付装置及び資源割付プログラムが記録されたコンピュータ読み取り可能な記録媒体”,出願番号 特願平10−344524
3.田中:”コンパイラ装置及びコンパイラプログラムが記録されたコンピュータ読み取り可能な記録媒体およびコンパイル方法”,出願番号 特願平11−195717
<用語の説明>
・変数の定義、参照、使用
変数の値を設定することを「定義する」と呼び、設定した値を使用することを「参照する」と呼ぶ。またプログラム上で変数を定義したり、参照したりすることを、変数を「使用する」と呼ぶことにする。また、以下では仮引数も特に断らない限り変数と同様に扱う。
・一時変数
コンパイラが計算結果を一時的に格納するために生成する変数や、処理の効率化を図る上で生成する変数のことを「一時変数」と呼ぶことにする。以下では特に断らない限り通常のソースプログラムで記述される変数と同様に扱う。
・中間命令
処理をし易すくするためにコンパイラがソースプログラムのコードを中間的なコードに変換したものを「中間コード」と呼び、中間コードの1ステップを「中間命令」と呼ぶことにする。中間命令には4つ組や3つ組などが存在し、これらが変換されて最終的な目的プログラム(オブジェクトプログラム)が生成される。またソースプログラムを中間命令の列に変換したものを「中間プログラム」と呼ぶことにする。図6(a)は図5(c)関数f2のプログラムに対する中間プログラムの一例であり、4つ組の一つである3番地コードで表現している。また図6(a)のi1,i2など、「i」とそれに付随する番号で示したものは、中間命令の識別子を意味している。また、図5(c)のasmブロックは、図6(a)のように図面上は図5(c)と同一な形式の中間命令に変換されている。特に図6(a)のasmブロックの中間命令を「asmブロック中間命令」と呼ぶことにする。
尚、本発明における中間命令は特にこの形式に限りるわけでなく他の形式の中間命令にも適用可能である。また、コンパイラ装置内の処理を簡単化するために、中間プログラムの最初と終りを表す中間命令や、関数の始めと終りを表す中間命令など特定のプログラム範囲を表す中間命令も用意されている。図6(a)では中間命令i50,i51のように表現される関数の関数の始めと終りを示す中間命令が示されている。
・基本ブロック
中間命令列のうち、中間命令列内部からの飛び越しも、また中間命令列内部への飛び越しもなく、中間命令列の実行順が一定順序である場合、その中間命令列を基本ブロックと言う。基本ブロックについては文献1に詳細に記載されている。
・生存区間
生存区間とはそれぞれの変数に保持されている値が有効となる区間であり、正確には変数の値を定義する中間命令からその定義された値を最後に参照する中間命令までのプログラム上の区間のことである。また生存区間中において変数は「生きている」と言うことにする。生存区間のさらに詳しい説明は、文献1、2、3に記載されている。図7(b)が生存区間の一例である。図7(b)において生存区間は縦線の実線で表されている。生存区間の開始点、及び終了点をそれぞれ白丸、黒丸で表現している。また、図7(b)のようにasmブロック中間命令に対する生存区間に関しては、asmブロック内のasm文毎の生存区間までも求める必要はなく、生存区間はasmブロック全体を表すもので十分である。
・変数への資源割り付け
変数への資源割り付けとは、変数にレジスタやメモリを割り付けることである。一つのレジスタやメモリにはプログラムの同一区間で二つ以上の値を保持することは不可能であるため、生存区間が重なる変数には同じレジスタやメモリを割り付けることは不可能であり、異なるレジスタやメモリを割り付けることが必須となる。例えば、図7の変数mと変数s2(s2に関しては後述)の二つの生存区間が重なっており、それぞれの変数には異なるレジスタやメモリを割り付ける必要がある。以下ではレジスタやメモリを合わせて「資源」と呼ぶことにする。
・資源継承関係
変数tと生存区間の始めと終りが一致し、同一の資源に割り付けると転送命令の発生を削減できる変数uが存在するとき、変数tと変数uは「資源継承関係」にあると言うことにする。例えば、図7(b)において、変数eと変数t1、変数t1と変数m、変数mと変数t2はそれぞれ、資源継承関係にある。また、変数eと変数mは、「間接的資源継承関係」にあると言うことにする。資源継承関係の詳細な説明は文献2に記載されているので、これ以上の説明は省略する。
・得失値
得失値とは、目的プログラムの転送命令の発生を抑える観点から考えて、既に変数に割り付けられた資源の要素(レジスタやメモリ)を、これから割り付けようとする変数tに割り付けたとき、どれだけ転送命令の発生抑制に貢献するかを、変数tと資源継承関係または間接的資源継承関係にある変数に着目して定量化した値である。例えば、図7(b)において、変数mにレジスタr0を割り付けると、中間命令i11は削除可能となるので、この場合、レジスタr0の得失値は増加し、得失値の算出結果から変数mにレジスタr0を割り付けると有利であると判断される。得失値の詳細な説明は文献2に記載されているので、これ以上の説明は省略する。
<実施形態の説明>
本実施形態のコンパイラ装置では、asmブロック内のレジスタの記述方法において、レジスタ名の前に「v_」をつけた場合は、特定のレジスタではなく、任意のレジスタを意味することとし、この「v_」付きのレジスタを「仮想レジスタ」と呼ぶことにする。そして、その有効範囲は、asmブロック内であるとする。
以下では、図5から図7のプログラム例を参照しながら説明を行なう。特に、図5(a)は従来技術の説明で用いた図12(a)のレジスタr0の使用部分を仮想レジスタv_r0としたものである。asmブロック中のレジスタを仮想レジスタで記述するのは、プログラム作成者が行なうものとする。図1は本実施形態のコンパイラ装置の構成図である。図1のコンパイラ装置1は、マクロ展開部11、構文解析部12、最適化部13、資源割付部14及びコード生成部15からなる一般的なコンパイラ装置を構成する部分と、レジスタ引数置換部16、asmブロック定義レジスタ検出部17、asmブロック定義レジスタ保持部18及びasmブロック生存区間生成部19からなる本発明に関係する部分から構成されている。
次に各部の動作と機能について例を示しながら説明する。コンパイラ装置1はまず最初にマクロ展開部11を起動する。マクロ展開部11は、マクロ定義されたマクロ識別子をその本体で置き換える。この処理部分は一般的なC言語コンパイラのマクロプロセッサの処理と同様なので詳細説明は省略し処理結果の例について説明する。
例えば、図5(a)がマクロ定義されたマクロdmであり、図5(b)がマクロdmのソースプログラムにおける使用例であり、図5(c)がマクロ展開部11によってマクロdmをその本体で置き換えた結果である。次にコンパイラ装置1は構文解析部12を起動する。構文解析部12はマクロ展開部11が出力するマクロ展開されたプログラムの字句解析、構文解析および意味解析を行い、コンパイラが処理し易い形の中間プログラムに変換する。
例えば、図5(c)の関数f2は図6(a)の中間プログラムに変換される。この構文解析部12の詳細は本発明の主眼ではないので説明を省略する。次にコンパイラ装置1は最適化部13を起動する。最適化部13は、まず後述のレジスタ引数置換部16を起動し処理を終えた後、最終的にコンパイラ装置1が生成する目的プログラムのプログラムサイズ縮小化及び処理実行時間の短縮化を図るよう中間プログラムの最適化を行う。この最適化部13の詳細は本発明の主眼ではないので説明を省略し、本発明に関連のある点についてのみ説明する。
最適化部13では、最適化を行なうために、基本ブロック解析、制御フロー解析、データフロー解析と言う処理を行なう。基本ブロック解析とは処理対象の中間プログラムを基本ブロックに分割することである。制御フロー解析とは各基本ブロック間の制御の流れを解析することである。データフロー解析とは各基本ブロック中、それぞれの変数がどこで定義され、どこで参照されているかについて解析することである。またこれらの解析結果から、後の資源割付部14は生存区間を算出する。
最適化部13より起動されるレジスタ引数置換部16は、まずレジスタで渡される仮引数の値を一旦一時変数に格納する中間命令を関数の最初に挿入し、さらに中間プログラムの仮引数の使用部分を全て一時変数に置き換える。さらに、レジスタで引き渡す実引数の値を一旦一時変数に格納する中間命令を生成し、生成した関数呼び出しの前に挿入し、さらに一時変数に、引き渡しレジスタを割り付けるものである。
例えば、図6(b)では仮引数eを一旦一時変数t1に格納する中間命令i10を関数の最初に挿入し、仮引数eの使用箇所を一時変数t1に置き換えている。さらに、図6(b)では実引数mに対して一旦一時変数t2に格納する中間命令i11を関数hの呼び出しの前に挿入し、一時変数t2を実引数として関数hを呼び出すように置き換えている。なお、ここで、仮引数eと、一時変数t2にはレジスタr0が割り付けられるものとする。
次にコンパイラ装置1は資源割付部14を起動する。資源割付部14はまず最初にasmブロック定義レジスタ検出部17を起動する。asmブロック定義レジスタ検出部17は、中間プログラムからasmブロックの中間命令を抽出し、抽出したasmブロック内に存在するasm文で定義されるレジスタを検出し、結果をasmブロック定義レジスタ保持部18に格納する。図2はasmブロック定義レジスタ検出部17の処理フローチャートである。ステップa1では、全ての中間命令iについてステップa2からステップa3を繰り返し、全ての中間命令iについて処理を終えたらasmブロック定義レジスタ検出部17の処理を終了する。ステップa2では、中間命令iがasmブロック中間命令であるときステップa3を行なう。そうでないときはステップa1へ戻る。
ステップa3では、仮想レジスタも含めて、中間命令iでレジスタrが定義されている場合、中間命令iとレジスタrをasmブロック定義レジスタ保持部18に格納し、ステップa1へ戻る。
(フローチャート終了)例えば、図8はasmブロック定義レジスタ保持部18の図6(b)の中間プログラムの例に対する保持内容である。asmブロック中間命令毎に、asmブロック中間命令で定義するレジスタを保持しており、図6(b)のasmブロック中間命令i2では変数gの値が仮想レジスタv_r0に転送され、変数hの値が実レジスタr1に転送され、div命令では仮想レジスタv_r0が更新され、さらに実レジスタmdrも更新されるので、図8のasm文中間命令i2で定義されるレジスタの欄にはv_r0、r1、mdrが格納される。(ステップa3)。
尚、ステップa3の処理において、asmブロックで定義されるレジスタを、単にasmブロックに出現するレジスタとして、処理の負荷を軽減させてももよい。なぜならば、特殊な場合を除いて、asmブロックで記述される大部分のレジスタは、asmブロック内で定義されてから参照されることが常だからである。
次に資源割付部14は、最適化部13で解析された制御フロー情報とデータフロー情報を用いて、前述のレジスタ引数置換部16で生成した一時変数も含めて、全ての変数の生存区間を算出する。生存区間の算出方法は従来方式と同様なので詳細説明は省略し、ここでは、図6(b)の中間プログラム例に対する生存区間の算出結果を示すにとどめる。図7(b)が図6(b)の中間プログラムに対して生存区間を算出した結果である。生存区間は、文献2などのように中間命令の集合として表現されるが、ここでは直観的に解り易いように実線でその範囲を示している。また、図7(b)の仮引数eの生存区間に記載されている(r0)は、仮引数eにレジスタr0が割り付けられていることを意味している。一時変数t2も同様である。(但し、変数s1、s2の生存区間は次に説明するasmブロック生存区間生成部19で生成さるものである。)さらに資源割付部14は、asmブロック生存区間生成部19を起動して、asm文で定義されるレジスタに割り付けられた特殊な一時変数とその生存区間を生成する。図3がasmブロック生存区間生成部19の処理フローチャートである。
ステップb1では、全てのasmブロック中間命令iについてステップd2からステップd5まで繰り返し、処理を終えたらasmブロック生存区間生成部19の処理を終了する。ステップb2では、仮想レジスタも含めて、asmブロック定義レジスタ保持部18からasmブロック中間命令iで定義されるレジスタrが存在するとき、全てのレジスタrに対して、ステップd3からステップd5を行ない、そうでないときはステップd1へ戻る。
ステップb3では、新たに一時変数sを生成する。ステップb4では、生成した一時変数sに対してasmブロック中間命令iで生存区間が開始し終了する生存区間を生成する。ステップb5では、生成した一時変数sにレジスタrを割り付け、ステップd1へ戻る。
(フローチャート終了)例えば、図7(b)において、s1,s2が、asmブロック生存区間生成部19で生成された特殊な一時変数であり、生存区間が中間命令i2においてしか存在しておらず、かつ、一時変数s1には仮想レジスタv_r0, 一時変数s2には実レジスタr1が割り付けられている。尚、図7の例では、中間命令i2のdiv命令において、レジスタmdrも値が更新さるが、ここでは、レジスタmdr自体は変数への割り付けレジスタとはしないこととするので、レジスタmdrに割り付けられた一時変数は生成していない。
次に資源割付部14は、前述のレジスタ引数置換部16で生成した未だレジスタが未割り付けの一時変数(図7の例では一時変数t1)および、asmブロック生存区間生成部19で生成した一時変数のうち仮想レジスタに割り付けられた一時変数(図7の例では一時変数s1)も含めた変数への資源割り付けを行なう。特に資源割付部14は、仮想レジスタに割り付けられた一時変数への割り付けを優先する。この割り付けのとき、仮想レジスタに割り付けられた一時変数と生存区間が重なる変数へ割り付けるべきレジスタを考慮してレジスタを割り付ける。図4が資源割付部14の処理フローチャートである。
ステップc1では、全ての、仮想レジスタに割り付けられた変数sについてステップc2からステップc3まで繰り返し、全ての変数sについて処理を終えたらステップc5に進む。ステップc2では、変数sと生存区間が重なる変数に割り付けられているレジスタの集合R1を求める。
ステップc3では、変数sと生存区間が重なる全ての変数tについて、変数tと資源継承関係または、間接的資源継承関係にある変数に着目して得失値を算出する。ステップc4では、集合R1に属さずかつ、ステップc3で求めた得失値が最小のレジスタを変数sに割り付ける。(得失値が大きいレジスタは、変数tに割り付けた方が有利であるので、ここでは得失値のより小さいレジスタを変数sに割り付ける。尚、この得失値の詳細は文献2で述べられている「資源排他関係」にある変数(文献2では割付対象)に対する得失値計算と同様である。)ここで変数sに得失値さ最小のレジスタを割り付けるとしているが、得失値が最小のレジスタに限らず、例えば得失値が最大ではないレジスタとしてもよい。
ステップc5では、残りの全ての変数vについてステップc6からステップc9まで繰り返し、全ての変数vについて処理を終えたら資源割付部14の処理を終了する。ステップc6では、変数vと生存区間が重なる変数に割り付けられているレジスタの集合R2を求める。
ステップc7、集合R2に属さないレジスタが存在しないときは変数vにメモリを割り付けステップc5に戻る。ステップc8では、変数vに関して得失値を算出する。ステップc9では、集合R2に属さないレジスタのうち、ステップc8で求めた得失値が最大のレジスタを変数vに割り付け、ステップc5に戻る。
(フローチャート終了)尚、上記ステップc5からステップc9の変数vへの資源割り付けは、文献2と同様のより厳密な資源割り付けを行なってもよい。図7(b)の例では、一時変数s1へのレジスタ割り付けにおいて、まずステップc2で、一時変数s1と生存区間が重なる一時変数s2に割り付けられているレジスタr1を要素とする集合R1が求められる。次にステップc3では、一時変数s1と生存区間が重なる変数mについて得失値が求められ、この例の場合は、レジスタr0の得失値が最大となる。次にステップc4では、集合R1に属さない、つまりレジスタr1ではなく、かつ、変数mの得失値からレジスタr0でもない、レジスタr2が一時変数s1への割り付けレジスタとして選択される。
また、変数mへのレジスタ割り付けにおいては、まず、ステップc6で、変数mと生存区間が重なる一時変数s1、s2に割り付けられているレジスタr2、r1を要素とする集合R2が求められる。次にステップc8では変数mの得失値が求められ、この例ではレジスタr0の得失値が最大となる。次にステップc9では、集合R2に属しておらず得失値が最大のレジスタr0が変数mへの割り付けレジスタとして選択される。変数t1も同様にレジスタr0に割り付けられる。
結果、図7(a)の中間プログラムは、図7(c)のように変換され、asmブロック中間命令中の仮想レジスタv_r0は実レジスタr2に置き換えられ、また、中間命令i10、i11は同一レジスタへの転送となるので削除が可能となる。次にコンパイラ装置1はコード生成部15を起動し、中間命令をコンパイラがターゲットとするマシンのアセンブラ命令または機械語命令などの目的プログラムに変換する。コード生成部15自体は従来方式と同様なので詳細説明は省略する。
以上述べた通り、図7、図8のasmブロック中間命令i2内で記述されている仮想レジスタv_r0はレジスタr2に置き換えられ、変数mはレジスタr0に割り付け可能となり、中間命令i11が削除できる。このように、asmブロックが記述された場所、または、asmブロックで定義されたマクロが記述された場所の状況によって、asmブロック内で記述された仮想レジスタがより適切な実レジスタに置き換わるので、より効率のよいコード生成を行なうことが可能となる。
以下に図5から図7のプログラム例とは別のプログラム例を図9から図11を用いて説明する。図9(a)は図5(a)と同様のマクロ定義されたマクロdmであり、従来技術の説明で用いた図9(a)のレジスタr0の使用部分を仮想レジスタv_r0としたものである。asmブロック中のレジスタを仮想レジスタで記述するのは、プログラム作成者が行なうものとする。図9(b)はマクロdmのソースプログラムにおける使用例であり、図9(c)がマクロ展開部11によってマクロdmをその本体で置き換えた結果である。図9(c)の関数f2は図10(a)の中間プログラムに変換される。図10(b)は、図10(a)の中間プログラムに対して、レジスタ引数置換部16によって仮引数eを一旦一時変数t1に格納する中間命令i10が挿入され、実引数mに対して一旦一時変数t2に格納する中間命令i11と実引数nに対して一旦一時変数t3に格納する中間命令i12とが関数hの呼び出しの前に挿入されている。仮引数の使用部分が一時変数に置き換えられている。図11(b)は図10(b)の中間プログラムに対して生存区間を算出した結果である。ここで仮引数eに記載されている(r0)は、仮引数eにレジスタr0が割り付けられていることを意味する。同様に一時変数t2、t3にはそれぞれレジスタr0、r1が割り付けられていることを意味する。
図11(b)の例において図4に示すフローチャートが実行された場合、一時変数s1へのレジスタ割り付けにおいて、まずステップc2で、一時変数s1と生存区間が重なる一時変数s2に割り付けられているレジスタr2を要素とする集合R1が求められる。次にステップc3では、一時変数s1と生存区間が重なる変数m、nについて得失値が求められ、この例の場合は、変数mについてはレジスタr0、変数nについてはr1の得失値が最大となる。次にステップc4では、集合R1に属さない、つまりレジスタr1ではなく、かつ、変数m、nの得失値からレジスタr0でもr1でもr2でもない、レジスタr3が一時変数s1への割り付けレジスタとして選択される。
また、変数mへのレジスタ割り付けにおいては、まず、ステップc6で、変数mと生存区間が重なる一時変数s1、s2に割り付けられているレジスタr3、r2を要素とする集合R2が求められる。次にステップc8では変数mの得失値が求められ、この例ではレジスタr0の得失値が最大となる。次にステップc9では、集合R2に属しておらず得失値が最大のレジスタr0が変数mへの割り付けレジスタとして選択される。変数nも同様にレジスタr1に割り付けられる。変数t1、eも同様にしてレジスタr1に割り付けられる。
結果、図11(a)の中間プログラムは、図11(c)のように変換され、asmブロック中間命令中の仮想レジスタv_r0は実レジスタr3に置き換えられ、また、中間命令i10、i11は同一レジスタへの転送となるので削除が可能となる。
以上のようにプログラム部分(実施例においてはasmブロック)内で記述されている仮想レジスタの置換えレジスタを、プログラム部分に跨って生きている変数を考慮して決定することが可能となり、より効率のよいコード生成が可能となる。また、仮想レジスタ記述を含んだプログラム部分をしようして定義された、C言語のマクロ関数や、C++言語の「inline」指定関数など、ソースプログラムにインラインされる(埋め込まれる)関数は、ソースプログラムの任意の場所に記述でき、かつ記述された場所の使用状況に応じて、仮想レジスタがより適切な実レジスタに置き換えられるのでコンパイラの生成コード効率が一段と高まる。
以上本発明にかかるプログラム変換装置(コンパイラ装置)について実施形態に基いて説明したが本発明はこれらの実施形態に限らず、以下のようにしてもよい。
(1)本実施の形態の具体例ではasmブロック内の仮想レジスタに対してのみコンパイラがより適切なレジスタに置き換える方式について示したが、特に仮想レジスタ記述を設けずに、asmブロック内の全てのレジスタ記述を仮想レジスタとして扱い、コンパイラがasmブロック内の全てのレジスタを適切なレジスタに置き換えることも可能である。
(2)仮想レジスタが置き換えられるレジスタに制限を設けてもよい。例えばコンパイラでは、関数の始めでレジスタの値をメモリに退避し、関数の終りでレジスタの値を復帰する必要がある保証レジスタと、その必要がない破壊レジスタを設けることが一般的である。そのため、仮想レジスタの置き換えレジスタを破壊レジスタのいずれかにできると効率の良いコード生成が可能となる場合がある。
この場合コンパイラ装置1は、破壊レジスタの集合を予め記憶し、図4のステップc4の処理において、破壊レジスタの集合に属し、集合R1に属さずかつステップc3で求めた得失値が最小のレジスタを変数sに割り付けるよう構成すればよい。このように本発明は、例えば破壊レジスタ等の特定の機能を有する実レジスタの集合のうちの1つの実レジスタを仮想レジスタに割り付けるよう構成してもよい。特定の機能を有する実レジスタの種類としては、破壊レジスタ以外に、アドレスレジスタやデータレジスタ等がある。
(3)またアドレスレジスタ、データレジスタのように特定の機能を有する実レジスタの集合が複数ある場合において、これら複数の集合のうちの1つの集合のうちの1つの実レジスタを仮想レジスタに割り当てるよう構成してもよい。この場合、仮想レジスタの種類を仮想レジスタv_Ari、v_Briというように特定の機能を有する集合それぞれに対応するように設け、プログラマはそれら複数種類の仮想レジスタを使い分けた記述を行う。コンパイラ装置1は、仮想レジスタの種類と特定の機能を有する集合とを対応させて記憶しており、ソースプログラム中の仮想レジスタの種類に応じて、対応する特定の機能を有する集合に属し、当該仮想レジスタに割り付けられた変数sと生存区間が重なる変数に割り付けられた実レジスタの集合に属さず(つまりR1に属さない)、得失値が最小の実レジスタを変数sに割り付ける。
より具体的には、図4の資源割付部14のフローチャートのステップc4を「ステップ4において、変数sに割り付けられている仮想レジスタの種類に対応する、特定の機能を有する集合に属し、集合R1に属さず、かつ、ステップ3で求めた得失値が最小のレジスタを変数sに割り付ける」となる。
(4)以上の実施例では説明の簡単化のために、除算命令に関するものについて述べたが、単に除算命令に対してのみ適用できるだけでなく、積和演算命令などのマルチメディア処理対応の高機能命令にも適用できることは言うまでもない。
(5)コンパイラ装置1の各構成要素の動作手順、特に図2、3、4に示すフローチャートに示した手順を、汎用のコンピュータ又はプログラム実行機能を有する機器等に実行させるためのコンピュータプログラムを、記録媒体に記録し又は各種通信路等を介して、流通させ頒布することもできる。このような記録媒体にはICカード、光ディスク、フレキシブルディスク、ROM等がある。
本発明は、高級プログラミング言語で書かれたソースプログラムを機械語プログラムやアセンブラプログラムなどの目的プログラム(オブジェクトプログラム)に翻訳するプログラム言語処理系において、高級プログラミング言語で書かれたプログラム部分と、プログラムの特定部分を高速実行するために、より機械語に近いアセンブラ言語で記述した部分の両方を含むソースプログラムを翻訳するプログラム変換装置、プログラム変換方法及び記録媒体に好適である。
1 コンパイラ
11 マクロ展開部
12 構文解析部
13 最適化部
14 資源割付部
15 コード生成部
16 レジスタ引数置換部
17 asmブロック定義レジスタ検出部
18 asmブロック定義レジスタ保持部
19 asmブロック生存区間生成部

Claims (5)

  1. 高級言語で記載されたソースプログラムをオブジェクトプログラムに変換するプログラム変換装置であって、
    任意の実レジスタに割り当てられうる複数の仮想レジスタを用いて、各仮想レジスタが区別して記述されたプログラム部分を含むソースプログラムを入力として受け付ける入力部と、
    前記ソースプログラム中の変数であって、前記プログラム部分を跨ぐ生存区間を有する変数を検出する検出手段と、
    前記プログラム部分に出現する前記複数の仮想レジスタのそれぞれに対して、同一の仮想レジスタには同一の実レジスタを割り当て、相互に異なる仮想レジスタには異なる実レジスタを割り当てるようにしながら、前記プログラム部分を跨ぐ生存区間を有する前記ソースプログラム中の変数に割り当てられる実レジスタとは異なるレジスタを割り当てる割り当て手段と、
    前記割り当て手段によって割り当てられた実レジスタに従って、オブジェクトプログラムを生成する生成手段と
    を備えることを特徴とするプログラム変換装置。
  2. 前記割り当て手段は、優先的に仮想レジスタに実レジスタを割り当てた後、ソースプログラム中の変数へのレジスタ割り当てを行う
    ことを特徴とする請求項1記載のプログラム変換装置。
  3. 前記割り当て手段は、すべての実レジスタのうち特定の機能を有する実レジスタ群のうちの1つの実レジスタを仮想レジスタに割り当てる
    ことを特徴とする請求項1記載のプログラム変換装置。
  4. 高級言語で記載されたソースプログラムをオブジェクトプログラムに変換するプログラム変換方法であって、
    メモリに記憶されたソースプログラムであって、任意の実レジスタに割り当てられうる複数の仮想レジスタを用いて、各仮想レジスタが区別して記述されたプログラム部分を含むソースプログラムを入力として受け付ける入力部と、
    前記ソースプログラム中の変数であって、前記プログラム部分を跨ぐ生存区間を有する変数を検出する検出ステップと、
    前記プログラム部分に出現する前記複数の仮想レジスタのそれぞれに対して、同一の仮想レジスタには同一の実レジスタを割り当て、相互に異なる仮想レジスタには異なる実レジスタを割り当てるようにしながら、前記プログラム部分を跨ぐ生存区間を有する前記ソースプログラム中の変数に割り当てられる実レジスタとは異なる実レジスタを割り当てる割り当てステップと、
    前記割り当てステップにおいて割り当てられた実レジスタに従って、オブジェクトプログラムを生成する生成ステップとからなる
    ことを特徴とするプログラム変換方法。
  5. 高級言語で記載されたソースプログラムをオブジェクトプログラムに変換する処理をコンピュータに実行させるためのプログラムを記録したコンピュータ読み取り可能な記録媒体であって、
    当該プログラムはコンピュータに、メモリに記憶されたソースプログラムであって、任意の実レジスタに割り当てられうる複数の仮想レジスタを用いて、各仮想レジスタが区別して記述されたプログラム部分を含むソースプログラムを入力として受け付ける入力部と、
    前記ソースプログラム中の変数であって、前記プログラム部分を跨ぐ生存区間を有する変数を検出する検出ステップと、
    前記プログラム部分に出現する前記複数の仮想レジスタのそれぞれに対して、同一の仮想レジスタには同一の実レジスタを割り当て、相互に異なる仮想レジスタには異なる実レジスタを割り当てるようにしながら、前記プログラム部分を跨ぐ生存区間を有する前記ソースプログラム中の変数に割り当てられる実レジスタとは異なる実レジスタを割り当てる割り当てステップと、
    前記割り当てステップにおいて割り当てられた実レジスタに従って、オブジェクトプログラムを生成する生成ステップとを実行させる
    ことを特徴とするプログラムを記録した記録媒体。
JP2011139789A 2011-06-23 2011-06-23 プログラム変換装置、プログラム変換方法及び記録媒体 Pending JP2011181114A (ja)

Priority Applications (1)

Application Number Priority Date Filing Date Title
JP2011139789A JP2011181114A (ja) 2011-06-23 2011-06-23 プログラム変換装置、プログラム変換方法及び記録媒体

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP2011139789A JP2011181114A (ja) 2011-06-23 2011-06-23 プログラム変換装置、プログラム変換方法及び記録媒体

Related Parent Applications (1)

Application Number Title Priority Date Filing Date
JP2000102751A Division JP2001290652A (ja) 2000-04-04 2000-04-04 プログラム変換装置、プログラム変換方法及び記録媒体

Publications (1)

Publication Number Publication Date
JP2011181114A true JP2011181114A (ja) 2011-09-15

Family

ID=44692491

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2011139789A Pending JP2011181114A (ja) 2011-06-23 2011-06-23 プログラム変換装置、プログラム変換方法及び記録媒体

Country Status (1)

Country Link
JP (1) JP2011181114A (ja)

Cited By (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US9542185B2 (en) 2013-07-19 2017-01-10 International Business Machines Corporation Allocation method, apparatus, and program for managing architectural registers and physical registers using mapping tables
CN112925566A (zh) * 2019-12-06 2021-06-08 中科寒武纪科技股份有限公司 建立虚拟寄存器生存区间的方法和装置及编译方法和装置

Citations (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPH06110702A (ja) * 1992-09-29 1994-04-22 Matsushita Electric Ind Co Ltd 手続き呼出し翻訳装置
JPH0721033A (ja) * 1993-07-07 1995-01-24 Nec Corp 言語処理装置及びその方法
JPH07121377A (ja) * 1993-10-20 1995-05-12 Matsushita Electric Ind Co Ltd 資源割付装置
JPH08234997A (ja) * 1995-02-28 1996-09-13 Nec Corp レジスタ割付け方法
JPH08314727A (ja) * 1995-03-16 1996-11-29 Matsushita Electric Ind Co Ltd 資源割付装置
JPH11175351A (ja) * 1997-12-10 1999-07-02 Matsushita Electric Ind Co Ltd プログラム変換装置、高級言語プログラム内アセンブラ表現方法および記録媒体

Patent Citations (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPH06110702A (ja) * 1992-09-29 1994-04-22 Matsushita Electric Ind Co Ltd 手続き呼出し翻訳装置
JPH0721033A (ja) * 1993-07-07 1995-01-24 Nec Corp 言語処理装置及びその方法
JPH07121377A (ja) * 1993-10-20 1995-05-12 Matsushita Electric Ind Co Ltd 資源割付装置
JPH08234997A (ja) * 1995-02-28 1996-09-13 Nec Corp レジスタ割付け方法
JPH08314727A (ja) * 1995-03-16 1996-11-29 Matsushita Electric Ind Co Ltd 資源割付装置
JPH11175351A (ja) * 1997-12-10 1999-07-02 Matsushita Electric Ind Co Ltd プログラム変換装置、高級言語プログラム内アセンブラ表現方法および記録媒体

Non-Patent Citations (4)

* Cited by examiner, † Cited by third party
Title
CSND199700249015; 中島信行: 'exeGCC/CQ版 アセンブラの活用法' インターフェース 第23巻,第6号, 19970601, 第200頁, CQ出版株式会社 *
CSND199900640011; 後藤龍司: 'Turbo Cのインライン・アセンブル/make(プロジェクト・ファイル)/デバッグ' インターフェース 第15巻,第10号, 19891001, 第285頁, CQ出版株式会社 *
JPN6010035964; 後藤龍司: 'Turbo Cのインライン・アセンブル/make(プロジェクト・ファイル)/デバッグ' インターフェース 第15巻,第10号, 19891001, 第285頁, CQ出版株式会社 *
JPN6010035966; 中島信行: 'exeGCC/CQ版 アセンブラの活用法' インターフェース 第23巻,第6号, 19970601, 第200頁, CQ出版株式会社 *

Cited By (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US9542185B2 (en) 2013-07-19 2017-01-10 International Business Machines Corporation Allocation method, apparatus, and program for managing architectural registers and physical registers using mapping tables
US9891925B2 (en) 2013-07-19 2018-02-13 International Business Machines Corporation Allocation method, apparatus, and program for managing architectural registers and physical registers using mapping tables
CN112925566A (zh) * 2019-12-06 2021-06-08 中科寒武纪科技股份有限公司 建立虚拟寄存器生存区间的方法和装置及编译方法和装置

Similar Documents

Publication Publication Date Title
US11216258B2 (en) Direct function call substitution using preprocessor
JP3220055B2 (ja) 機械語命令列またはアセンブリ言語命令列を最適化する最適化装置、及び、高級言語で記載されたソースプログラムを機械語またはアセンブリ言語の命令列に変換するコンパイラ装置。
US8522222B2 (en) Tracing just-in-time compilation with pointers to local variables
JP4041248B2 (ja) コンパイラ装置、コンパイルプログラムが記録されたコンピュータ読み取り可能な記録媒体及びコンパイル方法
US20110119660A1 (en) Program conversion apparatus and program conversion method
US10133560B2 (en) Link time program optimization in presence of a linker script
JP2013533533A (ja) コンピューティング・プラットフォーム内のワークロードの分配及び並列化
US20030237080A1 (en) System and method for improved register allocation in an optimizing compiler
JP5967618B2 (ja) 二進化十進数型変数へのアクセスを有する言語のバイナリコードを最適化する方法、並びにそのコンピュータ及びコンピュータ・プログラム
JP2018028777A (ja) エミュレーション装置、エミュレーション方法、及び、エミュレーションプログラム
US20090254893A1 (en) Compiler optimized function variants for use when return codes are ignored
US8266416B2 (en) Dynamic reconfiguration supporting method, dynamic reconfiguration supporting apparatus, and dynamic reconfiguration system
US20090187897A1 (en) Compiling method and compiling program
JP2008305337A (ja) プログラム変換装置、プログラム変換方法、プログラム、記憶媒体、デバッグ装置、デバッグ方法及びプログラム開発システム
JP2014211864A (ja) 未完成ソフトウェアの分析
JP2011181114A (ja) プログラム変換装置、プログラム変換方法及び記録媒体
JP2008243019A (ja) ソースコード変換装置及びソースコード変換方法
US20110167417A1 (en) Programming system in multi-core, and method and program of the same
JP2009258796A (ja) プログラム開発装置及びプログラム開発方法
JP2001290652A (ja) プログラム変換装置、プログラム変換方法及び記録媒体
JP6326838B2 (ja) プログラム処理装置、プログラム処理方法、及びプログラム処理プログラム
JP2011180814A (ja) コンパイラ装置、コンパイル方法及びプログラム
US20170344351A1 (en) Information processing apparatus, compiling management method, and recording medium
CN102902548A (zh) 汇编级内存复制标准库函数的生成方法及装置
JP3276479B2 (ja) コンパイル方式

Legal Events

Date Code Title Description
A621 Written request for application examination

Free format text: JAPANESE INTERMEDIATE CODE: A621

Effective date: 20110624

A02 Decision of refusal

Free format text: JAPANESE INTERMEDIATE CODE: A02

Effective date: 20130507