Deprecated: The each() function is deprecated. This message will be suppressed on further calls in /home/zhenxiangba/zhenxiangba.com/public_html/phproxy-improved-master/index.php on line 456
JP4778286B2 - コンパイラ装置 - Google Patents
[go: Go Back, main page]

JP4778286B2 - コンパイラ装置 - Google Patents

コンパイラ装置 Download PDF

Info

Publication number
JP4778286B2
JP4778286B2 JP2005282852A JP2005282852A JP4778286B2 JP 4778286 B2 JP4778286 B2 JP 4778286B2 JP 2005282852 A JP2005282852 A JP 2005282852A JP 2005282852 A JP2005282852 A JP 2005282852A JP 4778286 B2 JP4778286 B2 JP 4778286B2
Authority
JP
Japan
Prior art keywords
instruction
program
loop
movement
loop process
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
Application number
JP2005282852A
Other languages
English (en)
Other versions
JP2007094731A (ja
Inventor
一 小川
涼子 宮地
俊幸 坂田
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
Panasonic Holdings Corp
Original Assignee
Panasonic Corp
Matsushita Electric Industrial Co 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 Panasonic Corp, Matsushita Electric Industrial Co Ltd filed Critical Panasonic Corp
Priority to JP2005282852A priority Critical patent/JP4778286B2/ja
Priority to US11/534,719 priority patent/US7827542B2/en
Priority to CNA2006101689106A priority patent/CN101000556A/zh
Publication of JP2007094731A publication Critical patent/JP2007094731A/ja
Application granted granted Critical
Publication of JP4778286B2 publication Critical patent/JP4778286B2/ja
Anticipated expiration legal-status Critical
Expired - Fee Related legal-status Critical Current

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING OR CALCULATING; COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/44Encoding
    • G06F8/445Exploiting fine grain parallelism, i.e. parallelism at instruction level

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参照。)。
ループ不変式移動による最適化とは、ループ処理の各イタレーションの実行に全く関わらない命令を、ループ処理の外へ移動させることにより、ループ処理に含まれる命令数を減少させる最適化手法である。
例えば、ループ処理中の各イタレーションにおいて、同じレジスタへの同じ値の定義(例えば、同じレジスタへの同じ値の代入)のみを繰り返し、実質的にループ処理全体を通して、そのレジスタの値が変化しないような場合には、その命令をループ処理外へ移動させ、ループ処理全体を通して、その定義した値が保存されるような状況を作り出せばよいことになる。
中田育男著,「コンパイラの構成と最適化」,株式会社朝倉書店,1999年9月15日,p.242−243およびp.284−287
しかし、ループ処理の外に位置する命令により定義された値を、ループ処理全体を通して保持するためには、あるレジスタをループ処理全体を通じて占有しなければならない。例えば、図1(a)に示すような中間プログラムで記述された中間プログラム10を考える。ここで、命令10a(mov vr20,5000)は、定数5000を仮想レジスタvr20に代入するという命令であり、命令10b(add vr1,vr0,vr20)は、仮想レジスタvr0に保持された値と仮想レジスタvr20に保持された値とを加算し、仮想レジスタvr1に代入する命令である。
すなわち、中間プログラム10において、命令10aで仮想レジスタvr20を定義して、命令10bで仮想レジスタvr20を参照しているが、仮想レジスタvr20はループ処理全体を通して値5000を保持する必要がある。このようにループ処理外で定義した値をループ処理内で参照のみを行うと、ループ処理外で定義した値をループ処理全体で保持するレジスタが必要となってくる。
図1(b)は、3命令を並列実行可能なプロセッサをターゲットプロセッサとした場合に、図1(a)に示した中間プログラム10に対して命令スケジューリングを行なった結果生成される中間プログラム12を示している。また、図1(b)には、中間プログラム12と合わせて、中間プログラム12中で使用される仮想レジスタの生存区間を示した生存区間表14とが示されている。ここで、「生存区間」とは、仮想レジスタが定義されてから最後に参照されるまでの区間を示している。生存区間表14に示されるように、仮想レジスタvr20は、ループ処理全体を通じて生存していることがわかる。生存区間表14より、中間プログラム12において必要とされるレジスタの最大数は6個であることが分かる。
命令10aおよび命令10bのような定義および参照の位置関係が多数存在すると、ループ処理全体を通して占有されるレジスタが増加し、ループ処理中で使用できるレジスタが減少する。このため、レジスタスピル(レジスタが足りないために、演算結果を一時的にメモリに退避する処理)が発生する可能性が高くなる。また、レジスタスピルが起こらなかったとしても、保証レジスタを使用してしまうと当該保証レジスタをある関数内で利用してしまうと、その関数の最初と最後において保証レジスタが保持する値をスタックに退避/復帰させるコードを生成する。
すなわち、ループ不変式移動を行なうと、ループ処理中にレジスタスピルが発生したり、保証レジスタが保持する値をスタックに退避/復帰させるコードを実行したりするような状況を助長する傾向にある。このため、ループ処理の性能向上のために、ループ不変式移動を行なったにも関わらず、かえってレジスタスピルを発生させたり、退避/復帰コードを実行したりして性能を悪化させてしまう可能性があるという問題がある。
本発明は、上述の課題を解決するためになされたものであり、ループ処理の性能を向上させるコンパイラ装置を提供することを目的とする。
上記目的を達成するために、本発明に係るコンパイラ装置は、ループ処理を含む第1のプログラムを第2のプログラムに変換するコンパイラ装置であって、前記第1のプログラムに含まれる前記ループ処理外に位置する命令で使用される変数の生存区間の状況に基づいて、当該命令を前記ループ処理内に移動可能か否かを判定する移動判定手段と、前記移動判定手段で移動可能と判断された命令を前記ループ処理内に移動させ、中間プログラムを生成する移動実行手段と、前記中間プログラムを前記第2のプログラムに変換する変換手段とを備えることを特徴とする。
この構成によるとループ処理外に存在する命令をループ処理内に移動させることができる。このため、ループ不変式移動による最適化とは異なり、レジスタの生存区間の長さを短くすることができる。よって、ループ処理で必要とされるレジスタ数を削減することができる可能性がある。すなわち、ループ処理実行時に、ループ処理実行時に使用可能なレジスタ数を増加させることができる。よって、レジスタスピルが生じる確率を低下させることができる。また、保証レジスタを利用する確率が少なくなり、保証レジスタが保持する値をスタックに退避/復帰させるコードを実行する確率を低下させることができる。したがって、無駄にレジスタスピルを発生させたり、退避/復帰コードを実行したりしてループ処理の性能を悪化させてしまう可能性がなくなる。よって、ループ処理の性能を向上させることができる。
具体的には、前記移動判定手段は、命令を移動させた後に必要とされるレジスタ数が前記命令を移動させる前に必要とされるレジスタ数未満の場合に、前記命令を前記ループ処理内に移動可能であると判定することを特徴とする。また、前記移動判定手段は、命令を移動させた後に発生するレジスタスピルの回数が前記命令を移動させる前に発生するレジスタスピルの回数未満の場合に、前記命令を前記ループ処理内に移動可能であると判定することを特徴としてもよい。
好ましくは、前記移動判定手段は、さらに、前記ループ処理内に移動可能であると判定された命令とデータ依存関係を有する前記ループ処理外の命令に対して、当該命令を前記ループ処理内に移動可能であるか否かを判定することを特徴とする。
ループ処理中へ移動させた命令と依存関係を有する命令に対しても、再帰的にループ処理中への移動判定を行なうことができる。このため、上述のコンパイラ装置に比べ、さらにループ処理で必要とされるレジスタ数を削減できる可能性がある。よって、さらにループ処理の性能を向上させることができる。
本発明の他の局面に係るコンパイラ装置は、ループ処理を含む第1のプログラムを第2のプログラムに変換するコンパイラ装置であって、前記第1のプログラムに含まれる前記ループ処理内に位置する命令で使用される変数の生存区間の状況に応じて、当該命令に対してループ不変式移動による最適化を選択的に実行し、中間プログラムを生成するループ不変式移動手段と、前記中間プログラムを第2のプログラムに変換する変換手段とを備えることを特徴とする。好ましくは、前記ループ不変式移動手段は、命令を移動させた後に必要とされるレジスタ数が前記命令を移動させる前に必要とされるレジスタ数未満の場合に、前記命令に対してループ不変式移動による最適化を実行することを特徴とする。
ループ不変式移動を行なう際に、レジスタの必要数が少なくなるような場合にだけ、ループ不変式の移動を行なうことができる。このため、上述のコンパイラ装置と同様に、ループ処理の性能を向上させることができる。
なお、本発明は、このような特徴的な手段を備えるコンパイラ装置として実現することができるだけでなく、コンパイラ装置に含まれる特徴的な手段をステップとするコンパイル方法として実現したり、コンパイル方法に含まれる特徴的なステップをコンピュータに実行させるコンパイラとして実現したりすることもできる。そして、そのようなプログラムは、CD−ROM(Compact Disc−Read Only Memory)等の記録媒体やインターネット等の通信ネットワークを介して流通させることができるのは言うまでもない。
本発明によると、ループ処理の性能を向上させるコンパイラ装置を提供することができる。
(実施の形態1)
以下、図面を参照しながら本発明の実施の形態1に係るコンパイラについて説明する。
図2は、コンパイラの構成を機能的に示したブロック図である。コンパイラ20は、3命令を並列実行可能なプロセッサをターゲットプロセッサとし、高級言語で記述されたソースプログラムを機械語プログラムに変換するコンピュータソフトウェアであり、機能的に、構文解析部24、一般最適化部26、移動判定部28、移動実行部30、命令スケジューリング部32、レジスタ割付部34および出力部36から構成される。
構文解析部24は、入力されたC言語で記述されたプログラム(以下「Cプログラム」という。)22の構文を一般的な手法を用いて解析し、コンパイラ20内部で取り扱いやすい中間コードで記述された中間プログラムに変換する処理部である。
一般最適化部26は、構文解析部24より出力される中間プログラムに対して、従来から存在する一般的な最適化を施す処理部である。例えば、誘導変数最適化、共通部分式削除、不要コード削除およびコピー伝搬等が一般的な最適化に相当する。これらの最適化は、本願の主眼ではないため、その詳細な説明はここでは繰り返さない。
移動判定部28は、ループ処理の外側に位置する命令をループ処理の内部に移動可能か否かを判定する処理部である。移動判定部28の実行する処理の詳細については後述する。
移動実行部30は、移動判定部28において、移動可能と判断された命令をループ処理の内部に移動させる処理部である。移動実行部30の実行する処理の詳細については後述する。
命令スケジューリング部32は、リストスケジューリングなどの通常の並列化のための命令スケジューリング処理を実行する処理部である。
レジスタ割付部34は、中間プログラム中の仮想レジスタのうち生存区間が互いに重なり合う仮想レジスタに対しては異なるレジスタが割り付けられるように考慮しながら、仮想レジスタを実レジスタに割り付ける処理部である。
出力部36は、実レジスタが割り付けられた中間プログラムを機械語プログラム38に変換して出力する処理部である。
次に、移動判定部28が実行する処理について詳細に説明する。図3は、移動判定部28が実行する処理のフローチャートである。
なお、上述したように、この時点で実レジスタの割付は行われておらず、無限のレジスタ資源を想定した仮想レジスタが各命令のオペランドには割り当てられているものとする。
まず、移動判定部28は、移動を行わない現状のままの中間プログラムに対して、命令スケジューリングを行ない、この命令スケジューリング結果を結果Aとする(S2)。
次に、移動判定部28は、ループ処理のプリヘッダ中のすべての命令に対して、移動判定処理を繰り返す。ここで、「ループ処理のプリヘッダ」とは、ループ処理を開始する直前に実行されるループ処理外の基本ブロックで唯一のものを指している。このループ処理外の基本ブロックが複数存在する場合には、ループ処理のプリヘッダが存在しないことになるので、この移動判定処理の繰り返しは行われない。
移動判定処理においては、移動判定部28は、まず、着目する命令をループ処理中へ移動させたとしても、プログラムの論理に矛盾を起こすことがないかをチェックする(S4)。これは、次の移動可能条件(MC)をチェックすることに相当する。
− その命令で定義される仮想レジスタはループ処理内でのみ参照されている
− その定義は唯一の定義である
− その命令は無条件実行命令である
この移動可能条件(MC)に適合しなければ(S4でNO)、移動判定部28は、その命令に対する移動判定処理を終了させる。
この移動可能条件(MC)に適合すれば(S4でYES)、移動判定処理は継続される。すなわち、移動判定部28は、着目する命令をループ処理中の先頭に移動させる(S6)。さらに、移動判定部28は、命令移動後の中間プログラムに対して、命令スケジューリングを行い、その結果を結果Bとする(S8)。
移動判定部28は、結果Aおよび結果Bの各々について、仮想レジスタの生存区間を解析して、ループ処理内で必要なレジスタ数を算出する。その結果、必要レジスタ数について、結果Bの方が少なくなる場合には(S10でYES)、移動判定部28は、この命令を移動可能と判定する(S12)。ループ処理外で定義された値に対して、ループ処理内で参照のみを行う場合には、参照は、ループ処理の最終回まで行われるので、生存区間にはループ処理の全体が含まれることになる。
命令を移動可能と判定した後(S12)または結果Bにおけるレジスタ必要数が結果Aにおけるレジスタ必要数以上の場合には(S10でNO)、移動判定部28は、命令移動処理(S6)で移動させた命令を元の位置に戻す(S14)。移動判定部28は、以上の移動判定処理をループ処理のプリヘッダ中のすべての命令に対して、繰返し行なう。
次に、移動実行部30が実行する処理について詳細に説明する。図4は、移動実行部30が実行する処理のフローチャートである。
移動実行部30は、ループのプリヘッダ中の各命令について以下の処理を繰り返す。すなわち、移動実行部30は、着目する命令が上述の移動判定部28において移動可能であると判断されていれば(S22でYES)、ループ処理の先頭に、その着目する命令を移動させる(S24)。移動可能であると判断されてなければ(S22でNO)、移動実行部30は、何も処理を行わない。
次に、Cプログラム22の具体例を用いて、コンパイラ20の実行する処理について具体的に説明する。本実施の形態においては、移動判定部28および移動実行部30の実行する処理が特徴的な部分であるため、その部分を中心に説明を行なう。
図5は、コンパイラ20に入力されるCプログラム22の一例を示す図である。構文解析部24は、Cプログラム22に対して構文解析を行ない、中間プログラムを出力する。また、一般最適化部26は、構文解析部24より出力された中間プログラムに対して一般的な最適化を施し、最適化後の中間プログラムを出力する。図1(a)は、最適化後の中間プログラム10の一例を示す図である。
移動判定部28は、中間プログラム10に対して、命令スケジューリングを行なう(図3のS2)。図1(b)の中間プログラム12は、命令スケジューリングの結果Aである。次に、移動判定部28は、中間プログラム10のループ処理のプリヘッダの各命令に対して、移動の可能性を判定する(図4のS4〜S14)。すなわち、中間プログラム10の命令10cおよび命令10dでそれぞれ定義されている仮想レジスタvr10および仮想レジスタvr11は、いずれもループ処理中でも定義されている。そのため、移動可能条件(MC)に適合しない。
一方、命令10aについては、移動可能条件(MC)に適合するので、移動判定部28は、ループ処理中に命令10aを移動させる(図3のS6)。図6(a)は、命令10aの移動後の中間プログラム40を示す図である。また、図6(b)の中間プログラム42は、移動判定部28が、中間プログラム40に対して、命令スケジューリングを行なった結果Bを示している(図3のS8)。
次に、移動判定部28は、結果A(中間プログラム12)および結果B(中間プログラム42)の各々について、最大レジスタ必要数を算出する(図3のS10)。図1(b)および図6(b)に、中間プログラム12および42についての生存区間の解析結果である生存区間表14および44をそれぞれ示している。生存区間表14によると、結果Aにおける最大レジスタ必要数は6であるのに対して、生存区間表44によると、結果Bにおける最大レジスタ必要数は5であり、結果Bにおいて最大レジスタ必要数が1つ削減されている。このため、移動判定部28は、この命令10aを移動可能と判定する(図3のS10でYES、S12)。
移動実行部30においては、ループ処理のプリヘッダ中で命令10aのみが移動可能と判定されているため、その命令のみをループ処理先頭へ移動させる(図4のS22でYES、S24)。その後、命令スケジューリング部32が、命令スケジューリングを実行し、レジスタ割付部34が、実レジスタの割り付けを行なう。最後に、出力部36が、実レジスタが割り付けられた中間プログラムを機械語プログラム38に変換して出力する。
その結果、図7に示すような機械語プログラム38が生成される。なお、理解の容易のため、図7では機械語プログラム38に対応するアセンブラプログラムを示している。図6(b)の中間プログラム42および生存区間表44に示したように、仮想レジスタvr20と仮想レジスタvr1とは生存区間の重なりがない。このため、機械語プログラム38では、仮想レジスタvr20およびvr1に共通の実レジスタr3が割り当てられており、機械語プログラム38で使用されるレジスタがレジスタr0からレジスタr4までの5個で済んでいることがわかる。すなわち、ループ処理内に命令10aを移動させることにより、レジスタ必要数を1つ削減できていることがわかる。
以上説明したように、本実施の形態に係るコンパイラによると、ループ処理で必要とされるレジスタ数を削減することができる。このため、ループ処理実行時に、ループ処理実行時に使用可能なレジスタ数を増加させることができる。よって、レジスタスピルが生じる確率を低下させることができる。また、ループ処理の内部に命令を移動させることにより、レジスタの生存区間の長さを短くすることができる。このため、保証レジスタを利用する確率が少なくなり、保証レジスタが保持する値をスタックに退避/復帰させるコードを実行する確率を低下させることができる。したがって、無駄にレジスタスピルを発生させたり、退避/復帰コードを実行したりしてループ処理の性能を悪化させてしまう可能性がなくなる。よって、ループ処理の性能を向上させることができる。
(実施の形態2)
次に、本発明の実施の形態2に係るコンパイラについて説明する。
実施の形態2に係るコンパイラは、命令をループ処理の内部に移動可能か否かの判定方法が実施の形態1に係るコンパイラと異なる。すなわち、実施の形態1では、レジスタの必要数に基づいて、命令の移動可能性を判断していたのに対し、実施の形態2では、レジスタスピルの発生回数に基づいて、命令の移動可能性を判断している点が異なる。
コンパイラの機能的な構成は、図2に示したものと同様である。また、移動判定部28以外の各処理部が実行する処理は、実施の形態1と同様である。このため、その詳細な説明はここでは繰り返さない。
図8は、移動判定部28が実行する処理のフローチャートである。実施の形態2に係る移動判定部28が実行する処理は、図3を参照して説明した実施の形態1に係る移動判定部28が実行する処理において、S10の処理の代わりに、S40の処理を実行する。すなわち、移動判定部28は、結果Aにおいて発生するレジスタスピルの回数と、結果Bにおいて発生するレジスタスピルの回数とを比較する。結果Bにおいて発生するレジスタスピルの回数の方が小さい場合には(S40でYES)、移動判定部28は、命令をループ処理内に移動させることによりレジスタスピルの発生回数を削減させることができると判断し、この命令をループ処理の内部に移動可能であるとの判定を行なう(S12)。
その他の移動判定部28が実行する処理については、実施の形態1で説明したものと同様であるため、その詳細な説明はここでは繰り返さない。
例えば、図5に示すCプログラム22をコンパイラ20への入力とした場合について考える。また、ループ処理中で使用することができるレジスタの数は4個であると想定する。
図9は、命令10aをループ処理の内部に入れる前の中間プログラム52(結果A)および中間プログラム52で使用されるレジスタの生存区間表54を示している。また、図10は、命令10aをループ処理の内部に入れた後の中間プログラム62(結果B)および中間プログラム62で使用されるレジスタの生存区間表64を示している。
図9の生存区間表54に示されるように、レジスタスピルが発生する生存区間を破線で示している。生存区間表54より、結果Aでは、ループ処理の1イタレーションあたり合計4回のレジスタスピルが発生していることがわかる。
一方、図10の生存区間表64に示されるように、結果Bでは、ループ処理の1イタレーションあたり合計2回のレジスタスピルが発生している。このように、結果Bにおいてレジスタスピルの発生回数が削減されているため(図8のS40)、移動判定部28は、命令10aを移動可能と判定する(図8のS12)。
以上説明したように、本実施の形態に係るコンパイラ20によると、レジスタスピルの発生回数を減少させることができる。したがって、無駄にレジスタスピルを発生させることにより、ループ処理の性能を悪化させてしまう可能性がなくなる。よって、ループ処理の性能を向上させることができる。
(実施の形態3)
次に、本発明の実施の形態3に係るコンパイラについて説明する。
実施の形態3に係るコンパイラは、実施の形態1と同様に、ループ処理を実行する際のレジスタの最大必要数に基づいて命令をループ処理の内部に移動可能か否かを判定するが、それに加えて、内部に移動させた命令とデータ依存関係を有する命令に関しても、さらにループ処理の内部に移動可能か否かを判定する点が実施の形態1と異なる。
コンパイラの機能的な構成は、図2に示したものと同様である。また、移動判定部28以外の各処理部が実行する処理は、実施の形態1と同様である。このため、その詳細な説明はここでは繰り返さない。
図11は、移動判定部28が実行する処理のフローチャートである。実施の形態3に係る移動判定部28が実行する処理は、図3を参照して説明した実施の形態1に係る移動判定部28が実行する処理に加えて、S52およびS54の処理が加わったものである。
すなわち、移動判定部28は、移動可能と判定された命令とデータ依存関係を有する命令が中間プログラム中にあるか否かを調べる(S52)。その結果、移動判定部28は、データ依存関係がある命令に対し、S4以降の処理(図11の処理X)を再帰的に実行する。
また、移動判定部28は、実施の形態1と異なり、結果Aにおけるレジスタ必要数と結果Bにおけるレジスタ必要数とが等しい場合においても、命令を移動可能と判定する(S50でYES、S12)。これは、現在着目している命令を移動させたとしても、必要レジスタ数削減しないものの、その命令とデータ依存関係にある命令を移動させることにより、必要レジスタ数を削減できる可能性もあるためである。
次に、実際のプログラム例を用いて、本実施の形態における命令の移動処理について説明する。図12〜図14は、命令の移動処理について説明するための図である。図12(a)は、一般最適化部26より出力される中間プログラム70の一例を示す図である。また、図12(b)は、この中間プログラム70に対して、移動判定部28が命令スケジューリング処理(図11のS2)を行なった結果である中間プログラム72(結果A)および生存区間表74を示す図である。
この時点では、レジスタの最大必要数は6個である。次に、移動判定部28が命令70aを移動させる。(図11のS6)。図13(a)は、移動後の中間プログラム80を示す図であり、命令70aがループ処理の内部に移動していることが分かる。また、移動判定部28は、中間プログラム80に対して、スケジューリング処理を行なう(図11のS8)。図13(b)は、スケジューリング処理の結果Bを示す中間プログラム82および生存区間表84を示す図である。中間プログラム82では、生存区間表84に示されるように、レジスタの最大必要数は中間プログラム72におけるレジスタの最大必要数と同数の6個であるが(S50でYES)、移動判定部28は、命令70aを移動可能と判定する。
また、移動判定部28は、命令70aとデータ依存関係にある命令70bに対して、同様の移動判定処理(処理X)を実行する(S52でYES、S54)。図14は、当該処理を説明するための図である。その結果、移動判定部28は、移動可能条件MCを満たす70bをループ処理の先頭に移動させる(S4でYES、S6)。図14(a)は、命令70bを移動させた後の中間プログラム90を示す図である。移動判定部28は、中間プログラム90に対して命令スケジューリング処理を行ない、図14(b)に示す中間プログラム92(結果B)を生成する(S8)。図14(b)に示す中間プログラム92の生存区間表94によると、中間プログラム92におけるレジスタ必要数は5個であり、命令70bの移動前に比べて一つ減っている(S50でYES)。このため、移動判定部28は、命令70aとともに命令70bも移動可能であるとの判定を行なう(S12)。
以上説明したように、本実施の形態に係るコンパイラ20によると、実施の形態1に記載の作用に加えて、ループ処理中へ移動させた命令と依存関係を有する命令に対しても、再帰的にループ処理中への移動判定を行なっている。このため、実施の形態1よりもさらにループ処理で必要とされるレジスタ数を削減できる可能性がある。よって、実施の形態1と同様に、ループ処理の性能を向上させることができる。
(実施の形態4)
次に、本発明の実施の形態4に係るコンパイラについて説明する。
実施の形態4に係るコンパイラは、命令をループ処理の内部に移動可能か否かの判定方法が上述の実施の形態と異なる。すなわち、本実施の形態では、着目する命令自体に基づいて生成されるパラメータによって、移動判定を行なう。
コンパイラの機能的な構成は、図2に示したものと同様である。また、移動判定部28以外の各処理部が実行する処理は、実施の形態1と同様である。このため、その詳細な説明はここでは繰り返さない。
移動判定部28が実行する処理について説明する前に、命令の「生存開始数」および「生存終了数」という言葉を定義し、それらの定義について説明する。また、命令の移動に伴う最大レジスタ必要数の変化についても説明する。
命令は、ある変数を定義し、ある変数を参照する。その命令がある変数の最初の定義を行なうものであれば、その命令から当該変数の生存区間が開始し、その命令がある変数の最後の参照を行なうものであれば、その命令で当該変数の生存区間が終了する。
すなわち、命令は、生存区間を開始させる存在、または生存区間を終了させる存在である。そこで、その命令により開始される変数の生存区間の数を「生存開始数」、終了される変数の生存区間の数を「生存終了数」と定義する。
例えば、図15に示されるような中間プログラム100において、add命令が仮想レジスタvr0の最初の定義を行ない、仮想レジスタvr1の最後の定義を行なうものとする。この場合、add命令に対する生存開始数および生存終了数はともに1となる。このように、「生存開始数=生存終了数」なる関係を有する場合には、命令を移動させたとしても最大レジスタ必要数に影響を与えない。
次に、図16に示すような中間プログラム110において、add命令が仮想レジスタvr0の最初の定義を行ない、仮想レジスタvr1およびvr2の最後の定義を行なうものとする。この場合、add命令に対する生存開始数は1であり、生存終了数は2となる。このように、「生存開始数<生存終了数」なる関係を有する場合には、命令をなるべく上方(図中のInstB、InstA方向)へ移動させることにより、最大レジスタ必要数を減らせる可能性がある。ただし、厳密には、InstAおよびInstBにおける生存開始数および生存終了数も考慮する必要がある。
次に、図17に示すような中間プログラム120において、add命令が仮想レジスタvr0の最初の定義のみを行ない、仮想レジスタvr1については最初の定義および最後の参照のいずれをも行なわないものとする。この場合、add命令に対する生存開始数は1であり、生存終了数は0である。このように、「生存開始数>生存終了数」なる関係を有する場合には、命令をなるべく下方(図中のInstC、InstDの方向)へ移動させることにより、最大レジスタ必要数を減らせる可能性がある。ただし、厳密には、InstCおよびInstDの生存開始数および生存終了数も考慮する必要がある。
以上説明したように、ある命令に対する生存開始数と生存終了数とが異なる場合には、その命令を移動させることにより、最大レジスタ必要数を減らせる可能性がある。ただし、このような場合であっても、命令の移動先の位置によっては、それ以上最大レジスタ必要数を減らすことができない場合がある。
図18を参照して、この現象について説明する。同図の中間プログラム130において、仮想レジスタvr0はadd命令で最初に定義され、仮想レジスタvr1はsub命令で最後に参照されるものとする。このため、add命令に対する生存開始数は1であり、生存開始数は0であるものとする。また、sub命令に対する生存開始数は0であり、生存終了数は1であるものとする。このように、add命令に対しては「生存開始数>生存終了数」なる関係を有する。このため、add命令を下方へ移動させることにより最大レジスタ必要数を減らせる可能性がある。
しかし、図19の中間プログラム140に示すように、add命令がsub命令よりも下方へ配置されると、仮想レジスタvr1の生存区間の終了地点は、元々sub命令であったものがadd命令自身となる。これにより、add命令に対する生存開始数と生存終了数とは1となり、「生存開始数=生存終了数」なる関係を有することとなる。
したがって、add命令をsub命令よりも下方に移動させることは、最大レジスタ必要数に影響を与えないことに注意する必要がある。
図20は、本実施の形態に係る移動判定部28が実行する処理のフローチャートである。
移動判定部28は、ループ処理のプリヘッダ中のすべての命令に対して、上述した移動可能条件(MC)を満たすか否かを判定し(S4でYES)、移動可能条件(MC)を満たす命令に関して、移動判定部28は、生存開始数を生存終了数とを算出する(S62)。移動判定部28は、当該命令に対して「生存開始数>生存終了数」なる関係を有するか否かを判定し(S64でYES)、この関係を有する場合には、当該命令を下方に移動させることにより最大レジスタ必要数を減らせる可能性があるため、移動判定部28は、当該命令を移動可能と判定する(S12)。
以上のような命令の移動判定処理を行ない、生存開始数が多い命令をループ処理中に移動させることにより、ループ処理全体で生存する仮想レジスタを減らせる可能性がある。例えば、図1(a)の中間プログラム10について考えると、命令10aに対しては、仮想レジスタvr20の生存区間を開始させるが、仮想レジスタvr20の生存区間を終了させるものは何もない。このため、命令10aに関しては、生存開始数=1、生存終了数=0となり、「生存開始数>生存終了数」という関係を満たすため(S64でYES)、移動判定部28は、この命令を移動可能と判定する(S12)。
以上説明したように、本実施の形態に係るコンパイラ20によると、生存開始数が生存終了数よりも大きい命令をループ処理内に移動させることにより、ループ処理で必要とされるレジスタ数を削減することができる。このため、ループ処理実行時に使用可能なレジスタ数を増加させることができる。よって、レジスタスピルが生じる確率を低下させることができる。また、ループ処理の内部に命令を移動させることにより、レジスタの生存区間の長さを短くすることができる。このため、保証レジスタを利用する確率が少なくなり、保証レジスタが保持する値をスタックに退避/復帰させるコードを実行する確率を低下させることができる。したがって、無駄にレジスタスピルを発生させたり、退避/復帰コードを実行したりしてループ処理の性能を悪化させてしまう可能性がなくなる。よって、ループ処理の性能を向上させることができる。
なお、本実施の形態では、移動判定部28は、命令に対する生存開始数および生存終了数に基づいて、当該命令をループ処理内に移動可能か否かを判定していたが、命令に対する生存開始数および生存終了数の完全な解析が困難である場合には、各命令において定義されているレジスタの数および参照されているレジスタの数を比較することにより、近似的に生存開始数と生存終了数との比較を行うようにしてもよい。
(実施の形態5)
次に、本発明の実施の形態5に係るコンパイラについて説明する。
上述の実施の形態1〜4に係るコンパイラにおいては、命令の移動判定処理および移動実行処理を行なった後に、命令スケジューリング処理およびレジスタ割り付け処理を行なっているが、本実施の形態に係るコンパイラにおいては、命令スケジューリング処理を行なった後であって、命令スケジューリング処理を行なう前に移動判定処理および移動実行処理を行なう点が、上述の実施の形態1〜4に係るコンパイラとは異なる。
図21は、本実施の形態に係るコンパイラの構成を機能的に示したブロック図である。コンパイラ150は、3命令を並列実行可能なプロセッサをターゲットプロセッサとし、高級言語で記述されたソースプログラムを機械語プログラムに変換するコンピュータソフトウェアであり、機能的に、構文解析部24、一般最適化部26、命令スケジューリング部32、移動判定部152、移動実行部154、レジスタ割付部34および出力部36から構成される。
移動判定部152および移動実行部154以外の処理部については、実施の形態1で説明したものと同様である。このため、その詳細な説明はここでは繰り返さない。
移動判定部152は、命令スケジューリング部32において命令スケジューリングが終了した中間プログラムを入力とし、ループ処理の外側に位置する命令をループ処理の内部に移動可能か否かを判定する処理部である。移動判定部152の実行する処理の詳細については後述する。
移動実行部154は、命令スケジューリング部32において命令スケジューリングが終了した中間プログラムに含まれる命令のうち、移動判定部152において移動可能と判断された命令をループ処理の内部に移動させる処理部である。移動実行部154の実行する処理の詳細については後述する。
図22は、移動判定部152が実行する処理のフローチャートである。移動判定部152が処理を行なう時点では、命令スケジューリング部32による命令スケジューリング処理が終了している。このため、移動判定部28においては、命令スケジューリング処理は行われない。すなわち、移動判定部152は、命令スケジューリング処理が中間プログラムのうち、ループ処理のプリヘッダ中の移動可能条件(MC)を満たす命令をループ処理中の先頭に移動させた場合に(S4、S6)、当該命令を移動させたときの最大レジスタ必要数と、移動させないときのレジスタ必要数とを比較する(S72)。移動させたときのレジスタ必要数のほうが、移動させないときのレジスタ必要数よりも小さい場合には(S72でYES)、移動判定部152は、この命令を移動可能と判定する(S12)。
命令を移動可能と判定した後(S12)、または移動させたときのレジスタ必要数が移動させないときのレジスタ必要数以上の場合には(S72でNO)、移動判定部152は、命令移動処理(S6)で移動させた命令を元の位置に戻す(S14)。移動判定部28は、以上の移動判定処理をループ処理のプリヘッダ中のすべての命令に対して、繰返し行なう。
図23は、移動実行部154が実行する処理のフローチャートである。移動実行部154が処理を行なう時点では、命令スケジューリング部32により命令スケジューリング処理が終了している。このため、命令スケジューリング部32は、移動可能と判断された命令を移動する際に(S82でYES)、当該命令とデータ依存関係を有する命令との位置を調整しながらスケジューリングを行う(S84)。すなわち、移動実行部154は、データ依存関係を壊さないように、命令をループ処理内に移動させる。
以上説明したように、本実施の形態に係るコンパイラよると、命令のスケジューリングを行なった後であっても、移動可能な命令のデータ依存関係を壊さないように、当該命令をループ処理内に移動させることにより、上述の実施の形態と同様、ループ処理で必要とされるレジスタ数を削減することができる。このため、ループ処理実行時に、ループ処理実行時に使用可能なレジスタ数を増加させることができる。よって、レジスタスピルが生じる確率を低下させることができる。また、ループ処理の内部に命令を移動させることにより、レジスタの生存区間の長さを短くすることができる。このため、保証レジスタを利用する確率が少なくなり、保証レジスタが保持する値をスタックに退避/復帰させるコードを実行する確率を低下させることができる。したがって、無駄にレジスタスピルを発生させたり、退避/復帰コードを実行したりしてループ処理の性能を悪化させてしまう可能性がなくなる。よって、ループ処理の性能を向上させることができる。
(実施の形態6)
次に、本発明の実施の形態6に係るコンパイラについて説明する。
本実施の形態に係るコンパイラにおいては、命令スケジューリング処理およびレジスタ割り付け処理を行なった後に、移動判定処理および移動実行処理を行なう点が、上述の実施の形態1〜5に係るコンパイラとは異なる。
図24は、本実施の形態に係るコンパイラの構成を機能的に示したブロック図である。コンパイラ160は、3命令を並列実行可能なプロセッサをターゲットプロセッサとし、高級言語で記述されたソースプログラムを機械語プログラムに変換するコンピュータソフトウェアであり、機能的に、構文解析部24、一般最適化部26、命令スケジューリング部32、レジスタ割付部34、移動判定部152、移動実行部164および出力部36から構成される。
移動判定部152および移動実行部164以外の処理部については、実施の形態1で説明したものと同様である。また、移動実行部154については、実施の形態5で説明したものと同様である。このため、これらの処理部についての詳細な説明はここでは繰り返さない。
移動実行部164は、命令スケジューリング処理およびレジスタ割り付け処理が終了した中間プログラムに含まれる命令のうち、移動判定部152において移動可能と判断された命令をループ処理の内部に移動させる処理部である。以下、移動実行部164の実行する処理について説明する。
図25は、移動実行部164の実行する処理のフローチャートである。移動実行部164は、ループ処理のプリヘッダに含まれる命令のうち、移動判定部152においてループ処理内に移動可能であると判断された命令が存在するか否かを調べる(S92)。ループ処理内に移動可能な命令が存在する場合には(S92でYES)、移動実行部164は、当該命令をループ処理内に移動させる(S94)。また、移動実行部164は、命令の移動を行なうことにより、生存区間の重なりが解消されたレジスタについて、再度レジスタ割付を行う(S96)。この処理により、移動実行部164は、使用されるレジスタの数を減少させる(S96)。
図26は、移動に伴うレジスタ数の減少について説明するための図である。図26(a)は、移動実行部164による処理が実行される前の中間プログラム170の一例を示す図であり、図26(b)は、移動実行部164による処理が実行された後の中間プログラム176の一例を示す図である。
図26では、中間プログラム170に含まれるmov命令172をループ処理内に移動させる場合を示しているが、中間プログラム170においては、レジスタr3とレジスタr5との生存区間の重なりがあるが、mov命令172をループ処理内に移動させることにより、レジスタr3とレジスタr5との生存区間の重なりが解消する。そのため、レジスタr5をレジスタr3に最割付することができる。すなわち、中間プログラム170のmov命令172とadd命令174とが、それぞれ中間プログラム176のmov命令178とadd命令180とに変更されており、レジスタを1つ減らすことができる。
以上説明したように、本実施の形態に係るコンパイラよると、命令スケジューリング処理およびレジスタ割り付け処理が終了した後であっても、命令をループ処理内に移動させることにより、上述の実施の形態と同様、ループ処理で必要とされるレジスタ数を削減することができる。また、レジスタの生存区間の重なりが解消された場合にも、使用されるレジスタ数を削減することができる。
このため、ループ処理実行時に、ループ処理実行時に使用可能なレジスタ数を増加させることができる。よって、レジスタスピルが生じる確率を低下させることができる。また、ループ処理の内部に命令を移動させることにより、レジスタの生存区間の長さを短くすることができる。このため、保証レジスタを利用する確率が少なくなり、保証レジスタが保持する値をスタックに退避/復帰させるコードを実行する確率を低下させることができる。したがって、無駄にレジスタスピルを発生させたり、退避/復帰コードを実行したりしてループ処理の性能を悪化させてしまう可能性がなくなる。よって、ループ処理の性能を向上させることができる。
以上、本発明の実施の形態に係るコンパイラについて説明したが、本発明は、これらの実施の形態に限定されるものではない。
例えば、実施の形態3の移動判定部28は、ループ内部に移動させた命令とデータ依存関係を有する命令について、レジスタの必要数に基づいて命令がループ処理内に移動可能か否かを判定したが、他の実施の形態で説明した命令の移動判定方法に従い命令がループ処理内に移動可能か否かを再帰的に判定するようにしてもよい。
また、上述の実施の形態では、命令スケジューリング部32が命令スケジューリング処理を実行した後に、レジスタ割付部34がレジスタ割り付け処理を実行しているが、レジスタ割り付け処理を行なった後に、命令スケジューリング処理を行うようにしてもよい。また、命令スケジューリング処理またはレジスタ割り付け処理が複数回行なわれてもよい。
また、ループ処理中でソフトウェアパイプライニングなど、複数のイタレーション実行が重なるような最適化が行われていても、同様に命令の移動判定処理および移動実行処理が可能である。
さらに、移動判定時に命令を探索する場所は、ループ処理のプリヘッダに限られず、当該ループ処理へ到達する定義が唯一であればその命令をループ処理の移動判定対象となりうる。
さらにまた、複数にネストしたループ処理に対しては、なるべく内側のループ処理、好ましくは最内ループ処理にまで到達できるように、命令の移動判定処理および移動実行処理を繰り返し実行してもよい。図27は、ネストとしたループ処理に対する命令の移動判定処理および移動実行処理について説明するための図である。図27(a)に示すように2重にネストしたループ処理を含む中間プログラム190について考える。すなわち、中間プログラム190では、最外ループ処理(ラベルL00002で示されたループ処理)に最内ループ処理(ラベルL00001で示されたループ処理)がネストした2重ループ構造を有する。コンパイラは、この中間プログラム190において、最外ループ処理のプリヘッダとなっているmov命令192が、最外ループ処理の内部に移動可能か否かを判定し、移動可能な場合には、最外ループ処理の内部であって、最内ループ処理の外部に移動させる。さらに、コンパイラは、mov命令192を最大ループ処理の内部に移動可能か否かを判定し、移動可能な場合には、最内ループ処理の内部に移動させる。図27(b)は、mov命令192を最内ループ処理の内部に移動させた後の中間プログラム194の一例を示した図である。
また、コンパイラは、移動可能条件(MC)を以下のように拡張してもよい。すなわち、命令における定義が唯一でなくても、他の定義が、当該命令のプリヘッダ以降に存在するか、ループ処理内に存在しない場合には、その定義は唯一の定義であるとみなして移動可能条件(MC)を拡張してもよい。
さらにまた、上述の実施の形態においては、レジスタ資源に着目して、命令の移動判定処理を行なったが、条件フラグのような記憶資源に基づいて、命令の移動判定処理を行うようにしてもよい。
また、上述の実施の形態で説明した最適化処理は、ユーザによるコンパイラに対する指示に基づいて実施されるようにしてもよい。すなわち、コンパイラオプションやプラグマを用いて、コンパイラに対して最適化処理の指示を行なうことができる。
図28は、コンパイラに対する最適化処理の指示について説明するための図である。
図28(a)は、コンパイラに対して、命令移動によるループ処理の最適化処理を実行するように指示するプラグマ「#pragma invariant_reverse」を含むソースプログラムの一例を示す図である。コンパイラは、ソースプログラム200において、プラグマ「#pragma invariant_reverse」で指定されるforループを対象として、上述した命令移動によるループ処理の最適化処理を実行する。
図28(b)は、コンパイラに対して、命令移動によるループ処理の最適化処理を実行しないように指示するプラグマ「#pragma invariant_reverse_off」を含むソースプログラムの一例を示す図である。コンパイラは、ソースプログラム202において、プラグマ「#pragma invariant_reverse_off」で指定されるforループに対しては、上述した命令移動によるループ処理の最適化処理は実行しない。
図28(c)は、コンパイラに対して、命令移動によるループ処理の最適化処理を実行するように指示するコンパイルオプション「-invariant_reverse」を示す図である。すなわち、ユーザは、ソースプログラムのコンパイル時に、コマンドライン上でコンパイラを起動させるための命令「cc」と、ソースプログラムのファイル名「test.c」とを入力するが、それと合わせてコンパイルオプション「-invariant_reverse」を入力することができる。これにより、コンパイラは、ファイル名「test.c」のソースプログラムに含まれるループ処理を対象として、上述した命令移動によるループ処理の最適化処理を実行する。
図28(d)は、コンパイラに対して、命令移動によるループ処理の最適化処理を実行しないように指示するコンパイルオプション「-invariant_reverse_off」を示す図である。すなわち、ユーザは、ソースプログラムのコンパイル時に、コマンドライン上でコンパイラを起動させるための命令「cc」と、ソースプログラムのファイル名「test.c」とを入力するが、それと合わせてコンパイルオプション「-invariant_reverse_off」を入力することができる。これにより、コンパイラは、ファイル名「test.c」のソースプログラムに含まれるループ処理に対しては、上述した命令移動によるループ処理の最適化処理を実行しない。
図28(a)に示したプラグマまたは図28(c)に示したコンパイルオプションを使用することにより、コンパイラは、レジスタ数を削減することができるような機械語プログラムを生成することができる。
一方、図28(b)に示したプラグマまたは図28(d)に示したコンパイルオプションを使用することにより、コンパイラは、ループ処理中で実行する命令の数を減少させた機械語プログラムを生成することができる。このため、このようなコンパイラに対する指示は、機械語プログラム実行時の低消費電力化の要望がある場合に有効である。
なお、図28(e)は、コンパイラに対して、低消費電力実行可能な機械語プログラムを生成するよう指示するコンパイルオプション「-low_power_mode」を示す図である。すなわち、ユーザは、ソースプログラムのコンパイル時に、コマンドライン上でコンパイラを起動させるための命令「cc」と、ソースプログラムのファイル名「test.c」とを入力するが、それと合わせてコンパイルオプション「-low_power_mode」を入力することができる。これにより、コンパイラは、図28(d)のコンパイルオプションによる指定が行なわれた場合と同様、命令移動によるループ処理の最適化を行なわない。このように、図28(a)〜図28(d)に示すように、コンパイラに対して直接的にループ処理の最適化を指示したり指示しなかったりするのではなく、図28(e)に示すように、コンパイラに対して間接的にループ処理の最適化を指示したり指示しなかったりすることもできる。
また、移動判定部28は、命令をループ処理の内部に入れる前の命令スケジューリング後の中間プログラム(上述の結果A)のループ処理の実行サイクル数と命令をループ処理の内部に入れた後の中間プログラム(上述の結果B)のループ処理の実行サイクル数とを比較することにより、命令をループ処理内に移動可能か否かを判定するようにしてもよい。
さらに、通常のループ不変式のループ処理外への移動の最適化の際に、上述の実施の形態で説明したように、レジスタ(仮想レジスタを含む)の生存区間の状況に応じて、移動判断を行うようにしてもよい。
図29は、ループ不変式移動による最適化を行なうコンパイラの構成の一例を機能的に示すブロック図である。コンパイラ210は、高級言語で記述されたソースプログラムを機械語プログラムに変換するコンピュータソフトウェアであり、機能的に、構文解析部24、一般最適化部26、ループ不変式移動部212、命令スケジューリング部32、レジスタ割付部34および出力部36から構成される。
ループ不変式移動部212以外の処理部については、実施の形態1で説明したものと同様である。このため、それらの処理部については説明を繰り返さない。ループ不変式移動部212は、中間プログラムに対して、ループ不変式移動による最適化を行なう処理部である。
図30は、ループ不変式移動部212の実行する処理のフローチャートである。
ループ不変式移動部212は、入力された中間プログラムに対して命令スケジューリングを行ない、このスケジューリング結果を結果Aとする(S2)。次に、ループ不変式移動部212はループ処理中に含まれるすべての命令に対して以下の処理を繰り返す。すなわち、ループ不変式移動部212は、着目している命令がループ処理外への移動可能条件を満たしているか否かについて判断する(S102)。この移動可能条件は、周知の技術であるため、ここでは、その詳細な説明は繰り返さない。移動可能条件を満たす場合には(S102でYES)、ループ不変式移動部212は、当該命令をループ処理の外に移動させる(S104)。次に、ループ不変式移動部212は、命令を移動させた後の中間プログラムに対して命令スケジューリングを行ない、この命令スケジューリング結果を結果Bとする(S8)。その後、ループ不変式移動部212は、結果Bで必要とされるレジスタ数が結果Aで必要とされるレジスタ数以上の場合には(S106でNO)、命令をループ処理外へ移動させたとしても、必要レジスタ数が減少しない。このため、ループ不変式移動部212は、命令移動処理(S104)において、ループ外に移動させた命令を元の位置に戻す(S14)。
以上のような処理を行なうことにより、ループ不変式移動を行なう際に、レジスタの必要数が少なくなるような場合にだけ、ループ不変式の移動を行なうことができる。なお、ループ不変式移動を行なうか否かの判断は、レジスタ必要数の比較に限られず、上述の実施の形態で説明したような方法、例えばレジスタスピルの比較等により行ってもよい。
さらにまた、上述の様々なコンパイラの入力プログラムは、Cプログラムに限られず、他の高級言語で記述されたプログラムであってもよいし、アセンブラプログラムそのものを入力とするものであってもよい。
また、コンパイラの出力は機械語プログラムに限られず、アセンブラプログラムを出力するものであってもよい。
また、本説明の実施の形態では、コンパイラ関する説明のみを行ったが、もちろん、アセンブラやリンカとの結合ツールとして使用されてもよい。
本発明は、コンパイラ等に適用でき、特にループ処理を含むプログラムを入力とするコンパイラ等に適用できる。
中間プログラムおよび仮想レジスタの生存区間の一例を示す図である。 本発明の実施の形態1に係るコンパイラの構成を機能的に示したブロック図である。 移動判定部が実行する処理のフローチャートである。 移動実行部が実行する処理のフローチャートである。 コンパイラに入力されるCプログラムの一例を示す図である。 (a)はループ処理外の命令をループ処理内に移動させた後の中間プログラムを示す図であり、(b)は、(a)の中間プログラムに対して命令スケジューリングを行なった結果と仮想レジスタの生存区間とを示す図である。 コンパイラにより生成される機械語プログラムに対応するアセンブラプログラムを示す図である。 実施の形態2に係る移動判定部が実行する処理のフローチャートである。 命令をループ処理の内部に入れる前の中間プログラムおよび中間プログラムで使用されるレジスタの生存区間表の一例を示す図である。 命令をループ処理の内部に入れた後の中間プログラムおよび中間プログラムで使用されるレジスタの生存区間表の一例を示す図である。 実施の形態3に係る移動判定部が実行する処理のフローチャートである。 命令の移動処理について説明するための図である。 命令の移動処理について説明するための図である。 命令の移動処理について説明するための図である。 生存開始数および生存終了数について説明するための図である。 生存開始数および生存終了数について説明するための図である。 生存開始数および生存終了数について説明するための図である。 生存開始数および生存終了数について説明するための図である。 生存開始数および生存終了数について説明するための図である。 実施の形態4に係る移動判定部が実行する処理のフローチャートである。 実施の形態5に係るコンパイラの構成を機能的に示したブロック図である。 実施の形態5に係る移動判定部が実行する処理のフローチャートである。 実施の形態5に係る移動実行部が実行する処理のフローチャートである。 実施の形態6に係るコンパイラの構成を機能的に示したブロック図である。 実施の形態6に係る移動実行部の実行する処理のフローチャートである。 移動に伴うレジスタ数の減少について説明するための図である。 ネストとしたループ処理に対する命令の移動判定処理および移動実行処理について説明するための図である。 コンパイラに対する最適化処理の指示について説明するための図である。 ループ不変式移動による最適化を行なうコンパイラの構成の一例を機能的に示すブロック図である。 ループ不変式移動部の実行する処理のフローチャートである。
符号の説明
20,150,160,210 コンパイラ
22 Cプログラム
24 構文解析部
26 一般最適化部
28,152 移動判定部
30,154,164 移動実行部
32 命令スケジューリング部
34 レジスタ割付部
36 出力部
38 機械語プログラム

