(57)【要約】【課題】ＩＦ文などの条件式をもつ条件分岐がある場合でも、正確に解析することが可能なプログラム解析方法及びそのプログラム解析装置を提供する。【解決手段】コンパイラにより変数の参照の有無を解析する際に、並列化の解析対象となっているループ中に別ループ(これを子ループとし、解析対象となっているループは親ループとする)がある場合、その子ループの最初の数回を展開し、最適化を実施し、ＩＦ文などの条件分岐の削除を試みる。条件分岐が削除できれば、その分岐先にある変数の参照の有無は正確なものとなる。これにより、より正確な解析が可能となる。なお、本方法は、スカラ変数だけではなく、配列変数でも同様に解析可能である。【選択図】図８
2008015665.tif 000002
【特許請求の範囲】
【請求項１】
ソースコードを入力として、当該ソースコードに所定の処理を施してオブジェクトコードを出力するため、当該ソースコードに含まれるループ中における変数の参照の有無を解析するためのプログラム解析方法であって、
当該入力したソースコードに含まれる解析対象のループにおいて、他のループ間にまたがる依存の有無を判定する処理と、
当該入力したソースコードに含まれる解析対象のループにおいて、子ループが存在するか否かを判定する処理と、
前記依存判定処理と前記子ループ判定処理において、他のループ間にまたがる依存と子ループが存在すると判定された場合、変数の参照情報を解析する処理とを備えており、そして、
前記変数参照情報解析処理は、
当該子ループの少なくとも最初の回のループをピーリング展開する処理と、
前記展開処理においてピーリング展開されたループに対して最適化を行なう処理と、さらに、
前記最適化処理により最適化されたループに対して、他のループ間にまたがる依存の有無を判定する処理と
を備えていることを特徴とするプログラム解析方法。
【請求項２】
前記請求項１に記載したプログラム解析方法において、前記変数参照情報解析処理における前記依存有無判定処理において、他のループ間にまたがる依存が存在すると判定された場合、再度、前記ピーリング展開処理、前記最適化処理を行い、更に、前記前記依存有無判定処理を実行することを特徴とするプログラム解析方法。
【請求項３】
前記請求項１に記載したプログラム解析方法において、前記ピーリング展開により生成されたループの文に印を付け、前記最適化実施後のコードに対して解析対象となる変数の参照を解析する時に、当該印の付いた文のみを解析することを特徴とするプログラム解析方法。
【請求項４】
前記請求項３に記載したプログラム解析方法において、前記ピーリング展開処理、前記最適化処理、前記前記依存有無判定処理の再度の繰り返し回数に制限を設けたことを特徴とするプログラム解析方法。
【請求項５】
少なくともプログラム解析方法を実行するための演算処理部と、
前記演算処理部において実行されるプログラム解析方法のプログラムを格納する記憶装置とを備え、もって、入力したソースコードに所定の処理を施してオブジェクトコードを出力するため、当該ソースコードに含まれるループ中における変数の参照の有無を解析するプログラム解析装置であって、
前記演算処理部は、前記記憶装置に格納したプログラム解析方法のプログラムに基づいて、
当該入力したソースコードに含まれる解析対象のループにおいて、他のループ間にまたがる依存の有無を判定する手段と、
当該入力したソースコードに含まれる解析対象のループにおいて、子ループが存在するか否かを判定する手段と、そして、
前記依存判定手段と前記子ループ判定手段において、他のループ間にまたがる依存と子ループが存在すると判定された場合、変数の参照情報を解析する手段と構成しており、更に、前記変数参照情報解析手段は、
当該子ループの少なくとも最初の回のループをピーリング展開する手段と、
前記展開手段においてピーリング展開されたループに対して最適化を行なう手段と、さらに、
前記最適化手段により最適化されたループに対して、他のループ間にまたがる依存の有無を判定する手段と
を構成していることを特徴とするプログラム解析装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、ソフトウェアの自動生成におけるコンパイラによるプログラム解析方法及びそのための装置に関するものである。
【背景技術】
【０００２】
従来、コンパイラによるプログラムの自動並列化では、例えば、以下の非特許文献１により既に知られるように、プログラムのループ内にある変数の参照（変数の「定義」と「使用」の両者を含む）の有無を解析し、当該ループの繰り返しにまたがるデータの依存の有無を解析する。その結果、繰り返しにまたがるデータの依存がなければ、当該ループは並列化が可能とされる。
【０００３】
しかしながら、上記の従来技術では、そのループ中に「ＩＦ」で始まる文節（ＩＦ文）などの、所謂、条件分岐が存在し、そして、その条件分岐の条件式の値がコンパイル時に静的に解析することが出来ない場合には、分岐先にある変数の参照の有無については、静的には解析することが出来ない。そのため、安全なコードを出力することとなり、換言すれば、近似された解析結果を出力することとなる。また、この近似を原因として、実際には並列化が可能であるループであるにもかかわらず、並列化が不可能と解析されてしまう場合もある。
【０００４】
そこで、例えば、下記の特許文献１では、条件分岐により解析対象となっているループの内部から外部への飛び出し（以下、「ループ飛び出し」）がある場合、当該ループ飛び出しが起きる時のループ制御変数の値を用いることによって、解析精度を向上することが提案されている。
【０００５】
なお、上記した非特許文献１では、条件分岐の条件式を分岐先の変数の参照条件とすることによって解析精度を向上させることが記載されている。また、この非特許文献１では、分岐先にある変数に対して、プログラムの実行時に変数が参照された場合に、その参照があったことを記録し、データの依存を解析することが記載されている。
【０００６】
また、以下の非特許文献２では、所謂、ループピーリングについて記載されている。
【特許文献１】特開平11-167492号公報
【非特許文献１】論文Byoungro So, et al., “Measuring the Effectiveness of Automatic Parallelization in SUIF”, Proceedings of International Conference on Supercomputing (ISC’98), 1998.
【非特許文献２】Michael Wolfe, “High Performance Compilers For Parallel Computing”, Addison-Wesley Publishing Company, Inc., 1996.
【発明の開示】
【発明が解決しようとする課題】
【０００７】
以上のように、従来技術、特に、非特許文献１では、参照条件として利用できる条件式で使用可能な変数は、ループの実行中に値が変わらない、所謂、ループ不変な変数か、または、解析対象となっているループの制御変数である必要がある。そのため、条件式に使われている変数がこれらの何れでもない場合は、変数の参照条件としては使えないという問題がある。
【０００８】
加えて、上記の非特許文献１では、プログラムを実際に動作をさせて解析することから、正確な解析が可能である。しかしながら、この従来技術では、その実行時において変数を参照する度にその参照を記録し、更には、その依存の有無を判定することから、これらの処理が実行時におけるオーバーヘッドとなり、プログラムの実行速度が遅くなってしまうという問題がある。
【０００９】
そこで、本発明の目的は、上記の従来技術における課題を解消することであり、より具体的には、プログラムの実行速度を速くするために、コンパイラによる静的な解析を行い、もって、上記非特許文献１では参照条件にできないような条件式をもつ条件分岐がある場合でも、正確に解析することが可能なプログラム解析方法、更には、そのためのプログラム解析装置を提供することである。
【課題を解決するための手段】
【００１０】
本発明によれば、上記の目的を達成するため、まず、ソースコードを入力として、当該ソースコードに所定の処理を施してオブジェクトコードを出力するため、当該ソースコードに含まれるループ中における変数の参照の有無を解析するためのプログラム解析方法であって、当該入力したソースコードに含まれる解析対象のループにおいて、他のループ間にまたがる依存の有無を判定する処理と、当該入力したソースコードに含まれる解析対象のループにおいて、子ループが存在するか否かを判定する処理と、前記依存判定処理と前記子ループ判定処理において、他のループ間にまたがる依存と子ループが存在すると判定された場合、変数の参照情報を解析する処理とを備えており、そして、前記変数参照情報解析処理は、当該子ループの少なくとも最初の回のループをピーリング展開する処理と、前記展開処理においてピーリング展開されたループに対して最適化を行なう処理と、さらに、前記最適化処理により最適化されたループに対して、他のループ間にまたがる依存の有無を判定する処理とを備えているプログラム解析方法が提供される。
【００１１】
また、本発明では、前記に記載したプログラム解析方法において、前記変数参照情報解析処理における前記依存有無判定処理において、他のループ間にまたがる依存が存在すると判定された場合、再度、前記ピーリング展開処理、前記最適化処理を行い、更に、前記前記依存有無判定処理を実行することが好ましく、又は、前記ピーリング展開により生成されたループの文に印を付け、前記最適化実施後のコードに対して解析対象となる変数の参照を解析する時に、当該印の付いた文のみを解析することが好ましい。更には、前記ピーリング展開処理、前記最適化処理、前記前記依存有無判定処理の再度の繰り返し回数に制限を設けることが好ましい。
【００１２】
加えて、本発明によれば、やはり上記の目的を達成するため、少なくともプログラム解析方法を実行するための演算処理部と、前記演算処理部において実行されるプログラム解析方法のプログラムを格納する記憶装置とを備え、もって、入力したソースコードに所定の処理を施してオブジェクトコードを出力するため、当該ソースコードに含まれるループ中における変数の参照の有無を解析するプログラム解析装置であって、前記演算処理部は、前記記憶装置に格納したプログラム解析方法のプログラムに基づいて、当該入力したソースコードに含まれる解析対象のループにおいて、他のループ間にまたがる依存の有無を判定する手段と、当該入力したソースコードに含まれる解析対象のループにおいて、子ループが存在するか否かを判定する手段と、そして、前記依存判定手段と前記子ループ判定手段において、他のループ間にまたがる依存と子ループが存在すると判定された場合、変数の参照情報を解析する手段とを構成しており、更に、前記変数参照情報解析手段は、当該子ループの少なくとも最初の回のループをピーリング展開する手段と、前記展開手段においてピーリング展開されたループに対して最適化を行なう手段と、さらに、前記最適化手段により最適化されたループに対して、他のループ間にまたがる依存の有無を判定する手段とを構成しているプログラム解析装置が提供される。
【００１３】
換言すれば、本発明では、コンパイラにより変数の参照の有無を解析する際に、並列化の解析対象となっているループ中に別ループ(これを子ループとし、解析対象となっているループは親ループとする)がある場合、その子ループの最初の数回を展開し、最適化を実施し、ＩＦ文などの条件分岐の削除を試みる。条件分岐が削除できれば、その分岐先にある変数の参照の有無は正確なものとなる。これにより、より正確な解析が可能となる。なお、本方法は、スカラ変数だけではなく、配列変数でも同様に解析可能である。
【発明の効果】
【００１４】
以上のように、本発明になるプログラム解析方法、及び、そのプログラム解析装置によれば、正確な解析が可能になることにより、従来並列化できなかったループが並列化可能になり、プログラムの実行時間が短くなる。
【発明を実施するための最良の形態】
【００１５】
以下、本発明の実施の形態になるプログラム解析方法について詳細に説明する。しかしながら、その前に、添付の図５により、従来の方法では並列化できないプログラムの例を示す。一般的に、ループの並列化を解析する際には、解析対象となるループの中において参照される変数の参照情報を解析する。この参照情報には、ループの１回の繰り返しに対して、「定義」（定義される可能性の有無）と、「使用」（使用される可能性の有無）と、「確定定義」（必ず実行される定義の有無）と、そして、「露出使用」(定義される前に使用される可能性の有無)とを含む４種類の情報があり、これらを解析することによりループの並列化を解析する。
【００１６】
例えば、上記図５において、ループ「Ｌ１」を解析対象ループとし、変数「Ｘ」を解析対象の変数とした場合、当該変数「Ｘ」の参照は、５行目のＩＦ文の分岐先である６行目に使用があるため、「使用あり」となり、また、８行目には定義があるため（Ｘ＝…）、「定義あり」となる。なお、「確定定義」については、８行目の定義である「Ｘ」がＩＦ文の分岐先にあるため、確実な定義とはならず、そのため「確定定義なし」となる。また、「露出使用」については、６行目における使用（＝…Ｘ…）の前には定義がないことから、「露出使用あり」となる。
【００１７】
そして、上記の結果からループＬ１の繰り返しにまたがる依存を解析すると、ある繰り返しで定義された変数「Ｘ」の値が、別の繰り返しの変数「Ｘ」の露出使用で使用される可能性がある。そのため、このプログラムの並列化は不可となる。
【００１８】
ここで、例えば、上述した非特許文献１に記載された解析方法を用いると、ＩＦ文の条件式を変数の参照条件として解析するが、しかしながら、上述したように、ループの実行中に値が変わらないループ不変な式でない場合や、又は、ループ制御変数を使っていない場合には、これを参照条件とすることができない。即ち、図５に示されたプログラムの例では、５行目のＩＦ文の条件式となっている変数「Ｆｌａｇ」は、４行目の文によりループを繰り返す度に、常に変わっており、また、ループ「Ｌ１」の制御変数「Ｉ」でもないことから、参照条件にすることができないこととなる。そのため、この非特許文献１に記載された解析方法による解析結果は、上述した従来のままであり、即ち、並列化も不可能である。
【００１９】
そこで、本発明では、コンパイラにより変数の参照の有無を解析する際、並列化の解析対象となっているループ中に別ループ（これを「子ループ」とし、解析対象となっているループは「親ループ」とする）が存在する場合には、その子ループの最初の数回を展開して最適化を実施し、もって、上記ＩＦ文などの条件分岐の削除を試みる。即ち、条件分岐が削除できれば、その分岐先にある変数の参照の有無は正確なものとなり、これによれば、より正確なプログラムの解析が可能となる。なお、本発明になるプログラムの解析方法によれば、スカラ変数だけではなく、配列変数であっても、同様に、解析可能である。
【００２０】
まず、添付の図２により、本発明の実施の形態になるプログラム解析方法であるコンパイラを実行する計算機システムの全体構成を示す。即ち、この計算機システムは、図から明らかなように、コンパイラの実行を行う演算処理部（ＣＰＵ）２０１と、実行途中の情報を記憶するための主記憶装置２０２と、ユーザがコンパイラの起動やコンパイルオプションの入力等をするためのキーボード２０３と、ユーザへ情報を出力するためのディスプレイ２０４と、そして、外部記憶装置２０６とから構成されている。なお、外部記憶装置２０６には、プログラムであるコンパイラの２０７と、コンパイルの対象となるソースコードファイル２０８と、上記コンパイラが出力するオブジェクトファイル２０９とが記録されている。また、上述した各装置間は、バス２０５を介して、相互に繋がれている。
【００２１】
次に、添付の図３には、上記外部記憶装置２０６に記録されており、ＣＰＵ２０１により実行されるプログラムであるコンパイラ２０７の処理構成を示す。
【００２２】
この図３において、コンパイラ２０７は、やはり上記外部記憶装置２０６内に記録されたソースコードである、所謂、ソースコードファイル２０８を入力とし、中間コード３０６を生成する中間コード生成部３０１と、生成された中間コード３０６を入力とし、条件分岐などの制御の流れを解析し、制御フロー情報３０７を出力する制御フロー解析部３０２と、上記中間コード３０６と共に制御フロー情報３０７をその入力とし、変数の参照情報などデータの流れを解析し、データフロー情報３０８を出力するデータフロー解析部３０３と、上記中間コード３０６と制御フロー情報３０７とデータフロー情報３０８とをその入力とし、並列化やコードの並び替え等の最適化を実施し、中間コードを更新する最適化部３０４と、そして、上記中間コード３０６をオブジェクトコードである、所謂、オブジェクトファイル２０９へ変換するオブジェクト生成部３０５とから構成されている。なお、この図３において、矢印はデータの流れを示し、白抜きの矢印は制御の流れを示している。
【００２３】
更に、以下には、上記でそのシステム構成、及び、その処理構成を示したコンパイラにおけるプログラム解析方法の詳細、即ち、ループを並列化するためのデータ依存を解析するためのデータフロー解析部３０３（図３を参照）のアルゴリズムについて、その詳細を示す。
【実施例１】
【００２４】
まず、図４は、実施例１になるデータフロー解析部３０３のアルゴリズムを示す。この図において、処理が開始されると、まず、ステップ４０１において、プログラムのループ毎に、以下のステップ４０２から始まる一連の処理を実行する。
【００２５】
更に、ステップ４０２では、上記ステップ４０１で解析の対象となったループ内に存在する変数について、その変数毎に、以下のステップ４０３から始まる一連の処理を実行する。
【００２６】
すなわち、まず、ステップ４０３では、解析対象となっているループにおいて、ループの１回の繰り返しにおいて、解析対象となっている変数の「定義」、「使用」、「確定定義」、そして「露出使用」を調べる。次に、ステップ４０４では、上記ステップ４０３で解析した結果により、当該解析対象であるループに「定義」が存在するか否か、かつ、「露出使用」が存在するか否かを調べる。これは、複数のループ間にまたがったデータ間における依存の有無を調べるためのものである。その結果、「定義」があり、かつ、「露出使用」がある場合（図の「ＹＥＳ」）は、ループ間にまたがる依存があることになる。そして、このループにまたがる依存があると判断された場合には、処理はステップ４０５へ進み、他方、依存がない（図の「ＮＯ」）と判断された場合には、ステップ４０７へ進む。
【００２７】
次に、ステップ４０５では、解析対象であるループの中に子ループが存在するか否かを調べ、その結果、存在すると判定（図の「ＹＥＳ」）された場合には、次のステップ４０６へ進み、他方、存在しないと判定（図の「ＹＥＳ」）された場合には、上記４０６を飛び越して、更に次のステップ４０７へ進む。
【００２８】
即ち、ステップ４０６では、以下にも詳細に説明するが、変数の参照を解析するための処理である。そして、ステップ４０７では、上記ステップ４０３の解析処理を行っていない未処理変数があるか否かを調べ、当該未処理変数が存在する（図の「ＹＥＳ」）場合には、再び、上記ステップ４０７へ戻り、他方、未処理変数が存在しない（図の「ＮＯ」）場合には、次のステップ４０８へ進む。
【００２９】
なお、このステップ４０８では、上記ステップ４０３の解析処理を行っていない未処理ループの存在を調べ、その結果、当該未処理ループが存在する（図の「ＹＥＳ」）場合には、再び、上記４０１へ戻り、他方、未処理ループが存在しない（図の「ＮＯ」）場合には、一連の処理を終了する。
【００３０】
次に、上述したステップ４０６において実行される変数の参照情報を解析するためのアルゴリズムの詳細について、その一例を、添付の図１に示す。
【００３１】
この変数の参照情報を解析するための処理では、その処理が開始されると、まず、ステップ１１０１において、子ループの最初の１回分をピーリング展開する。なお、子ループが複数ある場合は、解析対象となっている変数において最初の使用があるループを子ループとする。なお、このピーリング展開の詳細については、非特許文献２の第３１１頁に記載があるように、ループの最初の（又は、最後の）繰り返しを取り除いて異なるコードにし、即ち、一般的に、ループの複数の繰り返しとして展開するものである。
【００３２】
その後、ステップ１０２では、上記ステップ１１０１で展開したループを含めて、プログラムに対して最適化を実施する。その後、ステップ１１０３では、上記図４のステップ４０３と同様に、変数の定義、使用、確定定義、露出使用を、再度、解析して、一連の処理を終了する。
【００３３】
続いて、上記にその詳細について詳細に説明した本発明の解析方法、即ち、上記図１に示した変数の参照情報を解析するためのアルゴリズムを、従来の方法では並列化できないプログラムの例として示した上記図５のプログラムに適用した結果を、以下に詳細に述べる。
【００３４】
まず、上記のステップ１１０１における子ループの最初の１回分のピーリング展開では、子ループである３行目の「Ｌ２」の１回目の「Ｊ＝１」を展開する。なお、この展開した後の結果を、添付の図６に示す。そして、このＪ＝１回目の部分は、この図６における３行目から９行目までの部分である。
【００３５】
次に、上記のステップ１０２では、上記図６における変数「Flag」は、その２行目で「True」として定義されているため、定数伝播と呼ばれる最適化により、４行目の「Flag」の値が「False（Not.）」となる。また、４行目で変数「Flag」の値が「False」になるため、５行目のＩＦ文の条件式は、常に成立しないことが分かる。よって、８行目のみが実行されることが分かる。その結果、この図６のプログラムは、添付の図７のようなプログラムに変換されることとなる。
【００３６】
さらに、上記のステップ１１０３では、上記のループ「Ｌ１」（図５の１行目）に対して定義、使用、露出使用、確定定義を解析する。変数「Ｘ」の参照情報に関し、その定義については、上記図６における８行目と１５行目の文から、「定義あり」となる。その使用については、１３行目の文から、「使用あり」となる。また、確定定義については、８行目の定義より、「確定定義あり」となる。更に、露出使用については、６行目の使用の前の８行目に定義があることから、「露出使用なし」となる。
【００３７】
以上の結果、ループの１回の繰り返しでは露出使用がないので、あるループの繰り返しで定義された値が、その後に実行される別の繰り返しで使用されることがない、ということが分かる。即ち、ループの繰り返しにまたがるデータの依存がないことが分るので、解析対象となっているループは並列化が可能となる。
【実施例２】
【００３８】
次に、上述した図４のステップ４０６において実行される変数の参照情報を解析するためのアルゴリズムの他の例を添付の図８に示す。なお、この実施例２においても、上記図２に示す計算機システムにより、上記図３に示したコンパイラの処理構成におけるデータフロー回折部３０３のアルゴリズム、即ち、基本的には、上記図４に示したフローに基づいて実行される。
【００３９】
なお、上記図１に示したアルゴリズムの例では、ループのピーリング展開を１回しか実施していない。そのため、このピーリング展開を複数回繰り返すことで条件分岐を削除することができる場合には、上記図１に示したアルゴリズムでは対応できない。そこで、上記図１のアルゴリズムを拡張し、即ち、ピーリング展開を複数回行うアルゴリズムの一例を添付の図８に示す。
【００４０】
この図８に示すアルゴリズムにおいて、まず、そのステップ１０１では、上記図１におけるステップ１１０１と同様に、子ループに対してピーリング展開を行う。そして、その際に展開した文に印を付ける。
【００４１】
次に、ステップ１０２では、上記ステップ１０１で展開したループを含めて、プログラムに対して最適化を実施することは、上記図１のステップ１０２と同様である。
【００４２】
その後、ステップ１０３では、上記ステップ１１０１で印を着けた文に対して、その変数の定義、使用、確定定義、露出使用を調べる。
【００４３】
さらに、続くステップ１０４では、上記ステップ１０３で解析した結果に基づいて、定義又は使用があるか否かを調べる。その結果、それら両方とも存在しなければ、処理は上記のステップ１０１へ戻る。他方、上記定義と使用のうち、何れか一方でも存在すれば、処理は次のステップ１０５へ進む。
【００４４】
そして、最後のステップ１０５では、上記図４に示したステップ４０３において解析した結果と、上記のステップ１０３で解析した結果とを合わせる。より具体的には、定義と使用と確定定義については、その和集合を、一方、露出使用については、上記ステップ４０３における解析された露出使用から、上記ステップ１０３において解析された確定定義を除いたものとする。
【００４５】
次に、上記図４及び図８のアルゴリズム例をプログラムに適用した結果を、以下に、添付の図９〜１１を参照しながら示す。
【００４６】
まず、上記図４におけるステップ４０３において、添付の図９のプログラムのループ「Ｌ１」に対して、定義、使用、確定定義、露出使用を解析する。なお、この例では、変数Ｙの参照は、図の６行目の文により、「定義あり」と、そして、その８行目の文により、「使用あり」となる。また、確定定義については、その６行目の文の変数Ｙの定義は、５行目のＩＦ文により不確定となっているため、「確定定義はなし」となる。そして、露出使用については、その６行目の使用の前には定義はないので、「露出使用あり」となる。
【００４７】
次に、上記図８のステップ１０１では、子ループ「Ｌ２」の最初の１回分（Ｊ＝１）を展開し、展開した文に印を付ける。
【００４８】
そして、上記のステップ１０２では、上記図９のプログラムに対し、上記のステップ１０３で取り出したループを含め、最適化を実施する。この例では、Ｊ＝１のため、４行目だけの処理が残る。その結果、添付の図１０に示すプログラムとなる。即ち、上記のステップ１０１で印を付けた文は、図１０における２行目と３行目だけになる。
【００４９】
その後、上記のステップ１０３で、上記図１０に示したプログラムにおいて印が付いた文、即ち、その２行目と３行目に対して、解析を実施する。なお、この例では、その２行目には変数Ｙの参照はないので、「定義、使用、確定定義、露出使用の参照はない」と解析される。
【００５０】
更に、上記の１０４では、変数Ｙの定義とその使用の有無を調べるが、この例では、上述したように、上記ステップ１０３では定義も使用もない（「ＮＯ」）ことから、処理は上記のステップ１０１へ進む。
【００５１】
ここで、このステップ１０１では、子ループＬ２の一回分、つまり、Ｊ＝２のループを展開し、そして、この展開した文に印を付ける。
【００５２】
次に、上記のステップ１０２では、上記図１０のプログラムに対し、上記のステップ１０１で取り出したループを含めて、最適化を実施する。ここでは、Ｊ＝２であるため、その９行目の処理だけが残る。その結果、添付の図１１に示すプログラムになる。ここで、上記のステップ１０１で印をつけた文は、２行目から４行目となる。
【００５３】
更に、上記のステップ１０３では、上記図１１に示したプログラムに対し、特に、印の付いた文の３行目と４行目に対して、解析を実施する。この例では、その５行目の文の変数Ｙの定義により、「定義と確定定義がある」ことが解析される。他方、使用と露出使用については「なし」と解析される。
【００５４】
続いて、上記の１０４では、変数Ｙの定義と使用の有無を調べる。なお、この例では、上記のステップ１０３では、「定義がある」（ＹＥＳ）とされたので、処理は、ステップ１０５へ進む。
【００５５】
このステップ１０５では、上記図４に示したステップ４０３において「解析された定義あり」、「使用あり」、「確定定義なし」、「露出使用あり」という情報と、上記図８におけるステップ１０３で解析された「定義あり」、「使用なし」、「確定定義あり」、「露出使用なし」という情報とをマージする（和集合）。その結果、これらは、それぞれ、「定義あり」、「使用あり」、「確定定義あり」となる。一方、露出使用は、上記ステップ１０５における解析結果より確定定義が存在するので、「露出使用なし」となる。
【００５６】
なお、以上に詳細に説明した実施例２においても、その解析結果より、上記実施例１と同様、露出使用がないため、ループ間にまたがるデータの依存がないことが分かり、即ち、並列化が可能となる。
【実施例３】
【００５７】
ところで、以上にその内容を詳述した図１及び図８に示したアルゴリズムの例では、その解析のために、プログラムの書き換えを行っている。そのため、本発明の解析を行うことにより、場合によっては、他の最適化の実施に影響を与える可能性がある。
【００５８】
そこで、かかる問題を解決するために、本発明では、以下に述べる実施例３により、その解析の実施時において、プログラムのコピーを作り、そのコピーに対して解析を行う。なお、この実施例２においても、上記図２に示す計算機システムにより、上記図３に示したコンパイラの処理構成におけるデータフロー回折部３０３のアルゴリズム、即ち、基本的には、上記図４に示したフローに基づいて実行される。
【００５９】
まず、添付の図１２には、上記図８のアルゴリズムを更に拡張し、即ち、上記図８に示したフローにおいて、更に、解析対象ループをコピーする処理（ステップ）１２０１と、そのコピーにより生成されたループとそのループから展開された部分を消去する処理（ステップ）１２０２とを追加したアルゴリズムを示す。即ち、かかるアルゴリズムによれば、本発明の解析を実行した後に生成されるコードは、そのループが展開される前の状態のままを維持しており、そのため、上述したコードの書き換えによる他の最適化への悪影響を解消することが可能となる。
【００６０】
この図１２において、ステップ１２０１では、まず、解析対象ループのコピーを作り、その後のステップ１０１〜１０４における処理は、このコピーにより生成されたループに対して実施されることとなる。
【００６１】
即ち、ステップ１２０２では、上記ステップ１２０１においてコピーにより生成したループを削除する。なお、その他のステップ１０１〜１０５における処理の内容は、上記図８において述べたと同様である。
【００６２】
そして、この図１２のアルゴリズムを、上述した図５に示したプログラムへ適用した場合、その解析結果は、上記の実施例１と同様である。即ち、上記の実施例１では、出力されるコードは上述した図７のようになるが、しかしながら、この図１２に示したアルゴリズムの例では、上記図５のままである。そして、このことにより、コードの変更を伴うことなく、その解析精度を向上させることが可能となる。
【実施例４】
【００６３】
加えて、上述した図８に示したアルゴリズムの例では、特に、そのステップ１０１〜１０４の処理の繰り返しにより、解析時間が長くなる可能性がある。そこで、本発明では、かかる問題を解決するため、コンパイラオプションにより繰り返し回数を制御する方法を採用し、その一例を、以下に実施例４として、添付の図１３に、そのアルゴリズムを示す。なお、この実施例４では、コンパイラ２０２（図２を参照）のユーザが、コンパイルオプションを介して、その繰り返し回数を指定することで、解析時間の制御を行うことを可能とするものである。
【００６４】
この実施例４では、図１３に示すアルゴリズムからも明らかなように、上記図８のアルゴリズムに、更に、ステップ１３０１の処理を加えたものである。なお、その他のステップ１０１〜１０５における処理の内容は、上記図８において述べたと同様である。
【００６５】
そして、ステップ１３０１では、例えば、添付の図１４に示すようなコンパイラオプションにより、その繰り返し回数の上限が与えられる。そして、繰り返し回数がその上限を超えた場合には、その解析処理を終了するようにし、他方、これを越えない場合は上記のステップ１０１へ進み、再び、上記ステップ１０１〜１０４の処理を繰り返す。
【００６６】
なお、上記図１４に示したコンパイルオプションの例では、繰り返し回数の上限を、その一例として、１０回としている。そのため、解析処理は、１０回に至るまで（ＮＯ）は、上記ステップ１０１〜１０４の処理を繰り返すこととなるが、しかしながら、それ以上になる場合（ＹＥＳ）には、その処理を終了する。
【００６７】
以上に詳細に述べたように、本発明になるプログラム解析方法及びプログラム解析装置によれば、従来の解析方法では並列化できなかったプログラムを、自動的に並列化することが可能になる。また、本発明では、特に、上述したように、コンパイラによって静的に解析するため、実行時のオーバーヘッドはない。特に、近年においては、大規模な並列計算機だけではなく、一般的なＰＣにおいても、プロセッサを複数持つものが多くなって来ていることから、本発明になるプログラム解析方法及びプログラム解析装置を、プログラムを自動的に並列化するコンパイラとして利用する可能性は高い。
【００６８】
また、以上に詳細に述べたように、本発明になるプログラム解析方法及びプログラム解析装置によれば、ソースコードを入力とし、オブジェクトコードを出力するコンパイラにおいて、ループ中の変数の参照の有無を解析する際に、対象ループＡの中にループＢがある場合、ループＢの最初の１または複数回のイタレーションをピーリング展開し、上記展開後のコードに最適化を実施し、上記最適化の実施後のコードに対して解析対象となる変数の参照を解析することとなる。
【００６９】
また、上記の本発明になるプログラム解析方法及びプログラム解析装置では、ピーリング展開により生成された文に印をつけ、上記最適化実施後のコードに対して解析対象となる変数の参照を解析するときに上記印のついた文のみ解析することが好ましい。そして、解析対象となる変数の参照を解析するときに印のついた文のみ解析した後に、上記解結果に使用も定義もない場合は上記のピーリング展開から繰り返すことが好ましい。更には、ピーリング展開からの繰り返しをコンパイラオプションで与えられた数を上限とすることが好ましい。そして、上記において、ピーリング展開前にループＡをコピーして新たなループＣを作成してループＣを解析対象ループとし、変数の参照を解析した後に当該ループＣを消去することが好ましい。
【図面の簡単な説明】
【００７０】
【図１】本発明の特徴となるプログラム解析方法のアルゴリズム（実施例１）の詳細を示すフロー図である。
【図２】上記本発明のプログラム解析方法を実行するための、コンパイラが動作する計算機システム（プログラム解析装置）の構成を示すシステム構成図である。
【図３】上記計算機システムにおいて、本発明のプログラム解析装置を含むコンパイラの構成を示す構成図である。
【図４】上記本発明のプログラム解析装置の動作を説明するための、プログラムにおける変数の参照情報の解析アルゴリズムの一例を示すフロー図である。
【図５】上記本発明のプログラム解析方法を実行するコンパイラの入力となるプログラムの一例を示す図である。
【図６】上記図５に示したプログラムに対してループの１回目を展開した場合に得られるプログラムの例を示す図である。
【図７】上記図６に示したプログラムに対して最適化を実施した結果であるプログラムの例を示す図である。
【図８】本発明の他の実施の形態（実施例２）におけるプログラム解析方法のアルゴリズムの詳細を示すフロー図である。
【図９】上記実施例２におけるコンパイラの入力となるプログラムの一例を示す図である。
【図１０】上記図９に示したプログラムに対してループの１回目を展開し最適化を実施した結果になるプログラムの例を示す図である。
【図１１】上記図１０に示したプログラムに対してループの２回目を展開して最適化を実施した結果になるプログラムの例を示す図である。
【図１２】上記図８に示したアルゴリズムに、更に、コピー処理を加えた、本発明の他の実施の形態（実施例３）のプログラム解析方法の詳細を示すフロー図である。
【図１３】上記図８に示したアルゴリズムに、更に、オプションにより繰り返し処理の制御を加えた、本発明の更に他の実施の形態（実施例４）のプログラム解析方法の詳細を示すフロー図である。
【図１４】上記図１３に示した実施例４における繰り返し回数を制御するためのコンパイルオプションの一例を示す図である。
【符号の説明】
【００７１】
１０１…ループの最初の１回分の展開
１０２…最適化実施
１０３…定義、使用、露出使用、確定定義の解析
１０４…定義と使用の有無の判定
１０５…解析結果のマージ。
【図１】
2008015665.tif 000003
【図２】
2008015665.tif 000004
【図３】
2008015665.tif 000005
【図４】
2008015665.tif 000006
【図５】
2008015665.tif 000007
【図６】
2008015665.tif 000008
【図７】
2008015665.tif 000009
【図８】
2008015665.tif 000010
【図９】
2008015665.tif 000011
【図１０】
2008015665.tif 000012
【図１１】
2008015665.tif 000013
【図１２】
2008015665.tif 000014
【図１３】
2008015665.tif 000015
【図１４】
2008015665.tif 000016