(57)【要約】【課題】本発明は、制御フロー・グラフ（ＣＦＧ）のパス値を計算するインストラメンテーション・コードを挿入する際に必要なジャンプ命令を最小化することによって、オーバーヘッドを削減することを目的とする。【解決手段】本発明はＣＦＧ上の実行パスの実行頻度情報を得るための技法であって、メモリ内に読み込まれたソースコードからＣＦＧを作成すること、当該ＣＦＧを作成することが、先行となる基本ブロックｖの後続となる基本ブロックｗに先行基本ブロックｖ以外の先行基本ブロックｘが存在し、且つ、先行基本ブロックｘのフォールスルー・パス上に後続基本ブロックｗが存在している場合に、先行基本ブロックｖと後続基本ブロックｗとの間のエッジｖ→ｗにパス値ゼロを割り当てて、上記ＣＦＧを変形することを含み、そして、当該変形されたＣＦＧを用いて、実行頻度情報を得ることを含む。【選択図】図３Ｂ
2015103021.tif 000002
【特許請求の範囲】
【請求項１】
制御フロー・グラフ上の実行パスの実行頻度情報を得るための方法であって、コンピュータが、
コンパイル対象のソースコードをメモリ内に読み込むステップと、
前記メモリ内に読み込まれたソースコードから制御フロー・グラフを作成するステップであって、
先行となる基本ブロック（以下、「先行基本ブロック」という）ｖの後続となる基本ブロック（以下、「後続基本ブロック」という）ｗに前記先行基本ブロックｖ以外の先行基本ブロックｘが存在し、且つ、前記先行基本ブロックｘのフォールスルー（fallthrough）・パス上に前記後続基本ブロックｗが存在している場合に、前記先行基本ブロックｖと前記後続基本ブロックｗとの間のエッジｖ→ｗにゼロを割り当てて、前記制御フロー・グラフを変形するステップを含む、前記作成するステップと
前記変形するステップにより変形された制御フロー・グラフを用いて、前記実行頻度情報を得るステップと
を実行することを含む、前記方法。
【請求項２】
前記制御フロー・グラフを変形するステップが、
前記先行基本ブロックｖに対して前記後続基本ブロックｗ以外の後続基本ブロックｗ’が前記先行基本ブロックｖ以外の先行基本ブロックを持たない場合、前記後続基本ブロックｗ’にパス値を加算する命令を挿入するステップ
をさらに含む、請求項１に記載の方法。
【請求項３】
前記制御フロー・グラフを変形するステップが、
前記先行基本ブロックｖに対して前記後続基本ブロックｗ以外の後続基本ブロックｗ’が前記先行基本ブロックｖ以外の先行基本ブロックｙを持つ場合、前記先行基本ブロックｖと前記後続基本ブロックｗ’との間のエッジｖ→ｗ’上に基本ブロックｍを挿入し、当該基本ブロックｍにパス値を加算する命令を挿入するステップと
をさらに含む、請求項１に記載の方法。
【請求項４】
前記制御フロー・グラフを変形するステップが、
前記先行基本ブロックｙのフォールスルー・パス上に前記後続基本ブロックｗ’が存在する場合、前記基本ブロックｍに基本ブロックｗ’へのジャンプ命令を挿入するステップ
をさらに含む、請求項３に記載の方法。
【請求項５】
前記制御フロー・グラフを変形するステップが、
前記先行基本ブロックｖに対して３つ以上の後続基本ブロック｛ｗ１，・・・，ｗｎ｝が存在している場合に、当該３つ以上の後続基本ブロック｛ｗ１，・・・，ｗｎ｝のうち、先行基本ブロックｖの後続基本ブロックに前記先行基本ブロックｖ以外の先行基本ブロックｘが存在し、且つ、前記先行基本ブロックｘのフォールスルー・パス上に後続基本ブロックが存在しているという条件を満たす一つの後続基本ブロックｗｉを取り出して、前記先行基本ブロックｖと取り出された前記後続基本ブロックｗｉとの間のエッジｖ→ｗｉにゼロを割り当てて、前記制御フロー・グラフを変形するステップ
を含む、請求項１に記載の方法。
【請求項６】
前記制御フロー・グラフを変形するステップが、
前記先行基本ブロックｖとゼロを割り当てられた前記後続基本ブロックｗｉ以外の後続基本ブロックｗｊとの間のエッジｖ→ｗｊ上に基本ブロックｎを挿入し、当該基本ブロックｎにパス値を加算する命令を挿入するステップ
をさらに含む、請求項５に記載の方法。
【請求項７】
前記制御フロー・グラフを変形するステップが、
前記後続基本ブロックｗｊが前記先行基本ブロックｖのフォールスルー・パス上に存在せず、且つ、前記後続基本ブロックｗｊに前記先行基本ブロックｖ以外の先行基本ブロックが存在する場合、前記基本ブロックｎのパス値を加算する命令の直後に前記後続基本ブロックｗｊへのジャンプ命令を挿入するステップ
をさらに含む、請求項６に記載の方法。
【請求項８】
前記３つ以上の後続基本ブロック｛ｗ１，・・・，ｗｎ｝のうちの前記条件を満たす前記一つの後続基本ブロックｗｉを取り出すことが、
前記３つ以上の後続基本ブロック｛ｗ１，・・・，ｗｎ｝のうち実行頻度が分かっている後続基本ブロックが一部あることに応じて、実行頻度の高い後続基本ブロックｗｉを取り出すステップ
をさらに含む、請求項５〜７のいずれか一項に記載の方法。
【請求項９】
制御フロー・グラフ上の実行パスの実行頻度情報を得るためのコンピュータであって、
コンパイル対象のソースコードを読み込むためのメモリと、
前記メモリ内に読み込まれたソースコードから制御フロー・グラフを作成する制御フロー・グラフ作成手段であって、
先行となる基本ブロック（以下、「先行基本ブロック」という）ｖの後続となる基本ブロック（以下、「後続基本ブロック」という）ｗに前記先行基本ブロックｖ以外の先行基本ブロックｘが存在し、且つ、前記先行基本ブロックｘのフォールスルー（fallthrough）・パス上に前記後続基本ブロックｗが存在している場合に、前記先行基本ブロックｖと前記後続基本ブロックｗとの間のエッジｖ→ｗにゼロを割り当てて、前記制御フロー・グラフを変形する制御フロー・グラフ変形手段をさらに含む、前記制御フロー・グラフ作成手段と
前記制御フロー・グラフ変形手段により変形された制御フロー・グラフを用いて、前記実行頻度情報を得る実行頻度情報取得手段と
を備えている、前記コンピュータ。
【請求項１０】
前記制御フロー・グラフ変形手段が、
前記先行基本ブロックｖに対して前記後続基本ブロックｗ以外の後続基本ブロックｗ’が前記先行基本ブロックｖ以外の先行基本ブロックを持たない場合、前記後続基本ブロックｗ’にパス値を加算する命令を挿入する、
請求項９に記載のコンピュータ。
【請求項１１】
前記制御フロー・グラフ変形手段が、
前記先行基本ブロックｖに対して前記後続基本ブロックｗ以外の後続基本ブロックｗ’が前記先行基本ブロックｖ以外の先行基本ブロックｙを持つ場合、前記先行基本ブロックｖと前記後続基本ブロックｗ’との間のエッジｖ→ｗ’上に基本ブロックｍを挿入し、当該基本ブロックｍにパス値を加算する命令を挿入する、
請求項９に記載のコンピュータ。
【請求項１２】
前記制御フロー・グラフ変形手段が、
前記先行基本ブロックｙのフォールスルー・パス上に前記後続基本ブロックｗ’が存在する場合、前記基本ブロックｍに基本ブロックｗ’へのジャンプ命令を挿入する、
請求項１１に記載のコンピュータ。
【請求項１３】
前記制御フロー・グラフ変形手段が、
前記先行基本ブロックｖに対して３つ以上の後続基本ブロック｛ｗ１，・・・，ｗｎ｝が存在している場合に、当該３つ以上の後続基本ブロック｛ｗ１，・・・，ｗｎ｝のうち、先行基本ブロックｖの後続基本ブロックに前記先行基本ブロックｖ以外の先行基本ブロックｘが存在し、且つ、前記先行基本ブロックｘのフォールスルー・パス上に後続基本ブロックが存在しているという条件を満たす一つの後続基本ブロックｗｉを取り出して、前記先行基本ブロックｖと取り出された前記後続基本ブロックｗｉとの間のエッジｖ→ｗｉにゼロを割り当てて、前記制御フロー・グラフを変形する、
請求項９に記載のコンピュータ。
【請求項１４】
前記制御フロー・グラフ変形手段が、
前記先行基本ブロックｖとゼロを割り当てられた前記後続基本ブロックｗｉ以外の後続基本ブロックｗｊとの間のエッジｖ→ｗｊ上に基本ブロックｎを挿入し、当該基本ブロックｎにパス値を加算する命令を挿入する、
請求項１３に記載のコンピュータ。
【請求項１５】
前記制御フロー・グラフ変形手段が、
前記後続基本ブロックｗｊが前記先行基本ブロックｖのフォールスルー・パス上に存在せず、且つ、前記後続基本ブロックｗｊに前記先行基本ブロックｖ以外の先行基本ブロックが存在する場合、前記パス値を加算する命令の直後に前記後続基本ブロックｗｊへのジャンプ命令を挿入する
請求項１４に記載のコンピュータ。
【請求項１６】
前記３つ以上の後続基本ブロック｛ｗ１，・・・，ｗｎ｝のうちの前記条件を満たす前記一つの後続基本ブロックｗｉを取り出すことが、
前記３つ以上の後続基本ブロック｛ｗ１，・・・，ｗｎ｝のうち実行頻度が分かっている後続基本ブロックが一部あることに応じて、実行頻度の高い後続基本ブロックｗｉを取り出すこと
を含む、請求項１３〜１５のいずれか一項に記載のコンピュータ。
【請求項１７】
制御フロー・グラフ上の実行パスの実行頻度情報を得るためのコンピュータ・プログラムであって、コンピュータに、請求項１〜８のいずれか一項に記載の方法の各ステップを実行させる、前記コンピュータ・プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、制御フロー・グラフ上の実行パスの実行頻度情報を得るための技法に関する。
【背景技術】
【０００２】
制御フロー・グラフ（コントロール・フロー・グラフ）は、プログラムを実行したときに通る可能性のある全経路をグラフで表したものであり、プログラムの制御の流れをグラフで表したものである。当該グラフにおいて、ノードは基本ブロック（basic block）（すなわち、途中に分岐がなく、且つ途中への合流もない）を表し、ノードとノードとをつなぐ有向エッジ（有効辺）は、ある基本ブロックから別の基本ブロックへの遷移を意味する。
【０００３】
基本ブロックは、プログラムの処理（文や命令）の列であり、その間には分岐も合流もない。基本ブロック中の文は先頭から最後まで一直線に実行される。一般に、基本ブロックとして、上記グラフ全体の入口となる入口ブロックと、出口となる出口ブロックがある。
【０００４】
制御フロー・グラフにおいて、基本ブロックＸから基本ブロックＹに向かって有向エッジが引かれていることを、Ｘ→Ｙと表記する。ここで、ＸはＹの先行基本ブロック（predecessor basic block）又は先行ノードといい、ＹはＸの後続基本ブロック（successor basic block）又は後続ノードという。また、先行ノードが複数あるノードを結合ノード、後続ノードが複数あるノードを分岐ノードという。
【０００５】
制御フロー・グラフは、コンパイラ最適化や静的コード解析ツールにおいてよく用いられている。
【０００６】
制御フロー・グラフ上のプロファイル情報、例えば有向エッジや実行パスの実行頻度情報は、コンパイラの最適化の効果を高めることを可能にする。制御フロー・グラフにおいて、有向エッジや実行パスの実行頻度情報をプロファイルする為には、当該有向エッジ上に上記実行頻度を測定するためのインストラメンテーション・コード（カウンタ・プログラムである）を挿入する必要がある。当該インストラメンテーション・コードとして、各パスにユニークであるパス値をエッジに与える。当該パス値をエッジに与えることによって毎回エッジをカウントする必要はなく、プログラムの実行によってエッジを通るたびに当該エッジに割り当てられたパス値を足し込むことによって各エッジ毎にパス値の合計を実行頻度情報として収集する。しかしながら、上記有向エッジ上に上記インストラメンテーション・コードを挿入することは、オーバーヘッドを増加させる為に、実行時性能を低下させる。
【０００７】
下記非特許文献１及び２は、実行パスの事項頻度をプロファイルする技法を記載する。
【０００８】
非特許文献１は、効率的なパス・プロファイリングを記載する。
【０００９】
非特許文献２は、連続的なパス及びエッジ・プロファイリングを記載する。
【先行技術文献】
【非特許文献】
【００１０】
【非特許文献１】Thomas Ball et. Al., “Efficient Path Profiling”, International Symposium on Microarchitecture(MICRO’96), IEEE
【非特許文献２】Michael D. Bond et. Al., “Continuous Path and Edge Profiling”, International Symposium on Microarchitecture (MICRO’05), IEEE
【発明の概要】
【発明が解決しようとする課題】
【００１１】
図７Ａ〜図７Ｄそれぞれは、従来技術に従い、図７Ａ〜図７Ｄそれぞれに示す変形前の制御フロー・グラフ（７０１，７１１，７２１及び７３１）において、先行となる基本ブロック（先行基本ブロック）ｖと後続となる基本ブロック（後続基本ブロック）ｗ又はｗ１との間のエッジにパス値１を割り当て、そしてインストラメンテーション・コードを挿入している模式図を示す。以下に、図７Ａ〜図７Ｄそれぞれに示す制御フロー・グラフ（７０１，７１１，７２１及び７３１）がインストラメンテーション・コード（すなわち、パス値を加算する命令である）の挿入により、どのように変形されるのかを説明する。上記パス値とは、制御フロー・グラフの始点から終点にかけて通過した実行パスを唯一に表す整数値である。
【００１２】
図７Ａ（従来技術１）において、変形前の制御フロー・グラフ（７０１）は、先行基本ブロックｖ、並びに、当該先行基本ブロックｖの２つの後続基本ブロックである後続基本ブロックｘ（当該後続基本ブロックｘはもう１つの後続基本ブロックｗの先行基本ブロックでもあり、先行基本ブロックｘとも示される）及び後続基本ブロックｗを有し、先行基本ブロックｖはエッジｖ→ｘで後続基本ブロックｘと且つエッジｖ→ｗで後続基本ブロックｗとそれぞれ接続されており、及び、後続基本ブロックｘはエッジｘ→ｗで後続基本ブロックｗと接続されている。
【００１３】
コンピュータは、変形前の制御フロー・グラフ（７０１）において、先行基本ブロックｖと後続基本ブロックｘとの間のエッジｖ→ｘにパス値０を割り当て、且つ、先行基本ブロックｖと後続基本ブロックｗとの間のエッジｖ→ｗにパス値１を割り当てる。また、コンピュータは、その他のエッジにパス値０を割り当てる。従って、制御フロー・グラフ（７０２）では、エッジｖ→ｘにパス値０が割り当てられており、且つ、エッジｖ→ｗにパス値１が割り当てられている。
【００１４】
次に、コンピュータは、制御フロー・グラフ（７０２）にインストラメンテーション・コードを挿入する操作を行う。
【００１５】
コンピュータは、エッジｖ→ｘにパス値０が割り当てられているので、インストラメンテーション・コードを挿入しない。同様に、コンピュータは、パス値０が割り当てられているその他のエッジについてもインストラメンテーション・コードを挿入しない。
【００１６】
また、コンピュータは、エッジｖ→ｗにパス値１が割り当てられているので、エッジｖ→ｗ上に、パス値として１を加算する命令（ｒ＋＝１）を含む基本ブロック（７０４）を挿入する。挿入された基本ブロック（挿入基本ブロック）（７０４）は、パス値として１を加算する命令（ｒ＋＝１）とともに、後続基本ブロックｗへのジャンプ命令（ｊｍｐ  ｗ）を含む。
【００１７】
従って、図７Ａに示す変形された制御フロー・グラフ（７０３）において、インストラメンテーション・コードを挿入することによってジャンプ命令の数が１つ増えることから（ｊｍｐ  ｗ）（７０４）、オーバーヘッドが増加するという問題が生じる。
【００１８】
図７Ｂ（従来技術２）において、変形前の制御フロー・グラフ（７１１）は、先行基本ブロックｖ、当該先行基本ブロックｖの２つの後続基本ブロックｘ（当該後続基本ブロックｘはもう１つの後続基本ブロックｗの先行基本ブロックでもあり、先行基本ブロックｘとも示される）及び後続基本ブロックｗ、並びに、上記先行基本ブロックｖ以外の先行基本ブロックｙを有し、先行基本ブロックｖはエッジｖ→ｘで後続基本ブロックｘと且つエッジｖ→ｗで後続基本ブロックｗとそれぞれ接続されており、先行基本ブロックｙはエッジｙ→ｘで後続基本ブロックｘと接続されており、及び、後続基本ブロックｘはエッジｘ→ｗで後続基本ブロックｗと接続されている。
【００１９】
コンピュータは、変形前の制御フロー・グラフ（７１１）において、先行基本ブロックｖと後続基本ブロックｘとの間のエッジｖ→ｘにパス値０を割り当て、先行基本ブロックｖと後続基本ブロックｗとの間のエッジｖ→ｗにパス値１を割り当て、且つ、先行基本ブロックｙと後続基本ブロックｘとの間のエッジｙ→ｘにパス値２を割り当てる。また、コンピュータは、その他のエッジにパス値０を割り当てる。従って、制御フロー・グラフ（７１２）では、エッジｖ→ｘにパス値０が割り当てられており、エッジｖ→ｗにパス値１が割り当てられており、且つ、エッジｙ→ｘにパス値２が割り当てられている。
【００２０】
次に、コンピュータは、制御フロー・グラフ（７１２）にインストラメンテーション・コードを挿入する操作を行う。
【００２１】
コンピュータは、エッジｖ→ｘにパス値０が割り当てられているので、インストラメンテーション・コードを挿入しない。同様に、コンピュータは、パス値０が割り当てられているその他のエッジについてもインストラメンテーション・コードを挿入しない。
【００２２】
また、コンピュータは、エッジｖ→ｗにパス値１が割り当てられているので、エッジｖ→ｗ上に、パス値として１を加算する命令（ｒ＋＝１）を含む基本ブロック（７１４）を挿入する。挿入基本ブロック（７１４）は、パス値として１を加算する命令（ｒ＋＝１）とともに、後続基本ブロックｗへのジャンプ命令（ｊｍｐ  ｗ）を含む。
【００２３】
同様に、コンピュータは、エッジｙ→ｘにパス値２が割り当てられているので、エッジｙ→ｘ上に、パス値として２を加算する命令（ｒ＋＝２）を含む基本ブロック（７１５）を挿入する。挿入基本ブロック（７１５）は、パス値として２を加算する命令（ｒ＋＝２）とともに、後続基本ブロックｘへのジャンプ命令（ｊｍｐ  ｘ）を含む。
【００２４】
従って、図７Ｂに示す変形された制御フロー・グラフ（７１３）において、インストラメンテーション・コードを挿入することによってジャンプ命令の数が２つ増えることから（ｊｍｐ  ｗ及びｊｍｐ  ｘ）（それぞれ、７１４及び７１５）、オーバーヘッドが増加するという問題が生じる。
【００２５】
図７Ｃ（従来技術３）において、変形前の制御フロー・グラフ（７２１）は、先行基本ブロックｖ、当該先行基本ブロックｖの３つの後続基本ブロックである後続基本ブロックｘ（当該後続基本ブロックｘは別の後続基本ブロックｗ１及びｗ２の先行基本ブロックでもあり、先行基本ブロックｘとも示される）、後続基本ブロックｗ１及びｗ２、並びに、先行基本ブロックｖ以外の先行基本ブロックｙ（後続基本ブロックｗ２の先行基本ブロックである）を有し、先行基本ブロックｖはエッジｖ→ｘで後続基本ブロックｘと、エッジｖ→ｗ１で後続基本ブロックｗ１と且つエッジｖ→ｗ２で後続基本ブロックｗ２とそれぞれ接続されており、後続基本ブロックｘはエッジｘ→ｗ１で後続基本ブロックｗ１と接続されており、後続基本ブロックｗ１はエッジｗ１→ｙで先行基本ブロックｙと接続されており、及び先行基本ブロックｙはエッジｙ→ｗ２で後続基本ブロックｗ２と接続されている。
【００２６】
コンピュータは、変形前の制御フロー・グラフ（７２１）において、先行基本ブロックｖと後続基本ブロックｘとの間のエッジｖ→ｘにパス値０を割り当て、先行基本ブロックｖと後続基本ブロックｗ１との間のエッジｖ→ｗ１にパス値１を割り当て、且つ、先行基本ブロックｖと後続基本ブロックｗ２との間のエッジｖ→ｗ２にパス値２を割り当てる。また、コンピュータは、その他のエッジにパス値０を割り当てる。従って、制御フロー・グラフ（７２２）では、エッジｖ→ｘにパス値０が割り当てられており、エッジｖ→ｗ１にパス値１が割り当てられており、且つ、エッジｖ→ｗ２にパス値２が割り当てられている。
【００２７】
次に、コンピュータは、制御フロー・グラフ（７２２）にインストラメンテーション・コードを挿入する操作を行う。
【００２８】
コンピュータは、エッジｖ→ｘにパス値０が割り当てられているので、インストラメンテーション・コードを挿入しない。同様に、コンピュータは、パス値０が割り当てられているその他のエッジについてもインストラメンテーション・コードを挿入しない。
【００２９】
また、コンピュータは、エッジｖ→ｗ１にパス値１が割り当てられているので、エッジｖ→ｗ１上に、パス値として１を加算する命令（ｒ＋＝１）を含む基本ブロック（７２４）を挿入する。挿入基本ブロック（７２４）は、パス値として１を加算する命令（ｒ＋＝１）とともに、後続基本ブロックｗ１へのジャンプ命令（ｊｍｐ  ｗ１）を含む。
【００３０】
同様に、コンピュータは、エッジｖ→ｗ２にパス値２が割り当てられているので、エッジｖ→ｗ２上に、パス値として２を加算する命令（ｒ＋＝２）を含む基本ブロック（７２５）を挿入する。挿入基本ブロック（７２５）は、パス値として２を加算する命令（ｒ＋＝２）とともに、後続基本ブロックｗ２へのジャンプ命令（ｊｍｐ  ｗ２）を含む。
【００３１】
従って、図７Ｃに示す変形された制御フロー・グラフ（７２３）において、インストラメンテーション・コードを挿入することによってジャンプ命令の数が２つ増えることから（ｊｍｐ  ｗ１及びｊｍｐ  ｗ２）（それぞれ、７２４及び７２５）、オーバーヘッドが増加するという問題が生じる。
【００３２】
図７Ｄ（従来技術４）において、変形前の制御フロー・グラフ（７３１）は、先行基本ブロックｖ、当該先行基本ブロックｖの３つの後続基本ブロックである後続基本ブロックｘ（当該後続基本ブロックｘはもう１つの後続基本ブロックｗの先行基本ブロックでもあり、先行基本ブロックｘとも示される）、後続基本ブロックｗ１及びｗ２、並びに、先行基本ブロックｚ（後続基本ブロックｗ２の先行基本ブロックである）及び先行基本ブロックｙ（後続基本ブロックｘの先行基本ブロックである）を有し、先行基本ブロックｖはエッジｖ→ｘで後続基本ブロックｘと、エッジｖ→ｗ１で後続基本ブロックｗ１と且つエッジｖ→ｗ２で後続基本ブロックｗ２とそれぞれ接続されており、先行基本ブロックｙはエッジｙ→ｘで後続基本ブロックｘと接続されており、後続基本ブロックｘはエッジｘ→ｗ１で後続基本ブロックｗ１と接続されており、後続基本ブロックｗ１はエッジｗ１→ｚで先行基本ブロックｚと接続されており、及び先行基本ブロックｚはエッジｚ→ｗ２で後続基本ブロックｗ２と接続されている。
【００３３】
コンピュータは、変形前の制御フロー・グラフ（７３１）において、先行基本ブロックｖと後続基本ブロックｘとの間のエッジｖ→ｘにパス値０を割り当て、先行基本ブロックｖと後続基本ブロックｗ１との間のエッジｖ→ｗ１にパス値１を割り当て、且つ、先行基本ブロックｖと後続基本ブロックｗ２との間のエッジｖ→ｗ２にパス値２を割り当てる。また、コンピュータは、その他のエッジにパス値０を割り当てる。従って、制御フロー・グラフ（７３２）では、エッジｖ→ｘにパス値０が割り当てられており、エッジｖ→ｗ１にパス値１が割り当てられており、且つ、エッジｖ→ｗ２にパス値２が割り当てられている。
【００３４】
次に、コンピュータは、制御フロー・グラフ（７３２）にインストラメンテーション・コードを挿入する操作を行う。
【００３５】
コンピュータは、エッジｖ→ｘにパス値０が割り当てられているので、インストラメンテーション・コードを挿入しない。同様に、コンピュータは、パス値０が割り当てられているその他のエッジについてもインストラメンテーション・コードを挿入しない。
【００３６】
また、コンピュータは、エッジｖ→ｗ１にパス値１が割り当てられているので、エッジｖ→ｗ１上に、パス値として１を加算する命令（ｒ＋＝１）を含む基本ブロック（７３４）を挿入する。挿入基本ブロック（７３４）は、パス値として１を加算する命令（ｒ＋＝１）とともに、後続基本ブロックｗ１へのジャンプ命令（ｊｍｐ  ｗ１）を含む。
【００３７】
同様に、コンピュータは、エッジｖ→ｗ２にパス値２が割り当てられているので、エッジｖ→ｗ２上に、パス値として２を加算する命令（ｒ＋＝２）を含む基本ブロック（７３５）を挿入する。挿入基本ブロック（７３５）は、パス値として２を加算する命令（ｒ＋＝２）とともに、後続基本ブロックｗ２へのジャンプ命令（ｊｍｐ  ｗ２）を含む。
【００３８】
同様に、コンピュータは、エッジｙ→ｘにパス値３が割り当てられているので、エッジｙ→ｘ上に、パス値として３を加算する命令（ｒ＋＝３）を含む基本ブロック（７３６）を挿入する。挿入基本ブロック（７３６）は、パス値として３を加算する命令（ｒ＋＝３）とともに、後続基本ブロックｘへのジャンプ命令（ｊｍｐ  ｘ）を含む。
【００３９】
従って、図７Ｄに示す変形された制御フロー・グラフ（７３３）において、インストラメンテーション・コードを挿入することによってジャンプ命令の数が３つ増えることから（それぞれ、ｊｍｐ  ｗ１、ｊｍｐ  ｗ２及びｊｍｐ  ｘ）、（７２４，７２５及び７３６）オーバーヘッドが増加するという問題が生じる。
【００４０】
以上に示す通り、従来技術に示す方法では、プロファイル情報を収集する為のインストラメンテーション・コードを挿入することによって、ジャンプ命令の数が増加し、オーバーヘッドが増加するという問題が生じている。
【００４１】
非特許文献１に記載の手法では、制御フロー・グラフの始点から終点にかけて通過した実行パスを表す整数値（パス値）を加減算のみで計算するように有向エッジ上にインストラメンテーション・コードを配置する。そして、非特許文献１に記載の手法では、当該インストラメンテーション・コードの配置を制御フロー・グラフの最大コスト・スパンニング木を求め、当該最大コスト・スパンニング木に含まれない有向エッジにインストラメンテーション・コードを挿入することにより最適化する。しかしながら、非特許文献１に記載の手法では、パス値を制御フロー・グラフの終点で毎回メモリに記録するためにオーバーヘッドが大きい。
【００４２】
非特許文献２に記載の手法では、非特許文献１に記載の手法を用いてインストラメンテーション・コードを配置する際に、他の手段で得られる実行頻度情報を用いて、実行頻度の高いエッジ上のインストラメンテーション・コードを削除する。しかしながら、非特許文献２に記載の手法それ自体が実行頻度を求める手法である為に、実行頻度情報が利用不可であるか、又は、実行頻度情報の精度が著しく低い可能性がある。また、非特許文献２に記載の手法では、上記パス値を、毎回メモリに記録せずに、一定時間毎にサンプリングする。従って、非特許文献２に記載の手法では、上記メモリの記録へのオーバーヘッドが大幅に削減された結果、インストラメンテーション・コードによるオーバーヘッドが支配的になり、特に、インストラメンテーション・コードの挿入にジャンプ命令の挿入が伴う場合のオーバーヘッドが顕著となる。
【００４３】
そこで、本発明は、プロファイル情報を収集する為の（例えば、非特許文献１及び２に記載の各手法におけるパス値を計算する為の）インストラメンテーション・コードを挿入する際に必要なジャンプ命令の数を最小化し、上記オーバーヘッドを削減することを目的とする。
【００４４】
非特許文献１及び２は参照によって本明細書に取り込まれる。
【課題を解決するための手段】
【００４５】
本発明は、制御フロー・グラフ上の実行パスの実行頻度情報を得るための技法を提供する。当該技法は、上記実行頻度情報を得るための方法、並びに、当該実行頻度情報を得るためのコンピュータ、コンピュータ・プログラム及びコンピュータ・プログラム製品を包含しうる。
【００４６】
本発明に従う第１の態様において、制御フロー・グラフ上の実行パスの実行頻度情報を得るための方法であって、コンピュータが、
コンパイル対象のソースコードをメモリ内に読み込むステップと、
上記メモリ内に読み込まれたソースコードから制御フロー・グラフを作成するステップであって、
先行となる基本ブロック（先行基本ブロック）ｖの後続となる基本ブロック（後続基本ブロック）ｗに上記先行基本ブロックｖ以外の先行基本ブロックｘが存在し、且つ、上記先行基本ブロックｘのフォールスルー（fallthrough）・パス上に上記後続基本ブロックｗが存在している場合に、上記先行基本ブロックｖと上記後続基本ブロックｗとの間のエッジｖ→ｗにゼロを割り当てて、上記制御フロー・グラフを変形するステップを含む、上記作成するステップと
上記変形するステップにより変形された制御フロー・グラフを用いて、上記実行頻度情報を得るステップと
を実行する。
【００４７】
本発明の一つの実施態様において、上記制御フロー・グラフを変形するステップが、
上記先行基本ブロックｖに対して上記後続基本ブロックｗ以外の後続基本ブロックｗ’が上記先行基本ブロックｖ以外の先行基本ブロックを持たない場合、上記後続基本ブロックｗ’にパス値を加算する命令を挿入するステップ
をさらに含みうる。
【００４８】
本発明の一つの実施態様において、上記制御フロー・グラフを変形するステップが、
上記先行基本ブロックｖに対して上記後続基本ブロックｗ以外の後続基本ブロックｗ’が上記先行基本ブロックｖ以外の先行基本ブロックｙを持つ場合、上記先行基本ブロックｖと上記後続基本ブロックｗ’との間のエッジｖ→ｗ’上に基本ブロックｍを挿入し、当該基本ブロックｍにパス値を加算する命令を挿入するステップと
をさらに含みうる。
【００４９】
本発明の一つの実施態様において、上記制御フロー・グラフを変形するステップが、
上記先行基本ブロックｙのフォールスルー・パス上に上記後続基本ブロックｗ’が存在する場合、上記基本ブロックｍに基本ブロックｗ’へのジャンプ命令を挿入するステップ
をさらに含みうる。
【００５０】
本発明の一つの実施態様において、上記制御フロー・グラフを変形するステップが、
上記先行基本ブロックｖに対して３つ以上の後続基本ブロック｛ｗ１，・・・，ｗｎ｝が存在している場合に、当該３つ以上の後続基本ブロック｛ｗ１，・・・，ｗｎ｝のうち、先行基本ブロックｖの後続基本ブロックに上記先行基本ブロックｖ以外の先行基本ブロックｘが存在し、且つ、上記先行基本ブロックｘのフォールスルー・パス上に後続基本ブロックが存在しているという条件を満たす一つの後続基本ブロックｗｉを取り出して、上記先行基本ブロックｖと取り出された上記後続基本ブロックｗｉとの間のエッジｖ→ｗｉにゼロを割り当てて、上記制御フロー・グラフを変形するステップ
を含みうる。
【００５１】
本発明の一つの実施態様において、上記制御フロー・グラフを変形するステップが、
上記先行基本ブロックｖとゼロを割り当てられた上記後続基本ブロックｗｉ以外の後続基本ブロックｗｊとの間のエッジｖ→ｗｊ上に基本ブロックｎを挿入し、当該基本ブロックｎにパス値を加算する命令を挿入するステップ
をさらに含みうる。
【００５２】
本発明の一つの実施態様において、上記制御フロー・グラフを変形するステップが、
上記後続基本ブロックｗｊが上記先行基本ブロックｖのフォールスルー・パス上に存在せず、且つ、上記後続基本ブロックｗｊに上記先行基本ブロックｖ以外の先行基本ブロックが存在する場合、上記パス値を加算する命令の直後に上記後続基本ブロックｗｊへのジャンプ命令を挿入するステップ
をさらに含みうる。
【００５３】
本発明の一つの実施態様において、上記３つ以上の後続基本ブロック｛ｗ１，・・・，ｗｎ｝のうちの上記条件を満たす上記一つの後続基本ブロックｗｉを取り出すことが、
上記３つ以上の後続基本ブロック｛ｗ１，・・・，ｗｎ｝のうち実行頻度が分かっている後続基本ブロックが一部あることに応じて、実行頻度の高い後続基本ブロックｗｉを取り出すステップ
をさらに含みうる。
【００５４】
本発明に従う第２の態様において、制御フロー・グラフ上の実行パスの実行頻度情報を得るためのコンピュータであって、
コンパイル対象のソースコードを読み込むためのメモリと、
上記メモリ内に読み込まれたソースコードから制御フロー・グラフを作成する制御フロー・グラフ作成手段であって、
先行基本ブロックｖの後続基本ブロックｗに上記先行基本ブロックｖ以外の先行基本ブロックｘが存在し、且つ、上記先行基本ブロックｘのフォールスルー・パス上に上記後続基本ブロックｗが存在している場合に、上記先行基本ブロックｖと上記後続基本ブロックｗとの間のエッジｖ→ｗにゼロを割り当てて、上記制御フロー・グラフを変形する制御フロー・グラフ変形手段をさらに含む、上記制御フロー・グラフ作成手段と
上記制御フロー・グラフ変形手段により変形された制御フロー・グラフを用いて、上記実行頻度情報を得る実行頻度情報取得手段と
を備えている。
【００５５】
本発明の一つの実施態様において、上記制御フロー・グラフ変形手段が、
上記先行基本ブロックｖに対して上記後続基本ブロックｗ以外の後続基本ブロックｗ’が上記先行基本ブロックｖ以外の先行基本ブロックを持たない場合、上記後続基本ブロックｗ’にパス値を加算する命令を挿入しうる。
【００５６】
本発明の一つの実施態様において、上記制御フロー・グラフ変形手段が、
上記先行基本ブロックｖに対して上記後続基本ブロックｗ以外の後続基本ブロックｗ’が上記先行基本ブロックｖ以外の先行基本ブロックｙを持つ場合、上記先行基本ブロックｖと上記後続基本ブロックｗ’との間のエッジｖ→ｗ’上に基本ブロックｍを挿入し、当該基本ブロックｍにパス値を加算する命令を挿入しうる。
【００５７】
本発明の一つの実施態様において、上記制御フロー・グラフ変形手段が、
上記先行基本ブロックｙのフォールスルー・パス上に上記後続基本ブロックｗ’が存在する場合、上記基本ブロックｍに基本ブロックｗ’へのジャンプ命令を挿入しうる。
【００５８】
本発明の一つの実施態様において、上記制御フロー・グラフ変形手段が、
上記先行基本ブロックｖに対して３つ以上の後続基本ブロック｛ｗ１，・・・，ｗｎ｝が存在している場合に、当該３つ以上の後続基本ブロック｛ｗ１，・・・，ｗｎ｝のうち、先行基本ブロックｖの後続基本ブロックに上記先行基本ブロックｖ以外の先行基本ブロックｘが存在し、且つ、上記先行基本ブロックｘのフォールスルー・パス上に後続基本ブロックが存在しているという条件を満たす一つの後続基本ブロックｗｉを取り出して、上記先行基本ブロックｖと取り出された上記後続基本ブロックｗｉとの間のエッジｖ→ｗｉにゼロを割り当てて、上記制御フロー・グラフを変形しうる。
【００５９】
本発明の一つの実施態様において、上記制御フロー・グラフ変形手段が、
上記先行基本ブロックｖとゼロを割り当てられた上記後続基本ブロックｗｉ以外の後続基本ブロックｗｊとの間のエッジｖ→ｗｊにパス値を加算する命令を挿入しうる。
【００６０】
本発明の一つの実施態様において、上記制御フロー・グラフ変形手段が、
上記後続基本ブロックｗｊが上記先行基本ブロックｖのフォールスルー・パス上に存在せず、且つ、上記後続基本ブロックｗｊに上記先行基本ブロックｖ以外の先行基本ブロックが存在する場合、上記パス値を加算する命令の直後に上記後続基本ブロックｗｊへのジャンプ命令を挿入しうる。
【００６１】
本発明の一つの実施態様において、上記３つ以上の後続基本ブロック｛ｗ１，・・・，ｗｎ｝のうちの上記条件を満たす上記一つの後続基本ブロックｗｉを取り出すことが、
上記３つ以上の後続基本ブロック｛ｗ１，・・・，ｗｎ｝のうち実行頻度が分かっている後続基本ブロックが一部あることに応じて、実行頻度の高い後続基本ブロックｗｉを取り出しうる。
【００６２】
本発明に従う第３の態様において、制御フロー・グラフ上の実行パスの実行頻度情報を得るためのコンピュータ・プログラム又はコンピュータ・プログラム製品は、コンピュータに、上記第１の態様に記載の方法の各ステップを実行させる。
【００６３】
本発明の実施態様に従うコンピュータ・プログラムはそれぞれ、一つ又は複数のフレキシブル・ディスク、ＭＯ、ＣＤ−ＲＯＭ、ＤＶＤ、ＢＤ、ハードディスク装置、ＵＳＢに接続可能なメモリ媒体、ＲＯＭ、ＭＲＡＭ、ＲＡＭ等の任意のコンピュータ読み取り可能な記録媒体に格納することができる。当該コンピュータ・プログラムは、上記記録媒体への格納のために、通信回線で接続する他のコンピュータ、例えばサーバ・コンピュータからダウンロードしたり、又は他の記録媒体から複製したりすることができる。また、本発明の実施態様に従うコンピュータ・プログラムは、圧縮し、又は複数に分割して、単一又は複数の記録媒体に格納することもできる。また、様々な形態で、本発明の実施態様に従うコンピュータ・プログラム製品を提供することも勿論可能であることにも留意されたい。本発明の実施態様に従うコンピュータ・プログラム製品は、例えば、上記コンピュータ・プログラムを記録した記憶媒体、又は、上記コンピュータ・プログラムを伝送する伝送媒体を包含しうる。
【００６４】
本発明の上記概要は、本発明の必要な特徴の全てを列挙したものではなく、これらの構成要素のコンビネーション又はサブコンビネーションもまた、本発明となりうることに留意すべきである。
【００６５】
本発明の実施態様において使用されるコンピュータの各ハードウェア構成要素を、複数のマシンと組み合わせ、それらに機能を配分し実施する等の種々の変更は当業者によって容易に想定され得ることは勿論である。それらの変更は、当然に本発明の思想に包含される概念である。ただし、これらの構成要素は例示であり、そのすべての構成要素が本発明の必須構成要素となるわけではない。
【００６６】
また、本発明は、ハードウェア、ソフトウェア、又は、ハードウェア及びソフトウェアの組み合わせとして実現可能である。ハードウェアとソフトウェアとの組み合わせによる実行において、上記コンピュータ・プログラムのインストールされたコンピュータにおける実行が典型的な例として挙げられる。かかる場合、当該コンピュータ・プログラムが当該コンピュータのメモリにロードされて実行されることにより、当該コンピュータ・プログラムは、当該コンピュータを制御し、本発明にかかる処理を実行させる。当該コンピュータ・プログラムは、任意の言語、コード、又は、表記によって表現可能な命令群から構成されうる。そのような命令群は、当該コンピュータが特定の機能を直接的に、又は、１．他の言語、コード若しくは表記への変換及び、２．他の媒体への複製、のいずれか一方若しくは双方が行われた後に、本発明の実施態様に従う処理を実行することを可能にするものである。
【発明の効果】
【００６７】
本発明の実施態様に従うと、上記インストラメンテーション・コードを挿入する際に必要なジャンプ命令の数を削減することが可能となり、従ってオーバーヘッドが削減される。
【図面の簡単な説明】
【００６８】
【図１】本発明の実施態様において使用されうるコンピュータの一例を示した図である。
【図２Ａ】本発明の実施態様に従い、図２Ａに示す変形前の制御フロー・グラフにおいて、先行基本ブロックｖと後続基本ブロックｗとの間のエッジｖ→ｗにパス値ゼロを割り当て、後続基本ブロックｘにパス値を加算する命令を挿入している模式図を示す。
【図２Ｂ】本発明の実施態様に従い、図２Ｂに示す変形前の制御フロー・グラフにおいて、先行基本ブロックｖと後続基本ブロックｗとの間のエッジｖ→ｗにパス値ゼロを割り当て、先行基本ブロックｖと後続基本ブロックｘとの間のエッジｖ→ｘ上に、パス値を加算する命令を含む基本ブロックｆを挿入している模式図を示す。
【図２Ｃ】本発明の実施態様に従い、図２Ｃに示す変形前の制御フロー・グラフにおいて、先行基本ブロックｖと後続基本ブロックｗ１との間のエッジｖ→ｗ１にパス値ゼロを割り当て、後続基本ブロックｘにパス値を加算する命令を挿入する模式図を示す。
【図２Ｄ】本発明の実施態様に従い、図２Ｄに示す変形前の制御フロー・グラフにおいて、先行基本ブロックｖと後続基本ブロックｗ１との間のエッジｖ→ｗ１にパス値ゼロを割り当て、先行基本ブロックｖと後続基本ブロックｘとの間のエッジｖ→ｘ上に、パス値を加算する命令を含む基本ブロックｑを挿入している模式図を示す。
【図３Ａ】本発明の実施態様に従い、制御フロー・グラフ上の実行パスの実行頻度情報を得る処理の為のフローチャートを示す。
【図３Ｂ】本発明の実施態様に従い、制御フロー・グラフを変形する処理の為のフローチャートを示す。
【図３Ｃ】本発明の実施態様に従い、制御フロー・グラフを変形する処理において、エッジに値を割り当てる処理の為のフローチャートを示す。
【図４】本発明の実施態様に従い、制御フロー・グラフを変形する処理において、新たな基本ブロックの挿入が必要なエッジに値を割り当てる処理を実行する為のアルゴリズムの一例を示す。
【図５】従来技術の手法を実行可能にするアルゴリズムをコンパイラに実装したプログラムと本発明の実施態様を実行可能にするアルゴリズムをコンパイラに実装したプログラムとのスループットとの対比結果を示す。
【図６】図１に従うハードウェア構成を好ましくは備えており、本発明の実施態様に従い上記制御フロー・グラフ上の実行パスの実行頻度情報を得るコンピュータの機能ブロック図の一例を示した図である。
【図７Ａ】従来技術に従い、図７Ａに示す変形前の制御フロー・グラフにおいて、先行基本ブロックｖと後続基本ブロックｗとの間のエッジｖ→ｗに１を割り当て、インストラメンテーション・コードを挿入している模式図を示す。
【図７Ｂ】従来技術に従い、図７Ｂに示す変形前の制御フロー・グラフにおいて、先行基本ブロックｖと後続基本ブロックｗとの間のエッジｖ→ｗに１を割り当て、インストラメンテーション・コードを挿入している模式図を示す。
【図７Ｃ】従来技術に従い、図７Ｃに示す変形前の制御フロー・グラフにおいて、先行基本ブロックｖと後続基本ブロックｗ１との間のエッジｖ→ｗ１に１を割り当て、インストラメンテーション・コードを挿入している模式図を示す。
【図７Ｄ】従来技術に従い、図７Ｄに示す変形前の制御フロー・グラフにおいて、先行基本ブロックｖと後続基本ブロックｗ１との間のエッジｖ→ｗ１に１を割り当て、インストラメンテーション・コードを挿入している模式図を示す。
【発明を実施するための形態】
【００６９】
本発明の実施形態を、以下に図面に従って説明する。以下の図を通して、特に断らない限り、同一の符号は同一の対象を指す。本発明の実施形態は、本発明の好適な態様を説明するためのものであり、本発明の範囲をここで示すものに限定する意図はないことを理解されたい。
【００７０】
本発明の実施態様において使用されうるコンピュータは、制御フロー・グラフ上の実行パスの実行頻度情報を得ることができるコンピュータであれば特に限定されない。当該コンピュータは例えば、例えば、デスクトップ・コンピュータ、ノート・コンピュータ若しくは一体型パソコン、又は、タブレット端末若しくはスマートフォン（例えば、Ｗｉｎｄｏｗｓ（登録商標）、アンドロイド（登録商標）又はｉＯＳを搭載したタブレット端末若しくスマートフォン）でありうる。
【００７１】
図１は、本発明の実施態様において使用されうるコンピュータの一例を示した図である。
【００７２】
コンピュータ（１０１）は、ＣＰＵ（１０２）とメイン・メモリ（１０３）とを備えており、これらはバス（１０４）に接続されている。ＣＰＵ（１０２）は好ましくは、３２ビット又は６４ビットのアーキテクチャに基づくものである。当該ＣＰＵ（１０２）は例えば、インテル社のＣｏｒｅ（商標）  ｉシリーズ、Ｃｏｒｅ（商標）  ２シリーズ、Ａｔｏｍ（商標）シリーズ、Ｘｅｏｎ（登録商標）シリーズ、Ｐｅｎｔｉｕｍ（登録商標）シリーズ若しくはＣｅｌｅｒｏｎ（登録商標）シリーズ、ＡＭＤ（Advanced Micro Devices）社のＡシリーズ、Ｐｈｅｎｏｍ（商標）シリーズ、Ａｔｈｌｏｎ（商標）シリーズ、Ｔｕｒｉｏｎ（登録商標）シリーズ若しくはＳｅｍｐｒｏｎ（商標）、又は、インターナショナル・ビジネス・マシーンズ・コーポレーションのＰｏｗｅｒ（商標）シリーズでありうる。
【００７３】
バス（１０４）には、ディスプレイ・コントローラ（１０５）を介して、ディスプレイ（１０６）、例えば液晶ディスプレイ（ＬＣＤ）が接続されうる。また、液晶ディスプレイ（ＬＣＤ）は例えば、タッチパネル・ディスプレイ又はフローティング・タッチ・ディスプレイであてもよい。ディスプレイ（１０６）は、コンピュータ（１０１）上で動作中のソフトウェア（例えば、本発明の実施態様に従うコンピュータ・プログラム又は当該コンピュータ（１０１）上で動作中の各種コンピュータ・プログラム）が稼働することによって表示されるオブジェクトを、適当なグラフィック・インタフェースで表示するために使用されうる。また、ディスプレイ（１０６）は、本発明の実施態様により変形された制御フロー・グラフ上の実行パスの実行頻度情報を出力しうる。実行頻度情報は例えば、例えばマシンコードでいうブランチ命令において当該ブランチがテイクン（taken）したのが何回か、テイクンされなかったのが何回かという情報である。
【００７４】
バス（１０４）には任意的に、例えばＳＡＴＡ又はＩＤＥコントローラ（１０７）を介して、ディスク（１０８）、例えばハードディスク又はソリッド・ステート・ドライブ（ＳＳＤ）が接続されうる。
【００７５】
バス（１０４）には任意的に、例えばＳＡＴＡ又はＩＤＥコントローラ（１０７）を介して、ドライブ（１０９）、例えばＣＤ、ＤＶＤ又はＢＤドライブが接続されうる。
【００７６】
バス（１０４）には、周辺装置コントローラ（１１０）を介して、例えばキーボード・マウス・コントローラ又はＵＳＢバスを介して、任意的に、キーボード（１１１）及びマウス（１１２）が接続されうる。
【００７７】
ディスク（１０８）には、オペレーティング・システム、例えばＷｉｎｄｏｗｓ（登録商標）、ＵＮＩＸ（登録商標）、ＭａｃＯＳ（登録商標）、及びＪ２ＥＥなどのＪａｖａ（登録商標）処理環境、Ｊａｖａ（登録商標）アプリケーション、Ｊａｖａ（登録商標）仮想マシン（ＶＭ）、Ｊａｖａ（登録商標）実行時（ＪＩＴ）コンパイラを提供するプログラム、本発明の実施態様に従うコンピュータ・プログラム、及びその他のプログラム、並びにデータが、メイン・メモリ（１０３）にロード可能なように記憶されうる。
【００７８】
ディスク（１０８）は、コンピュータ（１０１）内に内蔵されていてもよく、当該コンピュータ（１０１）がアクセス可能なようにケーブルを介して接続されていてもよく、又は、当該コンピュータ（１０１）がアクセス可能なように有線又は無線ネットワークを介して接続されていてもよい。
【００７９】
ドライブ（１０９）は、必要に応じて、ＣＤ−ＲＯＭ、ＤＶＤ−ＲＯＭ又はＢＤからプログラム、例えばオペレーティング・システム、アプリケーション又は本発明の実施態様に従うコンピュータ・プログラムをディスク（１０８）にインストールするために使用されうる。
【００８０】
通信インタフェース（１１４）は、例えばイーサネット（登録商標）・プロトコルに従う。通信インタフェース（１１４）は、通信コントローラ（１１３）を介してバス（１０４）に接続され、コンピュータ（１０１）を通信回線（１１５）に有線又は無線接続する役割を担い、コンピュータ（１０１）のオペレーティング・システムの通信機能のＴＣＰ／ＩＰ通信プロトコルに対して、ネットワーク・インタフェース層を提供する。なお、通信回線は例えば、無線ＬＡＮ接続規格に基づく無線ＬＡＮ環境、ＩＥＥＥ８０２．１１ａ／ｂ／ｇ／ｎなどのＷｉ−Ｆｉ無線ＬＡＮ環境、又は携帯電話網環境（例えば、３Ｇ又は４Ｇ環境）でありうる。
【００８１】
下記図２Ａ（実施例１）、下記図２Ｂ（実施例２）、下記図２Ｃ（実施例３）及び下記図２Ｄ（実施例４）は、先行基本ブロックｖの後続基本ブロックｗに先行基本ブロックｖ以外の先行基本ブロックｘが存在し、且つ、先行基本ブロックｘのフォールスルー・パス上に後続基本ブロックｗが存在している場合に、先行基本ブロックｖと後続基本ブロックｗとの間のエッジｖ→ｗにゼロを割り当てて、制御フロー・グラフを変形する種々の態様を示す。上記エッジｖ→ｗにゼロが割り当てられている場合には、当該エッジｖ→ｗにパス値を加算する命令が付加されない。
【００８２】
制御フロー・グラフを変形する上記種々の態様は例えば、下記に示す３つの態様に大きく分けられうる：
（１）先行基本ブロックｖに対して後続基本ブロックｗ以外の後続基本ブロックｗ’が先行基本ブロックｖ以外の先行基本ブロックを持たない場合、後続基本ブロックｗ’にパス値を加算する命令を挿入する；
（２）先行基本ブロックｖに対して後続基本ブロックｗ以外の後続基本ブロックｗ’が先行基本ブロックｖ以外の先行基本ブロックｙを持つ場合、先行基本ブロックｖと後続基本ブロックｗ’との間のエッジｖ→ｗ’上に基本ブロックｍを挿入し、当該基本ブロックｍにパス値を加算する命令を挿入する；及び、
（３）先行基本ブロックｖに対して３つ以上の後続基本ブロック｛ｗ１，・・・，ｗｎ｝が存在している場合に、当該３つ以上の後続基本ブロック｛ｗ１，・・・，ｗｎ｝のうち、上記先行基本ブロックｖの後続基本ブロックに先行基本ブロックｖ以外の先行基本ブロックｘが存在し、且つ、先行基本ブロックｘのフォールスルー・パス上に後続基本ブロックが存在しているという条件を満たす一つの後続基本ブロックｗｉを取り出して、先行基本ブロックｖと取り出された上記後続基本ブロックｗｉとの間のエッジｖ→ｗｉにゼロを割り当てる。
【００８３】
上記（１）の態様は、先行基本ブロックｖに対して後続基本ブロックｗ以外の後続基本ブロックｗ’が先行基本ブロックｖ以外の先行基本ブロックを持たない場合、後続基本ブロックｗ’にパス値を加算する命令を挿入する態様である。当該（１）の態様は、下記実施例１において、先行基本ブロックｖに対して後続基本ブロックｘ（当該後続基本ブロックｘはもう１つの後続基本ブロックｗの先行基本ブロックでもあり、当該後続基本ブロックｘは上記後続基本ブロックｗ’に対応する）が先行基本ブロックｖ以外の先行基本ブロックを持たないので、後続基本ブロックｘ（上記後続基本ブロックｗ’に対応する）にパス値を加算する命令を挿入する態様に対応する。同様に、当該（１）の態様は、下記実施例３において、先行基本ブロックｖに対して後続基本ブロックｘ（当該後続基本ブロックｘはもう１つの後続基本ブロックｗ１の先行基本ブロックでもあり、当該後続基本ブロックｘは上記後続基本ブロックｗ’に対応する）が先行基本ブロックｖ以外の先行基本ブロックを持たないので、後続基本ブロックｘ（上記後続基本ブロックｗ’に対応する）にパス値を加算する命令を挿入する態様に対応する。
【００８４】
上記（２）の態様は、先行基本ブロックｖに対して後続基本ブロックｗ以外の後続基本ブロックｗ’が先行基本ブロックｖ以外の先行基本ブロックｙを持つ場合、先行基本ブロックｖと後続基本ブロックｗ’との間のエッジｖ→ｗ’上に基本ブロックｍを挿入し、当該基本ブロックｍにパス値を加算する命令を挿入する態様である。当該（２）の態様は、下記実施例２において、先行基本ブロックｖに対して後続基本ブロックｘ（当該後続基本ブロックｘはもう１つの後続基本ブロックｗの先行基本ブロックでもあり、当該後続基本ブロックｘは上記後続基本ブロックｗ’に対応する）が先行基本ブロックｖ以外の先行基本ブロックｙを持つので、上記先行基本ブロックｖと上記後続基本ブロックｘ（上記後続基本ブロックｗ’に対応する）との間のエッジｖ→ｘ（上記エッジｖ→ｗ’に対応する）上に基本ブロックｆ（上記基本ブロックｍに対応する）を挿入し、当該基本ブロックｆにパス値を加算する命令を挿入する態様に対応する。同様に、当該（２）の態様は、下記実施例３において、先行基本ブロックｖに対して後続基本ブロックｗ２が先行基本ブロックｖ以外の先行基本ブロックｙを持つので、上記先行基本ブロックｖと上記先行基本ブロックｗ２との間のエッジｖ→ｗ２上に基本ブロックｐ（上記基本ブロックｍに対応する）を挿入し、当該基本ブロックｐにパス値を加算する命令を挿入する態様に対応する。同様に、当該（２）の態様は、下記実施例４において、先行基本ブロックｖに対して後続基本ブロックｘ（当該後続基本ブロックｘはもう１つの後続基本ブロックｗ１の先行基本ブロックでもあり、当該後続基本ブロックｘは上記後続基本ブロックｗ’に対応する）が先行基本ブロックｖ以外の先行基本ブロックｙを持つので、上記先行基本ブロックｖと上記後続基本ブロックｘ（上記後続基本ブロックｗ’に対応する）との間のエッジｖ→ｘ（上記エッジｖ→ｗ’に対応する）上に基本ブロックｑ（上記基本ブロックｍに対応する）を挿入し、当該基本ブロックｑにパス値を加算する命令を挿入する態様、並びに、先行基本ブロックｖに対して後続基本ブロックｗ２が先行基本ブロックｖ以外の先行基本ブロックｙを持つので、上記先行基本ブロックｖと上記後続基本ブロックｗ２との間のエッジｖ→ｗ２上に基本ブロックｒ（上記基本ブロックｍに対応する）を挿入し、当該基本ブロックｒにパス値を加算する命令を挿入する態様に対応する。
【００８５】
上記（３）の態様は、先行基本ブロックｖに対して３つ以上の後続基本ブロック｛ｗ１，・・・，ｗｎ｝が存在している場合に、当該３つ以上の後続基本ブロック｛ｗ１，・・・，ｗｎ｝のうち、上記先行基本ブロックｖの後続基本ブロックに先行基本ブロックｖ以外の先行基本ブロックｘが存在し、且つ、先行基本ブロックｘのフォールスルー・パス上に後続基本ブロックが存在しているという条件を満たす一つの後続基本ブロックｗｉを取り出して、先行基本ブロックｖと取り出された上記後続基本ブロックｗｉとの間のエッジｖ→ｗｉにゼロを割り当てる態様である。当該（３）の態様は、下記実施例３において、先行基本ブロックｖに対して３つの後続基本ブロック｛ｘ，ｗ１，ｗ２｝が存在しているので、当該３つの基本ブロック｛ｘ，ｗ１，ｗ２｝のうち、上記先行基本ブロックｖの後続に先行基本ブロックｖ以外の先行基本ブロックｘ（当該先行基本ブロックｘは先行基本ブロックｖの後続基本ブロックでもあるので、当該先行基本ブロックｘは上記後続基本ブロックｘでもある）が存在し、且つ、当該先行基本ブロックｘのフォールスルー・パス上に後続基本ブロックが存在しているという条件を満たす一つの後続基本ブロックｗ１を取り出して、先行基本ブロックｖと上記取り出された後続基本ブロックｗ１との間のエッジｖ→ｗ１にゼロを割り当てる態様である。同様に、当該（３）の態様は、下記実施例４において、先行基本ブロックｖに対して３つの後続基本ブロック｛ｘ，ｗ１，ｗ２｝が存在しているので、当該３つの基本ブロック｛ｘ，ｗ１，ｗ２｝のうち、上記先行基本ブロックｖの後続に先行基本ブロックｖ以外の先行基本ブロックｘ（当該先行基本ブロックｘは先行基本ブロックｖの後続基本ブロックでもあるので、当該先行基本ブロックｘは上記後続基本ブロックｘでもある）が存在し、且つ、当該先行基本ブロックｘのフォールスルー・パス上に後続基本ブロックが存在しているという条件を満たす一つの後続基本ブロックｗ１を取り出して、先行基本ブロックｖと上記取り出された後続基本ブロックｗ１との間のエッジｖ→ｗ１にゼロを割り当てる態様である。
【００８６】
図２Ａ〜図２Ｄそれぞれは、本発明の実施態様に従い、図２Ａ〜図２Ｄそれぞれに示す変形前の制御フロー・グラフ（２０１，２１１，２２１及び２３１）において、先行基本ブロックｖと後続基本ブロックｗ又はｗ１との間のエッジに０を割り当て、そしてインストラメンテーション・コードを挿入している模式図を示す。以下に、本発明の実施態様に従い、図２Ａ〜図２Ｄそれぞれに示す制御フロー・グラフ（２０１，２１１，２２１及び２３１）がインストラメンテーション・コードの挿入により、どのように変形されるのかを説明する。
【００８７】
図２Ａ（実施例１）において、変形前の制御フロー・グラフ（２０１）は、図７Ａに示す制御フロー・グラフ（７０１）と同じである。従って、変形前の制御フロー・グラフ（２０１）についての説明は、図７Ａに示す制御フロー・グラフ（７０１）についての説明を参照されたい。
【００８８】
コンピュータ（１０１）は、変形前の制御フロー・グラフ（２０１）について、先行基本ブロックｖの後続基本ブロックｗに先行基本ブロックｖ以外の先行基本ブロックｘが存在し、且つ、当該先行基本ブロックｘのフォールスルー・パス上に上記後続基本ブロックｗが存在していると判断する。フォールスルー・パスとは、ブランチで飛んで行く先でなく、ブランチ不成立又はブランチ無しで遷移するパスをいう。従って、コンピュータ（１０１）は、変形前の制御フロー・グラフ（２０１）において、先行基本ブロックｖと後続基本ブロックｗとの間のエッジｖ→ｗにパス値０を割り当てる。また、コンピュータ（１０１）は、先行基本ブロックｖと後続基本ブロックｘ（当該後続基本ブロックｘはもう１つの後続基本ブロックｗの先行基本ブロックでもあり、上記先行基本ブロックｘとも示される）との間のエッジｖ→ｘにパス値１を割り当てる。また、コンピュータは、その他のエッジにパス値０を割り当てる。従って、制御フロー・グラフ（２０２）では、エッジｖ→ｗにパス値０が割り当てられており、且つ、エッジｖ→ｘにパス値１が割り当てられている。
【００８９】
次に、コンピュータ（１０１）は、制御フロー・グラフ（２０２）にインストラメンテーション・コードを挿入する操作を行う。
【００９０】
コンピュータ（１０１）は、先行基本ブロックｖと後続基本ブロックｗとの間のエッジｖ→ｗにパス値０が割り当てられている（すなわち、エッジｖ→ｗの加減算する値が０である）ことから、当該エッジｖ→ｗ上にインストラメンテーション・コードを挿入することが不要であると判断する。また、コンピュータ（１０１）は、エッジｖ→ｗ上に基本ブロックを挿入することも不要であると判断する。同様に、コンピュータ（１０１）は、パス値０が割り当てられているその他のエッジについてもインストラメンテーション・コードを挿入することが不要であると判断する。
【００９１】
また、コンピュータ（１０１）は、エッジｖ→ｘにパス値１が割り当てられていることから、後続基本ブロックｘの例えば先頭に、パス値を加算する命令（ｒ＋＝１）を挿入する。なお、コンピュータ（１０１）は、当該後続基本ブロックｘにジャンプ命令は不要であるために挿入しない。
【００９２】
以上に示す通り、当該実施例１では、コンピュータ（１０１）は、先行基本ブロックｖに対して後続基本ブロックｘ（当該後続基本ブロックｘはもう１つの後続基本ブロックｗの先行基本ブロックでもあり、当該後続基本ブロックｘは上記後続基本ブロックｗ’に対応する）が先行基本ブロックｖ以外の先行基本ブロックを持たないので、当該後続基本ブロックｘ（上記後続基本ブロックｗ’に対応する）にパス値を加算する命令を挿入する。
【００９３】
従って、図２Ａに示す変形された制御フロー・グラフ（２０３）において、インストラメンテーション・コードを挿入することによってジャンプ命令の数が増えていない。一方、図７Ａに示す変形された制御フロー・グラフ（７０３）において、インストラメンテーション・コードを挿入することによってジャンプ命令の数が１つ増える（ｊｍｐ  ｗ）（７０４）。従って、制御フロー・グラフ（２０１）を本願発明の実施態様に従う制御フロー・グラフ（２０３）に変形することによって、図７Ａに示す従来技術１による手法と比べてジャンプ命令の数を減らす（１から０）ことが可能となり、従ってオーバーヘッドが削減される。
【００９４】
図２Ｂ（実施例２）において、変形前の制御フロー・グラフ（２１１）は、図７Ｂに示す制御フロー・グラフ（７１１）と同じである。従って、変形前の制御フロー・グラフ（２１１）についての説明は、図７Ｂに示す制御フロー・グラフ（７１１）についての説明を参照されたい。
【００９５】
コンピュータ（１０１）は、変形前の制御フロー・グラフ（２１１）について、先行基本ブロックｖの後続基本ブロックｗに先行基本ブロックｖ以外の先行基本ブロックｘが存在し、且つ、当該先行基本ブロックｘのフォールスルー・パス上に上記後続基本ブロックｗが存在していると判断する。従って、コンピュータ（１０１）は、変形前の制御フロー・グラフ（２１１）において、先行基本ブロックｖと後続基本ブロックｗとの間のエッジｖ→ｗにパス値０を割り当てる。また、コンピュータ（１０１）は、先行基本ブロックｙが後続基本ブロックｘ（当該後続基本ブロックｘはもう１つの後続基本ブロックｗの先行基本ブロックでもあり、上記先行基本ブロックｘとも示される）に先行して存在することから、先行基本ブロックｖと後続基本ブロックｘとの間のエッジｖ→ｘにパス値１を割り当て、且つ、先行基本ブロックｙと後続基本ブロックｘとの間のエッジｙ→ｘにパス値２を割り当てる。また、コンピュータは、その他のエッジにパス値０を割り当てる。従って、制御フロー・グラフ（２１２）では、エッジｖ→ｗにパス値０が割り当てられており、エッジｖ→ｘにパス値１が割り当てられており、且つ、エッジｙ→ｘにパス値２が割り当てられている。
【００９６】
次に、コンピュータ（１０１）は、制御フロー・グラフ（２１２）にインストラメンテーション・コードを挿入する操作を行う。
【００９７】
コンピュータ（１０１）は、先行基本ブロックｖと後続基本ブロックｗとの間のエッジｖ→ｗにパス値０が割り当てられている（すなわち、エッジｖ→ｗの加減算する値が０である）ことから、当該エッジｖ→ｗ上にインストラメンテーション・コードを挿入することが不要であると判断する。また、コンピュータ（１０１）は、当該エッジｖ→ｗ上に基本ブロックを挿入することも不要であると判断する。同様に、コンピュータ（１０１）は、パス値０が割り当てられているその他のエッジについてもインストラメンテーション・コードを挿入することが不要であると判断する。
【００９８】
また、コンピュータ（１０１）は、先行基本ブロックｖと後続基本ブロックｘとの間のエッジｖ→ｘにパス値１が割り当てられており且つ先行基本ブロックｙが後続基本ブロックｘに先行して存在することから、当該エッジｖ→ｘ上に、パス値を加算する命令（ｒ＋＝１）を含む基本ブロックｆ（２１４）を挿入する。なお、コンピュータ（１０１）は、挿入基本ブロックｆ（２１４）にジャンプ命令は不要であるために挿入しない。すなわち、挿入基本ブロックｆ（２１４）は、ジャンプ命令を含まない。
【００９９】
同様に、コンピュータ（１０１）は、先行基本ブロックｙと後続基本ブロックｘとの間のエッジｙ→ｘにパス値２が割り当てられていることから、当該エッジｙ→ｘ上に、パス値を加算する命令（ｒ＋＝２）を含む基本ブロックｇ（２１５）を挿入する。挿入基本ブロックｇ（２１５）は、パス値を加算する命令（ｒ＋＝２）とともに、後続基本ブロックｘへのジャンプ命令（ｊｍｐ  ｘ）を含む。
【０１００】
以上に示す通り、当該実施例２では、コンピュータ（１０１）は、先行基本ブロックｖに対して後続基本ブロックｘ（当該後続基本ブロックｘはもう１つの後続基本ブロックｗの先行基本ブロックでもあり、当該後続基本ブロックｘは上記後続基本ブロックｗ’に対応する）が先行基本ブロックｖ以外の先行基本ブロックｙを持つので、上記先行基本ブロックｖと上記後続基本ブロックｘ（上記後続基本ブロックｗ’に対応する）との間のエッジｖ→ｘ（上記エッジｖ→ｗ’に対応する）上に基本ブロックｆ（上記基本ブロックｍに対応する）を挿入し、当該基本ブロックｆにパス値を加算する命令を挿入する。
【０１０１】
従って、図２Ｂに示す変形された制御フロー・グラフ（２１３）において、インストラメンテーション・コードを挿入することによってジャンプ命令の数が１つ増える（ｊｍｐ  ｘ）（２１５）。一方、図７Ｂに示す変形された制御フロー・グラフ（７１３）において、インストラメンテーション・コードを挿入することによってジャンプ命令の数が２つ増える（ｊｍｐ  ｗ及びｊｍｐ  ｘ）（それぞれ、７１４及び７１５）。従って、制御フロー・グラフ（２１１）を本願発明の実施態様に従う制御フロー・グラフ（２１３）に変形することによって、図７Ｂに示す従来技術２による手法と比べてジャンプ命令の数を１つ減らす（２から１）ことが可能となり、従ってオーバーヘッドが削減される。
【０１０２】
図２Ｃ（実施例３）において、変形前の制御フロー・グラフ（２２１）は、図７Ｃに示す制御フロー・グラフ（７２１）と同じである。従って、変形前の制御フロー・グラフ（２２１）についての説明は、図７Ｃに示す制御フロー・グラフ（７２１）についての説明を参照されたい。
【０１０３】
コンピュータ（１０１）は、変形前の制御フロー・グラフ（２２１）について、先行基本ブロックｖの後続基本ブロックｗ１に先行基本ブロックｖ以外の先行基本ブロックｘが存在し、且つ、当該先行基本ブロックｘのフォールスルー・パス上に上記後続基本ブロックｗ１が存在していると判断する。従って、コンピュータ（１０１）は、変形前の制御フロー・グラフ（２２１）において、先行基本ブロックｖと後続基本ブロックｗ１との間のエッジｖ→ｗ１にパス値０を割り当てる。また、コンピュータ（１０１）は、先行基本ブロックｖと後続基本ブロックｘ（当該後続基本ブロックｘはもう１つの後続基本ブロックｗの先行基本ブロックでもあり、上記先行基本ブロックｘとも示される）との間のエッジｖ→ｘにパス値１を割り当て、且つ、先行基本ブロックｖと後続基本ブロックｗ２との間のエッジｖ→ｗ２にパス値２を割り当てる。また、コンピュータは、その他のエッジにパス値０を割り当てる。従って、制御フロー・グラフ（２２２）では、エッジｖ→ｗ１にパス値０が割り当てられており、エッジｖ→ｘにパス値１が割り当てられており、且つ、エッジｖ→ｗ２にパス値２が割り当てられている。
【０１０４】
次に、コンピュータ（１０１）は、制御フロー・グラフ（２２２）にインストラメンテーション・コードを挿入する操作を行う。
【０１０５】
コンピュータ（１０１）は、先行基本ブロックｖと後続基本ブロックｗ１との間のエッジｖ→ｗ１にパス値０が割り当てられている（すなわち、エッジｖ→ｗ１の加減算する値が０である）ことから、当該エッジｖ→ｗ１上にインストラメンテーション・コードを挿入することが不要であると判断する。また、コンピュータ（１０１）は、上記エッジｖ→ｗ１上に基本ブロックを挿入することも不要であると判断する。同様に、コンピュータ（１０１）は、パス値０が割り当てられているその他のエッジについてもインストラメンテーション・コードを挿入することが不要であると判断する。
【０１０６】
また、コンピュータ（１０１）は、先行基本ブロックｖと後続基本ブロックｘとの間のエッジｖ→ｘにパス値１が割り当てられていることから、後続基本ブロックｘの例えば先頭に、パス値を加算する命令（ｒ＋＝１）を挿入する。
【０１０７】
同様に、コンピュータ（１０１）は、先行基本ブロックｖと後続基本ブロックｗ２との間のエッジｖ→ｗ２にパス値２が割り当てられていることから、当該エッジｖ→ｗ２上に、パス値を加算する命令（ｒ＋＝２）を含む基本ブロックｐ（２２５）を挿入する。挿入基本ブロックｐ（２２５）は、パス値を加算する命令（ｒ＋＝２）とともに、後続基本ブロックｗ２へのジャンプ命令（ｊｍｐ  ｗ２）を含む。
【０１０８】
以上に示す通り、当該実施例３では、コンピュータ（１０１）は、先行基本ブロックｖに対して後続基本ブロックｘ（当該後続基本ブロックｘはもう１つの後続基本ブロックｗ１の先行基本ブロックでもあり、当該後続基本ブロックｘは上記後続基本ブロックｗ’に対応する）が先行基本ブロックｖ以外の先行基本ブロックを持たないので、後続基本ブロックｘ（上記後続基本ブロックｗ’に対応する）にパス値を加算する命令を挿入する。
【０１０９】
また、当該実施例３では、コンピュータ（１０１）は、先行基本ブロックｖに対して後続基本ブロックｗ２が先行基本ブロックｖ以外の先行基本ブロックｙを持つので、上記先行基本ブロックｖと上記先行基本ブロックｗ２との間のエッジｖ→ｗ２上に基本ブロックｐ（上記基本ブロックｍに対応する）を挿入し、当該基本ブロックｐにパス値を加算する命令を挿入する。
【０１１０】
また、当該実施例３では、コンピュータ（１０１）は、先行基本ブロックｙのフォールスルー・パス上に先行基本ブロックｗ２（上記後続基本ブロックｗ’に対応する）が存在するので、上記基本ブロックｐ（上記基本ブロックｍに対応する）に基本ブロックｗ２へのジャンプ命令を挿入する。
【０１１１】
また、当該実施例３では、コンピュータ（１０１）は、先行基本ブロックｖに対して３つの後続基本ブロック｛ｘ，ｗ１，ｗ２｝が存在しているので、当該３つの基本ブロック｛ｘ，ｗ１，ｗ２｝のうち、上記先行基本ブロックｖの後続に先行基本ブロックｖ以外の先行基本ブロックｘ（当該先行基本ブロックｘは先行基本ブロックｖの後続基本ブロックでもあるので、当該先行基本ブロックｘは上記後続基本ブロックｘでもある）が存在し、且つ、当該先行基本ブロックｘのフォールスルー・パス上に後続基本ブロックが存在しているという条件を満たす一つの後続基本ブロックｗ１を取り出して、先行基本ブロックｖと上記取り出された後続基本ブロックｗ１との間のエッジｖ→ｗ１にゼロを割り当てる。
【０１１２】
また、当該実施例３では、コンピュータ（１０１）は、先行基本ブロックｖと、上記ゼロを割り当てられた後続基本ブロックｗ１以外の後続基本ブロックｗ２との間のエッジｖ→ｗ２上に基本ブロックｐ（上記基本ブロックｎに対応する）を挿入し、当該基本ブロックｐにパス値を加算する命令を挿入する。
【０１１３】
また、当該実施例３では、コンピュータ（１０１）は、後続基本ブロックｗ２が先行基本ブロックｖのフォールスルー・パス上に存在せず、且つ、当該後続基本ブロックｗ２に先行基本ブロックｖ以外の先行基本ブロックｙが存在するので、上記基本ブロックｐ（上記基本ブロックｎに対応する）のパス値を加算する命令の直後に後続基本ブロックｗ２へのジャンプ命令を挿入する。
【０１１４】
従って、図２Ｃに示す変形された制御フロー・グラフ（２２３）において、インストラメンテーション・コードを挿入することによってジャンプ命令の数が１つ増える（ｊｍｐ  ｗ２）（２２５）。一方、図７Ｃに示す変形された制御フロー・グラフ（７２３）において、インストラメンテーション・コードを挿入することによってジャンプ命令の数が２つ増える（ｊｍｐ  ｗ１及びｊｍｐ  ｗ２）（それぞれ、７２４及び７２５）。従って、制御フロー・グラフ（２２１）を本願発明の実施態様に従う制御フロー・グラフ（２２３）に変形することによって、図７Ｃに示す従来技術３による手法と比べてジャンプ命令の数を１つ減らす（２から１）ことが可能となり、従ってオーバーヘッドが削減される。
【０１１５】
上記図２Ｃに示す例において、先行基本ブロックｖと後続基本ブロックｗ１との間のエッジｖ→ｗ１にパス値０を割り当てる例を示した。すなわち、先行基本ブロックｖに対して３つの後続基本ブロック｛ｘ，ｗ１，ｗ２｝が存在しているので、当該３つの基本ブロック｛ｘ，ｗ１，ｗ２｝のうち、上記先行基本ブロックｖの後続に先行基本ブロックｖ以外の先行基本ブロックｘ（当該先行基本ブロックｘは先行基本ブロックｖの後続基本ブロックでもあるので、当該先行基本ブロックｘは上記後続基本ブロックｘでもある）が存在し、且つ、当該先行基本ブロックｘのフォールスルー・パス上に後続基本ブロックが存在しているという条件を満たす一つの後続基本ブロックｗ１を取り出して、先行基本ブロックｖと上記取り出された後続基本ブロックｗ１との間のエッジｖ→ｗ１にゼロを割り当てる例を示した。
【０１１６】
代替的には、コンピュータは、先行基本ブロックｖに対して複数の後続基本ブロック｛ｗ１，・・・，ｗｎ｝が存在している場合に、当該複数の後続基本ブロック｛ｗ１，・・・，ｗｎ｝のうち、上記先行基本ブロックｖの後続に先行基本ブロックｖ以外の先行基本ブロックｘ（当該先行基本ブロックｘは先行基本ブロックｖの後続基本ブロックでもあるので、先行基本ブロックｘは上記後続基本ブロックｘでもある）が存在し、且つ、当該先行基本ブロックｘのフォールスルー・パス上に後続基本ブロックが存在しているという条件を満たす条件を満たす一つの後続基本ブロックｗｉを取り出して、上記先行基本ブロックｖと上記取り出された後続基本ブロックｗｉとの間のエッジｖ→ｗｉにゼロを割り当てることが可能である。当該複数の後続基本ブロック｛ｗ１，・・・，ｗｎ｝のうちの上記条件を満たす上記後続基本ブロックｗｉを取り出すことは例えば、複数の後続基本ブロック｛ｗ１，・・・，ｗｎ｝のうち実行頻度が分かっている後続基本ブロックが一部あること（例えば、他の手法により、複数の後続基本ブロック｛ｗ１，・・・，ｗｎ｝のうちの一部の基本ブロックについての実行頻度の一部が分かっている場合）に応じて、実行頻度の高い後続基本ブロックｗｉを取り出すことによって行われうる。
【０１１７】
図２Ｄ（実施例４）において、変形前の制御フロー・グラフ（２３１）は、図７Ｄに示す制御フロー・グラフ（７３１）と同じである。従って、変形前の制御フロー・グラフ（２３１）についての説明は、図７Ｄに示す制御フロー・グラフ（７３１）についての説明を参照されたい。
【０１１８】
コンピュータ（１０１）は、変形前の制御フロー・グラフ（２３１）について、先行基本ブロックｖの後続基本ブロックｗ１に先行基本ブロックｖ以外の先行基本ブロックｘが存在し、且つ、当該先行基本ブロックｘのフォールスルー・パス上に上記後続基本ブロックｗ１が存在していると判断する。従って、コンピュータ（１０１）は、変形前の制御フロー・グラフ（２３１）において、先行基本ブロックｖと後続基本ブロックｗ１との間のエッジｖ→ｗ１にパス値０を割り当てる。また、コンピュータ（１０１）は、先行基本ブロックｖと後続先行基本ブロックｘ（当該後続基本ブロックｘはもう１つの後続基本ブロックｗの先行基本ブロックでもあり、上記先行基本ブロックｘとも示される）との間のエッジｖ→ｘにパス値１を割り当て、先行基本ブロックｖと後続基本ブロックｗ２との間のエッジｖ→ｗ２にパス値２を割り当て、且つ、先行基本ブロックｙと後続基本ブロックｘとの間のエッジｙ→ｘにパス値３を割り当てる。また、コンピュータは、その他のエッジにパス値０を割り当てる。従って、制御フロー・グラフ（２３２）では、エッジｖ→ｗ１にパス値０が割り当てられており、エッジｖ→ｘにパス値１が割り当てられており、エッジｖ→ｗ２にパス値２が割り当てられ、且つ、エッジｙ→ｘにパス値３が割り当てられている。
【０１１９】
次に、コンピュータ（１０１）は、制御フロー・グラフ（２３２）にインストラメンテーション・コードを挿入する操作を行う。
【０１２０】
コンピュータ（１０１）は、先行基本ブロックｖと後続基本ブロックｗ１との間のエッジｖ→ｗ１にパス値０が割り当てられている（すなわち、エッジｖ→ｗ１の加減算する値が０である）ことから、当該エッジｖ→ｗ１上にインストラメンテーション・コードを挿入することが不要であると判断する。また、コンピュータ（１０１）は、上記エッジｖ→ｗ１上に基本ブロックを挿入することも不要であると判断する。同様に、コンピュータ（１０１）は、パス値０が割り当てられているその他のエッジについてもインストラメンテーション・コードを挿入することが不要であると判断する。
【０１２１】
また、コンピュータ（１０１）は、先行基本ブロックｖと後続基本ブロックｘとの間のエッジｖ→ｘにパス値１が割り当てられており且つ先行基本ブロックｙが後続基本ブロックｘに先行して存在することから、当該エッジｖ→ｘ上に、パス値を加算する命令（ｒ＋＝１）を含む基本ブロックｑ（２３４）を挿入する。なお、コンピュータ（１０１）は、挿入基本ブロックｑ（２３４）にジャンプ命令は不要であるために挿入しない。
【０１２２】
同様に、コンピュータ（１０１）は、先行基本ブロックｖと後続基本ブロックｗ２との間のエッジｖ→ｗ２にパス値２が割り当てられていることから、当該エッジｖ→ｗ２上に、パス値を加算する命令（ｒ＋＝２）を含む基本ブロックｒ（２３５）を挿入する。挿入基本ブロックｒ（２３５）は、パス値を加算する命令（ｒ＋＝２）とともに、先行基本ブロックｗ２へのジャンプ命令（ｊｍｐ  ｗ２）を含む。
【０１２３】
同様に、コンピュータ（１０１）は、先行基本ブロックｙと後続基本ブロックｘとの間のエッジｙ→ｘにパス値３が割り当てられていることから、当該エッジｙ→ｘ上に、パス値を加算する命令（ｒ＋＝３）を含む基本ブロックｓ（２３６）を挿入する。挿入基本ブロックｓ（２３６）は、パス値を加算する命令（ｒ＋＝３）とともに、後続基本ブロックｘへのジャンプ命令（ｊｍｐ  ｘ）を含む。
【０１２４】
以上に示す通り、当該実施例４では、コンピュータ（１０１）は、先行基本ブロックｖに対して後続基本ブロックｘ（当該後続基本ブロックｘはもう１つの後続基本ブロックｗ１の先行基本ブロックでもあり、当該後続基本ブロックｘは上記後続基本ブロックｗ’に対応する）が先行基本ブロックｖ以外の先行基本ブロックｙを持つので、上記先行基本ブロックｖと上記後続基本ブロックｘ（上記後続基本ブロックｗ’に対応する）との間のエッジｖ→ｘ（上記エッジｖ→ｗ’に対応する）上に基本ブロックｑ（上記基本ブロックｍに対応する）を挿入し、当該基本ブロックｑにパス値を加算する命令を挿入する。また、当該実施例４では、コンピュータ（１０１）は、さらに、先行基本ブロックｖに対して後続基本ブロックｗ２が先行基本ブロックｖ以外の先行基本ブロックｙを持つので、上記先行基本ブロックｖと上記後続基本ブロックｗ２との間のエッジｖ→ｗ２上に基本ブロックｒ（上記基本ブロックｍに対応する）を挿入し、当該基本ブロックｒにパス値を加算する命令を挿入する。
【０１２５】
さらに、当該実施例４では、コンピュータ（１０１）は、先行基本ブロックｚのフォールスルー・パス上に後続基本ブロックｗ２（上記後続基本ブロックｗ’に対応する）が存在するので、上記基本ブロックｒ（上記基本ブロックｍに対応する）に基本ブロックｗ２へのジャンプ命令を挿入する。
【０１２６】
また、当該実施例４では、コンピュータ（１０１）は、先行基本ブロックｖに対して３つの後続基本ブロック｛ｘ，ｗ１，ｗ２｝が存在しているので、当該３つの基本ブロック｛ｘ，ｗ１，ｗ２｝のうち、上記先行基本ブロックｖの後続に先行基本ブロックｖ以外の先行基本ブロックｘ（当該先行基本ブロックｘは先行基本ブロックｖの後続基本ブロックでもあるので、当該先行基本ブロックｘは上記後続基本ブロックｘでもある）が存在し、且つ、当該先行基本ブロックｘのフォールスルー・パス上に後続基本ブロックが存在しているという条件を満たす一つの後続基本ブロックｗ１を取り出して、先行基本ブロックｖと上記取り出された後続基本ブロックｗ１との間のエッジｖ→ｗ１にゼロを割り当てる。
【０１２７】
また、当該実施例４では、コンピュータ（１０１）は、先行基本ブロックｖと、上記ゼロを割り当てられた後続基本ブロックｗ１以外の後続基本ブロックｗ２との間のエッジｖ→ｗ２上に基本ブロックｒ（上記基本ブロックｎに対応する）を挿入し、当該基本ブロックｒにパス値を加算する命令を挿入する。
【０１２８】
また、当該実施例４では、コンピュータ（１０１）は、後続基本ブロックｗ２が先行基本ブロックｖのフォールスルー・パス上に存在せず、且つ、当該後続基本ブロックｗ２に先行基本ブロックｖ以外の先行基本ブロックｚが存在するので、上記基本ブロックｒ（上記基本ブロックｎに対応する）のパス値を加算する命令の直後に後続基本ブロックｗ２へのジャンプ命令を挿入する。
【０１２９】
従って、図２Ｄに示す変形された制御フロー・グラフ（２３３）において、インストラメンテーション・コードを挿入することによってジャンプ命令の数が２つ増える（ｊｍｐ  ｗ２及びｊｍｐ  ｘ）（２３５及び２３６）。一方、図７Ｄに示す変形された制御フロー・グラフ（７３３）において、インストラメンテーション・コードを挿入することによってジャンプ命令の数が３つ増える（ｊｍｐ  ｗ１，ｊｍｐ  ｗ２及びｊｍｐ  ｘ）（それぞれ、７３４，７３５及び７３６）。従って、制御フロー・グラフ（２３１）を本願発明の実施態様に従う制御フロー・グラフ（２３３）に変形することによって、図７Ｄに示す従来技術４による手法と比べてジャンプ命令の数を１つ減らす（３から２）ことが可能となり、従ってオーバーヘッドが削減される。
【０１３０】
上記図２Ｄに示す例において、先行基本ブロックｖと後続基本ブロックｗ１との間のエッジｖ→ｗ１にパス値０を割り当てる例を示した。すなわち、先行基本ブロックｖに対して３つの後続基本ブロック｛ｘ，ｗ１，ｗ２｝が存在しているので、当該３つの基本ブロック｛ｘ，ｗ１，ｗ２｝のうち、上記先行基本ブロックｖの後続に先行基本ブロックｖ以外の先行基本ブロックｘ（当該先行基本ブロックｘは先行基本ブロックｖの後続基本ブロックでもあるので、先行基本ブロックｘは上記後続基本ブロックｘでもある）が存在し、且つ、当該先行基本ブロックｘのフォールスルー・パス上に後続基本ブロックが存在しているという条件を満たす一つの後続基本ブロックｗ１を取り出して、先行基本ブロックｖと上記取り出された後続基本ブロックｗ１との間のエッジｖ→ｗ１にゼロを割り当てる例を示した。
【０１３１】
代替的には、コンピュータは、先行基本ブロックｖに対して複数の後続基本ブロック｛ｗ１，・・・，ｗｎ｝が存在している場合に、当該複数の後続基本ブロック｛ｗ１，・・・，ｗｎ｝のうち、上記先行基本ブロックｖの後続に先行基本ブロックｖ以外の先行基本ブロックｘ（当該先行基本ブロックｘは先行基本ブロックｖの後続基本ブロックでもあるので、当該先行基本ブロックｘは上記後続基本ブロックｘでもある）が存在し、且つ、当該先行基本ブロックｘのフォールスルー・パス上に後続基本ブロックが存在しているという条件を満たす条件を満たす一つの後続基本ブロックｗｉを取り出して、上記先行基本ブロックｖと上記取り出された後続基本ブロックｗｉとの間のエッジｖ→ｗｉにゼロを割り当てることが可能である。当該複数の後続基本ブロック｛ｗ１，・・・，ｗｎ｝のうちの上記条件を満たす上記後続基本ブロックｗｉを取り出すことは例えば、複数の後続基本ブロック｛ｗ１，・・・，ｗｎ｝のうち実行頻度が分かっている後続基本ブロックが一部あること（例えば、他の手法により、複数の後続基本ブロック｛ｗ１，・・・，ｗｎ｝のうちの一部の基本ブロックについての実行頻度の一部が分かっている場合）に応じて、実行頻度の高い後続基本ブロックｗｉを取り出すことによって行われうる。
【０１３２】
図３Ａは、本発明の実施態様に従い、制御フロー・グラフ上の実行パスの実行頻度情報を得る処理の為のフローチャートを示す。
【０１３３】
ステップ３０１において、コンピュータ（１０１）は、制御フロー・グラフ上の実行パスの実行頻度情報を得る処理を開始する。
【０１３４】
ステップ３０２において、コンピュータ（１０１）は、プロファイルしたい関数又はメソッド単位で与えられるコンパイル対象のソースコードを、例えば当該ソースコードを格納する記憶媒体（３９１）からメモリ（１０３）内に読み込む。
【０１３５】
ステップ３０３において、コンピュータ（１０１）は、メモリ内に読み込まれたソースコードから制御フロー・グラフを作成する。当該制御フロー・グラフの作成は任意の従来技術に従って行われる。ステップ３０３で作成される制御フロー・グラフは例えば、図２Ａ、図２Ｂ、図２Ｃ及び図２Ｄにおいてそれぞれ示されている（変形前の）制御フロー・グラフ（２０１，２１１，２２１及び２３１）である。
【０１３６】
ステップ３０４において、コンピュータ（１０１）は、任意的に、ステップ３０３で作成された制御フロー・グラフを本発明の実施態様に従い変形するかどうかを判断しうる。コンピュータ（１０１）は、上記制御フロー・グラフを変形することに応じて、処理をステップ３０５に進める。一方、コンピュータ（１０１）は、上記制御フロー・グラフを変形しないことに応じて、処理をステップ３０６に進める。ステップ３０４は任意のステップであるので、コンピュータは、ステップ３０３の処理からステップ３０５の処理へ直接的に進めてもよい。
【０１３７】
ステップ３０５において、コンピュータ（１０１）は、ステップ３０３で作成された制御フロー・グラフを本発明の実施態様に従い変形する処理を行う。ステップ３０５の上記変形処理については、下記図３Ｂ及び図３Ｃに示すフローチャートの説明において詳細に述べる。
【０１３８】
ステップ３０６において、コンピュータ（１０１）は、ステップ３０５で変形された御フロー・グラフを用いて、実行頻度情報を得る。なお、ステップ３０５が実施されなかった場合は、コンピュータ（１０１）は、ステップ３０３で作成された制御フロー・グラフを用いて、実行頻度情報を得る。
【０１３９】
ステップ３０７において、コンピュータ（１０１）は、制御フロー・グラフ上の実行パスの実行頻度情報を得る処理を終了する。
【０１４０】
図３Ｂは、本発明の実施態様に従い、図３Ａに示すステップ３０３で作成された制御フロー・グラフを変形する処理の為のフローチャートを示す。
【０１４１】
図３Ｂに示すフローチャートは、制御フロー・グラフ上の各基本ブロックについて、当該基本ブロックを終点からみていく為に当該基本ブロックが制御フロー・グラフの終端であるか終端でないかを判断し、そして当該基本ブロックが終端でないことに応じて、当該終端でない基本ブロックからのエッジにパス値を割り当てる処理を示す。
【０１４２】
ステップ３１１において、コンピュータ（１０１）は、上記制御フロー・グラフを変形する処理を開始する。
【０１４３】
ステップ３１２において、コンピュータ（１０１）は、逆トポロジカル順序でソートした制御フロー・グラフ上の全基本ブロックのリスト（ＢＢＬｉｓｔ）、上記制御フロー・グラフ中の基本ブロック数（Ｎ）、及び上記全基本ブロックのリスト（ＢＢＬｉｓｔ）から基本ブロックを一つずつ取り出すために使用する変数（Ｉ；初期値＝０）を用意する。逆トポロジカル順序とは、制御フロー・グラフ内の終端から始端に向けたソートした全基本ブロックのリストである。逆トポロジカル順序の詳細については、上記非特許文献２を参照されたい。
【０１４４】
ステップ３１３において、コンピュータ（１０１）は、上記基本ブロック数（Ｎ）が上記変数（Ｉ）よりも大きいかを判断する。ステップ３１３は、上記制御フロー・グラフ中の基本ブロック全てについて、ステップ３１３〜３１８の各処理をするためのループである。コンピュータ（１０１）は、上記基本ブロック数（Ｎ）が上記変数（Ｉ）よりも大きいことに応じて、処理をステップ３１４に進める。一方、コンピュータ（１０１）は、上記基本ブロック数（Ｎ）が上記変数（Ｉ）よりも大きくないことに応じて（すなわち、上記変数（Ｉ）が上記基本ブロック数（Ｎ）よりも大きいことに応じて）、処理を終了ステップ３１９に進める。
【０１４５】
ステップ３１４において、コンピュータ（１０１）は、上記基本ブロック数（Ｎ）が上記変数（Ｉ）よりも大きいことに応じて、ＢＢＬｉｓｔから、１つの基本ブロックＶを取り出す。
【０１４６】
ステップ３１５において、コンピュータ（１０１）は、基本ブロックＶに対して値（０又は１）を割り当てる為に、上記取り出した基本ブロックＶが制御フロー・グラフの終端（出口）にある基本ブロックであるかを判断する。コンピュータ（１０１）は、上記取り出した基本ブロックＶが上記制御フロー・グラフの終端にある基本ブロックでないことに応じて処理をステップ３１６に進める。一方、コンピュータ（１０１）は、上記取り出した基本ブロックＶが上記制御フロー・グラフの終端にある基本ブロックであることに応じて処理をステップ３１７に進める。
【０１４７】
ステップ３１６において、コンピュータ（１０１）は、上記取り出した基本ブロックＶが上記制御フロー・グラフの終端にある基本ブロックでないことに応じて、当該終端でない基本ブロックＶに対して値０を割り当てる（NumPath[V] = 0）。当該値０は基本ブロックＶに対して割り当てられる値であるが、図３Ｃに示すステップ３２８において、当該値０は、上記制御フロー・グラフ中の各基本ブロックに対してユニークな値になるように変更される。
【０１４８】
ステップ３１７において、コンピュータ（１０１）は、上記取り出した基本ブロックＶが上記制御フロー・グラフの終端にある基本ブロックであることに応じて、当該終端である基本ブロックＶに対して値１を割り当てる（NumPath[V] = 1）。
【０１４９】
ステップ３１８において、コンピュータ（１０１）は、ステップ３１６で値０が割り当てられた基本ブロックＶ（すなわち、当該基本ブロックＶが上記制御フロー・グラフの終端でない場合）からのエッジにパス値を割り当てる処理を行う。すなわち、ステップ３１８では、終端にある基本ブロック以外の先行基本ブロックに対して、当該先行基本ブロックからのエッジにパス値を割り当てる処理を行う。ステップ３１８の上記終端でない基本ブロックＶからのエッジへのパス値の割り当て処理については、下記図３Ｃに示すフローチャートの説明において詳細に述べる。
【０１５０】
ステップ３１９において、コンピュータ（１０１）は、ステップ３１３における判断ステップにおいて、上記変数（Ｉ）が上記制御フロー・グラフ中の基本ブロック数（Ｎ）よりも大きいことに応じて、上記制御フロー・グラフを変形する処理を終了する。
【０１５１】
図３Ｃは、本発明の実施態様に従い、制御フロー・グラフを変形する処理において、エッジに値を割り当てる処理の為のフローチャートを示す。
【０１５２】
図３Ｃは、図３Ｂに示すステップ３１６で値０が割り当てられた基本ブロックＶ（すなわち、上記終端でない基本ブロックＶ）からのエッジにパス値を与える処理を示す。
【０１５３】
ステップ３２１において、コンピュータ（１０１）は、上記エッジに値を割り当てる処理を開始する。
【０１５４】
ステップ３２２において、コンピュータ（１０１）は、図３Ｂに示すステップ３１６で値０を割り当てられた基本ブロックＶの後続となる後続基本ブロックＷに上記基本ブロックＶ以外の別の先行基本ブロックＸが存在し、且つ、当該先行基本ブロックＸのフォールスルー・パス上に上記後続基本ブロックＷが存在しているかどうかの条件を満たすかを判断する。コンピュータ（１０１）は、上記条件を満たすことに応じて、処理をステップ３２３に進める。一方、コンピュータ（１０１）は、上記条件を満たさないことに応じて、処理をステップ３２４に進める。
【０１５５】
ステップ３２３において、コンピュータ（１０１）は、上記条件を満たすことに応じて、上記基本ブロックＶ（例えば、図２Ａ〜図２Ｄそれぞれに示す基本ブロックｖに対応する）と上記後続基本ブロックＷ（例えば、図２Ａ〜図２Ｄそれぞれに示す基本ブロックｗ又はｗ１に対応する）との間のエッジＥ’（すなわち、上記の場合、Ｖ→Ｗ）に、パス値０を割り当てる（Val[E’] = 0）。パス値０を割り当てるのは、エッジにパス値０が割り当てられることによって、パス値０が割り当てられた当該エッジに対して加減算の処理が必要なくなり、従って当該エッジ上に基本ブロックの挿入やジャンプ命令が不要になりコストが下がるからである。また、コンピュータ（１０１）は、上記制御フロー・グラフ中の各基本ブロックの値が終点から始点に向かってユニークな値になるようにする為に、上記基本ブロックＶの値に後続基本ブロックＷの値を加算して、当該基本ブロックＶの値を更新する（NumPath[V] += NumPath[W]）。
【０１５６】
ステップ３２４において、コンピュータ（１０１）は、上記条件を満たさないことに応じて、上記基本ブロックＶからのエッジＥ’にパス値０を割り当てる（E’ = 0）。
【０１５７】
ステップ３２５において、コンピュータ（１０１）は、上記基本ブロックＶからのエッジのリスト（ＥＬｉｓｔ）、上記基本ブロックＶからのエッジの数（Ｍ）、及び上記エッジのリスト（ＥＬｉｓｔ）からエッジを一つずつ取り出すために使用する変数（Ｊ；初期値＝０）を用意する。上記基本ブロックＶからのエッジのリスト（ＥＬｉｓｔ）には、上記基本ブロックＶからの全てのエッジがリストされている。ステップ３２６〜ステップ３２８のループ開始前では、基本ブロックＶから基本ブロックＷへのエッジにのみパス値０が割り当てられており（ステップ３２３）、ステップ３２６〜ステップ３２８を繰り返すことによって、基本ブロックＶからの残りのエッジにパス値が割り当てられる。上記残りのエッジへのパス値の割り当ては、下記ステップ３２８において行われる。上記残りのエッジにどのようにパス値が割り当てられるかは例えばエッジを取り出した順（例えば、１，２，３の昇順）に従い、従ってパス値は上記残りのエッジそれぞれに任意にユニークな値になるように割り当てられうる。
【０１５８】
ステップ３２６において、コンピュータ（１０１）は、上記基本ブロックＶからのエッジの数（Ｍ）が上記変数（Ｊ）よりも大きいかを判断する。ステップ３２６は、上記基本ブロックＶからのエッジ全てについて、ステップ３２７の処理をするためのループである。コンピュータ（１０１）は、上記基本ブロックＶからのエッジの数（Ｍ）が上記変数（Ｊ）よりも大きいことに応じて、処理をステップ３２７に進める。一方、コンピュータ（１０１）は、上記基本ブロックＶからのエッジの数（Ｍ）が上記変数（Ｊ）よりも大きくないことに応じて（すなわち、上記変数（Ｊ）が上記基本ブロックＶからのエッジの数（Ｍ）よりも大きいことに応じて）、処理を終了ステップ３２９に進める。
【０１５９】
ステップ３２７において、コンピュータ（１０１）は、上記基本ブロックＶからのエッジの数（Ｍ）が上記変数（Ｊ）よりも大きいことに応じて、上記基本ブロックｖからのエッジのリスト（ＥＬｉｓｔ）から１つのエッジを取り出し、当該取り出したエッジの値が上記基本ブロックｖからのエッジのリスト（ＥＬｉｓｔ）中にあるか、すなわち、上記エッジに既にパス値が割り振られているかをさらに判断する（EList[J] == e’）。コンピュータ（１０１）は、上記エッジの値が上記基本ブロックＶからのエッジのリスト（ＥＬｉｓｔ）中にないことに応じて、当該エッジにパス値を割り当てる為に、処理をステップ３２８に進める。一方、コンピュータ（１０１）は、上記エッジの値が上記基本ブロックＶからのエッジのリスト（ＥＬｉｓｔ）中にあることに応じて、当該エッジにパス値を割り当てる必要がないことから、処理をステップ３２６に戻す。
【０１６０】
ステップ３２８において、コンピュータ（１０１）は、上記エッジのパス値が上記基本ブロックＶからのエッジのリスト（ＥＬｉｓｔ）中にないことに応じて、パス値として上記基本ブロックＶの値（非セロ値である）を割り当て（Val[EList[J]] = NumPath[V]）、且つ、上記基本ブロックＶの値にEList[J]の後続基本ブロックの値を加算して、当該基本ブロックＶの値を更新する（NumPath[V] += NumPath[EList[J]の後続基本ブロック]）。ここで、NumPath[EList[J]の後続基本ブロック]は既に非ゼロになっているので、更新された基本ブロックＶの値も非ゼロ値である。何故ならば、図３Ｂ〜図３Ｃに示す処理が、基本ブロックを終点から処理していく為に、ある基本ブロックＶからのエッジにパス値を割り当てる際に、その後続基本ブロックの処理は既に終了しているからである。ステップ３２６からステップ３２８を繰り返すことによって、上記基本ブロックＶからの各エッジにユニークなパス値（ステップ３２３で割り当てられたパス値０を除く）が割り当てられる。
【０１６１】
ステップ３２９において、コンピュータ（１０１）は、ステップ３２６における判断ステップにおいて、上記変数（Ｊ）が上記基本ブロックＶからのエッジの数（Ｍ）よりも大きいことに応じて、上記基本ブロックＶからの上記エッジにパス値を割り当てる処理を終了する。
【０１６２】
図４は、本発明の実施態様に従い、制御フロー・グラフを変形する処理において、新たな基本ブロックの挿入が必要なエッジに値を割り当てる処理を実行する為のアルゴリズムの一例を示す。
【０１６３】
上記アルゴリズム（４０１）は、エッジeに値Val(e)を割り当てるアルゴリズムである。当該アルゴリズムにおいて、０１〜１３の数字は、説明を容易にするために挿入されたものであって、実際のコードでは不要である。
【０１６４】
本発明の実施態様に従うと、制御フロー・グラフ上に新たな基本ブロックを挿入することが必要なエッジ（例えば、図２Ａに示すエッジｖ→ｗ、図２Ｂに示すエッジｖ→ｗ、図２Ｃに示すエッジｖ→ｗ１、及び図２Ｄに示すエッジｖ→ｗ１）上で、加減算する値をゼロにする。すなわち、制御フロー・グラフ上に新たな基本ブロックを挿入することが必要なエッジにパス値ゼロを割り当てる。上記エッジにパス値ゼロが割り当てられることによって、当該エッジにインストラメンテーション・コードが不要になり、従って新たな基本ブロックの挿入も不要になる。
【０１６５】
上記アルゴリズム（４０１）において、行06，07，08，09，及び11に示すコードが、本発明の実施態様に追加されたコードであり、エッジeに値Val(e)を割り当てるアルゴリズムである。また、行05，07，08，及び12が、本発明の実施態様に従い、最初のエッジにパス値ゼロを割り当てるアルゴリズムである。
【０１６６】
・行01は、図３Ｂに示すステップ３１２に対応する。
・行02は、図３Ｂに示すステップ３１５に対応する。
・行03は、図３Ｂに示すステップ３１６に対応する。
・行04〜05は、図３Ｂに示すステップ３１７に対応する。
・行06は、図３Ｃに示すステップ３２２に対応する。
・行07〜09は、図３Ｃに示すステップ３２３に対応する。
・行10は、図３Ｃに示すステップ３２６に対応する。
・行11は、図３Ｃに示すステップ３２７に対応する。
・行12〜13は、図３Ｃに示すステップ３２８に対応する。
【０１６７】
行06に示すfindNewBBEdge(v)は、先行基本ブロックｖと後続基本ブロックｗ（又はｗ１）のエッジｖ→ｗ（又はｖ→ｗ１）上に、新たな基本ブロックが必要な条件を規定する。当該条件は、先行基本ブロックｖの後続基本ブロックｗに先行基本ブロックｖ以外の先行基本ブロックｘが存在し、且つ、当該先行基本ブロックｘのフォールスルー・パス上に後続基本ブロックｗが存在することである。
【０１６８】
図５は、従来技術の手法を実行可能にするアルゴリズムをコンパイラに実装したプログラムと本発明の実施態様を実行可能にするアルゴリズムをコンパイラに実装したプログラムとのスループットとの対比結果を示す。
【０１６９】
従来技術の手法を実行可能にするアルゴリズムをコンパイラに実装したプログラムは、非特許文献２に記載の手法を実装したプログラムである。
【０１７０】
本発明の実施態様を実行可能にするアルゴリズムをコンパイラに実装したプログラムは、従来技術の手法を実行可能にするアルゴリズムをコンパイラに実装したプログラムと比べて、平均０．７％（相乗平均を参照）、最大２．７％（xml.validation）の性能向上が見られた。
【０１７１】
図６は、図１に従うハードウェア構成を好ましくは備えており、本発明の実施態様に従い生成された制御フロー・グラフ上の実行パスの実行頻度情報を得るためのコンピュータの機能ブロック図の一例を示した図である。
【０１７２】
コンピュータ（６０１）は、本発明の実施態様に従い、制御フロー・グラフ上の実行パスの実行頻度情報を得るためのコンピュータであり、例えば図１に示すコンピュータ（１０１）である。
【０１７３】
コンピュータ（６０１）は、メモリ（６１１）、制御フロー・グラフ作成手段（６１２）、及び実行頻度情報取得手段（６１３）を備えている。制御フロー・グラフ作成手段（６１２）は、制御フロー・グラフ変形手段（６２１）をさらに備えている。制御フロー・グラフ変形手段（６２１）は、本発明の実施態様において追加された手段である。なお、コンピュータ（６０１）は、制御フロー・グラフ作成手段（６１２）と制御フロー・グラフ変形手段（６２１）とを別々の手段として備えていてもよい。
【０１７４】
メモリ（６１１）は、コンピュータが、コンパイル対象のソースコードを格納する記憶媒体（３９１）から読み取ったコンパイル対象のソースコードを記憶する。
【０１７５】
コンピュータ（１０１）は、メモリ（６１１）を、図３Ａに示すステップ３０２を実行する上で使用する。
【０１７６】
制御フロー・グラフ作成手段（６１２）は、コンパイル対象のソースコードから、制御フロー・グラフを作成する。
【０１７７】
制御フロー・グラフ変形手段（６２１）は、先行基本ブロックｖの後続基本ブロックｗに先行基本ブロックｖ以外の先行基本ブロックｘが存在し、且つ、当該先行基本ブロックｘのフォールスルー・パス上に後続基本ブロックｗが存在している場合に、先行基本ブロックｖと後続基本ブロックｗとの間のエッジｖ→ｗにパス値ゼロを割り当てて、制御フロー・グラフを変形する。
【０１７８】
制御フロー・グラフ変形手段（６２１）は、上記先行基本ブロックｖに対して上記後続基本ブロックｗ以外の後続基本ブロックｗ’が上記先行基本ブロックｖ以外の先行基本ブロックを持たない場合、上記後続基本ブロックｗ’にパス値を加算する命令を挿入しうる。
【０１７９】
制御フロー・グラフ変形手段（６２１）は、上記先行基本ブロックｖに対して上記後続基本ブロックｗ以外の後続基本ブロックｗ’が上記先行基本ブロックｖ以外の先行基本ブロックｙを持つ場合、上記先行基本ブロックｖと上記後続基本ブロックｗ’との間のエッジｖ→ｗ’上に新たな基本ブロックｍを挿入し、上記基本ブロックｍにパス値を加算する命令を挿入しうる。
【０１８０】
制御フロー・グラフ変形手段（６２１）は、上記先行基本ブロックｙのフォールスルー・パス上に上記後続基本ブロックｗ’が存在する場合、上記基本ブロックｍに基本ブロックｗ’へのジャンプ命令を挿入しうる。
【０１８１】
制御フロー・グラフ変形手段（６２１）は、上記先行基本ブロックｖに対して３つ以上の後続基本ブロック｛ｗ１，・・・，ｗｎ｝が存在している場合に、当該複数の後続基本ブロック｛ｗ１，・・・，ｗｎ｝のうち、先行基本ブロックｖの後続基本ブロックに上記先行基本ブロックｖ以外の先行基本ブロックｘが存在し、且つ、当該先行基本ブロックｘのフォールスルー・パス上に後続基本ブロックが存在しているという条件を満たす一つの後続基本ブロックｗｉを取り出して、上記先行基本ブロックｖと上記取り出された後続基本ブロックｗｉとの間のエッジｖ→ｗｉにゼロを割り当てて、上記制御フロー・グラフを変形しうる。複数の後続基本ブロック｛ｗ１，・・・，ｗｎ｝のうちの上記条件を満たす上記一つの後続基本ブロックｗｉを取り出すことが、上記複数の後続基本ブロック｛ｗ１，・・・，ｗｎ｝のうち実行頻度が分かっている後続基本ブロックが一部あることに応じて、実行頻度の高い後続基本ブロックｗｉを取り出すことを含みうる。
【０１８２】
制御フロー・グラフ変形手段（６２１）は、上記先行基本ブロックｖと上記ゼロを割り当てられた後続基本ブロックｗｉ以外の後続基本ブロックｗｊとの間のエッジｖ→ｗｊにパス値を加算する命令を挿入しうる。
【０１８３】
制御フロー・グラフ変形手段（６２１）は、上記後続基本ブロックｗｊが上記先行基本ブロックｖのフォールスルー・パス上に存在せず、且つ、上記後続基本ブロックｗｊに上記先行基本ブロックｖ以外の先行基本ブロックが存在する場合、パス値を加算する命令の直後に上記後続基本ブロックｗｊへのジャンプ命令を挿入しうる。
【０１８４】
制御フロー・グラフ作成手段（６１２）は、図３Ａに示すステップ３０３を実行しうる。
【０１８５】
制御フロー・グラフ変形手段（６２１）は、図３Ａに示すステップ３０４〜３０５、並びに、図３Ｂ及び図３Ｃにそれぞれ示す各ステップを実行する。
【０１８６】
制御フロー・グラフ変形手段（６２１）は、図２Ａ（実施例１）に示すように、上記後続基本ブロックｘ（上記後続基本ブロックｗ’に対応する）にパス値を加算する命令を挿入する。但し、当該挿入された後続基本ブロックｘはジャンプ命令を含まない。
【０１８７】
制御フロー・グラフ変形手段（６２１）は、図２Ｂ（実施例２）に示すように、上記先行基本ブロックｙが上記先行基本ブロックｖと上記後続基本ブロックｘとの間のエッジｖ→ｘ上に存在せず、当該後続基本ブロックｘに先行して存在する場合に、上記先行基本ブロックｖと上記後続基本ブロックｘとの間にパス値を加算する命令を含む基本ブロックｍを挿入する。但し、当該挿入された基本ブロックｍはジャンプ命令を含まない。
【０１８８】
制御フロー・グラフ変形手段（６２１）は、図２Ｃ（実施例３）に示すように、上記後続基本ブロックｘ（上記後続基本ブロックｗ’に対応する）にパス値を加算する命令を挿入する。但し、当該挿入された後続基本ブロックｘはジャンプ命令を含まない。
【０１８９】
制御フロー・グラフ変形手段（６２１）は、図２Ｄ（実施例４）に示すように、上記先行基本ブロックｙが上記先行基本ブロックｖと上記後続基本ブロックｘとの間のエッジｖ→ｘ上に存在せず、上記後続基本ブロックｘに先行して存在する場合に、上記先行基本ブロックｖと上記後続基本ブロックｘとの間にパス値を加算する命令を含む基本ブロックｑを挿入する。但し、当該挿入された基本ブロックｑはジャンプ命令を含まない。
【０１９０】
実行頻度情報取得手段（６１３）は、制御フロー・グラフ変形手段（６２１）により変形された制御フロー・グラフを用いて、実行頻度情報を得る。
【０１９１】
実行頻度情報取得手段（６１３）は、図３Ａに示すステップ３０６を実行する。
【図１】
2015103021.tif 000003
【図３Ａ】
2015103021.tif 000004
【図３Ｂ】
2015103021.tif 000005
【図３Ｃ】
2015103021.tif 000006
【図４】
2015103021.tif 000007
【図６】
2015103021.tif 000008
【図２Ａ】
2015103021.tif 000009
【図２Ｂ】
2015103021.tif 000010
【図２Ｃ】
2015103021.tif 000011
【図２Ｄ】
2015103021.tif 000012
【図５】
2015103021.tif 000013
【図７Ａ】
2015103021.tif 000014
【図７Ｂ】
2015103021.tif 000015
【図７Ｃ】
2015103021.tif 000016
【図７Ｄ】
2015103021.tif 000017