(57)【要約】【課題】プロセッサからメモリへのデータの書き込みを高速化する。【解決手段】プロセッサからバッファを介してメモリの連続するアドレスにデータを書き込む際、バッファに蓄積されたデータを一括してメモリに書き込む機能（「Write-Combining」）を記述可能なオブジェクトコードの生成元となるソースコードに記述されているループ処理において定義されている配列が、当該ループ処理で使用されず（Ｓ３１２：ＮＯ）、定義に応じてメモリに書き込まれるデータの書き込み先のアドレスが規則的に空いており（Ｓ３１３：ＮＯ）、当該ループ処理に後続する処理において、上記規則的に空いているアドレスに対し、読み出しがされる前にデータが書き込まれる場合（Ｓ３１５：ＹＥＳ）、上記ソースコードを、規則的に空いているアドレスに対してデータを書き込む処理を付加した内容に変換する（Ｓ３１６）。【選択図】図３
2009175797.tif 000002
【特許請求の範囲】
【請求項１】
ＣＰＵ上で稼動するコンパイラプログラムがソースコードをオブジェクトコードに変換するコンパイル方法において、
コンパイラプログラムの中間コード生成部が、ソースファイルに記述されているソースコードから中間コードを生成するステップを行い、
コンパイラプログラムの制御フロー解析部が、前記中間コードに基づいて制御フロー情報を生成するステップを行い、
コンパイラプログラムのデータフロー解析部が、前記中間コード及び前記制御フロー情報に基づいてデータフロー情報を生成するステップを行い、
コンパイラプログラムの最適化部が、
前記データフロー情報に含まれる配列情報を取得するステップと、
前記配列情報に基づいて、前記中間コードが、ソースコードに記述されているあるループ処理において定義されている配列が当該ループ処理で使用されず、前記定義に応じて前記メモリに書き込まれるデータの書き込み先のアドレスが規則的に空いており、前記ループ処理に後続する処理において、前記規則的に空いているアドレスに対し、データの読み出しがされる前にデータが書き込まれるものであると判断した場合に、前記中間コードの規則的に空いているアドレスにデータを書き込むステップとを行い、
コンパイラプログラムのオブジェクト生成部が、前記データを書き込んだ中間コードに基づいてオブジェクトコードが記述されたオブジェクトファイルを生成するステップとを行うコンパイル方法。
【請求項２】
請求項１において、
前記配列情報に基づいて、前記中間コードが、ソースコードに記述されているあるループ処理において定義されている配列が当該ループ処理で使用されず、前記定義に応じて前記メモリに書き込まれるデータの書き込み先のアドレスが規則的に空いており、前記ソースコードに所定の指示文が記述されていると判断した場合に、前記中間コードの規則的に空いているアドレスにデータを書き込むステップとを行うコンパイル方法。
【請求項３】
請求項１において、
前記規則的に空いているアドレスのデータサイズが所定のサイズ以下である場合には、前記規則的に空いているアドレスへのデータを書き込みを行わないことを特徴とするコンパイル方法。
【請求項４】
請求項１において、
コンパイラプログラムの前記最適化部が、
前記ループ処理よりも前に実行される処理において、配列に対して定数を設定する定義が存在すると判断した場合に、前記ソースコードに、前記規則的に空いているアドレスに前記定数を書き込むことを特徴とするコンパイル方法。
【請求項５】
ＣＰＵ上で稼動するコンパイラプログラムがソースコードをオブジェクトコードに変換する機能を有するコンパイラプログラムにおいて、
ソースファイルに記述されているソースコードから中間コードを生成する中間コード生成機能と、
前記中間コードに基づいて制御フロー情報を生成する制御フロー解析機能と、
前記中間コード及び前記制御フロー情報に基づいてデータフロー情報を生成するデータフロー解析機能と、
前記データフロー情報に含まれる配列情報を取得する配列情報取得機能と、
前記配列情報に基づいて、前記中間コードが、ソースコードに記述されているあるループ処理において定義されている配列が当該ループ処理で使用されず、前記定義に応じて前記メモリに書き込まれるデータの書き込み先のアドレスが規則的に空いており、前記ループ処理に後続する処理において、前記規則的に空いているアドレスに対し、データの読み出しがされる前にデータが書き込まれるものであると判断した場合に、前記中間コードの規則的に空いているアドレスにデータを書き込む最適化機能と、
前記データを書き込んだ中間コードに基づいてオブジェクトコードが記述されたオブジェクトファイルを生成するオブジェクト生成機能と
を有するコンパイラプログラム。
【請求項６】
請求項５において、
前記最適化機能は、前記配列情報に基づいて、前記中間コードが、ソースコードに記述されているあるループ処理において定義されている配列が当該ループ処理で使用されず、前記定義に応じて前記メモリに書き込まれるデータの書き込み先のアドレスが規則的に空いており、前記ソースコードに所定の指示文が記述されていると判断した場合に、前記中間コードの規則的に空いているアドレスにデータを書き込むことを行うコンパイラプログラム。
【請求項７】
請求項５において、
前記規則的に空いているアドレスのデータサイズが所定のサイズ以下である場合には、前記規則的に空いているアドレスへのデータを書き込みを行わないことを特徴とするコンパイラプログラム。
【請求項８】
請求項５において、
前記最適化機能が、
前記ループ処理よりも前に実行される処理において、配列に対して定数を設定する定義が存在すると判断した場合に、前記ソースコードに、前記規則的に空いているアドレスに前記定数を書き込むことを特徴とするコンパイラプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、プログラム及び情報処理装置に関し、とくにプロセッサからメモリへのデータの書き込みを高速化する技術に関する。
【背景技術】
【０００２】
非特許文献１には、プロセッサ（ＣＰＵ）からメモリ（主記憶装置）へのデータの書き込みを高速化する技術として、プロセッサで処理した大量のデータをメモリへ書き込む際、書き込むデータをバッファに蓄積しておき、蓄積しておいたデータを一括してバッファからメモリに書き込む機能である「Write-Combining」について記載されている。
【非特許文献１】“Software Optimization Guide for AMD64 Processors”, Advanced Micro Devices, Inc. p112-113
【発明の開示】
【発明が解決しようとする課題】
【０００３】
上記「Write-Combining」は、データがメモリの連続するアドレスに対して書き込まれる場合に利用される機能であるため、例えばメモリに書き込まれるデータの書き込み先のアドレスが規則的に空いてしまうストライドアクセスが行われる場合のようにデータがメモリの連続するアドレスに対して書き込まれない場合には、「Write-Combining」を使用することができない。このため「Write-Combining」が必ずしも有効に利用されない場合があった。
【０００４】
本発明は、プロセッサからメモリへのデータの書き込みを高速化することが可能なプログラム及び情報処理装置を提供することを目的とする。
【課題を解決するための手段】
【０００５】
上記目的を達成するために、本発明では、ＣＰＵ上で稼動するコンパイラプログラムがソースコードをオブジェクトコードに変換するコンパイル方法において、コンパイラプログラムの中間コード生成部が、ソースファイルに記述されているソースコードから中間コードを生成するステップを行い、コンパイラプログラムの制御フロー解析部が、前記中間コードに基づいて制御フロー情報を生成するステップを行い、コンパイラプログラムのデータフロー解析部が、前記中間コード及び前記制御フロー情報に基づいてデータフロー情報を生成するステップを行い、コンパイラプログラムの最適化部が、前記データフロー情報に含まれる配列情報を取得するステップと、前記配列情報に基づいて、前記中間コードが、ソースコードに記述されているあるループ処理において定義されている配列が当該ループ処理で使用されず、前記定義に応じて前記メモリに書き込まれるデータの書き込み先のアドレスが規則的に空いており、前記ループ処理に後続する処理において、前記規則的に空いているアドレスに対し、データの読み出しがされる前にデータが書き込まれるものであると判断した場合に、前記中間コードの規則的に空いているアドレスにデータを書き込むステップとを行い、コンパイラプログラムのオブジェクト生成部が、前記データを書き込んだ中間コードに基づいてオブジェクトコードが記述されたオブジェクトファイルを生成するステップとを行う。
【発明の効果】
【０００６】
本発明によれば、プロセッサからメモリへのデータの書き込みを高速化することができる。
【発明を実施するための最良の形態】
【０００７】
以下、本発明の実施形態につき添付図面を参照しつつ説明する。
【０００８】
［実施例１］
図１は、以下の実施形態で説明するソースコードをオブジェクトコードに変換するプログラム（以下、コンパイラプログラムと称する。）が実行される情報処理装置１のハードウエア構成である。同図に示すように、情報処理装置１は、ＣＰＵ１１、ＲＡＭ／ＲＯＭ等のメモリからなる主記憶装置１２、キーボードやマウス等の入力装置１３、液晶ディスプレイやブラウン管ディスプレイ等の表示装置１４、ハードディスク等の外部記憶装置１５を備えている。また各装置１１〜１５は、バス１６を介して互いに通信可能に接続されている。
【０００９】
主記憶装置１２には、実行途中のプログラムやデータが記憶される。情報処理装置１のユーザは、入力装置１３を操作してコンパイラプログラムの起動やコンパイルオプションの入力等を行う。表示装置１４には、コンパイラプログラムの実行状況等の各種情報が表示される。外部記憶装置１５には、コンパイラプログラムやコンパイルの対象となるソースコードが記述されたファイルであるソースファイル、コンパイラプログラムが出力するオブジェクトコードが記述されたファイルであるオブジェクトファイル等が記憶される。
【００１０】
図２にコンパイラプログラムの機能（コンパイラプログラムによって行われる処理）を示す。同図において、中間コード生成部２１は、ソースファイル２１１に記述されているソースコードに基づき中間コード２１２を生成する。制御フロー解析部２２は、中間コード２１２から条件分岐などの制御の流れを解析し、制御の流れに関する情報である制御フロー情報２１３を出力する。データフロー解析部２３は、中間コード２１２、及び制御フロー情報２１３から変数の参照情報などのデータの流れを解析し、データの流れに関する情報であるデータフロー情報２１４を出力する。最適化部２４は、中間コード２１２、制御フロー情報２１３、及びデータフロー情報２１４に基づきコードの並び替え等の最適化を実施して中間コード２１２を変換する。なお、最適化部２４によって行われる処理の詳細については後述する。オブジェクト生成部２５は、中間コード２１２に基づきオブジェクトコードを生成し、オブジェクトコードが記述されたファイルであるオブジェクトファイル２１５を出力する。
【００１１】
なお、中間コード生成部２１、制御フロー解析部２２、データフロー解析部２３、最適化部２４、及びオブジェクト生成部２５の各機能は、ＣＰＵ１１が、外部記憶装置１５に記憶されているコンパイラプログラム２０を主記憶装置１２に読み出して実行することにより実現される。
【００１２】
次に、最適化部２４によって行われる処理について説明する。図３は最適化部２４によって行われる、中間コード２１２の変換に関する処理を説明するフローチャートである。同図に示す処理は、変換対象となる中間コード２１２に含まれている各ループ処理で定義されている配列毎に実行される。なお、以下の説明では、最適化部２４が中間コード２１２を変換する場合について説明するが、同等の処理をコンパイラプログラム２０がソースコードを変換することにより実現してもよい。
【００１３】
同図に示すように、まず最適化部２４は、データフロー情報に含まれている、処理対象になっているループ処理における配列の定義、又は配列の使用に関する配列情報を取得し（Ｓ３１１）、当該ループ処理中で定義されている配列（値が設定されている配列）が、当該ループ処理中で使用されている（定義のみでない）か否かを判断する（Ｓ３１２）。Write-Combiningによる高速化は、配列へのアクセスが定義だけの場合には有効であるが、配列の使用がある場合には高速化されないからである。使用されている場合には（Ｓ３１２：ＹＥＳ）、処理を終了し、使用されていない場合（定義のみの場合）には（Ｓ３１２：ＮＯ）、Ｓ３１３に進む。
【００１４】
続くＳ３１３において、最適化部２４は、当該ループ処理中に定義されている配列が、主記憶装置１２の連続するアドレスに対して書き込まれるように定義されているか否かを判断する。連続するアドレスに対して書き込まれるように定義されている場合には（Ｓ３１３：ＹＥＳ）、Write-Combiningによる高速化がすでに有効な状態になっているので処理を終了し、連続するアドレスに書き込まれるように定義されていない場合には（Ｓ３１３：ＮＯ）、Ｓ３１４に進む。
【００１５】
Ｓ３１４において、最適化部２４は、当該ループ処理中において、主記憶装置１２へのアクセスがストライドアクセスとなるように配列が定義されているか否かを判断する。スライドアクセスストライドアクセスとなるように定義されている場合には、アクセスされない部分に対してダミー値を定義するように変換して連続するアクセスにし、Write-Combiningを有効にすることができるからである。ストライドアクセスとなるように定義されている場合には（Ｓ３１４：ＹＥＳ）、Ｓ３１５に進み、ストライドアクセスとなるように定義されていない場合には（Ｓ３１４：ＮＯ）、処理を終了する。
【００１６】
Ｓ３１５において、最適化部２４は、当該ループ処理に後続する処理を解析し、当該ループ処理に後続する処理において、ストライドアクセスとなる配列の非定義部分に対して、主記憶装置１２からのデータの読み出し（使用）が行われる前に書き込み（定義）が行われるか否かを判断する。配列の書き込み（定義）が先にある場合には、書き込みで配列の値が書き換えられるので、書き込み前にある対象ループで配列にダミーの値を書き込んでも問題ないが、配列の読み出し（使用）が先にある場合には、ダミーの値を読み出されると、プログラムが正しくなくなるからである。データの読み出しがされる前に書き込みが行われる場合には（Ｓ３１５：ＹＥＳ）、Ｓ３１６に進み、データの読み出しがされる前に書き込みが行われない場合には（Ｓ３１５：ＮＯ）、処理を終了する。
【００１７】
なお、主記憶装置１２からのデータの読み出しがされる前に書き込みが行われない場合には（Ｓ３１５：ＮＯ）、後述するＳ３１６におけるダミーの定義が挿入されることによって後続の処理に影響を与える場合がある。
【００１８】
Ｓ３１６において、最適化部２４は、中間コード２１２を「ストライドアクセスにおける配列の非定義部分にダミーの定義を挿入する処理」を含んだ内容に変換する。
【００１９】
次に、以上に説明した処理について、最適化部２４が、図４Ａに示したソースコード４１１に対応する内容の中間コード２１２を、図４Ｂに示すソースコード４１２に対応する中間コード２１２に変換する場合を例として具体的に説明する。なお、以下の説明において、ソースコード４１１又はソースコード４１２という場合には、これらに対応する中間コードをいうものとする。
【００２０】
図３のＳ３１１において、最適化部２４は、ソースコード４１１のループＳ１における配列ａ（ｉ）に関する情報を取得する。なお、図４Ａに示すソースコード４１１には２つの配列ａ（ｉ）、ｂ（ｉ）が定義されているが、以下では配列ａ（ｉ）についてのみ説明する。
【００２１】
Ｓ３１２において、最適化部２４は、ループＳ１において配列ａ（ｉ）が使用されているか否かを判断する。ここでループＳ１では配列ａ（ｉ）は定義のみされているので、最適化部２４は、ループＳ１において配列ａ（ｉ）は使用はされていないと判断し（Ｓ３１２：ＮＯ）、Ｓ３１３に進む。
【００２２】
Ｓ３１３において、最適化部２４は、ループＳ１中で配列ａ（ｉ）の内容が主記憶装置１２の連続するアドレスに対して書き込まれるように定義されているか否かを判断する。ここでソースコード４１１の２行目の記述「L1: do i=1, n-1, 2」は、添字iを「２」ずつ増加させる内容になっており、配列ａ（ｉ）の内容は主記憶装置１２の連続するアドレスに対して書き込まれるわけではないので（Ｓ３１３：ＮＯ）、Ｓ３１４に進む。
【００２３】
Ｓ３１４において、最適化部２４は、ループＳ１中における配列ａ（ｉ）の定義がストライドアクセスであるか否かを判断する。ソースコード４１１の２行目の記述「L1: do i=1, n-1, 2」は、添字iの増分が「２」になっており、配列ａ（ｉ）は規則的なアドレス間隔をおいて主記憶装置１２に書き込まれるのでストライドアクセスとなり（Ｓ３１４：ＹＥＳ）、Ｓ３１５に進む。
【００２４】
Ｓ３１５において、最適化部２４は、ループＳ１の処理に後続する処理を解析し、後続する処理がストライドアクセスにおける配列の非定義部分に対して読み出される前に書き込みが行われるか否かを判断する。
【００２５】
ここでソースコード４１１では、ループＬ１の処理に後続するループＬ２の処理において配列ａ（ｉ）の定義のみがされており、配列ａ（ｉ）は読み出される前に定義がされている。また５行目の記述「L2: do i=1,n」から、添字の増分は「１」であるため、ループＬ２の処理において配列ａ（ｉ）の非定義部分（a（２）、ａ（４）、ａ（６）・・・）について書き込みがされている。すなわち、非定義部分に対する読み出しがされる前に書き込みが行われるので（Ｓ３１５：ＹＥＳ）、Ｓ３１６に進む。
【００２６】
Ｓ３１６において、最適化部２４は、ソースコード４１１（中間コード２１２）を、「ストライドアクセスにおける配列の非定義部分にダミーの定義を挿入する処理」である、配列ａ（ｉ）の非定義部分（a（２）、ａ（４）、ａ（６）・・・）に値「０」を設定する処理を含んだ内容に変換する。すなわち、最適化部２４は、図４Ａに示すソースコード４１１を、ダミーの定義文「S3：  a(i+1) = 0」を含んだ図４Ｂに示すソースコード４１２に変換する。
【００２７】
以上によれば、ソースコード４１１は、規則的に空いているアドレスに対してデータが書き込まれる内容に変換される。このため、オブジェクトコードの生成に際して「Write-Combining」の使用頻度が増え、プロセッサからメモリへのデータの書き込みを高速化することができる。なお、上記処理の付加は、オブジェクトコードの生成以前において静的に行われるので、実行時のオーバーヘッドに影響を与えることもない。
【００２８】
［実施例２］
ところで、実際には後続する処理が複雑である場合や、関数や手続き呼び出しにより配列の定義状況や使用状況が不明な場合があり、実施例１で説明した処理（図３）をそのまま適用することができないことがある。そこで実施例２では、ソースコードに記述されているコンパイラプログラム２０への指示文に応じて、最適化部２４による中間コード２１２の変換が行われるようにしている。
【００２９】
図５は最適化部２４によって行われる中間コード２１２の変換に関する処理を説明するフローチャートである。同図に示すＳ５１１乃至Ｓ５１４の処理は、図３のＳ３１１乃至Ｓ３１４の処理と同様である。またＳ５１６乃至Ｓ５１７の処理は、図３のＳ３１５乃至Ｓ３１６の処理と同様である。
【００３０】
Ｓ５１４において、当該ループ処理中における配列が、主記憶装置１２へのアクセスがストライドアクセスとなるように定義されている場合には（Ｓ５１４：ＹＥＳ）、Ｓ５１５に進む。一方、配列がストライドアクセスとなるように定義されていない場合には（Ｓ５１４：ＮＯ）、処理が終了する。
【００３１】
Ｓ５１５では、最適化部２４は、中間コード２１２（ソースコードでもよい）を解析し、中間コード２１２にコンパイラプログラム２０への指示文が含まれているか否かを判断する。指示文が含まれている場合には（Ｓ５１５：ＹＥＳ）、Ｓ５１７に進み、当該ループ処理に後続する処理を解析（Ｓ５１６）することなく、中間コード２１２を「ストライドアクセスにおける配列の非定義部分にダミーの定義を挿入する処理」を含んだ内容に変換する。指示文が含まれていない場合には（Ｓ５１５：ＮＯ）、Ｓ５１６に進む。
【００３２】
例えば図６Ａに示すソースコード６１１の場合には、２行目に「!$ stream_store(a,0)」が記述されている。この指示文は、配列ａ（ｉ）が主記憶装置１２の連続するアドレスに対して書き込まれる内容に中間コード２１２を変換する旨をコンパイラプログラム２０に指示する指示文であり、この記述に応じて、最適化部２４は、中間コード２１２を、配列ａ（ｉ）の非定義部分に指示文で指定されている値「０」を代入する記述「S2:  a(i+1) = 0」を含んだ図６Ｂに示す内容に変換する。
【００３３】
以上によれば、ソースコードに所定の指示文が記述されている場合には、ソースコードに規則的に空いているアドレスに対してデータを書き込む処理が付加される。このため、ユーザはソースコードに上記指示文を付加することで、後続する処理が複雑である場合や、関数や手続き呼び出しにより配列の定義状況や使用状況が不明な場合でも、上記処理を確実にソースコードに付加することができる。
【００３４】
［実施例３］
実施例１では、非定義部分のデータサイズが大きい場合、非定義部分への書き込みが多くなり、その結果、中間コード２１２を変換することにより返ってプログラム全体の処理時間が長くなってしまうことがある。そこで実施例３では、非定義部分のデータサイズに応じて中間コード２１２を変換するようにしている。
【００３５】
図７は、最適化部２４によって行われる中間コード２１２の変換に関する処理を説明するフローチャートである。同図におけるＳ７１１乃至Ｓ７１４の処理は、図３のＳ３１１乃至Ｓ３１４の処理と同様である。またＳ７１６乃至Ｓ７１７の処理は、図３のＳ３１５乃至Ｓ３１６の処理と同様である。
【００３６】
Ｓ７１４において、当該ループ処理中における配列の定義が、主記憶装置１２へのアクセスがストライドアクセスとなるように定義されている場合には（Ｓ７１４：ＹＥＳ）、Ｓ７１５に進む。ストライドアクセスとなるように定義されていない場合には（Ｓ７１４：ＮＯ）、処理が終了する。
【００３７】
Ｓ７１５では、最適化部２４は、中間コード２１２を解析し、ストライドアクセスの非定義部分のデータサイズが「Write-Combining」が利用しているバッファのサイズよりも大きいか否かを判断する。非定義部分のデータサイズの方が大きい場合には（Ｓ７１５：ＹＥＳ）、処理を終了する。非定義部分のデータサイズが「Write-Combining」が利用しているバッファサイズ以下であれば（Ｓ７１５：ＮＯ）、Ｓ７１６に進む。
【００３８】
なお、非定義部分のデータサイズが「Write-Combining」機能が利用するバッファサイズよりも大きい場合はバッファの内容が全てダミーデータとなって、ダミーデータのみのための書き込みが発生して無駄な処理が行われてしまうが、上記のように非定義部分のデータサイズが「Write-Combining」が利用しているバッファのサイズよりも大きい場合に非定義部分へのダミーデータの挿入を行わないようにすることで、このような無駄な処理が生じるのを防ぐことができる。
【００３９】
以上によれば、規則的に空いているアドレスで指定される領域のデータサイズが所定のデータサイズ以下である場合にのみ、規則的に空いているアドレスに対してデータを書き込む処理がソースコードに付加される。このため、ソースコードに上記処理を付加することにより返ってオブジェクトコードの実行負荷が増大してしまうのを防ぐことができる。
【００４０】
［実施例４］
実施例１では、中間コード２１２を「ストライドアクセスにおける配列の非定義部分にダミーの定義を挿入する処理」を含んだ内容に変換している（図３のＳ３１６）が、対象になっているループ処理よりも前の処理で当該ループ処理中の配列の内容が定義されている場合には、その内容をダミーデータとして採用することが好ましい。
【００４１】
図８は、最適化部２４によって行われる中間コード２１２の変換に関する処理を説明するフローチャートである。同図におけるＳ８１１乃至Ｓ８１４の処理は、図３のＳ３１１乃至Ｓ３１４の処理と同様である。
【００４２】
Ｓ８１５において、最適化部２４は、対象になっているループ処理よりも前の処理で当該ループ処理中の配列の内容が定義されているか否かを判断する。定義されている場合には（Ｓ８１５：ＹＥＳ）、Ｓ８１６に進む。定義されていない場合には（Ｓ８１５：ＮＯ）、処理を終了する。
【００４３】
Ｓ８１６において、最適化部２４は、前の処理で配列に定義されている値が定数であるか否かを判断する。定数である場合には（Ｓ８１６：ＹＥＳ）、Ｓ８１７に進む。定数でない場合には（Ｓ８１６：ＮＯ）、処理が終了する。
【００４４】
Ｓ８１７では、最適化部２４は、中間コード２１２に、当該ループ処理中の配列に、当該ループ処理よりも前の処理において当該配列に定義されている定数を定義する内容の記述を挿入する。
【００４５】
次に以上に説明した処理について、最適化部２４が、図９Ａに示したソースコード９１１に対応する内容の中間コード２１２を、図９Ｂに示すソースコード９１２に対応する中間コード２１２に変換する場合を例として具体的に説明する。
【００４６】
Ｓ８１５において、最適化部２４は、ループＬ１よりも前の処理を解析し、ループＬ１よりも前にストライドアクセスにおける配列ａ（ｉ）の非定義部分に対する定義があるか否か判断する。ソースコード９１１では、ループＬ１の前のループＬ０の処理において、配列ａ（ｉ）の非定義部分に対して定数が定義（代入）されているので、非定義部分に対する定義があると判断し（Ｓ８１５：ＹＥＳ）、Ｓ８１６に進む。
【００４７】
Ｓ８１６では、最適化部２４は、ループＬ０で配列ａ（ｉ）の非定義部分に定義されている値が定数であるか否かを判断する。ループＬ０では配列ａ（ｉ）の非定義部分に定数「１」が定義されているので（Ｓ８１６：ＹＥＳ）、Ｓ８１７に進む。
【００４８】
Ｓ８１７では、ソースコード９１１に配列ａ（ｉ）の非定義部分に定数「１」を定義する内容の記述を挿入する。すなわち、最適化部２４は、図９Ａに示すソースコード９１１を、ダミーの定義文「S2：    a(i+1) = 1」を含んだ図９Ｂに示すソースコード９１２に変換する。
【００４９】
以上によれば、ループ処理よりも前に実行される処理において、配列に対して定数を設定する定義が存在する場合には、ソースコードに規則的に空いているアドレスに対して上記定数が書き込まれる。すなわち、ループ処理の前後において、規則的に空いているアドレスの内容が不一致となるのを防ぐことができる。
【００５０】
なお、以上の実施形態の説明は、本発明の理解を容易にするためのものであり、本発明を限定するものではない。本発明はその趣旨を逸脱することなく、変更、改良され得ると共に本発明にはその等価物が含まれることは勿論である。
【図面の簡単な説明】
【００５１】
【図１】コンパイラプログラム２０が実行される情報処理装置１のハードウエア構成である。
【図２】コンパイラプログラム２０の機能（コンパイラプログラム２０によって行われる処理）を説明する図である。
【図３】実施例１における中間コード２１２の変換処理を説明するフローチャートである。
【図４Ａ】最適化部２４による変換がされる前の中間コード２１２に対応するソースコードの一例である。
【図４Ｂ】最適化部２４による変換がされた後の中間コード２１２に対応するソースコードの一例である。
【図５】実施例２の変換処理を説明するフローチャートである。
【図６Ａ】最適化部２４による変換がされる前の中間コード２１２に対応するソースコードの一例である。
【図６Ｂ】最適化部２４による変換がされた後の中間コード２１２に対応するソースコードの一例である。
【図７】実施例３の変換処理を説明するフローチャートである。
【図８】実施例４の変換処理を説明するフローチャートである。
【図９Ａ】最適化部２４による変換がされる前の中間コード２１２に対応するソースコードの一例である。
【図９Ｂ】最適化部２４による変換がされた後の中間コード２１２に対応するソースコードの一例である。
【符号の説明】
【００５２】
２０  コンパイラプログラム
２１  中間コード生成部
２２  制御フロー解析部
２３  データフロー解析部
２４  最適化部
２５  オブジェクト生成部
２１１  ソースファイル
２１２  中間コード
２１３  制御フロー情報
２１４  データフロー情報
２１５  オブジェクトファイル
４１１  ソースコード
４１２  ソースコード
【図１】
2009175797.tif 000003
【図２】
2009175797.tif 000004
【図３】
2009175797.tif 000005
【図４Ａ】
2009175797.tif 000006
【図４Ｂ】
2009175797.tif 000007
【図５】
2009175797.tif 000008
【図６Ａ】
2009175797.tif 000009
【図６Ｂ】
2009175797.tif 000010
【図７】
2009175797.tif 000011
【図８】
2009175797.tif 000012
【図９Ａ】
2009175797.tif 000013
【図９Ｂ】
2009175797.tif 000014