JP5583514B2 - バイナリコードを最適化するコンパイル方法、及びそのコンパイラシステム、並びにコンピュータ・プログラム - Google Patents

バイナリコードを最適化するコンパイル方法、及びそのコンパイラシステム、並びにコンピュータ・プログラム Download PDF

Info

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
Application number
JP2010180043A
Other languages
English (en)
Other versions
JP2012038231A (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 JP2010180043A priority Critical patent/JP5583514B2/ja
Priority to US13/206,781 priority patent/US8689198B2/en
Publication of JP2012038231A publication Critical patent/JP2012038231A/ja
Application granted granted Critical
Publication of JP5583514B2 publication Critical patent/JP5583514B2/ja
Expired - Fee Related legal-status Critical Current
Anticipated expiration legal-status Critical

Links

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/443Optimisation

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

本発明は、バイナリコードを最適化するコンパイル方法、及びそのコンパイラシステム、並びにコンピュータ・プログラムに関する。
バイナリコードはしばしば、レジスタに対するセーブ(save)命令及びリストア(restore)命令を含む。例えば、IBM(商標)のz/Architectureのアセンブラ・ニーモニックである、STM(store multiple)及びLM(load multiple)である。そして、当該バイナリコードにおいて、レジスタをスタックに保存し、そして復帰するために、メモリアクセスが多く生成される。そこで、コンピュータ資源のパフォーマンス向上のために、これらメモリアクセスをレジスタアクセスに置き換えて高速化することが行われている。
下記特許文献1は、コンピュータ処理システムにおいてスタック参照をリネームする方法を記載する(第4カラム、17〜20行)。当該方法の第1の態様は、アーキテクチャ的に定義されたスタックアクセス方法を使用するスタック参照を検出するステップと、当該スタック参照をプロセッサ内部レジスタに対する参照に置き換えるステップとを含む(第4カラム、21〜27行)。当該方法の第2の態様は、コンピュータ処理システムのプロセッサ内部レジスタとメイン・メモリとの間のアーキテクテッド状態を同期化するステップをさらに含む(第4カラム、28〜31行)。しかしながら、特許文献1に記載の方法は、コンピュータシステム中に組み込まれる新たなハードウェアの仕組みであり、命令実行時において行われる処理を変形する処理である。
下記非特許文献1は、冗長ロード(load)命令除去(RLR)最適化分析を記載する(23〜28頁、第4章「トレースに対する冗長ロード命令除去」)。しかしながら、非特許文献1は、ストア(store)命令の最適化(除去等)を行っていない。
米国特許第7085914号明細書
Joshua Jacobs, "Improving Memory Performance through Runtime Optimization", [online], May 2002, インターネット<URL:http://groups.csail.mit.edu/cag/rio/josh-meng-thesis.pdf>
コンピュータ資源のパフォーマンス向上のために、メモリアクセスをレジスタアクセスに置き換えて高速化するための新たな手法が求められている。また、多くの場合、顧客はソースコードでもある既存のバイナリコードを再コンパイルしたくないか、又は再コンパイルすることができない。さらに、バイナリコード内に含まれるコール(call)命令で呼ばれるコードがコンパイラにより多段にインライン展開された場合であっても、ストア命令及びロード命令のいずれもが効果的に最適化する手法が求められている。
スタックエリアは自分のスレッド以外からはアクセスされないという性質を有する。そこで、本発明者らは、このスタックエリアに注目して、バイナリコードの最適化を行うことを試みた。
まず、本発明者らは、エスケープ解析を使った最適化を抑える主な理由がスタックポインターのセーブ命令及びリストア命令であることを発見した。本発明者らはまた、これらのセーブ命令及びリストア命令が実際にはエイリアスされないことを発見した。これらの発見は、バイナリコードを最適化するために重要である。本発明は、これらの発見に基づいてなされた。すなわち、本発明は、これらのセーブ命令及びリストア命令をまず最適化することにより、エスケープ命令を削減させることができた。
本発明は、メモリアクセスを含むバイナリコードを最適化するコンパイル方法を提供する。当該方法は、コンピュータ、特にはコンパイラ装置によって実行されうる。当該方法は、上記メモリアクセスのうち、各レジスタの値が退避されるスタック領域、例えばレジスタ・セーブ・エリア内へのメモリアクセスについて最適化を行う。また、当該方法は、上記メモリアクセスのうち、各レジスタの値が退避されるスタック領域以外のメモリアクセスについてさらに最適化を行う。当該方法において、バイナリコード内に含まれるcall命令で呼ばれるコードをインラインすることに応じて、前記各コール命令及びインラインされたコードに付与されたcall番号を使用しうる。
また、本発明は、コンピュータ、特にはコンパイラ装置に上記コンパイル方法を実行させるコンピュータ・プログラムを提供する。
また、本発明は、メモリアクセスを含むバイナリコードを最適化するコンピュータ、特にはコンパイラ装置を提供する。
本発明のコンパイル方法では、各レジスタの値が退避されるスタック領域内へのメモリアクセスを最適化することによって、エスケープを引き起こす命令を削減することが可能である。
また、本発明のコンパイラ方法は特には、多段にインライン展開された場合であっても、ストア命令及びロード命令のいずれをも効果的に最適化することが可能である。本発明のコンパイラ方法は特に、バイトコード内に含まれるcall命令が呼ばれるコードがインラインされる場合に有用である。
本発明の実施形態におけるコンピュータ・ハードウェアの基本的なブロック図を示す。 本発明の実施形態における、コンパイラの機能ブロック図を示す。 本発明が組み込まれうる1つの実施態様であるJavaコンパイラを示す。 本発明の第1の実施態様である、バイナリコードを最適化するコンパイル方法のフローチャートを示す。 図4Aのステップ404のサブルーチンanalyze_uses(def, offset)の第1の実施態様を示す。 図4Aのステップ404のサブルーチンanalyze_uses(def, offset)の第2の実施態様を示す。 図4Aのステップ405のサブルーチンpropagate()の実施態様を示す。 本発明の第2の実施態様である、バイナリコードを最適化するコンパイル方法のフローチャートを示す。 図5Aのステップ504のサブルーチンanalyze_uses(def, offset)の第1の実施態様を示す。 図5Aのステップ504のサブルーチンanalyze_uses(def, offset)の第2の実施態様を示す。 図5Aのステップ505のサブルーチンpropagate()の実施態様を示す。 本発明の第3の実施態様である、バイナリコードを最適化するコンパイル方法のフローチャートを示す。 図6Aのステップ605のサブルーチンanalyze_uses(def, offset)の実施態様を示す。 図6Aのステップ606のサブルーチンpropagate()の実施態様を示す。 本発明の第4の実施態様である、バイナリコードを最適化するコンパイル方法のフローチャートを示す。 図7Aのステップ705のサブルーチンanalyze_uses(def, offset)の実施態様を示す。 図7Aのステップ706のサブルーチンpropagate()の実施態様を示す。 図7Aのステップ708のサブルーチンanalyze_accesses()の実施態様を示す。 図7Aのステップ710のサブルーチンgenerate_copy()の実施態様を示す。 本発明の第1〜第4の実施態様におけるローカル変数の割り当てのフローチャートを示す。 本発明の第3の実施態様(図6A〜図6C)及び本発明の第4の実施態様(図7A〜図7E)におけるローカル変数の割り当てのフローチャートを示す。 call番号を設定しない場合(901)及びcall番号を設定する場合(902)におけるローカル変数アクセスへの置換の禁止の相違を示す。 多段にインラインされている状態を示す。 変換対象であるバイナリコードと、当該バイナリコードに本発明の実施態様の最適化を適用した後に生成されるコードを示す。
以下に、本発明の代表的な第1〜第4の実施態様を説明するとともに、当該実施態様が後に述べる各図面どのように対応するかについて括弧書きで説明する。次に、各図面に従って本発明の第1〜第4の実施形態をさらに説明する。なお、本発明の第1〜第4の実施形態は、本発明の好適な形態を説明するためのものであり、本発明の範囲をここで示すものに限定する意図はないことを理解されたい。
本発明の実施形態において、バイナリコード(図2、211)は最適化対象コードである。
本発明の実施態様において、メモリアクセスは、バイナリコード(図2、211)に含まれる。本発明の実施態様において、スタックアクセス、すなわちメモリアクセスを2つのカテゴリに分ける。すなわち、各レジスタの値が退避されるスタック領域、例えばレジスタ・セーブ・エリア内へのメモリアクセスと、それ以外のメモリアクセスである。
それ以外のメモリアクセスには、下記がある。
(1)エスケープしていないスタックポインターを介したメモリアクセスである。
(2)スタックポインターがエスケープしていた場合に、当該エスケープしたスタックポインターをベースアドレスとするメモリアクセスのうち、(i)当該エスケープを引き起こした命令に付与されたcall番号と、当該call番号の祖先のcall番号とに属しているメモリアクセス、及び(ii)(i)以外のメモリアクセスである。call番号とは、バイナリコード内に含まれるcall命令で呼ばれるコードをインラインすることに応じて、各コール命令及びインラインされたコードに付与される番号であり、当該call番号は、呼ぶ方のコール命令のコール番号を親とし、呼ばれる方のコール命令のコール番号を子とする親子関係情報に従う。
本発明では、上記2つのカテゴリに分けたメモリアクセスのうち、各レジスタの値が退避されるスタック領域へのメモリアクセスについてまず最適化をおこなうことが好ましい(下記(A))。その後に、それ以外のメモリアクセスについて最適化をおこなうことが好ましい(下記(B)又は(C))。
本発明の実施態様において、メモリアクセスをローカル変数アクセスに置換する態様は、下記(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つの実施態様の方法において、コンピュータ(図1、101)は、(a)各レジスタの値が退避されるスタック領域内へのメモリアクセスをコンパイラ内のローカル変数アクセスに置換するステップ(図4A、ステップ406;図5A、ステップ506)を実行する。ステップ(a)でバイナリコードの最適化を終了する場合、当該最適化は図4A〜図4Dに示す第1の実施態様である。そして、コンピュータ(図1、101)は、上記置換されたローカル変数をレジスタ割り当ての対象とし、結果的に上記置換されたローカル変数にレジスタアドレスが割り当てられる。
本発明の実施形態において、「各レジスタの値が退避されるスタック領域」とは、実際にはエイリアスされることがないと分かっている領域であり、オペレーティング・システムのリンケージによって決められる。「各レジスタの値が退避されるスタック領域」は例えば、レジスタ・セーブ・エリアであり、さらに具体的には、プロセッサ内の各レジスタをセーブ又はリストアするためのレジスタ・セーブ・エリアである。
コンピュータ(図1、101)はまた、任意的に、(b)スタックポインターがエスケープしていないことを条件に、当該エスケープしていないスタックポインターを介したメモリアクセスをコンパイラ内のローカル変数アクセスに置換するステップ(図5A、ステップ507)をさらに実行してもよい。上記ステップ(a)に加えて、当該ステップ(b)を実行する場合、当該最適化は図5A〜図5Dに示す第2の実施態様である。当該ステップ(b)は、ステップ(a)の実行よりも前に実行されてもよい。そして、コンピュータ(図1、101)は、上記置換されたローカル変数をレジスタ割り当ての対象とし、結果的に上記置換されたローカル変数にレジスタアドレスが割り当てられる。
本発明の1つの実施態様において、上記ステップ(a)は、
上記バイナリコード内においてスタックポインターとしてのレジスタ(第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つの実施態様において、上記スタックポインターは下記の1つ又はそれらの組み合わせである場合にエスケープする:
(1)スタックポインターの値がメモリ内に書き込まれていること、
(2)インラインされないcall命令があること、及び
(3)例外を起こしうる命令があること。
上記ステップ(b)は、エスケープするスタックポインターをリストに格納するステップ(図4C、ステップ446;図5C、ステップ546)をさらに含んでもよい。
上記ステップ(b)はまた、上記スタックポインターがエスケープしていないことを上記リストが空集合であることによって判断するステップ(図5A、ステップ507)をさらに含んでもよい。
本発明の他の実施態様の方法において、コンピュータ(図1、101)は、(A)バイナリコード内に含まれるcall命令で呼ばれるコードをインラインすることに応じて、上記各call命令及びインラインされたコードにcall番号、例えば通し番号を付与するステップ(図6A、ステップ602;図7A、ステップ702)であって、当該call番号について、呼ぶ方のcall命令のcall番号を親とし、呼ばれる方のcall命令のcall番号を子とする親子関係情報、例えば木構造のグラフをさらに作成するステップを含む、上記付与するステップと、(B)各レジスタの値が退避されるスタック領域内へのメモリアクセスを、コンパイラ内のローカル変数アクセスに置換するステップ(図6A、ステップ607;図7A、ステップ707)とを実行する。そして、上記ステップ(B)は、上記ステップ(A)で作成されたcall番号を下記の通り使用する。すなわち、本発明の1つの実施態様において、上記ステップ(B)の置換することは、
上記バイナリコード内においてスタックポインターとしてのレジスタ(第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つの実施態様において、コンピュータ(図1、101)はまた、任意的に、(C)スタックポインターがエスケープしていた場合に、当該エスケープしたスタックポインターをベースアドレスとするメモリアクセスのうち、当該エスケープを引き起こした命令(すなわち、エスケープした命令)に付与されたcall番号と、当該call番号の祖先のcall番号(当該祖先のcall番号は上記親子関係情報から特定される)とに属しているメモリアクセスのローカル変数アクセスへの置換を禁止し(図7A、ステップ753)、一方、残りの禁止しなかったメモリアクセスをコンパイラ内のローカル変数アクセスに置換するステップ(図7D、ステップ709)をさらに実行してもよい。ステップ(A)〜(C)でバイナリコードの最適化を終了する場合、当該最適化は、図7A〜図7Eに示す第4の実施態様である。そして、コンピュータ(図1、101)は、上記置換されたローカル変数をレジスタ割り当ての対象とし、結果的に上記置換されたローカル変数にレジスタアドレスが割り当てられる。
本発明の1つの実施態様において、上記ステップ(C)の禁止しなかったメモリアクセスをローカル変数アクセスに置換するステップが、
上記バイナリコード内においてスタックポインターとしてのレジスタ(第1のレジスタ)を見つけて、当該スタックポインターを他のレジスタ(第2のレジスタ)に保存するステップと(図7A、ステップ704)、
上記バイナリコード内において、第1のレジスタをベースレジスタとして使用しているメモリアクセスを見つけ、当該メモリアクセスについて、上記第2のレジスタの値からのオフセットを計算するステップと(図7A、ステップ705及び706)、
上記各メモリアクセスについて、上記call番号と上記第2のレジスタの値からのオフセットの組を基にローカル変数を識別するための番号(ローカル変数番号)を作成するステップと(図8B)、
上記作成されたローカル変数番号に基づいて、上記禁止しなかったメモリアクセスのローカル変数アクセスへの割り当てを決めて、当該禁止しなかったメモリアクセスを当該割り当てられたローカル変数アクセスに置換するステップと(図7A、ステップ709)
を含む。
本発明の1つの実施態様において、上記スタックポインターは、下記の1つ又はそれらの組み合わせである場合にエスケープしている;
(1)スタックポインターの値がメモリ内に書き込まれていること、
(2)インラインされないコール命令があること、及び
(3)例外を起こしうる命令があること。
本発明の1つの実施態様において、上記他の実施態様の方法は、コンピュータ(図1、101)が、上記バイトコード内に含まれるコール命令のインラインしたメソッドの入口部について、当該入口部の外側と内側とで同じオフセットを有するメモリアクセスがある場合にローカル変数のコピーを当該入口部に生成するステップ(図7E、ステップ763、764及び766)をさらに実行することを含んでもよい。また、上記他の実施態様の方法は、コンピュータ(図1、101)が、上記バイトコード内に含まれるコール命令のインラインしたメソッドの出口部について、当該出口部の外側と内側とで同じオフセットを有するメモリアクセスがある場合にローカル変数のコピーを当該出口部に生成するステップ(図7E、ステップ768、769及び771)をさらに実行することを含んでもよい。
本発明の1つの実施態様において、上記他の実施態様の方法は、コンピュータ(図1、101)が、スタックポインターがエスケープしていなく、且つスタックポインターを使ったメモリアクセスが全てなくなったことに応じて、スタックポインターの値を増減させる命令を削除するステップ(図7A、ステップ711)をさらに実行することを含んでもよい。
本発明の1つの実施態様の、バイナリコードを最適化するコンピュータ(図1、101)において、当該コンピュータは、CPU(図1、102)とメイン・メモリ(図1、103)とを備えており、上記バイナリコードに含まれるメモリアクセスのうち、各レジスタの値が退避されるスタック領域内へのメモリアクセスをローカル変数アクセスに置換する第1の置換部(図2、206)をさらに備えている。コンピュータ(図1、101)は、任意的に、スタックポインターがエスケープしていないことを条件に、当該エスケープしていないスタックポインターを介したメモリアクセスをローカル変数アクセスに置換する第3の置換部(図2、206)をさらに備えている。
本発明の1つの実施態様において、第1の置換部(図2、206)は、
上記バイナリコード内においてスタックポインターとしてのレジスタ(第1のレジスタ)を見つけて、当該スタックポインターを他のレジスタ(第2のレジスタ)に保存し、
上記バイナリコード内において、上記第1のレジスタをベースレジスタとして使用しているメモリアクセスを見つけ、当該見つけたメモリアクセスについて、上記第2のレジスタの値からのオフセットを計算し、
上記計算されたオフセットのうち、オフセットが同じであるメモリアクセスの集合を取得し、
上記取得した集合のメモリアクセスによりアクセスされるスタック領域がエイリアスされない領域であるかどうかを、上記取得した集合内の各メモリアクセスによりアクセスされる領域が前記各レジスタの値が退避されるスタック領域内への前記メモリアクセスのオフセット値域に入っているか否かによって判断する。
本発明の1つの実施態様において、上記スタックポインターは下記の1つ又はそれらの組み合わせである場合にエスケープする:
(1)スタックポインターの値がメモリ内に書き込まれていること、
(2)インラインされないcall命令があること、及び
(3)例外を起こしうる命令があること。
第3の置換部(図2、206)は、エスケープするスタックポインターをリストに格納する。
第3の置換部(図2、206)はまた、上記スタックポインターがエスケープしていないことを上記リストが空集合であることによって判断する。
本発明の他の実施態様の、バイナリコードを最適化するコンピュータ(図1、101)は、
上記バイナリコード内に含まれるコール(call)命令で呼ばれるコードをインラインすることに応じて、上記各コール命令及びインラインされたコードにcall番号を付与するcall番号付与部(図2、205)と、
各レジスタの値が退避されるスタック領域内へのメモリアクセスを、ローカル変数アクセスに置換する第1の置換部(図2、206)と
を備えていてもよい。call番号付与部(図2、205)は、当該call番号について、呼ぶ方のコール命令のcall番号を親とし、呼ばれる方のコール命令のcall番号を子とする親子関係情報をさらに作成する。
コンピュータ(図1、101)はまた、スタックポインターがエスケープしていた場合に、当該エスケープしたスタックポインターをベースアドレスとするメモリアクセスのうち、当該エスケープを引き起こした命令に付与されたcall番号と、当該call番号の祖先のcall番号とに属しているメモリアクセスのローカル変数アクセスへの置換を禁止し、一方、残りの禁止しなかったメモリアクセスをローカル変数アクセスに置換する第2の置換部(図2、206)をさらに備えていてもよい。上記祖先のcall番号は、上記親子関係情報から特定される。
本発明の1つの実施態様において、上記call番号付与部(図2、205)をさらに備えており、第1の置換部(図2、206)が、
上記バイナリコード内においてスタックポインターとしてのレジスタ(第1のレジスタ)を見つけて、当該スタックポインターを他のレジスタ(第2のレジスタ)に保存し、
上記バイナリコード内において、上記第1のレジスタをベースレジスタとして使用しているメモリアクセスを見つけ、当該見つけたメモリアクセスについて、上記第2のレジスタの値からのオフセットを計算し、
上記各メモリアクセスについて、上記call番号と上記第2のレジスタの値からのオフセットとの組を基にローカル変数を識別するための番号(ローカル変数番号)を作成し、
上記作成されたローカル変数番号に基づいて、上記各レジスタの値が退避されるスタック領域内へのメモリアクセスのローカル変数アクセスへの割り当てを決めて、当該メモリアクセスを当該割り当てられたローカル変数アクセスに置換する。
本発明の1つの実施態様において、第2の置換部(図2、206)が、
上記バイナリコード内においてスタックポインターとしてのレジスタ(第1のレジスタ)を見つけて他のレジスタ(第2のレジスタ)に保存し、
上記バイナリコード内において、第1のレジスタをベースレジスタとして使用しているメモリアクセスを見つけ、当該メモリアクセスについて、上記第2のレジスタの値からのオフセットを計算し、
上記各メモリアクセスについて、上記call番号と上記第2のレジスタの値からのオフセットの組を基にローカル変数を識別するための番号(ローカル変数番号)を作成し、
上記作成されたローカル変数番号に基づいて、上記禁止しなかったメモリアクセスのローカル変数アクセスへの割り当てを決めて、当該禁止しなかったメモリアクセスを当該割り当てられたローカル変数アクセスに置換する。
本発明の1つの実施態様において、上記スタックポインターは下記の1つ又はそれらの組み合わせである場合にエスケープしている:
(1)スタックポインターの値がメモリ内に書き込まれていること、
(2)インラインされないcall命令があること、及び
(3)例外を起こしうる命令があること。
本発明の1つの実施態様において、コンピュータ(図1、101)は、上記バイトコード内に含まれるコール命令のインラインしたメソッドの入口部又は出口部について、当該入口部又は出口部の外側と内側とで同じオフセットを有するメモリアクセスがある場合にローカル変数のコピーを上記入口部又は上記出口部にそれぞれ生成する生成部をさらに備えていてもよい。
本発明の1つの実施態様において、コンピュータ(図1、101)は、スタックポインターがエスケープしていなく、且つスタックポインターを使ったメモリアクセスが全てなくなったことに応じて、スタックポインターの値を増減させる命令を削除する削除部をさらに備えていてもよい。
以下では、図面に従って、本発明の第1〜第4の実施形態をさらに説明する。また、以下の図を通して、特に断らない限り、同一の符号は、同一の対象を指す。
図1は、本発明の実施形態におけるコンピュータ・ハードウェアの基本的なブロック図を示す。
コンピュータ(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)が接続されうる。
ディスク(108)には、オペレーティング・システム、J2EEなどのJava(登録商標)処理環境、Java(登録商標)アプリケーション、Java(登録商標)仮想マシン(VM)、Java(登録商標)JITコンパイラを提供するプログラム、その他のプログラム、及びデータが、メイン・メモリにロード可能に記憶されている。
ドライブ(109)は、必要に応じて、CD−ROM、DVD−ROM又はBDからプログラムをディスク(108)にインストールするために使用される。
通信インタフェース(114)は、例えばイーサネット(登録商標)・プロトコルに従う。通信インタフェース(114)は、通信コントローラ(113)を介してバス(104)に接続され、コンピュータ(101)を通信回線(115)に物理的に接続する役割を担い、コンピュータ(101)のオペレーティング・システムの通信機能のTCP/IP通信プロトコルに対して、ネットワーク・インタフェース層を提供する。なお、通信回線は、有線LAN環境、或いは例えばIEEE802.11a/b/g/nなどの無線LAN接続規格に基づく無線LAN環境であってもよい。
図2は、本発明の実施形態における、コンパイラ(201)の機能ブロック図を示す。
コンパイラ(201)は、外部からバイナリコード(211)を受け取り、バイナリコード(211)をコンピュータにより実行可能な実行プログラム(214)に変換する。バイナリコード(211)から実行プログラム(214)への変換において、コンパイラ(201)は、コンピュータ資源を有効に活用するために、最適化を行う。最適化によって、実行プログラムの実行速度を高速化したり、実行プログラムのサイズを低減させたりすることが可能である。
コンパイラ(201)は、フロントエンド処理部(202)、最適化処理部(203),及びコード生成部(204)を備えている。フロントエンド処理部(202)は外部からバイナリコード(211)を受信すると、当該受信したバイナリコード(211)を最適化処理に適した中間コード(212)に変換する。そして、フロントエンド処理部(202)は、中間コード(212)を最適化処理部(203)に送信する。最適化処理部(203)は、中間コード(212)に対して、各種の最適化を行う。最適化処理部(203)は、中間コード(212)を最適化した最適化済プログラム(213)をコード生成部(204)に送信する。コード生成部(204)は、最適化済プログラム(213)を、コンピュータ及びオペレーティング・システムにより実行可能な実行プログラム(214)に変換し、外部に出力する。
本実施形態において、バイナリコード(211)は最適化対象コードであり、例えば、Java(登録商標)のソースコードである。バイナリコード(211)は例えば、次のような性質を有していてもよい。
− アプリケーション・コード(アプリケーション・エミュレーション)
− 当該バイナリコードを呼ぶコードの性質として、次の2つを有する:
・スタックの頂上(Top of stack)を超えたアクセスを行わない、
・スタックポインターレジスタには、スタックポインター以外の値を入れない、
本実施形態において、中間コード(212)は例えば、バイトコード、又はRTL(Register Transfer Language)といった中間言語(中間表現ともいう)によるコードである。バイトコードは例えば、Java(登録商標)のソースコードに所定の変換を行ったJava(登録商標)バイトコード、.NET Frameworkである。RTLは、GNUコンパイラコレクションが使用する中間言語である。最適化対象コードは、中間言語により記述されたプログラムの全体であってもよいし、又は当該プログラムで記述されたプログラムの一部であってもよい。当該プログラムの一部とは例えば、特定の処理のみを行うモジュール又はオブジェクトでありうる。
最適化処理部(203)は、置換部(206)を備えている。最適化処理部(203)はまた、call番号付与部(205)をさらに備えていてもよい。call番号付与部(205)は、本発明の第3の実施態様及び第3の実施態様において使用され、任意の構成である。最適化処理部(203)はまた、生成部をさらに備えていてもよい(図示せず)。最適化処理部(203)はまた、削除部をさらに備えていてもよい(図示せず)。
call番号付与部(205)は、バイナリコード内に含まれるcall命令で呼ばれるコードをインライン展開することに応じて、各call命令にcall番号を付与する。また、call番号付与部(205)は、call番号の親子関係情報を作成する。作成された親子関係情報は例えば、メモリ(103)又は記憶装置(108)に格納されうる。
置換部(206)は、最適化処理部(203)がcall番号付与部(205)を備えていない場合、メモリアクセスのうち、各レジスタの値が退避されるスタック領域内へのメモリアクセスをローカル変数アクセスに置換すること、及び任意的に、スタックポインターがエスケープしていないことを条件に、当該エスケープしていないスタックポインターを介したメモリアクセスをローカル変数アクセスに置換することを行う。なお、置換部(206)は、前者の置換を行う第1の置換部と、後者の置換を行う第3の置換部とにそれぞれ分けられていてもよい。
置換部(206)はまた、最適化処理部(203)がcall番号付与部(205)を備えている場合、各レジスタの値が退避されるスタック領域内へのメモリアクセスを、ローカル変数アクセスに置換すること、及び任意的に、スタックポインターがエスケープしていた場合に、当該エスケープしたスタックポインターをベースアドレスとするメモリアクセスのうち、当該エスケープを引き起こした命令に付与されたcall番号と、当該call番号の祖先のcall番号とに属しているメモリアクセスのローカル変数アクセスへの置換を禁止し、一方、残りの禁止しなかったメモリアクセスをローカル変数アクセスに置換する。なお、置換部(206)は、前者の置換を行う第1の置換部と、後者の置換を行う第2の置換部とに分けられていてもよい。
置換部(206)は、第1の置換部、第2の置換部、及び第3の置換部の全てをそなえていてもよい。そして、ユーザによってバイナリコードの最適化がcall番号を使用して行われないことが選択された場合に、第1の置換部と第3の置換部とが使用されるようにし、一方、ユーザによってバイナリコードの最適化がcall番号を使用して行われないことが選択された場合に、第1の置換部と第2の置換部とが使用されるようにしてもよい。
生成部は、バイトコード内に含まれるコール命令のインラインしたメソッドの入口部又は出口部について、オフセットが重なる場合にローカル変数のコピーを上記入口部又は上記出口部にそれぞれ生成する。
削除部は、スタックポインターがエスケープしていなく、且つスタックポインターを使ったメモリアクセスが全てなくなった場合に、スタックポインターの値を増減させる命令を削除する。
図3は、本発明が組み込まれうる1つの実施態様であるJava(登録商標)コンパイラを示す。
Java(登録商標)で書かれたJavaアプリケーション(301)は、バイトコード(311)と呼ばれる中間言語に変換される。従って、Javaアプリケーション(301)は、Java(登録商標) VM(302)を実装する環境さえ用意すればどのような計算機上でも実行できる。一方、バイトコード(311)を実行する計算機上では、インタープリットするためにオーバーヘッドが問題になる。そこで、ジャスト・イン・タイム(Just-In-Time、JIT)コンパイラ(303)は、バイトコード(311)を実行時に動的に機械語に変換(コンパイル)してネイティブコード(312)に変換するために高速実行を可能にする。
図4Aは、本発明の第1の実施態様である、バイナリコードを最適化するコンパイル方法のフローチャートを示す。
ステップ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の実施態様による最適化では、レジスタ・セーブ・エリアのみを最適化し、それ以外のメモリアクセスについては最適化を行っていない。
図4Bは、図4Aのステップ404のサブルーチンanalyze_uses(def,offset)の第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は、図4Aのステップ404のサブルーチンanalyze_uses(def, offset)の第2の実施態様を示す。
図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場所の命令にフラグを付してもよい。
図4Dは、図4Aのステップ405のサブルーチンpropagate()の実施態様を示す。
ステップ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は、本発明の第2の実施態様である、バイナリコードを最適化するコンパイル方法のフローチャートを示す。
図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は、図5Aのステップ504のサブルーチンanalyze_uses(def,offset)の第1の実施態様を示す。
図5Bのステップ511〜525の各ステップは、図4Bのステップ411〜425の各ステップにそれぞれ対応する。従って、本明細書では、図5Bのステップ511〜525の各ステップの説明を省略する。
図5Cは、図5Aのステップ504のサブルーチンanalyze_uses(def,offset)の第2の実施態様を示す。
図5Cのステップ531〜547の各ステップは、図4Cのステップ431〜447の各ステップにそれぞれ対応する。従って、本明細書では、図5Cのステップ531〜547の各ステップの説明を省略する。
図5Dは、図5Aのステップ505のサブルーチンpropagate()の実施態様を示す。
図5Dのステップ551〜559の各ステップは、図4Dのステップ451〜459の各ステップにそれぞれ対応する。従って、本明細書では、図5Dのステップ551〜559の各ステップの説明を省略する。
図6Aは、本発明の第3の実施態様である、バイナリコードを最適化するコンパイル方法のフローチャートを示す。
ステップ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は、図6Aのステップ605のサブルーチンanalyze_uses(def,offset)の実施態様を示す。
図6Bのステップ611〜627の各ステップは、図4Cのステップ431〜447の各ステップ又は図5Cのステップ531〜547の各ステップにそれぞれ対応する。従って、本明細書では、図6Bのステップ611〜627の各ステップの説明を省略する。
図6Cは、図6Aのステップ606のサブルーチンpropagate()の実施態様を示す。
図6Cのステップ631〜639の各ステップは、図4Dのステップ451〜459の各ステップ又は図5Dのステップ551〜559の各ステップにそれぞれ対応する。従って、本明細書では、図6Cのステップ631〜639の各ステップの説明を省略する。
図7Aは、本発明の第4の実施態様である、バイナリコードを最適化するコンパイル方法のフローチャートを示す。
図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は、図7Aのステップ705のサブルーチンanalyze_uses(def,offset)の実施態様を示す。
図7Bのステップ721〜737は、図4Cのステップ431〜447の各ステップ、図5Cのステップ531〜547の各ステップ、又は図6Bのステップ611〜627の各ステップにそれぞれ対応する。従って、本明細書では、図7Bのステップ721〜737の各ステップの説明を省略する。
図7Cは、図7Aのステップ706のサブルーチンpropagate()の実施態様を示す。
図7Cのステップ741〜749の各ステップは、図4Dのステップ451〜459の各ステップ、図5Dのステップ551〜559の各ステップ、又は図6Cのステップ631〜639の各ステップにそれぞれ対応する。従って、本明細書では、図7Cのステップ741〜749の各ステップの説明を省略する。
図7Dは、図7Aのステップ708のサブルーチンanalyze_accesses()の実施態様を示す。
ステップ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()の終了である。
図7Eは、図7Aのステップ710のサブルーチンgenerate_copy()の実施態様を示す。
ステップ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()の終了である。
図8Aは、本発明の第1〜第4の実施態様におけるローカル変数の割り当てのフローチャートを示す。
当該フローチャートにおいて、スタックへの各メモリアクセスについて、スタックポインターからのオフセットのみを基に、ローカル変数への割り当てが決められる。
ステップ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)をローカル変数として割り当てる。
図8Bは、本発明の第3の実施態様(図6A〜図6C)及び本発明の第4の実施態様(図7A〜図7E)におけるローカル変数の割り当てのフローチャートを示す。
当該フローチャートにおいて、スタックへの各メモリアクセスについて、call番号とスタックポインターからのオフセットとの組(ローカル変数情報ともいう)を基に、ローカル変数への割り当てが決められる。
ステップ811は、ローカル変数割り当てを開始する。
ステップ812では、最適化処理部(203)は、call番号と上記オフセットとの組(ローカル変数情報)をオフセット情報集合から検索する。
ステップ813では、最適化処理部(203)は、検索された集合内に上記組(ローカル変数情報)があるかどうかを検査する。上記組(ローカル変数情報)がない場合、当該処理はステップ814に進む。一方、上記組(ローカル変数情報)がある場合、当該処理はステップ815に進む。
ステップ814では、最適化処理部(203)は、新たにローカル変数を作成し、その情報をオフセット情報集合のcall番号とオフセットとの組(ローカル変数情報)の対応部分に格納する。そして、最適化処理部(203)は、戻り値(ret)として、当該新たに作成されたローカル変数を取得する。
ステップ815では、最適化処理部(203)は、戻り値(ret)として、対応するローカル変数を取得する。
ステップ816では、最適化処理部(203)は、ステップ814又はステップ815からの戻り値(ret)をローカル変数として割り当てる。
図8Bのローカル変数の割り当ては、スタックポインターからのオフセットに加えて、call番号を使用している点で、図8Aのローカル変数の割り当てと異なる。図8Bの割り当ては、以下の理由により図8Aの割り当てに比べて最適化に対する長所を有する。図8Aの割り当てではオフセットが同じであればcall番号にかかわらず、同じローカル変数が割り当てられる。一方、図8Bの割り当てではオフセットが同じであってもcall番号が変わると異なるローカル変数が割り当てられる。本発明の実施態様において、スタックポインターレジスタがエスケープしているかどうかによって、当該エスケープに関わる最適化に影響が及ぼされる。従って、異なるcall番号であるならば、その中のメモリアクセスに別々のローカル変数を割り当てた方が、実行速度(性能)が良くなる。例えば、図8Bの処理において、call番号が違うために、同じオフセットのメモリアクセスが変数Aと変数Bとに分かれたとする。変数Aに関連付けられたメモリアクセスが10個あり、変数Bに関連付けられたメモリアクセスが20個あったとする。変数Aがエスケープしていた場合、影響するメモリアクセスは10個である。すなわち、変数Aに関連付けられたメモリアクセスの数と同じである。一方、図8Aの処理では変数Aと変数Bとが統合され、変数Cとなる。変数Cに関連付けられたメモリアクセスは30個である。すなわち、統合される前の、変数Aに関連付けられたメモリアクセスの数と変数Bに関連付けられたメモリアクセスの総数である。従って、変数Cがエスケープした場合、影響するメモリアクセスは30個となる。そのために、図8Aの割り当てよりも、図8Bの割り当てを使った方が当該割り当ての後に行われる最適化にとって都合がよい。
図9Aは、call番号を設定しない場合(901)及びcall番号を設定する場合(902)におけるローカル変数アクセスへの置換の禁止の相違を示す。
図9Aでは、call命令、return命令、store命令、load命令と各線との関係を記載していないが、図9Bで示されている例示と同じである。従って、図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)は、上から下への線(三重線)で示されている。
図9Aに戻って説明する。
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番号を設定しない場合に比べて有利である。
この最適化によって、パフォーマンスだけでなく間接分岐のターゲット・アドレスを分析するためにも有用である。
図10は、変換対象であるバイナリコードと、当該バイナリコードに本発明の実施態様最適化を適用した後に生成されるコードを示す。
バイナリコード(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に示すオフセット伝播によって変更されたことを表す。
バイナリコード(1001)に、本発明の第1の実施態様に従う最適化を適用した。その結果、最適化されたコード(1002)が生成された。101〜139の各数字は、説明用に付した番号である。斜線文字は、当該最適化によって、変更されたコードを示す。
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)

  1. メモリアクセスを含むバイナリコードを最適化するコンパイル方法であって、コンピュータに、
    前記バイナリコード内に含まれるコール(call)命令で呼ばれるコードをインラインすることに応じて、前記各コール命令及びインラインされたコードにコール番号を付与するステップであって、当該コール番号について、呼ぶ方のコール命令のコール番号を親とし、呼ばれる方のコール命令のコール番号を子とする親子関係情報をさらに作成するステップを含む、前記付与するステップと、
    スタックポインターがエスケープしていた場合に、当該エスケープしたスタックポインターをベースアドレスとするメモリアクセスのうち、当該エスケープを引き起こした命令に付与されたコール番号と、当該コール番号の祖先のコール番号とに属しているメモリアクセスのローカル変数アクセスへの置換を禁止し、一方、残りの禁止しなかったメモリアクセスをローカル変数アクセスに置換するステップであって、前記祖先のコール番号は前記親子関係情報から特定される、前記置換するステップと
    を実行させることを含む、前記方法。
  2. メモリアクセスを含むバイナリコードを最適化するコンパイル方法であって、コンピュータに、
    前記バイナリコード内に含まれるコール(call)命令で呼ばれるコードをインラインすることに応じて、前記各コール命令及びインラインされたコードにコール番号を付与するステップであって、当該コール番号について、呼ぶ方のコール命令のコール番号を親とし、呼ばれる方のコール命令のコール番号を子とする親子関係情報をさらに作成するステップを含む、前記付与するステップと、
    前記メモリアクセスのうち、各レジスタの値が退避されるスタック領域内へのメモリアクセスをローカル変数アクセスに置換するステップと、
    実行させることを含み、
    各レジスタの値が退避されるスタック領域内へのメモリアクセスをローカル変数アクセスに置換する前記ステップが、
    前記バイナリコード内においてスタックポインターとしてのレジスタ(以下、第1のレジスタという)を見つけて、当該スタックポインターを他のレジスタ(以下、第2のレジスタという)に保存するステップと、
    前記バイナリコード内において、前記第1のレジスタをベースレジスタとして使用しているメモリアクセスを見つけ、当該見つけたメモリアクセスについて、前記第2のレジスタの値からのオフセットを計算するステップと、
    前記各メモリアクセスについて、前記コール番号と前記第2のレジスタの値からのオフセットとの組を基にローカル変数を識別するための番号(以下、ローカル変数番号)を作成するステップと、
    前記作成されたローカル変数番号に基づいて、前記各レジスタの値が退避されるスタック領域内へのメモリアクセスのローカル変数アクセスへの割り当てを決めて、当該メモリアクセスを当該割り当てられたローカル変数アクセスに置換するステップと
    を含む、前記方法。
  3. 前記禁止しなかったメモリアクセスをローカル変数アクセスに置換する前記ステップが、
    前記バイナリコード内においてスタックポインターとしてのレジスタ(以下、第1のレジスタという)を見つけて、当該スタックポインターを他のレジスタ(以下、第2のレジスタという)に保存するステップと、
    前記バイナリコード内において、第1のレジスタをベースレジスタとして使用しているメモリアクセスを見つけ、当該メモリアクセスについて、前記第2のレジスタの値からのオフセットを計算するステップと、
    前記各メモリアクセスについて、前記コール番号と前記第2のレジスタの値からのオフセットの組を基にローカル変数を識別するための番号(以下、ローカル変数番号)を作成するステップと、
    前記作成されたローカル変数番号に基づいて、前記禁止しなかったメモリアクセスのローカル変数アクセスへの割り当てを決めて、当該禁止しなかったメモリアクセスを当該割り当てられたローカル変数アクセスに置換するステップと
    を含む、請求項に記載の方法。
  4. 前記スタックポインターは、
    スタックポインターの値がメモリ内に書き込まれていること、
    インラインされないコール命令があること、及び
    例外を起こしうる命令があること
    の1つ又はそれらの組み合わせである場合にエスケープしている、請求項に記載の方法。
  5. 前記コンピュータに、
    イトコード内に含まれるコール命令のインラインしたメソッドの入口部又は出口部について、当該入口部又は出口部の外側と内側とで同じオフセットを有するメモリアクセスがある場合にローカル変数のコピーを前記入口部又は前記出口部にそれぞれ生成するステップをさらに実行させることを含む、請求項又はに記載の方法。
  6. 前記コンピュータに、
    スタックポインターがエスケープしていなく、且つスタックポインターを使ったメモリアクセスが全てなくなった場合に、スタックポインターの値を増減させる命令を削除するステップをさらに実行させることを含む、請求項に記載の方法。
  7. メモリアクセスを含むバイナリコードを最適化するコンパイル方法であって、コンピュータに、
    前記メモリアクセスのうち、各レジスタの値が退避されるスタック領域内へのメモリアクセスをローカル変数アクセスに置換するステップ
    を実行させることを含み、
    各レジスタの値が退避されるスタック領域内へのメモリアクセスをローカル変数アクセスに置換する前記ステップが、
    前記バイナリコード内においてスタックポインターとしてのレジスタ(以下、第1のレジスタという)を見つけて、当該スタックポインターを他のレジスタ(以下、第2のレジスタという)に保存するステップと、
    前記バイナリコード内において、前記第1のレジスタをベースレジスタとして使用しているメモリアクセスを見つけ、当該見つけたメモリアクセスについて、前記第2のレジスタの値からのオフセットを計算するステップと、
    前記計算されたオフセットのうち、オフセットが同じであるメモリアクセスの集合を取得するステップと、
    前記取得した集合のメモリアクセスによりアクセスされるスタック領域がエイリアスされない領域であるかどうかを、前記取得した集合内の各メモリアクセスによりアクセスされる領域が前記各レジスタの値が退避されるスタック領域内への前記メモリアクセスのオフセット値域に入っているか否かによって判断するステップと
    を含む、前記方法。
  8. メモリアクセスを含むバイナリコードを最適化するコンピュータであって、
    前記バイナリコード内に含まれるコール(call)命令で呼ばれるコードをインラインすることに応じて、前記各コール命令及びインラインされたコードにコール番号を付与する番号付与部であって、当該コール番号について、呼ぶ方のコール命令のコール番号を親とし、呼ばれる方のコール命令のコール番号を子とする親子関係情報をさらに作成する、前記番号付与部と、
    スタックポインターがエスケープしていた場合に、当該エスケープしたスタックポインターをベースアドレスとするメモリアクセスのうち、当該エスケープを引き起こした命令に付与されたコール番号と、当該コール番号の祖先のコール番号とに属しているメモリアクセスのローカル変数アクセスへの置換を禁止し、一方、残りの禁止しなかったメモリアクセスをローカル変数アクセスに置換する置換部であって、前記祖先のコール番号は前記親子関係情報から特定される、前記置換部と
    を備えている、前記コンピュータ。
  9. メモリアクセスを含むバイナリコードを最適化するコンピュータであって、
    前記バイナリコード内に含まれるコール(call)命令で呼ばれるコードをインラインすることに応じて、前記各コール命令及びインラインされたコードにコール番号を付与する番号付与部であって、当該コール番号について、呼ぶ方のコール命令のコール番号を親とし、呼ばれる方のコール命令のコール番号を子とする親子関係情報をさらに作成する、前記番号付与部と、
    前記メモリアクセスのうち、各レジスタの値が退避されるスタック領域内へのメモリアクセスをローカル変数アクセスに置換する置換部と
    備えており、
    記置換部は、
    前記バイナリコード内においてスタックポインターとしてのレジスタ(以下、第1のレジスタという)を見つけて、当該スタックポインターを他のレジスタ(以下、第2のレジスタという)に保存し、
    前記バイナリコード内において、前記第1のレジスタをベースレジスタとして使用しているメモリアクセスを見つけ、当該見つけたメモリアクセスについて、前記第2のレジスタの値からのオフセットを計算し、
    前記各メモリアクセスについて、前記コール番号と前記第2のレジスタの値からのオフセットとの組を基にローカル変数を識別するための番号(以下、ローカル変数番号)を作成し、
    前記作成されたローカル変数番号に基づいて、前記各レジスタの値が退避されるスタック領域内へのメモリアクセスのローカル変数アクセスへの割り当てを決めて、当該メモリアクセスを当該割り当てられたローカル変数アクセスに置換する、
    前記コンピュータ。
  10. 記置換部が、
    前記バイナリコード内においてスタックポインターとしてのレジスタ(以下、第1のレジスタという)を見つけて他のレジスタ(以下、第2のレジスタという)に保存し、
    前記バイナリコード内において、第1のレジスタをベースレジスタとして使用しているメモリアクセスを見つけ、当該メモリアクセスについて、前記第2のレジスタの値からのオフセットを計算し、
    前記各メモリアクセスについて、前記コール番号と前記第2のレジスタの値からのオフセットの組を基にローカル変数を識別するための番号(ローカル変数番号)を作成し、
    前記作成されたローカル変数番号に基づいて、前記禁止しなかったメモリアクセスのローカル変数アクセスへの割り当てを決めて、当該禁止しなかったメモリアクセスを当該割り当てられたローカル変数アクセスに置換する、請求項に記載のコンピュータ。
  11. 前記スタックポインターは、
    スタックポインターの値がメモリ内に書き込まれていること、
    インラインされないコール命令があること、及び
    例外を起こしうる命令があること
    の1つ又はそれらの組み合わせである場合にエスケープしている、請求項に記載のコンピュータ。
  12. イトコード内に含まれるコール命令のインラインしたメソッドの入口部又は出口部について、当該入口部又は出口部の外側と内側とで同じオフセットを有するメモリアクセスがある場合にローカル変数のコピーを前記入口部又は前記出口部にそれぞれ生成する生成部をさらに備えている、請求項又はに記載のコンピュータ。
  13. スタックポインターがエスケープしていなく、且つスタックポインターを使ったメモリアクセスが全てなくなった場合に、スタックポインターの値を増減させる命令を削除する削除部をさらに備えている、請求項に記載のコンピュータ。
  14. メモリアクセスを含むバイナリコードを最適化するコンピュータであって、
    前記メモリアクセスのうち、各レジスタの値が退避されるスタック領域内へのメモリアクセスをローカル変数アクセスに置換する置換部
    を備えており、
    記置換部が、
    前記バイナリコード内においてスタックポインターとしてのレジスタ(以下、第1のレジスタという)を見つけて、当該スタックポインターを他のレジスタ(以下、第2のレジスタという)に保存し、
    前記バイナリコード内において、前記第1のレジスタをベースレジスタとして使用しているメモリアクセスを見つけ、当該見つけたメモリアクセスについて、前記第2のレジスタの値からのオフセットを計算し、
    前記計算されたオフセットのうち、オフセットが同じであるメモリアクセスの集合を取得し、
    前記取得した集合のメモリアクセスによりアクセスされるスタック領域がエイリアスされない領域であるかどうかを、前記取得した集合内の各メモリアクセスによりアクセスされる領域が前記各レジスタの値が退避されるスタック領域内への前記メモリアクセスのオフセット値域に入っているか否かによって判断する、前記コンピュータ。
  15. コンピュータに、請求項1〜のいずれか一項に記載の方法の各ステップを実行させるコンピュータ・プログラム。
JP2010180043A 2010-08-11 2010-08-11 バイナリコードを最適化するコンパイル方法、及びそのコンパイラシステム、並びにコンピュータ・プログラム Expired - Fee Related JP5583514B2 (ja)

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)

* Cited by examiner, † Cited by third party
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)

* Cited by examiner, † Cited by third party
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

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