(57)【要約】【課題】  コンパイラが誤った機械語プログラムを生成してしまうことがないように、プラグマに代表されるヒント情報のチェックを行なうことができるプログラム処理装置を提供する。【解決手段】  ユーザがコンパイラに対して与えるヒント情報を含むプログラム１０１の構文を解析して、解析情報１０６を生成する構文解析部１０４と、前記解析情報１０６に基づいて、前記ヒント情報を含むプログラム１０１中での前記ヒント情報の論理的な整合性をチェックするエラーチェック部１０５とを備える。【選択図】      図１
2006107339.tif 000002
【特許請求の範囲】
【請求項１】
ユーザがコンパイラに対して与えるヒント情報を含むプログラムを受け、前記ヒント情報を含むプログラム中での前記ヒント情報の論理的な整合性をチェックする
ことを特徴とするプログラム処理装置。
【請求項２】
前記ヒント情報を含むプログラムの構文を解析して、解析情報を生成する構文解析手段と、
前記解析情報に基づいて、前記ヒント情報を含むプログラム中での前記ヒント情報の論理的な整合性をチェックするチェック手段とを備える
ことを特徴とする請求項１に記載のプログラム処理装置。
【請求項３】
前記ヒント情報は、プログラムの静的な解析により得ることが可能な静的情報であり、
前記構文解析手段は、前記ヒント情報を含むプログラムの構文を静的に解析し、前記解析情報を生成する
ことを特徴とする請求項２に記載のプログラム処理装置。
【請求項４】
前記構文解析手段は、前記ヒント情報を含むプログラム中の関数間の情報を静的に解析して前記解析情報を生成する
ことを特徴とする請求項３に記載のプログラム処理装置。
【請求項５】
前記ヒント情報は、ループ処理の繰り返し回数に関する情報であり、
前記構文解析手段は、前記ヒント情報を含むプログラムに含まれるループ処理の繰り返し回数を解析して、当該繰り返し回数を含む前記解析情報を生成する
ことを特徴とする請求項３または４に記載のプログラム処理装置。
【請求項６】
前記ヒント情報は、ループ処理の繰り返しが所定回数以上行われることを指定する情報であり、
前記チェック手段は、前記解析情報に基づいて、前記ヒント情報に対応するループ処理の繰り返しが、前記所定回数以上行われるか否かをチェックする
ことを特徴とする請求項５に記載のプログラム処理装置。
【請求項７】
前記ヒント情報は、ループ処理の繰り返しが所定回数以下しか行われないことを指定する情報であり、
前記チェック手段は、前記解析情報に基づいて、前記ヒント情報に対応するループ処理の繰り返しが、前記所定回数以下しか行われないか否かをチェックする
ことを特徴とする請求項５に記載のプログラム処理装置。
【請求項８】
前記ヒント情報は、ループ処理の繰り返し回数が必ず偶数であることを指定する情報であり、
前記チェック手段は、前記解析情報に基づいて、前記ヒント情報に対応するループ処理の繰り返し回数が必ず偶数であるか否かをチェックする
ことを特徴とする請求項５に記載のプログラム処理装置。
【請求項９】
前記ヒント情報は、ループ処理の繰り返し回数が必ず奇数であることを指定する情報であり、
前記チェック手段は、前記解析情報に基づいて、前記ヒント情報に対応するループ処理の繰り返し回数が必ず奇数であるか否かをチェックする
ことを特徴とする請求項５に記載のプログラム処理装置。
【請求項１０】
前記ヒント情報は、データの配置位置に関する情報であり、
前記構文解析手段は、前記ヒント情報を含むプログラムに含まれるデータの配置位置を解析して、当該データの配置位置を含む前記解析情報を生成する
ことを特徴とする請求項３または４に記載のプログラム処理装置。
【請求項１１】
前記ヒント情報は、データと、当該データが所定値でアラインメントされていることとを指定する情報であり、
前記構文解析手段は、前記ヒント情報を含むプログラムに含まれるデータのアラインメント値を解析して、解析結果を含む前記解析情報を生成し、
前記チェック手段は、前記解析情報に基づいて、前記ヒント情報で指定されたデータのアラインメント値が、前記ヒント情報で指定された前記所定値と一致するか否かをチェックする
ことを特徴とする請求項１０に記載のプログラム処理装置。
【請求項１２】
前記ヒント情報は、ポインタ変数のアクセスする領域に関する情報であり、
前記構文解析手段は、前記ヒント情報を含むプログラムに含まれるポインタ変数のアクセスする領域を解析して、解析結果を含む前記解析情報を生成する
ことを特徴とする請求項３または４に記載のプログラム処理装置。
【請求項１３】
前記ヒント情報は、ポインタ変数と、当該ポインタ変数がアクセスする領域が、他のポインタ変数がアクセスする領域との間で重複する領域を有しないこととを指定する情報であり、
前記構文解析手段は、前記ヒント情報を含むプログラムに含まれるポインタ変数がアクセスする領域が、他のポインタ変数がアクセスする領域との間で重複する領域を有するか否かを解析して、解析結果を含む前記解析情報を生成し、
前記チェック手段は、前記解析情報に基づいて、前記ヒント情報で指定されたポインタ変数が、他のポインタ変数がアクセスする領域との間で重複する領域を有するか否かをチェックする
ことを特徴とする請求項１２に記載のプログラム処理装置。
【請求項１４】
前記プログラムはISO/IEC 9899:1999 - Programming Language Cに準拠した言語で記述されており、
前記ヒント情報は、前記ポインタ変数と、restrict記述との組み合わせである
ことを特徴とする請求項１３に記載のプログラム処理装置。
【請求項１５】
前記ヒント情報は、変数からのデータの読み出しまたは変数へのデータの書き込みに関する情報であり、
前記構文解析手段は、前記ヒント情報を含むプログラムに含まれる変数からのデータの読み出しまたは当該変数へのデータの書き込みを解析して、解析結果を含む前記解析情報を生成する
ことを特徴とする請求項３または４に記載のプログラム処理装置。
【請求項１６】
前記ヒント情報は、変数と、当該ヒント情報が記述された位置以降においては、当該変数へのアクセスがデータの書き込みから始まることとを指定する情報であり、
前記チェック手段は、前記解析情報に基づいて、前記ヒント情報で指定された変数が、当該ヒント情報が記述された位置以降においては、当該変数へのアクセスがデータの書き込みから始まっているか否かをチェックする
ことを特徴とする請求項１５に記載のプログラム処理装置。
【請求項１７】
前記ヒント情報は、分岐条件の成立頻度に関する情報であり、
前記構文解析手段は、前記ヒント情報を含むプログラムに含まれる分岐条件の静的な成立頻度を解析して、解析結果を含む前記解析情報を生成する
ことを特徴とする請求項３または４に記載のプログラム処理装置。
【請求項１８】
前記ヒント情報は、分岐条件が成立する可能性が高いことを示す情報であり、
前記チェック手段は、前記構文解析手段に基づいて、前記ヒント情報に対応する分岐条件が成立する可能性が高いか否かをチェックする
ことを特徴とする請求項１７に記載のプログラム処理装置。
【請求項１９】
前記ヒント情報は、コンパイラによるプログラムの最適化処理方法を指示する情報であり、
前記チェック手段は、前記解析情報に基づいて、前記ヒント情報で指示された前記最適化処理方法が実現可能か否かをチェックする
ことを特徴とする請求項２〜４のいずれか１項に記載のプログラム処理装置。
【請求項２０】
前記ヒント情報は、ループアンローリングによるループ処理の最適化を指示する情報であり、
前記構文解析手段は、前記ヒント情報を含むプログラムに含まれるループ処理の繰り返し回数を解析して、当該繰り返し回数を含む解析情報を生成し、
前記チェック手段は、前記解析情報に基づいて、前記ヒント情報に対応するループ処理に対して、ループアンローリングによる最適化が可能か否かをチェックする
ことを特徴とする請求項１９に記載のプログラム処理装置。
【請求項２１】
前記チェック手段は、
ループアンローリング時に展開する繰り返しの数が２の場合には、前記解析情報に基づいて、前記ヒント情報に対応するループ処理の繰り返し回数が２回以上で、かつ奇数回または偶数回のいずれかのみであるという条件を満たすか否かを判断する条件判断部と、
前記条件を満たす場合に、前記ヒント情報に対応するループ処理に対して、ループアンローリングによる最適化が可能であると判断するループアンローリング可否判断部とを有する
ことを特徴とする請求項２０に記載のプログラム処理装置。
【請求項２２】
前記ヒント情報は、ソフトウェアパイプライニングによるループ処理の最適化を指示する情報であり、
前記構文解析手段は、前記ヒント情報を含むプログラムに含まれるループ処理の繰り返し回数を解析して、当該繰り返し回数を含む解析情報を生成し、
前記チェック手段は、前記解析情報に基づいて、前記ヒント情報に対応するループ処理に対して、ソフトウェアパイプライニングによる最適化が可能か否かを判断する
ことを特徴とする請求項１９に記載のプログラム処理装置。
【請求項２３】
前記チェック手段は、
同時に実行される繰り返しの数がｎ（ｎは２以上の整数）の場合には、前記解析情報に基づいて、前記ヒント情報に対応するループ処理の繰り返し回数がｎ回以上であるか否かを判断する繰り返し回数判断部と、
前記ヒント情報に対応する前記ループ処理の前記繰り返し回数がｎ回以上であれば、当該ループ処理に対して、ソフトウェアパイプライニングによる最適化が可能であると判断するソフトウェアパイプライニング可否判断部とを有する
ことを特徴とする請求項２２に記載のプログラム処理装置。
【請求項２４】
前記ヒント情報は、複数のデータと、当該複数のデータに対するペア命令の生成によるデータアクセスの最適化とを指示する情報であり、
前記構文解析手段は、前記ヒント情報を含むプログラムに含まれるデータのアラインメント値を解析して、解析結果を含む前記解析情報を生成し、
前記チェック手段は、
前記解析手段に基づいて、前記ヒント情報で指定された前記複数のデータのアラインメント値が、前記複数のデータの型のサイズの２倍以上であるという条件を満たすか否かを判断する条件判断部と、
前記条件を満たす場合に、前記ヒント情報で指定された前記複数のデータに対して、ペア命令の生成によるデータアクセスの最適化が可能であると判断するペア命令生成可否判断部とを有する
ことを特徴とする請求項１９に記載のプログラム処理装置。
【請求項２５】
前記ヒント情報は、変数と、キャッシュメモリの制御処理の最適化とを指示する情報である
ことを特徴とする請求項１９に記載のプログラム処理装置。
【請求項２６】
前記ヒント情報は、変数と、当該変数の値を記憶するための領域を前記キャッシュメモリ上に確保することを指示する情報であり、
前記構文解析手段は、前記ヒント情報を含むプログラムに含まれる変数からのデータの読み出しまたは当該変数へのデータの書き込みを解析して、解析結果を含む前記解析情報を生成し、
前記チェック手段は、
前記解析手段に基づいて、前記ヒント情報で指定された前記変数が、当該ヒント情報が記述された位置以降においては、当該変数へのアクセスがデータの書き込みから始まっているという条件を満たすか否かを判断する条件判断部と、
前記条件を満たす場合に、前記ヒント情報で指定された前記変数の値を記憶するための領域を前記キャッシュメモリ上に確保することによる前記キャッシュメモリの最適化が可能であると判断するキャッシュメモリ最適化可否判断部とを有する
ことを特徴とする請求項２５に記載のプログラム処理装置。
【請求項２７】
前記プログラムはＣ言語またはＣ＋＋言語で記述されており、
前記ヒント情報は、前記プログラム中にユーザが記述することができるコンパイラへの指示であるプラグマ記述である
ことを特徴とする請求項１〜２６のいずれか１項に記載のプログラム処理装置。
【請求項２８】
前記ヒント情報は、組込み関数である
ことを特徴とする請求項１〜２６のいずれか１項に記載のプログラム処理装置。
【請求項２９】
さらに、前記チェック手段において前記ヒント情報の論理的な整合性がないと判断された場合には、エラー情報を出力するエラー情報出力手段を備える
ことを特徴とする請求項２〜２８のいずれか１項に記載のプログラム処理装置。
【請求項３０】
前記エラー情報出力手段は、前記チェック手段において前記ヒント情報の論理的な整合性がないと判断された場合には、当該ヒント情報の修正方法を出力する
ことを特徴とする請求項２９に記載のプログラム処理装置。
【請求項３１】
前記エラー情報出力手段は、前記チェック手段において前記ヒント情報の論理的な整合性がないと判断された場合には、不足するヒント情報を出力する
ことを特徴とする請求項２９記載のプログラム処理装置。
【請求項３２】
前記エラー情報出力手段は、前記チェック手段において前記ヒント情報の論理的な整合性がないと判断された場合には、コンパイラを起動する際に、コンパイルの対象となる前記ヒント情報を含むプログラムに対してユーザが指定するコンパイルオプションを出力する
ことを特徴とする請求項２９に記載のプログラム処理装置。
【請求項３３】
前記コンパイルオプションは、前記コンパイルの対象となる前記ヒント情報を含むプログラムに含まれるデータの配置方法を指示するコンパイルオプションである
ことを特徴とする請求項３２に記載のプログラム処理装置。
【請求項３４】
さらに、前記チェック手段において前記ヒント情報の論理的な整合性があるか否かを判断できない場合には、当該ヒント情報の論理的な整合性があるか否かが判断できないことを示すエラー情報を出力するエラー情報出力手段を備える
ことを特徴とする請求項２〜２８のいずれか１項に記載のプログラム処理装置。
【請求項３５】
プログラム中の、コンパイラに対して与えられるヒント情報の論理的な整合性をチェックするプログラム処理装置であって、
ユーザがコンパイラに対して与えるヒント情報を含むプログラムと、前記ヒント情報を含むプログラムの構文解析結果である解析情報とを入力とし、前記解析情報に基づいて、前記ヒント情報を含むプログラム中での前記ヒント情報の論理的な整合性をチェックするチェック手段を備える
ことを特徴とするプログラム処理装置。
【請求項３６】
前記解析情報には、関数の引数に関する情報が含まれる
ことを特徴とする請求項３５に記載のプログラム処理装置。
【請求項３７】
前記解析情報には、大域変数に関する情報が含まれる
ことを特徴とする請求項３５に記載のプログラム処理装置。
【請求項３８】
前記解析情報には、データの配置位置に関する情報が含まれる
ことを特徴とする請求項３５に記載のプログラム処理装置。
【請求項３９】
前記解析情報には、ポインタ変数のアクセスする領域に関する情報が含まれる
ことを特徴とする請求項３５に記載のプログラム処理装置。
【請求項４０】
請求項２〜３９のいずれか１項に記載のプログラム処理装置に含まれる手段としてコンピュータを機能させる
ことを特徴とするプログラム。
【請求項４１】
請求項４０に記載のプログラムを記録したコンピュータ読み取り可能な記録媒体。
【請求項４２】
ユーザがコンパイラに対して与えるヒント情報を含むプログラムを入力として受け、前記ヒント情報を含むプログラム中での前記ヒント情報の論理的な整合性をチェックする
ことを特徴とするプログラム処理方法。
【請求項４３】
前記ヒント情報を含むプログラムの構文を解析して、解析情報を生成する構文解析ステップと、
前記解析情報に基づいて、前記ヒント情報を含むプログラム中での前記ヒント情報の論理的な整合性をチェックするチェックステップとを含む
ことを特徴とする請求項４２に記載のプログラム処理方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、Ｃ言語等の高級言語で記述されたソースプログラムの論理矛盾をチェックするプログラム処理装置に関し、特に、ソースプログラムを機械語プログラムに変換するコンパイラに対して与えられるヒント情報の論理矛盾をチェックするプログラム処理装置に関する。
【背景技術】
【０００２】
近年、メディア処理アプリケーションの増大化、多様化により、開発工数が増大し、メディア処理分野においても高級言語によるアプリケーション開発が必要とされるようになってきている。そのために、高級言語によるメディア処理アプリケーション開発を実現する試みが行われている。その際、ユーザは、高級言語による開発であっても、より精密なチューニングができることを期待している。このため、コンパイラが行う最適化戦略を詳細に制御することが必要となる。
【０００３】
その最適化戦略の制御方法は、大きく２つに分けられる。
一方の制御方法としては、コンパイラに対して、ある最適化に関する指示を直接行う制御方法が挙げられる。他方の制御方法としては、プログラム全体の静的情報をコンパイラに対して示すことにより、コンパイラによる最適化のサポートを行う制御方法が挙げられる。
【０００４】
そして、これらの２通りの制御方法を具体的に実現するための方法の１つとして、プラグマによるコンパイラに対する指示が挙げられる。「プラグマ」とは、言語処理系に依存した記述であり、コンパイラに対して何らかの情報を与えるものである。
【０００５】
以下に、プラグマの例を示す。図５２は、最適化に関する指示を直接行うプラグマを含むソースプログラムの一例を示す図である。「#pragma _software_pipelining」は、その直後に記述されたループ処理に対してソフトウェアパイプライニングによる最適化を施すように指示を行なうためのプラグマであり、ユーザによって記述されたものである。コンパイラは、このプラグマによる指示に基づいて、当該ループ処理に対してソフトウェアパイプライニングによる最適化を施す。ソフトウェアパイプライニングとは、異なるイタレーション（繰り返し処理）を同時にいくつか実行する技術である。
【０００６】
図５３は、プログラム全体の静的情報をコンパイラに対して示すプラグマを含むソースプログラムの一例を示す図である。「#pragma _min_iteration=5」は、その直後に記述されたループ処理に対して、ループ処理の繰り返しが少なくとも５回は実行されることをユーザが保証するプラグマである。コンパイラは、このプラグマに基づいて、例えば、ソフトウェアパイプライニングによる最適化が可能か否かを判断し、可能であればそのような最適化を行う。
【０００７】
このようなプラグマについては、特許文献１においても詳細に説明されている。
【特許文献１】特開２００４−３８５９７号公報
【発明の開示】
【発明が解決しようとする課題】
【０００８】
しかし、上述の２通りの制御方法においては、ユーザは、実際のプログラムと論理的に矛盾が生じないようにプラグマを記述しなければならない。このため、プログラム中の複数のモジュールを自ら分析して、プラグマをプログラム中に記述しなければならないが、モジュールの呼出し関係の煩雑さにより、ユーザは矛盾したプラグマをプログラム中に付加してしまう可能性がある。そのような場合には、コンパイラは、誤ったプラグマの指示に基づいて、中間コードの最適化等を行なう。このため、コンパイラが誤った機械語プログラムを生成してしまうという問題がある。
【０００９】
また、誤った機械語プログラムの生成を避けるために、ユーザは、自身が解析可能な範囲内での消極的なプラグマしか付加することができず、良好な最適化が行われないという問題がある。
【００１０】
本発明は、上述の課題を解決するためになされたもので、コンパイラが誤った機械語プログラムを生成してしまうことがないように、プラグマに代表されるヒント情報のチェックを行なうことができるプログラム処理装置を提供することを第１の目的とする。
【００１１】
また、ユーザがプラグマに代表されるヒント情報をコンパイラに積極的に与えたとしても、良好な最適化ができるように、ヒント情報のチェックを行なうことができるプログラム処理装置を提供することを第２の目的とする。
【課題を解決するための手段】
【００１２】
上記目的を達成するために、本発明に係るプログラム処理装置は、ユーザがコンパイラに対して与えるヒント情報を含むプログラムを入力として受け、前記ヒント情報を含むプログラム中での前記ヒント情報の論理的な整合性をチェックする。好ましくは、上述のプログラム処理装置は、ユーザがコンパイラに対して与えるヒント情報を含むプログラムの構文を解析して、解析情報を生成する構文解析手段と、前記解析情報に基づいて、前記ヒント情報を含むプログラム中での前記ヒント情報の論理的な整合性をチェックするチェック手段とを備える。
【００１３】
解析情報に基づいて、ヒント情報の論理的な整合性をチェックすることにより、コンパイラが誤った機械語プログラムを生成してしまうことがないように、プラグマに代表されるヒント情報のチェックを行なうことができる。また、ユーザがプラグマに代表されるヒント情報をコンパイラに積極的に与えたとしても、良好な最適化ができるように、ヒント情報のチェックを行なうことができる。なお、このようなヒント情報には、コンパイラに対して、ある最適化に関する指示を直接行うヒント情報と、プログラム全体の静的情報をコンパイラに対して示すことにより、コンパイラによる最適化のサポートを行うヒント情報の両者が含まれる。
【００１４】
好ましくは、前記ヒント情報は、プログラムの静的な解析により得ることが可能な静的情報であり、前記構文解析手段は、前記ヒント情報を含むプログラムの構文を静的に解析し、前記解析情報を生成する。前記ヒント情報は、ループ処理の繰り返し回数に関する情報であり、前記構文解析手段は、前記ヒント情報を含むプログラムに含まれるループ処理の繰り返し回数を解析して、当該繰り返し回数を含む前記解析情報を生成してもよい。例えば、前記ヒント情報は、ループ処理の繰り返しが所定回数以上行われることを指定する情報であり、前記チェック手段は、前記解析情報に基づいて、前記ヒント情報に対応するループ処理の繰り返しが、前記所定回数以上行われるか否かをチェックする。
【００１５】
ループ処理の繰り返し回数に関するヒント情報が論理的に矛盾しているか否かをチェックすることができる。
【００１６】
さらに好ましくは、前記ヒント情報は、データの配置位置に関する情報であり、前記構文解析手段は、前記ヒント情報を含むプログラムに含まれるデータの配置位置を解析して、当該データの配置位置を含む前記解析情報を生成する。例えば、前記ヒント情報は、データと、当該データが所定値でアラインメントされていることとを指定する情報であり、前記構文解析手段は、前記ヒント情報を含むプログラムに含まれるデータのアラインメント値を解析して、解析結果を含む前記解析情報を生成し、前記チェック手段は、前記解析情報に基づいて、前記ヒント情報で指定されたデータのアラインメント値が、前記ヒント情報で指定された前記所定値と一致するか否かをチェックする。
【００１７】
データの配置に関するヒント情報が論理的に矛盾しているか否かをチェックすることができる。
【００１８】
さらに好ましくは、前記ヒント情報は、ポインタ変数のアクセスする領域に関する情報であり、前記構文解析手段は、前記ヒント情報を含むプログラムに含まれるポインタ変数のアクセスする領域を解析して、解析結果を含む前記解析情報を生成する。前記ヒント情報は、ポインタ変数と、当該ポインタ変数がアクセスする領域が、他のポインタ変数がアクセスする領域との間で重複する領域を有しないこととを指定する情報であり、前記構文解析手段は、前記ヒント情報を含むプログラムに含まれるポインタ変数がアクセスする領域が、他のポインタ変数がアクセスする領域との間で重複する領域を有するか否かを解析して、解析結果を含む前記解析情報を生成し、前記チェック手段は、前記解析情報に基づいて、前記ヒント情報で指定されたポインタ変数が、他のポインタ変数がアクセスする領域との間で重複する領域を有するか否かをチェックしてもよい。例えば、前記プログラムはISO/IEC 9899:1999 - Programming Language Cに準拠した言語で記述されており、前記ヒント情報は、前記ポインタ変数と、restrict記述との組み合わせである。
【００１９】
ポインタ変数に関するヒント情報が論理的に矛盾しているか否かをチェックすることができる。
【００２０】
さらに好ましくは、前記ヒント情報は、変数からのデータの読み出しまたは変数へのデータの書き込みに関する情報であり、前記構文解析手段は、前記ヒント情報を含むプログラムに含まれる変数からのデータの読み出しまたは当該変数へのデータの書き込みを解析して、解析結果を含む前記解析情報を生成する。例えば、前記ヒント情報は、変数と、当該ヒント情報が記述された位置以降においては、当該変数へのアクセスがデータの書き込みから始まることとを指定する情報であり、前記チェック手段は、前記解析情報に基づいて、前記ヒント情報で指定された変数が、当該ヒント情報が記述された位置以降においては、当該変数へのアクセスがデータの書き込みから始まっているか否かをチェックする。
【００２１】
変数からのデータの読み出しまたは変数へのデータの書き込みに関するヒント情報が論理的に矛盾しているか否かをチェックすることができる。
【００２２】
さらに好ましくは、前記ヒント情報は、分岐条件の成立頻度に関する情報であり、前記構文解析手段は、前記ヒント情報を含むプログラムに含まれる分岐条件の静的な成立頻度を解析して、解析結果を含む前記解析情報を生成する。例えば、前記ヒント情報は、分岐条件が成立する可能性が高いことを示す情報であり、前記チェック手段は、前記構文解析手段に基づいて、前記ヒント情報に対応する分岐条件が成立する可能性が高いか否かをチェックする。
【００２３】
分岐条件の成立頻度に関するヒント情報が論理的に矛盾しているか否かをチェックすることができる。
【００２４】
さらに好ましくは、前記ヒント情報は、コンパイラによるプログラムの最適化処理方法を指示する情報であり、前記チェック手段は、前記解析情報に基づいて、前記ヒント情報で指示された前記最適化処理方法が実現可能か否かをチェックする。また、前記ヒント情報は、ループアンローリングによるループ処理の最適化を指示する情報であり、前記構文解析手段は、前記ヒント情報を含むプログラムに含まれるループ処理の繰り返し回数を解析して、当該繰り返し回数を含む解析情報を生成し、前記チェック手段は、前記解析情報に基づいて、前記ヒント情報に対応するループ処理に対して、ループアンローリングによる最適化が可能か否かをチェックするようにしてもよい。
【００２５】
ループアンローリングによる最適化を直接コンパイラへ指示するヒント情報が論理的に矛盾しているか否かをチェックすることができる。
【００２６】
さらに好ましくは、前記ヒント情報は、ソフトウェアパイプライニングによるループ処理の最適化を指示する情報であり、前記構文解析手段は、前記ヒント情報を含むプログラムに含まれるループ処理の繰り返し回数を解析して、当該繰り返し回数を含む解析情報を生成し、前記チェック手段は、前記解析情報に基づいて、前記ヒント情報に対応するループ処理に対して、ソフトウェアパイプライニングによる最適化が可能か否かを判断する。
【００２７】
ソフトウェアパイプライニングによる最適化を直接コンパイラに指示するヒント情報が論理的に矛盾しているか否かをチェックすることができる。
【００２８】
さらに好ましくは、前記ヒント情報は、複数のデータと、当該複数のデータに対するペア命令の生成によるデータアクセスの最適化とを指示する情報であり、前記構文解析手段は、前記ヒント情報を含むプログラムに含まれるデータのアラインメント値を解析して、解析結果を含む前記解析情報を生成し、前記チェック手段は、前記解析手段に基づいて、前記ヒント情報で指定された前記複数のデータのアラインメント値が、前記複数のデータの型のサイズの２倍以上であるという条件を満たすか否かを判断する条件判断部と、前記条件を満たす場合に、前記ヒント情報で指定された前記複数のデータに対して、ペア命令の生成によるデータアクセスの最適化が可能であると判断するペア命令生成可否判断部とを有する。
【００２９】
ペア命令の出力をコンパイラに直接指示するヒント情報が論理的に矛盾しているか否かをチェックすることができる。
【００３０】
さらに好ましくは、前記ヒント情報は、変数と、キャッシュメモリの制御処理の最適化とを指示する情報である。
【００３１】
キャッシュメモリ等の制御処理を指示する組込み関数によるヒント情報が論理的に矛盾しているか否かをチェックすることができる。
【００３２】
本発明の他の局面に係るプログラム処理装置は、プログラム中の、コンパイラに対して与えられるヒント情報の論理的な整合性をチェックするプログラム処理装置であって、ユーザがコンパイラに対して与えるヒント情報を含むプログラムと、前記ヒント情報を含むプログラムの構文解析結果である解析情報とを入力とし、前記解析情報に基づいて、前記ヒント情報を含むプログラム中での前記ヒント情報の論理的な整合性をチェックするチェック手段を備える。
【００３３】
外部より入力された解析情報に基づいて、ヒント情報の論理的な整合性をチェックすることにより、コンパイラが誤った機械語プログラムを生成してしまうことがないように、プラグマに代表されるヒント情報のチェックを行なうことができる。また、ユーザがプラグマに代表されるヒント情報をコンパイラに積極的に与えたとしても、良好な最適化ができるように、ヒント情報のチェックを行なうことができる。なお、このようなヒント情報には、コンパイラに対して、ある最適化に関する指示を直接行うヒント情報と、プログラム全体の静的情報をコンパイラに対して示すことにより、コンパイラによる最適化のサポートを行うヒント情報の両者が含まれる。
【００３４】
なお、本発明は、このような特徴的な手段を備えるプログラム処理装置として実現することができるだけでなく、プログラム処理装置が備える特徴的な手段をステップとするプログラム処理方法としても実現することができる。また、プログラム処理装置が備える特徴的な手段としてコンピュータを機能させるプログラムとして実現したりすることもできる。そして、そのようなプログラムは、ＣＤ−ＲＯＭ等の記録媒体やインターネット等の通信ネットワークを介して流通させることができるのは言うまでもない。
【発明の効果】
【００３５】
本発明によると、コンパイラが誤った機械語プログラムを生成してしまうことがないように、プラグマに代表されるヒント情報のチェックを行なうことができるプログラム処理装置を提供することができる。
【００３６】
また、ユーザがプラグマに代表されるヒント情報をコンパイラに積極的に与えたとしても、良好な最適化ができるように、ヒント情報のチェックを行なうことができるプログラム処理装置を提供することができる。
【発明を実施するための最良の形態】
【００３７】
以下、本発明の実施の形態に係るプログラム処理装置について、図面を参照しながら説明する。
【００３８】
図１は、プログラム処理装置の構成を示す機能ブロック図である。プログラム処理装置１０２は、高級言語で記述され、かつプラグマに代表されるヒント情報を含むプログラム１０１を受け、プログラム１０１中でのヒント情報の論理的な整合性を判断する装置であり、構文解析部１０４と、エラーチェック部１０５とを備える。
【００３９】
構文解析部１０４は、プログラム１０１（プログラム１０１が複数のファイルからなる場合には、適宜、プログラム１０１ａおよびプログラム１０１ｂと称する）を受け、プログラム１０１に対して、コンパイラ等で用いられる通常の構文解析処理を行ない、解析結果を解析情報１０６として出力する処理部である。
【００４０】
エラーチェック部１０５は、プログラム１０１および解析情報１０６に基づいて、ヒント情報の論理的な整合性をチェックし、チェック結果１０３を出力する処理部である。
【００４１】
なお、構文解析部１０４およびエラーチェック部１０５の実行する処理は、後述する実施の形態毎に異なる。このため、それぞれの実施の形態を説明する際に、その詳細について説明する。
［実施の形態１、繰り返し回数に関するヒント情報］
本実施の形態では、ループ処理の繰り返し回数に関するヒント情報の論理的な矛盾をチェックするプログラム処理装置について説明する。ループ処理の繰り返し回数に関するヒント情報には、例えば次のようなものがある。
（１）  ループ処理の繰り返しの最大回数を指定するヒント情報
（２）  ループ処理の繰り返しの最低回数を指定するヒント情報
（３）  ループ処理の繰り返し回数が必ず偶数回であることを指定するヒント情報
（４）  ループ処理の繰り返し回数が必ず奇数回であることを指定するヒント情報
これらのヒント情報を含むプログラム１０１に対して、プログラム処理装置１０２が実行する処理について説明する。
【００４２】
図２は、繰り返し回数に関するヒント情報を含むプログラムの一例を示す図である。図２（ａ）は、関数ｆｕｎｃ１を含むプログラムの一例を示す図であり、図２（ｂ）は、ｍａｉｎ関数、関数ｆｕｎｃ２および関数ｆｕｎｃ３を含むプログラムの一例を示す図である。
【００４３】
図２（ａ）に示されるプログラム１０１ａおよび図２（ｂ）に示されるプログラム１０１ｂは、それぞれコンパイルされた後、リンクされる関係にある。
【００４４】
上述の（２）番目のヒント情報の一種であるプラグマ「#pragma _min_iteration」は、ヒント情報の直後に来るループ処理(for, while, do)の繰り返し回数が少なくとも何回であるかを示している。図２（ａ）に示されるプログラム１０１ａには、３行目にプラグマ「#pragma _min_iteration=5」が記述されている。したがって、ループ処理A（５行目から１２行目まで）の繰り返し回数は最低５回であることがユーザによって示されている。
【００４５】
上述の（３）番目のヒント情報の一種であるプラグマ「#pragma _iteration_even」は、ヒント情報の直後に来るループ処理(for,while,do)の繰り返し回数が必ず偶数回であることを示している。プログラム１０１ａには４行目にこのプラグマが記述されている。このため、ループ処理Aの繰り返し回数は必ず偶数回であることがユーザによって示されている。
【００４６】
上述の（４）番目のヒント情報の一種であるプラグマ「#pragma _iteration_odd」は、ヒント情報の直後に来るループ処理(for,while,do)の繰り返し回数が必ず奇数回であることを示している。プログラム１０１ａには１４行目にこのプラグマが記述されている。このため、ループ処理Ｂ（１５行目から２１行目まで）の繰り返し回数は必ず奇数回であることがユーザによって示されている。
【００４７】
なお、プログラム１０１ａの１３行目には、プラグマ「#pragma _min_iteration=3」が記述されている。したがって、ループ処理Ｂの繰り返し回数は最低３回であることがユーザによって示されている。
【００４８】
コンパイラによるコンパイル時には、プラグマ「#pragma _min_iteration」で指定されるループ処理の最低繰り返し回数により、当該ループ処理に対して、ソフトウェアパイプライニングを適用可能か否かの判定が行われ、可能な場合には、当該ループ処理にソフトウェアパイプライニングを行うような最適化が行なわれる。
【００４９】
また、プラグマ「#pragma _min_iteration」で指定されるループ処理の最低繰り返し回数が２回以上であり、かつ、プラグマ「#pragma _iteration_even」またはプラグマ「#pragma _iteration_odd」のみが当該ループ処理に対して指定されている場合には、コンパイラは、当該ループ処理に対してループアンローリングを行うような最適化を行う。ループアンローリングとは、ループ処理高速化手法の一つであり、複数のイタレーション（繰り返し処理）を同時に実行することにより、ループ処理内の実行速度を高速化する手法である。ループアンローリングは、展開する繰り返しの数が２回であれば、ループ処理の繰り返し回数が偶数の場合と、奇数の場合とでは、最適化の処理の仕方が異なってくる。偶数の場合は、そのままアンローリングすればよいが、奇数の場合、半端な1回分をループ処理の外側で実行させてやる必要がある。
【００５０】
これらのヒント情報を含むプログラム１０１ａおよび１０１ｂを入力とした場合の構文解析部１０４およびエラーチェック部１０５の実行する処理について説明する。
【００５１】
図３は、構文解析部１０４の実行する処理のフローチャートである。構文解析部１０４は、プログラム１０１（プログラム１０１ａおよびプログラム１０１ｂ）全体を解析して、各関数のコールフローグラフを作成する（Ｓ２０２）。これは、通常コンパイラ等で作成されるコールフローグラフと同様のものである。
【００５２】
図４は、コールフローグラフの一例を示す図である。図４に示されるコールフローグラフ１０７は、図２（ａ）および図２（ｂ）にそれぞれ示したプログラム１０１ａおよびプログラム１０１ｂより作成されたコールフローグラフ１０７である。このコールフローグラフ１０７より、ｍａｉｎ関数が関数ｆｕｎｃ２および関数ｆｕｎｃ３を呼び出していることがわかる。また、関数ｆｕｎｃ２が関数ｆｕｎｃ１を呼び出し、関数ｆｕｎｃ３も関数ｆｕｎｃ１を呼び出していることもわかる。このように、コールフローグラフ１０７は、矢印の向きにより関数間の呼び出し関係を示している。
【００５３】
次に、図３に示されるように、構文解析部１０４は、作成したコールフローグラフ１０７に基づいて、大域変数または各関数が呼ばれる際に仮引数がどのような値を取るかを解析する（Ｓ２０３）。本実施の形態では、構文解析部１０４は、大域変数または仮引数が取り得る値の最大値および最小値を解析するとともに、偶数の値を取り得るか否かおよび奇数の値を取り得るか否かを解析する。なお、関数内の局所変数を解析するようにしてもよい。
【００５４】
構文解析部１０４は、解析した結果を解析情報１０６として出力する（Ｓ２０４）。図５は、解析情報の一例を示す図である。図５に示した解析情報１０６は、解析結果の一部を示している。例えば、関数ｆｕｎｃ３の仮引数ｓについては、最大値および最小値がともに「５」であり、偶数の値は取り得ず、奇数の値を取り得ることが示されている。これは、以下のような解析を行うことにより求められる。すなわち、図４に示したコールフローフラグ１０７より、関数ｆｕｎｃ３はｍａｉｎ関数より呼び出されることがわかる。プログラム１０１ｂより、ｍａｉｎ関数中での関数ｆｕｎｃ３の実引数は「５」であり、関数ｆｕｎｃ３は１回のみ呼ばれていることがわかる。このため、上述のような解析結果が得られる。
【００５５】
また、関数ｆｕｎｃ１内での大域変数ｙについては、最大値が「６」で、最小値が「５」で、偶数の値および奇数の値のいずれをも取り得ることが解析情報１０６に示されている。これは、以下のような解析を行うことにより求められる。すなわち、コールフローグラフ１０７より、関数ｆｕｎｃ１は関数ｆｕｎｃ２および関数ｆｕｎｃ３から呼び出されることがわかる。関数ｆｕｎｃ２内では、大域変数ｙに「６」が代入されている。また、関数ｆｕｎｃ３内では大域変数ｙに仮引数ｓの値が代入されている。ここで、コールフローグラフ１０７より関数ｆｕｎｃ１はｍａｉｎ関数より呼び出されていることがわかる。そこでｍａｉｎ関数内の関数ｆｕｎｃ３の実引数を調べると、「５」であることがわかる。このため、関数ｆｕｎｃ３の仮引数ｓの値は「５」となる。すなわち、関数ｆｕｎｃ３内の大域変数ｙの値も「５」となる。以上のことより、関数ｆｕｎｃ３内の大域変数の取り得る値は「５」または「６」である。このため、上述のような解析結果が得られる。同様にして、図５に示すような解析情報１０６が得られる。
【００５６】
次にエラーチェック部１０５の実行する処理について説明する。
図６は、エラーチェック部１０５の実行する処理のフローチャートである。エラーチェック部１０５は、プログラム１０１ａおよびプログラム１０１ｂ中に含まれる各ループ処理について以下の処理を繰り返す。図２（ａ）に示すように、プログラム１０１ａにはループ処理Ａおよびループ処理Ｂの２つのループ処理が含まれている。したがって、これら２つのループ処理の各々について以下の処理が実行されることとなる。
【００５７】
エラーチェック部１０５は、着目しているループ処理に対して付加されたヒント情報が何であるかを判断する（Ｓ３０２）。例えば、プログラム１０１ａに含まれるループ処理Ａには、プラグマ「#pragma _min_iteration=5」およびプラグマ「#pragma _iteration_even」が付加されている。
【００５８】
当該ヒント情報がプラグマ「#pragma _min_iteration」の場合には（Ｓ３０２で# pragma _min_iteration）、解析情報１０６も利用して、当該ループ処理の最低繰り返し回数を求める（Ｓ３０３）。例えば、ループ処理Ａの場合には、ループ処理の繰り返し回数を規定する仮引数ｘの値の最小値が「２」であることが、解析情報１０６よりわかる。このため、ループ処理Ａの最低繰り返し回数は「２」であることが求められる。
【００５９】
ループ処理に対して付加されたヒント情報がプラグマ「#pragma _iteration_even」である場合には（Ｓ３０２で#pragma _iteration_odd/even）、エラーチェック部１０５は、解析情報１０６を利用しながら、当該ループ処理の繰り返し回数が偶数のみであるかを調べる（Ｓ３０５）。例えば、ループ処理Ａの場合には、ループ処理の繰り返し回数を規定する仮引数ｘの値は、偶数のみを取り、奇数はとならないことが示されている。同様に、ループ処理に対して付加されたヒント情報がプラグマ「#pragma _iteration_odd」である場合には（Ｓ３０２で#pragma _iteration_odd/even）、エラーチェック部１０５は、解析情報１０６を利用しながら、当該ループ処理の繰り返し回数が奇数のみであるかを調べる（Ｓ３０５）。
【００６０】
なお、Ｓ３０３およびＳ３０５の処理は、いずれか一方が実行されるというわけではなく、同一のループ処理に対して付加されたヒント情報が複数ある場合には、Ｓ３０３およびＳ３０５の両方の処理が実行される場合もあり得る。
【００６１】
Ｓ３０３およびＳ３０５の処理の後、ループ処理に対して与えられたヒント情報と実際のループ処理の繰り返し回数とが矛盾していないか否かが調べられる（Ｓ３０４）。矛盾がある場合には（Ｓ３０４でＮＯ）、チェック結果１０３がエラー情報として図示しない表示部に表示される（Ｓ３０６）。
【００６２】
例えば、プログラム１０１ａの３行目で指定されているプラグマ「#pragma _min_iteration=5」は、ループ処理Ａの最低繰り返し回数が最低５回であることを指示しているが、上述のように、ループ処理Ａの最低繰り返し回数は２回であることがＳ３０３の処理で求められている。このため、エラーチェック部１０５は、チェック結果１０３をエラー情報として表示する。同様に、プログラム１０１ａの１４行目で指定されているプラグマ「#pragma _iteration_odd」は、ループ処理Ｂの繰り返し回数が奇数のみであることを指示しているが、ループ処理Ｂの繰り返し回数を規定する大域変数ｙの値は、偶数および奇数の双方を取り得ることが、Ｓ３０５の処理で調べられている。このため、エラーチェック部１０５は、チェック結果１０３をエラー情報として表示する。
【００６３】
図７は、チェック結果の一例を示す図である。上述したように、プログラム１０１ａの３行目の「#pragma _min_iteration=5」と、１４行目のプラグマ「#pragma _iteration_odd」とが論理的に矛盾していることが示されている。
【００６４】
チェック結果１０３のエラー表示（Ｓ３０６）が行われた後、またはループ処理に対して与えられたヒント情報と実際のループ処理の繰り返し回数とが矛盾していない場合（Ｓ３０４でＹＥＳ）には、次のループ処理に対して、上述と同様の処理が行われる（Ｓ３０２〜Ｓ３０６）。また、着目しているループ処理に対して付加されたヒント情報がない場合には（Ｓ３０２でなし）、当該ループ処理に対しては、エラーチェック部１０５は何も処理を行わず、次のループ処理に対して、上述と同様の処理を行う（Ｓ３０２〜Ｓ３０６）。
【００６５】
プログラム１０１中に含まれるすべてのループ処理に対して、上述の処理（Ｓ３０２〜Ｓ３０６）が実行された時点で、エラーチェック部１０５の実行すべき処理が終了する。
【００６６】
以上説明したように、本実施の形態によると、ループ処理の繰り返し回数に関するヒント情報が論理的に矛盾しているか否かをチェックすることができる。
【００６７】
なお、上述の実施の形態では、（２）番目から（４）番目までのヒント情報の一種であるプラグマを用いて説明を行ったが、（１）番目のヒント情報の一種として、プラグマ「#pragma _max_iteration」を用いてもよい。このプラグマは、ヒント情報の直後に来るループ処理(for, while, do)の繰り返し回数が最大何回であるかを示している。例えば、プラグマ「#pragma _max_iteration=10」との記述が、プログラム中にあった場合には、当該プラグマの直後に来るループ処理の繰り返し回数が最高１０回であることがユーザによって示されている。このプラグマについても、エラーチェック部１０５がチェックを行うようにしてもよい。
【００６８】
また、エラーチェック部１０５は、解析情報１０６を利用することなく、ヒント情報の論理的な矛盾性を判断可能な場合には、そのような処理を行ってもよい。例えば、ループ処理の繰り返し回数が変数ではなく、定数で定義されているような場合には、解析情報１０６を参照することなく、エラーチェック部１０５がループ処理の最低繰り返し回数等を求めることが可能だからである。
［実施の形態２、ポインタ変数に関するヒント情報］
本実施の形態では、ポインタ変数に関するヒント情報の論理的な矛盾をチェックするプログラム処理装置について説明する。ポインタ変数に関するヒント情報には、例えば次のようなものがある。
（１）  ポインタ変数が示すデータのアラインメント値を指定するヒント情報
（２）  ポインタ変数が示す領域がオーバーラップしないことを示すヒント情報
これらのヒント情報を含むプログラム１０１に対して、プログラム処理装置１０２が実行する処理について説明する。
【００６９】
図８は、ポインタ変数に関するヒント情報を含むプログラムの一例を示す図である。図８（ａ）は、関数ｆｕｎｃ１、関数ｆｕｎｃ２および関数ｆｕｎｃ３を含むプログラムの一例を示す図であり、図８（ｂ）は、ｍａｉｎ関数を含むプログラムの一例を示す図である。
【００７０】
図８（ａ）に示されるプログラム１０１ａおよび図８（ｂ）に示されるプログラム１０１ｂは、それぞれコンパイルされた後、リンクされる関係にある。
【００７１】
上述の（１）番目のヒント情報の一種であるプラグマ「#pragma _align_pointer」は、プラグマで指定されたポインタ変数の指すデータのアラインメント値がメインメモリ上でいくつであるかを示している。例えば、図８（ａ）に示されるプログラム１０１ａ中の関数ｆｕｎｃ３の直前には、プラグマ「#pragma _align_pointer=8 q1」との記述がある。これは、関数ｆｕｎｃ３のポインタ変数ｑ１で指示されるデータが８バイト単位でアラインメントされていることをユーザが示している記述である。同様に、プラグマ「#pragma _align_pointer=4 q2,q3」との記述は、ポインタ変数ｑ２またはｑ３で指示されるデータが４バイト単位でアラインメントされていることをユーザが示している記述である。
【００７２】
なお、プログラム１０１ａに含まれるプラグマ「#pragma _align_object」は、その後に示されるデータを指定されたバイト数でアラインメントせよというユーザの指示である。例えば、関数ｆｕｎｃ１内のプラグマ「#pragma _align_object=4 a,b」という記述は、変数ａおよびｂを４バイト単位でメインメモリ上にアラインメントせよという指示である。変数ａおよびｂはｓｈｏｒｔ型の変数であり、通常ｓｈｏｒｔ型の変数は２バイトの変数である。したがって、本実施の形態では、プラグマ「#pragma _align_object」による指定がない場合には、ｓｈｏｒｔ型の変数は２バイト単位でアラインメントされるものとする。
【００７３】
このように、データをアラインメントし、ペア命令を利用することにより複数のデータをメモリから一度にロードしたり、ライトしたりすることができ、コンパイラはそのような最適化を行うことができる。これにより、メモリアクセスの回数を減少させることができ、処理を高速化させることができる。
【００７４】
上述の（２）番目のヒント情報の一種であるrestrict記述は、Ｃ９９言語（ISO/IEC 9899:1999 - Programming Language C）で導入されたものであり、そのスコープにおいて指定された全てのポインタ変数の指すメインメモリ上の領域が互いにオーバーラップしていないことを示している。すなわち、関数ｆｕｎｃ３のポインタ変数ｑ１，ｑ２およびｑ３が指す領域は、互いにオーバーラップしないことがユーザによって示されている。例えば、ポインタｑ１が指す領域とポインタｑ２が指す領域とが互いにオーバーラップしていなければ、コンパイラは、前者の領域にデータを書き込む命令と、後者の領域にデータを書き込む命令との実行順序を入れ替えるような最適化を行うこともできる。
【００７５】
これらのヒント情報を含むプログラム１０１ａおよび１０１ｂを入力とした場合の構文解析部１０４およびエラーチェック部１０５の実行する処理について説明する。
【００７６】
構文解析部１０４は、図３に示したフローチャートと同様の処理を実行する。ただし、Ｓ２０３で解析する対象が異なる。すなわち、構文解析部１０４は、関数のポインタ引数が指すデータのアラインメント値を解析するとともに、ポインタ引数が指す領域について解析を行って、他のポインタと同一領域を指す可能性があるか否かを解析する。
【００７７】
図９は、図８（ａ）および図８（ｂ）に示されたプログラム１０１ａおよび１０１ｂに基づいて、構文解析部１０４により作成されたコールフローグラフの一例を示す図である。このコールフローグラフ１０７によると、ｍａｉｎ関数は、関数ｆｕｎｃ１および関数ｆｕｎｃ２を呼び出している。また、関数ｆｕｎｃ１および関数ｆｕｎｃ２の各々は、関数ｆｕｎｃ３を呼び出している。
【００７８】
図１０は、構文解析部１０４により作成された解析情報１０６の一例を示す図である。図３のＳ２０３の処理において、構文解析部１０４は、プログラム１０１ａおよび１０１ｂに基づいて、各関数呼出し時のポインタ引数および大域ポインタ変数のアラインメントおよび同一領域を指示する可能性について解析する。
【００７９】
例えば、関数ｆｕｎｃ３の仮引数ｑ１について考える。コールフローグラフ１０７に基づいて、関数ｆｕｎｃ３は、関数ｆｕｎｃ１および関数ｆｕｎｃ２から呼び出されていることがわかる。関数ｆｕｎｃ３の仮引数ｑ１に対応する関数ｆｕｎｃ１内での関数ｆｕｎｃ３の実引数「＆ａ」の指すデータは、プラグマ「#pragma _align_object=4 a,b」により４バイト単位でアラインメントされている。また、関数ｆｕｎｃ３の仮引数ｑ１に対応する関数ｆｕｎｃ２内での関数ｆｕｎｃ３の実引数「＆ｘ」の指すデータは、プラグマ「#pragma _align_object=8 x」により８バイト単位でアラインメントされている。このため、関数ｆｕｎｃ３の仮引数ｑ１が指すデータのアラインメント値は、４および８である。
【００８０】
また、関数ｆｕｎｃ３の仮引数ｑ１とｑ２とは、関数ｆｕｎｃ１内での関数ｆｕｎｃ３の実引数「＆ａ」およびｐ１にそれぞれ対応する。関数ｆｕｎｃ１内で関数ｆｕｎｃ３を呼び出す直前に、ｐ１に「＆ａ」の値が代入されている。このため、ｐ１と「＆ａ」とは同じ値を示す。したがって、仮引数ｑ１の指す領域と同一領域を指定する可能性のあるポインタとして、仮引数ｑ２が求められる。
【００８１】
以下、同様に、仮引数ｑ２およびｑ３についても、解析を行うと、図１０に示すような解析情報１０６が得られる。
【００８２】
次に、エラーチェック部１０５の実行する処理について説明する。
図１１は、エラーチェック部１０５の実行する処理のフローチャートである。エラーチェック部１０５は、プログラム１０１ａおよびプログラム１０１ｂ中に含まれる各ポインタ変数について以下の処理を繰り返す。図８（ａ）に示すように、プログラム１０１ａには、ポインタ変数ｑ１、ｑ２およびｑ３等が含まれる。
【００８３】
エラーチェック部１０５は、ポインタ変数に付加されたヒント情報が何であるかを判断する（Ｓ４０２）。ポインタ変数に対して付加されたヒント情報がプラグマ「#pragma _align_pointer」である場合には（Ｓ４０２で#pragma _align_pointer）、解析情報１０６を利用して、当該ポインタ変数のアラインメント値を求める（Ｓ４０３）。例えば、関数ｆｕｎｃ３の仮引数ｑ１の場合には、アラインメント値として、４および８が求められる。
【００８４】
ポインタ変数に対して付加された情報がrestrict記述である場合には（Ｓ４０２でrestrict）、解析情報１０６を利用して、当該ポインタ変数が指し示す領域が他のポインタ変数が指し示す領域と互いにオーバーラップしないかどうかをチェックする（Ｓ４０５）。例えば、関数ｆｕｎｃ３の仮引数ｑ１が指し示す領域は、関数ｆｕｎｃ３の仮引数ｑ２が指し示す領域と互いにオーバーラップすることを示している。
【００８５】
なお、Ｓ４０３およびＳ４０５の処理は、いずれか一方が実行されるというわけではなく、同一のポインタ変数に対して付加されたヒント情報が複数ある場合には、Ｓ４０３およびＳ４０５の両方の処理が実行される場合もあり得る。
【００８６】
Ｓ４０３およびＳ４０５の処理の後、ポインタ変数に対して与えられたヒント情報と実際のポインタ変数の情報とが矛盾していないか否かが調べられる（Ｓ４０４）。矛盾がある場合には（Ｓ４０４でＮＯ）、チェック結果１０３がエラー情報として図示しない表示部に表示される（Ｓ４０６）。
【００８７】
例えば、関数ｆｕｎｃ３の仮引数ｑ１については、プラグマ「#pragma _align_pointer=8 q1」およびrestrict記述の２つのヒント情報が付加されている。エラーチェック部１０５は、プラグマ「#pragma _align_pointer=8 q1」について、矛盾がないかのチェックをまず行う。解析情報１０６より、仮引数ｑ１のアラインメント値は、４または８になり得ることがわかる。これは、ヒント情報であるプラグマ「#pragma _align_pointer=8 q1」と一致しない。このため、エラーチェック部１０５は、チェック結果１０３をエラー情報として表示する。次に、エラーチェック部１０５は、restrict記述について矛盾がないかのチェックを行う。解析情報１０６より、仮引数ｑ１およびｑ２は同一の領域を指す場合が存在し、restrict記述と矛盾する。このため、エラーチェック部１０５は、チェック結果１０３をエラー情報として表示する。
【００８８】
チェック結果１０３のエラー表示（Ｓ４０６）が行われた後、またはポインタ変数に対して与えられたヒント情報と実際のポインタ変数の情報とが矛盾していない場合（Ｓ４０４でＹＥＳ）には、次のポインタ変数（例えば、仮引数ｑ２またはｑ３）に対して、上述と同様の処理が行われる（Ｓ４０２〜Ｓ４０６）。また、ポインタ変数に対して付加されたヒント情報がない場合には（Ｓ４０２でなし）、当該ポインタ変数に対しては、エラーチェック部１０５は何も処理を行わず、次のポインタ変数に対して、上述と同様の処理を行う（Ｓ４０２〜Ｓ４０６）。
【００８９】
図１２は、チェック結果１０３の一例を示す図である。上述したように、プラグマ「#pragma _align_pointer=8 q1」と、restrict記述「short *restrict q1」とが実際のポインタ変数の情報と矛盾していることが示されている。その他にも、仮引数ｑ２に対するrestrict記述が矛盾していることと、仮引数ｑ３に対するプラグマが矛盾していることとが示されている。
【００９０】
プログラム１０１中に含まれるすべてのポインタ変数に対して、上述の処理（Ｓ４０２〜Ｓ４０６）が実行された時点で、エラーチェック部１０５が実行すべき処理が終了する。
【００９１】
以上説明したように、本実施の形態によると、データの配置に関するヒント情報が論理的に矛盾しているか否かをチェックすることができる。
【００９２】
また、ポインタ変数に関するヒント情報が論理的に矛盾しているか否かをチェックすることができる。
［実施の形態３、変数の読み書きに関するヒント情報］
本実施の形態では、変数の読み書きに関するヒント情報の論理的な矛盾をチェックするプログラム処理装置について説明する。変数の読み書きに関するヒント情報には、例えば次のようなものがある。
【００９３】
（１）ヒント情報の配置位置以降では、指定された変数へのアクセスはデータの書き込みから始まることを示すヒント情報
このヒント情報を含むプログラム１０１に対して、プログラム処理装置１０２が実行する処理について説明する。
【００９４】
図１３は、変数の読み書きに関するヒント情報を含むプログラムの一例を示す図である。プログラム１０１には、関数ｆｕｎｃ１、関数ｆｕｎｃ２および関数ｆｕｎｃ３が含まれている。
【００９５】
上述のヒント情報の一種であるプラグマ「#pragma _start_from_write」は、当該プラグマで指定された変数については、このプラグマの配置位置以降では、当該変数へのアクセスはデータの書込処理から始まることを示している。例えば、プログラム１０１の関数ｆｕｎｃ１（）中には、プラグマ「#pragma _start_from_write x」との記述がある。これは、このプラグマの配置位置以降では、変数ｘに対するアクセスはデータの書込処理から始まることをユーザが示したものである。
【００９６】
コンパイラは、このプラグマを手がかりとして、キャッシュメモリを備えるコンピュータにおいて、メモリアクセスが生じた場合には、その領域を確保するのみとし、メインメモリからキャッシュメモリへのデータの転送（プリフェッチ処理）を行わないような最適化を行うことができる。これにより、メモリアクセス時間を減少させることができる。
【００９７】
このヒント情報を含むプログラム１０１を入力とした場合の構文解析部１０４およびエラーチェック部１０５の実行する処理について説明する。
【００９８】
構文解析部１０４は、図３に示したフローチャートと同様の処理を実行する。ただし、Ｓ２０３で解析する対象が異なる。すなわち、構文解析部１０４は、各関数について、大域変数への読み出し、書き込みが存在するか否かの解析を行う。
【００９９】
図１４は、図１３に示したプログラム１０１に基づいて、構文解析部１０４により作成されたコールフローグラフの一例を示す図である。このコールフローグラフ１０７によると、関数ｆｕｎｃ１が関数ｆｕｎｃ２および関数ｆｕｎｃ３を呼び出している。
【０１００】
図１５は、構文解析部１０４により作成された解析情報１０６の一例を示す図である。図３のＳ２０３の処理において、構文解析部１０４は、各関数の大域変数ごとに読み書きの有無をチェックする。
【０１０１】
例えば、関数ｆｕｎｃ２では、大域変数ｙへのデータの書き込みと、大域変数ｘからのデータの読み出しとがあり、関数ｆｕｎｃ３では、大域変数ｚへのデータの書き込みと、大域変数ｙからのデータの読み出しとがあるため、解析情報１０６は、図１５のようになる。なお、関数ｆｕｎｃ１についても同様の処理が行われ、解析情報１０６が作成される。
【０１０２】
次に、エラーチェック部１０５の実行する処理について説明する。
図１６は、エラーチェック部１０５の実行する処理のフローチャートである。エラーチェック部１０５は、プログラム１０１中に含まれる各大域変数について以下の処理を繰り返す。図１３に示すようにプログラム１０１には、３つの大域変数ｘ、ｙおよびｚが含まれる。
【０１０３】
エラーチェック部１０５は、着目している大域変数に対して付加されたヒント情報が何であるかを判断する（Ｓ５０１）。当該大域変数に対して付加されたヒント情報がプラグマ「#pragma _start_from_write」である場合には（Ｓ５０１で#pragma _start_from_write）、解析情報１０６を利用して、当該プラグマの配置位置以降に当該大域変数へのデータの書き込みがあるか否かを調べる（Ｓ５０２）。調べた結果、当該大域変数に与えられたプラグマ「#pragma _start_from_write」と、実際の当該大域変数へのデータの書き込みの情報とが矛盾していれば（Ｓ５０３でＮＯ）、チェック結果１０３がエラー情報として図示しない表示部に表示される（Ｓ５０４）。
【０１０４】
例えば、大域変数ｘについては、関数ｆｕｎｃ１内にプラグマ「#pragma _start_from_write」によるヒント情報が付加されている。このため、Ｓ５０２の処理では、当該プラグマ位置以降の大域変数ｘへのデータの書き込みについてチェックする。プログラム１０１では、当該プラグマの直後に関数ｆｕｎｃ２の呼び出しが存在するが、解析情報１０６によれば、関数ｆｕｎｃ２内部で大域変数xからのデータの読み出しが存在する。よって、当該プラグマと実際の大域変数ｘへの書き込みの情報との間に矛盾がある（Ｓ５０３でＮＯ）。このため、図１７に示すようなチェック結果１０３がエラー情報として表示される（Ｓ５０４）。すなわちプラグマ「#pragma _start_from_write x」との記述が誤りであることが表示される。
【０１０５】
同様に、大域変数ｚについて、関数ｆｕｎｃ１内で付加されているプラグマ「#pragma _start_from_write」についてのチェックを行うと、当該プラグマの直後で呼び出されている関数ｆｕｎｃ３では、大域変数ｚからのデータの読み出しのみが行われていることが、解析情報１０６よりわかる。このため、プラグマと実際の大域変数ｚへの書き込みの情報との間に矛盾がない。このため、エラー出力等は行われない。
【０１０６】
以上説明したように、本実施の形態によると、変数からのデータの読み出しまたは変数へのデータの書き込みに関するヒント情報が論理的に矛盾しているか否かをチェックすることができる。
［実施の形態４、静的頻度に関するヒント情報］
本実施の形態では、静的頻度に関するヒント情報の論理的な矛盾をチェックするプログラム処理装置について説明する。静的頻度に関するヒント情報には、例えば次のようなものがある。
（１）  分岐条件の成立頻度が高いことを示すヒント情報
（２）  分岐条件の不成立頻度が高いことを示すヒント情報
これらのヒント情報を含むプログラム１０１に対して、プログラム処理装置１０２が実行する処理について説明する。
【０１０７】
図１８は、静的頻度に関するヒント情報を含むプログラムの一例を示す図である。プログラム１０１には、関数ｆｕｎｃ１および関数ｆｕｎｃ２が含まれている。
【０１０８】
上述の（１）番目のヒント情報の一種であるプラグマ「#pragma _likely_true」は、直後のｉｆ文における条件式が成立する（条件式がtrueとなる）頻度が高いことを示している。プログラム１０１においては、ｉｆ文の条件式である「i%5==0」が成立する頻度が高いことがユーザによって示されている。
【０１０９】
コンパイラは、このプラグマに従い、ｉｆ文の条件式が成立時に実行される命令列を、ｉｆ文の不成立時に実行される命令列すなわちｅｌｓｅ文で指定される命令列よりも優先的に実行されるような機械語命令配置の最適化を行う。これにより、機械語プログラム実行時の処理時間を向上させることができる。
【０１１０】
上述の（２）番目のヒント情報の一種であるプラグマ「#pragma _likely_false」は、直後のｉｆ文における条件式が不成立となる（条件式がfalseとなる）頻度が高いことを示している。
【０１１１】
コンパイラは、このプラグマに従い、ｉｆ文の条件式が不成立時に実行される命令列すなわちｅｌｓｅ文で指定される命令列を、ｉｆ文の成立時に実行される命令列よりも優先的に実行されるような機械語命令配置の最適化を行う。これにより、機械語プログラム実行時の処理時間を向上させることができる。
【０１１２】
これらのヒント情報を含むプログラム１０１を入力とした場合の構文解析部１０４およびエラーチェック部１０５の実行する処理について説明する。
【０１１３】
構文解析部１０４は、図３に示したフローチャートと同様の処理を実行する。ただし、Ｓ２０３で解析する対象が異なる。すなわち、構文解析部１０４は、各関数の仮引数および大域変数について、値の頻度解析を行う。
【０１１４】
図１９は、図１８に示したプログラム１０１に基づいて、構文解析部１０４により作成されたコールフローグラフの一例を示す図である。このコールフローグラフ１０７によると、関数ｆｕｎｃ１が関数ｆｕｎｃ２を呼び出している。
【０１１５】
図２０は、構文解析部１０４により作成された解析情報１０６の一例を示す図である。上述したように、図３のＳ２０３の処理において、構文解析部１０４は、各関数の仮引数および大域変数ごとに、値の頻度解析を行う。
【０１１６】
例えば、関数ｆｕｎｃ２の仮引数ｉの頻度を解析すると、関数ｆｕｎｃ２は関数ｆｕｎｃ１から合計１７回呼び出される可能性があり、そのときの仮引数ｉの値の頻度が解析情報１０６として示されている。例えば、仮引数ｉが０となる回数は２回である。このため、２／１７の確率で仮引数ｉが０となることが示されている。
【０１１７】
次に、エラーチェック部１０５の実行する処理について説明する。
図２１は、エラーチェック部１０５の実行する処理のフローチャートである。エラーチェック部１０５は、各ｉｆ文について以下の処理を繰り返す。図１８に示すようにプログラム１０１中には、「if(i%5==0)」というｉｆ文が含まれる。
【０１１８】
エラーチェック部１０５は、着目しているｉｆ文に付加されたヒント情報が何であるかを判断する（Ｓ６０１）。付加されたヒント情報がプラグマ「#pragma _likely_true」またはプラグマ「#pragma _likely_false」である場合には（Ｓ６０１で#pragma _likely_true/false）、解析情報１０６を利用して、当該ｉｆ文の条件式の成立または不成立の頻度をそれぞれ調べる（Ｓ６０２）。その結果、ヒント情報と実際の頻度とが矛盾していれば（Ｓ６０３でＮＯ）、チェック結果１０３がエラー情報として図示しない表示部に表示される（Ｓ６０４）。
【０１１９】
例えば、ｉｆ文「if(i%5==0)」には、プラグマ「#pragma _likely_true」が付加されている。このため、エラーチェック部１０５は、当該ｉｆ文の条件式「i%5==0」の成立頻度を、解析情報１０６に基づいて調べる（Ｓ６０２）。すなわち、条件式「i%5==0」が成立するのは、仮引数ｉが５の倍数のときであるが、仮引数ｉが５の倍数になるのは、４／１７の確率である（仮引数ｉが０となる確率２／１７と仮引数ｉが５となる確率２／１７との和）。よって、この条件式が成立する頻度は過半数を下回り、当該条件式が不成立となる頻度の方が高いという判断がされる。よって、エラーチェック部１０５は、プラグマ「#pragma _likely_true」とｉｆ文の条件式「i%5==0」が成立する頻度との間に矛盾が生じるとの判断を行い（Ｓ６０３でＮＯ）、図２２に示すようなチェック結果１０３を表示する。
【０１２０】
以上説明したように本実施の形態によると、静的頻度（分岐条件の成立頻度）に関するヒント情報が論理的に矛盾しているか否かをチェックすることができる。
［実施の形態５、最適化手法を指定するヒント情報１］
本実施の形態では、コンパイラに対して最適化手法を直接指定するヒント情報の論理的な矛盾をチェックするプログラム処理装置について説明する。コンパイラへ最適化手法を直接指定するヒント情報として、例えば、ループアンローリングを指定するヒント情報がある。
【０１２１】
このヒント情報を含むプログラム１０１に対して、プログラム処理装置１０２が実行する処理について説明する。
【０１２２】
図２３は、ループアンローリングに関するヒント情報を含むプログラムの一例を示す図である。プログラム１０１には、関数ｆｕｎｃ１および関数ｆｕｎｃ２が含まれている。
【０１２３】
ループアンローリングを指定するヒント情報の一種であるプラグマ「#pragma _loop_unrolling」は、直後に来るループ処理(for,while,do)に対して、ループアンローリングによる最適化をせよとのユーザによるコンパイラに対する指示である。例えば、プログラム１０１の関数ｆｕｎｃ１内には、プラグマ「#pragma _loop_unrolling」が記述されており、直後のｆｏｒループ処理をループアンローリングせよとの指示がユーザによりされている。ここでは、展開する繰り返しの数は２回であるものとする。
【０１２４】
コンパイラは、このプラグマを手がかりとして、当該ｆｏｒループ処理に対してループアンローリングによる最適化を施す。これにより、ｆｏｒループ処理の実行速度を高速化することができる。
【０１２５】
このヒント情報を含むプログラム１０１を入力とした場合の構文解析部１０４およびエラーチェック部１０５の実行する処理について説明する。
【０１２６】
構文解析部１０４は、図３に示したフローチャートと同様の処理を実行する。図２４は、図３のＳ２０２の処理の結果作成されるコールフローグラフを示す図である。コールフローグラフ１０７より、関数ｆｕｎｃ２が関数ｆｕｎｃ１を呼び出していることがわかる。
【０１２７】
図２５は、図３のＳ２０３およびＳ２０４の処理の結果作成される解析情報を示す図である。解析情報１０６によると、関数ｆｕｎｃ１の仮引数ｘの最大値および最小値はともに「３」であり、偶数の値は取り得ず、奇数の値を取ることが示されている。解析情報１０６の作成処理は、実施の形態１と同様であるため、その詳細な説明はここでは繰り返さない。
【０１２８】
図２６は、エラーチェック部１０５の実行する処理のフローチャートである。エラーチェック部１０５は、プログラム１０１中に含まれる各ループ処理について、以下の処理を繰り返す。
【０１２９】
エラーチェック部１０５は、ループ処理に対して付加されたヒント情報が何であるかを判断する（Ｓ７０１）。例えば、図２３のプログラム１０１に含まれるｆｏｒループ処理には、プラグマ「#pragma _loop_unrolling」が付加されている。
【０１３０】
当該ヒント情報が、プラグマ「#pragma _loop_unrolling」の場合には（Ｓ７０１で#pragma _loop_unrolling）、解析情報１０６も利用して、当該ループ処理の繰り返し回数の可能性をチェックする（Ｓ７０２）。例えば、プログラム１０１のｆｏｒループ処理の繰り返し回数は、仮引数ｘの値により規定されている。したがって、解析情報１０６より、ｆｏｒループ処理の繰り返し回数は３回のみであり、奇数回数のみしか取り得ないことがわかる。
【０１３１】
エラーチェック部１０５は、着目しているループ処理の繰り返し回数が２回以上で、かつ当該繰り返し回数が奇数または偶数のみしか取らないかを判断する（Ｓ７０３）。この条件に合致しない場合には（Ｓ７０３でＮＯ）、展開する繰り返しの数を２回とするループアンローリングによるループ処理の最適化を行うことができない。このため、そのような場合には、エラーチェック部１０５は、チェック結果１０３をエラー情報として図示しない表示部に表示する（Ｓ７０４）。
【０１３２】
当該条件に合致する場合（Ｓ７０３でＹＥＳ）、またはエラー表示を行った後は、次のループ処理に対して、上述の処理と同様の処理を行う（Ｓ７０１〜Ｓ７０４）。なお、上述のｆｏｒループ処理の場合には、当該条件に合致する。
【０１３３】
以上説明したように、本実施の形態によると、ループアンローリングによる最適化を直接コンパイラへ指示するヒント情報が論理的に矛盾しているか否かをチェックすることができる。
［実施の形態６、最適化手法を指定するヒント情報２］
本実施の形態では、コンパイラに対して最適化手法を直接指定するヒント情報の論理的な矛盾をチェックする他のプログラム処理装置について説明する。コンパイラへ最適化手法を直接指定するヒント情報として、例えば、ソフトウェアパイプライニングを指定するヒント情報がある。
【０１３４】
図２７は、ソフトウェアパイプライニングに関するヒント情報を含むプログラムの一例を示す図である。プログラム１０１には、関数ｆｕｎｃ１および関数ｆｕｎｃ２が含まれている。
【０１３５】
ソフトウェアパイプライニングを指定するヒント情報の一種であるプラグマ「#pragma _software_pipelining」は、直後に位置するループ処理(for,while,do)に対して、ソフトウェアパイプライニングによる最適化をせよとのユーザによるコンパイラに対する指示である。例えば、プログラム１０１の関数ｆｕｎｃ１内には、プラグマ「#pragma _software_pipelining」が記述されており、直後のｆｏｒループ処理に対してソフトウェアパイプライニングによる最適化を施せとの指示がユーザによりされている。なお、ソフトウェアパイプライニングは、異なる繰り返し処理を同時にいくつか実行する技術であるため、ループ処理の繰り返し回数は、最低同時に実行される繰り返し処理の数以上必要となるが、ここでは、２回であるものとする。
【０１３６】
コンパイラは、このプラグマを手がかりとして、当該ｆｏｒループ処理に対してソフトウェアパイプライニングによる最適化を施す。これにより、ｆｏｒループ処理の実行速度を高速化することができる。
【０１３７】
このヒント情報を含むプログラム１０１を入力とした場合の構文解析部１０４およびエラーチェック部１０５の実行する処理について説明する。
【０１３８】
構文解析部１０４は、図３に示したフローチャートと同様の処理を実行する。ただし、Ｓ２０３の処理においては、大域変数または各関数が呼ばれる際に仮引数の最小値のみを解析する点が異なる。
【０１３９】
図２８は、図３のＳ２０２の処理の結果作成されるコールフローグラフを示す図である。コールフローグラフ１０７より、関数ｆｕｎｃ１が関数ｆｕｎｃ２を呼び出していることがわかる。
【０１４０】
図２９は、図３のＳ２０３およびＳ２０４の処理の結果作成される解析情報を示す図である。解析情報１０６によると、関数ｆｕｎｃ１の仮引数ｘの最小値は「２」であることが示されている。解析情報１０６の作成処理は、実施の形態１と同様であるため、その詳細な説明はここでは繰り返さない。
【０１４１】
図３０は、エラーチェック部１０５の実行する処理のフローチャートである。エラーチェック部１０５は、プログラム１０１中に含まれる各ループ処理について、以下の処理を繰り返す。
【０１４２】
エラーチェック部１０５は、ループ処理に対して付加されたヒント情報が何であるかを判断する（Ｓ８０１）。例えば、図２７のプログラム１０１に含まれるｆｏｒループ処理には、プラグマ「#pragma _software_pipelining」が付加されている。
【０１４３】
当該ヒント情報が、プラグマ「#pragma _software_pipelining」の場合には（Ｓ８０１で#pragma _software_pipelining）、解析情報１０６も利用して、当該ループ処理の繰り返し回数の可能性をチェックする（Ｓ８０２）。例えば、プログラム１０１のｆｏｒループ処理の繰り返し回数は、仮引数ｘにより規定されている。したがって、解析情報１０６より、ｆｏｒループ処理の繰り返し回数は最低２回であることがわかる。
【０１４４】
エラーチェック部１０５は、着目しているループ処理の繰り返し回数が２回以上であるか否かを判断する（Ｓ８０３）。この条件に合致しない場合には（Ｓ８０３でＮＯ）、ソフトウェアパイプライニングによるループ処理の最適化を行うことができない。そのため、そのような場合には、エラーチェック部１０５は、チェック結果１０３をエラー情報として図示しない表示部に表示する（Ｓ８０４）。
【０１４５】
当該条件に合致する場合（Ｓ８０３でＹＥＳ）、またはエラー表示を行った後は、次のループ処理に対して、上述の処理と同様の処理を行う（Ｓ８０１〜Ｓ８０４）。なお、上述のｆｏｒループ処理の場合には、当該条件に合致する。
【０１４６】
以上説明したように、本実施の形態によるとソフトウェアパイプライニングによる最適化を直接コンパイラに指示するヒント情報が論理的に矛盾しているか否かをチェックすることができる。
［実施の形態７、最適化手法を指定するヒント情報３］
本実施の形態では、コンパイラに対して最適化手法を直接指定するヒント情報の論理的な矛盾をチェックするさらに他のプログラム処理装置について説明する。コンパイラへ最適化手法を直接指定するヒント情報として、例えば、ペア命令の出力を指定するヒント情報がある。
【０１４７】
図３１は、ペア命令に関するヒント情報を含むプログラムの一例を示す図である。プログラム１０１には、関数ｆｕｎｃ１および関数ｆｕｎｃ２が含まれている。
【０１４８】
ペア命令に関するヒント情報の一種であるプラグマ「#pragma _pair_inst p」は、指定された配列ｐの要素をメモリから一度にロードしたり、メモリへライトしたりするペア命令を発行し、最適化せよとのユーザによるコンパイラに対する指示である。例えば、プログラム１０１の関数ｆｕｎｃ２内には、プラグマ「#pragma _pair_inst a」が記述されており、配列ａに対してペア命令を発行せよとの指示がユーザによりされている。なお、ペア命令を発行させるためには、配列ｐの要素のアラインメント値が、配列ｐの要素の通常の型の２倍以上なければならない。
【０１４９】
コンパイラは、このプラグマを手がかりとして、配列ｐに対してペア命令を発行する最適化を施す。これにより、メモリアクセスの回数を減少させることができ、処理を高速化させることができる。
【０１５０】
このヒント情報を含むプログラム１０１を入力とした場合の構文解析部１０４およびエラーチェック部１０５の実行する処理について説明する。
【０１５１】
構文解析部１０４は、図３に示したフローチャートと同様の処理を実行する。ただし、Ｓ２０３の処理においては、関数の仮引数が指す配列の要素のアラインメント値を解析する点が異なる。なお、アラインメント値の解析方法は、実施の形態２に示したものと同様である。このため、その詳細な説明はここでは繰り返さない。
【０１５２】
図３２は、図３のＳ２０２の処理の結果作成されるコールフローフラグを示す図である。コールフローグラフ１０７より、関数ｆｕｎｃ１が関数ｆｕｎｃ２を呼び出していることがわかる。
【０１５３】
図３３は、図３のＳ２０３およびＳ２０４の処理の結果作成される解析情報を示す図である。解析情報１０６によると、関数ｆｕｎｃ２の仮引数ａで指し示される領域のデータ、すなわち配列ａの各要素は４バイト単位でアラインメントされていることがわかる。
【０１５４】
図３４は、エラーチェック部１０５の実行する処理のフローチャートである。エラーチェック部１０５は、プログラム１０１中に含まれる各配列について、以下の処理を繰り返す。
【０１５５】
エラーチェック部１０５は、着目している配列に対して付加されたヒント情報が何であるかを判断する（Ｓ９０１）。例えば、図３１のプログラム１０１に含まれる配列ａの先頭要素へのポインタには、プラグマ「#pragma _pair_inst」が付加されている（プログラム中では「#pragma _pair_inst a」と記述）。
【０１５６】
当該ヒント情報が、プラグマ「#pragma _pair_inst」の場合には（Ｓ９０１で#pragma _pair_inst）、エラーチェック部１０５は、解析情報１０６も利用して、当該配列要素のアラインメント値をチェックする（Ｓ９０２）。ここでは、配列ａの要素のアラインメント値が４であることが解析情報１０６よりわかる。
【０１５７】
エラーチェック部１０５は、チェックした配列要素のアラインメント値が当該配列要素の通常の型の２倍以上あるか否かを判断する（Ｓ９０３）。この条件に合致しない場合には（Ｓ９０３でＮＯ）、コンパイラは、配列に対してペア命令を発行する最適化を施すことができない。このため、そのような場合には、エラーチェック部１０５は、チェック結果１０３をエラー情報として図示しない表示部に表示する（Ｓ９０４）。
【０１５８】
当該条件に合致する場合（Ｓ９０３でＹＥＳ）、またはエラー表示を行った後は、次の配列に対して、上述の処理と同様の処理を行う（Ｓ９０１〜Ｓ９０４）。なお、プログラム１０１に含まれる配列ａの要素は４バイトごとにアラインメントされており、かつ配列ａの要素はｓｈｏｒｔ型である。ｓｈｏｒｔ型のデータは２バイトであることより、この配列ａは上述の条件を満たすことになる。
【０１５９】
以上説明したように、本実施の形態によると、ペア命令の出力をコンパイラに直接指示するヒント情報が論理的に矛盾しているか否かをチェックすることができる。
［実施の形態８、最適化手法を指定するヒント情報４］
本実施の形態では、コンパイラに対して最適化手法を直接指定するヒント情報の論理的な矛盾をチェックするさらに他のプログラム処理装置について説明する。コンパイラへ最適化手法を直接指定するヒント情報として、例えば、キャッシュメモリ等の制御処理を指示する組込み関数によるヒント情報がある。
【０１６０】
図３５は、キャッシュメモリ等の制御処理を指示する組込み関数によるヒント情報を含むプログラムの一例を示す図である。プログラム１０１には、関数ｆｕｎｃ１および関数ｆｕｎｃ２が含まれている。
【０１６１】
キャッシュメモリ等の制御処理を指示するヒント情報の一種である組み込み関数reserve_regionは、その組み込み関数の実引数で指定された変数の値を記憶するための領域をキャッシュメモリ上に確保するのみであり、かつメインメモリからキャッシュメモリへはその変数の値を転送（プリフェッチ）しないという処理を実行する組み込み関数である。これにより、メモリアクセス時間を減少させることができる。このような処理ができるのは、組み込み関数reserve_region記述された位置以降では、当該組み込み関数reserve_regionの実引数で指定された変数に対するアクセスが、データの書き込みから開始されていることをユーザが保証しているからである。
【０１６２】
このヒント情報を含むプログラム１０１を入力とした場合の構文解析部１０４およびエラーチェック部１０５の実行する処理について説明する。
【０１６３】
構文解析部１０４は、図３に示したフローチャートと同様の処理を実行する。ただし、Ｓ２０３の処理においては、実施の形態３と同様に、各関数について、大域変数からのデータの読み出しおよび大域変数へのデータの書き込みが存在するか否かの解析を行う。
【０１６４】
図３６は、図３のＳ２０２の処理の結果作成されるコールフローグラフを示す図である。コールフローグラフ１０７より、関数ｆｕｎｃ１が関数ｆｕｎｃ２を呼び出していることがわかる。
【０１６５】
図３７は、図３のＳ２０３およびＳ２０４の結果作成される解析情報を示す図である。解析情報１０６によると、例えば、関数ｆｕｎｃ２内では、大域変数ｘからの読み出しと、大域変数ｙへの書き込みとが行われていることがわかる。
【０１６６】
図３８は、エラーチェック部１０５の実行する処理のフローチャートである。エラーチェック部１０５は、プログラム１０１中に含まれる各大域変数について、以下の処理を繰り返す。
【０１６７】
エラーチェック部１０５は、着目している大域変数に対して付加されたヒント情報が何であるかを判断する（Ｓ１００１）。当該大域変数に対して付加されたヒント情報が組み込み関数reserve_regionである場合には（Ｓ１００１でreserve_region()）、エラーチェック部１０５は、解析情報１０６も利用して、当該組み込み関数の配置位置以降に当該大域変数へのデータの書き込みがあるか否かを調べる（Ｓ１００２）。
【０１６８】
エラーチェック部１０５は、着目している大域変数に関して、当該組み込み関数の配置位置以降では、当該大域変数へのアクセスは、データの書き込みから始まっているか否かを調べる（Ｓ１００３）。当該条件に合致しない場合には（Ｓ１００３でＮＯ）、エラーチェック部１０５は、チェック結果１０３をエラー情報として図示しない表示部に表示する（Ｓ１００４）。
【０１６９】
例えば、大域変数ｘについては、プログラム１０１の関数ｆｕｎｃ１内に組み込み関数reserve_region(x)によるヒント情報が付加されてる。このため、Ｓ１００２の処理では、当該組み込み関数の配置位置以降の大域変数ｘへのデータの書き込みについてチェックする。プログラム１０１では、当該組み込み関数の直後に関数ｆｕｎｃ２の呼び出しが存在するが、解析情報１０６によれば、関数ｆｕｎｃ２内部で大域変数ｘからのデータの読み出しが存在し、大域変数ｘへのデータの書き込みが存在しない。よって、大域変数ｘへのアクセスについては、組み込み関数reserve_region(x)の配置位置以降では、当該大域変数ｘからのデータの読み出しより始まっており、上述の条件に合致しない（Ｓ１００３でＮＯ）。したがって、エラーチェック部１０５は、図３９に示すようなチェック結果１０３をエラー情報として表示する。
【０１７０】
上述の条件に合致する場合（Ｓ１００３でＹＥＳ）、またはエラー表示を行った後は、次の大域変数に対して、上述の処理と同様の処理を行う（Ｓ１００１〜Ｓ１００４）。
【０１７１】
以上説明したように、本実施の形態によると、キャッシュメモリ等の制御処理を指示する組込み関数によるヒント情報が論理的に矛盾しているか否かをチェックすることができる。
【０１７２】
上述の実施の形態１〜８によると、コンパイラが誤った機械語プログラムを生成してしまうことがないように、プラグマに代表されるヒント情報のチェックを行なうことができる。このため、ユーザがプラグマに代表されるヒント情報をコンパイラに積極的に与えたとしても、良好な最適化ができるように、ヒント情報のチェックを行なうことができる。なお、このようなヒント情報には、コンパイラに対して、ある最適化に関する指示を直接行うヒント情報と、プログラム全体の静的情報をコンパイラに対して示すことにより、コンパイラによる最適化のサポートを行うヒント情報の両者が含まれる。
【０１７３】
以上、本発明に係るプログラム処理装置について、実施の形態に基づいて説明したが、本発明は、この実施の形態に限定されるものではない。
【０１７４】
例えば、図４０に示すようなプログラム１０１が与えられた場合に、エラーチェック部１０５は、上述の実施の形態と同様に図４１に示すようなヒント情報のエラー情報を示すチェック結果１０３を表示させる代わりに、ヒント情報をどのように修正すればよいかがわかる場合には、図４２に示すような修正情報を含むチェック結果１０３を表示させるようにしてもよい。図４２のチェック結果１０３では、修正情報を示すチェック結果１０３の一例を示す図であり、プログラム１０１の２行目のプラグマ「#pragma _min_iteration=5を#pragma _min_iteration=2」に修正すべきであるとの修正情報を示している。
【０１７５】
また、図４３に示すようなプログラム１０１が与えられた場合には、プラグマ「#pragma _align_pointer=8 a」が論理的に矛盾しないためには、配列ａの要素が８バイト単位でアラインメントされていればよい。このため、例えば、プログラム１０１の２行目にプラグマ「#pragma _align_object=8 a」を挿入すれば、プラグマ「#pragma _align_pointer=8 a」は論理的に矛盾しなくなる。図４４は、このような修正情報を含むチェック結果１０３の一例を示す図である。なお、このような修正情報は、プラグマの形で与えられる必要はなく、コンパイルオプションの形で与えられるようにしてもよい。例えば、図４５は、コンパイルオプションによる修正情報を含むチェック結果１０３の一例を示す図である。なお、「コンパイルオプション」とは、コンパイラを起動する際に、コンパイルの対象となるプログラム１０１の指定とともに、ユーザが任意に指定することができるコンパイラへの指示である。例えば、ユーザは、プログラム１０１「foo.c」をコンパイルするときに、コマンド「cc」を用いて、コンピュータのコマンドライン上で、
cc -falign-all-array=8 foo.c
と入力することができる。
【０１７６】
さらに、図４６に示すようなプログラム１０１が与えられた場合には、ｆｏｒループ処理の繰り返し回数を規定するｍａｉｎ関数の仮引数ｘは、機械語プログラム実行時に決まる。このため、ｆｏｒループ処理の繰り返し回数はコンパイル時には決定されない。したがって、プログラム１０１に含まれるプラグマ「#pragma _min_iteration=5」が論理的に矛盾しているか否か判断できない。よって、図４７に示すような、当該プラグマが誤りかどうか判定不能であることを示す不確定情報を含むチェック結果１０３を表示するようにしてもよい。また、図４８に示すような、当該プラグマが誤りになる可能性があることを示すワーニング情報を含むチェック結果１０３を表示するようにしてもよい。
【０１７７】
さらにまた、図１に示したプログラム処理装置１０２の代わりに、図４９に示すようなプログラム処理装置２０２を用いるようにしてもよい。プログラム処理装置２０２は、ヒント情報を含むプログラム１０１とそのプログラム１０１に対する解析情報１０６とを受け、プログラム１０１中でのヒント情報の論理的な整合性を判断する装置であり、構文解析部１０４と、エラーチェック部１０５とを備える。構文解析部２０４は、プログラム１０１（１０１ａ，１０１ｂ）を受け、プログラム１０１（１０１ａ，１０１ｂ）に対して、コンパイラ等で用いられる通常の構文解析処理を行なう処理部である。なお、解析情報１０６は、構文解析部２０４で構文解析されるプログラム１００（１００ａ，１００ｂ）とは異なるプログラム１００（１００ａ，１００ｂ）に対する解析結果である。例えば、プログラム１００がプログラム１００ａとプログラム１００ｂとからなるような場合にあっては、解析情報１０６はプログラム１００ａに対する解析情報１０６であり、構文解析部２０４に入力されるプログラムは、プログラム１００ｂのような場合である。
【０１７８】
エラーチェック部１０５の構成は、上述した実施の形態と同様であるため、その詳細な説明はここでは繰り返さない。図５０は、プログラム処理装置２０２に入力されるプログラム１０１の一例を示しており、図５１は、プログラム処理装置２０２に入力される解析情報１０６の一例を示している。その結果、プログラム処理装置２０２からは、図７に示したのと同様のチェック結果１０３が得られる。
【０１７９】
また、プログラム１０１は、Ｃ言語で記述されたソースプログラムとして説明を行ったが、それ以外のＣ＋＋言語等の高級言語で記述されたソースプログラムであってもよいし、オブジェクトプログラム、中間言語で記述されたプログラム、アセンブリ言語で記述されたプログラムであってもよい。
【０１８０】
さらにまた、上述の実施の形態では、ヒント情報として主にプラグマを例に説明を行ったが、ヒント情報は、プラグマに限られるものではなく、組み込み関数や、コンパイルオプションや、プログラミング言語の予約語等であってもよい。
【０１８１】
また、ループアンローリングにおいて展開する繰り返しの回数は２回に限定されるものではなく、それよりも多い回数であっても、同様の趣旨に基づく処理を行うことにより、ヒント情報のチェックを行うことができる。
【０１８２】
さらに、ソフトウェアパイプライニングにおいて同時に実行される繰り返し処理の回数は２回に限定されるものではなく、それよりも多い回数であっても、同様の趣旨に基づく処理を行うことにより、ヒント情報のチェックを行うことができる。
【産業上の利用可能性】
【０１８３】
本発明は、ユーザがコンパイラに対して与えるヒント情報の論理矛盾をチェックするプログラム処理装置等に利用可能であり、特に、プログラム中から、ヒント情報の論理矛盾をあらかじめ排除するプリプロセッサ等として利用可能である。
【図面の簡単な説明】
【０１８４】
【図１】プログラム処理装置の構成を示す機能ブロック図である。
【図２】繰り返し回数に関するヒント情報を含むプログラムの一例を示す図である。（ａ）は、関数ｆｕｎｃ１を含むプログラムの一例を示す図であり、（ｂ）は、ｍａｉｎ関数、関数ｆｕｎｃ２および関数ｆｕｎｃ３を含むプログラムの一例を示す図である。
【図３】構文解析部の実行する処理のフローチャートである。
【図４】コールフローグラフの一例を示す図である。
【図５】解析情報の一例を示す図である。
【図６】エラーチェック部の実行する処理のフローチャートである。
【図７】チェック結果の一例を示す図である。
【図８】ポインタ変数に関するヒント情報を含むプログラムの一例を示す図である。（ａ）は、関数ｆｕｎｃ１、関数ｆｕｎｃ２および関数ｆｕｎｃ３を含むプログラムの一例を示す図であり、（ｂ）は、ｍａｉｎ関数を含むプログラムの一例を示す図である。
【図９】図８（ａ）および図８（ｂ）に示されたプログラムに基づいて、構文解析部により作成されたコールフローグラフの一例を示す図である。
【図１０】構文解析部により作成された解析情報の一例を示す図である。
【図１１】エラーチェック部の実行する処理のフローチャートである。
【図１２】チェック結果の一例を示す図である。
【図１３】変数の読み書きに関するヒント情報を含むプログラムの一例を示す図である。
【図１４】図１３に示したプログラムに基づいて、構文解析部により作成されたコールフローグラフの一例を示す図である。
【図１５】構文解析部により作成された解析情報の一例を示す図である。
【図１６】エラーチェック部の実行する処理のフローチャートである。
【図１７】チェック結果の一例を示す図である。
【図１８】静的頻度に関するヒント情報を含むプログラムの一例を示す図である。
【図１９】図１８に示したプログラムに基づいて、構文解析部により作成されたコールフローグラフの一例を示す図である。
【図２０】構文解析部により作成された解析情報の一例を示す図である。
【図２１】エラーチェック部の実行する処理のフローチャートである。
【図２２】チェック結果の一例を示す図である。
【図２３】ループアンローリングに関するヒント情報を含むプログラムの一例を示す図である。
【図２４】図３のＳ２０２の処理の結果作成されるコールフローグラフを示す図である。
【図２５】図３のＳ２０３およびＳ２０４の処理の結果作成される解析情報を示す図である。
【図２６】エラーチェック部の実行する処理のフローチャートである。
【図２７】ソフトウェアパイプライニングに関するヒント情報を含むプログラムの一例を示す図である。
【図２８】図３のＳ２０２の処理の結果作成されるコールフローグラフを示す図である。
【図２９】図３のＳ２０３およびＳ２０４の処理の結果作成される解析情報を示す図である。
【図３０】エラーチェック部の実行する処理のフローチャートである。
【図３１】ペア命令に関するヒント情報を含むプログラムの一例を示す図である。
【図３２】図３のＳ２０２の処理の結果作成されるコールフローフラグを示す図である。
【図３３】図３のＳ２０３およびＳ２０４の処理の結果作成される解析情報を示す図である。
【図３４】エラーチェック部の実行する処理のフローチャートである。
【図３５】キャッシュメモリ等の制御処理を指示する組込み関数によるヒント情報を含むプログラムの一例を示す図である。
【図３６】図３のＳ２０２の処理の結果作成されるコールフローグラフを示す図である。
【図３７】図３のＳ２０３およびＳ２０４の結果作成される解析情報を示す図である。
【図３８】エラーチェック部の実行する処理のフローチャートである。
【図３９】チェック結果の一例を示す図である。
【図４０】プログラムの一例を示す図である。
【図４１】ヒント情報のエラー情報を示すチェック結果の一例を示す図である。
【図４２】修正情報を含むチェック結果の一例を示す図である。
【図４３】プログラムの一例を示す図である。
【図４４】修正情報を含むチェック結果の一例を示す図である。
【図４５】コンパイルオプションによる修正情報を含むチェック結果の一例を示す図である。
【図４６】プログラムの一例を示す図である。
【図４７】プラグマが誤りかどうか判定不能であることを示す不確定情報を含むチェック結果の一例を示す図である。
【図４８】プラグマが誤りになる可能性があることを示すワーニング情報を含むチェック結果の一例を示す図である。
【図４９】プログラム処理装置の他の構成を示す機能ブロック図である。
【図５０】プログラムの一例を示す図である。
【図５１】解析情報の一例を示す図である。
【図５２】最適化に関する指示を直接行うプラグマを含むソースプログラムの一例を示す図である。
【図５３】プログラム全体の静的情報をコンパイラに対して示すプラグマを含むソースプログラムの一例を示す図である。
【符号の説明】
【０１８５】
１０１，１０１ａ，１０１ｂ  プログラム
１０２，２０２  プログラム処理装置
１０３  チェック結果
１０４，２０４  構文解析部
１０５  エラーチェック部
１０６  解析情報
１０７  コールフローグラフ
【図１】
2006107339.tif 000003
【図２】
2006107339.tif 000004
【図３】
2006107339.tif 000005
【図４】
2006107339.tif 000006
【図５】
2006107339.tif 000007
【図６】
2006107339.tif 000008
【図７】
2006107339.tif 000009
【図８】
2006107339.tif 000010
【図９】
2006107339.tif 000011
【図１０】
2006107339.tif 000012
【図１１】
2006107339.tif 000013
【図１２】
2006107339.tif 000014
【図１３】
2006107339.tif 000015
【図１４】
2006107339.tif 000016
【図１５】
2006107339.tif 000017
【図１６】
2006107339.tif 000018
【図１７】
2006107339.tif 000019
【図１８】
2006107339.tif 000020
【図１９】
2006107339.tif 000021
【図２０】
2006107339.tif 000022
【図２１】
2006107339.tif 000023
【図２２】
2006107339.tif 000024
【図２３】
2006107339.tif 000025
【図２４】
2006107339.tif 000026
【図２５】
2006107339.tif 000027
【図２６】
2006107339.tif 000028
【図２７】
2006107339.tif 000029
【図２８】
2006107339.tif 000030
【図２９】
2006107339.tif 000031
【図３０】
2006107339.tif 000032
【図３１】
2006107339.tif 000033
【図３２】
2006107339.tif 000034
【図３３】
2006107339.tif 000035
【図３４】
2006107339.tif 000036
【図３５】
2006107339.tif 000037
【図３６】
2006107339.tif 000038
【図３７】
2006107339.tif 000039
【図３８】
2006107339.tif 000040
【図３９】
2006107339.tif 000041
【図４０】
2006107339.tif 000042
【図４１】
2006107339.tif 000043
【図４２】
2006107339.tif 000044
【図４３】
2006107339.tif 000045
【図４４】
2006107339.tif 000046
【図４５】
2006107339.tif 000047
【図４６】
2006107339.tif 000048
【図４７】
2006107339.tif 000049
【図４８】
2006107339.tif 000050
【図４９】
2006107339.tif 000051
【図５０】
2006107339.tif 000052
【図５１】
2006107339.tif 000053
【図５２】
2006107339.tif 000054
【図５３】
2006107339.tif 000055