JP2009110299A - プログラムを最適化するコンパイラ - Google Patents

プログラムを最適化するコンパイラ Download PDF

Info

Publication number
JP2009110299A
JP2009110299A JP2007282322A JP2007282322A JP2009110299A JP 2009110299 A JP2009110299 A JP 2009110299A JP 2007282322 A JP2007282322 A JP 2007282322A JP 2007282322 A JP2007282322 A JP 2007282322A JP 2009110299 A JP2009110299 A JP 2009110299A
Authority
JP
Japan
Prior art keywords
variable
instruction
value
range
program
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.)
Granted
Application number
JP2007282322A
Other languages
English (en)
Other versions
JP5039948B2 (ja
Inventor
Motohiro Kawahito
基弘 川人
Takao Moriyama
孝男 森山
Hideaki Komatsu
秀昭 小松
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 JP2007282322A priority Critical patent/JP5039948B2/ja
Priority to US12/259,746 priority patent/US8291398B2/en
Publication of JP2009110299A publication Critical patent/JP2009110299A/ja
Application granted granted Critical
Publication of JP5039948B2 publication Critical patent/JP5039948B2/ja
Expired - Fee Related legal-status Critical Current
Anticipated expiration legal-status Critical

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
    • 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
    • G06F8/4434Reducing the memory space required by the program code
    • G06F8/4435Detection or removal of dead or redundant code

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)

Abstract

【課題】変数に代入するべき値を算出する処理を最適化する。
【解決手段】プログラムを最適化するコンパイラ装置であって、前記プログラム中の変数に値を代入する命令について、当該命令が実行された場合における当該変数の値域として、当該命令が当該変数に代入し得る値の範囲を解析する値域解析部と、解析した前記変数の値域に基づいて、当該命令が前記変数の値域内の何れの値を当該変数に代入しても、前記プログラムの実行結果が変化しないか判断する判断部と、前記判断部による判断が成立することを条件に、当該変数に値を代入する当該命令を、前記変数の値域内の定数値を当該変数に代入する命令に置換する置換部とを備えるコンパイラ装置を提供する。
【選択図】図8

Description

