JP3870112B2 - コンパイル方法、コンパイル装置、及びコンパイル用プログラム - Google Patents

コンパイル方法、コンパイル装置、及びコンパイル用プログラム Download PDF

Info

Publication number
JP3870112B2
JP3870112B2 JP2002069221A JP2002069221A JP3870112B2 JP 3870112 B2 JP3870112 B2 JP 3870112B2 JP 2002069221 A JP2002069221 A JP 2002069221A JP 2002069221 A JP2002069221 A JP 2002069221A JP 3870112 B2 JP3870112 B2 JP 3870112B2
Authority
JP
Japan
Prior art keywords
exception
pei
dependency
instruction
arc
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
JP2002069221A
Other languages
English (en)
Other versions
JP2003280919A (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.)
International Business Machines Corp
Original Assignee
International Business Machines 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 International Business Machines Corp filed Critical International Business Machines Corp
Priority to JP2002069221A priority Critical patent/JP3870112B2/ja
Priority to US10/388,024 priority patent/US7197747B2/en
Publication of JP2003280919A publication Critical patent/JP2003280919A/ja
Application granted granted Critical
Publication of JP3870112B2 publication Critical patent/JP3870112B2/ja
Anticipated expiration legal-status Critical
Expired - Fee Related legal-status Critical Current

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR 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

