(57)【要約】      （修正有）【課題】ＲＩＳＣプロセッサにおける定数ロードのオーバーヘッドを削減する技術を提供する。【解決手段】オーバヘッド削減システムは、コンパイル単位のコード領域内で使用される定数に基づいて、１以上の定数レジスタに格納すべき複数の定数の候補を作成し（Ｓ３０２）、定数の候補各々について、該定数の候補を用いてコード領域内で使用される定数を生成することによるオーバーヘッド削減の効果を見積もり（Ｓ３０４）、見積もり結果に基づき、定数レジスタにロードするベースとなる定数を決定し（Ｓ３０６）、コード領域の入り口において定数レジスタにベースとなる定数をロードし、及び、定数レジスタの値を用いてコード領域内で使用される定数を生成するコードを生成する（Ｓ３０８）。【選択図】図３
2015049832.tif 000002
【特許請求の範囲】
【請求項１】
コンピュータの演算処理によって定数ロードのオーバーヘッドを削減する方法であって
(a) 前記コンピュータが、１以上の定数ロード用のレジスタ（以下、「定数レジスタ」という）を用意するステップと、
(b) 前記コンピュータが、コンパイル単位のコード領域内で使用される定数に基づいて、１以上の前記定数レジスタに格納すべき複数の定数の候補を作成するステップと、
(c) 前記コンピュータが、前記複数の定数の候補各々について、該定数の候補を用いて前記コード領域内で使用される定数を生成することによる前記オーバーヘッド削減の効果を見積もるステップと、
(d) 前記コンピュータが、前記複数の定数の候補各々について見積もった効果に基づき、１以上の前記定数レジスタにロードするベースとなる定数を決定するステップと、
(e) 前記コンピュータが、前記コード領域に対し、前記コード領域の入り口において１以上の前記定数レジスタに前記ベースとなる定数をロードし、及び、前記定数レジスタの値を用いて前記コード領域内で使用される定数を生成するコードを生成するステップと、
を含む方法。
【請求項２】
前記複数の定数の候補は、前記コード領域内で使用される定数をもとに新たに作成される定数を含む、請求項１に記載の方法。
【請求項３】
前記複数の定数の候補は、前記コード領域内で使用される各定数と、該定数に所定の値Ｖ１及びＶ２（Ｖ２＞Ｖ１）をそれぞれ足した第１の値及び第２の値と、各定数、前記第１の値及び前記第２の値それぞれの下位ｎ（ｎは正の整数）ビットを０にした第３の値とを含む、請求項２に記載の方法。
【請求項４】
前記ステップ(b)は、前記コンピュータが、最少の命令数で生成することのできる定数を前記複数の定数の候補から除外するステップを更に含む、請求項３に記載の方法。
【請求項５】
前記ステップ(b)は、前記コンピュータが、値0を前記複数の定数の候補に含めるステップを更に含む、請求項４に記載の方法。
【請求項６】
ステップ(c)は、前記コンピュータが、前記コード領域内で使用される各定数について使用回数をカウントするステップと、各定数の候補について前記効果を示すスコアを算出するステップとを含み、各定数の候補について前記スコアを算出するステップは、該定数の候補を使用して前記コード領域内で使用される定数を生成することにより削減できる命令数を、カウントした前記使用回数を用いて算出するステップを含む、請求項２に記載の方法。
【請求項７】
各定数の前記使用回数は、該定数が前記コード領域内の何箇所で使用されているかを示す回数である、請求項６に記載の方法。
【請求項８】
各定数の前記使用回数は、前記コード領域の実行中に前記定数がロードされる回数である、請求項６に記載の方法。
【請求項９】
前記コンピュータは、前記方法を、コンパイル処理における最適化処理後に実行する、請求項１に記載の方法。
【請求項１０】
ステップ(d)は、前記コンピュータが、前記複数の定数の候補から、前記見積もった前記効果が所定の閾値を超えることを条件に、前記効果の大きい順に前記定数レジスタの数だけ取り出し、前記ベースとなる定数として決定するステップを含む、請求項１に記載の方法。
【請求項１１】
前記コンパイル単位がメソッドであり、第１のメソッドが第２のメソッドを呼び出す場合に、前記第１のメソッドにおいて使用される定数と前記第２のメソッドにおいて使用される定数とそれぞれについてステップ(b)及び(c)を実行して見積もった効果を第１効果とするステップと、前記第１のメソッド及び前記第２のメソッドにおいて使用される定数全てをまとめて対象としてステップ(b)及び(c)を実行して見積もった効果を第２効果とするステップとを含み、前記ステップ(d)は、前記第２効果が前記第１効果よりも大きいことを条件に、第２効果に基づき前記ベースとなる定数を決定し、前記ステップ(e)では、前記第１のメソッドの入り口において１以上の前記定数レジスタに前記ベースとなる定数をロードするコードを生成し、前記前記第２のメソッドの入り口では前記定数レジスタの値をそのままとするステップを含む、請求項１に記載に方法。
【請求項１２】
請求項１乃至１１のいずれかに一項に記載の方法の各ステップを前記コンピュータに実行させる、定数ロードのオーバーヘッドを削減するプログラム。
【請求項１３】
請求項１乃至１１のいずれかに一項に記載の方法の各ステップを実行するように適合された手段を備える、定数ロードのオーバーヘッドを削減するシステム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、ＲＩＳＣプロセッサにおける定数ロードのオーバーヘッドを削減する技術に関する。
【背景技術】
【０００２】
命令長が可変であるＣＩＳＣプロセッサと異なり、ＲＩＣＳプロセッサでは命令サイズが固定であるため、長い定数をレジスタにロードするためには複数の命令が必要となる。例えば、ＩＢＭ社が提供するＲＩＳＣプロセッサのＰＯＷＥＲ（登録商標）では、３２ビット定数0x12345678のロードを次のように２つの命令を組み合わせて実現する。
lis reg,0x1234
ori reg,reg,0x5678 
１行目の命令lisにより定数0x1234を１６ビット左にシフトした値がレジスタregに格納される。これにより、３２ビット定数0x12345678の上半分の桁がレジスタregの上位１６ビットに設定される。次に２行目の命令oriにより、レジスタregと定数0x5678との論理和がレジスタregに上書きされる。これにより、３２ビットの定数0x 12345678の下半分の桁がレジスタregの下位１６ビットに設定される。結果、レジスタregに３２ビット定数0x 12345678がロードされることになる。
【０００３】
しかしながら、複数の命令を組み合わせるやり方では命令数が増えるため実行コストが掛かり、また、命令キャッシュのプレッシャーも高くなる。そこで６４ビット定数では、主に次のやり方でロードが実現されている。まず、コンパイル時において定数を並べたメモリ領域（Ｔａｂｌｅ  ｏｆ  Ｃｏｎｔｅｎｓ：ＴＯＣ）を作成する。そして、ＴＯＣを指すポインタを保持するために１のレジスタ（以下、ＴＯＣレジスタという）を割り当てておく。定数を使用する際には、ＴＯＣレジスタを使用してメモリからのロードを行う。このやり方によれば定数ロードのための命令数は減る。しかし定数ロードのためにデータキャッシュのプレッシャーを高めてしまうという新たな問題も生じる。
【０００４】
一方、特許文献１は、定数レジスタに蓄積された定数を一度使用すると、次にその定数と全く同じ値や一部しか異ならない値を蓄積する場合でも、一から定数レジスタのすべてのビットを蓄積する必要があり、実行サイクル数が増大することを課題として、定数レジスタに格納されている定数を繰り返し読み出し、その定数の少なくとも一部をオペランドとするオペレーションを実行する構成、及び、定数レジスタに格納されている定数の一部を残したまま他の部分と新たな定数とを置換して格納する構成を開示する。
【０００５】
しかしながら、定数レジスタに蓄積され一度使用された定数が、次に使用される定数と全部または一部において一致するとは限らない。そのため、特許文献１に開示される構成では、プログラムにおいて使用される定数とその定数の使用順序に依存して定数レジスタの値の再利用が行われるため、再利用が十分になされない可能性も高く、その場合には実行サイクル数や命令コードサイズの低減を図ることができない。
【先行技術文献】
【特許文献】
【０００６】
【特許文献１】特開平１１−５３１８７号公報
【発明の概要】
【発明が解決しようとする課題】
【０００７】
この発明は、上記の問題点を解決するためなされたものであって、ＴＯＣのようなデータアクセスの増加を起こすことなく、定数ロード用の専用のレジスタ値の積極的な再利用により定数ロードの命令数を削減できるような技術を提供することを目的とする。
【課題を解決するための手段】
【０００８】
上記目的を達成する本発明は、コンピュータの演算処理によって定数ロードのオーバーヘッドを削減する方法により実現される。そのような定数ロードのオーバーヘッド削減方法は、(a) 前記コンピュータが、１以上の定数ロード用のレジスタ（以下、「定数レジスタ」という）を用意するステップと、 (b) 前記コンピュータが、コンパイル単位のコード領域内で使用される定数に基づいて、１以上の前記定数レジスタに格納すべき複数の定数の候補を作成するステップと、(c) 前記コンピュータが、前記複数の定数の候補各々について、該定数の候補を用いて前記コード領域内で使用される定数を生成することによる前記オーバーヘッド削減の効果を見積もるステップと、 (d) 前記コンピュータが、前記複数の定数の候補各々について見積もった効果に基づき、１以上の前記定数レジスタにロードするベースとなる定数を決定するステップと、(e) 前記コンピュータが、前記コード領域に対し、前記コード領域の入り口において１以上の前記定数レジスタに前記ベースとなる定数をロードし、及び、前記定数レジスタの値を用いて前記コード領域内で使用される定数を生成するコードを生成するステップと、を含む。
【０００９】
好ましくは、前記複数の定数の候補は、前記コード領域内で使用される定数をもとに新たに作成される定数を含む。
【００１０】
また好ましくは、前記複数の定数の候補は、前記コード領域内で使用される各定数と、該定数に所定の値Ｖ１及びＶ２（Ｖ２＞Ｖ１）をそれぞれ足した第１の値及び第２の値と、各定数、前記第１の値及び前記第２の値それぞれの下位ｎ（ｎは正の整数）ビットを0にした第３の値とを含む。
【００１１】
また好ましくは、前記ステップ(b)は、前記コンピュータが、最少の命令数で生成することのできる定数を前記複数の定数の候補から除外するステップを含む。
【００１２】
また好ましくは、前記ステップ(b)は、前記コンピュータが、値0を前記複数の定数の候補に含めるステップを含む。
【００１３】
また好ましくは、ステップ(c)は、前記コンピュータが、前記コード領域内で使用される各定数について使用回数をカウントするステップと、各定数の候補について前記効果を示すスコアを算出するステップとを含み、各定数の候補について前記スコアを算出するステップは、該定数の候補を使用して前記コード領域内で使用される定数を生成することにより削減できる命令数を、カウントした前記使用回数を用いて算出するステップを含む。
【００１４】
また好ましくは、各定数の前記使用回数は、該定数が前記コード領域の何箇所で使用されるかを示す回数である。
【００１５】
これに代えて、各定数の前記使用回数は、前記コード領域の実行中に前記定数がロードされた回数であってもよい。
【００１６】
また好ましくは、前記コンピュータは、定数ロードのオーバーヘッドを削減する方法を、コンパイル処理における最適化処理後に実行する。
【００１７】
また好ましくは、ステップ(d)は、前記コンピュータが、前記複数の定数の候補から、前記見積もった前記効果が所定の閾値を超えることを条件に、前記効果の大きい順に前記定数レジスタの数だけ取り出し、前記ベースとなる定数として決定するステップを含む。
【００１８】
また好ましくは、前記コンパイル単位がメソッドであり、第１のメソッドが第２のメソッドを呼び出す場合に、前記第１のメソッドにおいて使用される定数と前記第２のメソッドにおいて使用される定数とそれぞれについてステップ(b)及び(c)を実行して見積もった効果を第１効果とするステップと、前記第１のメソッド及び前記第２のメソッドにおいて使用される定数全てをまとめて対象としてステップ(b)及び(c)を実行して見積もった効果を第２効果とするステップとを更に含む。そして、前記ステップ(d)は、前記第２効果が前記第１効果よりも大きいことを条件に、第２効果に基づき前記ベースとなる定数を決定し、前記ステップ(e)では、前記第１のメソッドの入り口において１以上の前記定数レジスタに前記ベースとなる定数をロードするコードを生成し、前記前記第２のメソッドの入り口では前記定数レジスタの値をそのままとする。
【００１９】
なお、これまで定数ロードのオーバーヘッドを削減する方法として本発明を説明した。しかし本発明は、これら方法をコンピュータに実行させるための定数ロードのオーバーヘッドを削減するプログラム、及び、そのようなプログラムをコンピュータにインストールすることによって実現される定数ロードのオーバーヘッド削減装置／システムとして把握することもできる。  
【発明の効果】
【００２０】
本発明によれば、定数ロードのための専用レジスタである定数レジスタが１以上用意され、定数レジスタに格納すべき定数の候補がコンパイル単位のコード領域内で使用される定数に基づいて作成される。そして各定数の候補について、該定数の候補を用いて上記コード領域内において使用される定数を生成することによる定数ロードのオーバーヘッド削減の効果が見積もられる。従って、定数レジスタには、見積もり結果に基づいて定数ロードのオーバーヘッド削減に効果的な定数を格納することが可能となり、定数レジスタに格納した定数が再利用される機会が増えるため、本発明によれば、ＴＯＣのようなデータアクセスの増加を起こすことなく、定数ロードの命令数をより高い確率で削減できるよという効果を奏することができる。本願発明のその他の効果については、各実施の形態の記載から理解される。
【図面の簡単な説明】
【００２１】
【図１】本発明の実施形態による定数ロードのオーバーヘッド削減システム２００を実現するのに好適なコンピュータ１００のハードウェア構成の一例を示す。
【図２】本発明の実施形態による定数ロードのオーバーヘッド削減システム２００の機能ブロック図である。
【図３】本発明の実施形態による定数ロードのオーバーヘッド削減処理の流れの一例を示すフローチャートある。
【図４】定数レジスタにロードすべき定数の候補作成処理の流れの一例を示すフローチャートである。
【図５Ａ】定数ロードのオーバーヘッド削減効果の見積もり処理の流れの一例を示すフローチャートである。
【図５Ｂ】定数の候補を使用して１命令で生成できる定数の識別処理の流れの一例を示すフローチャートである。
【図６Ａ】トレースベースのJust-In-Time(JIT)コンパイラに本発明と従来手法とを適用して得られたパフォーマンスについての比較実験結果を示す図である。
【図６Ｂ】トレースベースのJITコンパイラに本発明と従来手法とを適用して得られたコードサイズについての比較実験結果を示す図である。
【発明を実施するための形態】
【００２２】
以下、本発明の実施形態を図面に基づいて詳細に説明するが、以下の実施形態は特許請求の範囲にかかる発明を限定するものではなく、また実施形態の中で説明されている特徴の組み合わせの全てが発明の解決手段に必須であるとは限らない。なお、実施の形態の説明の全体を通じて同じ要素には同じ番号を付している。
【００２３】
図１は、本発明を実施するのに好適なコンピュータ・システム１００のハードウェア構成の一例を示す。コンピュータ・システム１００は、バス１０６に接続されたメインＣＰＵ（中央処理装置）１０２とメイン・メモリ１０４を含んでいる。ＣＰＵ１０２は好ましくは、３２ビット又は６４ビットのアーキテクチャに基づくものであり、例えば、ＩＢＭ社のＰＯＷＥＲ（登録商標）プロセッサやＳｕｎ  Ｍｉｃｒｏｓｙｓｔｅｍｓ社（現Ｏｒａｃｌｅ社）のＳＰＡＲＣプロセッサ等、ＲＩＳＣプロセッサが対象となる。メイン・メモリ１０４は好ましくは、1GB以上の容量、より好ましくは、2GB以上の容量をもつものであってよい。
【００２４】
バス１０６には、ディスプレイ・コントローラ１０８を介して、ディスプレイ１１０、例えば液晶ディスプレイ（ＬＣＤ）が接続されうる。ディスプレイ１１０は、コンピュータの管理のために、通信回線を介してネットワークに接続されたコンピュータについての情報と、そのコンピュータ上で動作中のソフトウェアについての情報を、適当なグラフィック・インタフェースで表示するために使用される。
【００２５】
バス１０６にはまた、ＳＡＴＡ又はＩＤＥコントローラ１１２を介して、ディスク１１４、例えばシリコン・ディスク又はハードディスクが接続されうる。バス１０６にはまた、ＳＡＴＡ又はＩＤＥコントローラ１１２を介して、任意的に、ドライブ１１６、例えばＣＤ、ＤＶＤまたはＢＤドライブが接続されうる。バス１０６にはさらに、任意的に、キーボード・マウスコントローラ１１８又はＵＳＢバス（図示せず）を介して、キーボード１２０及びマウス１２２が接続されうるが、本発明を実施する上では必要ない。    
【００２６】
ディスク１１４には、例えば、ＩＢＭ社が提供するＡＩＸ（登録商標）やＳｕｎ  Ｍｉｃｒｏｓｙｓｔｅｍｓ社（現Ｏｒａｃｌｅ社）が提供するＳｏｌａｒｉｓ（商標）など等のオペレーティング・システムが、メイン・メモリ１０４にロード可能なように記憶されている。
【００２７】
上記ディスク１１４にはまた、オペレーティング・システムと協働してＣＰＵ１０２に命令を与え、本発明を実施するためのコンピュータ・プログラムを記録することができる。即ち、上記ディスク１１４には、コンピュータ・システム１００にインストールされ、コンピュータ・システム１００を本発明の実施形態による定数ロードのオーバーヘッド削減装置／システムとして機能させる定数ロードのオーバーヘッド削減プログラム、及びそれら関連データを記録することができる。
【００２８】
上記定数ロードのオーバーヘッド削減プログラムは、レジスタ割り当てモジュールと、定数候補作成モジュールと、見積もりモジュールと、ベース定数決定モジュールと、コード生成モジュールとを含む。これらモジュールは、ＣＰＵ１０２に働きかけて、コンピュータ・システム１００を、各々後述するレジスタ割り当て部２０２と、定数候補作成部２０４と、見積もり部２０６と、ベース定数決定部２０８と、コード生成部２１０としてそれぞれ機能させる。なお本発明は、動的であるか、静的であるかを問わず、コンパイラの機能の一部として実装可能である。
【００２９】
上記コンピュータ・プログラムは圧縮し、また複数に分割して複数の媒体に記録することもできる。ドライブ１１６は、必要に応じて、ＣＤ−ＲＯＭ、ＤＶＤ−ＲＯＭまたはＢＤからプログラムをディスク１１４にインストールするために使用されうる。
【００３０】
通信インタフェース１２６は、例えばイーサネット（登録商標）・プロトコルに従う。通信インタフェース１２６は、通信コントローラ１２４を介してバス１０６に接続され、コンピュータ・システム１００を通信回線１２８に物理的に接続する役割を担い、コンピュータ・システム１００のオペレーティング・システムの通信機能のＴＣＰ／ＩＰ通信プロトコルに対して、ネットワーク・インタフェース層を提供する。なお、通信回線は、有線ＬＡＮ環境に基づくもの、又は、無線ＬＡＮ環境、例えば、ＩＥＥＥ８０２．１１ａ／ｂ／ｇ／ｎなどのＷｉ−Ｆｉ規格に基づくものであってもよい。
【００３１】
以上から、本発明の実施態様において使用されるコンピュータ・システム１００は、通常のパーソナルコンピュータ、ワークステーション、メインフレームなどの情報処理装置、又は、これらの組み合わせによって実現されることが容易に理解されるであろう。なお、上記説明した構成要素は例示であり、そのすべての構成要素が本発明の必須構成要素となるわけではない。
【００３２】
図２は、本発明の実施形態による定数ロードのオーバーヘッド削減システム２００の機能ブロック図である。定数ロードのオーバーヘッド削減システム２００は、レジスタ割り当て部２０２と、ベース定数決定部２０８と、コード生成部２１０とを含み、レジスタ割り当て部２０２により定数ロード専用に１つまたは複数のレジスタを割り当て、ベース定数決定部２０８によりコンパイル単位のコード領域内で使用される定数を生成するのに命令数が最少となるような値をベースとなる定数（以下、「ベース定数」ともいう）として決定し、コード生成部２１０により、ベース定数として決定された値を上記コード領域の先頭で定数ロード専用のレジスタにロードするコードを生成する。ここで、定数ロードのオーバーヘッド削減システム２００は、定数ロード専用のレジスタにロードすべき定数の候補を作成する定数候補作成部２０４と、候補ごと該候補を用いた定数生成による命令数削減の効果を見積もる見積もり部２０６とを更に含み、上記ベース定数決定部２０８は、定数候補作成部２０４により作成された定数の候補の中から、見積もり部２０６による見積もり結果を参照してベース定数を決定する。以下、構成要素ごとその機能を詳細に説明する。
【００３３】
レジスタ割り当て部２０２は、定数ロードのための専用のレジスタ、即ち定数レジスタとして１以上のレジスタを割り当てる。これにより他の用途に使用できるレジスタ数が減るが、ＲＩＳＣプロセッサではレジスタ数は多くの場合に不足しない。またレジスタ数が足りなくなるようなコンパイル単位のコード領域（例えばメソッド）に対しては、従来手法と同様の方法で定数をロードしてよい。
【００３４】
定数候補作成部２０４は、コンパイル単位のコード領域内で使用される定数に基づいて、１以上の定数レジスタに格納すべき複数の定数の候補を作成する。好ましくは、定数候補作成部２０４は、コンパイル単位のコード領域内で使用される定数を基に複数の定数の候補を新たに作成する。より具体的には、定数候補作成部２０４は、コンパイル単位のコード領域内で使用される各定数と、該定数に所定の値Ｖ１及びＶ２（Ｖ２＞Ｖ１）をそれぞれ足した第１の値及び第２の値と、各定数、第１の値及び第２の値それぞれの下位ｎ（ｎは正の整数）ビットを0にした第３の値とを、複数の定数の候補として作成する。
【００３５】
命令長が３２ビットのシステムの場合、定数の候補を使用してコード領域内の命令を生成する最少の命令数は１であり、上記Ｖ１、Ｖ２、ｎの値はそれぞれ順に、-0x7FFF、0x8000、16である。即ち、コンパイル単位をメソッドとすると、定数候補作成部２０４は、メソッド内で使用される各定数のほかに、該定数に-0x7FFF、0x8000をそれぞれ足した値と、各定数及び加算後の値の下位16ビットを0にした値とを定数の候補として新たに作成する。メソッド内で使用される各定数に-0x7FFF、0x8000(上記システムにおいて１命令で加減算が行える定数の最大範囲)をそれぞれ足した値や定数の候補の下位１６ビットを0にした値を定数の候補に加えることにより、以下の例のようにメソッド内で使用される定数を直接選択する場合よりも大きな効果が得られる可能性がある。
【００３６】
例えばメソッド内で使用される定数が0x12341234と0x12350000であったとする。すると、0x12341234は、0x12350000から１命令で生成することはできないが、0x12341234に0x8000を足した値0x12349234を定数レジスタに格納するベース定数とすれば、0x12341234（＝0x12349234-0x8000）と、0x12350000(=0x12349234+6DCC)のどちらの定数もベース定数から１命令で生成できる。このように、メソッド内で使用される定数だけではなく、メソッド内で使用される定数に基づいて新たに作成される定数をも候補に加えることで、再利用率が高く定数ロードのオーバーヘッド削減に効果的な定数を定数レジスタに格納できる可能性が高まる。  
【００３７】
また、定数候補作成部２０４は、最少の命令数で生成することのできる定数を定数の候補から除外する。例えば命令長が３２ビットのシステムの場合、１６ビットの定数は最少の命令数、即ち、１命令で表すことができるため、定数の候補から外す。但し、非常に高い頻度で使用されるもの（例えば値1、-1などは頻繁に使用される可能性がある）については、１命令で生成できる定数であったとしても、定数レジスタに保持することで命令数の削減が可能になる場合がある。従って、好ましくは、定数候補作成部２０４は、最少の命令数で生成することができ、かつ、高頻度では使用されない定数を複数の定数の候補から除外する。
【００３８】
また、定数候補作成部２０４は、最少の命令数で生成することのできる定数を定数の候補から除外する場合において、好ましくは値0を複数の定数の候補に含める。ＲＩＳＣ命令セット一般において、汎用レジスタ（general-purpose registers: GPR）であるGPR0は多くの命令でレジスタの内容でなく定数0として扱われる。しかしストア命令については、GPR0は定数扱いとならないため、0という値をストアする毎に１つのGPRに0を生成する必要がある。そのため、頻繁に0がストアされる場合には、定数レジスタに値0を保持することで命令数の削減が可能になる。そこで、好ましくは、定数候補作成部２０４は、値0を複数の定数の候補に含める。
【００３９】
見積もり部２０６は、複数の定数の候補各々について、該定数の候補を用いてコンパイル単位のコード領域内において使用される定数を生成することによるオーバーヘッド削減の効果を見積もる。具体的には、見積もり部２０６は、コード領域内で使用される各定数についてコード領域内の使用回数をカウントし、カウントした使用回数を用いて、定数の候補ごと該定数の候補を使用してコード領域内で使用される定数を生成することにより削減できる命令数をオーバーヘッド削減の効果を示すスコアとして算出する。
【００４０】
各定数の候補の上記スコアは、0で初期化された後、以下に説明する１．及び２．の値を加算し、かつ、３．の値を減算することにより算出される。
【００４１】
１．スコア算出対象の定数の候補（以下、「対象候補」という）を使用して最少の命令数で生成できるコード領域内で使用される各定数の使用回数に、対象候補を使用することにより削減できる命令数を掛けた値の合計値。これは対象候補を使用して最少の命令数で生成される定数については、使用されるごとに、その定数を一から生成する場合と比較して所定の命令数を削減できるためである。命令長が３２ビットのシステムの場合、３２ビット定数を生成するのに削減できる所定の命令数は１である。なお、ある定数が対象候補を使用して最少の命令数で生成できるか否かの判定は、ある定数が以下に説明するいずれかのケースに該当するか否かの判定により行うことができ、いずれかのケースに該当する場合、ある定数は対象候補を使用して最少の命令数で生成できると判断する。
【００４２】
ケース１．ある定数と対象候補の上位のｎビットが一致する。ケース２．ある定数と対象候補との差が所定の値Ｖ１から所定の値Ｖ２の間の値である。ケース３．ある定数と対象候補との差の下位ｎビットが値0である。なお、命令長が３２ビットのシステムの場合、上記Ｖ１、Ｖ２、ｎの値はそれぞれ順に、-0x7FFF、0x8000、16である。
【００４３】
２．対象候補のコード領域内の使用回数に、対象候補を一から生成するのに必要な命令数を掛けた値。これは、対象候補は既に定数レジスタに保持されており生成する必要がないため、使用されるごとに、その対象候補を一から生成するのに必要な命令数を削減できるからである。３２ビット命令長のシステムの場合、３２ビット定数を一から生成するのに２命令必要であることから、２．の値は対象候補の使用回数を２倍した値となる。
【００４４】
３．対象候補を生成するのに必要な命令数。これは、対象候補をメソッド入り口で定数レジスタにロードする際に必要な命令数を差し引くためである。３２ビット命令長のシステムの場合、対象候補の下位１６ビットが0の場合には値1、対象候補の下位１６ビットが0でない場合には値2である。
【００４５】
なお、定数の候補を含めた各定数のコード領域内での使用回数は、該定数がコード領域内の何箇所で使用されているかを示す静的な使用回数であってよい。或いは、各定数の使用回数は、コードの実行中にその定数がロードされる回数、即ち静的な使用回数に実行頻度を掛けた動的な使用回数であってもよい。静的な使用回数の採用はコードサイズの削減に有効である。一方、動的な使用回数の採用は実行命令数の削減に有効である。
【００４６】
ベース定数決定部２０８は、見積もり部２０６により複数の定数の候補各々について見積もった効果に基づき、複数の定数の候補の中から１以上の定数レジスタにロードするベース定数を決定する。より具体的には、ベース定数決定部２０８は、見積もり部２０６により見積もられた効果を示すスコアが所定の閾値を超えることを条件に、複数の定数の候補をスコアの大きい順に定数レジスタの数だけ取り出し、ベースとなる定数として決定する。ここで所定の閾値は一例として0であってよい。これは、スコアが0を超えている場合には，そのスコアを持つ定数の候補を定数レジスタにロードすることで性能の向上が得られると見積もられるためである。もしくは見積もりの曖昧さからくる性能の劣化を防ぐために所定の閾値として小さな正の数を用いてもよい。
【００４７】
コード生成部２１０は、コード領域に対し、コード領域の入り口において１以上の定数レジスタにベースとなる定数をロードし、及び、定数レジスタの値を用いてコード領域内で使用される定数を生成するコードを生成する。なお、コード生成部２１０は、コード領域に対し残りのコンパイル処理を行い、コード領域全体についてコンパイル済みコードを出力するものであってもよい。なお、コンパイル処理は既知の技術であり本発明の要旨ではないので説明は省略する。
【００４８】
次に図３、図４、図５Ａ、及び図５Ｂを参照して、定数ロードのオーバーヘッド削減処理の流れを説明する。上述したように、定数ロードのオーバーヘッド削減処理はコンパイラによる処理の一部として実行され、好ましくは、コンパイラによる最適化処理後に実行される。図３は、本発明の実施形態による定数ロードのオーバーヘッド削減処理の全体の流れの一例を示すフローチャートある。図４は、定数レジスタにロードすべき定数の候補の作成処理の流れの一例を示すフローチャートである。図５Ａは、定数ロードのオーバーヘッド削減効果の見積もり処理の流れの一例を示すフローチャートである。図５Ｂは、定数の候補を使用して１命令で生成できる定数の識別処理の流れの一例を示すフローチャートである。なお、図４、図５Ａ及び図５Ｂのフローチャートは、命令長が３２ビットのシステム上で実行される場合の処理の流れを説明するものである。
【００４９】
図３に示す定数ロードのオーバーヘッド削減処理は、ステップ３００で開始し、システム２００は、１以上の定数レジスタを割り当てる。続いてシステム２００は、コンパイル単位のコード領域内で使用される定数に基づいて、１以上の定数レジスタに格納すべき複数の定数の候補を作成する（ステップ３０２）。定数の候補の作成方法の詳細は、図４を参照して後述する。続いてシステム２００は、複数の定数の候補各々について、該定数の候補を用いてコード領域内で使用される定数を生成することによるオーバーヘッド削減の効果を見積る（ステップ３０４）。見積もり処理の詳細は、図５Ａ及び図５Ｂを参照して後述する。
【００５０】
続いてシステム２００は、見積もり結果に基づいて、複数の定数の候補の中から定数レジスタにロードするべき定数の候補を決定する（ステップ３０６）。なお、見積もりの結果、効果があまり高くないと判断される場合には、定数レジスタの利用を中止してもよい。即ち、システム２００は、見積もった効果が所定の閾値を超えることを条件に、複数の定数の候補から、効果の大きい順に定数レジスタの数だけ定数の候補を取り出し、ベースとなる定数として決定してよい。続いてシステム２００は、コード領域に対し、コード領域の入り口において１以上の定数レジスタにベースとなる定数をロードし、及び、定数レジスタの値を用いてコード領域内で使用される定数を生成するコードを生成する（ステップ３０８）。そして処理は終了する。
【００５１】
図４に示す定数候補の作成処理はステップ４００で開始し、システム２００は、コンパイル対象のコード領域を読み出す。続いてシステム２００は、読み出したコード領域内から全ての定数を抽出する（ステップ４０２）。続いてシステム２００は、抽出した１以上の定数の中から、１命令で生成できる定数、即ち、１６ビットの定数を除外する（ステップ４０４）。但し、上述したように１命令で生成できる定数であっても、高頻度に使用される定数については残すようにしてもよい。
【００５２】
続いてシステム２００は、除外されることなく残った定数を、定数の候補のリストに登録する（ステップ４０６）。続いてシステムは、定数の候補のリストに登録された各定数に0x8000及び-0x7FFFを加算し、それぞれ加算した値を定数の候補のリストに追加する（ステップ４０８）。続いてシステム２００は、定数の候補のリストに登録された各定数の下位１６ビットを0に変更し、変更後のそれぞれの値を定数の候補のリストに追加する（ステップ４１０）。その後処理は終了する。
【００５３】
図５Ａに示す見積もり処理は、ステップ５００で開始し、システム２００は、コード領域内の各定数についてその使用回数をカウントする。上述したように、カウントする使用回数は、コード領域内の何箇所で使用されているかを示す静的な使用回数でよく、或いは、コードの実行中に定数がロードされる動的な使用回数であってもよい。後者の場合、動的な使用回数は、プログラム実行中に収集されるプロファイル情報を利用して取得可能である。
【００５４】
続いてシステム２００は、定数の候補のリストにまだ見積もり処理を行っていない定数の候補があるか否かを判定し（ステップ５０２）、未処理の定数の候補がある場合は（ステップ５０２：ＹＥＳ）、１の未処理の定数の候補を取り出し現在の定数の候補とする（ステップ５０４）。この際、システム２００は、現在の定数の候補のスコアを0で初期化しておく。続いてシステム２００は、現在の定数の候補を使用して１命令で生成できるコード領域内の定数を識別する（ステップ５０６）。識別処理の詳細は図５Ｂを参照して後述する。
【００５５】
続いてシステム２００は、ステップ５０６で識別した全定数の使用回数を、現在の定数の候補のスコアに加算する（ステップ５０８）。また、システム２００は、現在の定数の候補のコード領域内での使用回数を２倍した値を、現在の定数の候補のスコアに加算する（ステップ５１０）。更にシステム２００は、現在の定数の候補の下位１６ビットが0であれば上記スコアから1減算し、現在の定数の候補の下位１６ビットが0でなければ上記スコアから2を減算する（ステップ５１２）。ステップ５１２の後システム２００は処理をステップ５０２へ戻し、ステップ５０２において定数の候補のリストに未処理の定数がないと判定するまで（ステップ５０２：ＮＯ）一連の処理を繰り返す。
【００５６】
図５Ｂに示す識別処理はステップ５２０で開始し、システム２００は、コード領域内に未検討の定数が存在するか否かを判定する。未検討の定数がある場合（ステップ５２０：ＹＥＳ）、システム２００は、１の未検討の定数を読み出す（ステップ５２２）。続いてシステム２００は、現在の定数の候補と読み出した定数の上位１６ビットが一致するか否かを判定する（ステップ５２４）。一致しない場合（ステップ５２４：ＮＯ）、続いてシステム２００は、現在の定数の候補と読み出した定数の差が-0x7FFFから0x8000の間であるか否かを判定する（ステップ５２６）。差が-0x7FFFから0x8000の間にない場合（ステップ５２６：ＮＯ）、続いてシステム２００は、現在の定数の候補と読み出した定数の差の下位１６ビットが0であるか否かを判定する（ステップ５２８）。
【００５７】
現在の定数の候補と読み出した定数の差の下位１６ビットが0でない場合（ステップ５２８：ＮＯ）、システム２００は処理をステップ５２０へ戻し、コード領域内に未検討の定数がなくなるまで一連の処理を繰り返す。一方、ステップ５２４、ステップ５２６、ステップ５２８のいずれかにおいて判定結果がＹＥＳである場合、システム２００は、現在の定数を、現在の定数の候補を用いて１命令で生成できる定数としてマークする（ステップ５３０）。そしてシステム２００は処理をステップ５２０へ戻し、コード領域内に未検討の定数がなくなるまで一連の処理を繰り返す。
【００５８】
なお、上記説明では、図３のステップ３０２の定数の候補の作成処理、及びステップ３０４のオーバーヘッド削減効果の見積もり処理は、コンパイル単位のコード領域を処理対象とするものとした。しかしながら、コンパイル単位がメソッドであり、第１のメソッドが第２のメソッドを呼び出す場合、第１のメソッド及び第２メソッドを合わせた領域を処理対象としてこれらのステップを実行して効果を見積もってよい。そして見積もった効果が、第１メソッド、第２メソッドそれぞれの領域を独立した処理対象とし見積もった効果の合計と比較してより高い場合には、第１のメソッド及び第２メソッドを合わせた領域を処理対象とした場合に得られた効果に基づいて、ベースとなる定数を決定してよい。この場合、第１のメソッドの入り口において定数レジスタにロードしたベースとなる定数は、第２のメソッドの入り口においてもそのままとし変更しないものとする。
【００５９】
次に図６Ａ及び図６Ｂを参照して、本発明をトレースベースのJITコンパイラに適用した場合の性能向上とコードサイズ削減の効果を検証する。実験では、3.0GHz動作のPOWER7（登録商標）プロセッサを搭載し、オペレーティング・システムとしてAIX7.1を採用するコンピュータを使用した。図６Ａ、図６Ｂに示すグラフは、２命令を用いて定数を生成する従来技術１と、ＴＯＣを作成する従来技術２と、本発明とをそれぞれ適用した場合の性能、コードサイズを比較した実験結果である。なお、本発明を適用した場合については、４つの定数レジスタを割り当てる場合と、２つの定数レジスタを割り当てる場合の２つについて実験を行った。図６Ａにおいて、縦軸は従来技術１の性能を基準としたパフォーマンスであり、横軸はDaCapo ベンチマークスイート（Dacapo-9.12）の各プログラム名である。また、図６Ｂにおいて、縦軸は従来技術１のJITコンパイル後のコードサイズであり、横軸は図６Ａと同じくDaCapo ベンチマークスイートの各プログラム名である。
【００６０】
従来技術１と比較すると、本発明を適用することで、性能が改善され、また、コードサイズの削減も図られている。一方、従来技術２と比較した場合は、コードサイズについては従来技術２のほうが優れているが、性能については本発明のほうが優れているといえる。また、実験に使用したベンチマークでは、定数レジスタ割り当てのために使用できるレジスタ数が減ったことによる性能低下はみられなかった。なお、トレースベースのJITコンパイラでは、通常のメソッドベースのJITコンパイラよりも定数を使用する頻度が高いことから、本発明はトレースベースのJITコンパイラに特に適しているといえる。
【００６１】
以上、実施形態を用いて本願発明の説明をしたが、本願発明の技術範囲は上記実施形態に記載の範囲には限定されない。上記の実施形態に、種々の変更又は改良を加えることが可能であることが当業者に明らかである。以上のように、上記の実施形態に変更又は改良を加えた形態も当然に本発明の技術的範囲に含まれる。
【００６２】
なお、特許請求の範囲、明細書、及び図面中において示した装置、システム、プログラム、及び方法における動作、手順、ステップ、及び段階等の各処理の実行順序は、特段「より前に」、「先立って」等と明示しておらず、また、前の処理の出力を後の処理で用いるのでない限り任意の順序で実現しうることに留意すべきである。また、前の処理の出力を後の処理で用いる場合でも、前の処理と後の処理の間に他の処理が入ることは可能である場合があること、又は間に他の処理が入るように記載されていても前の処理を後の処理の直前に行うよう変更することも可能である場合があることも留意されたい。特許請求の範囲、明細書、及び図面中の動作フローに関して、便宜上「まず、」、「次に、」、「続いて、」等を用いて説明したとしても、この順で実施することが必須であることを必ずしも意味するとは限らない。
【図１】
2015049832.tif 000003
【図２】
2015049832.tif 000004
【図３】
2015049832.tif 000005
【図４】
2015049832.tif 000006
【図５Ａ】
2015049832.tif 000007
【図５Ｂ】
2015049832.tif 000008
【図６Ａ】
2015049832.tif 000009
【図６Ｂ】
2015049832.tif 000010