(57)【要約】【課題】  アクセスするメモリアドレスの境界制約を持つアライン命令を使用するため、アドレス境界を実行時に判定する多バージョンコードの生成において、コード量を制限する場合に、有効にアライン命令を使用できるコードを選択し、適切にアライン命令を使用する。【解決手段】  境界条件の不明な配列参照に対してプロファイル取得用のプログラム実行時にアドレスを出力するコードを生成し（ステップＳ１０１）、そのプログラム１０５を実行することによりアドレス情報のプロファイルデータ１０６を収集した後、アドレス情報を利用した境界制約付きアクセスコードの生成を行う（ステップＳ１０３）。境界制約付きアクセスコード生成では、高確率で境界制約を満たすデータを取り出し、そのデータが境界制約を満たすことを実行時に判定する条件文を生成し、条件の成立時にアライン命令を実行するコードを生成する。【選択図】  図１
2008293169.tif 000002
【特許請求の範囲】
【請求項１】
ソースプログラムをコンパイルしてオブジェクトプログラムに変換するときに使用し、アドレスの境界制約を有し、複数のデータにメモリアクセスするメモリアクセス命令を用いた境界制約付きアクセスコードを生成する計算機システムにおけるコード生成方法において、
前記メモリアクセス命令の対象のうちコンパイル時にアドレスの境界が不明な複数のデータを構成する各データのアドレスについて定めたアドレスプロファイルデータを利用する指示をコンパイルオプションから入力するステップと、
前記アドレスプロファイルデータに基づいて、前記メモリアクセスされる各データのアドレスについて、前記境界制約を満たす確率を求めるステップと、
前記各データのうち、前記確率が高確率となるデータを取り出し、当該データのアドレスが前記境界制約を満たすか否かという条件を組み合わせた判定条件を生成するステップと、
前記境界制約付きアクセスコードを、前記判定条件に用いられたデータだけに対し、前記メモリアクセス命令としてアライン命令を用いるように場合分けした多バージョンコードとして生成するステップと、
を有することを特徴とするコード生成方法。
【請求項２】
前記利用する指示対象となるアドレスプロファイルデータを取得していない場合、前記アドレスプロファイルデータを取得する指示をコンパイルオプションから入力するステップと、
前記メモリアクセス命令の対象となる複数のデータを構成する各データのアドレスがコンパイル時に不明であるか否か解析するステップと、
前記解析により、アドレスの境界が不明とされた各データのアドレスを取得するためのアドレス取得コードを生成することにより、前記アドレスプロファイルデータを取得するためのプロファイル取得用オブジェクトプログラムを生成するステップと、
前記プロファイル取得用オブジェクトプログラムを実行することにより、前記アドレスプロファイルデータを取得するステップと、
を有することを特徴とする請求項１に記載のコード生成方法。
【請求項３】
前記メモリアクセス命令は、メモリ上に連続して配置された複数のデータを、１個のレジスタ上に一括してロードまたはストアする命令であることを特徴とする請求項１または請求項２に記載のコード生成方法。
【請求項４】
ソースプログラムをコンパイルしてオブジェクトプログラムに変換するときに使用し、アドレスの境界制約を有し、複数のデータにメモリアクセスするメモリアクセス命令を用いた境界制約付きアクセスコードを生成する処理を実行する制御手段を有する計算機システムにおいて、
前記メモリアクセス命令の対象のうちコンパイル時にアドレスの境界が不明な複数のデータを構成する各データのアドレスについて定めたアドレスプロファイルデータを記憶する記憶手段と、
前記アドレスプロファイルデータを利用する指示をコンパイルオプションから入力する入力手段とを有し、
前記制御手段は、
前記アドレスプロファイルデータに基づいて、前記メモリアクセスされる各データのアドレスについて、前記境界制約を満たす確率を求め、
前記各データのうち、前記確率が高確率となるデータを取り出し、当該データのアドレスが前記境界制約を満たすか否かという条件を組み合わせた判定条件を生成し、
前記境界制約付きアクセスコードを、前記判定条件に用いられたデータだけに対し、前記メモリアクセス命令としてアライン命令を用いるように場合分けした多バージョンコードとして生成する、
処理を実行することを特徴とする計算機システム。
【請求項５】
前記利用する指示対象となるアドレスプロファイルデータを取得していない場合、前記入力手段は、前記アドレスプロファイルデータを取得する指示をコンパイルオプションから入力し、
前記制御手段は、
前記メモリアクセス命令の対象となる複数のデータを構成する各データのアドレスがコンパイル時に不明であるか否か解析し、
前記解析により、アドレスの境界が不明とされた各データのアドレスを取得するためのアドレス取得コードを生成し、
前記アドレスプロファイルデータを取得するためのプロファイル取得用オブジェクトプログラムを生成し、
前記プロファイル取得用オブジェクトプログラムを実行することにより、前記アドレスプロファイルデータを取得する、
処理を実行することを特徴とする請求項４に記載の計算機システム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、コンパイル技術に関し、特に、アドレス境界に制約を持つメモリアクセス命令を使用するためのメモリアクセス最適化におけるコード生成方法等に関する。
【背景技術】
【０００２】
１つのレジスタ上に複数のデータを保持し、保持した複数のデータに対して並列演算を実行できる命令を備えたアーキテクチャが一般的になってきている。例えば、非特許文献１に記載されているマルチメディア命令拡張ＳＳＥ(Stream SIMD(Single Instruction Multiple Data) Extensions)では、１２８ビットのレジスタを用いて複数のデータを一括して扱える。例えば、３２ビットの単精度浮動小数点データの場合、４個のデータに対する演算を、１つのレジスタ上で並列に実行できる。メモリアクセス命令としてのロード命令またはストア命令を実行する場合に、レジスタ上に保持した複数のデータに対して並列演算を実行できるようにしたロード命令またはストア命令を「一括ロード・ストア命令」と呼ぶ。
【０００３】
レジスタ上で並列に演算を実行するために、複数のデータを１個のレジスタに載せる方法として、メモリ上に連続的に配置されているデータ（配列等を含む。）を対象とする場合には、複数のデータを一括してロードすることにより、１個のレジスタに載せるといった方法がある。例えば、図１２（ａ）のソースプログラムの例で示したループ（forループ）に対して、図１２（ｂ）の一括ロード・ストア命令を使用する変換の例のように、ループを４倍にアンローリングしてi,i+1,i+2,i+3の４個の要素を一括してアクセスするようなコードを生成する。ここでa[i:i+3]、b[i:i+3]は、それぞれa[i]、b[i]を先頭とする４要素を一括してまとめてロードする配列であることを示す。
【０００４】
一括ロード・ストア命令はアクセスするメモリアドレスがアクセスサイズ（バイト）の倍数となるような制約、つまり、アドレスに関する境界制約（境界条件という場合もある。）を持つことが多い。例えば、前述のＳＳＥにおいても、アドレスが１６バイト境界の場合（つまり、境界制約を満たす場合）のみ利用できる一括ロード・ストア命令(以下、「アライン命令」と呼ぶ。)を備えている。アドレスが境界制約を満たさないデータに対しては、境界制約を満たさないデータに対して用いる一括ロード・ストア命令（以下、「非アライン命令」と呼ぶ。）を使用する。アライン命令は非アライン命令よりもメモリアクセスが高速に実行されるのが一般的である。非アライン命令を備えていないアーキテクチャにおいては、各データを個別にレジスタにロードしてから、レジスタ上のデータ操作により複数データの組を１個のレジスタ上に生成する場合もある。
【０００５】
アクセス対象のデータのアドレスがコンパイル時に不明な場合には、各データのアドレス境界の組合せ（複数のデータを構成する各データが境界制約を満たすか否かについて場合分けをして定めたもの）に対応した条件判定文により多バージョンコードを生成し、各場合分けに応じて、アライン命令と非アライン命令を使い分けるコードを生成する。例えば、図１２（ａ）の例では、配列a,bの先頭アドレスの境界が１６バイト境界かどうか不明の場合、それぞれの配列先頭アドレスが１６バイト境界かどうかの組合せにより４通りに場合分けした多バージョンコードを生成する。具体的には、まず、（１）配列aの先頭アドレスが１６で割り切れ、配列bの先頭アドレスが１６で割り切れるケース、（２）配列aの先頭アドレスが１６で割り切れ、配列bの先頭アドレスが１６で割り切れないケース、（３）配列aの先頭アドレスが１６で割り切れず、配列bの先頭アドレスが１６で割り切れるケース、（４）配列aの先頭アドレスが１６で割り切れず、配列bの先頭アドレスが１６で割り切れないケース、の４通りに場合分けする。そして、各ケース（１）〜（４）で境界条件を満たす（つまり、アドレスが１６の倍数である）配列に対してはアライン命令を使用するようなコードを生成する。図１２（ｃ）は、一括アクセス命令のための多バージョンコードの例を図示したものである。図１２（ｃ）において、各ケースで境界条件を満たす配列に対しては、「aligned load」または「aligned store」と記述し、アライン命令を使用する。境界条件を満たさない配列に対しては、「unaligned load」または「unaligned store」と記述し、非アライン命令を使用する。このような多バージョンコードの生成については非特許文献１の１３５ページから１３８ページに記載されている。
【０００６】
上記のように、各データのアラインメントによる多バージョンコードを生成する場合、データ数が増大するのに従いコード量が増大する。例えば、A, B, Cの３個のデータについて考えると、各データのアラインメントが境界条件を満たすか満たさないかについて定めた場合分けをしたときの組合せにより、８（＝２の３乗）通りの場合分けが生じる。ｎ個のデータに対しては２ｎ通りの場合分けが生じる。メモリアクセスを高速に実行することを優先するのであれば、元々境界制約を満たすデータに対してはアライン命令を使用すべきであるが、そのためにコード量が増大し、不具合が生じることは回避しなければならない。このような場合、そのような事態を回避するために何らかの方法でコード量を抑えることが考えられる。
【０００７】
コード量を抑えるためには、多バージョンコードの場合分け数の上限を決めて、残りの場合に対しては境界条件を満たさないコードを生成する方法がある。例えば、再びA, B, Cの３個のデータについて考えると、場合分け数の上限を４通りとすると、「（１）A,B,Cが境界条件を満たす、（２）A,Bが境界条件を満たす、（３）A,Cが境界条件を満たす、（４）その他（A,B,Cが境界条件を満たさないと仮定）」のような４通りのコードを生成することになる。この場合、例えばBとCが境界条件を満たす場合に対しては、（４）の場合のコードを実行することになり、B,Cに対して本来ならば適用できるアライン命令が適用できない。
【非特許文献１】Aart J.C. Bik, The Software Vectorization Handbook, Intel Press, 2004.
【発明の開示】
【発明が解決しようとする課題】
【０００８】
背景技術の項で述べたように、境界条件が不明な配列等の複数のデータに対して多バージョンコードを生成する場合、コード量を制限するために場合分け数を制限し、残りの場合については１つの特定のケースにまとめ、そのケースに対してはアライン命令を適用しないコードを生成する。ただ、もし、この残りの場合に分類した特定のケースが、アライン命令を実行できるデータの存在する割合が高く、高い実行確率を占める場合、アライン命令を活用することができず、メモリアクセスの実行性能の低下に繋がる。
【０００９】
上記事情を鑑みて、本発明の目的は、アドレス境界が不明な複数のデータに対して生成する多バージョンコードのコード量を抑えつつも、有効にアライン命令を使用できる場合を見つけ出すことにより、メモリアクセスの実行性能を向上させることである。
【課題を解決するための手段】
【００１０】
本発明は、境界条件の不明なデータに対してプロファイル取得用のプログラム実行時にアドレスを出力するコードを生成し、そのプログラムを実行することによりアドレス情報のプロファイルデータを収集した後、アドレス情報のプロファイルデータを利用した境界制約付きアクセスコードの生成を行う。境界制約付きアクセスコード生成では、高確率で境界制約を満たすデータを取り出し、取り出したデータが境界制約を満たすことを実行時に判定する条件文を生成し、条件の成立時にアライン命令を実行する多バージョンコードを生成することを特徴とする。詳しくは後記する。
【発明の効果】
【００１１】
本発明によれば、アドレス境界が不明な複数のデータに対して生成する多バージョンコードのコード量を抑えつつも、有効にアライン命令を使用できる場合を見つけ出すことにより、メモリアクセスの実行性能を向上させることができる。
【発明を実施するための最良の形態】
【００１２】
１．概要
以下、図面を用いて本発明の実施の形態について説明する。
図１は、本実施形態の計算機システムにおけるアドレスプロファイル情報を用いた境界制約付きアクセスコード生成の処理手順の一例を図示したものである。図１を参照しつつ、本発明の概要について説明する。
【００１３】
ステップＳ１０１ではソースプログラム１０４を読み込み、コンパイル１によるコンパイル処理を行って境界制約付きアクセス用アドレス取得コードを生成し、境界制約付きアクセス用アドレス取得コードを挿入したプロファイル取得用オブジェクトプログラム１０５を出力する。
【００１４】
次に、ステップＳ１０２においてプロファイル取得用オブジェクトプログラム１０５を実行し、対象となるデータとそのデータのアドレスとが関連付けられたアドレスプロファイルデータ１０６を出力する。
【００１５】
次に、ステップＳ１０３において、ソースプログラム１０４を再び読み込み、コンパイル２によるコンパイル処理を行う。その際、アドレスプロファイルデータ１０６を読み出して、利用することにより、境界制約付きアクセスコードの生成を行い、オブジェクトプログラム１０７を出力する。ステップＳ１０１およびステップＳ１０３の詳細については後記する。
【００１６】
ステップＳ１０１およびステップＳ１０３のコンパイル処理、並びに、ステップＳ１０２のプログラム実行処理は、ユーザからのコンパイル命令やプログラム実行命令の指示により実施する。本実施形態では、コンパイル処理において、ステップＳ１０１のコンパイル１のようにプロファイル取得用の境界制約付きアクセス用アドレス取得コード生成の処理を行うか、ステップＳ１０３のコンパイル２のようにアドレスプロファイルデータ１０６を利用した境界制約付きアクセス用コードの生成の処理を行うか否かは、コンパイル命令のオプション（以下、「コンパイルオプション」という。）などにより指定するものとする。なお、この指定は、本実施形態の計算機システムが備える入力手段による入力から行うことも可能である。
【００１７】
２．計算機システムの構成
図２は、本実施形態の計算機システムの構成について図示したものである。この計算機システムは、制御手段としてのＣＰＵ(Central Processing Unit)２０１、表示手段としてのディスプレイ装置２０２、入力手段としてのキーボード２０３、記憶手段としての主記憶装置２０４、および記憶手段としての外部記憶装置２０５から構成されている。キーボード２０３により、ユーザからのコンパイラ起動命令を受け付ける。コンパイラ終了メッセージやエラーメッセージは、ディスプレイ装置２０２に表示される。
【００１８】
外部記憶装置２０５には、ソースプログラム１０４と、プロファイル取得用オブジェクトプログラム１０５、アドレスプロファイルデータ１０６、およびオブジェクトプログラム１０７が格納される。
【００１９】
主記憶装置２０４には、コンパイル１（図１のステップＳ１０１参照）およびコンパイル２（図１のステップＳ１０３参照）その他のコンパイル処理をＣＰＵ２０１に実行させるコンパイラ１０８、コンパイル過程で必要となる中間コード１０９が格納される。コンパイル処理はＣＰＵ２０１がコンパイラ１０８を実行することにより行われる。
【００２０】
３．コンパイル処理手順
図３は、本実施形態によるコンパイラの処理手順の一例を図示したものである。
ステップＳ２０１では、キーボード２０３から入力されたソースプログラム１０４に対して構文解析を行い、中間コード１０９を出力する。以下のコンパイル処理ではこの中間コードを対象にＳＩＭＤ変換等の変換を行う。なお、構文解析の方法や中間コードの例については、例えば、「Aho, Sethi, Ullman著, “Compilers: Principles, Techniques, and Tools”, Addison-Wesley, 1986」（以下、「参考文献１」という。）に記載されているため、これらの説明については省略する。
【００２１】
ステップＳ２０２では、コンパイルオプション等で指示されるアドレスプロファイル取得指示の有無を調べる。取得指示があれば（ステップＳ２０２でＹｅｓ）まだアドレスプロファイルを取得していないことを意味しており、ステップＳ２０３へ進み、アドレス取得コードの挿入処理を行う。本ステップの処理の詳細は後記する。ステップＳ２０３を実行するパスの場合にはステップＳ１０１のコンパイル処理（コンパイル１）を行うことになる。ステップＳ２０３を終了後はステップＳ２０６へ進む。
【００２２】
ステップＳ２０２で取得指示なしと判定した場合には（ステップＳ２０２でＮｏ）、すでにアドレスプロファイルを取得していることを意味しており、ステップＳ２０４へ進み、コンパイルオプション等で指示されるアドレスプロファイル利用指示があるかどうかを調べる。利用指示があれば（ステップＳ２０４でＹｅｓ）ステップＳ２０５へ進み、境界制約付きアクセスコードを利用した最適化処理を行う。本ステップの処理の詳細は後記する。ステップＳ２０５を実行するパスの場合、ステップＳ１０３のコンパイル処理（コンパイル２）を行うことになる。ステップＳ２０４で指示なしと判定した場合には（ステップＳ２０４でＮｏ）ステップＳ２０６へ進む。
【００２３】
ステップＳ２０６で中間コード１０９のレジスタ割付けを行った後、ステップＳ２０７でコード生成を行い、中間コード１０９をプロファイル取得用オブジェクトプログラム１０５、またはオブジェクトプログラム１０７に変換して出力する。レジスタ割付けやコード生成の方法に関しては、参考文献１に記載されているため、これらの説明については省略する。
【００２４】
以下、本発明の特徴であるステップＳ２０３およびステップＳ２０５の処理の詳細について説明する。
【００２５】
本実施形態のこれ以降の説明においては、境界制約付きアクセスコードは、背景技術の項で述べたＳＳＥのように、複数の要素（データ）に対して同時に演算を行うＳＩＭＤ最適化において使用するものとする。また境界制約付きアクセスコードは４バイトの配列要素４個を１６バイトデータとしてまとめてロードまたはストアする一括ロード・ストア命令を対象とし、１６バイトデータのアドレスが１６バイト境界の場合には境界制約を満たすのでアライン命令を、そうでない場合には境界制約を満たさないので非アライン命令を利用するものとする。
【００２６】
但し、本発明の内容はＳＳＥ以外の一括ロード・ストア命令や、非アライン命令を備えていない命令セットの場合、また単一データをアクセスする境界制約付き命令を用いる場合に対しても、同様に適用可能である。
【００２７】
また、本実施形態では説明を簡単にするため、ループに対するＳＩＭＤ最適化を対象とし、ループ単位で処理を行うが、本発明はループに含まれないコードに対するＳＩＭＤ化（詳しくは、非特許文献１の８章に記載されている。）に対しても同様に適用可能である。
【００２８】
３．１．ステップＳ２０３の処理手順
図４は、ステップＳ２０３における、アドレス取得コード挿入処理の処理手順の詳細を図示したものである。
ステップＳ３０１では未処理のループがあるかどうかを調べ、未処理のループがあれば（ステップＳ３０１でＹｅｓ）、１個の未処理ループを処理対象に定め、ステップＳ３０２へ進む。
【００２９】
ステップＳ３０２では処理対象のループがＳＩＭＤ最適化の対象ループであるかどうかを調べる。ＳＩＭＤ最適化の対象であるかどうかは、ループのイタレーションに跨る依存がないことや、ＳＩＭＤ命令の適用対象の演算や、ロードまたはストアの割合などによって決める。詳しくは非特許文献１に記載されている。ＳＩＭＤ最適化の対象であると判定した場合には（ステップＳ３０２でＹｅｓ）、ステップＳ３０３に進む。ＳＩＭＤ最適化の対象でないと判定した場合には（ステップＳ３０２でＮｏ）、ステップＳ３０１へ戻り、次のループの処理に進む。
【００３０】
ステップＳ３０３では、ＳＩＭＤ最適化の対象であると判定されたループ内の一括ロード・ストア命令の対象を求める。本実施形態では４バイトの配列要素の連続参照を対象とする。
【００３１】
ステップＳ３０４では、ステップＳ３０３で求めた対象のうち、未処理の対象データがあるかどうかを調べ、未処理の対象データがあれば（ステップＳ３０４でＹｅｓ）、１個のデータ（連続参照）を処理対象に選択し、ステップＳ３０５へ進む。
【００３２】
ステップＳ３０５では、選択した配列要素の連続参照のループ初回のアドレスを調べ、アドレス境界がコンパイル時に決まるかどうかを解析する。配列要素のアドレスは配列先頭アドレスおよび添え字式により決まるため、この両方が解析可能であることが必要である。
【００３３】
解析対象の境界条件が１６バイト境界の場合、配列先頭アドレスは、コンパイラ１０８（図２参照）が配列先頭を１６バイト境界に割り付けるという規則に従って処理しているときは、コンパイル時に決まる（ステップＳ３０５でＹｅｓ）が、コンパイラ１０８（図２参照）が８バイト境界に割り付けるという規則に従っているときは、１６バイト境界を満たすかどうかはコンパイル時には決まらず不明である（ステップＳ３０５でＮｏ）。また、配列先頭アドレスが関数パラメタで渡される場合には配列のアドレスは不明である（ステップＳ３０５でＮｏ）。
【００３４】
添え字式については、ループ初回のアドレスを調べるため、添え字式中のループ制御変数に初期値を代入して解析する。例えば、a[i+2]の場合、iがループ制御変数であり、その初期値が０とすると、ループ初回の参照はa[2]となる。配列aの先頭アドレスが１６バイト境界ならば、ステップＳ３０５ではアドレス境界がコンパイル時に決まると判定する（ステップＳ３０５でＹｅｓ）。iの初期値が変数xの場合にはa[x+2]となり、アドレス境界は不明である（ステップＳ３０５でＮｏ）。
【００３５】
ステップＳ３０５でアドレス境界が決まると判定した場合には（ステップＳ３０５でＹｅｓ）、ステップＳ３０４に戻り、他に未処理の対象データがあるかどうか調べる。ステップＳ３０５でアドレス境界が決まらないと判定した場合には（ステップＳ３０５でＮｏ）、ステップＳ３０６へ進み、ループ初回アドレス出力コードをループ直前に挿入する。例えば、初回アドレスがa[x+2]ならば、a[x+2]のアドレスを、アドレスプロファイルデータ１０６を格納するファイル（主記憶装置２０４（図２参照）が有するファイル）に出力するコードを生成し、そのコードを（ソースプログラム１０４（図１参照）に記述されている）ループ直前に挿入する。
【００３６】
ステップＳ３０４、３０５、３０６の処理を各対象データに対して繰り返し、未処理の対象データがなくなったら（ステップＳ３０４でＮｏ）、ステップＳ３０１へ戻り、次のループの処理へ進み、全てのループに対して処理が終了する（ステップＳ３０１でＮｏ）まで繰り返す。
以上で図４およびステップＳ２０３の詳細説明を終わる。
【００３７】
３．２．ステップＳ２０５の処理手順
図５は、ステップＳ２０５における、境界制約付きアクセスコード最適化の処理手順を図示したものである。
ステップＳ４０１では未処理のループがあるかどうかを調べ、未処理のループがあれば（ステップＳ４０１でＹｅｓ）、１個の未処理ループを処理対象に選び、ステップＳ４０２へ進む。未処理のループがなければ（ステップＳ４０１でＮｏ）、終了する。
【００３８】
ステップＳ４０２では、処理対象のループがＳＩＭＤ最適化の対象であるかどうかを判定する。本ステップでは、ステップＳ３０２と同様に、ＳＩＭＤ最適化の対象であるかどうかという判定は、ループのイタレーションに跨る依存の有無や、ＳＩＭＤ命令の適用対象の演算の割合などを調べることにより行われる。ＳＩＭＤ最適化の対象であると判定した場合には（ステップＳ４０２でＹｅｓ）、ステップＳ４０３に進む。ＳＩＭＤ最適化の対象でない場合には（ステップＳ４０２でＮｏ）、ステップＳ４０１へ戻り、次のループの処理を行う。
【００３９】
ステップＳ４０３では、ＳＩＭＤ最適化の対象であると判定されたループ内の一括ロード・ストア命令の対象を調べ、アドレス境界が不明のものが１つでもあるかどうかを判定する。１つもなければ（ステップＳ４０３でＮｏ）、本実施形態の境界制約条件に関する最適化の対象でないので、ステップＳ４０１へ戻り、次のループの処理を行う。アドレス境界が不明のものが１つでもあれば（ステップＳ４０３でＹｅｓ）、ステップＳ４０４に進む。
【００４０】
ステップＳ４０４では、プロファイル取得用オブジェクトプログラム１０５を実行した結果得られた、アドレスプロファイルデータ１０６を読み込み、後記するアドレス確率情報を求め、その情報を基に境界判定条件となる条件式を生成する。
【００４１】
３．２．１．ステップＳ４０４の処理手順
ステップＳ４０４の詳細について説明する。図６は、ステップＳ４０４における、アドレス確率情報を基に境界判定条件の生成手順について図示したものである。
【００４２】
ステップＳ５０１では、一括ロード・ストア命令の対象となる配列参照のうち未処理のものがあるかどうかを調べ、未処理のものがあれば（ステップＳ５０１でＹｅｓ）、その対象を１個取り出し、ステップＳ５０２に進む。未処理の対象がなければ（ステップＳ５０１でＮｏ）、終了する。
【００４３】
ステップＳ５０２では、未処理の一括ロード・ストア命令の対象となる配列参照のアドレス境界がコンパイル時に決まるかどうかを判定する。本判定処理は、ステップＳ３０５（図４参照）と同様であり、配列先頭アドレスおよび添え字式の両方を解析する。アドレス境界がコンパイル時に不明の場合（ステップＳ５０２でＮｏ）、ステップＳ５０３へ進む。そうでない場合は（ステップＳ５０２でＹｅｓ）ステップＳ５０１へ戻り、次の未処理の一括ロード・ストア命令の対象となる配列参照について処理を行う。
【００４４】
ステップＳ５０３では、アドレス境界がコンパイル時に不明な一括ロード・ストア命令の対象となる配列参照のプロファイル情報（アドレスプロファイルデータ１０６（図１参照））から境界制約を満たす確率を求める。本実施形態では１６バイト境界を制約条件とする一括ロード・ストア命令を対象としているので、処理対象となる配列参照に関するアドレス情報を、１６の倍数かどうかにより分類し、１６バイト境界制約を満たす確率を計算する。この計算は、ＣＰＵ２０１による演算により実行され、その確率の計算結果はアドレス確率情報（ステップＳ４０４）として（例えば、主記憶装置２０４（図２参照）に）出力される。
【００４５】
ステップＳ５０４では、ステップＳ５０３で求めた境界制約を満たす確率を、一定の基準値と比較する。境界制約を満たす確率がその基準値以上ならば、境界制約を満たす確率が高いとし（ステップＳ５０４でＹｅｓ）、ステップＳ５０５へ進み、その基準値以上でなければ、境界制約を満たす確率が高くないとし（ステップＳ５０４でＮｏ）、ステップＳ５０１へ戻る。なお、前記基準値の設定は、本実施形態の計算機システムが備える入力手段から設定する等といった周知の技術で行われる。
【００４６】
ステップＳ５０５では、処理中の一括ロード・ストア命令の対象である配列参照のループ初回のアドレスを表すコードを生成し、このアドレスが境界制約（本実施形態では１６バイト境界）を満たすための条件式を生成して、境界の判定条件に付加する。既に求めた条件がある場合には、その条件との論理積を生成することにより条件を付加する。その結果、アドレス確率情報を基にした境界判定条件が生成される（図５のステップＳ４０４参照）。
【００４７】
その後、ステップＳ５０１に戻り、次の未処理の一括ロード・ストア命令の対象へ進み、全ての対象に対して処理が終了する（ステップＳ５０１でＮｏ）まで繰り返す。
以上で図６およびステップＳ４０４の詳細説明を終わる。
【００４８】
再び図５の説明に戻り、ステップＳ２０５の処理手順について説明を続ける。ステップＳ４０５では、ステップＳ４０４で生成した境界判定条件を判定する条件文を生成し、処理対象のループを複写してその条件文で囲む。これにより、条件の成立時（then側）と非成立時（else側）とで、それぞれ別ループを実行するコードが生成される。
【００４９】
ステップＳ４０６では、処理対象のループおよびステップＳ４０５で複写して生成したループに対してＳＩＭＤ最適化の変換処理を行い、境界判定により、一括ロード・ストアに対し、アラインまたは非アラインを設定する。
【００５０】
３．２．２．ステップＳ４０６の処理手順
ステップＳ４０６の詳細について説明する。図７は、一括ロード・ストアのアラインまたは非アラインを設定する処理手順について図示したものである。
【００５１】
ステップＳ６０１では、ステップＳ４０４で生成した条件式の条件が成立した場合に実行する、境界判定のthen側のループを取り出し、処理対象とする。
【００５２】
ステップＳ６０２では、ＳＩＭＤ用のループ展開を行う。例えば、本実施形態では４バイトのデータを４個まとめて１６バイトのデータとし、その１６バイト分のデータをレジスタ上で一括処理する命令を対象としているので、４倍のループ展開を行う。
【００５３】
ステップＳ６０３では、ループ内の実行文を、ＳＩＭＤ命令を利用するコードに変換する。例えば、ループ展開により生成された４個の文をまとめて一括処理を行う１個の文に変換する。これにより例えばa[i]（iはループ制御変数）のような配列要素参照は、a[i:i+3]のように４個のデータをまとめてアクセスする一括参照に変換される。
【００５４】
ステップＳ６０４では、ループ内の一括ロード・ストア命令の中で未処理のものがあるか調べ、未処理のものがあれば（ステップＳ６０４でＹｅｓ）、未処理のもののうちの１個を処理対象とし、ステップＳ６０５に進む。未処理のものがなければ（ステップＳ６０４でＮｏ）、ステップＳ６１１に進む。
【００５５】
ステップＳ６０５では、一括ロード・ストア命令の対象となる一括参照のアドレス境界がコンパイル時に決まるかどうかを判定する。本判定処理は、ステップＳ３０５やステップＳ５０２と同様であり、一括参照の配列先頭アドレスおよび添え字式の両方を解析する。アドレス境界がコンパイル時に決まる場合には（ステップＳ６０５でＹｅｓ）、ステップＳ６０６へ進む。アドレス境界がコンパイル時に決まらない場合には（ステップＳ６０５でＮｏ）、ステップＳ６０７へ進む。
【００５６】
ステップＳ６０６では、アドレス境界を解析してアライン命令または非アライン命令のどちらに該当するかを判定し、一括ロード・ストア命令の対象となる一括参照に対し、アライン命令または非アライン命令のどちらを使用するかを決定した情報を設定する。設定した後は、ステップＳ６０４に戻る。
【００５７】
ステップＳ６０７では、処理中のループがthen側のループかどうかを判定し、then側のループであれば（ステップＳ６０７でＹｅｓ）、ステップＳ６０８へ進む。そうでない場合は（ステップＳ６０７でＮｏ）、else側のループであるので、境界条件は不明である。このため、ステップＳ６１０で一括ロード・ストア命令の対象となる一括参照に非アライン命令を使用するという情報を設定する。設定した後は、ステップＳ６０４に戻る。
【００５８】
ステップＳ６０８では、ループを囲む条件式（ステップＳ４０５参照）を調べ、条件式中に処理対象の参照（一括参照）の初回アドレスの境界の判定条件（ステップＳ４０４参照）があるかどうかを判定する。初回アドレスの条件があれば（ステップＳ６０８でＹｅｓ）、本参照は境界条件を満たすため、ステップＳ６０９でアライン命令を使用するという情報を設定する。初回アドレスの条件がなければ（ステップＳ６０８でＮｏ）、ステップＳ６１０で非アライン命令を使用するという情報を設定する。
【００５９】
ステップＳ６０９またはステップＳ６１０において、対象の一括参照に対するアライン命令または非アライン命令の設定を行った後は、ステップＳ６０４へ戻り、ループ内のすべての一括ロード・ストア命令の処理が終了するまで繰り返す。未処理の一括ロード・ストア命令がなければ（ステップＳ６０４でＮｏ）、ループ内のすべての一括参照の処理が終了したことを意味し、ステップＳ６１１へ進む。
【００６０】
ステップＳ６１１において、処理中のループがthen側のループの場合には（ステップＳ６１１でＹｅｓ）、ステップＳ６１２へ進み、ステップＳ４０４で生成した境界判定条件が非成立の場合に実行する、else側のループを処理対象として取り出して、ステップＳ６０２に戻り、上記と同様の処理を行う。処理中のループがthen側のループでない場合には（ステップＳ６１１でＮｏ）、図７の処理を終了する。
以上で図７およびステップＳ４０６の詳細説明を終了する。
【００６１】
再び図５の説明に戻り、ステップＳ２０５の処理手順について説明を続ける。ステップＳ４０６（図７参照）の処理により各一括ロード・ストア命令の対象となる一括参照にはアライン命令または非アライン命令のどちらを使用するかが決定され、その旨の情報が付加される。ステップＳ４０６の処理の後ステップＳ４０１（図５参照）に戻り、すべての未処理のループに対してステップＳ４０２以降の処理を繰り返す。未処理のループがなければ（ステップＳ４０１でＮｏ）、ステップＳ２０５（図３参照）の境界制約付きアクセスコードの最適化処理を終了し、ステップＳ２０６に進む。
【００６２】
ステップＳ２０６において、ステップＳ４０６の処理により付加された、アライン命令または非アライン命令のどちらを使用するかが決定される旨の情報に基づいて、レジスタ割付けが実行される。そして、ステップＳ２０７のコード生成において、一括アラインロードや一括非アラインロード、または、一括アラインストアや一括非アラインストアのような命令を適切に選択することが可能となる。
以上で本実施形態の処理手順の説明を終了する。
【００６３】
４．具体例
次に、図８のソースプログラム（Ｃ言語で記述したものであり、図１のソースプログラム１０４を具体的にしたもの）に対して、本実施形態を適用した場合の具体的な処理手順を実施例として説明する。
【００６４】
図８のループ（「LOOP1」８０１と表記されたものであり、「ループ１」と呼ぶこととする。）では、単精度浮動小数点型（float型）の配列a, b, cの連続参照を行う。これらは本実施例のＳＩＭＤ最適化の対象となる。また本実施例では、４個のデータを一括して加算するＳＩＭＤ加算命令をサポートしているものとする。このため、本ループはＳＩＭＤ最適化により、配列bおよびcの４要素を一括ロードし、一括加算後に配列aに一括ストアする境界制約付きアクセスコードに変換できる。各配列a, b, cの先頭アドレスは関数の入力パラメタ（仮引数）として渡されるため、アドレス境界に関してはコンパイル時には不明である。尚、配列a, b, cの参照範囲に重なりがある場合にはＳＩＭＤ最適化が適用できない場合が生じるが、本実施例ではその参照範囲の重なりがないことが保証されているものと仮定する。
【００６５】
まず、ステップＳ１０１（図１参照）のコンパイル処理（「コンパイル１」の処理）について説明する。本ステップはユーザがアドレスプロファイル取得指示のオプションを付加したコンパイルコマンドを指示することにより、コンパイラを起動する。ステップＳ２０１（図３参照）の構文解析の後、ステップＳ２０２のアドレスプロファイルの取得指示に従い（ステップＳ２０２でＹｅｓ）、境界制約付きアクセス用アドレス取得コードを生成し（図１のステップＳ１０１参照）、ステップＳ２０３でそのアドレス取得コードの挿入の処理を図４に従い行う。
【００６６】
ステップＳ３０１で、未処理のループとしてループ１を処理対象に取り出し（ステップＳ３０１でＹｅｓ）、ステップＳ３０２でＳＩＭＤ最適化の適用条件を判定する。イタレーション間の依存がないこと、各配列参照が４バイト毎の連続参照で一括ロード・ストア命令を利用できること、加算の一括演算が利用できることから、本ループをＳＩＭＤ最適化の対象のループであると判定する（ステップＳ３０２でＹｅｓ）。
【００６７】
ステップＳ３０３で、ループ内の一括ロード・ストア命令の対象であるa[i]、b[i+2]、c[i]を求める。
【００６８】
ステップＳ３０４で、未処理の対象データとして、最初に参照b[i+2]を取り出し（ステップＳ３０４でＹｅｓ）、ステップＳ３０５で、ループ初回アドレスのアドレス境界がコンパイル時に決まるかどうか判定する。ループ制御変数iの初期値は０であるので、b[i+2]の初回参照はb[2]である。配列bの先頭アドレスは仮引数で不明のため、b[2]のアドレスの境界条件も不明であるから（ステップＳ３０５でＮｏ）、ステップＳ３０６へ進む。
【００６９】
ステップＳ３０６では、ループ１の初回アドレスであるb[2]のアドレスを出力するコードを生成し、そのコードをループ１の直前に挿入する。
【００７０】
ステップＳ３０４に戻り、未処理の対象データとして、次にc[i]を取り出し、その処理を行い、同様の処理（ステップＳ３０５およびステップＳ３０６）により、c[i]の初回参照c[0]のアドレスを出力するコードを生成し、そのコードをループ１の直前に挿入する。さらに、ステップＳ３０４に戻り、a[i]について同様の処理を行い（ステップＳ３０５およびステップＳ３０６）、a[0]のアドレスを出力するコードを生成し、そのコードをループ１の直前に挿入する。
【００７１】
上記ステップＳ２０３（図３参照）のアドレス取得コードの挿入の処理により生成されたコードを、ソースプログラムイメージで記述したものを図９に示す。アドレス取得コード９０１として、ループ１の直前に３個の出力文「fprintf」を挿入している。また、出力先のファイルを「AddrProfFile」という名前で示している。本ファイルはアドレスプロファイルデータ１０６を格納するファイルを示す。各出力文「fprintf」は、ループを（ループ１として）識別するための「LOOP1, 」と、参照を（a[0]、b[2]、c[0]として）識別するためにそれぞれ「b[2],」、「c[0],」、「a[0],」を出力した後、実行時に実際に参照したアドレス「0x%x\n」を「&a[0]、&b[2]、&c[0]」として出力することを意味している。
【００７２】
ステップＳ２０３（図３参照）を含むコンパイル処理（コンパイル１の処理（図１のステップＳ１０１参照））により生成されたプロファイル取得用オブジェクトプログラム１０５を、ステップＳ１０２で実行すると、アドレスプロファイルデータ１０６が生成される。アドレスプロファイルデータ１０６の出力例を図１０に示す。各行の出力は、左から順にループ番号、配列要素、アドレスから成る。
【００７３】
次に、ステップＳ１０３（図１参照）のアドレス情報を利用した境界制約付きアクセスコード生成を行う。本ステップはユーザがアドレスプロファイル利用指示のオプションを付加したコンパイルコマンドを指示することにより、コンパイラ１０８（図１参照）を起動する。図２の処理手順に従い、アドレスプロファイル取得指示はなく（ステップＳ２０２でＮｏ）、ステップＳ２０４でアドレスプロファイル利用指示があると判定し（ステップＳ２０４でＹｅｓ）、ステップＳ２０５で境界制約付きアクセスコードの最適化を図５に従い行う。
【００７４】
ステップＳ４０１で、未処理のループとしてループ１を処理対象に取り出す（ステップＳ４０１でＹｅｓ）。次に、ステップＳ４０２において、ステップＳ３０２（図３参照）と同様の判定を行い、本ループをＳＩＭＤ最適化対象ループと判定して（図５のステップＳ４０２でＹｅｓ）、ステップＳ４０３へ進む。ステップＳ４０３では、一括ロード命令の対象である参照b[i+2]のアドレス境界がコンパイル時に不明なことを判定し（ステップＳ４０３でＹｅｓ）、ステップＳ４０４へ進む。
【００７５】
ステップＳ４０４では、図６に従い処理を行うことにより、アドレス確率情報を基に境界判定条件を生成する。図６において、まず、ステップＳ５０１では、未処理の一括ロード命令の対象である参照b[i+2]を取り出し（ステップＳ５０１でＹｅｓ）、ステップＳ５０２では、参照b[i+2]のアドレス境界がコンパイル時に決まらず、不明と判定し（ステップＳ５０２でＮｏ）、ステップＳ５０３に進む。
【００７６】
ステップＳ５０３ではプロファイル情報（アドレスプロファイルデータ１０６（図１、図１０参照））を解析し、境界制約を満たす確率を求める。例えば、図１０の出力ファイル（アドレスプロファイルデータ１０６）の例では、ループ番号が「LOOP1」の配列要素b[2]のアドレスを取り出すと、0x100a4080（１００１）, 0x100a4080（１００４）, 0x200a4088（１００７）,・・・のようになっている。本実施例では境界制約は１６バイト境界かどうか、ということであるが、最初の２個のアドレス（0x100a4080（１００１）と0x100a4080（１００４））は１６の倍数であるので境界制約を満たし、次のアドレス0x200a4088（１００７）は１６の倍数でないので境界制約を満たさない。このようにアドレスプロファイルデータ１０６内の該当アドレスを解析し、対象となるループの対象となる配列要素に関して、境界制約を満たす割合を計算する。
【００７７】
ステップＳ５０４では、境界制約を満たす割合が一定値以上かどうかを判定する。本実施例では例えば、一定値を５０％とし、境界制約を満たす割合が５０％以上の場合に確率が高いと判定するものとする。配列要素b[2]のアドレスについては、該当アドレスを解析した結果、境界制約を満たす割合が５０％以上であり、１６バイト境界を満たすケースの方が多く、確率が高いと判定し（ステップＳ５０４でＹｅｓ）、ステップＳ５０５へ進む。
【００７８】
ステップＳ５０５では、ループ１の初回である配列要素b[2]のアドレスが１６バイト境界制約を満たすための条件式を生成して、判定条件に付加する。条件式をＣ言語のソースコードイメージで表すと、「if(&b[2] % 16 == 0)」となる。ここで「&」はアドレスを表す演算子であり、「%」は剰余を表す演算子であり、本条件式はb[2]のアドレスを１６で割った剰余が０であること、即ち、アドレスが１６バイト境界であることを表す。ただ、b[2]は最初の未処理の一括ロード・ストア命令の対象であるので、b[2]に関して言えば、判定条件が付加されるという意味は、まず始めに「if(&b[2] % 16 == 0)」という判定条件が生成されたということを意味している。
【００７９】
ステップＳ５０１へ戻り、未処理の一括ロード・ストア命令の対象として、次にc[i]を処理対象とする（ステップＳ５０１でＹｅｓ）。ステップＳ５０２では、参照c[i]のアドレス境界がコンパイル時に決まらず、不明と判定し（ステップＳ５０２でＮｏ）、ステップＳ５０３に進む。
【００８０】
ステップＳ５０３において、図１０の出力ファイル（アドレスプロファイルデータ１０６）の例を再度採り上げると、ループ番号が「LOOP1」の配列要素c[0]のアドレスを取り出すと、0x100a5030（１００２）, 0x102a6080（１００５）, 0x2a7c4080（１００８）,・・・となっており、すべて１６バイト境界であり、境界制約を満たすものとなっている。そして、ステップＳ５０４では、該当アドレスを解析した結果、境界制約を満たす割合が一定値を５０％以上であり、確率が高いと判定し（ステップＳ５０４でＹｅｓ）、ステップＳ５０５へ進む。
【００８１】
ステップＳ５０５では、条件式を生成して判定条件に付加する。配列要素c[0]に関して生成される条件は、Ｃ言語のソースコードイメージで表すと、「if(&c[0] % 16 == 0)」である。ここで、判定条件の付加は論理積で行うので、配列要素b[2]に関して生成した判定条件「if(&b[2] % 16 == 0)」に付加することにより、結果的に判定条件としての条件式は「if((&b[2] % 16 == 0) && (&c[0] % 16 == 0))」となる。ここで「&&」は論理積を表す演算子である。
【００８２】
ステップＳ５０１へ戻り、未処理の一括ロード・ストア命令の対象として、次にa[i]を処理対象とする（ステップＳ５０１でＹｅｓ）。ステップＳ５０２では、参照a[i]のアドレス境界がコンパイル時に決まらず、不明と判定し（ステップＳ５０２でＮｏ）、ステップＳ５０３に進む。
【００８３】
ステップＳ５０３において、図１０の出力ファイル（アドレスプロファイルデータ１０６）の例を再度採り上げると、ループ番号が「LOOP1」の配列要素a[0]のアドレスを取り出すと、0x107c3024（１００３）, 0x10054038（１００６）, 0x4124fcd0（１００９）,・・・となっている。最初の２個のアドレス（0x107c3024（１００３）と0x10054038（１００６））は１６の倍数でないので境界制約を満たさず、次のアドレス0x4124fcd0（１００９）は１６の倍数であるので境界制約を満たす。結果的に、ループ番号が「LOOP1」の配列要素a[0]に関しては、１６バイトの倍数でない場合の方が多い。そして、ステップＳ５０４では、配列要素a[0]については、該当アドレスを解析した結果、境界制約を満たす割合が５０％未満であり、境界制約を満たす確率は高くないと判定し（ステップＳ５０４でＮｏ）、ステップＳ５０１へ戻る。配列要素a[0]に関しては、判定条件に付加される条件式が生成されることはない（ステップＳ５０５参照）。
【００８４】
ステップＳ５０１へ戻った後、すべての一括ロード・ストア対象が処理済みであるので（ステップＳ５０１でＮｏ）、処理を終了し、アドレス確率情報を基に境界判定条件（つまり、条件式：「if((&b[2] % 16 == 0) && (&c[0] % 16 == 0))」）が生成されたことになる（ステップＳ４０４（図５参照））。その後、ステップＳ４０５に進む。
【００８５】
ステップＳ４０５では、ループ１を複写し、ステップＳ４０４で生成した条件式「if((&b[2] % 16 == 0) && (&c[0] % 16 == 0))」のthen側（条件の成立時）とelse側（条件の非成立時）にそれぞれループ（ループ１）を配置することにより、当該条件式でthen側ループ１とelse側のループ１を囲む。
【００８６】
ステップＳ４０６では、図７に従った処理を行うことによりＳＩＭＤ変換処理を行い、境界を判定して、一括ロード・ストア命令に対し、アラインまたは非アラインを設定する。図７において、まず、ステップＳ６０１でthen側のループ（ループ１）を取り出して処理対象とし、ステップＳ６０２でＳＩＭＤ用にループ（ループ１）を４倍展開する。次に、ステップＳ６０３でループ内の実行文（つまり、「a[i]=b[i+2]+c[i]」）をＳＩＭＤ変換する。ＳＩＭＤ変換後の実行文は、「a[i:i+3]=b[i+2:i+5]+c[i:i+3]」となる。ここでa[i:i+3]などは配列要素４個の一括参照を表す。また加算「+」は４要素の一括加算する演算を表す。
【００８７】
次に、ステップＳ６０４では、未処理の一括ロード・ストア命令があるので（ステップＳ６０４でＹｅｓ）、一括ロード命令の対象となる一括参照b[i+2:i+5]を処理対象に選択して、ステップＳ６０５に進む。
【００８８】
ステップＳ６０５では、一括参照b[i+2:i+5]のアドレス境界がコンパイル時に決まらない（参照b[i+2]のアドレス境界が不明である（図６のステップＳ５０２参照）ので、一括参照b[i+2:i+5]のアドレス境界も不明である。と判定して（ステップＳ６０５でＮｏ）、ステップＳ６０７に進む。ステップＳ６０７では、処理対象のループがthen側ループであるので（ステップＳ６０７でＹｅｓ）、ステップＳ６０８へ進む。
【００８９】
ステップＳ６０８において、条件式（ステップＳ４０４（図５参照）で生成したもの）に処理中の一括参照の初回参照のアドレスの条件があるかどうか判定する。一括参照b[i+2:i+5]の初回参照は、制御変数iの初期値が０であるので、b[2:5]となる。よって、ステップＳ６０８では、この初回参照b[2:5]の先頭要素であるb[2]のアドレスが条件式中にあるかどうかを調べる。すると、ステップＳ４０４（図５参照）で生成した条件式「if((&b[2] % 16 == 0) && (&c[0] % 16 == 0))」中にb[2]のアドレスが１６バイト境界を満たすという条件が含まれている（ステップＳ６０８でＹｅｓ）。このため、ステップＳ６０９へ進み、一括参照b[i+2:i+5]にアライン命令の印をつけるように設定する。設定した後は、ステップＳ６０４に戻る。
【００９０】
ステップＳ６０４に戻ると、まだ未処理の一括ロード・ストア命令があるので（ステップＳ６０４でＹｅｓ）、一括ロード命令の対象となる一括参照c[i:i+3]を処理対象に選択する。一括参照c[i:i+3]は、アドレス境界がコンパイル時に決まらず（ステップＳ６０５でＮｏ）、処理対象のループがthen側ループであり（ステップＳ６０７でＹｅｓ）、ステップＳ４０４（図５参照）で生成した条件式「if((&b[2] % 16 == 0) && (&c[0] % 16 == 0))」中に、初回参照c[0:3]の先頭要素c[0]のアドレスが１６バイト境界を満たすという条件が含まれている（ステップＳ６０８でＹｅｓ）。よって、一括参照c[i:i+3]についてもb[i+2:i+5]と同様の処理によりアライン命令の印をつけるように設定する（ステップＳ６０９）。
【００９１】
さらに、ステップＳ６０４に戻ると、まだ未処理の一括ロード・ストア命令があるので（ステップＳ６０４でＹｅｓ）、一括ストア命令の対象となる一括参照a[i:i+3]を処理対象に選択する。一括参照a[i:i+3]は、アドレス境界がコンパイル時に決まらず（ステップＳ６０５でＮｏ）、処理対象のループがthen側ループであるが（ステップＳ６０７でＹｅｓ）、ステップＳ４０４（図５参照）で生成した条件式「if((&b[2] % 16 == 0) && (&c[0] % 16 == 0))」中に、一括参照a[i:i+3]に関する条件が含まれていない（ステップＳ６０８でＮｏ）。よって、一括参照a[i:i+3]については、非アライン命令の印をつけるように設定する（ステップＳ６１０）。その設定後、ステップＳ６０４に戻る。
【００９２】
さて、ステップＳ６０４において、then側ループの一括ロード・ストアの処理がすべて終了したので（ステップＳ６０４でＮｏ）、ステップＳ６１１に進む。ステップＳ６１１において、境界判定において取り出されているループ（ループ１）はthen側ループであるので（ステップＳ６１１でＹｅｓ）、ステップＳ６１２に進み、else側のループ（ループ１）を取り出し、ステップＳ６０２へ戻る。そして、ステップＳ６０２において、else側のループに対してもthen側ループの場合と同様にＳＩＭＤ変換を行う（ステップＳ６０３）。
【００９３】
その後、ステップＳ６０４に進み、一括参照b[i+2:i+5], c[i:i+3], a[i:i+3]のそれぞれに対し、アライン命令の印をつけるか非アライン命令の印つけるかの設定が行われることになる（ステップＳ６０５〜ステップＳ６１０）。しかし、この設定の処理は、else側のループの処理であるので、一括参照b[i+2:i+5], c[i:i+3], a[i:i+3]のそれぞれについて、ステップＳ６０７においてステップＳ６１０に進み（ステップＳ６０７でＮｏ）、非アライン命令の印をつける設定を行う。
【００９４】
その後、ステップＳ６０４に戻り、else側ループの一括ロード・ストアの処理がすべて終了したので（ステップＳ６０４でＮｏ）、ステップＳ６１１に進み、ステップＳ６１１においては、else側のループであるため、そのまま終了する（ステップＳ６１１でＮｏ）。
これにより、図５においてステップＳ４０６の処理が終了し、ステップＳ４０１に戻り、未処理のループがあれば（ステップＳ４０１でＹｅｓ）、そのループにおいて、アライン命令または非アライン命令を設定する。すべてのループについて処理が行われたのであれば、そのまま終了する（ステップＳ４０１でＮｏ）。これにより、図３においてステップＳ２０５の処理が終了し、ステップＳ２０６に進む。
【００９５】
一括ロード・ストア命令に設定したアライン命令または非アライン命令の情報により、ステップＳ２０６のレジスタ割付け、および、ステップＳ２０７のコード生成において、適切な命令選択を行うことができる。
【００９６】
以上で説明した処理による、境界制約付きアクセスコード生成処理を適用した場合におけるループ１の変換後のコードをソースイメージで表したものを、図１１に示す。図１１において、境界判定条件（図５のステップＳ４０４参照）としての条件式１１０１を判定するif文のthen側のループ１１０２は、配列bとcに対するアライン命令を利用したコードを実行し、else側のループ１１０３では非アライン命令を利用する。
【００９７】
以上で述べた実施例では、各対象データ（配列）の個々の境界確率に基づいたif文を生成し、then側とelse側の２通りのコードを生成する方法を説明した。しかし、本発明を適用する他の方法として、ループ内の対象データが境界を満たすかどうかの組合せ毎に確率を計算し、高確率のケースを選択するコード生成を行うことも可能である。
【００９８】
例えば、LOOP1では、a, b, cの３個のデータが境界条件を満たすかどうかの組合せにより、８通りの場合分けが存在する。図１０のアドレスプロファイルデータ１０６（図１参照）最初の３行のデータは、bがアライン、cがアライン、aが非アラインでのケースに該当するというように、各ケースの頻度をアドレスプロファイルデータ１０６から求め、コード生成２０７（図３参照）における場合分けの上限をｎ個とする場合、高確率の順にｎ−１個のケースを選択し、それ以外(else)のケース１個を合わせた合計ｎ通りのコード生成を行うことができる。
【００９９】
５．まとめ
本実施形態では、境界条件のアドレス確率情報を収集することにより、各配列の境界条件を高確率で満たす場合に対して適切にアライン命令を使用する多バージョンコードを生成するにあたり、境界条件の不明な配列参照に対してプロファイル取得用のプログラムを実行時にアドレスを出力するコードを生成し（図１のステップＳ１０１）、そのプログラム１０５を実行することによりアドレス情報のプロファイルデータ１０６を収集した後、アドレス情報を利用した境界制約付きアクセスコード生成を行う（図１のステップＳ１０３）。境界制約付きアクセスコード生成では、高確率で境界制約を満たすデータを取り出し、取り出したデータが境界制約を満たすことを実行時に判定する条件文を生成し、条件の成立時にアライン命令を実行するコードを生成する。
【０１００】
これにより、境界制約が不明な複数のデータに対して実行時に境界判定を行う多バージョンコードを生成してアライン命令を使用する方法において、実際に境界制約を満たす確率の高いデータに対してのみアライン命令を適用するコード生成が可能となり、複数データの条件による場合分け数の増大によるコード量の増加を抑止しつつ、高い確率でアライン命令を利用することでコードの実行性能向上を図ることができる。
【０１０１】
なお、上記形態は本発明を実施するための最良のものであるが、これに限定するものではない。したがって、本発明の要旨を変更しない範囲において、本実施形態の実施形式を種々変形することが可能である。
【０１０２】
例えば、本発明のコード生成方法は、メモリアクセス命令をロード命令及びストア命令に限定した、いわゆるＲＩＳＣ(Reduced Instruction Set Computer)アーキテクチャだけではなく、ＣＩＳＣ(Complex Instruction Set Computer)アーキテクチャにおいても使用することが可能である。
【産業上の利用可能性】
【０１０３】
本発明のコード生成方法は、境界制約条件付きロードまたはストア命令を備えたターゲットマシンに対するコード生成を行うコンパイラにおいて利用することができる。
【図面の簡単な説明】
【０１０４】
【図１】本実施形態の計算機システムにおけるアドレスプロファイル情報を用いた境界制約付きアクセスコード生成の処理手順の一例を図示したものである。
【図２】本実施形態の計算機システムの構成について図示したものである。
【図３】本実施形態によるコンパイラの処理手順の一例を図示したものである。
【図４】ステップＳ２０３における、アドレス取得コード挿入処理の処理手順の詳細を図示したものである。
【図５】ステップＳ２０５における、境界制約付きアクセスコード最適化の処理手順を図示したものである。
【図６】ステップＳ４０４における、アドレス確率情報を基に境界判定条件の生成手順について図示したものである。
【図７】一括ロード・ストアのアラインまたは非アラインを設定する処理手順について図示したものである。
【図８】具体例として採り上げたソースプログラムの例である。
【図９】図８のソースプログラムに対して、アドレス取得コードを挿入した後のコードを、ソースプログラムイメージで記述したものである。
【図１０】アドレスプロファイルデータ１０６の出力例である。
【図１１】図８のソースプログラムに対して、本発明の境界制約付きアクセスコード生成処理を適用した場合におけるループ１の変換後のコードをソースイメージで表したものである。
【図１２】従来技術による一括ロード・ストア命令を利用するための変換例を図示したものであり、（ａ）はループを示したソースプログラムの例であり、（ｂ）は一括ロード・ストア命令を使用する変換の例であり、（ｃ）は、一括アクセス命令のための多バージョンコードの例を図示したものである。
【符号の説明】
【０１０５】
１０４      ソースプログラム
１０５      プロファイル取得用オブジェクトプログラム
１０６      アドレスプロファイルデータ
１０７      オブジェクトプログラム
２０４      主記憶装置
２０５      外部記憶装置
【図１】
2008293169.tif 000003
【図２】
2008293169.tif 000004
【図３】
2008293169.tif 000005
【図４】
2008293169.tif 000006
【図５】
2008293169.tif 000007
【図６】
2008293169.tif 000008
【図７】
2008293169.tif 000009
【図８】
2008293169.tif 000010
【図９】
2008293169.tif 000011
【図１０】
2008293169.tif 000012
【図１１】
2008293169.tif 000013
【図１２】
2008293169.tif 000014