【0001】
【発明の属する技術分野】
本発明は、コンパイル装置、コンパイル方法、及びコンパイル用プログラムに係り、詳しくは依存を緩和して投機実行を適格化するコンパイル装置、コンパイル方法、及びコンパイル用プログラムに関する。
【0002】
【従来の技術】
Javaのような型安全(type safe)な言語は、不正なメモリ・アクセスを起こさない、プログラマが意図しない異常なプログラム終了を起こさない、という性質を保証する。したがって、型安全な言語では、不正なメモリ・アクセスなどは行われず、結果として、プログラムがクラッシュするような実行はされない。このような型安全な言語がもつこれらの性質は、セキュリティの面からもプログラム言語において近年急速に重要性が増している。これらの性質を保証するためには、不正なアドレスを伴ったメモリアクセス命令、TLB(Translation Lookaside Buffer)ミス、などハードウェア例外によってプログラムを異常に終了させる可能性がある命令(hardware−initiated potentially exception instructions:H−PEI)の前に、プログラムを停止しないこと保証する例外チェックの命令(software−initiated potentially exception instructions:S−PEI)を挿入しなければならない。つまり、例外チェック命令の後にメモリアクセス命令を実行しなければならない、という命令間の依存が発生する。
【0003】
このような依存関係や、一般にプログラムが持つデータ依存及び制御依存は、命令の実行順序を交換するような最適化を阻害する。このような依存を緩和して命令実行の順序を交換可能にする投機的実行が知られている。投機的実行は、プログラムの実行が決定する前にある命令を実行することである。このとき、不正な値を伴ってメモリアクセス命令が実行されることもあるので、例外発生を抑制した実行をシステムでサポートする必要がある。
【0004】
型安全な言語では例外チェック命令が数多く存在するので、CやFortranのような型安全でない言語に比べて、投機実行を適用する機会が多い。しかし、型安全な言語の例外チェック命令に関する投機的実行を、プログラムの実行時間が短縮することを保証しながら効率よく適用する方法は知られていない。
【0005】
また、プレサイス例外セマンティクス(Precise exception semantics)を要求する言語の場合は、S−PEIの発生順序がプログラム最適化前後でも変わらないことを保証しなければならないので、一般にS−PEIの実行順序を交換する最適化は単純ではない。
【0006】
投機実行[先行文献1: M. D. Smith, M. S. Lam, and M. A. Horowitz. Boosting Beyond StaticScheduling in a Superscalar Processor. In Proceedings of the 17th AnnualInternational Symposium on Computer Architecture, pp. 344-354, 1990.]は、実際の実行が正しく行われるかどうかが決定する前に、早期に命令を実行することによって、プログラムの実行を高速化する方式として知られている。投機実行には、大きく2個の方法が知られている。一つは、制御投機(control speculation[先行文献2: S. A. Mahlke, W.Y. Chen, R. A. Bringmann, R. E. Hank, W. W. Hwu, B.R. Rau, and M. S. Schlansker. Sentinel scheduling: A model forcompiler-controlled speculative execution. ACM Transactions on ComputerSystems, 11(4), pp. 376-408, 1993.])である。これは、分岐命令とその後ろに連続する命令との制御依存を緩和する。コンパイラが、分岐命令を越えて頻繁に実行される命令を移動することを可能にする。もう一つは、データ投機(data speculation[先行文献3:D. M. Gallagher and W. Y. Chen and S. A. Mahlke and J. C. Gyllenhaaland W. W. Hwu. Dynamic memory disambiguation using the memory conflict buffer.In Proceedings of International Conference on Architectural Support forProgramming Languages and Operating Systems, pp. 183-193, 1994.])である。これは、メモリストア命令とメモリロード命令との間のデータ依存を緩和する。コンパイラが、メモリストア命令とメモリロード命令が別のアドレスをアクセスすると仮定して、メモリストア命令を越えてロード命令と後続する命令を移動する。
【0007】
これらの投機実行の研究は、型安全でない言語であるCやFortranを対象としている。型安全な言語を対象とした投機実行の研究は、唯一[先行文献4:M. Arnold, M. S. Hsiao, U. Kremer, and B. Ryder. Exploring theinteraction between Java's implicitly thrown exceptions and instruct]がある。この研究では、以下の手順でS−PEIを越えた投機実行を行う。
1.プログラムに存在するS−PEIを、比較命令と分岐命令に分解する。
2.制御の入り口が一つで出口が複数となるスーパー・ブロック(superblock)を形成する。
3.命令をノードとし、データ依存、制御依存の2個をアークとする、依存グラフを生成する。制御依存は、分岐命令から後続の全ての命令に持つことになる。
4.スーパー・ブロック(super block)内で、ジェネラル・パーコレーション(general percolation)を用いて分岐命令を越えた命令移動を行う。分岐命令を越えてH−PEIを移動した場合には、投機実行可能命令に変換する、分岐命令を越えて命令を移動した際には、依存グラフ上の制御依存は取り除かれる。
5.依存グラフ上で、命令レイテンシなどを考慮してリスト・スケジューリング(list scheduling)を行う。
【0008】
先行文献4の方法では、1.において、S−PEIを、通常の条件分岐に用いられる比較命令と分岐命令に変換する。そのため、2.以下で分岐命令に対する従来のスーパー・ブロック・スケジューリング(super block scheduling)のフレームワークを使うことができる、という利点がある。実際の適用例を、図1に示す。図1において、1番上の四角形内の例示プログラムはJava言語で記述されており、上から2番〜4番の四角形内のプログラムはアセンブリ言語で記述されている。コンパイラは、与えられたソース・プログラムから、中間表現を作成する。その後、上記の手順に沿って、投機実行可能なコードを生成する。まず、S−PEIを比較命令と分岐命令に分解する。ここでは、ヌルチェック命令(nullcheck)が、比較命令(cmp)と分岐命令(jmp)に分解されている。その後、スーパー・ブロックを形成し、依存グラフを形成する。さらに、スーパー・ブロック内で分岐命令を越えて命令を移動する。ここでは、N5,6,7がN4の分岐命令を越えて移動可能である。この際、N6はH−PEIなので、例外発生を抑制した投機ロード(speculative load)命令に変換する。(例外発生を抑制するとは、例外の発生を所定のハードウェアに通知しないことを意味する。ただし、例外の発生を、ハードウェアに通知しない代わりに、ソフト上のメモが行われる。)。さらに、N4からN5,6,7への制御依存を除去する。N8を、投機実行の例外状態のチェックのための番兵(sentinel)命令とするので、N8は分岐命令を越えて移動することはできない。この例では、N6’で例外発生が抑制された状態でN8を実行した際に、N6’から例外発生を抑制することなく命令列を再実行する。最後に、命令レイテンシ(instruction latency)を考慮してリスト・スケジューリング(list scheduling)を行う。なお、以降の図面関連説明では、命令レイテンシは、ロード命令(ld)及び投機的ロード命令(ld.s)が3、その他の命令は1、であると仮定する。図2において、左側の依存グラフは図1のチェック命令分解前のコンパイラの中間表現に対応する依存グラフ、右側の依存グラフは図1のリスト・スケジューリング後のコンパイラの中間表現に対応する依存グラフである。
【0009】
また、アーク除去による投機実行を採用する別の公知の方式としてGPDG(Guarded Program Dependence Graph)[先行文献5:古関、小松、深澤. 命令レベル並列アーキテクチャのための大域的コードスケジューリング手法とその評価、JointSymposium on Parallel Processing 1994, pp. 1-8, 1994]がある。GPDGは、命令をノードとし、制御依存、データ依存、及びリソース依存をアークとする、グラフから構成される。グラフによってプログラムの実行時間を表現できる、制御依存アークの除去による制御投機(control speculation)を扱うことができる。しかし、例外による制約を区別して表現していない。
【0010】
例外が発生する順序を緩和する研究として、[先行文献6:Manish Gupta, Jong-Deok Choi, and Michael Hind. Optimizing Javaprograms in the presence of exceptions. In Proceedings of the 14th EuropeanConference on Object-Oriented Programming (ECOOP'00), pp. 422-446, 2000.]がある。この研究では、エンクロージング例外ハンドラー(enclosing exception handler)の生存性(liveness)を調べ、副作用がある命令と、S−PEIの実行順序を交換する最適化、S−PEIを発生する命令とチェックする命令とを分割しS−PEIの発生順序を正しく保つことでS−PEIのチェック順序を交換可能にする最適化、について述べている。
【0011】
同様に例外を発生する順序を緩和する公知技術[先行文献7:稲垣、小松. 例外を起こす可能性のある命令の投機実行機構、及び投機的例外処理機構の設置方法、Docketnumber JA9-2000-0285]では、S−PEIによる例外を発生する命令とチェックする命令とを分割し、クリティカル・パスを短縮している。S−PEIによる例外をチェックする命令とH−PEIの間に依然依存関係は残る。
【0012】
【発明が解決しようとする課題】
先行文献4に記載された従来技術の問題点は次の通りである。
(a)S−PEIを汎用の比較命令と分岐命令とに分解するため、ブロック内の分岐の数が増え、プログラムの表現形式を複雑にし、コンパイル時間を増加させる可能性がある。図1の例では、元のプログラムには存在しなかった分岐命令が中間表現に新たに生成されてしまっている。これは、ジェネラル・パーコレーションの際に分岐命令を越えた命令移動を考慮する必要を生じる、などコンパイル時間を増加させる可能性を引き起こす。
(b)H−PEIは元々S−PEIにのみ依存を持つ。しかしS−PEIが汎用の分岐命令に分解されることで、データ依存と制御依存とに関するグラフを作成する際に、後続の全ての命令と依存を持つことになり、不要な制御依存が生成される。図1の例では、元々のnullcheck命令は後続のld r5=[r4]のみをガードするためのものである。しかし、一般の分岐命令に変換されたことで、後続の全ての命令に対して制御依存が生成されたことによって、不要な依存を引き起こす(図2の左側の依存グラフ)。
(c)正確な実行時間を見積もっていないので、実行時間を短縮しない投機的命令移動を起こすことがある。図1の例では、ジェネラル・パーコレーションによる命令移動は、命令レイテンシを考慮したリスト・スケジューリングの前に行われているので、移動可能な命令は全て移動されてしまう。したがって、この移動が実行時間を短縮できるのかどうかは、保証されていない。
(d)S−PEIを汎用の比較命令と分岐命令とに分解すると、S−PEI命令の実行順序交換は分岐命令の実行順序交換になるので、S−PEI命令自体の実行順序交換の最適化が困難になる。
【0013】
本発明は、上記(a)〜(d)の問題点を克服するコンパイル装置、コンパイル方法、及びコンパイル用プログラムを提供することである。
【0014】
【課題を解決するための手段】
本発明のコンパイル方法は次のステップを有している。
・ソース・プログラムから第1の中間表現プログラムを作成するステップであって、該第1の中間表現プログラムではプログラムを異常に終了させる可能性がある命令(以下、「H−PEI」と言う。)の前に、プログラムを停止しないことを保証する例外チェックの命令(以下、「S−PEI」と言う。)が挿入されているステップ
・第1の中間表現プログラムにおいて記述順の連続する複数個の命令を含むブロックを抽出するステップ
・該ブロックについての第1の依存グラフ情報を作成するステップであって、該第1の依存グラフ情報では、各命令をノードとして、依存関係にあるノード間にアークが設定され、アークは、例外依存に係るアーク(以下、「例外依存アーク」と言う。)が、例外依存以外の依存に係るアーク(以下、「非例外依存アーク」と言う。)に対して区別されているステップ
・実行時間に係る有利性基準に照らしてH−PEIのノードについてそれが例外依存アークを経由して実行された場合と該例外依存アークを経由しないで実行された場合とでどちらが有利かを判断するステップ
・H−PEIのノードについてそれが例外依存アークを経由しないで実行された場合の方が例外依存アークを経由して実行された場合より有利との判断があったときは該H−PEIのノードとその後ろに連続する1個以上のノードとを含む命令列が投機実行されるように例外依存アークの先端を別のノードへ変更した第2の依存グラフ情報を作成するステップ
・第2の依存グラフ情報に対応する中間表現プログラム部分(以下、該中間表現プログラム部分を「第1の中間表現プログラム部分」と言う。)をスケジューリングした中間表現プログラム部分(以下、該中間表現プログラム部分を「第2の中間表現プログラム部分」と言う。)を備える第2の中間表現プログラムを作成するステップ
・第2の中間表現プログラムに基づいてオブジェクト・プログラムを作成するステップ
【0015】
実行時間に係る有利性基準とは、例えば、プログラム全体の実行に要する時間に係る基準や、H−PEIの最早実行開始時間に係る有利性基準である。もし投機実行のための命令移動を行うならば、プログラム全体の実行に要する時間が短縮化されたり、H−PEIの最早実行開始時間が早まるときには、投機実行のための命令移動は有利と判断される。スケジューリングは、リスト・スケジューリングに限定されない。スケジューリングは、典型的に、リスト・スケジューリングであるが、これに限定されず、当業者にとり自明の種々のスケジューリングを採用できる。リスト・スケジューリング以外のその他のスケジューリングとしては、例えば、整数線形計画法を使ったスケジューリングである。好ましくは、スケジューリングは、ブロック内のプログラムのクリティカル・パスを最小とするリスト・スケジューリングである。クリティカル・パスは例えば各命令の命令レイテンシに基づいて算出される。また、非例外依存には、例えば、データ依存及び/又は制御依存が含まれるが、さらに、リソース依存が含まれてもよい。
【0016】
本発明のコンパイル方法は、特に、型安全な(type safe)なプログラム言語のコンパイル処理において優れた性能を発揮する。なお、「型安全な言語」とは、本明細書において、決められた演算しか行わない、すなわち不正なメモリ・アクセスは行わないプログラム言語として定義される。「型安全な言語」には、例えば、Java、Scheme、CLU、Modula−2、Modula−3、Oberon、Pascalなどがある。
【0017】
H−PEI及びその後ろに連続する1個以上の命令を含む命令列が、H−PEIの最早実行開始時間などの実行時間に係る有利性判断に基づいて投機実行のための移動が行われることにより、有利な投機実行を保証しつつ、H−PEIについての投機実行を実施できる。
【0018】
本発明のコンパイル方法には、さらに、次の特徴を付加することができる。
(a)遅くともスケジューリングより前に実行される第1の追加ステップを追加する。該第1の追加ステップでは、投機実行の実施のために先端を変更された例外依存アークの先端のノードに係る命令を番兵命令とし、投機実行対象のH−PEIが、その例外発生を抑制された状態で番兵命令が実行されたときには、投機実行の対象となった命令列を、例外発生を抑制することなく再実行するように、第1の中間表現プログラム部分内の命令列を生成する。
(b)遅くともスケジューリングより前に実行される第2の追加ステップを追加する。該第2の追加ステップでは、投機実行の実施のために先端を変更された例外依存アークの先端のノードに係る命令をチェック命令とし、投機実行の対象となった命令列のコピーを回復コードとしてチェック命令の後に配置し、チェック命令では、投機実行対象のH−PEIにおいて例外発生が抑制されたか否かを判定し、該判定が正であれば、回復コードを実施するように、第1の中間表現プログラム部分内の命令列を生成する。
(c)第1の依存グラフ情報には、S−PEIからそのS−PEIの次に順番の早いS−PEIへ例外依存アーク(以下、この例外依存アークを「S−PEI間例外依存アーク」と言う。)の設定情報を含ませる。遅くともスケジューリングより前に実行される第3及び第4の追加ステップを追加する。第3の追加ステップでは、S−PEI間例外依存アークの両端ノードに係る例外の種類が同一である場合には、該S−PEI間例外依存アークを除去し、また、S−PEI間例外依存アークの両端ノードに係る例外の種類が異なる場合には、該S−PEI間例外依存アークをそのまま残す。第4の追加ステップでは、第2の依存グラフ情報に、第3の追加ステップにおけるS−PEI間例外依存アークの変更を含ませる。
【0019】
「例外の種類」の「例外」とは、例外命令(例:図12のN1,N4,N7のnullcheck)が発生する例外を意味する。S−PEIが関与する例外の種類には、入力値チェック、配列インデックス・チェックなどがあり、S−PEI間例外依存アークの両端のノードに係るS−PEIが同一であれば、当然に例外の種類が同一と判断されるだけでなく、S−PEI間例外依存アークの両端のノードに係るS−PEIが異なっていても、両S−PEIが、共に、例えば、入力チェックに係るものであるなどであれば、例外の種類が同一と判断される。
【0020】
本発明のコンパイル装置は次のものを有している。
・ソース・プログラムから第1の中間表現プログラムを作成する手段であって、該第1の中間表現プログラムではプログラムを異常に終了させる可能性がある命令(以下、「H−PEI」と言う。)の前に、プログラムを停止しないことを保証する例外チェックの命令(以下、「S−PEI」と言う。)が挿入されている手段
・第1の中間表現プログラムにおいて記述順の連続する複数個の命令を含むブロックを抽出する手段
・該ブロックについての第1の依存グラフ情報を作成する手段であって、該第1の依存グラフ情報では、各命令をノードとして、依存関係にあるノード間にアークが設定され、アークは、例外依存に係るアーク(以下、「例外依存アーク」と言う。)が、例外依存以外の依存に係るアーク(以下、「非例外依存アーク」と言う。)に対して区別されている手段
・実行時間に係る有利性基準に照らしてH−PEIのノードについてそれが例外依存アークを経由して実行された場合と該例外依存アークを経由しないで実行された場合とでどちらが有利かを判断する手段
・H−PEIのノードについてそれが例外依存アークを経由しないで実行された場合の方が例外依存アークを経由して実行された場合より有利との判断があったときは該H−PEIのノードとその後ろに連続する1個以上のノードとを含む命令列が投機実行されるように例外依存アークの先端を別のノードへ変更した第2の依存グラフ情報を作成する手段
・第2の依存グラフ情報に対応する中間表現プログラム部分(以下、該中間表現プログラム部分を「第1の中間表現プログラム部分」と言う。)をスケジューリングした中間表現プログラム部分(以下、該中間表現プログラム部分を「第2の中間表現プログラム部分」と言う。)を備える第2の中間表現プログラムを作成する手段
・第2の中間表現プログラムに基づいてオブジェクト・プログラムを作成する手段
【0021】
本発明のコンパイル用プログラムはコンピュータに次のステップを実行させる。
・ソース・プログラムから第1の中間表現プログラムを作成するステップであって、該第1の中間表現プログラムではプログラムを異常に終了させる可能性がある命令(以下、「H−PEI」と言う。)の前に、プログラムを停止しないことを保証する例外チェックの命令(以下、「S−PEI」と言う。)が挿入されているステップ
・第1の中間表現プログラムにおいて記述順の連続する複数個の命令を含むブロックを抽出するステップ
・該ブロックについての第1の依存グラフ情報を作成するステップであって、該第1の依存グラフ情報では、各命令をノードとして、依存関係にあるノード間にアークが設定され、アークは、例外依存に係るアーク(以下、「例外依存アーク」と言う。)が、例外依存以外の依存に係るアーク(以下、「非例外依存アーク」と言う。)に対して区別されているステップ
・実行時間に係る有利性基準に照らしてH−PEIのノードについてそれが例外依存アークを経由して実行された場合と該例外依存アークを経由しないで実行された場合とでどちらが有利かを判断するステップ
・H−PEIのノードについてそれが例外依存アークを経由しないで実行された場合の方が例外依存アークを経由して実行された場合より有利との判断があったときは該H−PEIのノードとその後ろに連続する1個以上のノードとを含む命令列が投機実行されるように例外依存アークの先端を別のノードへ変更した第2の依存グラフ情報を作成するステップ
・第2の依存グラフ情報に対応する中間表現プログラム部分(以下、該中間表現プログラム部分を「第1の中間表現プログラム部分」と言う。)をスケジューリングした中間表現プログラム部分(以下、該中間表現プログラム部分を「第2の中間表現プログラム部分」と言う。)を備える第2の中間表現プログラムを作成するステップ
・第2の中間表現プログラムに基づいてオブジェクト・プログラムを作成するステップ
【0022】
本発明のコンパイル用プログラムは、型安全な言語で記述されている必要はない。コンパイル用プログラム自体の言語は、Javaのような型安全な言語であっても、また、C言語のような型安全でない言語であってもよいとする。
【0023】
【発明の実施の形態】
以下、発明の実施の形態について図面を参照して説明する。
図3はS−PEIを越えた投機実行を行う処理手順のフローチャートである。S10では、制御の入り口が一つで出口が一つ以上となるブロック(block)を形成する。なお、ブロックには、例えば、基本ブロック(basic block)、スーパー・ブロック(super block)、及びハイパー・ブロック(hyperblock)などがある。これらブロックでは、入り口は1個である。出口は、基本ブロックでは1個、スーパー・ブロック及びハイパー・ブロックでは1個以上となっている。ハイパー・ブロックは内部に合流部をもつ。合流部とは、例えば、if〜then〜elseの次の命令のように、制御がthen部及びelse部から共通に流れる命令である。また、2以上の出口とは、ブロック内の中間部にbranchなどの命令が存在することにより形成される。概念上、スーパー・ブロックは基本ブロックを包摂する。S10におけるブロックは、基本ブロック、スーパー・ブロック、及びハイパー・ブロックのどれでもよい。S11では、命令をノードとし、データ依存、制御依存、及び例外依存の3つをアークとする依存グラフを生成する。例外依存は、S−PEIとH−PEI間に生成する。プレサイス例外セマンティクス(Precise exception semantics)を要求する言語の場合は、例外の発生順序を保証するために、S−PEIとS−PEIの間にも例外依存を生成する。S12では、S−PEIからの例外依存をもつH−PEIノードについて、データ依存、制御依存、及び例外依存のそれぞれによって決定される最早実行開始時間を比較する。例外依存によって決定される最早実行開始時間が他より遅い場合にのみ、投機的命令移動を適用して、例外依存のアークを番兵命令へ張り替える。本発明は、投機実行の例外状態の復帰方式として、回復コード(recovery code)無しの場合にも、回復コード有りの場合にも適用可能である。回復コード有りの場合には、ここで回復コードも生成する。S13では、S−PEIからの例外依存を持つS−PEIノードについて、アークの両端のノードで発生する例外の種類が同じならばアークを除去する。S14では、依存グラフ上で、命令レイテンシなどを考慮してリスト・スケジューリング(list scheduling)を行う。
【0024】
図4は例外依存アークを生成する手順をプログラム記述形式で示している。図4において、srcはソース(source)、dstはデスティネーション(destination)を意味する。foreachは、( )内の集合に含まれる各要素について1個ずつ{ }内の処理を実施することを意味する。ブロック内の各H−PEI命令について、そのソース・オペランドをデスティネーション・オペランドとしてもつ先行の命令が調べ上げられ、そのデスティネーション・オペランドから到達するソース・オペランドを持つ命令がS−PEI命令であるならば、そのS−PEI命令とH−PEI命令との間に例外依存アークを張る。図4の下3行の命令列の意義は次の通りである。H−PEIへ例外依存を張るS−PEIは1個とは限らない。そのため、データ依存をたどりながら、H−PEIで使用される値を生成する命令(new/newarray/getfield/getstaticなどのオブジェクトを生成する命令)に到達するまで存在するS−PEIを調べる必要がある。対象のH−PEIで使用されるオペランドを生成する命令に到達するまでデータ依存をたどるのが、この3行の命令列である。
【0025】
プレサイス例外セマンティクスを要求する言語の場合は、例外発生の順序を決定するためにS−PEIとS−PEIの間にも例外依存アークを生成する。これは以下の手順で生成可能である。図5は例外発生の順序を決定するためにS−PEIとS−PEIの間にも例外依存アークを生成する手順をプログラム記述形式で示している。ブロック内の各命令について、逆戻り順(前の命令から後ろの命令の方へ。reverse post order)で命令が調べ上げられ、S−PEI命令に行き当たると、それをisとし、isより後ろの各命令について逆戻り順で、S−PEI命令を探し、最初に探し当てたS−PEI命令をieとして、isとieとの間に例外依存アークを張る。
【0026】
図6は本発明を適用したコンパイラによる処理過程の説明図、図7は図6の処理過程に対応して作成される依存グラフである。図6の一番上の四角内のJavaのプログラムは、コンパイラが処理するソース・プログラムである。Javaのソース・プログラムは、型安全な言語で記述されたソース・プログラムとして本発明の説明のために選択されている。コンパイラは、ソース・プログラムから中間表現のプログラム(このプログラムより図3のS10のブロック抽出を行ったものが例えば図6の上から2番目の四角内のプログラム部分となる。)を作成する。この中間表現プログラムでは、H−PEI(N5のld)に対して、プログラムが異常終了しないことを保証するS−PEI(N3のnullcheck)がこのH−PEIより前に挿入される。中間表現プログラム部分に対して図4及び図5の処理が実行されることにより、図7の左側の依存グラフが作成される。この依存グラフにおいて、S−PEIからの例外依存を持つH−PEIのノードについて、データ依存、制御依存、例外依存から決定される最早実行開始時間を求める。これは、依存グラフ上で、グラフの始点から当該ノードまでアークが持つ重みによって決まる最早実行開始時間を蓄積していくことより求められる。アークの重みは、データ依存及び制御依存では命令のレイテンシに等しい。例外依存のアークの重みは0である。例では、N5について依存から制約される時間を求めると、データ依存によって決定される最早実行開始時間は5(=1+3+1)であり、例外依存によって決定される最早実行開始時間は4=(1+3+0)、であることが分かる。例外依存によって決定される最早実行開始時間の方が速いので、例外依存による制約を除去しても、この命令の実行開始時間は早くならないことが分かる。したがって、この場合、投機的命令移動を適用しない。不必要な投機的命令移動は、不要なデータ・キャッシュのmissを引き起こす、TLB(Translation Lookaside Buffer)ミスによる命令再実行のオーバヘッド、など性能を落とす原因を引き起こすので、避けなければならない。次に、図7の左側の依存グラフにおいて、交換可能なS−PEIノード、すなわち、S−PEIからの例外依存を持つS−PEIのノードを探す。この2個のノードが発生する例外の種類が同じで、例外を捕捉した時点で観測できる状態を変更する命令がこの2個のノード間に無いならば、例外依存アークを除去できる。例外を捕捉した時点で観測できる状態を変更する命令とは、例外ハンドラの中で参照される変数への書き込み、配列・インスタンス変数・クラス変数への書き込みなどである。配列・インスタンス変数・クラス変数への書き込みについては、前述した先行文献6のように、enclosing exception handlerの生存性(liveness)を調べてより正確に判断することもできる。この例ではS−PEIが1個しかないので、交換はできない。こうして、図7の右側の依存グラフが作成される。最後に、図7の右側の依存グラフに基づいて命令レイテンシを考慮したリスト・スケジューリングを行って、図6の上から3番目の中間表現を得る。この3番目の中間表現は、2番目の中間表現に対して、N3とN4との順番が入れ替わっているが、N3の命令レイテンシは0であるので、特に入れ替えなくてもよい。リスト・スケジューリングは、例えば、プログラム全体の実行に要する時間を短縮させること及び/又は各命令の最早実行開始時間が早まることを目的に、実施される。
【0027】
別のソース・プログラムに本発明に準拠するコンパイラを使用したときのコンパイルの実施例を説明する。関連図は図8及び図9である。図8はコンパイラによる処理過程の説明図、図9は図8の処理過程に対応して作成される依存グラフである。この実施例では、Javaプログラムにおいて、投機実行の例外状態の復帰方式として回復コード(recovery code)無しの場合を示す。前述しているが、回復コード無しの場合とは、自前で回復コードを作成せずに、作成済みとなっている汎用のコードを使用する場合を意味し、自前での回復コードの作成は省略する。まず、ブロック(この例では基本ブロック)を形成する。図8の第1段階中間表現は、このブロックにおける命令リストを示している。次に、第1段階中間表現に基づいて、データ依存、制御依存、及び例外依存からなる依存グラフ(図9の左側の依存グラフ)を形成する。この依存グラフを生成する際に、例外依存は、S−PEIとS−PEI、S−PEIとH−PEIの間に生成する。この例では、S−PEIとS−PEIの例外依存をN1→N3(N1のnewarray命令も例外を生成する可能性があるS−PEI命令である)に、S−PEIとH−PEIの依存をN3→N6に生成する。次に、S−PEIノードからの例外依存を持つH−PEIノードについて、データ依存、制御依存、及び例外依存から決定される最早実行開始時間を求める。この場合は、N6について依存から制約される時間を求めると、データ依存によって決定される最早実行開始時間は3、例外依存によって決定される最早実行開始時間は4、であることが分かる。例外依存によって決定される最早実行開始時間の方が遅いので、例外依存による制約を除去すると、この命令の実行開始時間は早くなることが分かる。したがって、この場合投機的命令移動を適用する。ここでは、N6とN7を投機的命令移動の対象として、N8を番兵(sentinel)命令とする。H−PEIであるN6を投機的命令移動したので、N6において、load命令(ld)をspeculative load命令(ld.s)に変換する。さらに、N3からN6への例外依存を除去して、N3からsentinelのN8に張り直す(図9の右側の依存グラフを参照。)。この例では、N1→N3にS−PEI間のアークが存在するが、N1が発生する例外とN3が発生する例外は異なるので、アークを除去することはできない。こうして、図9の右側依存グラフに対応する、図8の第2段階中間表現が作成される。最後に、第2段階中間表現を、命令レイテンシを考慮してリスト・スケジューリングすることにより、図8の第3段階中間表現が完成する。この例では、N6で例外発生が抑制された状態でN8を実行したときは、N6から例外発生を抑制することなく命令列を再実行する。このように、回復コード無しの場合は、後述の図10の第2段階中間表現のN10〜N12のようなリカバリ(回復)専用のコードを用意しない代わりに、所定の命令(例:図8のN8のret)にリカバリ時の機能を適宜、付与して、リカバリ対策を施している。クリティカル・パス長(ブロック内の最終の命令に到達する最長経路長であって、経路長は命令レイテンシのに基づいて算出する。)は、図8の左側の依存グラフでは、8=(1+3+0+3+1)であったが、右側の依存グラフでは、7=(1+1+1+3+1)に短縮される。
【0028】
次に、投機実行の例外状態の復帰方式として回復コード有りの場合のJavaプログラムのコンパイル例について説明する。関連図は図10及び図11である。まず、ブロック(この例では基本ブロック)を形成して、図10の第1段階中間表現を得る。次に、この第1段階中間表現に基づいてデータ依存、制御依存、及び例外依存からなる依存グラフ(図11の左側の依存グラフ)を形成する。この依存グラフを生成する際に、例外依存は、S−PEIとS−PEI、S−PEIとH−PEIの間に生成する。この例では、S−PEIとS−PEIの例外依存をN1→N3に、S−PEIとH−PEIの依存をN3→N6に生成する。次に、S−PEIからの例外依存を持つH−PEIノードについて、データ依存、制御依存、及び例外依存から決定される最早実行開始時間を求める。この場合は、N6について依存から制約される時間を求めると、データ依存によって決定される最早実行開始時間は3、例外依存によって決定される最早実行開始時間は4、であることが分かる。例外依存によって決定される最早実行開始時間の方が遅いので、例外依存による制約を除去すると、この命令の実行開始時間は早くなることが分かる。したがって、この場合、投機的命令移動を適用する。ここでは、N6とN7を投機的命令移動の対象とする。H−PEIであるN6を投機的命令移動したので、N6において、load命令(ld)をspeculative load命令(ld.s)に変換する。speculative load命令で例外が抑制されたかどうか調べ、recovery codeを実行するかどうかを判断するchk命令(chk.s)をN9として追加する。さらに、投機的命令移動の対象としたN6とN7をコピーして、回復コードのためにN10,N11として追加する。この際speculative load命令は通常のload命令に変換される。最後に、回復コードから戻るためのbranch命令(b)をN12として追加する。アークに関しては、N3からN6への例外依存を除去して、N3からN9に張り直す。N9では、例外が抑制されたかどうかを調べるためにt6を読むので、N7からN9へデータ依存のアークを張る。回復コード内のN10はt4を読むので、N5からN10へデータ依存のアークを張る。N11で定義されたt6はN8で読まれるので、N11からN8へデータ依存のアークを張る。さらに、chk命令が正しい位置にscheduleされるように、N9からN8へ制御依存のアークを張る。ここでは、chk命令のレイテンシを0とすると、アークの重みは0となる。この例では、N1→N3にS−PEI間のアークが存在するが、N1が発生する例外とN3が発生する例外は異なるので、アークを除去することはできない。こうして、図11の右側の依存グラフに対応する図10の第2段階中間表現が完成する.最後に、命令レイテンシを考慮してリスト・スケジューリングを行い、図10の第3段階中間表現を得る.ただし、N10,N11,N12から構成される回復コードはまれにしか実行されないと考えられるので、N1〜9からなる頻繁に実行されるコードと分けてリスト・スケジューリングを適用する。さらに頻繁に実行されるコードのリスト・スケジューリングの際には、回復コードから流入するアークを無視する。本発明適用前に8=(1+3+0+3+1)であったクリティカル・パス長は、7=(1+1+1+3+1)に短縮されている。
【0029】
次に、JavaプログラムのコンパイルにおいてS−PEIの実行順序を交換できる例を示す。関連図は図12及び図13である.コンパイラは、図12のJavaプログラムのコンパイルを行う。まずブロック(この例では基本ブロック)を形成して、図12の第1段階中間表現を得る。次に、データ依存、制御依存、及び例外依存からなる依存グラフ(図13の左側依存グラフ)を形成する。依存グラフを生成する際に、例外依存は、S−PEIとS−PEI、S−PEIとH−PEIの間に生成する。この例では、S−PEIとS−PEIの例外依存をN1→N4→N7に、S−PEIとH−PEIの依存をN1→N3,N4→N6,N7→N9に生成する。次に、S−PEIからの例外依存を持つH−PEIノードについて、データ依存、制御依存、及び例外依存から決定される最早実行開始時間を求める。この場合は、N3,N6,N9ともに、データ依存によって決定される最早実行開始時間は例外依存によって決定される最早実行開始時間より遅いことが分かる。したがって、この場合投機的命令移動を適用しない。この例では、N1→N4→N7にS−PEI間のアークが存在し、N1が発生する例外とN4が発生する例外とN7が発生する例外が同じNullpointerExceptionで、この3つのノード間に例外を捕捉した時点で観測できる状態を変更する命令は存在しないので、例外依存によるアークを除去する。このような処理を経て変更された依存グラフが図13の右側の依存グラフであり、この依存グラフに対応するプログラムが図12の第2段階中間表現である。最後に、第2段階中間表現を基に、命令レイテンシを考慮してリスト・スケジューリングを行い、第3段階中間表現を得る。クリティカル・パス長は、第1段階中間表現では、10=(0+1+3+0+0+3+1+1+1){引数a→N2→N3→N4→N7→N9→N10→N11→N12→N13}であるのに対し、リスト・スケジューリング後の第3段階中間表現では、9=(0+1+3+1+3+1){引数a→N2→N3→N5→N6→N12→N13}に短縮される。
【0030】
所定のJavaソース・プログラムに対し投機実行の例外状態の復帰方式として回復コード有りのコンパイルを本発明準拠のコンパイラと従来方式のコンパイラとで行った場合、SPECjvm98ベンチマークのcompress,mpegaudio,dbで約8%の性能向上が得られた。SPECjvm98ベンチマークを実行した場合、1070個のメソッドが実行された。このときのDAG内のノードとアークの数を図14に示す。従来方式では、S−PEI命令でPDGを分割し、後続PDGと例外ハンドラへアークを張った。本発明準拠のコンパイラの方が、PDGノード、合計アーク数の両方において、従来方式より総数が少ないことが分かる。したがって、コンパイル時に要求されるメモリ量が少ない。また、1個のPDGノードが含む命令数が約4倍多い。このことより、従来技術において本発明と同様の効果を得るためには、トレース・スケジューリング(trace scheduling)やパーコレーション・スケジューリング(percolation scheduling)のようなより時間のかかるグローバル・コード・モーション(global code motion)を適用しなければならない。このことからも本発明はコンパイル時の効率を上げることが可能になる。
【0031】
図15はコンパイル装置20の機能ブロック図である。第1の中間表現プログラム作成手段24は、Javaなどの型安全な言語で記述されたソース・プログラムより第1の中間表現プログラムを作成する。第1の中間表現プログラムでは、プログラムを異常に終了させる可能性がある命令としてのS−PEI(例:図8の第1段階中間表現のN6)の前に、プログラムを停止しないことを保証する例外チェックの命令としてのS−PEI(例:図8の第1段階中間表現のN3)が挿入されている。ブロック抽出手段25は、第1の中間表現プログラムにおいて記述順の連続する複数個の命令を含むブロック(例:図8の第1段階中間表現)を抽出する。第1の依存グラフ情報作成手段26は、ブロック抽出手段25が抽出したブロックの中間表現プログラム部分についての第1の依存グラフ情報(例:図9の左側の依存グラフに係る情報)を作成する。第1の依存グラフ情報では、各命令をノードとして、依存関係にあるノード間にアークが設定され、アークは、例外依存に係るアークとしての例外依存アーク(例:図9において軸部が点線の矢印)が、データ依存や制御依存などの例外依存以外の依存に係るアークとしての非例外依存アークに対して区別されている。S−PEI間例外依存アーク設定手段27は、S−PEIからそのS−PEIの次に順番の早いS−PEIへの例外依存アークとしてのS−PEI間例外依存アーク(例:図9の左側の依存グラフにおけるN1からN3への矢印)の設定情報を、第1の依存グラフ情報作成手段26における第1の依存グラフ情報に付加する。有利性判断手段30は、第1の依存グラフ情報作成手段26が作成した第1の依存グラフ情報において、実行時間に係る有利性基準に照らしてH−PEIのノードについてそれが例外依存アークを経由して実行された場合とこの例外依存アークを経由しないで実行された場合とでどちらが有利かを判断する。実行時間に係る有利性基準とは、例えば、H−PEIの最早実行開始時間に係る有利性基準であり、H−PEIの最早実行開始時間が、例外依存アークを経由して実行されるときよりも、例外依存アークを経由しないで実行されるときの方が、早まるならば、投機実行のための命令移動を実施すべきと判断する。
【0032】
第2の依存グラフ情報作成手段31は、H−PEIのノードについてそれが例外依存アークを経由しないで実行された場合の方が例外依存アークを経由して実行された場合より、実行時間に係る有利性基準に照らして有利との判断があったときは、このH−PEIのノード及びその後ろに連続する幾つかのノードに対応の命令の列が投機実行されるように例外依存アークの先端を別のノードへ変更し、この変更に対応する第2の依存グラフ情報(例:図9の右側の依存グラフに係る情報)を作成する。第1の復帰設定手段34及び第2の復帰設定手段35は、中間表現プログラム部分の各ブロックに対してはいずれか一方のみが関与する。すなわち、コンパイル装置20は、第1の復帰設定手段34及び第2の復帰設定手段35の一方のみを装備してもよいし、両方を装備して、或るブロックに対しては第1の復帰設定手段34を関与させ、また、別のブロックに対しては第2の復帰設定手段35を関与させることもできる。第1の復帰設定手段34は中間表現プログラム部分のブロックに対して回復コード無しの処理を行うものであり、第2の復帰設定手段35は中間表現プログラム部分のブロックに対して回復コード有りの処理を行うものである。第1の復帰設定手段34は、有利性判断手段30の判断の結果、投機実行の実施のために先端を変更された例外依存アークの先端のノード(例:図9の右側依存グラフのN8)に係る命令を番兵命令とし、投機実行対象のH−PEI(例:図9の右側依存グラフのN6)が、その例外発生を抑制された状態で番兵命令が実行されたときには、投機実行の対象となった命令列(例:図9の右側依存グラフのN6,N7)を、例外発生を抑制することなく、再実行するように、第1の中間表現プログラム部分内(例:図8の第2段階中間表現)の命令列を編集する。なお、図8の第2段階中間表現のN8は、図8の第1段階中間表現のN8と同様に、ret(return)と同一表現となっているが、番兵命令としての機能を付与されたretとなっている。また、第2の復帰設定手段35は、有利性判断手段30の判断の結果、投機実行の実施のために先端を変更された例外依存アークについて、その変更後例外依存アークの先端のノード(図11の右側依存グラフのN9)に係る命令をチェック命令とし、投機実行の対象となった命令列のコピーを回復コードとしてチェック命令の後に配置する(例:図11の右側依存グラフのN10,N11)。ただし、このコピーでは、投機命令へ変更した命令(例:図10のN6のld.s)は、元の通常の命令(例:ld)へ戻す。ブロック抽出手段25は第1の中間表現プログラム部分内(例:図10の第2段階中間表現)の命令列について編集し、この編集では、チェック命令(例:図11の右側依存グラフのN9)において、投機実行対象のS−PEI(例:N6)において例外発生が抑制されたか否かを判定し、この判定が正であれば、回復コード(例:N10,N11)を実施する。S−PEI間例外依存アーク変更手段36は、S−PEI間例外依存アークの両端ノードに係る例外の種類が同一である場合には、このS−PEI間例外依存アークを除去し(例:図13の左右依存グラフにおけるN4→N7に注目)、また、S−PEI間例外依存アークの両端ノードに係る例外の種類が異なる場合には、このS−PEI間例外依存アークをそのまま残すように(例:図13の左右依存グラフにおけるN2→N4に注目)、第2の依存グラフ情報を変更する(例:図13の右側依存グラフ)。第2の中間表現プログラム作成手段37は、第1の中間表現プログラム部分をリスト・スケジューリングした中間表現プログラム部分としての第2の中間表現プログラム部分(例:図8、図10、及び図13のリスト・スケジューリング後のコンパイラの中間表現)から成る全体の第2の中間表現プログラムを作成する。リスト・スケジューリングは、例えば、ブロック内のプログラムのクリティカル・パスが最小となる観点で行われる。オブジェクト・プログラム作成手段38は、第2の中間表現プログラム作成手段37が作成した第2の中間表現プログラムに基づいてオブジェクト・プログラムを作成する。
【0033】
まとめとして本発明のコンパイル装置及びコンパイル用プログラムの構成に関して以下の事項を開示する。
(1)ソース・プログラムから第1の中間表現プログラムを作成する手段であって、該第1の中間表現プログラムではプログラムを異常に終了させる可能性がある命令(以下、「H−PEI」と言う。)の前に、プログラムを停止しないことを保証する例外チェックの命令(以下、「S−PEI」と言う。)が挿入されている手段、
第1の中間表現プログラムにおいて記述順の連続する複数個の命令を含むブロックを抽出する手段、
該ブロックについての第1の依存グラフ情報を作成する手段であって、該第1の依存グラフ情報では、各命令をノードとして、依存関係にあるノード間にアークが設定され、アークは、例外依存に係るアーク(以下、「例外依存アーク」と言う。)が、例外依存以外の依存に係るアーク(以下、「非例外依存アーク」と言う。)に対して区別されている手段、
実行時間に係る有利性基準に照らしてH−PEIのノードについてそれが例外依存アークを経由して実行された場合と該例外依存アークを経由しないで実行された場合とでどちらが有利かを判断する手段、
H−PEIのノードについてそれが例外依存アークを経由しないで実行された場合の方が例外依存アークを経由して実行された場合より有利との判断があったときは該H−PEIのノードとその後ろに連続する1個以上のノードとを含む命令列が投機実行されるように例外依存アークの先端を別のノードへ変更した第2の依存グラフ情報を作成する手段、及び
第2の依存グラフ情報に対応する中間表現プログラム部分(以下、該中間表現プログラム部分を「第1の中間表現プログラム部分」と言う。)をスケジューリングした中間表現プログラム部分(以下、該中間表現プログラム部分を「第2の中間表現プログラム部分」と言う。)を備える第2の中間表現プログラムを作成する手段、及び
第2の中間表現プログラムに基づいてオブジェクト・プログラムを作成する手段
を有しているコンパイル装置。
(2)実行時間に係る有利性基準とは、H−PEIの最早実行開始時間に係る有利性基準である(1)記載のコンパイル装置。
(3)スケジューリングは、ブロック内のプログラムのクリティカル・パスを最小とするリスト・スケジューリングである(1)又は(2)記載のコンパイル装置。
(4)非例外依存にはデータ依存及び/又は制御依存が含まれる(1)〜(3)のいずれかに記載のコンパイル装置。
(5)投機実行の実施のために先端を変更された例外依存アークの先端のノードに係る命令を番兵命令とし、投機実行対象のH−PEIが、その例外発生を抑制された状態で番兵命令が実行されたときには、投機実行の対象となった命令列を、例外発生を抑制することなく再実行するように、第1の中間表現プログラム部分内の命令列を生成する手段、
を有している(1)〜(4)のいずれかに記載のコンパイル装置。
【0034】
(6)投機実行の実施のために先端を変更された例外依存アークの先端のノードに係る命令をチェック命令とし、投機実行の対象となった命令列のコピーを回復コードとしてチェック命令の後に配置し、チェック命令では、投機実行対象のH−PEIにおいて例外発生が抑制されたか否かを判定し、該判定が正であれば、回復コードを実施するように、第1の中間表現プログラム部分内の命令列を生成する手段、
を有している(1)〜(4)のいずれかに記載のコンパイル装置。
(7)第1の依存グラフ情報には、S−PEIからそのS−PEIの次に順番の早いS−PEIへ例外依存アーク(以下、この例外依存アークを「S−PEI間例外依存アーク」と言う。)の設定情報を含ませる手段、及び
S−PEI間例外依存アークの両端ノードに係る例外の種類が同一である場合には、該S−PEI間例外依存アークを除去し、また、S−PEI間例外依存アークの両端ノードに係る例外の種類が異なる場合には、該S−PEI間例外依存アークをそのまま残すように、第2の依存グラフ情報を変更する手段、
を有している(1)〜(7)のいずれかに記載のコンパイル装置。
(8)ソース・プログラムから第1の中間表現プログラムを作成するステップであって、該第1の中間表現プログラムではプログラムを異常に終了させる可能性がある命令(以下、「H−PEI」と言う。)の前に、プログラムを停止しないことを保証する例外チェックの命令(以下、「S−PEI」と言う。)が挿入されているステップ、
第1の中間表現プログラムにおいて記述順の連続する複数個の命令を含むブロックを抽出するステップ、
該ブロックについての第1の依存グラフ情報を作成するステップであって、該第1の依存グラフ情報では、各命令をノードとして、依存関係にあるノード間にアークが設定され、アークは、例外依存に係るアーク(以下、「例外依存アーク」と言う。)が、例外依存以外の依存に係るアーク(以下、「非例外依存アーク」と言う。)に対して区別されているステップ、
実行時間に係る有利性基準に照らしてH−PEIのノードについてそれが例外依存アークを経由して実行された場合と該例外依存アークを経由しないで実行された場合とでどちらが有利かを判断するステップ、
H−PEIのノードについてそれが例外依存アークを経由しないで実行された場合の方が例外依存アークを経由して実行された場合より有利との判断があったときは該H−PEIのノードとその後ろに連続する1個以上のノードとを含む命令列が投機実行されるように例外依存アークの先端を別のノードへ変更した第2の依存グラフ情報を作成するステップ、及び
第2の依存グラフ情報に対応する中間表現プログラム部分(以下、該中間表現プログラム部分を「第1の中間表現プログラム部分」と言う。)をスケジューリングした中間表現プログラム部分(以下、該中間表現プログラム部分を「第2の中間表現プログラム部分」と言う。)を備える第2の中間表現プログラムを作成するステップ、及び
第2の中間表現プログラムに基づいてオブジェクト・プログラムを作成するステップ、
をコンピュータに実行させるためのコンパイル用プログラム。
(9)実行時間に係る有利性基準とは、H−PEIの最早実行開始時間に係る有利性基準である、ステップをコンピュータに実行させるための(8)記載のコンパイル用プログラム。
(10)スケジューリングは、ブロック内のプログラムのクリティカル・パスを最小とするリスト・スケジューリングである、ステップをコンピュータに実行させるための(8)又は(9)記載のコンパイル用プログラム。
【0035】
(11)非例外依存にはデータ依存及び/又は制御依存が含まれる、ステップをコンピュータに実行させるための(8)〜(10)のいずれかに記載のコンパイル用プログラム。
(12)遅くともスケジューリングより前に実行される第1の追加ステップを追加し、
該第1の追加ステップでは、
投機実行の実施のために先端を変更された例外依存アークの先端のノードに係る命令を番兵命令とし、
投機実行対象のH−PEIが、その例外発生を抑制された状態で番兵命令が実行されたときには、投機実行の対象となった命令列を、例外発生を抑制することなく再実行するように、第1の中間表現プログラム部分内の命令列を生成する、
ステップをコンピュータに実行させるための(8)〜(11)のいずれかに記載のコンパイル用プログラム。
(13)遅くともスケジューリングより前に実行される第2の追加ステップを追加し、
該第2の追加ステップでは、
投機実行の実施のために先端を変更された例外依存アークの先端のノードに係る命令をチェック命令とし、
投機実行の対象となった命令列のコピーを回復コードとしてチェック命令の後に配置し、
チェック命令では、投機実行対象のH−PEIにおいて例外発生が抑制されたか否かを判定し、
該判定が正であれば、回復コードを実施するように、第1の中間表現プログラム部分内の命令列を生成する、
ステップをコンピュータに実行させるための(8)〜(11)のいずれかに記載のコンパイル用プログラム。
(14)第1の依存グラフ情報には、S−PEIからそのS−PEIの次に順番の早いS−PEIへ例外依存アーク(以下、この例外依存アークを「S−PEI間例外依存アーク」と言う。)の設定情報を含ませ、
遅くともスケジューリングより前に実行される第3及び第4の追加ステップを追加し、
第3の追加ステップでは、
S−PEI間例外依存アークの両端ノードに係る例外の種類が同一である場合には、該S−PEI間例外依存アークを除去し、また、S−PEI間例外依存アークの両端ノードに係る例外の種類が異なる場合には、該S−PEI間例外依存アークをそのまま残し、
第4の追加ステップでは、
第2の依存グラフ情報に、第3の追加ステップにおけるS−PEI間例外依存アークの変更を含ませる、
ステップをコンピュータに実行させるための(8)〜(13)のいずれかに記載のコンパイル用プログラム。
【0036】
【発明の効果】
こうして、例外依存に対して的確な投機実行を行うコンパイル装置及びコンパイル方法が提供される。
【図面の簡単な説明】
【図1】先行技術におけるコンパイル過程の中間表現の説明図である。
【図2】図1の中間表現に対応する依存グラフを示すである。
【図3】S−PEIを越えた投機実行を行う処理手順のフローチャートである。
【図4】例外依存アークを生成する手順をプログラム記述形式で示している図である。
【図5】例外発生の順序を決定するためにS−PEIとS−PEIの間にも例外依存アークを生成する手順をプログラム記述形式で示している図である。
【図6】第1のソース・プログラムに対して、本発明を適用したコンパイラによるコンパイルを実行したときの中間表現の説明図である。
【図7】図6の中間表現に対応する依存グラフを示すである。
【図8】第2のソース・プログラムに対して、本発明を適用したコンパイラによるコンパイルを回復コード無しで実行したときの中間表現の説明図である。
【図9】図8の中間表現に対応する依存グラフを示すである。
【図10】第2のソース・プログラムに対して、本発明を適用したコンパイラによるコンパイルを回復コード有りで実行したときの中間表現の説明図である。
【図11】図10の中間表現に対応する依存グラフを示すである。
【図12】第3のソース・プログラムに対して、本発明を適用したコンパイラによるコンパイルを回復コード有りで実行したときの中間表現の説明図である。
【図13】図12の中間表現に対応する依存グラフを示すである。
【図14】ベンチマークテストにおける従来のコンパイラと本発明を適用するコンパイラとの性能対比図である。
【図15】コンパイル装置の機能ブロック図である。
【符号の説明】
20 コンパイル装置
24 第1の中間表現プログラム作成手段
25 ブロック抽出手段
26 第1の依存グラフ情報作成手段
27 S−PEI間例外依存アーク設定手段
30 有利性判断手段
31 第2の依存グラフ情報作成手段
34 第1の復帰設定手段
35 第2の復帰設定手段
36 S−PEI間例外依存アーク変更手段
37 第2の中間表現プログラム作成手段
38 オブジェクト・プログラム作成手段

Claims (21)

  1. コンピュータが、記憶手段に格納されているソース・プログラムに基づき、プログラムを異常に終了させる可能性がある命令(以下、「H−PEI」と言う。)の前に、プログラムを停止しないことを保証する例外チェックの命令(以下、「S−PEI」と言う。)が挿入された第1の中間表現プログラムを作成し、記憶手段に格納するステップ、
    コンピュータが、記憶手段に格納されている前記第1の中間表現プログラムにおいて記述順の連続する複数個の命令を含むブロックを抽出し、記憶手段に格納するステップ
    コンピュータが、記憶手段に格納されている前記ブロックについて、各命令をノードとし、依存関係にある命令のノード間にアークを設定するとともに、S−PEIの後にH−PEI又は別のS−PEIを実行しなければならないという命令間の依存(以下、「例外依存」と言う。)の関係にある両命令のノード間のアーク(以下、「例外依存アーク」と言う。)を、例外依存以外の依存関係にある命令のノード間のアーク(以下、「非例外依存アーク」と言う。)に対して区別した第1の依存グラフ情報を作成し、記憶手段に格納するステップ、
    コンピュータが、記憶手段に格納されている前記第1の依存グラフ情報に基づき、実行時間に係る有利性基準に照らしてH−PEIのノードについてそれが例外依存アークを経由して実行された場合と該例外依存アークを経由しないで実行された場合とでどちらが有利かを判断するステップ、
    コンピュータが、H−PEIのノードについてそれが例外依存アークを経由しないで実行された場合の方が例外依存アークを経由して実行された場合より有利と判断したときは、記憶手段に格納されている前記第1の依存グラフ情報に基き、該H−PEIのノードとその後ろに連続する1個以上のノードとを含む命令列が投機実行されるように例外依存アークの先端を別のノードへ変更した第2の依存グラフ情報を作成し、記憶手段に格納するステップ、
    コンピュータが、記憶手段に格納されている前記第2の依存グラフ情報に対応する中間表現プログラム部分(以下、該中間表現プログラム部分を「第1の中間表現プログラム部分」と言う。)をスケジューリングした中間表現プログラム部分(以下、該中間表現プログラム部分を「第2の中間表現プログラム部分」と言う。)を備える第2の中間表現プログラムを作成し、記憶手段に格納するステップ、及び
    コンピュータが、記憶手段に格納されている前記第2の中間表現プログラムに基づいてオブジェクト・プログラムを作成し、記憶手段に格納するステップ、
    を有していることを特徴とするコンパイル方法。
  2. 前記実行時間に係る有利性基準とは、H−PEIの最早実行開始時間に係る有利性基準であることを特徴とする請求項1記載のコンパイル方法。
  3. 前記スケジューリングは、ブロック内のプログラムのクリティカル・パスを最小とするリスト・スケジューリングであることを特徴とする請求項1記載のコンパイル方法。
  4. 非例外依存にはデータ依存又は制御依存が含まれることを特徴とする請求項1記載のコンパイル方法。
  5. 遅くとも前記スケジューリングより前に実行される第1の追加ステップを備え
    該第1の追加ステップでは、記憶手段に記憶されている前記第2の依存グラフ情報及び第1の中間表現プログラム部分に基づき、コンピュータが、
    前記投機実行がなされるように先端が別のノードに変更された例外依存アークの先端の当該別のノードに係る命令を番兵命令とし、
    投機実行対象のH−PEIが、その例外発生を抑制された状態で前記番兵命令が実行されたときには、投機実行の対象となった命令列を、例外発生を抑制することなく再実行するように、前記第1の中間表現プログラム部分内の命令列を生成し、記憶手段に格納する、
    ことを特徴とする請求項1記載のコンパイル方法。
  6. 遅くとも前記スケジューリングより前に実行される第2の追加ステップを備え
    該第2の追加ステップでは、記憶手段に記憶されている前記第2の依存グラフ情報及び第1の中間表現プログラム部分に基づき、コンピュータが、
    前記投機実行がなされるように先端が別のノードに変更された例外依存アークの先端の当該別のノードに係る命令をチェック命令とし、
    投機実行の対象となった命令列のコピーを回復コードとして前記チェック命令の後に配置し、
    これにより前記チェック命令が、その実行時には、投機実行対象のH−PEIにおいて例外発生が抑制されたか否かを判定し、該判定が正であれば、前記回復コードが実行されるように、前記第1の中間表現プログラム部分内の命令列を生成し、記憶手段に格納する、
    ことを特徴とする請求項1記載のコンパイル方法。
  7. 前記第1の依存グラフ情報には、S−PEIからそのS−PEIの次に順番の早いS−PEIへ向けて設定された例外依存アーク(以下、この例外依存アークを「S−PEI間例外依存アーク」と言う。)の設定情報が含まれ
    前記コンパイル方法は、遅くとも前記スケジューリングより前に実行される第3の追加ステップを備え
    前記第3の追加ステップでは、コンピュータが、
    S−PEI間例外依存アークの両端ノードに係る例外の種類が同一である場合には、該S−PEI間例外依存アークを除去し、また、S−PEI間例外依存アークの両端ノードに係る例外の種類が異なる場合には、該S−PEI間例外依存アークをそのまま残すように、記憶手段に格納されている前記第2の依存グラフ情報を変更する、
    ことを特徴とする請求項1記載のコンパイル方法。
  8. 記憶手段に格納されているソース・プログラムに基づき、プログラムを異常に終了させる可能性がある命令(以下、「H−PEI」と言う。)の前に、プログラムを停止しないことを保証する例外チェックの命令(以下、「S−PEI」と言う。)が挿入された第1の中間表現プログラムを作成し、記憶手段に格納する手段、
    記憶手段に格納されている前記第1の中間表現プログラムにおいて記述順の連続する複数個の命令を含むブロックを抽出し、記憶手段に格納する手段、
    記憶手段に格納されている前記ブロックについて、各命令をノードとし、依存関係にある命令のノード間にアークを設定するとともに、S−PEIの後にH−PEI又は別のS−PEIを実行しなければならないという命令間の依存(以下、「例外依存」と言う。)の関係にある両命令のノード間のアーク(以下、「例外依存アーク」と言う。)を、例外依存以外の依存関係にある命令のノード間のアーク(以下、「非例外依存アーク」と言う。)に対して区別した第1の依存グラフ情報を作成し、記憶手段に格納する手段、
    記憶手段に格納されている前記第1の依存グラフ情報に基づき、実行時間に係る有利性基準に照らしてH−PEIのノードについてそれが例外依存アークを経由して実行された場合と該例外依存アークを経由しないで実行された場合とでどちらが有利かを判断する手段、
    H−PEIのノードについてそれが例外依存アークを経由しないで実行された場合の方が例外依存アークを経由して実行された場合より有利との判断があったときは該H−PEIのノードとその後ろに連続する1個以上のノードとを含む命令列が投機実行されるように例外依存アークの先端を別のノードへ変更した第2の依存グラフ情報を作成し、記憶手段に格納する手段、
    記憶手段に格納されている前記第2の依存グラフ情報に対応する中間表現プログラム部分(以下、該中間表現プログラム部分を「第1の中間表現プログラム部分」と言う。)をスケジューリングした中間表現プログラム部分(以下、該中間表現プログラム部分を「第2の中間表現プログラム部分」と言う。)を備える第2の中間表現プログラムを作成し、記憶手段に格納する手段、及び
    記憶手段に格納されている前記第2の中間表現プログラムに基づいてオブジェクト・プログラムを作成し、記憶手段に格納する手段
    を有していることを特徴とするコンパイル装置。
  9. 前記実行時間に係る有利性基準とは、H−PEIの最早実行開始時間に係る有利性基準であることを特徴とする請求項8記載のコンパイル装置。
  10. 前記スケジューリングは、ブロック内のプログラムのクリティカル・パスを最小とするリスト・スケジューリングであることを特徴とする請求項8記載のコンパイル装置。
  11. 非例外依存にはデータ依存又は制御依存が含まれることを特徴とする請求項8記載のコンパイル装置。
  12. 前記投機実行がなされるように先端が別のノードに変更された例外依存アークの先端の当該別のノードに係る命令を番兵命令とし、投機実行対象のH−PEIが、その例外発生を抑制された状態で前記番兵命令が実行されたときには、投機実行の対象となった命令列を、例外発生を抑制することなく再実行するように、記憶手段に格納されている前記第1の中間表現プログラム部分内の命令列を生成し、記憶手段に格納する手段、
    を有していることを特徴とする請求項8記載のコンパイル装置。
  13. 前記投機実行がなされるように先端が別のノードに変更された例外依存アークの先端の当該別のノードに係る命令をチェック命令とし、投機実行の対象となった命令列のコピーを回復コードとして前記チェック命令の後に配置し、これにより前記チェック命令が、その実行時には、投機実行対象のH−PEIにおいて例外発生が抑制されたか否かを判定し、該判定が正であれば、前記回復コードが実行されるように、記憶手段に記憶されている前記第1の中間表現プログラム部分内の命令列を生成し、記憶手段に格納する手段、
    を有していることを特徴とする請求項8記載のコンパイル装置。
  14. 記憶手段に格納されている前記第1の依存グラフ情報に対し、S−PEIからそのS−PEIの次に順番の早いS−PEIへ向けて設定された例外依存アーク(以下、この例外依存アークを「S−PEI間例外依存アーク」と言う。)の設定情報を含ませる手段、及び
    S−PEI間例外依存アークの両端ノードに係る例外の種類が同一である場合には、該S−PEI間例外依存アークを除去し、また、S−PEI間例外依存アークの両端ノードに係る例外の種類が異なる場合には、該S−PEI間例外依存アークをそのまま残すように、記憶手段に格納されている前記第2の依存グラフ情報を変更する手段、
    を有していることを特徴とする請求項8記載のコンパイル装置。
  15. 記憶手段に格納されているソース・プログラムに基づき、プログラムを異常に終了させる可能性がある命令(以下、「H−PEI」と言う。)の前に、プログラムを停止しないことを保証する例外チェックの命令(以下、「S−PEI」と言う。)が挿入された第1の中間表現プログラムを作成し、記憶手段に格納するステップ、
    記憶手段に格納されている前記第1の中間表現プログラムにおいて記述順の連続する複数個の命令を含むブロックを抽出し、記憶手段に格納するステップ、
    記憶手段に格納されている前記ブロックについて、各命令をノードとし、依存関係にある命令のノード間にアークを設定するとともに、S−PEIの後にH−PEI又は別のS−PEIを実行しなければならないという命令間の依存(以下、「例外依存」と言う。)の関係にある両命令のノード間のアーク(以下、「例外依存アーク」と言う。)を、例外依存以外の依存関係にある命令のノード間のアーク(以下、「非例外依存アーク」と言う。)に対して区別した第1の依存グラフ情報を作成し、記憶手段に格納するステップ、
    記憶手段に格納されている前記第1の依存グラフ情報に基づき、実行時間に係る有利性基準に照らしてH−PEIのノードについてそれが例外依存アークを経由して実行された場合と該例外依存アークを経由しないで実行された場合とでどちらが有利かを判断するステップ、
    H−PEIのノードについてそれが例外依存アークを経由しないで実行された場合の方が例外依存アークを経由して実行された場合より有利との判断があったときは該H−PEIのノードとその後ろに連続する1個以上のノードとを含む命令列が投機実行されるように例外依存アークの先端を別のノードへ変更した第2の依存グラフ情報を作成し、記憶手段に格納するステップ、
    記憶手段に格納されている前記第2の依存グラフ情報に対応する中間表現プログラム部分(以下、該中間表現プログラム部分を「第1の中間表現プログラム部分」と言う。)をスケジューリングした中間表現プログラム部分(以下、該中間表現プログラム部分を「第2の中間表現プログラム部分」と言う。)を備える第2の中間表現プログラムを作成し、記憶手段に格納するステップ、及び
    記憶手段に格納されている前記第2の中間表現プログラムに基づいてオブジェクト・プログラムを作成し、記憶手段に格納するステップ、
    をコンピュータに実行させるためのコンパイル用プログラム。
  16. 前記実行時間に係る有利性基準とは、H−PEIの最早実行開始時間に係る有利性基準であることを特徴とする請求項15記載のコンパイル用プログラム。
  17. 前記スケジューリングは、ブロック内のプログラムのクリティカル・パスを最小とするリスト・スケジューリングであることを特徴とする請求項15記載のコンパイル用プログラム。
  18. 非例外依存にはデータ依存又は制御依存が含まれることを特徴とする請求項15記載のコンパイル用プログラム。
  19. 前記コンパイル用プログラムは、遅くとも前記スケジューリングより前に実行される第1の追加ステップをさらにコンピュータに実行させるものであり、
    該第1の追加ステップでは、
    前記投機実行がなされるように先端が別のノードに変更された例外依存アークの先端の当該別のノードに係る命令を番兵命令とし、
    投機実行対象のH−PEIが、その例外発生を抑制された状態で前記番兵命令が実行されたときには、投機実行の対象となった命令列を、例外発生を抑制することなく再実行するように、記憶手段に格納されている前記第1の中間表現プログラム部分内の命令列を生成し、記憶手段に格納する、
    ことを特徴とする請求項15記載のコンパイル用プログラム。
  20. 前記コンパイル用プログラムは、遅くとも前記スケジューリングより前に実行される第2の追加ステップをさらにコンピュータに実行させるものであり、
    該第2の追加ステップでは、
    前記投機実行がなされるように先端が別のノードに変更された例外依存アークの先端の当該別のノードに係る命令をチェック命令とし、
    投機実行の対象となった命令列のコピーを回復コードとして前記チェック命令の後に配置し、
    これにより前記チェック命令が、その実行時には、投機実行対象のH−PEIにおいて例外発生が抑制されたか否かを判定し、該判定が正であれば、前記回復コードが実行されるように、記憶手段に記憶されている前記第1の中間表現プログラム部分内の命令列を生成し、記憶手段に格納する、
    ことを特徴とする請求項15記載のコンパイル用プログラム。
  21. 前記第1の依存グラフ情報には、S−PEIからそのS−PEIの次に順番の早いS−PEIへ向けて設定された例外依存アーク(以下、この例外依存アークを「S−PEI間例外依存アーク」と言う。)の設定情報が含まれ
    前記コンパイル用プログラムは、遅くとも前記スケジューリングより前に実行される第3及び第4の追加ステップをさらにコンピュータに実行させるものであり
    前記第3の追加ステップでは、
    S−PEI間例外依存アークの両端ノードに係る例外の種類が同一である場合には、該S−PEI間例外依存アークを除去し、また、S−PEI間例外依存アークの両端ノードに係る例外の種類が異なる場合には、該S−PEI間例外依存アークをそのまま残すように、記憶手段に記憶されている前記第2の依存グラフ情報を変更する、
    ことを特徴とする請求項15記載のコンパイル用プログラム。
JP2002069221A 2002-03-13 2002-03-13 コンパイル方法、コンパイル装置、及びコンパイル用プログラム Expired - Fee Related JP3870112B2 (ja)

Priority Applications (2)

Application Number Priority Date Filing Date Title
JP2002069221A JP3870112B2 (ja) 2002-03-13 2002-03-13 コンパイル方法、コンパイル装置、及びコンパイル用プログラム
US10/388,024 US7197747B2 (en) 2002-03-13 2003-03-12 Compiling method, apparatus, and program

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP2002069221A JP3870112B2 (ja) 2002-03-13 2002-03-13 コンパイル方法、コンパイル装置、及びコンパイル用プログラム

Publications (2)

Publication Number Publication Date
JP2003280919A JP2003280919A (ja) 2003-10-03
JP3870112B2 true JP3870112B2 (ja) 2007-01-17

Family

ID=29227668

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2002069221A Expired - Fee Related JP3870112B2 (ja) 2002-03-13 2002-03-13 コンパイル方法、コンパイル装置、及びコンパイル用プログラム

Country Status (2)

Country Link
US (1) US7197747B2 (ja)
JP (1) JP3870112B2 (ja)

Families Citing this family (34)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US7685581B2 (en) 2003-06-27 2010-03-23 Microsoft Corporation Type system for representing and checking consistency of heterogeneous program components during the process of compilation
US7120898B2 (en) 2003-06-26 2006-10-10 Microsoft Corporation Intermediate representation for multiple exception handling models
US7707566B2 (en) * 2003-06-26 2010-04-27 Microsoft Corporation Software development infrastructure
US7559050B2 (en) * 2003-06-30 2009-07-07 Microsoft Corporation Generating software development tools via target architecture specification
US7146606B2 (en) 2003-06-26 2006-12-05 Microsoft Corporation General purpose intermediate representation of software for software development tools
US7305666B2 (en) * 2003-07-23 2007-12-04 Microsoft Corporation Description language for an extensible compiler and tools infrastructure
US7788652B2 (en) * 2003-06-27 2010-08-31 Microsoft Corporation Representing type information in a compiler and programming tools framework
US7493611B2 (en) * 2004-08-30 2009-02-17 International Business Machines Corporation Pinning internal slack nodes to improve instruction scheduling
US7509633B2 (en) * 2004-12-16 2009-03-24 International Business Machines Corporation System and method for grid-based distribution of Java project compilation
US7512938B2 (en) * 2005-03-18 2009-03-31 Microsoft Corporation Typed intermediate representation for object-oriented languages
US7707451B2 (en) * 2005-06-28 2010-04-27 Alcatel-Lucent Usa Inc. Methods and devices for recovering from initialization failures
US7631011B2 (en) * 2005-07-29 2009-12-08 Microsoft Corporation Code generation patterns
US7702686B2 (en) * 2005-07-29 2010-04-20 Microsoft Corporation Retrieving and persisting objects from/to relational databases
US20070027905A1 (en) * 2005-07-29 2007-02-01 Microsoft Corporation Intelligent SQL generation for persistent object retrieval
US20070044083A1 (en) * 2005-07-29 2007-02-22 Microsoft Corporation Lambda expressions
US20070027849A1 (en) * 2005-07-29 2007-02-01 Microsoft Corporation Integrating query-related operators in a programming language
US7685567B2 (en) 2005-07-29 2010-03-23 Microsoft Corporation Architecture that extends types using extension methods
WO2007015505A1 (ja) * 2005-08-04 2007-02-08 Nec Corporation データ処理装置、データ処理方法、データ処理プログラム
WO2007085121A1 (en) * 2006-01-26 2007-08-02 Intel Corporation Scheduling multithreaded programming instructions based on dependency graph
JP4884297B2 (ja) * 2006-05-26 2012-02-29 パナソニック株式会社 コンパイラ装置、コンパイル方法およびコンパイラプログラム
US8037466B2 (en) 2006-12-29 2011-10-11 Intel Corporation Method and apparatus for merging critical sections
US8060868B2 (en) * 2007-06-21 2011-11-15 Microsoft Corporation Fully capturing outer variables as data objects
JP2009129179A (ja) * 2007-11-22 2009-06-11 Toshiba Corp プログラム並列化支援装置およびプログラム並列化支援方法
WO2009110616A1 (ja) * 2008-03-07 2009-09-11 日本電気株式会社 仮想マシンパッケージ生成システム、仮想マシンパッケージ生成方法および仮想マシンパッケージ生成プログラム
US20090271765A1 (en) * 2008-04-29 2009-10-29 Microsoft Corporation Consumer and producer specific semantics of shared object protocols
EP2352087A4 (en) * 2008-10-24 2012-08-08 Ibm PROCESS, SYSTEM AND PROGRAM FOR SOURCE COD PROCESSING
US8549477B2 (en) * 2009-10-27 2013-10-01 Oracle International Corporation Mapping usage patterns using code features
US8739118B2 (en) 2010-04-08 2014-05-27 Microsoft Corporation Pragmatic mapping specification, compilation and validation
US9411560B2 (en) * 2012-01-26 2016-08-09 Oracle International Corporation Error propagation
GB2514618B (en) * 2013-05-31 2020-11-11 Advanced Risc Mach Ltd Data processing systems
US8978010B1 (en) * 2013-12-18 2015-03-10 Sap Ag Pruning compilation dependency graphs
US9110737B1 (en) * 2014-05-30 2015-08-18 Semmle Limited Extracting source code
JP6335329B2 (ja) * 2014-12-05 2018-05-30 株式会社日立製作所 プログラム依存部可視化装置、方法、およびプログラム
US10810007B2 (en) 2017-12-29 2020-10-20 Microsoft Technology Licensing, Llc Classifying system-generated code

Family Cites Families (7)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US6029002A (en) * 1995-10-31 2000-02-22 Peritus Software Services, Inc. Method and apparatus for analyzing computer code using weakest precondition
US6742108B1 (en) * 1995-12-29 2004-05-25 Intel Corporation Method and apparatus for executing load instructions speculatively
US6260190B1 (en) * 1998-08-11 2001-07-10 Hewlett-Packard Company Unified compiler framework for control and data speculation with recovery code
JP2000331427A (ja) 1999-05-18 2000-11-30 Hitachi Ltd ディスク再生装置
US6526572B1 (en) * 2000-02-09 2003-02-25 Hewlett-Packard Company Mechanism for software register renaming and load speculation in an optimizer
US6615403B1 (en) * 2000-06-30 2003-09-02 Intel Corporation Compare speculation in software-pipelined loops
JP3664473B2 (ja) * 2000-10-04 2005-06-29 インターナショナル・ビジネス・マシーンズ・コーポレーション プログラムの最適化方法及びこれを用いたコンパイラ

Also Published As

Publication number Publication date
JP2003280919A (ja) 2003-10-03
US20040025152A1 (en) 2004-02-05
US7197747B2 (en) 2007-03-27

Similar Documents

Publication Publication Date Title
JP3870112B2 (ja) コンパイル方法、コンパイル装置、及びコンパイル用プログラム
Mador-Haim et al. An axiomatic memory model for POWER multiprocessors
Abdulla et al. Stateless model checking for POWER
JP3707727B2 (ja) プログラムの最適化方法及びこれを用いたコンパイラ
Devietti et al. DMP: Deterministic shared memory multiprocessing
WO2010013370A1 (ja) プログラム変換装置及びプログラム変換方法
US11216258B2 (en) Direct function call substitution using preprocessor
US8990786B2 (en) Program optimizing apparatus, program optimizing method, and program optimizing article of manufacture
US6539541B1 (en) Method of constructing and unrolling speculatively counted loops
US20080244544A1 (en) Using hardware checkpoints to support software based speculation
JP2015084251A (ja) ソフトウェア・アプリケーションの性能向上
US7788650B2 (en) Compiler-based critical section amendment for a multiprocessor environment
US7797329B2 (en) Method and system for enabling a synchronization-free and parallel commit phase
Blundell et al. RETCON: transactional repair without replay
Baghsorkhi et al. FlexVec: Auto-vectorization for irregular loops
Gupta et al. Optimizing Java programs in the presence of exceptions
US8191057B2 (en) Systems, methods, and computer products for compiler support for aggressive safe load speculation
Bharadwaj et al. Wavefront scheduling: Path based data representation and scheduling of subgraphs
Luo et al. C11Tester: a race detector for C/C++ atomics
Han et al. Speculative parallelization of partial reduction variables
Oh et al. A generalized framework for automatic scripting language parallelization
Lin et al. Speculative register promotion using advanced load address table (alat)
Dai et al. A general compiler framework for speculative optimizations using data speculative code motion
Honorio et al. On the efficiency of transactional code generation: A GCC case study
Gayatri et al. Loop level speculation in a task based programming model

Legal Events

Date Code Title Description
A977 Report on retrieval

Free format text: JAPANESE INTERMEDIATE CODE: A971007

Effective date: 20060605

A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A131

Effective date: 20060614

A521 Written amendment

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20060809

A521 Written amendment

Free format text: JAPANESE INTERMEDIATE CODE: A821

Effective date: 20060810

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: 20061004

RD14 Notification of resignation of power of sub attorney

Free format text: JAPANESE INTERMEDIATE CODE: A7434

Effective date: 20061004

A61 First payment of annual fees (during grant procedure)

Free format text: JAPANESE INTERMEDIATE CODE: A61

Effective date: 20061016

R150 Certificate of patent or registration of utility model

Free format text: JAPANESE INTERMEDIATE CODE: R150

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

Free format text: PAYMENT UNTIL: 20091020

Year of fee payment: 3

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

Free format text: PAYMENT UNTIL: 20101020

Year of fee payment: 4

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

Free format text: PAYMENT UNTIL: 20101020

Year of fee payment: 4

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

Free format text: PAYMENT UNTIL: 20111020

Year of fee payment: 5

LAPS Cancellation because of no payment of annual fees