JP5583514B2 - バイナリコードを最適化するコンパイル方法、及びそのコンパイラシステム、並びにコンピュータ・プログラム - Google Patents
バイナリコードを最適化するコンパイル方法、及びそのコンパイラシステム、並びにコンピュータ・プログラム Download PDFInfo
- Publication number
- JP5583514B2 JP5583514B2 JP2010180043A JP2010180043A JP5583514B2 JP 5583514 B2 JP5583514 B2 JP 5583514B2 JP 2010180043 A JP2010180043 A JP 2010180043A JP 2010180043 A JP2010180043 A JP 2010180043A JP 5583514 B2 JP5583514 B2 JP 5583514B2
- Authority
- JP
- Japan
- Prior art keywords
- register
- memory access
- local variable
- access
- value
- 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
Links
- 238000000034 method Methods 0.000 title claims description 101
- 238000004590 computer program Methods 0.000 title claims description 4
- 230000004044 response Effects 0.000 claims description 11
- 238000006467 substitution reaction Methods 0.000 claims description 9
- 230000007423 decrease Effects 0.000 claims description 6
- 238000012217 deletion Methods 0.000 claims description 4
- 230000037430 deletion Effects 0.000 claims description 4
- 238000005457 optimization Methods 0.000 description 126
- 238000012545 processing Methods 0.000 description 102
- 230000008569 process Effects 0.000 description 41
- 238000006243 chemical reaction Methods 0.000 description 8
- 238000004891 communication Methods 0.000 description 8
- 238000010586 diagram Methods 0.000 description 4
- 230000008859 change Effects 0.000 description 3
- 230000003247 decreasing effect Effects 0.000 description 3
- 230000000644 propagated effect Effects 0.000 description 2
- XUIMIQQOPSSXEZ-UHFFFAOYSA-N Silicon Chemical compound [Si] XUIMIQQOPSSXEZ-UHFFFAOYSA-N 0.000 description 1
- 230000006870 function Effects 0.000 description 1
- 230000006872 improvement Effects 0.000 description 1
- 230000010354 integration Effects 0.000 description 1
- 239000004973 liquid crystal related substance Substances 0.000 description 1
- 230000007246 mechanism Effects 0.000 description 1
- 230000007334 memory performance Effects 0.000 description 1
- 230000001343 mnemonic effect Effects 0.000 description 1
- 238000013433 optimization analysis Methods 0.000 description 1
- 229910052710 silicon Inorganic materials 0.000 description 1
- 239000010703 silicon Substances 0.000 description 1
- 238000012546 transfer Methods 0.000 description 1
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/44—Encoding
- G06F8/443—Optimisation
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)
- Executing Machine-Instructions (AREA)
Description
まず、本発明者らは、エスケープ解析を使った最適化を抑える主な理由がスタックポインターのセーブ命令及びリストア命令であることを発見した。本発明者らはまた、これらのセーブ命令及びリストア命令が実際にはエイリアスされないことを発見した。これらの発見は、バイナリコードを最適化するために重要である。本発明は、これらの発見に基づいてなされた。すなわち、本発明は、これらのセーブ命令及びリストア命令をまず最適化することにより、エスケープ命令を削減させることができた。
また、本発明のコンパイラ方法は特には、多段にインライン展開された場合であっても、ストア命令及びロード命令のいずれをも効果的に最適化することが可能である。本発明のコンパイラ方法は特に、バイトコード内に含まれるcall命令が呼ばれるコードがインラインされる場合に有用である。
それ以外のメモリアクセスには、下記がある。
(1)エスケープしていないスタックポインターを介したメモリアクセスである。
(2)スタックポインターがエスケープしていた場合に、当該エスケープしたスタックポインターをベースアドレスとするメモリアクセスのうち、(i)当該エスケープを引き起こした命令に付与されたcall番号と、当該call番号の祖先のcall番号とに属しているメモリアクセス、及び(ii)(i)以外のメモリアクセスである。call番号とは、バイナリコード内に含まれるcall命令で呼ばれるコードをインラインすることに応じて、各コール命令及びインラインされたコードに付与される番号であり、当該call番号は、呼ぶ方のコール命令のコール番号を親とし、呼ばれる方のコール命令のコール番号を子とする親子関係情報に従う。
本発明の実施態様において、メモリアクセスをローカル変数アクセスに置換する態様は、下記(A)〜(C)の3通りである。
(A)各レジスタの値が退避されるスタック領域へのメモリアクセスをローカル変数アクセスに置換する。当該メモリアクセスについては、スタックポインターがエスケープしているかどうかに関係なく、その全てのメモリアクセスをローカル変数アクセスに置換する。
(B)スタックポインターがエスケープしていないことを条件に、上記(1)のメモリアクセスをローカル変数アクセスに置換する。
(C)スタックポインターがエスケープしていた場合に、上記(2)(i)のメモリアクセスのローカル変数アクセスへの置換を禁止し、一方、上記(2)(ii)のメモリアクセスをローカル変数アクセスに置換する。
本発明の第1の実施態様は上記(A)であり、図4A〜図4Dに示されている。
本発明の第2の実施態様は上記(A)と上記(B)とを組み合わせたものであり、図5A〜図5Dに示されている。
本発明の第3の実施態様は、コール命令にcall番号を付与することと、上記(A)とを組み合わせたものであり、図6A〜図6Cに示されている。
本発明の第4の実施態様は、コール命令にcall番号を付与することと、上記(A)及び上記(C)とを組み合わせたものであり、図7A〜図7Eに示されている。
上記バイナリコード内においてスタックポインターとしてのレジスタ(第1のレジスタ)を見つけて、当該スタックポインターを他のレジスタ(第2のレジスタ)に保存するステップと(図4A、ステップ403;図5A、ステップ503)、
上記バイナリコード内において、上記第1のレジスタをベースレジスタとして使用しているメモリアクセスを見つけ、そして当該見つけたメモリアクセスについて、上記第2のレジスタの値からのオフセットを計算するステップと(図4A、ステップ404及び405;図5A、ステップ504及び505)、
上記計算されたオフセットのうち、オフセットが同じであるメモリアクセスの集合を取得するステップと(図4B及び図4C、ステップ420及び440;図5B及び図5C、ステップ520及び540)、
上記取得した集合のメモリアクセスによりアクセスされるスタック領域がエイリアスされない領域であるかどうかを、上記取得した集合の各メモリアクセスによりアクセスされる領域が前記各レジスタの値が退避されるスタック領域内への前記メモリアクセスのオフセット値域に入っているか否かによって判断するステップと(図4A、ステップ406;図5A、ステップ506)
を含む。スタックポインターとしてのレジスタは、システムによって定められているスタックポインター用のレジスタ又は特定のパターンで定義されるレジスタでありうる。特定のパターンで定義されるレジスタとは、他のスレッドから参照されることがないとわかるデータ構造へのポインタを得るための、特定の命令列によって定義されるレジスタをいう。
(1)スタックポインターの値がメモリ内に書き込まれていること、
(2)インラインされないcall命令があること、及び
(3)例外を起こしうる命令があること。
上記ステップ(b)は、エスケープするスタックポインターをリストに格納するステップ(図4C、ステップ446;図5C、ステップ546)をさらに含んでもよい。
上記ステップ(b)はまた、上記スタックポインターがエスケープしていないことを上記リストが空集合であることによって判断するステップ(図5A、ステップ507)をさらに含んでもよい。
上記バイナリコード内においてスタックポインターとしてのレジスタ(第1のレジスタ)を見つけて、当該スタックポインターを他のレジスタ(第2のレジスタ)に保存するステップと(図6A、ステップ604;図7A、ステップ704)、
上記バイナリコード内において、上記第1のレジスタをベースレジスタとして使用しているメモリアクセスを見つけ、当該見つけたメモリアクセスについて、上記第2のレジスタの値からのオフセットを計算するステップと(図6A、ステップ605及び607;図7A、ステップ705及び706)、
上記各メモリアクセスについて、上記call番号と上記第2のレジスタの値からのオフセットとの組を基にローカル変数を識別するための番号(ローカル変数番号)を作成するステップと(図8B)、
上記作成されたローカル変数番号に基づいて、上記各レジスタの値が退避されるスタック領域内へのメモリアクセスのローカル変数アクセスへの割り当てを決めて、当該メモリアクセスを当該割り当てられたローカル変数アクセスに置換するステップと(図7A、ステップ707)
を含む。ステップ(A)及び(B)でバイナリコードの最適化を終了する場合、当該最適化は、図6A〜図6Cに示す第3の実施態様である。そして、コンピュータ(図1、101)は、上記置換されたローカル変数をレジスタ割り当ての対象とし、結果的に上記置換されたローカル変数にレジスタアドレスが割り当てられる。
上記バイナリコード内においてスタックポインターとしてのレジスタ(第1のレジスタ)を見つけて、当該スタックポインターを他のレジスタ(第2のレジスタ)に保存するステップと(図7A、ステップ704)、
上記バイナリコード内において、第1のレジスタをベースレジスタとして使用しているメモリアクセスを見つけ、当該メモリアクセスについて、上記第2のレジスタの値からのオフセットを計算するステップと(図7A、ステップ705及び706)、
上記各メモリアクセスについて、上記call番号と上記第2のレジスタの値からのオフセットの組を基にローカル変数を識別するための番号(ローカル変数番号)を作成するステップと(図8B)、
上記作成されたローカル変数番号に基づいて、上記禁止しなかったメモリアクセスのローカル変数アクセスへの割り当てを決めて、当該禁止しなかったメモリアクセスを当該割り当てられたローカル変数アクセスに置換するステップと(図7A、ステップ709)
を含む。
(1)スタックポインターの値がメモリ内に書き込まれていること、
(2)インラインされないコール命令があること、及び
(3)例外を起こしうる命令があること。
上記バイナリコード内においてスタックポインターとしてのレジスタ(第1のレジスタ)を見つけて、当該スタックポインターを他のレジスタ(第2のレジスタ)に保存し、
上記バイナリコード内において、上記第1のレジスタをベースレジスタとして使用しているメモリアクセスを見つけ、当該見つけたメモリアクセスについて、上記第2のレジスタの値からのオフセットを計算し、
上記計算されたオフセットのうち、オフセットが同じであるメモリアクセスの集合を取得し、
上記取得した集合のメモリアクセスによりアクセスされるスタック領域がエイリアスされない領域であるかどうかを、上記取得した集合内の各メモリアクセスによりアクセスされる領域が前記各レジスタの値が退避されるスタック領域内への前記メモリアクセスのオフセット値域に入っているか否かによって判断する。
(1)スタックポインターの値がメモリ内に書き込まれていること、
(2)インラインされないcall命令があること、及び
(3)例外を起こしうる命令があること。
第3の置換部(図2、206)は、エスケープするスタックポインターをリストに格納する。
第3の置換部(図2、206)はまた、上記スタックポインターがエスケープしていないことを上記リストが空集合であることによって判断する。
上記バイナリコード内に含まれるコール(call)命令で呼ばれるコードをインラインすることに応じて、上記各コール命令及びインラインされたコードにcall番号を付与するcall番号付与部(図2、205)と、
各レジスタの値が退避されるスタック領域内へのメモリアクセスを、ローカル変数アクセスに置換する第1の置換部(図2、206)と
を備えていてもよい。call番号付与部(図2、205)は、当該call番号について、呼ぶ方のコール命令のcall番号を親とし、呼ばれる方のコール命令のcall番号を子とする親子関係情報をさらに作成する。
コンピュータ(図1、101)はまた、スタックポインターがエスケープしていた場合に、当該エスケープしたスタックポインターをベースアドレスとするメモリアクセスのうち、当該エスケープを引き起こした命令に付与されたcall番号と、当該call番号の祖先のcall番号とに属しているメモリアクセスのローカル変数アクセスへの置換を禁止し、一方、残りの禁止しなかったメモリアクセスをローカル変数アクセスに置換する第2の置換部(図2、206)をさらに備えていてもよい。上記祖先のcall番号は、上記親子関係情報から特定される。
上記バイナリコード内においてスタックポインターとしてのレジスタ(第1のレジスタ)を見つけて、当該スタックポインターを他のレジスタ(第2のレジスタ)に保存し、
上記バイナリコード内において、上記第1のレジスタをベースレジスタとして使用しているメモリアクセスを見つけ、当該見つけたメモリアクセスについて、上記第2のレジスタの値からのオフセットを計算し、
上記各メモリアクセスについて、上記call番号と上記第2のレジスタの値からのオフセットとの組を基にローカル変数を識別するための番号(ローカル変数番号)を作成し、
上記作成されたローカル変数番号に基づいて、上記各レジスタの値が退避されるスタック領域内へのメモリアクセスのローカル変数アクセスへの割り当てを決めて、当該メモリアクセスを当該割り当てられたローカル変数アクセスに置換する。
上記バイナリコード内においてスタックポインターとしてのレジスタ(第1のレジスタ)を見つけて他のレジスタ(第2のレジスタ)に保存し、
上記バイナリコード内において、第1のレジスタをベースレジスタとして使用しているメモリアクセスを見つけ、当該メモリアクセスについて、上記第2のレジスタの値からのオフセットを計算し、
上記各メモリアクセスについて、上記call番号と上記第2のレジスタの値からのオフセットの組を基にローカル変数を識別するための番号(ローカル変数番号)を作成し、
上記作成されたローカル変数番号に基づいて、上記禁止しなかったメモリアクセスのローカル変数アクセスへの割り当てを決めて、当該禁止しなかったメモリアクセスを当該割り当てられたローカル変数アクセスに置換する。
(1)スタックポインターの値がメモリ内に書き込まれていること、
(2)インラインされないcall命令があること、及び
(3)例外を起こしうる命令があること。
コンピュータ(101)は、CPU(102)とメイン・メモリ(103)とを備えており、これらはバス(104)に接続されている。CPU(102)は好ましくは、32ビット又は64ビットのアーキテクチャに基づくものであり、例えば、インテル社のCore i(商標)シリーズ、Core 2(商標)シリーズ、Atom(商標)シリーズ、Xeon(商標)シリーズ、Pentium(登録商標)シリーズ、Celeron(登録商標)シリーズ、AMD社のPhenom(商標)シリーズ、Athlon(商標)シリーズ、Turion(商標)シリーズ又はSempron(商標)が使用されうる。バス(104)には、ディスプレイ・コントローラ(105)を介して、ディスプレイ(106)、例えば液晶ディスプレイ(LCD)が接続されうる。ディスプレイ(106)は、コンピュータの管理のために、通信回線を介してネットワークに接続されたコンピュータについての情報と、そのコンピュータ上で動作中のソフトウェアについての情報を、適当なグラフィック・インタフェースで表示するために使用される。バス(104)にはまた、SATA又はIDEコントローラ(107)を介して、ディスク(108)、例えばハードディスク又はシリコン・ディスクと、ドライブ(109)、例えばCD、DVD又はBDドライブとが接続されうる。バス(104)にはさらに、キーボード・マウスコントローラ(110)又はUSBバス(図示せず)を介して、キーボード(111)及びマウス(112)が接続されうる。
ドライブ(109)は、必要に応じて、CD−ROM、DVD−ROM又はBDからプログラムをディスク(108)にインストールするために使用される。
コンパイラ(201)は、外部からバイナリコード(211)を受け取り、バイナリコード(211)をコンピュータにより実行可能な実行プログラム(214)に変換する。バイナリコード(211)から実行プログラム(214)への変換において、コンパイラ(201)は、コンピュータ資源を有効に活用するために、最適化を行う。最適化によって、実行プログラムの実行速度を高速化したり、実行プログラムのサイズを低減させたりすることが可能である。
− アプリケーション・コード(アプリケーション・エミュレーション)
− 当該バイナリコードを呼ぶコードの性質として、次の2つを有する:
・スタックの頂上(Top of stack)を超えたアクセスを行わない、
・スタックポインターレジスタには、スタックポインター以外の値を入れない、
置換部(206)はまた、最適化処理部(203)がcall番号付与部(205)を備えている場合、各レジスタの値が退避されるスタック領域内へのメモリアクセスを、ローカル変数アクセスに置換すること、及び任意的に、スタックポインターがエスケープしていた場合に、当該エスケープしたスタックポインターをベースアドレスとするメモリアクセスのうち、当該エスケープを引き起こした命令に付与されたcall番号と、当該call番号の祖先のcall番号とに属しているメモリアクセスのローカル変数アクセスへの置換を禁止し、一方、残りの禁止しなかったメモリアクセスをローカル変数アクセスに置換する。なお、置換部(206)は、前者の置換を行う第1の置換部と、後者の置換を行う第2の置換部とに分けられていてもよい。
置換部(206)は、第1の置換部、第2の置換部、及び第3の置換部の全てをそなえていてもよい。そして、ユーザによってバイナリコードの最適化がcall番号を使用して行われないことが選択された場合に、第1の置換部と第3の置換部とが使用されるようにし、一方、ユーザによってバイナリコードの最適化がcall番号を使用して行われないことが選択された場合に、第1の置換部と第2の置換部とが使用されるようにしてもよい。
Java(登録商標)で書かれたJavaアプリケーション(301)は、バイトコード(311)と呼ばれる中間言語に変換される。従って、Javaアプリケーション(301)は、Java(登録商標) VM(302)を実装する環境さえ用意すればどのような計算機上でも実行できる。一方、バイトコード(311)を実行する計算機上では、インタープリットするためにオーバーヘッドが問題になる。そこで、ジャスト・イン・タイム(Just-In-Time、JIT)コンパイラ(303)は、バイトコード(311)を実行時に動的に機械語に変換(コンパイル)してネイティブコード(312)に変換するために高速実行を可能にする。
ステップ401では、フロントエンド処理部(202)は、バイナリコード(211)を中間コード(212)に変換する。下記の最適化処理において、基本的にこの中間コード(212)に対して処理が行われる。但し、バイナリコード(211)と中間コード(212)との間には対応関係がある。従って、最適化処理において必要なときには、バイナリコード(211)を参照することが可能である。
ステップ402では、最適化処理部(203)は、中間コード(212)からUD/DU連鎖(Use-Definition Chain/Definition-Use Chain)を作成する。UD連鎖とは、参照定義連鎖を意味し、変数の参照について、そこで参照される値がどの命令で定義されるか又は定義される可能性があるかを命令の集合として表現したものである。DU連鎖とは定義参照連鎖を意味し、各変数の定義について、そこで定義された値がどの命令で参照される又は参照される可能性があるかを命令の集合として表現したものである。UD連鎖により得られた結果は、ステップ413(図4B)及びステップ433(図4C)において使用される。DU連鎖により得られた結果は、ステップ404において使用される。
ステップ403では、最適化処理部(203)は、バイナリコード(211)のスタックポインターの値が加減命令(例えば、足し算命令)によって変更される場合が有るために、当該変更前のスタックポインターの値(以下、元のSP値という)を、別のレジスタ(a1)内に保存する。すなわち、元のSP値を別のレジスタ(a1)にバックアップする。元のSP値を別のレジスタ(a1)にバックアップする目的は、各メモリアクセスについて、元のSP値からの相対オフセットを求める場合に、当該元のSP値を使用するためである。別のレジスタ(a1)は例えば、CPUのレジスタ内又はメイン・メモリ(103)内に設けられる。なお、ステップ403では、バイナリコード(211)を使用している。これは、上記したように、バイナリコード(211)と中間コード(212)との間には対応関係があるので、中間コード(212)からバイナリコード(211)の情報を見ることが出来るからである。
ステップ404では、最適化処理部(203)は、DU連鎖を使用し、スタックポインターの全ての使用位置を解析する。当該解析のフローチャートは、図4B又は図4Cのサブルーチンにおいて別途示されている。SPの定義defとoffsetはサブルーチンanalyze_usesの引数であって、呼び出し側が各値を設定する。
ステップ405では、最適化処理部(203)は、図4B又は図4Cにおいて作成されたメモリアクセスのリスト(c1)に登録された個々のストア命令に対応するロード命令に、図4B又は図4Cの各ストア命令のオフセット情報(b1)を伝播する。当該伝播のフローチャートは、図4Dのサブルーチンにおいて別途示されている。図4Dのステップ455において、各ストア命令のオフセット情報(b1)が実際に伝播されている。伝播は、load結果が格納されるレジスタをスタックポインターであると扱い、その際のストア命令に書き込まれたスタックポインターのオフセット情報をストア命令時のオフセット情報からコピーすることである。ここで、オフセット情報は例えば、オフセット値、対応するメモリアクセス(複数)、ローカル変数の3種類の情報を有する。
ステップ406では、オフセット情報(b1)を基に、実際にはエイリアスされることがないと分かっている(知られている)領域、例えばレジスタ・セーブ・エリア(レジスタ退避領域ともいう)について、各メモリアクセスをコンパイラ内のローカル変数アクセスに置き換える。エイリアスでない領域であるかどうかは、オフセット情報(b1)内の各メモリアクセスによりアクセスされる領域が前記各レジスタの値が退避されるスタック領域内への前記メモリアクセスのオフセット値域に入っているか否かによって判断される。上記アクセスされる領域がオフセットと値域に入っている場合、メモリアクセスによりアクセスされるスタック領域はエイリアスされない領域である。一方、上記アクセスされる領域がオフセットと値域に入っていない場合、メモリアクセスによりアクセスされるスタック領域はエイリアスされる領域である。上記ローカル変数は、図8Aに従い決められる。そして、置換されたローカル変数アクセスがレジスタアクセスに置き換えられる。実際にはエイリアスされることがないと分かっている(知られている)同じメモリアクセスは、各レジスタの値が退避されるスタック領域内へのメモリアクセスでもある。
本発明の第1の実施態様による最適化では、レジスタ・セーブ・エリアのみを最適化し、それ以外のメモリアクセスについては最適化を行っていない。
SPの定義defは、基本的には、プログラムの先頭にあるスタックポインターの値である。また、SPの定義defは、プログラム中に明示的に現れてない場合、メソッドの入口部にスタックポインターのdefがあるとして処理を行う。また、SPの定義defは、スタックポインターと見なせる特定のパターンである。
ステップ411は、サブルーチンanalyze_uses(def, offset)の開始である。defは、スタックポインターの定義defである。
ステップ412では、最適化処理部(203)は、defの全てのuse(レジスタ)について、ステップ413〜423の処理を繰り返して行う。
ステップ413では、最適化処理部(203)は、UD連鎖を使用し、useのところからdefを見に行って、useの定義がdefのみかどうかを判定する。useの定義がdefのみである場合、当該処理はステップ414に進む。一方、useの定義がdefのみでない場合、当該処理はステップ415に進む。
ステップ414では、最適化処理部(203)は、useが定数Cとの足し算命令のソースオペランドであるかどうかを判定する。なお、定数を引く命令はあらかじめ足し算に変換しているものとする。useが定数Cとの足し算命令のソースオペランドでない場合、当該処理はステップ416に進む。一方、useが定数Cとの足し算命令のソースオペランドである場合、当該処理はステップ417に進む。
ステップ415では、最適化処理部(203)は、useの定義がdefのみでないので、最適化を中止する。従って、コンパイル処理は、最適化処理部(203)での最適化処理を中止し、次の処理(図2、204)へ進む。
ステップ416では、最適化処理部(203)は、useがメモリアクセスへのベースレジスタかどうかを判定する。useがメモリアクセスへのベースレジスタでない場合、当該処理はステップ418に進む。一方、useがメモリアクセスへのベースレジスタである場合、当該処理はステップ419に進む。
ステップ417では、最適化処理部(203)は、足し算の結果が格納されるレジスタと、ステップ411でパラメータとして渡されてきたオフセットに定数Cを加えた値とをパラメータとして、ステップ411への再帰呼び出しを行う。当該処理は、最適化呼び出しから戻ってきたら、ステップ423に戻る。
ステップ418では、最適化処理部(203)は、useがストア命令で格納される値であるかどうかを判定する。useがストア命令で格納される値でない場合、当該処理はステップ421に進む。一方、useがストア命令で格納される値である場合、当該処理はステップ422に進む。
ステップ419では、最適化処理部(203)は、ステップ416で見つけたメモリアクセスである中間コード上の命令に書かれているベースレジスタとオフセットを、別レジスタ(a1)と当該別レジスタ(a1)からのオフセットにそれぞれ変更する。
ステップ420では、別レジスタ(a1)からのオフセット値を基に、ステップ416で見つけたメモリアクセス、及びそのオフセット値をオフセット情報(b1)に登録する。具体的には、オフセット値を検索し、オフセット集合内(a1)に同じオフセット値がある場合、同じオフセットを有するメモリアクセスを1つの要素とみる。それによって、オフセットが同じであるメモリアクセスの集合が得られる。一方、オフセット値が異なるメモリアクセスを、別の要素とみる。それによって、上記と異なるオフセット値を有し、当該異なるオフセットが同じであるメモリアクセスの集合が得られる。上記1つの要素又は上記別の要素についてのオフセット情報(b1)は例えば、オフセット値、対応するメモリアクセス(複数)、ローカル変数の3種類の情報を有する。なお、ローカル変数は、メモリアクセスのローカル変数への置換処理において、図8Aに示すフローチャートに従い生成される。オフセット情報(b1)は例えば、メイン・メモリ(103)内に格納される。そして、当該処理は、ステップ423に進む。
ステップ421では、最適化処理部(203)は、useがコピー命令のソースオペランドであるかどうかを判定する。useがコピー命令のソースオペランドでない場合、当該処理はステップ423に進む。一方、useがコピー命令のソースオペランドである場合、当該処理はステップ424に進む。
ステップ422では、最適化処理部(203)は、ステップ418で見つけたストア命令であるメモリアクセスをリスト(c1)に登録する。リスト(c1)は例えば、メイン・メモリ(103)内に格納される。
ステップ423では、最適化処理部(203)は、ステップ412〜422までのステップを繰り返すために、ステップ412に戻る。
ステップ424では、最適化処理部(203)は、コピー先のレジスタと、ステップ411でパラメータとして渡されてきたオフセットとをパラメータとして、再帰呼び出しを行う。当該処理は、最適化呼び出しから戻ってきたら、ステップ423に戻る。
ステップ425は、サブルーチンanalyze_uses(def, offset)の終了である。
図4Cは、ステップ443及び446が追加されている以外は、図4Bと同じである。すなわち、図4Cのステップ431〜442、444、445及び447は、図4Bのステップ411〜422、424、423及び425にそれぞれ対応する。従って、以下では、図4Cで追加されたステップ443及び446のみを説明する。
ステップ441では、最適化処理部(203)は、useがコピー命令のソースオペランドであるかどうかを判定する。useがコピー命令のソースオペランドでない場合、当該処理はステップ443に進む。一方、useがコピー命令のソースオペランドである場合、当該処理はステップ444に進む。
ステップ443では、最適化処理部(203)は、useがエスケープの条件であるかどうかを判定する。useがエスケープの条件でない場合、当該処理はステップ445に進む。一方、useがエスケープの条件である場合、当該処理はステップ446に進む。
ステップ446では、エスケープ条件であるuse場所の命令をエスケープリスト(d1)に登録する。すなわち、登録された場所がエスケープする場所である。エスケープリスト(d1)は例えば、メイン・メモリ(103)内に格納される。または、エスケープ条件であるuse又はuse場所の命令にフラグを付してもよい。
ステップ451は、サブルーチンpropagate()の開始である。
ステップ452では、最適化処理部(203)は、図4Bのステップ422のメモリアクセスのリスト(c1)又は図4Cのステップ442のメモリアクセスのリスト(c1)の個々のストア命令(以下、storeともいう)について、ステップ453〜458の処理を繰り返し行う。
ステップ453では、最適化処理部(203)は、storeに対応するロード命令について、ステップ454から457の処理を繰り返し行う。
ステップ454では、最適化処理部(203)は、ロード命令に対応する書き込みがstoreのみかを判定する。ロード命令に対応する書き込みがstoreのみである場合、ステップ455に進む。一方、ロード命令に対応する書き込みがstoreのみでない場合、ステップ456に進む。
ステップ455では、最適化処理部(203)は、各ストア命令のオフセット情報(b1)を伝播する。最適化処理部(203)は、は、load結果が格納されるレジスタをスタックポインターであると扱い、その際のストア命令に書き込まれたスタックポインターのオフセット情報をストア命令時のオフセット情報からコピーすることで伝播を行う。すなわち、最適化処理部(203)は、load結果が格納されるレジスタと、storeに書き込まれたスタックポインターのオフセットとをパラメータとして渡し(伝播である)、ステップ411(図4B)又はステップ431(図4C)へのサブルーチンコールを行う。当該処理は、最適化呼び出しから戻ってきたら、ステップ457に戻る。
ステップ456では、最適化処理部(203)は、最適化を中止する。従って、コンパイル処理は、最適化処理部(203)での最適化処理を中止し、次の処理(図2、204)へ進む。
ステップ457では、最適化処理部(203)は、ステップ454〜455までのステップを繰り返すために、ステップ453に戻る。
ステップ458では、最適化処理部(203)は、ステップ453〜457までのステップを繰り返すために、ステップ452に戻る。
ステップ459は、サブルーチンpropagate()の終了である。
図5Aは、ステップ507〜508が追加されている以外は、図4Aと同じである。すなわち、図4Aのステップ401〜406は、図5Aのステップ501〜506にそれぞれ対応する。従って、以下では、図5Aで追加されたステップ507及び508のみを説明する。
ステップ507では、最適化処理部(203)は、ステップ505の後で、スタックポインターがエスケープしていないことを条件に、それ以外のスタックポインターを使ったメモリアクセスをローカル変数アクセスに置き換える。
スタックポインターがエスケープしていないことは、エスケープするスタックポインターを格納したリストが空集合であることによって判定される。スタックポインターがエスケープすることは、(1)スタックポインターの値がメモリ内に書き込まれていること、(2)インラインされないcall命令があること、及び(3)例外を起こしうる命令があること1つ又はそれらの組み合わせである場合である。
ステップ508では、最適化処理部(203)は、ステップ505の後で、且つスタックポインターを使ったメモリアクセスが全てなくなっているならば、スタックポインターの値を増減させる命令を削除する。スタックポインターの値を増減させる命令は例えば、下記図5Bのステップ514で示す定数Cとの足し算命令である。
図5Bのステップ511〜525の各ステップは、図4Bのステップ411〜425の各ステップにそれぞれ対応する。従って、本明細書では、図5Bのステップ511〜525の各ステップの説明を省略する。
図5Cのステップ531〜547の各ステップは、図4Cのステップ431〜447の各ステップにそれぞれ対応する。従って、本明細書では、図5Cのステップ531〜547の各ステップの説明を省略する。
図5Dのステップ551〜559の各ステップは、図4Dのステップ451〜459の各ステップにそれぞれ対応する。従って、本明細書では、図5Dのステップ551〜559の各ステップの説明を省略する。
ステップ601では、フロントエンド処理部(202)は、バイナリコード(211)を中間コード(212)に変換する。
ステップ602では、最適化処理部(203)は、バイナリコード(211)内に含まれるcall命令で呼ばれるコード(コール命令先ともいう)をインラインする際に、インラインする各call命令及びインラインされたコードに、対応するcall番号を付与する。call番号は例えば、各call命令を一意に区別することができる番号である。call番号は例えば、call番号ごとに通し番号が付けられてもよい。また、最適化処理部(203)は、各call命令に付与されたcall番号の親子関係情報を作成する。親子関係情報は呼ぶ方のcall命令のcall番号を親とし、呼ばれる方のcall命令のcall番号を子とする情報であり、例えば、下記図9Aの903に示されているような木構造のグラフで示されうる。また、各call命令に付与されるcall番号のルートとなるcall番号は、インラインをしなかった場合のコード列に付与される番号である。
ステップ603では、最適化処理部(203)は、中間コード(212)からUD/DU連鎖を作成する。UD/DU連鎖については、図4Aにおいて説明したとおりである。
ステップ604では、最適化処理部(203)は、バイナリコード(211)のスタックポインターの元の値(元のSP値)を、別のレジスタ(a3)内に保存する。すなわち、元のSP値を別のレジスタ(a3)にバックアップする。別のレジスタ(a3)は例えば、CPUのレジスタ内、又はメイン・メモリ(103)内に設けられる。
ステップ605では、最適化処理部(203)は、DU連鎖を使用し、スタックポインターの全ての使用位置を解析する。当該解析のフローチャートは、図6Bのサブルーチンにおいて別途示されている。
ステップ606では、最適化処理部(203)は、図6Bにおいて作成されたメモリアクセスのリスト(c3)に登録された個々のストア命令に対応するロード命令に、図6Bのオフセット情報(b3)を伝播する。当該伝播のフローチャートは、図6Cのサブルーチンにおいて別途示されている。
ステップ607では、オフセット情報(b3)を基に、実際にはエイリアスされることがないと分かっている(知られている)同じ領域、例えばレジスタ・セーブ・エリア(レジスタ退避領域ともいう)について、各メモリアクセスをコンパイラ内のローカル変数アクセスに置き換える。詳細には、レジスタをスタックへの保存又は復帰を行うエリアをアクセスする各メモリアクセスについて、ローカル変数情報を基にローカル変数への割り当てを決め、当該ローカル変数アクセスに置き換える。当該ローカル変数は、図8A又は図8Bに従い決められる。当該置換されたローカル変数アクセスがレジスタアクセスに置き換えられる。実際にはエイリアスされることがないと分かっている(知られている)同じメモリアクセスは、各レジスタの値が退避されるスタック領域内へのメモリアクセスでもある。
本発明の第3の実施態様による最適化では、バイナリコード内に含まれるメモリアクセスのうち、レジスタ・セーブ・エリアのみを最適化し、それ以外のメモリアクセスについては最適化を行わない。
本発明の第3の実施態様による最適化は、コンピュータ資源のパフォーマンス向上だけでなく、間接分岐のターゲット・アドレスを分析する上でも有用である。
図6Bのステップ611〜627の各ステップは、図4Cのステップ431〜447の各ステップ又は図5Cのステップ531〜547の各ステップにそれぞれ対応する。従って、本明細書では、図6Bのステップ611〜627の各ステップの説明を省略する。
図6Cのステップ631〜639の各ステップは、図4Dのステップ451〜459の各ステップ又は図5Dのステップ551〜559の各ステップにそれぞれ対応する。従って、本明細書では、図6Cのステップ631〜639の各ステップの説明を省略する。
図7Aは、ステップ707において「置換されたメモリアクセスを削除」すること及びステップ708〜711が追加されている以外は、図6Aと同じである。すなわち、図6Aのステップ601〜606は、図7Aのステップ701〜706にそれぞれ対応する。従って、以下では、図7Aで追加(又は変更)されたステップ707〜711のみを説明する。
ステップ707では、オフセット情報(b4)を基に、実際にはエイリアスされることがないと分かっている(知られている)同じ領域、例えばレジスタ・セーブ・エリア(レジスタ退避領域ともいう)について、各メモリアクセスをコンパイラ内のローカル変数アクセスに置換する。詳細には、レジスタをスタックへの保存又は復帰を行うエリアをアクセスする各メモリアクセスについて、ローカル変数情報を基にローカル変数への割り当てを決め、当該ローカル変数アクセスに置換する。当該ローカル変数は、図8A又は図8Bに従い決められる。当該置換されたローカル変数アクセスがレジスタアクセスに置換される。そして、(d4)から置換されたメモリアクセスが削除される。置換されたメモリアクセスを削除する理由は、メモリアクセスがローカル変数に置き換えられることによって、エスケープした条件から外れるためである。
ステップ708では、最適化処理部(203)は、メモリアクセス置換判断を行う。当該置換判断のフローチャートは、図7Dのサブルーチンにおいて別途示されている。
ステップ709では、最適化処理部(203)は、ステップ708において置換禁止リスト(e4)に記憶されているメモリアクセス以外のメモリアクセスをローカル変数アクセスに置換する。
ステップ710では、最適化処理部(203)は、call番号の切れ目(境目)にローカル変数のコピーを生成する。これは、スタックへのメモリアクセスのオフセットがアクセスする場所が同じだけれども、ローカル変数が違う場合があるために、値を切れ目で統一するためである。詳細には、call番号の切れ目(メソッドの入口部、メソッドの出口部)でオフセットが重なるものがあるならば、ローカル変数のコピーを当該切れ目に生成する。当該コピーの生成のフローチャートは、図7Eのサブルーチンにおいて別途示されている。ステップ710は、下記図8Bに示すcall番号とスタックポインターからのオフセットとの組(ローカル変数情報ともいう)を基にローカル変数への割り当てが決められた場合に実行されうる。下記図8Aに示すオフセットのみを使用する場合、call番号に関わらず、同じメモリアクセスへは同じローカル変数が割り当てられるので、ステップ710を実行する必要はない。
ステップ711では、最適化処理部(203)は、ステップ706の後で、且つスタックポインターを使ったメモリアクセスが全てなくなっているならば、スタックポインターの値を増減させる命令を削除する。スタックポインターの値を増減させる命令は例えば、下記図7Bのステップ724で示す定数Cとの足し算命令である。ステップ711は、任意のステップであり、必ずしも最適化において実行する必要はない。
図7Bのステップ721〜737は、図4Cのステップ431〜447の各ステップ、図5Cのステップ531〜547の各ステップ、又は図6Bのステップ611〜627の各ステップにそれぞれ対応する。従って、本明細書では、図7Bのステップ721〜737の各ステップの説明を省略する。
図7Cのステップ741〜749の各ステップは、図4Dのステップ451〜459の各ステップ、図5Dのステップ551〜559の各ステップ、又は図6Cのステップ631〜639の各ステップにそれぞれ対応する。従って、本明細書では、図7Cのステップ741〜749の各ステップの説明を省略する。
ステップ751は、サブルーチンanalyze_accesses()の開始である。
ステップ752では、最適化処理部(203)は、図7Bのステップ736において登録されたメモリアクセスのリスト(d4)中の個々の命令について、ステップ753の処理を繰り返し行う。
ステップ753では、最適化処理部(203)は、(d4)中の命令、すなわち、エスケープしたスタックポインターの命令を含むcall番号と当該命令を含むcall番号の祖先のcall番号とに含まれるスタックポインターベースのメモリアクセスのローカル変数アクセスへの置換を禁止することを置換禁止リスト(e4)に記憶する。または、(d4)中の命令に、当該メモリアクセスへの置換を禁止することを識別するためのフラグをつけておいてもよい。置換禁止リスト(e4)に登録された又は上記フラグを付けられたメモリアクセスは、ステップ709においてローカル変数アクセスに置き換えられない。祖先のcall番号は、親子関係情報を示す例えば図9Aの木構造(903)を使用し、当該ツリーの上方にたどって行くことによって特定可能である。
なお、スタックポインターがエスケープしたスタックポインターの命令の場所よりも前では、call番号と当該命令を含むcall番号の祖先のcall番号とに含まれるスタックアクセスをレジスタに置き換えるが、最新の値はメモリにもストアするようなバリエーションもありうる。
ステップ754では、最適化処理部(203)は、(d4)中の個々のエスケープ命令の全てについてステップ753を繰り返すために、ステップ752に戻る。
ステップ755は、サブルーチンanalyze_accesses()の終了である。
ステップ761は、サブルーチンgenerate_copy()の開始である。
ステップ762〜766は、インラインしたメソッドの入口部(入口コードともいう)についてのループ処理である。ステップ767〜ステップ770は、インラインしたメソッドの出口部についてのループ処理である。
ステップ762では、最適化処理部(203)は、それぞれのインラインしたメソッドの入口部について、インラインしたcall番号をid(変数)に入れて、ステップ763〜ステップ765を実行する。idは、変数のコピーを生成する必要があるローカル変数を見つけるために、オフセット情報とともに使用される。
ステップ763では、最適化処理部(203)は、idに対応するメモリアクセスMA1について、idの祖先であり且つ境界の外側と内側とで同じオフセットであるところのメモリアクセスMA2(すなわち、オフセットが重なる)を検索する。すなわち、最適化処理部(203)は、同じオフセットにidの祖先がないかを検索し、そして最初に見つかったメモリアクセスをMA2とする。
ステップ764では、同じオフセットであるメモリアクセスMA2がない場合(すなわち、オフセットが重ならない場合)、当該処理はステップ765に進む。一方、同じオフセットであるメモリアクセスMA2がある場合(すなわち、オフセットが重なる場合)、当該処理はステップ766に進む。
ステップ765では、最適化処理部(203)は、idの全てについてステップ763〜764のステップを繰り返すために、ステップ762に戻る。インラインしたcall番号の全てについてステップ763〜764のステップが繰り返された場合は、当該処理はステップ767に進む。
ステップ766では、最適化処理部(203)は、MA2に対応するローカル変数からMA1に対応するローカル変数へのコピーを上記インラインしたメソッドの入口部に生成する。すなわち、最適化処理部(203)は、祖先側からコピーする。当該ローカル変数へのコピーの生成後、当該処理はステップ765に進む。
ステップ767では、最適化処理部(203)は、それぞれのインラインしたメソッドの出口部(出口コードともいう)について、インラインしたcall番号をid(変数)に入れて、ステップ768〜ステップ770を実行する。
ステップ768では、最適化処理部(203)は、idの親call番号(以降、parentという)に対応するメモリアクセスMA3について、id又は当該idの子孫であり且つ同じオフセットであるところのメモリアクセスMA4(すなわち、オフセットが重なる)を検索する。すなわち、最適化処理部(203)は、同じオフセットにidの子孫がないかを検索し、そして最初に見つかったメモリアクセスをMA4とする。
ステップ769では、同じオフセットであるメモリアクセスMA4がない場合(すなわち、オフセットが重ならない場合)、当該処理はステップ770に進む。一方、同じオフセットであるメモリアクセスMA4がある場合(すなわち、オフセットが重なる場合)、当該処理はステップ771に進む。
ステップ770では、最適化処理部(203)は、idの全てについてステップ768〜769のステップを繰り返すために、ステップ767に戻る。インラインしたcall番号の全てについてステップ768〜769のステップが繰り返された場合は、当該処理はステップ772に進む。
ステップ771では、最適化処理部(203)は、MA4に対応するローカル変数からMA3に対応するローカル変数へのコピーを上記インラインしたメソッドの出口部に生成する。すなわち、最適化処理部(203)は、子孫側からコピーする。当該ローカル変数へのコピーの生成後、当該処理はステップ770に進む。
ステップ772は、サブルーチンgenerate_copy()の終了である。
当該フローチャートにおいて、スタックへの各メモリアクセスについて、スタックポインターからのオフセットのみを基に、ローカル変数への割り当てが決められる。
ステップ801は、ローカル変数割り当てを開始する。
ステップ802では、最適化処理部(203)は、ステップ801の引数であるオフセットをオフセット情報集合(b1,b2,b3,b4)から検索する。オフセット情報集合は例えば、図4B及び図4Cのb1(420)、図5B及び図5Cのb2(520)、図6Bのb3(620)、図7Bのb4(730)である。
ステップ803では、最適化処理部(203)は、上記オフセットが上記オフセット集合内にあるかどうかを検査する。オフセットがない場合、当該処理はステップ804に進む。一方、オフセットがある場合、当該処理はステップ805に進む。
ステップ804では、最適化処理部(203)は、新たにローカル変数を作成し、その情報をオフセット情報集合のオフセット対応部分に格納する。最適化処理部(203)は、戻り値(ret)として、当該新たに作成されたローカル変数を取得する。
ステップ805では、最適化処理部(203)は、戻り値(ret)として、対応するローカル変数を取得する。ここで、「対応する」とは、オフセット情報の要素内のローカル変数に格納されている情報である。
ステップ806では、最適化処理部(203)は、ステップ804又はステップ805からの戻り値(ret)をローカル変数として割り当てる。
当該フローチャートにおいて、スタックへの各メモリアクセスについて、call番号とスタックポインターからのオフセットとの組(ローカル変数情報ともいう)を基に、ローカル変数への割り当てが決められる。
ステップ811は、ローカル変数割り当てを開始する。
ステップ812では、最適化処理部(203)は、call番号と上記オフセットとの組(ローカル変数情報)をオフセット情報集合から検索する。
ステップ813では、最適化処理部(203)は、検索された集合内に上記組(ローカル変数情報)があるかどうかを検査する。上記組(ローカル変数情報)がない場合、当該処理はステップ814に進む。一方、上記組(ローカル変数情報)がある場合、当該処理はステップ815に進む。
ステップ814では、最適化処理部(203)は、新たにローカル変数を作成し、その情報をオフセット情報集合のcall番号とオフセットとの組(ローカル変数情報)の対応部分に格納する。そして、最適化処理部(203)は、戻り値(ret)として、当該新たに作成されたローカル変数を取得する。
ステップ815では、最適化処理部(203)は、戻り値(ret)として、対応するローカル変数を取得する。
ステップ816では、最適化処理部(203)は、ステップ814又はステップ815からの戻り値(ret)をローカル変数として割り当てる。
図9Aでは、call命令、return命令、store命令、load命令と各線との関係を記載していないが、図9Bで示されている例示と同じである。従って、図9Bについてまず説明する。
多段のインラインには例えば、if文又はloop文が含まれていてもよい。
call命令(911)は、左から右への矢印で示されている。当該矢印は、callの深さに対応する。call命令(911)によって、callの深さが深くなる。call命令(911)の次にstore命令(913)が実行される。
return命令(912)は、右から左への矢印で示されている。当該矢印は、callの深さに対応する。return命令(912)によって、callの深さが浅くなる。return命令(912)の次にload命令(914)が実行される。
store命令(913)は、上から下への線(二重線)で示されている。
load命令(914)は、上から下への線(三重線)で示されている。
call番号を設定しない場合(901)は、本発明の第1の実施態様(図4A〜図4D)及び本発明の第2の実施態様(図5A〜図5D)に対応する。
call番号を設定する場合(902)は、本発明の第3の実施態様(図6A〜図6C)及び本発明の第4の実施態様(図7A〜図7E)に対応する。
call番号を設定しない場合(901)、スタックポインターが901に示す時点でエスケープすると、ローカル変数アクセスへの置換の禁止が、バイナリコードに含まれるメモリアクセスのうち、レジスタ・セーブ・エリア以外のメモリアクセス全体に及ぶ(塗り潰し部分)。
call番号を設定する場合(902)、call番号の親子関係を考慮するために、call番号の親子関係を示すグラフ(903)が作成される。902では、call番号が丸数字(1〜6)で示されている。ツリーグラフ(903)は、902に示される場合のcall番号(1〜6)の親子関係を示すグラフである。スタックポインターが902に示す時点でエスケープした場合には、ローカル変数アクセスへの置換の禁止がcall番号1及び3に含まれるメモリアクセスにとどまり、それ以外のcall番号2及び4〜6に含まれるメモリアクセスに及ばない。よって、ローカル変数アクセスへの置換の禁止が全体でなくその一部で済む(塗り潰し部分)。従って、call番号を設定する場合はローカル変数アクセスへの置換の禁止が一部で済む(塗り潰し部分)ことから、最適化がそれ以外の部分では行われる点でcall番号を設定しない場合に比べて有利である。
この最適化によって、パフォーマンスだけでなく間接分岐のターゲット・アドレスを分析するためにも有用である。
バイナリコード(1001)は、変換対象のコードである。01〜29の各数字は、説明用に付した番号である。
2つのSTM(store multiple)(01、07)はそれぞれ、レジスタ・セーブ・エリアへ各レジスタをストアしている命令である。
(SP off)(01、07)は、元のSP値からの相対オフセットを表す。
2つのLM(load memory)(25、28)はそれぞれ、レジスタ・セーブ・エリア内の値をレジスタにロードを行っている命令である。
STM(01、07)にそれぞれ、R15 escapesとある。これらは、現時点ではスタックポインターがエスケープしているが、将来的には、最適化によりストアが消えるために、R15がescapeしなくなることを示す。
また、LM(25、28)にそれぞれ、R15 is loadedとある。これらは、スタックポインターがロードされたことによってSP offの値が変化する(-192 => -96等)ことを示す。これは、図7Cに示すオフセット伝播によって変更されたことを表す。
L1〜L4(101、102、103及び104)への代入は、最初に出てくるSTM(01)からの変換結果である。
L5〜L8(109、110、111及び112)への代入は、上記STM(01)の次に出てくるSTM(07)からの変換結果である。
R4 = L7(128)は、最初に出てくるL R4, 0x98(R0,R15)(24)からの変換結果である。
R12 = L5からR15 = L8まで(129、130、131及び132)は、最初に出てくるLM(25)からの変換結果である。
R4 = L3(134)は、上記L R4, 0x98(R0,R15)(24)の次に出てくるL R4,0x98(R0,R15)(27)からの変換結果である。
R12 = L15からR15 = L4まで(135、136、137及び138)は、上記LM(25)の次に出てくるLM(28)からの変換結果である。
また、バイナリコード(1001)で示されるコードの場合において、本発明の第2〜第4の各実施態様に従う最適化を適用した場合、最適化された各コードは本発明の第1の実施態様に従う最適化を適用した場合に得られる最適化コード(1002)と同じである。
ジャスト・イン・タイム(JIT)コンパイラに、本発明の第1の実施態様による最適化方法のプロトタイプを実装した。最適化されたバイナリコード(1002)の実行速度は、同一ハードウェア環境において、最適化前のバイナリコード(1001)の実行速度と比べて約2倍のパフォーマンス改善が観察された。
また、JITコンパイラに、本発明の第2〜第4の各実施態様に従う最適化方法を実装した場合においても、本発明の第1の実施態様に従う最適化方法と同様の結果が得られた。
Claims (15)
- メモリアクセスを含むバイナリコードを最適化するコンパイル方法であって、コンピュータに、
前記バイナリコード内に含まれるコール(call)命令で呼ばれるコードをインラインすることに応じて、前記各コール命令及びインラインされたコードにコール番号を付与するステップであって、当該コール番号について、呼ぶ方のコール命令のコール番号を親とし、呼ばれる方のコール命令のコール番号を子とする親子関係情報をさらに作成するステップを含む、前記付与するステップと、
スタックポインターがエスケープしていた場合に、当該エスケープしたスタックポインターをベースアドレスとするメモリアクセスのうち、当該エスケープを引き起こした命令に付与されたコール番号と、当該コール番号の祖先のコール番号とに属しているメモリアクセスのローカル変数アクセスへの置換を禁止し、一方、残りの禁止しなかったメモリアクセスをローカル変数アクセスに置換するステップであって、前記祖先のコール番号は前記親子関係情報から特定される、前記置換するステップと
を実行させることを含む、前記方法。 - メモリアクセスを含むバイナリコードを最適化するコンパイル方法であって、コンピュータに、
前記バイナリコード内に含まれるコール(call)命令で呼ばれるコードをインラインすることに応じて、前記各コール命令及びインラインされたコードにコール番号を付与するステップであって、当該コール番号について、呼ぶ方のコール命令のコール番号を親とし、呼ばれる方のコール命令のコール番号を子とする親子関係情報をさらに作成するステップを含む、前記付与するステップと、
前記メモリアクセスのうち、各レジスタの値が退避されるスタック領域内へのメモリアクセスをローカル変数アクセスに置換するステップと、
を実行させることを含み、
各レジスタの値が退避されるスタック領域内へのメモリアクセスをローカル変数アクセスに置換する前記ステップが、
前記バイナリコード内においてスタックポインターとしてのレジスタ(以下、第1のレジスタという)を見つけて、当該スタックポインターを他のレジスタ(以下、第2のレジスタという)に保存するステップと、
前記バイナリコード内において、前記第1のレジスタをベースレジスタとして使用しているメモリアクセスを見つけ、当該見つけたメモリアクセスについて、前記第2のレジスタの値からのオフセットを計算するステップと、
前記各メモリアクセスについて、前記コール番号と前記第2のレジスタの値からのオフセットとの組を基にローカル変数を識別するための番号(以下、ローカル変数番号)を作成するステップと、
前記作成されたローカル変数番号に基づいて、前記各レジスタの値が退避されるスタック領域内へのメモリアクセスのローカル変数アクセスへの割り当てを決めて、当該メモリアクセスを当該割り当てられたローカル変数アクセスに置換するステップと
を含む、前記方法。 - 前記禁止しなかったメモリアクセスをローカル変数アクセスに置換する前記ステップが、
前記バイナリコード内においてスタックポインターとしてのレジスタ(以下、第1のレジスタという)を見つけて、当該スタックポインターを他のレジスタ(以下、第2のレジスタという)に保存するステップと、
前記バイナリコード内において、第1のレジスタをベースレジスタとして使用しているメモリアクセスを見つけ、当該メモリアクセスについて、前記第2のレジスタの値からのオフセットを計算するステップと、
前記各メモリアクセスについて、前記コール番号と前記第2のレジスタの値からのオフセットの組を基にローカル変数を識別するための番号(以下、ローカル変数番号)を作成するステップと、
前記作成されたローカル変数番号に基づいて、前記禁止しなかったメモリアクセスのローカル変数アクセスへの割り当てを決めて、当該禁止しなかったメモリアクセスを当該割り当てられたローカル変数アクセスに置換するステップと
を含む、請求項1に記載の方法。 - 前記スタックポインターは、
スタックポインターの値がメモリ内に書き込まれていること、
インラインされないコール命令があること、及び
例外を起こしうる命令があること
の1つ又はそれらの組み合わせである場合にエスケープしている、請求項1に記載の方法。 - 前記コンピュータに、
バイトコード内に含まれるコール命令のインラインしたメソッドの入口部又は出口部について、当該入口部又は出口部の外側と内側とで同じオフセットを有するメモリアクセスがある場合にローカル変数のコピーを前記入口部又は前記出口部にそれぞれ生成するステップをさらに実行させることを含む、請求項2又は3に記載の方法。 - 前記コンピュータに、
スタックポインターがエスケープしていなく、且つスタックポインターを使ったメモリアクセスが全てなくなった場合に、スタックポインターの値を増減させる命令を削除するステップをさらに実行させることを含む、請求項1に記載の方法。 - メモリアクセスを含むバイナリコードを最適化するコンパイル方法であって、コンピュータに、
前記メモリアクセスのうち、各レジスタの値が退避されるスタック領域内へのメモリアクセスをローカル変数アクセスに置換するステップ
を実行させることを含み、
各レジスタの値が退避されるスタック領域内へのメモリアクセスをローカル変数アクセスに置換する前記ステップが、
前記バイナリコード内においてスタックポインターとしてのレジスタ(以下、第1のレジスタという)を見つけて、当該スタックポインターを他のレジスタ(以下、第2のレジスタという)に保存するステップと、
前記バイナリコード内において、前記第1のレジスタをベースレジスタとして使用しているメモリアクセスを見つけ、当該見つけたメモリアクセスについて、前記第2のレジスタの値からのオフセットを計算するステップと、
前記計算されたオフセットのうち、オフセットが同じであるメモリアクセスの集合を取得するステップと、
前記取得した集合のメモリアクセスによりアクセスされるスタック領域がエイリアスされない領域であるかどうかを、前記取得した集合内の各メモリアクセスによりアクセスされる領域が前記各レジスタの値が退避されるスタック領域内への前記メモリアクセスのオフセット値域に入っているか否かによって判断するステップと
を含む、前記方法。 - メモリアクセスを含むバイナリコードを最適化するコンピュータであって、
前記バイナリコード内に含まれるコール(call)命令で呼ばれるコードをインラインすることに応じて、前記各コール命令及びインラインされたコードにコール番号を付与する番号付与部であって、当該コール番号について、呼ぶ方のコール命令のコール番号を親とし、呼ばれる方のコール命令のコール番号を子とする親子関係情報をさらに作成する、前記番号付与部と、
スタックポインターがエスケープしていた場合に、当該エスケープしたスタックポインターをベースアドレスとするメモリアクセスのうち、当該エスケープを引き起こした命令に付与されたコール番号と、当該コール番号の祖先のコール番号とに属しているメモリアクセスのローカル変数アクセスへの置換を禁止し、一方、残りの禁止しなかったメモリアクセスをローカル変数アクセスに置換する置換部であって、前記祖先のコール番号は前記親子関係情報から特定される、前記置換部と
を備えている、前記コンピュータ。 - メモリアクセスを含むバイナリコードを最適化するコンピュータであって、
前記バイナリコード内に含まれるコール(call)命令で呼ばれるコードをインラインすることに応じて、前記各コール命令及びインラインされたコードにコール番号を付与する番号付与部であって、当該コール番号について、呼ぶ方のコール命令のコール番号を親とし、呼ばれる方のコール命令のコール番号を子とする親子関係情報をさらに作成する、前記番号付与部と、
前記メモリアクセスのうち、各レジスタの値が退避されるスタック領域内へのメモリアクセスをローカル変数アクセスに置換する置換部と
を備えており、
前記置換部は、
前記バイナリコード内においてスタックポインターとしてのレジスタ(以下、第1のレジスタという)を見つけて、当該スタックポインターを他のレジスタ(以下、第2のレジスタという)に保存し、
前記バイナリコード内において、前記第1のレジスタをベースレジスタとして使用しているメモリアクセスを見つけ、当該見つけたメモリアクセスについて、前記第2のレジスタの値からのオフセットを計算し、
前記各メモリアクセスについて、前記コール番号と前記第2のレジスタの値からのオフセットとの組を基にローカル変数を識別するための番号(以下、ローカル変数番号)を作成し、
前記作成されたローカル変数番号に基づいて、前記各レジスタの値が退避されるスタック領域内へのメモリアクセスのローカル変数アクセスへの割り当てを決めて、当該メモリアクセスを当該割り当てられたローカル変数アクセスに置換する、
前記コンピュータ。 - 前記置換部が、
前記バイナリコード内においてスタックポインターとしてのレジスタ(以下、第1のレジスタという)を見つけて他のレジスタ(以下、第2のレジスタという)に保存し、
前記バイナリコード内において、第1のレジスタをベースレジスタとして使用しているメモリアクセスを見つけ、当該メモリアクセスについて、前記第2のレジスタの値からのオフセットを計算し、
前記各メモリアクセスについて、前記コール番号と前記第2のレジスタの値からのオフセットの組を基にローカル変数を識別するための番号(ローカル変数番号)を作成し、
前記作成されたローカル変数番号に基づいて、前記禁止しなかったメモリアクセスのローカル変数アクセスへの割り当てを決めて、当該禁止しなかったメモリアクセスを当該割り当てられたローカル変数アクセスに置換する、請求項8に記載のコンピュータ。 - 前記スタックポインターは、
スタックポインターの値がメモリ内に書き込まれていること、
インラインされないコール命令があること、及び
例外を起こしうる命令があること
の1つ又はそれらの組み合わせである場合にエスケープしている、請求項8に記載のコンピュータ。 - バイトコード内に含まれるコール命令のインラインしたメソッドの入口部又は出口部について、当該入口部又は出口部の外側と内側とで同じオフセットを有するメモリアクセスがある場合にローカル変数のコピーを前記入口部又は前記出口部にそれぞれ生成する生成部をさらに備えている、請求項8又は9に記載のコンピュータ。
- スタックポインターがエスケープしていなく、且つスタックポインターを使ったメモリアクセスが全てなくなった場合に、スタックポインターの値を増減させる命令を削除する削除部をさらに備えている、請求項8に記載のコンピュータ。
- メモリアクセスを含むバイナリコードを最適化するコンピュータであって、
前記メモリアクセスのうち、各レジスタの値が退避されるスタック領域内へのメモリアクセスをローカル変数アクセスに置換する置換部
を備えており、
前記置換部が、
前記バイナリコード内においてスタックポインターとしてのレジスタ(以下、第1のレジスタという)を見つけて、当該スタックポインターを他のレジスタ(以下、第2のレジスタという)に保存し、
前記バイナリコード内において、前記第1のレジスタをベースレジスタとして使用しているメモリアクセスを見つけ、当該見つけたメモリアクセスについて、前記第2のレジスタの値からのオフセットを計算し、
前記計算されたオフセットのうち、オフセットが同じであるメモリアクセスの集合を取得し、
前記取得した集合のメモリアクセスによりアクセスされるスタック領域がエイリアスされない領域であるかどうかを、前記取得した集合内の各メモリアクセスによりアクセスされる領域が前記各レジスタの値が退避されるスタック領域内への前記メモリアクセスのオフセット値域に入っているか否かによって判断する、前記コンピュータ。 - コンピュータに、請求項1〜7のいずれか一項に記載の方法の各ステップを実行させるコンピュータ・プログラム。
Priority Applications (2)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2010180043A JP5583514B2 (ja) | 2010-08-11 | 2010-08-11 | バイナリコードを最適化するコンパイル方法、及びそのコンパイラシステム、並びにコンピュータ・プログラム |
US13/206,781 US8689198B2 (en) | 2010-08-11 | 2011-08-10 | Compiling system and method for optimizing binary code |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2010180043A JP5583514B2 (ja) | 2010-08-11 | 2010-08-11 | バイナリコードを最適化するコンパイル方法、及びそのコンパイラシステム、並びにコンピュータ・プログラム |
Publications (2)
Publication Number | Publication Date |
---|---|
JP2012038231A JP2012038231A (ja) | 2012-02-23 |
JP5583514B2 true JP5583514B2 (ja) | 2014-09-03 |
Family
ID=45565719
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
JP2010180043A Expired - Fee Related JP5583514B2 (ja) | 2010-08-11 | 2010-08-11 | バイナリコードを最適化するコンパイル方法、及びそのコンパイラシステム、並びにコンピュータ・プログラム |
Country Status (2)
Country | Link |
---|---|
US (1) | US8689198B2 (ja) |
JP (1) | JP5583514B2 (ja) |
Families Citing this family (11)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
EP2587380B1 (en) * | 2011-10-28 | 2016-01-27 | Software AG | Runtime environment and method for non-invasive monitoring of software applications |
US20130113809A1 (en) * | 2011-11-07 | 2013-05-09 | Nvidia Corporation | Technique for inter-procedural memory address space optimization in gpu computing compiler |
US9830172B2 (en) * | 2012-06-30 | 2017-11-28 | Microsoft Technology Licensing, Llc | Implementing functional kernels using compiled code modules |
JP5967618B2 (ja) * | 2013-04-17 | 2016-08-10 | インターナショナル・ビジネス・マシーンズ・コーポレーションInternational Business Machines Corporation | 二進化十進数型変数へのアクセスを有する言語のバイナリコードを最適化する方法、並びにそのコンピュータ及びコンピュータ・プログラム |
US9378001B2 (en) | 2014-05-02 | 2016-06-28 | Microsoft Technology Licensing, Llc | Matching program sections through feature extraction |
JP2017010123A (ja) * | 2015-06-17 | 2017-01-12 | 富士通株式会社 | コンパイルを行う計算機、コンパイラ方法、およびコンパイラプログラム |
JP2017211842A (ja) * | 2016-05-25 | 2017-11-30 | 富士通株式会社 | 情報処理装置、コンパイル管理方法、およびコンパイルプログラム |
US10261765B1 (en) * | 2018-03-09 | 2019-04-16 | Oracle International Corporation | Enhancing program execution using optimization-driven inlining |
CN112527263B (zh) * | 2019-09-19 | 2022-10-04 | 无锡江南计算技术研究所 | 基于国产异构平台的自适应可变参数优化方法 |
US11188316B2 (en) * | 2020-03-09 | 2021-11-30 | International Business Machines Corporation | Performance optimization of class instance comparisons |
CN113138770B (zh) * | 2021-05-21 | 2022-04-22 | 南京大学 | 一种基于符号执行的栈操作二进制代码优化方法和装置 |
Family Cites Families (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JPH0689187A (ja) * | 1992-09-08 | 1994-03-29 | Hitachi Ltd | インライン展開最適化方法 |
DE69524170T2 (de) * | 1994-09-22 | 2002-05-29 | Sun Microsystems, Inc. | Eingebettete Programmablaufinformation zwecks Zielcodemanipulation |
JPH0962512A (ja) * | 1995-08-23 | 1997-03-07 | Toshiba Corp | 低級言語から高級言語への記述言語変換機能を有するプログラム変換装置及び方法 |
US6223340B1 (en) * | 1998-10-09 | 2001-04-24 | Sun Microsystems, Inc. | Method for directly inlining virtual calls without on-stack replacement |
GB9825102D0 (en) * | 1998-11-16 | 1999-01-13 | Insignia Solutions Plc | Computer system |
US7085914B1 (en) | 2000-01-27 | 2006-08-01 | International Business Machines Corporation | Methods for renaming stack references to processor registers |
JP2008276735A (ja) * | 2007-04-03 | 2008-11-13 | Toshiba Corp | プログラムコード変換装置及びプログラムコード変換方法 |
US8561045B2 (en) * | 2010-07-30 | 2013-10-15 | Apple Inc. | Constructing runtime state for inlined code |
-
2010
- 2010-08-11 JP JP2010180043A patent/JP5583514B2/ja not_active Expired - Fee Related
-
2011
- 2011-08-10 US US13/206,781 patent/US8689198B2/en not_active Expired - Fee Related
Also Published As
Publication number | Publication date |
---|---|
US8689198B2 (en) | 2014-04-01 |
JP2012038231A (ja) | 2012-02-23 |
US20120042306A1 (en) | 2012-02-16 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
JP5583514B2 (ja) | バイナリコードを最適化するコンパイル方法、及びそのコンパイラシステム、並びにコンピュータ・プログラム | |
US7725883B1 (en) | Program interpreter | |
JP5419325B2 (ja) | プログラム・コードを変換するための共用コード・キャッシングの方法および装置 | |
JP4844971B2 (ja) | インタープリタの最適化をプログラム・コード変換の間に実行する方法及び装置 | |
JP4003830B2 (ja) | マルチプロセッシング環境における透過動的最適化のための方法およびシステム | |
Gal et al. | Trace-based just-in-time type specialization for dynamic languages | |
JP5473768B2 (ja) | マルチパス動的プロファイリングのためのコンピュータに実行させる方法、システム及びコンピュータ・プログラム | |
US9798528B2 (en) | Software solution for cooperative memory-side and processor-side data prefetching | |
JP3707727B2 (ja) | プログラムの最適化方法及びこれを用いたコンパイラ | |
JP5460430B2 (ja) | 動的コンパイラプログラム、動的コンパイル方法及び動的コンパイル装置 | |
Leopoldseder et al. | Dominance-based duplication simulation (DBDS): code duplication to enable compiler optimizations | |
US20070240135A1 (en) | Programmatic compiler optimization of glacial constants | |
JP2007531075A5 (ja) | ||
JP4806060B2 (ja) | コンパイラ・プログラム、コンパイル方法及びコンピュータ・システム | |
JPH09330233A (ja) | 最適目的コード生成方法 | |
US8332833B2 (en) | Procedure control descriptor-based code specialization for context sensitive memory disambiguation | |
JP2002527811A (ja) | オンスタックリプレースメントを伴うことなくバーチャルコールを直接にインライン化する方法 | |
WO2008110418A1 (en) | Uniform external and internal interfaces for delinquent memory operations to facilitate cache optimization | |
Brady et al. | Scrapping your inefficient engine: using partial evaluation to improve domain-specific language implementation | |
JP5719278B2 (ja) | 情報処理装置、プロファイル対象決定プログラム及び方法 | |
US8938728B2 (en) | Dynamic compiler program, dynamic compiling method and dynamic compiling device | |
Park et al. | Concurrent JavaScript parsing for faster loading of Web apps | |
US20170344351A1 (en) | Information processing apparatus, compiling management method, and recording medium | |
Besnard et al. | A framework for automatic and parameterizable memoization | |
Saleil | Simple Optimizing JIT Compilation of Higher-Order Dynamic Programming Languages |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
A621 | Written request for application examination |
Free format text: JAPANESE INTERMEDIATE CODE: A621 Effective date: 20130404 |
|
A977 | Report on retrieval |
Free format text: JAPANESE INTERMEDIATE CODE: A971007 Effective date: 20140318 |
|
A131 | Notification of reasons for refusal |
Free format text: JAPANESE INTERMEDIATE CODE: A131 Effective date: 20140409 |
|
A521 | Request for written amendment filed |
Free format text: JAPANESE INTERMEDIATE CODE: A523 Effective date: 20140605 Free format text: JAPANESE INTERMEDIATE CODE: A821 Effective date: 20140605 |
|
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: 20140701 |
|
A521 | Request for written amendment filed |
Free format text: JAPANESE INTERMEDIATE CODE: A821 Effective date: 20140701 |
|
RD14 | Notification of resignation of power of sub attorney |
Free format text: JAPANESE INTERMEDIATE CODE: A7434 Effective date: 20140701 |
|
A61 | First payment of annual fees (during grant procedure) |
Free format text: JAPANESE INTERMEDIATE CODE: A61 Effective date: 20140716 |
|
R150 | Certificate of patent or registration of utility model |
Ref document number: 5583514 Country of ref document: JP Free format text: JAPANESE INTERMEDIATE CODE: R150 |
|
LAPS | Cancellation because of no payment of annual fees |