図7A〜図7Dそれぞれは、従来技術に従い、図7A〜図7Dそれぞれに示す変形前の制御フロー・グラフ(701,711,721及び731)において、先行となる基本ブロック(先行基本ブロック)vと後続となる基本ブロック(後続基本ブロック)w又はw1との間のエッジにパス値1を割り当て、そしてインストラメンテーション・コードを挿入している模式図を示す。以下に、図7A〜図7Dそれぞれに示す制御フロー・グラフ(701,711,721及び731)がインストラメンテーション・コード(すなわち、パス値を加算する命令である)の挿入により、どのように変形されるのかを説明する。上記パス値とは、制御フロー・グラフの始点から終点にかけて通過した実行パスを唯一に表す整数値である。
図7A(従来技術1)において、変形前の制御フロー・グラフ(701)は、先行基本ブロックv、並びに、当該先行基本ブロックvの2つの後続基本ブロックである後続基本ブロックx(当該後続基本ブロックxはもう1つの後続基本ブロックwの先行基本ブロックでもあり、先行基本ブロックxとも示される)及び後続基本ブロックwを有し、先行基本ブロックvはエッジv→xで後続基本ブロックxと且つエッジv→wで後続基本ブロックwとそれぞれ接続されており、及び、後続基本ブロックxはエッジx→wで後続基本ブロックwと接続されている。
コンピュータは、変形前の制御フロー・グラフ(701)において、先行基本ブロックvと後続基本ブロックxとの間のエッジv→xにパス値0を割り当て、且つ、先行基本ブロックvと後続基本ブロックwとの間のエッジv→wにパス値1を割り当てる。また、コンピュータは、その他のエッジにパス値0を割り当てる。従って、制御フロー・グラフ(702)では、エッジv→xにパス値0が割り当てられており、且つ、エッジv→wにパス値1が割り当てられている。
次に、コンピュータは、制御フロー・グラフ(702)にインストラメンテーション・コードを挿入する操作を行う。
コンピュータは、エッジv→xにパス値0が割り当てられているので、インストラメンテーション・コードを挿入しない。同様に、コンピュータは、パス値0が割り当てられているその他のエッジについてもインストラメンテーション・コードを挿入しない。
また、コンピュータは、エッジv→wにパス値1が割り当てられているので、エッジv→w上に、パス値として1を加算する命令(r+=1)を含む基本ブロック(704)を挿入する。挿入された基本ブロック(挿入基本ブロック)(704)は、パス値として1を加算する命令(r+=1)とともに、後続基本ブロックwへのジャンプ命令(jmp w)を含む。
従って、図7Aに示す変形された制御フロー・グラフ(703)において、インストラメンテーション・コードを挿入することによってジャンプ命令の数が1つ増えることから(jmp w)(704)、オーバーヘッドが増加するという問題が生じる。
図7B(従来技術2)において、変形前の制御フロー・グラフ(711)は、先行基本ブロックv、当該先行基本ブロックvの2つの後続基本ブロックx(当該後続基本ブロックxはもう1つの後続基本ブロックwの先行基本ブロックでもあり、先行基本ブロックxとも示される)及び後続基本ブロックw、並びに、上記先行基本ブロックv以外の先行基本ブロックyを有し、先行基本ブロックvはエッジv→xで後続基本ブロックxと且つエッジv→wで後続基本ブロックwとそれぞれ接続されており、先行基本ブロックyはエッジy→xで後続基本ブロックxと接続されており、及び、後続基本ブロックxはエッジx→wで後続基本ブロックwと接続されている。
コンピュータは、変形前の制御フロー・グラフ(711)において、先行基本ブロックvと後続基本ブロックxとの間のエッジv→xにパス値0を割り当て、先行基本ブロックvと後続基本ブロックwとの間のエッジv→wにパス値1を割り当て、且つ、先行基本ブロックyと後続基本ブロックxとの間のエッジy→xにパス値2を割り当てる。また、コンピュータは、その他のエッジにパス値0を割り当てる。従って、制御フロー・グラフ(712)では、エッジv→xにパス値0が割り当てられており、エッジv→wにパス値1が割り当てられており、且つ、エッジy→xにパス値2が割り当てられている。
次に、コンピュータは、制御フロー・グラフ(712)にインストラメンテーション・コードを挿入する操作を行う。
コンピュータは、エッジv→xにパス値0が割り当てられているので、インストラメンテーション・コードを挿入しない。同様に、コンピュータは、パス値0が割り当てられているその他のエッジについてもインストラメンテーション・コードを挿入しない。
また、コンピュータは、エッジv→wにパス値1が割り当てられているので、エッジv→w上に、パス値として1を加算する命令(r+=1)を含む基本ブロック(714)を挿入する。挿入基本ブロック(714)は、パス値として1を加算する命令(r+=1)とともに、後続基本ブロックwへのジャンプ命令(jmp w)を含む。
同様に、コンピュータは、エッジy→xにパス値2が割り当てられているので、エッジy→x上に、パス値として2を加算する命令(r+=2)を含む基本ブロック(715)を挿入する。挿入基本ブロック(715)は、パス値として2を加算する命令(r+=2)とともに、後続基本ブロックxへのジャンプ命令(jmp x)を含む。
従って、図7Bに示す変形された制御フロー・グラフ(713)において、インストラメンテーション・コードを挿入することによってジャンプ命令の数が2つ増えることから(jmp w及びjmp x)(それぞれ、714及び715)、オーバーヘッドが増加するという問題が生じる。
図7C(従来技術3)において、変形前の制御フロー・グラフ(721)は、先行基本ブロックv、当該先行基本ブロックvの3つの後続基本ブロックである後続基本ブロックx(当該後続基本ブロックxは別の後続基本ブロックw1及びw2の先行基本ブロックでもあり、先行基本ブロックxとも示される)、後続基本ブロックw1及びw2、並びに、先行基本ブロックv以外の先行基本ブロックy(後続基本ブロックw2の先行基本ブロックである)を有し、先行基本ブロックvはエッジv→xで後続基本ブロックxと、エッジv→w1で後続基本ブロックw1と且つエッジv→w2で後続基本ブロックw2とそれぞれ接続されており、後続基本ブロックxはエッジx→w1で後続基本ブロックw1と接続されており、後続基本ブロックw1はエッジw1→yで先行基本ブロックyと接続されており、及び先行基本ブロックyはエッジy→w2で後続基本ブロックw2と接続されている。
コンピュータは、変形前の制御フロー・グラフ(721)において、先行基本ブロックvと後続基本ブロックxとの間のエッジv→xにパス値0を割り当て、先行基本ブロックvと後続基本ブロックw1との間のエッジv→w1にパス値1を割り当て、且つ、先行基本ブロックvと後続基本ブロックw2との間のエッジv→w2にパス値2を割り当てる。また、コンピュータは、その他のエッジにパス値0を割り当てる。従って、制御フロー・グラフ(722)では、エッジv→xにパス値0が割り当てられており、エッジv→w1にパス値1が割り当てられており、且つ、エッジv→w2にパス値2が割り当てられている。
次に、コンピュータは、制御フロー・グラフ(722)にインストラメンテーション・コードを挿入する操作を行う。
コンピュータは、エッジv→xにパス値0が割り当てられているので、インストラメンテーション・コードを挿入しない。同様に、コンピュータは、パス値0が割り当てられているその他のエッジについてもインストラメンテーション・コードを挿入しない。
また、コンピュータは、エッジv→w1にパス値1が割り当てられているので、エッジv→w1上に、パス値として1を加算する命令(r+=1)を含む基本ブロック(724)を挿入する。挿入基本ブロック(724)は、パス値として1を加算する命令(r+=1)とともに、後続基本ブロックw1へのジャンプ命令(jmp w1)を含む。
同様に、コンピュータは、エッジv→w2にパス値2が割り当てられているので、エッジv→w2上に、パス値として2を加算する命令(r+=2)を含む基本ブロック(725)を挿入する。挿入基本ブロック(725)は、パス値として2を加算する命令(r+=2)とともに、後続基本ブロックw2へのジャンプ命令(jmp w2)を含む。
従って、図7Cに示す変形された制御フロー・グラフ(723)において、インストラメンテーション・コードを挿入することによってジャンプ命令の数が2つ増えることから(jmp w1及びjmp w2)(それぞれ、724及び725)、オーバーヘッドが増加するという問題が生じる。
図7D(従来技術4)において、変形前の制御フロー・グラフ(731)は、先行基本ブロックv、当該先行基本ブロックvの3つの後続基本ブロックである後続基本ブロックx(当該後続基本ブロックxはもう1つの後続基本ブロックwの先行基本ブロックでもあり、先行基本ブロックxとも示される)、後続基本ブロックw1及びw2、並びに、先行基本ブロックz(後続基本ブロックw2の先行基本ブロックである)及び先行基本ブロックy(後続基本ブロックxの先行基本ブロックである)を有し、先行基本ブロックvはエッジv→xで後続基本ブロックxと、エッジv→w1で後続基本ブロックw1と且つエッジv→w2で後続基本ブロックw2とそれぞれ接続されており、先行基本ブロックyはエッジy→xで後続基本ブロックxと接続されており、後続基本ブロックxはエッジx→w1で後続基本ブロックw1と接続されており、後続基本ブロックw1はエッジw1→zで先行基本ブロックzと接続されており、及び先行基本ブロックzはエッジz→w2で後続基本ブロックw2と接続されている。
コンピュータは、変形前の制御フロー・グラフ(731)において、先行基本ブロックvと後続基本ブロックxとの間のエッジv→xにパス値0を割り当て、先行基本ブロックvと後続基本ブロックw1との間のエッジv→w1にパス値1を割り当て、且つ、先行基本ブロックvと後続基本ブロックw2との間のエッジv→w2にパス値2を割り当てる。また、コンピュータは、その他のエッジにパス値0を割り当てる。従って、制御フロー・グラフ(732)では、エッジv→xにパス値0が割り当てられており、エッジv→w1にパス値1が割り当てられており、且つ、エッジv→w2にパス値2が割り当てられている。
次に、コンピュータは、制御フロー・グラフ(732)にインストラメンテーション・コードを挿入する操作を行う。
コンピュータは、エッジv→xにパス値0が割り当てられているので、インストラメンテーション・コードを挿入しない。同様に、コンピュータは、パス値0が割り当てられているその他のエッジについてもインストラメンテーション・コードを挿入しない。
また、コンピュータは、エッジv→w1にパス値1が割り当てられているので、エッジv→w1上に、パス値として1を加算する命令(r+=1)を含む基本ブロック(734)を挿入する。挿入基本ブロック(734)は、パス値として1を加算する命令(r+=1)とともに、後続基本ブロックw1へのジャンプ命令(jmp w1)を含む。
同様に、コンピュータは、エッジv→w2にパス値2が割り当てられているので、エッジv→w2上に、パス値として2を加算する命令(r+=2)を含む基本ブロック(735)を挿入する。挿入基本ブロック(735)は、パス値として2を加算する命令(r+=2)とともに、後続基本ブロックw2へのジャンプ命令(jmp w2)を含む。
同様に、コンピュータは、エッジy→xにパス値3が割り当てられているので、エッジy→x上に、パス値として3を加算する命令(r+=3)を含む基本ブロック(736)を挿入する。挿入基本ブロック(736)は、パス値として3を加算する命令(r+=3)とともに、後続基本ブロックxへのジャンプ命令(jmp x)を含む。
従って、図7Dに示す変形された制御フロー・グラフ(733)において、インストラメンテーション・コードを挿入することによってジャンプ命令の数が3つ増えることから(それぞれ、jmp w1、jmp w2及びjmp x)、(724,725及び736)オーバーヘッドが増加するという問題が生じる。
以上に示す通り、従来技術に示す方法では、プロファイル情報を収集する為のインストラメンテーション・コードを挿入することによって、ジャンプ命令の数が増加し、オーバーヘッドが増加するという問題が生じている。
非特許文献1に記載の手法では、制御フロー・グラフの始点から終点にかけて通過した実行パスを表す整数値(パス値)を加減算のみで計算するように有向エッジ上にインストラメンテーション・コードを配置する。そして、非特許文献1に記載の手法では、当該インストラメンテーション・コードの配置を制御フロー・グラフの最大コスト・スパンニング木を求め、当該最大コスト・スパンニング木に含まれない有向エッジにインストラメンテーション・コードを挿入することにより最適化する。しかしながら、非特許文献1に記載の手法では、パス値を制御フロー・グラフの終点で毎回メモリに記録するためにオーバーヘッドが大きい。
非特許文献2に記載の手法では、非特許文献1に記載の手法を用いてインストラメンテーション・コードを配置する際に、他の手段で得られる実行頻度情報を用いて、実行頻度の高いエッジ上のインストラメンテーション・コードを削除する。しかしながら、非特許文献2に記載の手法それ自体が実行頻度を求める手法である為に、実行頻度情報が利用不可であるか、又は、実行頻度情報の精度が著しく低い可能性がある。また、非特許文献2に記載の手法では、上記パス値を、毎回メモリに記録せずに、一定時間毎にサンプリングする。従って、非特許文献2に記載の手法では、上記メモリの記録へのオーバーヘッドが大幅に削減された結果、インストラメンテーション・コードによるオーバーヘッドが支配的になり、特に、インストラメンテーション・コードの挿入にジャンプ命令の挿入が伴う場合のオーバーヘッドが顕著となる。
そこで、本発明は、プロファイル情報を収集する為の(例えば、非特許文献1及び2に記載の各手法におけるパス値を計算する為の)インストラメンテーション・コードを挿入する際に必要なジャンプ命令の数を最小化し、上記オーバーヘッドを削減することを目的とする。
非特許文献1及び2は参照によって本明細書に取り込まれる。
本発明は、制御フロー・グラフ上の実行パスの実行頻度情報を得るための技法を提供する。当該技法は、上記実行頻度情報を得るための方法、並びに、当該実行頻度情報を得るためのコンピュータ、コンピュータ・プログラム及びコンピュータ・プログラム製品を包含しうる。
本発明に従う第1の態様において、制御フロー・グラフ上の実行パスの実行頻度情報を得るための方法であって、コンピュータが、
コンパイル対象のソースコードをメモリ内に読み込むステップと、
上記メモリ内に読み込まれたソースコードから制御フロー・グラフを作成するステップであって、
先行となる基本ブロック(先行基本ブロック)vの後続となる基本ブロック(後続基本ブロック)wに上記先行基本ブロックv以外の先行基本ブロックxが存在し、且つ、上記先行基本ブロックxのフォールスルー(fallthrough)・パス上に上記後続基本ブロックwが存在している場合に、上記先行基本ブロックvと上記後続基本ブロックwとの間のエッジv→wにゼロを割り当てて、上記制御フロー・グラフを変形するステップを含む、上記作成するステップと
上記変形するステップにより変形された制御フロー・グラフを用いて、上記実行頻度情報を得るステップと
を実行する。
本発明の一つの実施態様において、上記制御フロー・グラフを変形するステップが、
上記先行基本ブロックvに対して上記後続基本ブロックw以外の後続基本ブロックw’が上記先行基本ブロックv以外の先行基本ブロックを持たない場合、上記後続基本ブロックw’にパス値を加算する命令を挿入するステップ
をさらに含みうる。
本発明の一つの実施態様において、上記制御フロー・グラフを変形するステップが、
上記先行基本ブロックvに対して上記後続基本ブロックw以外の後続基本ブロックw’が上記先行基本ブロックv以外の先行基本ブロックyを持つ場合、上記先行基本ブロックvと上記後続基本ブロックw’との間のエッジv→w’上に基本ブロックmを挿入し、当該基本ブロックmにパス値を加算する命令を挿入するステップと
をさらに含みうる。
本発明の一つの実施態様において、上記制御フロー・グラフを変形するステップが、
上記先行基本ブロックyのフォールスルー・パス上に上記後続基本ブロックw’が存在する場合、上記基本ブロックmに基本ブロックw’へのジャンプ命令を挿入するステップ
をさらに含みうる。
本発明の一つの実施態様において、上記制御フロー・グラフを変形するステップが、
上記先行基本ブロックvに対して3つ以上の後続基本ブロック{w1,・・・,wn}が存在している場合に、当該3つ以上の後続基本ブロック{w1,・・・,wn}のうち、先行基本ブロックvの後続基本ブロックに上記先行基本ブロックv以外の先行基本ブロックxが存在し、且つ、上記先行基本ブロックxのフォールスルー・パス上に後続基本ブロックが存在しているという条件を満たす一つの後続基本ブロックwiを取り出して、上記先行基本ブロックvと取り出された上記後続基本ブロックwiとの間のエッジv→wiにゼロを割り当てて、上記制御フロー・グラフを変形するステップ
を含みうる。
本発明の一つの実施態様において、上記制御フロー・グラフを変形するステップが、
上記先行基本ブロックvとゼロを割り当てられた上記後続基本ブロックwi以外の後続基本ブロックwjとの間のエッジv→wj上に基本ブロックnを挿入し、当該基本ブロックnにパス値を加算する命令を挿入するステップ
をさらに含みうる。
本発明の一つの実施態様において、上記制御フロー・グラフを変形するステップが、
上記後続基本ブロックwjが上記先行基本ブロックvのフォールスルー・パス上に存在せず、且つ、上記後続基本ブロックwjに上記先行基本ブロックv以外の先行基本ブロックが存在する場合、上記パス値を加算する命令の直後に上記後続基本ブロックwjへのジャンプ命令を挿入するステップ
をさらに含みうる。
本発明の一つの実施態様において、上記3つ以上の後続基本ブロック{w1,・・・,wn}のうちの上記条件を満たす上記一つの後続基本ブロックwiを取り出すことが、
上記3つ以上の後続基本ブロック{w1,・・・,wn}のうち実行頻度が分かっている後続基本ブロックが一部あることに応じて、実行頻度の高い後続基本ブロックwiを取り出すステップ
をさらに含みうる。
本発明に従う第2の態様において、制御フロー・グラフ上の実行パスの実行頻度情報を得るためのコンピュータであって、
コンパイル対象のソースコードを読み込むためのメモリと、
上記メモリ内に読み込まれたソースコードから制御フロー・グラフを作成する制御フロー・グラフ作成手段であって、
先行基本ブロックvの後続基本ブロックwに上記先行基本ブロックv以外の先行基本ブロックxが存在し、且つ、上記先行基本ブロックxのフォールスルー・パス上に上記後続基本ブロックwが存在している場合に、上記先行基本ブロックvと上記後続基本ブロックwとの間のエッジv→wにゼロを割り当てて、上記制御フロー・グラフを変形する制御フロー・グラフ変形手段をさらに含む、上記制御フロー・グラフ作成手段と
上記制御フロー・グラフ変形手段により変形された制御フロー・グラフを用いて、上記実行頻度情報を得る実行頻度情報取得手段と
を備えている。
本発明の一つの実施態様において、上記制御フロー・グラフ変形手段が、
上記先行基本ブロックvに対して上記後続基本ブロックw以外の後続基本ブロックw’が上記先行基本ブロックv以外の先行基本ブロックを持たない場合、上記後続基本ブロックw’にパス値を加算する命令を挿入しうる。
本発明の一つの実施態様において、上記制御フロー・グラフ変形手段が、
上記先行基本ブロックvに対して上記後続基本ブロックw以外の後続基本ブロックw’が上記先行基本ブロックv以外の先行基本ブロックyを持つ場合、上記先行基本ブロックvと上記後続基本ブロックw’との間のエッジv→w’上に基本ブロックmを挿入し、当該基本ブロックmにパス値を加算する命令を挿入しうる。
本発明の一つの実施態様において、上記制御フロー・グラフ変形手段が、
上記先行基本ブロックyのフォールスルー・パス上に上記後続基本ブロックw’が存在する場合、上記基本ブロックmに基本ブロックw’へのジャンプ命令を挿入しうる。
本発明の一つの実施態様において、上記制御フロー・グラフ変形手段が、
上記先行基本ブロックvに対して3つ以上の後続基本ブロック{w1,・・・,wn}が存在している場合に、当該3つ以上の後続基本ブロック{w1,・・・,wn}のうち、先行基本ブロックvの後続基本ブロックに上記先行基本ブロックv以外の先行基本ブロックxが存在し、且つ、上記先行基本ブロックxのフォールスルー・パス上に後続基本ブロックが存在しているという条件を満たす一つの後続基本ブロックwiを取り出して、上記先行基本ブロックvと取り出された上記後続基本ブロックwiとの間のエッジv→wiにゼロを割り当てて、上記制御フロー・グラフを変形しうる。
本発明の一つの実施態様において、上記制御フロー・グラフ変形手段が、
上記先行基本ブロックvとゼロを割り当てられた上記後続基本ブロックwi以外の後続基本ブロックwjとの間のエッジv→wjにパス値を加算する命令を挿入しうる。
本発明の一つの実施態様において、上記制御フロー・グラフ変形手段が、
上記後続基本ブロックwjが上記先行基本ブロックvのフォールスルー・パス上に存在せず、且つ、上記後続基本ブロックwjに上記先行基本ブロックv以外の先行基本ブロックが存在する場合、上記パス値を加算する命令の直後に上記後続基本ブロックwjへのジャンプ命令を挿入しうる。
本発明の一つの実施態様において、上記3つ以上の後続基本ブロック{w1,・・・,wn}のうちの上記条件を満たす上記一つの後続基本ブロックwiを取り出すことが、
上記3つ以上の後続基本ブロック{w1,・・・,wn}のうち実行頻度が分かっている後続基本ブロックが一部あることに応じて、実行頻度の高い後続基本ブロックwiを取り出しうる。
本発明に従う第3の態様において、制御フロー・グラフ上の実行パスの実行頻度情報を得るためのコンピュータ・プログラム又はコンピュータ・プログラム製品は、コンピュータに、上記第1の態様に記載の方法の各ステップを実行させる。
本発明の実施態様に従うコンピュータ・プログラムはそれぞれ、一つ又は複数のフレキシブル・ディスク、MO、CD−ROM、DVD、BD、ハードディスク装置、USBに接続可能なメモリ媒体、ROM、MRAM、RAM等の任意のコンピュータ読み取り可能な記録媒体に格納することができる。当該コンピュータ・プログラムは、上記記録媒体への格納のために、通信回線で接続する他のコンピュータ、例えばサーバ・コンピュータからダウンロードしたり、又は他の記録媒体から複製したりすることができる。また、本発明の実施態様に従うコンピュータ・プログラムは、圧縮し、又は複数に分割して、単一又は複数の記録媒体に格納することもできる。また、様々な形態で、本発明の実施態様に従うコンピュータ・プログラム製品を提供することも勿論可能であることにも留意されたい。本発明の実施態様に従うコンピュータ・プログラム製品は、例えば、上記コンピュータ・プログラムを記録した記憶媒体、又は、上記コンピュータ・プログラムを伝送する伝送媒体を包含しうる。
本発明の上記概要は、本発明の必要な特徴の全てを列挙したものではなく、これらの構成要素のコンビネーション又はサブコンビネーションもまた、本発明となりうることに留意すべきである。
本発明の実施態様において使用されるコンピュータの各ハードウェア構成要素を、複数のマシンと組み合わせ、それらに機能を配分し実施する等の種々の変更は当業者によって容易に想定され得ることは勿論である。それらの変更は、当然に本発明の思想に包含される概念である。ただし、これらの構成要素は例示であり、そのすべての構成要素が本発明の必須構成要素となるわけではない。
また、本発明は、ハードウェア、ソフトウェア、又は、ハードウェア及びソフトウェアの組み合わせとして実現可能である。ハードウェアとソフトウェアとの組み合わせによる実行において、上記コンピュータ・プログラムのインストールされたコンピュータにおける実行が典型的な例として挙げられる。かかる場合、当該コンピュータ・プログラムが当該コンピュータのメモリにロードされて実行されることにより、当該コンピュータ・プログラムは、当該コンピュータを制御し、本発明にかかる処理を実行させる。当該コンピュータ・プログラムは、任意の言語、コード、又は、表記によって表現可能な命令群から構成されうる。そのような命令群は、当該コンピュータが特定の機能を直接的に、又は、1.他の言語、コード若しくは表記への変換及び、2.他の媒体への複製、のいずれか一方若しくは双方が行われた後に、本発明の実施態様に従う処理を実行することを可能にするものである。
本発明の実施態様に従うと、上記インストラメンテーション・コードを挿入する際に必要なジャンプ命令の数を削減することが可能となり、従ってオーバーヘッドが削減される。
本発明の実施形態を、以下に図面に従って説明する。以下の図を通して、特に断らない限り、同一の符号は同一の対象を指す。本発明の実施形態は、本発明の好適な態様を説明するためのものであり、本発明の範囲をここで示すものに限定する意図はないことを理解されたい。
本発明の実施態様において使用されうるコンピュータは、制御フロー・グラフ上の実行パスの実行頻度情報を得ることができるコンピュータであれば特に限定されない。当該コンピュータは例えば、例えば、デスクトップ・コンピュータ、ノート・コンピュータ若しくは一体型パソコン、又は、タブレット端末若しくはスマートフォン(例えば、Windows(登録商標)、アンドロイド(登録商標)又はiOSを搭載したタブレット端末若しくスマートフォン)でありうる。
図1は、本発明の実施態様において使用されうるコンピュータの一例を示した図である。
コンピュータ(101)は、CPU(102)とメイン・メモリ(103)とを備えており、これらはバス(104)に接続されている。CPU(102)は好ましくは、32ビット又は64ビットのアーキテクチャに基づくものである。当該CPU(102)は例えば、インテル社のCore(商標) iシリーズ、Core(商標) 2シリーズ、Atom(商標)シリーズ、Xeon(登録商標)シリーズ、Pentium(登録商標)シリーズ若しくはCeleron(登録商標)シリーズ、AMD(Advanced Micro Devices)社のAシリーズ、Phenom(商標)シリーズ、Athlon(商標)シリーズ、Turion(登録商標)シリーズ若しくはSempron(商標)、又は、インターナショナル・ビジネス・マシーンズ・コーポレーションのPower(商標)シリーズでありうる。
バス(104)には、ディスプレイ・コントローラ(105)を介して、ディスプレイ(106)、例えば液晶ディスプレイ(LCD)が接続されうる。また、液晶ディスプレイ(LCD)は例えば、タッチパネル・ディスプレイ又はフローティング・タッチ・ディスプレイであてもよい。ディスプレイ(106)は、コンピュータ(101)上で動作中のソフトウェア(例えば、本発明の実施態様に従うコンピュータ・プログラム又は当該コンピュータ(101)上で動作中の各種コンピュータ・プログラム)が稼働することによって表示されるオブジェクトを、適当なグラフィック・インタフェースで表示するために使用されうる。また、ディスプレイ(106)は、本発明の実施態様により変形された制御フロー・グラフ上の実行パスの実行頻度情報を出力しうる。実行頻度情報は例えば、例えばマシンコードでいうブランチ命令において当該ブランチがテイクン(taken)したのが何回か、テイクンされなかったのが何回かという情報である。
バス(104)には任意的に、例えばSATA又はIDEコントローラ(107)を介して、ディスク(108)、例えばハードディスク又はソリッド・ステート・ドライブ(SSD)が接続されうる。
バス(104)には任意的に、例えばSATA又はIDEコントローラ(107)を介して、ドライブ(109)、例えばCD、DVD又はBDドライブが接続されうる。
バス(104)には、周辺装置コントローラ(110)を介して、例えばキーボード・マウス・コントローラ又はUSBバスを介して、任意的に、キーボード(111)及びマウス(112)が接続されうる。
ディスク(108)には、オペレーティング・システム、例えばWindows(登録商標)、UNIX(登録商標)、MacOS(登録商標)、及びJ2EEなどのJava(登録商標)処理環境、Java(登録商標)アプリケーション、Java(登録商標)仮想マシン(VM)、Java(登録商標)実行時(JIT)コンパイラを提供するプログラム、本発明の実施態様に従うコンピュータ・プログラム、及びその他のプログラム、並びにデータが、メイン・メモリ(103)にロード可能なように記憶されうる。
ディスク(108)は、コンピュータ(101)内に内蔵されていてもよく、当該コンピュータ(101)がアクセス可能なようにケーブルを介して接続されていてもよく、又は、当該コンピュータ(101)がアクセス可能なように有線又は無線ネットワークを介して接続されていてもよい。
ドライブ(109)は、必要に応じて、CD−ROM、DVD−ROM又はBDからプログラム、例えばオペレーティング・システム、アプリケーション又は本発明の実施態様に従うコンピュータ・プログラムをディスク(108)にインストールするために使用されうる。
通信インタフェース(114)は、例えばイーサネット(登録商標)・プロトコルに従う。通信インタフェース(114)は、通信コントローラ(113)を介してバス(104)に接続され、コンピュータ(101)を通信回線(115)に有線又は無線接続する役割を担い、コンピュータ(101)のオペレーティング・システムの通信機能のTCP/IP通信プロトコルに対して、ネットワーク・インタフェース層を提供する。なお、通信回線は例えば、無線LAN接続規格に基づく無線LAN環境、IEEE802.11a/b/g/nなどのWi−Fi無線LAN環境、又は携帯電話網環境(例えば、3G又は4G環境)でありうる。
下記図2A(実施例1)、下記図2B(実施例2)、下記図2C(実施例3)及び下記図2D(実施例4)は、先行基本ブロックvの後続基本ブロックwに先行基本ブロックv以外の先行基本ブロックxが存在し、且つ、先行基本ブロックxのフォールスルー・パス上に後続基本ブロックwが存在している場合に、先行基本ブロックvと後続基本ブロックwとの間のエッジv→wにゼロを割り当てて、制御フロー・グラフを変形する種々の態様を示す。上記エッジv→wにゼロが割り当てられている場合には、当該エッジv→wにパス値を加算する命令が付加されない。
制御フロー・グラフを変形する上記種々の態様は例えば、下記に示す3つの態様に大きく分けられうる:
(1)先行基本ブロックvに対して後続基本ブロックw以外の後続基本ブロックw’が先行基本ブロックv以外の先行基本ブロックを持たない場合、後続基本ブロックw’にパス値を加算する命令を挿入する;
(2)先行基本ブロックvに対して後続基本ブロックw以外の後続基本ブロックw’が先行基本ブロックv以外の先行基本ブロックyを持つ場合、先行基本ブロックvと後続基本ブロックw’との間のエッジv→w’上に基本ブロックmを挿入し、当該基本ブロックmにパス値を加算する命令を挿入する;及び、
(3)先行基本ブロックvに対して3つ以上の後続基本ブロック{w1,・・・,wn}が存在している場合に、当該3つ以上の後続基本ブロック{w1,・・・,wn}のうち、上記先行基本ブロックvの後続基本ブロックに先行基本ブロックv以外の先行基本ブロックxが存在し、且つ、先行基本ブロックxのフォールスルー・パス上に後続基本ブロックが存在しているという条件を満たす一つの後続基本ブロックwiを取り出して、先行基本ブロックvと取り出された上記後続基本ブロックwiとの間のエッジv→wiにゼロを割り当てる。
上記(1)の態様は、先行基本ブロックvに対して後続基本ブロックw以外の後続基本ブロックw’が先行基本ブロックv以外の先行基本ブロックを持たない場合、後続基本ブロックw’にパス値を加算する命令を挿入する態様である。当該(1)の態様は、下記実施例1において、先行基本ブロックvに対して後続基本ブロックx(当該後続基本ブロックxはもう1つの後続基本ブロックwの先行基本ブロックでもあり、当該後続基本ブロックxは上記後続基本ブロックw’に対応する)が先行基本ブロックv以外の先行基本ブロックを持たないので、後続基本ブロックx(上記後続基本ブロックw’に対応する)にパス値を加算する命令を挿入する態様に対応する。同様に、当該(1)の態様は、下記実施例3において、先行基本ブロックvに対して後続基本ブロックx(当該後続基本ブロックxはもう1つの後続基本ブロックw1の先行基本ブロックでもあり、当該後続基本ブロックxは上記後続基本ブロックw’に対応する)が先行基本ブロックv以外の先行基本ブロックを持たないので、後続基本ブロックx(上記後続基本ブロックw’に対応する)にパス値を加算する命令を挿入する態様に対応する。
上記(2)の態様は、先行基本ブロックvに対して後続基本ブロックw以外の後続基本ブロックw’が先行基本ブロックv以外の先行基本ブロックyを持つ場合、先行基本ブロックvと後続基本ブロックw’との間のエッジv→w’上に基本ブロックmを挿入し、当該基本ブロックmにパス値を加算する命令を挿入する態様である。当該(2)の態様は、下記実施例2において、先行基本ブロックvに対して後続基本ブロックx(当該後続基本ブロックxはもう1つの後続基本ブロックwの先行基本ブロックでもあり、当該後続基本ブロックxは上記後続基本ブロックw’に対応する)が先行基本ブロックv以外の先行基本ブロックyを持つので、上記先行基本ブロックvと上記後続基本ブロックx(上記後続基本ブロックw’に対応する)との間のエッジv→x(上記エッジv→w’に対応する)上に基本ブロックf(上記基本ブロックmに対応する)を挿入し、当該基本ブロックfにパス値を加算する命令を挿入する態様に対応する。同様に、当該(2)の態様は、下記実施例3において、先行基本ブロックvに対して後続基本ブロックw2が先行基本ブロックv以外の先行基本ブロックyを持つので、上記先行基本ブロックvと上記先行基本ブロックw2との間のエッジv→w2上に基本ブロックp(上記基本ブロックmに対応する)を挿入し、当該基本ブロックpにパス値を加算する命令を挿入する態様に対応する。同様に、当該(2)の態様は、下記実施例4において、先行基本ブロックvに対して後続基本ブロックx(当該後続基本ブロックxはもう1つの後続基本ブロックw1の先行基本ブロックでもあり、当該後続基本ブロックxは上記後続基本ブロックw’に対応する)が先行基本ブロックv以外の先行基本ブロックyを持つので、上記先行基本ブロックvと上記後続基本ブロックx(上記後続基本ブロックw’に対応する)との間のエッジv→x(上記エッジv→w’に対応する)上に基本ブロックq(上記基本ブロックmに対応する)を挿入し、当該基本ブロックqにパス値を加算する命令を挿入する態様、並びに、先行基本ブロックvに対して後続基本ブロックw2が先行基本ブロックv以外の先行基本ブロックyを持つので、上記先行基本ブロックvと上記後続基本ブロックw2との間のエッジv→w2上に基本ブロックr(上記基本ブロックmに対応する)を挿入し、当該基本ブロックrにパス値を加算する命令を挿入する態様に対応する。
上記(3)の態様は、先行基本ブロックvに対して3つ以上の後続基本ブロック{w1,・・・,wn}が存在している場合に、当該3つ以上の後続基本ブロック{w1,・・・,wn}のうち、上記先行基本ブロックvの後続基本ブロックに先行基本ブロックv以外の先行基本ブロックxが存在し、且つ、先行基本ブロックxのフォールスルー・パス上に後続基本ブロックが存在しているという条件を満たす一つの後続基本ブロックwiを取り出して、先行基本ブロックvと取り出された上記後続基本ブロックwiとの間のエッジv→wiにゼロを割り当てる態様である。当該(3)の態様は、下記実施例3において、先行基本ブロックvに対して3つの後続基本ブロック{x,w1,w2}が存在しているので、当該3つの基本ブロック{x,w1,w2}のうち、上記先行基本ブロックvの後続に先行基本ブロックv以外の先行基本ブロックx(当該先行基本ブロックxは先行基本ブロックvの後続基本ブロックでもあるので、当該先行基本ブロックxは上記後続基本ブロックxでもある)が存在し、且つ、当該先行基本ブロックxのフォールスルー・パス上に後続基本ブロックが存在しているという条件を満たす一つの後続基本ブロックw1を取り出して、先行基本ブロックvと上記取り出された後続基本ブロックw1との間のエッジv→w1にゼロを割り当てる態様である。同様に、当該(3)の態様は、下記実施例4において、先行基本ブロックvに対して3つの後続基本ブロック{x,w1,w2}が存在しているので、当該3つの基本ブロック{x,w1,w2}のうち、上記先行基本ブロックvの後続に先行基本ブロックv以外の先行基本ブロックx(当該先行基本ブロックxは先行基本ブロックvの後続基本ブロックでもあるので、当該先行基本ブロックxは上記後続基本ブロックxでもある)が存在し、且つ、当該先行基本ブロックxのフォールスルー・パス上に後続基本ブロックが存在しているという条件を満たす一つの後続基本ブロックw1を取り出して、先行基本ブロックvと上記取り出された後続基本ブロックw1との間のエッジv→w1にゼロを割り当てる態様である。
図2A〜図2Dそれぞれは、本発明の実施態様に従い、図2A〜図2Dそれぞれに示す変形前の制御フロー・グラフ(201,211,221及び231)において、先行基本ブロックvと後続基本ブロックw又はw1との間のエッジに0を割り当て、そしてインストラメンテーション・コードを挿入している模式図を示す。以下に、本発明の実施態様に従い、図2A〜図2Dそれぞれに示す制御フロー・グラフ(201,211,221及び231)がインストラメンテーション・コードの挿入により、どのように変形されるのかを説明する。
図2A(実施例1)において、変形前の制御フロー・グラフ(201)は、図7Aに示す制御フロー・グラフ(701)と同じである。従って、変形前の制御フロー・グラフ(201)についての説明は、図7Aに示す制御フロー・グラフ(701)についての説明を参照されたい。
コンピュータ(101)は、変形前の制御フロー・グラフ(201)について、先行基本ブロックvの後続基本ブロックwに先行基本ブロックv以外の先行基本ブロックxが存在し、且つ、当該先行基本ブロックxのフォールスルー・パス上に上記後続基本ブロックwが存在していると判断する。フォールスルー・パスとは、ブランチで飛んで行く先でなく、ブランチ不成立又はブランチ無しで遷移するパスをいう。従って、コンピュータ(101)は、変形前の制御フロー・グラフ(201)において、先行基本ブロックvと後続基本ブロックwとの間のエッジv→wにパス値0を割り当てる。また、コンピュータ(101)は、先行基本ブロックvと後続基本ブロックx(当該後続基本ブロックxはもう1つの後続基本ブロックwの先行基本ブロックでもあり、上記先行基本ブロックxとも示される)との間のエッジv→xにパス値1を割り当てる。また、コンピュータは、その他のエッジにパス値0を割り当てる。従って、制御フロー・グラフ(202)では、エッジv→wにパス値0が割り当てられており、且つ、エッジv→xにパス値1が割り当てられている。
次に、コンピュータ(101)は、制御フロー・グラフ(202)にインストラメンテーション・コードを挿入する操作を行う。
コンピュータ(101)は、先行基本ブロックvと後続基本ブロックwとの間のエッジv→wにパス値0が割り当てられている(すなわち、エッジv→wの加減算する値が0である)ことから、当該エッジv→w上にインストラメンテーション・コードを挿入することが不要であると判断する。また、コンピュータ(101)は、エッジv→w上に基本ブロックを挿入することも不要であると判断する。同様に、コンピュータ(101)は、パス値0が割り当てられているその他のエッジについてもインストラメンテーション・コードを挿入することが不要であると判断する。
また、コンピュータ(101)は、エッジv→xにパス値1が割り当てられていることから、後続基本ブロックxの例えば先頭に、パス値を加算する命令(r+=1)を挿入する。なお、コンピュータ(101)は、当該後続基本ブロックxにジャンプ命令は不要であるために挿入しない。
以上に示す通り、当該実施例1では、コンピュータ(101)は、先行基本ブロックvに対して後続基本ブロックx(当該後続基本ブロックxはもう1つの後続基本ブロックwの先行基本ブロックでもあり、当該後続基本ブロックxは上記後続基本ブロックw’に対応する)が先行基本ブロックv以外の先行基本ブロックを持たないので、当該後続基本ブロックx(上記後続基本ブロックw’に対応する)にパス値を加算する命令を挿入する。
従って、図2Aに示す変形された制御フロー・グラフ(203)において、インストラメンテーション・コードを挿入することによってジャンプ命令の数が増えていない。一方、図7Aに示す変形された制御フロー・グラフ(703)において、インストラメンテーション・コードを挿入することによってジャンプ命令の数が1つ増える(jmp w)(704)。従って、制御フロー・グラフ(201)を本願発明の実施態様に従う制御フロー・グラフ(203)に変形することによって、図7Aに示す従来技術1による手法と比べてジャンプ命令の数を減らす(1から0)ことが可能となり、従ってオーバーヘッドが削減される。
図2B(実施例2)において、変形前の制御フロー・グラフ(211)は、図7Bに示す制御フロー・グラフ(711)と同じである。従って、変形前の制御フロー・グラフ(211)についての説明は、図7Bに示す制御フロー・グラフ(711)についての説明を参照されたい。
コンピュータ(101)は、変形前の制御フロー・グラフ(211)について、先行基本ブロックvの後続基本ブロックwに先行基本ブロックv以外の先行基本ブロックxが存在し、且つ、当該先行基本ブロックxのフォールスルー・パス上に上記後続基本ブロックwが存在していると判断する。従って、コンピュータ(101)は、変形前の制御フロー・グラフ(211)において、先行基本ブロックvと後続基本ブロックwとの間のエッジv→wにパス値0を割り当てる。また、コンピュータ(101)は、先行基本ブロックyが後続基本ブロックx(当該後続基本ブロックxはもう1つの後続基本ブロックwの先行基本ブロックでもあり、上記先行基本ブロックxとも示される)に先行して存在することから、先行基本ブロックvと後続基本ブロックxとの間のエッジv→xにパス値1を割り当て、且つ、先行基本ブロックyと後続基本ブロックxとの間のエッジy→xにパス値2を割り当てる。また、コンピュータは、その他のエッジにパス値0を割り当てる。従って、制御フロー・グラフ(212)では、エッジv→wにパス値0が割り当てられており、エッジv→xにパス値1が割り当てられており、且つ、エッジy→xにパス値2が割り当てられている。
次に、コンピュータ(101)は、制御フロー・グラフ(212)にインストラメンテーション・コードを挿入する操作を行う。
コンピュータ(101)は、先行基本ブロックvと後続基本ブロックwとの間のエッジv→wにパス値0が割り当てられている(すなわち、エッジv→wの加減算する値が0である)ことから、当該エッジv→w上にインストラメンテーション・コードを挿入することが不要であると判断する。また、コンピュータ(101)は、当該エッジv→w上に基本ブロックを挿入することも不要であると判断する。同様に、コンピュータ(101)は、パス値0が割り当てられているその他のエッジについてもインストラメンテーション・コードを挿入することが不要であると判断する。
また、コンピュータ(101)は、先行基本ブロックvと後続基本ブロックxとの間のエッジv→xにパス値1が割り当てられており且つ先行基本ブロックyが後続基本ブロックxに先行して存在することから、当該エッジv→x上に、パス値を加算する命令(r+=1)を含む基本ブロックf(214)を挿入する。なお、コンピュータ(101)は、挿入基本ブロックf(214)にジャンプ命令は不要であるために挿入しない。すなわち、挿入基本ブロックf(214)は、ジャンプ命令を含まない。
同様に、コンピュータ(101)は、先行基本ブロックyと後続基本ブロックxとの間のエッジy→xにパス値2が割り当てられていることから、当該エッジy→x上に、パス値を加算する命令(r+=2)を含む基本ブロックg(215)を挿入する。挿入基本ブロックg(215)は、パス値を加算する命令(r+=2)とともに、後続基本ブロックxへのジャンプ命令(jmp x)を含む。
以上に示す通り、当該実施例2では、コンピュータ(101)は、先行基本ブロックvに対して後続基本ブロックx(当該後続基本ブロックxはもう1つの後続基本ブロックwの先行基本ブロックでもあり、当該後続基本ブロックxは上記後続基本ブロックw’に対応する)が先行基本ブロックv以外の先行基本ブロックyを持つので、上記先行基本ブロックvと上記後続基本ブロックx(上記後続基本ブロックw’に対応する)との間のエッジv→x(上記エッジv→w’に対応する)上に基本ブロックf(上記基本ブロックmに対応する)を挿入し、当該基本ブロックfにパス値を加算する命令を挿入する。
従って、図2Bに示す変形された制御フロー・グラフ(213)において、インストラメンテーション・コードを挿入することによってジャンプ命令の数が1つ増える(jmp x)(215)。一方、図7Bに示す変形された制御フロー・グラフ(713)において、インストラメンテーション・コードを挿入することによってジャンプ命令の数が2つ増える(jmp w及びjmp x)(それぞれ、714及び715)。従って、制御フロー・グラフ(211)を本願発明の実施態様に従う制御フロー・グラフ(213)に変形することによって、図7Bに示す従来技術2による手法と比べてジャンプ命令の数を1つ減らす(2から1)ことが可能となり、従ってオーバーヘッドが削減される。
図2C(実施例3)において、変形前の制御フロー・グラフ(221)は、図7Cに示す制御フロー・グラフ(721)と同じである。従って、変形前の制御フロー・グラフ(221)についての説明は、図7Cに示す制御フロー・グラフ(721)についての説明を参照されたい。
コンピュータ(101)は、変形前の制御フロー・グラフ(221)について、先行基本ブロックvの後続基本ブロックw1に先行基本ブロックv以外の先行基本ブロックxが存在し、且つ、当該先行基本ブロックxのフォールスルー・パス上に上記後続基本ブロックw1が存在していると判断する。従って、コンピュータ(101)は、変形前の制御フロー・グラフ(221)において、先行基本ブロックvと後続基本ブロックw1との間のエッジv→w1にパス値0を割り当てる。また、コンピュータ(101)は、先行基本ブロックvと後続基本ブロックx(当該後続基本ブロックxはもう1つの後続基本ブロックwの先行基本ブロックでもあり、上記先行基本ブロックxとも示される)との間のエッジv→xにパス値1を割り当て、且つ、先行基本ブロックvと後続基本ブロックw2との間のエッジv→w2にパス値2を割り当てる。また、コンピュータは、その他のエッジにパス値0を割り当てる。従って、制御フロー・グラフ(222)では、エッジv→w1にパス値0が割り当てられており、エッジv→xにパス値1が割り当てられており、且つ、エッジv→w2にパス値2が割り当てられている。
次に、コンピュータ(101)は、制御フロー・グラフ(222)にインストラメンテーション・コードを挿入する操作を行う。
コンピュータ(101)は、先行基本ブロックvと後続基本ブロックw1との間のエッジv→w1にパス値0が割り当てられている(すなわち、エッジv→w1の加減算する値が0である)ことから、当該エッジv→w1上にインストラメンテーション・コードを挿入することが不要であると判断する。また、コンピュータ(101)は、上記エッジv→w1上に基本ブロックを挿入することも不要であると判断する。同様に、コンピュータ(101)は、パス値0が割り当てられているその他のエッジについてもインストラメンテーション・コードを挿入することが不要であると判断する。
また、コンピュータ(101)は、先行基本ブロックvと後続基本ブロックxとの間のエッジv→xにパス値1が割り当てられていることから、後続基本ブロックxの例えば先頭に、パス値を加算する命令(r+=1)を挿入する。
同様に、コンピュータ(101)は、先行基本ブロックvと後続基本ブロックw2との間のエッジv→w2にパス値2が割り当てられていることから、当該エッジv→w2上に、パス値を加算する命令(r+=2)を含む基本ブロックp(225)を挿入する。挿入基本ブロックp(225)は、パス値を加算する命令(r+=2)とともに、後続基本ブロックw2へのジャンプ命令(jmp w2)を含む。
以上に示す通り、当該実施例3では、コンピュータ(101)は、先行基本ブロックvに対して後続基本ブロックx(当該後続基本ブロックxはもう1つの後続基本ブロックw1の先行基本ブロックでもあり、当該後続基本ブロックxは上記後続基本ブロックw’に対応する)が先行基本ブロックv以外の先行基本ブロックを持たないので、後続基本ブロックx(上記後続基本ブロックw’に対応する)にパス値を加算する命令を挿入する。
また、当該実施例3では、コンピュータ(101)は、先行基本ブロックvに対して後続基本ブロックw2が先行基本ブロックv以外の先行基本ブロックyを持つので、上記先行基本ブロックvと上記先行基本ブロックw2との間のエッジv→w2上に基本ブロックp(上記基本ブロックmに対応する)を挿入し、当該基本ブロックpにパス値を加算する命令を挿入する。
また、当該実施例3では、コンピュータ(101)は、先行基本ブロックyのフォールスルー・パス上に先行基本ブロックw2(上記後続基本ブロックw’に対応する)が存在するので、上記基本ブロックp(上記基本ブロックmに対応する)に基本ブロックw2へのジャンプ命令を挿入する。
また、当該実施例3では、コンピュータ(101)は、先行基本ブロックvに対して3つの後続基本ブロック{x,w1,w2}が存在しているので、当該3つの基本ブロック{x,w1,w2}のうち、上記先行基本ブロックvの後続に先行基本ブロックv以外の先行基本ブロックx(当該先行基本ブロックxは先行基本ブロックvの後続基本ブロックでもあるので、当該先行基本ブロックxは上記後続基本ブロックxでもある)が存在し、且つ、当該先行基本ブロックxのフォールスルー・パス上に後続基本ブロックが存在しているという条件を満たす一つの後続基本ブロックw1を取り出して、先行基本ブロックvと上記取り出された後続基本ブロックw1との間のエッジv→w1にゼロを割り当てる。
また、当該実施例3では、コンピュータ(101)は、先行基本ブロックvと、上記ゼロを割り当てられた後続基本ブロックw1以外の後続基本ブロックw2との間のエッジv→w2上に基本ブロックp(上記基本ブロックnに対応する)を挿入し、当該基本ブロックpにパス値を加算する命令を挿入する。
また、当該実施例3では、コンピュータ(101)は、後続基本ブロックw2が先行基本ブロックvのフォールスルー・パス上に存在せず、且つ、当該後続基本ブロックw2に先行基本ブロックv以外の先行基本ブロックyが存在するので、上記基本ブロックp(上記基本ブロックnに対応する)のパス値を加算する命令の直後に後続基本ブロックw2へのジャンプ命令を挿入する。
従って、図2Cに示す変形された制御フロー・グラフ(223)において、インストラメンテーション・コードを挿入することによってジャンプ命令の数が1つ増える(jmp w2)(225)。一方、図7Cに示す変形された制御フロー・グラフ(723)において、インストラメンテーション・コードを挿入することによってジャンプ命令の数が2つ増える(jmp w1及びjmp w2)(それぞれ、724及び725)。従って、制御フロー・グラフ(221)を本願発明の実施態様に従う制御フロー・グラフ(223)に変形することによって、図7Cに示す従来技術3による手法と比べてジャンプ命令の数を1つ減らす(2から1)ことが可能となり、従ってオーバーヘッドが削減される。
上記図2Cに示す例において、先行基本ブロックvと後続基本ブロックw1との間のエッジv→w1にパス値0を割り当てる例を示した。すなわち、先行基本ブロックvに対して3つの後続基本ブロック{x,w1,w2}が存在しているので、当該3つの基本ブロック{x,w1,w2}のうち、上記先行基本ブロックvの後続に先行基本ブロックv以外の先行基本ブロックx(当該先行基本ブロックxは先行基本ブロックvの後続基本ブロックでもあるので、当該先行基本ブロックxは上記後続基本ブロックxでもある)が存在し、且つ、当該先行基本ブロックxのフォールスルー・パス上に後続基本ブロックが存在しているという条件を満たす一つの後続基本ブロックw1を取り出して、先行基本ブロックvと上記取り出された後続基本ブロックw1との間のエッジv→w1にゼロを割り当てる例を示した。
代替的には、コンピュータは、先行基本ブロックvに対して複数の後続基本ブロック{w1,・・・,wn}が存在している場合に、当該複数の後続基本ブロック{w1,・・・,wn}のうち、上記先行基本ブロックvの後続に先行基本ブロックv以外の先行基本ブロックx(当該先行基本ブロックxは先行基本ブロックvの後続基本ブロックでもあるので、先行基本ブロックxは上記後続基本ブロックxでもある)が存在し、且つ、当該先行基本ブロックxのフォールスルー・パス上に後続基本ブロックが存在しているという条件を満たす条件を満たす一つの後続基本ブロックwiを取り出して、上記先行基本ブロックvと上記取り出された後続基本ブロックwiとの間のエッジv→wiにゼロを割り当てることが可能である。当該複数の後続基本ブロック{w1,・・・,wn}のうちの上記条件を満たす上記後続基本ブロックwiを取り出すことは例えば、複数の後続基本ブロック{w1,・・・,wn}のうち実行頻度が分かっている後続基本ブロックが一部あること(例えば、他の手法により、複数の後続基本ブロック{w1,・・・,wn}のうちの一部の基本ブロックについての実行頻度の一部が分かっている場合)に応じて、実行頻度の高い後続基本ブロックwiを取り出すことによって行われうる。
図2D(実施例4)において、変形前の制御フロー・グラフ(231)は、図7Dに示す制御フロー・グラフ(731)と同じである。従って、変形前の制御フロー・グラフ(231)についての説明は、図7Dに示す制御フロー・グラフ(731)についての説明を参照されたい。
コンピュータ(101)は、変形前の制御フロー・グラフ(231)について、先行基本ブロックvの後続基本ブロックw1に先行基本ブロックv以外の先行基本ブロックxが存在し、且つ、当該先行基本ブロックxのフォールスルー・パス上に上記後続基本ブロックw1が存在していると判断する。従って、コンピュータ(101)は、変形前の制御フロー・グラフ(231)において、先行基本ブロックvと後続基本ブロックw1との間のエッジv→w1にパス値0を割り当てる。また、コンピュータ(101)は、先行基本ブロックvと後続先行基本ブロックx(当該後続基本ブロックxはもう1つの後続基本ブロックwの先行基本ブロックでもあり、上記先行基本ブロックxとも示される)との間のエッジv→xにパス値1を割り当て、先行基本ブロックvと後続基本ブロックw2との間のエッジv→w2にパス値2を割り当て、且つ、先行基本ブロックyと後続基本ブロックxとの間のエッジy→xにパス値3を割り当てる。また、コンピュータは、その他のエッジにパス値0を割り当てる。従って、制御フロー・グラフ(232)では、エッジv→w1にパス値0が割り当てられており、エッジv→xにパス値1が割り当てられており、エッジv→w2にパス値2が割り当てられ、且つ、エッジy→xにパス値3が割り当てられている。
次に、コンピュータ(101)は、制御フロー・グラフ(232)にインストラメンテーション・コードを挿入する操作を行う。
コンピュータ(101)は、先行基本ブロックvと後続基本ブロックw1との間のエッジv→w1にパス値0が割り当てられている(すなわち、エッジv→w1の加減算する値が0である)ことから、当該エッジv→w1上にインストラメンテーション・コードを挿入することが不要であると判断する。また、コンピュータ(101)は、上記エッジv→w1上に基本ブロックを挿入することも不要であると判断する。同様に、コンピュータ(101)は、パス値0が割り当てられているその他のエッジについてもインストラメンテーション・コードを挿入することが不要であると判断する。
また、コンピュータ(101)は、先行基本ブロックvと後続基本ブロックxとの間のエッジv→xにパス値1が割り当てられており且つ先行基本ブロックyが後続基本ブロックxに先行して存在することから、当該エッジv→x上に、パス値を加算する命令(r+=1)を含む基本ブロックq(234)を挿入する。なお、コンピュータ(101)は、挿入基本ブロックq(234)にジャンプ命令は不要であるために挿入しない。
同様に、コンピュータ(101)は、先行基本ブロックvと後続基本ブロックw2との間のエッジv→w2にパス値2が割り当てられていることから、当該エッジv→w2上に、パス値を加算する命令(r+=2)を含む基本ブロックr(235)を挿入する。挿入基本ブロックr(235)は、パス値を加算する命令(r+=2)とともに、先行基本ブロックw2へのジャンプ命令(jmp w2)を含む。
同様に、コンピュータ(101)は、先行基本ブロックyと後続基本ブロックxとの間のエッジy→xにパス値3が割り当てられていることから、当該エッジy→x上に、パス値を加算する命令(r+=3)を含む基本ブロックs(236)を挿入する。挿入基本ブロックs(236)は、パス値を加算する命令(r+=3)とともに、後続基本ブロックxへのジャンプ命令(jmp x)を含む。
以上に示す通り、当該実施例4では、コンピュータ(101)は、先行基本ブロックvに対して後続基本ブロックx(当該後続基本ブロックxはもう1つの後続基本ブロックw1の先行基本ブロックでもあり、当該後続基本ブロックxは上記後続基本ブロックw’に対応する)が先行基本ブロックv以外の先行基本ブロックyを持つので、上記先行基本ブロックvと上記後続基本ブロックx(上記後続基本ブロックw’に対応する)との間のエッジv→x(上記エッジv→w’に対応する)上に基本ブロックq(上記基本ブロックmに対応する)を挿入し、当該基本ブロックqにパス値を加算する命令を挿入する。また、当該実施例4では、コンピュータ(101)は、さらに、先行基本ブロックvに対して後続基本ブロックw2が先行基本ブロックv以外の先行基本ブロックyを持つので、上記先行基本ブロックvと上記後続基本ブロックw2との間のエッジv→w2上に基本ブロックr(上記基本ブロックmに対応する)を挿入し、当該基本ブロックrにパス値を加算する命令を挿入する。
さらに、当該実施例4では、コンピュータ(101)は、先行基本ブロックzのフォールスルー・パス上に後続基本ブロックw2(上記後続基本ブロックw’に対応する)が存在するので、上記基本ブロックr(上記基本ブロックmに対応する)に基本ブロックw2へのジャンプ命令を挿入する。
また、当該実施例4では、コンピュータ(101)は、先行基本ブロックvに対して3つの後続基本ブロック{x,w1,w2}が存在しているので、当該3つの基本ブロック{x,w1,w2}のうち、上記先行基本ブロックvの後続に先行基本ブロックv以外の先行基本ブロックx(当該先行基本ブロックxは先行基本ブロックvの後続基本ブロックでもあるので、当該先行基本ブロックxは上記後続基本ブロックxでもある)が存在し、且つ、当該先行基本ブロックxのフォールスルー・パス上に後続基本ブロックが存在しているという条件を満たす一つの後続基本ブロックw1を取り出して、先行基本ブロックvと上記取り出された後続基本ブロックw1との間のエッジv→w1にゼロを割り当てる。
また、当該実施例4では、コンピュータ(101)は、先行基本ブロックvと、上記ゼロを割り当てられた後続基本ブロックw1以外の後続基本ブロックw2との間のエッジv→w2上に基本ブロックr(上記基本ブロックnに対応する)を挿入し、当該基本ブロックrにパス値を加算する命令を挿入する。
また、当該実施例4では、コンピュータ(101)は、後続基本ブロックw2が先行基本ブロックvのフォールスルー・パス上に存在せず、且つ、当該後続基本ブロックw2に先行基本ブロックv以外の先行基本ブロックzが存在するので、上記基本ブロックr(上記基本ブロックnに対応する)のパス値を加算する命令の直後に後続基本ブロックw2へのジャンプ命令を挿入する。
従って、図2Dに示す変形された制御フロー・グラフ(233)において、インストラメンテーション・コードを挿入することによってジャンプ命令の数が2つ増える(jmp w2及びjmp x)(235及び236)。一方、図7Dに示す変形された制御フロー・グラフ(733)において、インストラメンテーション・コードを挿入することによってジャンプ命令の数が3つ増える(jmp w1,jmp w2及びjmp x)(それぞれ、734,735及び736)。従って、制御フロー・グラフ(231)を本願発明の実施態様に従う制御フロー・グラフ(233)に変形することによって、図7Dに示す従来技術4による手法と比べてジャンプ命令の数を1つ減らす(3から2)ことが可能となり、従ってオーバーヘッドが削減される。
上記図2Dに示す例において、先行基本ブロックvと後続基本ブロックw1との間のエッジv→w1にパス値0を割り当てる例を示した。すなわち、先行基本ブロックvに対して3つの後続基本ブロック{x,w1,w2}が存在しているので、当該3つの基本ブロック{x,w1,w2}のうち、上記先行基本ブロックvの後続に先行基本ブロックv以外の先行基本ブロックx(当該先行基本ブロックxは先行基本ブロックvの後続基本ブロックでもあるので、先行基本ブロックxは上記後続基本ブロックxでもある)が存在し、且つ、当該先行基本ブロックxのフォールスルー・パス上に後続基本ブロックが存在しているという条件を満たす一つの後続基本ブロックw1を取り出して、先行基本ブロックvと上記取り出された後続基本ブロックw1との間のエッジv→w1にゼロを割り当てる例を示した。
代替的には、コンピュータは、先行基本ブロックvに対して複数の後続基本ブロック{w1,・・・,wn}が存在している場合に、当該複数の後続基本ブロック{w1,・・・,wn}のうち、上記先行基本ブロックvの後続に先行基本ブロックv以外の先行基本ブロックx(当該先行基本ブロックxは先行基本ブロックvの後続基本ブロックでもあるので、当該先行基本ブロックxは上記後続基本ブロックxでもある)が存在し、且つ、当該先行基本ブロックxのフォールスルー・パス上に後続基本ブロックが存在しているという条件を満たす条件を満たす一つの後続基本ブロックwiを取り出して、上記先行基本ブロックvと上記取り出された後続基本ブロックwiとの間のエッジv→wiにゼロを割り当てることが可能である。当該複数の後続基本ブロック{w1,・・・,wn}のうちの上記条件を満たす上記後続基本ブロックwiを取り出すことは例えば、複数の後続基本ブロック{w1,・・・,wn}のうち実行頻度が分かっている後続基本ブロックが一部あること(例えば、他の手法により、複数の後続基本ブロック{w1,・・・,wn}のうちの一部の基本ブロックについての実行頻度の一部が分かっている場合)に応じて、実行頻度の高い後続基本ブロックwiを取り出すことによって行われうる。
図3Aは、本発明の実施態様に従い、制御フロー・グラフ上の実行パスの実行頻度情報を得る処理の為のフローチャートを示す。
ステップ301において、コンピュータ(101)は、制御フロー・グラフ上の実行パスの実行頻度情報を得る処理を開始する。
ステップ302において、コンピュータ(101)は、プロファイルしたい関数又はメソッド単位で与えられるコンパイル対象のソースコードを、例えば当該ソースコードを格納する記憶媒体(391)からメモリ(103)内に読み込む。
ステップ303において、コンピュータ(101)は、メモリ内に読み込まれたソースコードから制御フロー・グラフを作成する。当該制御フロー・グラフの作成は任意の従来技術に従って行われる。ステップ303で作成される制御フロー・グラフは例えば、図2A、図2B、図2C及び図2Dにおいてそれぞれ示されている(変形前の)制御フロー・グラフ(201,211,221及び231)である。
ステップ304において、コンピュータ(101)は、任意的に、ステップ303で作成された制御フロー・グラフを本発明の実施態様に従い変形するかどうかを判断しうる。コンピュータ(101)は、上記制御フロー・グラフを変形することに応じて、処理をステップ305に進める。一方、コンピュータ(101)は、上記制御フロー・グラフを変形しないことに応じて、処理をステップ306に進める。ステップ304は任意のステップであるので、コンピュータは、ステップ303の処理からステップ305の処理へ直接的に進めてもよい。
ステップ305において、コンピュータ(101)は、ステップ303で作成された制御フロー・グラフを本発明の実施態様に従い変形する処理を行う。ステップ305の上記変形処理については、下記図3B及び図3Cに示すフローチャートの説明において詳細に述べる。
ステップ306において、コンピュータ(101)は、ステップ305で変形された御フロー・グラフを用いて、実行頻度情報を得る。なお、ステップ305が実施されなかった場合は、コンピュータ(101)は、ステップ303で作成された制御フロー・グラフを用いて、実行頻度情報を得る。
ステップ307において、コンピュータ(101)は、制御フロー・グラフ上の実行パスの実行頻度情報を得る処理を終了する。
図3Bは、本発明の実施態様に従い、図3Aに示すステップ303で作成された制御フロー・グラフを変形する処理の為のフローチャートを示す。
図3Bに示すフローチャートは、制御フロー・グラフ上の各基本ブロックについて、当該基本ブロックを終点からみていく為に当該基本ブロックが制御フロー・グラフの終端であるか終端でないかを判断し、そして当該基本ブロックが終端でないことに応じて、当該終端でない基本ブロックからのエッジにパス値を割り当てる処理を示す。
ステップ311において、コンピュータ(101)は、上記制御フロー・グラフを変形する処理を開始する。
ステップ312において、コンピュータ(101)は、逆トポロジカル順序でソートした制御フロー・グラフ上の全基本ブロックのリスト(BBList)、上記制御フロー・グラフ中の基本ブロック数(N)、及び上記全基本ブロックのリスト(BBList)から基本ブロックを一つずつ取り出すために使用する変数(I;初期値=0)を用意する。逆トポロジカル順序とは、制御フロー・グラフ内の終端から始端に向けたソートした全基本ブロックのリストである。逆トポロジカル順序の詳細については、上記非特許文献2を参照されたい。
ステップ313において、コンピュータ(101)は、上記基本ブロック数(N)が上記変数(I)よりも大きいかを判断する。ステップ313は、上記制御フロー・グラフ中の基本ブロック全てについて、ステップ313〜318の各処理をするためのループである。コンピュータ(101)は、上記基本ブロック数(N)が上記変数(I)よりも大きいことに応じて、処理をステップ314に進める。一方、コンピュータ(101)は、上記基本ブロック数(N)が上記変数(I)よりも大きくないことに応じて(すなわち、上記変数(I)が上記基本ブロック数(N)よりも大きいことに応じて)、処理を終了ステップ319に進める。
ステップ314において、コンピュータ(101)は、上記基本ブロック数(N)が上記変数(I)よりも大きいことに応じて、BBListから、1つの基本ブロックVを取り出す。
ステップ315において、コンピュータ(101)は、基本ブロックVに対して値(0又は1)を割り当てる為に、上記取り出した基本ブロックVが制御フロー・グラフの終端(出口)にある基本ブロックであるかを判断する。コンピュータ(101)は、上記取り出した基本ブロックVが上記制御フロー・グラフの終端にある基本ブロックでないことに応じて処理をステップ316に進める。一方、コンピュータ(101)は、上記取り出した基本ブロックVが上記制御フロー・グラフの終端にある基本ブロックであることに応じて処理をステップ317に進める。
ステップ316において、コンピュータ(101)は、上記取り出した基本ブロックVが上記制御フロー・グラフの終端にある基本ブロックでないことに応じて、当該終端でない基本ブロックVに対して値0を割り当てる(NumPath[V] = 0)。当該値0は基本ブロックVに対して割り当てられる値であるが、図3Cに示すステップ328において、当該値0は、上記制御フロー・グラフ中の各基本ブロックに対してユニークな値になるように変更される。
ステップ317において、コンピュータ(101)は、上記取り出した基本ブロックVが上記制御フロー・グラフの終端にある基本ブロックであることに応じて、当該終端である基本ブロックVに対して値1を割り当てる(NumPath[V] = 1)。
ステップ318において、コンピュータ(101)は、ステップ316で値0が割り当てられた基本ブロックV(すなわち、当該基本ブロックVが上記制御フロー・グラフの終端でない場合)からのエッジにパス値を割り当てる処理を行う。すなわち、ステップ318では、終端にある基本ブロック以外の先行基本ブロックに対して、当該先行基本ブロックからのエッジにパス値を割り当てる処理を行う。ステップ318の上記終端でない基本ブロックVからのエッジへのパス値の割り当て処理については、下記図3Cに示すフローチャートの説明において詳細に述べる。
ステップ319において、コンピュータ(101)は、ステップ313における判断ステップにおいて、上記変数(I)が上記制御フロー・グラフ中の基本ブロック数(N)よりも大きいことに応じて、上記制御フロー・グラフを変形する処理を終了する。
図3Cは、本発明の実施態様に従い、制御フロー・グラフを変形する処理において、エッジに値を割り当てる処理の為のフローチャートを示す。
図3Cは、図3Bに示すステップ316で値0が割り当てられた基本ブロックV(すなわち、上記終端でない基本ブロックV)からのエッジにパス値を与える処理を示す。
ステップ321において、コンピュータ(101)は、上記エッジに値を割り当てる処理を開始する。
ステップ322において、コンピュータ(101)は、図3Bに示すステップ316で値0を割り当てられた基本ブロックVの後続となる後続基本ブロックWに上記基本ブロックV以外の別の先行基本ブロックXが存在し、且つ、当該先行基本ブロックXのフォールスルー・パス上に上記後続基本ブロックWが存在しているかどうかの条件を満たすかを判断する。コンピュータ(101)は、上記条件を満たすことに応じて、処理をステップ323に進める。一方、コンピュータ(101)は、上記条件を満たさないことに応じて、処理をステップ324に進める。
ステップ323において、コンピュータ(101)は、上記条件を満たすことに応じて、上記基本ブロックV(例えば、図2A〜図2Dそれぞれに示す基本ブロックvに対応する)と上記後続基本ブロックW(例えば、図2A〜図2Dそれぞれに示す基本ブロックw又はw1に対応する)との間のエッジE’(すなわち、上記の場合、V→W)に、パス値0を割り当てる(Val[E’] = 0)。パス値0を割り当てるのは、エッジにパス値0が割り当てられることによって、パス値0が割り当てられた当該エッジに対して加減算の処理が必要なくなり、従って当該エッジ上に基本ブロックの挿入やジャンプ命令が不要になりコストが下がるからである。また、コンピュータ(101)は、上記制御フロー・グラフ中の各基本ブロックの値が終点から始点に向かってユニークな値になるようにする為に、上記基本ブロックVの値に後続基本ブロックWの値を加算して、当該基本ブロックVの値を更新する(NumPath[V] += NumPath[W])。
ステップ324において、コンピュータ(101)は、上記条件を満たさないことに応じて、上記基本ブロックVからのエッジE’にパス値0を割り当てる(E’ = 0)。
ステップ325において、コンピュータ(101)は、上記基本ブロックVからのエッジのリスト(EList)、上記基本ブロックVからのエッジの数(M)、及び上記エッジのリスト(EList)からエッジを一つずつ取り出すために使用する変数(J;初期値=0)を用意する。上記基本ブロックVからのエッジのリスト(EList)には、上記基本ブロックVからの全てのエッジがリストされている。ステップ326〜ステップ328のループ開始前では、基本ブロックVから基本ブロックWへのエッジにのみパス値0が割り当てられており(ステップ323)、ステップ326〜ステップ328を繰り返すことによって、基本ブロックVからの残りのエッジにパス値が割り当てられる。上記残りのエッジへのパス値の割り当ては、下記ステップ328において行われる。上記残りのエッジにどのようにパス値が割り当てられるかは例えばエッジを取り出した順(例えば、1,2,3の昇順)に従い、従ってパス値は上記残りのエッジそれぞれに任意にユニークな値になるように割り当てられうる。
ステップ326において、コンピュータ(101)は、上記基本ブロックVからのエッジの数(M)が上記変数(J)よりも大きいかを判断する。ステップ326は、上記基本ブロックVからのエッジ全てについて、ステップ327の処理をするためのループである。コンピュータ(101)は、上記基本ブロックVからのエッジの数(M)が上記変数(J)よりも大きいことに応じて、処理をステップ327に進める。一方、コンピュータ(101)は、上記基本ブロックVからのエッジの数(M)が上記変数(J)よりも大きくないことに応じて(すなわち、上記変数(J)が上記基本ブロックVからのエッジの数(M)よりも大きいことに応じて)、処理を終了ステップ329に進める。
ステップ327において、コンピュータ(101)は、上記基本ブロックVからのエッジの数(M)が上記変数(J)よりも大きいことに応じて、上記基本ブロックvからのエッジのリスト(EList)から1つのエッジを取り出し、当該取り出したエッジの値が上記基本ブロックvからのエッジのリスト(EList)中にあるか、すなわち、上記エッジに既にパス値が割り振られているかをさらに判断する(EList[J] == e’)。コンピュータ(101)は、上記エッジの値が上記基本ブロックVからのエッジのリスト(EList)中にないことに応じて、当該エッジにパス値を割り当てる為に、処理をステップ328に進める。一方、コンピュータ(101)は、上記エッジの値が上記基本ブロックVからのエッジのリスト(EList)中にあることに応じて、当該エッジにパス値を割り当てる必要がないことから、処理をステップ326に戻す。
ステップ328において、コンピュータ(101)は、上記エッジのパス値が上記基本ブロックVからのエッジのリスト(EList)中にないことに応じて、パス値として上記基本ブロックVの値(非セロ値である)を割り当て(Val[EList[J]] = NumPath[V])、且つ、上記基本ブロックVの値にEList[J]の後続基本ブロックの値を加算して、当該基本ブロックVの値を更新する(NumPath[V] += NumPath[EList[J]の後続基本ブロック])。ここで、NumPath[EList[J]の後続基本ブロック]は既に非ゼロになっているので、更新された基本ブロックVの値も非ゼロ値である。何故ならば、図3B〜図3Cに示す処理が、基本ブロックを終点から処理していく為に、ある基本ブロックVからのエッジにパス値を割り当てる際に、その後続基本ブロックの処理は既に終了しているからである。ステップ326からステップ328を繰り返すことによって、上記基本ブロックVからの各エッジにユニークなパス値(ステップ323で割り当てられたパス値0を除く)が割り当てられる。
ステップ329において、コンピュータ(101)は、ステップ326における判断ステップにおいて、上記変数(J)が上記基本ブロックVからのエッジの数(M)よりも大きいことに応じて、上記基本ブロックVからの上記エッジにパス値を割り当てる処理を終了する。
図4は、本発明の実施態様に従い、制御フロー・グラフを変形する処理において、新たな基本ブロックの挿入が必要なエッジに値を割り当てる処理を実行する為のアルゴリズムの一例を示す。
上記アルゴリズム(401)は、エッジeに値Val(e)を割り当てるアルゴリズムである。当該アルゴリズムにおいて、01〜13の数字は、説明を容易にするために挿入されたものであって、実際のコードでは不要である。
本発明の実施態様に従うと、制御フロー・グラフ上に新たな基本ブロックを挿入することが必要なエッジ(例えば、図2Aに示すエッジv→w、図2Bに示すエッジv→w、図2Cに示すエッジv→w1、及び図2Dに示すエッジv→w1)上で、加減算する値をゼロにする。すなわち、制御フロー・グラフ上に新たな基本ブロックを挿入することが必要なエッジにパス値ゼロを割り当てる。上記エッジにパス値ゼロが割り当てられることによって、当該エッジにインストラメンテーション・コードが不要になり、従って新たな基本ブロックの挿入も不要になる。
上記アルゴリズム(401)において、行06,07,08,09,及び11に示すコードが、本発明の実施態様に追加されたコードであり、エッジeに値Val(e)を割り当てるアルゴリズムである。また、行05,07,08,及び12が、本発明の実施態様に従い、最初のエッジにパス値ゼロを割り当てるアルゴリズムである。
・行01は、図3Bに示すステップ312に対応する。
・行02は、図3Bに示すステップ315に対応する。
・行03は、図3Bに示すステップ316に対応する。
・行04〜05は、図3Bに示すステップ317に対応する。
・行06は、図3Cに示すステップ322に対応する。
・行07〜09は、図3Cに示すステップ323に対応する。
・行10は、図3Cに示すステップ326に対応する。
・行11は、図3Cに示すステップ327に対応する。
・行12〜13は、図3Cに示すステップ328に対応する。
行06に示すfindNewBBEdge(v)は、先行基本ブロックvと後続基本ブロックw(又はw1)のエッジv→w(又はv→w1)上に、新たな基本ブロックが必要な条件を規定する。当該条件は、先行基本ブロックvの後続基本ブロックwに先行基本ブロックv以外の先行基本ブロックxが存在し、且つ、当該先行基本ブロックxのフォールスルー・パス上に後続基本ブロックwが存在することである。
図5は、従来技術の手法を実行可能にするアルゴリズムをコンパイラに実装したプログラムと本発明の実施態様を実行可能にするアルゴリズムをコンパイラに実装したプログラムとのスループットとの対比結果を示す。
従来技術の手法を実行可能にするアルゴリズムをコンパイラに実装したプログラムは、非特許文献2に記載の手法を実装したプログラムである。
本発明の実施態様を実行可能にするアルゴリズムをコンパイラに実装したプログラムは、従来技術の手法を実行可能にするアルゴリズムをコンパイラに実装したプログラムと比べて、平均0.7%(相乗平均を参照)、最大2.7%(xml.validation)の性能向上が見られた。
図6は、図1に従うハードウェア構成を好ましくは備えており、本発明の実施態様に従い生成された制御フロー・グラフ上の実行パスの実行頻度情報を得るためのコンピュータの機能ブロック図の一例を示した図である。
コンピュータ(601)は、本発明の実施態様に従い、制御フロー・グラフ上の実行パスの実行頻度情報を得るためのコンピュータであり、例えば図1に示すコンピュータ(101)である。
コンピュータ(601)は、メモリ(611)、制御フロー・グラフ作成手段(612)、及び実行頻度情報取得手段(613)を備えている。制御フロー・グラフ作成手段(612)は、制御フロー・グラフ変形手段(621)をさらに備えている。制御フロー・グラフ変形手段(621)は、本発明の実施態様において追加された手段である。なお、コンピュータ(601)は、制御フロー・グラフ作成手段(612)と制御フロー・グラフ変形手段(621)とを別々の手段として備えていてもよい。
メモリ(611)は、コンピュータが、コンパイル対象のソースコードを格納する記憶媒体(391)から読み取ったコンパイル対象のソースコードを記憶する。
コンピュータ(101)は、メモリ(611)を、図3Aに示すステップ302を実行する上で使用する。
制御フロー・グラフ作成手段(612)は、コンパイル対象のソースコードから、制御フロー・グラフを作成する。
制御フロー・グラフ変形手段(621)は、先行基本ブロックvの後続基本ブロックwに先行基本ブロックv以外の先行基本ブロックxが存在し、且つ、当該先行基本ブロックxのフォールスルー・パス上に後続基本ブロックwが存在している場合に、先行基本ブロックvと後続基本ブロックwとの間のエッジv→wにパス値ゼロを割り当てて、制御フロー・グラフを変形する。
制御フロー・グラフ変形手段(621)は、上記先行基本ブロックvに対して上記後続基本ブロックw以外の後続基本ブロックw’が上記先行基本ブロックv以外の先行基本ブロックを持たない場合、上記後続基本ブロックw’にパス値を加算する命令を挿入しうる。
制御フロー・グラフ変形手段(621)は、上記先行基本ブロックvに対して上記後続基本ブロックw以外の後続基本ブロックw’が上記先行基本ブロックv以外の先行基本ブロックyを持つ場合、上記先行基本ブロックvと上記後続基本ブロックw’との間のエッジv→w’上に新たな基本ブロックmを挿入し、上記基本ブロックmにパス値を加算する命令を挿入しうる。
制御フロー・グラフ変形手段(621)は、上記先行基本ブロックyのフォールスルー・パス上に上記後続基本ブロックw’が存在する場合、上記基本ブロックmに基本ブロックw’へのジャンプ命令を挿入しうる。
制御フロー・グラフ変形手段(621)は、上記先行基本ブロックvに対して3つ以上の後続基本ブロック{w1,・・・,wn}が存在している場合に、当該複数の後続基本ブロック{w1,・・・,wn}のうち、先行基本ブロックvの後続基本ブロックに上記先行基本ブロックv以外の先行基本ブロックxが存在し、且つ、当該先行基本ブロックxのフォールスルー・パス上に後続基本ブロックが存在しているという条件を満たす一つの後続基本ブロックwiを取り出して、上記先行基本ブロックvと上記取り出された後続基本ブロックwiとの間のエッジv→wiにゼロを割り当てて、上記制御フロー・グラフを変形しうる。複数の後続基本ブロック{w1,・・・,wn}のうちの上記条件を満たす上記一つの後続基本ブロックwiを取り出すことが、上記複数の後続基本ブロック{w1,・・・,wn}のうち実行頻度が分かっている後続基本ブロックが一部あることに応じて、実行頻度の高い後続基本ブロックwiを取り出すことを含みうる。
制御フロー・グラフ変形手段(621)は、上記先行基本ブロックvと上記ゼロを割り当てられた後続基本ブロックwi以外の後続基本ブロックwjとの間のエッジv→wjにパス値を加算する命令を挿入しうる。
制御フロー・グラフ変形手段(621)は、上記後続基本ブロックwjが上記先行基本ブロックvのフォールスルー・パス上に存在せず、且つ、上記後続基本ブロックwjに上記先行基本ブロックv以外の先行基本ブロックが存在する場合、パス値を加算する命令の直後に上記後続基本ブロックwjへのジャンプ命令を挿入しうる。
制御フロー・グラフ作成手段(612)は、図3Aに示すステップ303を実行しうる。
制御フロー・グラフ変形手段(621)は、図3Aに示すステップ304〜305、並びに、図3B及び図3Cにそれぞれ示す各ステップを実行する。
制御フロー・グラフ変形手段(621)は、図2A(実施例1)に示すように、上記後続基本ブロックx(上記後続基本ブロックw’に対応する)にパス値を加算する命令を挿入する。但し、当該挿入された後続基本ブロックxはジャンプ命令を含まない。
制御フロー・グラフ変形手段(621)は、図2B(実施例2)に示すように、上記先行基本ブロックyが上記先行基本ブロックvと上記後続基本ブロックxとの間のエッジv→x上に存在せず、当該後続基本ブロックxに先行して存在する場合に、上記先行基本ブロックvと上記後続基本ブロックxとの間にパス値を加算する命令を含む基本ブロックmを挿入する。但し、当該挿入された基本ブロックmはジャンプ命令を含まない。
制御フロー・グラフ変形手段(621)は、図2C(実施例3)に示すように、上記後続基本ブロックx(上記後続基本ブロックw’に対応する)にパス値を加算する命令を挿入する。但し、当該挿入された後続基本ブロックxはジャンプ命令を含まない。
制御フロー・グラフ変形手段(621)は、図2D(実施例4)に示すように、上記先行基本ブロックyが上記先行基本ブロックvと上記後続基本ブロックxとの間のエッジv→x上に存在せず、上記後続基本ブロックxに先行して存在する場合に、上記先行基本ブロックvと上記後続基本ブロックxとの間にパス値を加算する命令を含む基本ブロックqを挿入する。但し、当該挿入された基本ブロックqはジャンプ命令を含まない。
実行頻度情報取得手段(613)は、制御フロー・グラフ変形手段(621)により変形された制御フロー・グラフを用いて、実行頻度情報を得る。
実行頻度情報取得手段(613)は、図3Aに示すステップ306を実行する。