本発明は、プログラムを最適化するコンパイラに関する。特に、本発明は、変数に値を代入する命令を最適化するコンパイラに関する。
プログラム言語の言語処理系、または、オペレーティング・システムは、ライブラリ・プログラムと呼ばれる、よく使われる機能を集めたプログラム群を有している。ライブラリ・プログラムは、ユーザ・プログラムから呼び出されて処理を開始し、その処理結果を戻り値としてユーザ・プログラムにリターンする。
例えば、Java(登録商標)言語のStringクラスのindexOfメソッドは、引数として指定された文字を、引数として指定された文字列の中から検索して、その文字のインデックス(例えば先頭から何番目かを示す数値)をリターンする。その文字が検索されなければ、検索されない旨を示す−1という数値をリターンする。
また、他の例として、引数として指定された条件を満たすオブジェクトを生成するメソッドは、オブジェクトの生成に成功した場合にはそのオブジェクトのポインタをリターンする。一方、そのオブジェクトの生成に失敗すれば、オブジェクトの生成に失敗する旨を示す定数NULLをリターンする。
これらの例のように、戻り値は、場合によって複数の性質を有する場合がある。即ち、戻り値は、インデックスまたはポインタなどの処理結果のみならず、−1またはNULLなどの特別な数値によって処理の成否を表す。
なお、参考文献として、代入命令に関する各種の最適化については以下の特許文献1を参照されたい。非特許文献1−2については、後に参照する。
特開2003−196106号公報 M. Kawahito et al, A new idiom recognition framework for exploiting hardware-assist instructions, ASPLOS'06. W. Harrison. "Compiler Analysis of the Value Ranges for Variables" In IEEE Transactions on Software Engineering, Vol. 3, No. 3, pp.243-250, 1977.
リターンされた数値は、変数に代入されて、その後の処理において参照される。例えば、ユーザ・プログラムにおいて、その変数は定数と比較される。また、その変数は四則演算に用いられてもよい。しかしながら、ユーザ・プログラムによっては、その変数を−1またはNULLなどの特別な定数値のみと比較し、他の変数との比較または四則演算には使用しない場合がある。この場合、その変数に代入すべき具体的な数値、例えばインデックスまたはオブジェクトへのポインタなど、を求める処理は無駄になっていた。
そこで本発明は、上記の課題を解決することのできるコンパイラ装置、コンパイル方法およびコンパイラプログラムを提供することを目的とする。この目的は特許請求の範囲における独立項に記載の特徴の組み合わせにより達成される。また従属項は本発明の更なる有利な具体例を規定する。
上記課題を解決するために、本発明の第1の形態においては、プログラムを最適化するコンパイラ装置であって、前記プログラム中の変数に値を代入する命令について、当該命令が実行された場合における当該変数の値域として、当該命令が当該変数に代入し得る値の範囲を解析する値域解析部と、解析した前記変数の値域に基づいて、当該命令が前記変数の値域内の何れの値を当該変数に代入しても、前記プログラムの実行結果が変化しないか判断する判断部と、前記判断部による判断が成立することを条件に、当該変数に値を代入する当該命令を、前記変数の値域内の定数値を当該変数に代入する命令に置換する置換部とを備えるコンパイラ装置を提供する。また、当該コンパイラ装置としてコンピュータを機能させるコンパイラプログラム、および、当該コンパイラ装置によってプログラムを最適化するコンパイル方法を提供する。
なお、上記の発明の概要は、本発明の必要な特徴の全てを列挙したものではなく、これらの特徴群のサブコンビネーションもまた、発明となりうる。
以下、発明の実施の形態を通じて本発明を説明するが、以下の実施形態は特許請求の範囲にかかる発明を限定するものではなく、また実施形態の中で説明されている特徴の組み合わせの全てが発明の解決手段に必須であるとは限らない。
図1は、本実施形態に係るコンパイラ装置10の全体構成を示す。コンパイラ装置10は、プログラムを読み込んで実行するコンピュータにより実現される。具体的には、コンパイラ装置10は、基本的なハードウェアとしてCPU1000と、記憶装置1040とを備える。そして、CPU1000が記憶装置1040からコンパイラプログラム15を読み出して実行することで、コンピュータはコンパイラ装置10として機能する。
コンパイラ装置10は、例えばJava(登録商標)言語などの高級言語で記述された入力プログラム20をコンパイルし、コンピュータにより実行可能な実行コードを生成して出力する。その実行コードは、例えばIBMコーポレーションのSystem zアーキティクチャまたはSystem pアーキティクチャを構成するコンピュータにより実行可能な実行コードであってよい。その実行コードのことを出力プログラム28と呼ぶ。
コンパイル機能の具体例として、コンパイラ装置10は、CPU1000にコンパイラプログラム15を実行させることで、前段最適化部100と、代入最適化部110と、後段最適化部120として機能する。前段最適化部100は、予め記憶装置1040に記憶されていたライブラリ・プログラム22から、入力プログラム20の実行に必要な部分を選択する。そして、前段最適化部100は、その選択した部分および入力プログラム20を結合したプログラムを最適化する。
例えば、前段最適化部100は、入力プログラム20の字句解析または構文解析などのいわゆるフロントエンドのコンパイル処理を行ってもよいし、これに加えて、例えばメソッド・インライニング、または、メソッド間解析などの最適化を行ってもよい。最適化したプログラムは中間プログラム24として記憶装置1040に記憶される。
代入最適化部110は、記憶装置1040にアクセスして中間プログラム24を読み出し、読み出したその中間プログラム24に含まれる、変数に値を代入する命令を最適化する。例えば、代入最適化部110は、中間プログラム24を走査することで、例えばデータフロー解析などの手法により、中間プログラム24中の各命令の実行時における各変数の値域(subrange)を解析してよい。一例として、代入最適化部110は、変数の値域として、ある代入命令が変数に代入し得る値の範囲を解析する。
その結果を利用して、代入最適化部110は、その代入命令を最適化する。例えば、代入最適化部110は、その代入命令が、その変数の値域内の何れの値を当該変数に代入したとしても、出力プログラム28の実行結果が入力プログラム20の元の意味から変化しないかを判断する。変化しないとすれば、代入最適化部110は、当該代入命令を、当該変数の値域を代表する所定の定数値を当該変数に代入する命令に置換する。これにより、代入すべき値を生成する処理、例えば、演算によって値を算出する処理が不要とすることができる。
最適化されたプログラムは中間プログラム26として記憶装置1040に格納される。続いて、後段最適化部120は、中間プログラム26について各種の最適化を行う。後段最適化部120は、上記代入命令が最適化された結果として副次的に可能となった最適化を行う。例えば、演算によって値を算出する処理が不要となった場合には、その結果として、その演算に用いていた他の変数も使用されなくなっている場合がある。その場合には、後段最適化部120は、当該他の変数の値を算出するための処理を削除できる。
その他に、後段最適化部120は、最適化したプログラムを、具体的な機械語に置き換える処理などの、いわゆるバックエンドのコンパイル処理を行ってよい。コンパイルされたプログラムは、出力プログラム28として外部に出力される。
このように、本実施形態に係るコンパイラ装置10は、代入命令を最適化することで、代入すべき値を生成するための処理を不要とし、さらに、その処理が不要となったことにより追加的に各種の最適化を行うことができる。以降、詳しく説明する。
まず、代入命令の最適化の第1例を、図2−4を参照して説明する。この例において入力プログラム20を入力プログラム20Aとし、ライブラリ・プログラム22をライブラリ・プログラム22Aとし、中間プログラム24を中間プログラム24Aとし、中間プログラム26を中間プログラム26Aとする。
図2は、本実施形態に係る入力プログラム20Aおよびライブラリ・プログラム22Aの具体例を示す。入力プログラム20Aは、1行目に、methodAというメソッドを呼び出して、その戻り値をanswerという変数の代入する命令を含む。また、入力プログラム20Aは、3−5行目に、その変数answerの値がnullポインタと等しければ、オブジェクトの生成に失敗したとして、所定の処理を行う命令を含む。
一方、ライブラリ・プログラム22Aは、1−7行目に、methodAの定義を含む。具体的には、ライブラリ・プログラム22Aは、2行目に、変数answerにnullポインタを代入する処理を含む。また、ライブラリ・プログラム22Aは、3−5行目に、所定の条件が成立した場合には新たなオブジェクトを生成して、そのポインタを変数answerに代入する処理を含む。また、ライブラリ・プログラム22Aは、6行目に、変数answerの値を戻り値としてリターンする命令を含む。
前段最適化部100は、このmethodAをインライン展開することで、中間プログラム24Aを生成する。
図3は、本実施形態に係る中間プログラム24Aの具体例を示す。1−4行目には、methodA内の各命令が、戻り値をリターンする命令を除きそのまま展開されている。
この中間プログラム24Aを参照すると、1行目または3行目で値が代入された変数answerは、その後6行目の条件分岐命令のみによって参照されている。そして、その条件分岐命令は、変数answerを単にnullポインタと比較している。このように、メソッドをインライン展開すると、同一のプログラムが変数の代入および参照の双方を含むようになる場合が多い。
この中間プログラム24Aにおいて、変数answerが単に定数値と比較され、かつ、他の用途で使用されない場合には、変数answerに代入する値を生成する具体的な処理、例えばここではオブジェクトを生成する処理は無駄になってしまう。代入最適化部110は、このような代入命令を、単に定数値を変数に代入する命令に置換する。代入命令を置換したプログラムを中間プログラム26Aとして図4に示す。
図4は、本実施形態に係る中間プログラム26Aの具体例を示す。中間プログラム24Aの3行目に含まれる代入命令は、中間プログラム26Aにおいて、定数0x0000beefを変数に代入する命令に置換されている。命令をこのように置換しても、変数answerはnullとの比較のみに用いられるので、中間プログラム26Aの実行結果は中間プログラム24Aと相違しない。
以上、この第1例に示すように、コンパイラ装置10によれば、記憶領域の確保および初期化などの、オブジェクトの生成に伴う各種の処理を省略して、プログラムの実行を効率化できる。
次に、代入命令の最適化の第2例を、図5−7を参照して説明する。
図5は、本実施形態に係る入力プログラム20Bおよびライブラリ・プログラム22Bの具体例を示す。入力プログラム20Bは、1行目に、methodBというメソッドを呼び出して、その戻り値をanswerという変数の代入する命令を含む。また、入力プログラム20Aは、3−5行目に、その変数answerの値が整数−1という定数値と等しければ、文字の検索に失敗したとして、所定の処理を行う命令を含む。
一方、ライブラリ・プログラム22Bは、1−9行目に、methodBの定義を含む。このmethodBは、Java(登録商標)言語のStringクラスに定義されたindexOfメソッドの一部を示す。
具体的には、ライブラリ・プログラム22Bは、2行目に、変数iを変数offsetの値で初期化する処理を含む。また、ライブラリ・プログラム22Bは、3−7行目に、配列変数aの各要素を変数chと順次比較する命令群を含む。たとえば、ライブラリ・プログラム22Bは、4行目に、配列変数aのi番目の要素が所定の変数chと等しければ、変数iと変数offsetとの差を変数answerに代入する命令を含む。
また、ライブラリ・プログラム22Bは、6行目に、変数lenの値と等しい個数の、配列変数aの要素を走査しても、変数chの等しい要素が検索されなければ、変数answerに数値−1を代入する命令を含む。ライブラリ・プログラム22Bは、また、8行目に、変数answerの値を戻り値としてリターンする命令を含む。
前段最適化部100は、このmethodBをインライン展開することで、中間プログラム24Bを生成する。
図6は、本実施形態に係る中間プログラム24Bの具体例を示す。1−6行目には、methodB内の各命令が、戻り値をリターンする命令を除きそのまま展開されている。
この中間プログラム24Bを参照すると、3行目または5行目で値が代入された変数answerは、その後8行目の条件分岐命令のみによって参照されている。そして、その条件分岐命令は、変数answerを単に定数−1と比較している。このように、この例でも、メソッドをインライン展開することで、同一のプログラムが変数の代入および参照の双方を含むようになる。
この中間プログラム24Bにおいて、変数answerが単に定数値と比較され、かつ、他の用途で使用されない場合には、変数answerに代入する値を生成する具体的な処理、例えばここでは3行目の、変数iから変数offsetの値を減じる演算は無駄になってしまう。代入最適化部110は、このような代入命令を、単に定数値を変数に代入する命令に置換する。代入命令を置換したプログラムを中間プログラム26Bとして図7に示す。
図7は、本実施形態に係る中間プログラム26Bの具体例を示す。中間プログラム24Bの3行目に含まれる代入命令は、中間プログラム26Bにおいて、定数値である整数1を変数に代入する命令に置換されている。命令をこのように置換しても、変数answerは定数−1との比較のみに用いられるので、中間プログラム26Bの実行結果は中間プログラム24Bと相違しない。この結果、中間プログラム24Bと比較して中間プログラム26Bにおいては、演算処理を省略することができる。
第2例として説明したこの最適化は、プログラムを特定のアーキティクチャで実行させようとする場合には特に効果的である。例えば、IBMコーポレーションのSystem pなどでは、配列変数の8つの要素の中に特定の要素値が含まれるかどうかを、極めて高速に判断する機械語命令を有する。但し、この機械語命令は、その要素値が、配列変数の何番目の要素に含まれているかを判断することはできない。
中間プログラム24Bの3行目において、特定の要素値chと等しい要素が検索されると、その要素が配列変数aの何番目にあるかが算出されて、その値が変数answerに代入されている。このため、後段最適化部120は、中間プログラム24Bを、上記機械語命令を使用した実行コードに置き換えることは難しい。
一方で、中間プログラム26Bの3行目においては、特定の要素値chと等しい要素が検索されても、特定の定数値1が変数answerに代入されるだけである。このため、後段最適化部120は、中間プログラム26Bを、上記機械語命令を使用した高速処理可能な実行コードに置き換えることができる。
このように、本実施形態に係る代入最適化部110によれば、値を算出する演算を単に削除できるだけでなく、演算を削除した結果として他の最適化の機会を拡大することができる。
続いて、代入命令の最適化の機能について更に詳しく説明する。
図8は、本実施形態に係る代入最適化部110の機能構成を示す。代入最適化部110は、値域解析部800と、判断部830と、置換部840と、イディオム検出部850とを備える。値域解析部800は、記憶装置1040にアクセスして中間プログラム24を読み出す。そして、値域解析部800は、中間プログラム24中の変数に値を代入する命令について、その命令が実行された場合におけるその変数の値域として、その命令がその変数に代入し得る値の範囲を解析する。
例えば、図3の中間プログラム24Aの3行目のように、ある命令がオブジェクトのポインタを変数に代入する場合において、その変数に代入される値は、nullポインタ以外の範囲であることが解析される。また、図6の中間プログラム24Bの1行目および4行目を参照すると、変数iは変数offsetの値で初期化された後に順次インクリメントされるので、変数iの値は変数offsetの値以上であることが分かる。その結果、3行目で変数answerに代入される値(i−offset)は、0以上の範囲であることが解析される。
また、値域解析部800は、中間プログラム24を走査することで、中間プログラム24中のその変数を参照するそれぞれの命令について、その命令が実行された場合におけるその変数の値域を解析する。その変数の値に基づいて条件分岐する命令については、値域解析部800は、当該条件分岐によるそれぞれの分岐先に対応付けて、当該分岐先における当該変数の値域を解析してよい。例えば、図3の中間プログラム24Aの6行目のように、変数を定数と比較して条件分岐する命令について、値域解析部800は、一方の分岐先における変数の値域を「null以外の全域」と解析し、他方の分岐先における変数の値域を「null」と解析する。解析結果は値域データ50として記憶装置1040に格納されてもよいし、判断部830に対し出力されてもよい。
以上の解析の実現には、変数値の範囲分析(value range analysis)の技術が利用される(例えば上記非特許文献2を参照。)。この技術は当該技術分野において周知であり、その概要は以下の通りである。まず、値域解析部800は、中間プログラム24を複数の基本ブロックに分割する。そして、値域解析部800は、それぞれの基本ブロックについて、変数値の範囲を決定付ける命令を検出する。そして、値域解析部800は、検出したその命令に基づいてその変数値の範囲を基本ブロック毎に決定付ける。
例えば、変数aが定数0より大きいことを条件とする条件分岐命令が検出された場合に、値域解析部800は、その分岐先の基本ブロックにおいて、その変数aの値の範囲は正の数であると決定付ける。また、プログラム言語の仕様によって、配列変数の添え字が正の数であることが、予め定められている場合において、変数を添え字とする配列変数の参照命令が検出された場合に、値域解析部800は、その添え字の変数値の範囲は正の数であると決定付ける。変数に四則演算の結果が代入される場合など、その変数の範囲が不定の場合には、その変数の値の範囲は全域と決定付けられる。
そして、値域解析部800は、解析したその範囲の情報を、プログラムの実行方向に沿って、他の基本ブロックに順次伝播させる。例えば、第1の基本ブロックにおいてある変数aの値の範囲が正の数と決定付けられた場合において、その第1の基本ブロックの次に実行される第2の基本ブロックにおいても、その変数aの値は正の数である。また、その第1の基本ブロックの末尾が条件分岐命令であり、その次に第2の基本ブロックおよび第3の基本ブロックの何れかが実行される場合においては、それら第2および第3の基本ブロックのそれぞれにおいてその変数aの値は正の数である。
但し、その条件分岐命令がその変数aの値に基づく場合にはこの限りでない。例えば、その変数aの値が定数10より大きい場合には第2の基本ブロックが実行され、その他の場合において第3の基本ブロックが実行される場合において、第2の基本ブロックにおける変数aの値は定数10より大きい。一方、第3の基本ブロックにおける変数aの値は0より大きく、かつ、10以下である。
値域解析部800は、以上のような、変数の値の範囲の伝播を、変数の値の範囲が変更されなくなるまで繰り返す。
このような解析の結果は、その後の処理において効率的に参照可能とするために、所定のデータ構造に整形されて管理されることが望ましい。また、このような解析の結果の一部は、その後の処理を効率化する観点から不要となる場合がある。これらの目的を実現するため、値域解析部800は、データ生成部805と、第1データ除外部810と、第2データ除外部820とを備える。これらの各部の処理については、後に詳しく説明する。
次に、判断部830、置換部840およびイディオム検出部850について説明する。判断部830は、値域解析部800により解析された変数の値域に基づいて、代入命令が当該変数の値域内の何れの値を当該変数に代入したとしても、中間プログラム24の実行結果が変化しないかを判断する。
具体的には、判断部830は、当該変数の値を代入するある命令についての当該変数の値域が、代入された当該変数の値に基づいて条件分岐するある命令の何れかの分岐先における当該変数の値域に包含され、かつ、他の何れの分岐先における当該変数の値域および当該変数を参照する他の何れの命令についての当該変数の値域とも重複しないかを判断する。
例えば、図3の中間プログラム24Aは、3行目に、変数answerにオブジェクトへのポインタを代入する命令を含む。この変数answerの値域は、上記分析の結果、null以外である。一方、図3の中間プログラム24Aは、6行目に、変数answerを定数nullと比較する条件分岐命令を含む。この条件分岐命令の一方の分岐先において、変数answerの値域はnull以外であり、他方の分岐先において、変数answerの値域はnullのみである。
この例において、代入命令における変数answerの値域は、一方の分岐先における変数answerの値域を包含しており、かつ、他方の分岐先における変数answerの値域と重複しない。また、変数answerを参照する他の命令は存在しない。このため、判断部830による判断は成立する。
他の例として、図6の中間プログラム24Bは、3行目に、変数answerに数式(i−offset)の値を代入する命令を含む。この変数answerの値域は、上記分析の結果、0以上の整数である。一方、図6の中間プログラム24Bは、8行目に、変数answerを定数−1と比較する条件分岐命令を含む。この条件分岐命令の一方の分岐先において、変数answerの値域は−1以外であり、他方の分岐先において、変数answerの値域は−1のみである。
この例において、代入命令における変数answerの値域は、一方の分岐先における変数answerの値域を包含しており、かつ、他方の分岐先における変数answerの値域と重複しない。また、変数answerを参照する他の命令は存在しない。このため、判断部830による判断は成立する。
置換部840は、判断部830による判断が成立することを条件に、記憶装置1040にアクセスして、当該変数に値を代入する当該命令を、当該命令についての当該変数の値域内の定数値を当該変数に代入する命令に置換することで、中間プログラム24を変更する。例えば、中間プログラム24Aにおいて、3行目の代入命令により代入される値の範囲は0以上なので、置換部840は、この代入命令を、0以上の定数である1を代入する命令に置換する。
他の例として、中間プログラム24Bにおいて、3行目の代入命令により代入される値の範囲はnull以外なので、置換部840は、この代入命令を、null以外のポインタである0x0000beefを代入する命令に置換する。変更されたプログラムは中間プログラム26として記憶装置1040に格納される。
イディオム検出部850は、単なる代入文ではなく、予め定められた一連の処理(このことをイディオムと呼ぶ)の結果を変数に代入する処理を検出する。イディオムの検出について、詳しくは、非特許文献1を参照されたい。そして、イディオム検出部850は、判断部830および置換部840と共に、検出したこのイディオムを最適化する。この処理の詳細については後に詳しく述べる。
図9は、本実施形態に係る代入最適化部110により代入命令が最適化される処理の流れを示す。まず、値域解析部800は、中間プログラム24中のある変数vに値を代入する命令sを選択する(S900)。そして、値域解析部800は、変数vおよびこの選択した命令uについて、以下の処理を行う。
値域解析部800は、その命令sがその変数vに代入し得る値の範囲を、その命令sが実行された場合におけるその変数vの値域として解析する(S905)。また、データ生成部805は、その変数vを参照する中間プログラム24中の全ての命令のそれぞれについて、当該命令が実行された場合における当該変数の値域を解析する(S910)。解析結果は値域データ50として判断部830に対し出力される。この処理の詳細を、図10を参照して説明する。
図10は、図9のS910における処理の詳細を示す。まず、データ生成部805は、変数vを参照するある命令uを選択する(S1000)。次に、データ生成部805は、命令uが、変数vを他の変数wに代入する命令かどうかを判断する(S1010)。
命令uが、変数vを他の変数wに代入する命令である場合に(S1010:YES)、データ生成部805は、変数wを新たな変数vとみなして、S910を再帰的に処理する(S1020)。
次に、データ生成部805は、命令uが変数vを定数値と比較する命令かどうかを判断する(S1030)。データ生成部805は、命令uが変数vを定数値と比較する命令の場合に(S1030:YES)、後の処理により利用される論理値をFALSEに設定する(S1050)。この論理値FALSEは、変数vの値を所定の他の定数で置き換える可能性がある状態を示す。
一方、データ生成部805は、命令uが変数vを定数値と比較する命令でない場合に(S1030:NO)、後の処理により利用される論理値をTRUEに設定する(S1040)。この論理値TRUEは、変数vの値を他の値では一切代用できない状態を示す。
次に、データ生成部805は、命令uが変数vの値に基づく条件分岐命令であるかを判断する(S1060)。条件分岐命令ではない場合に(S1060:NO)、データ生成部805は、この命令uについての値域データを1つ生成する。値域データは、命令uが実行される直前における変数vの値域、命令uが実行された直後における変数vの値域、および、命令uが変数vを定数と比較する命令かどうかを示す上記論理値、の3つを要素とするデータである。
一方、命令uが変数vの値に基づく条件分岐命令である場合に(S1060:YES)、データ生成部805は、その条件分岐命令それぞれの分岐先について次の処理を繰り返す(S1080−S1090)。その処理とは、その条件分岐命令が実行される直前における変数vの値域、当該分岐先におけるその条件分岐命令が実行された直後の変数vの値域、および、上記論理値、の3つを要素とするデータを、値域データとして生成する処理である(S1085)。
図3の中間プログラム24Aの例で、変数answerが変数vとして選択されたとすると、変数answerの値に基づく6行目の条件分岐命令について、(全域、null以外、FALSE)という値域データと、(全域、null、FALSE)という値域データが生成される。また、図6の中間プログラム24Bの例で、変数answerが変数vとして選択されたとすると、変数answerの値に基づく8行目の条件分岐命令について、(全域、−1以外、FALSE)という値域データと、(全域、−1、FALSE)という値域データが生成される。
生成された値域データは、値域データの集合を示す値域データ50に順次追加される。また、上記S1020として説明した再帰的な処理によって生成された値域データも、値域データ50に併合される。全く同じ複数の値域データが値域データ50に含まれる場合には、データ生成部805は、それらをそのうち1つを除き値域データ50から除外する。次に、データ生成部805は、変数vを使用する全ての命令を命令uとして選択済みかどうかを判断する(S1095)。選択してない命令があれば(S1095:NO)、データ生成部805は、S1000に処理を戻して処理を繰り返す。選択済みであれば(S1095:YES)、データ生成部805は、S910の処理を終了する。
図9の説明に戻る。次に、第1データ除外部810は、除外処理1として、値域データ50の中から不要な値域データを削除する(S920)。
図11は、図9のS920における処理の詳細を示す。まず、第1データ除外部810は、論理値がFALSEの値域データを1つ、値域データ50の中から選択する(S1100)。そして、第1データ除外部810は、選択したその値域データが、他の何れかの値域データと比較して、実行直前および実行直後における変数の値域の組が相互に等しいかを判断する(S1110)。
等しい場合には(S1110:YES)、第1データ除外部810は、選択したその値域データの論理値がTRUEかどうかを判断する(S1120)。論理値がTRUEの場合に(S1120:YES)、第1データ除外部810は、選択したその値域データを削除する(S1130)。そして、次に、第1データ除外部810は、論理値がFALSEである全ての値域データを選択済みであるかどうかを判断する(S1140)。
選択済みでなければ(S1140:NO)、第1データ除外部810は、S1100に処理を戻して次の値域データを選択する(S1100)。選択済みであれば(S1140:YES)、第1データ除外部810は、S920の処理を終了する。
以上、S920の処理によれば、変数vが条件分岐命令のために定数と比較され、かつ、その分岐先で四則演算に用いられているような場合には、変数vの値が具体的に必要であることを示す情報のみを残して、最適化を適切に制御できる。
図9の説明に戻る。次に、第2データ除外部820は、第2の除外処理として、値域データ50の中から不要な値域データをさらに削除する(S930)。
図12は、図9のS930における処理の詳細を示す。まず、第2データ除外部820は、論理値がFALSEの値域データを1つ、値域データ50の中から選択する(S1200)。そして、第2データ除外部820は、選択したその値域データに含まれる、実行後の変数の値域が、他の何れかの値域データに含まれる、実行前の変数の値域と等しいかどうかを判断する(S1210)。
等しい場合には(S1210:YES)、第2データ除外部820は、選択したその値域データを削除する(S1220)。そして、第2データ除外部820は、論理値がFALSEの全ての値域データを既に値域データ50から全て選択済みかどうかを判断する(S1230)。選択済みでなければ(S1230:NO)、第2データ除外部820は、S1200に処理を戻して他の値域データを選択する。選択済みであれば(S1230:YES)、第2データ除外部820は、S930の処理を終了する。
以上、この第2の除外処理によれば、ある値域データの「実行後の変数の値域」が、他の値域データの「実行後の変数の値域」と一部重複する場合には、より狭い値域を有する一方の値域データのみを値域データ50中に残し、他方の値域データを削除することができる。これにより、例えばバイナリ・サーチ(2分検索)などのような、条件分岐の入れ子構造について、中間的な判断を表す条件分岐を判断の対象から除外できる。
図9の説明に戻る。次に、判断部830は、値域データ50に基づいて、代入命令sについてS905において解析した値域内の何れの値を命令sが変数vに代入したとしても、中間プログラム24の実行結果が変化しないかを判断する(S940)。
図13は、図9のS940における処理の詳細を示す。まず、判断部830は、記憶装置1040にアクセスして、論理値がFALSEの値域データを値域データ50の中から選択して読み出す(S1300)。
次に、判断部830は、選択したその値域データの、実行後の変数の値域が、命令sの変数の値域を包含するかどうかを判断する(S1310)。包含しなければ(S1310:NO)、判断部830は、論理値がFALSEである全ての値域データを値域データ50から選択済みかどうかを判断する(S1315)。
選択済みでなければ(S1315:NO)、判断部830は、S1300に処理を戻して次の値域データを選択する。選択済みであれば(S1315:YES)、判断部830は、代入命令(s)を定数値の代入命令に置換することはできないと判断して(S1340)、S940の処理を終了する。
一方で、判断部830は、選択したその値域データに含まれる、実行後の変数の値域が、命令sの変数の値域を包含することを条件に(S1310:YES)、当該実行後の変数の値域が、他の何れかの値域データに含まれる、実行後の変数の値域と重複するかどうかを判断する(S1320)。重複しないことを条件に(S1320:NO)、判断部830は、命令sを定数値の代入命令に置換可能と判断する(S1330)。一方、重複することを条件に(S1320:YES)、判断部830は、命令sを当該代入命令に置換不能と判断する(S1340)。
図9の説明に戻る。置換部840は、判断部830による判断が成立することを条件に、変数vに値を代入する命令sを、当該命令sにより代入される値の範囲内の定数値を変数vに代入する命令に置換する(S950)。
図14は、図9のS950における処理の詳細を示す。まず、置換部840は、命令sにより代入される変数vの値の範囲内から、定数値を選択し(S1400)、選択したその定数値を変数vに代入する命令により、命令sを置換する(S1410)。
例えば、置換部840は、置換すべき当該命令sについての変数の値域の中から、中間プログラム24をコンパイルした実行コードを実行するコンピュータにおいて、1命令でレジスタにロードすることができる即値(イミディエート・バリュー)の範囲内の値を選択する。好ましくは、置換部840は、置換すべき当該命令sについての変数の値域の中から、絶対値の最も小さい値を選択してもよい。
また、置換部840は、置換すべき当該命令sについての変数の値域の中から、2のべき乗の値を選択してもよい。そして、置換部840は、命令sを、当該選択した値を変数に代入する命令に置換する。これにより、コンピュータは命令sに対応する実行コードを、例えば1命令分の実行サイクルなどの、極めて短い時間で実行することができる。
図9の説明に戻る。次に、イディオム検出部850は、最適化の機会を広げるべく、上記命令sに加えて、予め定められた第1イディオムを中間プログラム24から更に検出する(S960)。
図15は、図9のS960における処理の詳細を示す。イディオム検出部850は、中間プログラム24を走査することで、変数vに処理結果を代入する第1イディオムを検出する(S1500)。この第1イディオムは、複数の配列変数のそれぞれから予め定められた数の要素を読み出して先頭側から順次比較して、異なる要素値が検出された場合には最初に検出された要素値の差を変数vに代入する一方で、異なる要素値が検出されない場合には数値0を変数vに代入する処理である。
この第1イディオムの例を図16−17に示す。
図16は、本実施形態に係る入力プログラム20Cおよびライブラリ・プログラム22Cの具体例を示す。入力プログラム20Cは、1行目に、methodCというメソッドを呼び出して、その戻り値をdiffという変数の代入する命令を含む。また、入力プログラム20Cは、3−7行目に、その変数diffの値が定数0と等しければ処理1を、変数diffの値が定数0と異なれば処理2を行う命令を含む。
一方、ライブラリ・プログラム22Cは、1−7行目に、methodCの定義を含む。具体的には、ライブラリ・プログラム22Cは、2行目から5行目に、src1およびsrc2という2つの配列変数のそれぞれから予め定められたlen個の要素を読み出して比較して、異なる要素値が検出された場合には要素値の差を変数diffに代入する一方で、異なる要素値が検出されない場合には数値0を変数diffに代入する命令群を含む。また、ライブラリ・プログラム22Cは、6行目に、変数diffの値をリターンする命令を含む。
図17は、本実施形態に係る中間プログラム24Cの具体例を示す。1−4行目には、methodC内の各命令が、戻り値をリターンする命令を除きそのまま展開されている。従って、イディオム検出部850は、中間プログラム24Cの1−4行目の命令群を、第1イディオムとして検出することができる。
図15の説明に戻る。第1イディオムが検出された場合に(S1510:YES)、判断部830は、変数vの値に基づく条件分岐命令が第1条件を満たすかを判断する(S1520)。その第1条件とは、変数vの値に基づいて条件分岐するその命令の第1の分岐先における当該変数vの値域が数値0のみを含み、かつ、当該命令の第2の分岐先における当該変数vの値域が数値0以外のみを含む、という条件である。
例えば図17の中間プログラム24Cは、5−9行目に、変数diffが定数0と等しいかという条件を判断する条件分岐命令を含む。この条件分岐命令の第1の分岐先、例えば6行目において、変数diffの値域は数値0のみを含む。一方、この条件分岐命令の第2の分岐先、例えば9行目において、変数diffの値域は数値0以外のみを含む。従って、この変数diffを変数vとして選択するとすれば、判断部830は、この5−9行目の命令群が第1条件を満たすと判断できる。
この5−9行目において、変数diffの値は、定数0との比較のみに使用され、その他の目的では使用されていない。従って、中間プログラム24Cの2行目に示したような、要素値の差分を算出する処理は無駄になっている。このため、配列変数src1およびsrc2を比較して要素値の異なる要素があるかどうかが分かれば、その差分がどのような大きさであるかを算出する必要はない。このような性質を利用して、置換部840は、第1イディオムを所定の処理に置換することができる。
図15の説明に戻る。
第1イディオムが検出され、かつ、変数vの値に基づく条件分岐命令が第1条件を満たすことを条件に(S1520:YES)、置換部840は、検出されたその第1イディオムを、その第1イディオムに基づいて定まる所定の処理に置換する(S1530)。この所定の処理は、複数の配列変数のそれぞれから予め定められた数の要素を読み出して比較して、異なる要素値が検出された場合には0以外の所定の定数を変数vに代入する一方で、異なる要素値が検出されない場合には数値0を変数vに代入する処理である。
この所定の処理は、これをIBMコーポレーションのSystem zまたはSystem p用にコンパイルするとすれば、System zまたはSystem pが有するCLC命令を利用して実現される。但し、CLC命令は、処理結果を、コンディション・コード(CC)フラグと呼ばれる特別な記憶領域に格納する。従って、置換部840は、変数v(より正確には、変数vに割り付けられたレジスタまたはメモリ領域)に、このCCフラグの内容をロードする命令を生成する(S1540)。この命令のことを命令tと呼ぶ。
このようにして置換部840により生成されたプログラムの一例を図18に示す。
図18は、本実施形態に係る中間プログラム26Cの具体例を示す。1行目はCLC命令を示す。ここでは説明の明確化のため、CLC命令の実行コードではなく、その処理内容を記載した。また、2−6行目全体が、CCフラグの内容を変数diffにロードする命令tを示す。7−11行目は、図17の中間プログラム24Cの5−9行目と同一である。
図15の説明に戻る。第1イディオムは検出されたものの条件分岐命令が第1条件を満たさない場合に(S1520:NO)、判断部830は、その条件分岐命令が第2条件を満たすかを判断する(S1570)。その第2条件とは、変数vの値に基づいて条件分岐するその条件分岐命令の第1の分岐先における当該変数vの値域が、数値0のみを含み、当該条件分岐命令の第2の分岐先における当該変数vの値域が正の数のみを含み、かつ、当該条件分岐命令の第3の分岐先における当該変数vの値域が負の数のみを含む、という条件である。
この条件分岐命令の例を図19−20に示す。
図19は、本実施形態に係る入力プログラム20Dおよびライブラリ・プログラム22Dの具体例を示す。入力プログラム20Dは、1行目に、methodCというメソッドを呼び出して、その戻り値をdiffという変数の代入する命令を含む。また、入力プログラム20Dは、3−7行目に、その変数diffの値が定数0と等しければ処理1を、変数diffの値が正の数ならば処理2を、変数diffの値が負の数ならば処理3を、それぞれ行う命令を含む。ライブラリ・プログラム22Dは、1−7行目に、methodCの定義を含む。この定義は、ライブラリ・プログラム22Cの1−7行目に示したMmethodCの定義と同一であるから説明を省略する。
図20は、本実施形態に係る中間プログラム24Dの具体例を示す。1−4行目には、methodC内の各命令が、戻り値をリターンする命令を除きそのまま展開されている。また、5−11行目の条件分岐命令は、入力プログラム20Dの3−9行目の条件分岐命令と同一である。この条件分岐命令は、変数diffを定数0と比較する条件分岐命令である。
この条件分岐命令の第1の分岐先、例えば6行目において、変数diffの値域は数値0のみを含む。一方、この条件分岐命令の第2の分岐先、例えば8行目において、変数diffの値域は正の数のみを含む。また、この条件分岐命令の第3の分岐先、例えば10行目において、変数diffの値は負の数のみを含む。従って、この変数diffを変数vとして選択するとすれば、判断部830は、この3−9行目の命令群が第2条件を満たすと判断できる。
図15の説明に戻る。
第1イディオムが検出され、かつ、変数vの値に基づく条件分岐命令が第2条件を満たすことを条件に(S1570:YES)、置換部840は、検出されたその第1イディオムを、その第1イディオムに基づいて定まる所定の処理に置換する(S1580)。この所定の処理は、複数の配列変数のそれぞれから予め定められた数の要素を読み出して比較して、異なる要素値が検出されない場合には数値0を変数vに代入し、一方の配列変数の要素が他方の配列変数の要素より大きい場合には所定の正の定数を変数vに代入する一方で、他方の配列変数の要素が一方の配列変数の要素より大きい場合には所定の負の定数を変数vの代入する処理である。
この所定の処理は、これをIBMコーポレーションのSystem z用にコンパイルするとすれば、System zが有するCLC命令を利用して実現される。但し、CLC命令は、処理結果を、コンディション・コード(CC)フラグと呼ばれる特別な記憶領域に格納する。従って、置換部840は、変数v(より正確には、変数vに割り付けられたレジスタまたはメモリ領域)に、このCCフラグの内容に基づく定数をロードする命令を生成する(S1590)。この命令のことを命令tと呼ぶ。
このようにして置換部840により生成されたプログラムの一例を図21に示す。
図21は、本実施形態に係る中間プログラム26Dの具体例を示す。1行目はCLC命令を示す。ここでは説明の明確化のため、CLC命令の実行コードではなく、その処理内容を記載した。また、2−8行目全体が、CCフラグの内容を変数diffにロードする命令tを示す。9−15行目は、図20の中間プログラム24Cの5−11行目と同一である。
以上、第1イディオムの検出によれば、数値を算出して変数に代入する命令だけでなく、複数の配列変数を要素ごとに比較する命令群全体を最適化することで、プログラムの実行効率を大幅に向上できる。更に、この最適化により、特定のアーキティクチャによりサポートされる特別な命令を利用して、プログラムの実行効率を一層高めことができる。
次に、以上の最適化によって生成されたプログラムをより一層効率化するための追加的な処理について説明する。この処理は、CCフラグを変数に代入することなくそのまま利用して条件分岐させること、を第1の目的とする。また、変数の代入する定数を、その変数の値域外から選択すること、を第2の目的とする。
図22は、図9のS970における処理の詳細を示す。まず、置換部840は、変数vに代入される定数値が、CCフラグの内容をそのまま表した数値かどうかを判断する(S2200)。変数vに定数値を代入する命令のことを命令tと呼ぶ。命令tにより代入されるその定数値がCCフラグの内容をそのまま表した数値であることを条件に(S2200:YES)、置換部840は、命令tの実行から、変数vを使用する何れの命令の実行までの間においても、CCフラグの内容が変更されないかどうかを判断する(S2210)。
例えば図18の中間プログラム26Cの例において、2−6行目の命令は、変数diffにCCフラグの内容をそのまま表した定数を代入する命令tである。また、7行目の命令は、変数diffを参照する命令である。そして、この命令tの実行からこの変数diffを参照する命令の実行までの間において、CCフラグの内容は変更されていない。したがって、S2200およびS2210における判断は成立する。
図22の説明に戻る。CCフラグの内容が変更されないことを条件に(S2210:YES)、置換部840は、変数vの値に基づいて条件分岐する命令uを、CCフラグに基づいて条件分岐する命令に置換する(S2220)。そして、置換部840は、不要となった命令tを削除する(S2230)。以上の処理を適用した結果のプログラムを図23に示す。
図23は、本実施形態に係る中間プログラム26Cの他の具体例を示す。1行目は、図18の中間プログラム26Cの1行目と同様である。一方、命令tに相当する図18の2−7行目は削除されている。また、変数diffに基づく条件分岐命令に相当する図18の7−11行目は、CCフラグに基づく条件分岐命令に置換されている。
このように、以上の処理によれば、CCフラグの内容を変数に格納する処理を省略して、プログラムの実行効率を改善できる。また、変数値に基づく条件分岐命令よりも、CCフラグの内容に基づく条件分岐命令の方が、一般に高速動作可能なことから、条件分岐命令自体の実行を高速化することもできる。
図22の説明に戻る。次に、置換部840は、変数vを参照する命令uについて、その命令uについての変数の値域内の定数値をその変数vに代入するよりも、その変数の値域外の定数値をその変数vに代入する方が、中間プログラム24が全体として高速動作するかどうかを判断する(S2240)。この判断の一例を、図24−25および図21を参照して説明する。
図21に示すように、中間プログラム26Dの9−15行目では、変数diffが0、正の数および負の数の何れであるかが判断されている。従って、2−8行目では、変数diffに、0、正の定数および負の定数のいずれかが代入されている。この2−8行目の代入命令が、例えばIBMコーポレーションのSystem z用にコンパイルされると、例えば図24のような実行コードに変換される。
図24は、本実施形態に係る中間プログラム26Dの第2行から第8行の命令に対応する実行コードの一例を示す。1行目の命令は、IPM(INSERT PROGRAM MASK)命令であり、CCフラグの内容をレジスタR1の第2−第3ビットに格納する。第0および第1ビットは0で初期化される。
2行目の命令は、SLL命令であり、R1を2ビットシフトする。3行目の命令は、SRA命令であり、R1を30ビット右に算術シフトする。4行目の命令は、LCR命令であり、R1を整数とみなして符号を反転させる。これにより、変数diffの内容を格納するために割り当てたレジスタR1には、CCフラグの内容に応じて、0、−1または2が代入される。
一方で、例えば変数diffに、その変数の値域外の値を代入する場合における中間プログラム26Dの例を図25(a)に示す。
図25は、本実施形態に係る中間プログラム26Dの他の具体例を、第2行から第8行の命令に対応する実行コードと対比して示す。図25(a)に示すように、2−8行目において、変数diffには、CCフラグの内容に基づき、0、1または2が代入されている。即ち、変数diffの値域が0、正の数、または、負の数であるのに対し、代入される定数値は0、正の数である1、または、正の数である2である。
ただし、変数diffに基づく条件分岐も、プログラムの意味を変更させないように変更されている。即ち、11行目において、処理2を実行すべきかどうかは、変数diffが正の数であるという条件ではなく、変数diffが定数2と等しいという条件に基づき判断されている。この中間プログラム26DをIBMコーポレーションのSystem z用にコンパイルした実行コードの例を図25(b)に示す。
1行目は、1行目の命令は、IPM(INSERT PROGRAM MASK)命令であり、CCフラグの内容をレジスタR1の第2−第3ビットに格納する。第0および第1ビットは0で初期化される。3行目の命令は、SRA命令であり、R1を28ビット右に算術シフトする。
以上のように、図25(b)を図24と対比すると、実行コードに含まれる機械語の命令数は4つから2つに減少している。置換部840は、変数vに代入する定数値を変更することで、このような命令数の減少が生じる場合には、プログラムが高速化すると判断する。判断の具体的な実現方法として、置換部840は、プログラムをこれら2つの場合のそれぞれについてコンパイルして、機械語の命令数を比較してよい。
また、置換部840は、予め定められたコンパイル前の複数の命令列のそれぞれに対応付けて、その命令列をコンパイルしたならば生成されるであろう実行コードの実行の所要時間を記録していてもよい。そして、置換部840は、変数vに代入する定数値を変更する前と変更した後のそれぞれのプログラムが、当該予め記録した命令列に一致するかどうかを判断する。そして、置換部840は、それぞれのプログラムに一致した当該命令列に対応する所要時間を比較してよい。
図22の説明に戻る。次に、変数vを参照する命令uについて、その命令uについての変数の値域内の定数値をその変数vに代入するよりも、その変数の値域外の定数値をその変数vに代入する方が、中間プログラム24が全体として高速動作する場合に(S2240:YES)、置換部840は、当該変数vに代入する定数値、および、当該命令uが変数vと比較する定数値を変更する。
具体的には、置換部840は、変数vに値を代入する当該命令を、当該命令についての変数vの値域外から選択した定数値を当該変数vに代入する命令に置換する。これと共に、置換部840は、当該変数vの値に基づいて条件分岐するある命令についての変数vの値域が、当該選択した定数値を含むように、当該条件分岐する命令を変更する。これにより、例えば図21に示す中間プログラム26Dが、図25(a)に示す中間プログラム26Dに変更される。この結果、図25(b)に示す実行コードが出力プログラム28に含めて生成される。
最後に、図26−29を参照して、代入命令の最適化によって他の最適化の機会が拡大する例を説明する。
図26は、本実施形態に係る入力プログラム20Eおよびライブラリ・プログラム22Eの具体例を示す。入力プログラム20Eに示すように、methodDが呼び出されて、その戻り値が変数answerに格納される。そして、変数answerの値は定数−1と比較されて、等しい場合には所定の処理が実行される。
ライブラリ・プログラム22Eは、そのmethodDの定義を示す。2行目から8行目に示すように、所定の条件が成立する場合には、配列変数aの中から要素値が0x80である要素が検索されて、その要素がその配列変数の何番目であるかを示す数値が変数answerに代入される。一方、上記所定の条件が成立しない場合には、変数answerには数値−1が代入される。
前段最適化部100は、このmethodDをインライン展開することで、中間プログラム24Eを生成する。
図27は、本実施形態に係る中間プログラム24Eの具体例を示す。1−9行目には、methodD内の各命令が、戻り値をリターンする命令を除きそのまま展開されている。6行目を参照すると、変数answerには変数iが代入されている。そして、その変数iの取りうる値の範囲は、3行目などの処理より、0以上である。
10行目を参照すると、変数answerの値に基づく条件分岐命令について、第1の分岐先における変数の値域は−1のみを含み、第2の分岐先における変数の値域は−1以外のみを含む。従って、第2の分岐先における変数の値域は、6行目の代入命令による変数の値域を包含している。このため、6行目の代入命令は、定数値を変数の代入する命令に置換される。
図28は、本実施形態に係る中間プログラム26Eの具体例を示す。置換により、6行目に示すように、変数answerには定数値0が代入されている。ここで、中間プログラム26Eにおいて変数iは、3−5行目においてのみ参照されて、その後の処理においては一切参照されていない。従って、変数iに関する演算そのものが不要となったことが分かる。
図29は、本実施形態に係る中間プログラム26Fの具体例を示す。これにより、変数iに関する3−4行目の演算それ自体が不要となって削除される。このような不使用変数の値を生成する処理の削除は、例えば、配列境界チェック除去手法、および、デッドストア・エリミネーション(DSE:Dead Store Elimination)またはデッドコード・エリミネーション(DCE:Dead Code Elimination)として当該技術分野において周知であるから、その実現方法の説明を省略する。
以上図26−図29を参照して説明したように、代入命令の最適化は、単に1つの演算処理を省略するのみならず、その他の最適化の阻害要因を取り除き、その他の様々な最適化を促進して、プログラムの実行効率を大幅に向上させることができる。例えば、ループ処理によって順次更新される変数の値を定数に変更できれば、ループのベクトル化などの並列化を促進できることも期待される。実際に、本願発明者らの計測によれば、実用的なプログラムの最適化により大幅な速度向上が確かめられた。
図30は、本実施形態に係るコンパイラ装置10として機能するコンピュータ700のハードウェア構成の一例を示す。コンピュータ700は、ホストコントローラ1082により相互に接続されるCPU1000、RAM1020、及びグラフィックコントローラ1075を有する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は、コンピュータ700が使用するプログラム及びデータを格納する。CD−ROMドライブ1060は、CD−ROM1095からプログラム又はデータを読み取り、RAM1020又はハードディスクドライブ1040に提供する。
また、入出力コントローラ1084には、ROM1010と、フレキシブルディスクドライブ1050や入出力チップ1070等の比較的低速な入出力装置とが接続される。ROM1010は、コンピュータ700の起動時にCPU1000が実行するブートプログラムや、コンピュータ700のハードウェアに依存するプログラム等を格納する。フレキシブルディスクドライブ1050は、フレキシブルディスク1090からプログラム又はデータを読み取り、入出力チップ1070を介してRAM1020またはハードディスクドライブ1040に提供する。入出力チップ1070は、フレキシブルディスク1090や、例えばパラレルポート、シリアルポート、キーボードポート、マウスポート等を介して各種の入出力装置を接続する。
コンピュータ700に提供されるプログラムは、フレキシブルディスク1090、CD−ROM1095、又はICカード等の記録媒体に格納されて利用者によって提供される。プログラムは、入出力チップ1070及び/又は入出力コントローラ1084を介して、記録媒体から読み出されコンピュータ700にインストールされて実行される。プログラムがコンピュータ700等に働きかけて行わせる動作は、図1から図29において説明したコンパイラ装置10における動作と同一であるから、説明を省略する。
以上に示したプログラムは、外部の記憶媒体に格納されてもよい。記憶媒体としては、フレキシブルディスク1090、CD−ROM1095の他に、DVDやPD等の光学記録媒体、MD等の光磁気記録媒体、テープ媒体、ICカード等の半導体メモリ等を用いることができる。また、専用通信ネットワークやインターネットに接続されたサーバシステムに設けたハードディスク又はRAM等の記憶装置を記録媒体として使用し、ネットワークを介してプログラムをコンピュータ700に提供してもよい。
以上、本発明を実施の形態を用いて説明したが、本発明の技術的範囲は上記実施の形態に記載の範囲には限定されない。上記実施の形態に、多様な変更または改良を加えることが可能であることが当業者に明らかである。例えば、本実施形態において、最適化の対象はインライン展開等の技術を適用したプログラムであったが、最適化の対象は、インライン展開等の技術を適用しないプログラムであってもよい。その場合においては、変数の値域を示す情報をメソッド間に伝播させて、メソッドを特殊化(クローニング)させることで、本実施形態と同様の作用・効果を得ることができる。また、本実施形態において、最適化の対象は実行コード生成前のプログラムであり、そのプログラムにおける変数に値を代入する命令であったが、最適化の対象はこれに限られない。例えば、最適化の対象が実行コードである場合においては、変数をメモリ内の特定領域とみなし、代入命令をその特定領域へのストア命令とみなして最適化が行われてよい。その様な変更または改良を加えた形態も本発明の技術的範囲に含まれ得ることが、特許請求の範囲の記載から明らかである。
図1は、本実施形態に係るコンパイラ装置10の全体構成を示す。 図2は、本実施形態に係る入力プログラム20Aおよびライブラリ・プログラム22Aの具体例を示す。 図3は、本実施形態に係る中間プログラム24Aの具体例を示す。 図4は、本実施形態に係る中間プログラム26Aの具体例を示す。 図5は、本実施形態に係る入力プログラム20Bおよびライブラリ・プログラム22Bの具体例を示す。 図6は、本実施形態に係る中間プログラム24Bの具体例を示す。 図7は、本実施形態に係る中間プログラム26Bの具体例を示す。 図8は、本実施形態に係る代入最適化部110の機能構成を示す。 図9は、本実施形態に係る代入最適化部110により代入命令が最適化される処理の流れを示す。 図10は、図9のS910における処理の詳細を示す。 図11は、図9のS920における処理の詳細を示す。 図12は、図9のS930における処理の詳細を示す。 図13は、図9のS940における処理の詳細を示す。 図14は、図9のS950における処理の詳細を示す。 図15は、図9のS960における処理の詳細を示す。 図16は、本実施形態に係る入力プログラム20Cおよびライブラリ・プログラム22Cの具体例を示す。 図17は、本実施形態に係る中間プログラム24Cの具体例を示す。 図18は、本実施形態に係る中間プログラム26Cの具体例を示す。 図19は、本実施形態に係る入力プログラム20Dおよびライブラリ・プログラム22Dの具体例を示す。 図20は、本実施形態に係る中間プログラム24Dの具体例を示す。 図21は、本実施形態に係る中間プログラム26Dの具体例を示す。 図22は、図9のS970における処理の詳細を示す。 図23は、本実施形態に係る中間プログラム26Cの他の具体例を示す。 図24は、本実施形態に係る中間プログラム26Dの第2行から第8行の命令に対応する実行コードの一例を示す。 図25(a)は、本実施形態に係る中間プログラム26Dの他の具体例を示す。 図25(b)は、本実施形態に係る中間プログラム26Dの第2行から第8行の命令に対応する実行コードを示す。 図26は、本実施形態に係る入力プログラム20Eおよびライブラリ・プログラム22Eの具体例を示す。 図27は、本実施形態に係る中間プログラム24Eの具体例を示す。 図28は、本実施形態に係る中間プログラム26Eの具体例を示す。 図29は、本実施形態に係る中間プログラム26Fの具体例を示す。 図30は、本実施形態に係るコンパイラ装置10として機能するコンピュータ700のハードウェア構成の一例を示す。
符号の説明
10 コンパイラ装置
15 コンパイラプログラム
20 入力プログラム
22 ライブラリ・プログラム
24 中間プログラム
26 中間プログラム
28 出力プログラム
50 値域データ
100 前段最適化部
110 代入最適化部
120 後段最適化部
700 コンピュータ
800 値域解析部
805 データ生成部
810 第1データ除外部
820 第2データ除外部
830 判断部
840 置換部
850 イディオム検出部
1000 CPU
1040 記憶装置

