Deprecated: The each() function is deprecated. This message will be suppressed on further calls in /home/zhenxiangba/zhenxiangba.com/public_html/phproxy-improved-master/index.php on line 456
JP5602599B2 - ループ検知装置、ループ検知方法及びループ検知プログラム - Google Patents
[go: Go Back, main page]

JP5602599B2 - ループ検知装置、ループ検知方法及びループ検知プログラム - Google Patents

ループ検知装置、ループ検知方法及びループ検知プログラム Download PDF

Info

Publication number
JP5602599B2
JP5602599B2 JP2010266642A JP2010266642A JP5602599B2 JP 5602599 B2 JP5602599 B2 JP 5602599B2 JP 2010266642 A JP2010266642 A JP 2010266642A JP 2010266642 A JP2010266642 A JP 2010266642A JP 5602599 B2 JP5602599 B2 JP 5602599B2
Authority
JP
Japan
Prior art keywords
unit
loop
call stack
stack
instruction
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
JP2010266642A
Other languages
English (en)
Other versions
JP2012118678A (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 JP2010266642A priority Critical patent/JP5602599B2/ja
Priority to US13/301,099 priority patent/US8856762B2/en
Publication of JP2012118678A publication Critical patent/JP2012118678A/ja
Application granted granted Critical
Publication of JP5602599B2 publication Critical patent/JP5602599B2/ja
Expired - Fee Related legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING OR CALCULATING; COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/28Error detection; Error correction; Monitoring by checking the correct order of processing
    • GPHYSICS
    • G06COMPUTING OR CALCULATING; COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/32Address formation of the next instruction, e.g. by incrementing the instruction counter
    • G06F9/322Address formation of the next instruction, e.g. by incrementing the instruction counter for non-sequential address
    • G06F9/325Address formation of the next instruction, e.g. by incrementing the instruction counter for non-sequential address for loops, e.g. loop detection or loop counter
    • GPHYSICS
    • G06COMPUTING OR CALCULATING; COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/36Prevention of errors by analysis, debugging or testing of software
    • G06F11/362Debugging of software
    • G06F11/3636Debugging of software by tracing the execution of the program
    • GPHYSICS
    • G06COMPUTING OR CALCULATING; COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/45Exploiting coarse grain parallelism in compilation, i.e. parallelism between groups of instructions

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • General Engineering & Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Software Systems (AREA)
  • Quality & Reliability (AREA)
  • Computer Hardware Design (AREA)
  • Debugging And Monitoring (AREA)
  • Devices For Executing Special Programs (AREA)

Description

本発明は、トレーシング技術に関し、特に、トレースを生成するためにループを検出するための技術に関する。
近年、動的コンパイルやバイナリ変換を行う処理系において、トレーシング技術が重要視されている(例えば、非特許文献1及び2参照)。トレーシング技術とは、プログラムの実行時に繰り返し通過するコードパスを抽出し、その軌跡、即ち、トレースを記録しコンパイルして、高速なコードを生成する手法である。トレーシング技術によれば、実際に実行されるコードだけが最適化されるので、関数(又は、メソッド、又はプロシージャ、以下同様)を単位とした従来のコンパイル手法のように、実際には使用されないコードまで最適化するといった問題や、関数間に渡る最適化が行えない又は多段に及ぶ場合などは難しいといった問題が解決又は軽減できる。
トレース単位でコンパイルを行う方法は様々あるが、最も基本的な方法は次のような手順で行われる。まず、ソースコードをバイトコード等の中間コードに変更する。次にインタプリタによって中間コードを実行し、その実行を監視する。後方分岐を検出すると、その分岐先をループ始点候補として記録する。これは、ループ処理は必ず後方分岐を伴うからであるが、後方分岐の分岐先以外の条件でもループ始点候補は作成される得る。そして、ループ始点候補から始まるコードパスが所定の回数以上繰り返し実行されることを検出すると、実行された中間コード(トレース)を記録し、記録したトレースを最適化してコンパイルし、ネイティブ・コードを生成する。
生成されたネイティブ・コードは、元となったトレースと同じパスが選択される限り、システムによって直接実行される。しかし、条件分岐の結果が異なる等、前提条件が成立しなくなると、制御はインタプリタに戻されるか、別のトレースから生成されたネイティブ・コードへと移される。このインタプリタとの切り替え、あるいは別トレースへの遷移のコストは高く、ランタイム・オーバヘッドの原因となる。そのため、インタプリタとの切り替えあるいは別トレースへの遷移を頻繁に生じさせないように、ループを正しく検出しトレースを生成することが重要となる。
非特許文献3は、命令列の先頭の命令と末尾の命令のアドレスが同じであることを条件に、その命令列をループであると判断する技術を開示する。
非特許文献4及び非特許文献5は、トレースの先頭の命令が属するメソッドからのリターン命令を含むトレースの生成を禁止する技術を開示する。
なお、以下に記載する特許文献1は、コールスタックのプッシュ/ポップをエミュレーションして各命令時点でのコールスタックを構築するコールスタック構築技術を開示する従来技術として挙げたものである。
米国特許第6751789号明細書
Vasanth Bala et al., "Dynamo: A Transparent Dynamic OptimizationSystem", ACM SIGPLAN Notices,Volume 35, p.1-12, May 2000. Andreas Gal et al., "Trace-based just-in-time type specialization for dynamic languages". In Programming Lan-guages Designand Implementation, p.1-11, ACM, 2009. David Hinikeret al., "Improving RegionSelection in Dynamic Optimization Systems", Proceedings of the 38th annual IEEE/ACM International Symposiumon Microarchitecture, p.141-154, November 12-16, 2005. Andreas Gal et al., "IncrementalDynamic Code Generation with Trace Trees", Technical Report, p.6-16, Donald Bren School of Information and ComputerScience, University of California, Irvine, November 2006. Duane Merrill et al., "TraceFragment Selection within Method-based JVMs", InProceedings of the International Conference on Virtual Execution Environments, ACM Press, p.41–50.
しかしながら、非特許文献3が開示するループ検知手法によると、本来ループでないものを誤ってループと判定してしまう場合が生じる。例として、図10(b)に示すコードにおいて、3行目の関数gの呼び出しにより実行される命令Gから実行命令の記録が始まる場合を考える。すると命令列G−B−Gが記録されるが、命令列G−B−Gの先頭Gのアドレスと、末尾のGのアドレスは等しいため、命令列G−B−Gはループであると判定される。しかし実際には、命令Gの後は命令Cが実行されるため、命令列G−B−Gが繰り返し実行されることはなく、命令列G−B−Gは偽ループである。このように、アドレスの一致のみを条件としてループを判定する場合、偽ループを検出してしまうという問題がある。
一方、非特許文献4や5が開示する技術によれば、上述した命令列G−B−Gは、先頭の命令Gが属する関数gから、命令Bが属する関数fへのリターン命令を含むため、命令列G−B−Gをトレースとして生成することは禁止され、結果的に偽ループの検出を排除できる。しかしながら、上記非特許文献5の技術は、命令列G−B−Gを偽ループとして検知するものではないため、命令列G−B−Gはループであるとの判定に基づき、例えば、命令列A−G−B−Gをトレースとして生成することを許してしまう。
また、命令列G−B−Gは偽ループであるが、実行命令の記録を続けることにより得られる命令列G−B−G−C−A−Gは、繰り返し実行され得るため、真のループである。長いトレースの生成は、ランタイムのオーバーヘッドを減らすだけでなく、より効果的な最適化をもたらすので好ましい。しかし、非特許文献4や5が開示する技術によれば、命令列G−B−G−C−A−Gは、先頭の命令Gが属する関数gから、命令Bが属する関数fへのリターン命令を含むため、命令列G−B−G−C−A−Gをトレースとして生成することは禁止される。
そこで、この発明は、上記の問題点を解決するためになされたものであって、トレーシング技術において、偽ループの誤検知を排除し、また、長いトレースを含む真のループの検出ミスを防ぐことのできる、ループ検出技術を提供することを目的とする。
上記課題を解決するために、本発明の第1の態様においては、コンピュータの計算処理により、プログラムにおける各単位処理のうち連続して実行された単位処理の列がループであるか否かを判定するループ検知方法であって、前記コンピュータが、前記コンピュータの記憶部から前記単位処理の列についてアドレス情報を読み出して、前記単位処理の列内のループ始点候補の単位処理と末尾の単位処理の各々のアドレスを比較するステップと、前記コンピュータの記憶部から前記単位処理の列についてコールスタック情報を読み出して、前記ループ始点候補の単位処理の実行時におけるコールスタックと、前記末尾の単位処理の実行時におけるコールスタックを比較するステップと、前記アドレス及び前記コールスタックの各比較結果が一致であることを条件に、前記単位処理の列がループをなすとの判定結果を出力するステップとを含む、ループ検知方法を提供する。
好ましくは、前記コールスタックの比較は、前記コールスタックを構成する各スタックフレーム内のリターンアドレスの比較である。
より好ましくは、前記各スタックフレーム内のリターンアドレスの比較は、最後に積まれたスタックフレームからk番目(kは所定の正の整数)のスタックフレームまでの各リターンアドレスの比較である。
更に好ましくは、前記単位処理の列内の各単位処理実行時のコールスタック内において最も浅いコールスタックの深さをm、前記ループ始点候補の単位処理の実行時におけるコールスタックの深さをk、及び前記末尾の単位処理の実行時におけるコールスタックの深さをkとした場合に、前記所定の正の整数kは、kからmを差し引いた値と、kからmを差し引いた値のうち小さい方の値として算出される。
また好ましくは、上記ループ検知方法は、前記コンピュータが、前記コンピュータの記憶部から前記単位処理の列について単位処理の種類情報及びアドレス情報を読み出して、前記ループ始点候補の単位処理の実行時におけるコールスタックと、前記末尾の単位処理の実行時におけるコールスタックとを構築し、前記コールスタック情報として前記記憶部に記憶するステップを更に含む。
より好ましくは、前記単位処理の種類情報は、前記単位処理が、呼び出し側の単位処理、呼び出され側の単位処理、及びそれ以外のいずれであるかを示す情報である。
更に好ましくは、各コールスタックの構築は、前記単位処理の列について単位処理の種類情報及びアドレス情報を参照して、枝分かれしたリンクリストであって、該リンクリストの各ノードが、スタックフレームを表し、かつ、該スタックフレームのリターンアドレスと該スタックフレームの1つ前のスタックフレームを表すノードへの参照(リンク)とを記録するデータフィールドを有する、前記リンクリストを作成するステップとを含み、前記単位処理の列内の任意の単位処理の実行時のコールスタックは、該任意の単位処理に対応するスタックフレームを表すノードを出発点として前記参照に基づいて1つ前のスタックフレームのノードを順次辿っていき、辿った各ノードのリターンアドレスを繋げることにより構築される。
また好ましくは、前記単位処理は、1つの命令、基本ブロック、又は分岐命令である。
また好ましくは、上記ループ検知方法は、前記コンピュータが、前記単位処理の列内の各単位処理を前記ループ始点候補の単位処理として順次決定し、該決定ごとに各ステップを繰り返し実行するステップを更に含む。
また好ましくは、上記ループ検知方法は、前記コンピュータが、単位処理ごとに実行回数をカウントするステップと、前記実行回数が所定の値に達することを応答して、前記コンピュータの記憶部への前記単位処理の列の記録を開始するステップと、前記単位処理の列がループをなすとの判定の出力に応答して該判定に基づいて前記処理単位の列のトレースを生成し、最適化してコンパイルするステップとを実行するステップを更に含む。
以上、ループ検知方法として本発明を説明したが、本発明は、該ループ検知方法をコンピュータに実行させるループ検知プログラム、該ループ検知プログラムをインストールしたコンピュータにより実現されるループ検知装置として把握することもできる。
本発明によれば、連続して実行された単位処理の列がループであるか否かを判定するにあたり、単位処理の列内のループ始点候補の単位処理と末尾の単位処理のアドレスの一致を条件とするだけでなく、ループ始点候補と末尾の各単位処理の実行時におけるコールスタックの一致をも条件として追加するので、偽ループを誤検出を適切に排除しつつ、真のループの検出ミスを防ぐことが可能となる。本発明のその他の効果については、各実施の形態の記載から理解される。
(a)は、本発明に係るループ検知装置の1実装態様を示す図である。(b)は、本発明に係るループ検知装置の他の実装態様を示す図である。 本発明の第1の実施形態に係るループ検知部200の機能ブロック図である。 本発明の第1の実施形態に係るループ検知部200によるコールスタック比較の一例を示す図である。 本発明の第1の実施形態に係るループ検知部200により作成されるリンクリストを示す。 本発明の第1の実施形態に係るループ検知部200によるループ検知処理の流れを示すフローチャートである。 本発明の第1の実施形態に係るループ検知部200によるTopk算出処理の流れを示すフローチャートである。 本発明の第1の実施形態に係るループ検知部200によるリンクリスト作成処理の流れを示すフローチャートである。 図5に示すコールスタック比較処理(S515)の流れを示すフローチャートである。 本発明の第2の実施形態に係るループ検知部900の機能ブロック図である。 ループ判定結果を本発明(第2の実施形態)と従来技術とで比較した結果を示す表である。 本発明の第2の実施形態に係るループ検知部900によるループ検知処理の流れを示すフローチャートである。 図11に示すリターン命令判定処理(S1110)の流れの一例を示すフローチャートである。 図11に示すリターン命令判定処理(S1110)の流れの他の例を示すフローチャートである。 図1に示すコンパイラ装置100a(又はコンパイラ装置100b及びトレーシングエンジン150)による処理の流れの一例を示すフローチャートである。 ループ判定結果をもとに生成されるトレースの例を示す図である。 ループ判定結果を従来技術と本発明とで比較した結果を示す表である。 本発明の実施形態に係るコンピュータ50のハードウェア構成の一例を示す。
以下、本発明を実施するための形態を図面に基づいて詳細に説明するが、以下の実施形態は特許請求の範囲にかかる発明を限定するものではなく、また実施形態の中で説明されている特徴の組み合わせの全てが発明の解決手段に必須であるとは限らない。
図1(a)は、本発明に係るループ検知装置の1実装態様を示す図である。図1(a)に示す実装態様では、本発明に係るループ検知装置は、トレースベースのコンパイルを行うコンパイラ装置100aの一機能(ループ検知部120a)として実装される。コンパイラ装置100aは、記憶部105a(バッファ)と、実行命令記録部110aと、ループ検知部120aと、トレース生成部130aと、最適化部140aとを備え、プログラムの実行時に繰り返し通過するコードパス、即ちループを検知し、該ループ情報に基づいてトレースを生成し最適化して、高速なネイティブ・コードを生成する。コンパイラ装置100aは、オプションとして更に、コールスタック記録/構築部115aを備えてもよい。
図1(b)は、本発明に係るループ検知装置の他の実装態様を示す図である。図1(b)に示す実装態様では、本発明に係るループ検知装置は、トレースベースのコンパイルを行うコンパイラ装置100bに付随するトレーシングエンジン150の一機能(ループ検知部120b)として実装される。本実施態様では、頻繁に実行される連続する単位処理の列の記録、また、オプションとしての単位処理の列の実行時のコールスタック情報の記録又は構築は、トレーシングエンジン150の機能であり、実行命令記録部110bと、オプションとしてのコールスタック記録/構築部115bは、トレーシングエンジン内に設けられる。更に本発明に係るループ検知装置は、図示はしないが、プロセッサ内でハードウェア実装することも可能である。このように実装態様に違いはあるが、それぞれの態様における各構成要素及びその機能は等しい。そこで以下では、図1(a)に示す実装態様に従って、各構成要素を説明する。
実行命令記録部110aは、最適化対象のプログラム内の各単位処理が実行される頻度を監視し、頻繁に実行される連続する単位処理の列を記録する。具体的には、実行命令記録部110aは最適化対象のプログラム内の単位処理ごとにその実行回数をカウントし、実行回数が所定の閾値に達することを応答して、その頻繁に実行される単位処理の列の記憶部105a(バッファ)への記録を開始する。記録開始後、実行命令記録部110aは、記憶部105a(バッファ)内の単位処理の列について、後述するループ検知部120aにループの判定を要求する。そして、例えばループを検出した、バッファが一杯になった等、所定の命令記録終了条件が満たされた場合に、実行命令記録部110aはその記録を終了する。
ここで、最適化対象のプログラム内の各単位処理とは、1つの命令、基本ブロック、又は分岐命令であってよい。なお、基本ブロックとは、最初に実行される命令及び最後に実行される命令以外の命令が、分岐命令及び分岐先の命令の何れでもない命令の集合をいう。また、実行命令記録部110aが記憶部105a(バッファ)へ記録する情報は、各単位処理の種類と、そのアドレス情報を含む。ここで各単位処理の種類とは、単位処理が、呼び出し側の単位処理、呼び出され側の単位処理、及びそれ以外のいずれであるかを示す情報であってよい。例えば単位処理が1つの命令の場合、各単位処理の種類は、呼出し命令(method call)、リターン命令(method return)、呼出し命令及びリターン命令以外の命令のいずれであるかを示す情報であってよい。
また、単位処理が基本ブロックの場合、各単位処理の種類は、その基本ブロック末尾の命令が、呼出し命令(method call)、リターン命令(method return)、呼出し命令及びリターン命令以外の命令のいずれであるかを示す情報であってよい。また、単位処理が分岐命令の場合は、各単位処理の種類は、その分岐命令が呼出し命令(method call)、リターン命令(method return)、呼出し命令及びリターン命令以外の命令のいずれであるかを示す情報であってよい。
オプションとしてのコールスタック記録/構築部115aは、後述するループ検知部120aが、コールスタックを構築する機能を有しない場合に、コンパイラ装置100aに設けられる。コールスタック記録/構築部115aは、コールスタック記録部として機能する場合、実行命令記録部110aによる単位処理の列の記録開始に応答して、記録される単位処理の実行時のコールスタック情報を記憶部105a(バッファ)へ記録する。コールスタック記録/構築部115aが記憶部105a(バッファ)へ記録するコールスタック情報は、コールスタックを構成する各スタックフレーム内のリターンアドレス、又はスタックポインタである。
一方、コールスタック記録/構築部115aは、コールスタック構築部として機能する場合、後述するループ検知部120aによる処理の開始前に、記憶部105a(バッファ)に記憶される各単位処理の種類及びアドレスを参照して、コールスタックを構築する。より具体的には、コールスタック記録/構築部115aは、コールスタックを構成する各スタックフレーム内のリターンアドレスを構築する。なお、コールスタックの構築は、後述するループ検知部120aにより行ってもよく、詳細は、ループ検知部120aに関連して後述する。
ループ検知部120aは、実行命令記録部110aからのループ判定要求に応答して、記憶部105a(バッファ)内の単位処理の列についてループの判定を行う。具体的には、ループ検知部120aは、記憶部105a(バッファ)からアドレス情報及びコールスタック情報を読み出し、単位処理の列内のループ始点候補の単位処理と末尾の単位処理の各々のアドレスが一致すること、かつ、上記ループ始点候補の単位処理の実行時におけるコールスタックと、上記末尾の単位処理の実行時におけるコールスタックとが一致することを条件として、単位処理の列がループをなすとの判定を出力する。ループ検知部120aの機能の詳細は、図2を参照して後述する。
トレース生成部130aは、ループ検知部120aにより検知されたループである単位処理の列に基づいてトレースを生成する。最適化部140aは、生成されたトレースを最適化して、最適化後のトレースを、コンパイル結果のプログラムとして出力する。
(第1実施形態) 図2は、本発明の第1の実施形態に係るループ検知部200の機能ブロック図である。第1の実施形態に係るループ検知部200は、アドレス比較部210と、コールスタック比較部220と、判定結果出力部240とを含む。また、ループ検知部200は、図1を参照して説明した、実行回数が所定の閾値以上である単位処理の列に関する情報を記憶する記憶部105a/b(バッファ)に接続する。以下の説明では各単位処理は1つの命令であるとして説明する。
アドレス比較部210は、ループ検知部200におけるループ判定の要求の受信に応答して、記憶部105a/b(バッファ)から命令列のアドレス情報を読み出し、命令列内のループ始点候補の命令と末尾の命令の各々のアドレスを比較する。ここで、記憶部105a/b(バッファ)に記憶される命令列をn+1個の命令からなる命令列とし、該命令列を、命令の種類とアドレスとをメンバとする構造体の配列inst[0…n]で表すと、ループ始点候補の命令はinst[s](sは0≦s<nを満たす正の整数、以下同じ)と表される。アドレス比較部210によるinst[s]とinst[n]のアドレスの比較結果は、始点候補の位置情報sと共に、コールスタック比較部220及び判定結果出力部240へ渡される。
ここで、ループ始点候補は、図1を参照して説明した実行命令記録部110a/bによって決定される。即ち、実行命令記録部110a/bは、記憶部105a/b(バッファ)に記憶される命令列inst[0…n]内の各命令inst[i](iは0≦i<nを満たす任意の正の整数、以下同じ)をループ始点候補の命令inst[s]として順に決定し、その都度、ループ判定の要求を、ループ始点候補の位置情報sと共にループ検知部200へ渡す。これに代えて、ループ始点候補は、アドレス比較部210によって決定してもよい。この場合、アドレス比較部210は、命令列inst[0…n]内の各命令inst[i]をループ始点候補の命令inst[s]として順に決定し、その都度、ループ始点候補の命令inst[s]と末尾の命令inst[n]の各々のアドレスを比較する。
コールスタック比較部220は、アドレス比較部250からのアドレス一致の判定結果に応答して、
記憶部105a/b(バッファ)からコールスタック情報を読み出し、ループ始点候補の命令inst[s]の実行時におけるコールスタックと、末尾の命令inst[n]の実行時におけるコールスタックとを比較する。本実施例では、記憶部105a/b(バッファ)に記憶されるコールスタック情報は、各命令inst[i]の実行時におけるコールスタックを構成する各スタックフレーム内のリターンアドレスである。コールスタック比較部220による比較結果は、始点候補の位置情報sと共に、判定結果出力部240へ渡される。
ここで、コールスタック比較部220によるコールスタックの比較は、コールスタックを構成する全スタックフレーム内の全リターンアドレスでなくてよい。即ち、コールスタック比較部220によるコールスタックの比較を、最後に積まれたスタックフレームからk番目(kは所定の正の整数)のスタックフレームまでの各リターンアドレスについての比較に代えても、適切なkの値を設定すれば、コールスタックの一致・不一致の判定の性能に影響はほとんどない。そのような所定の正の整数k=4とすると、コールスタック比較部220は、図3に示すように、両命令のコールスタックの上位4つのスタックフレーム内の各リターンアドレスをそれぞれ比較して、両命令のコールスタックの一致・不一致を判定する。なお、図3に示す例では、スタックは正の方向へ成長するとしている。
コールスタックの一致・不一致の判定の性能にほとんど影響を与えない所定の正の整数kを求めるため、コールスタック比較部220は、好ましくは、TOPk算出部225を含む。そして、TOPk算出部225は、所定の正の整数kを次のようにして求める。即ち、TOPk算出部225は、命令列inst[0…n]内の各命令inst[i]の実行時のコールスタック内において最も浅いコールスタックの深さをm、ループ始点候補の命令inst[s]の実行時におけるコールスタックの深さをk、末尾の命令inst[n]の実行時におけるコールスタックの深さをkとすると、所定の正の整数kを、kからmを差し引いた値とkからmを差し引いた値とのうち、小さい方の値として算出する。
所定の正の整数kを式にして表すと次のようになる。なお、式中のcallStack[i].depthはi番目の命令inst[n]の実行時のコールスタックの深さを表す。
k=min(k、k) ―(1)
但し、m= min0≦i≦ncallStack[i].depth ―(2)
= callStack[s].depth − m ―(3)
= callStack[n].depth − m ―(4)
ここで各命令inst[i]のコールスタック情報は、上述したように、コンパイラ装置100a又はトレーシングエンジン150内に設けられた、コールスタック記録部として機能するコールスタック記録/構築部115a/bにより、各命令inst[i]の実行時に記憶部105a/b(バッファ)に格納される。これに代えて、コールスタック比較部220は、コールスタック構築部230を有し、コールスタック構築部230によりコールスタックを構築してもよい。但しこの場合、TOPk算出部225による所定の正の整数kの算出は、コールスタック構築後に行われる。
コールスタック構築部230は、記憶部105a(バッファ)から各命令inst[i]について命令の種類及びアドレスを読み出して、ループ始点候補の命令inst[s]の実行時におけるコールスタックと、末尾の命令inst[n]の実行時におけるコールスタックとを構築し、コールスタック情報として記憶部105a/b(バッファ)に記憶する。
より詳細には、コールスタック構築部230は、各命令inst[i]について命令の種類及びアドレスを参照して、枝分かれしたリンクリストであって、該リンクリストの各ノードが、スタックフレームを表し、かつ、該スタックフレーム内のリターンアドレスを記録するaddressフィールドと該スタックフレームの1つ前のスタックフレームを表すノードへの参照(リンク)を記録するparentフィールドを有する、リンクリストを作成する。 すると、命令inst[i]の実行時のコールスタックは、該命令inst[i]に対応するスタックフレームを表すノードを出発点として、各ノードのparentフィールドの参照(リンク)に基づいて1つ前のスタックフレームのレコードを順次辿っていき、辿った各ノードのaddressフィールドのリターンアドレスを繋げることにより構築される。
また、TOPk算出部225が所定の正の整数kを求めるために使用する各命令inst[i]の実行時のコールスタックの深さは、該命令inst[i]に対応するスタックフレームを表すノードから、addressフィールド及びparentフィールドが共にNULLであるルートノードまでの深さ・段数として求められる。かかる深さ・段数は、ルートノードを基準とした相対的な深さ・段数であるが、式(2)により求められる最も浅いコールスタックの深さmもまた相対的な深さ・段数となるため、式(3)、式(4)、式(1)によりそれぞれ求められるk1, k2, kの各値には影響はない。
図4は、コールスタック構築部230により作成されるリンクリスト400の一例を示す。図4に示すリンクリスト400は、コード440の実行時のコールスタックに対して作成されるリンクリストを示す。リンクリスト400のノード405は、最初に実行される関数fのためのスタックフレームに対応するルートノードであるため、addressフィールド及びparentフィールドにはそれぞれNULLが登録されている。
リンクリスト400のノード410は、関数f内で関数gが呼び出された際に積まれるスタックフレームを表す。ノード410のaddressフィールドには、関数gの呼び出し命令の次の命令Aのアドレスがリターンアドレスとして登録されている。また、ノード410のparentフィールドには、1つ前のスタックフレームを表すノード405への参照415が登録されている。
リンクリスト400のノード420は、関数g内での関数hの最初の呼び出し時に積まれるスタックフレームを表す。ノード420のaddressフィールドには、関数hの最初の呼び出し命令の次の命令Bのアドレスがリターンアドレスとして登録されている。また、ノード420のparentフィールドには、1つ前のスタックフレームを表すノード410への参照425が登録されている。
リンクリスト400のノード430は、関数g内での関数hの2度目の呼び出し時に積まれるスタックフレームを表す。ノード430のaddressフィールドには、関数hの2度目の呼び出し命令の次の命令Cのアドレスがリターンアドレスとして登録されている。また、ノード430parentフィールドには、1つ前のスタックフレームを表すノード410への参照435が登録されている。
このようなリンクリスト400が作成されると、上述したように、コード440内の各命令inst[i]の実行時のコールスタックは、該命令inst[i]に対応するスタックフレームを表すノードを出発点として、各ノードのparentフィールドの参照(リンク)に基づいて1つ前のスタックフレームのレコードを順次辿っていき、辿った各ノードのaddressフィールドのリターンアドレスを繋げることにより構築される。
例として、コード440内の関数hが実行された際のコールスタックの構築を考える。関数hは関数g内で命令Fの条件が満たされた場合に2回呼び出されているため、関数hの1回目の呼出し命令により命令Hが実行される場合を考える。すると、そのような命令Hに対応するスタックフレームを表すのは、リンクリスト400のノード420である。従って、ノード420を出発点とすると、parentフィールドの参照に従って、ノード410、ノード405と順にノードを辿ることができる。そして辿った各ノードのaddressフィールドのリターンアドレスを繋げると、B−A−NULL、即ち、コールスタックBA455を構築できる。
次に、関数hの2回目の呼出し命令により命令Hが実行される場合を考える。すると、そのような命令Hに対応するスタックフレームを表すのは、リンクリスト400のノード430である。従って、ノード430を出発点とすると、parentフィールドの参照に従って、ノード410、ノード405とノードを順に辿ることができる。そして辿った各ノードのaddressフィールドのリターンアドレスを繋げると、C−A−NULL、即ち、コールスタックCA460を構築できる。
なお、各命令inst[i]と、該命令inst[i]に対応するスタックフレームを表すノードとの対応付けは、リンクリストの作成と、リンクリストのノードと命令inst[i]との対応付けを平行して行うことによりなされる。そのような処理の詳細は、図7に示すリンクリスト作成のフローチャートを参照して後述する。
判定結果出力部240は、アドレス比較部210とコールスタック比較部220による各比較結果が共に一致であることを条件に、命令列inst[s…n]がループをなすとの判定結果を出力する。例として図4に示すコード440内の関数gの実行により得られる実行命令列H−B−Hを考える。命令列の先頭Hは、関数hの1回目の呼出し命令により実行された命令Hである。一方、命令列の末尾Hは、関数hの2回目の呼び出し命令により実行された命令Hである。従って、命令列の先頭Hと命令列の末尾Hのアドレスは一致するが、両命令の実行時のコールスタックは、図4を参照して説明したように、先頭HがBA455であるのに対し、末尾HはCA460であるため、一致しない。従って、判定結果出力部240は、実行命令列H−B−Hに対し、ループをなさない、即ち偽ループであるとの判定結果を出力する。
実際、実行命令列H−B−Hの次に実行される命令はCであり、実行命令列H−B−Hは繰り返されないので偽ループである。このように、第1実施形態に係るループ検知部200では、ループであるか否かの判定を、アドレスの一致だけでなく、コールスタックの一致をも条件として行うので、偽ループをループとする従来技術の誤検知の問題を解決できる。
また、他の例として、図4に示すコード440内の関数gの実行により得られる実行命令列H−B−H−C−A−Hを考える。この場合、命令列の先頭Hと末尾Hはいずれも関数hの1回目の呼出し命令により実行された命令Hである。従って、先頭Hと末尾Hの実行時のコールスタックは、いずれもBA455であり、先頭Hと末尾Hはアドレスだけでなく実行時のコールスタックも一致する。従って、判定結果出力部240は、実行命令列H−B−H−C−A−Hに対し、ループをなすとの判定結果を出力する。
実際、実行命令列H−B−H−C−A−Hに続いて順に実行される命令はB、H、C、Aであり、実行命令列H−B−H−C−A−Hは繰り返され得るので真のループである。このように、第1実施形態に係るループ検知部200では、ループであるか否かの判定を、アドレスの一致と、コールスタックの一致を条件として行うので、命令列の先頭の命令が属する関数からのリターン命令を含む真のループを偽ループとする従来技術の検出ミスの問題を解決できる。
次に図5から図8を参照して、第1の実施形態に係るループ検知部200による処理の流れを説明する。図5は、第1の実施形態に係るループ検知部200によるループ検知処理全体の流れを示すフローチャートである。図6は、Topk算出処理の流れを示すフローチャートである。図7は、リンクリスト作成処理の流れを示すフローチャートである。図8は、リンクリストを用いたコールスタック比較処理の流れを示すフローチャートである。
図5に示す処理は、ステップ500から開始し、ループ検知部200において、ループの始点候補s(0≦s<n)の情報を含むループ判定要求が受信される。続いて、アドレス比較部210は、ループ判定の要求の受信に応答して、記憶部105a/b(バッファ)からループ始点候補inst[s]と命令列の末尾inst[n]のアドレス情報を読み出し、始点候補と末尾の両命令のアドレスが一致するか否かを判定する(ステップ505)。
始点候補と末尾の両命令のアドレスが一致する場合(ステップ505:YES)、処理はステップ510へ進み、コールスタック比較部220は、アドレスが一致するとの判定結果に応答して、記憶部105a/b(バッファ)からループ始点候補inst[s]と命令列の末尾inst[n]のコールスタック情報を読み出し、始点候補と末尾の両命令のそれぞれの実行時のコールスタックが一致するか否かを判定する。
始点候補と末尾の両命令のコールスタックスが一致する場合(ステップ510:YES)、処理はステップ515へ進み、判定結果出力部240は、命令列inst[s…n]についてループであるとの肯定の判定結果を出力する。一方、ステップ505においてアドレスが一致しないと判定された場合、又は、ステップ510においてコールスタックが一致しないと判定された場合、処理はステップ520へ進み、判定結果出力部240は、命令列inst[s…n]はループでないとの否定の判定結果を出力する。ステップ515又はステップ520の後処理は終了する。
図6に示すTOPk算出処理は、記憶部105a/b(バッファ)に命令列inst[s…n]のコールスタック情報が記憶されている状態において、TOPk算出部225により、図5に示すコールスタック比較処理(S515)前のいずれかのタイミングでオプションとして実行される。処理はステップ600から開始し、TOPk算出部225は、命令列inst[0…n]内の各命令の実行時のコールスタックの中で最も浅いコールスタックの深さmin0≦i≦ncallStack[i].depthをmに設定する。
続いて、TOPk算出部225は、ループ開始候補のコールスタックの深さcallStack[s].depthからmを差し引いた値をkに設定する(ステップ605)。同様に、TOPk算出部225は、命令列の末尾のコールスタックの深さcallStack[n].depthからmを差し引いた値をkに設定する(ステップ610)。
続いて、TOPk算出部225は、kとkのうち小さいほうの値min(k、k)を、kに設定し(ステップ615)、kを比較すべき上位のリターンアドレス数として出力する(ステップ620)。そして処理は終了する。
図7に示すリンクリスト作成処理は、コールスタック情報が実行命令の記録時に記録されない場合に、コールスタック構築部230(又はコールスタック記録/構築部115a、b)により、図5に示すコールスタック比較処理(S515)前のいずれかのタイミングで実行される。上述したように、図7に示すリンクリスト作成処理では、リンクリストの作成と同時に、各命令inst[i]と該命令inst[i]に対応するスタックフレームを表すノードとの対応付けを行う。具体的には、命令inst[i]ごとに、対応するリンクリストのノードの情報を格納するためのcallStackNode[i]を用意し、リンクリストのノードを作成しながら、作成したノードの参照を、対応する命令のcallStackNodeに登録していく。
図7において処理はステップ700から開始し、コールスタック構築部230は、記憶部105a/b(バッファ)から命令列inst[0…n]を読み出す。続いて、コールスタック構築部230は、addressフィールド及びparentフィールドの値を共にNULLとするルートノードを生成し、リンクリストの現在の処理対象ノードPをルートノードで、また、現在の処理対象の命令の識別子iを値0で、それぞれ初期化する(ステップ705)。
続いてコールスタック構築部230は、現在の処理対象の命令inst[i]に対応するノードの情報を格納するcallStackNode[i]に、現在の処理対象ノードPを設定する(ステップ710)。なお、初めてステップ710の処理が行われるとき、変数iの値は0であり、callStackNode[0]には、リンクリストのルートノードの参照が設定される。これは、命令列の中に、先頭の命令inst[0]が属する関数を呼出し先とする呼出し命令がないことを意味するが、必ずしもそうである必要はない。そのような呼出し命令があった場合は、後述するステップ740、745において新規にルートノードが生成され、以前のルートノードのaddressフィールド及びparentフィールドは適切な値で更新される。
続いてコールスタック構築部230は、変数iがnに等しいか否かを判定する(ステップ715)。
現在の処理対処の命令がまだn番目の命令でない場合(ステップ715:NO)、処理はステップ720へ進み、コールスタック構築部230は、現在の処理対象の命令inst[i]の命令の種類を判定する。命令の種類が関数の呼び出し命令である場合、処理はステップ725へ進み、コールスタック構築部230は、リンクリストのノードを新たに生成する。そしてコールスタック構築部230は、新規に生成したノードのaddressフィールドに、呼び出し命令である現在の処理対象の命令inst[i]のプログラムアドレス順での次の命令のアドレス(リターンアドレス)を設定し、parentフィールドに現在の処理対象ノードPを設定する。その後コールスタック構築部230は、現在の処理対象ノードPを、ステップ725において新規に生成したノードで更新する(ステップ730)。
一方ステップ720において命令の種類がリターン命令である場合、処理はステップ735へ進み、コールスタック構築部230は、現在の処理対象ノードPのparentフィールドの値がNULLであるか否かを判定する。parentフィールドの値がNULLである場合(ステップ735:YES)、処理はステップ740へ進み、コールスタック構築部230は、addressフィールド及びparentフィールドの値を共にNULLとするリンクリストのノードを新たに生成する。続いてコールスタック構築部230は、現在の処理対象ノードPのaddressフィールドを、現在の処理対象の命令inst[i]の命令列inst[0…n]内の順番での次の命令inst[i+1]のアドレスで更新し、また、parentフィールドをステップ740において新規に生成したノードで更新する(ステップ745)。inst[i+1]は、リターン命令inst[i]の戻り先の命令と考えられる。
ステップ745から、又はステップ735において現在の処理対象ノードPのparentフィールドの値がNULLでない場合、処理はステップ750へ進み、コールスタック構築部230は、現在の処理対象ノードPを、Pのparentフィールドの値、即ちP.parentで更新する。ステップ730若しくはステップ750から、又はステップ720において命令の種類がリターン命令でも呼出命令でもない場合、処理はステップ755へ進み、コールスタック構築部230は、変数iを1インクリメントしてステップ710の処理へ戻り、一連の処理を繰り返す。
ステップ715において、変数iがnに等しい場合、即ち、リンクリストの作成と、各命令inst[i]と該命令inst[i]に対応するスタックフレームを表すノードとの対応付けとが完了すると、コールスタック構築部230は、callStackNode[0…n]を出力し(ステップ760)、その後処理は終了する。
図8は、図5に示すコールスタック比較処理(S515)を、リンクリストを用いて行う場合の処理の詳細を示すフローチャートである。処理はステップ800から開始し、コールスタック比較部220はカウンタcを値0で初期化する。続いてコールスタック比較部220は、変数pに、ループ始点候補の命令inst[s]に対応するノード情報callStackNode[s]を設定し、変数qに、末尾の命令inst[n]に対応するノード情報callStackNode[n]を設定する(ステップ805)。
続いてコールスタック比較部220は、p.addressとq.addressを比較する(ステップ810)。両アドレスが一致しない場合(ステップ810:NO)、コールスタック比較部220は、コールスタックは一致しないとの判定結果をもって処理を終了する。一方、両アドレスが一致する場合(ステップ810:YES)、処理はステップ815へ進み、コールスタック比較部220は、変数pをp.parentで、変数qをq.parentでそれぞれ更新する。
続いて、コールスタック比較部220は、カウンタcを1インクリメントし(ステップ820)、カウンタcが、比較すべき上位のリターンアドレス数kに等しいか否かを判定する(ステップ825)。カウンタcが、比較すべき上位のリターンアドレス数kに等しくない場合(ステップ825:NO)、コールスタック比較部220はステップ810の処理へ戻り、一連の処理を繰り返す。一方、カウンタcが比較すべき上位のリターンアドレス数kに等しい場合(ステップ825:YES)、コールスタック比較部220は、コールスタックは一致するとの判定結果をもって処理を終了する。
(第2実施形態) 図9は、本発明の第2の実施形態に係るループ検知部900の機能ブロック図である。第2の実施形態に係るループ検知部900は、アドレス比較部905と、リターン判定部910と、判定結果出力部915とを備え、ループ始点候補の命令と末尾の命令とでアドレスが一致すること、かつ、命令列が、ループの先頭の命令が属する関数からのリターン命令を含まないことを条件としてループであるとの判定を行う。ループ検知部900はまた、図1を参照して説明した、実行回数が所定の閾値以上である命令列に関する情報を記憶する記憶部105a/b(バッファ)に接続する。以下の説明では、記憶部105a/b(バッファ)には、n+1個の命令からなる命令列inst[0…n]が記憶されているものとして説明する。
アドレス比較部905は、ループ検知部900におけるループ判定の要求の受信に応答して、記憶部105a/b(バッファ)から命令列のアドレス情報を読み出して、命令列内のループ始点候補の命令inst[s]と末尾の命令inst[n]の各々のアドレスを比較する。アドレス比較部905によるinst[s]とinst[n]のアドレスの比較結果は、始点候補の位置情報sと共に、リターン判定部910及び判定結果出力部915へ渡される。アドレス比較部905による処理は、本発明の第1の実施形態に係るループ検知部200におけるアドレス比較部210による処理と同じであるため、これ以上の説明は省略する。
リターン判定部910は、アドレス比較部905からのアドレス一致の判定結果に応答して、命令列inst[s…n]の中に、ループ始点候補の命令inst[s]が属する関数からのリターン命令が含まれるか否かを判定する。リターン判定部910による判定結果は、始点候補の位置情報sと共に、判定結果出力部920へ渡される。
リターン判定部910は、上記判定を、ループ始点候補の命令inst[s]の実行時におけるスタックポインタSPと、命令列inst[s…n]内の各命令実行時におけるスタックポインタSPとを比較することにより行う。より具体的には、リターン判定部910は、命令列inst[s…n]内に、ループ始点候補の命令inst[s]の実行時におけるスタックポインタSPよりも大きいスタックポインタSPを有する命令が存在する場合に、命令列inst[s…n]内にループ始点候補からのリターン命令が含まれると判定してよい。但し、この場合スタックは負の方向へ成長するものとする。
これに代えて、リターン判定部910は、上記判定を、ループ始点候補の命令inst[s]の実行時におけるスタックコールの深さと、命令列inst[s…n]内の各命令実行時におけるコールスタックの深さとを比較することにより行ってもよい。より具体的には、リターン判定部910は、命令列inst[s…n]内の各命令について、ループ始点候補の命令inst[s]の実行時におけるコールスタックの深さを基準(=0)とした相対的なコールスタックの深さlevelを求め、該深さlevelの値が負となるような命令が命令列inst[s…n]内に存在する場合に、命令列inst[s…n]内にループ始点候補からのリターン命令が含まれると判定してよい。
なお、スタックポインタSP情報は、図1を参照して説明したコールスタック記録/構築部115a、bが、実行命令記録部110aによる命令列の記録開始に応答して、記憶部105a(バッファ)へ記録してよい。また、相対的なコールスタックの深さlevel情報は、リターン判定部910が、命令列inst[s…n]内の各命令の種類に応じて、コールスタックの深さlevelを増減させることにより求めてよい。詳細は図12を参照して後述する。
判定結果出力部915は、アドレス比較部905からアドレス一致との比較結果を、また、リターン判定部910からループ始点候補からのリターン命令は含まれないとの判定結果を受け取ることを条件に、命令列inst[s…n]がループであるとの判定結果を出力する。
ここで、図10(b)に示すコードを例として、本発明の第2の実施形態に係るループ検知部900のよるループ判定結果を説明する。図10(a)は、トレースの先頭の命令が属する関数からのリターン命令を含むトレースの生成を禁止する従来手法によるループ判定結果と、本発明の第2の実施形態に係るループ検知部900によるループ判定結果とを比較した表である。表では、図10(b)に示すコードから得られる4種類の命令列(上から順に、G−B−G、A−G−B−G、A−G−B−G−C−A、G−B−G−C―A−G)について、それぞれの手法によるループ判定結果を比較している。なお、命令列の下に描かれている2つの矢印は、上段がトレースの先頭位置を、下段がループの先頭位置を示している。なお、従来手法によるループ判定結果は、正確には、トレースの生成の許可・禁止の結果である。
まず1つ目の命令列G−B−Gについて検討する。命令列G−B−Gは、トレースの先頭Gとループの先頭Gが同じであるため、ループ判定結果は従来手法と本発明とで異ならない。即ち、命令列G−B−GのG−Bにより、トレース/ループの先頭命令Gの属する関数gからのリターン命令が命令列に含まれることが示されるので、どちらの手法でも偽ループとの判定結果が得られている。実際、命令列G−B−Gに続いて実行されるのは命令Cであるため、命令列G−B−Gは偽ループであり、両手法による判定結果は正しい。
次に3つ目の命令列A−G−B−G−C−Aについて検討する。命令列A−G−B−G−C−Aもまた、トレースの先頭Aとループの先頭Aが同じであるため、ループ判定結果は従来手法と本発明とで異ならない。即ち、命令列A−G−B−G−C−Aには、トレース/ループの先頭命令Aの属する関数fからのリターン命令が含まれないため、どちらの手法でもループとの判定結果が得られている。実際、命令列A−G−B−G−C−Aは繰り返し実行され得る命令列であるため、真のループであり、両手法による判定結果は正しい。
次に2つ目の命令列について検討する。命令列A−G−B−Gについては、トレースの先頭Aとループの先頭Gが異なるため、ループ判定結果は従来手法と本発明とで異なる。即ち、従来手法では、トレースの先頭命令Aの属する関数fからのリターン命令が命令列に含まれないため、ループとの判定結果が得られている。これに対し本発明では、命令列A−G−B−GのG−Bにより、ループの先頭命令Gの属する関数gからのリターン命令が命令列に含まれることが示されるので、偽ループとの判定結果が得られている。実際、命令列G−B−Gに続いて実行されるのは命令Cであり、命令列G−B−Gは繰り返し実行されないので、偽ループである。このように、従来手法において結果的に偽ループとして判定していたケースについても、本発明によれば正しくループの判定を行うことができる。
次に4つ目の命令列について検討する。命令列G−B−G−C―A−Gは、トレースの先頭Gとループの先頭Gが同じであるため、ループ判定結果は従来手法と本発明とで異ならない。即ち、命令列G−B−G−C―A−GのG−Bにより、トレース/ループの先頭命令Gの属する関数gからのリターン命令が命令列に含まれることが示されるので、どちらの手法でも偽ループとの判定結果が得られている。しかし実際は、命令列G−B−G−C―A−Gは繰り返し実行され得る命令列であるため、真のループであり、両手法による判定結果は間違いである。但し、命令列G−B−G−C―A−Gについては、開始点がA−G−B−G−C−Aに比べると非典型的であるため、システムによってはこのようなループの検出要求は低い。また、偽ループをループとする誤検出ではないため、かかる判定ミスは許容範囲といえる。
次に図11から図13を参照して、第2の実施形態に係るループ検知部900による処理の流れを説明する。図11は、第2の実施形態に係るループ検知部900によるループ検知処理全体の流れを示すフローチャートである。図12は、図11に示すフローチャートのステップ1110のリターン命令判定処理の流れの一例を示すフローチャートである。図13は、図11に示すフローチャートのステップ1110のリターン命令判定処理の流れの他の例を示すフローチャートである。
図11に示す処理は、ステップ1100から開始され、ループ検知部900において、ループの始点候補s(0≦s<n)の情報を含むループ判定要求が受信される。続いて、アドレス比較部905は、ループ判定の要求の受信に応答して、記憶部105a/b(バッファ)からループ始点候補inst[s]と命令列の末尾inst[n]のアドレス情報を読み出し、始点候補と末尾の両命令のアドレスが一致するか否かを判定する(ステップ1105)。
始点候補と末尾の両命令のアドレスが一致する場合(ステップ1105:YES)、処理はステップ1110へ進み、リターン判定部910は、アドレスが一致するとの判定結果に応答して、命令列inst[s…n]の中に、ループ始点候補の命令inst[s]が属する関数からのリターン命令が含まれるか否かを判定する。
リターン命令が含まれない場合(ステップ1110:YES)、処理はステップ1115へ進み、判定結果出力部915は、命令列inst[s…n]はループであるとの肯定の判定結果を出力する。一方、ステップ1105においてアドレスが一致しないと判定された場合、又はステップ1110においてリターン命令が含まれると判定された場合、処理はステップ1120へ進み、判定結果出力部915は、命令列inst[s…n]はループでないとの否定の判定結果を出力する。ステップ1115又はステップ1120の後処理は終了する。
図12に示す第1実施例のリターン命令判定処理は、ステップ1200から開始され、リターン判定部910は、ループ始点候補の命令inst[s]の実行時におけるスタックポインタSPと、命令列inst[s…n]内の各命令実行時におけるスタックポインタSPとを比較して、命令列inst[s…n]内に、ループ始点候補の命令inst[s]の実行時におけるスタックポインタSPよりも大きいスタックポインタSPを有する命令が存在するか否かを判定する。
そのような命令が命令列inst[s…n]内に存在する場合(ステップ1200:YES)、リターン判定部910は、ループ始点候補の命令inst[s]が属する関数からのリターン命令が含まれるとの判定結果をもって処理を終了する。一方、そのような命令が命令列inst[s…n]内に存在しない場合(ステップ1200:NO)、リターン判定部910は、ループ始点候補の命令inst[s]が属する関数からのリターン命令が含まれないとの判定結果をもって処理を終了する。なお、ここでは、スタックは負の方向へ成長するものとしている。
図13に示す第2実施例のリターン命令判定処理は、ステップ1300から開始され、リターン判定部910は、ループ始点候補の命令inst[s]の実行時におけるコールスタックの深さを基準(=0)とした相対的なコールスタックの深さの現在の値を示す変数levelを用意し、値0で初期化する。続いてリターン判定部910は、命令列inst[s…n]の内、現在の処理対象命令を識別する変数iを、ループ始点候補の識別子sで初期化する(ステップ1305)。
続いてリターン判定部910は、現在の処理対象命令の識別子iがn以下であるか否かを判定する(ステップ1310)。現在の処理対象命令の識別子iがn以下である場合(ステップ1310:YES)、処理はステップ1315へ進み、リターン判定部910は、現在の処理対象命令inst[i]の命令の種類を判定する。
ステップ1315において命令の種類が関数の呼び出し命令である場合、処理はステップ1320へ進み、リターン判定部910は現在のコールスタックの相対的な深さlevelを1インクリメントする。そして、リターン判定部910は、現在の処理対象命令を識別する変数iを1インクリメントして(ステップ1325)、ステップ1310の処理へ戻り、一連の処理を繰り返す。
ステップ1315において命令の種類が関数の呼び出し命令でもリターン命令でもない場合、処理はステップ1325へ進み、リターン判定部910は現在の処理対象命令を識別する変数iを1インクリメントして(ステップ1325)、ステップ1310の処理へ戻り、一連の処理を繰り返す。
一方、ステップ1315において命令の種類がリターン命令である場合、処理はステップ1330へ進み、リターン判定部910はコールスタックの現在の相対的な深さlevelを1デクリメントする。続いてリターン判定部910は、コールスタックの現在の相対的な深さlevelが0より小さいか否かを判定する(ステップ1335)。コールスタックの現在の相対的な深さlevelが0より小さい場合(ステップ1335:YES)、リターン判定部910は、ループ始点候補の命令inst[s]が属する関数からのリターン命令が含まれるとの判定結果をもって、処理を終了する。コールスタックの現在の相対的な深さlevelが0以上である場合(ステップ1335:NO)、リターン判定部910は、現在の処理対象命令を識別する変数iを1インクリメントして(ステップ1325)、ステップ1310の処理へ戻り、一連の処理を繰り返す。
一方、ステップ1310において、現在の処理対象命令の識別子iがnより大きい場合(ステップ1310:NO)、即ち、命令列inst[s…n]内の全ての命令について相対的なコールスタックの深さlevelが検討され、かつ、相対的なコールスタックの深さlevelが負になることがなかった場合、リターン判定部910は、ループ始点候補の命令inst[s]が属する関数からのリターン命令が含まれないとの判定結果をもって、処理を終了する。
上述したように、本発明に係るループ検知装置は、トレースベースのコンパイルを行うコンパイラ装置100aの一機能(ループ検知部120a)として実装されてもよく、或いは、トレースベースのコンパイルを行うコンパイラ装置100bに付随するトレーシングエンジン150の一機能(ループ検知部120b)として実装されてもよい。以下では、図14を参照して、コンパイラ装置100a又はコンパイラ装置100b及びトレーシングエンジン150によるコンパイル処理の流れを説明する。
図14は、コンパイラ装置100a又はコンパイラ装置100b及びトレーシングエンジン150によるコンパイル処理の流れを示すフローチャートである。処理はステップ1400から開始し、コンパイラ装置100aの実行命令記録部110a又はトレーシングエンジン150の実行命令記録部110bは、インタプリタによる命令の実行に応答して、実行命令に割り当てられたカウンタを1増加する。続いて、実行命令記録部110a/bは、カウンタが所定の閾値に達したことに応答して、実行命令を格納する記憶部105a/b(バッファ)を空にする(ステップ1410)。
続いて、実行命令記録部110a/bは、実行命令記録終了条件が満たされているか否かを判定する(ステップ1415)。ここで実行命令記録終了条件とは、例えば、ループを検出した、バッファが一杯になった等、所定の命令記録終了条件をいう。実行命令記録終了条件がまだ満たされない場合(ステップ1415:NO)、処理はステップ1420へ進み、実行命令記録部110a/bは、実行命令を記憶部105a/b(バッファ)の末尾に追加する。
続いて、処理はステップ1425へ進み、実行命令記録部110a/bは、記憶部105a/b(バッファ)に記憶されているn+1個の命令列inst[0…n]に対して、ループ始点候補の位置sを0≦s<nの範囲で順次決定する。決定されたループ始点候補の位置sはループ検知部120a/bへ渡され、ループ検知部120a/bは、命令列inst[s…n]に対して、ループ判定を行う(ステップ1430)。ループ判定処理の詳細は、図5〜図8、図11〜図13を参照して既に説明した通りであるから、ここでは省略する。
ループ検知部120a/bは、ループ始点候補の位置として実行命令記録部110a/bにより決定された全てのsについてループ判定結果を得ると、ループを検出されたsが1以上あったか否かを判定する(ステップ1435)。ループを検出されたsが1つもなかった場合(ステップ1435:NO)、処理はステップ1415へ戻り、一連の処理が繰り返される。
一方、ループを検出されたsが1以上あった場合(ステップ1435:YES)、又は1415において、実行命令記録終了条件が満たされると判定された場合(ステップ1415:YES)、処理はステップ1440へ進み、トレース生成部130a/bは、ループであると判定された命令列inst[s…n]に基づいてトレースを生成する(ステップ1440)。続いて、最適化部140a/bは、生成されたトレースを最適化してコンパイルし、ネイティブ・コードを生成する(ステップ1445)。そして処理は終了する。なお、生成されたネイティブ・コードはコンパイラ装置100a/bにより実行される。
次に図15を参照して、トレース生成部130a/bにより生成されるトレースについて説明する。図15に示す例は、命令列inst[0…n]に対し、ループ始点候補の位置s=2についてループが検出された場合を示す。トレース生成部130a/bが生成するトレースは、ループ部分のないトレース1500であってもよく、又はループの手前で終了するトレース1505であってもよく、或いはループでないトレース1510とループをなすトレース1515とからなるトレース1520であってもよい。このようにトレース生成部130a/bは、ループ判定結果に基づき処理系全体の目的に応じたトレースを生成する。
図16に、図10(b)に示すコードを例として、上述した本発明に係るループ検知手法によるループ判定結果をまとめる。なお、比較のため、図16には従来手法によるループ判定結果も記載する。表中の従来技術の欄に記載されるNoFLFは、命令列の先頭の命令と末尾の命令のアドレスが同じであることを条件に、その命令列をループであると判断する従来手法を示す。また、FLFno Return Traceは、トレースの先頭の命令が属する関数からのリターン命令を含むトレースの生成を禁止する従来手法を示す。
また、表中本発明の欄に記載されるFLFCall Stackは、本発明の第1実施形態に係るループ検知部200によるループ検知方法を示す。また、FLFNo Return Loopは、本発明の第2実施形態に係るループ検知部900によるループ検知方法を示す。更に、FLFtwo iterationsは、ある命令列が2回繰り返されることを検知した場合にその命令列をループと判定するループ検知方法を示す。
なお、図16に示す表では、図10(b)に示すコードから得られる5種類の命令列について、それぞれの手法によるループ判定結果を比較している。5種類の命令列のうち、G−B−G、A−G−B−G、A−G−B−G−C−A、G−B−G−C―A−Gの4種類は、図10(a)を参照して説明した命令列と同じであり、命令列を囲む矩形はループを示している。左から4番目の命令列、Non-looptrace with return from head は、ループ先頭の属する関数からのリターンを含む、ループではない命令列のトレースを示す。該命令列はループではないので、該命令列に対する判定結果は、「許可」又は「禁止」のいずれかである。
図16の表に示すように、全ての種類の命令列に対し望ましい判定結果を出すのは、FLF callstackとFLF two iterationsの2つである。しかし、FLF two iterationsは、命令列が2回繰り返されることを条件としてループを検知するため、ループの判定に時間を要し、また、トレースの合計サイズが大きくなることから、FLF callstackのほうがより好ましいループ検知方法であるといえる。
図17は、本発明を実施するためのコンピュータ50のハードウェア構成の一例を示した図である。コンピュータ50は、バス2に接続されたメインCPU(中央処理装置)1とメインメモリ4を含んでいる。ハードディスク装置13、30、及びCD−ROM装置26、29、フレキシブル・ディスク装置20、MO装置28、DVD装置31のようなリムーバブル・ストレージ(記録メディアを交換可能な外部記憶システム)がフレキシブル・ディスクコントローラ19、IDEコントローラ25、SCSIコントローラ27などを経由してバス2へ接続されている。
フレキシブル・ディスク、MO、CD−ROM、DVD−ROMのような記憶メディアが、リムーバブル・ストレージに挿入される。これらの記憶メディアやハードディスク装置13、30、ROM14には、オペレーティング・システムと協働してCPU等に命令を与え、本発明を実施するためのコンピュータ・プログラムのコードを記録することができる。即ち、上記説明した数々の記憶装置には、コンピュータ50にインストールされ、コンピュータ50をループ検知部200/900、コンパイラ装置100a/b、またトレーシングエンジン150として機能させるプログラムを記録することができる。
コンピュータ50をループ検知部200として機能させる上記プログラムは、アドレス比較モジュール、コールスタック比較モジュール、判定結果出力モジュールを含む。これらモジュールは、CPU1等に働きかけて、コンピュータ50を、アドレス比較210、コールスタック比較部220、判定結果出力部240としてそれぞれ機能させる。また、コールスタック比較モジュールは、更に、TOPk算出モジュールと、コールスタック構築モジュールを含む。これらモジュールは、CPU1等に働きかけて、コンピュータ50を、TOPk算出部225、コールスタック構築部230としてそれぞれ機能させる。
コンピュータ50をループ検知部900として機能させる上記プログラムは、アドレス比較モジュール、リターン判定モジュール、判定結果出力モジュールを含む。これらモジュールは、CPU1等に働きかけて、コンピュータ50を、アドレス比較部905、リターン判定部910、判定結果出力部915としてそれぞれ機能させる。
コンピュータ50をコンパイラ装置100aとして機能させる上記プログラムは、記憶モジュール、実行命令記録モジュール、コールスタック記録/構築モジュール、ループ検知モジュール、トレース生成モジュール、最適化モジュールを含む。これらモジュールは、CPU1等に働きかけて、コンピュータ50を、記憶部105a、実行命令記録部110a、コールスタック記録/構築部115a、ループ検知部120a、トレース生成部130a、最適化部140aとしてそれぞれ機能させる。
コンピュータ50をコンパイラ装置100bとして機能させる上記プログラムは、トレース生成モジュール、最適化モジュールを含む。これらモジュールは、CPU1等に働きかけて、コンピュータ50を、トレース生成部130b、最適化部140bとしてそれぞれ機能させる。コンピュータ50をトレーシングエンジン150として機能させる上記プログラムは、記憶モジュール、実行命令記録モジュール、コールスタック記録/構築モジュール、ループ検知モジュールを含む。これらモジュールは、CPU1等に働きかけて、コンピュータ50を、記憶部105b、実行命令記録部110b、コールスタック記録/構築部115b、ループ検知部120bとしてそれぞれ機能させる。コンピュータ・プログラムは圧縮し、また複数に分割して複数の媒体に記録することもできる。
コンピュータ50は、キーボード/マウス・コントローラ5を経由して、キーボード6やマウス7のような入力デバイスからの入力を受ける。コンピュータ50は、オーディオコントローラ21を経由して、マイク24からの入力を受け、またスピーカー23から音声を出力する。コンピュータ50は、視覚データをユーザに提示するための表示装置11に、グラフィックスコントローラ10を経由して接続される。コンピュータ50は、ネットワーク・アダプタ18(イーサネット(登録商標)・カードやトークンリング・カード)等を介してネットワークに接続し、他のコンピュータ等と通信を行うことが可能である。
以上の説明により、本実施形態に係るコンピュータ50は、通常のパーソナルコンピュータ、ワークステーション、メインフレームなどの情報処理装置、又は、これらの組み合わせによって実現されることが容易に理解されるであろう。なお、上記説明した構成要素は例示であり、そのすべての構成要素が本発明の必須構成要素となるわけではない。
以上、実施形態を用いて本発明の説明をしたが、本発明の技術範囲は上記実施形態に記載の範囲には限定されない。上記の実施形態に、種々の変更または改良を加えることが可能であることが当業者に明らかである。従って、そのような変更または改良を加えた形態も当然に本発明の技術的範囲に含まれる。

Claims (11)

  1. コンピュータの計算処理により、プログラムにおける各単位処理のうち連続して実行された単位処理の列がループであるか否かを判定するループ検知方法であって、前記コンピュータが、
    前記コンピュータの記憶部から前記単位処理の列についてアドレス情報を読み出して、前記単位処理の列内のループ始点候補の単位処理と末尾の単位処理の各々のアドレスを比較するステップと、
    前記コンピュータの記憶部から前記単位処理の列についてコールスタック情報を読み出して、前記ループ始点候補の単位処理の実行時におけるコールスタックと、前記末尾の単位処理の実行時におけるコールスタックを比較するステップと、
    前記アドレス及び前記コールスタックの各比較結果が一致であることを条件に、前記単位処理の列がループをなすとの判定結果を出力するステップと、
    を含み、
    前記コールスタックの比較は、前記コールスタックを構成する各スタックフレーム内のリターンアドレスの比較であり、
    前記各スタックフレーム内のリターンアドレスの比較は、最後に積まれたスタックフレームからk番目(kは所定の正の整数)のスタックフレームまでの各リターンアドレスの比較であって、
    前記単位処理の列内の各単位処理実行時のコールスタック内において最も浅いコールスタックの深さをm、前記ループ始点候補の単位処理の実行時におけるコールスタックの深さをk 、及び前記末尾の単位処理の実行時におけるコールスタックの深さをk とした場合に、前記所定の正の整数kは、k からmを差し引いた値と、k からmを差し引いた値のうち小さい方の値として算出される、ループ検知方法。
  2. 前記コンピュータが、前記コンピュータの記憶部から前記単位処理の列について単位処理の種類情報及びアドレス情報を読み出して、前記ループ始点候補の単位処理の実行時におけるコールスタックと、前記末尾の単位処理の実行時におけるコールスタックとを構築し、前記コールスタック情報として前記記憶部に記憶するステップを更に含む、請求項に記載のループ検知方法。
  3. 前記単位処理の種類情報は、前記単位処理が、呼び出し側の単位処理、呼び出され側の単位処理、及びそれ以外のいずれであるかを示す情報である、請求項に記載のループ検知方法。
  4. 各コールスタックの構築は、前記単位処理の列について単位処理の種類情報及びアドレス情報を参照して、枝分かれしたリンクリストであって、該リンクリストの各ノードが、
    スタックフレームを表し、かつ、該スタックフレームのリターンアドレスと該スタックフレームの1つ前のスタックフレームを表すノードへの参照(リンク)とを記録するデータフィールドを有する、前記リンクリストを作成するステップとを含み、前記単位処理の列内の任意の単位処理の実行時のコールスタックは、該任意の単位処理に対応するスタックフレームを表すノードを出発点として前記参照に基づいて1つ前のスタックフレームのノードを順次辿っていき、辿った各ノードのリターンアドレスを繋げることにより構築される、請求項に記載のループ検知方法。
  5. 前記単位処理は、1つの命令、基本ブロック、又は分岐命令である、請求項1に記載のループ検知方法。
  6. 前記コンピュータが、前記単位処理の列内の各単位処理を前記ループ始点候補の単位処理として順次決定し、該決定ごとに各ステップを繰り返し実行するステップを更に含む、請求項1に記載のループ検知方法。
  7. 前記コンピュータが、単位処理ごとに実行回数をカウントするステップと、前記実行回数が所定の値に達することを応答して、前記コンピュータの記憶部への前記単位処理の列の記録を開始するステップと、前記単位処理の列がループをなすとの判定の出力に応答して該判定に基づいて前記単位処理の列のトレースを生成し、最適化してコンパイルするステップとを更に実行する、求項に記載のループ検知方法。
  8. コンピュータに、請求項1〜のいずれか1項に記載の方法の各ステップを実行させるループ検知プログラム。
  9. プログラムにおける各単位処理のうち連続して実行された単位処理の列がループをなすか否かを判定するループ検知装置であって、
    前記単位処理の列についてアドレス情報及びコールスタック情報を記憶する記憶部と、
    前記記憶部から前記単位処理の列についてアドレス情報を読み出して、前記単位処理の列内のループ始点候補の単位処理と末尾の単位処理の各々のアドレスを比較するアドレス比較部と、
    前記記憶部から前記単位処理の列についてコールスタック情報を読み出して、前記ループ始点候補の単位処理の実行時におけるコールスタックと、前記末尾の単位処理の実行時におけるコールスタックを比較するコールスタック比較部と、
    前記アドレス及び前記コールスタックの各比較結果が一致であることを条件に、前記単位処理の列がループをなすとの判定結果を出力する出力部と、
    を含み、
    前記コールスタック比較部は、前記コールスタックの比較は、前記コールスタックを構成する各スタックフレーム内のリターンアドレスの比較を、最後に積まれたスタックフレームからk番目(kは所定の正の整数)のスタックフレームまでの各リターンアドレスの比較により実行し、
    前記単位処理の列内の各単位処理実行時のコールスタック内において最も浅いコールスタックの深さをm、前記ループ始点候補の単位処理の実行時におけるコールスタックの深さをk 、及び前記末尾の単位処理の実行時におけるコールスタックの深さをk とした場合に、前記所定の正の整数kは、k からmを差し引いた値と、k からmを差し引いた値のうち小さい方の値として算出する、
    ループ検知装置。
  10. プログラムにおける各単位処理のうち連続して実行された単位処理の列がループをなすか否かを判定するループ検知装置であって、
    前記単位処理の列の各単位処理についてアドレス情報及び該単位処理の種類情報を記憶する記憶部と、
    前記記憶部から前記単位処理の列についてアドレス情報を読み出して、前記単位処理の列内のループ始点候補の単位処理と末尾の単位処理の各々のアドレスを比較するアドレス比較部と、
    前記記憶部から前記単位処理の種類情報及び前記アドレス情報を読み出して、前記ループ始点候補の単位処理の実行時におけるコールスタックと、前記末尾の単位処理の実行時におけるコールスタックとを構築する、コールスタック構築部と、
    前記ループ始点候補の単位処理の実行時におけるコールスタックと、前記末尾の単位処理の実行時におけるコールスタックを比較するコールスタック比較部と、
    前記アドレス及び前記コールスタックの各比較結果が一致であることを条件に、前記単位処理の列がループをなすとの判定結果を出力する出力部と、
    を含み、
    前記コールスタック比較部は、前記コールスタックの比較は、前記コールスタックを構成する各スタックフレーム内のリターンアドレスの比較を、最後に積まれたスタックフレームからk番目(kは所定の正の整数)のスタックフレームまでの各リターンアドレスの比較により実行し、
    前記単位処理の列内の各単位処理実行時のコールスタック内において最も浅いコールスタックの深さをm、前記ループ始点候補の単位処理の実行時におけるコールスタックの深さをk 、及び前記末尾の単位処理の実行時におけるコールスタックの深さをk とした場合に、前記所定の正の整数kは、k からmを差し引いた値と、k からmを差し引いた値のうち小さい方の値として算出する、
    ループ検知装置。
  11. 前記コールスタックの構築部は、前記単位処理の列について単位処理の種類情報及びアドレス情報を参照して、枝分かれしたリンクリストであって、該リンクリストの各レコードが、スタックフレームを表し、かつ、リターンアドレスと1つ前のスタックフレームを表すレコードへの参照(リンク)とを記録する、前記リンクリストを作成し、求めるべき単位処理の実行時のコールスタックを、該単位処理に対応するスタックフレームを表すレコードを出発点として前記参照に基づいて1つ前のスタックフレームのレコードを順次辿っていき、各レコードのリターンアドレスを繋げることにより構築する、請求項10に記載のループ検知装置。
JP2010266642A 2010-11-30 2010-11-30 ループ検知装置、ループ検知方法及びループ検知プログラム Expired - Fee Related JP5602599B2 (ja)

Priority Applications (2)

Application Number Priority Date Filing Date Title
JP2010266642A JP5602599B2 (ja) 2010-11-30 2010-11-30 ループ検知装置、ループ検知方法及びループ検知プログラム
US13/301,099 US8856762B2 (en) 2010-11-30 2011-11-21 Loop detection apparatus, loop detection method, and loop detection program

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP2010266642A JP5602599B2 (ja) 2010-11-30 2010-11-30 ループ検知装置、ループ検知方法及びループ検知プログラム

Publications (2)

Publication Number Publication Date
JP2012118678A JP2012118678A (ja) 2012-06-21
JP5602599B2 true JP5602599B2 (ja) 2014-10-08

Family

ID=46127430

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2010266642A Expired - Fee Related JP5602599B2 (ja) 2010-11-30 2010-11-30 ループ検知装置、ループ検知方法及びループ検知プログラム

Country Status (2)

Country Link
US (1) US8856762B2 (ja)
JP (1) JP5602599B2 (ja)

Families Citing this family (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US8522222B2 (en) * 2010-06-21 2013-08-27 Microsoft Corporation Tracing just-in-time compilation with pointers to local variables
CN105677297B (zh) * 2014-11-18 2018-05-04 龙芯中科技术有限公司 套锁实现方法及装置
US11163592B2 (en) 2020-01-10 2021-11-02 International Business Machines Corporation Generation of benchmarks of applications based on performance traces
US11138094B2 (en) * 2020-01-10 2021-10-05 International Business Machines Corporation Creation of minimal working examples and environments for troubleshooting code issues

Family Cites Families (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPH03296148A (ja) * 1990-04-13 1991-12-26 Matsushita Electric Ind Co Ltd ソフトウェアのテスト網羅性検出装置
JP3362972B2 (ja) * 1994-08-30 2003-01-07 松下電器産業株式会社 ソフトウェアシミュレータ
US6751789B1 (en) * 1997-12-12 2004-06-15 International Business Machines Corporation Method and system for periodic trace sampling for real-time generation of segments of call stack trees augmented with call stack position determination

Also Published As

Publication number Publication date
US20120137111A1 (en) 2012-05-31
JP2012118678A (ja) 2012-06-21
US8856762B2 (en) 2014-10-07

Similar Documents

Publication Publication Date Title
CN112074817B (zh) 具有跨级别跟踪映射的执行控制
JP5473768B2 (ja) マルチパス動的プロファイリングのためのコンピュータに実行させる方法、システム及びコンピュータ・プログラム
US20110106776A1 (en) Incremental implementation of undo/redo support in legacy applications
US20130111451A1 (en) Program Log Record Optimization
TWI482094B (zh) 在程式碼轉換期間異常的精確處理之方法與裝置
US20130212565A1 (en) Application analysis method, analysis system and recording medium
US20110145799A1 (en) Path-sensitive dataflow analysis including path refinement
JP5602599B2 (ja) ループ検知装置、ループ検知方法及びループ検知プログラム
US20150220315A1 (en) Method and apparatus for compiling
Sinz et al. A Precise Memory Model for {Low-Level} Bounded Model Checking
CN107678748A (zh) 一种源代码文件编译方法及装置
CN115906092B (zh) 一种跨合约检测智能合约漏洞的符号执行方法
US20100250564A1 (en) Translating a comprehension into code for execution on a single instruction, multiple data (simd) execution
US20130262842A1 (en) Code generation method and information processing apparatus
Donaldson et al. Automatic analysis of scratch-pad memory code for heterogeneous multicore processors
US8433697B2 (en) Flexible metadata composition
CN105653271B (zh) 行为树的静态解析、执行以及优化方法和装置
Fazekas et al. Certifying Incremental SAT Solving.
US20160357655A1 (en) Performance information generating method, information processing apparatus and computer-readable storage medium storing performance information generation program
CN114327497A (zh) 一种代码处理方法、装置及设备
CN114968247B (zh) 预编译方法、设备和计算机程序产品
US20120096247A1 (en) Reconfigurable processor and method for processing loop having memory dependency
US20090064092A1 (en) Visual programming language optimization
JP2018124901A (ja) プログラム分析装置、プログラム分析方法及びプログラム分析プログラム
KR101910934B1 (ko) 루프의 프롤로그 또는 에필로그의 비유효 연산을 처리하는 장치 및 방법

Legal Events

Date Code Title Description
A621 Written request for application examination

Free format text: JAPANESE INTERMEDIATE CODE: A621

Effective date: 20130903

A977 Report on retrieval

Free format text: JAPANESE INTERMEDIATE CODE: A971007

Effective date: 20140418

A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A131

Effective date: 20140513

RD12 Notification of acceptance of power of sub attorney

Free format text: JAPANESE INTERMEDIATE CODE: A7432

Effective date: 20140603

A521 Request for written amendment filed

Free format text: JAPANESE INTERMEDIATE CODE: A821

Effective date: 20140604

A521 Request for written amendment filed

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20140704

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

RD14 Notification of resignation of power of sub attorney

Free format text: JAPANESE INTERMEDIATE CODE: A7434

Effective date: 20140729

A61 First payment of annual fees (during grant procedure)

Free format text: JAPANESE INTERMEDIATE CODE: A61

Effective date: 20140820

R150 Certificate of patent or registration of utility model

Ref document number: 5602599

Country of ref document: JP

Free format text: JAPANESE INTERMEDIATE CODE: R150

LAPS Cancellation because of no payment of annual fees