(57)【要約】  処理部を含むシステムの性能を向上する情報処理装置等を提供する。  本開示の一態様に係る情報処理装置は、第１言語のプログラムにおいて、複数の第１命令シーケンスを特定し、前記複数の第１命令シーケンスの各々は、前記第１言語とは異なる第２言語の複数の第２命令シーケンスによってそれぞれ得られる１つの結果を導き、前記複数の第２命令シーケンスは、前記第１命令シーケンスに共通の演算子を含む、代替パターン特定部８６２と、前記複数の第２命令シーケンスの前記演算子に対して、割合を決定するパターン選択部８６５と、前記割合に基づいて、前記複数の第１命令シーケンスのそれぞれに対して前記複数の第２命令シーケンスから１つの第２命令シーケンスを選択する命令スケジューラ８７０と、を備える。【選択図】図８
2019517068.tif 000002
【特許請求の範囲】
【請求項１】
第１言語のプログラムにおいて、複数の第１命令シーケンスを特定し、前記複数の第１命令シーケンスの各々は、前記第１言語とは異なる第２言語の複数の第２命令シーケンスによってそれぞれ得られる１つの結果を導き、前記複数の第２命令シーケンスは、前記第１命令シーケンスに共通の演算子を含む、代替パターン特定手段と、
前記複数の第２命令シーケンスの前記演算子に対して、割合を決定するパターン選択手段と、
前記割合に基づいて、前記複数の第１命令シーケンスのそれぞれに対して前記複数の第２命令シーケンスから１つの第２命令シーケンスを選択する命令スケジューラ手段と、
を備える情報処理装置。
【請求項２】
コンピュータシステムの、前記複数の第２命令シーケンスによってそれぞれ表される実行可能命令である第３命令シーケンスを前記コンピュータシステムが実行する際に使用されるリソースの状態である、リソース状態を取得する監視手段をさらに備え、
前記パターン選択手段は、前記リソース状態を取得するのに応じて、前記リソース状態に基づいて前記割合を決定し、
前記命令スケジューラ手段は、前記複数の第２命令シーケンスを、前記コンピュータシステムに供給される前記第３命令シーケンスへ変換する、
請求項１に記載の情報処理装置。
【請求項３】
前記パターン選択手段は、実行可能な前記第２命令シーケンスの前記演算子に対して、前記割合を決定する、
請求項２に記載の情報処理装置。
【請求項４】
前記演算子は、前記コンピュータシステムのプロセッサの演算ユニットと関連付けられており、
前記パターン選択手段は、前記演算ユニットの性能に基づいて、前記割合を決定する、
請求項１乃至３のいずれか１項に記載の情報処理装置。
【請求項５】
第１言語のプログラムにおいて、複数の第１命令シーケンスを特定し、前記複数の第１命令シーケンスの各々は、前記第１言語とは異なる第２言語の複数の第２命令シーケンスによってそれぞれ得られる１つの結果を導き、前記複数の第２命令シーケンスは前記第１命令シーケンスに共通の演算子を含む、特定することと、
前記複数の第２命令シーケンスの前記演算子に対して、割合の決定を行い、
前記割合に基づいて、前記複数の第１命令シーケンスのそれぞれに対して、前記複数の第２命令シーケンスから１つの第２命令シーケンスを選択する、
情報処理方法。
【請求項６】
コンピュータシステムの、前記複数の第２命令シーケンスによってそれぞれ表される実行可能命令である第３命令シーケンスを前記コンピュータシステムが実行する際に使用されるリソースの状態である、リソース状態を取得し、
前記複数の第２命令シーケンスを、前記コンピュータシステムに供給される前記第３命令シーケンスへ変換し、
前記決定は、前記リソース状態を取得するのに応じて、前記リソース状態に基づいて前記割合を決定することを含む、
請求項５に記載の情報処理方法。
【請求項７】
前記決定は、実行可能な前記第２命令シーケンスの前記演算子に対して、前記割合を決定することを含む、
請求項６に記載の情報処理方法。
【請求項８】
前記演算子は、前記コンピュータシステムのプロセッサの演算ユニットに関連付けられており、
前記決定は、前記演算ユニットの性能に基づいて、前記割合を決定することを含む、
請求項５乃至７のいずれか１項に記載の情報処理方法。
【請求項９】
コンピュータに、
第１言語のプログラムにおいて、複数の第１命令シーケンスを特定し、前記複数の第１命令シーケンスの各々は、前記第１言語とは異なる第２言語の複数の第２命令シーケンスによってそれぞれ得られる結果を導き、前記複数の第２命令シーケンスは、前記第１命令シーケンスに共通の演算子を含む、代替パターン特定処理と、
前記複数の第２命令シーケンスの前記演算子に対して、割合を決定するパターン選択処理と、
前記割合に基づいて、前記複数の第１命令シーケンスのそれぞれに対して前記複数の第２命令シーケンスから１つの第２命令シーケンスを選択する命令スケジューラ処理と、
を実行させるプログラムを記憶する記憶媒体。
【請求項１０】
コンピュータに、
コンピュータシステムの、前記複数の第２命令シーケンスによってそれぞれ表される実行可能命令である第３命令シーケンスを前記コンピュータシステムが実行する際に使用されるリソースの状態である、リソース状態を取得する監視処理
をさらに実行させ、
前記パターン選択処理は、前記リソース状態を取得するのに応じて、前記リソース状態に基づいて前記割合を決定し、
前記命令スケジューラ処理は、前記複数の第２命令シーケンスを、前記コンピュータシステムに供給される前記第３命令シーケンスへ変換する、
前記プログラムを記憶する請求項９に記載の記憶媒体。
【発明の詳細な説明】
【技術分野】
【０００１】
本開示は情報処理分野に関する。本開示は特にコンパイラの命令選択に関する。
【背景技術】
【０００２】
ハードウェアに近い言語、例えばアセンブリ言語でアプリケーションプログラム（以下、「アプリケーション」とも称する）を開発することには、難しい、エラーが発生しやすい、時間がかかる、といった一定の制約がある。そのため、実際のアプリケーションがそのアプリケーションプログラムを実行するハードウェアアーキテクチャに依存しないようにしておくために、高水準言語が導入された。高水準言語と、アセンブリ言語や機械語などの低水準言語の間の隔たりを埋めるために、変換がコンパイラに導入され、コンパイラが、アプリケーションプログラムを書くのに使われている高水準言語を低水準言語へ変換する。そして、低水準言語への変換により生成されたプログラムが、メモリへロードされて、プロセッサにより実行される。
【０００３】
コンパイラは、ソース言語（すなわち、高水準言語の一つ）で書かれたソースプログラムを、コンピュータが理解できる目的言語（例えば低水準言語）の目的プログラムへ変換するプログラム又はプログラムの組である。コンパイラの動作は３つのフェーズ、すなわちフロントエンドフェーズ、コード最適化フェーズ及びバックエンドフェーズに大別される。フロントエンドフェーズはさらに３つのサブフェーズ、すなわち字句解析フェーズ、構文解析フェーズ、及び意味解析フェーズへ分けられる。フロントエンドフェーズの入力はソースプログラムであり、フロントエンドフェーズの出力は中間コードであり、中間コードは「中間表現」とも呼ばれる。コード最適化フェーズで使われる技術には、フロントエンドフェーズからコード最適化部フェーズへの入力として与えられた中間コードを最適化するための、マシン固有の、及び、マシン固有ではない、いくつかの異なる技術が含まれる。コード生成フェーズとしても知られるバックエンドフェーズは、３つのサブフェーズ、すなわち命令選択フェーズ、命令スケジューリングフェーズ、及びレジスタ割り当てフェーズへ分けられる。通常、入力されたソースコードは順次すべてのフェーズで処理され、したがって、最初のフェーズの出力が２番目のフェーズへ入力され、２番目のフェーズの出力が３番目のフェーズへ入力されるなどされる。その結果、コード最適化フェーズの出力がコード生成フェーズへ入力として与えられる。
【０００４】
中間コードは、プログラミング言語（すなわち高水準言語の一つ）で書かれたソースプログラムとはあまり似ていない中間表現（ｉｎｔｅｒｍｅｄｉａｔｅ  ｒｅｐｒｅｓｅｎｔａｔｉｏｎ、以下、「ＩＲ」とも表記する）を含み、一連の、中間命令、すなわちマシンアーキテクチャに依存しない命令であってよい。低水準言語のコード（すなわちアセンブリコード）は、一連の、低水準命令、すなわちマシンアーキテクチャに依存するアセンブリ（又は機械）命令を含む。
【０００５】
コード生成部は、ＩＲを、対象アーキテクチャのアセンブリ命令セット（すなわち１つ又は複数のアセンブリ命令）へ変換する。換言すると、コード生成部はＩＲをアセンブリ命令セットへマッピングする。そのようなマッピングを行うため、コード生成部は、ＩＲを実装するのに使われるアセンブリ（又は機械）命令を、命令セットアーキテクチャ（ｉｎｓｔｒｕｃｔｉｏｎ  ｓｅｔ  ａｒｃｈｉｔｅｃｔｕｒｅ、ＩＳＡ）から決定する。アセンブリ命令は、命令選択フェーズの処理を行うモジュールである、命令選択部によって決定される（すなわち選択される）。選択されたアセンブリ命令のアセンブリコード内での順番を決定する必要がある。命令スケジューラフェーズの処理を行うモジュールである命令スケジューラによって、選択された命令の順番が決定される（すなわち、選択されたアセンブリ命令がスケジューリングされる）。選択されたアセンブリ命令がスケジューリングされた後、アセンブリ命令のそれぞれにハードウェアレジスタを割り当てる必要がある。ハードウェアレジスタは、レジスタ割当てフェーズでアセンブリ命令に個別に割り当てられる。
【０００６】
命令選択を行うコンパイラは、入力されたＩＲに含まれる１つ又は複数の中間命令シーケンスを最適なアセンブリ命令シーケンスへマッピングする。中間命令シーケンス内の１つの中間命令シーケンスは、一連の（すなわち１つ又は複数の）中間命令であってよい。中間命令シーケンスは、１つの中間命令であってよい。１つのアセンブリ命令シーケンスは、一連の（すなわち１つ又は複数の）アセンブリ命令であってよい。アセンブリ命令シーケンスは、１つのアセンブリ命令であってよい。中間命令のそれぞれは、１つ又は複数のアセンブリ命令へマッピングされてよい。そのようなマッピングは、何らかの種類の、テンプレート又はパターンマッチングを用いて実行される。単一の算術演算又は論理演算は、様々な方法で実行できるため、コンパイラは、プロセッサがサポートする１つより多いアセンブリ演算又は命令のうちのいずれか一つを使って、同じＩＲ命令を実現できる状況に遭遇することがある。例えば、整数に２の整数乗を掛ける乗算は、乗算（２を掛ける）、又は左シフト演算（１だけ左にシフトする）のどちらでも実現できる。同様に、２の整数乗による整数の除算は、除算（２で割る）、又は右シフト演算（１だけ右にシフトする）のどちらでも実現できる。よって、単一の算術演算は、いくつかの代替演算のうちいずれか一つを使って実現できる。同様に、単一の論理演算は、１つより多い代替演算のうちいずれか一つを使って実現できる。これらの代替演算は互いに異なるが、結局は同じ結果を生む。
【０００７】
異なる問題又は異なる市場区分を対象としたアプリケーションプログラムは、通常、要求が異なる。あるアプリケーションプログラムでは、いくつかの計算が他の計算と比べてずっと頻繁に行われる。したがって、コンピュータがすべての種類のアプリケーションプログラムに対して最も良く動作する単一のコンピュータアーキテクチャを設計することは簡単ではない。その結果、このことは、コンピュータアーキテクチャの設計者が、特定の種類のアプリケーションプログラムにより合ったアーキテクチャを設計する誘因となった。こうした新しいアーキテクチャを活用するため、ある特定のアーキテクチャ上で特定のアプリケーションプログラムが有利であるように、より複雑で効率的な命令セットが設計された。
【０００８】
例えば、行列演算は、イメージレンダリングのアプリケーションプログラムの基盤である。行列を操作する際の非常に基本的な演算の１つは、２つの要素を掛け、その結果を第３の要素へ可算することであり、これには３つのオペランドが必要となる。この演算は非常に一般的に見られるため、多くの種類のアーキテクチャの命令セットに、このような演算のための特別命令、すなわちＭＡＤＤ（Ｍｕｌｔｉｐｌｉｃａｔｉｏｎ  ａｎｄ  ＡＤＤｉｔｉｏｎ）が導入されている。現代のＧＰＵ（Ｇｒａｐｈｉｃａｌ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ）のアーキテクチャは、ＭＡＤＤ演算にとっての原動力であり、これにより、ＧＰＵは、非常に短い時間内で、驚くべき回数のそのような計算を実行できる。現代のＧＰＵアーキテクチャが誘因となり、設計者は、命令セット内に類似の複数の命令も有する多くの汎用アーキテクチャを設計する。加算の後に乗算が続かない場合、及び別々の加算と乗算が単独で実行される必要がある場合に計算を容易にするため、命令セットは、通常、加算演算及び乗算演算のための別々の命令、例えばＡＤＤ（ＡＤＤｉｔｉｏｎ）及びＭＵＬ（ＭＵＬｔｉｐｌｉｃａｔｉｏｎ）も含む。
【０００９】
要約すると、同じＩＲ命令は２つ以上の代替のアセンブリ命令によって実現できる。同じ計算が、単一の演算（例えばＭＡＤＤ）、又は、２つ以上の演算（例えばＭＵＬ及びＡＤＤ）の列のいずれによっても実現できる。
【００１０】
上述の２つの理由により、コンパイラは、一般に、同じ最終結果を生む複数の代替アセンブリ命令の中から、一つの命令を選択する。
【００１１】
命令選択フェーズの処理を行うモジュールである命令選択部は、２つ以上の可能な代替の目的アセンブリ命令シーケンスを有する、命令の中間表現（すなわち１つ又は複数のＩＲ命令）を特定する。その後、命令選択部は、利用可能な代替アセンブリ命令シーケンスから、基準に基づいて１つの最適なアセンブリ命令シーケンスを選択する。最適性の基準は、実行ファイルのサイズ、実行ファイルの速度、レジスタ圧力、生存レジスタ数、及び、その他の要因などの、様々な要因に依存していてよい。基準とは独立に、命令選択部は、１つ又は複数のＩＲ命令シーケンスを、単一の最適なアセンブリ命令シーケンスへ常に変換する。ＩＲ命令シーケンスは、１つのＩＲ命令、又は、一連のＩＲ命令である。
【００１２】
命令選択部は、コンパイル時に、命令選択、すなわちアセンブリ命令シーケンスの選択を行ってよい。命令選択は、命令スケジューリングとは独立に行われてよい。命令選択は、特許文献１に記載されている命令スケジューリングと共に行われてよい。特許文献１の命令選択では、同じＩＲ命令シーケンスが１つの最もよいアセンブリ命令シーケンスへマッピングされる。
【先行技術文献】
【特許文献】
【００１３】
【特許文献１】米国特許第７，３３０，９６２号
【発明の概要】
【発明が解決しようとする課題】
【００１４】
命令選択は、アプリケーションの総実行時間において重大な役割を果たしている。どのようなＩＲ命令シーケンスに対しても最適なアセンブリ命令シーケンスを選択するという問題は、コンパイラの核心に属する。最適なアセンブリ命令シーケンスを選択することにより、アプリケーションの実行に利用可能な複雑なハードウェアアーキテクチャをコンパイラがどれだけ上手く活用できるかが決まる。
【００１５】
特許文献１に係るコンパイラは、各ＩＲ命令シーケンスに対して、代替アセンブリ命令シーケンスを含むリストから、１つの最適なアセンブリ命令シーケンスを選択する。
【００１６】
ソースプログラムが、ループ文及び「ｇｏｔｏ」文等の反復を含む場合、ソースプログラムから生成されたＩＲにおいて、少なくとも１つのＩＲ命令シーケンスが、１回よりも多く繰り返される。あるＩＲ命令シーケンスが２回以上繰り返される場合、コンパイラは、そのＩＲ命令シーケンスに対する最適なアセンブリ命令シーケンスを、１回よりも多く選択する。
【００１７】
ソースプログラムから生成されたプログラムを実行するプロセッサは、それぞれ、ＭＡＤＤ、ＡＤＤ、及び、ＭＵＬ等の異なる命令を実行するよう構成されている、専用実行ユニットを備えていてよい。そのような場合、１回よりも多く選択された最適なアセンブリ命令シーケンスは、その最適なアセンブリ命令シーケンスに含まれるアセンブリ命令に対応する命令を実行するよう構成された、１つの実行ユニットだけの負荷を増やすことがある。１つの実行ユニットだけの負荷の増加は、プロセッサを含むシステムの性能に悪影響を及ぼしうる。なぜなら、その１つの実行ユニットが１回よりも多く選択されたアセンブリ命令シーケンスに対応する命令を繰り返し実行する一方で、その１つの実行ユニット以外の実行ユニットがアイドル状態に保たれることがあるからである。
【００１８】
本開示の目的の一つは、実行ユニットを含むシステムの性能を改善する情報処理装置等を提供することである。
【課題を解決するための手段】
【００１９】
本開示の一態様に係る情報処理装置は、第１言語のプログラムにおいて、複数の第１命令シーケンスを特定し、前記複数の第１命令シーケンスの各々は、前記第１言語とは異なる第２言語の複数の第２命令シーケンスによってそれぞれ得られる１つの結果を導き、前記複数の第２命令シーケンスは、前記第１命令シーケンスに共通の演算子を含む、代替パターン特定手段と、前記複数の第２命令シーケンスの前記演算子に対して、割合を決定するパターン選択手段と、前記割合に基づいて、前記複数の第１命令シーケンスのそれぞれに対して前記複数の第２命令シーケンスから１つの第２命令シーケンスを選択する命令スケジューラ手段と、を備える。
【００２０】
本開示の一態様に係る情報処理方法は、第１言語のプログラムにおいて、複数の第１命令シーケンスを特定し、前記複数の第１命令シーケンスの各々は、前記第１言語とは異なる第２言語の複数の第２命令シーケンスによってそれぞれ得られる１つの結果を導き、前記複数の第２命令シーケンスは前記第１命令シーケンスに共通の演算子を含む、特定することと、前記複数の第２命令シーケンスの前記演算子に対して、割合の決定を行い、前記割合に基づいて、前記複数の第１命令シーケンスのそれぞれに対して、前記複数の第２命令シーケンスから１つの第２命令シーケンスを選択する。
【００２１】
本開示の一態様に係る記憶媒体は、コンピュータに、第１言語のプログラムにおいて、複数の第１命令シーケンスを特定し、前記複数の第１命令シーケンスの各々は、前記第１言語とは異なる第２言語の複数の第２命令シーケンスによってそれぞれ得られる結果を導き、前記複数の第２命令シーケンスは、前記第１命令シーケンスに共通の演算子を含む、代替パターン特定処理と、前記複数の第２命令シーケンスの前記演算子に対して、割合を決定するパターン選択処理と、前記割合に基づいて、前記複数の第１命令シーケンスのそれぞれに対して前記複数の第２命令シーケンスから１つの第２命令シーケンスを選択する命令スケジューラ処理と、を実行させるプログラムを記憶する。本開示の一態様は、その記憶媒体に格納されているプログラムによっても実現されうる。
【発明の効果】
【００２２】
本開示によれば、実行ユニットを含むシステムの性能を改善できる。
【図面の簡単な説明】
【００２３】
【図１】本開示の実施形態に係る情報処理装置を実現できるコンピュータシステムの構成のブロック図である。
【図２】本開示の第１実施形態に係る情報処理装置の概略的な構成のブロック図である。
【図３】本開示の第１実施形態に係るコード生成部の詳細な構成のブロック図である。
【図４】本開示の第１実施形態に係る情報処理装置の詳細な構成のブロック図である。
【図５】本開示の第２実施形態に係る情報処理装置の構成例のブロック図である。
【図６Ａ】本開示の第１実施形態に係る情報処理装置の動作全体の例のフローチャートである。
【図６Ｂ】本開示の第１実施形態に係る情報処理装置のコード生成処理例のフローチャートである。
【図６Ｃ】本開示の第１実施形態に係る情報処理装置の変換処理の例のフローチャートである。
【図６Ｄ】本開示の第１実施形態に係る情報処理装置のスケジューリング処理の例のフローチャートである。
【図７Ａ】本開示の第２実施形態に係る情報処理装置での動作全体の例のフローチャートである。
【図７Ｂ】本開示の第２実施形態に係る情報処理装置５００のコード生成処理における動作例のフローチャートである。
【図７Ｃ】本開示の第２実施形態に係る情報処理装置の変換処理の動作例のフローチャートである。
【図７Ｄ】本開示の第２実施形態に係る情報処理装置のスケジューリング処理の動作例のフローチャートである。
【図７Ｅ】本開示の第２実施形態に係る情報処理装置の選択処理の動作例のフローチャートである。
【図８】本開示の第３実施形態に係る情報処理装置の構成例のブロック図である。
【図９】本開示の第３実施形態に係る情報処理装置の動作例である。
【発明を実施するための形態】
【００２４】
図１は、本開示の以下で説明する実施形態に係る情報処理装置を実現できるコンピュータ１００（「コンピュータシステム」とも表記する）の構成のブロック図である。コンピュータシステム１００は、プロセッサ１１０、キャッシュサブシステム１２０、ＧＰＵサブシステム１３０、画像出力装置１４０、メモリブリッジ１５０、Ｉ／Ｏ（Ｉｎｐｕｔ／Ｏｕｔｐｕｔ）サブシステム１６０、入力装置１７０（例えばマウス１７１やキーボード１７２）、メモリサブシステム１８０、及び二次記憶装置１９０を含む。コンピュータシステム１００は、複数の画像出力装置１４０を含んでいてよい。プロセッサ１１０は、レジスタ１１１を含む。レジスタ１１１は、プロセッサ１１０に含まれる実行ユニットによって使用されるデータを、キャッシュサブシステム１２０からステージするのに使われる。プロセッサ１１０のレジスタ１１１及び他の部分は、レイテンシを削減するために、同じチップ上に存在する。キャッシュサブシステム１２０は、２以上のレベルのキャッシュを有していてよい。プロセッサ１１０及びキャッシュサブシステムの少なくとも１つのレベルは、同じチップ上に実装されていてよい。レベルの数（例えばレベル１、レベル２、レベル３、など）及び場所（プロセッサ１１０のチップ上、又はチップの外）は、異なるアーキテクチャを有するシステムの間で異なっていてよい。したがって、異なるアーキテクチャを有するシステム間での構成の変異の単純化のため、キャッシュサブシステム１２０は、プロセッサ１１０から分離されたモジュールとして示されている。キャッシュサブシステム１２０は、メモリブリッジ１５０を介してメモリサブシステム１８０へ接続されている。メモリブリッジ１５０は、ＧＰＵサブシステム１３０及びＩ／Ｏサブシステム１６０へ接続されている。ＧＰＵサブシステム１３０は、画像出力装置１４０へ接続されている。Ｉ／Ｏサブシステム１６０は、入力／出力装置へ接続されている。メモリサブシステム１８０は、二次記憶装置１９０へ接続されている。ＯＳ（オペレーティングシステム）１８１、ドライバ１８２及びアプリケーション１８３などのプログラムは、メモリサブシステム１８０へロードされている。
【００２５】
二次記憶装置１９０の例は、ＨＤＤ（ハードディスクドライブ）等である。二次記憶装置１９０は、コンピュータ１００を以下で説明する情報処理装置の一つとして動作させるプログラムを記憶していてよい。プロセッサ１１０は、二次記憶装置１９０からプログラムのコピーを読み出してよく、メモリサブシステム１８０へプログラムをロードしてよく、メモリサブシステム１８０へロードされたプログラムを実行してよい。プログラムは、メモリサブシステム１８０の、そのプログラムに割り当てられているメモリ領域へロードされてよい。プロセッサ１１０は、メモリサブシステム１８０に記憶されたプログラムに、メモリブリッジ１５０を介してアクセスできる。プログラムの実行の後に、メモリサブシステム１８０にロードされたプログラムのコピーは、そのプログラムに割り当てられたメモリ領域を開放することによって、破棄されてよい。
【００２６】
Ｉ／Ｏサブシステム１６０は、記憶媒体１７４へのアクセスを可能とする記憶媒体駆動装置１７３に接続してよい。記憶媒体１７４は、ＣＤ−ＲＯＭ（Ｃｏｍｐａｃｔ  Ｄｉｓｃ  Ｒｅａｄ  Ｏｎｌｙ  Ｍｅｍｏｒｙ）、ＵＳＢ（Ｕｎｉｖｅｒｓａｌ  Ｓｅｒｉａｌ  Ｂｕｓ）メモリ、又は、コンピュータが読み取り可能な他の可搬媒体の一つであってよい。記憶媒体１７４は、コンピュータ１００を、以下で説明する情報処理装置の一つとして動作させるプログラムを記憶していてよい。プロセッサ１１０は、記憶媒体１７４に記憶されたプログラムに、記憶媒体駆動装置１７３を介してアクセスしてよい。プロセッサ１１０は、記憶媒体１７４からプログラムを読み出してよく、メモリサブシステム１８０へプログラムをロードしてよく、メモリサブシステム１８０へロードされたプログラムを実行してよい。記憶媒体１７４に記憶されたプログラムは、二次記憶装置１９０にインストールされてよい。二次記憶装置１９０へインストールされたプログラムは、メモリサブシステム１８０へロードされ、上述のように実行されてよい。
【００２７】
＜第１実施形態＞
図２は、第１実施形態に係る情報処理装置２００の概略構成のブロック図である。情報処理装置２００は、プログラムを実行するコンパイラであってよく、このコンパイラは、プログラミング言語で書かれたソースプログラムを、プロセッサ１１０によって実行可能な目的プログラムへ変換する。実行の間、目的プログラムは、図１の二次記憶装置１９０に保持される。目的プログラムは、メモリサブシステム１８０へコピーされ、図１のメモリサブシステム１８０にロードされたリンカ及びローダを利用して、図１のプロセッサ１１０により実行される。
【００２８】
情報処理装置２００は、フロントエンド２１０、中間コード生成部２２０、コード最適化部２３０及びコード生成部２４０を含む。
【００２９】
情報処理装置２００への入力は、ソースプログラムである。情報処理装置２００は、ソースプログラムを目的プログラムへ変換する。フロントエンド２１０は、フロントエンド２１０への入力として、ソースプログラムを受信する。フロントエンド２１０は、字句解析部、構文解析部、及び意味解析部として動作する。字句解析部は、ソースプログラムの文字を読み、文字を語彙素へとグループ化する。その後、字句解析部は、語彙素に対して、トークンのシーケンスを生成する。より詳細には、字句解析部は、語彙素のそれぞれに対して、トークンのシーケンスを生成する。このプロセスは、トークン化として知られる。字句解析部は、トークンのシーケンスを構文解析部へ入力として送信する。構文解析部は、字句解析部から送信されたトークンのストリームを受信し、トークンのストリームからソースプログラムの制御フローを得て、例えば、字句解析部から受信したトークンのストリームから得た制御フローを表す、有向非巡回グラフ（ｄｉｒｅｃｔｅｄ  ａｓｙｃｌｉｃ  ｇｒａｐｈ、ＤＡＧ）を作成する。構文解析部は、生成されたＤＡＧを、意味解析部へ入力として送信する。意味解析部は、構文解析部からＤＡＧを受信し、ソースプログラムになんらかの意味的な誤りがあるか確認する。意味解析部は、ＤＡＧを、中間コード生成部２２０へ送信する。
【００３０】
中間コード生成部２２０は、入力されたＤＡＧを、高水準プログラミング言語及びハードウェアアーキテクチャの両方に依存しない、中間形式（すなわち中間表現）へ変換する。中間コード生成部２２０は、中間表現を、コード最適化部２３０へ送信する。
【００３１】
コード最適化部２３０は、中間表現を受信する。コード最適化部２３０は、中間表現に対してコード最適化を行う。換言すると、コード最適化部２３０は、中間表現に含まれる中間命令シーケンスを変更することによって、中間表現を最適化する。コード最適化部２３０は、機種依存の最適化及び機種非依存の最適化の両方を行う。機種依存の最適化の例は、特殊なハードウェアの機能を活用すること、レイテンシを管理又は隠蔽すること、並列処理を導入することなどである。機種非依存の最適化の例は、冗長性を除去すること、無駄な到達不能コードを削除すること、定数伝搬、ピープホール最適化等であってよい。コード最適化部２３０は、最適化された中間表現を、コード生成部２４０へ送信する。
【００３２】
最後に、コード生成部２４０は、最適化された中間表現を受信し、最適化された中間表現に含まれる中間命令シーケンスに対してアセンブリ命令シーケンスを選択する。アセンブリ命令シーケンスの選択は、最適化された中間表現から生成された目的プログラムを実行するコンピュータ上でリンカ及びローダを利用して実行されてよい。情報処理装置２００はシンボルテーブルを記憶していてよい。コンパイラの要素はシンボルテーブルを共有し、シンボルテーブルのデータを、使用し、更新する。情報処理装置２００は、エラーハンドラを含んでいてよい。プログラムのコンパイル中にコンパイラの要素の一つでエラーが発生した場合、エラーハンドラが統制をとってよく、適切なメッセージを出力してよい。
【００３３】
図３は、コード生成部２４０の詳細な構成のブロック図である。コード生成部２４０は、３つのモジュール、すなわち、命令選択部３１０、命令スケジューラ３２０及びレジスタ割当て部３３０を含む。コード生成部２４０への入力は、中間コード、すなわち、上述の中間表現である。中間コードは、フロントエンド２１０の中間コード生成部２２０によって生成され、コード最適化部２３０によって最適化され出力される。命令選択部３１０は、最適化された中間コード、すなわち、コード最適化部２３０によって最適化された中間コードを受信する。命令選択部３１０は、中間コードに含まれるＩＲ命令シーケンスに対してアセンブリ命令シーケンスを選択してよい。命令選択部３１０は、ＩＲ命令シーケンスのそれぞれに対して１つのアセンブリ命令シーケンスを選択してよい。命令スケジューラ３２０は、最終的な目的プログラムにおける、アセンブリ命令シーケンスに含まれるアセンブリ命令の順番を決定する。レジスタ割当て部３３０は、レジスタ１１１内のレジスタを、アセンブリ命令のそれぞれに割り当てる。
【００３４】
図４は、本開示に係る情報処理装置２００の詳細な構成のブロック図である。情報処理装置２００は、既存のコンパイラの構成に合わせて構成されている。図４に示される情報処理装置２００は、命令スケジューリングとは無関係に命令選択を行う。
【００３５】
情報処理装置２００は、フロントエンド４２０、中間コード生成部４３０、コード最適化部４４０及びコード生成部４５０を含む。コード生成部４５０は、命令選択部４６０、命令スケジューラ４７０及びレジスタ割当て部４８０を含む。命令選択部４６０は、パターン照合・生成部４６１及びパターン選択部４６５を含む。パターン照合・生成部４６１は、代替パターン特定部４６２及び代替パターン生成部４６４を含む。フロントエンド４２０、中間コード生成部４３０、コード最適化部４４０、及びコード生成部４５０は、それぞれ、図２のフロントエンド２１０、中間コード生成部２２０、コード最適化部２３０、及びコード生成部２４０に相当する。
【００３６】
図４の例では、情報処理装置２００への入力は、高水準プログラミング言語で書かれたソースプログラムであり、情報処理装置２００の出力は、目的プログラムである。
【００３７】
ソースコードは、情報処理装置２００のユーザによって、キーボード１７２などの入力装置を使って入力されてよい。ソースコードは、情報処理装置２００に通信可能に接続された端末装置等から送信されてよい。ソースコードは、情報処理装置２００に含まれる記憶装置又はメモリにあらかじめ格納されていてよい。
【００３８】
フロントエンド４２０は、ソースプログラムを受信してよい。フロントエンド４２０は、記憶装置又はメモリからソースコードを読み出してよい。フロントエンド４２０は、入力されたソースプログラムを、有向非巡回グラフへ変換する。有向非巡回グラフの構成は、あらかじめ定義されていてよく、情報処理装置２００の構成に応じて異なっていてよい。フロントエンド４２０は、有向非巡回グラフを出力する。フロントエンド４２０は、有向非巡回グラフを中間コード生成部４３０へ送信してよい。
【００３９】
フロントエンド４２０は、次の３つのモジュール：字句解析部、構文解析部、及び意味解析部を含んでいてよい。字句解析部は、高水準プログラミング言語で書かれたソースプログラムを受信する。字句解析部は、ソースプログラムをトークンのストリームへ変換する。そして、このトークンのストリームは、入力として構文解析部へ送信される。構文解析部は、トークンのストリームを受信する。構文解析部は、受信したトークンのストリームを有向非巡回グラフへ変換し、その有向非巡回グラフを、入力として意味解析部へ送信する。意味解析部はこの有向非巡回グラフを受信し、受信した有向非巡回グラフに基づいて、プログラムの宣言文及び命令文が意味的に正しいことを、確認し、保証する。換言すると、意味解析部は、宣言文及び命令文の意味が明確であり、宣言文及び命令文が、宣言文及び命令文の制御構造及びデータ型の、プログラムにおける想定される使われ方と整合性があることを、確認し、保証する。意味解析部は、プログラムに対して、型の確認、ラベルの確認、フロー制御の確認などの、いくつかの種類の確認を行ってよい。意味解析部は、プログラムの宣言文及び命令文が意味的に正しい場合に、有向非巡回グラフを出力してよい。意味解析部は、中間コード生成部４３０へ、有向非巡回グラフを出力してよい。
【００４０】
中間コード生成部４３０への入力は、フロントエンド４２０から送信された有向非巡回グラフである。中間コード生成部４３０は、有向非巡回グラフを受信する。中間コード生成部４３０は、有向非巡回グラフを、中水準言語表現、すなわち、中水準言語による表現へ変換する。中水準言語表現の定義は、情報処理装置２００の構成に応じて異なっていてよい。中水準言語表現は中間表現の変種である。中間表現には、次の特性：高水準プログラミング言語に依存しないこと、及び対象ハードウェアアーキテクチャに依存しないこと、がある。中間コード生成部４３０は、中間表現、すなわち、上述の中水準言語表現を出力する。中間コード生成部４３０は、中間表現を、入力としてコード最適化部４４０へ送信してよい。
【００４１】
コード最適化部４４０への入力は、中間コード生成部４３０によって出力された、ソースプログラムの中間表現である。コード最適化部４４０は、中間コード生成部４３０によって出力された中間表現を受信する。コード最適化部４４０は、最適化された中間表現を生成するために、ソースプログラムの中間表現に対して、対象非依存の最適化と対象依存の最適化とを含む最適化を行う。コード最適化部４４０は、最適化された中間表現を出力する。コード最適化部４４０は、最適化された中間表現を、入力としてコード生成部４５０へ送信してよい。
【００４２】
コード生成部４５０への入力は、コード最適化部４４０によって出力された、ソースプログラムの最適化された中間表現である。コード生成部４５０は、最適化された中間表現を受信する。コード生成部４５０は、ソースプログラムの最適化された中間表現を、対象ハードウェアアーキテクチャに依存し、当該対象ハードウェアアーキテクチャを有するコンピュータが実行できる、目的プログラムへ変換する。コード生成部４５０の出力は、目的プログラムである。コード生成部４５０は、目的プログラムを出力する。次に、コード生成部４５０を詳細に説明する。
【００４３】
コード生成部４５０は、３つのモジュール：命令選択部４６０、命令スケジューラ４７０及びレジスタ割当て部４８０を含んでいてよい。命令選択部４６０、命令スケジューラ４７０及びレジスタ割当て部４８０は、それぞれ、図３の命令選択部３１０、命令スケジューラ３２０及びレジスタ割当て部３３０に相当する。
【００４４】
命令選択部４６０への入力は、コード最適化部４４０によって出力された、ソースプログラムの最適化された中間表現である。命令選択部４６０は、ソースプログラムの、最適化された中間表現を受信する。命令選択部４６０は、ソースプログラムの、受信した最適化された中間表現を、そのソースプログラムのアセンブリ表現へ変換する。換言すると、命令選択部４６０は、中間表現における中間命令を、アセンブリ表現のアセンブリ命令へ変換する。命令選択部４６０は、中間命令からアセンブリ命令へのマッピングに基づいて、１つ又は複数の中間命令を、１つ又は複数のアセンブリ命令へ変換してよい。命令選択部４６０は、アセンブリ表現を生成するために、中間表現内の１つ又は複数の中間命令を、１つ又は複数のアセンブリ命令へ変換してよい。命令選択部４６０の出力は、ソースプログラムのアセンブリ表現である。命令選択部４６０の出力は、ソースプログラムのアセンブリ表現である。命令選択部４６０は、ソースプログラムのアセンブリ表現を、入力として命令スケジューラ４７０へ送信してよい。命令選択部４６０を以下で詳しく説明する。
【００４５】
命令選択部４６０は、次の２つのモジュール：パターン照合・生成部４６１及びパターン選択部４６５、を、含んでいてよい。
【００４６】
パターン照合・生成部４６１への入力は、コード最適化部４４０によって出力され、命令選択部４６０へ入力される、ソースプログラムの最適化された中間表現を含んでいてよい。パターン照合・生成部４６１には、パターンを特定するタスク、すなわち、与えられたどのような中間命令シーケンスに対してもアセンブリ命令シーケンスをいつどこで使用できるかを検出するタスク、及び、パターンを生成するタスク、すなわち、以下で説明される代替パターン特定部４６２からの、対応するパターンのそれぞれに対してアセンブリ命令シーケンスを生成するタスクがある。パターンのそれぞれは、命令シーケンスの青写真と考えることができる。パターン照合・生成部４６１は、ソースプログラムの、最適化された中間表現を受信する。パターン照合・生成部４６１は、複数の代替パターンを有する中間命令シーケンスを特定し、その中間命令シーケンスの代替パターンを生成する。代替パターンは、それぞれ、アセンブリ命令シーケンス、すなわち、アセンブリ命令のシーケンスを表し、中間命令シーケンスの結果と同じ結果を導く。以下の説明において、中間命令シーケンスが、１つの代替パターン（すなわち複数の代替パターンのうちの１つのアセンブリ命令シーケンス）と対応するという表現は、その中間命令シーケンスとその代替パターンとが同じ結果を導くことを意味する。同様に、１つの中間命令シーケンスが複数の代替パターンと対応するという表現は、その中間命令シーケンスとそれらのアセンブリ命令シーケンスのそれぞれとが同じ結果を導くことを意味する。パターン照合・生成部４６１は、ソースプログラムの、最適化された中間表現において、代替パターンを有するすべての中間命令シーケンスを特定してよく、ソースプログラムの、最適化された中間表現における、中間命令シーケンスのいずれか一つと対応するすべての代替パターンを生成してよい。パターン照合・生成部４６１の出力は、中間命令シーケンスと対応する代替パターンである。パターン照合・生成部４６１は、中間命令シーケンスのそれぞれに対して代替パターンを出力する。パターン照合・生成部４６１は、代替パターンを、入力としてパターン選択部４６５へ送信してよい。パターン照合・生成部４６１を以下で詳しく説明する。
【００４７】
パターン照合・生成部４６１は、次の２つのモジュール：代替パターン特定部４６２及び代替パターン生成部４６４、を、含んでいてよい。
【００４８】
代替パターン特定部４６２への入力は、コード最適化部４４０によって出力された、ソースプログラムの、最適化された中間表現である。代替パターン特定部４６２は、ソースプログラムの、最適化された中間表現を受信する。代替パターン特定部４６２は、中間命令シーケンスのそれぞれと、あらかじめ用意されたパターンとの間で、照合を行ってよい。あらかじめ用意されたパターンは、「辞書パターン」とも表記される。代替パターン特定部４６２により行われるこの照合は、ツリーベースのパターン照合又はグラフべースのパターン照合などのような、パターン照合に使われるアルゴリズムには依存しない。代替パターン特定部４６２の出力は、１つの中間命令シーケンスにつき、その中間命令シーケンスに対応する、すべての特定された代替パターンである。
【００４９】
辞書パターンのそれぞれは、同じ結果に導く２つ以上の異なるアセンブリ命令シーケンスのいずれか一つへ変換できる中間命令シーケンスを選択する条件であってよい。２つ以上の異なるアセンブリ命令シーケンスは、「代替パターン」と表記される。換言すると、ある中間命令シーケンスの代替パターンは、その中間命令シーケンスと等価であり、その中間命令シーケンスの結果である同じ結果に導く、アセンブリ命令シーケンスである。さらに換言すると、ある中間命令シーケンスの代替パターンは、その中間命令シーケンスによる結果を得られるアセンブリ命令シーケンスである。異なる代替パターン、すなわち異なるアセンブリ命令シーケンスは、目的プログラムを実行するプロセッサの、加算器、乗算器及びシフターなどのような演算ユニット（すなわち、ａｒｉｔｈｍｅｔｉｃ  ａｎｄ  ｌｏｇｉｃ  ｕｎｉｔｓ、ＡＬＵ）の異なる組み合わせによって実行される。２つ以上の代替パターンへ変換できる中間命令シーケンス、すなわち、同じ結果に導く２つ以上のアセンブリ命令シーケンスによって実現できる中間命令シーケンスは、「複数の代替パターンを持つ中間命令シーケンス」と呼ばれる。辞書パターン及び辞書パターンのそれぞれに対する代替パターンが、用意されていてよい。代替パターン特定部４６２は、辞書パターンをあらかじめ記憶していてよい。
【００５０】
代替パターン特定部４６２は、最適化された中間表現に含まれる中間命令シーケンスのそれぞれを辞書パターンと比べることによって、中間命令シーケンスの辞書パターンとの照合を行ってよい。
【００５１】
代替パターン特定部４６２は、ソースプログラムから生成された中間表現において、複数の代替パターンを持つ中間命令シーケンスのすべてを特定してよい。中間表現に対するすべての代替パターンが特定されると、パターン選択部４６５は、代替パターンの任意の組み合わせを、その割合と共に選択できる。
【００５２】
中間命令シーケンスの辞書パターンとのそのような照合の技術及び方法は、情報処理装置２００の構成に応じて変化してよい。
【００５３】
中間命令シーケンスの中間命令のそれぞれが１つの演算子及び１つ又はそれ以上のオペランドを含むとすれば、辞書パターンのそれぞれは、ある演算子を持つ中間命令のシーケンスを選択する一連の条件を含んでいてよい。辞書パターンは、特定のオペランドを持つ中間命令を選択する一連の条件を含んでいてよい。
【００５４】
次の例の説明において、１つの中間命令は単一の中間命令のみを含み、代替パターンのそれぞれは単一のアセンブリ命令のみを含む。「ｒ」という名称のレジスタに格納されている値に２を掛け、掛けた結果を「ｒ」という名称のレジスタに格納することを示す、中間命令「ｍｕｌｔｉｐｌｙ  ｒ，  ｒ，  ２」に対する条件の例は、演算子「ｍｕｌｔｉｐｌｙ」に対応する条件と、第３オペランド「２」に対応する条件との組み合わせである。代替パターンは、例えば、アセンブリ命令である「ｍｕｌ  ｒ，  ｒ，  ２」、「ｓｈｌ  ｒ，  ｒ，  １」及び「ｆｍｕｌ  ｒ，  ｒ，  ２．０」であってよい。アセンブリ命令「ｍｕｌ  ｒ，  ｒ，  ２」は、「ｒ」という名称のレジスタに格納されている整数に２を掛け、掛けた結果を「ｒ」という名称のレジスタに格納することを示す。アセンブリ命令「ｓｈｌ  ｒ，  ｒ，  １」は、「ｒ」という名称のレジスタに格納されている値に対して左シフト演算を行い、左シフト演算の結果を「ｒ」という名称のレジスタに格納することを示す。アセンブリ命令「ｆｍｕｌ  ｒ，  ｒ，  ２．０」は、「ｒ」という名称のレジスタに格納されている浮動小数点数に２．０を掛け、掛けた結果を「ｒ」という名称のレジスタに格納することを示す。
【００５５】
中間命令「ｍｕｌｔｉｐｌｙ  ｒ，  ｒ，  ２」が中間表現の中間命令シーケンスに含まれる場合、代替パターン特定部４６２は、中間命令「ｍｕｌｔｉｐｌｙ  ｒ，  ｒ，  ２」を、代替パターンを持つ中間命令として特定する。代替パターン特定部４６２は、アセンブリ命令「ｍｕｌ  ｒ，  ｒ，  ２」、「ｓｈｌ  ｒ，  ｒ，  １」及び「ｆｍｕｌ  ｒ，  ｒ，  ２．０」を、中間命令「ｍｕｌｔｉｐｌｙ  ｒ，  ｒ，  ２」の代替パターンとして特定する。
【００５６】
代替パターン特定部４６２は、さらに、実行カウント、すなわち、実行の回数を、最適化された中間プログラムに含まれる、複数の代替パターンを持つ中間命令シーケンスのそれぞれに対して、決定してよい。複数の代替パターンを持つ中間命令シーケンスのそれぞれに対する実行カウントが、最適化された中間プログラムにおいて定まっている場合、代替パターン特定部４６２は、実行カウントをカウントしてよい。複数の代替パターンを持つ中間命令シーケンスの少なくとも１つに対する実行カウントは、実行時に定まってもよい。この場合、実行カウントは、コンパイル時に正確に定まっていなくてもよい。代替パターン特定部４６２は、最適化された中間プログラムに基づいて、初期条件を設定することによって、実行カウントを推定してよい。中間命令シーケンスの実行カウントは、同じ代替パターンの組み合わせが同じである中間命令シーケンスの実行の回数であってよい。
【００５７】
代替パターン特定部４６２は、中間命令シーケンスに対して特定された代替パターンを出力する。代替パターン特定部４６２は、特定された代替パターンを、入力として代替パターン生成部４６４へ送信してよい。
【００５８】
代替パターン特定部４６２は、さらに、複数の代替パターンを持つ中間命令シーケンスのそれぞれの実行カウントを、代替パターン生成部４６４を介して、パターン選択部４６５へ送信してよい。換言すると、代替パターン特定部４６２は、実行カウントを代替パターン生成部４６４へ送信してよく、代替パターン生成部４６４は、実行カウントを受信し、その実行カウントをパターン選択部４６５へ送信してよい。
【００５９】
以下で詳しく説明されるパターン選択部４６５は、最適化された中間プログラムに含まれる、複数の代替パターンを持つ中間命令シーケンスのそれぞれに対して、実行カウントを決定してよい。この場合、代替パターン特定部４６２は、複数の代替パターンを持つ中間命令シーケンスのそれぞれに対する実行カウントを、決定し、送信する必要はない。代替パターン生成部４６４は、複数の代替パターンを持つ中間命令シーケンスのそれぞれに対する実行カウントを、受信し、送信する必要はなない。
【００６０】
代替パターン生成部４６４は、代替パターン特定部４６２から送信された、特定された代替パターンを受信する。代替パターン生成部４６４は、さらに、複数の代替パターンを持つ中間命令シーケンスのそれぞれの実行カウントを受信する。複数の代替パターンを持つ中間命令シーケンスのそれぞれは、以下で「複数代替シーケンス」と表記される。代替パターン生成部４６４は、特定された代替パターンを表す連結リスト４６３を生成する。代替パターン生成部４６４は、複数の代替パターンを持つ中間命令シーケンスのそれぞれに対する連結リスト４６３を維持していてよい。具体的には、代替パターン生成部４６４は、中間命令シーケンスのそれぞれに対して単一の連結リスト４６３を生成してよい。代替パターン生成部４６４は、例えば、同じ複数代替シーケンスの代替パターンが互いに関連付けられているように、代替パターンを表す連結リスト４６３を生成してよい。連結リスト４６３において、同じ複数代替シーケンスの代替パターンは、同じ複数代替シーケンスに関連付けられている。
【００６１】
代替パターン生成部４６４の出力は、複数の代替パターンを持つ中間命令シーケンスのそれぞれに対する連結リストである。代替パターン生成部４６４は、連結リスト４６３を出力する。代替パターン生成部４６４は、連結リスト４６３を、入力としてパターン選択部４６５へ送信してよい。上述したように、代替パターン生成部４６４は、さらに、複数の代替パターンを持つ中間命令シーケンスのそれぞれの実行カウントを、パターン選択部４６５へ送信してよい。
【００６２】
パターン選択部４６５は、コード最適化部４４０から入力された、最適化された中間表現を受信してよい。パターン選択部４６５は、代替パターン生成部４６４から送信された、連結リスト４６３を受信する。パターン選択部４６５は、さらに、複数の代替パターンを持つ中間命令シーケンスのそれぞれの実行カウントを受信する。上述のように、中間命令シーケンスのそれぞれの実行カウントは、代替パターン特定部４６２によって決定されてよい。パターン選択部４６５は、代替パターンが連結リスト４６３に含まれる複数代替シーケンスから、すなわち、最適化された中間表現における中間命令シーケンスのうち複数代替シーケンスから、実行カウントが１よりも大きい複数代替シーケンスを抽出する。
【００６３】
パターン選択部４６５は、実行カウントが１よりも大きい、抽出された複数代替シーケンスに対して、１よりも多くの代替パターンを選択してよく、抽出された複数代替シーケンスに対して選択された代替パターンについて、割合を決定してよい。パターン選択部４６５は、実行カウントが１よりも大きい、抽出された複数代替シーケンスのそれぞれに対して、１よりも多くの代替パターンを選択してよい。パターン選択部４６５は、さらに、例えば費用便益分析の結果に基づいて、抽出された複数代替シーケンスのそれぞれに対して選択された代替パターンについて、割合を決定してよい。換言すると、パターン選択部４６５は、それぞれ１よりも大きい実行カウントを持つ、抽出された複数代替シーケンスの、それぞれに対する代替パターンの、それぞれの割合を決定してよい。複数代替シーケンスのある代替パターンの割合は、その複数代替シーケンスを含む最適化された中間表現を目的プログラムへ変換する場合の、その複数代替シーケンスに対するアセンブリ命令シーケンスとして選択されたその代替パターンの数の、その複数代替シーケンスの実行カウントに対する割合である。複数代替シーケンスの実行カウントは、中間表現において、その複数代替シーケンスに対して選択されたアセンブリ命令シーケンスの数である。割合のそれぞれは、非負の数によって表されていてよい。割合は、選択された代替パターンの実行カウントによって表されていてもよい。
【００６４】
費用対効果分析のための論理は、情報処理装置２００の構成及び目的プログラムの構成に応じて変化してよい。費用対効果分析のための論理は、情報処理装置２００のユーザによって、入力装置１７０を介して選択されてよい。パターン選択部４６５は、２種類以上の論理を組み合わせによる費用対効果分析に基づいて、割合を決定してよい。例えば、パターン選択部４６５は、目的プログラムが、実行可能ファイルのサイズの条件、速度の条件、レジスタ圧力の条件、生存レジスタ数の条件、又は、上述の条件の可能な組み合わせのうちの一つなどを満たすように、割合を決定してよい。
【００６５】
例えば、以下の説明における想定は、複数代替シーケンスが「ｍｕｌｔｉｐｌｙ  ｒ，  ｒ，  ２」であり、複数代替シーケンス「ｍｕｌｔｉｐｌｙ  ｒ，  ｒ，  ２」に対する代替パターンが「ｍｕｌ  ｒ，  ｒ，  ２」、「ｓｈｌ  ｒ，  ｒ，  １」、及び「ｆｍｕｌ  ｒ，  ｒ，  ２．０」であり、目的プログラムを実行する対象プロセッサが「ｍｕｌ」、「ｓｈｌ」、及び「ｆｍｕｌ」の演算のための演算ユニットをそれぞれ１つ含み、「ｍｕｌ  ｒ，  ｒ，  ２」、「ｓｈｌ  ｒ，  ｒ，  １」、及び「ｆｍｕｌ  ｒ，  ｒ，  ２．０」の演算を実行するためのクロックが、それぞれ、７、１、３０であり、並びに「ｍｕｌｔｉｐｌｙ  ｒ，  ｒ，  ２」の実行カウントが３５であること、である。この場合、「ｍｕｌｔｉｐｌｙ  ｒ，  ｒ，  ２」の演算を３２回実行する時間を最小化するために、パターン選択部４６５は、割合を、演算「ｍｕｌ  ｒ，  ｒ，  ２」の実行カウントが４回で、演算「ｓｈｌ  ｒ，  ｒ，  １」の実行カウントが２８回で、演算「ｆｍｕｌ  ｒ，  ｒ，  ２．０」の実行カウントが０回、と決定してよい。
【００６６】
パターン選択部４６５は、図４においてシーケンスリスト４６７として示されているリストを、生成し、出力してよい。シーケンスリスト４６７は、実行カウントが１よりも大きい複数代替シーケンスのそれぞれに対する代替パターン（すなわち、それぞれ同じ結果に導くすアセンブリ命令シーケンス）を、実行カウントによって表されていてもよい、それぞれの割合と共に含む。１よりも大きい実行カウントを持つ複数代替シーケンスは、中間表現において１回よりも多く現れる。シーケンスリスト４６７は、割合がゼロである代替パターンを含まなくてよい。
【００６７】
パターン選択部４６５の上述の動作は、以下のように考えることができる。パターン選択部４６５は、実行カウントが１よりも大きい複数代替シーケンスに対して、それぞれ割合がゼロではない代替パターンを、その複数代替シーケンスに対応する命令シーケンスとして選択する。パターン選択部４６５は、シーケンスリスト４６７における複数代替シーケンスから変換された命令シーケンスとして、選択された代替パターンを、シーケンスリスト４６７へ格納してよい。
【００６８】
パターン選択部４６５は、複数代替シーケンスのそれぞれついて、アセンブリ命令シーケンスを、それらの割合（例えば実行カウント）とともに出力する。パターン選択部４６５は、シーケンスリスト４６７を出力してよい。パターン選択部４６５は、シーケンスリスト４６７を命令スケジューラ４７０へ送信してよい。
【００６９】
パターン選択部４６５は、複数のパターンから１つのパターンを選択する方法に従って、実行カウントが１である複数代替シーケンスに対して、その複数代替シーケンスの代替パターンから１つの最適な代替パターン（換言すると、最もよい代替パターン）を選択してよい。パターン選択部４６５は、実行カウントが１である複数代替シーケンス及び複数代替シーケンスではない中間命令シーケンスに対して、１つの最適な代替パターンとして選択された、アセンブリ命令シーケンスを出力してよい。パターン選択部４６５は、実行カウントが１である複数代替シーケンスに対して選択されたアセンブリ命令シーケンスを含むシーケンスリスト４６７を、生成し、出力してよい。パターン選択部の上述の動作は、以下のように考えることができる。パターン選択部４６５は、実行カウントが１である複数代替シーケンスに対して、シーケンスリスト４６７における、複数代替シーケンスから変換された命令シーケンスとして、１つの最適な代替パターンを選択する。
【００７０】
パターン選択部４６５は、中間命令シーケンスからアセンブリ命令シーケンスへのマッピングに基づいて、複数代替シーケンスではない中間命令シーケンスに対して、１つのパターン（すなわち、アセンブリ命令シーケンス）を選択してよい。パターン選択部４６５は、複数代替シーケンスではない中間命令シーケンスに対して選択された１つのパターンを出力してよい。パターン選択部４６５は、複数代替シーケンスではない中間命令シーケンスに対して選択されたアセンブリ命令シーケンスを含むシーケンスリスト４６７を、生成し、出力してよい。パターン選択部の上述の動作は、以下のように考えることができる。パターン選択部４６５は、複数代替シーケンスではない中間命令シーケンスに対して、その中間命令シーケンスから変換された、シーケンスリスト４６７における命令シーケンスとして、アセンブリ命令シーケンスを選択する。
【００７１】
パターン選択部４６５は、以下のように動作してよい。パターン選択部４６５は、最適化された中間表現の複製を、初期シーケンスリスト４６７として生成してよい。パターン選択部４６５は、ソースプログラムから生成された、最適化された中間表現から、中間命令を読み出してよく、読みだされた中間命令において、複数代替シーケンスを見つけてよい。パターン選択部４６５は、中間命令シーケンスのアセンブリ命令シーケンスへのマッピングに基づいて、複数代替シーケンスに含まれない中間命令シーケンスの各々を、単純にアセンブリ命令シーケンスへ変換してもよく、シーケンスリスト４６７において、複数代替シーケンスに含まれない中間命令シーケンスを、変換されたアセンブリ命令シーケンスによって置き換えてよい。
【００７２】
複数代替シーケンスが見つかった場合、パターン選択部４６５は、その複数代替シーケンスの実行カウントが１より大きいか確認してよい。その複数代替シーケンスの実行カウントが１より大きくない場合、パターン選択部４６５は、その複数代替シーケンスに対して、１つの最もよいアセンブリ命令シーケンスを選択してよく、シーケンスリスト４６７において、その複数代替シーケンスを、１つの最もよいアセンブリ命令シーケンスとして選択されたアセンブリ命令シーケンスによって置き換えてよい。
【００７３】
複数代替シーケンスの実行カウントが１より大きい（すなわち、２又はそれより大きい）場合、パターン選択部４６５は、複数代替シーケンスの代替パターンの割合を決定する。パターン選択部４６５は、非ゼロの割合の代替パターン、すなわち、割合がそれぞれゼロではない代替パターンを、複数代替シーケンスの代替パターンから選択してよく、シーケンスリスト４６７において、複数代替シーケンスを、選択された代替パターンとそれらの割合とによって置き換えてよい。
【００７４】
代替リストにおける命令シーケンスの順番は、その命令シーケンスへ変換された中間命令シーケンスの、中間表現における順番と同じであってよい。
【００７５】
この例では、シーケンスリスト４６７は、実行カウントが１よりも大きい複数代替シーケンスの中にはない中間命令に対するアセンブリ命令を含む。シーケンスリスト４６７は、実行カウントが１よりも複数代替シーケンスに対するアセンブリ命令の代わりに、代替パターンをそれらのそれぞれの割合とともに含む。
【００７６】
命令スケジューラ４７０は、パターン選択部４６５により出力される、上述のシーケンスリスト４６７を受信してよい。上述のように、シーケンスリスト４６７は、複数代替シーケンスではない中間命令シーケンスから変換されたアセンブリシーケンスを、命令シーケンスとして含んでいてよい。シーケンスリスト４６７は、実行カウントが１である複数代替シーケンスに対して選択された、１つの最適な代替パターン（すなわち、アセンブリ命令シーケンス）を、命令シーケンスとして含んでいてよい。シーケンスリスト４６７は、さらに、実行カウントが１よりも大きい複数代替シーケンスに対して選択された代替パターンを、その割合とともに、命令シーケンスとして含んでいてよい。
【００７７】
命令スケジューラ４７０は、実行カウントが１よりも大きい複数代替シーケンス、すなわち、中間表現においてそれぞれ２回以上現れる複数代替シーケンスに対する、代替パターンを、それらのそれぞれの割合とともに、シーケンスリスト４６７として受信する。
【００７８】
命令スケジューラ４７０は、複数代替シーケンスのそれぞれに対する代替パターンのうちの一つを、割合に基づいて選択する。代替パターンの割合は、代替パターンが実行される回数によって表現されていてよい。この場合、命令スケジューラ４７０は、複数代替シーケンスを、その複数代替シーケンスの代替パターンへ、その代替パターンの割合によって表される回数、変換してよい。命令スケジューラ４７０は、シーケンスリスト４６７内における、複数代替シーケンスの数に対する代替パターンのうちのある代替パターンの比率が、その代替パターンの割合と比例するように、複数代替シーケンスの代替パターンのうちの一つを選択し、その複数代替シーケンスを選択された代替パターンによって置き換えてよい。複数代替シーケンスのそれぞれがシーケンスリスト４６７内の代替パターンで置き換えられた場合、シーケンスリストは、複数代替シーケンスを含まないが、アセンブリ命令を含む。
【００７９】
命令スケジューラ４７０は、シーケンスリスト４６７に含まれる命令シーケンスの命令（すなわちアセンブリ命令）をスケジューリングする。換言すると、命令スケジューラ４７０は、目的プログラムにおける、アセンブリ命令の順番を決定する。
【００８０】
命令スケジューラ４７０によるスケジューリング（すなわち命令の順番の決定）の方法は、アセンブリ命令をスケジューリングする既存の方法の一つであってよい。命令スケジューラ４７０は、命令スケジューラ４７０によって決定された順番で配置されたアセンブリ命令を出力してよい。命令スケジューラ４７０は、決定された順番で配置されたアセンブリ命令を、レジスタ割当て部４８０へ送信してよい。
【００８１】
レジスタ割当て部４８０は、命令スケジューラ４７０により出力された、配置された（すなわちスケジューリングされた）アセンブリ命令を受信する。レジスタ割当て部４８０は、アセンブリ命令に対して、対象マシンにおいて利用可能なレジスタを割り当てる。より詳細には、レジスタ割当て部４８０は、アセンブリ命令内のオペランドがレジスタを参照するオペランドであるレジスタオペランドであり、レジスタ割り当てが必要な場合に、そのオペランドにレジスタを割り当てる。レジスタ割当て部４８０は、メモリ位置を参照するオペランドであるメモリオペランドにはレジスタを割り当てず、レジスタ割り当ては必要ない。レジスタ割当て部４８０は、レジスタが割り当てられた配置されたアセンブリ命令から、対象ハードウェアアーキテクチャを有するコンピュータによる実行が可能な、目的プログラムを生成する。レジスタ割当て部４８０は、目的プログラムを出力する。
【００８２】
次に、情報処理装置の動作の例を、図面を参照しながら詳しく説明する。
【００８３】
図６Ａ、６Ｂ、６Ｃ、及び６Ｄは、本開示の実施形態に係る情報処理装置２００の動作の例のフローチャートである。本実施形態に係る情報処理装置２００は命令スケジューリングとは無関係に命令選択を行う。
【００８４】
図６Ａは、情報処理装置２００の動作全体の例のフローチャートである。図６Ａのフローチャートによれば、フロントエンド４２０がソースプログラムを解析する（ステップＳ６１１）。ソースプログラムは、情報処理装置２００へ入力されてもよい。ソースプログラムは、情報処理装置２００にあらかじめ記憶されていてもよい。中間コード生成部４３０は、ソースプログラムから中間表現を生成する。すなわち、中間コード生成部４３０は、ソースプログラムを中間表現へ変換する（ステップＳ６１２）。コード最適化部４４０は、中間コード生成部４３０によって生成された中間表現を最適化する（ステップＳ６１３）。そして、コード生成部４５０は、ソースコードから変換された中間表現から、目的プログラムを生成するために、後で詳しく説明するようにコード生成処理を行う（ステップＳ６１４）。コード生成部４５０は、目的プログラムを出力する（ステップＳ６１５）。
【００８５】
図６Ｂは、情報処理装置２００のコード生成処理の例のフローチャートである。
【００８６】
代替パターン特定部４６２は、中間表現において、２つ以上の代替パターン、すなわち、同じ結果に導くアセンブリ命令シーケンス、のいずれか一つによって実現される中間命令シーケンスを探索し、２つ以上の代替パターン、すなわち、同じ結果に導くアセンブリ命令シーケンス、のいずれか一つにより実現される中間命令シーケンスを特定する（ステップＳ６２１）。上述のように、２つ以上の代替パターンにより実現される中間命令シーケンスは、「複数の代替パターンを持つ中間命令シーケンス」と表記され、「複数代替シーケンス」とも表記される。
【００８７】
そして代替パターン生成部４６４は、複数代替シーケンス、すなわち、ステップＳ６２１において代替パターン特定部４６２によって特定された、複数の代替パターンを持つ中間命令シーケンス、のそれぞれに対して、代替パターンを生成する（ステップＳ６２２）。代替パターン生成部４６４は、複数代替シーケンスの代替パターンである２つ以上のアセンブリ命令シーケンスの各アセンブリ命令の演算子とオペランドを、その複数代替シーケンスの演算子及びオペランドに基づいて生成してよい。複数代替シーケンスの代替パターンを生成する方法は、複数代替シーケンスの各種類に対してあらかじめ定義されている。代替パターン生成部４６４は、複数代替シーケンスの、生成された代替パターンを、複数代替シーケンスのそれぞれについて、複数代替シーケンスの代替パターンが、互いに関連付けられ、そしてその複数代替シーケンスと関連付けられているように、連結リスト４６３へ格納してよい。
【００８８】
例えば、パターン選択部４６５は、複数代替シーケンス（すなわち複数の代替パターンを持つ中間命令シーケンス）のそれぞれの実行カウントを決定してよい（ステップＳ６２３）。上述のように、複数代替シーケンスの実行カウント正確に決まっていない場合、パターン選択部４６５は、複数代替シーケンスの実行カウントを推定してよい。
【００８９】
パターン選択部４６５は、１よりも大きい実行カウントを持つ複数代替シーケンス、すなわち、中間表現において１回よりも多く実行される複数代替シーケンス、のそれぞれについて、代替パターンの割合を決定してよい（ステップＳ６２４）。
【００９０】
パターン選択部４６５は、それぞれ１回よりも多く実行される複数代替シーケンスに対する、代替パターンとそれらのそれぞれの割合とを含むシーケンスリスト４６７を生成するために、変換処理を行う（ステップＳ６２５）。変換処理は後で詳しく説明する。
【００９１】
命令スケジューラ４７０は、アセンブリ命令を生成するために、スケジューリング処理を行う（ステップＳ６２６）。スケジューリング処理も後で詳しく説明する。
【００９２】
レジスタ割当て部４８０は、プロセッサ１１０のレジスタをアセンブリ命令に割り当て（ステップＳ６２７）、目的プログラムを生成する。アセンブリ命令にレジスタを割り当てる方法は、既存のレジスタ割り当て方法のうちの一つであってよい。
【００９３】
図６Ｃは、本実施形態に係る情報処理装置２００の変換処理の例のフローチャートである。
【００９４】
パターン選択部４６５は、シーケンスリスト４６７を初期化してよい（ステップＳ６３１）。パターン選択部４６５は、シーケンスリスト４６７として、連結リスト４６３の複製を生成してよい。
【００９５】
パターン選択部４６５は、シーケンスリスト４６７において選択されていない複数代替シーケンスから、１つの複数代替シーケンスを選択してよい（ステップＳ６３２）。
【００９６】
パターン選択部４６５は、選択された複数代替シーケンスが中間表現において１回よりも多く実行されるかを判定してよい（ステップＳ６３３）。パターン選択部４６５は、選択された複数代替シーケンスが中間表現において実行される回数を判定するために、選択された複数代替シーケンスの実行カウントの値を確認してよい。選択された複数代替シーケンスの実行カウントが１の場合、この複数代替シーケンスは中間表現において１回実行される。複数代替シーケンスの実行カウントが１よりも大きい場合、その複数代替シーケンスは中間表現において１回よりも多く実行される。
【００９７】
選択された複数代替シーケンスが中間命令において１回だけ実行される場合（ステップＳ６３３においてＮＯ）、パターン選択部４６５は、選択された複数代替シーケンスに対するシーケンスリスト４６７における命令として、選択された複数代替シーケンスの代替パターンから１つの最適な代替パターンを選択してよい（ステップＳ６３４）。
【００９８】
選択された複数代替シーケンスが中間表現において１回よりも多く実行される場合（ステップＳ６３３においてＹＥＳ）、パターン選択部４６５は、選択された複数代替シーケンスの代替パターンから、非ゼロの割合を持つ代替パターンを選択してよい。非ゼロの割合を持つ代替パターンのそれぞれは、割合がゼロではない代替パターンである。パターン選択部４６５は、選択された複数代替シーケンスに対するシーケンスリスト４６７における命令として、選択された代替パターンをそれらのそれぞれの非ゼロの割合とともに選択してよい（ステップＳ６３５）。この場合、選択された代替パターンであるアセンブリ命令シーケンスと、それらのそれぞれの割合とが、命令として選択される。非ゼロの割合を持つ代替パターンの数が１つだけである場合、パターン選択部４６５は、複数代替シーケンスに対するシーケンスリスト４６７における命令として、割合がゼロではないその代替パターンを選択してよい。この場合、割合がゼロではないその代替パターンであるアセンブリ命令シーケンスが、命令として選択される。
【００９９】
次に、パターン選択部４６５は、シーケンスリスト４６７において、複数代替シーケンスを選択された命令で置き換えてよい（ステップＳ６３６）。上述したように、選択された命令は、アセンブリ命令シーケンス、又は、複数のアセンブリ命令シーケンス及びそれらのそれぞれの割合であってよい。パターン選択部４６５は、代替パターンに非ゼロの割合を持つ２つ以上の代替パターンが含まれる複数代替シーケンス以外の複数代替シーケンスを、命令シーケンスとしてのアセンブリ命令シーケンスによって置き換えてよい。パターン選択部４６５は、代替パターンに非ゼロの割合を持つ２つ以上の代替パターンが含まれる複数代替シーケンスを、命令シーケンスとしての複数の代替パターン及びそれらのそれぞれの割合によって置き換えてよい。
【０１００】
中間表現において全ての複数代替シーケンスが選択されているわけではない場合（ステップＳ６３７においてＮＯ）、情報処理装置２００の動作は、ステップＳ６３２に戻り、情報処理装置２００は、ステップＳ６３２から動作を繰り返す。中間表現において全ての複数代替シーケンスが選択された場合（ステップＳ６３７においてＹＥＳ）、パターン選択部４６５は、他の中間命令、すなわち、複数代替シーケンスに含まれない中間命令、に対して、中間命令からアセンブリ命令へのマッピングに基づくアセンブリ命令を、選択された中間命令に対するシーケンスリスト４６７における命令として選択する（ステップＳ６３８）。パターン選択部４６５は、他の中間命令を、選択された命令、すなわち、選択されたアセンブリ命令によって置き換える（ステップＳ６３９）。情報処理装置２００は、図６Ｃの動作を終了する。
【０１０１】
図６Ｄは、本実施形態に係る情報処理装置２００のスケジューリング処理の例のフローチャートである。命令スケジューラ４７０がシーケンスリスト４６７を受信場合、命令スケジューラ４７０は、図６Ｄの動作を開始する。
【０１０２】
命令スケジューラ４７０は、シーケンスリスト４６７において、非ゼロの割合を持つ代替パターンの命令を特定してよい（ステップＳ６４１）。非ゼロの割合を持つ代替パターンの命令の各々は、シーケンスリスト４６７に命令シーケンスとして含まれる、複数の代替パターンとそれらのそれぞれの割合である。非ゼロの割合を持つ代替パターンの命令がシーケンスリスト４６７内にない場合（ステップＳ６４２においてＮＯ）、命令スケジューラ４７０は、シーケンスリスト４６７における命令をスケジューリングする（ステップＳ６４４）。そして、情報処理装置２００は、図６Ｄのフローチャートの動作を終了する。
【０１０３】
非ゼロの割合を持つ代替パターンの命令がシーケンスリスト４６７にある場合（ステップＳ６４２においてＹＥＳ）、命令スケジューラ４７０は、非ゼロの割合を持つ代替パターンの命令の各々について、非ゼロの割合を持つ代替パターンのうち１つの代替パターンを、代替パターンの割合に基づいて選択してよい（ステップＳ６４３）。命令スケジューラは、非ゼロの割合を持つ代替パターンの命令シーケンスの各々について、非ゼロの割合を持つ代替パターンの命令シーケンスを、その命令シーケンスに対して選択された代替パターン（すなわちアセンブリ命令シーケンス）で置き換えてよい。命令スケジューラ４７０は、シーケンスリスト４６７におけるアセンブリ命令をスケジューリングする（ステップＳ６４４）。そして、情報処理装置２００は、図６Ｄのフローチャートの動作を終了する。
【０１０４】
本実施形態の有利な効果は、実行ユニットを含むシステムの性能を改善できることである。
【０１０５】
同じ中間命令シーケンスが同じアセンブリ命令シーケンスへ変換される場合、同じ中間命令シーケンスから変換されたアセンブリ命令シーケンスは、乗算部などの同じ実行ユニットのみによって実行され、他の実行ユニットは、アイドル状態になるであろう。
【０１０６】
本実施形態では、代替パターン特定部４６２は、１回よりも多く実行される複数代替シーケンスを特定する。パターン選択部４６５は、特定された複数代替シーケンスの代替パターンの割合を決定する。命令スケジューラ４７０は、割合に基づいて、代替パターン（すなわち異なるアセンブリ命令シーケンス）のうちの一つを選択する。結果として、同じ中間命令シーケンスの各々は、２つ以上の異なる種類のうちの１つのアセンブリ命令シーケンス、すなわち、演算子の異なる組み合わせのうちの１つのアセンブリ命令へ変換されうる。アセンブリ命令を実行する実行ユニットは、アセンブリ命令に含まれる演算子に応じて定まりうる。
【０１０７】
その結果、本実施形態では、同じ中間命令シーケンスから変換されたアセンブリ命令を実行するのに、２つ以上の異なる実行ユニットが使用されうる。異なる実行ユニットは、並列に動作しうる。これにより、同じ中間命令シーケンスから変換されたアセンブリ命令を実行する時間は、同じ中間命令シーケンスが同じ演算子を持つアセンブリ命令へ変換される場合と比べて、短縮される。したがって、実行ユニットを含むシステムの性能を改善できる。
【０１０８】
＜第２実施形態＞
図５は、本開示の第２実施形態に係る情報処理装置５００の構成例のブロック図である。
【０１０９】
第１実施形態に係る情報処理装置２００は、命令スケジューリングとは無関係に、命令選択を行う。換言すると、情報処理装置２００は、ソースプログラムから生成されたアセンブリ命令のスケジューリングとは無関係に、代替パターンの各々の割合を決定する。対照的に、情報処理装置５００は、命令スケジューリングとは無関係ではなく、命令選択を行う。換言すると、情報処理装置５００は、アセンブリ命令のスケジューリングを行う間に得られる情報に基づいて、代替パターンの各々の割合を決定する。
【０１１０】
情報処理装置５００は、フロントエンド５２０、中間コード生成部５３０、コード最適化部５４０、代替パターン特定部５５０、代替パターン生成部５６１、利用可能リスト生成部５６４、リソースモニタ５７０、スケジューリング基準モジュール５８０、パターン選択部５８２、命令スケジューラ５８３及びレジスタ割当て部５８４を含む。上述したように、情報処理装置５００は、プロセッサ及びメモリを含むコンピュータによって実現される。情報処理装置５００は、プロセッサ５９０及びメモリ５９１を含むように、図５に描かれている。以下で説明するように、レジスタ割当て部５８４は、実行可能な命令である機械語命令を出力する。プロセッサ５９０は、レジスタ割当て部５８４によって出力される機械語命令を実行する。
【０１１１】
図５のフロントエンド５２０は、図４のフロントエンド４２０が動作するのと同様に動作する。図５の中間コード生成部５３０は、図４の中間コード生成部４３０が動作するのと同様に動作する。図５のコード最適化部５４０は、図４のコード最適化部４４０が動作するのと同様に動作する。図５の代替パターン特定部５５０は、図４の代替パターン特定部４６２が動作するのと同様に動作する。図５の代替パターン生成部５６１は、図４の代替パターン生成部４６４が動作するのと同様に動作する。代替パターン生成部５６１により出力される図５の連結リスト５６３は、図４の連結リスト４６３と同じである。パターン選択部５８２により出力されるシーケンスリスト５６７は、図４のシーケンスリスト４６７と同じである。シーケンスリストは代替パターンの割合を含まなくてもよい。
【０１１２】
リソースモニタ５７０は、目的プログラムが情報処理装置５００のプロセッサ５９０によって実行される場合に使用されうる、例えば実行ユニットやＡＬＵなどのリソースを監視し、監視の結果としてリソースの状態を取得し、リソースの状態を表す状態情報を出力する。リソースの状態は、リソースがビジーであることを示すビジー状態、又は、リソースが空いていることを示す空き状態であってよい。リソースモニタ５７０は、リソースのそれぞれについて出力される状態として、ビジーであることを示す値又はビジーであることを示す別の値を含む状態情報を、出力してよい。リソースモニタ５７０は、複数のリソースを監視してよく、複数のリソースの状態を取得してよく、複数のリソースの状態をそれぞれ表す値を出力する。リソースモニタ５７０は、複数代替シーケンスの代替パターンを代替パターン特定部５５０から受信してよく、受信した代替パターンをプロセッサ５９０が実行する際に使用されるリソースの状態を取得してよい。リソースモニタ５７０は、状態情報を、スケジューリング基準モジュール５８０及びパターン選択部５８２へ送信してよい。
【０１１３】
スケジューリング基準モジュール５８０は、アセンブリ命令をスケジューリングするための基準を記憶する。その基準は、情報処理装置５００の管理者又はユーザにより定義されてよい。基準は、速度の条件、レジスタ圧力の条件、生存レジスタ数の条件、又は、前述の条件の可能な組み合わせのうちの一つ等を含んでいてよい。基準は上述の例に限定されない。スケジューリング基準モジュール５８０は、状態情報をリソースモニタ５７０から受信してよく、状態情報に基づいて基準を更新してよい。リソースモニタ５７０は、例えば、状態情報が現在ビジーである実行ユニットに関する情報を含む場合、基準において、利用可能な実行ユニットからビジーな実行ユニットを除外すること、状態情報が現在使用中のレジスタに関する情報を含む場合、基準において、利用可能なレジスタから使用中のレジスタを除外すること、などによって、基準を更新してよい。そのような情報は、代替パターン（すなわちアセンブリ命令シーケンス）の組み合わせを決定する際に、代替パターンの決定された組み合わせが最も有利であるように、パターン選択部５８２によって使用されてよい。基準の更新方法は、上述の例に限定されず、また上述の例を含まなくてもよい。スケジューリング基準モジュール５８０は、基準を出力する。その基準は、更新された基準であってよい。スケジューリング基準モジュール５８０は、基準をパターン選択部５８２へ送信してよい。
【０１１４】
パターン選択部５８２は、代替パターン生成部５６１によって出力された連結リスト５６３と、コード最適化部５４０から出力された、最適化された中間表現とを受信する。連結リスト４６３と同様に、連結リスト５６３は、複数代替シーケンスのそれぞれについて、代替パターンを含む。
【０１１５】
パターン選択部５８２は、実行カウント、すなわち、代替パターン特定部５５０によって特定された複数代替シーケンスのそれぞれが、最適化された中間表現において実行される回数、を、パターン選択部４６５が回数を決定するのと同様の方法によって決定してよい。
【０１１６】
パターン選択部５８２は、最適化された中間表現において１回実行される複数代替シーケンスに対して、その複数代替シーケンスの代替パターンの中の１つの最適な代替パターンを、シーケンスリスト５６７における命令として選択してよい。パターン選択部５８２は、最適化された中間表現において２回以上実行される複数代替シーケンスに対して、その複数代替シーケンスの代替パターンを、シーケンスリスト５６７における命令として選択してよい。パターン選択部５８２は、最適化された中間表現に含まれる、複数代替シーケンスに含まれる中間命令ではない中間命令に対して、中間命令シーケンスからアセンブリ命令シーケンスへのマッピングに基づいてアセンブリ命令を選択してよい。
【０１１７】
具体的には、パターン選択部５８２は、以下のように動作してよい。パターン選択部５８２は、代替パターン特定部５５０によって特定された複数パターンシーケンスの中の、選択されていない複数パターンシーケンスから、１つの複数パターンシーケンスを選択してよい。
【０１１８】
選択された複数代替シーケンスが、最適化された中間表現において実行される回数が１である場合、すなわち、選択された複数代替シーケンスの実行カウントが１である場合、パターン選択部５８２は、選択された複数代替シーケンスに対するシーケンスリスト５６７における命令シーケンスとして、選択された複数代替シーケンスの代替パターンから、１つの最適な代替パターンを、パターン選択部４６５が行うのと同様の方法で選択する。上述のように、代替パターンのそれぞれは、アセンブリ命令シーケンスである。選択された１つの最適な代替パターンも、また、アセンブリ命令シーケンスである。
【０１１９】
選択された複数代替シーケンスが、最適化された中間表現において実行される回数が、１よりも多い場合、すなわち、選択された複数代替シーケンスの実行カウントが１よりも大きい場合、パターン選択部５８２は、選択された複数代替シーケンスに対するシーケンスリスト５６７における命令シーケンスとして、選択された複数代替シーケンスの代替パターンを選択する。
【０１２０】
パターン選択部５８２は、シーケンスリスト５６７における他の中間命令に対する命令として、中間命令シーケンスからアセンブリ命令シーケンスへのマッピングに基づいて、アセンブリ命令を選択してよい。他の中間命令は、最適化された中間表現に含まれ、複数代替シーケンスに含まれない中間命令である。パターン選択部５８２は、アセンブリ命令シーケンスへ変換できる中間命令シーケンスを抽出すること、及び、抽出された中間命令シーケンスに対するシーケンスリスト５６７における命令シーケンスとして、アセンブリ命令シーケンスを選択することを、全ての他の中間命令が中間命令シーケンスの一部として抽出されるまで繰り返すことができる。
【０１２１】
パターン選択部５８２は、最適化された中間表現をシーケンスリスト５６７として複製することで、シーケンスリスト５６７を初期化してよい。パターン選択部５８２は、実行カウントが１である複数代替シーケンスを、その複数代替シーケンスに対するシーケンスリスト５６７における命令として選択された１つの最適な代替パターンによって置き換えてよい。パターン選択部５８２は、実行カウントが１よりも大きい複数代替シーケンスを、その複数代替シーケンスに対するシーケンスリスト５６７における命令として選択された代替パターンによって置き換えてよい。パターン選択部５８２は、他の中間命令を、シーケンスリスト５６７における命令として選択されたアセンブリ命令によって置き換えてよい。パターン選択部５８２は、シーケンスリスト５６７を出力する。パターン選択部５８２は、シーケンスリスト５６７を、利用可能リスト生成部５６４へ送信してよい。上述のように、シーケンスリスト５６７は、代替パターンにの割合を含まなくてもよい。シーケンスリスト５６７は、命令の割合を含んでいてもよい
【０１２２】
以下で、パターン選択部５８２をさらに説明する。
【０１２３】
利用可能リスト生成部５６４は、パターン選択部５８２によって出力されたシーケンスリスト５６７を受信する。
【０１２４】
シーケンスリスト５６７は、１つの最適な代替パターンに含まれるアセンブリ命令と、複数パターンシーケンスに含まれない中間命令から変換されたアセンブリ命令と、実行カウントが１よりも大きい複数パターンシーケンスの代替パターンと、を含む。つまり、シーケンスリスト５６７は、アセンブリ命令と代替パターンとを含む。以下の説明において、シーケンスリスト５６７に含まれる命令シーケンスは、複数のアセンブリ命令のうちのアセンブリ命令、１つの最適な代替パターンのアセンブリ命令、又は、代替パターンである。
【０１２５】
利用可能リスト生成部５６４は、次に実行できる命令シーケンスをシーケンスリスト５６７から抽出してよい。利用可能リスト生成部５６４は、次に実行できる状態にある複数の命令シーケンスを、シーケンスリスト５６７から抽出してよい。シーケンスリスト５６７の命令シーケンスが実行されていない場合、シーケンスリスト５６７の最初の命令シーケンスが、次に実行できる状態にある命令シーケンスのうちの一つであり得る。シーケンスリスト５６７に最初の命令シーケンスと並列に実行できる状態にある命令シーケンスがある場合、この命令シーケンスも次に実行できる状態にある命令シーケンスの一つである。ある命令シーケンス（「第２命令シーケンス」と表記する）の結果を使用する命令シーケンス（「第２命令シーケンス」と表記する）は、第２命令シーケンスの結果が得られるまで、実行できる状態にない。利用可能リスト生成部５６４は、他の命令シーケンスの結果を使用しない命令シーケンスと、結果が既に得られている他の命令シーケンスの結果を使用する命令シーケンスを抽出してよい。利用可能リスト生成部５６４は、抽出された、次に実行できる状態にある命令シーケンスを含む、利用可能リスト５６５を生成する。利用可能リスト生成部５６４は、抽出された、次に実行できる状態にある命令シーケンスを、出力する。利用可能リスト生成部５６４は、利用可能リスト５６５を出力してよい。利用可能リスト生成部５６４は、利用可能リスト５６５を、命令スケジューラ５８３へ送信してよい。
【０１２６】
以下では、次に実行できる状態にある命令シーケンスを、「実行可能命令シーケンス」と表記する。上述のように、シーケンスリスト５６７は、代替パターンを命令シーケンスとして含んでいてよい。したがって、利用可能リスト５６５は、代替パターンを実行可能命令シーケンスとして含んでいてよい。
【０１２７】
利用可能リスト生成部５６４は、シーケンスリスト５６７で表される動作フローを解析して、抽出された、次に実行できる状態にある命令シーケンスを抽出するために、シーケンスリスト５６７によって表される動作フローを解析してよい。ソースプログラムにおける論理は、命令シーケンスが、別の命令シーケンスの入力として使われるデータを生成する、プロデューサ−コンシューマ・データフローパターンに従って書かれていてよい。データを生成する命令シーケンスは、プロデューサ命令シーケンス（すなわち上述の第１命令シーケンス）と呼ばれ、プロデューサ命令シーケンスによって生成されたデータを使う命令シーケンスは、コンシューマ命令シーケンス（すなわち上述の第２命令シーケンス）と呼ばれる。コンシューマ命令シーケンスは、プロデューサ命令シーケンスがデータを生成する前には実行できない。これは、コンパイルの用語において、「データハザード」として知られる。利用可能リスト生成部５６４は、既に消費可能であるデータを使う命令シーケンスを出力する。
【０１２８】
パターン選択部５８２は、さらに、以下で説明されるように実行できる状態にある代替パターンを、命令スケジューラ５８３から受信する。命令スケジューラ５８３は、以下で詳しく説明される。命令スケジューラ５８３から代替パターンを受信した場合、パターン選択部５８２は、状態情報に対する要求を、リソースモニタ５７０へ送信してよく、基準に対する要求を、スケジューリング基準モジュール５８０へ送信してよい。パターン選択部５８２は、リソースモニタ５７０によって出力された状態情報と、スケジューリング基準モジュール５８０によって出力された基準とを受信する。
【０１２９】
パターン選択部５８２は、リソースモニタ５７０によって出力された状態情報とスケジューリング基準モジュール５８０によって出力された基準とに基づいて、命令スケジューラ５８３から受信した代替パターンの割合を決定してよい。換言すると、パターン選択部５８２は、使用されていない、例えば実行ユニットやＡＬＵなどの利用可能なリソースに基づいて、代替パターンの割合を決定してよい。パターン選択部５８２は、代替パターンを命令スケジューラ５８３から受信してよく、受信した代替パターンの割合を命令スケジューラ５８３へ送信してよい。
【０１３０】
命令スケジューラ５８３は、次に実行することのできる命令シーケンスを受信する。命令スケジューラ５８３は、利用可能リスト生成部５６４によって出力された、利用可能リスト５６５を受信してよい。
【０１３１】
命令スケジューラ５８３は、利用可能リスト生成部５６４が代替パターンを実行可能命令シーケンスとして出力しているかを確認する。命令スケジューラ５８３は、利用可能リスト５６５に実行可能命令シーケンスとして含まれている代替パターンを抽出してよい。以下では、利用可能リスト５６５に実行可能命令シーケンスとして含まれる利用可能なパターンを、「利用可能パターンセット」と表記する。
【０１３２】
利用可能リスト生成部５６４によって代替パターンが実行可能命令シーケンスとして出力された場合、すなわち、命令スケジューラ５８３が、利用可能リスト５６５に実行可能命令シーケンスとして含まれる少なくとも１つの利用可能パターンセットを抽出した場合、命令スケジューラ５８３は、代替パターンとしての同じ代替パターンセットが抽出されたかを確認する。
【０１３３】
換言すると、命令スケジューラ５８３は、利用可能リスト５６５に含まれる代替パターンである実行可能命令シーケンスのそれぞれに対して、実行カウントを決定してよい。さらに換言すると、命令スケジューラ５８３は、利用可能リスト５６５における、複数代替シーケンスに相当する実行可能命令シーケンスのそれぞれに対して、実行カウントを決定してよい。
【０１３４】
本実施形態では、代替パターンセット（第１代替パターンセット）は、他の代替パターンセット（第２代替パターンセット）と、第１代替セットの代替パターンに含まれる演算子が第２代替セットの代替パターンに含まれる演算子と同じである場合に、同じになる。
【０１３５】
命令スケジューラ５８３は、同じ利用可能パターンセットが抽出されていない利用可能パターンセットに対して、１つの最適なアセンブリ命令シーケンスを選択してよい。換言すると、命令スケジューラ５８３は、実行カウントが１である利用可能パターンセットに対して、１つの最適なアセンブリ命令シーケンスを選択してよい。命令スケジューラ５８３は、利用可能パターンセットの利用可能パターンを、選択された１つの最適なアセンブリ命令シーケンスによって置き換えてよい。
【０１３６】
２つ以上の代替パターンセットが同じである場合、これらの代替パターンセットについて、命令スケジューラ５８３は、代替パターンをパターン選択部５８２へ送信してよい。換言すると、実行カウントが１よりも大きい実行可能命令シーケンスについて、命令スケジューラ５８３は、その実行可能命令シーケンスの代替パターンを送信してよい。命令スケジューラ５８３は、代替パターンの割合を、パターン選択部５８２から受信してよい。命令スケジューラ５８３は、代替パターンセットの代替パターンをパターン選択部５８２へ送信してよい。命令スケジューラ５８３は、代替パターンとして、代替パターンセットの代替パターンの演算子のセットを送信してよい。命令スケジューラ５８３は、実行可能命令シーケンスとして受信した代替パターンから、１つの代替パターンを、割合に基づいて選択する。利用可能リスト５６５が、それぞれ代替パターンの組み合わせである２つ以上の実行可能命令シーケンスを含む場合、命令スケジューラ５８３は、それらの組み合わせの各々の、代替パターンを、パターン選択部５８２へ送信してよく、代替パターンの割合を受信してよく、割合に基づいて、代替パターンから１つの代替パターンを選択してよい。
【０１３７】
命令スケジューラ５８３は、受信した利用可能リスト５６５に含まれる代替パターンを、上述したようにアセンブリ命令シーケンスであり、代替パターンに対して選択された、代替パターンによって置き換えてよい。
【０１３８】
結果として、利用可能リスト５６５は、代替パターンを含まず、アセンブリ命令シーケンスに含まれる、アセンブリ命令を含む。命令スケジューラ５８３は、利用可能リスト５６５に含まれるアセンブリ命令をスケジューリングする。命令スケジューラ５８３は、アセンブリ命令を出力する。
【０１３９】
レジスタ割当て部５８４は、命令スケジューラ５８３によって出力されたアセンブリ命令を受信し、機械語命令を生成するために、受信したアセンブリ命令にレジスタを割り当てる。
【０１４０】
プロセッサ５９０は、機械語命令を受信し、必要であればメモリ５９１を使って、機械語命令を実行する。機械語命令を終了する際、プロセッサ５９０は、利用可能リスト生成部５６４に終了した機械語命令についての情報を知らせてよい。
【０１４１】
利用可能リスト生成部５６４は、終了した機械語命令についての情報を受信してよく、終了した機械語命令についての情報に基づいて、実行できる状態にある命令シーケンスを更新してよい。より詳細には、利用可能リスト生成部５６４は、終了した機械語命令に対応するアセンブリ命令を含む命令シーケンスを特定してよく、終了した機械語命令によって生成されるデータが利用可能である場合に利用可能になるデータを使用する命令シーケンスを、新しい実行可能命令シーケンスとして抽出してよい。そして、利用可能リスト生成部５６４は、新しい実行可能命令シーケンスを含む新しい利用可能リスト５６５を生成してよく、その新しい利用可能リスト５６５を命令スケジューラ５８３へ送信してよい。
【０１４２】
図７Ａ、７Ｂ、７Ｃ、７Ｄ及び７Ｅは、本実施形態の情報処理装置５００の動作例のフローチャートである。
【０１４３】
図７Ａは、情報処理装置５００における動作全体の例のフローチャートである。
【０１４４】
まず、フロントエンド５２０が、フロントエンド５２０へ入力されたソースプログラムを解析する（ステップＳ７１１）。次に、中間コード生成部５３０が、ソースプログラムを中間表現へ変換する（ステップＳ７１２）。コード最適化部５４０は、中間表現を最適化し（ステップＳ７１３）、最適化された中間表現を生成する。ステップＳ７１１、ステップＳ７１２、及びステップＳ７１３の動作は、それぞれ、ステップＳ６１１、ステップＳ６１２、及びステップＳ６１３の動作と同様である。次に、情報処理装置５００は、コード生成処理を行う（ステップＳ７１４）。コード生成処理において、情報処理装置５００は、最適化された中間コードを機械語命令へ変換し、その機械語命令を出力する。ステップＳ７１４におけるコード生成処理を以下で詳しく説明する。
【０１４５】
図７Ｂは、本実施形態の情報処理装置５００のコード生成処理における動作例のフローチャートである。
【０１４６】
代替パターン特定部５５０は、最適化された中間表現において、複数代替シーケンスを特定する（ステップＳ７２１）。代替パターン生成部５６１は、複数代替シーケンスのそれぞれに対して代替パターンを生成する（ステップＳ７２２）。ステップＳ７２１及びステップＳ７２２の動作は、それぞれステップＳ６２１及びステップＳ６２２の動作と同様である。そして、情報処理装置５００は、変換処理（ステップＳ７２５）と、スケジューリング処理（ステップＳ７２６）とを行う。変換処理において、情報処理装置５００は、最適化された中間表現を、アセンブリ命令を含むシーケンスリスト５６７へ変換する。シーケンスリスト５６７は、さらに、代替パターンの命令シーケンスを含んでいてよい。換言すると、シーケンスリスト５６７は、代替パターンを、命令シーケンス（すなわち代替パターンの命令シーケンス）として含んでいてよい。代替パターンの命令シーケンスは、複数代替シーケンスから変換された、複数代替シーケンスの複数の代替パターンである。スケジューリング処理において、情報処理装置５００は、ソースプログラムから生成された機械語命令を実行するコンピュータの状態に基づいて、シーケンスリスト５６７に含まれる複数の代替パターンから、１つの代替パターンを、命令シーケンスとして選択する。本実施形態では、情報処理装置５００は、ソースプログラムから生成された機械語命令を実行するコンピュータである。ステップＳ７２５における変換処理及びステップＳ７２６におけるスケジューリング処理を以下で詳しく説明する。
【０１４７】
図７Ｃは情報処理装置５００の変換処理の動作例のフローチャートである。
【０１４８】
パターン選択部５８２はシーケンスリスト５６７を初期化してよい（ステップＳ７３１）。パターン選択部５８２は、シーケンスリスト５６７として、連結リスト５６３の複製を生成してよい。
【０１４９】
パターン選択部５８２は、シーケンスリスト５６７において、選択されていない複数代替シーケンスから、１つの複数代替シーケンスを選択してよい（ステップＳ７３２）。
【０１５０】
パターン選択部５８２は、選択された複数代替シーケンスの代替パターンから、非ゼロの割合を持つ代替パターンを、選択された複数代替シーケンスに対する、シーケンスリスト５６７における命令として選択してよい（ステップＳ７３５）。上述したように、非ゼロの割合を持つ代替パターンのそれぞれは、割合がゼロではない代替パターンである。選択された代替パターンである複数のアセンブリ命令シーケンスと、それらの各々の割合とが、命令として選択される。非ゼロの割合を持つ代替パターンの数が１つだけの場合、パターン選択部５８２は、複数代替シーケンスに対する、シーケンスリスト５６７における命令として、割合がゼロではないその代替パターンを選択してよい。この場合、割合がゼロではないその代替パターンであるアセンブリ命令シーケンスが、命令として選択される。
【０１５１】
次に、パターン選択部５８２は、シーケンスリスト５６７において、複数代替シーケンスを選択された命令によって置き換えてよい（ステップＳ７３６）。上述したように、選択された命令は、アセンブリ命令シーケンス、又は、複数のアセンブリ命令シーケンスとそれらの各々の割合とでしてよい。パターン選択部５８２は、代替パターンが非ゼロの割合を持つ２つ以上の代替パターンを含む複数代替シーケンス以外の、複数代替シーケンスを、命令シーケンスとしてのアセンブリ命令シーケンスによって置き換えてよい。パターン選択部５８２は、代替パターンが非ゼロの割合を持つ２つ以上の代替パターンを含む複数代替シーケンスを、命令シーケンスとしての複数の代替パターンとそれらの各々の割合とによって、置き換えてよい。
【０１５２】
中間表現における全ての複数代替シーケンスが選択されたわけではない場合（ステップＳ７３７においてＮＯ）、情報処理装置５００の動作は、ステップＳ７３２に戻り、情報処理装置５００は、ステップＳ７３２から動作を繰り返す。
【０１５３】
中間表現における全ての複数代替シーケンスが選択された場合（ステップＳ７３７においてＹＥＳ）、パターン選択部５８２は、他の中間命令、すなわち、複数代替シーケンスに含まれない中間命令に対して、選択された中間命令に対するシーケンスリスト５６７における命令として、中間命令からアセンブリ命令へのマッピングに基づくアセンブリ命令を選択する（ステップＳ７３８）。パターン選択部５８２は、他の中間命令を、選択された命令、すなわち、選択されたアセンブリ命令によって置き換える（ステップＳ７３９）。情報処理装置５００は、図７Ｃの動作を終了する。
【０１５４】
図７Ｄは、情報処理装置５００のスケジューリング処理の動作例のフローチャートである。
【０１５５】
利用可能リスト生成部５６４は、中間表現から生成された機械語命令を実行するプロセッサ５９０によって通知された、完了した機械語命令に基づいて、シーケンスリスト５６７から実行可能命令シーケンスを抽出し、実行可能命令シーケンスを含む利用可能リスト５６５を更新する（ステップＳ７４０）。利用可能リスト生成部５６４は、シーケンスリスト５６７から、複数の実行可能命令シーケンスを抽出してよい。
【０１５６】
命令スケジューラ５８３は、利用可能リスト５６５において、代替パターンの実行可能命令シーケンスを特定する（ステップＳ７４１）。代替パターンの実行可能命令シーケンスは、シーケンスリスト５６７における命令シーケンスとして選択され、実行できる状態にある命令シーケンスとして利用可能リストへ追加された代替パターンである。
【０１５７】
利用可能リストにおいて、代替パターンの実行可能命令シーケンスが特定されない場合（ステップＳ７４２においてＮＯ）、命令スケジューラ５８３は、利用可能リスト５６５における実行可能命令シーケンスをスケジューリングする（ステップＳ７４４）。２つ以上の実行可能命令シーケンスが利用可能リスト５６５に含まれている場合、命令スケジューラ５８３は、その２つ以上の実行可能命令シーケンスをスケジューリングする。
【０１５８】
少なくとも１つの、代替パターンの実行可能命令シーケンスが、利用可能リストにおいて特定された場合（ステップＳ７４２においてＹＥＳ）、情報処理装置５００は、選択処理を行う（ステップＳ７４３）。ステップＳ７４３における選択処理では、１つの代替パターン（すなわちアセンブリ命令シーケンス）が、代替パターンの実行可能命令シーケンスの、複数の代替パターンに対して選択され、代替パターンの実行可能命令シーケンスが、選択された代替パターンによって置き換えられ、選択された代替パターンが、実行可能命令シーケンスになる。２つ以上の、代替パターンの実行可能命令シーケンスが特定された場合、Ｓ７４３において、２つ以上の、代替パターンの実行可能命令シーケンスは、それらのそれぞれの、選択された代替パターンによって置き換えられる。選択処理は以下で詳しく説明される。そして、命令スケジューラ５８３は、実行可能命令シーケンスをスケジューリングする（ステップＳ７４４）。
【０１５９】
次に、レジスタ割当て部５８４は、実行可能命令シーケンスに、レジスタを割り当てる（ステップＳ７４５）。２つ以上の実行可能命令シーケンスがスケジューリングされている場合、レジスタ割当て部は、それらの２つ以上の実行可能命令シーケンスのそれぞれに、レジスタを割り当てる。レジスタ割当て部５８４は、実行可能命令シーケンスから機械語命令を生成し、その機械語命令を出力する（ステップＳ７４６）。
【０１６０】
最適化された中間表現から変換されたすべての命令シーケンスが、実行可能命令シーケンスとして命令スケジューラ５８３へ送信されているわけではなく、命令スケジューラ５８３によってスケジューリングされているわけではない場合（ステップＳ７４７においてＮＯ）、図７Ｄのスケジューリング処理の動作は、ステップＳ７４０の動作へ戻り、情報処理装置５００は、ステップＳ７４０から動作を繰り返す。
【０１６１】
最適化された中間表現から変換されたすべての命令シーケンスが、実行可能命令シーケンスとして命令スケジューラ５８３へ送信され、命令スケジューラ５８３によってスケジューリングされている場合（ステップＳ７４７においてＹＥＳ）、情報処理装置５００は、図７Ｄのスケジューリング処理を終了する。
【０１６２】
図７Ｅは、情報処理装置５００の選択処理の動作例のフローチャートである。図７Ｅの選択処理の開始時において、２つ以上の、代替パターンの実行可能命令シーケンスが特定されている。しかし、図７Ｅの選択処理の開始時において、１つの代替パターンの実行可能命令シーケンスが、特定されていてもよい。
【０１６３】
パターン選択部５８２は、命令スケジューラ５８３から、代替パターンの実行可能命令シーケンスを受信する。パターン選択部５８２は、受信した、代替パターンの実行可能命令シーケンスの中の、選択されていない代替パターンの実行可能命令シーケンスから、１つの実行可能命令シーケンスを選択する（ステップＳ７５１）。最初は、全ての、受信した代替パターンの実行可能命令シーケンスが、選択されていない。
【０１６４】
パターン選択部５８２は、選択された実行可能命令シーケンスの、実行カウントを判定する（ステップＳ７５２）。パターン選択部５８２は、受信した実行可能命令シーケンスの中で、代替パターンが含む演算子の組み合わせが、選択された実行可能命令シーケンスの代替パターンの演算子の組み合わせと同じである、実行可能命令シーケンスを特定してよい。パターン選択部５８２は、選択された実行可能命令シーケンスの実行カウントとして、代替パターンが含む演算子の組み合わせが、選択された実行可能命令シーケンスの代替パターンの演算子の組み合わせと同じである、特定された実行可能命令シーケンスの数を判定してよい。パターン選択部５８２は、代替パターンが含む演算子の組み合わせが、選択された実行可能命令シーケンスの代替パターンの演算子の組み合わせと同じである、特定された実行可能命令シーケンスも、「選択された」実行可能命令シーケンスとみなしてよい。
【０１６５】
選択された実行可能命令シーケンスが１回実行される場合（ステップＳ７５３においてＮＯ）、すなわち、受信した実行可能命令シーケンスの中に、選択された実行可能命令シーケンスの演算子の組み合わせと同じ演算子の組み合わせを含む、他の実行可能命令シーケンスの代替パターンがない場合、パターン選択部５８２は、選択された実行可能命令シーケンスの代替パターンから、１つの最適な代替パターンを選択する（ステップＳ７５４）。パターン選択部５８２は、選択された実行可能命令シーケンスと関連付けられている、選択された１つの最適なパターンを示す情報を、命令スケジューラ５８３へ送信してよい。パターン選択部５８２は、その情報としてとして、選択された１つの最適なパターンそのものを、命令スケジューラ５８３へ送信してよい。
【０１６６】
命令スケジューラ５８３は、選択された実行可能命令シーケンスに関連付けられている、選択された１つの最適なパターンを示す情報を受信する。命令スケジューラ５８３は、選択された実行可能命令シーケンス、すなわち、代替パターンの実行可能命令シーケンスを、選択された１つの最適なパターンによって置き換える（ステップＳ７５８）。
【０１６７】
選択された実行可能命令シーケンスが１回よりも多く実行される場合（ステップＳ７５３においてＹＥＳ）、すなわち、受信した実行可能命令シーケンスの中で、１つ又はそれ以上の実行可能命令シーケンスのそれぞれの代替パターンが、選択された実行可能命令シーケンスの演算子の組み合わせと同じ演算子の組み合わせを含む場合、パターン選択部５８２は、リソース状態を送信する要求を、リソースモニタ５７０に送信してよい。
【０１６８】
リソースモニタ５７０は、リソース状態、すなわち、リソースの状態を取得する（ステップＳ７５５）。リソースモニタ５７０は、パターン選択部５８２からの要求に応じて、リソース状態を送信してよい。パターン選択部５８２は、リソースモニタ５７０から、リソース状態を受信してよい。
【０１６９】
パターン選択部５８２は、リソース状態に基づいて、選択された実行可能命令シーケンスの代替パターンの割合を決定する（ステップＳ７５６）。パターン選択部５８２は、代替パターンの割合を、命令スケジューラ５８３へ送信する。割合は、それらのそれぞれの代替パターンに関連付けられていてよく、選択された実行可能命令シーケンスと、代替パターン内の演算子の組み合わせが、選択された実行可能命令シーケンスの代替パターン内の演算子の組み合わせと同じである、実行可能命令シーケンスのそれぞれとに、さらに関連付けられていてよい。
【０１７０】
命令スケジューラ５８３は、複数の代替パターンの割合を受信する。命令スケジューラ５８３は、選択された実行可能命令シーケンスの複数の代替パターンから、１つの代替パターンを、割合に基づいて選択する（ステップＳ７５７）。命令スケジューラ５８３は、代替パターン内の演算子の組み合わせが、選択された実行可能命令シーケンスの代替パターン内の演算子の組み合わせと同じである、実行可能命令シーケンスのそれぞれの、複数の代替パターンから、代替パターンを１つずつ選択してよい。
【０１７１】
命令スケジューラ５８３は、選択された、代替パターンの実行可能命令シーケンスを、選択された代替パターンによって置き換える（ステップＳ７５８）。命令スケジューラ５８３は、代替パターン内の演算子の組み合わせが、選択された実行可能命令シーケンスの代替パターン内の演算子の組み合わせと同じである実行可能命令シーケンスの、その実行可能命令シーケンスに対して選択された代替パターンによる置き換えを、代替パターン内の演算子の組み合わせが、選択された実行可能命令シーケンスの代替パターン内の演算子の組み合わせと同じである、実行可能命令シーケンスのそれぞれについて、行ってよい。
【０１７２】
命令スケジューラ５８３から送信された、代替パターンの実行可能命令シーケンスのすべてが選択されているわけではない場合（ステップＳ７５９においてＮＯ）、情報処理装置５００は、ステップＳ７５１から処理を繰り返す。命令スケジューラ５８３から送信された、代替パターンの実行可能命令シーケンスのすべてが選択された場合（ステップＳ７５９においてＹＥＳ）、情報処理装置５００は、図７Ｅの選択処理を終了する。
【０１７３】
本実施形態の有利な効果は、実行ユニットを含むシステムの性能をさらに改善できることである。
【０１７４】
パターン選択部５８２は、中間命令シーケンスからアセンブリ命令シーケンスを介して変換された実行可能命令を実行するコンピュータシステムのリソース状態に基づいて、特定された複数代替シーケンスの代替パターンの割合を決定する。リソース状態は、実行ユニットの状態であってもよい。
【０１７５】
パターン選択部は、ビジー状態の実行ユニットにより実行されるアセンブリ命令シーケンスの割合を減少させ、アイドル状態の実行ユニットにより実行されるアセンブリ命令シーケンスの割合を増加させると決定してよい。パターン選択部は、特定された複数代替シーケンスから変換されたアセンブリ命令シーケンスが、ビジー状態の実行ユニットにより実行されないように、割合を決定してよい。
【０１７６】
したがって、本実施形態によれば、ビジー状態の実行ユニットがアイドル状態となり、ビジー状態の実行ユニットにより実行されるアセンブリ命令シーケンスがビジー状態の実行ユニットによって実行されるのを待つ必要はない。そのため、システムの性能をさらに改善できる。
【０１７７】
＜第３実施形態＞
次に、本開示の第３実施形態を、図面を参照しながら詳細に説明する。第３実施形態は上述の実施形態の主要な部分である。
【０１７８】
図８は、本実施形態に係る情報処理装置８００の構成例のブロック図である。
【０１７９】
図８の情報処理装置８００は、代替パターン特定部８６２、パターン選択部８６５、及び、命令スケジューラ８７０を含む。
【０１８０】
代替パターン特定部８６２は、中間表現（「第１言語のプログラム」とも表記される）において、複数のアセンブリ命令シーケンス（「第２命令シーケンスとも表記」）によってそれぞれ得られる１つの結果をそれぞれ導く複数の中間命令シーケンス（「第１命令シーケンス」とも表記される）を特定する。複数のアセンブリ命令シーケンスに含まれる複数のオペレータは、複数の第１命令シーケンスに共通である。アセンブリ命令シーケンスは、第１言語とは異なるアセンブリ言語（「第２言語」と表記する）の命令シーケンスである。
【０１８１】
つまり、代替パターン特定部８６２は、２回以上実行される複数代替シーケンスを特定する。特定された複数の第１命令シーケンスのそれぞれは、上述の複数代替シーケンスである。第２命令シーケンスは、代替パターンである。
【０１８２】
パターン選択部８６５は、第２命令シーケンスに対して、割合を決定する。より詳細には、パターン選択部８６５は、第２命令シーケンスの演算子に対して、割合を決定する。
【０１８３】
命令スケジューラ８７０は、第１命令シーケンスのそれぞれについて、複数の第２命令シーケンスから、割合に基づいて、１つの第２命令シーケンスを選択する。
【０１８４】
次に、情報処理装置８００の動作の例を、図面を参照しながら説明する。
【０１８５】
図９は情報処理装置８００の動作例である。
【０１８６】
代替パターン特定部８６２は、１回よりも多く実行される複数代替シーケンスを特定する（ステップＳ９１０）。換言すると、代替パターン特定部８６２は、第１言語のプログラムにおいて、複数の第１命令シーケンスを特定する。第１命令シーケンスのそれぞれは、第１言語とは異なる第２言語の、複数の第２命令シーケンスによってそれぞれ得られる１つの結果を導く。複数の第２命令シーケンスは、複数の第１命令シーケンスに共通の複数の演算子を含む。
【０１８７】
次に、パターン選択部８６５は、複数の第２命令シーケンスの複数の演算子に対して、割合を決定する（ステップＳ９２０）。命令スケジューラ８７０は、複数の第１命令シーケンスのそれぞれについて、複数の第２命令シーケンスから、割合に基づいて、１つの第２命令シーケンスを選択する。
【０１８８】
本実施形態の有利な効果は、実行ユニットを含むシステムの性能を改善できることである。
【０１８９】
本実施形態は、第１実施形態と同じ有利な効果を有する。有利な効果の理由は、第１実施形態と同じである。
【０１９０】
＜他の実施形態＞
情報処理装置２００、情報処理装置５００及び情報処理装置８００のそれぞれは、例えば図１のコンピュータ１００などのコンピュータ、例えば回路などの専用ハードウェア、又は、コンピュータと専用ハードウェアとの組み合わせによって実現される。
【０１９１】
記憶媒体１７４は、コンピュータを、情報処理装置２００、情報処理装置５００、又は、情報処理装置８００として動作させるプログラムを記憶していてよい。プロセッサ１１０は、プログラムを読み出し、記憶媒体駆動装置１７３、Ｉ／Ｏサブシステム１６０、及び、メモリブリッジ１５０を介して、メモリサブシステム１８０（「メモリ」とも表記する）に、プログラムを読み出してよい。
【０１９２】
プロセッサ１１０は、コンピュータ１００を情報処理装置２００として動作させる、メモリサブシステム１８０へロードされたプログラムを実行してよい。プロセッサ１１０は、フロントエンド２１０、中間コード生成部２２０、コード最適化部２３０、及び、コード生成部２４０として動作する。プロセッサ１１０は、命令選択部３１０、命令スケジューラ３２０、及び、レジスタ割当て部３３０としても動作する。そして、プロセッサ１１０は、フロントエンド４２０、中間コード生成部４３０、コード最適化部４４０、及び、コード生成部４５０として動作する。より詳細には、プロセッサ１１０は、命令選択部４６０、パターン照合・生成部４６１、代替パターン特定部４６２、代替パターン生成部４６４、及び、パターン選択部４６５としても動作する。
【０１９３】
プロセッサ１１０は、コンピュータ１００を情報処理装置５００として動作させる、メモリサブシステム１８０へロードされたプログラムを実行してよい。プロセッサ１１０は、フロントエンド５２０、中間コード生成部５３０、コード最適化部５４０、代替パターン特定部５５０、代替パターン生成部５６１、利用可能リスト生成部５６４、リソースモニタ５７０、スケジューリング基準モジュール５８０、パターン選択部５８２、命令スケジューラ５８３、及び、レジスタ割当て部５８４として動作する。
【０１９４】
プロセッサ１１０は、コンピュータ１００を情報処理装置８００として動作させる、メモリサブシステム１８０へロードされたプログラムを実行してよい。プロセッサ１１０は、代替パターン特定部８６２、パターン選択部８６５、及び、命令スケジューラ８７０として動作する。
【０１９５】
本発明は、その実施形態を特に参照して示され、説明されたが、本発明はこれらの実施形態に限定されない。特許請求の範囲で規定されるようは本発明の精神及び範囲から逸脱することなく、形態及び詳細において様々な変更がなされうることが当業者には理解されるであろう。
【符号の説明】
【０１９６】
１００  コンピュータ
１１０  プロセッサ
１１１  レジスタ
１２０  キャッシュサブシステム
１３０  ＧＰＵサブシステム
１４０  画像出力装置
１５０  メモリブリッジ
１６０  Ｉ／Ｏサブシステム
１７０  入力装置
１７１  マウス
１７２  キーボード
１７３  記憶媒体駆動装置
１７４  記憶媒体
１８０  メモリサブシステム
１８１  ＯＳ
１８２  ドライバ
１８３  アプリケーション
１９０  二次記憶装置
２００  情報処理装置
２１０  フロントエンド
２２０  中間コード生成部
２３０  コード最適化部
２４０  コード生成部
３１０  命令選択部
３２０  命令スケジューラ
３３０  レジスタ割当て部
４２０  フロントエンド
４３０  中間コード生成部
４４０  コード最適化部
４５０  コード生成部
４６０  命令選択部
４６１  パターン照合・生成部
４６２  代替パターン特定部
４６３  連結リスト
４６４  代替パターン生成部
４６５  パターン選択部
４６７  シーケンスリスト
４７０  命令スケジューラ
４８０  レジスタ割当て部
５００  情報処理装置
５２０  フロントエンド
５３０  中間コード生成部
５４０  コード最適化部
５５０  代替パターン特定部
５６１  代替パターン生成部
５６４  利用可能リスト生成部
５７０  リソースモニタ
５８０  スケジューリング基準モジュール
５８２  パターン選択部
５８３  命令スケジューラ
５８４  レジスタ割当て部
５９０  プロセッサ
５９１  メモリ
【図１】
2019517068.tif 000003
【図２】
2019517068.tif 000004
【図３】
2019517068.tif 000005
【図４】
2019517068.tif 000006
【図５】
2019517068.tif 000007
【図６Ａ】
2019517068.tif 000008
【図６Ｂ】
2019517068.tif 000009
【図６Ｃ】
2019517068.tif 000010
【図６Ｄ】
2019517068.tif 000011
【図７Ａ】
2019517068.tif 000012
【図７Ｂ】
2019517068.tif 000013
【図７Ｃ】
2019517068.tif 000014
【図７Ｄ】
2019517068.tif 000015
【図７Ｅ】
2019517068.tif 000016
【図８】
2019517068.tif 000017
【図９】
2019517068.tif 000018
【手続補正書】
【提出日】平成30年11月15日(2018.11.15)
【手続補正２】
【補正対象書類名】特許請求の範囲
【補正対象項目名】全文
【補正方法】変更
【補正の内容】
【特許請求の範囲】
【請求項１】
第１言語のプログラムにおいて、複数の第１命令シーケンスを特定し、前記複数の第１命令シーケンスの各々は、前記第１言語とは異なる第２言語の複数の第２命令シーケンスによってそれぞれ得られる１つの結果を導き、前記複数の第２命令シーケンスは、前記第１命令シーケンスに共通の演算子を含む、代替パターン特定手段と、
前記複数の第２命令シーケンスの前記演算子に対して、割合を決定するパターン選択手段と、
前記割合に基づいて、前記複数の第１命令シーケンスのそれぞれに対して前記複数の第２命令シーケンスから１つの第２命令シーケンスを選択する命令スケジューラ手段と、
を備える情報処理装置。
【請求項２】
コンピュータシステムの、前記複数の第２命令シーケンスによってそれぞれ表される実行可能命令である第３命令シーケンスを前記コンピュータシステムが実行する際に使用されるリソースの状態である、リソース状態を取得する監視手段をさらに備え、
前記パターン選択手段は、前記リソース状態を取得するのに応じて、前記リソース状態に基づいて前記割合を決定し、
前記命令スケジューラ手段は、前記複数の第２命令シーケンスを、前記コンピュータシステムに供給される前記第３命令シーケンスへ変換する、
請求項１に記載の情報処理装置。
【請求項３】
前記パターン選択手段は、実行可能な前記第２命令シーケンスの前記演算子に対して、前記割合を決定する、
請求項２に記載の情報処理装置。
【請求項４】
前記演算子は、前記コンピュータシステムのプロセッサの演算ユニットと関連付けられており、
前記パターン選択手段は、前記演算ユニットの性能に基づいて、前記割合を決定する、
請求項２又は３に記載の情報処理装置。
【請求項５】
第１言語のプログラムにおいて、複数の第１命令シーケンスを特定し、前記複数の第１命令シーケンスの各々は、前記第１言語とは異なる第２言語の複数の第２命令シーケンスによってそれぞれ得られる１つの結果を導き、前記複数の第２命令シーケンスは前記第１命令シーケンスに共通の演算子を含む、特定することと、
前記複数の第２命令シーケンスの前記演算子に対して、割合の決定を行い、
前記割合に基づいて、前記複数の第１命令シーケンスのそれぞれに対して、前記複数の第２命令シーケンスから１つの第２命令シーケンスを選択する、
情報処理方法。
【請求項６】
コンピュータシステムの、前記複数の第２命令シーケンスによってそれぞれ表される実行可能命令である第３命令シーケンスを前記コンピュータシステムが実行する際に使用されるリソースの状態である、リソース状態を取得し、
前記複数の第２命令シーケンスを、前記コンピュータシステムに供給される前記第３命令シーケンスへ変換し、
前記決定は、前記リソース状態を取得するのに応じて、前記リソース状態に基づいて前記割合を決定することを含む、
請求項５に記載の情報処理方法。
【請求項７】
前記決定は、実行可能な前記第２命令シーケンスの前記演算子に対して、前記割合を決定することを含む、
請求項６に記載の情報処理方法。
【請求項８】
前記演算子は、前記コンピュータシステムのプロセッサの演算ユニットに関連付けられており、
前記決定は、前記演算ユニットの性能に基づいて、前記割合を決定することを含む、
請求項６又は７に記載の情報処理方法。
【請求項９】
コンピュータに、
第１言語のプログラムにおいて、複数の第１命令シーケンスを特定し、前記複数の第１命令シーケンスの各々は、前記第１言語とは異なる第２言語の複数の第２命令シーケンスによってそれぞれ得られる結果を導き、前記複数の第２命令シーケンスは、前記第１命令シーケンスに共通の演算子を含む、代替パターン特定処理と、
前記複数の第２命令シーケンスの前記演算子に対して、割合を決定するパターン選択処理と、
前記割合に基づいて、前記複数の第１命令シーケンスのそれぞれに対して前記複数の第２命令シーケンスから１つの第２命令シーケンスを選択する命令スケジューラ処理と、
を実行させるプログラム。
【請求項１０】
コンピュータに、
コンピュータシステムの、前記複数の第２命令シーケンスによってそれぞれ表される実行可能命令である第３命令シーケンスを前記コンピュータシステムが実行する際に使用されるリソースの状態である、リソース状態を取得する監視処理
をさらに実行させ、
前記パターン選択処理は、前記リソース状態を取得するのに応じて、前記リソース状態に基づいて前記割合を決定し、
前記命令スケジューラ処理は、前記複数の第２命令シーケンスを、前記コンピュータシステムに供給される前記第３命令シーケンスへ変換する、
請求項９に記載のプログラム。
【国際調査報告】
2019517068.tif 000019