Claims (10)

  1. ループ処理を含む第1のプログラムを第2のプログラムに変換するコンパイラ装置であって、
    前記第1のプログラムに含まれる前記ループ処理外に位置する命令で使用される変数の生存区間を解析し、命令により生存区間が開始する変数の数である生存開始数が前記命令により生存区間が終了する変数の数である生存終了数よりも大きい場合に当該命令を前記ループ処理内に移動可能であると判定する移動判定手段と、
    前記移動判定手段で移動可能と判断された命令を前記ループ処理内に移動させ、中間プログラムを生成する移動実行手段と、
    前記中間プログラムを前記第2のプログラムに変換する変換手段と
    を備えることを特徴とするコンパイラ装置。
  2. 前記移動実行手段は、さらに、前記移動判定手段で移動可能と判断された第1の命令を前記ループ処理内に移動させるに際し、当該第1の命令とデータ依存関係にある第2の命令を前記データ依存関係を壊さない位置に移動させる
    ことを特徴とする請求項1に記載のコンパイラ装置。
  3. 前記移動実行手段は、さらに、前記移動判定手段で移動可能と判断された命令を前記ループ処理内に移動させた後に、当該命令で使用されている第1のレジスタとの生存区間の重なりが解消された第2のレジスタが存在する場合には、当該第2のレジスタを他のレジスタに再割付する
    ことを特徴とする請求項1に記載のコンパイラ装置。
  4. さらに、命令の移動を行なうか否かに関する指示を取得する指示取得手段を備え、
    前記移動判定手段は、さらに、前記指示取得手段が前記命令の移動を行なわないとする指示を取得した場合には、命令をループ処理内に移動可能か否かの判定を行なわない
    ことを特徴とする請求項1〜のいずれか1項に記載のコンパイラ装置。
  5. さらに、命令の移動を行なうか否かに関する指示を取得する指示取得手段を備え、
    前記移動判定手段は、さらに、前記指示取得手段が前記命令の移動を行なうとする指示を取得した場合には、命令をループ処理内に移動可能か否かの判定を行なう
    ことを特徴とする請求項1〜のいずれか1項に記載のコンパイラ装置。
  6. さらに、低消費電力向けの第2のプログラムに変換するか否かに関する指示を取得する指示取得手段を備え、
    前記移動判定手段は、さらに、前記指示取得手段が低消費電力向けの第2のプログラムに変換するとする指示を取得した場合には、命令をループ処理内に移動可能か否かの判定を行なわない
    ことを特徴とする請求項1〜のいずれか1項に記載のコンパイラ装置。
  7. 前記指示は、自身の起動時に与えられるコンパイルオプションである
    ことを特徴とする請求項のいずれか1項に記載のコンパイラ装置。
  8. 前記指示は、前記第1のプログラム中に記述されているプラグマ記述である
    ことを特徴とする請求項のいずれか1項に記載のコンパイラ装置。
  9. ループ処理を含む第1のプログラムを第2のプログラムに変換するコンパイル方法であって、
    前記第1のプログラムに含まれる前記ループ処理外に位置する命令で使用される変数の生存区間を解析し、命令により生存区間が開始する変数の数である生存開始数が前記命令により生存区間が終了する変数の数である生存終了数よりも大きい場合に当該命令を前記ループ処理内に移動可能であると判定する移動判定ステップと、
    前記移動判定ステップで移動可能と判断された命令を前記ループ処理内に移動させ、中間プログラムを生成する移動実行ステップと、
    前記中間プログラムを前記第2のプログラムに変換する変換ステップと
    を含むことを特徴とするコンパイル方法。
  10. ループ処理を含む第1のプログラムを第2のプログラムに変換するコンパイラであって、
    前記第1のプログラムに含まれる前記ループ処理外に位置する命令で使用される変数の生存区間を解析し、命令により生存区間が開始する変数の数である生存開始数が前記命令により生存区間が終了する変数の数である生存終了数よりも大きい場合に当該命令を前記ループ処理内に移動可能であると判定する移動判定ステップと、
    前記移動判定ステップで移動可能と判断された命令を前記ループ処理内に移動させ、中間プログラムを生成する移動実行ステップと、
    前記中間プログラムを前記第2のプログラムに変換する変換ステップとをコンピュータに実行させる
    ことを特徴とするコンパイラ。
