(57)【要約】【課題】例えばＪａｖａバイトコードのような変換処理対象コードを機械語コードへ変換するコード変換装置１０が、効果的なプリフェッチに係る機械語コードを生成できるようにする。【解決手段】プログラム上のループの各イテレーションにおけるポインタ参照ロード命令と、各イテレーションにおいてポインタ参照ロード命令に対するデータ依存ロード命令とに着目する。第１及び第２の検出手段１７，１８は、ヒープメモリ１９にアクセスして、ポインタ参照ロード命令及びデータ依存ロード命令に係るイテレーション間及び内のストライドを調べる。第１及び第２の機械語コード部分生成手段は、設定手段２２の設定したイテレーション間及びイテレーション内定数ストライドに基づき所定の機械語コード部分を生成する。結果、機械語コード実行時では、データ依存ロード命令に係るデータがヒープメモリ１３からキャッシュメモリへ効果的にプリフェッチされる。【選択図】      図８
2004355279.tif 000002
【特許請求の範囲】
【請求項１】
変換処理対象コードを機械語コードへ変換するコード変換装置において、
所定のループＡにおける複数個のイテレーションの内で連続する所定個数ｎのイテレーションＢ＜ｓｕｂ＞１＜／ｓｕｂ＞，Ｂ＜ｓｕｂ＞２＜／ｓｕｂ＞，〜，Ｂ＜ｓｕｂ＞ｎ＜／ｓｕｂ＞（なお、Ｂ＜ｓｕｂ＞１＜／ｓｕｂ＞はループＡにおける１番目のイテレーションＢであることに限定されない。）を選択しそれらイテレーションＢ＜ｓｕｂ＞１＜／ｓｕｂ＞，Ｂ＜ｓｕｂ＞２＜／ｓｕｂ＞，〜，Ｂ＜ｓｕｂ＞ｎ＜／ｓｕｂ＞における変換処理対象コード上のポインタ参照ロード命令Ｃ＜ｓｕｂ＞１，１＜／ｓｕｂ＞，Ｃ＜ｓｕｂ＞２，１＜／ｓｕｂ＞，〜，Ｃ＜ｓｕｂ＞ｎ，１＜／ｓｕｂ＞に着目する第１の着目手段、
各イテレーションＢ＜ｓｕｂ＞１＜／ｓｕｂ＞，Ｂ＜ｓｕｂ＞２＜／ｓｕｂ＞，〜，Ｂ＜ｓｕｂ＞ｎ＜／ｓｕｂ＞における変換処理対象コード上の他のロード命令であってポインタ参照ロード命令Ｃ＜ｓｕｂ＞１，１＜／ｓｕｂ＞，Ｃ＜ｓｕｂ＞２，１＜／ｓｕｂ＞，〜，Ｃ＜ｓｕｂ＞ｎ，１＜／ｓｕｂ＞にデータ依存するロード命令としてのデータ依存ロード命令Ｃ＜ｓｕｂ＞１，２＜／ｓｕｂ＞，Ｃ＜ｓｕｂ＞２，２＜／ｓｕｂ＞，〜，Ｃ＜ｓｕｂ＞ｎ，２＜／ｓｕｂ＞に着目する第２の着目手段、
ポインタ参照ロード命令Ｃ＜ｓｕｂ＞１，１＜／ｓｕｂ＞，Ｃ＜ｓｕｂ＞２，１＜／ｓｕｂ＞，〜，Ｃ＜ｓｕｂ＞ｎ，１＜／ｓｕｂ＞に基づきプロセッサがロードするデータとしての参照値Ｕ＜ｓｕｂ＞１，１＜／ｓｕｂ＞，Ｕ＜ｓｕｂ＞２，１＜／ｓｕｂ＞，〜，Ｕ＜ｓｕｂ＞ｎ，１＜／ｓｕｂ＞に対してそれらがヒープメモリにおいて格納されているアドレスＵ＜ｓｕｂ＞１，０＜／ｓｕｂ＞，Ｕ＜ｓｕｂ＞２，０＜／ｓｕｂ＞，〜，Ｕ＜ｓｕｂ＞ｎ，０＜／ｓｕｂ＞を検出する第１の検出手段、
前記データ依存ロード命令Ｃ＜ｓｕｂ＞ｒ，２＜／ｓｕｂ＞〜Ｃ＜ｓｕｂ＞ｓ，２＜／ｓｕｂ＞（ただし１≦ｒ＜ｓ≦ｎ）に基づきプロセッサがロードするデータＵ＜ｓｕｂ＞ｒ，２＜／ｓｕｂ＞，Ｕ＜ｓｕｂ＞ｒ＋１，２＜／ｓｕｂ＞，〜，Ｕ＜ｓｕｂ＞ｓ，２＜／ｓｕｂ＞に対してそれらがヒープメモリにおいて格納されているアドレスＵ＜ｓｕｂ＞ｒ，ｙ＜／ｓｕｂ＞，Ｕ＜ｓｕｂ＞ｒ＋１，ｙ＜／ｓｕｂ＞，〜，Ｕ＜ｓｕｂ＞ｓ，ｙ＜／ｓｕｂ＞を検出する第２の検出手段、
相互に隣接するイテレーションの前記ポインタ参照ロード命令のロードデータのアドレスの差分Ｕ＜ｓｕｂ＞２，０＜／ｓｕｂ＞−Ｕ＜ｓｕｂ＞１，０＜／ｓｕｂ＞，Ｕ＜ｓｕｂ＞３，０＜／ｓｕｂ＞−Ｕ＜ｓｕｂ＞２，０＜／ｓｕｂ＞，〜，Ｕ＜ｓｕｂ＞ｎ，０＜／ｓｕｂ＞−Ｕ＜ｓｕｂ＞ｎ−１，０＜／ｓｕｂ＞をイテレーション間ストライドＦ１として計算する第１の計算手段、
各イテレーションにおける前記ポインタ参照ロード命令の参照値Ｕ＜ｓｕｂ＞ｒ，１＜／ｓｕｂ＞，Ｕ＜ｓｕｂ＞ｒ＋１，１＜／ｓｕｂ＞，〜，Ｕ＜ｓｕｂ＞ｓ，１＜／ｓｕｂ＞と前記データ依存ロード命令のロードデータのアドレスＵ＜ｓｕｂ＞ｒ，ｙ＜／ｓｕｂ＞，Ｕ＜ｓｕｂ＞ｒ＋１，ｙ＜／ｓｕｂ＞，〜，Ｕ＜ｓｕｂ＞ｓ，ｙ＜／ｓｕｂ＞との差分Ｕ＜ｓｕｂ＞ｒ，ｙ＜／ｓｕｂ＞−Ｕ＜ｓｕｂ＞ｒ，１＜／ｓｕｂ＞，Ｕ＜ｓｕｂ＞ｒ＋１，ｙ＜／ｓｕｂ＞−Ｕ＜ｓｕｂ＞ｒ＋１，１＜／ｓｕｂ＞，Ｕ＜ｓｕｂ＞ｓ，ｙ＜／ｓｕｂ＞−Ｕ＜ｓｕｂ＞ｓ，１＜／ｓｕｂ＞をイテレーション内ストライドＦ２として計算する第２の計算手段、
相互に同一となっているイテレーション間ストライドＦ１がイテレーション間ストライドＦ１の総数に対して第１の割合以上存在しかつ相互に同一となっているイテレーション内ストライドＦ２がイテレーション内ストライドＦ２の総数に対して第２の割合以上存在すると言う条件が満たされるか否かを判定する判定手段、
前記判定手段の判定が「正」である場合には該同一のイテレーション間ストライドＦ１及び該同一のイテレーション内ストライドＦ２に基づいてそれぞれイテレーション間定数ストライドＦｘ及びイテレーション内定数ストライドＦｙを設定する設定手段、
ループＡのイテレーションＢ＜ｓｕｂ＞ａ＜／ｓｕｂ＞におけるポインタ参照ロード命令Ｃ＜ｓｕｂ＞ａ，１＜／ｓｕｂ＞に基づいてプロセッサがロードするデータＵ＜ｓｕｂ＞ａ，１＜／ｓｕｂ＞がヒープメモリにおいて格納されているアドレスＵ＜ｓｕｂ＞ａ，０＜／ｓｕｂ＞及び自然数ｐ（ただし、イテレーションＢ＜ｓｕｂ＞ａ＜／ｓｕｂ＞よりｐ個、後のイテレーションをイテレーションＢ＜ｓｕｂ＞ｂ＜／ｓｕｂ＞とすると、イテレーションＢ＜ｓｕｂ＞ｂ＜／ｓｕｂ＞はループＡの最後のイテレーションを越えない。）に対してヒープメモリ上のアドレスＵ＜ｓｕｂ＞ｂ，０＜／ｓｕｂ＞（＝Ｕ＜ｓｕｂ＞ａ，０＜／ｓｕｂ＞＋ｐ・Ｆｘ）にアクセスして該アドレスＵ＜ｓｕｂ＞ｂ，０＜／ｓｕｂ＞のデータＵ＜ｓｕｂ＞ｂ，１＜／ｓｕｂ＞を検出する機械語コード部分Ｈ１を生成する第１の機械語コード部分生成手段、及び
プロセッサがループＡのイテレーションＢ＜ｓｕｂ＞ｂ＜／ｓｕｂ＞を実行するのに先立ち、ヒープメモリ上のアドレス（Ｕ＜ｓｕｂ＞ｂ，１＜／ｓｕｂ＞＋Ｆｙ）のデータＵ＜ｓｕｂ＞ｂ，２＜／ｓｕｂ＞をヒープメモリからキャッシュメモリへプリフェッチする機械語コード部分Ｈ２を生成する第２の機械語コード部分生成手段、
を有していることを特徴とするコード変換装置。
【請求項２】
前記変換処理対象コードはＪａｖａのバイトコードであることを特徴とする請求項１記載のコード変換装置。
【請求項３】
前記コード変換装置はＪＩＴコンパイラであることを特徴とする請求項１記載のコード変換装置。
【請求項４】
前記第１及び前記第２の機械語コード部分生成手段は、前記機械語コード部分Ｈ１，Ｈ２を、前記イテレーションＢ＜ｓｕｂ＞ａ＜／ｓｕｂ＞を実行する機械語コード範囲に配置することを特徴とする請求項１記載のコード変換装置。
【請求項５】
機械語としてプリフェッチ命令Ｊ１及び投機的ロード命令Ｊ２を装備するプロセッサ用のコード変換装置において、
前記第１の機械語コード部分生成手段は、前記機械語コード部分Ｈ１が、アドレスＵ＜ｓｕｂ＞ｂ，０＜／ｓｕｂ＞（＝Ｕ＜ｓｕｂ＞ａ，０＜／ｓｕｂ＞＋ｐ・Ｆｘ）のデータＵ＜ｓｕｂ＞ｂ，１＜／ｓｕｂ＞をロードする投機的ロード命令Ｊ２を含むように、前記機械語コード部分Ｈ１を生成し、
前記第２の機械語コード部分生成手段は、前記機械語コード部分Ｈ２が、アドレス（Ｕ＜ｓｕｂ＞ｂ，１＜／ｓｕｂ＞＋Ｆｙ）のデータＵ＜ｓｕｂ＞ｂ，２＜／ｓｕｂ＞をプリフェッチするプリフェッチ命令Ｊ１を含むように、前記機械語コード部分Ｈ２を生成する、
ことを特徴とする請求項１記載のコード変換装置。
【請求項６】
機械語としてプリフェッチ命令Ｊ１及びロード命令Ｊ３を装備するプロセッサ用のコード変換装置において、
前記第１の機械語コード部分生成手段は、前記機械語コード部分Ｈ１が、アクセス違反を調べる条件用分岐命令によりガードされたロード命令Ｊ３によりアドレスＵ＜ｓｕｂ＞ｂ，０＜／ｓｕｂ＞（＝Ｕ＜ｓｕｂ＞ａ，０＜／ｓｕｂ＞＋ｐ・Ｆｘ）のデータＵ＜ｓｕｂ＞ｂ，１＜／ｓｕｂ＞を検出する処理を含むように、機械語コード部分Ｈ１を生成し、
前記第２の機械語コード部分生成手段は、前記機械語コード部分Ｈ２が、アクセス違反を調べる条件用分岐命令によりガードされたロード命令Ｊ３によりアドレス（Ｕ＜ｓｕｂ＞ｂ，１＜／ｓｕｂ＞＋Ｆｙ）のデータＶ＜ｓｕｂ＞ｂ＜／ｓｕｂ＞２をプリフェッチする処理を含むように、機械語コード部分Ｈ２を生成する、
ことを特徴とする請求項１記載のコード変換装置。
【請求項７】
ループＡ内のロード命令の依存関係を表現するグラフとしてのロード依存グラフを生成するグラフ生成手段、
を有し、
前記第１及び前記第２の着目手段は、前記ポインタ参照ロード命令及び前記データ依存ロード命令をロード依存グラフに基づき検出することを特徴とする請求項１記載のコード変換装置。
【請求項８】
ループＡにおけるイテレーションＢ＜ｓｕｂ＞１＜／ｓｕｂ＞，Ｂ＜ｓｕｂ＞２＜／ｓｕｂ＞，〜，Ｂ＜ｓｕｂ＞ｎ＜／ｓｕｂ＞についてバイトコードを機械語コードへ試し実行用にコンパイルし試し実行用機械語コードを、副作用を起こさずに試し実行して、各イテレーションのロード命令によるロードデータのアドレスをロード依存グラフに記録するアドレス記録手段、
を有し、
前記第１及び第２の検出手段は、ロード依存グラフに記録されたアドレスに基づきアドレスＵ＜ｓｕｂ＞１，０＜／ｓｕｂ＞〜アドレスＵ＜ｓｕｂ＞ｎ，０＜／ｓｕｂ＞及びアドレスＵ＜ｓｕｂ＞ｒ，１＜／ｓｕｂ＞〜アドレスＵ＜ｓｕｂ＞ｓ，１＜／ｓｕｂ＞を検出する、
ことを特徴とする請求項７記載のコード変換装置。
【請求項９】
データＵ＜ｓｕｂ＞ｂ，２＜／ｓｕｂ＞のプリフェッチが有意義か否かを予測する予測手段、
前記予測手段が有意義でないと予測した場合には、前記第１及び前記第２の機械語生成手段による前記機械語コード部分Ｈ１，Ｈ２の生成を中止させる中止手段、
を有していることを特徴とする請求項１記載のコード変換装置。
【請求項１０】
データＵ＜ｓｕｂ＞ｂ，２＜／ｓｕｂ＞をロードするデータ依存ロード命令を対象データ依存ロード命令、該対象データ依存ロード命令がと呼ぶことにし、
前記予測手段は、データＵ＜ｓｕｂ＞ｂ，２＜／ｓｕｂ＞にデータ依存する命令が存在する場合、及び／又は対象データ依存ロード命令とは別のデータ依存ロード命令がロードするデータＸに対して該データＸ用の機械語コード部分Ｈ２がすでに生成されていてデータＵ＜ｓｕｂ＞ｂ，２＜／ｓｕｂ＞はデータＸとは同一のキャッシュラインには入らない場合、プリフェッチ命令の挿入が有意義と予測することを特徴とする請求項９記載のコード変換装置。
【請求項１１】
式：Ｕ＜ｓｕｂ＞ａ，０＜／ｓｕｂ＞＋ｐ・Ｆｘに基づきアドレス（Ｕ＜ｓｕｂ＞ａ，０＜／ｓｕｂ＞＋ｐ・Ｆｘ）のデータＵ＜ｓｕｂ＞ｂ，１＜／ｓｕｂ＞をヒープメモリからキャッシュメモリへプリフェッチする機械語コード部分Ｈ３を生成する第３の機械語コード部分生成手段、及び
キャッシュラインのサイズＦｓとしてＦｓ≧が２・Ｆｘであるならば前記第３の機械語コード部分生成手段による機械語コード部分Ｈ３の生成は中止とする制御手段、
を有していることを特徴とする請求項１記載のコード変換装置。
【請求項１２】
バイトコードを実行するＪａｖａ仮想計算機からの指示を受けて指示範囲のバイトコードを機械語コードへ変換するＪＩＴコンパイラにおいて、
指示範囲のバイトコードの部分を機械語コードへ試し実行用にコンパイルし試し実行用機械語コードを、副作用を起こさずに試し実行してヒープメモリにおけるデータ構造についての情報を収集する情報収集手段、及び
前記情報収集手段による収集情報に基づいて指示範囲のバイトコードを機械語コードへ変換する変換手段、
を有していることを特徴とするＪＩＴコンパイラ。
【請求項１３】
前記変換手段は、前記情報収集手段による収集情報に依らずに指示範囲のバイトコードを変換された機械語コードに対して前記情報収集手段による収集情報に基づく機械語コード部分を追加した機械語コードを生成するものである、
ことを特徴とする請求項１２記載のＪＩＴコンパイラ。
【請求項１４】
前記収集情報は、ループＡ内の各イテレーションにおける所定ロード命令がヒープメモリから参照するデータのアドレスの規則性に係る情報を含み、
前記変換手段は、前記収集情報に基づき所定ロード命令に基づくロードデータをヒープメモリからキャッシュメモリへプリフェッチする機械語コード部分を生成するものであることを特徴とする請求項１２記載のＪＩＴコンパイラ。
【請求項１５】
変換処理対象コードを機械語コードへ変換するコード変換方法において、
所定のループＡにおける複数個のイテレーションの内で連続する所定個数ｎのイテレーションＢ＜ｓｕｂ＞１＜／ｓｕｂ＞，Ｂ＜ｓｕｂ＞２＜／ｓｕｂ＞，〜，Ｂ＜ｓｕｂ＞ｎ＜／ｓｕｂ＞（なお、Ｂ＜ｓｕｂ＞１＜／ｓｕｂ＞はループＡにおける１番目のイテレーションＢであることに限定されない。）を選択しそれらイテレーションＢ＜ｓｕｂ＞１＜／ｓｕｂ＞，Ｂ＜ｓｕｂ＞２＜／ｓｕｂ＞，〜，Ｂ＜ｓｕｂ＞ｎ＜／ｓｕｂ＞における変換処理対象コード上のポインタ参照ロード命令Ｃ＜ｓｕｂ＞１，１＜／ｓｕｂ＞，Ｃ＜ｓｕｂ＞２，１＜／ｓｕｂ＞，〜，Ｃ＜ｓｕｂ＞ｎ，１＜／ｓｕｂ＞に着目する第１の着目ステップ、
各イテレーションＢ＜ｓｕｂ＞１＜／ｓｕｂ＞，Ｂ＜ｓｕｂ＞２＜／ｓｕｂ＞，〜，Ｂ＜ｓｕｂ＞ｎ＜／ｓｕｂ＞における変換処理対象コード上の他のロード命令であってポインタ参照ロード命令Ｃ＜ｓｕｂ＞１，１＜／ｓｕｂ＞，Ｃ＜ｓｕｂ＞２，１＜／ｓｕｂ＞，〜，Ｃ＜ｓｕｂ＞ｎ，１＜／ｓｕｂ＞にデータ依存するロード命令としてのデータ依存ロード命令Ｃ＜ｓｕｂ＞１，２＜／ｓｕｂ＞，Ｃ＜ｓｕｂ＞２，２＜／ｓｕｂ＞，〜，Ｃ＜ｓｕｂ＞ｎ，２＜／ｓｕｂ＞に着目する第２の着目ステップ、
ポインタ参照ロード命令Ｃ＜ｓｕｂ＞１，１＜／ｓｕｂ＞，Ｃ＜ｓｕｂ＞２，１＜／ｓｕｂ＞，〜，Ｃ＜ｓｕｂ＞ｎ，１＜／ｓｕｂ＞に基づきプロセッサがロードするデータとしての参照値Ｕ＜ｓｕｂ＞１，１＜／ｓｕｂ＞，Ｕ＜ｓｕｂ＞２，１＜／ｓｕｂ＞，〜，Ｕ＜ｓｕｂ＞ｎ，１＜／ｓｕｂ＞に対してそれらがヒープメモリにおいて格納されているアドレスＵ＜ｓｕｂ＞１，０＜／ｓｕｂ＞，Ｕ＜ｓｕｂ＞２，０＜／ｓｕｂ＞，〜，Ｕ＜ｓｕｂ＞ｎ，０＜／ｓｕｂ＞を検出する第１の検出ステップ、
前記データ依存ロード命令Ｃ＜ｓｕｂ＞ｒ，２＜／ｓｕｂ＞〜Ｃ＜ｓｕｂ＞ｓ，２＜／ｓｕｂ＞（ただし１≦ｒ＜ｓ≦ｎ）に基づきプロセッサがロードするデータＵ＜ｓｕｂ＞ｒ，２＜／ｓｕｂ＞，Ｕ＜ｓｕｂ＞ｒ＋１，２＜／ｓｕｂ＞，〜，Ｕ＜ｓｕｂ＞ｓ，２＜／ｓｕｂ＞に対してそれらがヒープメモリにおいて格納されているアドレスＵ＜ｓｕｂ＞ｒ，ｙ＜／ｓｕｂ＞，Ｕ＜ｓｕｂ＞ｒ＋１，ｙ＜／ｓｕｂ＞，〜，Ｕ＜ｓｕｂ＞ｓ，ｙ＜／ｓｕｂ＞を検出する第２の検出ステップ、
相互に隣接するイテレーションの前記ポインタ参照ロード命令のロードデータのアドレスの差分Ｕ＜ｓｕｂ＞２，０＜／ｓｕｂ＞−Ｕ＜ｓｕｂ＞１，０＜／ｓｕｂ＞，Ｕ＜ｓｕｂ＞３，０＜／ｓｕｂ＞−Ｕ＜ｓｕｂ＞２，０＜／ｓｕｂ＞，〜，Ｕ＜ｓｕｂ＞ｎ，０＜／ｓｕｂ＞−Ｕ＜ｓｕｂ＞ｎ−１，０＜／ｓｕｂ＞をイテレーション間ストライドＦ１として計算する第１の計算ステップ、
各イテレーションにおける前記ポインタ参照ロード命令の参照値Ｕ＜ｓｕｂ＞ｒ，１＜／ｓｕｂ＞，Ｕ＜ｓｕｂ＞ｒ＋１，１＜／ｓｕｂ＞，〜，Ｕ＜ｓｕｂ＞ｓ，１＜／ｓｕｂ＞と前記データ依存ロード命令のロードデータのアドレスＵ＜ｓｕｂ＞ｒ，ｙ＜／ｓｕｂ＞，Ｕ＜ｓｕｂ＞ｒ＋１，ｙ＜／ｓｕｂ＞，〜，Ｕ＜ｓｕｂ＞ｓ，ｙ＜／ｓｕｂ＞との差分Ｕ＜ｓｕｂ＞ｒ，ｙ＜／ｓｕｂ＞−Ｕ＜ｓｕｂ＞ｒ，１＜／ｓｕｂ＞，Ｕ＜ｓｕｂ＞ｒ＋１，ｙ＜／ｓｕｂ＞−Ｕ＜ｓｕｂ＞ｒ＋１，１＜／ｓｕｂ＞，Ｕ＜ｓｕｂ＞ｓ，ｙ＜／ｓｕｂ＞−Ｕ＜ｓｕｂ＞ｓ，１＜／ｓｕｂ＞をイテレーション内ストライドＦ２として計算する第２の計算ステップ、
相互に同一となっているイテレーション間ストライドＦ１がイテレーション間ストライドＦ１の総数に対して第１の割合以上存在しかつ相互に同一となっているイテレーション内ストライドＦ２がイテレーション内ストライドＦ２の総数に対して第２の割合以上存在すると言う条件が満たされるか否かを判定する判定ステップ、
前記判定ステップにおける判定が「正」である場合には該同一のイテレーション間ストライドＦ１及び該同一のイテレーション内ストライドＦ２に基づいてそれぞれイテレーション間定数ストライドＦｘ及びイテレーション内定数ストライドＦｙを設定する設定ステップ、
ループＡのイテレーションＢ＜ｓｕｂ＞ａ＜／ｓｕｂ＞におけるポインタ参照ロード命令Ｃ＜ｓｕｂ＞ａ，１＜／ｓｕｂ＞に基づいてプロセッサがロードするデータＵ＜ｓｕｂ＞ａ，１＜／ｓｕｂ＞がヒープメモリにおいて格納されているアドレスＵ＜ｓｕｂ＞ａ，０＜／ｓｕｂ＞及び自然数ｐ（ただし、イテレーションＢ＜ｓｕｂ＞ａ＜／ｓｕｂ＞よりｐ個、後のイテレーションをイテレーションＢ＜ｓｕｂ＞ｂ＜／ｓｕｂ＞とすると、イテレーションＢ＜ｓｕｂ＞ｂ＜／ｓｕｂ＞はループＡの最後のイテレーションを越えない。）に対してヒープメモリ上のアドレスＵ＜ｓｕｂ＞ｂ，０＜／ｓｕｂ＞（＝Ｕ＜ｓｕｂ＞ａ，０＜／ｓｕｂ＞＋ｐ・Ｆｘ）にアクセスして該アドレスＵ＜ｓｕｂ＞ｂ，０＜／ｓｕｂ＞のデータＵ＜ｓｕｂ＞ｂ，１＜／ｓｕｂ＞を検出する機械語コード部分Ｈ１を生成する第１の機械語コード部分生成ステップ、及び
プロセッサがループＡのイテレーションＢ＜ｓｕｂ＞ｂ＜／ｓｕｂ＞を実行するのに先立ち、ヒープメモリ上のアドレス（Ｕ＜ｓｕｂ＞ｂ，１＜／ｓｕｂ＞＋Ｆｙ）のデータＵ＜ｓｕｂ＞ｂ，２＜／ｓｕｂ＞をヒープメモリからキャッシュメモリへプリフェッチする機械語コード部分Ｈ２を生成する第２の機械語コード部分生成ステップ、
を有していることを特徴とするコード変換方法。
【請求項１６】
前記変換処理対象コードはＪａｖａのバイトコードであることを特徴とする請求項１５記載のコード変換方法。
【請求項１７】
前記コード変換方法はＪＩＴコンパイラであることを特徴とする請求項１５記載のコード変換方法。
【請求項１８】
前記第１及び前記第２の機械語コード部分生成ステップでは、前記機械語コード部分Ｈ１，Ｈ２を、前記イテレーションＢ＜ｓｕｂ＞ａ＜／ｓｕｂ＞を実行する機械語コード範囲に配置することを特徴とする請求項１５記載のコード変換方法。
【請求項１９】
機械語としてプリフェッチ命令Ｊ１及び投機的ロード命令Ｊ２を装備するプロセッサ用のコード変換方法において、
前記第１の機械語コード部分生成ステップでは、前記機械語コード部分Ｈ１が、アドレスＵ＜ｓｕｂ＞ｂ，０＜／ｓｕｂ＞（＝Ｕ＜ｓｕｂ＞ａ，０＜／ｓｕｂ＞＋ｐ・Ｆｘ）のデータＵ＜ｓｕｂ＞ｂ，１＜／ｓｕｂ＞をロードする投機的ロード命令Ｊ２を含むように、前記機械語コード部分Ｈ１を生成し、
前記第２の機械語コード部分生成ステップでは、前記機械語コード部分Ｈ２が、アドレス（Ｕ＜ｓｕｂ＞ｂ，１＜／ｓｕｂ＞＋Ｆｙ）のデータＵ＜ｓｕｂ＞ｂ，２＜／ｓｕｂ＞をプリフェッチするプリフェッチ命令Ｊ１を含むように、前記機械語コード部分Ｈ２を生成する、
ことを特徴とする請求項１５記載のコード変換方法。
【請求項２０】
機械語としてプリフェッチ命令Ｊ１及びロード命令Ｊ３を装備するプロセッサ用のコード変換方法において、
前記第１の機械語コード部分生成ステップでは、前記機械語コード部分Ｈ１が、アクセス違反を調べる条件用分岐命令によりガードされたロード命令Ｊ３によりアドレスＵ＜ｓｕｂ＞ｂ，０＜／ｓｕｂ＞（＝Ｕ＜ｓｕｂ＞ａ，０＜／ｓｕｂ＞＋ｐ・Ｆｘ）のデータＵ＜ｓｕｂ＞ｂ，１＜／ｓｕｂ＞を検出する処理を含むように、機械語コード部分Ｈ１を生成し、
前記第２の機械語コード部分生成ステップでは、前記機械語コード部分Ｈ２が、アクセス違反を調べる条件用分岐命令によりガードされたロード命令Ｊ３によりアドレス（Ｕ＜ｓｕｂ＞ｂ，１＜／ｓｕｂ＞＋Ｆｙ）のデータＶ＜ｓｕｂ＞ｂ＜／ｓｕｂ＞２をプリフェッチする処理を含むように、機械語コード部分Ｈ２を生成する、
ことを特徴とする請求項１５記載のコード変換方法。
【請求項２１】
ループＡ内のロード命令の依存関係を表現するグラフとしてのロード依存グラフを生成するグラフ生成ステップ、
を有し、
前記第１及び前記第２の着目ステップでは、前記ポインタ参照ロード命令及び前記データ依存ロード命令をロード依存グラフに基づき検出することを特徴とする請求項１５記載のコード変換方法。
【請求項２２】
ループＡにおけるイテレーションＢ＜ｓｕｂ＞１＜／ｓｕｂ＞，Ｂ＜ｓｕｂ＞２＜／ｓｕｂ＞，〜，Ｂ＜ｓｕｂ＞ｎ＜／ｓｕｂ＞についてバイトコードを機械語コードへ試し実行用にコンパイルし試し実行用機械語コードを、副作用を起こさずに試し実行して、各イテレーションのロード命令によるロードデータのアドレスをロード依存グラフに記録するアドレス記録ステップ、
を有し、
前記第１及び第２の検出ステップでは、ロード依存グラフに記録されたアドレスに基づきアドレスＵ＜ｓｕｂ＞１，０＜／ｓｕｂ＞〜アドレスＵ＜ｓｕｂ＞ｎ，０＜／ｓｕｂ＞及びアドレスＵ＜ｓｕｂ＞ｒ，１＜／ｓｕｂ＞〜アドレスＵ＜ｓｕｂ＞ｓ，１＜／ｓｕｂ＞を検出する、
ことを特徴とする請求項２１記載のコード変換方法。
【請求項２３】
データＵ＜ｓｕｂ＞ｂ，２＜／ｓｕｂ＞のプリフェッチが有意義か否かを予測する予測ステップ、
前記予測ステップにおいて有意義でないと予測した場合には、前記第１及び前記第２の機械語生成ステップにおける前記機械語コード部分Ｈ１，Ｈ２の生成を中止させる中止ステップ、
を有していることを特徴とする請求項１５記載のコード変換装置。
【請求項２４】
データＵ＜ｓｕｂ＞ｂ，２＜／ｓｕｂ＞をロードするデータ依存ロード命令を対象データ依存ロード命令、該対象データ依存ロード命令がと呼ぶことにし、
前記予測ステップでは、データＵ＜ｓｕｂ＞ｂ，２＜／ｓｕｂ＞にデータ依存する命令が存在する場合、及び／又は対象データ依存ロード命令とは別のデータ依存ロード命令がロードするデータＸに対して該データＸ用の機械語コード部分Ｈ２がすでに生成されていてデータＵ＜ｓｕｂ＞ｂ，２＜／ｓｕｂ＞はデータＸとは同一のキャッシュラインには入らない場合、プリフェッチ命令の挿入が有意義と予測することを特徴とする請求項２３記載のコード変換装置。
【請求項２５】
式：Ｕ＜ｓｕｂ＞ａ，０＜／ｓｕｂ＞＋ｐ・Ｆｘに基づきアドレス（Ｕ＜ｓｕｂ＞ａ，０＜／ｓｕｂ＞＋ｐ・Ｆｘ）のデータＵ＜ｓｕｂ＞ｂ，１＜／ｓｕｂ＞をヒープメモリからキャッシュメモリへプリフェッチする機械語コード部分Ｈ３を生成する第３の機械語コード部分生成ステップ、及び
キャッシュラインのサイズＦｓとしてＦｓ≧が２・Ｆｘであるならば前記第３の機械語コード部分生成ステップにおける機械語コード部分Ｈ３の生成は中止とする制御ステップ、
を有していることを特徴とする請求項１５記載のコード変換装置。
【請求項２６】
バイトコードを実行するＪａｖａ仮想計算機からの指示を受けて指示範囲のバイトコードを機械語コードへ変換するＪＩＴコンパイル方法において、
指示範囲のバイトコードの部分を機械語コードへ試し実行用にコンパイルし試し実行用機械語コードを、副作用を起こさずに試し実行してヒープメモリにおけるデータ構造についての情報を収集する情報収集ステップ、及び
前記情報収集ステップにおける収集情報に基づいて指示範囲のバイトコードを機械語コードへ変換する変換ステップ、
を有していることを特徴とするＪＩＴコンパイル方法。
【請求項２７】
前記変換ステップでは、前記情報収集ステップにおける収集情報に依らずに指示範囲のバイトコードを変換された機械語コードに対して前記情報収集ステップにおける収集情報に基づく機械語コード部分を追加した機械語コードを生成することを特徴とする請求項２６記載のＪＩＴコンパイル方法。
【請求項２８】
前記収集情報は、ループＡ内の各イテレーションにおける所定ロード命令がヒープメモリから参照するデータのアドレスの規則性に係る情報を含み、
前記変換ステップでは、前記収集情報に基づき所定ロード命令に基づくロードデータをヒープメモリからキャッシュメモリへプリフェッチする機械語コード部分を生成することを特徴とする請求項２６記載のＪＩＴコンパイル方法。
【請求項２９】
請求項１〜１１のいずれかに記載のコード変換装置の各手段としてコンピュータを機能させるためのコード変換用プログラム。
【請求項３０】
請求項１２〜１４のいずれかに記載のＪＩＴコンパイラの各手段としてコンピュータを機能させるためのＪＩＴコンパイラ用プログラム。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明は、Ｊａｖａ（Ｊａｖａは登録商標）のバイトコード等を機械語コードへ変換するコード変換装置、コード変換方法、ＪＩＴコンパイラ、ＪＩＴコンパイル方法及びプログラムに係り、詳しくは適切なプリフェッチを組み込んだ機械語コードを生成するコード変換装置、コード変換方法及びプログラム、並びにヒープメモリ内のデータ構造に基づき適切な機械語コードを生成するＪＩＴコンパイラ、ＪＩＴコンパイル方法及びプログラムに関するものである。
【０００２】
【従来の技術】
最初に、Ｊａｖａ  Ｊｕｓｔ−Ｉｎ−Ｔｉｍｅ（以下ＪＩＴ）コンパイラについて説明する。
【０００３】
Ｊａｖａとは、サン・マイクロシステムズ社（Ｓｕｎ  Ｍｉｃｒｏｓｙｓｔｅｍｓ  Ｉｎｃ．）によって開発されたオブジェクト指向のプログラミング言語である。Ｊａｖａプログラミング言語で記述されたプログラムは、Ｊａｖａバイトコードコンパイラによってバイトコード（ｂｙｔｅｃｏｄｅ）と呼ばれる形式のプログラムに変換され、Ｊａｖａ仮想計算機（Ｊａｖａ  ｖｉｒｔｕａｌ  ｍａｃｈｉｎｅ；  ＪＶＭ）によって実行される。Ｊａｖａ仮想計算機は、実際の計算機上で稼動するプログラムであり、計算機毎のプロセッサおよびオペレーティングシステムの違いを吸収して、単一のＪａｖａプログラミング言語による実行環境を異なる種類の計算機上で提供する。
【０００４】
バイトコード形式のプログラムは、Ｊａｖａ仮想計算機が稼動するいかなる計算機においても実行することができる。しかし、Ｊａｖａ仮想計算機はバイトコードを１命令ずつ解釈して実行するため、プログラムの実行が遅いという問題がある。特に、同じプログラムをＣやＣ＋＋などのプログラミング言語で記述したものと実行時間を比較すると、著しく実行速度が遅い。なぜならば、これらの言語では、コンパイラによってプログラムを予め実際の計算機上で稼動する機械語命令形式に変換してから実行するからである。この問題に対して、Ｊａｖａ仮想計算機はバイトコードの実行中に、バイトコード形式のプログラムを機械語命令形式のプログラムにコンパイルし、得られた機械語命令形式のプログラムを実際の計算機上で直接実行することでプログラムの実行速度を向上する。  このように、バイトコードから機械語への変換をプログラムの実行時に行うコンパイラを、Ｊａｖａ  ＪＩＴコンパイラと呼ぶ。この方式は、プログラムの実行中にＪＩＴコンパイルを行うため、プログラムの実行時間に加えてＪＩＴコンパイルの時間が必要になるが、機械語形式による実行が高速であるため、Ｊａｖａ仮想計算機のみによるバイトコードの実行より遥かに高速である。一般にＪａｖａ  ＪＩＴコンパイラは、Ｊａｖａプログラミング言語における手続きであるメソッド（ｍｅｔｈｏｄ）を単位として、Ｊａｖａプログラムがメソッドを呼び出す直前にＪＩＴコンパイルを行う。また、ＪＩＴコンパイルにかかる時間を減らすため、Ｊａｖａ仮想計算機はプログラム中で頻繁に実行されるメソッドだけをＪＩＴコンパイルする。
【０００５】
次に、ＪＩＴコンパイラが生成した機械語命令形式のプログラムにおける、キャッシュメモリへのプリフェッチ命令の利用について説明する。
【０００６】
近年のプロセッサでは、演算の実行が主記憶の参照に比べて著しく高速であるため、プロセッサが頻繁に使用するデータの一部をプロセッサ内の高速だが容量が限られているキャッシュメモリに格納する。ロード命令が読み出すアドレス（ａｄｄｒｅｓｓ；  メモリ上の番地）がキャッシュメモリ内に存在する場合は、ロード命令は高速に実行される。ロード命令が読み出すアドレスがキャッシュメモリ内に存在しない場合は、最近参照されていないアドレスがキャッシュメモリから追い出され、代わりに今参照されたアドレスがキャッシュメモリ内に読み込まれるまで、ロード命令の実行は遅延される。これをキャッシュミス（ｃａｃｈｅ  ｍｉｓｓ）と呼ぶ。
【０００７】
プログラムが同じメモリアドレスを繰り返し参照する場合にはキャッシュメモリによるメモリ参照の高速化の効果が大きいが、プログラムが次々と異なるアドレスを参照する場合には、頻繁にキャッシュミスが発生し、キャッシュメモリによるメモリ参照の高速化の効果が小さくなる。この問題に対して、近年のプロセッサはプリフェッチ命令を提供している。プリフェッチ命令はメモリ参照を行う機械語命令で、参照されたメモリがキャッシュメモリ内に存在しない場合は、通常のロード命令と同様、主記憶からキャッシュメモリへのメモリ内容の読み込みを行う。しかし、プリフェッチ命令は読み出された結果をプロセッサに返さないため、プリフェッチ命令の実行は他の命令を遅延することがない。プリフェッチ命令をロード命令より充分先に実行しておくことで、ロード命令を実行するときのキャッシュミスを防ぐことができる。
【０００８】
Ｊａｖａ仮想計算機が、配列（ａｒｒａｙ）やオブジェクト（ｏｂｊｅｃｔ）などのＪａｖａプログラムで使用されるデータ構造を格納するメモリの領域を、ヒープメモリ（ｈｅａｐ  ｍｅｍｏｒｙ）と呼ぶ。Ｊａｖａ仮想計算機がバイトコード形式のプログラムを実行する場合も、Ｊａｖａ  ＪＩＴコンパイラによって生成された機械語命令形式のプログラムを実行する場合のいずれも、データ構造は同一のヒープメモリ上に生成される。Ｊａｖａプログラムでは、配列やオブジェクトが頻繁に生成されるため、メモリ参照の割合が多い。したがってＪａｖａプログラムの実行を高速化するには、キャッシュミスによる性能低下を防ぐことが重要である。その際、ＪＩＴコンパイラが生成する機械語命令形式のプログラム中に、ヒープ上のアドレスに対するプリフェッチ命令を挿入することで、配列やオブジェクト中のデータに対するロード命令が実行されるときのキャッシュミスを防ぐことができる。
【０００９】
プリフェッチングは、キャッシュミスが頻繁に発生するプログラムを高速化するための有効な手段である。多くの数値計算プログラムは、巨大なベクトルや行列を参照するためキャッシュミスの頻度が高いが、Ｊａｖａなど近年のオブジェクト指向プログラミング言語においても、大量のオブジェクトがヒープメモリ上に生成されるため、それらを参照する際にキャッシュミスが頻繁に発生する。プリフェッチングを用いてプログラムを高速化するためには、以下の三点に注意する必要がある。第一に、プリフェッチ命令とデータを実際に参照するロード命令の間隔を適切に選ぶ必要がある。プリフェッチ命令の実行が遅すぎると、ロード命令が実際にデータを参照する時に、キャッシュメモリ上にデータが間に合わない可能性がある。プリフェッチ命令の実行が早すぎると、ロード命令が実際にデータを参照する前に、プリフェッチされたデータがキャッシュメモリから追い出されてしまう可能性がある。第二に、プリフェッチ命令はメモリ参照を行うので、プログラムの実行中にプロセッサと主記憶の間のデータ転送能力に余裕がない場合は性能低下を招く可能性がある。第三に、プリフェッチされるアドレスの計算のオーバーヘッド（ｏｖｅｒｈｅａｄ；  余分な手間）をできるだけ軽減する必要がある。
【００１０】
従来、配列参照を対象とするプリフェッチングについては、有効なアルゴリズムが数多く開発されてきた（例：非特許文献１）。しかし、ポインタ参照を対象とするプリフェッチングは、プリフェッチされるアドレスを計算するためにポインタ参照が必要になるため、有効なアルゴリズムを開発することが困難であった（例：非特許文献２，３）。例として、リスト（ｌｉｓｔ）構造を先頭から辿るループ（ｌｏｏｐ；  プログラム中の繰り返し）について考える。ループの第ｉ番目のイテレーション（ｉｔｅｒａｔｉｏｎ；  ループ中の命令全体の第ｉ回目の繰り返し）において、第ｉ＋ｃ番目のイテレーションで参照されるリストの要素をプリフェッチするためには、ｃ回のポインタ参照を行わなければプリフェッチされるアドレスを計算することができない。
【００１１】
これに対して近年、配列参照とポインタ参照を統一的に扱うことができるプリフェッチングアルゴリズムが提案されている（例：非特許文献４，５）。非特許文献４，５は、Ｊａｖａではなく、Ｃ言語に関するものである。非特許文献４，５の著作者はユフォン・ウ（Ｙｏｕｆｅｎｇ  Ｗｕ）及びその他であるので、以降、非特許文献４，５に開示されている技術内容については「Ｗｕら」と著作者名で特定することにする。Ｗｕらの手法は、ポインタ参照を行うロード命令によるロードデータのアドレスが、連続したイテレーションにおいてしばしば定数ストライド（ｓｔｒｉｄｅ；  幅）の増減（注：増だけでなく、減もあり得る。）をするという観測に基づく。例として、再びリストを先頭から辿るループについて考える。もし、プログラムがリストの各要素を先頭から順番にヒープメモリ上にアロケート（ａｌｌｏｃａｔｅ；  場所を確保）し、各要素の大きさがほぼ同じであったとすれば、リストを辿るポインタ参照のためのロード命令によるロードデータのアドレスは、連続したイテレーションにおいて定数ストライドの増減をする可能性が高い。Ｗｕらは、ロード命令によるロードデータのアドレスの定数ストライドを検出するため、プログラムの実行中においてロード命令によるロードデータのアドレスの前回との差分をプロファイル（ｐｒｏｆｉｌｅ；  値の履歴を集計）し、オフライン（ｏｆｆ−ｌｉｎｅ；  プログラムの実行後。注：Ｗｕらの技術はＣ言語に係るものであるので、コンパイラの作動前に、すなわちコンパイラの非作動期間としてのオフライン期間にプロファイルを解析する。）の解析で検出した定数ストライドの値を使って、プログラムの再コンパイル時にプリフェッチ命令を挿入するという手法を開発した。
【００１２】
【非特許文献１】
トッド・シー．・マウリィ、モニカ・エス．・ラム及びアヌープ・グプタ著「プリフェッチングのためのコンパイラアルゴリズムの設計及び評価」プログラミンク言語及びオペレーティングシステムのためのアーキテクチャサポートに関する第５回国際会議会議録、１９９２年１０月、ｐ．６２−７３（  Ｔｏｄｄ  Ｃ．  Ｍｏｗｒｙ，  Ｍｏｎｉｃａ  Ｓ．  Ｌａｍ，  ａｎｄ  Ａｎｏｏｐ  Ｇｕｐｔａ，  ”Ｄｅｓｉｇｎ  ａｎｄ  Ｅｖａｌｕａｔｉｏｎ  ｏｆ  ａ  Ｃｏｍｐｉｌｅｒ  Ａｌｇｏｒｉｔｈｍ  ｆｏｒ  Ｐｒｅｆｅｔｃｈｉｎｇ”，  ｉｎ  Ｐｒｏｃ．  ｏｆ  ｔｈｅ  Ｆｉｆｔｈ  Ｉｎｔｅｒｎａｔｉｏｎａｌ  Ｃｏｎｆｅｒｅｎｃｅ  ｏｎ  Ａｒｃｈｉｔｅｃｔｕｒａｌ  Ｓｕｐｐｏｒｔ  ｆｏｒ  Ｐｒｏｇｒａｍｍｉｎｇ  Ｌａｎｇｕａｇｅｓ  ａｎｄ  Ｏｐｅｒａｔｉｎｇ  Ｓｙｓｔｅｍｓ，  ｐｐ．  ６２−７３，  Ｏｃｔｏｂｅｒ  １９９２．）
【非特許文献２】
チ−クォン・ルク及びトッド・シー．・マウリィ著「再帰データ構造のためのコンパイラベースのプリフェッチング」、プログラミンク言語及びオペレーティングシステムのためのアーキテクチャサポートに関する第７回国際会議会議録、１９９６年１０月、ｐ．２２２−２３３（  Ｃｈｉ−Ｋｅｕｎｇ  Ｌｕｋ  ａｎｄ  Ｔｏｄｄ  Ｃ．  Ｍｏｗｒｙ，  ”Ｃｏｍｐｉｌｅｒ−Ｂａｓｅｄ  Ｐｒｅｆｅｔｃｈｉｎｇ  ｆｏｒ  Ｒｅｃｕｒｓｉｖｅ  Ｄａｔａ  Ｓｔｒｕｃｔｕｒｅｓ”，  ｉｎ  Ｐｒｏｃ．  ｏｆ  ｔｈｅ  ７ｔｈ  Ｉｎｔｅｒｎａｔｉｏｎａｌ  Ｃｏｎｆｅｒｅｎｃｅ  ｏｎ  Ａｒｃｈｉｔｅｃｔｕｒａｌ  Ｓｕｐｐｏｒｔ  ｆｏｒ  Ｐｒｏｇｒａｍｍｉｎｇ  Ｌａｎｇｕａｇｅｓ  ａｎｄ  Ｏｐｅｒａｔｉｎｇ  Ｓｙｓｔｅｍｓ，  ｐｐ．  ２２２−２３３，  Ｏｃｔｏｂｅｒ  １９９６．）
【非特許文献３】
ブレンドン・カフーン及びカスリン・エス．・マンキンリィ著「Ｊａｖａにおけるリンクデータ構造をプリフェッチングするソフトウェアのためのデータフロー解析」、２００１年９月（  Ｂｒｅｎｄｏｎ  Ｃａｈｏｏｎ  ａｎｄ  Ｋａｔｈｒｙｎ  Ｓ．  ＭｃＫｉｎｌｅｙ，  ”Ｄａｔａ  Ｆｌｏｗ  Ａｎａｌｙｓｉｓ  ｆｏｒ  Ｓｏｆｔｗａｒｅ  Ｐｒｅｆｅｔｃｈｉｎｇ  Ｌｉｎｋｅｄ  Ｄａｔａ  Ｓｔｒｕｃｔｕｒｅｓ  ｉｎ  Ｊａｖａ”，  ｉｎ  Ｐｒｏｃ．  ｏｆ  ｔｈｅ  Ｉｎｔｅｒｎａｔｉｏｎａｌ  Ｃｏｎｆｅｒｅｎｃｅ  ｏｎ  Ｐａｒａｌｌｅｌ  Ａｒｃｈｉｔｅｃｔｕｒｅｓ  ａｎｄ  Ｃｏｍｐｉｌｅｒ  Ｔｅｃｈｎｉｑｕｅｓ，  Ｓｅｐｔｅｍｂｅｒ  ２００１．）
【非特許文献４】
ユフォン・ウ、マウリシオ・セラノ、ラケシュ・クリッシュネイヤー、ウェイ・リ及びヤッセ・ファン著「不規則的なコードのためのストライドプリフェッチングを案内する値プロファイル」コンパイラ構造に関する第１１回国際会議会議録、２００２年４月（  Ｙｏｕｆｅｎｇ  Ｗｕ，  Ｍａｕｒｉｃｉｏ  Ｓｅｒｒａｎｏ，  Ｒａｋｅｓｈ  Ｋｒｉｓｈｎａｉｙｅｒ，  Ｗｅｉ  Ｌｉ，  ａｎｄ  Ｊｅｓｓｅ  Ｆａｎｇ，  ”Ｖａｌｕｅ−Ｐｒｏｆｉｌｅ  Ｇｕｉｄｅｄ  Ｓｔｒｉｄｅ  Ｐｒｅｆｅｔｃｈｉｎｇ  ｆｏｒ  Ｉｒｒｅｇｕｌａｒ  Ｃｏｄｅ”，  ｉｎ  Ｐｒｏｃ．  ｏｆ  ｔｈｅ  １１ｔｈ  Ｉｎｔｅｒｎａｔｉｏｎａｌ  Ｃｏｎｆｅｒｅｎｃｅ  ｏｎ  Ｃｏｍｐｉｌｅｒ  Ｃｏｎｓｔｒｕｃｔｉｏｎ，  ｐｐ．  ３０７−３２４，  Ａｐｒｉｌ  ２００２，  ＬＮＣＳ  ２３０４．）
【非特許文献５】
ユフォン・ウ著「コンパイラプリフェッチングにおける不規則プログラム及びその使用においての規則的ストライドパターンの効率的発見」プログラミング言語設計及び実装に関するＡＣＭ  ＳＩＧＰＬＡＮの会議録、２００２年６月、ｐ．２１０−２２１（Ｙｏｕｆｅｎｇ  Ｗｕ，  ”Ｅｆｆｉｃｉｅｎｔ  Ｄｉｓｃｏｖｅｒｙ  ｏｆ  Ｒｅｇｕｌａｒ  Ｓｔｒｉｄｅ  Ｐａｔｔｅｒｎｓ  ｉｎ  Ｉｒｒｅｇｕｌａｒ  Ｐｒｏｇｒａｍｓ  ａｎｄ  Ｉｔｓ  Ｕｓｅ  ｉｎ  Ｃｏｍｐｉｌｅｒ  Ｐｒｅｆｅｔｃｈｉｎｇ”，  ｉｎ  Ｐｒｏｃ．  ｏｆ  ｔｈｅ  ＡＣＭ  ＳＩＧＰＬＡＮ  Ｃｏｎｆｅｒｅｎｃｅ  ｏｎ  Ｐｒｏｇｒａｍｍｉｎｇ  Ｌａｎｇｕａｇｅ  Ｄｅｓｉｇｎ  ａｎｄ  Ｉｍｐｌｅｍｅｎｔａｔｉｏｎ，  ｐｐ．  ２１０−２２１，  Ｊｕｎｅ  ２００２．）
【００１３】
【発明が解決しようとする課題】
Ｗｕらの手法は従来のポインタ参照を対象とするプリフェッチングに比べて大きな性能向上を実現することが可能であるが、以下の二点において改善の余地がある。
（ａ）Ｗｕらの手法は、同一のロード命令によるロードデータのアドレスが連続したイテレーション間において定数ストライドを示す場合にのみプリフェッチ命令を挿入する。この手法は、プリフェッチされるアドレスを、ロード命令によるロードデータのアドレスに定数を加えることで計算できるという利点があるが、このような定数ストライドが存在しないプログラムには有効ではない。
（ｂ）Ｗｕらの手法は、まず最初に定数ストライドを検出するためにプロファイル取得用の命令を含んだプログラムを実行する必要がある。Ｗｕらの実験では、定数ストライドの検出に必要な実行時間は、プログラム中の実行頻度を集計するプロファイリングに対して＋１７％増加する。このオーバーヘッドは、Ｗｕらが適用したＣ原語のコンパイルの場合には、ある程度許容できるが、Ｊａｖａのようにプロファイルの取得がオンライン（ｏｎ−ｌｉｎｅ；  プログラムの実行中）で行われる環境では無視できない。
【００１４】
本発明の目的は、イテレーション間定数ストライド以外のストライドを利用して、キャッシュミスを抑制した機械語プログラムを生成するコード変換装置、コード変換方法及びプログラムを提供することである。
【００１５】
本発明の他の目的は、プロファイルの作成及び参照を省略して、ヒープメモリ内のデータ構造に基づく有効な機械語プログラムを高速生成するＪＩＴコンパイラ、ＪＩＴコンパイル方法及びプログラムを提供することである。
【００１６】
【課題を解決するための手段】
変換処理対象コードを機械語コードへ変換する本発明のコード変換装置は次のものを有している。
所定のループＡにおける複数個のイテレーションの内で連続する所定個数ｎのイテレーションＢ＜ｓｕｂ＞１＜／ｓｕｂ＞，Ｂ＜ｓｕｂ＞２＜／ｓｕｂ＞，〜，Ｂ＜ｓｕｂ＞ｎ＜／ｓｕｂ＞（なお、Ｂ＜ｓｕｂ＞１＜／ｓｕｂ＞はループＡにおける１番目のイテレーションＢであることに限定されない。）を選択しそれらイテレーションＢ＜ｓｕｂ＞１＜／ｓｕｂ＞，Ｂ＜ｓｕｂ＞２＜／ｓｕｂ＞，〜，Ｂ＜ｓｕｂ＞ｎ＜／ｓｕｂ＞における変換処理対象コード上のポインタ参照ロード命令Ｃ＜ｓｕｂ＞１，１＜／ｓｕｂ＞，Ｃ＜ｓｕｂ＞２，１＜／ｓｕｂ＞，〜，Ｃ＜ｓｕｂ＞ｎ，１＜／ｓｕｂ＞に着目する第１の着目手段、
各イテレーションＢ＜ｓｕｂ＞１＜／ｓｕｂ＞，Ｂ＜ｓｕｂ＞２＜／ｓｕｂ＞，〜，Ｂ＜ｓｕｂ＞ｎ＜／ｓｕｂ＞における変換処理対象コード上の他のロード命令であってポインタ参照ロード命令Ｃ＜ｓｕｂ＞１，１＜／ｓｕｂ＞，Ｃ＜ｓｕｂ＞２，１＜／ｓｕｂ＞，〜，Ｃ＜ｓｕｂ＞ｎ，１＜／ｓｕｂ＞にデータ依存するロード命令としてのデータ依存ロード命令Ｃ＜ｓｕｂ＞１，２＜／ｓｕｂ＞，Ｃ＜ｓｕｂ＞２，２＜／ｓｕｂ＞，〜，Ｃ＜ｓｕｂ＞ｎ，２＜／ｓｕｂ＞に着目する第２の着目手段、
ポインタ参照ロード命令Ｃ＜ｓｕｂ＞１，１＜／ｓｕｂ＞，Ｃ＜ｓｕｂ＞２，１＜／ｓｕｂ＞，〜，Ｃ＜ｓｕｂ＞ｎ，１＜／ｓｕｂ＞に基づきプロセッサがロードするデータとしての参照値Ｕ＜ｓｕｂ＞１，１＜／ｓｕｂ＞，Ｕ＜ｓｕｂ＞２，１＜／ｓｕｂ＞，〜，Ｕ＜ｓｕｂ＞ｎ，１＜／ｓｕｂ＞に対してそれらがヒープメモリにおいて格納されているアドレスＵ＜ｓｕｂ＞１，０＜／ｓｕｂ＞，Ｕ＜ｓｕｂ＞２，０＜／ｓｕｂ＞，〜，Ｕ＜ｓｕｂ＞ｎ，０＜／ｓｕｂ＞を検出する第１の検出手段、
前記データ依存ロード命令Ｃ＜ｓｕｂ＞ｒ，２＜／ｓｕｂ＞〜Ｃ＜ｓｕｂ＞ｓ，２＜／ｓｕｂ＞（ただし１≦ｒ＜ｓ≦ｎ）に基づきプロセッサがロードするデータＵ＜ｓｕｂ＞ｒ，２＜／ｓｕｂ＞，Ｕ＜ｓｕｂ＞ｒ＋１，２＜／ｓｕｂ＞，〜，Ｕ＜ｓｕｂ＞ｓ，２＜／ｓｕｂ＞に対してそれらがヒープメモリにおいて格納されているアドレスＵ＜ｓｕｂ＞ｒ，ｙ＜／ｓｕｂ＞，Ｕ＜ｓｕｂ＞ｒ＋１，ｙ＜／ｓｕｂ＞，〜，Ｕ＜ｓｕｂ＞ｓ，ｙ＜／ｓｕｂ＞を検出する第２の検出手段、
相互に隣接するイテレーションの前記ポインタ参照ロード命令のロードデータのアドレスの差分Ｕ＜ｓｕｂ＞２，０＜／ｓｕｂ＞−Ｕ＜ｓｕｂ＞１，０＜／ｓｕｂ＞，Ｕ＜ｓｕｂ＞３，０＜／ｓｕｂ＞−Ｕ＜ｓｕｂ＞２，０＜／ｓｕｂ＞，〜，Ｕ＜ｓｕｂ＞ｎ，０＜／ｓｕｂ＞−Ｕ＜ｓｕｂ＞ｎ−１，０＜／ｓｕｂ＞をイテレーション間ストライドＦ１として計算する第１の計算手段、
各イテレーションにおける前記ポインタ参照ロード命令の参照値Ｕ＜ｓｕｂ＞ｒ，１＜／ｓｕｂ＞，Ｕ＜ｓｕｂ＞ｒ＋１，１＜／ｓｕｂ＞，〜，Ｕ＜ｓｕｂ＞ｓ，１＜／ｓｕｂ＞と前記データ依存ロード命令のロードデータのアドレスＵ＜ｓｕｂ＞ｒ，ｙ＜／ｓｕｂ＞，Ｕ＜ｓｕｂ＞ｒ＋１，ｙ＜／ｓｕｂ＞，〜，Ｕ＜ｓｕｂ＞ｓ，ｙ＜／ｓｕｂ＞との差分Ｕ＜ｓｕｂ＞ｒ，ｙ＜／ｓｕｂ＞−Ｕ＜ｓｕｂ＞ｒ，１＜／ｓｕｂ＞，Ｕ＜ｓｕｂ＞ｒ＋１，ｙ＜／ｓｕｂ＞−Ｕ＜ｓｕｂ＞ｒ＋１，１＜／ｓｕｂ＞，Ｕ＜ｓｕｂ＞ｓ，ｙ＜／ｓｕｂ＞−Ｕ＜ｓｕｂ＞ｓ，１＜／ｓｕｂ＞をイテレーション内ストライドＦ２として計算する第２の計算手段、
相互に同一となっているイテレーション間ストライドＦ１がイテレーション間ストライドＦ１の総数に対して第１の割合以上存在しかつ相互に同一となっているイテレーション内ストライドＦ２がイテレーション内ストライドＦ２の総数に対して第２の割合以上存在すると言う条件が満たされるか否かを判定する判定手段、
前記判定手段の判定が「正」である場合には該同一のイテレーション間ストライドＦ１及び該同一のイテレーション内ストライドＦ２に基づいてそれぞれイテレーション間定数ストライドＦｘ及びイテレーション内定数ストライドＦｙを設定する設定手段、
ループＡのイテレーションＢ＜ｓｕｂ＞ａ＜／ｓｕｂ＞におけるポインタ参照ロード命令Ｃ＜ｓｕｂ＞ａ，１＜／ｓｕｂ＞に基づいてプロセッサがロードするデータＵ＜ｓｕｂ＞ａ，１＜／ｓｕｂ＞がヒープメモリにおいて格納されているアドレスＵ＜ｓｕｂ＞ａ，０＜／ｓｕｂ＞及び自然数ｐ（ただし、イテレーションＢ＜ｓｕｂ＞ａ＜／ｓｕｂ＞よりｐ個、後のイテレーションをイテレーションＢ＜ｓｕｂ＞ｂ＜／ｓｕｂ＞とすると、イテレーションＢ＜ｓｕｂ＞ｂ＜／ｓｕｂ＞はループＡの最後のイテレーションを越えない。）に対してヒープメモリ上のアドレスＵ＜ｓｕｂ＞ｂ，０＜／ｓｕｂ＞（＝Ｕ＜ｓｕｂ＞ａ，０＜／ｓｕｂ＞＋ｐ・Ｆｘ）にアクセスして該アドレスＵ＜ｓｕｂ＞ｂ，０＜／ｓｕｂ＞のデータＵ＜ｓｕｂ＞ｂ，１＜／ｓｕｂ＞を検出する機械語コード部分Ｈ１を生成する第１の機械語コード部分生成手段、及び
プロセッサがループＡのイテレーションＢ＜ｓｕｂ＞ｂ＜／ｓｕｂ＞を実行するのに先立ち、ヒープメモリ上のアドレス（Ｕ＜ｓｕｂ＞ｂ，１＜／ｓｕｂ＞＋Ｆｙ）のデータＵ＜ｓｕｂ＞ｂ，２＜／ｓｕｂ＞をヒープメモリからキャッシュメモリへプリフェッチする機械語コード部分Ｈ２を生成する第２の機械語コード部分生成手段。
【００１７】
バイトコードを実行するＪａｖａ仮想計算機からの指示を受けて指示範囲のバイトコードを機械語コードへ変換する本発明のＪＩＴコンパイラは次のものを有している。
指示範囲のバイトコードの部分を機械語コードへ試し実行用にコンパイルし試し実行用機械語コードを、副作用を起こさずに試し実行してヒープメモリにおけるデータ構造についての情報を収集する情報収集手段、及び
前記情報収集手段による収集情報に基づいて指示範囲のバイトコードを機械語コードへ変換する変換手段。
【００１８】
変換処理対象コードを機械語コードへ変換する本発明のコード変換方法は次のステップを有している。
所定のループＡにおける複数個のイテレーションの内で連続する所定個数ｎのイテレーションＢ＜ｓｕｂ＞１＜／ｓｕｂ＞，Ｂ＜ｓｕｂ＞２＜／ｓｕｂ＞，〜，Ｂ＜ｓｕｂ＞ｎ＜／ｓｕｂ＞（なお、Ｂ＜ｓｕｂ＞１＜／ｓｕｂ＞はループＡにおける１番目のイテレーションＢであることに限定されない。）を選択しそれらイテレーションＢ＜ｓｕｂ＞１＜／ｓｕｂ＞，Ｂ＜ｓｕｂ＞２＜／ｓｕｂ＞，〜，Ｂ＜ｓｕｂ＞ｎ＜／ｓｕｂ＞における変換処理対象コード上のポインタ参照ロード命令Ｃ＜ｓｕｂ＞１，１＜／ｓｕｂ＞，Ｃ＜ｓｕｂ＞２，１＜／ｓｕｂ＞，〜，Ｃ＜ｓｕｂ＞ｎ，１＜／ｓｕｂ＞に着目する第１の着目ステップ、
各イテレーションＢ＜ｓｕｂ＞１＜／ｓｕｂ＞，Ｂ＜ｓｕｂ＞２＜／ｓｕｂ＞，〜，Ｂ＜ｓｕｂ＞ｎ＜／ｓｕｂ＞における変換処理対象コード上の他のロード命令であってポインタ参照ロード命令Ｃ＜ｓｕｂ＞１，１＜／ｓｕｂ＞，Ｃ＜ｓｕｂ＞２，１＜／ｓｕｂ＞，〜，Ｃ＜ｓｕｂ＞ｎ，１＜／ｓｕｂ＞にデータ依存するロード命令としてのデータ依存ロード命令Ｃ＜ｓｕｂ＞１，２＜／ｓｕｂ＞，Ｃ＜ｓｕｂ＞２，２＜／ｓｕｂ＞，〜，Ｃ＜ｓｕｂ＞ｎ，２＜／ｓｕｂ＞に着目する第２の着目ステップ、
ポインタ参照ロード命令Ｃ＜ｓｕｂ＞１，１＜／ｓｕｂ＞，Ｃ＜ｓｕｂ＞２，１＜／ｓｕｂ＞，〜，Ｃ＜ｓｕｂ＞ｎ，１＜／ｓｕｂ＞に基づきプロセッサがロードするデータとしての参照値Ｕ＜ｓｕｂ＞１，１＜／ｓｕｂ＞，Ｕ＜ｓｕｂ＞２，１＜／ｓｕｂ＞，〜，Ｕ＜ｓｕｂ＞ｎ，１＜／ｓｕｂ＞に対してそれらがヒープメモリにおいて格納されているアドレスＵ＜ｓｕｂ＞１，０＜／ｓｕｂ＞，Ｕ＜ｓｕｂ＞２，０＜／ｓｕｂ＞，〜，Ｕ＜ｓｕｂ＞ｎ，０＜／ｓｕｂ＞を検出する第１の検出ステップ、
前記データ依存ロード命令Ｃ＜ｓｕｂ＞ｒ，２＜／ｓｕｂ＞〜Ｃ＜ｓｕｂ＞ｓ，２＜／ｓｕｂ＞（ただし１≦ｒ＜ｓ≦ｎ）に基づきプロセッサがロードするデータＵ＜ｓｕｂ＞ｒ，２＜／ｓｕｂ＞，Ｕ＜ｓｕｂ＞ｒ＋１，２＜／ｓｕｂ＞，〜，Ｕ＜ｓｕｂ＞ｓ，２＜／ｓｕｂ＞に対してそれらがヒープメモリにおいて格納されているアドレスＵ＜ｓｕｂ＞ｒ，ｙ＜／ｓｕｂ＞，Ｕ＜ｓｕｂ＞ｒ＋１，ｙ＜／ｓｕｂ＞，〜，Ｕ＜ｓｕｂ＞ｓ，ｙ＜／ｓｕｂ＞を検出する第２の検出ステップ、
相互に隣接するイテレーションの前記ポインタ参照ロード命令のロードデータのアドレスの差分Ｕ＜ｓｕｂ＞２，０＜／ｓｕｂ＞−Ｕ＜ｓｕｂ＞１，０＜／ｓｕｂ＞，Ｕ＜ｓｕｂ＞３，０＜／ｓｕｂ＞−Ｕ＜ｓｕｂ＞２，０＜／ｓｕｂ＞，〜，Ｕ＜ｓｕｂ＞ｎ，０＜／ｓｕｂ＞−Ｕ＜ｓｕｂ＞ｎ−１，０＜／ｓｕｂ＞をイテレーション間ストライドＦ１として計算する第１の計算ステップ、
各イテレーションにおける前記ポインタ参照ロード命令の参照値Ｕ＜ｓｕｂ＞ｒ，１＜／ｓｕｂ＞，Ｕ＜ｓｕｂ＞ｒ＋１，１＜／ｓｕｂ＞，〜，Ｕ＜ｓｕｂ＞ｓ，１＜／ｓｕｂ＞と前記データ依存ロード命令のロードデータのアドレスＵ＜ｓｕｂ＞ｒ，ｙ＜／ｓｕｂ＞，Ｕ＜ｓｕｂ＞ｒ＋１，ｙ＜／ｓｕｂ＞，〜，Ｕ＜ｓｕｂ＞ｓ，ｙ＜／ｓｕｂ＞との差分Ｕ＜ｓｕｂ＞ｒ，ｙ＜／ｓｕｂ＞−Ｕ＜ｓｕｂ＞ｒ，１＜／ｓｕｂ＞，Ｕ＜ｓｕｂ＞ｒ＋１，ｙ＜／ｓｕｂ＞−Ｕ＜ｓｕｂ＞ｒ＋１，１＜／ｓｕｂ＞，Ｕ＜ｓｕｂ＞ｓ，ｙ＜／ｓｕｂ＞−Ｕ＜ｓｕｂ＞ｓ，１＜／ｓｕｂ＞をイテレーション内ストライドＦ２として計算する第２の計算ステップ、
相互に同一となっているイテレーション間ストライドＦ１がイテレーション間ストライドＦ１の総数に対して第１の割合以上存在しかつ相互に同一となっているイテレーション内ストライドＦ２がイテレーション内ストライドＦ２の総数に対して第２の割合以上存在すると言う条件が満たされるか否かを判定する判定ステップ、
前記判定ステップにおける判定が「正」である場合には該同一のイテレーション間ストライドＦ１及び該同一のイテレーション内ストライドＦ２に基づいてそれぞれイテレーション間定数ストライドＦｘ及びイテレーション内定数ストライドＦｙを設定する設定ステップ、
ループＡのイテレーションＢ＜ｓｕｂ＞ａ＜／ｓｕｂ＞におけるポインタ参照ロード命令Ｃ＜ｓｕｂ＞ａ，１＜／ｓｕｂ＞に基づいてプロセッサがロードするデータＵ＜ｓｕｂ＞ａ，１＜／ｓｕｂ＞がヒープメモリにおいて格納されているアドレスＵ＜ｓｕｂ＞ａ，０＜／ｓｕｂ＞及び自然数ｐ（ただし、イテレーションＢ＜ｓｕｂ＞ａ＜／ｓｕｂ＞よりｐ個、後のイテレーションをイテレーションＢ＜ｓｕｂ＞ｂ＜／ｓｕｂ＞とすると、イテレーションＢ＜ｓｕｂ＞ｂ＜／ｓｕｂ＞はループＡの最後のイテレーションを越えない。）に対してヒープメモリ上のアドレスＵ＜ｓｕｂ＞ｂ，０＜／ｓｕｂ＞（＝Ｕ＜ｓｕｂ＞ａ，０＜／ｓｕｂ＞＋ｐ・Ｆｘ）にアクセスして該アドレスＵ＜ｓｕｂ＞ｂ，０＜／ｓｕｂ＞のデータＵ＜ｓｕｂ＞ｂ，１＜／ｓｕｂ＞を検出する機械語コード部分Ｈ１を生成する第１の機械語コード部分生成ステップ、
プロセッサがループＡのイテレーションＢ＜ｓｕｂ＞ｂ＜／ｓｕｂ＞を実行するのに先立ち、ヒープメモリ上のアドレス（Ｕ＜ｓｕｂ＞ｂ，１＜／ｓｕｂ＞＋Ｆｙ）のデータＵ＜ｓｕｂ＞ｂ，２＜／ｓｕｂ＞をヒープメモリからキャッシュメモリへプリフェッチする機械語コード部分Ｈ２を生成する第２の機械語コード部分生成ステップ。
【００１９】
バイトコードを実行するＪａｖａ仮想計算機からの指示を受けて指示範囲のバイトコードを機械語コードへ変換する本発明のＪＩＴコンパイル方法は次のステップを有している。
指示範囲のバイトコードの部分を機械語コードへ試し実行用にコンパイルし試し実行用機械語コードを、副作用を起こさずに試し実行してヒープメモリにおけるデータ構造についての情報を収集する情報収集ステップ、及び
前記情報収集ステップにおける収集情報に基づいて指示範囲のバイトコードを機械語コードへ変換する変換ステップ。
【００２０】
本発明のコード変換用プログラムは、前述のコード変換装置の各手段としてコンピュータを機能させ、あるいは前述のコード変換方法の各ステップをコンピュータに実行させる。また、本発明のＪＩＴコンパイラ用プログラムは、前述のＪＩＴコンパイラの各手段としてコンピュータを機能させ、あるいは前述のＪＩＴコンパイル方法の各ステップをコンピュータに実行させる。
【００２１】
【発明の実施の形態】
以降、本発明をその実施の形態及び実施例について具体的に説明する。なお、本発明は実施の形態及び実施例に限定されるものではなく、その要旨を逸脱しない範囲で種々変更可能であることは言うまでもない。
【００２２】
本実施の形態が基づく基本思想は次の２つである。
（１）連続したイテレーションにおける同一のロード命令によるロードデータのアドレス間の定数ストライド（ｉｎｔｅｒ−ｉｔｅｒａｔｉｏｎ  ｃｏｎｓｔａｎｔ  ｓｔｒｉｄｅ；  以下イテレーション間の定数ストライド）に加えて、同一のイテレーションにおける異なるロード命令によるロードデータのアドレス間の定数ストライド（ｉｎｔｒａ−ｉｔｅｒａｔｉｏｎ  ｃｏｎｓｔａｎｔ  ｓｔｒｉｄｅ；  以下イテレーション内の定数ストライド）を検出する。プリフェッチの対象を、１）イテレーション間の定数ストライドを持つロード命令Ｌ＜ｓｕｂ＞１＜／ｓｕｂ＞、２）ロード命令Ｌ＜ｓｕｂ＞１＜／ｓｕｂ＞の値をアドレスとしてメモリ参照を行うロード命令（Ｌ＜ｓｕｂ＞２＜／ｓｕｂ＞）、３）ロード命令Ｌ＜ｓｕｂ＞２＜／ｓｕｂ＞とイテレーション内定数ストライドを持つロード命令Ｌ＜ｓｕｂ＞３＜／ｓｕｂ＞、に拡張することで、プリフェッチングの適用範囲を広げる。
（２）ＪＩＴコンパイル時に、メソッドが呼び出されるときの実際の引数の値を使って、プリフェッチ命令を挿入しようとしているループを、先頭から数イテレーションだけ副作用（注：メインメモリにデータを書き込むことは状態の変更に繋がるので、「副作用」と呼んでいる。）を起こさずに部分的に評価し、イテレーション間およびイテレーション内の定数ストライドを検出する。以下では、この操作をオブジェクトインスペクション（ｏｂｊｅｃｔ  ｉｎｓｐｅｃｔｉｏｎ）と呼ぶ。この方法は実際のヒープメモリ上のデータ構造を参照することができるという利点がある。またプロファイルを取得するオーバーヘッドはプログラムの実行時（注：プログラムの実行時間又は実行期間とは、ＪＩＴコンパイラの処理時間に対して、Ｊａｖａ仮想計算機がＪＩＴコンパイラの生成した機械語コード部分を実行している時間又は期間を言うものとする。）ではなくＪＩＴコンパイル時だけ必要である。ＪＩＴコンパイラの時間はプログラムの実行時間に比べて小さいため、定数ストライドの検出は極めて少ない実行時間で実現できる。
【００２３】
以下において、本実施の形態の全体の手順を述べる。
【００２４】
本実施の形態は、Ｊａｖａ  ＪＩＴコンパイラがバイトコードを機械語命令にＪＩＴコンパイルする際に、ロード命令によるロードデータのアドレス間の定数ストライドを利用したプリフェッチ命令を生成することを目的とする。Ｊａｖａ  ＪＩＴコンパイラはＪａｖａ仮想計算機がＪａｖａメソッドを実行する直前に呼び出され、ＪＩＴコンパイル対象となるメソッドを実行するために必要な引数はＪａｖａ仮想計算機のスタック（メソッドの実行に必要なデータを格納するメモリ領域）上に用意されている。メソッドのＪＩＴコンパイルは、初回であっても最適化のための再コンパイルであっても構わない。
【００２５】
プリフェッチングは、入力となるＪａｖａメソッドを表す中間コードを、プリフェッチ命令を含む中間コード（ｉｎｔｅｒｍｅｄｉａｔｅ  ｃｏｄｅ）に変換することで実現される。与えられたＪａｖａメソッドに対して、コンパイラはメソッド内の制御フローグラフのループを検出して、ループネスティングフォレスト（ｌｏｏｐ  ｎｅｓｔｉｎｇ  ｆｏｒｅｓｔ；  ＬＮＦ；  ループの入れ子関係を表現する木構造の集まり）を生成する。ＬＮＦの各頂点はループを、ＬＮＦの辺はループ間の入れ子関係を表す。本実施の形態のプリフェッチングアルゴリズムは、ＬＮＦの各木構造をメソッド内の実行順に従って探索し、木構造内の各ループをポストオーダー（ｐｏｓｔ−ｏｒｄｅｒ；  木の節点を子供から親の順に探索する順序）、すなわち内側のループから外側のループの順に探索する。
【００２６】
各ループにおいて、本実施の形態のアルゴリズムは以下の三段階の操作を行う。
（ａ）ループ内のロード命令の依存関係を表現するグラフ（ｌｏａｄ  ｄｅｐｅｎｄｅｎｃｅ  ｇｒａｐｈ；  以下ロード依存グラフ）を生成する。ロード依存グラフは、イテレーション内定数ストライドの存在を調べるロード命令を、データ依存があるロード命令の組に限定して、ＪＩＴコンパイル時のオーバーヘッドを軽減するために使用される。
（ｂ）オブジェクトインスペクションによってループを先頭から数イテレーションだけ評価し、ロード依存グラフ上でイテレーション間およびイテレーション内の定数ストライドの有無を調べる。定数ストライドが存在する場合は、グラフの注釈として定数ストライドの値を記録する。
（ｃ）ロード依存グラフにおいて定数ストライドを持つロード命令について、プリフェッチ命令の挿入が有効かどうかを予測し、効果があると思われるロード命令に対してプリフェッチ命令を生成する。
【００２７】
繰り返し回数の少ないループに含まれるロード命令については、Ｗｕらの手法と同様に、それらが外側のループに存在するとみなす。本実施の形態のアルゴリズムでは、ループの繰り返し回数が小さいことをオブジェクトインスペクションの間に検出する。
【００２８】
繰り返し回数の少ないループに含まれるロード命令については、Ｗｕらの手法と同様に、それらが外側のループに存在するとみなす。本実施の形態のアルゴリズムでは、ループの繰り返し回数が小さいことをオブジェクトインスペクションの間に検出する。
【００２９】
以下で、上記（ａ）〜（ｃ）の各段階の詳細を述べる。
【００３０】
［（ａ）ロード依存グラフの生成］
ロード依存グラフは、ロード命令を頂点（ｖｅｒｔｅｘ）とし、ロード命令間のデータ依存関係を辺（ｅｄｇｅ）とする有向グラフ（ｄｉｒｅｃｔｅｄ  ｇｒａｐｈ）である。ロード依存グラフは、プリフェッチングの対象となるループ内で、連続したポインタ参照を辿るロード命令を検出するために生成される。各頂点は、オブジェクトへの参照を引数として受け取りメモリ参照を行うようなロード命令である。各有向辺（Ｌ＜ｓｕｂ＞１＜／ｓｕｂ＞，  Ｌ＜ｓｕｂ＞２＜／ｓｕｂ＞）は、ロード命令Ｌ＜ｓｕｂ＞２＜／ｓｕｂ＞がロード命令Ｌ＜ｓｕｂ＞１＜／ｓｕｂ＞に対して直接データ依存することを表す。中間コードとしてＪａｖａバイトコードを用いた場合、ロード依存グラフの頂点となる命令は、ｇｅｔｆｉｅｌｄ，  ｇｅｔｓｔａｔｉｃ，  ａａｌｏａｄ，  ｉａｌｏａｄ，  ｄａｌｏａｄ，  ａｒｒａｙｌｅｎｇｔｈなどである。このうち、グラフの中で後継頂点を持つ可能性がある命令は、オブジェクトの参照を生成する命令、すなわちａａｌｏａｄ（配列の要素のロード），  ｇｅｔｆｉｅｌｄ（オブジェクトのフィールド変数のロード），  ｇｅｔｓｔａｔｉｃ（クラスの静的変数のロード）である。与えられたループの内側にループがあって、内側のループの繰り返し回数が少ない場合は、内側のループ内のロード命令も同じロード依存グラフの頂点として扱う。ロード依存グラフはメソッド内の使用・定義連鎖など、中間コード間のデータ依存関係を表すグラフから生成することができる。
【００３１】
［（ｂ）オブジェクトインスペクション］
ロード依存グラフを生成したら、オブジェクトインスペクションによって定数ストライドを検出する。オブジェクトインスペクションでは、与えられたループの中の命令を実際のメソッドの引数の値を用いて定数回（例えば２０回）だけ部分評価（ｐａｒｔｉａｌ  ｉｎｔｅｒｐｒｅｔａｔｉｏｎ）し、各ロード命令によるロードデータのアドレスをロード依存グラフに記録する。部分評価が終了したら、アドレスの履歴から定数ストライドの有無を計算する。ロード依存グラフの各頂点のアドレスについて、連続したイテレーション間の定数ストライドを調べ、有向辺で結ばれたロード命令によるロードデータのアドレスの組について、同じイテレーション内の定数ストライドを調べる。計算されたアドレスの差分が、大部分（例えば７５％以上。注：キャッシュメモリへのプリフェッチはキャッシュラインを単位に実施されるので、ストライドに多少の誤差があっても、定数ストライドに基づくプリフェッチにより目的（ｔａｒｇｅｔ）のデータはキャッシュメモリに書き込まれる。）のイテレーション間及びイテレーション内で同じ値であれば、ロード命令が定数ストライドを持つとみなして、対応する頂点または辺に定数ストライドの値を記録する。
【００３２】
オブジェクトインスペクションは、メソッド内の中間コードをメソッドの先頭から順に部分評価する。メソッドの引数が与えられても、全ての命令の評価において引数が計算できるとは限らない。このような場合は、命令の引数は「不定値」という特別な値を取るとみなす。引数に不定値を含むような命令の評価結果はやはり不定値である。
【００３３】
オブジェクトインスペクションはＪＩＴコンパイル時の解析であり、Ｊａｖａプログラムの実行に対して副作用を与えないようにする必要がある。特に、ストア命令を評価するときにメモリに書き込みを行なってはならない。このため、ＪＩＴコンパイル時にＪａｖａ仮想計算機のスタック（ｓｔａｃｋ）の複製を用意し、Ｊａｖａプログラムのローカル変数（ｌｏｃａｌ  ｖａｒｉａｂｌｅ）への書き込みは複製されたスタック上で行なう。また、ヒープメモリ上のオブジェクトに対するストア命令の評価は、書き込まれるアドレスと値の組をハッシュテーブル（ｈａｓｈ  ｔａｂｌｅ）に記録することで実現し、オブジェクトや配列に対するロード命令を評価する際には、最初にこのハッシュテーブルの値を検索する。同様な理由で、ＪＩＴコンパイル時に仮想的なヒープメモリを用意し、オブジェクトを生成する命令の評価を行なう。
【００３４】
オブジェクトインスペクションによる評価がプリフェッチの対象となるループの入り口に到達する前に、別のループに出会う可能性がある。このような別のループについては、ループ中の命令を一回だけ評価する。なぜならば、このようなループの評価の結果が目標とするループのイテレーションの初期値に影響を与えることは少ないからである。例えば、配列の要素を辿るループでは、配列の添字の変数は０に初期化されることが多いし、オブジェクトのリストを辿るループでは、リストの要素へのポインタは引数の値に初期化されることが多い。また、オブジェクトインスペクションのオーバーヘッドを低く抑えるためにも、他のループが実際に終了するまで評価するのは現実的でない。
【００３５】
他のメソッドへの呼び出しは単に無視される。メソッド呼び出しが値を返す場合は、不定値を返すとみなす。解析の精度を上げる方法として、メソッド呼び出しにおいて、さらに呼び出されるメソッド内のオブジェクトインスペクションを行なうという手続き間解析（ｉｎｔｅｒ−ｐｒｏｃｅｄｕｒａｌ  ａｎａｌｙｓｉｓ）の手法が考えられるが、ＪＩＴコンパイル時間との兼ね合いを考慮する必要がある。
【００３６】
［（ｃ）プリフェッチ命令の生成］
オブジェクトインスペクションの後、ロード依存グラフの頂点のうち定数ストライドを持つものに対してプリフェッチ命令を生成する。最初に、各定数ストライドに対して生成するコード列について説明する。次に、効果的で冗長でないプリフェッチ命令を生成するための、プリフェッチによる効果の解析方法について説明する。最後に、本実施の形態で前提とする二種類のプリフェッチ命令の、機械語命令に対する対応について説明する。
【００３７】
（ｃ．１）コード列
ロード依存グラフの頂点Ｌ＜ｓｕｂ＞ｘ＜／ｓｕｂ＞がイテレーション間定数ストライドｄを持つとする。  頂点Ｌ＜ｓｕｂ＞ｘ＜／ｓｕｂ＞が後継頂点（ａｄｊａｃｅｎｔｓ）を持たないか、または全ての後継頂点がイテレーション間定数ストライドを持つ場合、ｃイテレーション後におけるロード命令Ｌ＜ｓｕｂ＞ｘ＜／ｓｕｂ＞が参照するデータを現在のイテレーションでプリフェッチするためには、Ａ（Ｌ）を現在のイテレーションにおいてロード命令Ｌが参照するアドレスとすると、以下のコードを生成すればよい。なお、＊は乗算を意味する。
ｐｒｅｆｅｔｃｈ  （Ａ（Ｌ＜ｓｕｂ＞ｘ＜／ｓｕｂ＞）  ＋  ｄ＊ｃ）；
【００３８】
ここで、ｐｒｅｆｅｔｃｈは与えられたアドレスをキャッシュメモリ内にプリフェッチする命令を表す。今度は、頂点Ｌ＜ｓｕｂ＞ｘ＜／ｓｕｂ＞がイテレーション間定数ストライドを持たない後継頂点Ｌ＜ｓｕｂ＞ｙ＜／ｓｕｂ＞を持つとする。ロード命令Ｌ＜ｓｕｂ＞ｘ＜／ｓｕｂ＞およびＬ＜ｓｕｂ＞ｙ＜／ｓｕｂ＞がｃイテレーション後に参照するデータをプリフェッチするためには、以下のコードを生成すればよい。
ａ  ＝  ｓｐｅｃ＿ｌｏａｄ  （Ａ（Ｌ＜ｓｕｂ＞ｘ＜／ｓｕｂ＞）  ＋  ｄ＊ｃ）；
ｐｒｅｆｅｔｃｈ  （Ｆ［Ｌ＜ｓｕｂ＞ｘ＜／ｓｕｂ＞，Ｌ＜ｓｕｂ＞ｙ＜／ｓｕｂ＞］  （ａ））；
【００３９】
ここで、ｓｐｅｃ＿ｌｏａｄは与えられたアドレスをアクセス違反を起こさずにロードする命令（ｓｐｅｃｕｌａｔｉｖｅ  ｌｏａｄ；  以下投機的ロード命令）である。また、Ｆ［Ｌ＜ｓｕｂ＞ｘ＜／ｓｕｂ＞，  Ｌ＜ｓｕｂ＞ｙ＜／ｓｕｂ＞］はＬ＜ｓｕｂ＞ｘ＜／ｓｕｂ＞の結果として得られるオブジェクト参照のアドレスからＬ＜ｓｕｂ＞ｙ＜／ｓｕｂ＞のアドレスを得る関数である。「Ｆ［Ｌ＜ｓｕｂ＞ｘ＜／ｓｕｂ＞，Ｌ＜ｓｕｂ＞ｙ＜／ｓｕｂ＞］  （ａ）」の「（ａ）」は、Ｌ＜ｓｕｂ＞ｙ＜／ｓｕｂ＞のアドレスを得る際のオブジェクト参照のアドレスがＬ＜ｓｕｂ＞ｘ＜／ｓｕｂ＞及びａ  ＝  ｓｐｅｃ＿ｌｏａｄ  （Ａ（Ｌ＜ｓｕｂ＞ｘ＜／ｓｕｂ＞）  ＋  ｄ＊ｃ）に基づくａであるこを意味している。通常、Ｆ［Ｌ＜ｓｕｂ＞ｘ＜／ｓｕｂ＞，Ｌ＜ｓｕｂ＞ｙ＜／ｓｕｂ＞］  （ａ）の演算は定数値の加算で表される。さらに、Ｌ＜ｓｕｂ＞ｙ＜／ｓｕｂ＞との間にイテレーション内定数ストライドを持つロード命令Ｌ＜ｓｕｂ＞ｚ＜／ｓｕｂ＞が存在する場合は、以下のコード生成によってＬ＜ｓｕｂ＞ｚ＜／ｓｕｂ＞が参照するアドレスも同様にプリフェッチすることができる。
【００４０】
ｐｒｅｆｅｔｃｈ  （Ｆ［Ｌ＜ｓｕｂ＞ｘ＜／ｓｕｂ＞，Ｌ＜ｓｕｂ＞ｙ＜／ｓｕｂ＞］  （ａ）  ＋  Ｓ［Ｌ＜ｓｕｂ＞ｙ＜／ｓｕｂ＞，Ｌ＜ｓｕｂ＞ｚ＜／ｓｕｂ＞］）；
【００４１】
ここで、Ｓ［Ｌ＜ｓｕｂ＞ｙ＜／ｓｕｂ＞，  Ｌ＜ｓｕｂ＞ｚ＜／ｓｕｂ＞］はロード命令Ｌ＜ｓｕｂ＞ｙ＜／ｓｕｂ＞，  Ｌ＜ｓｕｂ＞ｚ＜／ｓｕｂ＞の間のイテレーション内定数ストライドの値を表す。スケジューリング距離ｃの実際の値は、プリフェッチ命令を挿入するループ内の計算の量やメモリ参照の数など、様々な要素に依存する。
【００４２】
（ｃ．２）プリフェッチの効果の解析
プリフェッチ命令はメモリ参照を行なうため、プロセッサのメモリ参照のための演算器及びデータ転送のためのバンド幅を消費する。従って、プリフェッチ可能なロード命令の中から、プリフェッチが効果的なものを選ぶ必要がある。理想的には、頻繁にキャッシュミスを起こすロード命令だけにプリフェッチを生成するのが望ましい。しかし、キャッシュミスの有無はキャッシュメモリの容量や、前後に実行される他のロード命令などの様々な動的な要素に影響されるため、コンパイル時に予測することは難しい。
【００４３】
代わりに、以下の簡単な解析によってプリフェッチによる効果を見積もる。すなわち、ロード命令Ｌが以下の三つの条件を満たす場合、Ｌのアドレスのプリフェッチが効果的であると判断する。
（ｃ．２．ａ）ロード命令Ｌに対してデータ依存する命令（ロード命令でなくともよい）が存在する。
（ｃ．２．ｂ）ロード命令Ｌが参照するデータが、既にプリフェッチ命令が挿入された他のロード命令と同じキャッシュライン（ｃａｃｈｅ  ｌｉｎｅ；  キャッシュメモリでメモリ内容を扱う単位）に入らない。
（ｃ．２．ｃ）ロード命令Ｌがイテレーション間定数ストライドを持つ場合に、定数ストライド値がキャッシュラインの大きさの半分より大きい。
【００４４】
なお、（ｃ．２．ａ）（ｃ．２．ｂ）は、後述の第２の擬似プログラムの行番号１０４，１０５に係る条件であるのに対し、（ｃ．２．ｃ）は、後述の第３の擬似プログラムの行番号１３３に係る条件である。ポインタ参照ロード命令Ｘ＜ｓｕｂ＞ｉ＜／ｓｕｂ＞がロードするデータＤ＜ｓｕｂ＞ｉ＜／ｓｕｂ＞をイテレーション間定数ストライドに基づきプリフェッチすることを考える場合、ポインタ参照ロード命令Ｘ＜ｓｕｂ＞ｉ＜／ｓｕｂ＞の属するイテレーションより１個前のイテレーションにおけるポインタ参照ロード命令Ｘ＜ｓｕｂ＞ｉ−１＜／ｓｕｂ＞とそれがロードするデータＤ＜ｓｕｂ＞ｉ−１＜／ｓｕｂ＞を考える。データＤ＜ｓｕｂ＞ｉ−１＜／ｓｕｂ＞及びＤ＜ｓｕｂ＞ｉ＜／ｓｕｂ＞とのアドレス間隔としてのイテレーション間定数ストライドがキャッシュラインのサイズの１／２以下であれば、データＤ＜ｓｕｂ＞ｉ−１＜／ｓｕｂ＞をプリフェッチしようとするとき、通常、該データＤ＜ｓｕｂ＞ｉ−１＜／ｓｕｂ＞はキャッシュメモリにすでに存在することになので、データＤ＜ｓｕｂ＞ｉ−１＜／ｓｕｂ＞のプリフェッチは意味がない。
【００４５】
（ｃ．３）機械語命令との対応：
ｃ．１において使用したｐｒｅｆｅｔｃｈ命令およびｓｐｅｃ＿ｌｏａｄ命令の実装では、プロセッサが提供するプリフェッチ命令または投機的ロード命令を使用するか、または通常のロード命令を、アクセス違反を調べる条件分岐命令によってガード（ｇｕａｒｄ；  守る）するか、二通り考えることができる。目標とするプロセッサが専用の命令を提供している場合は、当然プロセッサが提供する命令を使用する方がオーバーヘッドが少ない。プロセッサが提供するプリフェッチ命令を使用すれば、命令数やメモリ参照のオーバーヘッドを最小に抑えることができる。通常プリフェッチ命令はプロセッサのメモリ転送のバンド幅が不足するような場合、例えばデータトランスレーションルックアサイドバッファ（ｄａｔａ  ｔｒａｎｓｌａｔｉｏｎ  ｌｏｏｋａｓｉｄｅ  ｂｕｆｆｅｒ；  ＤＴＬＢ；  参照されるデータの論理アドレスを物理アドレスに変換するテーブル）のミスが発生する場合には実行されない。現在のところ、プリフェッチ命令は多くのプロセッサで提供されているが、投機的ロード命令を提供しているのはインテル社のＩＡ−６４アーキテクチャとスパーク社のＳＰＡＲＣ  Ｖ９アーキテクチャのみである。
【００４６】
しかし、プロセッサがプリフェッチ命令を提供している場合においても、ガードされたロード命令が有効である局面が存在する。なぜならば、ガードされたロード命令はＤＴＬＢミスが発生するページ（ｐａｇｅ；  論理／物理アドレス変換の単位）を予めＤＴＬＢに読み込むことができるからである。従って、イテレーション間定数ストライドがページの大きさの半分より大きい場合は、ガードされたロード命令の方がプロセッサが提供するプリフェッチ命令より効果的である。さらに重要な場合として、メモリ参照によってアドレスが得られる場合がある。例えば上記のＡ（Ｌ＜ｓｕｂ＞ｙ＜／ｓｕｂ＞）はイテレーション間で定数ストライドを持たないので、連続したイテレーションにおいて次々と異なるページを参照する可能性が高い。従って、Ｌ＜ｓｕｂ＞ｙ＜／ｓｕｂ＞をプリフェッチするときにはガードされたロード命令が有効である。
【００４７】
【実施例】
以下では、Ｊａｖａ  ＪＩＴコンパイラにおける実施例を述べる。
例として、ＳＰＥＣｊｖｍ９８ベンチマークの中の＿２０２＿ｊｅｓｓベンチマークのコードの一部を考える。このプログラムはＪａｖａ言語で記述されたエキスパートシステム（ｅｘｐｅｒｔ  ｓｙｓｔｅｍ；  与えられた知識データを基にして推論を行なうプログラム）である。以下のＪａｖａプログラムは、＿２０２＿ｊｅｓｓベンチマークの一部分を簡略化したものである。説明の便宜上、以下のＪａｖａプログラムを「サンプルプログラム」と呼ぶとともに、コード列の左端には行番号を付ける。
【００４８】
2004355279.tif 000003
【００４９】
2004355279.tif 000004
【００５０】
2004355279.tif 000005
【００５１】
ＴｏｋｅｎＶｅｃｔｏｒ型のオブジェクトｔｖは、その要素としてのＴｏｋｅｎ型のオブジェクトｖを適宜、増減される（行番号１３，１４）。Ｔｏｋｅｎ型のオブジェクトｔｖ．ｖ及びｔは、ＶａｌｕｅＶｅｃｔｏｒ型のオブジェクトｆａｃｔｓのリストを備える（行番号３４）メソッドｆｉｎｄＩｎＭｅｍｏｒｙ（行番号５１〜５９）の実行では、ｔｍｐ．ｆａｃｔｓとｔ．ｆａｃｔｓとの同一番号の要素同士が対比され（行番号５６）、もし一致したならば、そのときのオブジェクトｔｍｐがメソッドｆｉｎｄＩｎＭｅｍｏｒｙの返り値とされる（行番号５８）。
【００５２】
メソッドｆｉｎｄＩｎＭｅｍｏｒｙ（）は＿２０２＿ｊｅｓｓベンチマークで全体の実行時間に占める割合が多いメソッドの一つである。ここでは、メソッドｆｉｎｄＩｎＭｅｍｏｒｙ（）の外側のループ（変数ｉを添字とするｆｏｒループ）がプリフェッチ命令を生成する目標のループであるとする。＿２０２＿ｊｅｓｓのプロファイルから、内側のループ（変数ｊを添字とするｆｏｒループ）はループの反復回数が少ないことがわかるので、ここでは、内側のループのロード命令もプリフェッチの対象とする。図１はサンプルプログラムにおいて外側のループで辿るＴｏｋｅｎオブジェクトに関連したデータ構造の説明図である。
【００５３】
図２はサンプルプログラムにおいて二重ループに含まれるロード命令とそれが参照するデータの、ヒープメモリ上のアドレスとの関係を示している。図２において、演算子’＆’は変数のアドレスを表す演算子である（Ｊａｖａの表記ではない）。配列のｌｅｎｇｔｈフィールド（ｆｉｅｌｄ；  欄）へのロード命令はＪａｖａプログラムには明示的に現れないが、配列の境界検査（ｂｏｕｎｄ  ｃｈｅｃｋ）のために生成される。
【００５４】
Ｗｕらのプリフェッチアルゴリズムは、反復回数の多いループに含まれる、アドレスがループ内で不変（ｉｎｖａｒｉａｎｔ）でないロード命令について、各アドレスのイテレーション間ストライドの値のプロファイルを調べる。この例ではＬ＜ｓｕｂ＞４＜／ｓｕｂ＞，  Ｌ＜ｓｕｂ＞９＜／ｓｕｂ＞，  Ｌ＜ｓｕｂ＞１０＜／ｓｕｂ＞，  Ｌ＜ｓｕｂ＞１１＜／ｓｕｂ＞がプロファイルの対象となるロード命令である。
【００５５】
しかし、この＿２０２＿ｊｅｓｓの上記コード部分の例では、イテレーション間定数ストライドを持つロード命令はＬ＜ｓｕｂ＞４＜／ｓｕｂ＞だけである。この理由は、配列ｔｖ．ｖから参照されるＴｏｋｅｎオブジェクトは、初期化段階で一度に生成されるのではなく、ベンチマークの実行中にメソッドａｄｄＥｌｅｍｅｎｔ（）によって漸次追加されるためである。また、メソッドｒｅｍｏｖｅＥｌｅｍｅｎｔ（）はＴｏｋｅｎオブジェクトを配列ｔｖ．ｖから取り除く際に、配列の最後の要素を取り除かれた要素に代入する。従って配列ｔｖ．ｖのＴｏｋｅｎオブジェクトを先頭から順に参照しても、Ｌ＜ｓｕｂ＞９＜／ｓｕｂ＞，  Ｌ＜ｓｕｂ＞１０＜／ｓｕｂ＞はイテレーション間定数ストライドを持たない。プロファイルによって得られたロード命令Ｌ＜ｓｕｂ＞４＜／ｓｕｂ＞のイテレーション間定数ストライドがｄバイトであったとすれば、ｃイテレーション先にアクセスされるデータをプリフェッチする命令を、Ｗｕらのアルゴリズムに従って生成すると以下の擬似プログラムのように表される。説明の便宜上、以下の擬似プログラムを第１の擬似プログラムと呼ぶ。
【００５６】
８０：ＴｏｋｅｎＬｏｏｐ：
８１：  ｆｏｒ  （ｉｎｔ  ｉ  ＝  ０；  ｉ  ＜  ｔｖ．ｐｔｒ；  ｉ＋＋）  ｛
８２：    Ｔｏｋｅｎ  ｔｍｐ  ＝  ｔｖ．ｖ［ｉ］；
８３：    ｐｒｅｆｅｔｃｈ  （＆ｔｖ．ｖ［ｉ］  ＋  ｃ＊ｄ）；
８４：    ｆｏｒ  （ｉｎｔ  ｊ  ＝  ０；  ｊ  ＜  ｔ．ｓｉｚｅ；  ｊ＋＋）  ｛
８５：      ｉｆ  （！ｔ．ｆａｃｔｓ［ｊ］．ｅｑｕａｌｓ  （ｔｍｐ．ｆａｃｔｓ［ｊ］））
８６：        ｃｏｎｔｉｎｕｅ  ＴｏｋｅｎＬｏｏｐ；
８７：    ｒｅｔｕｒｎ  ｔｍｐ；
８８：  ｝
【００５７】
第１の擬似プログラムでは、サンプルプログラムの行番号５２〜５９の対比から分かるように、ｐｒｅｆｅｔｃｈが行番号８３に追加されている。図３は第１の擬似プログラムの実行過程において関わるデータ及びアドレスを図１のデータ構造上に表示した図である。プロセッサが現在実行している命令列の属するイテレーションの番号をｉとする。ｉ番のイテレーションの命令列の実行中に、アドレス＆ｔｖ．ｖ［ｉ］  ＋  ｃ＊ｄのデータがキャッシュメモリにプリフェッチされる。
【００５８】
なお、図３、図５及び図９において、破線の引出し線の付いた符号はそれがアドレスであることを意味し、実線の引出し線の付いた符号はそれがデータであることを意味している。
【００５９】
これに対して、本実施例の手法を適用したときの手順は以下のようになる。まず外側のループ内のロード命令でプリフェッチの候補となるロード命令について、ロード依存グラフを生成する。図４はサンプルプログラムにおけるロード命令に対応するロード依存グラフである。
【００６０】
次に、オブジェクトインスペクションを用いて、外側のループを繰り返したときのイテレーション間およびイテレーション内の定数ストライドを検出する。上述のようにイテレーション間定数ストライドを持つロード命令はＬ＜ｓｕｂ＞４＜／ｓｕｂ＞だけである。しかし、ロード命令Ｌ＜ｓｕｂ＞９＜／ｓｕｂ＞のアドレスはＬ＜ｓｕｂ＞４＜／ｓｕｂ＞の結果から得られるので、ポインタ参照を一回行なうことで、ロード命令Ｌ＜ｓｕｂ＞９＜／ｓｕｂ＞で参照されるアドレスをプリフェッチすることができる。さらに、ロード命令Ｌ＜ｓｕｂ＞９＜／ｓｕｂ＞，  Ｌ＜ｓｕｂ＞１０＜／ｓｕｂ＞の間にイテレーション内定数ストライドが存在する。これは、Ｔｏｋｅｎオブジェクトのコンストラクタ（ｃｏｎｓｔｒｕｃｔｏｒ；  初期化メソッド）の先頭で、配列オブジェクトをアロケートしてｆａｃｔｓフィールドに代入しているからである。すなわち、配列オブジェクトはＴｏｋｅｎオブジェクトがアロケートされた直後にアロケートされるので、両者のヒープメモリ上の間隔は一定である可能性が高い。いま、Ｔｏｋｅｎオブジェクトの先頭からｆａｃｔｓフィールドへの間隔がｏバイト、ロード命令Ｌ＜ｓｕｂ＞９＜／ｓｕｂ＞，  Ｌ＜ｓｕｂ＞１０＜／ｓｕｂ＞のイテレーション内定数ストライドがｓバイトでキャッシュラインの大きさの半分より大きいとすると、本実施例によるプリフェッチングの結果は以下の擬似プログラムで表される。説明の便宜上、以下の擬似プログラムを第２の擬似プログラムと呼ぶことにする。
【００６１】
2004355279.tif 000006
【００６２】
第２の擬似プログラムでは、前述のサンプルプログラムに対して、行番号１０２〜１０５の命令コードが追加されている。また、第２の擬似プログラムでは、第１の擬似プログラムに対して、行番号８３の内容が行番号１０３〜１０５の内容に変更されている。ｐｒｅｆｅｔｃｈが行番号８３に追加されている。図５は第２の擬似プログラムの実行過程において関わるデータ及びアドレスを図１のデータ構造上に表示した図である。また、ｋ＝ｉ＋ｃとする。第２の擬似プログラムでは、プロセッサが現在実行している命令列の属するイテレーションの番号をｉとする。ｉ番のイテレーションの命令列の実行中に、アドレス＆ｔｖ．ｖ［ｉ］  ＋  ｃ＊ｄのデータｔｍｐが読み出され、ｔｍｐ＿ｐｒｅｆをアドレスとするデータ、すなわちアドレスｔｍｐ＿ｐｒｅｆのデータが読み出される。そして、アドレス（ｔｍｐ＿ｐｒｅｆ＋ｏ）のデータ、すなわちｋ番目のイテレーションにおけるポインタ参照ロード命令Ｌ＜ｓｕｂ＞９＜／ｓｕｂ＞がロードするデータが、行番号１０４においてヒープメモリからキャッシュメモリへプリフェッチされる。さらに、アドレス（ｔｍｐ＿ｐｒｅｆ＋ｏ＋ｓ）のデータ、すなわちｋ番目のイテレーションにおけるポインタ参照ロード命令Ｌ＜ｓｕｂ＞１０＜／ｓｕｂ＞がロードするデータが、行番号１０５においてヒープメモリからキャッシュメモリへプリフェッチされる。
【００６３】
なお、第２の擬似プログラムに第１の擬似プログラムの行番号８３のプリフェッチを追加することもできる。下記の第３の擬似プログラムがそれである。第３の擬似プログラムでは、第１の擬似プログラムの行番号８３が行番号１３３に現れている。
【００６４】
2004355279.tif 000007
【００６５】
本実施例の手法をＩＢＭ  Ｄｅｖｅｌｏｐｅｒ  Ｋｉｔ  ｆｏｒ  Ｗｉｎｄｏｗｓ（Ｗｉｎｄｏｗｓは登録商標），  Ｊａｖａ  Ｔｅｃｈｎｏｌｏｇｙ  Ｅｄｉｔｉｏｎ  Ｖｅｒｓｉｏｎ  １．３．１のＩＢＭ  Ｊａｖａ  ＪＩＴ  Ｃｏｍｐｉｌｅｒ  Ｖｅｒｓｉｏｎ  ４．０に実装して実験を行った。プロセッサは２  ＧＨｚ  Ｉｎｔｅｌ  Ｐｅｎｔｉｕｍ４（Ｐｅｎｔｉｕｍは登録商標）、メモリサイズは１  ＧＢ、ＯＳはＭｉｃｒｏｓｏｆｔ  Ｗｉｎｄｏｗｓ  ２０００  Ｐｒｏｆｅｓｓｉｏｎａｌ  ＋  Ｓｅｒｖｉｃｅ  Ｐａｃｋ  ２である。図６はＳＰＥＣｊｖｍ９８ベンチマーク及びＪａｖａＧｒａｎｄｅ  ｖ２．０ベンチマークＳｅｃｔｉｏｎ  ３のＰｅｎｔｉｕｍ  ４上での速度能向上率を示す。なお、ＳＰＥＣｊｖｍ９８ベンチマークはＳｔａｎｄａｒｄ  Ｐｅｒｆｏｒｍａｎｃｅ  Ｅｖａｌｕａｔｉｏｎ  Ｃｏｒｐｏｒａｔｉｏｎ  （ＳＰＥＣ），  ＪＶＭ  Ｃｌｉｅｎｔ９８  （ＳＰＥＣｊｖｍ９８），  ａｖａｉｌａｂｌｅ  ａｔ  ｈｔｔｐ：／／ｗｗｗ．ｓｐｅｃ．ｏｒｇ／ｏｓｇ／ｊｖｍ９８，  １９９８．であり、ＪａｖａＧｒａｎｄｅ  ｖ２．０ベンチマークはＪａｖａ  Ｇｒａｎｄｅ  Ｂｅｎｃｈｍａｒｋｉｎｇ  Ｐｒｏｊｅｃｔ，  Ｊａｖａ  Ｇｒａｎｄｅ  Ｆｏｒｕｍ  Ｂｅｎｃｈｍａｒｋ  Ｓｕｉｔｅ，  Ｖｅｒｓｉｏｎ  ２．０，  ａｖａｉｌａｂｌｅ  ａｔ  ｈｔｔｐ：／／ｗｗｗ．ｅｐｃｃ．ｅｄ．ａｃ．ｕｋ／ｊａｖａｇｒａｎｄｅ，  １９９９．である。ＳＰＥＣｊｖｍ９８は幾何平均で４．３％、ＪａｖａＧｒａｎｄｅ  ｖ２．０  Ｓｅｃｔｉｏｎ  ３は３．２％の性能向上を実現した。
【００６６】
また、図７はＳＰＥＣｊｖｍ９８ベンチマーク及びＪａｖａＧｒａｎｄｅ  ｖ２．０ベンチマークＳｅｃｔｉｏｎ  ３のＰｅｎｔｉｕｍ  ４上で実行した場合のコンパイル時間のオーバーヘッドを示す。数字はＪＩＴコンパイラの全コンパイル時間に対する割合である。コンパイル時間のオーバーヘッドは最大で３．７％である。Ｅｕｌｅｒ，  ＭｏｌＤｙｎ以外のプログラムに対しては１％以下に抑えられている。以上から、プリフェッチのためのコンパイル時間は実行時間に比べて非常に小さい。
【００６７】
図８はコード変換装置１０の機能ブロック図である。図９はコード変換装置１０が処理過程において関わるデータ及びアドレスを図１のデータ構造上に表示した図である。コード変換装置１０は、変換処理対象コード１１を機械語コード１２へ変換する。コード変換装置１０は、第１の着目手段１５、第２の着目手段１６、第１の検出手段１７、第２の検出手段１８、第１の計算手段１９、第２の計算手段２０、判定手段２１、第１の機械語コード部分生成手段２３、及び第２の機械語コード部分生成手段２４を有している。第１の着目手段１５は、所定のループＡにおける複数個のイテレーションの内で連続する所定個数ｎのイテレーションＢ＜ｓｕｂ＞１＜／ｓｕｂ＞，Ｂ＜ｓｕｂ＞２＜／ｓｕｂ＞，〜，Ｂ＜ｓｕｂ＞ｎ＜／ｓｕｂ＞（なお、Ｂ＜ｓｕｂ＞１＜／ｓｕｂ＞はループＡにおける１番目のイテレーションＢであることに限定されない。）を選択しそれらイテレーションＢ＜ｓｕｂ＞１＜／ｓｕｂ＞，Ｂ＜ｓｕｂ＞２＜／ｓｕｂ＞，〜，Ｂ＜ｓｕｂ＞ｎ＜／ｓｕｂ＞における変換処理対象コード１１上のポインタ参照ロード命令Ｃ＜ｓｕｂ＞１，１＜／ｓｕｂ＞，Ｃ＜ｓｕｂ＞２，１＜／ｓｕｂ＞，〜，Ｃ＜ｓｕｂ＞ｎ，１＜／ｓｕｂ＞に着目する。第２の着目手段１６は、各イテレーションＢ＜ｓｕｂ＞１＜／ｓｕｂ＞，Ｂ＜ｓｕｂ＞２＜／ｓｕｂ＞，〜，Ｂ＜ｓｕｂ＞ｎ＜／ｓｕｂ＞における変換処理対象コード１１上の他のロード命令であってポインタ参照ロード命令Ｃ＜ｓｕｂ＞１，１＜／ｓｕｂ＞，Ｃ＜ｓｕｂ＞２，１＜／ｓｕｂ＞，〜，Ｃ＜ｓｕｂ＞ｎ，１＜／ｓｕｂ＞にデータ依存するロード命令としてのデータ依存ロード命令Ｃ＜ｓｕｂ＞１，２＜／ｓｕｂ＞，Ｃ＜ｓｕｂ＞２，２＜／ｓｕｂ＞，〜，Ｃ＜ｓｕｂ＞ｎ，２＜／ｓｕｂ＞に着目する。第１の検出手段１７は、ポインタ参照ロード命令Ｃ＜ｓｕｂ＞１，１＜／ｓｕｂ＞，Ｃ＜ｓｕｂ＞２，１＜／ｓｕｂ＞，〜，Ｃ＜ｓｕｂ＞ｎ，１＜／ｓｕｂ＞に基づきプロセッサがロードするデータとしての参照値Ｕ＜ｓｕｂ＞１，１＜／ｓｕｂ＞，Ｕ＜ｓｕｂ＞２，１＜／ｓｕｂ＞，〜，Ｕ＜ｓｕｂ＞ｎ，１＜／ｓｕｂ＞に対してそれらがヒープメモリにおいて格納されているアドレスＵ＜ｓｕｂ＞１，０＜／ｓｕｂ＞，Ｕ＜ｓｕｂ＞２，０＜／ｓｕｂ＞，〜，Ｕ＜ｓｕｂ＞ｎ，０＜／ｓｕｂ＞を検出する。第２の検出手段１８は、データ依存ロード命令Ｃ＜ｓｕｂ＞ｒ，２＜／ｓｕｂ＞〜Ｃ＜ｓｕｂ＞ｓ，２＜／ｓｕｂ＞（ただし１≦ｒ＜ｓ≦ｎ）に基づきプロセッサがロードするデータＵ＜ｓｕｂ＞ｒ，２＜／ｓｕｂ＞，Ｕ＜ｓｕｂ＞ｒ＋１，２＜／ｓｕｂ＞，〜，Ｕ＜ｓｕｂ＞ｓ，２＜／ｓｕｂ＞に対してそれらがヒープメモリにおいて格納されているアドレスＵ＜ｓｕｂ＞ｒ，ｙ＜／ｓｕｂ＞，Ｕ＜ｓｕｂ＞ｒ＋１，ｙ＜／ｓｕｂ＞，〜，Ｕ＜ｓｕｂ＞ｓ，ｙ＜／ｓｕｂ＞を検出する。第１の計算手段１９は、相互に隣接するイテレーションのポインタ参照ロード命令のロードデータのアドレスの差分Ｕ＜ｓｕｂ＞２，０＜／ｓｕｂ＞−Ｕ＜ｓｕｂ＞１，０＜／ｓｕｂ＞，Ｕ＜ｓｕｂ＞３，０＜／ｓｕｂ＞−Ｕ＜ｓｕｂ＞２，０＜／ｓｕｂ＞，〜，Ｕ＜ｓｕｂ＞ｎ，０＜／ｓｕｂ＞−Ｕ＜ｓｕｂ＞ｎ−１，０＜／ｓｕｂ＞をイテレーション間ストライドＦ１として計算する。第２の計算手段２０は、各イテレーションにおけるポインタ参照ロード命令の参照値Ｕ＜ｓｕｂ＞ｒ，１＜／ｓｕｂ＞，Ｕ＜ｓｕｂ＞ｒ＋１，１＜／ｓｕｂ＞，〜，Ｕ＜ｓｕｂ＞ｓ，１＜／ｓｕｂ＞とデータ依存ロード命令のロードデータのアドレスＵ＜ｓｕｂ＞ｒ，ｙ＜／ｓｕｂ＞，Ｕ＜ｓｕｂ＞ｒ＋１，ｙ＜／ｓｕｂ＞，〜，Ｕ＜ｓｕｂ＞ｓ，ｙ＜／ｓｕｂ＞との差分Ｕ＜ｓｕｂ＞ｒ，ｙ＜／ｓｕｂ＞−Ｕ＜ｓｕｂ＞ｒ，１＜／ｓｕｂ＞，Ｕ＜ｓｕｂ＞ｒ＋１，ｙ＜／ｓｕｂ＞−Ｕ＜ｓｕｂ＞ｒ＋１，１＜／ｓｕｂ＞，Ｕ＜ｓｕｂ＞ｓ，ｙ＜／ｓｕｂ＞−Ｕ＜ｓｕｂ＞ｓ，１＜／ｓｕｂ＞をイテレーション内ストライドＦ２として計算する。判定手段２１は、相互に同一となっているイテレーション間ストライドＦ１がイテレーション間ストライドＦ１の総数に対して第１の割合以上存在しかつ相互に同一となっているイテレーション内ストライドＦ２がイテレーション内ストライドＦ２の総数に対して第２の割合以上存在すると言う条件が満たされるか否かを判定する。設定手段２２は、判定手段２１の判定が「正」である場合には該同一のイテレーション間ストライドＦ１及び該同一のイテレーション内ストライドＦ２に基づいてそれぞれイテレーション間定数ストライドＦｘ及びイテレーション内定数ストライドＦｙを設定する。第１の機械語コード部分生成手段２３は、ループＡのイテレーションＢ＜ｓｕｂ＞ａ＜／ｓｕｂ＞におけるポインタ参照ロード命令Ｃ＜ｓｕｂ＞ａ，１＜／ｓｕｂ＞に基づいてプロセッサがロードするデータＵ＜ｓｕｂ＞ａ，１＜／ｓｕｂ＞がヒープメモリにおいて格納されているアドレスＵ＜ｓｕｂ＞ａ，０＜／ｓｕｂ＞及び自然数ｐ（ただし、イテレーションＢ＜ｓｕｂ＞ａ＜／ｓｕｂ＞よりｐ個、後のイテレーションをイテレーションＢ＜ｓｕｂ＞ｂ＜／ｓｕｂ＞とすると、イテレーションＢ＜ｓｕｂ＞ｂ＜／ｓｕｂ＞はループＡの最後のイテレーションを越えない。）に対してヒープメモリ上のアドレスＵ＜ｓｕｂ＞ｂ，０＜／ｓｕｂ＞（＝Ｕ＜ｓｕｂ＞ａ，０＜／ｓｕｂ＞＋ｐ・Ｆｘ）にアクセスして該アドレスＵ＜ｓｕｂ＞ｂ，０＜／ｓｕｂ＞のデータＵ＜ｓｕｂ＞ｂ，１＜／ｓｕｂ＞を検出する機械語コード部分Ｈ１を生成する。第２の機械語コード部分生成手段２４は、プロセッサがループＡのイテレーションＢ＜ｓｕｂ＞ｂ＜／ｓｕｂ＞を実行するのに先立ち、ヒープメモリ上のアドレス（Ｕ＜ｓｕｂ＞ｂ，１＜／ｓｕｂ＞＋Ｆｙ）のデータＵ＜ｓｕｂ＞ｂ，２＜／ｓｕｂ＞をヒープメモリからキャッシュメモリへプリフェッチする機械語コード部分Ｈ２を生成する。
【００６８】
コード変換装置１０とは例えばＪＩＴコンパイラである。変換処理対象コード１１とは例えばＪａｖａのバイトコードである。第１及び第２の割合は、等しくてもよく、例えば共に７５％である。なお、当然のことながら、ヒープメモリが含まれるメインメモリからキャッシュメモリへのデータ転送はキャッシュラインを単位に行われる。したがって、ヒープメモリ上のアドレス（Ｕ＜ｓｕｂ＞ｂ，１＜／ｓｕｂ＞＋Ｆｙ）のデータＵ＜ｓｕｂ＞ｂ，２＜／ｓｕｂ＞をヒープメモリからキャッシュメモリへプリフェッチすれば、該アドレス（Ｕ＜ｓｕｂ＞ｂ，１＜／ｓｕｂ＞＋Ｆｙ）を含む所定アドレス範囲のデータが、データＵ＜ｓｕｂ＞ｂ，２＜／ｓｕｂ＞と共にヒープメモリからキャッシュメモリへロードされる。以降、コード変換装置１０の更なる具体的な構成について説明する。図８のコード変換装置１０は、以下に述べる種々の具体的構成を任意の組み合わせで適宜、装備され得る。
【００６９】
Ｊａｖａでは、そのバイトコード上のポインタ参照ロード命令は、ソースコードにおけるオブジェクト型変数を呼び出す操作に対応している。
【００７０】
第１及び第２の機械語コード部分生成手段２４は、機械語コード部分Ｈ１，Ｈ２を、イテレーションＢ＜ｓｕｂ＞ａ＜／ｓｕｂ＞を実行する機械語コード範囲に配置する。
【００７１】
機械語としてプリフェッチ命令Ｊ１及び投機的ロード命令Ｊ２を装備するプロセッサ用のコード変換装置１０では、第１の機械語コード部分生成手段２３は、機械語コード部分Ｈ１が、アドレスＵ＜ｓｕｂ＞ｂ，０＜／ｓｕｂ＞（＝Ｕ＜ｓｕｂ＞ａ，０＜／ｓｕｂ＞＋ｐ・Ｆｘ）のデータＵ＜ｓｕｂ＞ｂ，１＜／ｓｕｂ＞をロードする投機的ロード命令Ｊ２を含むように、機械語コード部分Ｈ１を生成する。第２の機械語コード部分生成手段２４は、機械語コード部分Ｈ２が、アドレス（Ｕ＜ｓｕｂ＞ｂ，１＜／ｓｕｂ＞＋Ｆｙ）のデータＵ＜ｓｕｂ＞ｂ，２＜／ｓｕｂ＞をプリフェッチするプリフェッチ命令Ｊ１を含むように、機械語コード部分Ｈ２を生成する。
【００７２】
機械語としてプリフェッチ命令Ｊ１及びロード命令Ｊ３を装備するプロセッサ用のコード変換装置１０では、第１の機械語コード部分生成手段２３は、機械語コード部分Ｈ１が、アクセス違反を調べる条件用分岐命令によりガードされたロード命令Ｊ３によりアドレスＵ＜ｓｕｂ＞ｂ，０＜／ｓｕｂ＞（＝Ｕ＜ｓｕｂ＞ａ，０＜／ｓｕｂ＞＋ｐ・Ｆｘ）のデータＵ＜ｓｕｂ＞ｂ，１＜／ｓｕｂ＞を検出する処理を含むように、機械語コード部分Ｈ１を生成する。第２の機械語コード部分生成手段２４は、機械語コード部分Ｈ２が、アクセス違反を調べる条件用分岐命令によりガードされたロード命令Ｊ３によりアドレス（Ｕ＜ｓｕｂ＞ｂ，１＜／ｓｕｂ＞＋Ｆｙ）のデータＶ＜ｓｕｂ＞ｂ＜／ｓｕｂ＞２をプリフェッチする処理を含むように、機械語コード部分Ｈ２を生成する。
【００７３】
なお、「ガードされたロード命令」とは所定の条件が満たされるときのみロードを実行するロード命令を言うものとする。本実施形態における「ガードされたロード命令」は、アクセス違反が無いと言う条件が満たされるときのみ、ロードを実行する。例えば、投機的に実行されるロード命令は、プログラムの本来の実行では読み出されない配列の要素や、配列の外のメモリを読み出すことがある。そのようなメモリ番地には、アドレスとして正しくない値（例えば０）が格納されている可能性がある。このような投機的なロード命令の結果をアドレス値として他のロード命令を実行する場合、そのロード命令はヒープメモリ以外のアドレス（０番地など）を読み出し、アクセス違反を起こす可能性がある。
【００７４】
図１０はコード変換装置１０の構成をさらに具体化して示したものである。図８のコード変換装置１０に対する追加点のみを説明する。グラフ生成手段２６は、ループＡ内のロード命令の依存関係を表現するグラフとしてのロード依存グラフを生成する。第１及び第２の着目手段１６は、ポインタ参照ロード命令及びデータ依存ロード命令をロード依存グラフに基づき検出する。アドレス記録手段２８は、ループＡにおけるイテレーションＢ＜ｓｕｂ＞１＜／ｓｕｂ＞，Ｂ＜ｓｕｂ＞２＜／ｓｕｂ＞，〜，Ｂ＜ｓｕｂ＞ｎ＜／ｓｕｂ＞についてバイトコードを機械語コードへ試し実行用にコンパイルし試し実行用機械語コードを、副作用を起こさずに試し実行して、各イテレーションのロード命令によるロードデータのアドレスをロード依存グラフに記録する。第１及び第２の検出手段１８は、ロード依存グラフに記録されたアドレスに基づきアドレスＵ＜ｓｕｂ＞１，０＜／ｓｕｂ＞〜アドレスＵ＜ｓｕｂ＞ｎ，０＜／ｓｕｂ＞及びアドレスＵ＜ｓｕｂ＞ｒ，１＜／ｓｕｂ＞〜アドレスＵ＜ｓｕｂ＞ｓ，１＜／ｓｕｂ＞を検出する。
【００７５】
なお、「副作用を起こさない」とは、ヒープメモリのデータ構造を変化させる操作は行わないことを意味するものとする。
【００７６】
図１１はコード変換装置１０の機能付加部を示している。予測手段３１は、データＵ＜ｓｕｂ＞ｂ，２＜／ｓｕｂ＞のプリフェッチが有意義か否かを予測する。中止手段３２は、予測手段３１が有意義でないと予測した場合には、第１及び第２の機械語生成手段による機械語コード部分Ｈ１，Ｈ２の生成を中止させる。説明の便宜上、データＵ＜ｓｕｂ＞ｂ，２＜／ｓｕｂ＞をロードするデータ依存ロード命令を対象データ依存ロード命令、該対象データ依存ロード命令がと呼ぶことにする。予測手段３１は、データＵ＜ｓｕｂ＞ｂ，２＜／ｓｕｂ＞にデータ依存する命令が存在する場合、及び／又は対象データ依存ロード命令とは別のデータ依存ロード命令がロードするデータＸに対して該データＸ用の機械語コード部分Ｈ２がすでに生成されていてデータＵ＜ｓｕｂ＞ｂ，２＜／ｓｕｂ＞はデータＸとは同一のキャッシュラインには入らない場合、プリフェッチ命令の挿入が有意義と予測する。
【００７７】
前述の第３の擬似プログラムの行番号１３３に対応する機能を追加装備するコード変換装置１０は、式：Ｕ＜ｓｕｂ＞ａ，０＜／ｓｕｂ＞＋ｐ・Ｆｘに基づきアドレス（Ｕ＜ｓｕｂ＞ａ，０＜／ｓｕｂ＞＋ｐ・Ｆｘ）のデータＵ＜ｓｕｂ＞ｂ，１＜／ｓｕｂ＞をヒープメモリからキャッシュメモリへプリフェッチする機械語コード部分Ｈ３を生成する第３の機械語コード部分生成手段を有している。そして、該コード変換装置１０は、さらに、キャッシュラインのサイズＦｓとしてＦｓ≧が２・Ｆｘであるならば第３の機械語コード部分生成手段による機械語コード部分Ｈ３の生成は中止とする制御手段を有している。
【００７８】
図１２はコード変換方法のフローチャートである。コード変換方法では、変換処理対象コードを機械語コードへ変換する。第１の着目ステップＳ３５では、所定のループＡにおける複数個のイテレーションの内で連続する所定個数ｎのイテレーションＢ＜ｓｕｂ＞１＜／ｓｕｂ＞，Ｂ＜ｓｕｂ＞２＜／ｓｕｂ＞，〜，Ｂ＜ｓｕｂ＞ｎ＜／ｓｕｂ＞（なお、Ｂ＜ｓｕｂ＞１＜／ｓｕｂ＞はループＡにおける１番目のイテレーションＢであることに限定されない。）を選択しそれらイテレーションＢ＜ｓｕｂ＞１＜／ｓｕｂ＞，Ｂ＜ｓｕｂ＞２＜／ｓｕｂ＞，〜，Ｂ＜ｓｕｂ＞ｎ＜／ｓｕｂ＞における変換処理対象コード上のポインタ参照ロード命令Ｃ＜ｓｕｂ＞１，１＜／ｓｕｂ＞，Ｃ＜ｓｕｂ＞２，１＜／ｓｕｂ＞，〜，Ｃ＜ｓｕｂ＞ｎ＜／ｓｕｂ＞１に着目する。第２の着目ステップＳ３６では、各イテレーションＢ＜ｓｕｂ＞１＜／ｓｕｂ＞，Ｂ＜ｓｕｂ＞２＜／ｓｕｂ＞，〜，Ｂ＜ｓｕｂ＞ｎ＜／ｓｕｂ＞における変換処理対象コード上の他のロード命令Ｃ＜ｓｕｂ＞１，２＜／ｓｕｂ＞，Ｃ＜ｓｕｂ＞２，２＜／ｓｕｂ＞，〜，Ｃ＜ｓｕｂ＞ｎ＜／ｓｕｂ＞２であってポインタ参照ロード命令Ｃ＜ｓｕｂ＞１，１＜／ｓｕｂ＞，Ｃ＜ｓｕｂ＞２，１＜／ｓｕｂ＞，〜，Ｃ＜ｓｕｂ＞ｎ＜／ｓｕｂ＞１にデータ依存するロード命令としてのデータ依存ロード命令Ｃ＜ｓｕｂ＞１，２＜／ｓｕｂ＞，Ｃ＜ｓｕｂ＞２，２＜／ｓｕｂ＞，〜，Ｃ＜ｓｕｂ＞ｎ＜／ｓｕｂ＞２に着目する。第１の検出ステップＳ３７では、ポインタ参照ロード命令Ｃ＜ｓｕｂ＞１，１＜／ｓｕｂ＞，Ｃ＜ｓｕｂ＞２，１＜／ｓｕｂ＞，〜，Ｃ＜ｓｕｂ＞ｎ＜／ｓｕｂ＞１に基づきプロセッサがロードするデータとしての参照値Ｕ＜ｓｕｂ＞１，１＜／ｓｕｂ＞，Ｕ＜ｓｕｂ＞２，１＜／ｓｕｂ＞，〜，Ｕ＜ｓｕｂ＞ｎ，０＜／ｓｕｂ＞１に対してそれらがヒープメモリにおいて格納されているアドレスＵ＜ｓｕｂ＞１，０＜／ｓｕｂ＞，Ｕ＜ｓｕｂ＞２，０＜／ｓｕｂ＞，〜，Ｕ＜ｓｕｂ＞ｎ，０＜／ｓｕｂ＞０を検出する。第２の検出ステップＳ３８では、データ依存ロード命令Ｃ＜ｓｕｂ＞ｒ，２＜／ｓｕｂ＞〜Ｃ＜ｓｕｂ＞ｓ，２＜／ｓｕｂ＞（ただし１≦ｒ＜ｓ≦ｎ）に基づきプロセッサがロードするデータＵ＜ｓｕｂ＞ｒ，２＜／ｓｕｂ＞，Ｕ＜ｓｕｂ＞ｒ＋１，２＜／ｓｕｂ＞，〜，Ｕ＜ｓｕｂ＞ｓ，２＜／ｓｕｂ＞に対してそれらがヒープメモリにおいて格納されているアドレスＵ＜ｓｕｂ＞ｒ，ｙ＜／ｓｕｂ＞，Ｕ＜ｓｕｂ＞ｒ＋１，ｙ＜／ｓｕｂ＞，〜，Ｕ＜ｓｕｂ＞ｓ，ｙ＜／ｓｕｂ＞を検出する。第１の計算ステップＳ３９では、相互に隣接するイテレーションのポインタ参照ロード命令のロードデータのアドレスの差分Ｕ＜ｓｕｂ＞２，０＜／ｓｕｂ＞−Ｕ＜ｓｕｂ＞１，０＜／ｓｕｂ＞，Ｕ＜ｓｕｂ＞３，０＜／ｓｕｂ＞−Ｕ＜ｓｕｂ＞２，０＜／ｓｕｂ＞，〜，Ｕ＜ｓｕｂ＞ｎ，０＜／ｓｕｂ＞−Ｕ＜ｓｕｂ＞ｎ−１，０＜／ｓｕｂ＞をイテレーション間ストライドＦ１として計算する。第２の計算ステップＳ４０では、各イテレーションにおけるポインタ参照ロード命令の参照値Ｕ＜ｓｕｂ＞ｒ，１＜／ｓｕｂ＞，Ｕ＜ｓｕｂ＞ｒ＋１，１＜／ｓｕｂ＞，〜，Ｕ＜ｓｕｂ＞ｓ，１＜／ｓｕｂ＞とデータ依存ロード命令のロードデータのアドレスＵ＜ｓｕｂ＞ｒ，ｙ＜／ｓｕｂ＞，Ｕ＜ｓｕｂ＞ｒ＋１，ｙ＜／ｓｕｂ＞，〜，Ｕ＜ｓｕｂ＞ｓ，ｙ＜／ｓｕｂ＞との差分Ｕ＜ｓｕｂ＞ｒ，ｙ＜／ｓｕｂ＞−Ｕ＜ｓｕｂ＞ｒ，１＜／ｓｕｂ＞，Ｕ＜ｓｕｂ＞ｒ＋１，ｙ＜／ｓｕｂ＞−Ｕ＜ｓｕｂ＞ｒ＋１，１＜／ｓｕｂ＞，Ｕ＜ｓｕｂ＞ｓ，ｙ＜／ｓｕｂ＞−Ｕ＜ｓｕｂ＞ｓ，１＜／ｓｕｂ＞をイテレーション内ストライドＦ２として計算する。判定ステップＳ４１では、相互に同一となっているイテレーション間ストライドＦ１がイテレーション間ストライドＦ１の総数に対して第１の割合以上存在しかつ相互に同一となっているイテレーション内ストライドＦ２がイテレーション内ストライドＦ２の総数に対して第２の割合以上存在すると言う条件が満たされるか否かを判定する。設定ステップＳ４２では、判定ステップＳ４１における判定が「正」である場合には該同一のイテレーション間ストライドＦ１及び該同一のイテレーション内ストライドＦ２に基づいてそれぞれイテレーション間定数ストライドＦｘ及びイテレーション内定数ストライドＦｙを設定する。第１の機械語コード部分生成ステップＳ４３では、ループＡのイテレーションＢ＜ｓｕｂ＞ａ＜／ｓｕｂ＞におけるポインタ参照ロード命令Ｃ＜ｓｕｂ＞ａ，１＜／ｓｕｂ＞に基づいてプロセッサがロードするデータＵ＜ｓｕｂ＞ａ，１＜／ｓｕｂ＞がヒープメモリにおいて格納されているアドレスＵ＜ｓｕｂ＞ａ，０＜／ｓｕｂ＞及び自然数ｐ（ただし、イテレーションＢ＜ｓｕｂ＞ａ＜／ｓｕｂ＞よりｐ個、後のイテレーションをイテレーションＢ＜ｓｕｂ＞ｂ＜／ｓｕｂ＞とすると、イテレーションＢ＜ｓｕｂ＞ｂ＜／ｓｕｂ＞はループＡの最後のイテレーションを越えない。）に対してヒープメモリ上のアドレスＵ＜ｓｕｂ＞ｂ，０＜／ｓｕｂ＞（＝Ｕ＜ｓｕｂ＞ａ，０＜／ｓｕｂ＞＋ｐ・Ｆｘ）にアクセスして該アドレスＵ＜ｓｕｂ＞ｂ，０＜／ｓｕｂ＞のデータＵ＜ｓｕｂ＞ｂ，１＜／ｓｕｂ＞を検出する機械語コード部分Ｈ１を生成する。第２の機械語コード部分生成ステップＳ４４では、プロセッサがループＡのイテレーションＢ＜ｓｕｂ＞ｂ＜／ｓｕｂ＞を実行するのに先立ち、ヒープメモリ上のアドレス（Ｕ＜ｓｕｂ＞ｂ，１＜／ｓｕｂ＞＋Ｆｙ）のデータＵ＜ｓｕｂ＞ｂ，２＜／ｓｕｂ＞をヒープメモリからキャッシュメモリへプリフェッチする機械語コード部分Ｈ２を生成する。
【００７９】
本実施例のコード変換方法では、図１２のフローチャートに係るコード変換方法を基本にして、以下に述べる具体的構成を任意の組み合わせで適宜追加可能である。
【００８０】
変換処理対象コードはＪａｖａのバイトコードである。コード変換方法はＪＩＴコンパイラである。
【００８１】
第１及び第２の機械語コード部分生成ステップＳ４４では、機械語コード部分Ｈ１，Ｈ２を、イテレーションＢ＜ｓｕｂ＞ａ＜／ｓｕｂ＞を実行する機械語コード範囲に配置する。
【００８２】
機械語としてプリフェッチ命令Ｊ１及び投機的ロード命令Ｊ２を装備するプロセッサ用のコード変換方法において、第１の機械語コード部分生成ステップＳ４３では、機械語コード部分Ｈ１が、アドレスＵ＜ｓｕｂ＞ｂ，０＜／ｓｕｂ＞（＝Ｕ＜ｓｕｂ＞ａ，０＜／ｓｕｂ＞＋ｐ・Ｆｘ）のデータＵ＜ｓｕｂ＞ｂ，１＜／ｓｕｂ＞をロードする投機的ロード命令Ｊ２を含むように、機械語コード部分Ｈ１を生成する。第２の機械語コード部分生成ステップＳ４４では、機械語コード部分Ｈ２が、アドレス（Ｕ＜ｓｕｂ＞ｂ，１＜／ｓｕｂ＞＋Ｆｙ）のデータＵ＜ｓｕｂ＞ｂ，２＜／ｓｕｂ＞をプリフェッチするプリフェッチ命令Ｊ１を含むように、機械語コード部分Ｈ２を生成する。
【００８３】
機械語としてプリフェッチ命令Ｊ１及びロード命令Ｊ３を装備するプロセッサ用のコード変換方法において、第１の機械語コード部分生成ステップＳ４３では、機械語コード部分Ｈ１が、アクセス違反を調べる条件用分岐命令によりガードされたロード命令Ｊ３によりアドレスＵ＜ｓｕｂ＞ｂ，０＜／ｓｕｂ＞（＝Ｕ＜ｓｕｂ＞ａ，０＜／ｓｕｂ＞＋ｐ・Ｆｘ）のデータＵ＜ｓｕｂ＞ｂ，１＜／ｓｕｂ＞を検出する処理を含める。第２の機械語コード部分生成ステップＳ４４では、機械語コード部分Ｈ２が、アクセス違反を調べる条件用分岐命令によりガードされたロード命令Ｊ３によりアドレス（Ｕ＜ｓｕｂ＞ｂ，１＜／ｓｕｂ＞＋Ｆｙ）のデータＶ＜ｓｕｂ＞ｂ＜／ｓｕｂ＞２をプリフェッチする処理を含むように、機械語コード部分Ｈ２を生成する。
【００８４】
図１３は図１２のフローチャートにステップを追加したフローチャートの主要部である。グラフ生成ステップＳ４５はＳ３５の前に追加される。Ｓ４５では、ループＡ内のロード命令の依存関係を表現するグラフとしてのロード依存グラフを生成する。第１及び第２の着目ステップＳ３５，Ｓ３６では、ポインタ参照ロード命令及びデータ依存ロード命令をロード依存グラフに基づき検出する。
【００８５】
アドレス記録ステップＳ４６はＳ３６とＳ３７との間に追加される。アドレス記録ステップＳ４６では、ループＡにおけるイテレーションＢ＜ｓｕｂ＞１＜／ｓｕｂ＞，Ｂ＜ｓｕｂ＞２＜／ｓｕｂ＞，〜，Ｂ＜ｓｕｂ＞ｎ＜／ｓｕｂ＞について変換処理対象コードを機械語コードへ試し実行用にコンパイルし試し実行用機械語コードを、副作用を起こさずに試し実行して、各イテレーションのロード命令によるロードデータのアドレスをロード依存グラフに記録する。第１及び第２の検出ステップＳ３７，Ｓ３８では、ロード依存グラフに記録されたアドレスに基づきアドレスＵ＜ｓｕｂ＞１，０＜／ｓｕｂ＞〜アドレスＵ＜ｓｕｂ＞ｎ，０＜／ｓｕｂ＞及びアドレスＵ＜ｓｕｂ＞ｒ，１＜／ｓｕｂ＞〜アドレスＵ＜ｓｕｂ＞ｓ，１＜／ｓｕｂ＞を検出する。
【００８６】
図１４は図１２のフローチャートに別のステップを追加したフローチャートの主要部である。予測ステップＳ４９及び中止ステップＳ５０がＳ３９とＳ４２との間に追加されている。予測ステップＳ４９では、判定ステップＳ４１における判定に係るデータ依存ロード命令について、該データ依存ロード命令に基づくロードデータのプリフェッチが有意義か否かを予測する。予測ステップＳ４９において有意義でないと予測した場合には、すなわち、Ｓ４９の判定が「有り」の場合、Ｓ４２へ進み、「否」である場合、中止ステップＳ５０へ進む。中止ステップＳ５０では、第１及び第２の機械語生成ステップにおける機械語コード部分Ｈ１，Ｈ２の生成を中止させる。
【００８７】
図１５はＪＩＴコンパイラ５７の構成をＪａｖａ仮想計算機５５と共に示している。ＪＩＴコンパイラ５７は、バイトコード５６を実行するＪａｖａ仮想計算機５５からの指示を受けて指示範囲のバイトコード５６を機械語コード１２へ変換する。ＪＩＴコンパイラ５７は、情報収集手段５８及び変換手段５９を有している。情報収集手段５８は、指示範囲のバイトコード５６の部分を機械語コード１２へ試し実行用にコンパイルし試し実行用機械語コード１２を、副作用を起こさずに試し実行してヒープメモリにおけるデータ構造についての情報を収集する。変換手段５９は、情報収集手段５８による収集情報に基づいて指示範囲のバイトコード５６を機械語コード１２へ変換する。
【００８８】
図１５のＪＩＴコンパイラ５７はさらに以下の具体的構成を任意の組み合わせで装備可能になっている。変換手段５９は、情報収集手段５８による収集情報に依らずに指示範囲のバイトコード５６を変換された機械語コード１２に対して情報収集手段５８による収集情報に基づく機械語コード１２部分を追加した機械語コード１２を生成するものである。収集情報は、ループＡ内の各イテレーションにおける所定ロード命令がヒープメモリから参照するデータのアドレスの規則性に係る情報を含み、変換手段５９は、収集情報に基づき所定ロード命令に基づくロードデータをヒープメモリからキャッシュメモリへプリフェッチする機械語コード１２部分を生成するものである。
【００８９】
図１６はＪＩＴコンパイル方法のフローチャートである。ＪＩＴコンパイル方法では、バイトコードを実行するＪａｖａ仮想計算機からの指示を受けて指示範囲のバイトコードを機械語コードへ変換する。情報収集ステップＳ６３では、指示範囲のバイトコードの部分を機械語コードへ試し実行用にコンパイルし試し実行用機械語コードを、副作用を起こさずに試し実行してヒープメモリにおけるデータ構造についての情報を収集する。変換ステップＳ６４では、情報収集ステップＳ６３における収集情報に基づいて指示範囲のバイトコードを機械語コードへ変換する。
【００９０】
図１６に係るＪＩＴコンパイル方法は、さらに、以下の実施態様を任意の組み合わせで適宜追加され得る。
【００９１】
変換ステップＳ６４では、情報収集ステップＳ６３における収集情報に依らずに指示範囲のバイトコードを変換された機械語コードに対して情報収集ステップＳ６３における収集情報に基づく機械語コード部分を追加した機械語コードを生成する。
【００９２】
収集情報は、ループＡ内の各イテレーションにおける所定ロード命令がヒープメモリから参照するデータのアドレスの規則性に係る情報を含む。変換ステップＳ６４では、収集情報に基づき所定ロード命令に基づくロードデータをヒープメモリからキャッシュメモリへプリフェッチする機械語コード部分を生成する。
【００９３】
図１７はプログラムを実行するためのハードウェア構成図である。前述したコード変換装置７０及びイテレーション５７において各手段が実施する各機能は例えば図１７のハードウェアを使用して実行される。システムバス７０には、ＣＰＵ７１、メインメモリ７２及び入出力制御装置７３が接続される。ＣＰＵ７１及びキャッシュメモリ７５は同一のチップに含まれ、ＣＰＵ７１内のプロセッサは、キャッシュメモリ７５からデータをロードする。そして、キャッシュミスが生じた場合には、該キャッシュミスに係るデータを含むキャッシュラインがメインメモリ７２からキャッシュメモリ７５へロードされる。その後、ＣＰＵ７１内のプロセッサは該データをキャッシュメモリ７５からロードする。入出力制御装置７３には、ハードディスクインターフェース及びＬＡＮインターフェース等が含まれ、ＣＰＵ７１が実行する各種プログラム（ＪＩＴコンパイラを含む。）はハードディスク装置等に格納されている。プログラムは、ＣＰＵ７１において実行されるのに先立ち、メインメモリ７２に格納される。ＣＰＵ７１は、メインメモリ７２の命令行を順次、読み出して、該プログラムを実行する。
【００９４】
まとめとして本発明の構成に関して以下の事項を開示する。
（１）：変換処理対象コードを機械語コードへ変換するコード変換装置において、
所定のループＡにおける複数個のイテレーションの内で連続する所定個数ｎのイテレーションＢ＜ｓｕｂ＞１＜／ｓｕｂ＞，Ｂ＜ｓｕｂ＞２＜／ｓｕｂ＞，〜，Ｂ＜ｓｕｂ＞ｎ＜／ｓｕｂ＞（なお、Ｂ＜ｓｕｂ＞１＜／ｓｕｂ＞はループＡにおける１番目のイテレーションＢであることに限定されない。）を選択しそれらイテレーションＢ＜ｓｕｂ＞１＜／ｓｕｂ＞，Ｂ＜ｓｕｂ＞２＜／ｓｕｂ＞，〜，Ｂ＜ｓｕｂ＞ｎ＜／ｓｕｂ＞における変換処理対象コード上のポインタ参照ロード命令Ｃ＜ｓｕｂ＞１，１＜／ｓｕｂ＞，Ｃ＜ｓｕｂ＞２，１＜／ｓｕｂ＞，〜，Ｃ＜ｓｕｂ＞ｎ，１＜／ｓｕｂ＞に着目する第１の着目手段、
各イテレーションＢ＜ｓｕｂ＞１＜／ｓｕｂ＞，Ｂ＜ｓｕｂ＞２＜／ｓｕｂ＞，〜，Ｂ＜ｓｕｂ＞ｎ＜／ｓｕｂ＞における変換処理対象コード上の他のロード命令であってポインタ参照ロード命令Ｃ＜ｓｕｂ＞１，１＜／ｓｕｂ＞，Ｃ＜ｓｕｂ＞２，１＜／ｓｕｂ＞，〜，Ｃ＜ｓｕｂ＞ｎ，１＜／ｓｕｂ＞にデータ依存するロード命令としてのデータ依存ロード命令Ｃ＜ｓｕｂ＞１，２＜／ｓｕｂ＞，Ｃ＜ｓｕｂ＞２，２＜／ｓｕｂ＞，〜，Ｃ＜ｓｕｂ＞ｎ，２＜／ｓｕｂ＞に着目する第２の着目手段、
ポインタ参照ロード命令Ｃ＜ｓｕｂ＞１，１＜／ｓｕｂ＞，Ｃ＜ｓｕｂ＞２，１＜／ｓｕｂ＞，〜，Ｃ＜ｓｕｂ＞ｎ，１＜／ｓｕｂ＞に基づきプロセッサがロードするデータとしての参照値Ｕ＜ｓｕｂ＞１，１＜／ｓｕｂ＞，Ｕ＜ｓｕｂ＞２，１＜／ｓｕｂ＞，〜，Ｕ＜ｓｕｂ＞ｎ，１＜／ｓｕｂ＞に対してそれらがヒープメモリにおいて格納されているアドレスＵ＜ｓｕｂ＞１，０＜／ｓｕｂ＞，Ｕ＜ｓｕｂ＞２，０＜／ｓｕｂ＞，〜，Ｕ＜ｓｕｂ＞ｎ，０＜／ｓｕｂ＞を検出する第１の検出手段、
前記データ依存ロード命令Ｃ＜ｓｕｂ＞ｒ，２＜／ｓｕｂ＞〜Ｃ＜ｓｕｂ＞ｓ，２＜／ｓｕｂ＞（ただし１≦ｒ＜ｓ≦ｎ）に基づきプロセッサがロードするデータＵ＜ｓｕｂ＞ｒ，２＜／ｓｕｂ＞，Ｕ＜ｓｕｂ＞ｒ＋１，２＜／ｓｕｂ＞，〜，Ｕ＜ｓｕｂ＞ｓ，２＜／ｓｕｂ＞に対してそれらがヒープメモリにおいて格納されているアドレスＵ＜ｓｕｂ＞ｒ，ｙ＜／ｓｕｂ＞，Ｕ＜ｓｕｂ＞ｒ＋１，ｙ＜／ｓｕｂ＞，〜，Ｕ＜ｓｕｂ＞ｓ，ｙ＜／ｓｕｂ＞を検出する第２の検出手段、
相互に隣接するイテレーションの前記ポインタ参照ロード命令のロードデータのアドレスの差分Ｕ＜ｓｕｂ＞２，０＜／ｓｕｂ＞−Ｕ＜ｓｕｂ＞１，０＜／ｓｕｂ＞，Ｕ＜ｓｕｂ＞３，０＜／ｓｕｂ＞−Ｕ＜ｓｕｂ＞２，０＜／ｓｕｂ＞，〜，Ｕ＜ｓｕｂ＞ｎ，０＜／ｓｕｂ＞−Ｕ＜ｓｕｂ＞ｎ−１，０＜／ｓｕｂ＞をイテレーション間ストライドＦ１として計算する第１の計算手段、
各イテレーションにおける前記ポインタ参照ロード命令の参照値Ｕ＜ｓｕｂ＞ｒ，１＜／ｓｕｂ＞，Ｕ＜ｓｕｂ＞ｒ＋１，１＜／ｓｕｂ＞，〜，Ｕ＜ｓｕｂ＞ｓ，１＜／ｓｕｂ＞と前記データ依存ロード命令のロードデータのアドレスＵ＜ｓｕｂ＞ｒ，ｙ＜／ｓｕｂ＞，Ｕ＜ｓｕｂ＞ｒ＋１，ｙ＜／ｓｕｂ＞，〜，Ｕ＜ｓｕｂ＞ｓ，ｙ＜／ｓｕｂ＞との差分Ｕ＜ｓｕｂ＞ｒ，ｙ＜／ｓｕｂ＞−Ｕ＜ｓｕｂ＞ｒ，１＜／ｓｕｂ＞，Ｕ＜ｓｕｂ＞ｒ＋１，ｙ＜／ｓｕｂ＞−Ｕ＜ｓｕｂ＞ｒ＋１，１＜／ｓｕｂ＞，Ｕ＜ｓｕｂ＞ｓ，ｙ＜／ｓｕｂ＞−Ｕ＜ｓｕｂ＞ｓ，１＜／ｓｕｂ＞をイテレーション内ストライドＦ２として計算する第２の計算手段、
相互に同一となっているイテレーション間ストライドＦ１がイテレーション間ストライドＦ１の総数に対して第１の割合以上存在しかつ相互に同一となっているイテレーション内ストライドＦ２がイテレーション内ストライドＦ２の総数に対して第２の割合以上存在すると言う条件が満たされるか否かを判定する判定手段、
前記判定手段の判定が「正」である場合には該同一のイテレーション間ストライドＦ１及び該同一のイテレーション内ストライドＦ２に基づいてそれぞれイテレーション間定数ストライドＦｘ及びイテレーション内定数ストライドＦｙを設定する設定手段、
ループＡのイテレーションＢ＜ｓｕｂ＞ａ＜／ｓｕｂ＞におけるポインタ参照ロード命令Ｃ＜ｓｕｂ＞ａ，１＜／ｓｕｂ＞に基づいてプロセッサがロードするデータＵ＜ｓｕｂ＞ａ，１＜／ｓｕｂ＞がヒープメモリにおいて格納されているアドレスＵ＜ｓｕｂ＞ａ，０＜／ｓｕｂ＞及び自然数ｐ（ただし、イテレーションＢ＜ｓｕｂ＞ａ＜／ｓｕｂ＞よりｐ個、後のイテレーションをイテレーションＢ＜ｓｕｂ＞ｂ＜／ｓｕｂ＞とすると、イテレーションＢ＜ｓｕｂ＞ｂ＜／ｓｕｂ＞はループＡの最後のイテレーションを越えない。）に対してヒープメモリ上のアドレスＵ＜ｓｕｂ＞ｂ，０＜／ｓｕｂ＞（＝Ｕ＜ｓｕｂ＞ａ，０＜／ｓｕｂ＞＋ｐ・Ｆｘ）にアクセスして該アドレスＵ＜ｓｕｂ＞ｂ，０＜／ｓｕｂ＞のデータＵ＜ｓｕｂ＞ｂ，１＜／ｓｕｂ＞を検出する機械語コード部分Ｈ１を生成する第１の機械語コード部分生成手段、及び
プロセッサがループＡのイテレーションＢ＜ｓｕｂ＞ｂ＜／ｓｕｂ＞を実行するのに先立ち、ヒープメモリ上のアドレス（Ｕ＜ｓｕｂ＞ｂ，１＜／ｓｕｂ＞＋Ｆｙ）のデータＵ＜ｓｕｂ＞ｂ，２＜／ｓｕｂ＞をヒープメモリからキャッシュメモリへプリフェッチする機械語コード部分Ｈ２を生成する第２の機械語コード部分生成手段、
を有していることを特徴とするコード変換装置。
【００９５】
（２）：前記変換処理対象コードはＪａｖａのバイトコードであることを特徴とする（１）記載のコード変換装置。
（３）：前記コード変換装置はＪＩＴコンパイラであることを特徴とする（１）又は（２）記載のコード変換装置。
（４）：前記第１及び前記第２の機械語コード部分生成手段は、前記機械語コード部分Ｈ１，Ｈ２を、前記イテレーションＢ＜ｓｕｂ＞ａ＜／ｓｕｂ＞を実行する機械語コード範囲に配置することを特徴とする（１）〜（３）のいずれかに記載のコード変換装置。
（５）：機械語としてプリフェッチ命令Ｊ１及び投機的ロード命令Ｊ２を装備するプロセッサ用のコード変換装置において、
前記第１の機械語コード部分生成手段は、前記機械語コード部分Ｈ１が、アドレスＵ＜ｓｕｂ＞ｂ，０＜／ｓｕｂ＞（＝Ｕ＜ｓｕｂ＞ａ，０＜／ｓｕｂ＞＋ｐ・Ｆｘ）のデータＵ＜ｓｕｂ＞ｂ，１＜／ｓｕｂ＞をロードする投機的ロード命令Ｊ２を含むように、前記機械語コード部分Ｈ１を生成し、
前記第２の機械語コード部分生成手段は、前記機械語コード部分Ｈ２が、アドレス（Ｕ＜ｓｕｂ＞ｂ，１＜／ｓｕｂ＞＋Ｆｙ）のデータＵ＜ｓｕｂ＞ｂ，２＜／ｓｕｂ＞をプリフェッチするプリフェッチ命令Ｊ１を含むように、前記機械語コード部分Ｈ２を生成する、
ことを特徴とする（１）〜（４）のいずれかに記載のコード変換装置。
（６）：機械語としてプリフェッチ命令Ｊ１及びロード命令Ｊ３を装備するプロセッサ用のコード変換装置において、
前記第１の機械語コード部分生成手段は、前記機械語コード部分Ｈ１が、アクセス違反を調べる条件用分岐命令によりガードされたロード命令Ｊ３によりアドレスＵ＜ｓｕｂ＞ｂ，０＜／ｓｕｂ＞（＝Ｕ＜ｓｕｂ＞ａ，０＜／ｓｕｂ＞＋ｐ・Ｆｘ）のデータＵ＜ｓｕｂ＞ｂ，１＜／ｓｕｂ＞を検出する処理を含むように、機械語コード部分Ｈ１を生成し、
前記第２の機械語コード部分生成手段は、前記機械語コード部分Ｈ２が、アクセス違反を調べる条件用分岐命令によりガードされたロード命令Ｊ３によりアドレス（Ｕ＜ｓｕｂ＞ｂ，１＜／ｓｕｂ＞＋Ｆｙ）のデータＶ＜ｓｕｂ＞ｂ＜／ｓｕｂ＞２をプリフェッチする処理を含むように、機械語コード部分Ｈ２を生成する、
ことを特徴とする（１）〜（４）のいずれかに記載のコード変換装置。
（７）：ループＡ内のロード命令の依存関係を表現するグラフとしてのロード依存グラフを生成するグラフ生成手段、
を有し、
前記第１及び前記第２の着目手段は、前記ポインタ参照ロード命令及び前記データ依存ロード命令をロード依存グラフに基づき検出することを特徴とする（１）〜（６）のいずれかに記載のコード変換装置。
【００９６】
（８）：ループＡにおけるイテレーションＢ＜ｓｕｂ＞１＜／ｓｕｂ＞，Ｂ＜ｓｕｂ＞２＜／ｓｕｂ＞，〜，Ｂ＜ｓｕｂ＞ｎ＜／ｓｕｂ＞についてバイトコードを機械語コードへ試し実行用にコンパイルし試し実行用機械語コードを、副作用を起こさずに試し実行して、各イテレーションのロード命令によるロードデータのアドレスをロード依存グラフに記録するアドレス記録手段、
を有し、
前記第１及び第２の検出手段は、ロード依存グラフに記録されたアドレスに基づきアドレスＵ＜ｓｕｂ＞１，０＜／ｓｕｂ＞〜アドレスＵ＜ｓｕｂ＞ｎ，０＜／ｓｕｂ＞及びアドレスＵ＜ｓｕｂ＞ｒ，１＜／ｓｕｂ＞〜アドレスＵ＜ｓｕｂ＞ｓ，１＜／ｓｕｂ＞を検出する、
ことを特徴とする（７）記載のコード変換装置。
（９）：データＵ＜ｓｕｂ＞ｂ，２＜／ｓｕｂ＞のプリフェッチが有意義か否かを予測する予測手段、
前記予測手段が有意義でないと予測した場合には、前記第１及び前記第２の機械語生成手段による前記機械語コード部分Ｈ１，Ｈ２の生成を中止させる中止手段、
を有していることを特徴とする（１）〜（８）のいずれかに記載のコード変換装置。
（１０）：データＵ＜ｓｕｂ＞ｂ，２＜／ｓｕｂ＞をロードするデータ依存ロード命令を対象データ依存ロード命令、該対象データ依存ロード命令がと呼ぶことにし、
前記予測手段は、データＵ＜ｓｕｂ＞ｂ，２＜／ｓｕｂ＞にデータ依存する命令が存在する場合、及び／又は対象データ依存ロード命令とは別のデータ依存ロード命令がロードするデータＸに対して該データＸ用の機械語コード部分Ｈ２がすでに生成されていてデータＵ＜ｓｕｂ＞ｂ，２＜／ｓｕｂ＞はデータＸとは同一のキャッシュラインには入らない場合、プリフェッチ命令の挿入が有意義と予測することを特徴とする（９）記載のコード変換装置。
（１１）：式：Ｕ＜ｓｕｂ＞ａ，０＜／ｓｕｂ＞＋ｐ・Ｆｘに基づきアドレス（Ｕ＜ｓｕｂ＞ａ，０＜／ｓｕｂ＞＋ｐ・Ｆｘ）のデータＵ＜ｓｕｂ＞ｂ，１＜／ｓｕｂ＞をヒープメモリからキャッシュメモリへプリフェッチする機械語コード部分Ｈ３を生成する第３の機械語コード部分生成手段、及び
キャッシュラインのサイズＦｓとしてＦｓ≧が２・Ｆｘであるならば前記第３の機械語コード部分生成手段による機械語コード部分Ｈ３の生成は中止とする制御手段、
を有していることを特徴とする（１）〜（１０）のいずれかに記載のコード変換装置。
【００９７】
（１２）：バイトコードを実行するＪａｖａ仮想計算機からの指示を受けて指示範囲のバイトコードを機械語コードへ変換するＪＩＴコンパイラにおいて、
指示範囲のバイトコードの部分を機械語コードへ試し実行用にコンパイルし試し実行用機械語コードを、副作用を起こさずに試し実行してヒープメモリにおけるデータ構造についての情報を収集する情報収集手段、及び
前記情報収集手段による収集情報に基づいて指示範囲のバイトコードを機械語コードへ変換する変換手段、
を有していることを特徴とするＪＩＴコンパイラ。
（１３）：前記変換手段は、前記情報収集手段による収集情報に依らずに指示範囲のバイトコードを変換された機械語コードに対して前記情報収集手段による収集情報に基づく機械語コード部分を追加した機械語コードを生成するものである、
ことを特徴とする（１２）記載のＪＩＴコンパイラ。
（１４）：前記収集情報は、ループＡ内の各イテレーションにおける所定ロード命令がヒープメモリから参照するデータのアドレスの規則性に係る情報を含み、
前記変換手段は、前記収集情報に基づき所定ロード命令に基づくロードデータをヒープメモリからキャッシュメモリへプリフェッチする機械語コード部分を生成するものであることを特徴とする（１２）又は（１３）記載のＪＩＴコンパイラ。
【００９８】
（１５）：変換処理対象コードを機械語コードへ変換するコード変換方法において、
所定のループＡにおける複数個のイテレーションの内で連続する所定個数ｎのイテレーションＢ＜ｓｕｂ＞１＜／ｓｕｂ＞，Ｂ＜ｓｕｂ＞２＜／ｓｕｂ＞，〜，Ｂ＜ｓｕｂ＞ｎ＜／ｓｕｂ＞（なお、Ｂ＜ｓｕｂ＞１＜／ｓｕｂ＞はループＡにおける１番目のイテレーションＢであることに限定されない。）を選択しそれらイテレーションＢ＜ｓｕｂ＞１＜／ｓｕｂ＞，Ｂ＜ｓｕｂ＞２＜／ｓｕｂ＞，〜，Ｂ＜ｓｕｂ＞ｎ＜／ｓｕｂ＞における変換処理対象コード上のポインタ参照ロード命令Ｃ＜ｓｕｂ＞１，１＜／ｓｕｂ＞，Ｃ＜ｓｕｂ＞２，１＜／ｓｕｂ＞，〜，Ｃ＜ｓｕｂ＞ｎ，１＜／ｓｕｂ＞に着目する第１の着目ステップ、
各イテレーションＢ＜ｓｕｂ＞１＜／ｓｕｂ＞，Ｂ＜ｓｕｂ＞２＜／ｓｕｂ＞，〜，Ｂ＜ｓｕｂ＞ｎ＜／ｓｕｂ＞における変換処理対象コード上の他のロード命令であってポインタ参照ロード命令Ｃ＜ｓｕｂ＞１，１＜／ｓｕｂ＞，Ｃ＜ｓｕｂ＞２，１＜／ｓｕｂ＞，〜，Ｃ＜ｓｕｂ＞ｎ，１＜／ｓｕｂ＞にデータ依存するロード命令としてのデータ依存ロード命令Ｃ＜ｓｕｂ＞１，２＜／ｓｕｂ＞，Ｃ＜ｓｕｂ＞２，２＜／ｓｕｂ＞，〜，Ｃ＜ｓｕｂ＞ｎ，２＜／ｓｕｂ＞に着目する第２の着目ステップ、
ポインタ参照ロード命令Ｃ＜ｓｕｂ＞１，１＜／ｓｕｂ＞，Ｃ＜ｓｕｂ＞２，１＜／ｓｕｂ＞，〜，Ｃ＜ｓｕｂ＞ｎ，１＜／ｓｕｂ＞に基づきプロセッサがロードするデータとしての参照値Ｕ＜ｓｕｂ＞１，１＜／ｓｕｂ＞，Ｕ＜ｓｕｂ＞２，１＜／ｓｕｂ＞，〜，Ｕ＜ｓｕｂ＞ｎ，１＜／ｓｕｂ＞に対してそれらがヒープメモリにおいて格納されているアドレスＵ＜ｓｕｂ＞１，０＜／ｓｕｂ＞，Ｕ＜ｓｕｂ＞２，０＜／ｓｕｂ＞，〜，Ｕ＜ｓｕｂ＞ｎ，０＜／ｓｕｂ＞を検出する第１の検出ステップ、
前記データ依存ロード命令Ｃ＜ｓｕｂ＞ｒ，２＜／ｓｕｂ＞〜Ｃ＜ｓｕｂ＞ｓ，２＜／ｓｕｂ＞（ただし１≦ｒ＜ｓ≦ｎ）に基づきプロセッサがロードするデータＵ＜ｓｕｂ＞ｒ，２＜／ｓｕｂ＞，Ｕ＜ｓｕｂ＞ｒ＋１，２＜／ｓｕｂ＞，〜，Ｕ＜ｓｕｂ＞ｓ，２＜／ｓｕｂ＞に対してそれらがヒープメモリにおいて格納されているアドレスＵ＜ｓｕｂ＞ｒ，ｙ＜／ｓｕｂ＞，Ｕ＜ｓｕｂ＞ｒ＋１，ｙ＜／ｓｕｂ＞，〜，Ｕ＜ｓｕｂ＞ｓ，ｙ＜／ｓｕｂ＞を検出する第２の検出ステップ、
相互に隣接するイテレーションの前記ポインタ参照ロード命令のロードデータのアドレスの差分Ｕ＜ｓｕｂ＞２，０＜／ｓｕｂ＞−Ｕ＜ｓｕｂ＞１，０＜／ｓｕｂ＞，Ｕ＜ｓｕｂ＞３，０＜／ｓｕｂ＞−Ｕ＜ｓｕｂ＞２，０＜／ｓｕｂ＞，〜，Ｕ＜ｓｕｂ＞ｎ，０＜／ｓｕｂ＞−Ｕ＜ｓｕｂ＞ｎ−１，０＜／ｓｕｂ＞をイテレーション間ストライドＦ１として計算する第１の計算ステップ、
各イテレーションにおける前記ポインタ参照ロード命令の参照値Ｕ＜ｓｕｂ＞ｒ，１＜／ｓｕｂ＞，Ｕ＜ｓｕｂ＞ｒ＋１，１＜／ｓｕｂ＞，〜，Ｕ＜ｓｕｂ＞ｓ，１＜／ｓｕｂ＞と前記データ依存ロード命令のロードデータのアドレスＵ＜ｓｕｂ＞ｒ，ｙ＜／ｓｕｂ＞，Ｕ＜ｓｕｂ＞ｒ＋１，ｙ＜／ｓｕｂ＞，〜，Ｕ＜ｓｕｂ＞ｓ，ｙ＜／ｓｕｂ＞との差分Ｕ＜ｓｕｂ＞ｒ，ｙ＜／ｓｕｂ＞−Ｕ＜ｓｕｂ＞ｒ，１＜／ｓｕｂ＞，Ｕ＜ｓｕｂ＞ｒ＋１，ｙ＜／ｓｕｂ＞−Ｕ＜ｓｕｂ＞ｒ＋１，１＜／ｓｕｂ＞，Ｕ＜ｓｕｂ＞ｓ，ｙ＜／ｓｕｂ＞−Ｕ＜ｓｕｂ＞ｓ，１＜／ｓｕｂ＞をイテレーション内ストライドＦ２として計算する第２の計算ステップ、
相互に同一となっているイテレーション間ストライドＦ１がイテレーション間ストライドＦ１の総数に対して第１の割合以上存在しかつ相互に同一となっているイテレーション内ストライドＦ２がイテレーション内ストライドＦ２の総数に対して第２の割合以上存在すると言う条件が満たされるか否かを判定する判定ステップ、
前記判定ステップにおける判定が「正」である場合には該同一のイテレーション間ストライドＦ１及び該同一のイテレーション内ストライドＦ２に基づいてそれぞれイテレーション間定数ストライドＦｘ及びイテレーション内定数ストライドＦｙを設定する設定ステップ、
ループＡのイテレーションＢ＜ｓｕｂ＞ａ＜／ｓｕｂ＞におけるポインタ参照ロード命令Ｃ＜ｓｕｂ＞ａ，１＜／ｓｕｂ＞に基づいてプロセッサがロードするデータＵ＜ｓｕｂ＞ａ，１＜／ｓｕｂ＞がヒープメモリにおいて格納されているアドレスＵ＜ｓｕｂ＞ａ，０＜／ｓｕｂ＞及び自然数ｐ（ただし、イテレーションＢ＜ｓｕｂ＞ａ＜／ｓｕｂ＞よりｐ個、後のイテレーションをイテレーションＢ＜ｓｕｂ＞ｂ＜／ｓｕｂ＞とすると、イテレーションＢ＜ｓｕｂ＞ｂ＜／ｓｕｂ＞はループＡの最後のイテレーションを越えない。）に対してヒープメモリ上のアドレスＵ＜ｓｕｂ＞ｂ，０＜／ｓｕｂ＞（＝Ｕ＜ｓｕｂ＞ａ，０＜／ｓｕｂ＞＋ｐ・Ｆｘ）にアクセスして該アドレスＵ＜ｓｕｂ＞ｂ，０＜／ｓｕｂ＞のデータＵ＜ｓｕｂ＞ｂ，１＜／ｓｕｂ＞を検出する機械語コード部分Ｈ１を生成する第１の機械語コード部分生成ステップ、及び
プロセッサがループＡのイテレーションＢ＜ｓｕｂ＞ｂ＜／ｓｕｂ＞を実行するのに先立ち、ヒープメモリ上のアドレス（Ｕ＜ｓｕｂ＞ｂ，１＜／ｓｕｂ＞＋Ｆｙ）のデータＵ＜ｓｕｂ＞ｂ，２＜／ｓｕｂ＞をヒープメモリからキャッシュメモリへプリフェッチする機械語コード部分Ｈ２を生成する第２の機械語コード部分生成ステップ、
を有していることを特徴とするコード変換方法。
【００９９】
（１６）：前記変換処理対象コードはＪａｖａのバイトコードであることを特徴とする（１５）記載のコード変換方法。
（１７）：前記コード変換方法はＪＩＴコンパイラであることを特徴とする（１５）又は（１６）に記載のコード変換方法。
（１８）：前記第１及び前記第２の機械語コード部分生成ステップでは、前記機械語コード部分Ｈ１，Ｈ２を、前記イテレーションＢ＜ｓｕｂ＞ａ＜／ｓｕｂ＞を実行する機械語コード範囲に配置することを特徴とする（１５）〜（１７）のいずれかに記載のコード変換方法。
（１９）：機械語としてプリフェッチ命令Ｊ１及び投機的ロード命令Ｊ２を装備するプロセッサ用のコード変換方法において、
前記第１の機械語コード部分生成ステップでは、前記機械語コード部分Ｈ１が、アドレスＵ＜ｓｕｂ＞ｂ，０＜／ｓｕｂ＞（＝Ｕ＜ｓｕｂ＞ａ，０＜／ｓｕｂ＞＋ｐ・Ｆｘ）のデータＵ＜ｓｕｂ＞ｂ，１＜／ｓｕｂ＞をロードする投機的ロード命令Ｊ２を含むように、前記機械語コード部分Ｈ１を生成し、
前記第２の機械語コード部分生成ステップでは、前記機械語コード部分Ｈ２が、アドレス（Ｕ＜ｓｕｂ＞ｂ，１＜／ｓｕｂ＞＋Ｆｙ）のデータＵ＜ｓｕｂ＞ｂ，２＜／ｓｕｂ＞をプリフェッチするプリフェッチ命令Ｊ１を含むように、前記機械語コード部分Ｈ２を生成する、
ことを特徴とする（１５）〜（１８）のいずれかに記載のコード変換方法。
（２０）：機械語としてプリフェッチ命令Ｊ１及びロード命令Ｊ３を装備するプロセッサ用のコード変換方法において、
前記第１の機械語コード部分生成ステップでは、前記機械語コード部分Ｈ１が、アクセス違反を調べる条件用分岐命令によりガードされたロード命令Ｊ３によりアドレスＵ＜ｓｕｂ＞ｂ，０＜／ｓｕｂ＞（＝Ｕ＜ｓｕｂ＞ａ，０＜／ｓｕｂ＞＋ｐ・Ｆｘ）のデータＵ＜ｓｕｂ＞ｂ，１＜／ｓｕｂ＞を検出する処理を含むように、機械語コード部分Ｈ１を生成し、
前記第２の機械語コード部分生成ステップでは、前記機械語コード部分Ｈ２が、アクセス違反を調べる条件用分岐命令によりガードされたロード命令Ｊ３によりアドレス（Ｕ＜ｓｕｂ＞ｂ，１＜／ｓｕｂ＞＋Ｆｙ）のデータＶ＜ｓｕｂ＞ｂ＜／ｓｕｂ＞２をプリフェッチする処理を含むように、機械語コード部分Ｈ２を生成する、
ことを特徴とする（１５）〜（１８）のいずれかに記載のコード変換方法。
（２１）：ループＡ内のロード命令の依存関係を表現するグラフとしてのロード依存グラフを生成するグラフ生成ステップ、
を有し、
前記第１及び前記第２の着目ステップでは、前記ポインタ参照ロード命令及び前記データ依存ロード命令をロード依存グラフに基づき検出することを特徴とする（１５）〜（２０）のいずれかに記載のコード変換方法。
【０１００】
（２２）：ループＡにおけるイテレーションＢ＜ｓｕｂ＞１＜／ｓｕｂ＞，Ｂ＜ｓｕｂ＞２＜／ｓｕｂ＞，〜，Ｂ＜ｓｕｂ＞ｎ＜／ｓｕｂ＞についてバイトコードを機械語コードへ試し実行用にコンパイルし試し実行用機械語コードを、副作用を起こさずに試し実行して、各イテレーションのロード命令によるロードデータのアドレスをロード依存グラフに記録するアドレス記録ステップ、
を有し、
前記第１及び第２の検出ステップでは、ロード依存グラフに記録されたアドレスに基づきアドレスＵ＜ｓｕｂ＞１，０＜／ｓｕｂ＞〜アドレスＵ＜ｓｕｂ＞ｎ，０＜／ｓｕｂ＞及びアドレスＵ＜ｓｕｂ＞ｒ，１＜／ｓｕｂ＞〜アドレスＵ＜ｓｕｂ＞ｓ，１＜／ｓｕｂ＞を検出する、
ことを特徴とする（２１）記載のコード変換方法。
（２３）：データＵ＜ｓｕｂ＞ｂ，２＜／ｓｕｂ＞のプリフェッチが有意義か否かを予測する予測ステップ、
前記予測ステップにおいて有意義でないと予測した場合には、前記第１及び前記第２の機械語生成ステップにおける前記機械語コード部分Ｈ１，Ｈ２の生成を中止させる中止ステップ、
を有していることを特徴とする（１５）〜（２２）のいずれかに記載のコード変換装置。
（２４）：データＵ＜ｓｕｂ＞ｂ，２＜／ｓｕｂ＞をロードするデータ依存ロード命令を対象データ依存ロード命令、該対象データ依存ロード命令がと呼ぶことにし、
前記予測ステップでは、データＵ＜ｓｕｂ＞ｂ，２＜／ｓｕｂ＞にデータ依存する命令が存在する場合、及び／又は対象データ依存ロード命令とは別のデータ依存ロード命令がロードするデータＸに対して該データＸ用の機械語コード部分Ｈ２がすでに生成されていてデータＵ＜ｓｕｂ＞ｂ，２＜／ｓｕｂ＞はデータＸとは同一のキャッシュラインには入らない場合、プリフェッチ命令の挿入が有意義と予測することを特徴とする（２３）記載のコード変換装置。
（２５）：式：Ｕ＜ｓｕｂ＞ａ，０＜／ｓｕｂ＞＋ｐ・Ｆｘに基づきアドレス（Ｕ＜ｓｕｂ＞ａ，０＜／ｓｕｂ＞＋ｐ・Ｆｘ）のデータＵ＜ｓｕｂ＞ｂ，１＜／ｓｕｂ＞をヒープメモリからキャッシュメモリへプリフェッチする機械語コード部分Ｈ３を生成する第３の機械語コード部分生成ステップ、及び
キャッシュラインのサイズＦｓとしてＦｓ≧が２・Ｆｘであるならば前記第３の機械語コード部分生成ステップにおける機械語コード部分Ｈ３の生成は中止とする制御ステップ、
を有していることを特徴とする（１５）〜（２４）のいずれかに記載のコード変換装置。
【０１０１】
（２６）：バイトコードを実行するＪａｖａ仮想計算機からの指示を受けて指示範囲のバイトコードを機械語コードへ変換するＪＩＴコンパイル方法において、
指示範囲のバイトコードの部分を機械語コードへ試し実行用にコンパイルし試し実行用機械語コードを、副作用を起こさずに試し実行してヒープメモリにおけるデータ構造についての情報を収集する情報収集ステップ、及び
前記情報収集ステップにおける収集情報に基づいて指示範囲のバイトコードを機械語コードへ変換する変換ステップ、
を有していることを特徴とするＪＩＴコンパイル方法。
（２７）：前記変換ステップでは、前記情報収集ステップにおける収集情報に依らずに指示範囲のバイトコードを変換された機械語コードに対して前記情報収集ステップにおける収集情報に基づく機械語コード部分を追加した機械語コードを生成する、
ことを特徴とする（２６）記載のＪＩＴコンパイル方法。
（２８）：前記収集情報は、ループＡ内の各イテレーションにおける所定ロード命令がヒープメモリから参照するデータのアドレスの規則性に係る情報を含み、
前記変換ステップでは、前記収集情報に基づき所定ロード命令に基づくロードデータをヒープメモリからキャッシュメモリへプリフェッチする機械語コード部分を生成する、
ことを特徴とする（２６）又は（２７）に記載のＪＩＴコンパイル方法。
（２９）：（１）〜（１１）のいずれかに記載のコード変換装置の各手段としてコンピュータを機能させるためのコード変換用プログラム。
（３０）：（１２）〜（１４）のいずれかに記載のＪＩＴコンパイラの各手段としてコンピュータを機能させるためのＪＩＴコンパイラ用プログラム。
【０１０２】
【発明の効果】
本発明では、ループの各イテレーションにおけるポインタ参照ロード命令についてイテレーション間定数ストライドを検出するとともに、イテレーション間定数ストライドをもつポインタ参照ロード命令に基づいてロードされるデータとしての参照アドレスに対してイテレーション内定数ストライド関係にあるデータをプリフェッチする機械語コード部分を生成する。結果、機械語コードの実行では、キャッシュミスを抑制して、プログラムの実行速度を増大できる。
【図面の簡単な説明】
【図１】サンプルプログラムにおいて外側のループで辿るＴｏｋｅｎオブジェクトに関連したデータ構造の説明図である。
【図２】サンプルプログラムにおいて二重ループに含まれるロード命令とそれが参照するデータの、ヒープメモリ上のアドレスとの関係を示す図である。
【図３】第１の擬似プログラムの実行過程において関わるデータ及びアドレスを図１のデータ構造上に表示した図である。
【図４】サンプルプログラムにおけるロード命令に対応するロード依存グラフである。
【図５】第２の擬似プログラムの実行過程において関わるデータ及びアドレスを図１のデータ構造上に表示した図である。
【図６】ＳＰＥＣｊｖｍ９８ベンチマーク及びＪａｖａＧｒａｎｄｅ  ｖ２．０ベンチマークＳｅｃｔｉｏｎ  ３のＰｅｎｔｉｕｍ  ４上での速度能向上率を示す図である。
【図７】ＳＰＥＣｊｖｍ９８ベンチマーク及びＪａｖａＧｒａｎｄｅ  ｖ２．０ベンチマークＳｅｃｔｉｏｎ  ３のＰｅｎｔｉｕｍ  ４上で実行した場合のコンパイル時間のオーバーヘッドを示す図である。
【図８】コード変換装置の機能ブロック図である。
【図９】コード変換装置が処理過程において関わるデータ及びアドレスを図１のデータ構造上に表示した図である。
【図１０】コード変換装置の構成をさらに具体化して示したものである。
【図１１】コード変換装置の機能付加部を示す図である。
【図１２】コード変換方法のフローチャートである。
【図１３】図１２のフローチャートにステップを追加したフローチャートの主要部である。
【図１４】図１２のフローチャートに別のステップを追加したフローチャートの主要部である。
【図１５】ＪＩＴコンパイラの構成をＪａｖａ仮想計算機と共に示す図である。
【図１６】ＪＩＴコンパイル方法のフローチャートである。
【図１７】プログラムを実行するためのハードウェア構成図である。
【符号の説明】
１０：コード変換装置、１１：変換処理対象コード、１２：機械語コード、１５：第１の着目手段、１６：第２の着目手段、１７：第１の検出手段、１８：第２の検出手段、１９：第１の計算手段、２０：第２の計算手段、２１：判定手段、２３：第１の機械語コード部分生成手段、２４：第２の機械語コード部分生成手段、２６：グラフ生成手段、２８：アドレス記録手段２８、３１：予測手段、５５：Ｊａｖａ仮想計算機、５７：ＪＩＴコンパイラ、５８：情報収集手段、５９：変換手段。
【図１】
2004355279.tif 000008
【図２】
2004355279.tif 000009
【図３】
2004355279.tif 000010
【図４】
2004355279.tif 000011
【図５】
2004355279.tif 000012
【図６】
2004355279.tif 000013
【図７】
2004355279.tif 000014
【図８】
2004355279.tif 000015
【図９】
2004355279.tif 000016
【図１０】
2004355279.tif 000017
【図１１】
2004355279.tif 000018
【図１２】
2004355279.tif 000019
【図１３】
2004355279.tif 000020
【図１４】
2004355279.tif 000021
【図１５】
2004355279.tif 000022
【図１６】
2004355279.tif 000023
【図１７】
2004355279.tif 000024
【手続補正書】
【提出日】平成15年5月29日(2003.5.29)
【手続補正１】
【補正対象書類名】明細書
【補正対象項目名】全文
【補正方法】変更
【補正の内容】
【特許請求の範囲】
【請求項１】変換処理対象コードを機械語コードへ変換するコード変換装置において、
所定のループＡにおける複数個のイテレーションの内で連続する所定個数ｎのイテレーションＢ１，Ｂ２，〜，Ｂｎ（なお、Ｂ１はループＡにおける１番目のイテレーションＢであることに限定されない。）を選択しそれらイテレーションＢ１，Ｂ２，〜，Ｂｎにおける変換処理対象コード上のポインタ参照ロード命令Ｃ１，１，Ｃ２，１，〜，Ｃｎ，１に着目する第１の着目手段、
各イテレーションＢ１，Ｂ２，〜，Ｂｎにおける変換処理対象コード上の他のロード命令であってポインタ参照ロード命令Ｃ１，１，Ｃ２，１，〜，Ｃｎ，１にデータ依存するロード命令としてのデータ依存ロード命令Ｃ１，２，Ｃ２，２，〜，Ｃｎ，２に着目する第２の着目手段、
ポインタ参照ロード命令Ｃ１，１，Ｃ２，１，〜，Ｃｎ，１に基づきプロセッサがロードするデータとしての参照値Ｕ１，１，Ｕ２，１，〜，Ｕｎ，１に対してそれらがヒープメモリにおいて格納されているアドレスＵ１，０，Ｕ２，０，〜，Ｕｎ，０を検出する第１の検出手段、
前記データ依存ロード命令Ｃｒ，２〜Ｃｓ，２（ただし１≦ｒ＜ｓ≦ｎ）に基づきプロセッサがロードするデータＵｒ，２，Ｕｒ＋１，２，〜，Ｕｓ，２に対してそれらがヒープメモリにおいて格納されているアドレスＵｒ，ｙ，Ｕｒ＋１，ｙ，〜，Ｕｓ，ｙを検出する第２の検出手段、
相互に隣接するイテレーションの前記ポインタ参照ロード命令のロードデータのアドレスの差分Ｕ２，０−Ｕ１，０，Ｕ３，０−Ｕ２，０，〜，Ｕｎ，０−Ｕｎ−１，０をイテレーション間ストライドＦ１として計算する第１の計算手段、
各イテレーションにおける前記ポインタ参照ロード命令の参照値Ｕｒ，１，Ｕｒ＋１，１，〜，Ｕｓ，１と前記データ依存ロード命令のロードデータのアドレスＵｒ，ｙ，Ｕｒ＋１，ｙ，〜，Ｕｓ，ｙとの差分Ｕｒ，ｙ−Ｕｒ，１，Ｕｒ＋１，ｙ−Ｕｒ＋１，１，Ｕｓ，ｙ−Ｕｓ，１をイテレーション内ストライドＦ２として計算する第２の計算手段、
相互に同一となっているイテレーション間ストライドＦ１がイテレーション間ストライドＦ１の総数に対して第１の割合以上存在しかつ相互に同一となっているイテレーション内ストライドＦ２がイテレーション内ストライドＦ２の総数に対して第２の割合以上存在すると言う条件が満たされるか否かを判定する判定手段、
前記判定手段の判定が「正」である場合には該同一のイテレーション間ストライドＦ１及び該同一のイテレーション内ストライドＦ２に基づいてそれぞれイテレーション間定数ストライドＦｘ及びイテレーション内定数ストライドＦｙを設定する設定手段、
ループＡのイテレーションＢａにおけるポインタ参照ロード命令Ｃａ，１に基づいてプロセッサがロードするデータＵａ，１がヒープメモリにおいて格納されているアドレスＵａ，０及び自然数ｐ（ただし、イテレーションＢａよりｐ個、後のイテレーションをイテレーションＢｂとすると、イテレーションＢｂはループＡの最後のイテレーションを越えない。）に対してヒープメモリ上のアドレスＵｂ，０（＝Ｕａ，０＋ｐ・Ｆｘ）にアクセスして該アドレスＵｂ，０のデータＵｂ，１を検出する機械語コード部分Ｈ１を生成する第１の機械語コード部分生成手段、及び
プロセッサがループＡのイテレーションＢｂを実行するのに先立ち、ヒープメモリ上のアドレス（Ｕｂ，１＋Ｆｙ）のデータＵｂ，２をヒープメモリからキャッシュメモリへプリフェッチする機械語コード部分Ｈ２を生成する第２の機械語コード部分生成手段、
を有していることを特徴とするコード変換装置。
【請求項２】前記変換処理対象コードはＪａｖａのバイトコードであることを特徴とする請求項１記載のコード変換装置。
【請求項３】前記コード変換装置はＪＩＴコンパイラであることを特徴とする請求項１記載のコード変換装置。
【請求項４】前記第１及び前記第２の機械語コード部分生成手段は、前記機械語コード部分Ｈ１，Ｈ２を、前記イテレーションＢａを実行する機械語コード範囲に配置することを特徴とする請求項１記載のコード変換装置。
【請求項５】機械語としてプリフェッチ命令Ｊ１及び投機的ロード命令Ｊ２を装備するプロセッサ用のコード変換装置において、
前記第１の機械語コード部分生成手段は、前記機械語コード部分Ｈ１が、アドレスＵｂ，０（＝Ｕａ，０＋ｐ・Ｆｘ）のデータＵｂ，１をロードする投機的ロード命令Ｊ２を含むように、前記機械語コード部分Ｈ１を生成し、
前記第２の機械語コード部分生成手段は、前記機械語コード部分Ｈ２が、アドレス（Ｕｂ，１＋Ｆｙ）のデータＵｂ，２をプリフェッチするプリフェッチ命令Ｊ１を含むように、前記機械語コード部分Ｈ２を生成する、
ことを特徴とする請求項１記載のコード変換装置。
【請求項６】機械語としてプリフェッチ命令Ｊ１及びロード命令Ｊ３を装備するプロセッサ用のコード変換装置において、
前記第１の機械語コード部分生成手段は、前記機械語コード部分Ｈ１が、アクセス違反を調べる条件用分岐命令によりガードされたロード命令Ｊ３によりアドレスＵｂ，０（＝Ｕａ，０＋ｐ・Ｆｘ）のデータＵｂ，１を検出する処理を含むように、機械語コード部分Ｈ１を生成し、
前記第２の機械語コード部分生成手段は、前記機械語コード部分Ｈ２が、アクセス違反を調べる条件用分岐命令によりガードされたロード命令Ｊ３によりアドレス（Ｕｂ，１＋Ｆｙ）のデータＶｂ２をプリフェッチする処理を含むように、機械語コード部分Ｈ２を生成する、
ことを特徴とする請求項１記載のコード変換装置。
【請求項７】ループＡ内のロード命令の依存関係を表現するグラフとしてのロード依存グラフを生成するグラフ生成手段、
を有し、
前記第１及び前記第２の着目手段は、前記ポインタ参照ロード命令及び前記データ依存ロード命令をロード依存グラフに基づき検出することを特徴とする請求項１記載のコード変換装置。
【請求項８】ループＡにおけるイテレーションＢ１，Ｂ２，〜，Ｂｎについてバイトコードを機械語コードへ試し実行用にコンパイルし試し実行用機械語コードを、副作用を起こさずに試し実行して、各イテレーションのロード命令によるロードデータのアドレスをロード依存グラフに記録するアドレス記録手段、
を有し、
前記第１及び第２の検出手段は、ロード依存グラフに記録されたアドレスに基づきアドレスＵ１，０〜アドレスＵｎ，０及びアドレスＵｒ，１〜アドレスＵｓ，１を検出する、
ことを特徴とする請求項７記載のコード変換装置。
【請求項９】データＵｂ，２のプリフェッチが有意義か否かを予測する予測手段、
前記予測手段が有意義でないと予測した場合には、前記第１及び前記第２の機械語生成手段による前記機械語コード部分Ｈ１，Ｈ２の生成を中止させる中止手段、
を有していることを特徴とする請求項１記載のコード変換装置。
【請求項１０】データＵｂ，２をロードするデータ依存ロード命令を対象データ依存ロード命令、該対象データ依存ロード命令がと呼ぶことにし、
前記予測手段は、データＵｂ，２にデータ依存する命令が存在する場合、及び／又は対象データ依存ロード命令とは別のデータ依存ロード命令がロードするデータＸに対して該データＸ用の機械語コード部分Ｈ２がすでに生成されていてデータＵｂ，２はデータＸとは同一のキャッシュラインには入らない場合、プリフェッチ命令の挿入が有意義と予測することを特徴とする請求項９記載のコード変換装置。
【請求項１１】式：Ｕａ，０＋ｐ・Ｆｘに基づきアドレス（Ｕａ，０＋ｐ・Ｆｘ）のデータＵｂ，１をヒープメモリからキャッシュメモリへプリフェッチする機械語コード部分Ｈ３を生成する第３の機械語コード部分生成手段、及び
キャッシュラインのサイズＦｓとしてＦｓ≧が２・Ｆｘであるならば前記第３の機械語コード部分生成手段による機械語コード部分Ｈ３の生成は中止とする制御手段、
を有していることを特徴とする請求項１記載のコード変換装置。
【請求項１２】バイトコードを実行するＪａｖａ仮想計算機からの指示を受けて指示範囲のバイトコードを機械語コードへ変換するＪＩＴコンパイラにおいて、
指示範囲のバイトコードの部分を機械語コードへ試し実行用にコンパイルし試し実行用機械語コードを、副作用を起こさずに試し実行してヒープメモリにおけるデータ構造についての情報を収集する情報収集手段、及び
前記情報収集手段による収集情報に基づいて指示範囲のバイトコードを機械語コードへ変換する変換手段、
を有していることを特徴とするＪＩＴコンパイラ。
【請求項１３】前記変換手段は、前記情報収集手段による収集情報に依らずに指示範囲のバイトコードを変換された機械語コードに対して前記情報収集手段による収集情報に基づく機械語コード部分を追加した機械語コードを生成するものである、
ことを特徴とする請求項１２記載のＪＩＴコンパイラ。
【請求項１４】前記収集情報は、ループＡ内の各イテレーションにおける所定ロード命令がヒープメモリから参照するデータのアドレスの規則性に係る情報を含み、
前記変換手段は、前記収集情報に基づき所定ロード命令に基づくロードデータをヒープメモリからキャッシュメモリへプリフェッチする機械語コード部分を生成するものであることを特徴とする請求項１２記載のＪＩＴコンパイラ。
【請求項１５】変換処理対象コードを機械語コードへ変換するコード変換方法において、
所定のループＡにおける複数個のイテレーションの内で連続する所定個数ｎのイテレーションＢ１，Ｂ２，〜，Ｂｎ（なお、Ｂ１はループＡにおける１番目のイテレーションＢであることに限定されない。）を選択しそれらイテレーションＢ１，Ｂ２，〜，Ｂｎにおける変換処理対象コード上のポインタ参照ロード命令Ｃ１，１，Ｃ２，１，〜，Ｃｎ，１に着目する第１の着目ステップ、
各イテレーションＢ１，Ｂ２，〜，Ｂｎにおける変換処理対象コード上の他のロード命令であってポインタ参照ロード命令Ｃ１，１，Ｃ２，１，〜，Ｃｎ，１にデータ依存するロード命令としてのデータ依存ロード命令Ｃ１，２，Ｃ２，２，〜，Ｃｎ，２に着目する第２の着目ステップ、
ポインタ参照ロード命令Ｃ１，１，Ｃ２，１，〜，Ｃｎ，１に基づきプロセッサがロードするデータとしての参照値Ｕ１，１，Ｕ２，１，〜，Ｕｎ，１に対してそれらがヒープメモリにおいて格納されているアドレスＵ１，０，Ｕ２，０，〜，Ｕｎ，０を検出する第１の検出ステップ、
前記データ依存ロード命令Ｃｒ，２〜Ｃｓ，２（ただし１≦ｒ＜ｓ≦ｎ）に基づきプロセッサがロードするデータＵｒ，２，Ｕｒ＋１，２，〜，Ｕｓ，２に対してそれらがヒープメモリにおいて格納されているアドレスＵｒ，ｙ，Ｕｒ＋１，ｙ，〜，Ｕｓ，ｙを検出する第２の検出ステップ、
相互に隣接するイテレーションの前記ポインタ参照ロード命令のロードデータのアドレスの差分Ｕ２，０−Ｕ１，０，Ｕ３，０−Ｕ２，０，〜，Ｕｎ，０−Ｕｎ−１，０をイテレーション間ストライドＦ１として計算する第１の計算ステップ、
各イテレーションにおける前記ポインタ参照ロード命令の参照値Ｕｒ，１，Ｕｒ＋１，１，〜，Ｕｓ，１と前記データ依存ロード命令のロードデータのアドレスＵｒ，ｙ，Ｕｒ＋１，ｙ，〜，Ｕｓ，ｙとの差分Ｕｒ，ｙ−Ｕｒ，１，Ｕｒ＋１，ｙ−Ｕｒ＋１，１，Ｕｓ，ｙ−Ｕｓ，１をイテレーション内ストライドＦ２として計算する第２の計算ステップ、
相互に同一となっているイテレーション間ストライドＦ１がイテレーション間ストライドＦ１の総数に対して第１の割合以上存在しかつ相互に同一となっているイテレーション内ストライドＦ２がイテレーション内ストライドＦ２の総数に対して第２の割合以上存在すると言う条件が満たされるか否かを判定する判定ステップ、
前記判定ステップにおける判定が「正」である場合には該同一のイテレーション間ストライドＦ１及び該同一のイテレーション内ストライドＦ２に基づいてそれぞれイテレーション間定数ストライドＦｘ及びイテレーション内定数ストライドＦｙを設定する設定ステップ、
ループＡのイテレーションＢａにおけるポインタ参照ロード命令Ｃａ，１に基づいてプロセッサがロードするデータＵａ，１がヒープメモリにおいて格納されているアドレスＵａ，０及び自然数ｐ（ただし、イテレーションＢａよりｐ個、後のイテレーションをイテレーションＢｂとすると、イテレーションＢｂはループＡの最後のイテレーションを越えない。）に対してヒープメモリ上のアドレスＵｂ，０（＝Ｕａ，０＋ｐ・Ｆｘ）にアクセスして該アドレスＵｂ，０のデータＵｂ，１を検出する機械語コード部分Ｈ１を生成する第１の機械語コード部分生成ステップ、及び
プロセッサがループＡのイテレーションＢｂを実行するのに先立ち、ヒープメモリ上のアドレス（Ｕｂ，１＋Ｆｙ）のデータＵｂ，２をヒープメモリからキャッシュメモリへプリフェッチする機械語コード部分Ｈ２を生成する第２の機械語コード部分生成ステップ、
を有していることを特徴とするコード変換方法。
【請求項１６】前記変換処理対象コードはＪａｖａのバイトコードであることを特徴とする請求項１５記載のコード変換方法。
【請求項１７】前記コード変換方法はＪＩＴコンパイラであることを特徴とする請求項１５記載のコード変換方法。
【請求項１８】前記第１及び前記第２の機械語コード部分生成ステップでは、前記機械語コード部分Ｈ１，Ｈ２を、前記イテレーションＢａを実行する機械語コード範囲に配置することを特徴とする請求項１５記載のコード変換方法。
【請求項１９】機械語としてプリフェッチ命令Ｊ１及び投機的ロード命令Ｊ２を装備するプロセッサ用のコード変換方法において、
前記第１の機械語コード部分生成ステップでは、前記機械語コード部分Ｈ１が、アドレスＵｂ，０（＝Ｕａ，０＋ｐ・Ｆｘ）のデータＵｂ，１をロードする投機的ロード命令Ｊ２を含むように、前記機械語コード部分Ｈ１を生成し、
前記第２の機械語コード部分生成ステップでは、前記機械語コード部分Ｈ２が、アドレス（Ｕｂ，１＋Ｆｙ）のデータＵｂ，２をプリフェッチするプリフェッチ命令Ｊ１を含むように、前記機械語コード部分Ｈ２を生成する、
ことを特徴とする請求項１５記載のコード変換方法。
【請求項２０】機械語としてプリフェッチ命令Ｊ１及びロード命令Ｊ３を装備するプロセッサ用のコード変換方法において、
前記第１の機械語コード部分生成ステップでは、前記機械語コード部分Ｈ１が、アクセス違反を調べる条件用分岐命令によりガードされたロード命令Ｊ３によりアドレスＵｂ，０（＝Ｕａ，０＋ｐ・Ｆｘ）のデータＵｂ，１を検出する処理を含むように、機械語コード部分Ｈ１を生成し、
前記第２の機械語コード部分生成ステップでは、前記機械語コード部分Ｈ２が、アクセス違反を調べる条件用分岐命令によりガードされたロード命令Ｊ３によりアドレス（Ｕｂ，１＋Ｆｙ）のデータＶｂ２をプリフェッチする処理を含むように、機械語コード部分Ｈ２を生成する、
ことを特徴とする請求項１５記載のコード変換方法。
【請求項２１】ループＡ内のロード命令の依存関係を表現するグラフとしてのロード依存グラフを生成するグラフ生成ステップ、
を有し、
前記第１及び前記第２の着目ステップでは、前記ポインタ参照ロード命令及び前記データ依存ロード命令をロード依存グラフに基づき検出することを特徴とする請求項１５記載のコード変換方法。
【請求項２２】ループＡにおけるイテレーションＢ１，Ｂ２，〜，Ｂｎについてバイトコードを機械語コードへ試し実行用にコンパイルし試し実行用機械語コードを、副作用を起こさずに試し実行して、各イテレーションのロード命令によるロードデータのアドレスをロード依存グラフに記録するアドレス記録ステップ、
を有し、
前記第１及び第２の検出ステップでは、ロード依存グラフに記録されたアドレスに基づきアドレスＵ１，０〜アドレスＵｎ，０及びアドレスＵｒ，１〜アドレスＵｓ，１を検出する、
ことを特徴とする請求項２１記載のコード変換方法。
【請求項２３】データＵｂ，２のプリフェッチが有意義か否かを予測する予測ステップ、
前記予測ステップにおいて有意義でないと予測した場合には、前記第１及び前記第２の機械語生成ステップにおける前記機械語コード部分Ｈ１，Ｈ２の生成を中止させる中止ステップ、
を有していることを特徴とする請求項１５記載のコード変換装置。
【請求項２４】データＵｂ，２をロードするデータ依存ロード命令を対象データ依存ロード命令、該対象データ依存ロード命令がと呼ぶことにし、
前記予測ステップでは、データＵｂ，２にデータ依存する命令が存在する場合、及び／又は対象データ依存ロード命令とは別のデータ依存ロード命令がロードするデータＸに対して該データＸ用の機械語コード部分Ｈ２がすでに生成されていてデータＵｂ，２はデータＸとは同一のキャッシュラインには入らない場合、プリフェッチ命令の挿入が有意義と予測することを特徴とする請求項２３記載のコード変換装置。
【請求項２５】式：Ｕａ，０＋ｐ・Ｆｘに基づきアドレス（Ｕａ，０＋ｐ・Ｆｘ）のデータＵｂ，１をヒープメモリからキャッシュメモリへプリフェッチする機械語コード部分Ｈ３を生成する第３の機械語コード部分生成ステップ、及び
キャッシュラインのサイズＦｓとしてＦｓ≧が２・Ｆｘであるならば前記第３の機械語コード部分生成ステップにおける機械語コード部分Ｈ３の生成は中止とする制御ステップ、
を有していることを特徴とする請求項１５記載のコード変換装置。
【請求項２６】バイトコードを実行するＪａｖａ仮想計算機からの指示を受けて指示範囲のバイトコードを機械語コードへ変換するＪＩＴコンパイル方法において、
指示範囲のバイトコードの部分を機械語コードへ試し実行用にコンパイルし試し実行用機械語コードを、副作用を起こさずに試し実行してヒープメモリにおけるデータ構造についての情報を収集する情報収集ステップ、及び
前記情報収集ステップにおける収集情報に基づいて指示範囲のバイトコードを機械語コードへ変換する変換ステップ、
を有していることを特徴とするＪＩＴコンパイル方法。
【請求項２７】前記変換ステップでは、前記情報収集ステップにおける収集情報に依らずに指示範囲のバイトコードを変換された機械語コードに対して前記情報収集ステップにおける収集情報に基づく機械語コード部分を追加した機械語コードを生成することを特徴とする請求項２６記載のＪＩＴコンパイル方法。
【請求項２８】前記収集情報は、ループＡ内の各イテレーションにおける所定ロード命令がヒープメモリから参照するデータのアドレスの規則性に係る情報を含み、
前記変換ステップでは、前記収集情報に基づき所定ロード命令に基づくロードデータをヒープメモリからキャッシュメモリへプリフェッチする機械語コード部分を生成することを特徴とする請求項２６記載のＪＩＴコンパイル方法。
【請求項２９】請求項１〜１１のいずれかに記載のコード変換装置の各手段としてコンピュータを機能させるためのコード変換用プログラム。
【請求項３０】請求項１２〜１４のいずれかに記載のＪＩＴコンパイラの各手段としてコンピュータを機能させるためのＪＩＴコンパイラ用プログラム。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明は、Ｊａｖａ（Ｊａｖａは登録商標）のバイトコード等を機械語コードへ変換するコード変換装置、コード変換方法、ＪＩＴコンパイラ、ＪＩＴコンパイル方法及びプログラムに係り、詳しくは適切なプリフェッチを組み込んだ機械語コードを生成するコード変換装置、コード変換方法及びプログラム、並びにヒープメモリ内のデータ構造に基づき適切な機械語コードを生成するＪＩＴコンパイラ、ＪＩＴコンパイル方法及びプログラムに関するものである。
【０００２】
【従来の技術】
最初に、Ｊａｖａ  Ｊｕｓｔ−Ｉｎ−Ｔｉｍｅ（以下ＪＩＴ）コンパイラについて説明する。
【０００３】
Ｊａｖａとは、サン・マイクロシステムズ社（Ｓｕｎ  Ｍｉｃｒｏｓｙｓｔｅｍｓ  Ｉｎｃ．）によって開発されたオブジェクト指向のプログラミング言語である。Ｊａｖａプログラミング言語で記述されたプログラムは、Ｊａｖａバイトコードコンパイラによってバイトコード（ｂｙｔｅｃｏｄｅ）と呼ばれる形式のプログラムに変換され、Ｊａｖａ仮想計算機（Ｊａｖａ  ｖｉｒｔｕａｌ  ｍａｃｈｉｎｅ；  ＪＶＭ）によって実行される。Ｊａｖａ仮想計算機は、実際の計算機上で稼動するプログラムであり、計算機毎のプロセッサおよびオペレーティングシステムの違いを吸収して、単一のＪａｖａプログラミング言語による実行環境を異なる種類の計算機上で提供する。
【０００４】
バイトコード形式のプログラムは、Ｊａｖａ仮想計算機が稼動するいかなる計算機においても実行することができる。しかし、Ｊａｖａ仮想計算機はバイトコードを１命令ずつ解釈して実行するため、プログラムの実行が遅いという問題がある。特に、同じプログラムをＣやＣ＋＋などのプログラミング言語で記述したものと実行時間を比較すると、著しく実行速度が遅い。なぜならば、これらの言語では、コンパイラによってプログラムを予め実際の計算機上で稼動する機械語命令形式に変換してから実行するからである。この問題に対して、Ｊａｖａ仮想計算機はバイトコードの実行中に、バイトコード形式のプログラムを機械語命令形式のプログラムにコンパイルし、得られた機械語命令形式のプログラムを実際の計算機上で直接実行することでプログラムの実行速度を向上する。  このように、バイトコードから機械語への変換をプログラムの実行時に行うコンパイラを、Ｊａｖａ  ＪＩＴコンパイラと呼ぶ。この方式は、プログラムの実行中にＪＩＴコンパイルを行うため、プログラムの実行時間に加えてＪＩＴコンパイルの時間が必要になるが、機械語形式による実行が高速であるため、Ｊａｖａ仮想計算機のみによるバイトコードの実行より遥かに高速である。一般にＪａｖａ  ＪＩＴコンパイラは、Ｊａｖａプログラミング言語における手続きであるメソッド（ｍｅｔｈｏｄ）を単位として、Ｊａｖａプログラムがメソッドを呼び出す直前にＪＩＴコンパイルを行う。また、ＪＩＴコンパイルにかかる時間を減らすため、Ｊａｖａ仮想計算機はプログラム中で頻繁に実行されるメソッドだけをＪＩＴコンパイルする。
【０００５】
次に、ＪＩＴコンパイラが生成した機械語命令形式のプログラムにおける、キャッシュメモリへのプリフェッチ命令の利用について説明する。
【０００６】
近年のプロセッサでは、演算の実行が主記憶の参照に比べて著しく高速であるため、プロセッサが頻繁に使用するデータの一部をプロセッサ内の高速だが容量が限られているキャッシュメモリに格納する。ロード命令が読み出すアドレス（ａｄｄｒｅｓｓ；  メモリ上の番地）がキャッシュメモリ内に存在する場合は、ロード命令は高速に実行される。ロード命令が読み出すアドレスがキャッシュメモリ内に存在しない場合は、最近参照されていないアドレスがキャッシュメモリから追い出され、代わりに今参照されたアドレスがキャッシュメモリ内に読み込まれるまで、ロード命令の実行は遅延される。これをキャッシュミス（ｃａｃｈｅ  ｍｉｓｓ）と呼ぶ。
【０００７】
プログラムが同じメモリアドレスを繰り返し参照する場合にはキャッシュメモリによるメモリ参照の高速化の効果が大きいが、プログラムが次々と異なるアドレスを参照する場合には、頻繁にキャッシュミスが発生し、キャッシュメモリによるメモリ参照の高速化の効果が小さくなる。この問題に対して、近年のプロセッサはプリフェッチ命令を提供している。プリフェッチ命令はメモリ参照を行う機械語命令で、参照されたメモリがキャッシュメモリ内に存在しない場合は、通常のロード命令と同様、主記憶からキャッシュメモリへのメモリ内容の読み込みを行う。しかし、プリフェッチ命令は読み出された結果をプロセッサに返さないため、プリフェッチ命令の実行は他の命令を遅延することがない。プリフェッチ命令をロード命令より充分先に実行しておくことで、ロード命令を実行するときのキャッシュミスを防ぐことができる。
【０００８】
Ｊａｖａ仮想計算機が、配列（ａｒｒａｙ）やオブジェクト（ｏｂｊｅｃｔ）などのＪａｖａプログラムで使用されるデータ構造を格納するメモリの領域を、ヒープメモリ（ｈｅａｐ  ｍｅｍｏｒｙ）と呼ぶ。Ｊａｖａ仮想計算機がバイトコード形式のプログラムを実行する場合も、Ｊａｖａ  ＪＩＴコンパイラによって生成された機械語命令形式のプログラムを実行する場合のいずれも、データ構造は同一のヒープメモリ上に生成される。Ｊａｖａプログラムでは、配列やオブジェクトが頻繁に生成されるため、メモリ参照の割合が多い。したがってＪａｖａプログラムの実行を高速化するには、キャッシュミスによる性能低下を防ぐことが重要である。その際、ＪＩＴコンパイラが生成する機械語命令形式のプログラム中に、ヒープ上のアドレスに対するプリフェッチ命令を挿入することで、配列やオブジェクト中のデータに対するロード命令が実行されるときのキャッシュミスを防ぐことができる。
【０００９】
プリフェッチングは、キャッシュミスが頻繁に発生するプログラムを高速化するための有効な手段である。多くの数値計算プログラムは、巨大なベクトルや行列を参照するためキャッシュミスの頻度が高いが、Ｊａｖａなど近年のオブジェクト指向プログラミング言語においても、大量のオブジェクトがヒープメモリ上に生成されるため、それらを参照する際にキャッシュミスが頻繁に発生する。プリフェッチングを用いてプログラムを高速化するためには、以下の三点に注意する必要がある。第一に、プリフェッチ命令とデータを実際に参照するロード命令の間隔を適切に選ぶ必要がある。プリフェッチ命令の実行が遅すぎると、ロード命令が実際にデータを参照する時に、キャッシュメモリ上にデータが間に合わない可能性がある。プリフェッチ命令の実行が早すぎると、ロード命令が実際にデータを参照する前に、プリフェッチされたデータがキャッシュメモリから追い出されてしまう可能性がある。第二に、プリフェッチ命令はメモリ参照を行うので、プログラムの実行中にプロセッサと主記憶の間のデータ転送能力に余裕がない場合は性能低下を招く可能性がある。第三に、プリフェッチされるアドレスの計算のオーバーヘッド（ｏｖｅｒｈｅａｄ；  余分な手間）をできるだけ軽減する必要がある。
【００１０】
従来、配列参照を対象とするプリフェッチングについては、有効なアルゴリズムが数多く開発されてきた（例：非特許文献１）。しかし、ポインタ参照を対象とするプリフェッチングは、プリフェッチされるアドレスを計算するためにポインタ参照が必要になるため、有効なアルゴリズムを開発することが困難であった（例：非特許文献２，３）。例として、リスト（ｌｉｓｔ）構造を先頭から辿るループ（ｌｏｏｐ；  プログラム中の繰り返し）について考える。ループの第ｉ番目のイテレーション（ｉｔｅｒａｔｉｏｎ；  ループ中の命令全体の第ｉ回目の繰り返し）において、第ｉ＋ｃ番目のイテレーションで参照されるリストの要素をプリフェッチするためには、ｃ回のポインタ参照を行わなければプリフェッチされるアドレスを計算することができない。
【００１１】
これに対して近年、配列参照とポインタ参照を統一的に扱うことができるプリフェッチングアルゴリズムが提案されている（例：非特許文献４，５）。非特許文献４，５は、Ｊａｖａではなく、Ｃ言語に関するものである。非特許文献４，５の著作者はユフォン・ウ（Ｙｏｕｆｅｎｇ  Ｗｕ）及びその他であるので、以降、非特許文献４，５に開示されている技術内容については「Ｗｕら」と著作者名で特定することにする。Ｗｕらの手法は、ポインタ参照を行うロード命令によるロードデータのアドレスが、連続したイテレーションにおいてしばしば定数ストライド（ｓｔｒｉｄｅ；  幅）の増減（注：増だけでなく、減もあり得る。）をするという観測に基づく。例として、再びリストを先頭から辿るループについて考える。もし、プログラムがリストの各要素を先頭から順番にヒープメモリ上にアロケート（ａｌｌｏｃａｔｅ；  場所を確保）し、各要素の大きさがほぼ同じであったとすれば、リストを辿るポインタ参照のためのロード命令によるロードデータのアドレスは、連続したイテレーションにおいて定数ストライドの増減をする可能性が高い。Ｗｕらは、ロード命令によるロードデータのアドレスの定数ストライドを検出するため、プログラムの実行中においてロード命令によるロードデータのアドレスの前回との差分をプロファイル（ｐｒｏｆｉｌｅ；  値の履歴を集計）し、オフライン（ｏｆｆ−ｌｉｎｅ；  プログラムの実行後。注：Ｗｕらの技術はＣ言語に係るものであるので、コンパイラの作動前に、すなわちコンパイラの非作動期間としてのオフライン期間にプロファイルを解析する。）の解析で検出した定数ストライドの値を使って、プログラムの再コンパイル時にプリフェッチ命令を挿入するという手法を開発した。
【００１２】
【非特許文献１】
トッド・シー．・マウリィ、モニカ・エス．・ラム及びアヌープ・グプタ著「プリフェッチングのためのコンパイラアルゴリズムの設計及び評価」プログラミンク言語及びオペレーティングシステムのためのアーキテクチャサポートに関する第５回国際会議会議録、１９９２年１０月、ｐ．６２−７３（  Ｔｏｄｄ  Ｃ．  Ｍｏｗｒｙ，  Ｍｏｎｉｃａ  Ｓ．  Ｌａｍ，  ａｎｄ  Ａｎｏｏｐ  Ｇｕｐｔａ，  ”Ｄｅｓｉｇｎ  ａｎｄ  Ｅｖａｌｕａｔｉｏｎ  ｏｆ  ａ  Ｃｏｍｐｉｌｅｒ  Ａｌｇｏｒｉｔｈｍ  ｆｏｒ  Ｐｒｅｆｅｔｃｈｉｎｇ”，  ｉｎ  Ｐｒｏｃ．  ｏｆ  ｔｈｅ  Ｆｉｆｔｈ  Ｉｎｔｅｒｎａｔｉｏｎａｌ  Ｃｏｎｆｅｒｅｎｃｅ  ｏｎ  Ａｒｃｈｉｔｅｃｔｕｒａｌ  Ｓｕｐｐｏｒｔ  ｆｏｒ  Ｐｒｏｇｒａｍｍｉｎｇ  Ｌａｎｇｕａｇｅｓ  ａｎｄ  Ｏｐｅｒａｔｉｎｇ  Ｓｙｓｔｅｍｓ，  ｐｐ．  ６２−７３，  Ｏｃｔｏｂｅｒ  １９９２．）
【非特許文献２】
チ−クォン・ルク及びトッド・シー．・マウリィ著「再帰データ構造のためのコンパイラベースのプリフェッチング」、プログラミンク言語及びオペレーティングシステムのためのアーキテクチャサポートに関する第７回国際会議会議録、１９９６年１０月、ｐ．２２２−２３３（  Ｃｈｉ−Ｋｅｕｎｇ  Ｌｕｋ  ａｎｄ  Ｔｏｄｄ  Ｃ．  Ｍｏｗｒｙ，  ”Ｃｏｍｐｉｌｅｒ−Ｂａｓｅｄ  Ｐｒｅｆｅｔｃｈｉｎｇ  ｆｏｒ  Ｒｅｃｕｒｓｉｖｅ  Ｄａｔａ  Ｓｔｒｕｃｔｕｒｅｓ”，  ｉｎ  Ｐｒｏｃ．  ｏｆ  ｔｈｅ  ７ｔｈ  Ｉｎｔｅｒｎａｔｉｏｎａｌ  Ｃｏｎｆｅｒｅｎｃｅ  ｏｎ  Ａｒｃｈｉｔｅｃｔｕｒａｌ  Ｓｕｐｐｏｒｔ  ｆｏｒ  Ｐｒｏｇｒａｍｍｉｎｇ  Ｌａｎｇｕａｇｅｓ  ａｎｄ  Ｏｐｅｒａｔｉｎｇ  Ｓｙｓｔｅｍｓ，  ｐｐ．  ２２２−２３３，  Ｏｃｔｏｂｅｒ  １９９６．）
【非特許文献３】
ブレンドン・カフーン及びカスリン・エス．・マンキンリィ著「Ｊａｖａにおけるリンクデータ構造をプリフェッチングするソフトウェアのためのデータフロー解析」、２００１年９月（  Ｂｒｅｎｄｏｎ  Ｃａｈｏｏｎ  ａｎｄ  Ｋａｔｈｒｙｎ  Ｓ．  ＭｃＫｉｎｌｅｙ，  ”Ｄａｔａ  Ｆｌｏｗ  Ａｎａｌｙｓｉｓ  ｆｏｒ  Ｓｏｆｔｗａｒｅ  Ｐｒｅｆｅｔｃｈｉｎｇ  Ｌｉｎｋｅｄ  Ｄａｔａ  Ｓｔｒｕｃｔｕｒｅｓ  ｉｎ  Ｊａｖａ”，  ｉｎ  Ｐｒｏｃ．  ｏｆ  ｔｈｅ  Ｉｎｔｅｒｎａｔｉｏｎａｌ  Ｃｏｎｆｅｒｅｎｃｅ  ｏｎ  Ｐａｒａｌｌｅｌ  Ａｒｃｈｉｔｅｃｔｕｒｅｓ  ａｎｄ  Ｃｏｍｐｉｌｅｒ  Ｔｅｃｈｎｉｑｕｅｓ，  Ｓｅｐｔｅｍｂｅｒ  ２００１．）
【非特許文献４】
ユフォン・ウ、マウリシオ・セラノ、ラケシュ・クリッシュネイヤー、ウェイ・リ及びヤッセ・ファン著「不規則的なコードのためのストライドプリフェッチングを案内する値プロファイル」コンパイラ構造に関する第１１回国際会議会議録、２００２年４月（  Ｙｏｕｆｅｎｇ  Ｗｕ，  Ｍａｕｒｉｃｉｏ  Ｓｅｒｒａｎｏ，  Ｒａｋｅｓｈ  Ｋｒｉｓｈｎａｉｙｅｒ，  Ｗｅｉ  Ｌｉ，  ａｎｄ  Ｊｅｓｓｅ  Ｆａｎｇ，  ”Ｖａｌｕｅ−Ｐｒｏｆｉｌｅ  Ｇｕｉｄｅｄ  Ｓｔｒｉｄｅ  Ｐｒｅｆｅｔｃｈｉｎｇ  ｆｏｒ  Ｉｒｒｅｇｕｌａｒ  Ｃｏｄｅ”，  ｉｎ  Ｐｒｏｃ．  ｏｆ  ｔｈｅ  １１ｔｈ  Ｉｎｔｅｒｎａｔｉｏｎａｌ  Ｃｏｎｆｅｒｅｎｃｅ  ｏｎ  Ｃｏｍｐｉｌｅｒ  Ｃｏｎｓｔｒｕｃｔｉｏｎ，  ｐｐ．  ３０７−３２４，  Ａｐｒｉｌ  ２００２，  ＬＮＣＳ  ２３０４．）
【非特許文献５】
ユフォン・ウ著「コンパイラプリフェッチングにおける不規則プログラム及びその使用においての規則的ストライドパターンの効率的発見」プログラミング言語設計及び実装に関するＡＣＭ  ＳＩＧＰＬＡＮの会議録、２００２年６月、ｐ．２１０−２２１（Ｙｏｕｆｅｎｇ  Ｗｕ，  ”Ｅｆｆｉｃｉｅｎｔ  Ｄｉｓｃｏｖｅｒｙ  ｏｆ  Ｒｅｇｕｌａｒ  Ｓｔｒｉｄｅ  Ｐａｔｔｅｒｎｓ  ｉｎ  Ｉｒｒｅｇｕｌａｒ  Ｐｒｏｇｒａｍｓ  ａｎｄ  Ｉｔｓ  Ｕｓｅ  ｉｎ  Ｃｏｍｐｉｌｅｒ  Ｐｒｅｆｅｔｃｈｉｎｇ”，  ｉｎ  Ｐｒｏｃ．  ｏｆ  ｔｈｅ  ＡＣＭ  ＳＩＧＰＬＡＮ  Ｃｏｎｆｅｒｅｎｃｅ  ｏｎ  Ｐｒｏｇｒａｍｍｉｎｇ  Ｌａｎｇｕａｇｅ  Ｄｅｓｉｇｎ  ａｎｄ  Ｉｍｐｌｅｍｅｎｔａｔｉｏｎ，  ｐｐ．  ２１０−２２１，  Ｊｕｎｅ  ２００２．）
【００１３】
【発明が解決しようとする課題】
Ｗｕらの手法は従来のポインタ参照を対象とするプリフェッチングに比べて大きな性能向上を実現することが可能であるが、以下の二点において改善の余地がある。
（ａ）Ｗｕらの手法は、同一のロード命令によるロードデータのアドレスが連続したイテレーション間において定数ストライドを示す場合にのみプリフェッチ命令を挿入する。この手法は、プリフェッチされるアドレスを、ロード命令によるロードデータのアドレスに定数を加えることで計算できるという利点があるが、このような定数ストライドが存在しないプログラムには有効ではない。
（ｂ）Ｗｕらの手法は、まず最初に定数ストライドを検出するためにプロファイル取得用の命令を含んだプログラムを実行する必要がある。Ｗｕらの実験では、定数ストライドの検出に必要な実行時間は、プログラム中の実行頻度を集計するプロファイリングに対して＋１７％増加する。このオーバーヘッドは、Ｗｕらが適用したＣ原語のコンパイルの場合には、ある程度許容できるが、Ｊａｖａのようにプロファイルの取得がオンライン（ｏｎ−ｌｉｎｅ；  プログラムの実行中）で行われる環境では無視できない。
【００１４】
本発明の目的は、イテレーション間定数ストライド以外のストライドを利用して、キャッシュミスを抑制した機械語プログラムを生成するコード変換装置、コード変換方法及びプログラムを提供することである。
【００１５】
本発明の他の目的は、プロファイルの作成及び参照を省略して、ヒープメモリ内のデータ構造に基づく有効な機械語プログラムを高速生成するＪＩＴコンパイラ、ＪＩＴコンパイル方法及びプログラムを提供することである。
【００１６】
【課題を解決するための手段】
変換処理対象コードを機械語コードへ変換する本発明のコード変換装置は次のものを有している。
所定のループＡにおける複数個のイテレーションの内で連続する所定個数ｎのイテレーションＢ１，Ｂ２，〜，Ｂｎ（なお、Ｂ１はループＡにおける１番目のイテレーションＢであることに限定されない。）を選択しそれらイテレーションＢ１，Ｂ２，〜，Ｂｎにおける変換処理対象コード上のポインタ参照ロード命令Ｃ１，１，Ｃ２，１，〜，Ｃｎ，１に着目する第１の着目手段、
各イテレーションＢ１，Ｂ２，〜，Ｂｎにおける変換処理対象コード上の他のロード命令であってポインタ参照ロード命令Ｃ１，１，Ｃ２，１，〜，Ｃｎ，１にデータ依存するロード命令としてのデータ依存ロード命令Ｃ１，２，Ｃ２，２，〜，Ｃｎ，２に着目する第２の着目手段、
ポインタ参照ロード命令Ｃ１，１，Ｃ２，１，〜，Ｃｎ，１に基づきプロセッサがロードするデータとしての参照値Ｕ１，１，Ｕ２，１，〜，Ｕｎ，１に対してそれらがヒープメモリにおいて格納されているアドレスＵ１，０，Ｕ２，０，〜，Ｕｎ，０を検出する第１の検出手段、
前記データ依存ロード命令Ｃｒ，２〜Ｃｓ，２（ただし１≦ｒ＜ｓ≦ｎ）に基づきプロセッサがロードするデータＵｒ，２，Ｕｒ＋１，２，〜，Ｕｓ，２に対してそれらがヒープメモリにおいて格納されているアドレスＵｒ，ｙ，Ｕｒ＋１，ｙ，〜，Ｕｓ，ｙを検出する第２の検出手段、
相互に隣接するイテレーションの前記ポインタ参照ロード命令のロードデータのアドレスの差分Ｕ２，０−Ｕ１，０，Ｕ３，０−Ｕ２，０，〜，Ｕｎ，０−Ｕｎ−１，０をイテレーション間ストライドＦ１として計算する第１の計算手段、
各イテレーションにおける前記ポインタ参照ロード命令の参照値Ｕｒ，１，Ｕｒ＋１，１，〜，Ｕｓ，１と前記データ依存ロード命令のロードデータのアドレスＵｒ，ｙ，Ｕｒ＋１，ｙ，〜，Ｕｓ，ｙとの差分Ｕｒ，ｙ−Ｕｒ，１，Ｕｒ＋１，ｙ−Ｕｒ＋１，１，Ｕｓ，ｙ−Ｕｓ，１をイテレーション内ストライドＦ２として計算する第２の計算手段、
相互に同一となっているイテレーション間ストライドＦ１がイテレーション間ストライドＦ１の総数に対して第１の割合以上存在しかつ相互に同一となっているイテレーション内ストライドＦ２がイテレーション内ストライドＦ２の総数に対して第２の割合以上存在すると言う条件が満たされるか否かを判定する判定手段、
前記判定手段の判定が「正」である場合には該同一のイテレーション間ストライドＦ１及び該同一のイテレーション内ストライドＦ２に基づいてそれぞれイテレーション間定数ストライドＦｘ及びイテレーション内定数ストライドＦｙを設定する設定手段、
ループＡのイテレーションＢａにおけるポインタ参照ロード命令Ｃａ，１に基づいてプロセッサがロードするデータＵａ，１がヒープメモリにおいて格納されているアドレスＵａ，０及び自然数ｐ（ただし、イテレーションＢａよりｐ個、後のイテレーションをイテレーションＢｂとすると、イテレーションＢｂはループＡの最後のイテレーションを越えない。）に対してヒープメモリ上のアドレスＵｂ，０（＝Ｕａ，０＋ｐ・Ｆｘ）にアクセスして該アドレスＵｂ，０のデータＵｂ，１を検出する機械語コード部分Ｈ１を生成する第１の機械語コード部分生成手段、及び
プロセッサがループＡのイテレーションＢｂを実行するのに先立ち、ヒープメモリ上のアドレス（Ｕｂ，１＋Ｆｙ）のデータＵｂ，２をヒープメモリからキャッシュメモリへプリフェッチする機械語コード部分Ｈ２を生成する第２の機械語コード部分生成手段。
【００１７】
バイトコードを実行するＪａｖａ仮想計算機からの指示を受けて指示範囲のバイトコードを機械語コードへ変換する本発明のＪＩＴコンパイラは次のものを有している。
指示範囲のバイトコードの部分を機械語コードへ試し実行用にコンパイルし試し実行用機械語コードを、副作用を起こさずに試し実行してヒープメモリにおけるデータ構造についての情報を収集する情報収集手段、及び
前記情報収集手段による収集情報に基づいて指示範囲のバイトコードを機械語コードへ変換する変換手段。
【００１８】
変換処理対象コードを機械語コードへ変換する本発明のコード変換方法は次のステップを有している。
所定のループＡにおける複数個のイテレーションの内で連続する所定個数ｎのイテレーションＢ１，Ｂ２，〜，Ｂｎ（なお、Ｂ１はループＡにおける１番目のイテレーションＢであることに限定されない。）を選択しそれらイテレーションＢ１，Ｂ２，〜，Ｂｎにおける変換処理対象コード上のポインタ参照ロード命令Ｃ１，１，Ｃ２，１，〜，Ｃｎ，１に着目する第１の着目ステップ、
各イテレーションＢ１，Ｂ２，〜，Ｂｎにおける変換処理対象コード上の他のロード命令であってポインタ参照ロード命令Ｃ１，１，Ｃ２，１，〜，Ｃｎ，１にデータ依存するロード命令としてのデータ依存ロード命令Ｃ１，２，Ｃ２，２，〜，Ｃｎ，２に着目する第２の着目ステップ、
ポインタ参照ロード命令Ｃ１，１，Ｃ２，１，〜，Ｃｎ，１に基づきプロセッサがロードするデータとしての参照値Ｕ１，１，Ｕ２，１，〜，Ｕｎ，１に対してそれらがヒープメモリにおいて格納されているアドレスＵ１，０，Ｕ２，０，〜，Ｕｎ，０を検出する第１の検出ステップ、
前記データ依存ロード命令Ｃｒ，２〜Ｃｓ，２（ただし１≦ｒ＜ｓ≦ｎ）に基づきプロセッサがロードするデータＵｒ，２，Ｕｒ＋１，２，〜，Ｕｓ，２に対してそれらがヒープメモリにおいて格納されているアドレスＵｒ，ｙ，Ｕｒ＋１，ｙ，〜，Ｕｓ，ｙを検出する第２の検出ステップ、
相互に隣接するイテレーションの前記ポインタ参照ロード命令のロードデータのアドレスの差分Ｕ２，０−Ｕ１，０，Ｕ３，０−Ｕ２，０，〜，Ｕｎ，０−Ｕｎ−１，０をイテレーション間ストライドＦ１として計算する第１の計算ステップ、
各イテレーションにおける前記ポインタ参照ロード命令の参照値Ｕｒ，１，Ｕｒ＋１，１，〜，Ｕｓ，１と前記データ依存ロード命令のロードデータのアドレスＵｒ，ｙ，Ｕｒ＋１，ｙ，〜，Ｕｓ，ｙとの差分Ｕｒ，ｙ−Ｕｒ，１，Ｕｒ＋１，ｙ−Ｕｒ＋１，１，Ｕｓ，ｙ−Ｕｓ，１をイテレーション内ストライドＦ２として計算する第２の計算ステップ、
相互に同一となっているイテレーション間ストライドＦ１がイテレーション間ストライドＦ１の総数に対して第１の割合以上存在しかつ相互に同一となっているイテレーション内ストライドＦ２がイテレーション内ストライドＦ２の総数に対して第２の割合以上存在すると言う条件が満たされるか否かを判定する判定ステップ、
前記判定ステップにおける判定が「正」である場合には該同一のイテレーション間ストライドＦ１及び該同一のイテレーション内ストライドＦ２に基づいてそれぞれイテレーション間定数ストライドＦｘ及びイテレーション内定数ストライドＦｙを設定する設定ステップ、
ループＡのイテレーションＢａにおけるポインタ参照ロード命令Ｃａ，１に基づいてプロセッサがロードするデータＵａ，１がヒープメモリにおいて格納されているアドレスＵａ，０及び自然数ｐ（ただし、イテレーションＢａよりｐ個、後のイテレーションをイテレーションＢｂとすると、イテレーションＢｂはループＡの最後のイテレーションを越えない。）に対してヒープメモリ上のアドレスＵｂ，０（＝Ｕａ，０＋ｐ・Ｆｘ）にアクセスして該アドレスＵｂ，０のデータＵｂ，１を検出する機械語コード部分Ｈ１を生成する第１の機械語コード部分生成ステップ、
プロセッサがループＡのイテレーションＢｂを実行するのに先立ち、ヒープメモリ上のアドレス（Ｕｂ，１＋Ｆｙ）のデータＵｂ，２をヒープメモリからキャッシュメモリへプリフェッチする機械語コード部分Ｈ２を生成する第２の機械語コード部分生成ステップ。
【００１９】
バイトコードを実行するＪａｖａ仮想計算機からの指示を受けて指示範囲のバイトコードを機械語コードへ変換する本発明のＪＩＴコンパイル方法は次のステップを有している。
指示範囲のバイトコードの部分を機械語コードへ試し実行用にコンパイルし試し実行用機械語コードを、副作用を起こさずに試し実行してヒープメモリにおけるデータ構造についての情報を収集する情報収集ステップ、及び
前記情報収集ステップにおける収集情報に基づいて指示範囲のバイトコードを機械語コードへ変換する変換ステップ。
【００２０】
本発明のコード変換用プログラムは、前述のコード変換装置の各手段としてコンピュータを機能させ、あるいは前述のコード変換方法の各ステップをコンピュータに実行させる。また、本発明のＪＩＴコンパイラ用プログラムは、前述のＪＩＴコンパイラの各手段としてコンピュータを機能させ、あるいは前述のＪＩＴコンパイル方法の各ステップをコンピュータに実行させる。
【００２１】
【発明の実施の形態】
以降、本発明をその実施の形態及び実施例について具体的に説明する。なお、本発明は実施の形態及び実施例に限定されるものではなく、その要旨を逸脱しない範囲で種々変更可能であることは言うまでもない。
【００２２】
本実施の形態が基づく基本思想は次の２つである。
（１）連続したイテレーションにおける同一のロード命令によるロードデータのアドレス間の定数ストライド（ｉｎｔｅｒ−ｉｔｅｒａｔｉｏｎ  ｃｏｎｓｔａｎｔ  ｓｔｒｉｄｅ；  以下イテレーション間の定数ストライド）に加えて、同一のイテレーションにおける異なるロード命令によるロードデータのアドレス間の定数ストライド（ｉｎｔｒａ−ｉｔｅｒａｔｉｏｎ  ｃｏｎｓｔａｎｔ  ｓｔｒｉｄｅ；  以下イテレーション内の定数ストライド）を検出する。プリフェッチの対象を、１）イテレーション間の定数ストライドを持つロード命令Ｌ１、２）ロード命令Ｌ１の値をアドレスとしてメモリ参照を行うロード命令（Ｌ２）、３）ロード命令Ｌ２とイテレーション内定数ストライドを持つロード命令Ｌ３、に拡張することで、プリフェッチングの適用範囲を広げる。
（２）ＪＩＴコンパイル時に、メソッドが呼び出されるときの実際の引数の値を使って、プリフェッチ命令を挿入しようとしているループを、先頭から数イテレーションだけ副作用（注：メインメモリにデータを書き込むことは状態の変更に繋がるので、「副作用」と呼んでいる。）を起こさずに部分的に評価し、イテレーション間およびイテレーション内の定数ストライドを検出する。以下では、この操作をオブジェクトインスペクション（ｏｂｊｅｃｔ  ｉｎｓｐｅｃｔｉｏｎ）と呼ぶ。この方法は実際のヒープメモリ上のデータ構造を参照することができるという利点がある。またプロファイルを取得するオーバーヘッドはプログラムの実行時（注：プログラムの実行時間又は実行期間とは、ＪＩＴコンパイラの処理時間に対して、Ｊａｖａ仮想計算機がＪＩＴコンパイラの生成した機械語コード部分を実行している時間又は期間を言うものとする。）ではなくＪＩＴコンパイル時だけ必要である。ＪＩＴコンパイラの時間はプログラムの実行時間に比べて小さいため、定数ストライドの検出は極めて少ない実行時間で実現できる。
【００２３】
以下において、本実施の形態の全体の手順を述べる。
【００２４】
本実施の形態は、Ｊａｖａ  ＪＩＴコンパイラがバイトコードを機械語命令にＪＩＴコンパイルする際に、ロード命令によるロードデータのアドレス間の定数ストライドを利用したプリフェッチ命令を生成することを目的とする。Ｊａｖａ  ＪＩＴコンパイラはＪａｖａ仮想計算機がＪａｖａメソッドを実行する直前に呼び出され、ＪＩＴコンパイル対象となるメソッドを実行するために必要な引数はＪａｖａ仮想計算機のスタック（メソッドの実行に必要なデータを格納するメモリ領域）上に用意されている。メソッドのＪＩＴコンパイルは、初回であっても最適化のための再コンパイルであっても構わない。
【００２５】
プリフェッチングは、入力となるＪａｖａメソッドを表す中間コードを、プリフェッチ命令を含む中間コード（ｉｎｔｅｒｍｅｄｉａｔｅ  ｃｏｄｅ）に変換することで実現される。与えられたＪａｖａメソッドに対して、コンパイラはメソッド内の制御フローグラフのループを検出して、ループネスティングフォレスト（ｌｏｏｐ  ｎｅｓｔｉｎｇ  ｆｏｒｅｓｔ；  ＬＮＦ；  ループの入れ子関係を表現する木構造の集まり）を生成する。ＬＮＦの各頂点はループを、ＬＮＦの辺はループ間の入れ子関係を表す。本実施の形態のプリフェッチングアルゴリズムは、ＬＮＦの各木構造をメソッド内の実行順に従って探索し、木構造内の各ループをポストオーダー（ｐｏｓｔ−ｏｒｄｅｒ；  木の節点を子供から親の順に探索する順序）、すなわち内側のループから外側のループの順に探索する。
【００２６】
各ループにおいて、本実施の形態のアルゴリズムは以下の三段階の操作を行う。
（ａ）ループ内のロード命令の依存関係を表現するグラフ（ｌｏａｄ  ｄｅｐｅｎｄｅｎｃｅ  ｇｒａｐｈ；  以下ロード依存グラフ）を生成する。ロード依存グラフは、イテレーション内定数ストライドの存在を調べるロード命令を、データ依存があるロード命令の組に限定して、ＪＩＴコンパイル時のオーバーヘッドを軽減するために使用される。
（ｂ）オブジェクトインスペクションによってループを先頭から数イテレーションだけ評価し、ロード依存グラフ上でイテレーション間およびイテレーション内の定数ストライドの有無を調べる。定数ストライドが存在する場合は、グラフの注釈として定数ストライドの値を記録する。
（ｃ）ロード依存グラフにおいて定数ストライドを持つロード命令について、プリフェッチ命令の挿入が有効かどうかを予測し、効果があると思われるロード命令に対してプリフェッチ命令を生成する。
【００２７】
繰り返し回数の少ないループに含まれるロード命令については、Ｗｕらの手法と同様に、それらが外側のループに存在するとみなす。本実施の形態のアルゴリズムでは、ループの繰り返し回数が小さいことをオブジェクトインスペクションの間に検出する。
【００２８】
繰り返し回数の少ないループに含まれるロード命令については、Ｗｕらの手法と同様に、それらが外側のループに存在するとみなす。本実施の形態のアルゴリズムでは、ループの繰り返し回数が小さいことをオブジェクトインスペクションの間に検出する。
【００２９】
以下で、上記（ａ）〜（ｃ）の各段階の詳細を述べる。
【００３０】
［（ａ）ロード依存グラフの生成］
ロード依存グラフは、ロード命令を頂点（ｖｅｒｔｅｘ）とし、ロード命令間のデータ依存関係を辺（ｅｄｇｅ）とする有向グラフ（ｄｉｒｅｃｔｅｄ  ｇｒａｐｈ）である。ロード依存グラフは、プリフェッチングの対象となるループ内で、連続したポインタ参照を辿るロード命令を検出するために生成される。各頂点は、オブジェクトへの参照を引数として受け取りメモリ参照を行うようなロード命令である。各有向辺（Ｌ１，  Ｌ２）は、ロード命令Ｌ２がロード命令Ｌ１に対して直接データ依存することを表す。中間コードとしてＪａｖａバイトコードを用いた場合、ロード依存グラフの頂点となる命令は、ｇｅｔｆｉｅｌｄ，  ｇｅｔｓｔａｔｉｃ，  ａａｌｏａｄ，  ｉａｌｏａｄ，  ｄａｌｏａｄ，  ａｒｒａｙｌｅｎｇｔｈなどである。このうち、グラフの中で後継頂点を持つ可能性がある命令は、オブジェクトの参照を生成する命令、すなわちａａｌｏａｄ（配列の要素のロード），  ｇｅｔｆｉｅｌｄ（オブジェクトのフィールド変数のロード），  ｇｅｔｓｔａｔｉｃ（クラスの静的変数のロード）である。与えられたループの内側にループがあって、内側のループの繰り返し回数が少ない場合は、内側のループ内のロード命令も同じロード依存グラフの頂点として扱う。ロード依存グラフはメソッド内の使用・定義連鎖など、中間コード間のデータ依存関係を表すグラフから生成することができる。
【００３１】
［（ｂ）オブジェクトインスペクション］
ロード依存グラフを生成したら、オブジェクトインスペクションによって定数ストライドを検出する。オブジェクトインスペクションでは、与えられたループの中の命令を実際のメソッドの引数の値を用いて定数回（例えば２０回）だけ部分評価（ｐａｒｔｉａｌ  ｉｎｔｅｒｐｒｅｔａｔｉｏｎ）し、各ロード命令によるロードデータのアドレスをロード依存グラフに記録する。部分評価が終了したら、アドレスの履歴から定数ストライドの有無を計算する。ロード依存グラフの各頂点のアドレスについて、連続したイテレーション間の定数ストライドを調べ、有向辺で結ばれたロード命令によるロードデータのアドレスの組について、同じイテレーション内の定数ストライドを調べる。計算されたアドレスの差分が、大部分（例えば７５％以上。注：キャッシュメモリへのプリフェッチはキャッシュラインを単位に実施されるので、ストライドに多少の誤差があっても、定数ストライドに基づくプリフェッチにより目的（ｔａｒｇｅｔ）のデータはキャッシュメモリに書き込まれる。）のイテレーション間及びイテレーション内で同じ値であれば、ロード命令が定数ストライドを持つとみなして、対応する頂点または辺に定数ストライドの値を記録する。
【００３２】
オブジェクトインスペクションは、メソッド内の中間コードをメソッドの先頭から順に部分評価する。メソッドの引数が与えられても、全ての命令の評価において引数が計算できるとは限らない。このような場合は、命令の引数は「不定値」という特別な値を取るとみなす。引数に不定値を含むような命令の評価結果はやはり不定値である。
【００３３】
オブジェクトインスペクションはＪＩＴコンパイル時の解析であり、Ｊａｖａプログラムの実行に対して副作用を与えないようにする必要がある。特に、ストア命令を評価するときにメモリに書き込みを行なってはならない。このため、ＪＩＴコンパイル時にＪａｖａ仮想計算機のスタック（ｓｔａｃｋ）の複製を用意し、Ｊａｖａプログラムのローカル変数（ｌｏｃａｌ  ｖａｒｉａｂｌｅ）への書き込みは複製されたスタック上で行なう。また、ヒープメモリ上のオブジェクトに対するストア命令の評価は、書き込まれるアドレスと値の組をハッシュテーブル（ｈａｓｈ  ｔａｂｌｅ）に記録することで実現し、オブジェクトや配列に対するロード命令を評価する際には、最初にこのハッシュテーブルの値を検索する。同様な理由で、ＪＩＴコンパイル時に仮想的なヒープメモリを用意し、オブジェクトを生成する命令の評価を行なう。
【００３４】
オブジェクトインスペクションによる評価がプリフェッチの対象となるループの入り口に到達する前に、別のループに出会う可能性がある。このような別のループについては、ループ中の命令を一回だけ評価する。なぜならば、このようなループの評価の結果が目標とするループのイテレーションの初期値に影響を与えることは少ないからである。例えば、配列の要素を辿るループでは、配列の添字の変数は０に初期化されることが多いし、オブジェクトのリストを辿るループでは、リストの要素へのポインタは引数の値に初期化されることが多い。また、オブジェクトインスペクションのオーバーヘッドを低く抑えるためにも、他のループが実際に終了するまで評価するのは現実的でない。
【００３５】
他のメソッドへの呼び出しは単に無視される。メソッド呼び出しが値を返す場合は、不定値を返すとみなす。解析の精度を上げる方法として、メソッド呼び出しにおいて、さらに呼び出されるメソッド内のオブジェクトインスペクションを行なうという手続き間解析（ｉｎｔｅｒ−ｐｒｏｃｅｄｕｒａｌ  ａｎａｌｙｓｉｓ）の手法が考えられるが、ＪＩＴコンパイル時間との兼ね合いを考慮する必要がある。
【００３６】
［（ｃ）プリフェッチ命令の生成］
オブジェクトインスペクションの後、ロード依存グラフの頂点のうち定数ストライドを持つものに対してプリフェッチ命令を生成する。最初に、各定数ストライドに対して生成するコード列について説明する。次に、効果的で冗長でないプリフェッチ命令を生成するための、プリフェッチによる効果の解析方法について説明する。最後に、本実施の形態で前提とする二種類のプリフェッチ命令の、機械語命令に対する対応について説明する。
【００３７】
（ｃ．１）コード列
ロード依存グラフの頂点Ｌｘがイテレーション間定数ストライドｄを持つとする。  頂点Ｌｘが後継頂点（ａｄｊａｃｅｎｔｓ）を持たないか、または全ての後継頂点がイテレーション間定数ストライドを持つ場合、ｃイテレーション後におけるロード命令Ｌｘが参照するデータを現在のイテレーションでプリフェッチするためには、Ａ（Ｌ）を現在のイテレーションにおいてロード命令Ｌが参照するアドレスとすると、以下のコードを生成すればよい。なお、＊は乗算を意味する。
ｐｒｅｆｅｔｃｈ  （Ａ（Ｌｘ）  ＋  ｄ＊ｃ）；
【００３８】
ここで、ｐｒｅｆｅｔｃｈは与えられたアドレスをキャッシュメモリ内にプリフェッチする命令を表す。今度は、頂点Ｌｘがイテレーション間定数ストライドを持たない後継頂点Ｌｙを持つとする。ロード命令ＬｘおよびＬｙがｃイテレーション後に参照するデータをプリフェッチするためには、以下のコードを生成すればよい。
ａ  ＝  ｓｐｅｃ＿ｌｏａｄ  （Ａ（Ｌｘ）  ＋  ｄ＊ｃ）；
ｐｒｅｆｅｔｃｈ  （Ｆ［Ｌｘ，Ｌｙ］  （ａ））；
【００３９】
ここで、ｓｐｅｃ＿ｌｏａｄは与えられたアドレスをアクセス違反を起こさずにロードする命令（ｓｐｅｃｕｌａｔｉｖｅ  ｌｏａｄ；  以下投機的ロード命令）である。また、Ｆ［Ｌｘ，  Ｌｙ］はＬｘの結果として得られるオブジェクト参照のアドレスからＬｙのアドレスを得る関数である。「Ｆ［Ｌｘ，Ｌｙ］  （ａ）」の「（ａ）」は、Ｌｙのアドレスを得る際のオブジェクト参照のアドレスがＬｘ及びａ  ＝  ｓｐｅｃ＿ｌｏａｄ  （Ａ（Ｌｘ）  ＋  ｄ＊ｃ）に基づくａであるこを意味している。通常、Ｆ［Ｌｘ，Ｌｙ］  （ａ）の演算は定数値の加算で表される。さらに、Ｌｙとの間にイテレーション内定数ストライドを持つロード命令Ｌｚが存在する場合は、以下のコード生成によってＬｚが参照するアドレスも同様にプリフェッチすることができる。
【００４０】
ｐｒｅｆｅｔｃｈ  （Ｆ［Ｌｘ，Ｌｙ］  （ａ）  ＋  Ｓ［Ｌｙ，Ｌｚ］）；
【００４１】
ここで、Ｓ［Ｌｙ，  Ｌｚ］はロード命令Ｌｙ，  Ｌｚの間のイテレーション内定数ストライドの値を表す。スケジューリング距離ｃの実際の値は、プリフェッチ命令を挿入するループ内の計算の量やメモリ参照の数など、様々な要素に依存する。
【００４２】
（ｃ．２）プリフェッチの効果の解析
プリフェッチ命令はメモリ参照を行なうため、プロセッサのメモリ参照のための演算器及びデータ転送のためのバンド幅を消費する。従って、プリフェッチ可能なロード命令の中から、プリフェッチが効果的なものを選ぶ必要がある。理想的には、頻繁にキャッシュミスを起こすロード命令だけにプリフェッチを生成するのが望ましい。しかし、キャッシュミスの有無はキャッシュメモリの容量や、前後に実行される他のロード命令などの様々な動的な要素に影響されるため、コンパイル時に予測することは難しい。
【００４３】
代わりに、以下の簡単な解析によってプリフェッチによる効果を見積もる。すなわち、ロード命令Ｌが以下の三つの条件を満たす場合、Ｌのアドレスのプリフェッチが効果的であると判断する。
（ｃ．２．ａ）ロード命令Ｌに対してデータ依存する命令（ロード命令でなくともよい）が存在する。
（ｃ．２．ｂ）ロード命令Ｌが参照するデータが、既にプリフェッチ命令が挿入された他のロード命令と同じキャッシュライン（ｃａｃｈｅ  ｌｉｎｅ；  キャッシュメモリでメモリ内容を扱う単位）に入らない。
（ｃ．２．ｃ）ロード命令Ｌがイテレーション間定数ストライドを持つ場合に、定数ストライド値がキャッシュラインの大きさの半分より大きい。
【００４４】
なお、（ｃ．２．ａ）（ｃ．２．ｂ）は、後述の第２の擬似プログラムの行番号１０４，１０５に係る条件であるのに対し、（ｃ．２．ｃ）は、後述の第３の擬似プログラムの行番号１３３に係る条件である。ポインタ参照ロード命令ＸｉがロードするデータＤｉをイテレーション間定数ストライドに基づきプリフェッチすることを考える場合、ポインタ参照ロード命令Ｘｉの属するイテレーションより１個前のイテレーションにおけるポインタ参照ロード命令Ｘｉ−１とそれがロードするデータＤｉ−１を考える。データＤｉ−１及びＤｉとのアドレス間隔としてのイテレーション間定数ストライドがキャッシュラインのサイズの１／２以下であれば、データＤｉ−１をプリフェッチしようとするとき、通常、該データＤｉ−１はキャッシュメモリにすでに存在することになので、データＤｉ−１のプリフェッチは意味がない。
【００４５】
（ｃ．３）機械語命令との対応：
ｃ．１において使用したｐｒｅｆｅｔｃｈ命令およびｓｐｅｃ＿ｌｏａｄ命令の実装では、プロセッサが提供するプリフェッチ命令または投機的ロード命令を使用するか、または通常のロード命令を、アクセス違反を調べる条件分岐命令によってガード（ｇｕａｒｄ；  守る）するか、二通り考えることができる。目標とするプロセッサが専用の命令を提供している場合は、当然プロセッサが提供する命令を使用する方がオーバーヘッドが少ない。プロセッサが提供するプリフェッチ命令を使用すれば、命令数やメモリ参照のオーバーヘッドを最小に抑えることができる。通常プリフェッチ命令はプロセッサのメモリ転送のバンド幅が不足するような場合、例えばデータトランスレーションルックアサイドバッファ（ｄａｔａ  ｔｒａｎｓｌａｔｉｏｎ  ｌｏｏｋａｓｉｄｅ  ｂｕｆｆｅｒ；  ＤＴＬＢ；  参照されるデータの論理アドレスを物理アドレスに変換するテーブル）のミスが発生する場合には実行されない。現在のところ、プリフェッチ命令は多くのプロセッサで提供されているが、投機的ロード命令を提供しているのはインテル社のＩＡ−６４アーキテクチャとスパーク社のＳＰＡＲＣ  Ｖ９アーキテクチャのみである。
【００４６】
しかし、プロセッサがプリフェッチ命令を提供している場合においても、ガードされたロード命令が有効である局面が存在する。なぜならば、ガードされたロード命令はＤＴＬＢミスが発生するページ（ｐａｇｅ；  論理／物理アドレス変換の単位）を予めＤＴＬＢに読み込むことができるからである。従って、イテレーション間定数ストライドがページの大きさの半分より大きい場合は、ガードされたロード命令の方がプロセッサが提供するプリフェッチ命令より効果的である。さらに重要な場合として、メモリ参照によってアドレスが得られる場合がある。例えば上記のＡ（Ｌｙ）はイテレーション間で定数ストライドを持たないので、連続したイテレーションにおいて次々と異なるページを参照する可能性が高い。従って、Ｌｙをプリフェッチするときにはガードされたロード命令が有効である。
【００４７】
【実施例】
以下では、Ｊａｖａ  ＪＩＴコンパイラにおける実施例を述べる。
例として、ＳＰＥＣｊｖｍ９８ベンチマークの中の＿２０２＿ｊｅｓｓベンチマークのコードの一部を考える。このプログラムはＪａｖａ言語で記述されたエキスパートシステム（ｅｘｐｅｒｔ  ｓｙｓｔｅｍ；  与えられた知識データを基にして推論を行なうプログラム）である。以下のＪａｖａプログラムは、＿２０２＿ｊｅｓｓベンチマークの一部分を簡略化したものである。説明の便宜上、以下のＪａｖａプログラムを「サンプルプログラム」と呼ぶとともに、コード列の左端には行番号を付ける。
【００４８】
１０：ｃｌａｓｓ  ＴｏｋｅｎＶｅｃｔｏｒ  ｛１１：  Ｔｏｋｅｎ［］  ｖ；１２：  ｉｎｔ  ｐｔｒ；１３：  ｖｏｉｄ  ａｄｄＥｌｅｍｅｎｔ  （Ｔｏｋｅｎ  ｖａｌ）  ｛．．．｝１４：  ｖｏｉｄ  ｒｅｍｏｖｅＥｌｅｍｅｎｔ  （Ｔｏｋｅｎ  ｖａｌ）  ｛．．．｝１５：  ．．．１６：｝
【００４９】
2004355279.tif 000025
【００５０】
2004355279.tif 000026
【００５１】
ＴｏｋｅｎＶｅｃｔｏｒ型のオブジェクトｔｖは、その要素としてのＴｏｋｅｎ型のオブジェクトｖを適宜、増減される（行番号１３，１４）。Ｔｏｋｅｎ型のオブジェクトｔｖ．ｖ及びｔは、ＶａｌｕｅＶｅｃｔｏｒ型のオブジェクトｆａｃｔｓのリストを備える（行番号３４）メソッドｆｉｎｄＩｎＭｅｍｏｒｙ（行番号５１〜５９）の実行では、ｔｍｐ．ｆａｃｔｓとｔ．ｆａｃｔｓとの同一番号の要素同士が対比され（行番号５６）、もし一致したならば、そのときのオブジェクトｔｍｐがメソッドｆｉｎｄＩｎＭｅｍｏｒｙの返り値とされる（行番号５８）。
【００５２】
メソッドｆｉｎｄＩｎＭｅｍｏｒｙ（）は＿２０２＿ｊｅｓｓベンチマークで全体の実行時間に占める割合が多いメソッドの一つである。ここでは、メソッドｆｉｎｄＩｎＭｅｍｏｒｙ（）の外側のループ（変数ｉを添字とするｆｏｒループ）がプリフェッチ命令を生成する目標のループであるとする。＿２０２＿ｊｅｓｓのプロファイルから、内側のループ（変数ｊを添字とするｆｏｒループ）はループの反復回数が少ないことがわかるので、ここでは、内側のループのロード命令もプリフェッチの対象とする。図１はサンプルプログラムにおいて外側のループで辿るＴｏｋｅｎオブジェクトに関連したデータ構造の説明図である。
【００５３】
図２はサンプルプログラムにおいて二重ループに含まれるロード命令とそれが参照するデータの、ヒープメモリ上のアドレスとの関係を示している。図２において、演算子’＆’は変数のアドレスを表す演算子である（Ｊａｖａの表記ではない）。配列のｌｅｎｇｔｈフィールド（ｆｉｅｌｄ；  欄）へのロード命令はＪａｖａプログラムには明示的に現れないが、配列の境界検査（ｂｏｕｎｄ  ｃｈｅｃｋ）のために生成される。
【００５４】
Ｗｕらのプリフェッチアルゴリズムは、反復回数の多いループに含まれる、アドレスがループ内で不変（ｉｎｖａｒｉａｎｔ）でないロード命令について、各アドレスのイテレーション間ストライドの値のプロファイルを調べる。この例ではＬ４，  Ｌ９，  Ｌ１０，  Ｌ１１がプロファイルの対象となるロード命令である。
【００５５】
しかし、この＿２０２＿ｊｅｓｓの上記コード部分の例では、イテレーション間定数ストライドを持つロード命令はＬ４だけである。この理由は、配列ｔｖ．ｖから参照されるＴｏｋｅｎオブジェクトは、初期化段階で一度に生成されるのではなく、ベンチマークの実行中にメソッドａｄｄＥｌｅｍｅｎｔ（）によって漸次追加されるためである。また、メソッドｒｅｍｏｖｅＥｌｅｍｅｎｔ（）はＴｏｋｅｎオブジェクトを配列ｔｖ．ｖから取り除く際に、配列の最後の要素を取り除かれた要素に代入する。従って配列ｔｖ．ｖのＴｏｋｅｎオブジェクトを先頭から順に参照しても、Ｌ９，  Ｌ１０はイテレーション間定数ストライドを持たない。プロファイルによって得られたロード命令Ｌ４のイテレーション間定数ストライドがｄバイトであったとすれば、ｃイテレーション先にアクセスされるデータをプリフェッチする命令を、Ｗｕらのアルゴリズムに従って生成すると以下の擬似プログラムのように表される。説明の便宜上、以下の擬似プログラムを第１の擬似プログラムと呼ぶ。
【００５６】
2004355279.tif 000027
【００５７】
第１の擬似プログラムでは、サンプルプログラムの行番号５２〜５９の対比から分かるように、ｐｒｅｆｅｔｃｈが行番号８３に追加されている。図３は第１の擬似プログラムの実行過程において関わるデータ及びアドレスを図１のデータ構造上に表示した図である。プロセッサが現在実行している命令列の属するイテレーションの番号をｉとする。ｉ番のイテレーションの命令列の実行中に、アドレス＆ｔｖ．ｖ［ｉ］  ＋  ｃ＊ｄのデータがキャッシュメモリにプリフェッチされる。
【００５８】
なお、図３、図５及び図９において、破線の引出し線の付いた符号はそれがアドレスであることを意味し、実線の引出し線の付いた符号はそれがデータであることを意味している。
【００５９】
これに対して、本実施例の手法を適用したときの手順は以下のようになる。まず外側のループ内のロード命令でプリフェッチの候補となるロード命令について、ロード依存グラフを生成する。図４はサンプルプログラムにおけるロード命令に対応するロード依存グラフである。
【００６０】
次に、オブジェクトインスペクションを用いて、外側のループを繰り返したときのイテレーション間およびイテレーション内の定数ストライドを検出する。上述のようにイテレーション間定数ストライドを持つロード命令はＬ４だけである。しかし、ロード命令Ｌ９のアドレスはＬ４の結果から得られるので、ポインタ参照を一回行なうことで、ロード命令Ｌ９で参照されるアドレスをプリフェッチすることができる。さらに、ロード命令Ｌ９，  Ｌ１０の間にイテレーション内定数ストライドが存在する。これは、Ｔｏｋｅｎオブジェクトのコンストラクタ（ｃｏｎｓｔｒｕｃｔｏｒ；  初期化メソッド）の先頭で、配列オブジェクトをアロケートしてｆａｃｔｓフィールドに代入しているからである。すなわち、配列オブジェクトはＴｏｋｅｎオブジェクトがアロケートされた直後にアロケートされるので、両者のヒープメモリ上の間隔は一定である可能性が高い。いま、Ｔｏｋｅｎオブジェクトの先頭からｆａｃｔｓフィールドへの間隔がｏバイト、ロード命令Ｌ９，  Ｌ１０のイテレーション内定数ストライドがｓバイトでキャッシュラインの大きさの半分より大きいとすると、本実施例によるプリフェッチングの結果は以下の擬似プログラムで表される。説明の便宜上、以下の擬似プログラムを第２の擬似プログラムと呼ぶことにする。
【００６１】
2004355279.tif 000028
【００６２】
第２の擬似プログラムでは、前述のサンプルプログラムに対して、行番号１０２〜１０５の命令コードが追加されている。また、第２の擬似プログラムでは、第１の擬似プログラムに対して、行番号８３の内容が行番号１０３〜１０５の内容に変更されている。ｐｒｅｆｅｔｃｈが行番号８３に追加されている。図５は第２の擬似プログラムの実行過程において関わるデータ及びアドレスを図１のデータ構造上に表示した図である。また、ｋ＝ｉ＋ｃとする。第２の擬似プログラムでは、プロセッサが現在実行している命令列の属するイテレーションの番号をｉとする。ｉ番のイテレーションの命令列の実行中に、アドレス＆ｔｖ．ｖ［ｉ］  ＋  ｃ＊ｄのデータｔｍｐが読み出され、ｔｍｐ＿ｐｒｅｆをアドレスとするデータ、すなわちアドレスｔｍｐ＿ｐｒｅｆのデータが読み出される。そして、アドレス（ｔｍｐ＿ｐｒｅｆ＋ｏ）のデータ、すなわちｋ番目のイテレーションにおけるポインタ参照ロード命令Ｌ９がロードするデータが、行番号１０４においてヒープメモリからキャッシュメモリへプリフェッチされる。さらに、アドレス（ｔｍｐ＿ｐｒｅｆ＋ｏ＋ｓ）のデータ、すなわちｋ番目のイテレーションにおけるポインタ参照ロード命令Ｌ１０がロードするデータが、行番号１０５においてヒープメモリからキャッシュメモリへプリフェッチされる。
【００６３】
なお、第２の擬似プログラムに第１の擬似プログラムの行番号８３のプリフェッチを追加することもできる。下記の第３の擬似プログラムがそれである。第３の擬似プログラムでは、第１の擬似プログラムの行番号８３が行番号１３３に現れている。
【００６４】
2004355279.tif 000029
【００６５】
本実施例の手法をＩＢＭ  Ｄｅｖｅｌｏｐｅｒ  Ｋｉｔ  ｆｏｒ  Ｗｉｎｄｏｗｓ（Ｗｉｎｄｏｗｓは登録商標），  Ｊａｖａ  Ｔｅｃｈｎｏｌｏｇｙ  Ｅｄｉｔｉｏｎ  Ｖｅｒｓｉｏｎ  １．３．１のＩＢＭ  Ｊａｖａ  ＪＩＴ  Ｃｏｍｐｉｌｅｒ  Ｖｅｒｓｉｏｎ  ４．０に実装して実験を行った。プロセッサは２  ＧＨｚ  Ｉｎｔｅｌ  Ｐｅｎｔｉｕｍ４（Ｐｅｎｔｉｕｍは登録商標）、メモリサイズは１  ＧＢ、ＯＳはＭｉｃｒｏｓｏｆｔ  Ｗｉｎｄｏｗｓ  ２０００  Ｐｒｏｆｅｓｓｉｏｎａｌ  ＋  Ｓｅｒｖｉｃｅ  Ｐａｃｋ  ２である。図６はＳＰＥＣｊｖｍ９８ベンチマーク及びＪａｖａＧｒａｎｄｅ  ｖ２．０ベンチマークＳｅｃｔｉｏｎ  ３のＰｅｎｔｉｕｍ  ４上での速度能向上率を示す。なお、ＳＰＥＣｊｖｍ９８ベンチマークはＳｔａｎｄａｒｄ  Ｐｅｒｆｏｒｍａｎｃｅ  Ｅｖａｌｕａｔｉｏｎ  Ｃｏｒｐｏｒａｔｉｏｎ  （ＳＰＥＣ），  ＪＶＭ  Ｃｌｉｅｎｔ９８  （ＳＰＥＣｊｖｍ９８），  ａｖａｉｌａｂｌｅ  ａｔ  ｈｔｔｐ：／／ｗｗｗ．ｓｐｅｃ．ｏｒｇ／ｏｓｇ／ｊｖｍ９８，  １９９８．であり、ＪａｖａＧｒａｎｄｅ  ｖ２．０ベンチマークはＪａｖａ  Ｇｒａｎｄｅ  Ｂｅｎｃｈｍａｒｋｉｎｇ  Ｐｒｏｊｅｃｔ，  Ｊａｖａ  Ｇｒａｎｄｅ  Ｆｏｒｕｍ  Ｂｅｎｃｈｍａｒｋ  Ｓｕｉｔｅ，  Ｖｅｒｓｉｏｎ  ２．０，  ａｖａｉｌａｂｌｅ  ａｔ  ｈｔｔｐ：／／ｗｗｗ．ｅｐｃｃ．ｅｄ．ａｃ．ｕｋ／ｊａｖａｇｒａｎｄｅ，  １９９９．である。ＳＰＥＣｊｖｍ９８は幾何平均で４．３％、ＪａｖａＧｒａｎｄｅ  ｖ２．０  Ｓｅｃｔｉｏｎ  ３は３．２％の性能向上を実現した。
【００６６】
また、図７はＳＰＥＣｊｖｍ９８ベンチマーク及びＪａｖａＧｒａｎｄｅ  ｖ２．０ベンチマークＳｅｃｔｉｏｎ  ３のＰｅｎｔｉｕｍ  ４上で実行した場合のコンパイル時間のオーバーヘッドを示す。数字はＪＩＴコンパイラの全コンパイル時間に対する割合である。コンパイル時間のオーバーヘッドは最大で３．７％である。Ｅｕｌｅｒ，  ＭｏｌＤｙｎ以外のプログラムに対しては１％以下に抑えられている。以上から、プリフェッチのためのコンパイル時間は実行時間に比べて非常に小さい。
【００６７】
図８はコード変換装置１０の機能ブロック図である。図９はコード変換装置１０が処理過程において関わるデータ及びアドレスを図１のデータ構造上に表示した図である。コード変換装置１０は、変換処理対象コード１１を機械語コード１２へ変換する。コード変換装置１０は、第１の着目手段１５、第２の着目手段１６、第１の検出手段１７、第２の検出手段１８、第１の計算手段１９、第２の計算手段２０、判定手段２１、第１の機械語コード部分生成手段２３、及び第２の機械語コード部分生成手段２４を有している。第１の着目手段１５は、所定のループＡにおける複数個のイテレーションの内で連続する所定個数ｎのイテレーションＢ１，Ｂ２，〜，Ｂｎ（なお、Ｂ１はループＡにおける１番目のイテレーションＢであることに限定されない。）を選択しそれらイテレーションＢ１，Ｂ２，〜，Ｂｎにおける変換処理対象コード１１上のポインタ参照ロード命令Ｃ１，１，Ｃ２，１，〜，Ｃｎ，１に着目する。第２の着目手段１６は、各イテレーションＢ１，Ｂ２，〜，Ｂｎにおける変換処理対象コード１１上の他のロード命令であってポインタ参照ロード命令Ｃ１，１，Ｃ２，１，〜，Ｃｎ，１にデータ依存するロード命令としてのデータ依存ロード命令Ｃ１，２，Ｃ２，２，〜，Ｃｎ，２に着目する。第１の検出手段１７は、ポインタ参照ロード命令Ｃ１，１，Ｃ２，１，〜，Ｃｎ，１に基づきプロセッサがロードするデータとしての参照値Ｕ１，１，Ｕ２，１，〜，Ｕｎ，１に対してそれらがヒープメモリにおいて格納されているアドレスＵ１，０，Ｕ２，０，〜，Ｕｎ，０を検出する。第２の検出手段１８は、データ依存ロード命令Ｃｒ，２〜Ｃｓ，２（ただし１≦ｒ＜ｓ≦ｎ）に基づきプロセッサがロードするデータＵｒ，２，Ｕｒ＋１，２，〜，Ｕｓ，２に対してそれらがヒープメモリにおいて格納されているアドレスＵｒ，ｙ，Ｕｒ＋１，ｙ，〜，Ｕｓ，ｙを検出する。第１の計算手段１９は、相互に隣接するイテレーションのポインタ参照ロード命令のロードデータのアドレスの差分Ｕ２，０−Ｕ１，０，Ｕ３，０−Ｕ２，０，〜，Ｕｎ，０−Ｕｎ−１，０をイテレーション間ストライドＦ１として計算する。第２の計算手段２０は、各イテレーションにおけるポインタ参照ロード命令の参照値Ｕｒ，１，Ｕｒ＋１，１，〜，Ｕｓ，１とデータ依存ロード命令のロードデータのアドレスＵｒ，ｙ，Ｕｒ＋１，ｙ，〜，Ｕｓ，ｙとの差分Ｕｒ，ｙ−Ｕｒ，１，Ｕｒ＋１，ｙ−Ｕｒ＋１，１，Ｕｓ，ｙ−Ｕｓ，１をイテレーション内ストライドＦ２として計算する。判定手段２１は、相互に同一となっているイテレーション間ストライドＦ１がイテレーション間ストライドＦ１の総数に対して第１の割合以上存在しかつ相互に同一となっているイテレーション内ストライドＦ２がイテレーション内ストライドＦ２の総数に対して第２の割合以上存在すると言う条件が満たされるか否かを判定する。設定手段２２は、判定手段２１の判定が「正」である場合には該同一のイテレーション間ストライドＦ１及び該同一のイテレーション内ストライドＦ２に基づいてそれぞれイテレーション間定数ストライドＦｘ及びイテレーション内定数ストライドＦｙを設定する。第１の機械語コード部分生成手段２３は、ループＡのイテレーションＢａにおけるポインタ参照ロード命令Ｃａ，１に基づいてプロセッサがロードするデータＵａ，１がヒープメモリにおいて格納されているアドレスＵａ，０及び自然数ｐ（ただし、イテレーションＢａよりｐ個、後のイテレーションをイテレーションＢｂとすると、イテレーションＢｂはループＡの最後のイテレーションを越えない。）に対してヒープメモリ上のアドレスＵｂ，０（＝Ｕａ，０＋ｐ・Ｆｘ）にアクセスして該アドレスＵｂ，０のデータＵｂ，１を検出する機械語コード部分Ｈ１を生成する。第２の機械語コード部分生成手段２４は、プロセッサがループＡのイテレーションＢｂを実行するのに先立ち、ヒープメモリ上のアドレス（Ｕｂ，１＋Ｆｙ）のデータＵｂ，２をヒープメモリからキャッシュメモリへプリフェッチする機械語コード部分Ｈ２を生成する。
【００６８】
コード変換装置１０とは例えばＪＩＴコンパイラである。変換処理対象コード１１とは例えばＪａｖａのバイトコードである。第１及び第２の割合は、等しくてもよく、例えば共に７５％である。なお、当然のことながら、ヒープメモリが含まれるメインメモリからキャッシュメモリへのデータ転送はキャッシュラインを単位に行われる。したがって、ヒープメモリ上のアドレス（Ｕｂ，１＋Ｆｙ）のデータＵｂ，２をヒープメモリからキャッシュメモリへプリフェッチすれば、該アドレス（Ｕｂ，１＋Ｆｙ）を含む所定アドレス範囲のデータが、データＵｂ，２と共にヒープメモリからキャッシュメモリへロードされる。以降、コード変換装置１０の更なる具体的な構成について説明する。図８のコード変換装置１０は、以下に述べる種々の具体的構成を任意の組み合わせで適宜、装備され得る。
【００６９】
Ｊａｖａでは、そのバイトコード上のポインタ参照ロード命令は、ソースコードにおけるオブジェクト型変数を呼び出す操作に対応している。
【００７０】
第１及び第２の機械語コード部分生成手段２４は、機械語コード部分Ｈ１，Ｈ２を、イテレーションＢａを実行する機械語コード範囲に配置する。
【００７１】
機械語としてプリフェッチ命令Ｊ１及び投機的ロード命令Ｊ２を装備するプロセッサ用のコード変換装置１０では、第１の機械語コード部分生成手段２３は、機械語コード部分Ｈ１が、アドレスＵｂ，０（＝Ｕａ，０＋ｐ・Ｆｘ）のデータＵｂ，１をロードする投機的ロード命令Ｊ２を含むように、機械語コード部分Ｈ１を生成する。第２の機械語コード部分生成手段２４は、機械語コード部分Ｈ２が、アドレス（Ｕｂ，１＋Ｆｙ）のデータＵｂ，２をプリフェッチするプリフェッチ命令Ｊ１を含むように、機械語コード部分Ｈ２を生成する。
【００７２】
機械語としてプリフェッチ命令Ｊ１及びロード命令Ｊ３を装備するプロセッサ用のコード変換装置１０では、第１の機械語コード部分生成手段２３は、機械語コード部分Ｈ１が、アクセス違反を調べる条件用分岐命令によりガードされたロード命令Ｊ３によりアドレスＵｂ，０（＝Ｕａ，０＋ｐ・Ｆｘ）のデータＵｂ，１を検出する処理を含むように、機械語コード部分Ｈ１を生成する。第２の機械語コード部分生成手段２４は、機械語コード部分Ｈ２が、アクセス違反を調べる条件用分岐命令によりガードされたロード命令Ｊ３によりアドレス（Ｕｂ，１＋Ｆｙ）のデータＶｂ２をプリフェッチする処理を含むように、機械語コード部分Ｈ２を生成する。
【００７３】
なお、「ガードされたロード命令」とは所定の条件が満たされるときのみロードを実行するロード命令を言うものとする。本実施形態における「ガードされたロード命令」は、アクセス違反が無いと言う条件が満たされるときのみ、ロードを実行する。例えば、投機的に実行されるロード命令は、プログラムの本来の実行では読み出されない配列の要素や、配列の外のメモリを読み出すことがある。そのようなメモリ番地には、アドレスとして正しくない値（例えば０）が格納されている可能性がある。このような投機的なロード命令の結果をアドレス値として他のロード命令を実行する場合、そのロード命令はヒープメモリ以外のアドレス（０番地など）を読み出し、アクセス違反を起こす可能性がある。
【００７４】
図１０はコード変換装置１０の構成をさらに具体化して示したものである。図８のコード変換装置１０に対する追加点のみを説明する。グラフ生成手段２６は、ループＡ内のロード命令の依存関係を表現するグラフとしてのロード依存グラフを生成する。第１及び第２の着目手段１６は、ポインタ参照ロード命令及びデータ依存ロード命令をロード依存グラフに基づき検出する。アドレス記録手段２８は、ループＡにおけるイテレーションＢ１，Ｂ２，〜，Ｂｎについてバイトコードを機械語コードへ試し実行用にコンパイルし試し実行用機械語コードを、副作用を起こさずに試し実行して、各イテレーションのロード命令によるロードデータのアドレスをロード依存グラフに記録する。第１及び第２の検出手段１８は、ロード依存グラフに記録されたアドレスに基づきアドレスＵ１，０〜アドレスＵｎ，０及びアドレスＵｒ，１〜アドレスＵｓ，１を検出する。
【００７５】
なお、「副作用を起こさない」とは、ヒープメモリのデータ構造を変化させる操作は行わないことを意味するものとする。
【００７６】
図１１はコード変換装置１０の機能付加部を示している。予測手段３１は、データＵｂ，２のプリフェッチが有意義か否かを予測する。中止手段３２は、予測手段３１が有意義でないと予測した場合には、第１及び第２の機械語生成手段による機械語コード部分Ｈ１，Ｈ２の生成を中止させる。説明の便宜上、データＵｂ，２をロードするデータ依存ロード命令を対象データ依存ロード命令、該対象データ依存ロード命令がと呼ぶことにする。予測手段３１は、データＵｂ，２にデータ依存する命令が存在する場合、及び／又は対象データ依存ロード命令とは別のデータ依存ロード命令がロードするデータＸに対して該データＸ用の機械語コード部分Ｈ２がすでに生成されていてデータＵｂ，２はデータＸとは同一のキャッシュラインには入らない場合、プリフェッチ命令の挿入が有意義と予測する。
【００７７】
前述の第３の擬似プログラムの行番号１３３に対応する機能を追加装備するコード変換装置１０は、式：Ｕａ，０＋ｐ・Ｆｘに基づきアドレス（Ｕａ，０＋ｐ・Ｆｘ）のデータＵｂ，１をヒープメモリからキャッシュメモリへプリフェッチする機械語コード部分Ｈ３を生成する第３の機械語コード部分生成手段を有している。そして、該コード変換装置１０は、さらに、キャッシュラインのサイズＦｓとしてＦｓ≧が２・Ｆｘであるならば第３の機械語コード部分生成手段による機械語コード部分Ｈ３の生成は中止とする制御手段を有している。
【００７８】
図１２はコード変換方法のフローチャートである。コード変換方法では、変換処理対象コードを機械語コードへ変換する。第１の着目ステップＳ３５では、所定のループＡにおける複数個のイテレーションの内で連続する所定個数ｎのイテレーションＢ１，Ｂ２，〜，Ｂｎ（なお、Ｂ１はループＡにおける１番目のイテレーションＢであることに限定されない。）を選択しそれらイテレーションＢ１，Ｂ２，〜，Ｂｎにおける変換処理対象コード上のポインタ参照ロード命令Ｃ１，１，Ｃ２，１，〜，Ｃｎ１に着目する。第２の着目ステップＳ３６では、各イテレーションＢ１，Ｂ２，〜，Ｂｎにおける変換処理対象コード上の他のロード命令Ｃ１，２，Ｃ２，２，〜，Ｃｎ２であってポインタ参照ロード命令Ｃ１，１，Ｃ２，１，〜，Ｃｎ１にデータ依存するロード命令としてのデータ依存ロード命令Ｃ１，２，Ｃ２，２，〜，Ｃｎ２に着目する。第１の検出ステップＳ３７では、ポインタ参照ロード命令Ｃ１，１，Ｃ２，１，〜，Ｃｎ１に基づきプロセッサがロードするデータとしての参照値Ｕ１，１，Ｕ２，１，〜，Ｕｎ，０１に対してそれらがヒープメモリにおいて格納されているアドレスＵ１，０，Ｕ２，０，〜，Ｕｎ，００を検出する。第２の検出ステップＳ３８では、データ依存ロード命令Ｃｒ，２〜Ｃｓ，２（ただし１≦ｒ＜ｓ≦ｎ）に基づきプロセッサがロードするデータＵｒ，２，Ｕｒ＋１，２，〜，Ｕｓ，２に対してそれらがヒープメモリにおいて格納されているアドレスＵｒ，ｙ，Ｕｒ＋１，ｙ，〜，Ｕｓ，ｙを検出する。第１の計算ステップＳ３９では、相互に隣接するイテレーションのポインタ参照ロード命令のロードデータのアドレスの差分Ｕ２，０−Ｕ１，０，Ｕ３，０−Ｕ２，０，〜，Ｕｎ，０−Ｕｎ−１，０をイテレーション間ストライドＦ１として計算する。第２の計算ステップＳ４０では、各イテレーションにおけるポインタ参照ロード命令の参照値Ｕｒ，１，Ｕｒ＋１，１，〜，Ｕｓ，１とデータ依存ロード命令のロードデータのアドレスＵｒ，ｙ，Ｕｒ＋１，ｙ，〜，Ｕｓ，ｙとの差分Ｕｒ，ｙ−Ｕｒ，１，Ｕｒ＋１，ｙ−Ｕｒ＋１，１，Ｕｓ，ｙ−Ｕｓ，１をイテレーション内ストライドＦ２として計算する。判定ステップＳ４１では、相互に同一となっているイテレーション間ストライドＦ１がイテレーション間ストライドＦ１の総数に対して第１の割合以上存在しかつ相互に同一となっているイテレーション内ストライドＦ２がイテレーション内ストライドＦ２の総数に対して第２の割合以上存在すると言う条件が満たされるか否かを判定する。設定ステップＳ４２では、判定ステップＳ４１における判定が「正」である場合には該同一のイテレーション間ストライドＦ１及び該同一のイテレーション内ストライドＦ２に基づいてそれぞれイテレーション間定数ストライドＦｘ及びイテレーション内定数ストライドＦｙを設定する。第１の機械語コード部分生成ステップＳ４３では、ループＡのイテレーションＢａにおけるポインタ参照ロード命令Ｃａ，１に基づいてプロセッサがロードするデータＵａ，１がヒープメモリにおいて格納されているアドレスＵａ，０及び自然数ｐ（ただし、イテレーションＢａよりｐ個、後のイテレーションをイテレーションＢｂとすると、イテレーションＢｂはループＡの最後のイテレーションを越えない。）に対してヒープメモリ上のアドレスＵｂ，０（＝Ｕａ，０＋ｐ・Ｆｘ）にアクセスして該アドレスＵｂ，０のデータＵｂ，１を検出する機械語コード部分Ｈ１を生成する。第２の機械語コード部分生成ステップＳ４４では、プロセッサがループＡのイテレーションＢｂを実行するのに先立ち、ヒープメモリ上のアドレス（Ｕｂ，１＋Ｆｙ）のデータＵｂ，２をヒープメモリからキャッシュメモリへプリフェッチする機械語コード部分Ｈ２を生成する。
【００７９】
本実施例のコード変換方法では、図１２のフローチャートに係るコード変換方法を基本にして、以下に述べる具体的構成を任意の組み合わせで適宜追加可能である。
【００８０】
変換処理対象コードはＪａｖａのバイトコードである。コード変換方法はＪＩＴコンパイラである。
【００８１】
第１及び第２の機械語コード部分生成ステップＳ４４では、機械語コード部分Ｈ１，Ｈ２を、イテレーションＢａを実行する機械語コード範囲に配置する。
【００８２】
機械語としてプリフェッチ命令Ｊ１及び投機的ロード命令Ｊ２を装備するプロセッサ用のコード変換方法において、第１の機械語コード部分生成ステップＳ４３では、機械語コード部分Ｈ１が、アドレスＵｂ，０（＝Ｕａ，０＋ｐ・Ｆｘ）のデータＵｂ，１をロードする投機的ロード命令Ｊ２を含むように、機械語コード部分Ｈ１を生成する。第２の機械語コード部分生成ステップＳ４４では、機械語コード部分Ｈ２が、アドレス（Ｕｂ，１＋Ｆｙ）のデータＵｂ，２をプリフェッチするプリフェッチ命令Ｊ１を含むように、機械語コード部分Ｈ２を生成する。
【００８３】
機械語としてプリフェッチ命令Ｊ１及びロード命令Ｊ３を装備するプロセッサ用のコード変換方法において、第１の機械語コード部分生成ステップＳ４３では、機械語コード部分Ｈ１が、アクセス違反を調べる条件用分岐命令によりガードされたロード命令Ｊ３によりアドレスＵｂ，０（＝Ｕａ，０＋ｐ・Ｆｘ）のデータＵｂ，１を検出する処理を含める。第２の機械語コード部分生成ステップＳ４４では、機械語コード部分Ｈ２が、アクセス違反を調べる条件用分岐命令によりガードされたロード命令Ｊ３によりアドレス（Ｕｂ，１＋Ｆｙ）のデータＶｂ２をプリフェッチする処理を含むように、機械語コード部分Ｈ２を生成する。
【００８４】
図１３は図１２のフローチャートにステップを追加したフローチャートの主要部である。グラフ生成ステップＳ４５はＳ３５の前に追加される。Ｓ４５では、ループＡ内のロード命令の依存関係を表現するグラフとしてのロード依存グラフを生成する。第１及び第２の着目ステップＳ３５，Ｓ３６では、ポインタ参照ロード命令及びデータ依存ロード命令をロード依存グラフに基づき検出する。
【００８５】
アドレス記録ステップＳ４６はＳ３６とＳ３７との間に追加される。アドレス記録ステップＳ４６では、ループＡにおけるイテレーションＢ１，Ｂ２，〜，Ｂｎについて変換処理対象コードを機械語コードへ試し実行用にコンパイルし試し実行用機械語コードを、副作用を起こさずに試し実行して、各イテレーションのロード命令によるロードデータのアドレスをロード依存グラフに記録する。第１及び第２の検出ステップＳ３７，Ｓ３８では、ロード依存グラフに記録されたアドレスに基づきアドレスＵ１，０〜アドレスＵｎ，０及びアドレスＵｒ，１〜アドレスＵｓ，１を検出する。
【００８６】
図１４は図１２のフローチャートに別のステップを追加したフローチャートの主要部である。予測ステップＳ４９及び中止ステップＳ５０がＳ３９とＳ４２との間に追加されている。予測ステップＳ４９では、判定ステップＳ４１における判定に係るデータ依存ロード命令について、該データ依存ロード命令に基づくロードデータのプリフェッチが有意義か否かを予測する。予測ステップＳ４９において有意義でないと予測した場合には、すなわち、Ｓ４９の判定が「有り」の場合、Ｓ４２へ進み、「否」である場合、中止ステップＳ５０へ進む。中止ステップＳ５０では、第１及び第２の機械語生成ステップにおける機械語コード部分Ｈ１，Ｈ２の生成を中止させる。
【００８７】
図１５はＪＩＴコンパイラ５７の構成をＪａｖａ仮想計算機５５と共に示している。ＪＩＴコンパイラ５７は、バイトコード５６を実行するＪａｖａ仮想計算機５５からの指示を受けて指示範囲のバイトコード５６を機械語コード１２へ変換する。ＪＩＴコンパイラ５７は、情報収集手段５８及び変換手段５９を有している。情報収集手段５８は、指示範囲のバイトコード５６の部分を機械語コード１２へ試し実行用にコンパイルし試し実行用機械語コード１２を、副作用を起こさずに試し実行してヒープメモリにおけるデータ構造についての情報を収集する。変換手段５９は、情報収集手段５８による収集情報に基づいて指示範囲のバイトコード５６を機械語コード１２へ変換する。
【００８８】
図１５のＪＩＴコンパイラ５７はさらに以下の具体的構成を任意の組み合わせで装備可能になっている。変換手段５９は、情報収集手段５８による収集情報に依らずに指示範囲のバイトコード５６を変換された機械語コード１２に対して情報収集手段５８による収集情報に基づく機械語コード１２部分を追加した機械語コード１２を生成するものである。収集情報は、ループＡ内の各イテレーションにおける所定ロード命令がヒープメモリから参照するデータのアドレスの規則性に係る情報を含み、変換手段５９は、収集情報に基づき所定ロード命令に基づくロードデータをヒープメモリからキャッシュメモリへプリフェッチする機械語コード１２部分を生成するものである。
【００８９】
図１６はＪＩＴコンパイル方法のフローチャートである。ＪＩＴコンパイル方法では、バイトコードを実行するＪａｖａ仮想計算機からの指示を受けて指示範囲のバイトコードを機械語コードへ変換する。情報収集ステップＳ６３では、指示範囲のバイトコードの部分を機械語コードへ試し実行用にコンパイルし試し実行用機械語コードを、副作用を起こさずに試し実行してヒープメモリにおけるデータ構造についての情報を収集する。変換ステップＳ６４では、情報収集ステップＳ６３における収集情報に基づいて指示範囲のバイトコードを機械語コードへ変換する。
【００９０】
図１６に係るＪＩＴコンパイル方法は、さらに、以下の実施態様を任意の組み合わせで適宜追加され得る。
【００９１】
変換ステップＳ６４では、情報収集ステップＳ６３における収集情報に依らずに指示範囲のバイトコードを変換された機械語コードに対して情報収集ステップＳ６３における収集情報に基づく機械語コード部分を追加した機械語コードを生成する。
【００９２】
収集情報は、ループＡ内の各イテレーションにおける所定ロード命令がヒープメモリから参照するデータのアドレスの規則性に係る情報を含む。変換ステップＳ６４では、収集情報に基づき所定ロード命令に基づくロードデータをヒープメモリからキャッシュメモリへプリフェッチする機械語コード部分を生成する。
【００９３】
図１７はプログラムを実行するためのハードウェア構成図である。前述したコード変換装置７０及びイテレーション５７において各手段が実施する各機能は例えば図１７のハードウェアを使用して実行される。システムバス７０には、ＣＰＵ７１、メインメモリ７２及び入出力制御装置７３が接続される。ＣＰＵ７１及びキャッシュメモリ７５は同一のチップに含まれ、ＣＰＵ７１内のプロセッサは、キャッシュメモリ７５からデータをロードする。そして、キャッシュミスが生じた場合には、該キャッシュミスに係るデータを含むキャッシュラインがメインメモリ７２からキャッシュメモリ７５へロードされる。その後、ＣＰＵ７１内のプロセッサは該データをキャッシュメモリ７５からロードする。入出力制御装置７３には、ハードディスクインターフェース及びＬＡＮインターフェース等が含まれ、ＣＰＵ７１が実行する各種プログラム（ＪＩＴコンパイラを含む。）はハードディスク装置等に格納されている。プログラムは、ＣＰＵ７１において実行されるのに先立ち、メインメモリ７２に格納される。ＣＰＵ７１は、メインメモリ７２の命令行を順次、読み出して、該プログラムを実行する。
【００９４】
まとめとして本発明の構成に関して以下の事項を開示する。
（１）：変換処理対象コードを機械語コードへ変換するコード変換装置において、
所定のループＡにおける複数個のイテレーションの内で連続する所定個数ｎのイテレーションＢ１，Ｂ２，〜，Ｂｎ（なお、Ｂ１はループＡにおける１番目のイテレーションＢであることに限定されない。）を選択しそれらイテレーションＢ１，Ｂ２，〜，Ｂｎにおける変換処理対象コード上のポインタ参照ロード命令Ｃ１，１，Ｃ２，１，〜，Ｃｎ，１に着目する第１の着目手段、
各イテレーションＢ１，Ｂ２，〜，Ｂｎにおける変換処理対象コード上の他のロード命令であってポインタ参照ロード命令Ｃ１，１，Ｃ２，１，〜，Ｃｎ，１にデータ依存するロード命令としてのデータ依存ロード命令Ｃ１，２，Ｃ２，２，〜，Ｃｎ，２に着目する第２の着目手段、
ポインタ参照ロード命令Ｃ１，１，Ｃ２，１，〜，Ｃｎ，１に基づきプロセッサがロードするデータとしての参照値Ｕ１，１，Ｕ２，１，〜，Ｕｎ，１に対してそれらがヒープメモリにおいて格納されているアドレスＵ１，０，Ｕ２，０，〜，Ｕｎ，０を検出する第１の検出手段、
前記データ依存ロード命令Ｃｒ，２〜Ｃｓ，２（ただし１≦ｒ＜ｓ≦ｎ）に基づきプロセッサがロードするデータＵｒ，２，Ｕｒ＋１，２，〜，Ｕｓ，２に対してそれらがヒープメモリにおいて格納されているアドレスＵｒ，ｙ，Ｕｒ＋１，ｙ，〜，Ｕｓ，ｙを検出する第２の検出手段、
相互に隣接するイテレーションの前記ポインタ参照ロード命令のロードデータのアドレスの差分Ｕ２，０−Ｕ１，０，Ｕ３，０−Ｕ２，０，〜，Ｕｎ，０−Ｕｎ−１，０をイテレーション間ストライドＦ１として計算する第１の計算手段、
各イテレーションにおける前記ポインタ参照ロード命令の参照値Ｕｒ，１，Ｕｒ＋１，１，〜，Ｕｓ，１と前記データ依存ロード命令のロードデータのアドレスＵｒ，ｙ，Ｕｒ＋１，ｙ，〜，Ｕｓ，ｙとの差分Ｕｒ，ｙ−Ｕｒ，１，Ｕｒ＋１，ｙ−Ｕｒ＋１，１，Ｕｓ，ｙ−Ｕｓ，１をイテレーション内ストライドＦ２として計算する第２の計算手段、
相互に同一となっているイテレーション間ストライドＦ１がイテレーション間ストライドＦ１の総数に対して第１の割合以上存在しかつ相互に同一となっているイテレーション内ストライドＦ２がイテレーション内ストライドＦ２の総数に対して第２の割合以上存在すると言う条件が満たされるか否かを判定する判定手段、
前記判定手段の判定が「正」である場合には該同一のイテレーション間ストライドＦ１及び該同一のイテレーション内ストライドＦ２に基づいてそれぞれイテレーション間定数ストライドＦｘ及びイテレーション内定数ストライドＦｙを設定する設定手段、
ループＡのイテレーションＢａにおけるポインタ参照ロード命令Ｃａ，１に基づいてプロセッサがロードするデータＵａ，１がヒープメモリにおいて格納されているアドレスＵａ，０及び自然数ｐ（ただし、イテレーションＢａよりｐ個、後のイテレーションをイテレーションＢｂとすると、イテレーションＢｂはループＡの最後のイテレーションを越えない。）に対してヒープメモリ上のアドレスＵｂ，０（＝Ｕａ，０＋ｐ・Ｆｘ）にアクセスして該アドレスＵｂ，０のデータＵｂ，１を検出する機械語コード部分Ｈ１を生成する第１の機械語コード部分生成手段、及び
プロセッサがループＡのイテレーションＢｂを実行するのに先立ち、ヒープメモリ上のアドレス（Ｕｂ，１＋Ｆｙ）のデータＵｂ，２をヒープメモリからキャッシュメモリへプリフェッチする機械語コード部分Ｈ２を生成する第２の機械語コード部分生成手段、
を有していることを特徴とするコード変換装置。
【００９５】
（２）：前記変換処理対象コードはＪａｖａのバイトコードであることを特徴とする（１）記載のコード変換装置。
（３）：前記コード変換装置はＪＩＴコンパイラであることを特徴とする（１）又は（２）記載のコード変換装置。
（４）：前記第１及び前記第２の機械語コード部分生成手段は、前記機械語コード部分Ｈ１，Ｈ２を、前記イテレーションＢａを実行する機械語コード範囲に配置することを特徴とする（１）〜（３）のいずれかに記載のコード変換装置。
（５）：機械語としてプリフェッチ命令Ｊ１及び投機的ロード命令Ｊ２を装備するプロセッサ用のコード変換装置において、
前記第１の機械語コード部分生成手段は、前記機械語コード部分Ｈ１が、アドレスＵｂ，０（＝Ｕａ，０＋ｐ・Ｆｘ）のデータＵｂ，１をロードする投機的ロード命令Ｊ２を含むように、前記機械語コード部分Ｈ１を生成し、
前記第２の機械語コード部分生成手段は、前記機械語コード部分Ｈ２が、アドレス（Ｕｂ，１＋Ｆｙ）のデータＵｂ，２をプリフェッチするプリフェッチ命令Ｊ１を含むように、前記機械語コード部分Ｈ２を生成する、
ことを特徴とする（１）〜（４）のいずれかに記載のコード変換装置。
（６）：機械語としてプリフェッチ命令Ｊ１及びロード命令Ｊ３を装備するプロセッサ用のコード変換装置において、
前記第１の機械語コード部分生成手段は、前記機械語コード部分Ｈ１が、アクセス違反を調べる条件用分岐命令によりガードされたロード命令Ｊ３によりアドレスＵｂ，０（＝Ｕａ，０＋ｐ・Ｆｘ）のデータＵｂ，１を検出する処理を含むように、機械語コード部分Ｈ１を生成し、
前記第２の機械語コード部分生成手段は、前記機械語コード部分Ｈ２が、アクセス違反を調べる条件用分岐命令によりガードされたロード命令Ｊ３によりアドレス（Ｕｂ，１＋Ｆｙ）のデータＶｂ２をプリフェッチする処理を含むように、機械語コード部分Ｈ２を生成する、
ことを特徴とする（１）〜（４）のいずれかに記載のコード変換装置。
（７）：ループＡ内のロード命令の依存関係を表現するグラフとしてのロード依存グラフを生成するグラフ生成手段、
を有し、
前記第１及び前記第２の着目手段は、前記ポインタ参照ロード命令及び前記データ依存ロード命令をロード依存グラフに基づき検出することを特徴とする（１）〜（６）のいずれかに記載のコード変換装置。
【００９６】
（８）：ループＡにおけるイテレーションＢ１，Ｂ２，〜，Ｂｎについてバイトコードを機械語コードへ試し実行用にコンパイルし試し実行用機械語コードを、副作用を起こさずに試し実行して、各イテレーションのロード命令によるロードデータのアドレスをロード依存グラフに記録するアドレス記録手段、
を有し、
前記第１及び第２の検出手段は、ロード依存グラフに記録されたアドレスに基づきアドレスＵ１，０〜アドレスＵｎ，０及びアドレスＵｒ，１〜アドレスＵｓ，１を検出する、
ことを特徴とする（７）記載のコード変換装置。
（９）：データＵｂ，２のプリフェッチが有意義か否かを予測する予測手段、
前記予測手段が有意義でないと予測した場合には、前記第１及び前記第２の機械語生成手段による前記機械語コード部分Ｈ１，Ｈ２の生成を中止させる中止手段、
を有していることを特徴とする（１）〜（８）のいずれかに記載のコード変換装置。
（１０）：データＵｂ，２をロードするデータ依存ロード命令を対象データ依存ロード命令、該対象データ依存ロード命令がと呼ぶことにし、
前記予測手段は、データＵｂ，２にデータ依存する命令が存在する場合、及び／又は対象データ依存ロード命令とは別のデータ依存ロード命令がロードするデータＸに対して該データＸ用の機械語コード部分Ｈ２がすでに生成されていてデータＵｂ，２はデータＸとは同一のキャッシュラインには入らない場合、プリフェッチ命令の挿入が有意義と予測することを特徴とする（９）記載のコード変換装置。
（１１）：式：Ｕａ，０＋ｐ・Ｆｘに基づきアドレス（Ｕａ，０＋ｐ・Ｆｘ）のデータＵｂ，１をヒープメモリからキャッシュメモリへプリフェッチする機械語コード部分Ｈ３を生成する第３の機械語コード部分生成手段、及び
キャッシュラインのサイズＦｓとしてＦｓ≧が２・Ｆｘであるならば前記第３の機械語コード部分生成手段による機械語コード部分Ｈ３の生成は中止とする制御手段、
を有していることを特徴とする（１）〜（１０）のいずれかに記載のコード変換装置。
【００９７】
（１２）：バイトコードを実行するＪａｖａ仮想計算機からの指示を受けて指示範囲のバイトコードを機械語コードへ変換するＪＩＴコンパイラにおいて、
指示範囲のバイトコードの部分を機械語コードへ試し実行用にコンパイルし試し実行用機械語コードを、副作用を起こさずに試し実行してヒープメモリにおけるデータ構造についての情報を収集する情報収集手段、及び
前記情報収集手段による収集情報に基づいて指示範囲のバイトコードを機械語コードへ変換する変換手段、
を有していることを特徴とするＪＩＴコンパイラ。
（１３）：前記変換手段は、前記情報収集手段による収集情報に依らずに指示範囲のバイトコードを変換された機械語コードに対して前記情報収集手段による収集情報に基づく機械語コード部分を追加した機械語コードを生成するものである、
ことを特徴とする（１２）記載のＪＩＴコンパイラ。
（１４）：前記収集情報は、ループＡ内の各イテレーションにおける所定ロード命令がヒープメモリから参照するデータのアドレスの規則性に係る情報を含み、
前記変換手段は、前記収集情報に基づき所定ロード命令に基づくロードデータをヒープメモリからキャッシュメモリへプリフェッチする機械語コード部分を生成するものであることを特徴とする（１２）又は（１３）記載のＪＩＴコンパイラ。
【００９８】
（１５）：変換処理対象コードを機械語コードへ変換するコード変換方法において、
所定のループＡにおける複数個のイテレーションの内で連続する所定個数ｎのイテレーションＢ１，Ｂ２，〜，Ｂｎ（なお、Ｂ１はループＡにおける１番目のイテレーションＢであることに限定されない。）を選択しそれらイテレーションＢ１，Ｂ２，〜，Ｂｎにおける変換処理対象コード上のポインタ参照ロード命令Ｃ１，１，Ｃ２，１，〜，Ｃｎ，１に着目する第１の着目ステップ、
各イテレーションＢ１，Ｂ２，〜，Ｂｎにおける変換処理対象コード上の他のロード命令であってポインタ参照ロード命令Ｃ１，１，Ｃ２，１，〜，Ｃｎ，１にデータ依存するロード命令としてのデータ依存ロード命令Ｃ１，２，Ｃ２，２，〜，Ｃｎ，２に着目する第２の着目ステップ、
ポインタ参照ロード命令Ｃ１，１，Ｃ２，１，〜，Ｃｎ，１に基づきプロセッサがロードするデータとしての参照値Ｕ１，１，Ｕ２，１，〜，Ｕｎ，１に対してそれらがヒープメモリにおいて格納されているアドレスＵ１，０，Ｕ２，０，〜，Ｕｎ，０を検出する第１の検出ステップ、
前記データ依存ロード命令Ｃｒ，２〜Ｃｓ，２（ただし１≦ｒ＜ｓ≦ｎ）に基づきプロセッサがロードするデータＵｒ，２，Ｕｒ＋１，２，〜，Ｕｓ，２に対してそれらがヒープメモリにおいて格納されているアドレスＵｒ，ｙ，Ｕｒ＋１，ｙ，〜，Ｕｓ，ｙを検出する第２の検出ステップ、
相互に隣接するイテレーションの前記ポインタ参照ロード命令のロードデータのアドレスの差分Ｕ２，０−Ｕ１，０，Ｕ３，０−Ｕ２，０，〜，Ｕｎ，０−Ｕｎ−１，０をイテレーション間ストライドＦ１として計算する第１の計算ステップ、
各イテレーションにおける前記ポインタ参照ロード命令の参照値Ｕｒ，１，Ｕｒ＋１，１，〜，Ｕｓ，１と前記データ依存ロード命令のロードデータのアドレスＵｒ，ｙ，Ｕｒ＋１，ｙ，〜，Ｕｓ，ｙとの差分Ｕｒ，ｙ−Ｕｒ，１，Ｕｒ＋１，ｙ−Ｕｒ＋１，１，Ｕｓ，ｙ−Ｕｓ，１をイテレーション内ストライドＦ２として計算する第２の計算ステップ、
相互に同一となっているイテレーション間ストライドＦ１がイテレーション間ストライドＦ１の総数に対して第１の割合以上存在しかつ相互に同一となっているイテレーション内ストライドＦ２がイテレーション内ストライドＦ２の総数に対して第２の割合以上存在すると言う条件が満たされるか否かを判定する判定ステップ、
前記判定ステップにおける判定が「正」である場合には該同一のイテレーション間ストライドＦ１及び該同一のイテレーション内ストライドＦ２に基づいてそれぞれイテレーション間定数ストライドＦｘ及びイテレーション内定数ストライドＦｙを設定する設定ステップ、
ループＡのイテレーションＢａにおけるポインタ参照ロード命令Ｃａ，１に基づいてプロセッサがロードするデータＵａ，１がヒープメモリにおいて格納されているアドレスＵａ，０及び自然数ｐ（ただし、イテレーションＢａよりｐ個、後のイテレーションをイテレーションＢｂとすると、イテレーションＢｂはループＡの最後のイテレーションを越えない。）に対してヒープメモリ上のアドレスＵｂ，０（＝Ｕａ，０＋ｐ・Ｆｘ）にアクセスして該アドレスＵｂ，０のデータＵｂ，１を検出する機械語コード部分Ｈ１を生成する第１の機械語コード部分生成ステップ、及び
プロセッサがループＡのイテレーションＢｂを実行するのに先立ち、ヒープメモリ上のアドレス（Ｕｂ，１＋Ｆｙ）のデータＵｂ，２をヒープメモリからキャッシュメモリへプリフェッチする機械語コード部分Ｈ２を生成する第２の機械語コード部分生成ステップ、
を有していることを特徴とするコード変換方法。
【００９９】
（１６）：前記変換処理対象コードはＪａｖａのバイトコードであることを特徴とする（１５）記載のコード変換方法。
（１７）：前記コード変換方法はＪＩＴコンパイラであることを特徴とする（１５）又は（１６）に記載のコード変換方法。
（１８）：前記第１及び前記第２の機械語コード部分生成ステップでは、前記機械語コード部分Ｈ１，Ｈ２を、前記イテレーションＢａを実行する機械語コード範囲に配置することを特徴とする（１５）〜（１７）のいずれかに記載のコード変換方法。
（１９）：機械語としてプリフェッチ命令Ｊ１及び投機的ロード命令Ｊ２を装備するプロセッサ用のコード変換方法において、
前記第１の機械語コード部分生成ステップでは、前記機械語コード部分Ｈ１が、アドレスＵｂ，０（＝Ｕａ，０＋ｐ・Ｆｘ）のデータＵｂ，１をロードする投機的ロード命令Ｊ２を含むように、前記機械語コード部分Ｈ１を生成し、
前記第２の機械語コード部分生成ステップでは、前記機械語コード部分Ｈ２が、アドレス（Ｕｂ，１＋Ｆｙ）のデータＵｂ，２をプリフェッチするプリフェッチ命令Ｊ１を含むように、前記機械語コード部分Ｈ２を生成する、
ことを特徴とする（１５）〜（１８）のいずれかに記載のコード変換方法。
（２０）：機械語としてプリフェッチ命令Ｊ１及びロード命令Ｊ３を装備するプロセッサ用のコード変換方法において、
前記第１の機械語コード部分生成ステップでは、前記機械語コード部分Ｈ１が、アクセス違反を調べる条件用分岐命令によりガードされたロード命令Ｊ３によりアドレスＵｂ，０（＝Ｕａ，０＋ｐ・Ｆｘ）のデータＵｂ，１を検出する処理を含むように、機械語コード部分Ｈ１を生成し、
前記第２の機械語コード部分生成ステップでは、前記機械語コード部分Ｈ２が、アクセス違反を調べる条件用分岐命令によりガードされたロード命令Ｊ３によりアドレス（Ｕｂ，１＋Ｆｙ）のデータＶｂ２をプリフェッチする処理を含むように、機械語コード部分Ｈ２を生成する、
ことを特徴とする（１５）〜（１８）のいずれかに記載のコード変換方法。
（２１）：ループＡ内のロード命令の依存関係を表現するグラフとしてのロード依存グラフを生成するグラフ生成ステップ、
を有し、
前記第１及び前記第２の着目ステップでは、前記ポインタ参照ロード命令及び前記データ依存ロード命令をロード依存グラフに基づき検出することを特徴とする（１５）〜（２０）のいずれかに記載のコード変換方法。
【０１００】
（２２）：ループＡにおけるイテレーションＢ１，Ｂ２，〜，Ｂｎについてバイトコードを機械語コードへ試し実行用にコンパイルし試し実行用機械語コードを、副作用を起こさずに試し実行して、各イテレーションのロード命令によるロードデータのアドレスをロード依存グラフに記録するアドレス記録ステップ、
を有し、
前記第１及び第２の検出ステップでは、ロード依存グラフに記録されたアドレスに基づきアドレスＵ１，０〜アドレスＵｎ，０及びアドレスＵｒ，１〜アドレスＵｓ，１を検出する、
ことを特徴とする（２１）記載のコード変換方法。
（２３）：データＵｂ，２のプリフェッチが有意義か否かを予測する予測ステップ、
前記予測ステップにおいて有意義でないと予測した場合には、前記第１及び前記第２の機械語生成ステップにおける前記機械語コード部分Ｈ１，Ｈ２の生成を中止させる中止ステップ、
を有していることを特徴とする（１５）〜（２２）のいずれかに記載のコード変換装置。
（２４）：データＵｂ，２をロードするデータ依存ロード命令を対象データ依存ロード命令、該対象データ依存ロード命令がと呼ぶことにし、
前記予測ステップでは、データＵｂ，２にデータ依存する命令が存在する場合、及び／又は対象データ依存ロード命令とは別のデータ依存ロード命令がロードするデータＸに対して該データＸ用の機械語コード部分Ｈ２がすでに生成されていてデータＵｂ，２はデータＸとは同一のキャッシュラインには入らない場合、プリフェッチ命令の挿入が有意義と予測することを特徴とする（２３）記載のコード変換装置。
（２５）：式：Ｕａ，０＋ｐ・Ｆｘに基づきアドレス（Ｕａ，０＋ｐ・Ｆｘ）のデータＵｂ，１をヒープメモリからキャッシュメモリへプリフェッチする機械語コード部分Ｈ３を生成する第３の機械語コード部分生成ステップ、及び
キャッシュラインのサイズＦｓとしてＦｓ≧が２・Ｆｘであるならば前記第３の機械語コード部分生成ステップにおける機械語コード部分Ｈ３の生成は中止とする制御ステップ、
を有していることを特徴とする（１５）〜（２４）のいずれかに記載のコード変換装置。
【０１０１】
（２６）：バイトコードを実行するＪａｖａ仮想計算機からの指示を受けて指示範囲のバイトコードを機械語コードへ変換するＪＩＴコンパイル方法において、
指示範囲のバイトコードの部分を機械語コードへ試し実行用にコンパイルし試し実行用機械語コードを、副作用を起こさずに試し実行してヒープメモリにおけるデータ構造についての情報を収集する情報収集ステップ、及び
前記情報収集ステップにおける収集情報に基づいて指示範囲のバイトコードを機械語コードへ変換する変換ステップ、
を有していることを特徴とするＪＩＴコンパイル方法。
（２７）：前記変換ステップでは、前記情報収集ステップにおける収集情報に依らずに指示範囲のバイトコードを変換された機械語コードに対して前記情報収集ステップにおける収集情報に基づく機械語コード部分を追加した機械語コードを生成する、
ことを特徴とする（２６）記載のＪＩＴコンパイル方法。
（２８）：前記収集情報は、ループＡ内の各イテレーションにおける所定ロード命令がヒープメモリから参照するデータのアドレスの規則性に係る情報を含み、
前記変換ステップでは、前記収集情報に基づき所定ロード命令に基づくロードデータをヒープメモリからキャッシュメモリへプリフェッチする機械語コード部分を生成する、
ことを特徴とする（２６）又は（２７）に記載のＪＩＴコンパイル方法。
（２９）：（１）〜（１１）のいずれかに記載のコード変換装置の各手段としてコンピュータを機能させるためのコード変換用プログラム。
（３０）：（１２）〜（１４）のいずれかに記載のＪＩＴコンパイラの各手段としてコンピュータを機能させるためのＪＩＴコンパイラ用プログラム。
【０１０２】
【発明の効果】
本発明では、ループの各イテレーションにおけるポインタ参照ロード命令についてイテレーション間定数ストライドを検出するとともに、イテレーション間定数ストライドをもつポインタ参照ロード命令に基づいてロードされるデータとしての参照アドレスに対してイテレーション内定数ストライド関係にあるデータをプリフェッチする機械語コード部分を生成する。結果、機械語コードの実行では、キャッシュミスを抑制して、プログラムの実行速度を増大できる。
【図面の簡単な説明】
【図１】サンプルプログラムにおいて外側のループで辿るＴｏｋｅｎオブジェクトに関連したデータ構造の説明図である。
【図２】サンプルプログラムにおいて二重ループに含まれるロード命令とそれが参照するデータの、ヒープメモリ上のアドレスとの関係を示す図である。
【図３】第１の擬似プログラムの実行過程において関わるデータ及びアドレスを図１のデータ構造上に表示した図である。
【図４】サンプルプログラムにおけるロード命令に対応するロード依存グラフである。
【図５】第２の擬似プログラムの実行過程において関わるデータ及びアドレスを図１のデータ構造上に表示した図である。
【図６】ＳＰＥＣｊｖｍ９８ベンチマーク及びＪａｖａＧｒａｎｄｅ  ｖ２．０ベンチマークＳｅｃｔｉｏｎ  ３のＰｅｎｔｉｕｍ  ４上での速度能向上率を示す図である。
【図７】ＳＰＥＣｊｖｍ９８ベンチマーク及びＪａｖａＧｒａｎｄｅ  ｖ２．０ベンチマークＳｅｃｔｉｏｎ  ３のＰｅｎｔｉｕｍ  ４上で実行した場合のコンパイル時間のオーバーヘッドを示す図である。
【図８】コード変換装置の機能ブロック図である。
【図９】コード変換装置が処理過程において関わるデータ及びアドレスを図１のデータ構造上に表示した図である。
【図１０】コード変換装置の構成をさらに具体化して示したものである。
【図１１】コード変換装置の機能付加部を示す図である。
【図１２】コード変換方法のフローチャートである。
【図１３】図１２のフローチャートにステップを追加したフローチャートの主要部である。
【図１４】図１２のフローチャートに別のステップを追加したフローチャートの主要部である。
【図１５】ＪＩＴコンパイラの構成をＪａｖａ仮想計算機と共に示す図である。
【図１６】ＪＩＴコンパイル方法のフローチャートである。
【図１７】プログラムを実行するためのハードウェア構成図である。
【符号の説明】
１０：コード変換装置、１１：変換処理対象コード、１２：機械語コード、１５：第１の着目手段、１６：第２の着目手段、１７：第１の検出手段、１８：第２の検出手段、１９：第１の計算手段、２０：第２の計算手段、２１：判定手段、２３：第１の機械語コード部分生成手段、２４：第２の機械語コード部分生成手段、２６：グラフ生成手段、２８：アドレス記録手段２８、３１：予測手段、５５：Ｊａｖａ仮想計算機、５７：ＪＩＴコンパイラ、５８：情報収集手段、５９：変換手段。