Claims (14)

  1. プログラムを最適化するコンパイラ装置であって、
    前記プログラム中の変数に値を代入する命令について、当該命令が実行された場合における当該変数の値域として、当該命令が当該変数に代入し得る値の範囲を解析する値域解析部と、
    解析した前記変数の値域に基づいて、当該命令が前記変数の値域内の何れの値を当該変数に代入しても、前記プログラムの実行結果が変化しないか判断する判断部と、
    前記判断部による判断が成立することを条件に、当該変数に値を代入する当該命令を、前記変数の値域内の定数値を当該変数に代入する命令に置換する置換部と
    を備えるコンパイラ装置。
  2. 前記プログラムを記憶する記憶装置を更に備え、
    前記値域解析部は、前記記憶装置にアクセスして前記プログラムを走査することで、当該変数の値域を解析すると共に、さらに、前記プログラム中の当該変数を参照するそれぞれの命令について、当該命令が実行された場合における当該変数の値域を解析し、
    前記判断部は、当該変数に値を代入するある命令についての前記変数の値域が、代入された当該変数の値に基づいて条件分岐するある命令についての前記変数の値域に包含され、かつ、当該変数を参照する他の何れの命令についての前記変数の値域とも重複しないかを判断し、
    前記置換部は、前記判断部による判断が成立することを条件に、前記記憶装置にアクセスして、当該変数に値を代入する当該命令を、当該命令についての前記変数の値域の中から選択した定数値を当該変数に代入する命令に置換することにより、前記プログラムを変更する、請求項1に記載のコンパイラ装置。
  3. 前記値域解析部は、当該変数の値に基づいて条件分岐する命令については、当該条件分岐によるそれぞれの分岐先に対応付けて、当該分岐先における当該変数の値域を解析し、
    前記判断部は、当該変数に値を代入するある命令についての前記変数の値域が、当該変数の値に基づいて条件分岐するある命令の何れかの分岐先における前記変数の値域に包含され、かつ、他の何れの分岐先における前記変数の値域および当該変数を参照する他の何れの命令についての前記変数の値域とも重複しないかを判断する、請求項2に記載のコンパイラ装置。
  4. 前記値域解析部は、
    前記プログラム中のある変数を参照するそれぞれの命令について、当該命令が実行される直前における当該変数の値域、当該命令が実行された直後における当該変数の値域、および、当該命令が当該変数を定数と比較する命令かどうかを示す論理値、を含む、値域データを生成して前記記憶装置に格納するデータ生成部と、
    前記記憶装置にアクセスして、命令が実行される直前における変数の値域、及び、命令が実行された直後における変数の値域の組が相互に等しく、前記論理値が異なる複数の値域データを検出したことを条件に、前記論理値が変数を定数と比較する命令であることを示す値域データを前記記憶装置から除外する第1データ除外部と、
    前記記憶装置にアクセスして、第1の前記値域データに含まれる、対応する命令が実行された直後の当該変数の値域、が、第2の前記値域データに含まれる、対応する命令が実行される直前の当該変数の値域と一致し、かつ、前記第1の値域データに含まれる前記論理値が、対応する命令が変数を定数と比較する命令であることを示すことを条件に、前記第1の値域データを前記記憶装置から除外する第2データ除外部と
    を有し、
    前記判断部は、前記記憶装置にアクセスして、変数を定数と比較することを示す論理値を含むある値域データを読み出し、当該値域データに含まれる、命令が実行された直後における当該変数の値域が、当該変数に値を代入する命令についての前記変数の値域を包含するかどうか、および、他の値域データに含まれる、命令が実行された直後における当該変数の値域が、当該変数に値を代入する命令についての前記変数の値域と重複しないかどうかを判断する、請求項3に記載のコンパイラ装置。
  5. 複数の配列変数のそれぞれから予め定められた数の要素を読み出して比較して、異なる要素値が検出された場合には要素値の差を変数に代入する一方で、異なる要素値が検出されない場合には数値0を変数に代入する処理、を、前記プログラムを走査することで検出するイディオム検出部、を更に備え、
    前記判断部は、前記イディオム検出部により当該処理が検出されたことを条件に、当該変数の値に基づいて条件分岐するある命令の第1の分岐先における当該変数の値域が、数値0のみを含み、かつ、当該命令の第2の分岐先における当該変数の値域が0以外のみを含むかどうかを判断し、
    前記置換部は、前記イディオム検出部により検出された当該処理についての前記判断部による判断が成立することを条件に、複数の配列変数のそれぞれから予め定められた数の要素を読み出して比較して、異なる要素値が検出された場合には0以外の所定の定数を変数に代入する一方で、異なる要素値が検出されない場合には数値0を変数に代入する処理により、前記イディオム検出部により検出された当該処理を置換する、請求項3に記載のコンパイラ装置。
  6. 複数の配列変数のそれぞれから予め定められた数の要素を読み出して比較して、異なる要素値が検出された場合には要素値の差を変数に代入する一方で、異なる要素値が検出されない場合には数値0を変数に代入する処理、を、前記プログラムを走査することで検出するイディオム検出部、を更に備え、
    前記判断部は、前記イディオム検出部により当該処理が検出されたことを条件に、当該変数の値に基づいて条件分岐するある命令の第1の分岐先における当該変数の値域が、数値0のみを含み、当該命令の第2の分岐先における当該変数の値域が正の数のみを含み、かつ、当該命令の第3の分岐先における当該変数の値域が負の数のみを含むかどうかを判断し、
    前記置換部は、前記イディオム検出部により検出された当該処理についての前記判断部による判断が成立することを条件に、複数の配列変数のそれぞれから予め定められた数の要素を読み出して比較して、異なる要素値が検出されない場合には数値0を変数に代入し、一方の配列変数の要素が他方の配列変数の要素より大きい場合には所定の正の定数を変数に代入する一方で、他方の配列変数の要素が一方の配列変数の要素より大きい場合には所定の負の定数を変数の代入する処理により、前記イディオム検出部により検出された当該処理を置換する、請求項3に記載のコンパイラ装置。
  7. 前記イディオム検出部により検出された当該処理は、コンディション・コード・フラグに処理結果を格納する処理に置換され、
    前記置換部は、前記イディオム検出部により検出された当該処理から当該変数の値に基づいて条件分岐する命令までの間にコンディション・コード・フラグが変更されないことを条件に、当該変数の値に基づいて条件分岐するある命令を、当該コンディション・コード・フラグに基づいて条件分岐する命令に置換する、請求項5または請求項6に記載のコンパイラ装置。
  8. 前記置換部は、置換すべき当該命令についての前記変数の値域の中から、前記プログラムをコンパイルした実行コードを実行するコンピュータにおいて、1命令でレジスタにロードすることができる即値(イミディエート・バリュー)の範囲内の値を選択して、当該選択した値を変数に代入する命令に置換する、請求項2に記載のコンパイラ装置。
  9. 前記置換部は、置換すべき当該命令についての前記変数の値域の中から、絶対値の最も小さい値を選択して、当該命令を、当該選択した値を変数に代入する命令に置換する、請求項2に記載のコンパイラ装置。
  10. 前記置換部は、置換すべき当該命令についての前記変数の値域の中から、2のべき乗の値を選択して、当該命令を、当該選択した値を変数に代入する命令に置換する、請求項2に記載のコンパイラ装置。
  11. 前記置換部は、前記判断部による判断が成立することを条件に、変数に値を代入する当該命令を、当該命令についての前記変数の値域外から選択した定数値を当該変数に代入する命令に置換すると共に、当該変数の値に基づいて条件分岐するある命令についての前記変数の値域が、当該選択した定数値を含むように、当該条件分岐する命令を変更する、請求項2に記載のコンパイラ装置。
  12. 前記値域解析部は、前記プログラム中のある変数に加えて、更に当該変数の値が代入される他の変数のそれぞれについても、当該変数を参照するそれぞれの命令について、当該命令が実行された場合における当該変数の値域を解析し、
    前記判断部は、当該変数に値を代入するある命令についての前記変数の値域が、当該変数または当該変数の値が代入される他の変数の値に基づいて条件分岐するある命令についての前記変数の値域に包含され、かつ、当該変数または当該変数の値が代入される他の変数を参照する他の何れの命令についての前記変数の値域とも重複しないかを判断する、請求項2に記載のコンパイラ装置。
  13. コンピュータを、
    プログラム中の変数に値を代入する命令について、当該命令が実行された場合における当該変数の値域として、当該命令が当該変数に代入し得る値の範囲を解析する値域解析部と、
    解析した前記変数の値域に基づいて、当該命令が前記変数の値域内の何れの値を当該変数に代入しても、前記プログラムの実行結果が変化しないか判断する判断部と、
    前記判断部による判断が成立することを条件に、当該変数に値を代入する当該命令を、前記変数の値域内の定数値を当該変数に代入する命令に置換する置換部
    として機能させるコンパイラプログラム。
  14. コンピュータによりプログラムを最適化するコンパイル方法であって、
    前記コンピュータにより、プログラム中の変数に値を代入する命令について、当該命令が実行された場合における当該変数の値域として、当該命令が当該変数に代入し得る値の範囲を解析するステップと、
    前記コンピュータにより、解析した前記変数の値域に基づいて、当該命令が前記変数の値域内の何れの値を当該変数に代入しても、前記プログラムの実行結果が変化しないか判断するステップと、
    前記判断するステップによる判断が成立することを条件に、当該変数に値を代入する当該命令を、前記変数の値域内の定数値を当該変数に代入する命令に置換するステップと
    を備えるコンパイル方法。
