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