(57)【特許請求の範囲】
【請求項１】
ソースプログラムから中間コードを生成する命令解析部と生成した中間コードの余分な命令の削除等を行う命令最適化部と実行可能な目的プログラムに変換する命令変換部とを備えたコンパイラ装置であって、
命令最適化部は、命令解析部で生成した中間コードの中からストア命令、ロード命令の組を抽出するストア・ロード命令抽出手段と、
抽出したロード命令とストア命令のオペランドアドレス間の重なりを実行時に検出するためのエイリアスチェック命令を生成するエイリアスチェック命令生成手段と、
エイリアスチェック命令、ロード命令、ストア命令の順に命令列を再配置し、エイリアスチェック命令実行の結果、オペランドアドレス間の重なりが検出されたときにはロード命令の補正を行い、重なりが検出されなかったときには何も実行しないこととなる条件付命令をロード命令の元の位置に配置する命令配置手段とを有することを特徴とするコンパイラ装置。
【請求項２】
エイリアスチェック命令生成手段は、
実行時に、第１入力値と第２入力値との差の絶対値を計算し、計算した結果が第３入力値より小さいときはロード命令のオペランドアドレスとストア命令のオペランドアドレスとの重なりを示す命令について、
ストア命令のオペランドアドレスを第１入力値として設定し、
ロード命令のオペランドアドレスを第２入力値として設定し、
少なくとも１つ以上のロード命令のアドレスサイズの合計値と、少なくとも１つ以上の ストア命令のアドレスサイズの合計値とを比較して等しいかまたは大きい方のアドレスサイズの合計値を第３入力値として設定することを特徴とする請求項１記載のコンパイラ装置。
【請求項３】
１つのロード命令のデータサイズと、１つのストア命令のデータサイズとを比較して等しいときは、１をエイリアスチェック命令の第３入力値として設定し、等しくないときは、大きい方のデータサイズの値を第３入力値として設定することを特徴とする請求項２記載のコンパイラ装置。
【請求項４】
コンパイラ装置によりエイリアスチェック命令、１つ以上のストア命令の前に再配置された１つ以上のロード命令、ストア命令、ロード命令の元の位置に条件付命令の順に配置されて生成された目的プログラムを実行するプロセッサであって、
エイリアスチェック命令が、１つ以上のロード命令のオペランドアドレスと１つ以上のストア命令のオペランドアドレスとの重なりを検出したときには、チェック情報をオンにする動作を行い、
条件付命令は、チェック情報がオンのときには、前記ロード命令実行の補正を行い、オフのときには、何も実行しないことを特徴とするプロセッサ。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明は、計算機の実行の高速化のため、命令列を並べ替えて最適化処理を行うコンパイラ装置とコンパイラ装置によりコンパイルした命令列を実行するプロセッサに関する。  以下コンパイラ装置をコンパイラと記載している。
【０００２】
【従来の技術と発明が解決しようとする課題】
近年のプロセッサの性能向上はめざましいが、演算速度ほどにはメモリのアクセス速度は向上しない。
【０００３】
そのため、ロード命令のときのキャッシュミスヒットによるメモリアクセスの遅延やロード命令のときのキャッシュメモリ上のデータの転送待ちによる遅延がますます大きくなる傾向がある。
【０００４】
従って、他の命令処理との並行処理を可能にするため、メモリアクセス時間の遅いロード命令はできるだけグループ化して先行してメモリアクセスをしておくことが必要となる。
【０００５】
その為、ロード命令を先行化するコンパイラが必要となる。
【０００６】
従来例のコンパイラ１の構成図を図７に示す。
【０００７】
コンパイラ１は、ソースプログラム２から中間コードを生成する命令解析部１１と、生成した中間コードの最適化処理（最適化処理とは、余分な命令の削除、重複した命令のまとめ、より高速な命令への変換など命令列の高速化のための処理をいう。）を行う命令最適化部Ａ１２と、その最適化結果に基づき目的プログラム３のコードを生成する命令変換部１３より構成される。
【０００８】
目的プログラム３の各命令は、プロセッサ４によりフェッチされ実行される。
【０００９】
メモリアクセスの高速化のため、コンパイラ上で、ストア命令の前にロード命令を再配置して先行実行しようとすると、メモリ上のロード命令、ストア命令のオペランドアドレスがコンパイラ上では、不明の場合が発生し、ロード命令とストア命令のオペランドアドレスの重なり（以下エイリアスと呼ぶ）の解析が困難であった。
【００１０】
例えば、Ｃ言語で記述したプログラムではポインタが多用されるため、コンパイラでは、ロード命令とストア命令のエイリアス関係を検出できなかった。
【００１１】
しかし、実際のプログラムの実行上では、ほとんどロード命令とストア命令のオペランドアドレスが重なることはないため、ロード命令をストア命令の前に配置してロード命令のメモリアクセスによる遅延の影響を少なくできる可能性を活かせていなかった。
【００１２】
本発明のコンパイラの目的は、エイリアス状態をチェックするエイリアスチェック命令を生成し、ストア命令の前にロード命令を配置することで、実行時のロード命令のアクセスを高速化することである。
【００１３】
【課題を解決するための手段】
ソースプログラムから中間コードを生成する命令解析部と生成した中間コードの余分な命令の削除等を行う命令最適化部と実行可能な目的プログラムに変換する命令変換部とを備えたコンパイラであって、命令最適化部は、命令解析部で生成した中間コードの中からストア命令、ロード命令の組を抽出するストア・ロード命令抽出手段と、抽出したロード命令とストア命令のオペランドアドレス間の重なりを実行時に検出するためのエイリアスチェック命令を生成するエイリアスチェック命令生成手段と、エイリアスチェック命令、ロード命令、ストア命令の順に命令列を再配置し、エイリアスチェック命令実行時に、オペランドアドレス間の重なりが検出されたときには、ロード命令実行の補正を行い、重なりが検出されなかったときには、何も実行しない条件付命令をロード命令の元の位置に配置する命令配置手段とを有する構成である。
【００１４】
この構成により、プロセッサによる目的プログラムの実行時にエイリアスチェック命令が、エイリアス状態をチェックするので、ロード命令のストア命令の前への移動の有効性の有無が確認できる。この結果、移動が有効であれば、ロード命令が先行実行できるので、命令実行の高速化が可能となる。また移動が無効であれば、先行して実行したロード命令は無効のため、ロード命令の内容を補正するための命令（ロード命令またはムーブ命令）を実行する。この補正をする命令により、ロード命令の先行実行の内容を補正できる。
【００１５】
また、エイリアスチェック命令はストア命令のオペランドアドレスを設定する第１入力値と、ロード命令のオペランドアドレスを設定する第２入力値と、少なくとも１つ以上のロード命令のアドレスサイズの合計値と、少なくとも１つ以上のストア命令のアドレスサイズの合計値とを比較して等しいかまたは大きい方のアドレスサイズの合計値を設定する第３入力値とを有し、第１入力値と第２入力値との差の絶対値を計算し、計算した結果が第３入力値より小さいときはロード命令のオペランドアドレスとストア命令のオペランドアドレスとが重なっていることを示すチェック情報をオンにする構成である。
【００１６】
この構成により、１つ以上のロード命令を１つ以上のストア命令の前に、まとめて移動できるのでロード命令の先行実行の効果が大きくなるエイリアスチェック命令を生成できる。
【００１７】
また、１つのロード命令のデータサイズと、１つのストア命令のデータサイズとを比較して等しいときは、１をエイリアスチェック命令の第３入力値として設定し、等しくないときは、大きいデータサイズの値を第３入力値として設定する構成である。
【００１８】
この構成により、１ロード命令と１ストア命令間では、データサイズの比較のみにより、ストア命令の前へのロード命令の先行実行の有効無効を判断するエイリアスチェック命令が、生成できる。
【００１９】
また、コンパイラにより生成された目的プログラムを実行するプロセッサであって、コンパイラによって生成されたエイリアスチェック命令を実行する実行手段を有する構成である。
【００２０】
この構成により、生成されたエイリアスチェック命令を実行できるプロセッサを使用して、先行実行のためにロード命令をストア命令の前に配置した目的プログラムを実行できる。
【００２１】
【発明の実施の形態】
実施例のコンパイラ１の構成図を図１に示す。
【００２２】
コンパイルラ１は，ソースプログラム２を解析し中間コードを生成する命令解析部１１，命令の最適化処理を行う命令最適化部１２，命令最適化部１２の結果に基づき目的プログラム３のコードを生成する命令変換部１３からなる。
【００２３】
命令最適化部１２は、命令最適化部Ａと命令最適化部Ｂとからなる。
【００２４】
命令最適化部Ａは、従来と同様に余分な命令の削除、重複した命令のまとめ、より高速な命令への変換など命令列の高速化のための処理を行う。
【００２５】
命令最適化部Ｂは、ロード命令とストア命令のエイリアス状態のチェックを行うエイリアスチェック命令の生成処理とエイリアスチェック命令、ロード命令、ストア命令等の命令列の配置処理を行うことで命令列の高速化のための処理を行う。
【００２６】
プロセッサ４は、コンパイラ１で生成した目的プログラムを入力してエイリアスチェック命令を含む各命令を実行する。
【００２７】
コンパイルラ１は，ソースプログラムを命令解析部１１に入力すると、文法チェックを行いエラーがなければ、中間コードを生成する。
【００２８】
生成された中間コードを命令最適化部１２に入力し、最適化処理を行う。
【００２９】
本発明の特徴である命令最適化部Ｂについて説明を行う。
【００３０】
図２に命令最適化部Ｂの流れ図を示す。
（１）  中間コードの中から、ロード命令とストア命令のグループを検出する。（Ｓ１ステップ）
（２）  検出した命令を基に、エイリアスチェック命令生成処理を行う。（Ｓ２ステップ）
（３）  エイリアスチェック命令に続けてストア命令の前にロード命令を配置する。（Ｓ３ステップ）
（４）  エイリアスチェック命令の第３入力値が１か否かのチェックを行う。（Ｓ４ステップ）
（５）  第３入力値が１でなければ元のロード命令の位置に条件付ロード命令を配置する。（Ｓ５ステップ）
（６）  第３入力値が１のときは元のロード命令の位置に条件付ムーブ命令を配置する。（Ｓ６ステップ）
図３には、エイリアスチェック命令生成処理の流れ図を示す。
【００３１】
エイリアスチェック命令とは、ロード命令とストア命令のオペランドアドレス（以下アドレスと略す。）のエイリアス状態をチェックする命令である。
【００３２】
エイリアスチェック命令は、ｖａｉｌｉａｓ    ａ１，ａ２，ｘ  と表す。
【００３３】
第１入力値ａ１：ストア命令のアドレス
第２入力値ａ２：ロード命令のアドレス
第３入力値ｘ：所定値
プロセッサ４による目的プログラム３の命令実行時にプロセッサ４は、ストア命令のアドレス、ロード命令のアドレスとを比較して、所定値以上であれば、アドレスが重ならないことを示すチェック情報（以下コンディションコードｃｃのｚフラグと呼ぶ）をオフとする。そしてＳ３ステップで移動したロード命令の実行を有効とする。
【００３４】
この時、元のロード命令の位置でのＳ５ステップで生成した条件付ロード命令またはＳ６ステップで生成した条件付ムーブ命令は、何も実行しない。
【００３５】
また、ストア命令とロード命令のアドレスの差が所定値より小さければ、アドレスが重なっていることを示すｃｃのｚフラグをオンとして、移動したロード命令の実行を無効とみて、元のロード命令の位置で、条件付きロード命令により、再度同じロード命令を実行するか又は、条件付ムーブ命令により所定のレジスタにムーブすることにより、ロード命令の補正処理を実行する。
【００３６】
コンパイラ１でのエイリアスチェック命令の生成について説明する。
【００３７】
複数のロード命令を複数のストア命令を超えて移動させる例を示す。
（１）  ストア命令のＮ個のグループを検索し、その基準アドレスを示すレジスタを第１入力値にセットする。（Ｓ２１ステップ）
（２）  ロード命令のＭ個のグループを検索し、その基準アドレスを示すレジスタを第２入力値にセットする。（Ｓ２２ステップ）
（３）  Ｎ＝Ｍ＝１か否かをチェックする。（Ｓ２３ステップ  ）
（４）  ストア命令のＮ個のグループと、ロード命令のＭ個のグループの各アドレスサイズの合計値を取得し、比較する。（Ｓ２４ステップ）
（５）  Ｎ＝Ｍ＝１ならロード命令とストア命令のデータサイズが等しいか否かをチェックする。（Ｓ２５ステップ）
（６）  Ｎ＝Ｍ＝１で、ロード命令とストア命令のデータサイズが等しいときは、第３入力値を１とする。（Ｓ２６ステップ）
（７）  Ｎ＝Ｍ＝１で、ロード命令とストア命令のデータサイズが等しくないときはデータサイズの大きな方の値を第３入力値としてセットする。（Ｓ２７ステップ）
（８）  ロード命令またはストア命令が複数命令であれば、アドレスサイズが等しい値かまたは大きい値の方の値を第３入力値としてセットする。（Ｓ２８ステップ）
（９）  上記第１〜第３の入力値を基にエイリアスチェック命令を生成する。（Ｓ２９ステップ）
以下に具体例を示す。
【００３８】
図４に、実施例１のエイリアスチェック命令生成時の命令列を示す。
【００３９】
また、図４ａ  は生成前の命令列、図４ｂ  は、生成後の命令列を示す。
【００４０】
まず生成前の命令列を基にエイリアスチェック命令を生成する。
【００４１】
命令列が複数のロード命令、複数のストア命令の順番に配置されているとすると、エイリアスチェック命令の生成処理は次のように行う。
【００４２】
ストア命令のグループを検索した結果、ストア命令のデータサイズが１バイトの命令とすると、グループのアドレスサイズは、アドレス〔ｒ１〕から〔ｒ１＋１〕までの２バイトである。（図４ａ  の▲２▼▲４▼）
従ってエイリアスチェック命令の第１入力値は、〔ｒ１〕である。
【００４３】
一方ロード命令は、データサイズ４バイトの命令とするとアドレスサイズは、アドレス〔ｒ２〕から〔ｒ２＋１１〕まの１２バイトである。（図４ａ  の▲１▼▲３▼▲５▼）
従ってエイリアスチェック命令の第２入力値は、〔ｒ２〕である。
【００４４】
次に、ストア命令のアドレスサイズ２バイトと、ロード命令のアドレスサイズ１２バイトとを比較すると、ロード命令のアドレスサイズが大きいので、その値の１２を第３入力値とする。
【００４５】
図５に、実施例１のアドレスサイズの説明図を示す。
【００４６】
実際にロード命令とストア命令の重なる範囲は、〔ｒ２〕から〔ｒ２＋１１〕の間である。しかし、エイリアスチェック命令は、〔ｒ２−１１〕から〔ｒ２＋１１〕の間は、アドレスが重なると判断する。これは、〔ｒ２−１１  〕から〔ｒ２＋１１〕に〔ｒ１〕があるとエイリアスになる可能性があるため、その範囲に〔ｒ１〕がないことを判断している。これにより命令を複数命令でなく１命令で処理することができるため、処理の高速化が可能となる。
【００４７】
次に命令の配置処理について説明する。
【００４８】
図４ｂ  には、エイリアスチェック命令生成後の命令列を示す。
【００４９】
エイリアスチェック命令（図４ｂ  ▲１▼）の次に、複数のストア命令を飛び越して、グループ化した複数のロード命令を配置する。（図４ｂ  ▲２▼▲３▼▲４▼）
次に、ストア命令と元のロード命令の位置との配置関係を保ったまま、ロード命令に続けてストア命令等を配置する。（図４ｂ  ▲５▼▲７▼）
次に、元のロード命令の位置に条件付ロード命令を配置する。（図４ｂ  の▲６▼  ▲８▼）
以上により、命令配置処理は、終了する。
【００５０】
このように配置した命令列を命令変換部１３で、目的プログラム３に変換後、そのプログラムをプロセッサ４が実行すると、次のような動作を行う。
【００５１】
エイリアスチェック命令の実行により、｜ｒ１−ｒ２  ｜の値が第３入力値よりも小さければ、ｃｃフラグのｚフラグをオンとする。大きければオフとする。
【００５２】
アドレス〔ｒ２〕、〔ｒ２＋４〕、〔ｒ２＋８〕から各４バイトのデータをレジスタｒ３０  、レジスタｒ３１、レジスタｒ３２にロードする。（図４ｂ  ▲２▼▲３▼▲４▼）
アドレス〔ｒ１〕の示すアドレスにレジスタｒ１０の示すデータをストアする。
（図４ｂ  ▲５▼）
条件付ロード命令になると、ｚフラグがオンの場合にのみ、アドレス〔ｒ２＋４〕から４バイトのデータをレジスタｒ３１に再ロードする。（図４ｂ  の▲６▼）
ｚフラグがオフの場合は、何もせずに次の命令に進む。
アドレス〔ｒ１＋１〕の示すアドレスにレジスタｒ１１の示すデータをストアする。（図４ｂ  ▲７▼）
条件付ロード命令になると、ｚフラグがオンの場合にのみ、
アドレス〔ｒ２＋８〕から４バイトのデータをレジスタｒ３２にロードする。
（図４ｂ  ▲８▼）
ｚフラグがオフの場合は、何もせずに次の命令に進む。
【００５３】
このように、コンパイラ１がエイリアスチェック命令を条件付ロード命令とペアで、生成することで、プロセッサが命令の実行を高速化できる。
【００５４】
図６には、実施例２のエイリアスチェック命令生成時の命令列を示す。
【００５５】
図６ａ  には、生成前の命令列、図６ｂ  には、生成後の命令列を示す。
【００５６】
エイリアスチェック命令生成前の命令列が１つのストア命令、１つのロード命令の順番に配置されている。
【００５７】
エイリアスチェック命令の生成処理は次のように行う。
【００５８】
ストア命令のグループを検索した結果、ストア命令がアドレス〔ｒ１〕でデータ幅が４バイトの命令とするとエイリアスチェック命令の第１入力値は、〔ｒ１〕である。（図６ａ  ▲１▼）
一方ロード命令は、アドレス〔ｒ２〕でデータ幅４バイトの命令のためエイリアスチェック命令の第２入力値は、〔ｒ２〕である。（図６ａ  ▲２▼）
次にストア命令のデータサイズとロード命令のデータサイズとを比較すると、両者が等しいので、第３入力値を１とする。
【００５９】
次に命令の配置処理について説明する。
【００６０】
図６ｂ  には、実施例２のエイリアスチェック命令生成時の命令列を示す。
【００６１】
エイリアスチェック命令（図６ｂ  ▲１▼）の次に、ストア命令を飛び越して、ロ  ード命令を配置する。（図６ｂ  ▲２▼）
次に、ストア命令と元のロード命令の位置との配置関係を保ったまま、ロード命令に続けてストア命令を配置する。（図６ｂ  ▲３▼）
次に元のロード命令の位置にチェックムーブ命令を配置する。（図６ｂ  ▲４▼）
以上により、命令の配置処理は、終了する。
【００６２】
プロセッサ４により、上記の命令を実行するときは、エイリアスチェック命令の実行により、｜ｒ１−ｒ２  ｜の値が１より小さければ、ｃｃフラグのｚフラグをオンとする。大きければオフとする。（図６ｂ  ▲１▼）
アドレス〔ｒ２〕から４バイトをレジスタｒ３にロードし、レジスタｒ０をアドレス〔ｒ１〕から４バイトにストアする。（図６ｂ  ▲２▼▲３▼）
チェックムーブ命令になると、ｚフラグがオンの場合にのみ、レジスタｒ０の内容をレジスタｒ３ヘ転送する。（図６ｂ  ▲４▼）
ｚフラグがオフの場合は、何もせずに次の命令に進む。
【００６３】
このように、コンパイラ１がエイリアスチェック命令を条件付ムーブ命令とペアで、生成することで、プロセッサが命令の実行を高速化できる。
【００６４】
【発明の効果】
本方式により、ロード命令のキャッシュミスヒットなどによるメモリアクセス遅延の影響を小さくすることができる。
【図面の簡単な説明】
【図１】実施例のコンパイラの構成図
【図２】実施例の命令最適化部Ｂの流れ図
【図３】実施例のエイリアスチェック命令生成処理の流れ図
【図４】実施例１のエイリアスチェック命令生成時の命令列
【図５】実施例１のアドレスサイズの説明図
【図６】実施例２のエイリアスチェック命令生成時の命令列
【図７】従来例のコンパイラの構成図
【符号の説明】
１      コンパイラ
２      ソースプログラム
３      目的プログラム
４      プロセッサ
１１      命令解析部
１２      命令最適化部
１３      命令変換部
【図１】
0003608446.tif 000002
【図２】
0003608446.tif 000003
【図３】
0003608446.tif 000004
【図４】
0003608446.tif 000005
【図５】
0003608446.tif 000006
【図６】
0003608446.tif 000007
【図７】
0003608446.tif 000008