JP2007282322A 2007-10-30 2007-10-30 プログラムを最適化するコンパイラ Expired - Fee Related JP5039948B2 (ja)

Priority Applications (2)

Application Number Priority Date Filing Date Title
JP2007282322A JP5039948B2 (ja) 2007-10-30 2007-10-30 プログラムを最適化するコンパイラ
US12/259,746 US8291398B2 (en) 2007-10-30 2008-10-28 Compiler for optimizing program

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP2007282322A JP5039948B2 (ja) 2007-10-30 2007-10-30 プログラムを最適化するコンパイラ

Publications (2)

Publication Number Publication Date
JP2009110299A true JP2009110299A (ja) 2009-05-21
JP5039948B2 JP5039948B2 (ja) 2012-10-03

Family

ID=40589443

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2007282322A Expired - Fee Related JP5039948B2 (ja) 2007-10-30 2007-10-30 プログラムを最適化するコンパイラ

Country Status (2)

Country Link
US (1) US8291398B2 (ja)
JP (1) JP5039948B2 (ja)

Families Citing this family (22)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US8255887B2 (en) * 2006-11-29 2012-08-28 International Business Machines Corporation Method and apparatus for re-using memory allocated for data structures used by software processes
US8381199B2 (en) * 2010-10-19 2013-02-19 International Business Machines Corporation Modular and/or demand-driven string analysis of a computer program
US9158544B2 (en) 2011-06-24 2015-10-13 Robert Keith Mykland System and method for performing a branch object conversion to program configurable logic circuitry
US10089277B2 (en) 2011-06-24 2018-10-02 Robert Keith Mykland Configurable circuit array
US8869123B2 (en) * 2011-06-24 2014-10-21 Robert Keith Mykland System and method for applying a sequence of operations code to program configurable logic circuitry
US9633160B2 (en) 2012-06-11 2017-04-25 Robert Keith Mykland Method of placement and routing in a reconfiguration of a dynamically reconfigurable processor
US9304770B2 (en) 2011-11-21 2016-04-05 Robert Keith Mykland Method and system adapted for converting software constructs into resources for implementation by a dynamically reconfigurable processor
US9043757B2 (en) * 2012-12-13 2015-05-26 Oracle International Corporation Identifying differences between source codes of different versions of a software when each source code is organized using incorporated files
CN104375875B (zh) * 2013-08-15 2017-08-25 国际商业机器公司 用于应用程序的编译优化的方法以及编译器
JP2015114898A (ja) * 2013-12-12 2015-06-22 株式会社東芝 プログラム仕様推定装置およびその方法、ならびにプログラム
US10175964B2 (en) * 2014-09-26 2019-01-08 Microsoft Technology Licensing, Llc Compiler caching for runtime routine redundancy tracking
KR20160070965A (ko) 2014-12-11 2016-06-21 삼성전자주식회사 컴파일러
US9733911B2 (en) * 2015-11-11 2017-08-15 National Instruments Corporation Value transfer between program variables using dynamic memory resource mapping
JP2017211842A (ja) * 2016-05-25 2017-11-30 富士通株式会社 情報処理装置、コンパイル管理方法、およびコンパイルプログラム
CN108008981B (zh) * 2016-10-27 2020-12-08 海信视像科技股份有限公司 一种片上系统SoC中进行程序初始化的方法和装置
EP3776867A1 (en) 2018-03-27 2021-02-17 Nchain Holdings Limited Computer-implemented methods and systems relating to arithmetic coding for serialised arithmetic circuits
US10970073B2 (en) * 2018-10-02 2021-04-06 International Business Machines Corporation Branch optimization during loading
US11080029B2 (en) 2019-08-28 2021-08-03 Red Hat, Inc. Configuration management through information and code injection at compile time
US11314496B2 (en) 2020-06-25 2022-04-26 Paypal, Inc. Ultra-fast install and update of an operating system
US11200038B1 (en) * 2020-06-25 2021-12-14 Paypal, Inc. Fast compiling source code without dependencies
US20230195434A1 (en) * 2021-12-16 2023-06-22 International Business Machines Corporation Transformation of computer code based on idiom recognition and value constraint analysis
CN115185687B (zh) * 2022-07-08 2023-11-14 慧之安信息技术股份有限公司 基于深度学习的内存分配方法

