(57)【要約】【課題】プログラムのＩＦ文の条件式に包含関係がある場合について、ＩＦ文の最適化によりプログラムの処理パフォーマンス（速度）を向上させる。【解決手段】本発明の方法は、（ａ）プログラム中の複数のＩＦ文の各条件式について、包含関係にある条件式の集合を求めるステップと、（ｂ）集合の各々について、包含関係にある条件式の移動先として、プログラム中の実行頻度が小さい位置を当該条件式が含まれる集合の情報を用いて算出するステップと、（ｃ）算出された条件式の移動先に当該条件式を移動させるステップとを含む。【選択図】図２
2015215756.tif 000002
【特許請求の範囲】
【請求項１】
プログラム中のＩＦ文を最適化するための方法であって、
プログラム中の複数のＩＦ文の各条件式について、包含関係にある条件式の集合を求めるステップと、
前記集合の各々について、包含関係にある条件式の移動先として、前記プログラム中の実行頻度が小さい位置を当該条件式が含まれる前記集合の情報を用いて算出するステップと、
算出された前記条件式の移動先に当該条件式を移動させるステップと、を含む方法。
【請求項２】
前記集合を求めるステップは、
前記包含関係にある条件式の各々において、肯定条件と否定条件を設定し、各条件について、部分集合である条件式の数と条件式が成立する確率とからコストを求めるステップを含む、請求項１に記載の方法。
【請求項３】
前記条件式を移動させるステップは、
副作用を起こさない条件式を前記プログラム中の当該条件式が実行される可能性がある領域中の実行頻度が最小となる位置に移動させるステップと、
副作用を起こし得る条件式を前記プログラム中の当該条件式が必ず実行されかつ移動による副作用が起こらない領域中の実行頻度が最小となる位置に移動させるステップと、を含む請求項１に記載の方法。
【請求項４】
前記条件式を移動させるステップは、
前記条件式の結果が変数にキャッシュされていない場合、前記包含関係にある条件式に関するＩＦ文を生成しその結果を新たな変数にキャッシュするステップと、
前記条件式の結果が変数にキャッシュされている場合、前記包含関係にある条件式の条件演算子を論理演算子に置き換えた後に当該条件式の結果を新たな変数にキャッシュするステップと、を含む請求項１に記載の方法。
【請求項５】
前記包含関係にある条件式に関するＩＦ文を生成しその結果を新たな変数にキャッシュするステップは、前記肯定条件と前記否定条件の前記コストの合計値が小さい順に当該ＩＦ文を生成しその結果を新たな変数にキャッシュすることを含む、請求項４に記載の方法。
【請求項６】
前記プログラム中の実行頻度が小さい位置を当該条件式が含まれる前記集合の情報を用いて算出するステップは、前記集合の情報として、前記肯定条件と否定条件を用いてデータフロー解析を行うことを含む、請求項２に記載の方法。
【請求項７】
前記コストは、各条件式について前記条件式の数と前記条件式が成立する確率との積として計算される、請求項２に記載の方法。
【請求項８】
前記条件式を移動させるステップは、移動前の条件式の実行コストと移動後に設定される条件式の実行コストとを比較した結果、実行速度が向上する場合に実施される、請求項１〜７のいずれか１項に記載の方法。
【請求項９】
請求項１〜８のいずれか１項の方法の各ステップを実行するためのコンピュータ・プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、プログラム中のＩＦ文を最適化するための方法に関し、より具体的には、プログラム中のＩＦ文の条件式の包含関係を考慮して条件式の変形（移動、変数へのキャッシュ等）を含むＩＦ文の最適化を図るための方法に関する。
【背景技術】
【０００２】
プログラムが機械生成される場合等において同じＩＦ文が繰り返し生成される場合がある。その場合、同じＩＦ文が繰り返し実行される分だけプログラムの処理パフォーマンス（速度）が遅くなってしまう。したがって、何らかの方法でＩＦ文を最適化して、プログラム中の同じＩＦ文が繰り返し実行されるような事態を避けることが望まれる。
【０００３】
ＩＦ文の最適化に関連して、特許文献１には、自動作成されたコードの第１の中間表現を最適化手法により第２の中間表現に変換する方法において、コードの部分をそのコードが実行される位置に移動させること、複数のループ（ＩＦ文等）を単一のループに結合させることにより第１の中間表現の最適化を行って、ループの実行回数（メモリアクセス回数など）を低減することが開示されている。
【０００４】
特許文献２には、オリジナルコードから抽出された関数コール箇所にｉｆ文のブロックが存在し、そのｉｆ文の条件式に関数コールが使用されている場合に、その条件式をｉｆ文の前に移動して“ｌｏｃａｌ＿ｃｏｎｄ１”に仮代入し、ｉｆ文の条件式内では仮代入した“ｌｏｃａｌ＿ｃｏｎｄ１”に置換し、ｉｆ文内の条件式から関数コールを除去することを特徴とするプログラムコードの構造変換装置が開示されている。
【先行技術文献】
【特許文献】
【０００５】
【特許文献１】米国特許出願公開２００７／０１６９０３９
【特許文献２】特開２０１２−０１４５２６
【発明の概要】
【発明が解決しようとする課題】
【０００６】
特許文献１、２の方法では、ＩＦ文の条件式に包含関係がある場合についてＩＦ分の最適化を図るための対応が採られておらず、また、ＩＦ文の条件式の移動に伴う利益（コスト）予測も十分に考慮されていない。
したがって、本発明の目的は、プログラムのＩＦ文の条件式に包含関係がある場合について、その条件式の移動に伴う利益（コスト）予測をも行いながら、ＩＦ文の最適化によりプログラムの処理パフォーマンス（速度）を向上させることである。
【課題を解決するための手段】
【０００７】
本発明は、プログラム中のＩＦ文を最適化するための方法を提供する。その方法は、（ａ）プログラム中の複数のＩＦ文の各条件式について、包含関係にある条件式の集合を求めるステップと、（ｂ）集合の各々について、包含関係にある条件式の移動先として、プログラム中の実行頻度が小さい位置を当該条件式が含まれる集合の情報を用いて算出するステップと、（ｃ）算出された条件式の移動先に当該条件式を移動させるステップとを含む。
【０００８】
本発明の一態様では、集合を求めるステップ（ａ）は、包含関係にある条件式の各々において、肯定条件と否定条件を設定し、各条件について、部分集合である条件式の数と条件式が成立する確率とからコストを求めるステップを含む。そのコストは、例えば、各条件式について条件式の数と条件式が成立する確率との積として計算することができる。
【０００９】
本発明の一態様では、条件式を移動させるステップ（ｃ）は、（ｃ１）副作用を起こさない条件式を前記プログラム中の当該条件式が実行される可能性がある領域中の実行頻度が最小となる位置に移動させるステップと、（ｃ２）副作用を起こし得る条件式をプログラム中の当該条件式が必ず実行されかつ移動による副作用が起こらない領域中の実行頻度が最小となる位置に移動させるステップと、を含む。
【００１０】
本発明の一態様では、条件式を移動させるステップ（ｃ）は、（ｃ３）条件式の結果が変数にキャッシュされていない場合、包含関係にある条件式に関するＩＦ文を生成しその結果を新たな変数にキャッシュするステップと、（ｃ４）条件式の結果が変数にキャッシュされている場合、包含関係にある条件式の条件演算子を論理演算子に置き換えた後に当該条件式の結果を新たな変数にキャッシュするステップとを含む。
【００１１】
本発明の一態様では、包含関係にある条件式に関するＩＦ文を生成しその結果を新たな変数にキャッシュするステップ（ｃ３）は、肯定条件と否定条件のコストの合計値が小さい順に当該ＩＦ文を生成しその結果を新たな変数にキャッシュすることを含む。
【００１２】
本発明の一態様では、プログラム中の実行頻度が小さい位置を当該条件式が含まれる集合の情報を用いて算出するステップ（ｂ）は、集合の情報として、肯定条件と否定条件を用いてデータフロー解析を行うことを含む。
【００１３】
本発明の一態様では、条件式を移動させるステップ（ｃ）は、移動前の条件式の実行コストと移動後に設定される条件式の実行コストとを比較した結果、実行速度が向上する場合に実施される。
【図面の簡単な説明】
【００１４】
【図１】本発明の方法を実行するコンピュータの構成例を示すブロック図である。
【図２】本発明の方法のフローを示す図である。
【図３】本発明の一実施例の条件式の集合を示す図である。
【図４】本発明の一実施例の条件式の集合を示す図である。
【図５】本発明の一実施例の条件式の集合を示す図である。
【図６】図５の集合におけるコード（条件式）の移動の実施例を示す図である。
【図７】本発明の一実施例の包含関係があるＩＦ文の作成を示す図である。
【発明を実施するための形態】
【００１５】
図面を参照しながら本発明の実施の形態を説明する。図１は、本発明の方法を実施するコンピュータの構成例を示すブロック図である。コンピュータ100は、バス30を介して相互に接続された演算処理装置（CPU）10、記憶手段20、各種I/F40を含む。各種I/F40は、入力I/F、出力I/F、外部記憶I/F、外部通信I/F等を含む総称として用いられ、各I/Fが、それぞれ対応するキーボード、マウス等の入力手段50、CRT、LCD等の表示手段60、USB接続の半導体メモリやHDD等の外部記憶手段70等に接続する。記憶手段20は、RAM、ROM等の半導体メモリ、HDD等を含むことができる。本発明の方法は、コンピュータ100が例えば記憶手段20、70に格納された所定のソフトウェア呼び出して実行することにより実施される。本発明の方法は、プログラムのデバッグ時あるいはコンパイル時に実行される。
【００１６】
図２を参照しながら本発明の方法のフローについて説明する。図２は、本発明の方法の基本的なフローを示す図である。図２のステップＳ１１において、編集対象となるプログラム中の複数のＩＦ文の各条件式について、包含関係にある条件式の集合を求める。この集合を求める際に、包含関係にある条件式の各々において、肯定条件と否定条件を設定し、各条件について、部分集合である条件式の数と条件式が成立する確率とからコストを求める。
【００１７】
図３と図４に、ステップＳ１１で求める集合の例を示す。図３の例では、肯定条件として、Ｉ＝５、Ｉ＝２０、Ｉ＝４０の３つの等号（＝）を含む条件式を設定し、それらの否定条件として、Ｉ！＝５、Ｉ！＝２０、Ｉ！＝４０の３つの条件式を設定している。ここで、例えば“Ｉ！＝５”は、Ｉが５に等しくないことを意味する。ここでの条件式の包含関係は、肯定条件の式同志の間では存在せず、肯定条件と否定条件の式間において存在する。例えば、否定条件のＩ！＝５は、肯定条件のＩ＝２０とＩ＝４０の２式を包含する関係となる。同様に、否定条件のＩ！＝２０、Ｉ！＝４０は、それぞれ肯定条件のＩ＝５及びＩ＝４０の２式、Ｉ＝５及びＩ＝２０の２式を包含する関係となる。図３中の否定条件の行下の“部分集合である式の数”は、各否定条件式が包含する条件式の数である２を示している。上述したように、各肯定条件には包含関係が存在しないので肯定条件の行下の“部分集合である式の数”はいずれもゼロになる。
【００１８】
図３中の仮コストは、“条件式が成り立つ確率”Ｐに“部分集合である式の数”Ｎを乗算して（Ｐ＊Ｎとして）求めることができる。例えば、否定条件Ｉ！＝５の仮コストは、０．９６＊２＝１．９２となる。他の条件式についても同様に計算して求めることができる。仮コスト合計は、肯定条件と否定条件のセットにおける合算値として求めることができる。例えば、Ｉ＝５とＩ！＝５の仮コスト合計は、０＋１．９２＝１．９２となる。他の条件式のセットについても同様に計算して求めることができる。なお、後述するように、この仮コスト合計値は、コード（ＩＦ文）の移動先においてＩＦ文を生成する際のその生成順序（優先度）の判断基準となる。
【００１９】
図４を参照すると、ここでは各条件式が不等号を含む式となっている点を除いて、基本的に図３の等号を含む条件式の場合と同様な手順で集合を求めることができる。例えば、肯定条件のＤＤ＞２９は、肯定条件のＤＤ＞３０とＤＤ＞３１の２式を包含する関係となるので、その“部分集合である式の数”は２となる。同様に、例えば、否定条件のＤＤ≦２９は、否定条件のＤＤ≦２８の１式を包含する関係となるので、その“部分集合である式の数”は１となる。他の条件式についても同様にして求めることができる。仮コスト及び仮コスト合計も図３の場合と同様に求めることができ、例示した肯定条件ＤＤ＞２９と否定条件ＤＤ≦２９のセットの場合は、２つの仮コストを合算して仮コスト合計は、０．１２＋０．９４＝１．０６となる。
【００２０】
図２に戻って、次のステップＳ１２において、ステップＳ１１で取得された集合の各々について、包含関係にある条件式の移動先として、プログラム中の実行頻度が小さい位置を当該条件式が含まれる集合の情報を用いて算出する。その際、集合の情報として、上述した肯定条件と否定条件の各式を用いて、データフロー解析を行うことによりプログラム中の実行頻度が小さい位置を求めることができる。例えば、従来からあるデータフロー解析のアルゴリズム（“Lazy Code Motion”等）を用いて求めることができる。また、同じ実行頻度の中で最後の位置を求めるときに、従来は各条件式をデータフロー方程式で使うGEN集合に登録していたところを、当該条件式に対応する上述した肯定条件と否定条件の集合をGEN集合に組み入れて計算する。なお、この同じ実行頻度の中で最後の位置は、後述するコード（ＩＦ文、条件式）の移動先の候補となる。
【００２１】
次のステップＳ１３において、算出された条件式の移動先に当該条件式を移動させる。この移動させるステップでは、プログラムの処理パフォーマンス（速度）が実際に向上するように、下記の（ａ）〜（ｃ）に示すように、各場合（条件）において対応する適切な処理を行う。
【００２２】
（ａ）移動させるステップにおいて、条件式が副作用を起こさない条件式である場合、その条件式をプログラム中の当該条件式が実行される可能性がある領域中の実行頻度が最小となる位置に移動させる。その後、条件式を実行してその結果（０か１）を変数にキャッシュ（保管）する。実行頻度が最小となる位置は、上述したデータフロー方程式を用いた計算によって求める。ここで、副作用とは、一般に、プログラム中のある機能がコンピュータの論理的な状態を変化させ、それ以降で得られる結果に影響を与えることを意味する。代表的な例は、変数への値の代入におおいてその値が変化してしまう場合が該当する。条件式が副作用を起こし得る場合は、その条件式をプログラム中の当該条件式が必ず実行されかつ移動による副作用が起こらない領域中の実行頻度が最小となる位置に移動させる。その後、条件式を実行してその結果（０か１）を変数にキャッシュ（保管）する。
【００２３】
（ｂ）条件式を移動させるステップにおいて、移動する条件式の結果が変数にキャッシュされていない場合において、その条件式が包含関係にある条件式を持っているときは、その包含関係にある条件式に関するＩＦ文を生成しその結果を新たな変数にキャッシュする。その際、集合中の肯定条件と前記否定条件の仮コスト合計値が小さい順に当該ＩＦ文を生成しその結果を新たな変数にキャッシュする。一方、条件式の結果が変数にキャッシュされている場合、包含関係にある条件式の条件演算子（Conditional AND、 OR、 XOR）を論理演算子（Logical AND、 OR、 XOR）に置き換えた後に当該条件式の結果を新たな変数にキャッシュする。
【００２４】
（ｃ）条件式を移動させるステップは、移動前の条件式の実行コストと移動後に設定される条件式の実行コストとを比較した結果、実行速度が向上する場合に実施することができる。すなわち、移動に伴い最適化が行われる条件式について、コスト利益（Cost-Benefit）計算を行い、ある利益（Benefit）が所定の閾値よりも大きい場合に、その条件式を計算で求めた変数またはキャッシュした変数で置き換える。そうでなければ、上記（ａ）及び（ｂ）における変形（条件式の移動、作成、変数へのキャッシュ）は行わない。したがって、上記（ａ）及び（ｂ）における変形は、実際にはコスト計算及び評価が行われるまでは実行せずに、その変形の情報をメモリに記憶しておくという方法を採用することができる。
【００２５】
コスト利益（Cost-Benefit）計算が必要な理由は以下のように説明することができる。すなわち、計算式の最適化と違いＩＦ文の最適化は、最適化後も完全に条件式を削除できない場合が多く、遅くなる場合があるため、コストを計算する必要がある。速くなるかどうかは、最適化された条件式の合計の実行頻度、条件式のコスト、挿入する条件式の合計の実行頻度、キャッシュされた変数のアクセスコスト、によって決まる。例えば、次に示すように計算式の最適化と違いＩＦ文の最適化で違いが生じる。
【００２６】
（Ａ）計算式の最適化の場合：
（１） 元のプログラム（２） 最適化後
T = b + c
a = b + c             a = T 
:                   :
d = b + c             d = T
（Ｂ）ＩＦ文の最適化の場合：
（１） 元のプログラム     （２） 最適化後
T = (cond)
if cond              IF T 
:                   :
if cond              IF T
条件式condのコストをＣ１、ＴのメモリアクセスコストをＣ２としたとき、（１）のコストはＣ１＊２、（２）のコストはＣ１＋Ｃ２＊３、利益はＣ１−Ｃ２＊３となる。その利益が所定の閾値以上のときに最適化を行う。
【実施例１】
【００２７】
図５と図６において、上述した図２の処理フローに基づく条件式の包含関係を考慮したコード（条件式）移動の実施例を示す。図５は、条件式Ａ＜１及びＡ＜５に対する集合を示す。集合内の各パラメータの意味は、図３と図４を参照しながら説明した通りである。図６は、図５の集合についてのコード移動の例を示す。図６の（ａ）は、従来のコード移動アルゴリズムによるコード移動の例であり、（ｂ）は、本発明によるコード移動の例である。（ａ）の従来例では、２つの条件式（Ａ＜１及びＡ＜５）は最適化されない、すなわちその処理量（速度）が低減されない。一方、（ｂ）の本発明の例では、新たなコード（ＩＦ文）の作成（１）〜（３）により、２つの条件式（Ａ＜１及びＡ＜５）を最適化することができる。
【００２８】
なお、図６の例では、ＡへのメモリアクセスコストをＣ１、ＴへメモリアクセスコストをＣ２、Ａ＜１が成り立つときの確率を５０％、 左のパスが実行される確率を５０％としたとき、
元のコスト：１．５＊Ｃ１
最適化後のコスト：１．２５＊Ｃ１＋２＊Ｃ２
最適化による利益：０．２５＊Ｃ１−２＊Ｃ２
となる。その最適化による利益（０．２５＊Ｃ１−２＊Ｃ２）の値が所定の閾値よりも大きい場合に変形を行うようにすることができる。
【実施例２】
【００２９】
図７に上述した図２の処理フローに基づく、包含関係があるＩＦ文の作成例を示す。図７（ａ）は、元のプログラムにおけるコードであり、（ｂ）は本発明による最適化（移動、変形）後のコードである。この場合も、ＴＸＮＦＬ―ＤＡＴＥ―ＤＤとの比較コストをＣ１、 一時変数のメモリアクセスコストをＣ２とした場合、
（ａ）の場合のコスト：４＊Ｃ１
（ｂ）の場合のコスト：１．１１＊ｃ１＋８＊Ｃ２
最適化による利益：２．８９＊Ｃ１−８＊Ｃ２
となる。したがって、その最適化による利益（２．８９＊Ｃ１−８＊Ｃ２）の値が所定の閾値よりも大きい場合に変形（コード移動）を行うようにすることができる。
【実施例３】
【００３０】
１．副作用を起こさない条件式の最適化の例
次のＩＦ文が４つある場合の最適化例は下記のようになる。
IF R-RESTOCK-01 OF REPORT-RESTOCK OF REPORT-BMO5=SPACE
OR R-RESTOCK-01 OF REPORT-RESTOCK OF REPORT-BMO5=LOW-VALUE
上記のＩＦ文は次のような命令列が生成されている。この場合、メモリアクセスが多くそのコストが高い。
L     4,312(0,9) 
CLC   304(12,4),12(12)
BC    8,2612(0,11)
CLI   304(4),X'00'
BC    7,2620(0,11)
CLC   305(11,4),304(4)
BC    7,2620(0,11)
これに含まれる２つの条件式は副作用を起こさず、ＩＦ文間で値は変わらないものとする。本発明の方法では、次のように変形される。
Cond1 = (R-RESTOCK-01 OF REPORT-RESTOCK OF REPORT-BMO5 = SPACE)
Cond2 = (R-RESTOCK-01 OF REPORT-RESTOCK OF REPORT-BMO5 = LOW-VALUE)
Cond3 = Cond1 | Cond2       // Conditional ORをLogical ORで高速化
この場合の最適化による利益が所定の閾値よりも大きいと判定され、４つのＩＦ文を上記のＣｏｎｄ３の条件式で置き換える。
IF Cond3  処理1
処理2
IF Cond3  処理3
処理4
IF Cond3  処理5
処理6
IF Cond3  処理7
【００３１】
２．副作用を起こし得る条件式の最適化の例
上記１．のＩＦ文の２つ目の条件式（Ｒ−ＲＥＳＴＯＣＫ・・・）がアクセス例外を起こし得るとする。その場合、上記（ｂ）の移動ステップでは次のように変形される。
Cond1 = (R-RESTOCK-01 OF REPORT-RESTOCK OF REPORT-BMO5 = SPACE)
IF Cond1 OR
R-RESTOCK-01 OF REPORT-RESTOCK OF REPORT-BMO5 = LOW-VALUE
Cond3 = 1
ELSE
Cond3 = 0
END-IF
【実施例４】
【００３２】
図７の包含関係があるＩＦ文の作成例について、元のプログラムと最適化後のプログラムをソースコードレベルで作成し、両者の処理（実行）速度を調べた結果、最適化後のプログラムは元のプログラムよりも約４０％程度の速度を向上させることができることを確認した。
【００３３】
本発明の実施形態について、図を参照しながら説明をした。しかし、本発明はこれらの実施形態に限られるものではない。本発明はその趣旨を逸脱しない範囲で当業者の知識に基づき種々なる改良、修正、変形を加えた態様で実施できるものである。
【符号の説明】
【００３４】
３０  バス
１００  コンピュータ  
【図１】
2015215756.tif 000003
【図２】
2015215756.tif 000004
【図３】
2015215756.tif 000005
【図４】
2015215756.tif 000006
【図５】
2015215756.tif 000007
【図６】
2015215756.tif 000008
【図７】
2015215756.tif 000009