JP4042972B2 - 最適化コンパイラ、コンパイラプログラム、及び記録媒体 - Google Patents

最適化コンパイラ、コンパイラプログラム、及び記録媒体 Download PDF

Info

Publication number
JP4042972B2
JP4042972B2 JP2003339666A JP2003339666A JP4042972B2 JP 4042972 B2 JP4042972 B2 JP 4042972B2 JP 2003339666 A JP2003339666 A JP 2003339666A JP 2003339666 A JP2003339666 A JP 2003339666A JP 4042972 B2 JP4042972 B2 JP 4042972B2
Authority
JP
Japan
Prior art keywords
register
load instruction
instruction
empty
assigned
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Expired - Fee Related
Application number
JP2003339666A
Other languages
English (en)
Other versions
JP2005107816A (ja
Inventor
基弘 川人
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
International Business Machines Corp
Original Assignee
International Business Machines Corp
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by International Business Machines Corp filed Critical International Business Machines Corp
Priority to JP2003339666A priority Critical patent/JP4042972B2/ja
Priority to US10/940,541 priority patent/US7523448B2/en
Publication of JP2005107816A publication Critical patent/JP2005107816A/ja
Application granted granted Critical
Publication of JP4042972B2 publication Critical patent/JP4042972B2/ja
Anticipated expiration legal-status Critical
Expired - Fee Related legal-status Critical Current

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/44Encoding
    • G06F8/443Optimisation

Landscapes

  • Engineering & Computer Science (AREA)
  • General Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Software Systems (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Devices For Executing Special Programs (AREA)

Description

本発明は、最適化コンパイラ、コンパイラプログラム、及び記録媒体に関する。特に本発明は、メモリからデータを読み出すロード命令を最適化する最適化コンパイラ、コンパイラプログラム、及び記録媒体に関する。
近年、技術革新により、コンピュータの中央処理装置の動作速度が高速になっている。このため、中央処理装置のレジスタからのデータ読出し時間に対して、メモリアクセスに要する時間が、相対的に大きくなってきている。従って、プログラム全体の処理速度を向上するには、プログラムで使用される変数の値をできるだけレジスタに保持してメモリアクセス量を減らすことがますます重要になってきている。
従来、最適化コンパイラは、メモリに対するアクセス量を減らして処理全体を効率化するべく、最適化対象の対象プログラムにおける変数を、レジスタに有効に割り当てるレジスタ割当機能を有している。そして、最適化コンパイラは、レジスタに割り当てられた変数の値を当該レジスタに保持させる一方、レジスタに割当不能と判断された変数の値をメモリに格納させる。そして、最適化コンパイラは、メモリに格納された変数の値を参照する命令に先立って、変数の値をメモリから読み出させるスピルイン命令を生成する。
また、近年の最適化コンパイラにおいて、当該複数の命令のうち冗長な命令を削除して処理全体を効率化する冗長性除去技術が用いられている。この際、最適化コンパイラは、冗長性を効果的に除去するために、命令の実行位置を変更する場合が多い。従来、命令の実行位置を変更する場合に、当該命令の演算結果を格納する変数を新たに生成しないように制御する技術が用いられている(非特許文献1参照。)。また、変数をレジスタに割り当てた場合であっても新たにスピル処理を生じさせない範囲内で、命令の実行位置を変更する技術が提案されている(非特許文献2参照。)。
J.Knoop et al., The Power of Assignment Motion, PLDI'95. R.Gupta and R.Bodik, Register presure sensitive redundancy elimination, In Proceedings of the 8th International Conference on Compiler Construction, LNCS 1575, p.107-121, 1999.
上記冗長性除去技術は、スピルイン命令に対して適用可能である。しかしながら、非特許文献1によると、スピルイン命令によるデータの読み出し先のレジスタが他の命令で用いられている場合には、スピルイン命令の実行位置を変更する範囲が制限される問題があった。また、非特許文献2の技術は、冗長性除去の対象となる命令について、当該命令の実行位置を変更することができる範囲を検出することができるものの、変数に割り当てるべきレジスタを定めることはできない。
そこで本発明は、上記の課題を解決することのできる最適化コンパイラ、コンパイラプログラム、及び記録媒体を提供することを目的とする。この目的は特許請求の範囲における独立項に記載の特徴の組み合わせにより達成される。また従属項は本発明の更なる有利な具体例を規定する。
上記課題を解決するために、本発明の第1の形態においては、最適化対象の対象プログラムにおいて、メモリからデータを読み出すロード命令を最適化するコンピュータであるコンパイラ装置であって、少なくとも一部の変数がレジスタに割り当てられておらず、レジスタに割り当てられていない変数の値の使用に先立って当該変数の値をメモリからロードするロード命令を含む、プログラムを、前記対象プログラムとして記憶している記憶装置と、前記対象プログラムの前記ロード命令を、少なくとも1つの空きレジスタが存在する範囲で移動させることで、当該ロード命令の部分冗長性を除去する処理を、前記コンピュータのCPUの制御により前記記憶装置にアクセスして行う部分冗長性除去手段と、前記ロード命令が読み出すデータを使用する使用命令から実行順序を遡ることにより前記ロード命令に到達する実行経路において、何れの変数にも割り当てられていない空きレジスタを、前記CPUの制御により前記記憶装置にアクセスして検出する後進方向レジスタ検出手段と、前記ロード命令がデータを読み出す読出先として、前記後進方向レジスタ検出手段により検出された前記空きレジスタを、前記CPUの制御により前記記憶装置にアクセスして割り当てる空きレジスタ割当手段とを備えるコンパイラ装置、コンピュータをコンパイラ装置として機能させるコンパイラプログラム、及びコンパイラプログラムを記録した記録媒体を提供する。
なお、上記の発明の概要は、本発明の必要な特徴の全てを列挙したものではなく、これらの特徴群のサブコンビネーションもまた、発明となりうる。
本発明によれば、メモリからデータを読み出すロード命令を効率的に最適化できる。
以下、発明の実施の形態を通じて本発明を説明するが、以下の実施形態は特許請求の範囲にかかる発明を限定するものではなく、また実施形態の中で説明されている特徴の組み合わせの全てが発明の解決手段に必須であるとは限らない。
図1は、最適化コンパイラ10の機能ブロック図である。最適化コンパイラ10は、最適化対象の対象プログラムにおいて、メモリからデータを読み出すロード命令を最適化する。最適化コンパイラ10は、レジスタ割当処理手段100と、スピルイン命令生成手段110と、部分冗長性除去手段130と、空きレジスタ検出手段140と、後進方向レジスタ検出手段142と、前進方向レジスタ検出手段144と、実行頻度取得手段150と、実行頻度合計値算出手段160と、空きレジスタ割当手段170と、生存区間検出手段180と、代替レジスタ検出手段182と、割当レジスタ変更手段184と、コピー命令生成手段190と、使用命令レジスタ割当手段192とを備える。
最適化コンパイラ10は、対象プログラムに含まれる複数の変数をレジスタに割り当て、割当不能と判断した各変数について、変数の値をメモリからロードするスピルイン命令を生成する。そして、最適化コンパイラ10は、複数のスピルイン命令が互いに同一の処理を行う冗長な命令である場合に、当該複数のスピルイン命令の少なくとも一部を削除することにより処理全体を効率化する部分冗長性の除去処理を行う。そして、最適化コンパイラ10は、部分冗長性の除去処理を行った複数のスピルイン命令のそれぞれについて、当該スピルイン命令の読み出し先である読出先変数に割り当てるレジスタとして利用可能な空きレジスタの集合を取得し、読出先変数にレジスタを割り当てる。
本実施形態に係る最適化コンパイラ10は、検出した空きレジスタの集合を絞り込んで読出先変数に適切なレジスタを割り当てることにより、効率的にロード命令を最適化することを目的とする。
ここで、対象プログラムとは、例えば、最適化コンパイラ10内で最適化対象のプログラムを表す中間表現であり、一例としては、Java(登録商標)言語におけるバイトコード、RTL(Register Transfer Language)、又は4つ組表現である。これに代えて、対象プログラムとは、プログラムのソースコードであってもよい。また、変数とは、ソースコードにおける変数そのものに限定されず、例えば、対象プログラムにおける値の生存区間であってもよい。
また、レジスタとは、対象プログラムを実行する中央処理装置において使用可能な全てのレジスタとは限らず、情報処理装置のオペレーティングシステム又はプログラミング言語等の仕様により予め定められ、対象プログラムにおける使用が許可されているレジスタ群に含まれていればよい。例えば、対象プログラムから呼び出されるライブラリプログラム等により使用され内容が変更され得るレジスタを含まなくてもよい。
レジスタ割当処理手段100は、対象プログラムを受け取ると、当該対象プログラムにおける変数をレジスタに割り当て、当該割り当て処理を行った結果の対象プログラムをスピルイン命令生成手段110に送る。この場合、好ましくは、レジスタ割当処理手段100は、複数のレジスタに予め定められた割当優先順位に基づいて、変数を割当優先順位がより高いレジスタに優先して割り当てる。これにより、レジスタ割当処理手段100は、割り当てるレジスタを特定の種類のレジスタに偏らせ、所定の実行経路において一貫して使用可能な空きレジスタの数を増やすことができる。
スピルイン命令生成手段110は、受け取った対象プログラムにおいて、レジスタ割当処理手段100によりレジスタに割当不能と判断された各変数について、スピルイン命令を生成し、当該生成処理を行った結果の対象プログラムを部分冗長性除去手段130に送る。ここで、スピルイン命令とは、変数の値を使用する命令に先立って変数の値をメモリからロードするロード命令である。
部分冗長性除去手段130は、受け取った対象プログラムにおけるロード命令であるスピルイン命令に対して、部分冗長性の除去処理を行う。具体的には、部分冗長性除去手段130は、各ロード命令を、少なくとも1の空きレジスタが存在する範囲で移動させる。一例として、部分冗長性除去手段130は、非特許文献2に記載した技術により部分冗長性の除去処理を行ってもよい。更に、部分冗長性除去手段130は、スピルイン命令が読み出すデータの読出先を変数とする。
そして、部分冗長性除去手段130は、当該置き換え処理を行った結果の対象プログラムを、空きレジスタ検出手段140及び実行頻度取得手段150に送る。
処理の具体例として、部分冗長性除去手段130は、複数のロード命令が冗長である場合に、当該複数のロード命令の少なくとも一部を削除してもよいし、当該複数のロード命令の少なくとも一部の実行位置を変更してもよい。ここで、レジスタに割り当てられていない変数とは、部分冗長性の除去処理が行われる時点でレジスタに割り当てられていない変数だけでなく、既にレジスタに割り当てられている変数であっても、対象プログラムから結果プログラムを生成する過程において、最終的に当該レジスタとは異なるレジスタに割り当てられる変数を含んでいてもよい。
空きレジスタ検出手段140は、ロード命令及びロード命令が読み出すデータを使用する使用命令のそれぞれが実行される実行位置において、何れの変数にも割り当てられていない空きレジスタの集合を検出し、検出結果を後進方向レジスタ検出手段142に送る。後進方向レジスタ検出手段142は、空きレジスタ検出手段140により検出された空きレジスタの集合のうち、使用命令から実行順序を遡ることによりロード命令に到達する実行経路において、何れの変数にも割り当てられていない空きレジスタを検出し、検出結果を前進方向レジスタ検出手段144に送る。前進方向レジスタ検出手段144は、後進方向レジスタ検出手段142により検出された空きレジスタの集合のうち、ロード命令から実行順序を辿ることにより使用命令に到達する実行経路において、何れの変数にも割り当てられていない空きレジスタを検出する。そして、前進方向レジスタ検出手段144は、この検出結果を、実行頻度合計値算出手段160及び空きレジスタ割当手段170に送る。
実行頻度取得手段150は、部分冗長性除去手段130から受け取った対象プログラムにおいて、ロード命令が実行される実行頻度と使用命令が実行される実行頻度とを取得し、取得結果を実行頻度合計値算出手段160に送る。実行頻度取得手段150は、例えば、ノードプロファイル手法やエッジプロファイル手法等のプロファイル技術を用いて対象プログラムに含まれる複数の命令それぞれの実行頻度を計測することにより、ロード命令及び使用命令の実行頻度を取得してもよい。実行頻度合計値算出手段160は、前進方向レジスタ検出手段144から受け取った空きレジスタの検出結果に基づいて、対象プログラムにおいて使用可能なそれぞれのレジスタについて当該レジスタが空きレジスタとなる各実行位置における前記ロード命令または前記使用命令の実行頻度を合計した実行頻度合計値を算出し、算出結果を空きレジスタ割当手段170に送る。
空きレジスタ割当手段170は、後進方向レジスタ検出手段142及び前進方向レジスタ検出手段144により共通して検出された、ロード命令の実行位置における空きレジスタのうち、実行頻度合計値算出手段160により算出された実行頻度合計値が最も高い空きレジスタをロード命令の読み出し先の読出先変数に割り当て、当該割り当て処理を行った結果の対象プログラムを、結果プログラムとして出力する。ここで、読出先変数とは、ロード命令により読み出されるデータを格納するレジスタを部分冗長性除去手段130が置き換えた、最適化コンパイラ10内で使用する変数であってよい。
但し、使用命令から実行順序を遡ることによりロード命令に到達する実行経路において空きレジスタが検出されない場合に、空きレジスタ割当手段170は、ロード命令の実行位置における空きレジスタの何れかを読出先変数に割り当て、当該割り当て処理を行った結果の対象プログラムを生存区間検出手段180又はコピー命令生成手段190に送る。例えば、空きレジスタ割当手段170は、ロード命令の実行位置における実行頻度合計値が最も高い空きレジスタ、又はロード命令の実行位置における割当優先順位が最も高い空きレジスタを読出先変数に割り当ててもよい。
生存区間検出手段180は、受け取った対象プログラムにおいて、空きレジスタ割当手段170により読出先変数に割り当てられたレジスタに既に割り当てられていた既割当変数の、値の生存区間を検出し、検出結果を代替レジスタ検出手段182に送る。代替レジスタ検出手段182は、生存区間検出手段180が検出した生存区間における空きレジスタである代替レジスタを検出し、検出結果を割当レジスタ変更手段184に送る。これを受けて、割当レジスタ変更手段184は、既割当変数に割り当てられていたレジスタを代替レジスタに変更し、当該変更した結果の対象プログラムを結果プログラムとして出力する。
コピー命令生成手段190は、受け取った対象プログラムのロード命令から使用命令に至る実行経路において、空きレジスタ割当手段170により読出先変数に割り当てられたレジスタに他の変数のデータを代入する命令に先立って実行される実行位置に、実行頻度合計値が最も高い空きレジスタに読出先変数のデータをコピーする命令を生成し、当該生成処理を行った結果の対象プログラムを使用命令レジスタ割当手段192に送る。これに代えて、コピー命令生成手段190は、レジスタ割当処理手段100において用いられた優先順位が最も高い空きレジスタに読出先変数のデータをコピーする命令を生成してもよい。
また、コピー命令生成手段190は、複数の実行経路の合流点において、各実行経路で読出先変数に割り当てられたレジスタが一致するように、即ち、一の実行経路における読出先変数に割り当てられたレジスタの集合であるレジスタイメージと、他の実行経路におけるレジスタイメージとが一致するように、合流点の直前にコピー命令を生成してもよい。このとき、コピー命令生成手段190は、当該複数の実行経路のそれぞれにおける実行頻度に基づいて、コピー命令を生成する実行経路における実行頻度合計値が最小になるように読出先変数のデータをコピーするレジスタを選択する。そして、使用命令レジスタ割当手段192は、受け取った対象プログラムにおいて、使用命令が使用する変数にコピー命令のコピー先であるレジスタを割り当て、当該割り当て処理を行った結果の対象プログラムを結果プログラムとして出力する。
なお、本図に示した構成は一例であり、本図の構成に多様な変更を加えてもよい。例えば、最適化コンパイラ10は、後進方向レジスタ検出手段142及び前進方向レジスタ検出手段144の何れか一方乃至は両方を備えていなくともよい。この場合、空きレジスタ割当手段170は、ロード命令がデータを読み出す読出先変数に、空きレジスタ検出手段140により検出された空きレジスタの集合の何れかを割り当ててもよいし、後進方向レジスタ検出手段142及び前進方向レジスタ検出手段144の何れかにより検出された空きレジスタを割り当ててもよい。
また、例えば、最適化コンパイラ10は、生存区間検出手段180、代替レジスタ検出手段182、及び割当レジスタ変更手段184を備えていなくともよい。この構成において、空きレジスタ割当手段170は、使用命令から実行順序を遡ることによりロード命令に到達する実行経路において空きレジスタが検出されない場合に、ロード命令の実行位置における空きレジスタの何れかを読出先変数に割り当て、当該割り当て処理を行った結果の対象プログラムをコピー命令生成手段190に送る。
本実施形態に係る最適化コンパイラ10によれば、ロード命令を少なくとも1の空きレジスタが存在する範囲で移動させて部分冗長性の除去処理を行い、当該ロード命令の読出先変数に割り当てるレジスタをロード命令及び使用命令における実行頻度に基づいて決定することにより、より効率的にロード命令を最適化することができる。
図2は、最適化コンパイラ10の動作フローを示す図である。まず、レジスタ割当処理手段100は、受け取った対象プログラムにおける変数をレジスタに割り当てる(S200)。続いて、スピルイン命令生成手段110は、レジスタ割当処理手段100によりレジスタに割当不能と判断された各変数について、当該変数の値を使用する命令に先立って当該変数の値をメモリからロードするスピルイン命令を生成する(S205)。
そして、最適化コンパイラ10は、スピルイン命令により互いに異なるメモリアドレスからロードされる複数のデータのそれぞれについて、以下の処理を繰り返す(S215)。まず、部分冗長性除去手段130は、当該データをロードする複数のスピルイン命令のそれぞれに対して部分冗長性の除去処理を行い、更に、当該スピルイン命令が読み出すデータの読出先を、最適化コンパイラ10内で使用する変数とする(S220)。
続いて、空きレジスタ検出手段140は、ロード命令及びロード命令により読み出されるデータを使用する使用命令のそれぞれが実行される実行位置pにおいて、何れの変数にも割り当てられていない空きレジスタの集合REG(p)を検出する(S225)。
ここで、最適化コンパイラ10は、対象プログラムの各基本ブロックにおいて、以下の3つの集合を生成する。
(1)GEN集合
最適化コンパイラ10は、当該基本ブロックの実行開始位置から当該変数を最後に参照する命令の実行位置までの範囲で、レジスタ割当処理手段100により他の変数に割り当てられていないレジスタの集合をGEN集合として生成する。
(2)GEN’集合
最適化コンパイラ10は、ロード命令の実行位置から、当該基本ブロックの実行終了位置までの範囲で、レジスタ割当処理手段100により他の変数に割り当てられていないレジスタの集合をGEN’集合として生成する。
(3)KILL集合
最適化コンパイラ10は、当該基本ブロックの中で、レジスタ割当処理手段100により他の変数に割り当てられているレジスタの集合をKILL集合として生成する。
以降の説明において、第n基本ブロックにおけるGEN集合、GEN’集合、及びKILL集合を、それぞれGEN(n)、GEN’(n)、及びKILL(n)と表記する。
後進方向レジスタ検出手段142は、空きレジスタ検出手段140の検出結果に基づいて、使用命令から実行順序を遡ることによりロード命令に到達する実行経路において、何れの変数にも割り当てられていない空きレジスタを検出する(S230)。
具体的には、後進方向レジスタ検出手段142は、対象プログラムの終端から実行順序を遡る方向に空きレジスタの集合を示す情報を伝播させ、かつ反復解法によって空きレジスタの数が単調減少する以下のデータフロー方程式(1)として表される処理により、空きレジスタを検出する。
本数式において、第n基本ブロックの実行開始位置における空きレジスタの集合をBWD−REGin(n)と表記し、第n基本ブロックの実行終了位置における空きレジスタの集合をBWD−REGout(n)と表記する。
Figure 0004042972
但し、第n基本ブロックの次に実行され得る基本ブロックの集合を、Succ(n)と表記する。
更に、後進方向レジスタ検出手段142は、第n基本ブロックにおける各命令の実行位置pにおける空きレジスタの集合を、BWD−REGout(n)、GEN(n)、及びKILL(n)に基づいて取得し、取得した空きレジスタの集合と、空きレジスタ検出手段140において検出された空きレジスタの集合REG(p)との積集合を算出する。そして、後進方向レジスタ検出手段142は、算出した積集合が空集合でない場合に、REG(p)を当該積集合に更新する。
続いて、前進方向レジスタ検出手段144は、後進方向レジスタ検出手段142の検出結果に基づいて、ロード命令から使用命令に到達する実行経路において、何れの変数にも割り当てられていない空きレジスタを検出する(S235)。
具体的には、前進方向レジスタ検出手段144は、対象プログラムの始点から実行順序を辿る方向に空きレジスタの集合を示す情報を伝播させ、かつ反復解法によって空きレジスタの数が単調減少する以下のデータフロー方程式(2)として表される処理により、空きレジスタを検出する。
本数式において、第n基本ブロックの実行開始位置における空きレジスタの集合をFWD−REGin(n)と表記し、第n基本ブロックの実行終了位置における空きレジスタの集合をFWD−REGout(n)と表記する。
Figure 0004042972
但し、第n基本ブロックの前に実行され得る基本ブロックの集合を、Pred(n)と表記する。
更に、前進方向レジスタ検出手段144は、第n基本ブロックにおける各命令の実行位置pにおける空きレジスタの集合を、FWD−REGin(n)、GEN’(n)、及びKILL(n)に基づいて取得し、取得した空きレジスタの集合と、後進方向レジスタ検出手段142において更新された空きレジスタの集合REG(p)との積集合を取得する。そして、前進方向レジスタ検出手段144は、取得した積集合が空集合でない場合に、REG(p)を当該積集合に更新する。
ここで、ステップ230及びステップ235の実行順序は、上記の説明における実行順序に限定されない。つまり、前進方向レジスタ検出手段144は空きレジスタ検出手段140の検出結果に基づいて空きレジスタを検出し、その後、後進方向レジスタ検出手段142は前進方向レジスタ検出手段144の検出結果に基づいて空きレジスタを検出してもよい。
また、ステップ230及びステップ235に示す処理の何れか一方、乃至は両方が実行されなくともよい。つまり、最適化コンパイラ10は、空きレジスタ検出手段140により検出されたレジスタの集合、又は空きレジスタ検出手段140と後進方向レジスタ検出手段142及び前進方向レジスタ検出手段144の何れか一方とにより共通して検出されたレジスタの集合を、空きレジスタとして検出してもよい。
続いて、最適化コンパイラ10は、ロード命令とロード命令が読み出すデータを使用する複数の使用命令とをグループ化する(S240)。例えば、最適化コンパイラ10は、ロード命令及び使用命令を、UD-DU chain技術や、web技術を用いてグループ化してもよい。続いて、実行頻度取得手段150は、ロード命令が実行される実行頻度と使用命令が実行される実行頻度とを取得する(S245)。
続いて、実行頻度合計値算出手段160は、対象プログラムにおいて使用可能なそれぞれのレジスタについて当該レジスタが空きレジスタとなる各実行位置におけるロード命令または使用命令の実行頻度を合計した実行頻度合計値を算出する(S250)。具体的には、実行頻度合計値算出手段160は、同じグループに含まれる複数の命令のそれぞれについて、当該命令の実行位置pにおけるREG(p)に含まれる複数のレジスタのそれぞれに、当該命令の実行頻度を対応付ける。そして、実行頻度合計値算出手段160は、対象プログラムにおいて使用可能な全てのレジスタについて、各実行位置においてレジスタに対応付けられた実行頻度を、レジスタ毎に合計することにより実行頻度合計値を算出する。また、実行頻度合計値算出手段160は、複数のレジスタにおいて実行頻度合計値が互いに同一の場合には、実行頻度合計値を互いに異なる値になるように調節してもよい。
続いて、空きレジスタ割当手段170は、ロード命令がデータを読み出す読出先変数に、空きレジスタの何れかを割り当てる(S255)。最適化コンパイラ10は、以上の処理を、スピルイン命令により互いに異なるメモリアドレスからロードされる複数のデータのそれぞれについて繰り返す(S260)。
以上、本図で示すように、最適化コンパイラ10は、レジスタ割当処理によりレジスタに割当不能と判断された各変数を、レジスタ割当処理を終えてもなお変数を割り当てていないレジスタに割り当てることができる。これにより、スピルイン命令の実行回数を減らして、対象プログラム全体の実行を効率化することができる。
図3は、図2におけるS255の詳細を示す動作フローである。空きレジスタ割当手段170は、使用命令から実行順序を遡ることによりロード命令に到達する全ての実行経路において一貫して利用可能な空きレジスタを検出したか否かを判断する(S300)。
空きレジスタを検出した場合に(S300:YES)、空きレジスタ割当手段170は、ロード命令の実行位置pにおける空きレジスタREG(p)のうち、使用命令から実行順序を遡ることによりロード命令に到達する全ての実行経路において一貫して利用可能であり、かつ実行頻度合計値が最も高い空きレジスタを、ロード命令の読み出し先の読出先変数に割り当て(S310)、処理を終了する。
空きレジスタを検出しなかった場合に(S300:NO)、空きレジスタ割当手段170は、ロード命令の実行位置pにおける空きレジスタREG(p)のうち、実行頻度合計値が最も高いレジスタを、読出先変数に割り当てる(S320)。続いて、生存区間検出手段180は、空きレジスタ割当手段170により読出先変数に割り当てられたレジスタに既に割り当てられていた既割当変数の値の生存区間を検出し(S330)、検出した生存区間について以下の処理を行う。なお、生存区間検出手段180は、複数の生存区間を検出した場合には、各生存区間について以下の処理を行ってもよい。
代替レジスタ検出手段182は、生存区間検出手段180により検出された生存区間における空きレジスタである代替レジスタを検出する(S340)。代替レジスタ検出手段182が代替レジスタを検出できた場合に(S350:YES)、割当レジスタ変更手段184は、既割当変数に割り当てられていたレジスタを、代替レジスタに変更し(S360)、処理を終了する。
一方、代替レジスタ検出手段182が代替レジスタを検出できなかった場合に(S350:NO)、コピー命令生成手段190は、ロード命令から使用命令に至る実行経路において、読出先変数に割り当てられたレジスタに他の変数のデータを代入する命令に先立って実行される実行位置に、実行頻度合計値が最も高い空きレジスタに読出先変数のデータをコピーする命令を生成する(S370)。
続いて、使用命令レジスタ割当手段192は、使用命令が使用する変数に、コピー命令のコピー先であるレジスタを割り当て(S380)、処理を終了する。
以上、本図で示すように、最適化コンパイラ10は、変数の値のロード命令から使用命令までの間で一貫して他の変数に割り当てられていないレジスタを検出した場合には、検出した当該レジスタを、変数の値を保持するレジスタとして選択する。さらに、一貫して他の変数に割り当てられていない空きレジスタが検出されない場合であっても、既に他の変数に割り当てられていたレジスタを他のレジスタに変更することを試みる。この結果、最適化コンパイラ10は、レジスタ間で値をコピーする処理をできるだけ生じさせないようにすることにより、対象プログラムの実行効率を高めることができる。
図4は、本実施例の第1の適用例を示す。(a)は、本適用例における図2のステップ220実行後の対象プログラムを示す。(b)は、本適用例における図2のステップ255実行後の対象プログラムを示す。(c)は、本適用例に係る対象プログラムに含まれる複数の基本ブロックのそれぞれにおけるGEN集合及びKILL集合を示す。(d)は、本適用例に係る対象プログラムに含まれる複数の基本ブロックのそれぞれにおける後進方向レジスタ検出手段142による空きレジスタの検出結果を示す。以下、データフロー方程式(1)に基づいて(d)に示した結果を求める手順を説明する。
まず、後進方向レジスタ検出手段142は、対象プログラムの終端である基本ブロックBB6の実行終了位置における空きレジスタの集合BWD−REGout(BB6)として、利用可能な全てのレジスタである{r1、r2、r3、r4}を検出する。続いて、後進方向レジスタ検出手段142は、基本ブロックBB6の実行開始位置における空きレジスタの集合BWD−REGin(BB6)として、BWD−REGout(BB6)である{r1、r2、r3、r4}からKILL(BB6)である{r3、r4}を差し引いた{r1、r2}と、GEN(BB6)である{r1、r2}との和集合である{r1、r2}を検出する。
続いて、後進方向レジスタ検出手段142は、基本ブロックBB5の実行終了位置における空きレジスタの集合BWD−REGout(BB5)として、BWD−REGin(BB6)である{r1、r2}を検出する。ここで、基本ブロックBB5の次に実行する基本ブロックとして、基本ブロックBB6の他に基本ブロックBB2が存在するが、この時点ではBWD−REGin(BB2)は検出されていないので、後進方向レジスタ検出手段142は、BWD−REGin(BB6)のみに基づいてBWD−REGout(BB5)を検出する。後進方向レジスタ検出手段142は、図2で示したデータフロー方程式(1)を反復解法で解くことにより、ループ処理の実行開始位置における空きレジスタであるBWD−REGin(BB2)とループ処理の次に実行される位置における空きレジスタであるBWD−REGin(BB6)とを使用してBWD−REGout(BB5)を検出する。以降、同様の手順で計算することにより、後進方向レジスタ検出手段142は、使用命令から実行順序を遡ることによりロード命令に到達する実行経路における空きレジスタとして、(d)に示した空きレジスタを検出することができる。
(e)は、本適用例に係る対象プログラムの基本ブロックBB3における空きレジスタを示す。ここで、(e)は、基本ブロックBB3において、実行位置500及び実行位置510において利用可能なレジスタが{r2}であることを示している。基本ブロックBB3の他の基本ブロック、例えば基本ブロックBB4において、空きレジスタが{r1}であった場合、空きレジスタ割当手段170は、基本ブロックBB6における使用命令から実行順序を遡ることにより基本ブロックBB1におけるロード命令に到達する全ての実行経路において一貫して利用可能な空きレジスタを検出することができない。
ここで、空きレジスタ割当手段170は、基本ブロックBB1におけるロード命令の読出先変数にレジスタr1を割り当てる。そして、生存区間検出手段180は、読出先変数に割り当てられたレジスタr1に既に割り当てられていた既割当変数の、基本ブロックBB3における値の生存区間が、実行位置500から実行位置510であることを検出する。これを受けて、代替レジスタ検出手段182は、当該生存区間における空きレジスタである代替レジスタとして、レジスタr2を検出する。そして、割当レジスタ変更手段184は、既割当変数に割り当てられていたレジスタr1を、代替レジスタr2に変更することにより、基本ブロックBB3において、レジスタr1を利用可能とする。
以上のようにして、最適化コンパイラ10は、変数Tを一貫してレジスタr1に割り当てることにより、(b)に示した対象プログラムを生成することができる。
本適用例に示すように、最適化コンパイラ10によれば、既割当変数に割り当てられたレジスタを代替レジスタに変更することによりコピー命令の生成を回避することができ、効率的にロード命令を最適化することができる。
図5は、本実施例の第2の適用例を示す。(a)は、本適用例における図2のステップ205実行後の対象プログラムを示す。(b)は、本適用例における図2のステップ230実行後の対象プログラムの一例を示す。(c)は、本適用例における図2のステップ235実行後の対象プログラムの一例を示す。
スピルイン命令生成手段110は、対象プログラムにおいて、レジスタ割当処理手段100によりレジスタに割当不能と判断された各変数について、スピルイン命令を生成する。例えば、図5(a)の4行目及び7行目に示すように、スピルイン命令生成手段110は、変数の値が使用される毎に、値の使用に先立ってスピルイン命令を生成する。
後進方向レジスタ検出手段142は、実行位置600から実行順序を遡ることによりスピルイン命令に到達する実行経路における空きレジスタを検出する。具体的には、後進方向レジスタ検出手段142は、ループ処理中に使用命令が存在する場合には、ループ処理が一回目に実行される経路について空きレジスタを検出する。その結果、図5(b)に示すように、後進方向レジスタ検出手段142は、実行位置600からスピルイン命令に至る実行経路における空きレジスタとして、{r2、r3}を検出する。
これに対して、前進方向レジスタ検出手段144は、スピルイン命令から実行経路を辿ることにより実行位置610に到達する実行経路における空きレジスタを検出する。具体的には、前進方向レジスタ検出手段144は、ループ処理中に使用命令が存在する場合には、ループ処理が2度以上繰り返し実行される経路について空きレジスタを検出する。その結果、前進方向レジスタ検出手段144は、実行位置610における空きレジスタとして、{r3}を検出する。
このように、後進方向レジスタ検出手段142及び前進方向レジスタ検出手段144の何れかにより空きレジスタを検出する場合には、後進方向レジスタ検出手段142及び前進方向レジスタ検出手段144の双方に共通した空きレジスタを検出する場合と比較して、空きレジスタの検出結果が異なる場合がある。
これにより、最適化コンパイラ10による最適化の結果が異なる場合がある。例えば、(b)において変数Tに割り当てるレジスタとしてレジスタr2を選択した場合、実行位置600においてレジスタr2は他の目的で使用されてしまうので、最適化コンパイラ10は、実行位置600に先立って実行される実行位置にコピー命令を生成する必要がある。具体的には、最適化コンパイラ10は、変数Tの値をレジスタr2以外の他のレジスタにコピーして値を保持させるコピー命令を生成する必要がある。これに対し、(c)において変数Tに割り当てるレジスタとしてレジスタr3を選択した場合、最適化コンパイラ10は、コピー命令を生成する必要がない。
本適用例に係る最適化コンパイラ10によれば、ロード命令の読出先変数に、後進方向レジスタ検出手段142及び前進方向レジスタ検出手段144により共通して検出された空きレジスタを割り当てることにより、コピー命令を生成させることを回避して、効率的にロード命令を最適化できる。
図6は、最適化コンパイラ10として機能するコンピュータのハードウェア構成の一例を示す図である。最適化コンパイラ10は、ホストコントローラ1082により相互に接続されるCPU1000、RAM1020、グラフィックコントローラ1075、及び表示装置1080を有するCPU周辺部と、入出力コントローラ1084によりホストコントローラ1082に接続される通信インターフェイス1030、ハードディスクドライブ1040、及びCD−ROMドライブ1060を有する入出力部と、入出力コントローラ1084に接続されるROM1010、フレキシブルディスクドライブ1050、及び入出力チップ1070を有するレガシー入出力部とを備える。
ホストコントローラ1082は、RAM1020と、高い転送レートでRAM1020をアクセスするCPU1000及びグラフィックコントローラ1075とを接続する。CPU1000は、ROM1010及びRAM1020に格納されたプログラムに基づいて動作し、各部の制御を行う。グラフィックコントローラ1075は、CPU1000等がRAM1020内に設けたフレームバッファ上に生成する画像データを取得し、表示装置1080上に表示させる。これに代えて、グラフィックコントローラ1075は、CPU1000等が生成する画像データを格納するフレームバッファを、内部に含んでもよい。
入出力コントローラ1084は、ホストコントローラ1082と、比較的高速な入出力装置である通信インターフェイス1030、ハードディスクドライブ1040、及びCD−ROMドライブ1060を接続する。通信インターフェイス1030は、ネットワークを介して外部の装置と接続する。ハードディスクドライブ1040は、最適化コンパイラ10が使用するコンパイラプログラム及びデータを格納する。CD−ROMドライブ1060は、CD−ROM1095からプログラム又はデータを読みとり、RAM1020を介して入出力チップ1070に提供する。
また、入出力コントローラ1084には、ROM1010と、フレキシブルディスクドライブ1050や入出力チップ1070等の比較的低速な入出力装置とが接続される。ROM1010は、最適化コンパイラ10の起動時にCPU1000が実行するブートプログラムや、最適化コンパイラ10のハードウェアに依存するプログラム等を格納する。フレキシブルディスクドライブ1050は、フレキシブルディスク1090からプログラム又はデータを読み取り、RAM1020を介して入出力チップ1070に提供する。入出力チップ1070は、フレキシブルディスク1090や、例えばパラレルポート、シリアルポート、キーボードポート、マウスポート等を介して各種の入出力装置を接続する。
最適化コンパイラ10に提供されるコンパイラプログラムは、フレキシブルディスク1090、CD−ROM1095、又はICカード等の記録媒体に格納されて利用者によって提供される。コンパイラプログラムは、入出力チップ1070及び/又は入出力コントローラ1084を介して、記録媒体から読み出され最適化コンパイラ10にインストールされて実行される。
最適化コンパイラ10にインストールされて実行されるコンパイラプログラムは、レジスタ割当処理モジュールと、スピルイン命令生成モジュールと、部分冗長性除去モジュールと、空きレジスタ検出モジュールと、後進方向レジスタ検出モジュールと、前進方向レジスタ検出モジュールと、実行頻度取得モジュールと、実行頻度合計値算出モジュールと、空きレジスタ割当モジュールと、生存区間検出モジュールと、代替レジスタ検出モジュールと、割当レジスタ変更モジュールと、コピー命令生成モジュールと、使用命令レジスタ割当モジュールとを含む。各モジュールが最適化コンパイラ10に働きかけて行わせる動作は、図1から図5において説明した最適化コンパイラ10における、対応する部材の動作と同一であるので、説明を省略する。
以上に示したコンパイラプログラムは、外部の記憶媒体に格納されてもよい。記憶媒体としては、フレキシブルディスク1090、CD−ROM1095の他に、DVDやPD等の光学記録媒体、MD等の光磁気記録媒体、テープ媒体、ICカード等の半導体メモリ等を用いることができる。また、専用通信ネットワークやインターネットに接続されたサーバシステムに設けたハードディスク又はRAM等の記憶装置を記録媒体として使用し、ネットワークを介してコンパイラプログラムを最適化コンパイラ10に提供してもよい。
以上、本実施例で示すように、最適化コンパイラ10は、レジスタ割当処理によりレジスタに割当不能と判断された各変数を、レジスタ割当処理を終えてもなお変数を割り当てていないレジスタに割り当てることができる。これにより、スピルイン命令の実行回数を減らして、対象プログラム全体の実行を効率化することができる。
また、最適化コンパイラ10は、レジスタ割当処理により既に変数に割り当てられているレジスタを、他のレジスタに変更することにより、レジスタ間で値をコピーするコピー命令の数を減少させることができる。また、他のレジスタに変更できない場合であっても、実行頻度のより高い命令が実行される実行位置における空きレジスタを優先して割り当てることにより、対象プログラムの実行を効率化することができる。
以上、本発明を実施の形態を用いて説明したが、本発明の技術的範囲は上記実施の形態に記載の範囲には限定されない。上記実施の形態に、多様な変更または改良を加えることが可能であることが当業者に明らかである。その様な変更または改良を加えた形態も本発明の技術的範囲に含まれ得ることが、特許請求の範囲の記載から明らかである。
上記実施例によると、以下の各項目に示す最適化コンパイラ、コンパイラプログラム、及び記録媒体が実現される。
(項目1) 最適化対象の対象プログラムにおいて、メモリからデータを読み出すロード命令を最適化する最適化コンパイラであって、少なくとも一部の変数がレジスタに割り当てられていない前記対象プログラムにおいて、メモリから変数にデータを読み出すロード命令に対して、当該変数がレジスタに割り当てられた場合にスピル処理を生じさせない部分冗長性の除去処理を行う部分冗長性除去手段と、前記ロード命令が読み出すデータを使用する使用命令から実行順序を遡ることにより前記ロード命令に到達する実行経路において、何れの変数にも割り当てられていない空きレジスタを検出する後進方向レジスタ検出手段と、前記ロード命令がデータを読み出す読出先変数に、前記後進方向レジスタ検出手段により検出された前記空きレジスタを割り当てる空きレジスタ割当手段とを備える最適化コンパイラ。
(項目2) 前記後進方向レジスタ検出手段は、前記対象プログラムの終端から実行順序を遡る方向に空きレジスタの集合を示す情報を伝播させ、かつ反復解法によって空きレジスタの数が単調減少するデータフロー方程式として表される処理により、空きレジスタを検出する項目1記載の最適化コンパイラ。
(項目3) 前記使用命令から実行順序を遡ることにより前記ロード命令に到達する実行経路において空きレジスタが検出されない場合に、前記空きレジスタ割当手段は、前記読出先変数に、前記ロード命令の実行位置における空きレジスタの何れかを割り当て、当該最適化コンパイラは、前記読出先変数に割り当てられたレジスタに既に割り当てられていた既割当変数の、値の生存区間を検出する生存区間検出手段と、前記生存区間における空きレジスタである代替レジスタを検出する代替レジスタ検出手段と、前記既割当変数に割り当てられていたレジスタを、前記代替レジスタに変更する割当レジスタ変更手段とを更に備える項目1記載の最適化コンパイラ。
(項目4) 変数をレジスタに割り当てるレジスタ割当処理手段と、前記レジスタ割当処理手段によりレジスタに割当不能と判断された各変数について、当該変数の値を使用する命令に先立って当該変数の値をメモリからロードするスピルイン命令を生成するスピルイン命令生成手段とを更に備え、前記部分冗長性除去手段は、前記ロード命令であるスピルイン命令に対して、前記部分冗長性の除去処理を行い、更に、当該スピルイン命令が読み出すデータを格納するレジスタを、当該最適化コンパイラ内で使用する変数に置き換え、前記空きレジスタ割当手段は、前記部分冗長性除去手段が置き換えた変数に、前記後進方向レジスタ検出手段により検出された前記空きレジスタを割り当てる項目1記載の最適化コンパイラ。
(項目5) 複数の前記レジスタには、変数を割り当てる優先順位が予め定められており、前記レジスタ割当処理手段は、変数を前記優先順位がより高いレジスタに優先して割り当て、前記使用命令から実行順序を遡ることにより前記ロード命令に到達する実行経路において空きレジスタが検出されない場合に、前記空きレジスタ割当手段は、前記ロード命令の実行位置における空きレジスタのうち前記優先順位が最も高いレジスタを、前記読出先変数に割り当て、当該最適化コンパイラは、前記ロード命令から前記使用命令に至る実行経路において、前記読出先変数に割り当てられたレジスタに他の変数のデータを代入する命令に先立って実行される実行位置に、前記優先順位が最も高い空きレジスタに前記読出先変数のデータをコピーする命令を生成するコピー命令生成手段と、前記使用命令が使用する変数に、当該コピー命令のコピー先であるレジスタを割り当てる使用命令レジスタ割当手段とを更に備える項目4記載の最適化コンパイラ。
(項目6) 前記ロード命令から実行順序を辿ることにより前記ロード命令が読み出すデータを使用する使用命令に到達する実行経路において、何れの変数にも割り当てられていない空きレジスタを検出する前進方向レジスタ検出手段を更に備え、前記空きレジスタ割当手段は、前記読出先変数に、前記後進方向レジスタ検出手段及び前記前進方向レジスタ検出手段により共通して検出された空きレジスタを割り当てる項目1記載の最適化コンパイラ。
(項目7) 最適化対象の対象プログラムにおいて、メモリからデータを読み出すロード命令を最適化する最適化コンパイラであって、少なくとも一部の変数がレジスタに割り当てられていない前記対象プログラムにおいて、メモリから変数にデータを読み出すロード命令に対して、当該変数がレジスタに割り当てられた場合にスピル処理を生じさせない部分冗長性の除去処理を行う部分冗長性除去手段と、前記ロード命令から実行順序を辿ることにより前記ロード命令が読み出すデータを使用する使用命令に到達する実行経路において、何れの変数にも割り当てられていない空きレジスタを検出する前進方向レジスタ検出手段と、前記ロード命令がデータを読み出す読出先変数に、前記前進方向レジスタ検出手段により検出された前記空きレジスタを割り当てる空きレジスタ割当手段とを備える最適化コンパイラ。
(項目8) 前記前進方向レジスタ検出手段は、前記対象プログラムの始点から実行順序を辿る方向に空きレジスタの集合を示す情報を伝播させ、かつ反復解法によって空きレジスタの数が単調減少するデータフロー方程式として表される処理により、空きレジスタを検出する項目7記載の最適化コンパイラ。
(項目9) 最適化対象の対象プログラムにおいて、メモリからデータを読み出すロード命令を最適化する最適化コンパイラであって、少なくとも一部の変数がレジスタに割り当てられていない前記対象プログラムにおいて、メモリから変数にデータを読み出すロード命令に対して、当該変数がレジスタに割り当てられた場合にスピル処理を生じさせない部分冗長性の除去処理を行う部分冗長性除去手段と、前記ロード命令が実行される実行頻度と、当該ロード命令により読み出されるデータを使用する使用命令が実行される実行頻度とを取得する実行頻度取得手段と、前記ロード命令及び前記使用命令のそれぞれが実行される実行位置において、何れの変数にも割り当てられていない空きレジスタの集合を検出する空きレジスタ検出手段と、前記ロード命令及び前記使用命令の実行頻度を、前記ロード命令又は前記使用命令の実行位置における空きレジスタ毎に合計した実行頻度合計値を算出する実行頻度合計値算出手段と、前記ロード命令の実行位置における前記空きレジスタのうち前記実行頻度合計値が最も高い前記空きレジスタを、前記ロード命令の読み出し先の読出先変数に割り当てる空きレジスタ割当手段とを備える最適化コンパイラ。
(項目10) 前記ロード命令から前記使用命令に至る実行経路において、前記読出先変数に割り当てられたレジスタに他の変数のデータを代入する命令に先立って実行される実行位置に、前記読出先変数のデータを前記実行頻度合計値が最も高い空きレジスタにコピーする命令を生成するコピー命令生成手段と、前記使用命令が使用する変数に、当該コピー命令のコピー先であるレジスタを割り当てる使用命令レジスタ割当手段とを更に備える項目9記載の最適化コンパイラ。
(項目11) 最適化対象の対象プログラムにおいて、メモリからデータを読み出すロード命令を最適化する最適化コンパイラとしてコンピュータを機能させるコンパイラプログラムであって、前記コンピュータを、少なくとも一部の変数がレジスタに割り当てられていない前記対象プログラムにおいて、メモリから変数にデータを読み出すロード命令に対して、当該変数がレジスタに割り当てられた場合にスピル処理を生じさせない部分冗長性の除去処理を行う部分冗長性除去手段と、前記ロード命令が読み出すデータを使用する使用命令から実行順序を遡ることにより前記ロード命令に到達する実行経路において、何れの変数にも割り当てられていない空きレジスタを検出する後進方向レジスタ検出手段と、前記ロード命令がデータを読み出す読出先変数に、前記後進方向レジスタ検出手段により検出された前記空きレジスタを割り当てる空きレジスタ割当手段として機能させるコンパイラプログラム。
(項目12) 最適化対象の対象プログラムにおいて、メモリからデータを読み出すロード命令を最適化する最適化コンパイラとしてコンピュータを機能させるコンパイラプログラムであって、前記コンピュータを、少なくとも一部の変数がレジスタに割り当てられていない前記対象プログラムにおいて、メモリから変数にデータを読み出すロード命令に対して、当該変数がレジスタに割り当てられた場合にスピル処理を生じさせない部分冗長性の除去処理を行う部分冗長性除去手段と、前記ロード命令から実行順序を辿ることにより前記ロード命令が読み出すデータを使用する使用命令に到達する実行経路において、何れの変数にも割り当てられていない空きレジスタを検出する前進方向レジスタ検出手段と、前記ロード命令がデータを読み出す読出先変数に、前記前進方向レジスタ検出手段により検出された前記空きレジスタを割り当てる空きレジスタ割当手段として機能させるコンパイラプログラム。
(項目13) 最適化対象の対象プログラムにおいて、メモリからデータを読み出すロード命令を最適化する最適化コンパイラとしてコンピュータを機能させるコンパイラプログラムであって、前記コンピュータを、少なくとも一部の変数がレジスタに割り当てられていない前記対象プログラムにおいて、メモリから変数にデータを読み出すロード命令に対して、当該変数がレジスタに割り当てられた場合にスピル処理を生じさせない部分冗長性の除去処理を行う部分冗長性除去手段と、前記ロード命令が実行される実行頻度と、当該ロード命令により読み出されるデータを使用する使用命令が実行される実行頻度とを取得する実行頻度取得手段と、前記ロード命令及び前記使用命令のそれぞれが実行される実行位置において、何れの変数にも割り当てられていない空きレジスタの集合を検出する空きレジスタ検出手段と、前記ロード命令及び前記使用命令の実行頻度を、前記ロード命令又は前記使用命令の実行位置における空きレジスタ毎に合計した実行頻度合計値を算出する実行頻度合計値算出手段と、前記ロード命令の実行位置における前記空きレジスタのうち前記実行頻度合計値が最も高い前記空きレジスタを、前記ロード命令の読み出し先の読出先変数に割り当てる空きレジスタ割当手段として機能させるコンパイラプログラム。
(項目14) 項目11から項目13の何れかに記載のコンパイラプログラムを記録した記録媒体。
最適化コンパイラ10の機能ブロック図である。 最適化コンパイラ10の動作フローを示す。 図2におけるS255の詳細を示す動作フローである。 本実施例の第1の適用例を示す。 本実施例の第2の適用例を示す。 最適化コンパイラ10として機能するコンピュータのハードウェア構成の一例を示す。
符号の説明
10・・・最適化コンパイラ、100・・・レジスタ割当処理手段、110・・・スピルイン命令生成手段、130・・・部分冗長性除去手段、140・・・空きレジスタ検出手段、142・・・後進方向レジスタ検出手段、144・・・前進方向レジスタ検出手段、150・・・実行頻度取得手段、160・・・実行頻度合計値算出手段、170・・・空きレジスタ割当手段、180・・・生存区間検出手段、182・・・代替レジスタ検出手段、184・・・割当レジスタ変更手段、190・・・コピー命令生成手段、192・・・使用命令レジスタ割当手段、500、510、600、610・・・実行位置

Claims (11)

  1. 最適化対象の対象プログラムにおいて、メモリからデータを読み出すロード命令を最適化するコンピュータであるコンパイラ装置であって、
    少なくとも一部の変数がレジスタに割り当てられておらず、レジスタに割り当てられていない変数の値の使用に先立って当該変数の値をメモリからロードするロード命令を含む、プログラムを、前記対象プログラムとして記憶している記憶装置と、
    前記対象プログラムの前記ロード命令を、少なくとも1つの空きレジスタが存在する範囲で移動させることで、当該ロード命令の部分冗長性を除去する処理を、前記コンピュータのCPUの制御により前記記憶装置にアクセスして行う部分冗長性除去手段と、
    前記ロード命令が読み出すデータを使用する使用命令から実行順序を遡ることにより前記ロード命令に到達する実行経路において、何れの変数にも割り当てられていない空きレジスタを、前記CPUの制御により前記記憶装置にアクセスして検出する後進方向レジスタ検出手段と、
    前記ロード命令がデータを読み出す読出先として、前記後進方向レジスタ検出手段により検出された前記空きレジスタを、前記CPUの制御により前記記憶装置にアクセスして割り当てる空きレジスタ割当手段と
    を備えるコンパイラ装置
  2. 前記後進方向レジスタ検出手段は、前記対象プログラムの終端から実行順序を遡る方向に空きレジスタの集合を示す情報を伝播させる処理により、空きレジスタを検出する
    請求項1記載のコンパイラ装置
  3. 前記使用命令から実行順序を遡ることにより前記ロード命令に到達する実行経路において一貫して利用可能な空きレジスタが検出されない場合に、前記空きレジスタ割当手段は、前記ロード命令がデータを読み出す読出先として、前記ロード命令の実行位置における空きレジスタの何れかを割り当て、
    当該コンパイラ装置は、
    前記記憶装置にアクセスして、前記読出先として割り当てられたレジスタに既に割り当てられていた既割当変数の、値の生存区間を前記CPUの制御により検出する生存区間検出手段と、
    前記記憶装置にアクセスして、前記生存区間における空きレジスタである代替レジスタを前記CPUの制御により検出する代替レジスタ検出手段と、
    前記記憶装置にアクセスして、前記既割当変数に割り当てられていたレジスタを、前記CPUの制御により前記代替レジスタに変更する割当レジスタ変更手段と
    を更に備える請求項1記載のコンパイラ装置
  4. 前記記憶装置にアクセスして、前記CPUの制御により変数をレジスタに割り当てるレジスタ割当処理手段と、
    前記記憶装置にアクセスして、前記レジスタ割当処理手段によりレジスタに割当不能と判断された各変数について、当該変数の値を使用する命令に先立って当該変数の値をメモリからロードするスピルイン命令を前記CPUの制御により生成するスピルイン命令生成手段と
    を更に備え、
    前記部分冗長性除去手段は、前記ロード命令であるスピルイン命令に対して、前記部分冗長性の除去処理を行い、更に、当該スピルイン命令が読み出すデータの読出先を変数とし、
    前記空きレジスタ割当手段は、当該スピルイン命令が読み出すデータの読出先の当該変数に、前記後進方向レジスタ検出手段により検出された前記空きレジスタを割り当てる
    請求項1記載のコンパイラ装置
  5. 前記ロード命令から実行順序を辿ることにより前記ロード命令が読み出すデータを使用する使用命令に到達する実行経路において、何れの変数にも割り当てられていない空きレジスタを、前記CPUの制御により前記記憶装置にアクセスして検出する前進方向レジスタ検出手段を更に備え、
    前記空きレジスタ割当手段は、前記ロード命令がデータを読み出す読出先に、前記後進方向レジスタ検出手段及び前記前進方向レジスタ検出手段により共通して検出された空きレジスタを割り当てる
    請求項1記載のコンパイラ装置
  6. 最適化対象の対象プログラムにおいて、メモリからデータを読み出すロード命令を最適化するコンピュータであるコンパイラ装置であって、
    少なくとも一部の変数がレジスタに割り当てられておらず、レジスタに割り当てられていない変数の値の使用に先立って当該変数の値をメモリからロードするロード命令を含む、プログラムを、前記対象プログラムとして記憶している記憶装置と、
    前記対象プログラムの前記ロード命令を、少なくとも1つの空きレジスタが存在する範囲で移動させることで、当該ロード命令の部分冗長性を除去する処理を、前記コンピュータのCPUの制御により前記記憶装置にアクセスして行う部分冗長性除去手段と、
    前記ロード命令から実行順序を辿ることにより前記ロード命令が読み出すデータを使用する使用命令に到達する実行経路において、何れの変数にも割り当てられていない空きレジスタを、前記CPUの制御により前記記憶装置にアクセスして検出する前進方向レジスタ検出手段と、
    前記ロード命令がデータを読み出す読出先として、前記前進方向レジスタ検出手段により検出された前記空きレジスタを、前記CPUの制御により前記記憶装置にアクセスして割り当てる空きレジスタ割当手段と
    を備えるコンパイラ装置
  7. 前記前進方向レジスタ検出手段は、前記対象プログラムの始点から実行順序を辿る方向に空きレジスタの集合を示す情報を伝播させる処理により、空きレジスタを検出する
    請求項6記載のコンパイラ装置
  8. 最適化対象の対象プログラムにおいて、メモリからデータを読み出すロード命令を最適化するコンピュータであるコンパイラ装置であって、
    少なくとも一部の変数がレジスタに割り当てられておらず、レジスタに割り当てられていない変数の値の使用に先立って当該変数の値をメモリからロードするロード命令を含む、プログラムを、前記対象プログラムとして記憶している記憶装置と、
    前記対象プログラムの前記ロード命令を、少なくとも1つの空きレジスタが存在する範囲で移動させることで、当該ロード命令の部分冗長性を除去する処理を、前記コンピュータのCPUの制御により前記記憶装置にアクセスして行う部分冗長性除去手段と、
    前記ロード命令が実行される実行頻度と、当該ロード命令により読み出されるデータを使用する使用命令が実行される実行頻度とを前記CPUの制御により取得する実行頻度取得手段と、
    前記ロード命令及び前記使用命令のそれぞれが実行される実行位置において、何れの変数にも割り当てられていない空きレジスタの集合を、前記記憶装置にアクセスして前記CPUの制御により検出する空きレジスタ検出手段と、
    前記対象プログラムにおいて使用可能なそれぞれのレジスタについて当該レジスタが空きレジスタとなる各実行位置における前記ロード命令または前記使用命令の実行頻度を合計した実行頻度合計値を前記CPUの制御により算出する実行頻度合計値算出手段と、 前記ロード命令の実行位置における前記空きレジスタのうち前記実行頻度合計値が最も高い前記空きレジスタを、前記CPUの制御により、前記ロード命令の読出先として割り当てる空きレジスタ割当手段と
    を備えるコンパイラ装置
  9. 最適化対象の対象プログラムにおいて、メモリからデータを読み出すロード命令を最適化するコンパイラ装置としてコンピュータを機能させるコンパイラプログラムであって、
    前記コンピュータを、
    少なくとも一部の変数がレジスタに割り当てられておらず、レジスタに割り当てられていない変数の値の使用に先立って当該変数の値をメモリからロードするロード命令を含む、プログラムを、前記対象プログラムとして記憶している記憶装置と、
    前記対象プログラムの前記ロード命令を、少なくとも1つの空きレジスタが存在する範囲で移動させることで、当該ロード命令の部分冗長性を除去する処理を、前記コンピュータのCPUの制御により前記記憶装置にアクセスして行う部分冗長性除去手段と、
    前記ロード命令が読み出すデータを使用する使用命令から実行順序を遡ることにより前記ロード命令に到達する実行経路において、何れの変数にも割り当てられていない空きレジスタを、前記CPUの制御により前記記憶装置にアクセスして検出する後進方向レジスタ検出手段と、
    前記ロード命令がデータを読み出す読出先として、前記後進方向レジスタ検出手段により検出された前記空きレジスタを、前記CPUの制御により前記記憶装置にアクセスして割り当てる空きレジスタ割当手段と
    して機能させるコンパイラプログラム。
  10. 最適化対象の対象プログラムにおいて、メモリからデータを読み出すロード命令を最適化するコンパイラ装置としてコンピュータを機能させるコンパイラプログラムであって、
    前記コンピュータを、
    少なくとも一部の変数がレジスタに割り当てられておらず、レジスタに割り当てられていない変数の値の使用に先立って当該変数の値をメモリからロードするロード命令を含む、プログラムを、前記対象プログラムとして記憶している記憶装置と、
    前記対象プログラムの前記ロード命令を、少なくとも1つの空きレジスタが存在する範囲で移動させることで、当該ロード命令の部分冗長性を除去する処理を、前記コンピュータのCPUの制御により前記記憶装置にアクセスして行う部分冗長性除去手段と、
    前記ロード命令から実行順序を辿ることにより前記ロード命令が読み出すデータを使用する使用命令に到達する実行経路において、何れの変数にも割り当てられていない空きレジスタを、前記CPUの制御により前記記憶装置にアクセスして検出する前進方向レジスタ検出手段と、
    前記ロード命令がデータを読み出す読出先として、前記前進方向レジスタ検出手段により検出された前記空きレジスタを、前記CPUの制御により前記記憶装置にアクセスして割り当てる空きレジスタ割当手段と
    して機能させるコンパイラプログラム。
  11. 最適化対象の対象プログラムにおいて、メモリからデータを読み出すロード命令を最適化するコンパイラ装置としてコンピュータを機能させるコンパイラプログラムであって、
    前記コンピュータを、
    少なくとも一部の変数がレジスタに割り当てられておらず、レジスタに割り当てられていない変数の値の使用に先立って当該変数の値をメモリからロードするロード命令を含む、プログラムを、前記対象プログラムとして記憶している記憶装置と、
    前記対象プログラムの前記ロード命令を、少なくとも1つの空きレジスタが存在する範囲で移動させることで、当該ロード命令の部分冗長性を除去する処理を、前記コンピュータのCPUの制御により前記記憶装置にアクセスして行う部分冗長性除去手段と、
    前記ロード命令が実行される実行頻度と、当該ロード命令により読み出されるデータを使用する使用命令が実行される実行頻度とを前記CPUの制御により取得する実行頻度取得手段と、
    前記ロード命令及び前記使用命令のそれぞれが実行される実行位置において、何れの変数にも割り当てられていない空きレジスタの集合を、前記記憶装置にアクセスして前記CPUの制御により検出する空きレジスタ検出手段と、
    前記対象プログラムにおいて使用可能なそれぞれのレジスタについて当該レジスタが空きレジスタとなる各実行位置における前記ロード命令または前記使用命令の実行頻度を合計した実行頻度合計値を前記CPUの制御により算出する実行頻度合計値算出手段と、 前記ロード命令の実行位置における前記空きレジスタのうち前記実行頻度合計値が最も高い前記空きレジスタを、前記CPUの制御により、前記ロード命令の読出先として割り当てる空きレジスタ割当手段と
    して機能させるコンパイラプログラム。
JP2003339666A 2003-09-30 2003-09-30 最適化コンパイラ、コンパイラプログラム、及び記録媒体 Expired - Fee Related JP4042972B2 (ja)

Priority Applications (2)

Application Number Priority Date Filing Date Title
JP2003339666A JP4042972B2 (ja) 2003-09-30 2003-09-30 最適化コンパイラ、コンパイラプログラム、及び記録媒体
US10/940,541 US7523448B2 (en) 2003-09-30 2004-09-13 Optimizing compiler

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP2003339666A JP4042972B2 (ja) 2003-09-30 2003-09-30 最適化コンパイラ、コンパイラプログラム、及び記録媒体

Publications (2)

Publication Number Publication Date
JP2005107816A JP2005107816A (ja) 2005-04-21
JP4042972B2 true JP4042972B2 (ja) 2008-02-06

Family

ID=34373359

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2003339666A Expired - Fee Related JP4042972B2 (ja) 2003-09-30 2003-09-30 最適化コンパイラ、コンパイラプログラム、及び記録媒体

Country Status (2)

Country Link
US (1) US7523448B2 (ja)
JP (1) JP4042972B2 (ja)

Families Citing this family (10)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US7971191B2 (en) * 2004-06-10 2011-06-28 Hewlett-Packard Development Company, L.P. System and method for analyzing a process
US7836448B1 (en) * 2004-06-30 2010-11-16 Emc Corporation System and methods for task management
JP2006338616A (ja) * 2005-06-06 2006-12-14 Matsushita Electric Ind Co Ltd コンパイラ装置
ATE486316T1 (de) * 2005-08-30 2010-11-15 Sony Ericsson Mobile Comm Ab Verfahren und software für die optimierung der positionierung von software-funktionen in einem speicher
US9009692B2 (en) * 2009-12-26 2015-04-14 Oracle America, Inc. Minimizing register spills by using register moves
JP2013242700A (ja) 2012-05-21 2013-12-05 Internatl Business Mach Corp <Ibm> コード最適化方法、プログラム及びシステム
US10175964B2 (en) * 2014-09-26 2019-01-08 Microsoft Technology Licensing, Llc Compiler caching for runtime routine redundancy tracking
EP3704572A1 (en) 2017-11-03 2020-09-09 Coherent Logix, Inc. Programming flow for multi-processor system
JP7225900B2 (ja) 2019-02-25 2023-02-21 富士通株式会社 コンパイラ装置、プログラム、及び情報処理方法
CN110795239A (zh) * 2019-10-15 2020-02-14 浙江口碑网络技术有限公司 应用内存泄露的检测方法及装置

Family Cites Families (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US5664193A (en) * 1995-11-17 1997-09-02 Sun Microsystems, Inc. Method and apparatus for automatic selection of the load latency to be used in modulo scheduling in an optimizing compiler
US6128775A (en) * 1998-06-16 2000-10-03 Silicon Graphics, Incorporated Method, system, and computer program product for performing register promotion via load and store placement optimization within an optimizing compiler
US6934943B2 (en) * 2001-10-18 2005-08-23 Hewlett-Packard Development Company Optimization of control transfers to dynamically loaded modules
US20040154010A1 (en) * 2003-01-31 2004-08-05 Pedro Marcuello Control-quasi-independent-points guided speculative multithreading

Also Published As

Publication number Publication date
JP2005107816A (ja) 2005-04-21
US20050071832A1 (en) 2005-03-31
US7523448B2 (en) 2009-04-21

Similar Documents

Publication Publication Date Title
US8291398B2 (en) Compiler for optimizing program
US8104026B2 (en) Compiler register allocation and compilation
US8271960B2 (en) Obtaining profile data for use in optimizing computer programming code
JP5165969B2 (ja) プログラムのコンパイルのために変数にレジスタを割り付ける技術
US7406684B2 (en) Compiler, dynamic compiler, and replay compiler
US20080129740A1 (en) Image processing apparatus, storage medium that stores image processing program, and image processing method
JP5703729B2 (ja) データ処理装置及びプログラム
JP4042972B2 (ja) 最適化コンパイラ、コンパイラプログラム、及び記録媒体
JP2008021249A (ja) 画像処理装置及びプログラム
JP2009054003A (ja) 画像処理装置及びプログラム
JP5697195B2 (ja) アクセス予測に基づいてテーブルのミラーリングを制御する管理システム、プログラムおよび方法
US20200285510A1 (en) High precision load distribution among processors
US20090164773A1 (en) Dynamic reconfiguration supporting method, dynamic reconfiguration supporting apparatus, and dynamic reconfiguration system
JPH09212369A (ja) 記憶域割り付け装置
US6948009B2 (en) Method, system, and article of manufacture for increasing processor utilization
JP4039633B2 (ja) 最適化コンパイラ、コンパイル方法、コンパイラプログラム、及び記録媒体
JP7323769B2 (ja) ストレージ装置、ストレージシステムおよびプログラム
US9311065B2 (en) Data splitting for multi-instantiated objects
JP2009199367A (ja) 計算機システム、i/oスケジューラ及びi/oスケジューリング方法
JP2022144168A (ja) プログラム、情報処理装置および情報処理方法
JPWO2004084095A1 (ja) 情報検索システム,情報検索方法,情報検索装置,情報検索プログラムおよび当該プログラムを記録したコンピュータ読取可能な記録媒体
US20040187101A1 (en) Compiler, compiler program, recording medium, and compiling method
JP4984303B2 (ja) 後処理カーネルのダイナミックリンキングおよびダイナミックローディング
JP2021018711A (ja) タスク実行管理装置、タスク実行管理方法、および、タスク実行管理プログラム
JP2009053829A (ja) 情報処理装置、情報処理プログラム

Legal Events

Date Code Title Description
A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A131

Effective date: 20070626

A521 Written amendment

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20070920

A521 Written amendment

Free format text: JAPANESE INTERMEDIATE CODE: A821

Effective date: 20070920

TRDD Decision of grant or rejection written
A01 Written decision to grant a patent or to grant a registration (utility model)

Free format text: JAPANESE INTERMEDIATE CODE: A01

Effective date: 20071106

RD14 Notification of resignation of power of sub attorney

Free format text: JAPANESE INTERMEDIATE CODE: A7434

Effective date: 20071108

A61 First payment of annual fees (during grant procedure)

Free format text: JAPANESE INTERMEDIATE CODE: A61

Effective date: 20071109

R150 Certificate of patent or registration of utility model

Free format text: JAPANESE INTERMEDIATE CODE: R150

FPAY Renewal fee payment (event date is renewal date of database)

Free format text: PAYMENT UNTIL: 20101122

Year of fee payment: 3

FPAY Renewal fee payment (event date is renewal date of database)

Free format text: PAYMENT UNTIL: 20101122

Year of fee payment: 3

FPAY Renewal fee payment (event date is renewal date of database)

Free format text: PAYMENT UNTIL: 20111122

Year of fee payment: 4

LAPS Cancellation because of no payment of annual fees