Citations (7)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPH04323731A (ja) * 1991-04-23 1992-11-12 Nec Corp 最適化テキスト編集方式
JPH06208470A (ja) * 1993-01-11 1994-07-26 Toshiba Corp 目的コード最適化装置
JPH11149380A (ja) * 1997-11-18 1999-06-02 Hitachi Ltd コンパイラとプログラム最適化方法およびその処理プログラムを記録した記録媒体
JP2000339172A (ja) * 1999-05-28 2000-12-08 Toshiba Corp メモリ効率化方法
JP2001229030A (ja) * 2000-02-18 2001-08-24 Nec Microcomputer Technology Ltd プログラム最適化処理装置及びプログラム最適化方法
JP2005071135A (ja) * 2003-08-26 2005-03-17 Fujitsu Ltd 変数の統計処理を行うコンパイル処理プログラム、およびその記録媒体、およびその処理方法ならびにその処理装置
JP2005215830A (ja) * 2004-01-28 2005-08-11 Internatl Business Mach Corp <Ibm> コンパイラ、コンパイル方法、コンパイルプログラム、及び記録媒体

Family Cites Families (11)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US6247174B1 (en) * 1998-01-02 2001-06-12 Hewlett-Packard Company Optimization of source code with embedded machine instructions
US6961930B1 (en) * 1999-09-22 2005-11-01 Hewlett-Packard Development Company, L.P. Efficient, transparent and flexible latency sampling
US7080365B2 (en) * 2001-08-17 2006-07-18 Sun Microsystems, Inc. Method and apparatus for simulation system compiler
JP3813087B2 (ja) * 2001-12-20 2006-08-23 インターナショナル・ビジネス・マシーンズ・コーポレーション プログラム変換方法、コンピュータ装置及びプログラム
US7269824B2 (en) * 2003-02-13 2007-09-11 Path Reliability, Inc. Software behavior pattern recognition and analysis
JP4403794B2 (ja) * 2003-02-28 2010-01-27 株式会社デンソー 制御プログラムの検査方法及び検査装置及び検査プログラム
US7409678B2 (en) * 2004-01-28 2008-08-05 International Business Machines Corporation Compiler, compilation and storage
US20050273775A1 (en) * 2004-06-07 2005-12-08 Brookes Craig W Apparatus, system, and method for identifying semantic errors in assembly source code
CN101278262A (zh) * 2004-08-12 2008-10-01 桑德布里奇技术公司 非循环的指令模式的识别方法
US20060129992A1 (en) * 2004-11-10 2006-06-15 Oberholtzer Brian K Software test and performance monitoring system
US7945898B1 (en) * 2006-03-16 2011-05-17 Avaya Inc. Handling loops in programs and examining feasible software behavior for detecting malicious code