JP2005282852A 2005-09-28 2005-09-28 コンパイラ装置 Expired - Fee Related JP4778286B2 (ja)

Priority Applications (3)

Application Number Priority Date Filing Date Title
JP2005282852A JP4778286B2 (ja) 2005-09-28 2005-09-28 コンパイラ装置
US11/534,719 US7827542B2 (en) 2005-09-28 2006-09-25 Compiler apparatus
CNA2006101689106A CN101000556A (zh) 2005-09-28 2006-09-28 编译装置

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP2005282852A JP4778286B2 (ja) 2005-09-28 2005-09-28 コンパイラ装置

Publications (2)

Publication Number Publication Date
JP2007094731A JP2007094731A (ja) 2007-04-12
JP4778286B2 true JP4778286B2 (ja) 2011-09-21

Family

ID=37895708

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2005282852A Expired - Fee Related JP4778286B2 (ja) 2005-09-28 2005-09-28 コンパイラ装置

Country Status (3)

Country Link
US (1) US7827542B2 (ja)
JP (1) JP4778286B2 (ja)
CN (1) CN101000556A (ja)

Families Citing this family (11)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2006107339A (ja) * 2004-10-08 2006-04-20 Matsushita Electric Ind Co Ltd プログラム処理装置
JP2009048252A (ja) * 2007-08-14 2009-03-05 Oki Electric Ind Co Ltd プログラム変換装置及びコンパイラプログラム
US8236711B1 (en) 2008-06-12 2012-08-07 Milliken & Company Flexible spike and knife resistant composite
US20140143761A1 (en) * 2012-04-18 2014-05-22 Natalio Fridman Method and system for database conversion
US9229717B2 (en) * 2012-12-11 2016-01-05 Nvidia Corporation Register allocation for clustered multi-level register files
GB2514618B (en) * 2013-05-31 2020-11-11 Advanced Risc Mach Ltd Data processing systems
CN108804222B (zh) * 2018-04-13 2021-07-27 南京南瑞继保电气有限公司 一种临时变量的数据区分配方法
US10698689B2 (en) 2018-09-01 2020-06-30 Intel Corporation Recompiling GPU code based on spill/fill instructions and number of stall cycles
US10983794B2 (en) 2019-06-17 2021-04-20 Intel Corporation Register sharing mechanism
CN113535231B (zh) * 2020-04-17 2024-09-20 中科寒武纪科技股份有限公司 减少指令跳转的方法及装置
WO2024225430A1 (ja) * 2023-04-28 2024-10-31 株式会社 Preferred Networks 情報処理装置、情報処理方法、プログラム、中間言語生成方法、機械語生成方法及びデータ構造生成方法

