(57)【要約】【課題】特殊なハードウェアを設けなくても曖昧なメモリ依存を緩和することができるプログラムに書き換える。【解決手段】入力プログラムを、実行可否フラグに基づいて処理の実行可否を制御可能なプロセッサ向けのプログラムに書き換えるプログラム書き換え方法であって、第１のメモリアクセス処理がアクセスするメモリのアドレス情報である第１のアドレス情報と、第２のメモリアクセス処理がアクセスするメモリのアドレス情報である第２のアドレス情報とを比較し、比較結果を実行可否フラグに書き込む比較処理を、入力プログラムに挿入する比較処理挿入ステップ（Ｓ３３）と、実行可否フラグの値に基づいて実行される処理であり、かつ、入力プログラムの実行時と同じ処理結果を保証するための処理である実行可否フラグ付きの論理保証処理を、入力プログラムに挿入する論理保証処理挿入ステップ（Ｓ３４）とを含む。【選択図】図７
2008293378.tif 000002
【特許請求の範囲】
【請求項１】
入力プログラムを、実行可否フラグに基づいて処理の実行可否を制御可能なプロセッサ向けのプログラムに書き換えるプログラム書き換え装置であって、
前記入力プログラムに含まれる第１のメモリアクセス処理がアクセスするメモリのアドレス情報である第１のアドレス情報と、前記入力プログラムに含まれる第２のメモリアクセス処理がアクセスするメモリのアドレス情報である第２のアドレス情報とを比較し、比較結果を実行可否フラグに書き込む比較処理を、前記入力プログラムに挿入する比較処理挿入手段と、
前記実行可否フラグの値に基づいて実行される処理であり、かつ、前記入力プログラムの実行時と同じ処理結果を保証するための処理である実行可否フラグ付きの論理保証処理を、前記入力プログラムに挿入する論理保証処理挿入手段と
を備えるプログラム書き換え装置。
【請求項２】
前記第１のメモリアクセス処理は、メモリにデータの書き込みを行なうストア処理であり、
前記第２のメモリアクセス処理は、メモリからデータの読み込みを行なうロード処理である
請求項１に記載のプログラム書き換え装置。
【請求項３】
さらに、
前記入力プログラムの中からクリティカルパスとなる処理を検出するクリティカルパス検出手段と、
前記クリティカルパス検出手段により検出されたクリティカルパスに前記第１のメモリアクセス処理と前記第２のメモリアクセス処理とが含まれるか否かを判断し、前記第１のメモリアクセス処理と前記第２のメモリアクセス処理とが含まれる場合には、前記第１のメモリアクセス処理と前記第２のメモリアクセス処理との間に曖昧な真のメモリ依存関係があるか否かを解析する曖昧なメモリ依存解析手段とを備え、
前記比較処理挿入手段は、前記曖昧なメモリ依存解析手段において曖昧な真のメモリ依存関係にあると判断された前記第１のメモリアクセス処理および前記第２のメモリアクセス処理を対象として、前記比較処理を挿入する
請求項２に記載のプログラム書き換え装置。
【請求項４】
さらに、前記曖昧なメモリ依存解析手段において曖昧な真のメモリ依存関係にあると判断された第１のメモリアクセス処理と前記第２のメモリアクセス処理との実行順序を変更する実行順序変更手段を備える
請求項３に記載のプログラム書き換え装置。
【請求項５】
さらに、前記第１のメモリアクセス処理が１回にアクセスするデータのサイズと前記第２のメモリアクセス処理が１回にアクセスするデータのサイズとが等しいという条件を満たすか否かを判断するデータサイズ比較手段を備え、
前記論理保証処理挿入手段は、前記データサイズ比較手段において前記条件を満たすと判断された場合には、前記第２のメモリアクセス処理がメモリより読み込んだ値を、前記第１のメモリアクセス処理がメモリに書き込む値で上書きする処理を、前記論理保証処理として、前記入力プログラムに挿入する
請求項４に記載のプログラム書き換え装置。
【請求項６】
前記比較処理挿入手段は、実行順序として前記論理保証処理よりも前の一箇所に、前記比較処理を挿入する
請求項５に記載のプログラム書き換え装置。
【請求項７】
さらに、前記第１および第２のメモリアクセス処理が連続し、かつ各メモリアクセス処理においてアクセスされるメモリのアドレスが規則的に更新されるという条件を満たすか否かを判断する規則性判断手段を備え、
前記比較処理挿入手段は、前記規則性判断手段において前記条件を満たすと判断された場合には、実行順序として前記第１および第２のメモリアクセス処理に対する先頭の前記論理保証処理よりも前の位置に、前記比較処理を挿入する
請求項５に記載のプログラム書き換え装置。
【請求項８】
さらに、前記第１および第２のメモリアクセス処理が繰り返し実行され、かつ各メモリアクセス処理においてアクセスされるメモリのアドレスが規則的に更新されるという条件を満たすか否かを判断する規則性判断手段を備え、
前記比較処理挿入手段は、前記規則性判断手段において前記条件を満たすと判断された場合には、実行順序として前記第１および第２のメモリアクセス処理の繰り返しよりも前の位置に、前記比較処理を挿入する
請求項５に記載のプログラム書き換え装置。
【請求項９】
さらに、前記第１のメモリアクセス処理が１回にアクセスするデータのサイズよりも前記第２のメモリアクセス処理が１回にアクセスするデータのサイズが小さいという条件を満たすか否かを判断するデータサイズ比較手段を備え、
前記論理保証処理挿入手段は、前記データサイズ比較手段において前記条件を満たすと判断された場合には、前記第２のメモリアクセス処理がメモリより読み込んだ値を、前記第１のメモリアクセス処理がメモリに書き込む値の一部で上書きする処理を、前記論理保証処理として、前記入力プログラムに挿入する
請求項４に記載のプログラム書き換え装置。
【請求項１０】
さらに、前記第１のメモリアクセス処理が１回にアクセスするデータのサイズよりも前記第２のメモリアクセス処理が１回にアクセスするデータのサイズが大きいという条件を満たすか否かを判断するデータサイズ比較手段を備え、
前記論理保証処理挿入手段は、前記データサイズ比較手段において前記条件を満たすと判断された場合には、前記第２のメモリアクセス処理がメモリより読み込んだ値の一部を、前記第１のメモリアクセス処理がメモリに書き込む値で上書きする処理を、前記論理保証処理として、前記入力プログラムに挿入する
請求項４に記載のプログラム書き換え装置。
【請求項１１】
さらに、最適化に関する最適化指示情報を受け取る最適化指定情報付加手段を備え、
前記比較処理挿入手段および前記論理保証処理挿入手段は、前記最適化指定情報付加手段が受け取った前記最適化指示情報に基づいて、選択的に動作する
請求項１〜１０のいずれか１項に記載のプログラム書き換え装置。
【請求項１２】
前記最適化指定情報付加手段は、曖昧なメモリ依存緩和の実施抑制に関する最適化指示情報を受け取り、
前記比較処理挿入手段が前記曖昧なメモリ依存緩和の実施抑制に関する最適化指示情報を受け取った場合には、前記比較処理挿入手段および前記論理保証処理挿入手段は動作しない
請求項１１に記載のプログラム書き換え装置。
【請求項１３】
前記最適化指定情報付加手段は、曖昧なメモリ依存緩和対象のメモリアクセス処理を特定するシンボル情報を受け取り、
前記比較処理挿入手段は、前記最適化指定情報付加手段が受け取ったシンボル情報で特定されるメモリアクセス処理を対象として、前記比較処理を挿入する
請求項１１に記載のプログラム書き換え装置。
【請求項１４】
入力プログラムを、実行可否フラグに基づいて処理の実行可否を制御可能なプロセッサ向けのプログラムに書き換えるプログラム書き換え方法であって、
前記入力プログラムに含まれる第１のメモリアクセス処理がアクセスするメモリのアドレス情報である第１のアドレス情報と、前記入力プログラムに含まれる第２のメモリアクセス処理がアクセスするメモリのアドレス情報である第２のアドレス情報とを比較し、比較結果を実行可否フラグに書き込む比較処理を、前記入力プログラムに挿入する比較処理挿入ステップと、
前記実行可否フラグの値に基づいて実行される処理であり、かつ、前記入力プログラムの実行時と同じ処理結果を保証するための処理である実行可否フラグ付きの論理保証処理を、前記入力プログラムに挿入する論理保証処理挿入ステップと
を含むプログラム書き換え方法。
【請求項１５】
前記第１のメモリアクセス処理は、メモリにデータの書き込みを行なうストア処理であり、
前記第２のメモリアクセス処理は、メモリからデータの読み込みを行なうロード処理である
請求項１４に記載のプログラム書き換え方法。
【請求項１６】
さらに、
前記入力プログラムの中からクリティカルパスとなる処理を検出するクリティカルパス検出ステップと、
前記クリティカルパス検出ステップにおいて検出されたクリティカルパスに前記第１のメモリアクセス処理と前記第２のメモリアクセス処理とが含まれるか否かを判断し、前記第１のメモリアクセス処理と前記第２のメモリアクセス処理とが含まれる場合には、前記第１のメモリアクセス処理と前記第２のメモリアクセス処理との間に曖昧な真のメモリ依存関係があるか否かを解析する曖昧なメモリ依存解析ステップとを含み、
前記比較処理挿入ステップでは、前記曖昧なメモリ依存解析ステップにおいて曖昧な真のメモリ依存関係にあると判断された前記第１のメモリアクセス処理および前記第２のメモリアクセス処理を対象として、前記比較処理を挿入する
請求項１５に記載のプログラム書き換え方法。
【請求項１７】
さらに、前記曖昧なメモリ依存解析ステップにおいて曖昧な真のメモリ依存関係にあると判断された第１のメモリアクセス処理と前記第２のメモリアクセス処理との実行順序を変更する実行順序変更ステップを含む
請求項１６に記載のプログラム書き換え方法。
【請求項１８】
さらに、前記第１のメモリアクセス処理が１回にアクセスするデータのサイズと前記第２のメモリアクセス処理が１回にアクセスするデータのサイズとが等しいという条件を満たすか否かを判断するデータサイズ比較ステップを含み、
前記論理保証処理挿入ステップでは、前記データサイズ比較ステップにおいて前記条件を満たすと判断された場合には、前記第２のメモリアクセス処理がメモリより読み込んだ値を、前記第１のメモリアクセス処理がメモリに書き込む値で上書きする処理を、前記論理保証処理として、前記入力プログラムに挿入する
請求項１７に記載のプログラム書き換え方法。
【請求項１９】
前記比較処理挿入ステップでは、実行順序として前記論理保証処理よりも前の位置に、前記比較処理を挿入する
請求項１８に記載のプログラム書き換え方法。
【請求項２０】
入力プログラムを、実行可否フラグに基づいて処理の実行可否を制御可能なプロセッサ向けのプログラムに書き換えるプログラムであって、
前記入力プログラムに含まれる第１のメモリアクセス処理がアクセスするメモリのアドレス情報である第１のアドレス情報と、前記入力プログラムに含まれる第２のメモリアクセス処理がアクセスするメモリのアドレス情報である第２のアドレス情報とを比較し、比較結果を実行可否フラグに書き込む比較処理を、前記入力プログラムに挿入する比較処理挿入ステップと、
前記実行可否フラグの値に基づいて実行される処理であり、かつ、前記入力プログラムの実行時と同じ処理結果を保証するための処理である実行可否フラグ付きの論理保証処理を、前記入力プログラムに挿入する論理保証処理挿入ステップと
をコンピュータに実行させるためのプログラム。
【請求項２１】
前記第１のメモリアクセス処理は、メモリにデータの書き込みを行なうストア処理であり、
前記第２のメモリアクセス処理は、メモリからデータの読み込みを行なうロード処理である
請求項２０に記載のプログラム。
【請求項２２】
さらに、
前記入力プログラムの中からクリティカルパスとなる処理を検出するクリティカルパス検出ステップと、
前記クリティカルパス検出ステップにおいて検出されたクリティカルパスに前記第１のメモリアクセス処理と前記第２のメモリアクセス処理とが含まれるか否かを判断し、前記第１のメモリアクセス処理と前記第２のメモリアクセス処理とが含まれる場合には、前記第１のメモリアクセス処理と前記第２のメモリアクセス処理との間に曖昧な真のメモリ依存関係があるか否かを解析する曖昧なメモリ依存解析ステップとをコンピュータに実行させ、
前記比較処理挿入ステップでは、前記曖昧なメモリ依存解析ステップにおいて曖昧な真のメモリ依存関係にあると判断された前記第１のメモリアクセス処理および前記第２のメモリアクセス処理を対象として、前記比較処理を挿入する
請求項２１に記載のプログラム。
【請求項２３】
さらに、前記曖昧なメモリ依存解析ステップにおいて曖昧な真のメモリ依存関係にあると判断された第１のメモリアクセス処理と前記第２のメモリアクセス処理との実行順序を変更する実行順序変更ステップをコンピュータに実行させる
請求項２２に記載のプログラム。
【請求項２４】
さらに、前記第１のメモリアクセス処理が１回にアクセスするデータのサイズと前記第２のメモリアクセス処理が１回にアクセスするデータのサイズとが等しいという条件を満たすか否かを判断するデータサイズ比較ステップをコンピュータに実行させ、
前記論理保証処理挿入ステップでは、前記データサイズ比較ステップにおいて前記条件を満たすと判断された場合には、前記第２のメモリアクセス処理がメモリより読み込んだ値を、前記第１のメモリアクセス処理がメモリに書き込む値で上書きする処理を、前記論理保証処理として、前記入力プログラムに挿入する
請求項２３に記載のプログラム。
【請求項２５】
前記比較処理挿入ステップでは、実行順序として前記論理保証処理よりも前の位置に、前記比較処理を挿入する
請求項２４に記載のプログラム。
【請求項２６】
入力プログラムを、実行可否フラグに基づいて処理の実行可否を制御可能なプロセッサ向けのプログラムに書き換えるプログラムを記録したコンピュータ読取可能な記録媒体であって、
前記入力プログラムに含まれる第１のメモリアクセス処理がアクセスするメモリのアドレス情報である第１のアドレス情報と、前記入力プログラムに含まれる第２のメモリアクセス処理がアクセスするメモリのアドレス情報である第２のアドレス情報とを比較し、比較結果を実行可否フラグに書き込む比較処理を、前記入力プログラムに挿入する比較処理挿入ステップと、
前記実行可否フラグの値に基づいて実行される処理であり、かつ、前記入力プログラムの実行時と同じ処理結果を保証するための処理である実行可否フラグ付きの論理保証処理を、前記入力プログラムに挿入する論理保証処理挿入ステップと
をコンピュータに実行させるためのプログラムを記録したコンピュータ読取可能な記録媒体。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、特にメモリアクセス命令を含む命令列の依存緩和を行なうプログラム書き換え装置に関する。
【背景技術】
【０００２】
近年、プロセッサの処理速度は急激に向上しているが、それに比べてメインメモリのアクセス速度向上は小さく、両者の速度差は年々大きくなっている。このため、プロセッサを有する情報処理装置により高速に情報処理を行なう際には、メモリアクセスがボトルネックとなることが従来指摘されている。
【０００３】
この問題を解消するために、メインメモリのメモリ領域に記憶されているデータ取得にペナルティサイクルが必要となるロード命令をできるだけ他命令よりも先行させて実行し、そのペナルティサイクル期間に他の命令を実行させるように命令をスケジューリングする方法が知られている。これにより、メモリアクセスによるペナルティの影響を他命令の実行サイクルで隠蔽することができ、性能劣化を抑えることが可能である。
【０００４】
しかし、静的な命令スケジューリングでは、ほとんどの場合、メモリアクセス命令のメモリアクセスアドレス値が動的に変化する。このため、メモリアクセス命令間に生じるメモリ依存を想定しなければならない。これは、曖昧なメモリ依存として知られている。その結果、静的な命令スケジューリングでは、ロード命令を他のメモリアクセス命令よりも先行させることが不可能となり、メモリアクセス命令によるペナルティサイクルの隠蔽が困難になり、プロセッサの性能を活かすことができない。
【０００５】
したがって、従来、このような曖昧なメモリ依存を有するメモリアクセス命令に対して命令スケジューリングを実施するには、特殊な命令を実行するハードウェアをプロセッサが持たなければ、メモリ領域に対するストア命令より前にロード命令を移動させることができなかった。
【０００６】
この曖昧なメモリ依存を考慮した特殊な命令として、投機的ロード命令が挙げられる（例えば、特許文献１参照。）。投機的ロード命令とは、以下のような処理を実行する命令である。つまり、ロード命令によりアクセスされるメモリ領域のアドレスをハードウェアの特別な記憶装置に記憶しておき、当該アドレスに記憶されているメモリデータをレジスタに設定する。その後、ストア命令が実行されたときに、レジスタに記憶されているデータをメモリ領域に設定し、ストア命令よりアクセスされるメモリ領域のアドレスと上記特別な記憶装置に記憶されていた投機的ロード命令のアドレスとの間で干渉が生じる場合には、投機的ロード命令で設定されたレジスタにストア命令がストアするデータを上書きすることで、論理等価性を保つものである。
【０００７】
図１６および図１７を用いて、投機的ロード命令について具体的に説明する。
例えば、通常のメモリアクセス命令のみを実行するプロセッサについて考える。図１６は、ソースプログラムの一例を示す図である。図１７（ａ）は、図１６に示したソースプログラムと等価で、かつ投機的ロード命令がないアセンブラファイルの一例を示す図である。このようなプロセッサで図１６に示すようなメモリアクセス処理を実行するためには、曖昧なメモリ依存を考慮して、図１７（ａ）に示すように忠実にメモリアクセス順を守ったアセンブラファイルを作成しなければならない。
【０００８】
一方、図１７（ｂ）は、図１６に示したソースプログラムと等価で、かつ投機的ロード命令を含むアセンブラファイルの一例を示す図である。このように、投機的ロード命令を活用することで、図１６に示すメモリアクセス順を必ずしも守る必要がなくなる。すなわち、ロード命令をストア命令より先行させて実行することができる。これにより、メモリ参照によるペナルティサイクルを他の命令で隠蔽することができ、結果として性能が向上する。
【特許文献１】特許第３７６２５９７号公報（２３頁、図６）
【発明の開示】
【発明が解決しようとする課題】
【０００９】
しかしながら、このような投機実行的命令を実行させるためには、特殊なハードウェアをプロセッサに設けなければならないという問題がある。
【００１０】
本発明は、上述の課題を解決するためになされたものであり、特殊なハードウェアを設けなくても曖昧なメモリ依存を緩和することができるプログラム書き換え装置を提供することを目的とする。
【課題を解決するための手段】
【００１１】
上記目的を達成するために、本発明に係るプログラム書き換え装置は、入力プログラムを、実行可否フラグに基づいて処理の実行可否を制御可能なプロセッサ向けのプログラムに書き換えるプログラム書き換え装置であって、前記入力プログラムに含まれる第１のメモリアクセス処理がアクセスするメモリのアドレス情報である第１のアドレス情報と、前記入力プログラムに含まれる第２のメモリアクセス処理がアクセスするメモリのアドレス情報である第２のアドレス情報とを比較し、比較結果を実行可否フラグに書き込む比較処理を、前記入力プログラムに挿入する比較処理挿入手段と、前記実行可否フラグの値に基づいて実行される処理であり、かつ、前記入力プログラムの実行時と同じ処理結果を保証するための処理である実行可否フラグ付きの論理保証処理を、前記入力プログラムに挿入する論理保証処理挿入手段とを備える。
【００１２】
メモリアクセス処理の論理保証をするための論理保証処理を実行可否フラグに基づいて選択的に実行するようにしている。このため、特殊なハードウェアを設けなくても、曖昧なメモリ依存を緩和することができる。よって、プロセッサが備えるメモリアクセス命令を静的に効率良く命令スケジューリングでき、プログラム実行時の処理速度を向上させることができる。また、ハードウェア利用効率も向上する。
【００１３】
好ましくは、前記第１のメモリアクセス処理は、メモリにデータの書き込みを行なうストア処理であり、前記第２のメモリアクセス処理は、メモリからデータの読み込みを行なうロード処理である。
【００１４】
これによって、プロセッサが備えるキャッシュメモリや外部メモリ空間にアクセスするロード命令やストア命令に対して、静的に効率良く命令スケジューリングでき、プログラム実行時の処理速度を向上させることができる。また、ハードウェア利用効率も向上する。
【００１５】
さらに好ましくは、上述のプログラム書き換え装置は、さらに、前記入力プログラムの中からクリティカルパスとなる処理を検出するクリティカルパス検出手段と、前記クリティカルパス検出手段により検出されたクリティカルパスに前記第１のメモリアクセス処理と前記第２のメモリアクセス処理とが含まれるか否かを判断し、前記第１のメモリアクセス処理と前記第２のメモリアクセス処理とが含まれる場合には、前記第１のメモリアクセス処理と前記第２のメモリアクセス処理との間に曖昧な真のメモリ依存関係があるか否かを解析する曖昧なメモリ依存解析手段とを備え、前記比較処理挿入手段は、前記曖昧なメモリ依存解析手段において曖昧な真のメモリ依存関係にあると判断された前記第１のメモリアクセス処理および前記第２のメモリアクセス処理を対象として、前記比較処理を挿入する。
【００１６】
これによって、クリティカルパス上の曖昧なメモリ依存関係にある命令間にのみに対して自動的に依存を緩和させることができ、効率よくクリティカルパスを短縮させ、命令スケジューリングでき、プログラム実行時の処理速度を向上させることができる。また、ハードウェア利用効率も向上する。
【００１７】
さらに好ましくは、上述のプログラム書き換え装置は、さらに、前記曖昧なメモリ依存解析手段において曖昧な真のメモリ依存関係にあると判断された第１のメモリアクセス処理と前記第２のメモリアクセス処理との実行順序を変更する実行順序変更手段を備える。
【００１８】
これによって、レイテンシの長い命令を先行配置させることができ、プログラム実行時の処理速度を向上させることができる。またハードウェア利用効率も向上する。
【００１９】
さらに好ましくは、上述のプログラム書き換え装置は、さらに、前記第１のメモリアクセス処理が１回にアクセスするデータのサイズと前記第２のメモリアクセス処理が１回にアクセスするデータのサイズとが等しいという条件を満たすか否かを判断するデータサイズ比較手段を備え、前記論理保証処理挿入手段は、前記データサイズ比較手段において前記条件を満たすと判断された場合には、前記第２のメモリアクセス処理がメモリより読み込んだ値を、前記第１のメモリアクセス処理がメモリに書き込む値で上書きする処理を、前記論理保証処理として、前記入力プログラムに挿入する。
【００２０】
さらに好ましくは、前記比較処理挿入手段は、実行順序として前記論理保証処理よりも前の一箇所に、前記比較処理を挿入する。
【００２１】
これによって、アドレス比較処理がメモリアクセス処理直前に一度のみの一致判定で実現でき、プログラム実行時の処理速度を向上させることができる。
【００２２】
さらに好ましくは、上述のプログラム書き換え装置は、さらに、前記第１および第２のメモリアクセス処理が繰り返し実行され、かつ各メモリアクセス処理においてアクセスされるメモリのアドレスが規則的に更新されるという条件を満たすか否かを判断する規則性判断手段を備え、前記比較処理挿入手段は、前記規則性判断手段において前記条件を満たすと判断された場合には、実行順序として前記第１および第２のメモリアクセス処理の繰り返しよりも前の位置に、前記比較処理を挿入する。
【００２３】
または、上述のプログラム書き換え装置は、さらに、前記第１のメモリアクセス処理が１回にアクセスするデータのサイズよりも前記第２のメモリアクセス処理が１回にアクセスするデータのサイズが小さいという条件を満たすか否かを判断するデータサイズ比較手段を備え、前記論理保証処理挿入手段は、前記データサイズ比較手段において前記条件を満たすと判断された場合には、前記第２のメモリアクセス処理がメモリより読み込んだ値を、前記第１のメモリアクセス処理がメモリに書き込む値の一部で上書きする処理を、前記論理保証処理として、前記入力プログラムに挿入する。
【００２４】
これによって、オブジェクトサイズが異なるメモリアクセス処理の曖昧なメモリ依存であっても、メモリ依存を緩和することができ、プログラム実行時の処理速度を向上させることができる。
【００２５】
さらに好ましくは、上述のプログラム書き換え装置は、さらに、最適化に関する最適化指示情報を受け取る最適化指定情報付加手段を備え、前記比較処理挿入手段および前記論理保証処理挿入手段は、前記最適化指定情報付加手段が受け取った前記最適化指示情報に基づいて、選択的に動作する。
【００２６】
これによって、プログラマは、メモリアクセス命令に対するスケジューリングに対するコードサイズと実行性能とのトレードオフを考慮しながらプログラミングをすることができる。
【００２７】
なお、本発明は、このような特徴的な手段を備えるプログラム書き換え装置として実現することができるだけでなく、プログラム書き換え装置に含まれる特徴的な手段をステップとするプログラム書き換え方法として実現したり、プログラム書き換え方法に含まれる特徴的なステップをコンピュータに実行させるプログラムとして実現したりすることもできる。そして、そのようなプログラムは、ＣＤ−ＲＯＭ（Compact Disc-Read Only Memory）等の記録媒体やインターネット等の通信ネットワークを介して流通させることができるのは言うまでもない。
【発明の効果】
【００２８】
本発明によると、特殊なハードウェアを設けなくても曖昧なメモリ依存を緩和することができる。また、曖昧なメモリ依存にある命令に対して静的に効率の良いスケジューリングが可能となり、プログラム実行時の処理速度を向上させることができる。さらに、ハードウェア利用効率も向上する。
【発明を実施するための最良の形態】
【００２９】
［システム構成］
図１は、本発明の実施の形態に係るコンパイラシステムの外観構成を示す図である。コンパイラシステムは、同図に示すようなコンピュータ上で各種プログラムを実行することにより実現される。
【００３０】
図２は、本発明の実施の形態に係るコンパイラシステムの構成を示す図である。
コンパイラシステム１００は、Ｃ言語等の高級言語で記述されたソースプログラム２００を機械語で記述された実行プログラム２３０に変換するソフトウェアシステムであり、コンパイラ１１０と、アセンブラ１２０と、リンカ１３０とを含む。
【００３１】
コンパイラ１１０は、命令の実行可否を制御可能とする実行可否フラグレジスタを有するＣＰＵ（Ｃｅｎｔｒａｌ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ）をターゲットプロセッサとし、ソースプログラム２００をアセンブラ言語で記述されたアセンブラファイル２１０に変換するプログラムである。コンパイラ１１０は、ソースプログラム２００をアセンブラファイル２１０に変換する際に、ソースプログラム２００を解析して得られた処理内でクリティカルパス処理に関して曖昧なメモリ依存を緩和するメモリ依存緩和最適化部と命令スケジューリング最適化部とで最適化処理を行い、アセンブラファイル２１０を出力する。
【００３２】
アセンブラ１２０は、アセンブラ言語で記述されたアセンブラファイル２１０を機械語で記述されたオブジェクトファイル２２０に変換するプログラムである。リンカ１３０は、複数のオブジェクトファイル２２０を結合し、実行プログラム２３０を生成するプログラムである。
【００３３】
実行プログラム２３０の開発ツールとして、シミュレータ１４０およびプロファイラ１５０が用意されている。シミュレータ１４０は、実行プログラム２３０をシミュレートし、実行時の各種実行ログデータ２４０を出力するプログラムである。プロファイラ１５０は実行ログデータ２４０を解析し、プログラムの実行順序等を解析したプロファイルデータ２５０を出力するプログラムである。
【００３４】
これらの各種プログラムをコンピュータ上で実行することにより、ソースプログラム２００から実行プログラム２３０が作成される。
【００３５】
［コンパイラの構成］
図３は、コンパイラ１１０の構成を示す図である。
【００３６】
コンパイラ１１０は、構文解析部１１１と、最適化情報解析部１１２と、一般最適化部１１３と、曖昧なメモリ依存緩和最適化部１１４と、命令スケジューリング部１１５と、コード出力部１１６とを含む。各構成処理部は、コンピュータ上で実行されるプログラムとして実現される。
【００３７】
構文解析部１１１は、ソースプログラム２００を入力として受け、ソースプログラム２００の構文解析処理を行った後、中間言語のプログラム（中間コード）を出力する処理部である。
【００３８】
最適化情報解析部１１２は、キャッシュパラメータ２０１、プロファイルデータ２５０、コンパイルオプションおよびプラグマなどの中間コードの最適化処理に必要な情報を読み込み、解析する処理部である。コンパイルオプションおよびプラグマはいずれもコンパイラ１１０に対する指示である。
【００３９】
一般最適化部１１３は、中間コードに一般的な最適化処理を施す処理部である。
曖昧なメモリ依存緩和最適化部１１４は、クリティカルパス上の曖昧なメモリ依存を緩和する処理部である。
【００４０】
命令スケジューリング部１１５は、命令の並びを最適化し、命令スケジューリングを行う処理部である。
【００４１】
コード出力部１１６は、最適化された中間コードをアセンブラ言語に変換してアセンブラファイル２１０を出力する処理部である。
【００４２】
［処理の流れ］
次に、コンパイラ１１０の実行する処理の流れについて説明する。図４は、コンパイラ１１０が実行する処理のフローチャートである。
【００４３】
構文解析部１１１は、ソースプログラム２００の構文解析を行い、中間コードを生成する（Ｓ１）。最適化情報解析部１１２は、キャッシュパラメータ２０１、プロファイルデータ２５０、コンパイルオプションおよびプラグマなどを解析する（Ｓ２）。一般最適化部１１３は、最適化情報解析部１１２における解析結果に従い、一般的な中間コードの最適化を行う（Ｓ３）。曖昧なメモリ依存緩和最適化部１１４は、中間コードのクリティカルパス上の曖昧なメモリ依存を有するメモリアクセス処理に着目し、必要であれば、補正処理を挿入し、曖昧なメモリ依存の緩和を行う（Ｓ４）。命令スケジューリング部１１５は、命令のスケジューリングを行う（Ｓ５）。コード出力部１１６は、中間コードをアセンブラコードに変換し、アセンブラファイル２１０として出力する（Ｓ６）。
【００４４】
構文解析処理（Ｓ１）、最適化情報解析処理（Ｓ２）、一般的な最適化処理（Ｓ３）、命令スケジューリング処理（Ｓ５）およびアセンブラコード出力処理（Ｓ６）は、一般的な処理と同様であるため、その詳細な説明はここでは繰返さない。
【００４５】
以下、曖昧なメモリ依存緩和最適化処理（Ｓ４）について詳細に説明する。
図５は、曖昧なメモリ依存緩和最適化処理（図４のＳ４）の詳細を説明するためのフローチャートである。
【００４６】
曖昧なメモリ依存緩和最適化部１１４は、コンパイルオプションまたはプラグマ指令などによる最適化指示がある場合に実施する。最適化指示がある場合（Ｓ９でＹＥＳ）、曖昧なメモリ依存緩和最適化部１１４は、中間コードを入力として、クリティカルパスを検出する（Ｓ１０）。最適化指示がない場合（Ｓ９でＮＯ）、処理を終了する。クリティカルパスの検出処理は、一般的な処理と同様であるため、その詳細はここでは繰返さない。クリティカルパスとは、資源（レジスタ、メモリ、外部ポート等）に対して定義・参照する（可能性がある＜これを曖昧な依存と呼ぶ＞）ことで生じる依存で結ばれる命令列のうちで、最長の実行時間がかかる命令列をいう。一般的に、これをノードとエッジと呼ばれる要素から構成されるＤＡＧ（Directed Acyclic Graph）と呼ばれる依存グラフを用いて求める。このとき、命令をノード、依存をエッジ、依存距離（命令間の実行時間）をエッジ距離として一般的なグラフ理論に基づいてクリティカルパスを求めることができる。
【００４７】
曖昧なメモリ依存緩和最適化部１１４は、検出したクリティカルパス中において、曖昧なメモリ依存関係にある論理的に連続するメモリアクセス処理を検出する（Ｓ１１）。曖昧なメモリ依存検出処理（Ｓ１１）については後に詳述する。
【００４８】
最適化対象となる曖昧なメモリ依存関係にある論理的に連続するメモリアクセス処理が存在しない場合（Ｓ１２でＮＯ）、処理を終了する。
【００４９】
最適化対象のメモリアクセス処理が存在する場合（Ｓ１２でＹＥＳ）、曖昧なメモリ依存緩和最適化部１１４は、検出したメモリアクセス処理に対して曖昧なメモリ依存を緩和する（Ｓ１３）。依存緩和処理（Ｓ１３）については、後に詳述する。
【００５０】
曖昧なメモリ依存緩和最適化部１１４は、曖昧なメモリ依存緩和が実施できたか否かを判定し（Ｓ１４）、実施できなければ（Ｓ１４でＮＯ）、メモリアクセス処理に後続する処理に対して、曖昧なメモリ依存検出処理（Ｓ１１）以下の処理を繰り返す。
【００５１】
曖昧なメモリ依存緩和が実施できた場合（Ｓ１４でＹＥＳ）、曖昧なメモリ依存緩和最適化部１１４は、曖昧なメモリ依存を緩和した処理に対して、再度クリティカルパスを検出する（Ｓ１５）。曖昧なメモリ依存緩和最適化部１１４は、再検出したクリティカルパスと、処理前のクリティカルパスとの全長を比較し、最適化適用後に短縮されるかを判定する（Ｓ１６）。
【００５２】
クリティカルパス長が短縮されていると判定された場合（Ｓ１６でＹＥＳ）、曖昧なメモリ依存緩和最適化部１１４は、短縮されたクリティカルパスに対して曖昧なメモリ依存を緩和するための処理を再帰的に繰り返す（Ｓ１１）。
【００５３】
クリティカルパス長が短縮されていないか、またはクリティカルパス長が同じ場合（Ｓ１６でＮＯ）、曖昧なメモリ依存緩和最適化部１１４は、直前に実施された依存緩和処理を削除する（Ｓ１７）。すなわち、直前に実施された依存緩和処理は（Ｓ１３）実施されなかったものとする。その後、曖昧なメモリ依存緩和最適化部１１４は、メモリアクセス処理に後続する処理に対して曖昧なメモリ依存検出処理（Ｓ１１）以下の処理を繰り返す。
【００５４】
以下、曖昧なメモリ依存検出処理（Ｓ１１）および依存緩和処理（Ｓ１３）について詳細に説明する。
【００５５】
図６は曖昧なメモリ依存検出処理（図５のＳ１１）の詳細なフローチャートである。
曖昧なメモリ依存緩和最適化部１１４は、クリティカルパス検出処理（図５のＳ１０）において検出されたクリティカルパスに対して、命令を先頭から順に選択しながら、以下の処理を繰り返す（Ｓ２０）。
【００５６】
曖昧なメモリ依存緩和最適化部１１４は、選択した処理がメモリアクセス処理であり、かつ当該メモリアクセス処理の後続処理の中に、当該メモリアクセス処理に対して曖昧なメモリ依存関係のみにある処理が存在するか否かを判断する（Ｓ２１）。
【００５７】
選択した処理がメモリアクセス処理ではないか、または、選択した処理がメモリアクセス処理であるが、当該メモリアクセス処理の後続処理の中に、当該メモリアクセス処理に対して曖昧なメモリ依存関係のみにある処理が存在しない場合には（Ｓ２１でＮＯ）、曖昧なメモリ依存緩和最適化部１１４は、次の処理を選択し（Ｓ２０）、同様の判断を行なう（Ｓ２１）。
【００５８】
選択した処理がメモリアクセス処理であり、かつ当該メモリアクセス処理の後続処理の中に、当該メモリアクセス処理に対して曖昧なメモリ依存関係のみにある処理が存在する場合には（Ｓ２１でＹＥＳ）、曖昧なメモリ依存緩和最適化部１１４は、最適化対象のアドレス変数名が、プラグマまたはコンパイルオプションにより指定されているか否かを判定する（Ｓ２２）。
【００５９】
最適化対象のアドレス変数名が指定されている場合（Ｓ２２でＹＥＳ）、曖昧なメモリ依存緩和最適化部１１４は、最適化対象のメモリアクセス処理のアドレス変数名と指定された変数名とが一致するか否かを判定する（Ｓ２３）。変数名が一致しない場合（Ｓ２３でＮＯ）、曖昧なメモリ依存緩和最適化部１１４は、次の処理を選択し（Ｓ２０）、Ｓ２１以降の処理を繰り返す。
【００６０】
変数名が一致する場合（Ｓ２３でＹＥＳ）、または最適化対象のアドレス変数名が指定されていない場合（Ｓ２２でＮＯ）、曖昧なメモリ依存緩和最適化部１１４は、ターゲットプロセッサの実行可否フラグレジスタ資源を使用可能か否かを判定する（Ｓ２４）。実行可否フラグレジスタ資源が使用できるか否かの判定は、一般的なレジスタ割り付け最適化で用いる生存区間解析などを用いることで可能であるため、その詳細な説明はここでは繰り返さない。
【００６１】
曖昧なメモリ依存関係にあるメモリアクセス処理間で使用できる実行可否フラグレジスタ資源が存在しない場合には（Ｓ２４でＮＯ）、次の処理を選択し（Ｓ２０）、Ｓ２０以降の処理を繰り返す。
【００６２】
使用できる実行可否フラグレジスタ資源が存在する場合には（Ｓ２４でＹＥＳ）、曖昧なメモリ依存緩和最適化部１１４は、曖昧なメモリ依存関係にあるメモリアクセス処理に含まれるメモリ参照命令をメモリ代入命令の前に移動可能か否かを判定する（Ｓ２５）。つまり、曖昧なメモリ依存緩和最適化部１１４は、メモリ代入命令と依存する命令が、メモリ参照命令とメモリ代入命令との間に存在するかを解析し、依存する命令が無ければメモリ参照命令を移動可能であると判断し、依存する命令が存在すればメモリ参照命令を移動不可能と判断する。移動不可能な場合（Ｓ２５でＮＯ）、曖昧なメモリ依存緩和最適化部１１４は、次の処理を選択し（Ｓ２０）、Ｓ２１以降の処理を繰り返す。
【００６３】
メモリ参照命令を移動可能な場合には（Ｓ２５でＹＥＳ）、曖昧なメモリ依存緩和最適化部１１４は、Ｓ２１で検出された曖昧なメモリ依存関係にあるメモリアクセス処理を最適化の対象としてリターンする（Ｓ２６）。すべての処理を探索し終わっても、最適化の対象となるメモリアクセス処理が存在していなければ、探索ループ（Ｓ２０）を終了し、曖昧なメモリ依存処理検出を終了する。
【００６４】
図７は依存緩和処理（図５のＳ１３）の詳細なフローチャートである。
曖昧なメモリ依存緩和最適化部１１４は、曖昧なメモリ依存検出処理（図５のＳ１１、図６）で検出されたメモリアクセス処理が、曖昧な真のメモリ依存にあるか否かを判定する（Ｓ３０）。
【００６５】
曖昧な真のメモリ依存になければ（Ｓ３０でＮＯ）処理を終了する。曖昧な真のメモリ依存にあれば（Ｓ３０でＹＥＳ）、曖昧なメモリ依存緩和最適化部１１４は、メモリに記憶されているデータのロード処理をストア処理の直前に移動し（Ｓ３１）、依存関係にあるメモリアクセス処理が対象とするメモリの領域サイズ（オブジェクトサイズ）が互いに等しいか判定する（Ｓ３２）。
【００６６】
オブジェクトサイズが異なる場合（Ｓ３２でＮＯ）、曖昧なメモリ依存緩和最適化部１１４は、それらメモリアクセス処理のアドレスレジスタ値の範囲を比較する比較処理をロード処理の直前に挿入し（Ｓ３３）、そのアドレス範囲比較処理の結果に応じたアドレス毎の補正処理をロード処理の後ろに挿入し（Ｓ３４）、処理を終える。
【００６７】
アドレスレジスタ値の範囲を比較する比較処理（Ｓ３３）は、以下のようにして行われる。互いのメモリアクセス処理をＡＰｂおよびＡＰｓとする。また、ＡＰｂおよびＡＰｓそれぞれのメモリアクセスアドレスをＡＡｂおよびＡＡｓとする。さらに、ＡＰｂおよびＡＰｓそれぞれのメモリアクセス領域サイズをＡＳｂおよびＡＳｓとする。また、ＡＳｂおよびＡＳｓの最大公約数ｇｃｄ（ＡＳｂ、ＡＳｓ）をＧＡＳとし、ＡＳｂ＞ＡＳｓとした場合、比較回数ｎはＡＳｂ／ＧＡＳで、この処理では、以下のｎ個の比較（ＡＡｂ＋ＧＡＳ＊０＝＝ＡＡｓ、ＡＡｂ＋ＧＡＳ＊１＝＝ＡＡｓ、ＡＡｂ＋ＧＡＳ＊２＝＝ＡＡｓ、・・・、ＡＡｂ＋ＧＡＳ＊（ｎ−１）＝＝ＡＡｓ）を行なう。これにより、依存メモリ領域を検出する。つまり、ＡＡｂ＋ＧＡＳ＊ｋ＝＝ＡＡｓの比較結果が真となった場合には、ＡＳｂ＞ＡＳｓとした場合、ＡＰｂによってアクセスされるメモリ領域のうちアクセス先頭アドレスＡＡｂからＧＡＳ＊ｋバイトだけずれた位置からＧＡＳバイト分の領域と、ＡＰｓによってアクセスされるメモリ領域とが依存関係にあるといえる。
【００６８】
アドレス毎の補正処理（Ｓ３４）は、前記アドレスレジスタ値の範囲を比較する比較処理（Ｓ３３）の結果毎に、ロード処理で代入されるデータに、ストア処理でストアされるデータの内で依存メモリ領域に該当する領域部分のみを上書きするような実行可否フラグ付き代入処理をロード処理の後に挿入する処理である。
【００６９】
オブジェクトサイズが同じ場合（Ｓ３２でＹＥＳ）、曖昧なメモリ依存緩和最適化部１１４は、その曖昧なメモリ依存関係にあるメモリアクセス処理はループ内の処理であるか否かを判定する（Ｓ３５）。ループ内でない場合（Ｓ３５でＮＯ）、曖昧なメモリ依存緩和最適化部１１４は、他の曖昧なメモリ依存を緩和したときに生成したアドレス比較処理が流用可能か判定する（Ｓ３６）。当該判定において、アドレス変数が互いに一致していて、かつロード処理までに存在するアドレス変数の増減値が互いに同等であることがわかる場合（Ｓ３６でＹＥＳ）、アドレス比較処理を流用し、アドレス比較処理の挿入（Ｓ４０）をスキップする。逆に、Ｓ３６の判定において、アドレス比較処理が存在しない、またはアドレス変数が一致していない、またはアドレス変数の増減値が互いに同等でない可能性がある場合（Ｓ３６でＮＯ）、曖昧なメモリ依存緩和最適化部１１４は、メモリアクセス処理の互いのメモリアドレスの一致を比較するアドレス一致比較処理を、ロード処理の直前に挿入する（Ｓ４０）。
【００７０】
２つのメモリアクセス処理がともにループ内の処理の場合（Ｓ３５でＹＥＳ）、ループ処理におけるメモリアドレスが変化する増分値が互いに固定かつ同等か否かを判定する（Ｓ３７）。メモリアドレスの増分値が互いに固定でない、または同等でない場合には（Ｓ３７でＮＯ）、ループ内でない場合（Ｓ３５でＮＯ）と同様に、アドレス一致比較処理の挿入処理を実施する（Ｓ３６、Ｓ４０）。
【００７１】
メモリアドレスの増分値が互いに固定でかつ同等な場合（Ｓ３７でＹＥＳ）、曖昧なメモリ依存緩和最適化部１１４は、アドレス一致比較処理をループ処理の唯一の先行処理であるプリヘッダ処理の最後尾に挿入する（Ｓ３８）。曖昧なメモリ依存緩和最適化部１１４は、各比較処理を挿入（Ｓ３８、Ｓ４０）した後、補正処理として、ロード処理で代入されるデータを、ストア処理でストアされるデータで上書きするような実行可否フラグ付き代入処理をロード処理の後に挿入し（Ｓ３９）、処理を終える。
【００７２】
［コンパイルオプション］
コンパイラシステム１００では、コンパイラに対するコンパイルオプションとして、オプション「−ｆｎｏ−ｃｕｔ−ａｍｂｉｇｕｏｕｓ−ｄｅｐｅｎｄ」が用意される。このオプションが、コンパイラ実行時に指定されれば、プラグマの指定に関わらず、曖昧なメモリ依存に対する緩和最適化を行わない。本オプションの指定がなければ、一般の最適化と同様に、「−Ｏ」（最適化コマンドラインオプション指定）の有無に従う。
【００７３】
［プラグマ指定］
本指定は、直後のループに対するものである。
【００７４】
プラグマ「＃ｐｒａｇｍａ  ＿ｃｕｔ＿ａｍｂｉｇｕｏｕｓ＿ｄｅｐｅｎｄ［変数名，変数名］」により変数が指定された場合には、プラグマ指定されたアドレス変数のみに着目して曖昧なメモリ依存緩和最適化を行う。指定する変数は、配列でも、ポインタでもよい。変数の指定が省略された場合には、すべてのメモリアクセスを対象として曖昧なメモリ依存緩和最適化を行う。
【００７５】
以下、いくつかの具体的局面における曖昧なメモリ依存緩和処理について説明する。なお、以降の処理では、説明の簡単化のため擬似アセンブラ言語によるプログラム記述を行っているが、実際には中間言語による最適化処理が行われる。
【００７６】
［非ループ構造・同じオブジェクトサイズアクセス］
図８Ａ〜図８Ｃは、非ループ構造で同じオブジェクトサイズアクセスに対する依存緩和処理について説明するための図である。
【００７７】
図８Ａは、非ループ構造で同じオブジェクトサイズアクセスのソースプログラム２００の一例を示す図である。
【００７８】
このソースプログラム２００の処理内容は、関数の引数ｐＡ、ｐＢを基準アドレスとしてｐＢが指す領域をｐＡが指す領域に代入し、ｐＡとｐＢのアドレスをそれぞれ次の要素を示すようにアドレス値を加算する処理が２回連続するものである。アドレス変数ｐＡにて代入されるメモリ領域サイズ（ストア・オブジェクトサイズ）とアドレス変数ｐＢにて参照されるメモリ領域サイズ（ロード・オブジェクトサイズ）は、お互いのアドレス変数が同じ型であるため、同じである。
【００７９】
図８Ｂ（ａ）は、このソースプログラム２００が図４に示すコンパイラの処理に入力され、図４のＳ１からＳ３の処理にて変換されＳ４の入力となる中間コードである。この入力された中間コード（図８Ｂ（ａ））からは、クリティカルパス検出処理（図５のＳ１０）にて図８Ｃ（ａ）に示すようなクリティカルパスが検出される。このクリティカルパスは、１回目の＊ｐＡ＋＋によるメモリ代入処理と２回目の＊ｐＢ＋＋によるメモリ参照処理が曖昧なメモリ依存であるため、１回目の＊ｐＢによるメモリ参照と＊ｐＡによるメモリ代入と２回目の＊ｐＢによるメモリ参照と＊ｐＡによるメモリ代入の連続した処理の流れとなる。
【００８０】
このクリティカルパスに対して、曖昧なメモリ依存検出処理（図５のＳ１１、図６）が実行される。つまり、クリティカルパス上の処理を先頭から順に探索し（図６のＳ２０）、１回目の＊ｐＡ＋＋によるメモリ代入処理と２回目の＊ｐＢ＋＋によるメモリ参照処理の曖昧なメモリ依存を検出する（図６のＳ２１）。これにより、図６のＳ２１でＹＥＳとなる。
【００８１】
実行可否フラグは入力された中間コードで使用されていないので自由に使用できる実行可否フラグレジスタ資源が存在している。このため、図６のＳ２４でＹＥＳとなる。
【００８２】
メモリ参照処理の移動可否判定処理（Ｓ２５）では、メモリ参照処理の曖昧なメモリ依存の要因となるメモリ以外にもレジスタｒ１およびｒ１１についても考慮される。レジスタｒ１とｒ１１のそれぞれが他の処理と依存する場合も考えられるが、この場合では移動先のメモリ代入処理とメモリ参照処理までの間にレジスタｒ１とｒ１１の定義・参照による依存がない。このため、メモリ参照処理が移動可能で図６のＳ２５でＹＥＳとなる。
【００８３】
よって、図６のＳ２６にて１回目の＊ｐＡ＋＋によるメモリ代入処理と２回目の＊ｐＢ＋＋によるメモリ参照処理が曖昧なメモリ依存関係と判断され、図５のＳ１２でＹＥＳとなり依存緩和処理（図５のＳ１３）にそれらのメモリアクセス処理の情報を渡す。その曖昧なメモリ依存となるメモリアクセス処理に対して、依存が緩和される（図５のＳ１３、図７）。
【００８４】
得られたメモリアクセス処理の曖昧なメモリ依存は、１回目の＊ｐＡ＋＋によるメモリへの定義と２回目の＊ｐＢ＋＋によるメモリへの参照であり、真の依存関係であるため、図７のＳ３０でＹＥＳとなり、図８Ｂ（ｂ）の様に２回目の＊ｐＢによるメモリ参照処理を１回目の＊ｐＡによるメモリ代入処理の前に移動する（図７のＳ３１）。それらのメモリアクセス処理のｐＡによるストア・オブジェクトサイズとｐＢによるロード・オブジェクトサイズは同等であるため、図７のＳ３２でＹＥＳとなり、さらにループ内の処理ではないため図７のＳ３５でＮＯとなる。
【００８５】
図７のＳ３５でＮＯとなれば、先行に既存のアドレス比較処理が存在しないため、図７のＳ３６でＮＯとなり、アドレス変数ｐＢに割り付けられたレジスタｒ１の値とアドレス変数ｐＡに割り付けられたレジスタｒ０の値とが一致するか比較するアドレス比較処理を図７のＳ３１で移動したメモリ参照処理の直前に挿入する（図７のＳ４０）。なお、図８Ｂ（ｂ）に示すアドレス比較処理「ｃｍｐｅｑ  Ｃ０，ｒ１，ｒ０」は、ｒ１とｒ０との値が等しい場合に、条件可否フラグＣ０に１を代入する処理である。
【００８６】
最後に、曖昧なメモリ依存において実際に依存が発生するときに論理を正しく保つために、アドレスが一致した場合に実行可否フラグレジスタによって＊ｐＢによるメモリ参照処理によって得られた値であるｒ１１を＊ｐＡによるメモリ代入処理で代入される値であるｒ１０で上書きするように、実行可否フラグ付き補正命令を移動した＊ｐＢによるメモリ参照処理の後ろに挿入する（図７の３９）。図８Ｂ（ｂ）に示す実行可否フラグ付き補正命令では、Ｃ０＝＝１の場合、すなわち、ｒ１とｒ０との値が等しい場合に、命令ｍｏｖが実行される。
【００８７】
このように、依存緩和処理（図５のＳ１３）にて依存緩和が実施されたため、図５のＳ１４でＹＥＳとなり、依存緩和後の中間コードに対してクリティカルパスを再検出すると（図５のＳ１５）、図８Ｃ（ｂ）に示すように、クリティカルパスは、１回目の＊ｐＢによるメモリ参照と実行可否フラグ付き補正命令と＊ｐＡによるメモリ代入処理の真の依存のみからなる。すなわち、メモリ参照処理によるレイテンシを３ｃｙｃｌｅとすると、クリティカルパス長は図８Ｃ（ａ）の７ｃｙｃｌｅから図８Ｃ（ｂ）の４ｃｙｃｌｅとなり、３ｃｙｃｌｅ短縮される。よって図５のＳ１６にてＹＥＳとなり、図５のＳ１１を再帰的に実施することになる。この例の場合は、全ての曖昧なメモリ依存が取り除かれたため、２回目の曖昧なメモリ依存検出処理（図７のＳ１１）では依存緩和対象のメモリアクセスが検出されないため、図５のＳ１２でＮＯとなり処理を終える。
【００８８】
このように、曖昧なメモリ依存緩和処理（図５、図４のＳ４）を行ない、クリティカルパスを短縮することで、命令スケジューリング処理（図４のＳ５）によって、より高性能な中間コードを実現でき、アセンブラコード出力処理（図４のＳ６）にてオブジェクトコードを生成してコンパイル処理を終える。
【００８９】
［非ループ構造・異なるオブジェクトサイズアクセス（小→大）]
図９Ａ〜図９Ｄは、非ループ構造で異なるオブジェクトサイズアクセス（小→大）に対する依存緩和処理について説明するための図である。
【００９０】
図９Ａは、非ループ構造で異なるオブジェクトサイズアクセスのソースプログラム２００の一例を示す図である。
【００９１】
このソースプログラム２００の処理内容は、関数の引数ｐＡ、ｐＢを基準アドレスとしてｐＢが指す領域をｐＡが指す領域に代入し、ｐＡとｐＢのアドレスをそれぞれ次の要素を示すようにアドレス値を加算する処理が２回連続するものである。アドレス変数ｐＡにて代入されるメモリ領域サイズ（ストア・オブジェクトサイズ）とアドレス変数ｐＢにて参照されるメモリ領域サイズ（ロード・オブジェクトサイズ）は、それぞれ４ｂｙｔｅと２ｂｙｔｅでストア・オブジェクトサイズはロード・オブジェクトサイズより大きい。
【００９２】
図９Ｂ（ａ）は、このソースプログラム２００が図４に示すコンパイラの処理に入力され、図４のＳ１からＳ３の処理にて変換されＳ４の入力となる中間コードである。この入力された中間コード（図９Ｂ（ａ））からは、クリティカルパス検出処理（図５のＳ１０）にて図９Ｃ（ａ）に示すようなクリティカルパスが検出される。このクリティカルパスは、１回目の＊ｐＡ＋＋によるメモリ代入処理と２回目の＊ｐＢ＋＋によるメモリ参照処理が曖昧なメモリ依存であるため、１回目の＊ｐＢによるメモリ参照と＊ｐＡによるメモリ代入と２回目の＊ｐＢによるメモリ参照と＊ｐＡによるメモリ代入の連続した処理の流れとなる。
【００９３】
このクリティカルパスに対して、曖昧なメモリ依存検出処理（図５のＳ１１、図６）が実行される。つまり、クリティカルパス上の処理を先頭から順に探索し（図６のＳ２０）、１回目の＊ｐＡ＋＋によるメモリ代入処理と２回目の＊ｐＢ＋＋によるメモリ参照処理の曖昧なメモリ依存を検出する（図６のＳ２１）。これにより、図６のＳ２１でＹＥＳとなる。
【００９４】
実行可否フラグは入力された中間コードで使用されていないので自由に使用できる実行可否フラグレジスタ資源が存在している。このため、図６のＳ２４でＹＥＳとなる。
【００９５】
メモリ参照処理の移動可否判定処理（Ｓ２５）では、メモリ参照処理の曖昧なメモリ依存の要因となるメモリ以外にもレジスタｒ１およびｒ１１についても考慮される。レジスタｒ１とｒ１１のそれぞれが他の処理と依存する場合も考えられるが、この場合では移動先のメモリ代入処理とメモリ参照処理までの間にレジスタｒ１とｒ１１の定義・参照による依存がない。このため、メモリ参照処理が移動可能で図６のＳ２５でＹＥＳとなる。
【００９６】
よって、図６のＳ２６にて１回目の＊ｐＡ＋＋によるメモリ代入処理と２回目の＊ｐＢ＋＋によるメモリ参照処理が曖昧なメモリ依存関係と判断され、図５のＳ１２でＹＥＳとなり依存緩和処理（図５のＳ１３）にそれらのメモリアクセス処理の情報を渡す。その曖昧なメモリ依存となるメモリアクセス処理に対して、依存が緩和される（図５のＳ１３、図７）。
【００９７】
得られたメモリアクセス処理の曖昧なメモリ依存は、１回目の＊ｐＡ＋＋によるメモリへの定義と２回目の＊ｐＢ＋＋によるメモリへの参照であり、メモリによる真の依存関係であるため、図７のＳ３０でＹＥＳとなり、図９Ｂ（ｂ）の様に２回目の＊ｐＢによるメモリ参照処理を１回目の＊ｐＡによるメモリ代入処理の前に移動する（図７のＳ３１）。それらのメモリアクセス処理のｐＡによるストア・オブジェクトサイズとｐＢによるロード・オブジェクトサイズは異なるため、図７のＳ３２でＮＯとなる。
【００９８】
図７のＳ３２でＮＯとなれば、曖昧なメモリ依存緩和最適化部１１４は、アドレス範囲比較処理をメモリ参照処理の直前に挿入する（図７のＳ３３）。アドレス範囲比較処理は、以下のようにして求められる。つまり、ｐＡによるストア・オブジェクトサイズとｐＢによるロード・オブジェクトサイズがそれぞれ４ｂｙｔｅと２ｂｙｔｅであるので、それらの最大公約数ｇｃｄは２と求められ、比較回数ｎが４ｂｙｔｅ／ｇｃｄ（４ｂｙｔｅ、２ｂｙｔｅ）で２と求められる。また、アドレス変数ｐＢに割り付けられたレジスタはｒ１、アドレス変数ｐＡに割り付けられたレジスタはｒ０であるため、アドレス範囲比較処理として、ｒ０＝＝ｒ１＋２＊０とｒ０＝＝ｒ１＋２＊１の二つのアドレス一致を比較する処理が求められる。曖昧なメモリ依存緩和最適化部１１４は、このように求められたアドレス範囲比較処理をメモリ参照処理の直前に挿入する（図７のＳ３３）。図９Ｂ（ｂ）の中間コードでは、前記比較処理を効率的に行うために、両アドレスの排他的論理和を取り、その結果が０であるのかまたは２ｂｙｔｅだけずれているのかの比較処理を行っている。
【００９９】
最後に、曖昧なメモリ依存で実際に依存が発生するときに論理を正しく保つために、アドレスが一致した場合に実行可否フラグレジスタによって＊ｐＢによるメモリ参照処理によって得られた値であるｒ１１のうちで依存があるメモリ領域部分に相当するデータ部分のみに＊ｐＡによるメモリ代入処理で代入される値であるｒ１０で上書きするように（図９Ｄ）、実行可否フラグ付き補正命令を移動した＊ｐＢによるメモリ参照処理の後ろに挿入する（図７のＳ３４）。図９Ｂ（ｂ）の中間コードでは、図９Ｄの補正処理のメモリイメージの様に、下位１６ｂｉｔ部分に依存がある場合は、「ｅｘｔｒ  ｒ１１，ｒ１０，１５，０」としてｒ１１にｒ１０の０ｂｉｔ目から１５ｂｉｔ目の１６ｂｉｔを符号拡張して上書きし、上位１６ｂｉｔ部分に依存がある場合は、「ｅｘｔｒ  ｒ１１，ｒ１０，３１，１６」としてｒ１１にｒ１０の１６ｂｉｔ目から３１ｂｉｔ目の１６ｂｉｔを符号拡張して上書きする。符号拡張の必要の有無は、ｒ１１のメモリ参照命令の動作にあわせる必要がある。この場合ではｌｄｈ処理はメモリの１６ｂｉｔデータを３２ｂｉｔに符号拡張したうえでレジスタに代入することを想定しているため、補正処理にも符号拡張を実施する必要があり、ｅｘｔｒ処理で符号拡張されることを想定している。
【０１００】
このように、依存緩和処理（図５のＳ１３）にて依存緩和が実施されるため、図５のＳ１４でＹＥＳとなり、依存緩和後の中間コードに対してクリティカルパスを再検出すると（図５のＳ１５）、図９Ｃ（ｂ）に示すように、クリティカルパスは、１回目の＊ｐＢによるメモリ参照と実行可否フラグ付き補正命令と＊ｐＡによるメモリ代入処理の真の依存のみからなる。すなわち、メモリ参照処理によるレイテンシを３ｃｙｃｌｅとすると、クリティカルパス長は図９Ｃ（ａ）の７ｃｙｃｌｅから図９Ｃ（ｂ）の４ｃｙｃｌｅとなり、３ｃｙｃｌｅ短縮される。よって図５のＳ１６にてＹＥＳとなり、図５のＳ１１を再帰的に実施することになる。この例の場合は、全ての曖昧なメモリ依存が取り除かれたため、２回目の曖昧なメモリ依存検出処理（図７のＳ１１）では依存緩和対象のメモリアクセスが検出されないため、図５のＳ１２でＮＯとなり処理を終える。
【０１０１】
このように、メモリアクセス対象のサイズが異なる場合でも、曖昧なメモリ依存緩和処理（図５、図４のＳ４）を行ない、クリティカルパスを短縮することで、命令スケジューリング処理（図４のＳ５）によって、より高性能な中間コードを実現でき、アセンブラコード出力処理（図４のＳ６）にてオブジェクトコードを生成してコンパイル処理を終える。
【０１０２】
［非ループ構造・異なるオブジェクトサイズアクセス（大→小）］
図１０Ａ〜図１０Ｄは、非ループ構造で異なるオブジェクトサイズアクセス（大→小）に対する依存緩和処理について説明するための図である。
【０１０３】
図１０Ａは、非ループ構造で異なるオブジェクトサイズアクセスのソースプログラム２００の一例を示す図である。
【０１０４】
このソースプログラム２００の処理内容は、関数の引数ｐＡ、ｐＢを基準アドレスとしてｐＢが指す領域をｐＡが指す領域に代入し、ｐＡとｐＢのアドレスをそれぞれ次の要素を示すようにアドレス値を加算する処理が２回連続するものである。アドレス変数ｐＡにて代入されるメモリ領域サイズ（ストア・オブジェクトサイズ）とアドレス変数ｐＢにて参照されるメモリ領域サイズ（ロード・オブジェクトサイズ）は、それぞれ２ｂｙｔｅと４ｂｙｔｅでロード・オブジェクトサイズはストア・オブジェクトサイズより大きい。
【０１０５】
図１０Ｂ（ａ）は、このソースプログラム２００が図４に示すコンパイラの処理に入力され、図４のＳ１からＳ３の処理にて変換されＳ４の入力となる中間コードである。この入力された中間コード（図１０Ｂ（ａ））からは、クリティカルパス検出処理（図５のＳ１０）にて図１０Ｃ（ａ）に示すようなクリティカルパスが検出される。このクリティカルパスは、１回目の＊ｐＡ＋＋によるメモリ代入処理と２回目の＊ｐＢ＋＋によるメモリ参照処理が曖昧なメモリ依存であるため、１回目の＊ｐＢによるメモリ参照と＊ｐＡによるメモリ代入と２回目の＊ｐＢによるメモリ参照と＊ｐＡによるメモリ代入の連続した処理の流れとなる。
【０１０６】
このクリティカルパスに対して、曖昧なメモリ依存検出処理（図５のＳ１１、図６）が実行される。つまり、クリティカルパス上の処理を先頭から順に探索し（図６のＳ２０）、１回目の＊ｐＡ＋＋によるメモリ代入処理と２回目の＊ｐＢ＋＋によるメモリ参照処理の曖昧なメモリ依存を検出する（図６のＳ２１）。これにより、図６のＳ２１でＹＥＳとなる。
【０１０７】
実行可否フラグは入力された中間コードで使用されていないので自由に使用できる実行可否フラグレジスタ資源が存在している。このため、図６のＳ２４でＹＥＳとなる。
【０１０８】
メモリ参照処理の移動可否判定処理（Ｓ２５）では、メモリ参照処理の曖昧なメモリ依存の要因となるメモリ以外にもレジスタｒ１およびｒ１１についても考慮される。レジスタｒ１とｒ１１のそれぞれが他の処理と依存する場合も考えられるが、この場合では移動先のメモリ代入処理とメモリ参照処理までの間にレジスタｒ１とｒ１１の定義・参照による依存がない。このため、メモリ参照処理が移動可能で図６のＳ２５でＹＥＳとなる。
【０１０９】
よって、図６のＳ２６にて１回目の＊ｐＡ＋＋によるメモリ代入処理と２回目の＊ｐＢ＋＋によるメモリ参照処理が曖昧なメモリ依存関係と判断され、図５のＳ１２でＹＥＳとなり依存緩和処理（図５のＳ１３）にそれらのメモリアクセス処理の情報を渡す。その曖昧なメモリ依存となるメモリアクセス処理に対して、依存が緩和される（図５のＳ１３、図７）。
【０１１０】
得られたメモリアクセス処理の曖昧なメモリ依存は、１回目の＊ｐＡ＋＋によるメモリへの定義と２回目の＊ｐＢ＋＋によるメモリへの参照であり、メモリによる真の依存関係であるため、図７のＳ３０でＹＥＳとなり、図１０Ｂ（ｂ）の様に２回目の＊ｐＢによるメモリ参照処理を１回目の＊ｐＡによるメモリ代入処理の前に移動する（図７のＳ３１）。それらのメモリアクセス処理のｐＡによるストア・オブジェクトサイズとｐＢによるロード・オブジェクトサイズは異なるため、図７のＳ３２でＮＯとなる。
【０１１１】
図７のＳ３２でＮＯとなれば、曖昧なメモリ依存緩和最適化部１１４は、アドレス範囲比較処理をメモリ参照処理の直前に挿入する（図７のＳ３３）。アドレス範囲比較処理は、以下のようにして求められる。つまり、ｐＡによるストア・オブジェクトサイズとｐＢによるロード・オブジェクトサイズがそれぞれ２ｂｙｔｅと４ｂｙｔｅであるので、それらの最大公約数ｇｃｄは２と求められ、比較回数ｎが４ｂｙｔｅ／ｇｃｄ（２ｂｙｔｅ、４ｂｙｔｅ）で２と求められる。また、アドレス変数ｐＢに割り付けられたレジスタはｒ１、アドレス変数ｐＡに割り付けられたレジスタはｒ０であるため、アドレス範囲比較処理として、ｒ１＝＝ｒ０＋２＊０とｒ１＝＝ｒ０＋２＊１の二つのアドレス一致を比較する処理が求められる。曖昧なメモリ依存緩和最適化部１１４は、このように求められたアドレス範囲比較処理をメモリ参照処理の直前に挿入する（図７のＳ３３）。図１０Ｂ（ｂ）の中間コードでは、前記比較処理を効率的に行うために、両アドレスの排他的論理和を取り、その結果が０であるのかまたは２ｂｙｔｅだけずれているのかの比較処理を行っている。
【０１１２】
最後に、曖昧なメモリ依存で実際に依存が発生するときに論理を正しく保つために、アドレスが一致した場合に実行可否フラグレジスタによって＊ｐＢによるメモリ参照処理によって得られた値であるｒ１１に＊ｐＡによるメモリ代入処理で代入される値であるｒ１０のうちで依存があるメモリ領域部分に相当するデータ部分を上書きするように、実行可否フラグ付き補正命令を移動した＊ｐＢによるメモリ参照処理の後ろに挿入する（図７のＳ３４）。図１０Ｂ（ｂ）の中間コードでは、図１０Ｄの補正処理のメモリイメージの様に、下位１６ｂｉｔ部分に依存がある場合は、「ｖａｌｎ  ｒ１１，ｒ１０，ｒ１１」としてｒ１１下位１６ｂｉｔにｒ１０の下位１６ｂｉｔを上書きし、上位１６ｂｉｔ部分に依存がある場合は、「ｖａｌｎ  ｒ１１，ｒ１１，ｒ１０」としてｒ１１の上位１６ｂｉｔにｒ１０の上位１６ｂｉｔを上書きする。
【０１１３】
このように、依存緩和処理（図５のＳ１３）にて依存緩和が実施されたため、図５のＳ１４でＹＥＳとなり、依存緩和後の中間コードに対してクリティカルパスを再検出すると（図５のＳ１５）、図１０Ｃ（ｂ）に示すように、クリティカルパスは、１回目の＊ｐＢによるメモリ参照と実行可否フラグ付き補正命令と＊ｐＡによるメモリ代入処理の真の依存のみからなる。すなわち、メモリ参照処理によるレイテンシを３ｃｙｃｌｅとすると、クリティカルパス長は図１０Ｃ（ａ）の７ｃｙｃｌｅから図１０Ｃ（ｂ）の４ｃｙｃｌｅとなり、３ｃｙｃｌｅ短縮される。よって図５のＳ１６にてＹＥＳとなり、図５のＳ１１を再帰的に実施することになる。この例の場合は、全ての曖昧なメモリ依存が取り除かれたため、２回目の曖昧なメモリ依存検出処理（図７のＳ１１）では依存緩和対象のメモリアクセスが検出されないため、図５のＳ１２でＮＯとなり処理を終える。
【０１１４】
このように、メモリアクセス対象のサイズが異なる場合でも、曖昧なメモリ依存緩和処理（図５、図４のＳ４）を行ない、クリティカルパスを短縮することで、命令スケジューリング処理（図４のＳ５）によって、より高性能な中間コードを実現でき、アセンブラコード出力処理（図４のＳ６）にてオブジェクトコードを生成してコンパイル処理を終える。
【０１１５】
［ループ構造・ループ外で判定］
図１１Ａ〜図１１Ｃは、ループ構造で同じオブジェクトサイズアクセスに対する依存緩和処理で、比較処理がループ外に出せる場合について説明するための図である。
【０１１６】
図１１Ａは、ループ構造のソースプログラム２００の一例を示す図である。
このソースプログラム２００の処理内容は、関数の引数ｐＡ、ｐＢを基準アドレスとしてｐＢが指す領域をｐＡが指す領域に代入し、ｐＡとｐＢのアドレスをそれぞれ次の要素を示すようにアドレス値を加算する処理がループ内に２回連続し、その処理をループにより１００回繰り返すものである。アドレス変数ｐＡにて代入されるメモリ領域サイズ（ストア・オブジェクトサイズ）とアドレス変数ｐＢにて参照されるメモリ領域サイズ（ロード・オブジェクトサイズ）は、お互いのアドレス変数が同じ型であるため、同じである。
【０１１７】
図１１Ｂ（ａ）は、このソースプログラム２００が図４に示すコンパイラの処理に入力され、図４のＳ１からＳ３の処理にて変換されＳ４の入力となる中間コードである。この入力された中間コード（図１１Ｂ（ａ））からは、クリティカルパス検出処理（図５のＳ１０）にて図１１Ｃ（ａ）に示すようなクリティカルパスが検出される。このクリティカルパスは、１回目の＊ｐＡ＋＋によるメモリ代入処理と２回目の＊ｐＢ＋＋によるメモリ参照処理が曖昧なメモリ依存であるため、１回目の＊ｐＢによるメモリ参照と＊ｐＡによるメモリ代入と２回目の＊ｐＢによるメモリ参照と＊ｐＡによるメモリ代入の連続した処理の流れとなる。
【０１１８】
このクリティカルパスに対して、曖昧なメモリ依存検出処理（図５のＳ１１、図６）が実行される。つまり、クリティカルパス上の処理を先頭から順に探索し（図６のＳ２０）、１回目の＊ｐＡ＋＋によるメモリ代入処理と２回目の＊ｐＢ＋＋によるメモリ参照処理の曖昧なメモリ依存を検出する（図６のＳ２１）。これにより、図６のＳ２１でＹＥＳとなる。
【０１１９】
実行可否フラグとして入力された中間コードでＣ６のみ使用しているためＣ６以外の実行可否フラグレジスタ資源が存在している。このため、図６のＳ２４でＹＥＳとなる。
【０１２０】
メモリ参照処理の移動可否判定処理（Ｓ２５）では、メモリ参照処理の曖昧なメモリ依存の要因となるメモリ以外にもレジスタｒ１およびｒ１１についても考慮される。レジスタｒ１とｒ１１のそれぞれが他の処理と依存する場合も考えられるが、この場合では移動先のメモリ代入処理とメモリ参照処理までの間にレジスタｒ１とｒ１１の定義・参照による依存がない。このため、メモリ参照処理が移動可能で図６のＳ２５でＹＥＳとなる。
【０１２１】
よって、図６のＳ２６にて１回目の＊ｐＡ＋＋によるメモリ代入処理と２回目の＊ｐＢ＋＋によるメモリ参照処理が曖昧なメモリ依存関係と判断され、図５のＳ１２でＹＥＳとなり依存緩和処理（図５のＳ１３）にそれらのメモリアクセス処理の情報を渡す。その曖昧なメモリ依存となるメモリアクセス処理に対して、依存が緩和される（図５のＳ１３、図７）。
【０１２２】
得られたメモリアクセス処理の曖昧なメモリ依存は、１回目の＊ｐＡ＋＋によるメモリへの定義と２回目の＊ｐＢ＋＋によるメモリへの参照であり、メモリによる真の依存関係であるため、図７のＳ３０でＹＥＳとなり、図１１Ｂ（ｂ）の様に２回目の＊ｐＢによるメモリ参照処理を１回目の＊ｐＡによるメモリ代入処理の前に移動する（図７のＳ３１）。それらのメモリアクセス処理のｐＡによるストア・オブジェクトサイズとｐＢによるロード・オブジェクトサイズは同等であるため、図７のＳ３２でＹＥＳとなり、さらにループ内に処理が存在するため図７のＳ３５でＹＥＳとなる。
【０１２３】
アドレス変数ｐＡとｐＢの増分値は、ループ内でそれぞれｐＡ＋＋、ｐＢ＋＋として互いに１要素ずつ固定的に増加するため、Ｓ３７でＹＥＳとなる。
【０１２４】
Ｓ３７でＹＥＳとなれば、ループ内での依存は基準アドレスのみの判定で良いため、アドレス変数ｐＢに割り付けられたレジスタｒ１の値とアドレス変数ｐＡに割り付けられたレジスタｒ０の値とが一致するか比較するアドレス比較処理をループのプリヘッダ処理の最後尾に挿入する（図７のＳ３８）。
【０１２５】
最後に、曖昧なメモリ依存において実際に依存が発生するときに論理を正しく保つために、アドレスが一致した場合に実行可否フラグレジスタによって＊ｐＢによるメモリ参照処理によって得られた値であるｒ１１を＊ｐＡによるメモリ代入処理で代入される値であるｒ１０で上書きされるように、実行可否フラグ付き補正命令を移動した＊ｐＢによるメモリ参照処理の後ろに挿入する（図７の３９）。
【０１２６】
このように、依存緩和処理（図５のＳ１３）にて依存緩和が実施されたため、図５のＳ１４でＹＥＳとなり、依存緩和後の中間コードに対してクリティカルパスを再検出すると（図５のＳ１５）、図１１Ｃ（ｂ）に示すように、クリティカルパスは、１回目の＊ｐＢによるメモリ参照と実行可否フラグ付き補正命令と＊ｐＡによるメモリ代入処理の真の依存のみからなる。すなわち、メモリ参照処理によるレイテンシを３ｃｙｃｌｅとすると、クリティカルパス長は図１１Ｃ（ａ）の７ｃｙｃｌｅから図１１Ｃ（ｂ）の４ｃｙｃｌｅとなり、３ｃｙｃｌｅ短縮される。よって図５のＳ１６にてＹＥＳとなり、図５のＳ１１を再帰的に実施することになる。この例の場合は、全ての曖昧なメモリ依存が取り除かれたため、２回目の曖昧なメモリ依存検出処理（図７のＳ１１）では依存緩和対象のメモリアクセスが検出されないため、図５のＳ１２でＮＯとなり処理を終える。
【０１２７】
このように、曖昧なメモリ依存緩和処理（図５、図４のＳ４）を行ない、クリティカルパスを短縮し、アドレス比較処理をループ外で実行することで処理を削減でき、アセンブラコード出力処理（図４のＳ６）にてオブジェクトコードを生成してコンパイル処理を終える。
【０１２８】
［ループ構造・ループ内で判定］
図１２Ａ〜図１２Ｃは、ループ構造で同じオブジェクトサイズアクセスに対する依存緩和処理で、比較処理がループ内に必要な場合について説明するための図である。
【０１２９】
図１２Ａは、ループ構造のソースプログラム２００の一例を示す図である。
このソースプログラム２００の処理内容は、関数の引数ｐＡ、ｐＢを基準アドレスとしてｐＢが指す領域をｐＡが指す領域に代入し、ｐＡのアドレスを引数ｉｎｃで指定された数値を増分値として更新し、ｐＢは次の要素を示すようにアドレスを更新する処理と、更新されたｐＡとｐＢのアドレスで、ｐＢが指す領域をｐＡが指す領域に代入し、両アドレスをそれぞれ次の要素を示すようにアドレス値を加算する処理をループにより１００回繰り返すものである。アドレス変数ｐＡにて代入されるメモリ領域サイズ（ストア・オブジェクトサイズ）とアドレス変数ｐＢにて参照されるメモリ領域サイズ（ロード・オブジェクトサイズ）は、お互いのアドレス変数が同じ型であるため、同じである。
【０１３０】
図１２Ｂ（ａ）は、このソースプログラム２００が図４に示すコンパイラの処理に入力され、図４のＳ１からＳ３の処理にて変換されＳ４の入力となる中間コードである。この入力された中間コード（図１２Ｂ（ａ））からは、クリティカルパス検出処理（図５のＳ１０）にて図１２Ｃ（ａ）に示すようなクリティカルパスが検出される。このクリティカルパスは、１回目の＊ｐＡによるメモリ代入処理と２回目の＊ｐＢ＋＋によるメモリ参照処理が曖昧なメモリ依存であるため、１回目の＊ｐＢによるメモリ参照と＊ｐＡによるメモリ代入と２回目の＊ｐＢによるメモリ参照と＊ｐＡによるメモリ代入の連続した処理の流れとなる。
【０１３１】
このクリティカルパスに対して、曖昧なメモリ依存検出処理（図５のＳ１１、図６）が実行される。つまり、クリティカルパス上の処理を先頭から順に探索し（図６のＳ２０）、１回目の＊ｐＡによるメモリ代入処理と２回目の＊ｐＢ＋＋によるメモリ参照処理の曖昧なメモリ依存を検出する（図６のＳ２１）。これにより、図６のＳ２１でＹＥＳとなる。
【０１３２】
実行可否フラグとして入力された中間コードでＣ６のみ使用しているためＣ６以外の実行可否フラグレジスタ資源が存在している。このため、図６のＳ２４でＹＥＳとなる。
【０１３３】
メモリ参照処理の移動可否判定処理（Ｓ２５）では、メモリ参照処理の曖昧なメモリ依存の要因となるメモリ以外にもレジスタｒ１およびｒ１１についても考慮される。レジスタｒ１とｒ１１のそれぞれが他の処理と依存する場合も考えられるが、この場合では移動先のメモリ代入処理とメモリ参照処理までの間にレジスタｒ１とｒ１１の定義・参照による依存がない。このため、メモリ参照処理が移動可能で図６のＳ２５でＹＥＳとなる。
【０１３４】
よって、図６のＳ２６にて１回目の＊ｐＡによるメモリ代入処理と２回目の＊ｐＢ＋＋によるメモリ参照処理が曖昧なメモリ依存関係と判断され、図５のＳ１２でＹＥＳとなり依存緩和処理（図５のＳ１３）にそれらのメモリアクセス処理の情報を渡す。その曖昧なメモリ依存となるメモリアクセス処理に対して、依存が緩和される（図５のＳ１３、図７）。
【０１３５】
得られたメモリアクセス処理の曖昧なメモリ依存は、１回目の＊ｐＡによるメモリへの定義と２回目の＊ｐＢ＋＋によるメモリへの参照であり、メモリによる真の依存関係であるため、図７のＳ３０でＹＥＳとなり、図１２Ｂ（ｂ）の様に２回目の＊ｐＢによるメモリ参照処理を１回目の＊ｐＡによるメモリ代入処理の前に移動する（図７のＳ３１）。それらのメモリアクセス処理のｐＡによるストア・オブジェクトサイズとｐＢによるロード・オブジェクトサイズは同等であるため、図７のＳ３２でＹＥＳとなり、さらにループ内に処理が存在するため図７のＳ３５でＹＥＳとなる。
【０１３６】
アドレス変数ｐＡとｐＢの増分値は、ループ内でｐＡは＋１と＋ｉｎｃ、ｐＢは＋１と＋１として互いに異なる増分値を持つ可能性があるため、Ｓ３７でＮＯとなる。
【０１３７】
Ｓ３７でＮＯとなれば、ループ内での依存判定を毎回実施する必要があり、また先行処理に既存のアドレス比較処理が存在しないため、図７のＳ３６でＮＯとなり、アドレス変数ｐＢに割り付けられたレジスタｒ１の値とアドレス変数ｐＡに割り付けられたレジスタｒ０の値とが一致するか比較するアドレス比較処理を図７のＳ３１で移動したメモリ参照処理の直前に挿入する（図７のＳ４０）。
【０１３８】
最後に、曖昧なメモリ依存において実際に依存が発生するときに論理を正しく保つために、アドレスが一致した場合に実行可否フラグレジスタによって＊ｐＢによるメモリ参照処理によって得られた値であるｒ１１を＊ｐＡによるメモリ代入処理で代入される値であるｒ１０で上書きされるように、実行可否フラグ付き補正命令を移動した＊ｐＢによるメモリ参照処理の後ろに挿入する（図７の３９）。
【０１３９】
このように、依存緩和処理（図５のＳ１３）にて依存緩和が実施されたため、図５のＳ１４でＹＥＳとなり、依存緩和後の中間コードに対してクリティカルパスを再検出すると（図５のＳ１５）、図１２Ｃ（ｂ）に示すように、クリティカルパスは、１回目の＊ｐＢによるメモリ参照と実行可否フラグ付き補正命令と＊ｐＡによるメモリ代入処理の真の依存のみからなる。すなわち、メモリ参照処理によるレイテンシを３ｃｙｃｌｅとすると、クリティカルパス長は図１２Ｃ（ａ）の７ｃｙｃｌｅから図１２Ｃ（ｂ）の４ｃｙｃｌｅとなり、３ｃｙｃｌｅ短縮される。よって図５のＳ１６にてＹＥＳとなり、図５のＳ１１を再帰的に実施することになる。この例の場合は、全ての曖昧なメモリ依存が取り除かれたため、２回目の曖昧なメモリ依存検出処理（図７のＳ１１）では依存緩和対象のメモリアクセスが検出されないため、図５のＳ１２でＮＯとなり処理を終える。
【０１４０】
このように、それぞれのメモリアクセスのアドレス増分値が異なる場合でも、曖昧なメモリ依存緩和処理（図５、図４のＳ４）を行ない、クリティカルパスを短縮することで、命令スケジューリング処理（図４のＳ５）によって、より高性能な中間コードを実現でき、アセンブラコード出力処理（図４のＳ６）にてオブジェクトコードを生成してコンパイル処理を終える。
【０１４１】
［ループ構造・異なるオブジェクトサイズアクセス（小→大）］
図１３Ａおよび図１３Ｂは、ループ構造で異なるオブジェクトサイズアクセス（小→大）に対する依存緩和処理について説明するための図である。
【０１４２】
図１３Ａは、ループ構造で異なるオブジェクトサイズアクセスのソースプログラム２００の一例を示す図である。
【０１４３】
このソースプログラム２００の処理内容は、関数の引数ｐＡ、ｐＢを基準アドレスとしてｐＢが指す領域をｐＡが指す領域に代入し、ｐＡとｐＢのアドレスをそれぞれ次の要素を示すようにアドレス値を加算する処理がループ内に２回連続し、その処理をループにより１００回繰り返すものである。アドレス変数ｐＡにて代入されるメモリ領域サイズ（ストア・オブジェクトサイズ）とアドレス変数ｐＢにて参照されるメモリ領域サイズ（ロード・オブジェクトサイズ）は、それぞれ４ｂｙｔｅと２ｂｙｔｅでストア・オブジェクトサイズはロード・オブジェクトサイズより大きい。
【０１４４】
図１３Ｂ（ａ）は、このソースプログラム２００が図４に示すコンパイラの処理に入力され、図４のＳ１からＳ３の処理にて変換されＳ４の入力となる中間コードである。この入力された中間コード（図１３Ｂ（ａ））からは、クリティカルパス検出処理（図５のＳ１０）にて図９Ｃ（ａ）と同様なクリティカルパスが検出される。このクリティカルパスは、１回目の＊ｐＡ＋＋によるメモリ代入処理と２回目の＊ｐＢ＋＋によるメモリ参照処理が曖昧なメモリ依存であるため、１回目の＊ｐＢによるメモリ参照と＊ｐＡによるメモリ代入と２回目の＊ｐＢによるメモリ参照と＊ｐＡによるメモリ代入の連続した処理の流れとなる。
【０１４５】
このクリティカルパスに対して、曖昧なメモリ依存検出処理（図５のＳ１１、図６）が実行される。つまり、クリティカルパス上の処理を先頭から順に探索し（図６のＳ２０）、１回目の＊ｐＡ＋＋によるメモリ代入処理と２回目の＊ｐＢ＋＋によるメモリ参照処理の曖昧なメモリ依存を検出する（図６のＳ２１）。これにより、図６のＳ２１でＹＥＳとなる。
【０１４６】
実行可否フラグとして入力された中間コードでＣ６のみ使用しているためＣ６以外の実行可否フラグレジスタ資源が存在している。このため、図６のＳ２４でＹＥＳとなる。
【０１４７】
メモリ参照処理の移動可否判定処理（Ｓ２５）では、メモリ参照処理の曖昧なメモリ依存の要因となるメモリ以外にもレジスタｒ１およびｒ１１についても考慮される。レジスタｒ１とｒ１１のそれぞれが他の処理と依存する場合も考えられるが、この場合では移動先のメモリ代入処理とメモリ参照処理までの間にレジスタｒ１とｒ１１の定義・参照による依存がない。このため、メモリ参照処理が移動可能で図６のＳ２５でＹＥＳとなる。
【０１４８】
よって、図６のＳ２６にて１回目の＊ｐＡ＋＋によるメモリ代入処理と２回目の＊ｐＢ＋＋によるメモリ参照処理が曖昧なメモリ依存関係と判断され、図５のＳ１２でＹＥＳとなり依存緩和処理（図５のＳ１３）にそれらのメモリアクセス処理の情報を渡す。その曖昧なメモリ依存となるメモリアクセス処理に対して、依存が緩和される（図５のＳ１３、図７）。
【０１４９】
得られたメモリアクセス処理の曖昧なメモリ依存は、１回目の＊ｐＡ＋＋によるメモリへの定義と２回目の＊ｐＢ＋＋によるメモリへの参照であり、メモリによる真の依存関係であるため、図７のＳ３０でＹＥＳとなり、図１３Ｂ（ｂ）の様に２回目の＊ｐＢによるメモリ参照処理を１回目の＊ｐＡによるメモリ代入処理の前に移動する（図７のＳ３１）。それらのメモリアクセス処理のｐＡによるストア・オブジェクトサイズとｐＢによるロード・オブジェクトサイズは異なるため、図７のＳ３２でＮＯとなる。
【０１５０】
図７のＳ３２でＮＯとなれば、曖昧なメモリ依存緩和最適化部１１４は、アドレス範囲比較処理をメモリ参照処理の直前に挿入する（図７のＳ３３）。アドレス範囲比較処理は、以下のようにして求められる。つまり、ｐＡによるストア・オブジェクトサイズとｐＢによるロード・オブジェクトサイズがそれぞれ４ｂｙｔｅと２ｂｙｔｅであるので、それらの最大公約数ｇｃｄは２と求められ、比較回数ｎが４ｂｙｔｅ／ｇｃｄ（４ｂｙｔｅ、２ｂｙｔｅ）で２と求められる。また、アドレス変数ｐＢに割り付けられたレジスタはｒ１、アドレス変数ｐＡに割り付けられたレジスタはｒ０であるため、アドレス範囲比較処理として、ｒ０＝＝ｒ１＋２＊０とｒ０＝＝ｒ１＋２＊１の二つのアドレス一致を比較する処理が求められる。曖昧なメモリ依存緩和最適化部１１４は、このように求められたアドレス範囲比較処理をメモリ参照処理の直前に挿入する（図７のＳ３３）。図１３Ｂ（ｂ）の中間コードでは、前記比較処理を効率的に行うために、両アドレスの排他的論理和を取り、その結果が０であるのかまたは２ｂｙｔｅだけずれているのかの比較処理を行っている。
【０１５１】
最後に、曖昧なメモリ依存で実際に依存が発生するときに論理を正しく保つために、アドレスが一致した場合に実行可否フラグレジスタによって＊ｐＢによるメモリ参照処理によって得られた値であるｒ１１のうちで依存があるメモリ領域部分に相当するデータ部分のみに＊ｐＡによるメモリ代入処理で代入される値であるｒ１０で上書きするように（図９Ｄと同様）、実行可否フラグ付き補正命令を移動した＊ｐＢによるメモリ参照処理の後ろに挿入する（図７のＳ３４）。図１３Ｂ（ｂ）の中間コードでは、図９Ｄの補正処理のメモリイメージと同様に、下位１６ｂｉｔ部分に依存がある場合は、「ｅｘｔｒ  ｒ１１，ｒ１０，１５，０」としてｒ１１にｒ１０の０ｂｉｔ目から１５ｂｉｔ目の１６ｂｉｔを符号拡張して上書きし、上位１６ｂｉｔ部分に依存がある場合は、「ｅｘｔｒ  ｒ１１，ｒ１０，３１，１６」としてｒ１１にｒ１０の１６ｂｉｔ目から３１ｂｉｔ目の１６ｂｉｔを符号拡張して上書きする。符号拡張の必要の有無は、ｒ１１のメモリ参照命令の動作にあわせる必要がある。この場合ではｌｄｈ処理はメモリの１６ｂｉｔデータを３２ｂｉｔに符号拡張したうえでレジスタに代入することを想定しているため、補正処理にも符号拡張を実施する必要があり、ｅｘｔｒ処理で符号拡張されることを想定している。
【０１５２】
このように、依存緩和処理（図５のＳ１３）にて依存緩和が実施されたため、図５のＳ１４でＹＥＳとなり、依存緩和後の中間コードに対してクリティカルパスを再検出すると（図５のＳ１５）、図９Ｃ（ｂ）と同様に、クリティカルパスは、１回目の＊ｐＢによるメモリ参照と実行可否フラグ付き補正命令と＊ｐＡによるメモリ代入処理の真の依存のみからなる。すなわち、メモリ参照処理によるレイテンシを３ｃｙｃｌｅとすると、クリティカルパス長は７ｃｙｃｌｅから４ｃｙｃｌｅと、３ｃｙｃｌｅ短縮される。よって図５のＳ１６にてＹＥＳとなり、図５のＳ１１を再帰的に実施することになる。この例の場合は、全ての曖昧なメモリ依存が取り除かれたため、２回目の曖昧なメモリ依存検出処理（図７のＳ１１）では依存緩和対象のメモリアクセスが検出されないため、図５のＳ１２でＮＯとなり処理を終える。
【０１５３】
このように、メモリアクセス対象のサイズが異なる場合でも、曖昧なメモリ依存緩和処理（図５、図４のＳ４）を行ない、クリティカルパスを短縮することで、命令スケジューリング処理（図４のＳ５）によって、より高性能な中間コードを実現でき、アセンブラコード出力処理（図４のＳ６）にてオブジェクトコードを生成してコンパイル処理を終える。
【０１５４】
［ループ構造・異なるオブジェクトサイズアクセス（大→小）］
図１４Ａおよび図１４Ｂは、ループ構造で異なるオブジェクトサイズアクセス（大→小）に対する依存緩和処理について説明するための図である。
【０１５５】
図１４Ａは、ループ構造で異なるオブジェクトサイズアクセスのソースプログラム２００の一例を示す図である。
【０１５６】
このソースプログラム２００の処理内容は、関数の引数ｐＡ、ｐＢを基準アドレスとしてｐＢが指す領域をｐＡが指す領域に代入し、ｐＡとｐＢのアドレスをそれぞれ次の要素を示すようにアドレス値を加算する処理がループ内に２回連続し、その処理をループにより１００回繰り返すものである。アドレス変数ｐＡにて代入されるメモリ領域サイズ（ストア・オブジェクトサイズ）とアドレス変数ｐＢにて参照されるメモリ領域サイズ（ロード・オブジェクトサイズ）は、それぞれ２ｂｙｔｅと４ｂｙｔｅでロード・オブジェクトサイズはストア・オブジェクトサイズより大きい。
【０１５７】
図１４Ｂ（ａ）は、このソースプログラム２００が図４に示すコンパイラの処理に入力され、図４のＳ１からＳ３の処理にて変換されＳ４の入力となる中間コードである。この入力された中間コード（図１４Ｂ（ａ））からは、クリティカルパス検出処理（図５のＳ１０）にて図１０Ｃ（ａ）と同様なクリティカルパスが検出される。このクリティカルパスは、１回目の＊ｐＡ＋＋によるメモリ代入処理と２回目の＊ｐＢ＋＋によるメモリ参照処理が曖昧なメモリ依存であるため、１回目の＊ｐＢによるメモリ参照と＊ｐＡによるメモリ代入と２回目の＊ｐＢによるメモリ参照と＊ｐＡによるメモリ代入の連続した処理の流れとなる。
【０１５８】
このクリティカルパスに対して、曖昧なメモリ依存検出処理（図５のＳ１１、図６）が実行される。つまり、クリティカルパス上の処理を先頭から順に探索し（図６のＳ２０）、１回目の＊ｐＡ＋＋によるメモリ代入処理と２回目の＊ｐＢ＋＋によるメモリ参照処理の曖昧なメモリ依存を検出する（図６のＳ２１）。これにより、図６のＳ２１でＹＥＳとなる。
【０１５９】
実行可否フラグとして入力された中間コードでＣ６のみ使用しているためＣ６以外の実行可否フラグレジスタ資源が存在している。このため、図６のＳ２４でＹＥＳとなる。
【０１６０】
メモリ参照処理の移動可否判定処理（Ｓ２５）では、メモリ参照処理の曖昧なメモリ依存の要因となるメモリ以外にもレジスタｒ１およびｒ１１についても考慮される。レジスタｒ１とｒ１１のそれぞれが他の処理と依存する場合も考えられるが、この場合では移動先のメモリ代入処理とメモリ参照処理までの間にレジスタｒ１とｒ１１の定義・参照による依存がない。このため、メモリ参照処理が移動可能で図６のＳ２５でＹＥＳとなる。
【０１６１】
よって、図６のＳ２６にて１回目の＊ｐＡ＋＋によるメモリ代入処理と２回目の＊ｐＢ＋＋によるメモリ参照処理が曖昧なメモリ依存関係と判断され、図５のＳ１２でＹＥＳとなり依存緩和処理（図５のＳ１３）にそれらのメモリアクセス処理の情報を渡す。その曖昧なメモリ依存となるメモリアクセス処理に対して、依存が緩和される（図５のＳ１３、図７）。
【０１６２】
得られたメモリアクセス処理の曖昧なメモリ依存は、１回目の＊ｐＡ＋＋によるメモリへの定義と２回目の＊ｐＢ＋＋によるメモリへの参照であり、メモリによる真の依存関係であるため、図７のＳ３０でＹＥＳとなり、図１４Ｂ（ｂ）の様に２回目の＊ｐＢによるメモリ参照処理を１回目の＊ｐＡによるメモリ代入処理の前に移動する（図７のＳ３１）。それらのメモリアクセス処理のｐＡによるストア・オブジェクトサイズとｐＢによるロード・オブジェクトサイズは異なるため、図７のＳ３２でＮＯとなる。
【０１６３】
図７のＳ３２でＮＯとなれば、曖昧なメモリ依存緩和最適化部１１４は、アドレス範囲比較処理をメモリ参照処理の直前に挿入する（図７のＳ３３）。アドレス範囲比較処理は、以下のようにして求められる。つまり、ｐＡによるストア・オブジェクトサイズとｐＢによるロード・オブジェクトサイズがそれぞれ２ｂｙｔｅと４ｂｙｔｅであるので、それらの最大公約数ｇｃｄは２と求められ、比較回数ｎが４ｂｙｔｅ／ｇｃｄ（２ｂｙｔｅ、４ｂｙｔｅ）で２と求められる。また、アドレス変数ｐＢに割り付けられたレジスタはｒ１、アドレス変数ｐＡに割り付けられたレジスタはｒ０であるため、アドレス範囲比較処理として、ｒ１＝＝ｒ０＋２＊０とｒ１＝＝ｒ０＋２＊１の二つのアドレス一致を比較する処理が求められる。曖昧なメモリ依存緩和最適化部１１４は、このように求められたアドレス範囲比較処理をメモリ参照処理の直前に挿入する（図７のＳ３３）。図１４Ｂ（ｂ）の中間コードでは、前記比較処理を効率的に行うために、両アドレスの排他的論理和を取り、その結果が０であるのかまたは２ｂｙｔｅだけずれているのかの比較処理を行っている。
【０１６４】
最後に、曖昧なメモリ依存で実際に依存が発生するときに論理を正しく保つために、アドレスが一致した場合に実行可否フラグレジスタによって＊ｐＢによるメモリ参照処理によって得られた値であるｒ１１に＊ｐＡによるメモリ代入処理で代入される値であるｒ１０のうちで依存があるメモリ領域部分に相当するデータ部分を上書きするように、実行可否フラグ付き補正命令を移動した＊ｐＢによるメモリ参照処理の後ろに挿入する（図７のＳ３４）。図１４Ｂ（ｂ）の中間コードでは、図１０Ｄの補正処理のメモリイメージと同様に、下位１６ｂｉｔ部分に依存がある場合は、「ｖａｌｎ  ｒ１１，ｒ１０，ｒ１１」としてｒ１１下位１６ｂｉｔにｒ１０の下位１６ｂｉｔを上書きし、上位１６ｂｉｔ部分に依存がある場合は、「ｖａｌｎ  ｒ１１，ｒ１１，ｒ１０」としてｒ１１の上位１６ｂｉｔにｒ１０の上位１６ｂｉｔを上書きする。
【０１６５】
このように、依存緩和処理（図５のＳ１３）にて依存緩和が実施されたため、図５のＳ１４でＹＥＳとなり、依存緩和後の中間コードに対してクリティカルパスを再検出すると（図５のＳ１５）、図１０Ｃ（ｂ）と同様に、クリティカルパスは、１回目の＊ｐＢによるメモリ参照と実行可否フラグ付き補正命令と＊ｐＡによるメモリ代入処理の真の依存のみからなる。すなわち、メモリ参照処理によるレイテンシを３ｃｙｃｌｅとすると、クリティカルパス長は７ｃｙｃｌｅから４ｃｙｃｌｅとなり、３ｃｙｃｌｅ短縮される。よって図５のＳ１６にてＹＥＳとなり、図５のＳ１１を再帰的に実施することになる。この例の場合は、全ての曖昧なメモリ依存が取り除かれたため、２回目の曖昧なメモリ依存検出処理（図７のＳ１１）では依存緩和対象のメモリアクセスが検出されないため、図５のＳ１２でＮＯとなり処理を終える。
【０１６６】
このように、メモリアクセス対象のサイズが異なる場合でも、曖昧なメモリ依存緩和処理（図５、図４のＳ４）を行ない、クリティカルパスを短縮することで、命令スケジューリング処理（図４のＳ５）によって、より高性能な中間コードを実現でき、アセンブラコード出力処理（図４のＳ６）にてオブジェクトコードを生成してコンパイル処理を終える。
【０１６７】
［非ループ構造・同じオブジェクトサイズアクセスの連続］
図１５Ａ〜図１５Ｃは、非ループ構造で同じオブジェクトサイズアクセスが連続している場合に対する依存緩和処理について説明するための図である。
【０１６８】
図１５Ａは、非ループ構造で同じオブジェクトサイズアクセスが連続しているソースプログラム２００の一例を示す図である。
【０１６９】
このソースプログラム２００の処理内容は、関数の引数ｐＡ、ｐＢを基準アドレスとしてｐＢが指す領域をｐＡが指す領域に代入し、ｐＡとｐＢのアドレスをそれぞれ次の要素を示すようにアドレス値を加算する処理が２回以上連続しているものである。アドレス変数ｐＡにて代入されるメモリ領域サイズ（ストア・オブジェクトサイズ）とアドレス変数ｐＢにて参照されるメモリ領域サイズ（ロード・オブジェクトサイズ）は、お互いのアドレス変数が同じ型であるため、同じである。
【０１７０】
図１５Ｂ（ａ）は、このソースプログラム２００が図４に示すコンパイラの処理に入力され、図４のＳ１からＳ３の処理にて変換されＳ４の入力となる中間コードである。この入力された中間コード（図１５Ｂ（ａ））からは、前記図８Ａ〜図８Ｃで説明した変換により、図１５Ｂ（ｂ）のように依存緩和がされた中間コードが生成され、さらに中間コード上の後続の曖昧なメモリ依存に対して同様に依存緩和を実施する。このとき、前方のアドレス比較命令検出判定処理（図７のＳ３６）において、図１５Ｃ（ａ）の中間コードの様に、3回目の＊ｐＢ＋＋によるメモリアクセス処理「ｌｄ  ｒ１２、（ｒ１＋）」の直前に「ｃｍｐｅｑ  Ｃ０，ｒ１，ｒ０」を挿入すべきであるが、前方に同様なｃｍｐｅｑ処理が存在し、かつ比較アドレス変数が、ｐＡ（ｒ０）とｐＢ（ｒ１）で、かつ直前のｃｍｐｅｑ処理から挿入予定のｌｄ処理の直前までにあるアドレス変数ｐＡとｐＢの増分値は固定であるため、アドレス比較処理を流用可能と判定される。よって、アドレス比較処理は挿入されずに、既存のアドレス比較処理の結果である実行可否フラグレジスタを流用するようにし、補正処理を挿入する（図７のＳ３９）。
【０１７１】
このように、連続するメモリアクセスの依存緩和では、アドレス比較処理を削減することで、さらに高性能な中間コード（図１５Ｃ（ｂ））を実現できる。
【０１７２】
［最適化コンパイラオプション］
最適化抑制指示となるコンパイラオプションが指定された場合は、最適化情報解析処理（図４のＳ２）にて、コンパイラオプションが解析される。その結果、例えば前記図８Ａ〜図８Ｃの最適化対象となる曖昧なメモリ依存を含むソースプログラム２００が入力された場合でも、最適化情報解析処理（図４のＳ２）の解析結果に応じて、前記と同様に変換された中間コードは図５のＳ９にてＮＯとなり、曖昧なメモリ依存緩和最適化を抑制でき、生成機械語コードサイズの増加を防ぐことができる。
【０１７３】
［プラグマ指令］
最適化特定指示となるプラグマ指令が曖昧なメモリ依存緩和に関する指定である場合は、最適化情報解析処理（図４のＳ２）にてシンボル情報を解析する。その結果、例えば前記図８Ａ〜図８Ｃの最適化対象となる曖昧なメモリ依存を含むソースプログラム２００が入力された場合、図６のＳ２２にてＹＥＳとなり、シンボル情報にｐＡとｐＢが指定されているかの一致を確認し、一致しなれていなければＳ２３でＮＯとなり次の曖昧なメモリ依存に対して処理を続行し、一致していればＳ２３でＹＥＳとなりＳ２４以後の曖昧なメモリ依存緩和処理を続行する。このように、曖昧なメモリ依存の緩和対象を特定することができ、コードサイズの増加と実行性能のバランスを調整することができる。
【０１７４】
以上説明したように、本実施の形態に係るコンパイラシステムによると、曖昧なメモリ依存処理にアドレス比較処理とその結果に応じた補正処理を挿入することで曖昧な依存を緩和している。このため、クリティカルパスが短縮され、プログラム実行時の処理速度を向上させることができる。
【０１７５】
以上、本発明の実施の形態に係るコンパイルシステムについて、実施の形態に基づいて説明したが、本発明は、この実施の形態に限定されるものではない。
【０１７６】
上記実施の形態では、Ｃ言語向けのコンパイラシステムを想定していたが、本発明はＣ言語のみに限定されるものではない。他のプログラミング言語を採用した場合でも本発明の有意性は保たれる。
【０１７７】
上記実施の形態では、プログラマが依存緩和最適化を抑制するユーザインタフェースとしてコンパイルオプションを採用していたが、本発明はこのインタフェースに限定されるものではない。例えば、プラグマ指定によって伝達してもよい。また伝達方法としても上記実施の形態のようなファイル単位で指定する方法に限らず、処理の範囲を記述する形式にしてもよい。
【０１７８】
上記実施の形態では、プログラマが依存緩和対象を指定するユーザインタフェースとしてプラグマ指令を採用していたが、本発明はこのインタフェースに限定されるものではない。例えば、オプション指定によって伝達してもよい。また伝達方法としても上記実施の形態のようなシンボル情報を記述する方法に限らず、処理の範囲を記述する形式にしてもよい。さらに、指定範囲の粒度として、より大まかな粒度として、ファイル単位で用途を指定するようにしてもよい。
【０１７９】
上記実施の形態では、メモリアクセス処理としてデータキャッシュや内蔵・外部メモリを想定していたが、本発明はメモリ空間のみに限定されるものではない。他の共有資源に対する処理でも本発明の有意性は保たれる。例えば、動的に資源が共有される可能性があるメモリマップド外部ポートへのアクセス命令等、他の命令であってもよい。
【０１８０】
上記実施の形態では、曖昧なメモリ依存に関する依存緩和を想定していたが、本発明は曖昧なメモリ依存のみに限定されるものではない。例えば、曖昧でない真の依存がある場合でも本発明の有意性は保たれる。
【０１８１】
上記実施の形態では、ターゲットプロセッサとしてインターロック（データ依存関係が生じている命令間において、先行命令の実行結果が後続命令によって参照されるレジスタにフォワーディグされていない場合に後続命令の実行がプロセッサによって動的に止められる現象）がかかることを想定していたが、本発明はこれに限定されるものではない。インターロックが発生せずに、静的にこのような問題を解決すべきアーキテクチャを採用するプロセッサにも本発明を適用することができる。
【０１８２】
例えば、曖昧なメモリ依存緩和最適化部１１４で依存を緩和するのではなく、不要なレイテンシ待ちを削除することを目的とするのなら、ロード処理・ストア処理は入れ替えずともクリティカルパスの短縮が可能となる。
【０１８３】
上記実施の形態では、前記アドレス比較処理の結果に応じた実行可否フラグによる条件付の補正処理を挿入していたが、本発明は実行可否条件を補正処理にのみ限定してつけるものではない。例えば、ロード命令にも実行可否条件をつけることで、不要となる場合のロード処理を削減可能となる。
【０１８４】
今回開示された実施の形態はすべての点で例示であって制限的なものではないと考えられるべきである。本発明の範囲は上記した説明ではなくて特許請求の範囲によって示され、特許請求の範囲と均等の意味および範囲内でのすべての変更が含まれることが意図される。
【産業上の利用可能性】
【０１８５】
本発明は動的に資源が共有される可能性がある命令の曖昧な依存を緩和するコンパイラ、ＯＳ（Ｏｐｅｒａｔｉｎｇ  Ｓｙｓｔｅｍ）、プロセッサで実行されるプロセス等に適用できる。
【図面の簡単な説明】
【０１８６】
【図１】本発明の実施の形態に係るコンパイラシステムの外観構成を示す図である。
【図２】本発明の実施の形態に係るコンパイラシステムの構成を示す図である。
【図３】コンパイラの構成を示す図である。
【図４】コンパイラが実行する処理のフローチャートである。
【図５】曖昧なメモリ依存緩和最適化処理の詳細なフローチャートである。
【図６】曖昧なメモリ依存検出処理の詳細なフローチャートである。
【図７】曖昧な依存緩和処理の詳細なフローチャートである。
【図８Ａ】非ループ構造で同じオブジェクトサイズアクセスに対する依存緩和処理について説明するための図である。
【図８Ｂ】非ループ構造で同じオブジェクトサイズアクセスに対する依存緩和処理について説明するための図である。
【図８Ｃ】非ループ構造で同じオブジェクトサイズアクセスに対する依存緩和処理について説明するための図である。
【図９Ａ】非ループ構造で異なるオブジェクトサイズアクセス（小→大）に対する依存緩和処理について説明するための図である。
【図９Ｂ】非ループ構造で異なるオブジェクトサイズアクセス（小→大）に対する依存緩和処理について説明するための図である。
【図９Ｃ】非ループ構造で異なるオブジェクトサイズアクセス（小→大）に対する依存緩和処理について説明するための図である。
【図９Ｄ】非ループ構造で異なるオブジェクトサイズアクセス（小→大）に対する依存緩和処理について説明するための図である。
【図１０Ａ】非ループ構造で異なるオブジェクトサイズアクセス（大→小）に対する依存緩和処理について説明するための図である。
【図１０Ｂ】非ループ構造で異なるオブジェクトサイズアクセス（大→小）に対する依存緩和処理について説明するための図である。
【図１０Ｃ】非ループ構造で異なるオブジェクトサイズアクセス（大→小）に対する依存緩和処理について説明するための図である。
【図１０Ｄ】非ループ構造で異なるオブジェクトサイズアクセス（大→小）に対する依存緩和処理について説明するための図である。
【図１１Ａ】ループ構造で同じオブジェクトサイズアクセスに対する依存緩和処理で、比較処理がループ外に出せる場合について説明するための図である。
【図１１Ｂ】ループ構造で同じオブジェクトサイズアクセスに対する依存緩和処理で、比較処理がループ外に出せる場合について説明するための図である。
【図１１Ｃ】ループ構造で同じオブジェクトサイズアクセスに対する依存緩和処理で、比較処理がループ外に出せる場合について説明するための図である。
【図１２Ａ】ループ構造で同じオブジェクトサイズアクセスに対する依存緩和処理で、比較処理がループ内に必要な場合について説明するための図である。
【図１２Ｂ】ループ構造で同じオブジェクトサイズアクセスに対する依存緩和処理で、比較処理がループ内に必要な場合について説明するための図である。
【図１２Ｃ】ループ構造で同じオブジェクトサイズアクセスに対する依存緩和処理で、比較処理がループ内に必要な場合について説明するための図である。
【図１３Ａ】ループ構造で異なるオブジェクトサイズアクセス（小→大）に対する依存緩和処理について説明するための図である。
【図１３Ｂ】ループ構造で異なるオブジェクトサイズアクセス（小→大）に対する依存緩和処理について説明するための図である。
【図１４Ａ】ループ構造で異なるオブジェクトサイズアクセス（大→小）に対する依存緩和処理について説明するための図である。
【図１４Ｂ】ループ構造で異なるオブジェクトサイズアクセス（大→小）に対する依存緩和処理について説明するための図である。
【図１５Ａ】非ループ構造で同じオブジェクトサイズアクセスが連続している場合に対する依存緩和処理について説明するための図である。
【図１５Ｂ】非ループ構造で同じオブジェクトサイズアクセスが連続している場合に対する依存緩和処理について説明するための図である。
【図１５Ｃ】非ループ構造で同じオブジェクトサイズアクセスが連続している場合に対する依存緩和処理について説明するための図である。
【図１６】依存緩和を説明するためのソースプログラムの一例を示す図である。
【図１７】投機実行による依存緩和を説明するためのアセンブラファイルの一例を示す図である。
【符号の説明】
【０１８７】
１００  コンパイラシステム
１１０  コンパイラ
１１１  構文解析部
１１２  最適化情報解析部
１１３  一般最適化部
１１４  曖昧なメモリ依存緩和最適化部
１１５  命令スケジューリング部
１１６  コード出力部
１２０  アセンブラ
１３０  リンカ
１４０  シミュレータ
１５０  プロファイラ
２００  ソースプログラム
２０１  キャッシュパラメータ
２１０  アセンブラファイル
２２０  オブジェクトファイル
２３０  実行プログラム
２４０  実行ログデータ
２５０  プロファイルデータ
【図１】
2008293378.tif 000003
【図２】
2008293378.tif 000004
【図３】
2008293378.tif 000005
【図４】
2008293378.tif 000006
【図５】
2008293378.tif 000007
【図６】
2008293378.tif 000008
【図７】
2008293378.tif 000009
【図８Ａ】
2008293378.tif 000010
【図８Ｂ】
2008293378.tif 000011
【図８Ｃ】
2008293378.tif 000012
【図９Ａ】
2008293378.tif 000013
【図９Ｂ】
2008293378.tif 000014
【図９Ｃ】
2008293378.tif 000015
【図９Ｄ】
2008293378.tif 000016
【図１０Ａ】
2008293378.tif 000017
【図１０Ｂ】
2008293378.tif 000018
【図１０Ｃ】
2008293378.tif 000019
【図１０Ｄ】
2008293378.tif 000020
【図１１Ａ】
2008293378.tif 000021
【図１１Ｂ】
2008293378.tif 000022
【図１１Ｃ】
2008293378.tif 000023
【図１２Ａ】
2008293378.tif 000024
【図１２Ｂ】
2008293378.tif 000025
【図１２Ｃ】
2008293378.tif 000026
【図１３Ａ】
2008293378.tif 000027
【図１３Ｂ】
2008293378.tif 000028
【図１４Ａ】
2008293378.tif 000029
【図１４Ｂ】
2008293378.tif 000030
【図１５Ａ】
2008293378.tif 000031
【図１５Ｂ】
2008293378.tif 000032
【図１５Ｃ】
2008293378.tif 000033
【図１６】
2008293378.tif 000034
【図１７】
2008293378.tif 000035