(57)【特許請求の範囲】
【請求項１】
入力されたソースファイルにおいて命令列の繰り返しを指示する繰り返し命令を検出すると、前記繰り返し命令によって繰り返される前記命令列を抽出する抽出部と、
抽出された前記命令列に含まれる整数命令を浮動小数点型の仮想レジスタに格納されたビット列を整数として扱うことで浮動小数点演算器に整数演算を実行させる命令に変換して整数命令列を生成する第１の生成部と、
抽出された前記命令列に含まれる浮動小数点命令を整数型の仮想レジスタに格納されたビット列を浮動小数点数として扱うことで整数演算器に浮動小数点演算を実行させる命令に変換して浮動小数点命令列を生成する第２の生成部と、
前記ソースファイルをコンパイルしたオブジェクトの実行環境となるプロセッサの有する整数演算器の数および浮動小数点演算器の数に基づいて、前記整数命令列と前記浮動小数点命令列とを含む出力命令列を生成する第３の生成部と、を備える、
コンパイラ装置。
【請求項２】
前記繰り返し命令による前記命令列の繰り返し回数、前記整数演算器の数および前記浮動小数点演算器の数に基づいて、前記繰り返し命令による前記出力命令列の繰り返し回数を決定する決定部をさらに備える、
請求項１に記載のコンパイラ装置。
【請求項３】
前記決定部は、前記繰り返し命令による前記命令列の繰り返し回数を前記整数演算器の数および前記浮動小数点演算器の数の和で除算した値を前記繰り返し命令による前記出力命令列の繰り返し回数とする、
請求項２に記載のコンパイラ装置。
【請求項４】
整数演算器と浮動小数点演算器の数をプロセッサ種別毎に記憶するプロセッサ情報記憶部と、
前記オブジェクトの実行環境となるプロセッサの有する整数演算器と浮動小数点演算器の数を前記プロセッサ情報記憶部から取得する演算器数取得部と、をさらに備える、
請求項１から３のいずれか一項に記載のコンパイラ装置。
【請求項５】
前記抽出部によって抽出される前記命令列は分岐を含まない命令列である、
請求項１から４のいずれか一項に記載のコンパイラ装置。
【請求項６】
プロセッサを備えるコンピュータが、
入力されたソースファイルにおいて命令列の繰り返しを指示する繰り返し命令を検出すると、前記繰り返し命令によって繰り返される前記命令列を抽出し、
抽出された前記命令列に含まれる整数命令を浮動小数点型の仮想レジスタに格納されたビット列を整数として扱うことで浮動小数点演算器に整数演算を実行させる命令に変換して整数命令列を生成し、
抽出された前記命令列に含まれる浮動小数点命令を整数型の仮想レジスタに格納されたビット列を浮動小数点数として扱うことで整数演算器に浮動小数点演算を実行させる命令に変換して浮動小数点命令列を生成し、
前記プロセッサの有する整数演算器の数および浮動小数点演算器の数に基づいて、前記整数命令列と前記浮動小数点命令列とを含む出力命令列を生成する、
コンパイル方法。
【請求項７】
プロセッサを備えるコンピュータに、
入力されたソースファイルにおいて命令列の繰り返しを指示する繰り返し命令を検出すると、前記繰り返し命令によって繰り返される前記命令列を抽出させ、
抽出された前記命令列に含まれる整数命令を浮動小数点型の仮想レジスタに格納されたビット列を整数として扱うことで浮動小数点演算器に整数演算を実行させる命令に変換して整数命令列を生成させ、
抽出された前記命令列に含まれる浮動小数点命令を整数型の仮想レジスタに格納されたビット列を浮動小数点数として扱うことで整数演算器に浮動小数点演算を実行させる命令に変換して浮動小数点命令列を生成させ、
前記プロセッサの有する整数演算器の数および浮動小数点演算器の数に基づいて、前記整数命令列と前記浮動小数点命令列とを含む出力命令列を生成させる、
コンパイラプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、コンパイラ装置、コンパイル方法およびコンパイラプログラムに関する。
【背景技術】
【０００２】
近年のプロセッサは、入力された命令を実行する演算器を複数有することで、複数の命令を並列に実行するスーパースカラを実現している。また、近年のプロセッサは、命令間に依存関係および分岐命令が無い場合、命令の順番を入れ替えて実行可能なアウトオブオーダーを実現している。演算器は、整数演算を実行する整数演算器および浮動小数点演算を実行する浮動小数点演算器を含む。すなわち、整数演算を行う整数命令は整数演算器で実行され、浮動小数点演算を行う浮動小数点命令は浮動小数点演算器で実行される。
【先行技術文献】
【特許文献】
【０００３】
【特許文献１】特開平４−３０７６２４号公報
【特許文献２】特開平１１−１１０２１５号公報
【発明の概要】
【発明が解決しようとする課題】
【０００４】
そのため、プロセッサによって実行されるオブジェクトに含まれる整数命令および浮動小数点命令の割合に偏りがあると、整数演算器および浮動小数点演算器のうちの一方の演算器に処理が集中する虞がある。その結果、他方の演算器は効率的に使用されない虞がある。そこで、開示の技術の１つの側面は、プロセッサの有する演算器を効率的に使用できるオブジェクトを生成可能なコンパイラ装置を提供することを課題とする。
【課題を解決するための手段】
【０００５】
開示の技術の１つの側面は、次のようなコンパイラ装置によって例示される。本コンパイラ装置は、抽出部、第１の生成部、第２の生成部および第３の生成部を備える。抽出部は、入力されたソースファイルにおいて命令列の繰り返しを指示する繰り返し命令を検出すると、繰り返し命令によって繰り返される命令列を抽出する。第１の生成部は、抽出された命令列に含まれる命令を整数演算を行う整数命令に変換して整数命令列を生成する。第２の生成部は、抽出された命令列に含まれる命令を浮動小数点演算を行う浮動小数点命令に変換して浮動小数点命令列を生成する。第３の生成部は、ソースファイルをコンパイルしたオブジェクトの実行環境となるプロセッサの有する整数演算器の数および浮動小数点演算器の数に基づいて、整数命令列と浮動小数点命令列とを含む出力命令列を生成する。
【発明の効果】
【０００６】
本コンパイラ装置は、プロセッサの有する演算器を効率的に使用できるオブジェクトを生成することができる。
【図面の簡単な説明】
【０００７】
【図１】図１は、情報処理装置のハードウェア構成を例示する図である。
【図２】図２は、情報処理装置が有するプロセッサの構成の一例を示す図である。
【図３】図３は、中間コードの一例を示す図である。
【図４】図４は、ブロックと命令の関係の一例を示す図である。
【図５】図５は、ループの命令列の一例を示す図である。
【図６】図６は、ループ展開後の命令列の一例を示す図である。
【図７】図７は、プロセッサに入力される命令列に含まれる各命令が複数の演算器で実行される処理の一例を示す図である。
【図８】図８は、命令列に含まれる各命令を複数の演算器で分散して実行している状態の一例を示す図である。
【図９】図９は、命令列に含まれる各命令の実行がひとつの演算器に集中した状態の一例を示す図である。
【図１０】図１０は、プログラムをコンパイルする処理の流れの一例を示す図である。
【図１１】図１１は、コンパイルおよびコンパイル後のプログラムの実行の一例を示す図である。
【図１２】図１２は、第１実施形態に係るコンパイラ装置の処理ブロックの一例を示す図である。
【図１３】図１３は、コンパイラ装置に入力されるループの命令列の一例を示す図である。
【図１４】図１４は、ループ展開に適さないソースファイルの一例を示す図である。
【図１５】図１５は、第１実施形態に係るコンパイラ装置によるループ展開処理の流れの一例を示す図である。
【図１６】図１６は、ループの構造の一例を示す図である。
【図１７】図１７は、第１実施形態で入力されるループの命令列の一例を示す図である。
【図１８】図１８は、図１５のＦ４およびＦ５の処理の詳細な流れの一例を示す図である。
【図１９】図１９は、ＦＵ変換テーブルの一例を示す図である。
【図２０】図２０は、ＩＵ変換テーブルの一例を示す図である。
【図２１】図２１は、入力されたループ演算命令列に含まれる各命令の整数命令への変換前後の対応の一例を示す図である。
【図２２】図２２は、入力されたループ演算命令列に含まれる各命令の浮動小数点演算命令への変換前後の対応の一例を示す図である。
【図２３】図２３は、ループ演算命令列の展開処理の一例を示す図である。
【図２４】図２４は、仮想レジスタマップの一例を示す図である。
【図２５】図２５は、参照リストオペランドにおける仮想レジスタの変換処理の一例を示す図である。
【図２６】図２６は、メモリオペランドのループ展開前後の対応の一例を示す図である。
【図２７】図２７は、各展開番号におけるメモリオペランドの変換を例示する図である。
【図２８】図２８は、定義リストオペランドにおける仮想レジスタオペランドの変換処理の一例を示す図である。
【図２９】図２９は、出力ループ命令列格納部に格納された命令列の一例を示す図である。
【図３０】図３０は、回転数が補正されたループ命令列の一例を示す図である。
【図３１】図３１は、ループ展開後のループの命令列の一例を示す図である。
【図３２】図３２は、命令列が実行された場合の演算器の使用状況の一例を示す図である。
【図３３】図３３は、命令列が実行された場合の演算器の使用状況の一例を示す図である。
【図３４】図３４は、第１比較例に係るコンパイラ装置のループ展開を行う処理ブロックの一例である。
【図３５】図３５は、ループの命令列を疑似的に例示する図である。
【図３６】図３６は、図３５に例示されるループが第１比較例に係るコンパイラ装置によってループ展開された命令列の一例を示す図である。
【図３７】図３７は、第２比較例によるループ展開を模式的に例示する図である。
【図３８】図３８は、図３７を疑似コードによって例示する図である。
【図３９】図３９は、第１比較例によるループ展開と第１実施形態によるループ展開とを比較する図の一例である。
【図４０】図４０は、コンパイラに入力されるソースファイルに含まれるループの一例を示す図である。
【図４１】図４１は、図４０に例示されたループを第１比較例によるループ展開を行った命令列の一例を示す図である。
【図４２】図４２は、図４０に例示されたループに対して第１実施形態によるループ展開を行った命令列の一例を示す図である。
【図４３】図４３は、回帰演算の一例を示す図である。
【図４４】図４４は、参照オペランドと定義オペランドを含む命令の一例を示す図である。
【図４５】図４５は、コンパイラ装置に入力されるループの命令列の一例を示す図である。
【図４６】図４６は、図４５で例示されたループ展開後の命令列を中間コードで表現した命令列の一例を示す図である。
【図４７】図４７は、第１変形例に係るコンパイラ装置によるループ展開処理の流れの一例を示す図である。
【図４８】図４８は、図４７のＲ１およびＲ２の処理の詳細な流れの一例を示す図である。
【図４９】図４９は、回帰演算用の初期化処理を示す図の一例である。
【図５０】図５０は、ループ演算命令列の展開処理の一例を示す図である。
【図５１】図５１は、回帰演算命令の一例を示す図である。
【図５２】図５２は、回帰演算命令の書き換え処理の一例を示す図である。
【図５３】図５３は、回帰演算命令の書き換え処理の一例を示す図である。
【図５４】図５４は、回帰演算命令の書き換え処理の一例を示す図である。
【図５５】図５５は、回帰演算命令の書き換え処理の一例を示す図である。
【図５６】図５６は、回帰演算命令の書き換え処理の一例を示す図である。
【図５７】図５７は、ループ展開後のループ演算命令列の一例を示す図である。
【図５８】図５８は、ループ展開後の初期化命令列の一例を示す図である。
【図５９】図５９は、ループ展開後の収束命令列の一例を示す図である。
【図６０】図６０は、ループ展開後のループ命令列の一例を示す図である。
【図６１】図６１は、ループ展開後のループの命令列の一例を示す図である。
【発明を実施するための形態】
【０００８】
以下、図面を参照して、一実施形態に係るコンパイラ装置について説明する。以下に示す実施形態の構成は例示であり、開示の技術は実施形態の構成に限定されない。
【０００９】
＜第１実施形態＞
図１は、情報処理装置１００のハードウェア構成を例示する図である。情報処理装置１００は、プロセッサ１０１、主記憶部１０２、補助記憶部１０３、通信部１０４および接続バスＢ１を含む。プロセッサ１０１、主記憶部１０２、補助記憶部１０３および通信部１０４は、接続バスＢ１によって相互に接続されている。情報処理装置１００は、例えば、第１実施形態に係るコンパイラ装置１０として使用できる。コンパイラ装置１０は、入力されたプログラムのソースファイルをコンパイルすることでプロセッサによって実行可能なオブジェクトを生成する。
【００１０】
情報処理装置１００では、プロセッサ１０１が補助記憶部１０３に記憶されたプログラ
ムを主記憶部１０２の作業領域に展開し、プログラムの実行を通じて周辺装置の制御を行う。これにより、情報処理装置１００は、所定の目的に合致した処理を実行することができる。主記憶部１０２および補助記憶部１０３は、情報処理装置１００が読み取り可能な記録媒体である。
【００１１】
主記憶部１０２は、プロセッサ１０１から直接アクセスされる記憶部として例示される。主記憶部１０２は、Random Access Memory（ＲＡＭ）およびRead Only Memory（ＲＯＭ）を含む。
【００１２】
補助記憶部１０３は、各種のプログラムおよび各種のデータを読み書き自在に記録媒体に格納する。補助記憶部１０３は外部記憶装置とも呼ばれる。補助記憶部１０３には、オペレーティングシステム（Operating System、ＯＳ）、各種プログラム、各種テーブル等が格納される。ＯＳは、通信部１０４を介して接続される外部装置等とのデータの受け渡しを行う通信インターフェースプログラムを含む。外部装置等には、例えば、コンピュータネットワーク等で接続された、他の情報処理装置および外部記憶装置が含まれる。なお、補助記憶部１０３は、例えば、ネットワーク上のコンピュータ群であるクラウドシステムの一部であってもよい。
【００１３】
補助記憶部１０３は、例えば、Erasable Programmable ROM（ＥＰＲＯＭ）、ソリッド
ステートドライブ（Solid State Drive、ＳＳＤ）、ハードディスクドライブ（Hard Disk
Drive、ＨＤＤ）等である。また、補助記憶部１０３は、例えば、Compact Disc（ＣＤ）ドライブ装置、Digital Versatile Disc（ＤＶＤ）ドライブ装置、Blu-ray（登録商標） Disc（ＢＤ）ドライブ装置等である。また、補助記憶部１０３は、Network Attached Storage（ＮＡＳ）あるいはStorage Area Network（ＳＡＮ）によって提供されてもよい。
【００１４】
情報処理装置１００が読み取り可能な記録媒体とは、データやプログラム等の情報を電気的、磁気的、光学的、機械的、または化学的作用によって蓄積し、情報処理装置１００から読み取ることができる記録媒体をいう。このような記録媒体のうち情報処理装置１００から取り外し可能なものとしては、例えばフレキシブルディスク、光磁気ディスク、ＣＤ−ＲＯＭ、ＣＤ−Ｒ／Ｗ、ＤＶＤ、ブルーレイディスク、ＤＡＴ、８ｍｍテープ、フラッシュメモリなどのメモリカード等がある。また、情報処理装置１００に固定された記録媒体としてハードディスク、ＳＳＤあるいはＲＯＭ等がある。
【００１５】
通信部１０４は、例えば、コンピュータネットワークとのインターフェースである。通信部１０４は、コンピュータネットワークを介して外部の装置と通信を行う。
【００１６】
情報処理装置１００は、例えば、ユーザ等からの操作指示等を受け付ける入力部をさらに備えてもよい。このような入力部として、キーボード、ポインティングデバイス、タッチパネル、加速度センサーあるいは音声入力装置といった入力デバイスを例示できる。
【００１７】
情報処理装置１００は、例えば、プロセッサ１０１で処理されるデータや主記憶部１０２に記憶されるデータを出力する出力部を備えるものとしてもよい。このような、出力部として、Cathode Ray Tube（ＣＲＴ）ディスプレイ、Liquid Crystal Display（ＬＣＤ）、Plasma Display Panel（ＰＤＰ）、Electroluminescence（ＥＬ）パネル、有機ＥＬパ
ネルあるいはプリンタといった出力デバイスを例示できる。
【００１８】
図２は、情報処理装置１００が有するプロセッサ１０１の構成の一例を示す図である。プロセッサ１０１は、１つの整数演算器１０１ａおよび２つの浮動小数点演算器１０１ｂ、１０１ｂを有する。整数演算器１０１ａは、整数演算を実行する演算器である。浮動小数点演算器１０１ｂ、１０１ｂは、浮動小数点演算を実行する演算器である。プロセッサ
１０１は、複数の演算器を有することで、複数の命令を並列に実行可能である。なお、図中では、整数演算器１０１ａは「ＩＵ」と記載され、浮動小数点演算器１０１ｂは「ＦＵ」と記載されている。
【００１９】
ここで、コンパイラ装置１０内部での命令の表現である中間コードについて説明する。図３は、中間コードの一例を示す図である。図３を参照して、中間コードについて説明する。
【００２０】
図３に例示される「ld」、「mult」および「st」は、中間コードによって表記された命令コードの一例である。命令コードには整数型の整数命令と浮動小数点型の浮動小数点命令の２種類の型がある。整数命令は、整数演算を行う。浮動小数点命令は、浮動小数点演算を行う。すなわち、整数命令は整数演算器１０１ａで実行され、浮動小数点命令は浮動小数点演算器１０１ｂで実行される。図３に例示される「ld」、「mult」および「st」は、いずれも整数命令の例示である。命令に続いて記載されている「[a+$g1], $g2」、「$g2, 5, $g3」および「$g3, [b+$g1]」は、命令に渡される引数でありオペランドと称され
る。オペランドは、例えば、カンマ（,）で区切ることで複数指定できる。オペランドに
は、仮想レジスタ、メモリオペランドおよび定数等が指定される。整数命令には、整数型のオペランドが指定される。浮動小数点命令には、浮動小数点型のオペランドが指定される。
【００２１】
仮想レジスタは、中間コードで用いられる仮想的なレジスタである。図３では、「$g1
」、「$g2」および「$g3」が仮想レジスタの例示である。仮想レジスタは、ソースファイルがコンパイラ装置１０によってコンパイルされる際に割り付けられるコンパイラ内部での仮想的なレジスタである。仮想レジスタは、整数を扱う整数型の仮想レジスタと浮動小数点数を扱う浮動小数点型の仮想レジスタとがある。本明細書では、整数型をint型、浮
動小数点型をfloat型とも称する。int型の仮想レジスタは、仮想レジスタ名「$g」と仮想レジスタ番号である数字との組み合わせで特定される。float型の仮想レジスタは、仮想
レジスタ名「$f」と仮想レジスタ番号である数字との組み合わせで特定される。int型お
よびfloat型のいずれの仮想レジスタも、仮想レジスタ番号は１から始まり、新しい仮想
レジスタが作成されるたびに仮想レジスタ番号が１ずつ増加する。
【００２２】
メモリオペランドは、アドレス定数、仮想レジスタおよびオフセットによって特定される。図３では、「[a+$g1]」および「[b+$g1]」がメモリオペランドの例示である。アドレス定数は、アドレスを指し示すラベルとしての文字列によって特定される。図３では、「[a+$g1]」の「a」および「[b+$g1]」の「b」がアドレス定数である。オフセットは、アドレス定数および仮想レジスタによって指定されたアドレスからの距離を示す数値である。図３では、「[a+$g1]」および「[b+$g1]」のいずれもオフセットは「０」となっている。すなわち、図３に例示される「[a+$g1]」は、アドレス定数「a」によって示されるアドレスと仮想レジスタ「$g1」の値が加算されたアドレスのメモリを特定している。また、図
３に例示される「[b+$g1]」は、アドレス定数「b」によって示されるアドレスと仮想レジスタ「$g1」の値が加算されたアドレスのメモリを特定している。
【００２３】
図３の「label」は、ブロックの先頭位置を示すラベルである。ブロックは、複数の命
令を含む。分岐命令またはジャンプ命令では、ラベルが指定されることで、ブロックの先頭に処理が進められる。基本ブロックとは、ブロック内に分岐を含まないブロックである。基本ブロックは分岐を含まないため、基本ブロック内の最初の命令が実行されると途中で分岐することなく最後の命令まで実行される。
【００２４】
図４は、ブロックと命令の関係の一例を示す図である。図４では、図３に例示された命令列に基づいて、ブロックと命令の関係の一例を示している。最初の「ld」命令では、ア
ドレス定数「a」が指し示す値と仮想レジスタ「$g1」に格納された値との和によって示されるアドレスで特定されるメモリの値が、仮想レジスタ「$g2」に読み込まれる。次の「mult」命令では、仮想レジスタ「$g2」に読み込まれた値と数字の「5」との乗算の結果が
、仮想レジスタ「$g3」に格納される。最後の「st」命令では、仮想レジスタ「$g3」に格納された値が、アドレス定数「b」と仮想レジスタ「$g1」との和によって示されるアドレスで特定されるメモリ上に格納される。
【００２５】
図５は、ループの命令列の一例を示す図である。ループの命令列は、初期化命令列、ループ演算命令列およびループ命令列を含む。初期化命令列は、ループの初期化を行う。ループの初期化は、ループに用いられるループカウンタの初期化を含む。図５では、ループカウンタとして指定した仮想レジスタ「$g1」に０を代入することで、ループカウンタの
初期化を行っている。ラベル「Label」は、ループ演算命令列の先頭位置を特定する。ル
ープ演算命令列は、ループによって繰り返し実行される命令を含む。ループ命令列は、加算命令または減算命令と比較分岐命令とを含む。ループ命令列における加算命令または減算命令は、加算または減算によってループカウンタの数値を変更する。図５では、加算命令「add」によって、ループカウンタ「$g1」に「４」を加算している。比較分岐命令は、指定された条件にしたがって、処理を分岐させる。図７では、ループカウンタ「$g1」の
値が「９０×４」未満の場合、ラベル「Label」によって特定されるループ演算命令列の
先頭位置に処理が進められる。すなわち、ループは、初期化命令列およびループ命令列によって指定された条件にしたがって、ループ演算命令列の命令を繰り返し実行する。また、ループ演算命令列が基本ブロックである場合、当該ループを最内ループと称する。
【００２６】
図６は、ループ展開後の命令列の一例を示す図である。図６は、図５に例示されたループの命令列をループ展開した命令列の一例である。ループ展開は、ループアンローリングとも称する。ループ展開では、ループ演算命令列の命令を展開することで、ループの回転数を減少させる。図６では、図５に例示されたループ演算命令列の３回転分が１回のループで実行されるようにループ展開されている。展開後の１回のループで実行される、展開前のループ演算命令列の数をループの展開数と称する。図６の場合、展開数は「３」となる。すなわち、ループ展開によって、ループの回転数が減少し、１回のループで実行される命令列の数が増加する。図６に例示されるＡ、Ｂ、Ｃのそれぞれが、図５に例示されたループ命令列のループ１回転分の命令列に相当する。Ａ、Ｂ、Ｃそれぞれによって例示される命令列には、この並び順に展開番号が割り当てられる。すなわち、Ａに例示される命令列の展開番号は１であり、Ｂに例示される命令列の展開番号は２であり、Ｃに例示される命令列の展開番号は３である。例えば、変換後のメモリオペランドのオフセット値は、変換前のオフセット値に（展開番号−１）の値を乗算することで算出する事が可能である。例えば、図５に例示される変換前の命令列では、加算命令によって、１回転ごとに仮想レジスタ「$g1」の値が「４」加算されている。したがって、図６に例示されるループ展
開後の命令列では、例えば、Ｂの命令列（展開番号２）のメモリオペランドでは、「（２−１）×４＝４」のオフセット値が加算されている。また、ループ展開に伴い、ループ命令列におけるループカウンタの１回転当たりの増分が補正されている。図６に例示されるループでは展開数が「３」であるため、ループ命令列における加算命令ではループカウンタ「$g1」に「４×３」が加算されている。ループ展開を行う事で、Ａ、Ｂ、Ｃによって
例示される各命令列の間の分岐命令を排除できる。分岐命令が排除された結果、Ａ、Ｂ、Ｃによって例示される各命令列を複数の演算器で並列して実行可能となる。したがって、ループ展開により、命令の並列実行の効率を高めることが可能である。
【００２７】
図７は、プロセッサ１０１に入力される命令列に含まれる各命令が複数の演算器で実行される処理の一例を示す図である。図７において、ＦＵ０は浮動小数点演算器１０１ｂの一方に対応し、ＦＵ１は浮動小数点演算器１０１ｂの他方に対応する。また、ＩＵ０は、整数演算器１０１ａに対応する。図７では、第１サイクルから第３サイクルまでの処理が
例示されている。図７の命令列に含まれる命令「fadd」は、浮動小数点命令の一例である。浮動小数点命令である「fadd」は、浮動小数点演算器１０１ｂであるＦＵ０またはＦＵ１によって実行される。その結果、第１サイクルでは、命令列の１行目に記載の「fadd $f0,$f1,$f2」がＦＵ０で実行され、命令列の２行目に記載の「fadd $f3,$f4,$f5」はＦＵ１で実行される。第２サイクルでは、命令列の３行目に記載の「fadd $f6,$f7,$f8」がＦＵ０で実行され、命令列の４行目に記載の「fadd $f9,$f10,$f11」はＦＵ１で実行される。第３サイクルでは、命令列の５行目に記載の「fadd $f12,$f13,$f14」がＦＵ０で実行
される。なお、この命令列には、整数命令は含まれていない。そのため、整数命令を実行する整数演算器１０１ｂであるＩＵ０は、図７の命令列をプロセッサ１０１で実行している間、処理を行っていない。
【００２８】
図８は、命令列に含まれる各命令を複数の演算器で分散して実行している状態の一例を示す図である。図８では、第１サイクルから第３サイクルまでの処理が例示されている。図８の命令列に含まれる命令「add」は整数命令の一例である。整数命令である「add」は、整数演算器１０１ｂであるＩＵ０によって実行される。その結果、第１サイクルでは、命令列の１行目に記載の「fadd $f0,$f1,$f2」がＦＵ０で実行され、命令列の２行目に記載の「fadd $f3,$f4,$f5」はＦＵ１で実行され、命令列の３行目に記載の「add $g0,$g1,$g2」は、ＩＵ０で実行される。第２サイクルでは、命令列の４行目に記載の「fadd $f6,$f7,$f8」がＦＵ０で実行され、命令列の５行目に記載の「fadd $f9,$f10,$f11」はＦＵ
１で実行される。
【００２９】
図９は、命令列に含まれる各命令の実行がひとつの演算器に集中した状態の一例を示す図である。図９では、第１サイクルから第３サイクルまでの処理が例示されている。図９の命令列に含まれる命令は、全て整数命令である。そのため、図９の命令列に含まれる全ての命令は、整数演算器１０１ｂであるＩＵ０で実行される。その結果、浮動小数点演算器であるＦＵ０およびＦＵ１は、図９に例示される命令列をプロセッサ１０１で実行している間、処理を行っていない。
【００３０】
図８および図９を対比するとわかるように、プロセッサ１０１に入力される命令列に含まれる命令が整数命令および浮動小数点命令の一方に偏っていると、プロセッサ１０１が有する演算器を有効に使用できない虞がある。
【００３１】
図１０は、プログラムをコンパイルする処理の流れの一例を示す図である。プログラムのコンパイルはコンパイラ装置１０によって実行される。Ｔ１では、コンパイラ装置１０は、入力されたプログラムのソースファイルの構文解析を行う。構文解析では、ソースファイルがプログラミング言語の仕様と合致しているか否か解析される。Ｔ２では、コンパイラ装置１０は、最適化を行う。最適化は、ループに含まれる命令を展開するループ展開を含む。Ｔ３では、コンパイラ装置１０は、レジスタの割り付けを行う。ここでは、コンパイラ装置１０は、仮想レジスタをプロセッサ１０１の有するレジスタに割り付ける。Ｔ４では、コンパイラ装置１０は、命令のスケジューリングを行う。命令のスケジューリングでは、プロセッサ１０１の整数演算器１０１ａ、浮動小数点演算器１０１ｂ、１０１ｂを効率的に使用できるように各命令の実行順が並べ替えられる。Ｔ５では、コンパイラ装置１０は、プロセッサ１０１によって実行可能なコードを生成する。実行可能なコードは、オブジェクトとも称される。
【００３２】
図１１は、コンパイルおよびコンパイル後のプログラムの実行の一例を示す図である。Ｔ１１は、図１０のＴ２に対応する。Ｔ１１では、本実施形態において説明する最適化処理が行われる。Ｔ１２およびＴ１３は、それぞれ図１０のＴ４およびＴ５に対応する処理である。Ｔ１４では、コンパイルされたプログラムをプロセッサ１０１が実行する。プロセッサ１０１は、Ｔ１３で生成された実行形式のオブジェクトの中から同時に実行可能な
命令を検出し、アウトオブオーダーおよびスーパースカラによって検出された命令を並列に実行する。
【００３３】
＜コンパイラ装置１０の処理ブロック＞
図１２は、第１実施形態に係るコンパイラ装置１０の処理ブロックの一例を示す図である。図１２では、最適化部２００、中間コード部２６０、マシンモデル２０１、ＮＦＵ数格納部２０２およびＮＩＵ数格納部２０３の各処理ブロックが例示されている。例えば、図１のプロセッサ１０１が図１２の各処理ブロックとして主記憶部１０２に展開されたコンピュータプログラムを実行する。ただし、図１２のいずれかの処理ブロックの少なくとも一部はハードウェア回路、専用のプロセッサまたはデジタルシグナルプロセッサ（Digital Signal Processor、ＤＳＰ）を含んでもよい。
【００３４】
マシンモデル２０１には、プロセッサ種別毎の情報があらかじめ記憶される。マシンモデル２０１は、例えば、プロセッサ種別毎の整数演算器および浮動小数点演算器の数を記憶する。マシンモデル２０１は、「プロセッサ情報記憶部」の一例である。
【００３５】
最適化部２００は、例えば、図１０のＴ２に例示される最適化処理を行う。最適化部２００は、演算器数取得部２１０、命令変換部２２０、命令展開部２３０を含む。演算器数取得部２１０は、プロセッサ１０１の有する演算器の数を取得する。演算器数取得部２１０は、整数演算器の数を取得するＮＩＵ取得部２１１および浮動小数点演算器の数を取得するＮＦＵ取得部２１２を有する。プロセッサ１０１は、ＮＩＵ取得部２１１として、マシンモデル２０１を参照してプロセッサ１０１の有する整数演算器１０１ａの数を取得する。ＮＩＵ取得部２１１は、取得した整数演算器１０１ａの数をＮＩＵ数格納部２０３に格納する。プロセッサ１０１は、ＮＦＵ取得部２０２として、マシンモデル２０１を参照してプロセッサ１０１の有する浮動小数点演算器１０１ｂの数を取得する。ＮＦＵ取得部２１２は、取得した浮動小数点演算器１０１ｂの数をＮＦＵ数格納部２０２に格納する。演算器数取得部２１０は、「演算器数取得部」の一例である。
【００３６】
命令変換部２２０は、ループ演算命令列に含まれる整数命令および浮動小数点命令の数を算出する。さらに、命令変換部２２０は、整数命令を浮動小数点命令に、浮動小数点命令を整数命令に変換する。命令変換部２２０は、ＩＵ命令変換部２２１およびＦＵ命令変換部２２２を有する。プロセッサ１０１は、ＩＵ命令変換部２２１として、ループ演算命令列格納部２６１に格納されたループ演算命令列に含まれる命令を整数命令に変換する。ＩＵ命令変換部２２１は、整数命令に変換した命令をＩＵ変換命令列格納部２６３に格納する。プロセッサ１０１は、ＦＵ命令変換部２２２として、ループ演算命令列格納部２６１に格納されたループ演算命令列に含まれる命令を浮動小数点命令に変換する。ＦＵ命令変換部２２２は、浮動小数点命令に変換した命令をＦＵ変換命令列格納部２６２に格納する。命令変換部２２０は、「抽出部」の一例である。
【００３７】
命令展開部２３０は、ループの命令列に含まれるループ演算命令列を展開する。命令展開部２３０は、ＩＵ命令展開部２３１およびＦＵ命令展開部２３２を有する。プロセッサ１０１は、ＩＵ命令展開部２３１として、ＩＵ命令変換部２２１によって整数命令に変換されたループ演算命令列を展開する。プロセッサ１０１は、ＦＵ命令展開部２３２として、ＦＵ命令変換部２２２によって浮動小数点命令に変換されたループ演算命令列を展開する。ＩＵ命令展開部２３１は、「第１の生成部」の一例である。ＦＵ命令展開部２３２は、「第２の生成部」の一例である。命令展開部２３０は、「第３の生成部」の一例である。
【００３８】
ループ命令補正部２４０は、命令展開部２３０によるループ展開に伴うループ命令の補正を行う。ループ命令補正部２４０は、例えば、ループ命令におけるループカウンタに加
算される数値を補正する。ループ命令補正部２４０は、「決定部」の一例である。
【００３９】
中間コード部２６０は、コンパイラ装置１０に入力された中間コードが格納される。中間コード部２６０は、ループ演算命令列格納部２６１、ＦＵ変換命令列格納部２６２、ＩＵ変換命令列格納部２６３、ＦＵ出力命令列格納部２６４、ＩＵ出力命令列格納部２６５および出力命令列格納部２６６を有する。
【００４０】
ループ演算命令列格納部２６１には、コンパイラ装置１０に入力されたソースファイルに含まれるループ演算命令列が格納される。ＦＵ変換命令列格納部２６２は、ＦＵ命令変換部２２２によって浮動小数点命令に変換された命令が記憶される。ＩＵ変換命令列格納部２６３は、ＩＵ命令変換部２２１によって整数命令に変換された命令が記憶される。ＦＵ出力命令列格納部２６４には、ＦＵ変換命令列格納部２６２に格納された命令が、ＮＦＵ取得部２１２によって取得された浮動小数点演算器１０１ｂの数だけ追記される。ＩＵ出力命令列格納部２６５には、ＩＵ変換命令列格納部２６３に格納された命令が、ＮＩＵ取得部２１１によって取得された整数演算器１０１ａの数だけ、追記される。出力ループ命令列格納部２６６には、ＦＵ出力命令列格納部２６４およびＩＵ出力命令列格納部２６５に格納された各命令列が追記される。
【００４１】
以上の構成を有するコンパイラ装置１０によるコンパイルにおける最適化処理について、図面を参照して説明する。
【００４２】
図１３は、コンパイラ装置１０に入力されるループの命令列の一例を示す図である。図１３の左側はループ展開される前のソースファイルの一例であり、図１３の右側はループ展開後のソースファイルの一例である。コンパイラ装置１０では、入力されたソースファイルに含まれるループの命令列が、ループ展開可能であるか否かを判定する。コンパイラ装置１０は、ループ展開可能と判定されたループの命令列を展開する。図１４は、ループ展開に適さないソースファイルの一例を示す図である。図１４の左側はループ展開前のソースファイルの一例であり、図１４の左側のソースファイルでは、「a[i+1]」と「a[i]」との間に依存関係がある。ここで、「i」は、ループカウンタである。すなわち、図１４
に例示されるソースファイルでは、ループの回転間に依存関係がある。そのため、図１４の左側に例示される命令「a[i+1]=b[i]*c[i]+a[i];」と「a[i+2]=[b[i+1]*c[i+1]+a[i+1];」とは、並行して実行する事が出来ない。そのため、ループの回転間に依存関係がある
場合、第１実施形態のコンパイラ装置１０は、ループ展開の対象外とすることができる。
【００４３】
図１５は、第１実施形態に係るコンパイラ装置１０によるループ展開処理の流れの一例を示す図である。図１５を参照して、ループ展開処理について説明する。
【００４４】
Ｆ１では、コンパイラ装置１０は、入力されたソースファイルの中から最内ループを検出する。コンパイラ装置１０は、検出された最内ループの命令列の中から、ループ演算命令列を抽出する。最内ループの検出には、公知の様々な方法が適用可能である。
【００４５】
図１６は、ループの構造の一例を示す図である。前述のとおり、ループは、初期化命令列によってループカウンタが初期化され、ラベルとループ命令列によってループ演算命令列の各命令が繰り返し実行される。すなわち、コンパイラ装置１０は、例えば、ラベルおよびループ命令列によって挟まれたブロックを検出することで、ソースファイルからループを検出する事が可能である。
【００４６】
図１７は、第１実施形態で入力されるループの命令列の一例を示す図である。図１７に例示される命令列は、中間コードで表現されている。図１７に例示される命令列では、ラベル「Label0」とループ命令列とによっと挟まれたループ演算命令列が繰り返し実行され
る。以降の説明では、図１７に例示した命令列を対象に処理がなされる。
【００４７】
図１５に戻り、Ｆ２では、命令変換部２２０は、抽出されたループ演算命令列に含まれる整数命令の数と浮動小数点命令の数を算出する。Ｆ３では、命令変換部２２０は、ループ演算命令列に含まれる整数命令または浮動小数点命令の数に偏りがあるか否かを判定する。偏りがあるか否かは、例えば、「ループ演算命令列に含まれる浮動小数点命令の数をループ演算命令列で割った値」または「ループ演算命令列に含まれる整数命令の数をループ演算命令列で割った値」のいずれかが、所定値以上であるか否かで判定可能である。所定値は、例えば、プロセッサ１０１の有する整数演算器１０１ａおよび浮動小数点演算器１０１ｂの数に基づいて決定される値である。決定された所定値は、マシンモデル２０１に記憶される。所定値は、例えば、「０．９」である。整数命令または浮動小数点命令の数に偏りがあると判定された場合（Ｆ３でＹＥＳ）、処理はＦ４およびＦ５に進められる。整数命令または浮動小数点命令の数に偏りがないと判定された場合（Ｆ３でＮＯ）、処理は終了となる。
【００４８】
Ｆ４では、ＦＵ命令変換部２２２は、Ｆ１で抽出されたループ演算命令列に含まれる命令を浮動小数点命令に変換し、ＦＵ変換命令列格納部２６２に格納する。Ｆ５では、ＩＵ命令変換部２２１は、Ｆ１で抽出されたループ演算命令列に含まれる命令を整数命令に変換し、ＩＵ変換命令列格納部２６３に格納する。
【００４９】
図１８は、図１５のＦ４およびＦ５の処理の詳細な流れの一例を示す図である。以下、図１８を参照して、図１５のＦ４およびＦ５の処理について説明する。
【００５０】
Ｇ１では、命令変換部２２０は、結果リストを作成する。結果リストは、変換処理中の命令列を一時的に格納するリストであり、例えば、主記憶部１０２に用意される。Ｇ２では、命令変換部２２０は、ループ演算命令列の先頭から順番に命令を取り出す。Ｇ３では、命令変換部２２０は、取り出した命令を複製する。取り出された命令は、例えば、主記憶部１０２に複製される。複製された命令を、ここでは、命令Ａと称する。Ｇ３の処理は、入力された命令列がコンパイラ装置１０の誤動作等で破壊されることを抑制するために実施される。Ｇ４では、命令変換部２２０は、命令Ａを結果リストに追加する。Ｇ５では、命令変換部２２０は、命令Ａの命令コードを取り出す。Ｇ６では、命令変換部２２０は、整数命令への変換または浮動小数点命令への変換のいずれを実行するか判定する。図１５のＦ４の処理の場合、浮動小数点命令への変換処理のため、処理はＧ７に進められる。図１５のＦ５の処理の場合、整数命令への変換のため、処理はＧ８に進められる。
【００５１】
Ｇ７では、ＦＵ命令変換部２２２は、ＦＵ変換テーブルを参照して、変換後の命令コードと命令の型を取り出す。図１９は、ＦＵ変換テーブル３０１の一例を示す図である。ＦＵ変換テーブル３０１は、浮動小数点命令を整数命令に変換する場合の、変換前後の命令の対応を示すテーブルである。ＦＵ変換テーブル３０１は、例えば、図１の主記憶部１０２または補助記憶部１０３に記憶される。図１９では、変換前の命令コードおよび命令の型と変換後の命令コードと命令の型とが例示されている。図１９を参照すると、変換前にint型である命令は、float型の命令に変換されていることがわかる。また、変換前からfloat型である命令は、変換後もfloat型のままであることがわかる。図１８のＧ７では、ＦＵ命令変換部２２２は、図１９に例示されるＦＵ変換テーブル３０１を参照して、命令Ａを浮動小数点命令に変換した後の命令コードと命令の型とを取り出す。例えば、変換前の命令Ａの命令コードが「mult」である場合、変換後の命令コードとして「fumult」、変換後の命令の型として「float」が取り出される。なお、「fuadd」および「fumult」は、浮動小数点演算器１０１ｂによって演算される整数命令であり、オペランドには、例えば、float型の仮想レジスタが指定される。すなわち、「fuadd」および「fumult」は、float
型の仮想レジスタに格納されたビット列を整数として扱って演算する。
【００５２】
Ｇ８では、ＩＵ命令変換部２２１は、ＩＵ変換テーブルを参照して、変換後の命令コードと命令の型を取り出す。図２０は、ＩＵ変換テーブル３０２の一例を示す図である。ＩＵ変換テーブル３０２は、整数命令を浮動小数点命令に変換した場合の、変換前後の命令の対応を示すテーブルである。ＩＵ変換テーブル３０２は、例えば、図１の主記憶部１０２または補助記憶部１０３に記憶される。図２０では、変換前の命令コードおよび命令の型と変換後の命令コードと命令の型とが例示されている。図２０を参照すると、変換前にfloat型である命令は、int型の命令に変換されていることがわかる。また、変換前からint型である命令は、変換後もint型のままであることがわかる。図１８のＧ８では、ＩＵ命令変換部２２１は、図２０に例示されるＩＵ変換テーブルを参照して、命令Ａを整数命令に変換した後の命令コードと命令の型とを取り出す。例えば、変換前の命令Ａの命令コードが「fmult」である場合、変換後の命令コードとして「iufmult」、変換後の命令の型として「int」が取り出させれる。なお、「iufadd」および「iufmult」は、整数演算器１０１ａによって演算される浮動小数点命令であり、オペランドには、例えば、int型の仮想
レジスタが指定される。すなわち、「iufadd」および「iufmult」は、int型の仮想レジスタに格納されたビット列を浮動小数点数として扱って演算する。
【００５３】
図２１は、入力されたループ演算命令列に含まれる各命令の整数命令への変換前後の対応の一例を示す図である。入力されたループ演算命令列では、全ての命令が整数命令である。そのため、整数命令への変換が実行されても命令コードおよび命令の型に変更はない。図２２は、入力されたループ演算命令列に含まれる各命令の浮動小数点演算命令への変換前後の対応の一例を示す図である。変換前は全ての命令が整数命令であったが、変換後は全ての命令が浮動小数点命令になっていることがわかる。
【００５４】
図１８に戻り、Ｇ９では、Ｇ７またはＧ８で変換された命令コードと命令の型が命令Ａに設定される。すなわち、結果リストにおいて、Ｇ４で結果リストに追加された命令ＡがＧ７またはＧ８によって変換された命令コードと命令の型に書き換えられる。Ｇ１０では、命令変換部２２０は、まだ変換していない命令がループ演算命令列に残っているか否かを判定する。ループ演算命令列に含まれる全ての命令の変換が完了した場合（Ｇ１０でＮＯ）、処理は終了する。まだ変換していない命令がループ演算命令列に残っている場合（Ｇ１０でＹＥＳ）、処理は、Ｇ２に進められる。
【００５５】
図１５に戻り、Ｆ６では、ＮＩＵ取得部２１１は、マシンモデル２０１を参照してプロセッサ１０１の有する整数演算器１０１ａの数であるＮＩＵ数を取得する。また、ＮＦＵ取得部２１２は、マシンモデル２０１を参照してプロセッサ１０１の有する浮動小数点演算器１０１ｂの数であるＮＦＵ数を取得する。ここでは、ＮＩＵ数として「１」、ＮＦＵ数として「２」が取得される。
【００５６】
Ｆ７では、ＦＵ命令展開部２３２は、ＦＵ変換命令列格納部２６２に格納された命令列を展開し、展開した命令列をＦＵ出力命令列格納部２６４に格納する。Ｆ８では、ＩＵ命令展開部２３１は、ＩＵ変換命令列格納部２６３に格納された命令列を展開し、展開した命令列をＩＵ出力命令列格納部２６５に格納する。Ｆ９では、Ｆ７の処理が、ＮＦＵ回繰り返したか否か判定される。ＮＦＵ回繰り返した場合（Ｆ９でＹＥＳ）、処理は、Ｆ１１に進められる。ＮＦＵ回繰り返していない場合（Ｆ９でＮＯ）、処理はＦ７に戻る。Ｆ１０では、Ｆ８の処理が、ＮＩＵ回繰り返したか否か判定される。ＮＩＵ回繰り返した場合（Ｆ１０でＹＥＳ）、処理は、Ｆ１１に進められる。ＮＩＵ回繰り返していない場合（Ｆ１０でＮＯ）、処理はＦ８に戻る。
【００５７】
図２３は、ループ演算命令列の展開処理の一例を示す図である。図２３の処理は、図１５のＦ７からＦ１０の処理の詳細を示す図の一例である。図２３を参照して、ループ演算
命令列の展開処理について説明する。
【００５８】
Ｈ１では、命令展開部２３０は、ループ展開の対象となるループ演算命令列の入力を受け付ける。命令展開部２３０は、入力されたループ演算命令列の参照リストオペランドに含まれる仮想レジスタを取り出し、仮想レジスタマップを作成する。
【００５９】
図２４は、仮想レジスタマップの一例を示す図である。仮想レジスタマップは、ループ展開前の仮想レジスタとループ展開後の仮想レジスタとを対応付けるマップである。仮想レジスタマップでは、ループ展開前の仮想レジスタからループ展開後の仮想レジスタが１対１で対応付けられる。ループ展開後の仮想レジスタは、命令展開部２３０によって、新たに作成される。ループ展開前の仮想レジスタとループ展開後の仮想レジスタの対応は、例えば、ハッシュ関数によって対応付けられる。すなわち、仮想レジスタマップは、ハッシュテーブルとすることが可能である。
【００６０】
図２３に戻り、Ｈ２では、命令展開部２３０は、入力されたループ演算命令列の先頭から順番に命令を取り出す。Ｈ３では、命令展開部２３０は、Ｈ２で取り出した命令の参照リストオペランドを順番に取り出す。Ｈ４では、命令展開部２３０は、Ｈ３で取り出したオペランドが仮想レジスタであるか否かを判定する。オペランドが仮想レジスタである場合（Ｈ４でＹＥＳ）、処理はＨ５に進められる。オペランドが仮想レジスタでない場合（Ｈ４でＮＯ）、処理はＨ６に進められる。Ｈ５では、命令展開部２３０は、Ｈ１で作成した仮想アドレスマップを基に、仮想レジスタの変換を行う。
【００６１】
図２５は、参照リストオペランドにおける仮想レジスタの変換処理の一例を示す図である。Ｊ１では、命令展開部２３０は、図２３のＨ１で作成した仮想レジスタマップを参照し、変換前の仮想レジスタに対応する変換後の仮想レジスタを取り出す。Ｊ２では、Ｊ１で取り出した変換後の仮想レジスタで変換前の仮想レジスタを書き換える。例えば、図２４を参照すると、ループ展開前の仮想レジスタ「$g1」は、ループ展開後に「$f2」に変換される。この際、仮想レジスタ「$g1」に格納されていた値は、そのビット列を変更せず
に仮想レジスタ「$f2」に格納される。すなわち、Ｊ２の処理では、書き換え前の仮想レ
ジスタに格納されていた値の符号、仮数、基数および指数等の区別がされない。Ｊ２の処理では、書き換え前の仮想レジスタに格納されていたビット列をそのまま書き換え後の仮想レジスタに格納する。
【００６２】
図２３に戻り、Ｈ６では、命令展開部２３０は、Ｈ３で取り出したオペランドがメモリのアドレスであるか否かを判定する。オペランドがメモリオペランドである場合（Ｈ６でＹＥＳ）、処理はＨ７に進められる。オペランドがメモリオペランドでない場合（Ｈ６でＮＯ）、処理はＨ８に進められる。Ｈ７では、命令展開部２３０は、オペランドとして指定されているメモリオペランドを変換する。
【００６３】
図２６は、メモリオペランドのループ展開前後の対応の一例を示す図である。図２６では、メモリオペランド「a+$g1」が「a+$g1+（展開番号―１）×（$g1の増分値）」によって算出されることが例示されている。ここで、「$g1の増分値」は、展開前のループにお
ける１回転当たりの増分値のことである。すなわち、ループ命令列の加算命令によってループカウンタ「$g1」に加算される値であるともいえる。図２７は、各展開番号における
メモリオペランドの変換を例示する図である。展開番号１では、メモリオペランド「a+$g1」が変換されると、「a+$g1+（１−１）×4」より、「a+$g1」となる。展開番号２では
、メモリオペランド「a+$g1」が変換されると、「a+$g1+（２−１）×4」より、「a+$g1+4」となる。展開番号３では、メモリオペランド「a+$g1」が変換されると、「a+$g1+（３−１）×4」より、「a+$g1+8」となる。この際、メモリオペランド「a+$g1」によって指
定される領域に格納されていた値は、そのビット列を変更せずにメモリオペランド「a+$g
1+8」によって指定される領域に格納される。すなわち、図２６および図２７の処理では
、書き換え前のメモリオペランドによって指定される領域に格納されていた値の符号、仮数、基数および指数等の区別がされない。図２６および図２７の処理では、書き換え前のメモリオペランドによって指定される領域に格納されていたビット列をそのまま書き換え後のメモリオペランドによって指定される領域に格納する。
【００６４】
図２３に戻り、Ｈ８では、命令展開部２３０は、未処理の参照リストオペランドがあるか否かを判定する。未処理の参照リストオペランドがある場合（Ｈ８でＹＥＳ）、処理はＨ３に進められる。未処理の参照リストオペランドが無い場合（Ｈ８でＮＯ）、処理はＨ９に進められる。
【００６５】
Ｈ９では、命令展開部２３０は、定義リストオペランドを順番に取り出す。Ｈ１０では、命令展開部２３０は、Ｈ９で取り出したオペランドが仮想レジスタであるか否かを判定する。オペランドが仮想レジスタである場合（Ｈ１０でＹＥＳ）、処理はＨ１１に進められる。オペランドが仮想レジスタでない場合（Ｈ１０でＮＯ）、処理はＨ１２に進められる。
【００６６】
図２８は、定義リストオペランドにおける仮想レジスタオペランドの変換処理の一例を示す図である。図２８は、図２３のＨ１１の処理の詳細を例示する図である。Ｋ１では、命令展開部２３０は、オペランドの変換対象となる命令の型がint型であるか否かを判定
する。int型である場合（Ｋ１でＹＥＳ）、処理はＫ２に進められる。int型でない場合（Ｋ１でＮＯ）、処理はＫ３に進められる。Ｋ２では、命令展開部２３０は、int型の仮想
レジスタを新規に作成する。Ｋ３では、命令展開部２３０は、float型の仮想レジスタを
新規に作成する。Ｋ４では、命令変換部２３０は、変換前のオペランドと、Ｋ３またはＫ４で作成した仮想レジスタとの対応を仮想レジスタマップに追加する。Ｋ５では、命令展開部２３０は、オペランドをＫ３またはＫ４によって作成した仮想レジスタに変換する。この際、変換前の仮想レジスタに格納されていた値は、そのビット列を変更せずに変換後の仮想レジスタに格納される。すなわち、Ｋ５の処理では、書き換え前の仮想レジスタに格納されていた値の符号、仮数、基数および指数等の区別がされない。Ｋ５の処理では、書き換え前の仮想レジスタに格納されていたビット列をそのまま書き換え後の仮想レジスタに格納する。
【００６７】
図２３に戻り、Ｈ１２では、命令展開部２３０は、Ｈ９で取り出したオペランドがメモリオペランドであるか否かを判定する。メモリオペランドである場合（Ｈ１２でＹＥＳ）、処理はＨ１３に進められる。メモリオペランドでない場合（Ｈ１２でＮＯ）、処理は、Ｈ１４に進められる。Ｈ１３の処理の内容は、Ｈ７と同様である。すなわち、Ｈ１３では、図２６および図２７に例示される処理が実行される。Ｈ１４では、命令展開部２３０は、未処理の定義リストオペランドがあるか否かを判定する。未処理の定義リストオペランドがある場合（Ｈ１４でＹＥＳ）、処理はＨ９に進められる。未処理の定義リストオペランドが無い場合（Ｈ１４でＮＯ）、処理は終了する。
【００６８】
図１５に戻り、Ｆ１１では、命令展開部２３０は、ＦＵ出力命令列格納部２６４およびＩＵ出力命令列格納部２６５に格納された命令を、出力ループ命令列格納部２６６に格納する。
【００６９】
図２９は、出力ループ命令列格納部２６６に格納された命令列の一例を示す図である。図２９では、図１７に例示されたループの命令列に含まれるループ演算命令列をループ展開した命令列の一例が示されている。図２９に例示される命令列では、展開番号１および２の命令列が、浮動小数点命令による命令列となっている。また、展開番号３の命令列が、整数命令による命令列となっている。その結果、出力ループ命令列格納部２６６には、
浮動小数点命令による命令列が２つ、整数命令による命令列が１つ格納されている。すなわち、出力ループ命令列格納部２６６に格納される浮動小数点命令による命令列の数および整数命令による命令列の数は、それぞれ、プロセッサ１０１の有する浮動小数点演算器１０１ｂおよび整数演算器１０１ａの数と一致している。
【００７０】
図１５に戻り、Ｆ１２では、命令展開部２３０は、ループの回転数を補正する。ループの回転数の補正は、ループ１回転当たりのループカウンタの増分を補正することで行われる。ループカウンタの増分の補正は、例えば、「（ループ展開の展開数）×（ループ展開前のループカウンタの増分値）」によって算出される。ここで、ループ展開の展開数は、「（整数演算器１０１ａの数）＋（浮動小数点演算器１０１ｂの数）」となっている。したがって、ループカウンタの増分を補正することで、ループ展開後のループの回転数は、「（ループ展開前のループの回転数）÷（整数演算器１０１ａの数＋浮動小数点演算器１０１ｂの数）」となる。図２９に例示されるループ演算命令列の展開数は「３」である。すなわち、ループ展開後の１回転のループによって実行される処理は、ループ展開前のループ３回転分の処理に相当する。また、図１７を参照すると、ループ展開前におけるループカウンタ「$g1」は、ループ１回転当たり「４」加算されている。したがって、ループ
展開後では、ループカウンタ「$g1」の値は「（展開数）３×（ループ展開前のループカ
ウンタの増分値）４」によって「１２」と算出される。図３０は、回転数が補正されたループ命令列の一例を示す図である。図３０を参照すると、ループ命令列の加算命令において、ループカウンタ「$g1」の増分が「１２」になっていることがわかる。
【００７１】
図３１は、ループ展開後のループの命令列の一例を示す図である。図３１では、初期化命令列に、展開されたループ演算命令列および補正されたループ命令列が続いている。このように展開された命令列は、例えば、図１０のＴ４に例示される命令スケジューリングによって、複数の演算器によって並列して実行しやすいように実行順が入れ替えられながら、プロセッサ１０１の演算器によって実行される。
【００７２】
図３２および図３３は、命令列が実行された場合の演算器の使用状況の一例を示す図である。図３２は、全ての命令が浮動小数点命令に変換された命令列を実行した場合の演算器の使用状況の一例を示す図である。図３３は、プロセッサ１０１の有する整数演算器１０１ａおよび浮動小数点演算器１０１ｂそれぞれの数に応じて、整数命令および浮動小数点命令を混在させた命令列を実行した場合の演算器の使用状況の一例を示す図である。すなわち、図３３は、第１実施形態によるループ展開が行われた命令列が演算器で実行される状態の例示である。図３２と図３３を比較すると、図３３に例示される場合の方が、プロセッサ１０１の有する各演算器を効率的に使用している事がわかる。
【００７３】
（第１比較例）
第１比較例では、入力されたループの命令列を所定の展開数だけループ展開し、命令の型の変換を行わないコンパイラ装置について説明する。図３４は、第１比較例に係るコンパイラ装置５００のループ展開を行う処理ブロックの一例である。情報処理装置１００は、コンパイラ装置５００としても利用可能である。図３４では、展開数決定部５０１、命令展開部５０２、ループ命令補正部５０３、入力ループ命令列格納部５０４、展開命令列格納部５０５および出力ループ命令列格納部５０６の各処理ブロックが例示されている。例えば、図１のプロセッサ１０１が図３４の各処理ブロックとして主記憶部１０２に展開されたコンピュータプログラムを実行する。ただし、図３４のいずれかの処理ブロックの少なくとも一部はハードウェア回路、専用のプロセッサまたはデジタルシグナルプロセッサ（Digital Signal Processor、ＤＳＰ）を含んでもよい。
【００７４】
入力ループ命令列格納部５０４には、ループ展開の対象となるループの命令列が格納される。コンパイラ装置５００のプロセッサ１０１は、展開数決定部５０１として、ループ
展開の展開数を決定する。展開数は、プロセッサ１０１の有するレジスタ数、入力ループ命令列格納部５０４に格納されたループ演算命令列に含まれる命令数等に基づいて決定される。コンパイラ装置５００のプロセッサ１０１は、命令展開部５０２として、ループ演算命令列に含まれる命令列を展開する。展開された命令列は、展開命令列格納部５０５に記憶される。コンパイラ装置５００のプロセッサ１０１は、ループ命令補正部５０３として、展開後のループ命令におけるループカウンタの増加量、ループの終了条件の補正を行う。以上の処理によって展開されたループの命令列は、出力ループ命令列格納部５０６に格納される。
【００７５】
図３５は、ループの命令列を疑似的に例示する図である。図３５に例示されるループでは、ループ演算命令列に含まれる命令がすべて整数命令となっている。図３６は、図３５に例示されるループが第１比較例に係るコンパイラ装置５００によってループ展開された命令列の一例を示す図である。図３６に例示される展開後の命令列も、全て整数命令となっている。プロセッサ１０１は、図２に例示されるように、整数演算器１０１ａを複数有していない。そのため、プロセッサ１０１が図３６に例示される命令列を実行すると、ひとつの整数演算器１０１ａに処理が集中し、浮動小数点演算器１０１ｂ、１０１ｂは使用されない。そのため、プロセッサ１０１が有する複数の演算器が効率的に使用されているとは言い難い。
【００７６】
（第２比較例）
第２比較例では、ループ展開において、整数命令を浮動小数点命令に、浮動小数点命令を整数命令に変換する処理が追加される。図３７は、第２比較例によるループ展開を模式的に例示する図である。図３８は、図３７を疑似コードによって例示する図である。第２比較例では、ループ展開によって、整数命令によるＩＵ命令列と浮動小数点命令によるＦＵ命令列とが生成される。すなわち、第２比較例では、ループ展開前の元の命令列を、整数命令に変換したＩＵ命令列と、浮動小数点命令に変換したＦＵ命令列とを生成する。生成された命令列は、第２比較例に係るコンパイラ装置によって生成されたオブジェクトに含まれる。オブジェクトが実行されると、プロセッサ１０１の演算器の使用状況に応じて、ＩＵ命令列またはＦＵ命令列が実行される。すなわち、プロセッサ１０１の有する演算器の使用状況に応じて、ＩＵ命令列またはＦＵ命令列が実行される。それぞれの演算器で実行される命令列は、互いに異なるスレッドである。すなわち、第２比較例では、マルチスレッドによって、ＩＵ命令列とＦＵ命令列とを実行する。プロセッサ１０１の有する演算器の使用状況は、ＯＳのシステムコールによって取得可能である。このシステムコールは、オブジェクトが実行されている時点における、整数演算および浮動小数点演算のどちらが頻繁に実行されており、整数演算器１０１ａと浮動小数点演算器１０１ｂ、１０１ｂのいずれが空いているかを返す。
【００７７】
第２比較例では、システムコールによって空いている演算器の情報を取得することで、演算器を効率的に使用した。しかしながら、第２比較例では、他のスレッドによる演算器の使用状況を取得するため、オブジェクトの実行中に演算器の使用状況を動的に取得する。そのため、第２比較例では、システムコール等の関数呼び出しに係るオーバーヘッドが生ずる。
【００７８】
（比較例と第１実施形態との比較）
図３９は、第１比較例によるループ展開と第１実施形態によるループ展開とを比較する図の一例である。図３９では、展開前の命令列を「元の命令列」と記載している。第１比較例に係るループ展開では、「元の命令列」を２回転分展開している。第１実施形態に係るループ展開では、プロセッサ１０１ａの有する演算器の数に合わせて、浮動小数点命令による命令列（図中では、ＦＵ命令化した命令列と記載）が２回転分、整数命令による命令列（図中では、ＩＵ命令化した命令列と記載）が１回転分展開されている。例えば、「
元の命令列」が浮動小数点命令による命令列であった場合、第１比較例によるループ展開でも２つの浮動小数点演算器１０１ｂ、１０１ｂによって並列して命令の実行が可能である。しかしながら、整数演算器１０１ａは、この間処理を行っていない。第１実施形態によるループ展開では、前述のとおり、プロセッサ１０１ａの有する演算器の数に合わせてループ展開が行われている。そのため、第１実施形態によるループ展開後の命令列では、浮動小数点による命令列を２つの浮動小数点演算器１０１ｂ、１０１ｂによって実行し、整数命令による命令列を整数演算器１０１ａによって実行する。すなわち、第１比較例よりも第１実施形態によるループ展開を行った方が、プロセッサ１０１の有する演算器を効率的に使用できることがわかる。
【００７９】
図４０は、コンパイラに入力されるソースファイルに含まれるループの一例を示す図である。図４０に例示されるループは、３つの整数命令を含む。図４１は、図４０に例示されたループを第１比較例によるループ展開を行った命令列の一例を示す図である。図４１では、整数命令による命令列が２回転分例示されている。ループ展開後の命令列に含まれる命令には、浮動小数点命令は含まれていない。そのため、第１比較例によってループ展開された命令列は、整数演算器１０１ａによって実行される。この間、浮動小数点演算器１０１ｂ、１０１ｂは処理を行っていない。
【００８０】
図４２は、図４０に例示されたループに対して第１実施形態によるループ展開を行った命令列の一例を示す図である。第１実施形態では、プロセッサ１０１の有する整数演算器１０１ａおよび浮動小数点演算器１０１ｂの数に応じて、展開後の命令列に含まれる整数命令列と浮動小数点命令列の数を決定する。すなわち、図４２に例示するように、整数命令を浮動小数点命令に変換した浮動小数点命令列（図中では、ＦＵ整数命令と記載）が２つ生成され、整数命令による整数命令列は１つ生成される。その結果、１つの整数命令列は整数演算器１０１ａによって実行され、２つの浮動小数点命令列は、それぞれ浮動小数点演算器１０１ｂ、１０１ｂによって実行される。その結果、第１実施形態によれば、プロセッサ１０１の有する演算器をより効率的に使用する事ができる。
【００８１】
また、第１実施形態では、コンパイル時にプロセッサ１０１の有する整数演算器１０１ａおよび浮動小数点演算器１０１ｂの数に応じて、ループ展開後のループ演算命令列に含まれる整数命令列および浮動小数点命令列の数を決定した。ループ展開された整数命令列および浮動小数点命令列は、プロセッサ１０１の命令スケジューラによって整数演算器１０１ａおよび浮動小数点演算器１０１ｂに割り当てられる。そのため、第１実施形態によれば、オブジェクトの実行中にシステムコールによる演算器の使用状況を取得しなくともよい。その結果、第２比較例と比較して、オブジェクト実行中のシステムコール呼出し等によるオーバーヘッドが抑制される。
【００８２】
（第１実施形態の効果）
第１実施形態では、コンパイラ装置１０は、ループ展開の対象としてループ演算命令列が分岐命令を含まない最内ループを選択した。その結果、コンパイラ装置１０は、ループ展開において、分岐先の命令等を含めて展開しなくともよい。
【００８３】
第１実施形態では、コンパイラ装置１０は、ループ演算命令列に含まれる整数命令または浮動小数点命令の数に偏りが無い場合には、図１５のＦ４およびＦ５以降の処理を省略した。そのため、コンパイラ装置１０は、コンパイル時間の長時間化を抑制できる。
【００８４】
第１実施形態では、コンパイラ装置１０は、ＦＵ変換テーブル３０１およびＩＵ変換テーブル３０２に基づいてループ演算命令列に含まれる各命令の型を変換した。その結果、コンパイラ装置１０は、変換前のループ演算命令列に整数命令および浮動小数点命令の双方が含まれていても、変換後の命令列では、整数命令のみの命令列および浮動小数点命令
のみの命令列を生成できる。
【００８５】
第１実施形態では、コンパイラ装置１０は、命令の型を変換した後、プロセッサ１０１の有する整数演算器１０１ａおよび浮動小数点演算器１０１ｂの数に応じて、整数命令による命令列と浮動小数点命令による命令列とを出力した。その結果、コンパイラ装置１０は、プロセッサ１０１の有する演算器をより効率的に使用できるオブジェクトを生成できる。
【００８６】
第１実施形態では、コンパイラ装置１０は、マシンモデル２０１からプロセッサ１０１の有する整数演算器１０１ａおよび浮動小数点演算器１０１ｂの数を取得した。その結果、コンパイル装置１０は、マシンモデル２０１にプロセッサ種別毎の整数演算器および浮動小数点演算器の数を登録しておくことで、様々なプロセッサ向けのオブジェクトを生成できる。
【００８７】
第１実施形態では、コンパイラ装置１０は、例えば、図１５のＦ４による浮動小数点命令への変換および図１５のＦ５による整数命令への変換を並行して行う。しかしながら、コンパイラ装置１０は、浮動小数点命令への変換および整数命令への変換を並行して実施する構成に限定されない。コンパイラ装置１０は、浮動小数点命令への変換および整数命令への変換のいずれか一方を先に実行し、他方をその後に実行してもよい。
【００８８】
第１実施形態では、コンパイラ装置１０は、コンパイラ装置１０が有するプロセッサ１０１を対象としてコンパイルが実行した。しかしながら、コンパイラ装置１０は、プロセッサ種別の指定を受け付け、指定されたプロセッサを対象としたコンパイルを実行するクロスコンパイラ装置であってもよい。この場合、コンパイル装置１０は、指定されたプロセッサの有する整数演算器および浮動小数点演算器の数をマシンモデル２０１から取得すればよい。
【００８９】
＜第１変形例＞
第１実施形態では、ループの各回転間の依存関係のないループがループ展開の対象とされた。第１変形例では、ループの各回転間に回帰演算の依存関係があるループもループ展開の対象とされる。第１実施形態と共通の構成要素については同一の符号を付し、その説明は省略される。以下、図面を参照して、第１変形例について説明する。
【００９０】
図４３は、回帰演算の一例を示す図である。ひとつの式において、定義と参照に同一の変数を含むものを回帰演算と称する。図４３では、式の定義および参照の双方に変数「Ａ」が含まれている。すなわち、図４３に例示する式は、変数「Ａ」の回帰演算となっている。
【００９１】
図４４は、参照オペランドと定義オペランドを含む命令の一例を示す図である。図４４では、「add」命令が例示されている。この「add」命令は、参照オペランドとして「op1
」および「op2」を有し、定義オペランドとして「op3」を有する。第１変形例のコンパイラ装置１０は、参照オペランドである「op1」または「op2」と定義オペランドである「op3」とが等しく、「op1」と「op2」とが異なる命令をループ展開の対象となる回帰演算と
判定する。
【００９２】
図４５は、コンパイラ装置１０に入力されるループの命令列の一例を示す図である。図４５の左側はループ展開される前のループの命令列の一例であり、図４５の右側はループ展開後のループの命令列の一例である。図４５の左側に例示されるループのループ演算命令列では、式「a=a+b[i]*c[i]」において、定義と参照の双方に変数「a」が含まれている。そのため、この式は回帰演算となっている。回帰演算では、ループの回転間において依
存があるため、そのままループ展開する事は難しい。
【００９３】
そこで、ループ演算命令列に回帰演算が含まれる場合、ループの回転間に依存が生じないようにループ演算命令を変形する。すなわち、図４５に例示される展開番号１、２、３の各命令列において互いに独立した定義オペランドを作成することで、各展開番号の命令列が他の展開番号の命令列から独立して演算可能とする。ループ終了後、各展開番号の命令列によって算出された値を加算することで、ループ展開前の命令列と同じ値を出力可能となる。ループ終了後に各展開番号の命令列によって算出された値を加算する命令を収束命令と称する。図４６は、図４５で例示されたループ展開後の命令列を中間コードで表現した命令列の一例を示す図である。図４６では、「add $g5, $g2, $g2」の部分が回帰演
算となっている。以下、図４６に例示される中間コードをループ展開する処理について説明する。
【００９４】
図４７は、第１変形例に係るコンパイラ装置１０によるループ展開処理の流れの一例を示す図である。以下、図４７を参照して、第１変形例のループ展開処理について説明する。
【００９５】
図４７のＦ１からＦ３までの処理は、図１５のＦ１からＦ３までの処理と同様である。そのため、その説明を省略する。Ｒ１では、コンパイラ装置１０のＦＵ命令変換部２２２は、Ｆ１で抽出されたループ演算命令列に含まれる命令を浮動小数点命令に変換し、ＦＵ変換命令列格納部２６２に格納する。Ｒ２では、コンパイラ装置１０のＩＵ命令変換部２２１は、Ｆ１で抽出されたループ演算命令列に含まれる命令を整数命令に変換し、ＩＵ変換命令列格納部２６３に格納する。
【００９６】
図４８は、図４７のＲ１およびＲ２の処理の詳細な流れの一例を示す図である。図４８を参照して、図４７のＲ１およびＲ２の処理の流れについて説明する。Ｕ１では、命令変換部２２０は、ループ展開後の初期化命令列を格納する初期化命令列結果リストを作成する。Ｕ２では、命令変換部２２０は、ループ展開後のループ演算命令列を格納する演算命令列結果リストを作成する。Ｕ３では、命令変換部２２０は、ループ展開後の収束命令を格納する収束命令列結果リストを作成する。Ｕ１からＵ３で作成されたそれぞれのリストは、例えば、コンパイラ装置１０の主記憶部１０２または補助記憶部１０３上に設けられる。図４８のＧ２からＧ１０までの処理は、図１８のＧ２からＧ１０までの処理と同様である。そのため、その説明を省略する。
【００９７】
図４７に戻り、Ｆ６の処理は、図１５のＦ６の処理と同様である。そのため、その説明を省略する。Ｒ３では、命令変換部２２０は、回帰演算用の初期化処理を実行する。
【００９８】
図４９は、回帰演算用の初期化処理を示す図の一例である。図４９は、図４７のＲ３の処理の詳細な流れの一例を示す図である。図４９を参照して、回帰演算用の初期化処理の流れについて説明する。
【００９９】
Ｃ１では、命令変換部２２０は、仮想レジスタマップを作成する。仮想レジスタマップは、図２４で説明したように、ループ変換前の仮想レジスタとループ変換後の仮想レジスタとの対応を示すマップである。作成された仮想マップは、例えば、主記憶部１０２または補助記憶部１０３上に記憶される。
【０１００】
Ｃ２では、命令変換部２２０は、ループ展開の前後における回帰演算の定義の対応をＣ１で作成した仮想レジスタマップに追加する。命令変換部２２０は、例えば、図４６に例示される中間コードを例にすれば、回帰演算「add $g1, $g2, $g2」の定義「$g2」について、Ｃ２の処理を実行する。
【０１０１】
Ｃ３では、命令変換部２２０は、ループ演算命令列に次の回帰演算命令があるか否かを判定する。次の回帰演算命令がある場合（Ｃ３でＹＥＳ）、処理はＣ２に進められる。次の回帰演算命令が無い場合（Ｃ３でＮＯ）、処理は終了される。すなわち、図４９に例示される回帰演算用の初期化処理は、ループ演算命令列に含まれる全ての回帰演算命令に対して実行される。
【０１０２】
図４７に戻り、Ｒ４では、ＦＵ命令展開部２３２は、ＦＵ変換命令列格納部２６２に格納された命令列を展開し、展開した命令列をＦＵ出力命令列格納部２６４に格納する。Ｒ５では、ＩＵ命令展開部２３１は、ＩＵ変換命令列格納部２６３に格納された命令列を展開し、展開した命令列をＩＵ出力命令列格納部２６５に格納する。
【０１０３】
図５０は、ループ演算命令列の展開処理の一例を示す図である。図５０は、図４７のＲ４およびＲ５の処理の詳細な流れの一例を示す図である。図５０を参照して、ループ演算命令列の展開処理について説明する。
【０１０４】
Ｈ２の処理は、図１５のＨ２の処理と同様である。そのため、その説明を省略する。Ｄ１では、命令展開部２３０は、Ｈ２で取り出した命令が回帰演算であるか否かを判定する。回帰演算である場合（Ｄ１でＹＥＳ）、処理はＤ２に進められる。回帰演算でない場合（Ｄ１でＮＯ）、処理は、Ｈ３に進められる。
【０１０５】
図５１は、回帰演算命令の一例を示す図である。図５１は、図４４で一例を示した命令について、説明の便宜上参照リストおよび定義リストの範囲を示したものである。すなわち、図４４で一例を示した加算命令「add」では、参照オペランドとして「op1」、「op2
」を有し、定義オペランドとして「op3」を有する。図５１に例示される加算命令「add」は、参照オペランド「op1」と定義オペランド「op3」とが同一の変数であり、「op1」と
「op2」とは異なる変数であるものとする。
【０１０６】
図５２は、回帰演算命令の書き換え処理の一例を示す図である。図５２は、図５０のＤ２の処理の詳細な流れの一例を示す図である。以下、図５２を参照して、回帰演算命令の書き換え処理について説明する。Ｅ１では、命令展開部２３０は、参照オペランド「op1
」が整数型（int型）であるか否かを判定する。「op1」が整数型である場合、処理はＥ２に進められる。「op1」が整数型でない場合、処理はＥ５に進められる。
【０１０７】
Ｅ２では、命令展開部２３０は、書き換え対象となる命令が整数命令であるか否かを判定する。書き換え対象となる命令が整数命令である場合、処理はＥ３に進められる。書き換え対象となる命令が整数命令でない場合、処理はＥ４に進められる。
【０１０８】
Ｅ３では、命令変換部２３０は、回帰演算命令の書き換えを行う。図５３は、回帰演算命令の書き換え処理の一例を示す図である。図５３は、図５２のＥ３の処理の詳細な流れの一例を示す図である。以下、図５３を参照して、図５２のＥ３の処理について説明する。
【０１０９】
Ｅ３１では、命令展開部２３０は、整数型（int型）の仮想レジスタを新規に作成する
。図５３では、作成された仮想レジスタは、「new」と記載されている。Ｅ３２では、命
令展開部２３０は、図４８のＵ１で作成された初期化命令列結果リストに、Ｅ３１で作成した仮想レジスタを初期化する命令を追加する。ここでは、命令「mov 0, new」が追加される。すなわち、Ｅ３２で初期化命令列結果リストに追加された命令は、Ｅ３１で作成した仮想レジスタ「new」を「０」で初期化している。
【０１１０】
Ｅ３３では、命令展開部２３０は、Ｅ３１で作成した仮想レジスタを用いて回帰演算命令を書き換える。書き換えられた命令は「add new, op2, new」となる。Ｅ３４では、命
令展開部２３０は、収束命令列結果リストにループ終了後に実行する加算命令を追加する。ここでは、「add new, op3, op3」が収束命令列結果リストに追加される。
【０１１１】
Ｅ３５では、命令展開部２３０は、図４９のＣ１で作成された仮想レジスタマップを参照し、仮想レジスタ「op2」に対応するループ展開後の仮想レジスタ（図５３では、newOP2と記載）を取り出す。Ｅ３６では、命令展開部２３０は、回帰演算を「add new, newOP2, new」と書き換える。
【０１１２】
図５２に戻り、Ｅ４では、命令変換部２３０は、回帰演算命令の書き換えを行う。図５４は、回帰演算命令の書き換え処理の一例を示す図である。図５４は、図５２のＥ４の処理の詳細な流れの一例を示す図である。以下、図５４を参照して、図５２のＥ４の処理について説明する。
【０１１３】
Ｅ５１では、命令展開部２３０は、浮動小数点型（float型）の仮想レジスタを新規に
作成する。図５４のＥ５１では、作成された仮想レジスタは、「new1」と記載されている。Ｅ５２では、命令展開部２３０は、図４８のＵ１で作成された初期化命令列結果リストに、Ｅ５１で作成した仮想レジスタを初期化する命令を追加する。ここでは、命令「mov 0, new1」が追加される。すなわち、Ｅ５２で初期化命令列結果リストに追加された命令
は、Ｅ５１で作成した仮想レジスタ「new1」を「０」で初期化している。
【０１１４】
Ｅ５３では、命令展開部２３０は、Ｅ５１で作成した仮想レジスタを用いて回帰演算命令を書き換える。書き換えられた命令は「fadd new1, op2, new1」となる。Ｅ５４では、命令展開部２３０は、整数型（int型）の仮想レジスタを新規に作成する。図５４のＥ５
４では、作成された仮想レジスタは、「new2」と記載されている。Ｅ５５では、命令展開部２３０は、変数の型変換を行う命令を収束命令列結果リストに追加する。ここでは、「movftoi new1, new2」が追加される。この命令は、浮動小数点型の仮想レジスタ「new1」の値を整数型に型変換せずに、ビット列はそのままで、整数型の仮想レジスタである「new2」に代入する。
【０１１５】
Ｅ５６では、命令展開部２３０は、ループ終了後に実行される加算命令を収束命令列結果リストに追加する。ここでは、「add new2, op3, op3」が追加される。Ｅ５７では、命令展開部２３０は、図４９のＣ１で作成された仮想レジスタマップを参照し、仮想レジスタ「op2」に対応するループ展開後の仮想レジスタ（図５３では、newOP2と記載）を取り
出す。Ｅ５８では、命令展開部２３０は、回帰演算を「fadd new2, newOP2, new2」と書
き換える。
【０１１６】
図５２に戻り、Ｅ５では、命令展開部２３０は、書き換え対象となる命令が整数命令であるか否かを判定する。書き換え対象となる命令が整数命令である場合、処理はＥ６に進められる。書き換え対象となる命令が整数命令でない場合、処理はＥ７に進められる。
【０１１７】
図５５は、回帰演算命令の書き換え処理の一例を示す図である。図５５は、図５２のＥ６の処理の詳細な流れの一例を示す図である。以下、図５５を参照して、図５２のＥ６の処理について説明する。
【０１１８】
Ｅ３１からＥ３３の処理は、図５３のＥ３１からＥ３３の処理と同様である。そのため、その説明を省略する。Ｅ６１では、命令展開部２３０は、浮動小数点型（float型）の
仮想レジスタを新規に作成する。図５５のＥ６１では、作成された仮想レジスタは、「new2」と記載されている。Ｅ６２では、命令展開部２３０は、変数の型変換を行う命令を収
束命令列結果リストに追加する。ここでは、「movftoi new2, new」が追加される。この
命令は、浮動小数点型の仮想レジスタ「new2」の値を整数型に型変換せずに、ビット列はそのままで、整数型の仮想レジスタである「new」に代入する。
【０１１９】
Ｅ６３では、命令展開部２３０は、ループ終了後に実行される加算命令を収束命令列結果リストに追加する。ここでは、「fadd new, op3, op3」が追加される。Ｅ３５からＥ３６の処理は、図５３のＥ３５からＥ３６の処理と同様である。そのため、その説明を省略する。
【０１２０】
図５６は、回帰演算命令の書き換え処理の一例を示す図である。図５６は、図５２のＥ７の処理の詳細な流れの一例を示す図である。以下、図５６を参照して、図５２のＥ７の処理について説明する。
【０１２１】
Ｅ５１からＥ５３の処理は、図５４のＥ５１からＥ５３の処理と同様である。そのため、その説明を省略する。Ｅ７１では、命令展開部２３０は、ループ終了後に実行される加算命令を収束命令列結果リストに追加する。ここでは、「fadd new1, op3, op3」が追加
される。Ｅ３５からＥ３６の処理は、図５３のＥ３５からＥ３６の処理と同様である。そのため、その説明を省略する。
【０１２２】
図５０に戻り、Ｈ３からＨ１５の処理は、図２３のＨ３からＨ１５の処理と同様である。そのため、その説明を省略する。
【０１２３】
図４７に戻り、Ｆ９からＦ１２の処理は、図１５のＦ９からＦ１２の処理と同様である。そのため、その説明を省略する。
【０１２４】
図５７は、ループ展開後のループ演算命令列の一例を示す図である。展開番号１および３の命令列は、図５４に例示されるループ展開方法によって展開される。展開番号２の命令列は、図５３に例示されるループ展開方法によって展開される。
【０１２５】
図５８は、ループ展開後の初期化命令列の一例を示す図である。展開番号１および２の初期化命令列は、図５４のＥ５２の処理によって追加された命令である。展開番号３の初期化命令列は、図５３のＥ３２の処理によって追加された命令である。
【０１２６】
図５９は、ループ展開後の収束命令列の一例を示す図である。展開番号１および２の収束命令列は、図５４のＥ５５およびＥ５６の処理によって追加された命令である。展開番号３の収束命令列は、図５３のＥ３４の処理によって追加された命令である。
【０１２７】
図６０は、ループ展開後のループ命令列の一例を示す図である。ループ命令列は、第１実施形態と同様にループカウンタの補正がなされる。図６１は、ループ展開後のループの命令列の一例を示す図である。図６１は、図４７の処理によって展開されたループの命令列の一例である。図６１に例示される命令列は、図５８に例示される初期化命令列、図５７に例示されるループ演算命令列、図６０に例示されるループ命令列、図５９に例示される収束命令列を組み合わせたものである。すなわち、図５８によって例示される初期化命令列によって仮想レジスタの初期化がなされる。図５７に例示されるループ演算命令列は、図６０によって例示されるループ命令列によって繰り返し実行される。ループ終了後、図５９によって例示される収束命令列が実行される。
【０１２８】
第１変形例では、回帰演算を含む命令を命令およびオペランドの型で分類し、各分類ごとに、ループ間に依存関係が生じないようにループ展開を行った。その結果、第１変形例によれば、回帰演算を含むループの命令列に対しても第１実施形態に係るループ展開を適
用可能である。
【０１２９】
以上で開示した実施形態や変形例はそれぞれ組み合わせる事ができる。
【０１３０】
＜その他＞
以上の第１変形例を含む実施形態に関し、更に以下の付記を開示する。
（付記１）
入力されたソースファイルにおいて命令列の繰り返しを指示する繰り返し命令を検出すると、前記繰り返し命令によって繰り返される前記命令列を抽出する抽出部（２２０）と、
抽出された前記命令列に含まれる命令を整数演算を行う整数命令に変換して整数命令列を生成する第１の生成部と、
抽出された前記命令列に含まれる命令を浮動小数点演算を行う浮動小数点命令に変換して浮動小数点命令列を生成する第２の生成部と、
前記ソースファイルをコンパイルしたオブジェクトの実行環境となるプロセッサの有する整数演算器の数および浮動小数点演算器の数に基づいて、前記整数命令列と前記浮動小数点命令列とを含む出力命令列を生成する第３の生成部と、を備える、
コンパイラ装置。
（付記２）
前記繰り返し命令による前記命令列の繰り返し回数、前記整数演算器の数および前記浮動小数点演算器の数に基づいて、前記繰り返し命令による前記出力命令列の繰り返し回数を決定する決定部をさらに備える、
付記１に記載のコンパイラ装置。
（付記３）
前記決定部は、前記繰り返し命令による前記命令列の繰り返し回数を前記整数演算器の数および前記浮動小数点演算器の数の和で除算した値を前記繰り返し命令による前記出力命令列の繰り返し回数とする、
付記２に記載のコンパイラ装置。
（付記４）
整数演算器と浮動小数点演算器の数をプロセッサ種別毎に記憶するプロセッサ情報記憶部と、
前記オブジェクトの実行環境となるプロセッサの有する整数演算器と浮動小数点演算器の数を前記プロセッサ情報記憶部から取得する演算器数取得部と、をさらに備える、
付記１から３のいずれか一項に記載のコンパイラ装置。
（付記５）
前記抽出部によって抽出される前記命令列は分岐を含まない命令列である、
付記１から４のいずれか一項に記載のコンパイラ装置。
（付記６）
コンピュータが、
入力されたソースファイルにおいて命令列の繰り返しを指示する繰り返し命令を検出すると、前記繰り返し命令によって繰り返される前記命令列を抽出し、
抽出された前記命令列に含まれる命令を整数演算を行う整数命令に変換して整数命令列を生成し、
抽出された前記命令列に含まれる命令を浮動小数点演算を行う浮動小数点命令に変換して浮動小数点命令列を生成し、
前記ソースファイルをコンパイルしたオブジェクトの実行環境となるプロセッサの有する整数演算器の数および浮動小数点演算器の数に基づいて、前記整数命令列と前記浮動小数点命令列とを含む出力命令列を生成する、
コンパイル方法。
（付記７）
前記繰り返し命令による前記命令列の繰り返し回数、前記整数演算器の数および前記浮動小数点演算器の数に基づいて、前記繰り返し命令による前記出力命令列の繰り返し回数を決定する処理をさらに実行する、
付記６に記載のコンパイル方法。
（付記８）
前記決定する処理は、前記繰り返し命令による前記命令列の繰り返し回数を前記整数演算器の数および前記浮動小数点演算器の数の和で除算した値を前記繰り返し命令による前記出力命令列の繰り返し回数とする処理を含む、
付記７に記載のコンパイル方法。
（付記９）
前記コンピュータは、整数演算器と浮動小数点演算器の数をプロセッサ種別毎に記憶するプロセッサ情報記憶部を備え、
前記オブジェクトの実行環境となるプロセッサの有する整数演算器と浮動小数点演算器の数を前記プロセッサ情報記憶部から取得する処理をさらに実行する、
付記６から８のいずれか一項に記載のコンパイル方法。
（付記１０）
前記抽出される前記命令列は分岐を含まない命令列である、
付記６から９のいずれか一項に記載のコンパイル方法。
（付記１１）
コンピュータに、
入力されたソースファイルにおいて命令列の繰り返しを指示する繰り返し命令を検出すると、前記繰り返し命令によって繰り返される前記命令列を抽出させ、
抽出された前記命令列に含まれる命令を整数演算を行う整数命令に変換して整数命令列を生成させ、
抽出された前記命令列に含まれる命令を浮動小数点演算を行う浮動小数点命令に変換して浮動小数点命令列を生成させ、
前記ソースファイルをコンパイルしたオブジェクトの実行環境となるプロセッサの有する整数演算器の数および浮動小数点演算器の数に基づいて、前記整数命令列と前記浮動小数点命令列とを含む出力命令列を生成させる、
コンパイラプログラム。
（付記１２）
前記繰り返し命令による前記命令列の繰り返し回数、前記整数演算器の数および前記浮動小数点演算器の数に基づいて、前記繰り返し命令による前記出力命令列の繰り返し回数を決定させる処理をさらに実行させる、
付記１１に記載のコンパイラプログラム。
（付記１３）
前記決定させる処理は、前記繰り返し命令による前記命令列の繰り返し回数を前記整数演算器の数および前記浮動小数点演算器の数の和で除算した値を前記繰り返し命令による前記出力命令列の繰り返し回数とする処理を含む、
付記１２に記載のコンパイラプログラム。
（付記１４）
前記コンピュータは、整数演算器と浮動小数点演算器の数をプロセッサ種別毎に記憶するプロセッサ情報記憶部を備え、
前記オブジェクトの実行環境となるプロセッサの有する整数演算器と浮動小数点演算器の数を前記プロセッサ情報記憶部から取得する処理ををさらに実行させる、
付記１１から１３のいずれか一項に記載のコンパイラプログラム。
（付記１５）
前記抽出される前記命令列は分岐を含まない命令列である、
付記１１から１４のいずれか一項に記載のコンパイラプログラム。
【符号の説明】
【０１３１】
１００・・・情報処理装置
１０１・・・プロセッサ
１０１ａ・・・整数演算器
１０１ｂ・・・浮動小数点演算器
１０２・・・主記憶部
１０３・・・補助記憶部
１０４・・・通信部
１０、５００・・・コンパイラ装置
２０１・・・マシンモデル
２０２・・・ＮＦＵ数格納部
２０３・・・ＮＩＵ数格納部
２１１・・・ＮＩＵ取得部
２１２・・・ＮＦＵ取得部
２２０・・・命令変換部
２２１・・・ＩＵ命令変換部
２２２・・・ＦＵ命令変換部
２３０・・・命令展開部
２３１・・・ＩＵ命令展開部
２３２・・・ＦＵ命令展開部
２４０・・・ループ命令補正部
２６１・・・ループ演算命令列格納部
２６２・・・ＦＵ変換命令列格納部
２６３・・・ＩＵ変換命令列格納部
２６４・・・ＦＵ出力命令列格納部
２６５・・・ＩＵ出力命令列格納部
２６６・・・出力ループ命令列格納部
３０１・・・ＦＵ変換テーブル
３０２・・・ＩＵ変換テーブル
【図１】
0006547466.tif 000002
【図２】
0006547466.tif 000003
【図３】
0006547466.tif 000004
【図４】
0006547466.tif 000005
【図５】
0006547466.tif 000006
【図６】
0006547466.tif 000007
【図７】
0006547466.tif 000008
【図８】
0006547466.tif 000009
【図９】
0006547466.tif 000010
【図１０】
0006547466.tif 000011
【図１１】
0006547466.tif 000012
【図１２】
0006547466.tif 000013
【図１３】
0006547466.tif 000014
【図１４】
0006547466.tif 000015
【図１５】
0006547466.tif 000016
【図１６】
0006547466.tif 000017
【図１７】
0006547466.tif 000018
【図１８】
0006547466.tif 000019
【図１９】
0006547466.tif 000020
【図２０】
0006547466.tif 000021
【図２１】
0006547466.tif 000022
【図２２】
0006547466.tif 000023
【図２３】
0006547466.tif 000024
【図２４】
0006547466.tif 000025
【図２５】
0006547466.tif 000026
【図２６】
0006547466.tif 000027
【図２７】
0006547466.tif 000028
【図２８】
0006547466.tif 000029
【図２９】
0006547466.tif 000030
【図３０】
0006547466.tif 000031
【図３１】
0006547466.tif 000032
【図３２】
0006547466.tif 000033
【図３３】
0006547466.tif 000034
【図３４】
0006547466.tif 000035
【図３５】
0006547466.tif 000036
【図３６】
0006547466.tif 000037
【図３７】
0006547466.tif 000038
【図３８】
0006547466.tif 000039
【図３９】
0006547466.tif 000040
【図４０】
0006547466.tif 000041
【図４１】
0006547466.tif 000042
【図４２】
0006547466.tif 000043
【図４３】
0006547466.tif 000044
【図４４】
0006547466.tif 000045
【図４５】
0006547466.tif 000046
【図４６】
0006547466.tif 000047
【図４７】
0006547466.tif 000048
【図４８】
0006547466.tif 000049
【図４９】
0006547466.tif 000050
【図５０】
0006547466.tif 000051
【図５１】
0006547466.tif 000052
【図５２】
0006547466.tif 000053
【図５３】
0006547466.tif 000054
【図５４】
0006547466.tif 000055
【図５５】
0006547466.tif 000056
【図５６】
0006547466.tif 000057
【図５７】
0006547466.tif 000058
【図５８】
0006547466.tif 000059
【図５９】
0006547466.tif 000060
【図６０】
0006547466.tif 000061
【図６１】
0006547466.tif 000062