Family Cites Families (18)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPS63285668A (ja) * 1987-05-19 1988-11-22 Fujitsu Ltd ベクトルロ−ド処理方法
US4991088A (en) * 1988-11-30 1991-02-05 Vlsi Technology, Inc. Method for optimizing utilization of a cache memory
US5202995A (en) * 1989-10-12 1993-04-13 International Business Machines Corporation Method for removing invariant branches from instruction loops of a computer program
JP3004340B2 (ja) * 1990-10-15 2000-01-31 沖電気工業株式会社 プログラム最適化装置
US5386562A (en) * 1992-05-13 1995-01-31 Mips Computer Systems, Inc. Circular scheduling method and apparatus for executing computer programs by moving independent instructions out of a loop
US5457799A (en) * 1994-03-01 1995-10-10 Digital Equipment Corporation Optimizer for program loops
US5966539A (en) * 1994-03-01 1999-10-12 Digital Equipment Corporation Link time optimization with translation to intermediate program and following optimization techniques including program analysis code motion live variable set generation order analysis, dead code elimination and load invariant analysis
JP3606387B2 (ja) * 1994-09-13 2005-01-05 松下電器産業株式会社 コンパイル装置
US5815721A (en) * 1996-04-25 1998-09-29 Hewlett-Packard Company Method and apparatus for optimizing complex control structures using abstract web patterns
US6059839A (en) * 1997-01-09 2000-05-09 Silicon Graphics, Inc. Apparatus and method for compiler identification of address data
US6253373B1 (en) * 1997-10-07 2001-06-26 Hewlett-Packard Company Tracking loop entry and exit points in a compiler
US6463582B1 (en) * 1998-10-21 2002-10-08 Fujitsu Limited Dynamic optimizing object code translator for architecture emulation and dynamic optimizing object code translation method
US6954927B2 (en) * 1999-02-17 2005-10-11 Elbrus International Hardware supported software pipelined loop prologue optimization
JP3405696B2 (ja) * 1999-08-19 2003-05-12 インターナショナル・ビジネス・マシーンズ・コーポレーション コンパイル装置およびその方法
US20030237080A1 (en) 2002-06-19 2003-12-25 Carol Thompson System and method for improved register allocation in an optimizing compiler
US7316012B2 (en) * 2003-09-29 2008-01-01 Intel Corporation System, method, and apparatus for spilling and filling rotating registers in software-pipelined loops
US7444628B2 (en) 2004-08-30 2008-10-28 International Business Machines Corporation Extension of swing modulo scheduling to evenly distribute uniform strongly connected components
JP2006139553A (ja) 2004-11-12 2006-06-01 Matsushita Electric Ind Co Ltd 命令スケジューリング方法、および装置