Patent Citations (7)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPH04323731A (ja) * 1991-04-23 1992-11-12 Nec Corp 最適化テキスト編集方式
JPH06208470A (ja) * 1993-01-11 1994-07-26 Toshiba Corp 目的コード最適化装置
JPH11149380A (ja) * 1997-11-18 1999-06-02 Hitachi Ltd コンパイラとプログラム最適化方法およびその処理プログラムを記録した記録媒体
JP2000339172A (ja) * 1999-05-28 2000-12-08 Toshiba Corp メモリ効率化方法
JP2001229030A (ja) * 2000-02-18 2001-08-24 Nec Microcomputer Technology Ltd プログラム最適化処理装置及びプログラム最適化方法
JP2005071135A (ja) * 2003-08-26 2005-03-17 Fujitsu Ltd 変数の統計処理を行うコンパイル処理プログラム、およびその記録媒体、およびその処理方法ならびにその処理装置
JP2005215830A (ja) * 2004-01-28 2005-08-11 Internatl Business Mach Corp <Ibm> コンパイラ、コンパイル方法、コンパイルプログラム、及び記録媒体

Also Published As

Publication number Publication date
US8291398B2 (en) 2012-10-16
JP5039948B2 (ja) 2012-10-03
US20090119654A1 (en) 2009-05-07

Similar Documents

Publication Publication Date Title
JP5039948B2 (ja) プログラムを最適化するコンパイラ
US8266603B2 (en) Technique for allocating register to variable for compiling
US8146070B2 (en) Method and apparatus for optimizing software program using inter-procedural strength reduction
JP5966509B2 (ja) プログラム、コード生成方法および情報処理装置
JP2002149416A (ja) プログラムの最適化方法及びこれを用いたコンパイラ
CN107003885B (zh) 用于低级别可组合高性能计算库的技术
US9395986B2 (en) Compiling method and compiling apparatus
US20160357529A1 (en) Parallel computing apparatus and parallel processing method
JP2016207161A (ja) 情報処理装置、コンパイル方法およびコンパイルプログラム
KR20190015285A (ko) Cpu 이용 및 코드 리팩토링을 위한 쿼리 최적화기
US9213548B2 (en) Code generation method and information processing apparatus
JP3992102B2 (ja) コンパイラ装置、コンパイル方法、コンパイラプログラム、及び記録媒体
US10599406B2 (en) Generating executable files through compiler optimization
US7979853B2 (en) Compiler device, method, program and recording medium
JP4768984B2 (ja) コンパイル方法、コンパイルプログラムおよびコンパイル装置
JP6651974B2 (ja) 情報処理装置、コンパイル方法及びコンパイラプログラム
JP2009211424A (ja) 最適化箇所判定装置及び最適化箇所判定システム及びコンピュータプログラム及び最適化箇所判定方法
JP4719415B2 (ja) 情報処理システム及びコード生成方法
JP6536266B2 (ja) コンパイル装置、コンパイル方法およびコンパイルプログラム
JP2018124877A (ja) コード生成装置、コード生成方法、およびコード生成プログラム
JP5932707B2 (ja) 計算機、プログラム及びデータ生成方法
CN113031952A (zh) 深度学习模型的执行代码的确定方法、装置及存储介质
US11144288B1 (en) System and method for compiling rules set into bytecode using switch and class hierarchies
JP2014099108A (ja) 実行時間算出装置、実行時間算出方法、およびプログラム
US10896272B2 (en) High-level synthesis device, high-level synthesis method, and computer readable medium

Legal Events

Date Code Title Description
A621 Written request for application examination

Free format text: JAPANESE INTERMEDIATE CODE: A621

Effective date: 20100623

A977 Report on retrieval

Free format text: JAPANESE INTERMEDIATE CODE: A971007

Effective date: 20120427

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: 20120515

A01 Written decision to grant a patent or to grant a registration (utility model)

Free format text: JAPANESE INTERMEDIATE CODE: A01

RD14 Notification of resignation of power of sub attorney

Free format text: JAPANESE INTERMEDIATE CODE: A7434

Effective date: 20120516

A61 First payment of annual fees (during grant procedure)

Free format text: JAPANESE INTERMEDIATE CODE: A61

Effective date: 20120607

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: 20150720

Year of fee payment: 3

LAPS Cancellation because of no payment of annual fees