Also Published As

Publication number Publication date
JP2007094731A (ja) 2007-04-12
CN101000556A (zh) 2007-07-18
US7827542B2 (en) 2010-11-02
US20070074196A1 (en) 2007-03-29

Similar Documents

Publication Publication Date Title
EP2677424B1 (en) OpenCL compilation
US8893080B2 (en) Parallelization of dataflow actors with local state
JP4822817B2 (ja) コンパイルシステム
JP4778286B2 (ja) コンパイラ装置
US20100070958A1 (en) Program parallelizing method and program parallelizing apparatus
JP2004234126A (ja) コンパイラ装置およびコンパイル方法
JP5966509B2 (ja) プログラム、コード生成方法および情報処理装置
US20060277529A1 (en) Compiler apparatus
JP2015194881A (ja) コンパイル装置、コンパイラプログラム、コンパイル方法
US20060064682A1 (en) Compiler, compilation method, and compilation program
CN106462432A (zh) 数据相关控制流简化
JPH0934725A (ja) 言語処理装置及び言語処理方法
US8650525B2 (en) Integrated circuit compilation
JP5576605B2 (ja) プログラム変換装置およびプログラム変換方法
CN111930359A (zh) 一种异构嵌入式系统上进行算法开发的系统及方法
JP2008305337A (ja) プログラム変換装置、プログラム変換方法、プログラム、記憶媒体、デバッグ装置、デバッグ方法及びプログラム開発システム
US20050144605A1 (en) Information processing system and code generation method
CN112579091A (zh) 指令编译方法、装置、编译器及计算设备
CN112540750B (zh) 自适应内建函数与指令操作选择翻译方法
JP2004326760A (ja) コンパイラ、記録媒体、コンパイル装置、通信端末装置及びコンパイル方法
JP2006301989A (ja) 計算機言語によるプログラムをブロック図から自動生成する方法と装置とプログラム
JP5208589B2 (ja) コンパイル装置、コンパイラ、コンパイル方法
JP2009064207A (ja) コンパイル装置
JP2008071128A (ja) プリフェッチ制御方法及びコンパイル装置
CN120122956A (zh) 一种多粒度数据流编译系统与数据流图编译方法

Legal Events

Date Code Title Description
A621 Written request for application examination

Free format text: JAPANESE INTERMEDIATE CODE: A621

Effective date: 20080827

A977 Report on retrieval

Free format text: JAPANESE INTERMEDIATE CODE: A971007

Effective date: 20100615

A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A131

Effective date: 20110405

A521 Request for written amendment filed

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20110527

TRDD Decision of grant or rejection written
A01 Written decision to grant a patent or to grant a registration (utility model)

Free format text: JAPANESE INTERMEDIATE CODE: A01

Effective date: 20110621

A01 Written decision to grant a patent or to grant a registration (utility model)

Free format text: JAPANESE INTERMEDIATE CODE: A01

A61 First payment of annual fees (during grant procedure)

Free format text: JAPANESE INTERMEDIATE CODE: A61

Effective date: 20110701

R150 Certificate of patent or registration of utility model

Ref document number: 4778286

Country of ref document: JP

Free format text: JAPANESE INTERMEDIATE CODE: R150

Free format text: JAPANESE INTERMEDIATE CODE: R150

FPAY Renewal fee payment (event date is renewal date of database)

Free format text: PAYMENT UNTIL: 20140708

Year of fee payment: 3

S111 Request for change of ownership or part of ownership

Free format text: JAPANESE INTERMEDIATE CODE: R313111

R350 Written notification of registration of transfer

Free format text: JAPANESE INTERMEDIATE CODE: R350

R250 Receipt of annual fees

Free format text: JAPANESE INTERMEDIATE CODE: R250

R250 Receipt of annual fees

Free format text: JAPANESE INTERMEDIATE CODE: R250

LAPS Cancellation because of no payment of annual fees