(57)【特許請求の範囲】
【請求項１】
ソースプログラムを解釈して中間テキストを生成し最適化を行ってオブジェクトプログラムを生成するコンパイラ装置であって、前記最適化はループ内の条件分岐の削除に基づく最適化であり、当該コンパイラ装置は、
初期値が１で増分値が１のインデックスを含むループの検出を行うループ検出手段と、
前記ループ検出手段で検出されたループ内に存在する条件分岐コードを検出し、「条件が剰余の結果と定数との比較であり、当該剰余を算出するための除算の被除数が当該ループのインデックスであり、当該除算の除数が正整数の定数である」という要件を満たす条件分岐コードを検出し、当該条件分岐コードに関する情報を記録する分岐検出手段と、
前記分岐検出手段で検出された条件分岐コードを含むループのアンロール段数を前記分岐検出手段で記録された情報中の上記の除数と当該ループの繰り返し数との最大公約数の値に決定するアンロール段数決定手段と、
前記アンロール段数決定手段で決定されたアンロール段数で当該ループのアンローリングを行い、当該アンローリングにおける各コードを展開する過程において当該各コードが何段目に展開されたコードであるかを示す情報と前記分岐検出手段で記録された情報とから前記分岐検出手段で検出された条件分岐コードの条件について「必ず真／偽になるか否か」と「真および偽のいずれになるか」とを判断し、その判断に基づいて条件が必ず真／偽になる条件分岐コードを無条件分岐コードに変更するループアンローリング手段と、
前記ループアンローリング手段による条件分岐コードから無条件分岐コードへの変更に起因して不要となったコードを削除する不要コード削除手段と
を有することを特徴とするコンパイラ装置。
【請求項２】
ソースプログラムを解釈して中間テキストを生成し最適化を行ってオブジェクトプログラムを生成するコンパイラ装置であって、前記最適化はループ内の条件分岐の削除に基づく最適化であり、当該コンパイラ装置は、
初期値が変数で増分値が１のインデックスを含むループの検出を行うループ検出手段と、
前記ループ検出手段で検出されたループ内に存在する条件分岐コードを検出し、「条件が剰余の結果と定数との比較であり、当該剰余を算出するための除算の被除数が当該ループのインデックスであり、当該除算の除数が正整数の定数である」という要件を満たす条件分岐コードを検出し、当該条件分岐コードに関する情報を記録する分岐検出手段と、
前記分岐検出手段で検出された条件分岐コードを含むループのアンロール段数を前記分岐検出手段で記録された情報中の上記の除数の値に決定するアンロール段数決定手段と、
アンロール対象外コード群をアンロール対象のコード群の前段に生成した上で、前記アンロール段数決定手段で決定されたアンロール段数で当該ループのアンローリングを行い、当該アンローリングにおける各コードを展開する過程において当該各コードが何段目に展開されたコードであるかを示す情報と前記分岐検出手段で記録された情報とから前記分岐検出手段で検出された条件分岐コードの条件について「必ず真／偽になるか否か」と「真および偽のいずれになるか」とを判断し、その判断に基づいて条件が必ず真／偽になる条件分岐コードを無条件分岐コードに変更するループアンローリング手段と、
前記ループアンローリング手段による条件分岐コードから無条件分岐コードへの変更に起因して不要となったコードを削除する不要コード削除手段と
を有することを特徴とするコンパイラ装置。
【請求項３】
ソースプログラムを解釈して中間テキストを生成し最適化を行ってオブジェクトプログラムを生成するコンパイラ装置であって、前記最適化はループ内の条件分岐の削除に基づく最適化であり、当該コンパイラ装置は、
初期値が１で増分値が定数のインデックスを含むループの検出を行うループ検出手段と、
前記ループ検出手段で検出されたループ内に存在する条件分岐コードを検出し、「条件が剰余の結果と定数との比較であり、当該剰余を算出するための除算の被除数が当該ループのインデックスであり、当該除算の除数が正整数の定数である」という要件を満たす条件分岐コードを検出し、当該条件分岐コードに関する情報を記録する分岐検出手段と、
前記分岐検出手段で検出された条件分岐コードを含むループのアンロール段数を前記分岐検出手段で記録された情報に基づいて「アンロール処理後の増分値がアンロール処理前の増分値と上記の除数との最小公倍数になる」という要件を満たす値をアンロール処理前の増分値で割った値となるように決定するアンロール段数決定手段と、
前記アンロール段数決定手段で決定されたアンロール段数で当該ループのアンローリングを行い、当該アンローリングにおける各コードを展開する過程において当該各コードが何段目に展開されたコードであるかを示す情報と前記分岐検出手段で記録された情報とから前記分岐検出手段で検出された条件分岐コードの条件について「必ず真／偽になるか否か」と「真および偽のいずれになるか」とを判断し、その判断に基づいて条件が必ず真／偽になる条件分岐コードを無条件分岐コードに変更するループアンローリング手段と、
前記ループアンローリング手段による条件分岐コードから無条件分岐コードへの変更に起因して不要となったコードを削除する不要コード削除手段と
を有することを特徴とするコンパイラ装置。
【請求項４】
ソースプログラムを解釈して中間テキストを生成し最適化を行ってオブジェクトプログラムを生成するコンパイラ装置であって、前記最適化はループ内の条件分岐の削除に基づく最適化であり、当該コンパイラ装置は、
初期値が１で増分値が１のインデックスを含むループの検出を行うループ検出手段と、
前記ループ検出手段で検出されたループ内に存在する条件分岐コードを検出し、「条件が剰余の結果と定数との比較であり、当該剰余を算出するための除算の被除数が当該ループのインデックスであり、当該除算の除数が正整数の定数である」という要件を満たす条件分岐コードを検出し、当該条件分岐コードに関する情報を記録する分岐検出手段と、
前記分岐検出手段で検出された条件分岐コードを含むループのアンロール段数を前記分岐検出手段で記録された情報中の上記の除数と当該ループの繰り返し数との最大公約数よりも小さな値であり当該ループの繰り返し数の約数である値に決定するアンロール段数決定手段と、
前記アンロール段数決定手段で決定されたアンロール段数で当該ループのアンローリングを行い、当該アンローリングにおける各コードを展開する過程において当該各コードが何段目に展開されたコードであるかを示す情報と前記分岐検出手段で記録された情報とから前記分岐検出手段で検出された条件分岐コードの条件について「必ず真／偽になるか否か」と「真および偽のいずれになるか」とを判断し、その判断に基づいて条件が必ず真／偽になる条件分岐コードを無条件分岐コードに変更するループアンローリング手段と、
前記ループアンローリング手段による条件分岐コードから無条件分岐コードへの変更に起因して不要となったコードを削除する不要コード削除手段と
を有することを特徴とするコンパイラ装置。
【請求項５】
ソースプログラムを解釈して中間テキストを生成し最適化を行ってオブジェクトプログラムを生成するコンパイラ装置であって、前記最適化はループ内の条件分岐の削除に基づく最適化であり、当該コンパイラ装置は、
初期値が変数で増分値が定数のインデックスを含むループの検出を行うループ検出手段と、
前記ループ検出手段で検出されたループ内に存在する条件分岐コードを検出し、「条件が剰余の結果と定数との比較であり、当該剰余を算出するための除算の被除数が当該ループのインデックスであり、当該除算の除数が正整数の定数である」という要件を満たす条件分岐コードを検出し、当該条件分岐コードに関する情報を記録する分岐検出手段と、
前記分岐検出手段で検出された条件分岐コードを含むループのアンロール段数を前記分岐検出手段で記録された情報に基づいて「アンロール処理後の増分値がアンロール処理前の増分値と上記の除数との最小公倍数になる」という要件を満たす値に決定するアンロール段数決定手段と、
アンロール対象外コード群をアンロール対象のコード群の前段に生成した上で、前記アンロール段数決定手段で決定されたアンロール段数で当該ループのアンローリングを行い、当該アンローリングにおける各コードを展開する過程において当該各コードが何段目に展開されたコードであるかを示す情報と前記分岐検出手段で記録された情報とから前記分岐検出手段で検出された条件分岐コードの条件について「必ず真／偽になるか否か」と「真および偽のいずれになるか」とを判断し、その判断に基づいて条件が必ず真／偽になる条件分岐コードを無条件分岐コードに変更するループアンローリング手段と、
前記ループアンローリング手段による条件分岐コードから無条件分岐コードへの変更に起因して不要となったコードを削除する不要コード削除手段と
を有することを特徴とするコンパイラ装置。
【請求項６】
ソースプログラムを解釈して中間テキストを生成し最適化を行ってオブジェクトプログラムを生成するコンパイラ装置であって、前記最適化はループ内の条件分岐の削除に基づく最適化であり、当該コンパイラ装置は、
初期値が変数で増分値が１のインデックスを含むループの検出を行うループ検出手段と、
前記ループ検出手段で検出されたループ内に存在する条件分岐コードを検出し、「条件が剰余の結果と定数との比較であり、当該剰余を算出するための除算の被除数が当該ループのインデックスであり、当該除算の除数が正整数の定数である」という要件を満たす条件分岐コードを検出し、当該条件分岐コードに関する情報を記録する分岐検出手段と、
前記分岐検出手段で検出された条件分岐コードを含むループのアンロール段数を前記分岐検出手段で記録された情報中の上記の除数よりも小さな値であり当該ループの繰り返し数の約数である値に決定するアンロール段数決定手段と、
アンロール対象外コード群をアンロール対象のコード群の前段に生成した上で、前記アンロール段数決定手段で決定されたアンロール段数で当該ループのアンローリングを行い、当該アンローリングにおける各コードを展開する過程において当該各コードが何段目に展開されたコードであるかを示す情報と前記分岐検出手段で記録された情報とから前記分岐検出手段で検出された条件分岐コードの条件について「必ず真／偽になるか否か」と「真および偽のいずれになるか」とを判断し、その判断に基づいて条件が必ず真／偽になる条件分岐コードを無条件分岐コードに変更するループアンローリング手段と、
前記ループアンローリング手段による条件分岐コードから無条件分岐コードへの変更に起因して不要となったコードを削除する不要コード削除手段と
を有することを特徴とするコンパイラ装置。
【請求項７】
ソースプログラムを解釈して中間テキストを生成し最適化を行ってオブジェクトプログラムを生成するコンパイラ装置であって、前記最適化はループ内の条件分岐の削除に基づく最適化であり、当該コンパイラ装置は、
初期値が１で増分値が定数のインデックスを含むループの検出を行うループ検出手段と、
前記ループ検出手段で検出されたループ内に存在する条件分岐コードを検出し、「条件が剰余の結果と定数との比較であり、当該剰余を算出するための除算の被除数が当該ループのインデックスであり、当該除算の除数が正整数の定数である」という要件を満たす条件分岐コードを検出し、当該条件分岐コードに関する情報を記録する分岐検出手段と、
前記分岐検出手段で検出された条件分岐コードを含むループのアンロール段数を前記分岐検出手段で記録された情報に基づいて「アンロール処理後の増分値がアンロール処理前の増分値と上記の除数との最小公倍数になる」という要件を満たす値と当該ループの繰り返し数との最大公約数よりも小さな値であり当該ループの繰り返し数の約数である値に決定するアンロール段数決定手段と、
前記アンロール段数決定手段で決定されたアンロール段数で当該ループのアンローリングを行い、当該アンローリングにおける各コードを展開する過程において当該各コードが何段目に展開されたコードであるかを示す情報と前記分岐検出手段で記録された情報とから前記分岐検出手段で検出された条件分岐コードの条件について「必ず真／偽になるか否か」と「真および偽のいずれになるか」とを判断し、その判断に基づいて条件が必ず真／偽になる条件分岐コードを無条件分岐コードに変更するループアンローリング手段と、
前記ループアンローリング手段による条件分岐コードから無条件分岐コードへの変更に起因して不要となったコードを削除する不要コード削除手段と
を有することを特徴とするコンパイラ装置。
【請求項８】
ソースプログラムを解釈して中間テキストを生成し最適化を行ってオブジェクトプログラムを生成するコンパイラ装置であって、前記最適化はループ内の条件分岐の削除に基づく最適化であり、当該コンパイラ装置は、
初期値が変数で増分値が定数のインデックスを含むループの検出を行うループ検出手段と、
前記ループ検出手段で検出されたループ内に存在する条件分岐コードを検出し、「条件が剰余の結果と定数との比較であり、当該剰余を算出するための除算の被除数が当該ループのインデックスであり、当該除算の除数が正整数の定数である」という要件を満たす条件分岐コードを検出し、当該条件分岐コードに関する情報を記録する分岐検出手段と、
前記分岐検出手段で検出された条件分岐コードを含むループのアンロール段数を前記分岐検出手段で記録された情報に基づいて「アンロール処理後の増分値がアンロール処理前の増分値と上記の除数との最小公倍数になる」という要件を満たす値よりも小さな値であり当該ループの繰り返し数の約数である値に決定するアンロール段数決定手段と、
アンロール対象外コード群をアンロール対象のコード群の前段に生成した上で、前記アンロール段数決定手段で決定されたアンロール段数で当該ループのアンローリングを行い、当該アンローリングにおける各コードを展開する過程において当該各コードが何段目に展開されたコードであるかを示す情報と前記分岐検出手段で記録された情報とから前記分岐検出手段で検出された条件分岐コードの条件について「必ず真／偽になるか否か」と「真および偽のいずれになるか」とを判断し、その判断に基づいて条件が必ず真／偽になる条件分岐コードを無条件分岐コードに変更するループアンローリング手段と、
前記ループアンローリング手段による条件分岐コードから無条件分岐コードへの変更に起因して不要となったコードを削除する不要コード削除手段と
を有することを特徴とするコンパイラ装置。
【請求項９】
前記ソースプログラムがＦｏｒｔｒａｎで記述されたソースプログラムであるところの、請求項１〜８のいずれか１項に記載のコンパイラ装置。
【請求項１０】
ソースプログラムを解釈して中間テキストを生成し最適化を行ってオブジェクトプログラムを生成するコンパイラが格納されたコンピュータ読み取り可能な記録媒体であって、前記最適化はループ内の条件分岐の削除に基づく最適化であり、当該コンパイラが、初期値が１で増分値が１のインデックスを含むループの検出を行うループ検出手段，前記ループ検出手段で検出されたループ内に存在する条件分岐コードを検出し、「条件が剰余の結果と定数との比較であり、当該剰余を算出するための除算の被除数が当該ループのインデックスであり、当該除算の除数が正整数の定数である」という要件を満たす条件分岐コードを検出し、当該条件分岐コードに関する情報を記録する分岐検出手段，前記分岐検出手段で検出された条件分岐コードを含むループのアンロール段数を前記分岐検出手段で記録された情報中の上記の除数と当該ループの繰り返し数との最大公約数の値に決定するアンロール段数決定手段，前記アンロール段数決定手段で決定されたアンロール段数で当該ループのアンローリングを行い、当該アンローリングにおける各コードを展開する過程において当該各コードが何段目に展開されたコードであるかを示す情報と前記分岐検出手段で記録された情報とから前記分岐検出手段で検出された条件分岐コードの条件について「必ず真／偽になるか否か」と「真および偽のいずれになるか」とを判断し、その判断に基づいて条件が必ず真／偽になる条件分岐コードを無条件分岐コードに変更するループアンローリング手段，ならびに前記ループアンローリング手段による条件分岐コードから無条件分岐コードへの変更に起因して不要となったコードを削除する不要コード削除手段としてコンピュータを機能させるものである、コンパイラが格納されたコンピュータ読み取り可能な記録媒体。
【請求項１１】
ソースプログラムを解釈して中間テキストを生成し最適化を行ってオブジェクトプログラムを生成するコンパイラが格納されたコンピュータ読み取り可能な記録媒体であって、前記最適化はループ内の条件分岐の削除に基づく最適化であり、当該コンパイラが、初期値が変数で増分値が１のインデックスを含むループの検出を行うループ検出手段，前記ループ検出手段で検出されたループ内に存在する条件分岐コードを検出し、「条件が剰余の結果と定数との比較であり、当該剰余を算出するための除算の被除数が当該ループのインデックスであり、当該除算の除数が正整数の定数である」という要件を満たす条件分岐コードを検出し、当該条件分岐コードに関する情報を記録する分岐検出手段，前記分岐検出手段で検出された条件分岐コードを含むループのアンロール段数を前記分岐検出手段で記録された情報中の上記の除数の値に決定するアンロール段数決定手段，アンロール対象外コード群をアンロール対象のコード群の前段に生成した上で、前記アンロール段数決定手段で決定されたアンロール段数で当該ループのアンローリングを行い、当該アンローリングにおける各コードを展開する過程において当該各コードが何段目に展開されたコードであるかを示す情報と前記分岐検出手段で記録された情報とから前記分岐検出手段で検出された条件分岐コードの条件について「必ず真／偽になるか否か」と「真および偽のいずれになるか」とを判断し、その判断に基づいて条件が必ず真／偽になる条件分岐コードを無条件分岐コードに変更するループアンローリング手段，ならびに前記ループアンローリング手段による条件分岐コードから無条件分岐コードへの変更に起因して不要となったコードを削除する不要コード削除手段としてコンピュータを機能させるものである、コンパイラが格納されたコンピュータ読み取り可能な記録媒体。
【請求項１２】
ソースプログラムを解釈して中間テキストを生成し最適化を行ってオブジェクトプログラムを生成するコンパイラが格納されたコンピュータ読み取り可能な記録媒体であって、前記最適化はループ内の条件分岐の削除に基づく最適化であり、当該コンパイラが、初期値が１で増分値が定数のインデックスを含むループの検出を行うループ検出手段，前記ループ検出手段で検出されたループ内に存在する条件分岐コードを検出し、「条件が剰余の結果と定数との比較であり、当該剰余を算出するための除算の被除数が当該ループのインデックスであり、当該除算の除数が正整数の定数である」という要件を満たす条件分岐コードを検出し、当該条件分岐コードに関する情報を記録する分岐検出手段，前記分岐検出手段で検出された条件分岐コードを含むループのアンロール段数を前記分岐検出手段で記録された情報に基づいて「アンロール処理後の増分値がアンロール処理前の増分値と上記の除数との最小公倍数になる」という要件を満たす値をアンロール処理前の増分値で割った値となるように決定するアンロール段数決定手段，前記アンロール段数決定手段で決定されたアンロール段数で当該ループのアンローリングを行い、当該アンローリングにおける各コードを展開する過程において当該各コードが何段目に展開されたコードであるかを示す情報と前記分岐検出手段で記録された情報とから前記分岐検出手段で検出された条件分岐コードの条件について「必ず真／偽になるか否か」と「真および偽のいずれになるか」とを判断し、その判断に基づいて条件が必ず真／偽になる条件分岐コードを無条件分岐コードに変更するループアンローリング手段，ならびに前記ループアンローリング手段による条件分岐コードから無条件分岐コードへの変更に起因して不要となったコードを削除する不要コード削除手段としてコンピュータを機能させるものである、コンパイラが格納されたコンピュータ読み取り可能な記録媒体。
【請求項１３】
ソースプログラムを解釈して中間テキストを生成し最適化を行ってオブジェクトプログラムを生成するコンパイラが格納されたコンピュータ読み取り可能な記録媒体であって、前記最適化はループ内の条件分岐の削除に基づく最適化であり、当該コンパイラが、初期値が１で増分値が１のインデックスを含むループの検出を行うループ検出手段，前記ループ検出手段で検出されたループ内に存在する条件分岐コードを検出し、「条件が剰余の結果と定数との比較であり、当該剰余を算出するための除算の被除数が当該ループのインデックスであり、当該除算の除数が正整数の定数である」という要件を満たす条件分岐コードを検出し、当該条件分岐コードに関する情報を記録する分岐検出手段，前記分岐検出手段で検出された条件分岐コードを含むループのアンロール段数を前記分岐検出手段で記録された情報中の上記の除数と当該ループの繰り返し数との最大公約数よりも小さな値であり当該ループの繰り返し数の約数である値に決定するアンロール段数決定手段，前記アンロール段数決定手段で決定されたアンロール段数で当該ループのアンローリングを行い、当該アンローリングにおける各コードを展開する過程において当該各コードが何段目に展開されたコードであるかを示す情報と前記分岐検出手段で記録された情報とから前記分岐検出手段で検出された条件分岐コードの条件について「必ず真／偽になるか否か」と「真および偽のいずれになるか」とを判断し、その判断に基づいて条件が必ず真／偽になる条件分岐コードを無条件分岐コードに変更するループアンローリング手段，ならびに前記ループアンローリング手段による条件分岐コードから無条件分岐コードへの変更に起因して不要となったコードを削除する不要コード削除手段としてコンピュータを機能させるものである、コンパイラが格納されたコンピュータ読み取り可能な記録媒体。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明は、ソースプログラムを解釈して中間テキストを生成し最適化を行ってオブジェクトプログラムを生成するコンパイラ装置に関し、さらに詳しくはループ内の条件分岐の削除に基づく最適化（生成するオブジェクトプログラムの実行時間を短縮するための最適化）を実行するコンパイラ装置に関する。
【０００２】
【従来の技術】
従来におけるこの種のコンパイラ装置に関する特許公報としては、特開平５−２７９８６号公報が存在する。
【０００３】
当該公報には、ループ内で不変な変数と定数との比較またはループ内で不変な変数同士の比較を行い、その比較結果に基づいて分岐している条件分岐が存在する場合に、比較命令を削除し分岐先に無条件に分岐するようにして、最適化を実現する技術（コンパイラの最適化方法および最適化装置）が記載されている。
【０００４】
すなわち、この従来技術では、ループ内で不変な変数と定数との比較命令またはループ内で不変な変数同士の比較命令のみが、無条件分岐命令に変更されて、ループ内の条件分岐の削除による最適化が行われている。
【０００５】
ここで、当該従来技術では、ループの中で特定の条件のみで実行される式を実行するか否かの判定を行うための分岐命令（比較命令および条件分岐命令から置換された無条件分岐命令）を生成する必要があった。
【０００６】
【発明が解決しようとする課題】
上述した従来のコンパイラ装置には、以下に示すような問題点があった。
【０００７】
第１の問題点は、ループの中で特定の条件のみで実行される式を実行するか否かの判定を行うための分岐命令（無条件分岐命令）が生成されるために、他の最適化を阻害する可能性があるということである。
【０００８】
第２の問題点は、第１の問題点で挙げた分岐命令が常に生成されるために、ループ内で実行される命令が多くなり、当該コンパイラ装置によって生成されるオブジェクトプログラムの実行性能が悪くなるということである。
【０００９】
本発明の目的は、上述の点に鑑み、ループ内に存在する条件分岐（条件分岐コード）を当該ループのアンローリングを行うことによって無条件分岐（無条件分岐コード）に変更し、当該変更に基づいて不要なコードを削除することにより、実行時間が短いオブジェクトプログラムの生成が可能となるコンパイラ装置、および、コンパイラが格納されたコンピュータ読み取り可能な記録媒体を提供することにある。
【００１０】
【課題を解決するための手段】
本発明のコンパイラ装置は、ソースプログラムを解釈して中間テキストを生成し最適化を行ってオブジェクトプログラムを生成するコンパイラ装置であって、前記最適化はループ内の条件分岐の削除に基づく最適化であり、当該コンパイラ装置は、初期値が１で増分値が１のインデックスを含むループの検出を行うループ検出手段と、前記ループ検出手段で検出されたループ内に存在する条件分岐コードを検出し、「条件が剰余の結果と定数との比較であり、当該剰余を算出するための除算の被除数が当該ループのインデックスであり、当該除算の除数が正整数の定数である」という要件を満たす条件分岐コードを検出し、当該条件分岐コードに関する情報を記録する分岐検出手段と、前記分岐検出手段で検出された条件分岐コードを含むループのアンロール段数を前記分岐検出手段で記録された情報中の上記の除数と当該ループの繰り返し数（繰り返し数）との最大公約数の値に決定するアンロール段数決定手段と、前記アンロール段数決定手段で決定されたアンロール段数で当該ループのアンローリングを行い、当該アンローリングにおける各コードを展開する過程において当該各コードが何段目に展開されたコードであるかを示す情報と前記分岐検出手段で記録された情報とから前記分岐検出手段で検出された条件分岐コードの条件について「必ず真／偽になるか否か」と「真および偽のいずれになるか」とを判断し、その判断に基づいて条件が必ず真／偽になる条件分岐コードを無条件分岐コードに変更するループアンローリング手段と、前記ループアンローリング手段による条件分岐コードから無条件分岐コードへの変更に起因して不要となったコードを削除する不要コード削除手段とを有する。
【００１１】
また、本発明のコンパイラ装置は、ソースプログラムを解釈して中間テキストを生成し最適化を行ってオブジェクトプログラムを生成するコンパイラ装置であって、前記最適化はループ内の条件分岐の削除に基づく最適化であり、当該コンパイラ装置は、初期値が変数（１以外の定数を含むものとする）で増分値が１のインデックスを含むループの検出を行うループ検出手段と、前記ループ検出手段で検出されたループ内に存在する条件分岐コードを検出し、「条件が剰余の結果と定数との比較であり、当該剰余を算出するための除算の被除数が当該ループのインデックスであり、当該除算の除数が正整数の定数である」という要件を満たす条件分岐コードを検出し、当該条件分岐コードに関する情報を記録する分岐検出手段と、前記分岐検出手段で検出された条件分岐コードを含むループのアンロール段数を前記分岐検出手段で記録された情報中の上記の除数の値に決定するアンロール段数決定手段と、アンロール対象外コード群（ループの繰り返し数が前記アンロール段数決定手段により決定されたアンロール段数の倍数で可能な限り大きな値となるように調整した場合に、アンロール対象のコード群以外のコード群として分割されたコード群）をアンロール対象のコード群の前段に生成した上で、前記アンロール段数決定手段で決定されたアンロール段数で当該ループのアンローリングを行い、当該アンローリングにおける各コードを展開する過程において当該各コードが何段目に展開されたコードであるかを示す情報と前記分岐検出手段で記録された情報とから前記分岐検出手段で検出された条件分岐コードの条件について「必ず真／偽になるか否か」と「真および偽のいずれになるか」とを判断し、その判断に基づいて条件が必ず真／偽になる条件分岐コードを無条件分岐コードに変更するループアンローリング手段と、前記ループアンローリング手段による条件分岐コードから無条件分岐コードへの変更に起因して不要となったコードを削除する不要コード削除手段とを有するように構成することもできる。
【００１２】
さらに、本発明のコンパイラ装置は、ソースプログラムを解釈して中間テキストを生成し最適化を行ってオブジェクトプログラムを生成するコンパイラ装置であって、前記最適化はループ内の条件分岐の削除に基づく最適化であり、当該コンパイラ装置は、初期値が１で増分値が定数のインデックスを含むループの検出を行うループ検出手段と、前記ループ検出手段で検出されたループ内に存在する条件分岐コードを検出し、「条件が剰余の結果と定数との比較であり、当該剰余を算出するための除算の被除数が当該ループのインデックスであり、当該除算の除数が正整数の定数である」という要件を満たす条件分岐コードを検出し、当該条件分岐コードに関する情報を記録する分岐検出手段と、前記分岐検出手段で検出された条件分岐コードを含むループのアンロール段数を前記分岐検出手段で記録された情報に基づいて「アンロール処理後の増分値がアンロール処理前の増分値と上記の除数との最小公倍数になる」という要件を満たす値をアンロール処理前の増分値で割った値となるように決定するアンロール段数決定手段と、前記アンロール段数決定手段で決定されたアンロール段数で当該ループのアンローリングを行い、当該アンローリングにおける各コードを展開する過程において当該各コードが何段目に展開されたコードであるかを示す情報と前記分岐検出手段で記録された情報とから前記分岐検出手段で検出された条件分岐コードの条件について「必ず真／偽になるか否か」と「真および偽のいずれになるか」とを判断し、その判断に基づいて条件が必ず真／偽になる条件分岐コードを無条件分岐コードに変更するループアンローリング手段と、前記ループアンローリング手段による条件分岐コードから無条件分岐コードへの変更に起因して不要となったコードを削除する不要コード削除手段とを有するように構成することもできる。
【００１３】
加えて、本発明のコンパイラ装置は、ソースプログラムを解釈して中間テキストを生成し最適化を行ってオブジェクトプログラムを生成するコンパイラ装置であって、前記最適化はループ内の条件分岐の削除に基づく最適化であり、当該コンパイラ装置は、初期値が１で増分値が１のインデックスを含むループの検出を行うループ検出手段と、前記ループ検出手段で検出されたループ内に存在する条件分岐コードを検出し、「条件が剰余の結果と定数との比較であり、当該剰余を算出するための除算の被除数が当該ループのインデックスであり、当該除算の除数が正整数の定数である」という要件を満たす条件分岐コードを検出し、当該条件分岐コードに関する情報を記録する分岐検出手段と、前記分岐検出手段で検出された条件分岐コードを含むループのアンロール段数を前記分岐検出手段で記録された情報中の上記の除数と当該ループの繰り返し数との最大公約数よりも小さな値であり当該ループの繰り返し数の約数である値に決定するアンロール段数決定手段と、前記アンロール段数決定手段で決定されたアンロール段数で当該ループのアンローリングを行い、当該アンローリングにおける各コードを展開する過程において当該各コードが何段目に展開されたコードであるかを示す情報と前記分岐検出手段で記録された情報とから前記分岐検出手段で検出された条件分岐コードの条件について「必ず真／偽になるか否か」と「真および偽のいずれになるか」とを判断し、その判断に基づいて条件が必ず真／偽になる条件分岐コードを無条件分岐コードに変更するループアンローリング手段と、前記ループアンローリング手段による条件分岐コードから無条件分岐コードへの変更に起因して不要となったコードを削除する不要コード削除手段とを有するように構成することもできる。
【００１４】
この場合に、Ｆｏｒｔｒａｎで記述されたソースプログラムをコンパイルするコンパイラ装置に適用するように構成することが、望ましい１つの形態であると考えられる。
【００１５】
【発明の実施の形態】
次に、本発明について図面を参照して詳細に説明する。
【００１６】
（１）  第１の実施の形態
図１は、本発明の第１の実施の形態に係るコンパイラ装置の構成を示すブロック図である。
【００１７】
図１を参照すると、本実施の形態に係るコンパイラ装置は、コンパイラ内のループ最適化部１０（中間テキスト２１を最適化して中間テキスト２２を生成する処理部）によって実現される（中間テキスト２１および中間テキスト２２は、コンパイラ装置がソースプログラムを解釈して最適化を行いオブジェクトプログラムを生成する過程で生成される中間テキストに該当する）。
【００１８】
このループ最適化部１０は、ループ検出手段１１と、分岐検出手段１２と、アンロール段数決定手段１３と、ループアンローリング手段１４と、不要コード削除手段１５とを含んで構成されている。
【００１９】
これらの各手段は、概略、次のように動作する。
【００２０】
ループ検出手段１１は、初期値が１で増分値が１のインデックス（処理対象のインデックス）を含むループの検出を行う。
【００２１】
分岐検出手段１２は、ループ検出手段１１で検出されたループ内に存在する条件分岐コードを検出し、「条件が剰余の結果と定数との比較であり、当該剰余を算出するための除算の被除数が当該ループのインデックスであり、当該除算の除数が正整数の定数である」という要件を満たす条件分岐コードを検出し、当該条件分岐コードに関する情報（当該インデックスの初期値，最終値，および増分値ならびに当該除数等）を記録する。
【００２２】
アンロール段数決定手段１３は、分岐検出手段１２で検出された条件分岐コードを含むループのアンロール段数を、分岐検出手段１２で記録された情報中の上記の除数と当該ループの繰り返し数との最大公約数の値に決定する。
【００２３】
ループアンローリング手段１４は、アンロール段数決定手段１３で決定されたアンロール段数で当該ループのアンローリングを行い、当該アンローリングにおける各コードを展開する過程において当該各コードが何段目に展開されたコードであるかを示す情報と分岐検出手段１２で記録された情報とから分岐検出手段１２で検出された条件分岐コードの条件について「必ず真／偽になるか否か」と「真および偽のいずれになるか」とを判断し、その判断に基づいて条件が必ず真／偽になる条件分岐コードを無条件分岐コードに変更する。
【００２４】
不要コード削除手段１５は、ループアンローリング手段１４による条件分岐コードから無条件分岐コードへの変更に起因して不要となったコード（当該無条件分岐コードおよび当該変更に起因して決して実行されなくなったコード）を削除する。
【００２５】
図２は、本実施の形態に係るコンパイラ装置の処理を示す流れ図である。この処理は、ループ検索ステップ２０１と、ループ内処理対象インデックス有無判定ステップ２０２と、ループ内条件分岐コード検索ステップ２０３と、条件内容判定ステップ２０４と、剰余内容判定ステップ２０５と、条件分岐コード検出・情報記録ステップ２０６と、アンロール段数決定ステップ２０７と、ループアンローリングステップ２０８と、条件分岐コード無条件分岐コード変更ステップ２０９と、不要コード削除ステップ２１０とからなる。
【００２６】
図３〜図６は、本実施の形態に係るコンパイラ装置の具体的な動作を説明するための図である。
【００２７】
次に、図１および図２を参照して、上記のように構成された本実施の形態に係るコンパイラ装置の動作について詳細に説明する。
【００２８】
初めに、ループ最適化部１０内のループ検出手段１１は、中間テキスト２１の中からループを検索し（図２のステップ２０１）、当該ループが処理対象のインデックス（ここでは、初期値が１で増分値が１のインデックス）を含むか否かを判定する（ステップ２０２）。これにより、ループ検出手段１１は、処理対象のインデックスを含むループを検出する。
【００２９】
次に、分岐検出手段１２は、ループ検出手段１１によって検出されたループ（処理対象のインデックスを含むループ）内に存在する条件分岐コード（条件分岐命令を示すコード）を検索し（ステップ２０３）、ステップ２０３で検出した条件分岐コードの条件が「剰余の結果と定数との比較」であるか否かを判定し（ステップ２０４）、そうである場合（当該条件が「剰余の結果と定数との比較」である場合）には、さらに「当該剰余を算出するための除算の被除数が当該ループのインデックスであり、当該除算の除数が正整数の定数である」という要件を満たすか否かを判定する（ステップ２０５）。
【００３０】
分岐検出手段１２は、ステップ２０５で「当該要件を満たす」と判定した場合には、上記のステップ２０４およびステップ２０５の要件を満たす条件分岐コードを検出し、当該条件分岐コードに関する情報（当該条件分岐コードを含むループのインデックスに係る値および当該条件分岐コードの条件に係る上記の除数等）を記録する（ステップ２０６）。
【００３１】
次に、アンロール段数決定手段１３は、ステップ２０６で分岐検出手段１２によって記録された情報に基づき、分岐検出手段１２で検出された条件分岐コードを含むループのアンロール段数を決定する（ステップ２０７）。すなわち、当該アンロール段数を、ステップ２０６で記録された情報中の上記の除数と当該ループの繰り返し数との最大公約数の値に決定する。
【００３２】
ループアンローリング手段１４は、ステップ２０７でアンロール段数決定手段１３によって決定されたアンロール段数で、当該ループのアンローリングを行う（ステップ２０８）。
【００３３】
また、ループアンローリング手段１４は、ステップ２０８のアンローリングを行う際に、併せて以下のａ〜ｃに示す処理を行い、アンローリング後における条件分岐コード（分岐検出手段１２によって検出された条件分岐コード）を無条件分岐コードに変更する（ステップ２０９）。
【００３４】
ａ．各コードを展開する過程において、当該各コードが何段目に展開されたコードであるかを示す情報（当該各コードがアンロール段数の何段目のコード群に属するコードであるかを示す情報）を取得する。
【００３５】
ｂ．ａで取得した情報とステップ２０６で分岐検出手段１２によって記録された情報とから、アンローリング後における当該条件分岐コードの条件について「必ず真／偽（必ず真または必ず偽）になるか否か」と「真および偽のいずれになるか」とを判断する。
【００３６】
ｃ．上記のｂで「条件が必ず真／偽になる」と判断した条件分岐コードを、無条件分岐コード（「条件が必ず真になり無条件に分岐する旨を示すコード」または「条件が必ず偽になり無条件に分岐する旨を示すコード」）に変更する処理を行う。
【００３７】
最後に、不要コード削除手段１５は、ループアンローリング手段１４による分岐条件コードから無条件分岐コードへの変更に起因して不要となったコード（変更後の無条件分岐コードおよび「分岐条件コードから無条件分岐コードへの変更」に起因して決して実行されなくなった演算命令等に関するコード）の削除を行う（ステップ２１０）。
【００３８】
これにより、ループ内の条件分岐の削除に基づく最適化が行われた中間テキスト２２が出力される。
【００３９】
なお、ステップ２０２，ステップ２０４，およびステップ２０５で「ノー（ＮＯ）」と判定された場合には、その時点で処理が終了する。
【００４０】
次に、本実施の形態に係るコンパイラ装置の具体的な動作について、図１，図２，図３，図４，図５，および図６を参照して詳細に説明する。
【００４１】
ここでは、図３に示すＦｏｒｔｒａｎプログラム片（インデックスｉの初期値が１で増分値が１のｄｏループを含むプログラム片）を有する中間テキスト２１の最適化が行われる場合の具体例について説明する。
【００４２】
ループ検出手段１１は、中間テキスト２１を検索し、図３中のＤに示すｄｏループを検出する（図２のステップ２０１）。
【００４３】
さらに、ループ検出手段１１は、当該ｄｏループが処理対象のインデックス（初期値および増分値が１のインデックス）を含むか否かを判定する（ステップ２０２）。図３に示すＦｏｒｔｒａｎプログラム片の場合には、Ｄのｄｏループのインデックスｉの初期値および増分値は１であるため、「当該ｄｏループは処理対象のインデックスを含んでいる、すなわち最適化の条件を満たしている」と判定する。
【００４４】
分岐検出手段１２は、当該ｄｏループ内の各コードを調べ、条件分岐コードを検索する（ステップ２０３）。図３の場合には、Ａの「ｉｆ（ｍｏｄ（ｉ，４）．ｅｑ．０）」と、Ｂの「ｉｆ（ｊ．ｌｅ．５００）」と、Ｃの「ｉｆ（ｍｏｄ（ｉ，３）．ｇｅ．ｊ）」とを、条件分岐コードと認識して検出する。
【００４５】
次に、分岐検出手段１２は、上記で検出した条件分岐コードの条件（条件式）が剰余の結果と定数との比較であるか否かを調べる（ステップ２０４）。図３の場合には、ＡおよびＣの条件分岐コードにおける条件式を「剰余を求める関数ｍｏｄの結果と定数との比較である」と判定して、当該２つの条件分岐コードを抽出する。
【００４６】
さらに、分岐検出手段１２は、上記で抽出した条件分岐コードが「その条件式の剰余を算出するための除算の被除数がループのインデックスであり、当該除算の除数が正整数の定数である」という要件を満たすか否かの判定を行う（ステップ２０５）。そしてこの判定の要件を満たす条件分岐コードを選択し、当該条件分岐コードを含むループに関する情報（インデックスに係る値および当該除数等）を記録しておく（ステップ２０６）。図３の場合には、Ａの条件分岐コードを上記の要件を満たす条件分岐コードとして選択する。また、当該条件分岐コードを含むｄｏループ（図３中のＤ）のインデックスｉの初期値の１，最終値の１０００，および増分値の１と当該条件分岐コードの条件に関する除数の４とを記録する。
【００４７】
アンロール段数決定手段１３は、上記で記録した情報を基に、当該ｄｏループのアンロール段数を決定する（ステップ２０７）。図３の場合には、Ａの条件分岐コードにおける剰余を求める関数ｍｏｄの除数が４であり、当該ｄｏループの繰り返し数が１０００であるため、アンロール段数を４（４と１０００との最大公約数）に決定する。
【００４８】
ループアンローリング手段１４は、当該ｄｏループのアンローリングを行う（ステップ２０８）。このアンローリングの結果、図３に示すプログラム片は図４に示すプログラム片のように変更（展開）される。
【００４９】
ここで、ループアンローリング手段１４は、上記のアンローリングを行う際に、展開された各コードが何段目に展開されたコードであるかを示す情報を記録する。そして、この情報とステップ２０６で記録されている情報とを基に、条件が必ず真／偽になる条件分岐コードを無条件分岐コードに変更する（ステップ２０９）。図４の場合には、当該ｄｏループのインデックスｉの初期値が１であり、剰余を求める関数ｍｏｄの除数が４であるため、展開された４番目（４段目）の部分（コード群）に含まれる条件分岐コード（図４中のＤ）の条件「ｍｏｄ（ｉ＋３，４）．ｅｑ．０」が必ず真になり、１〜３段目の部分に含まれる条件分岐コード（図４中のＡ，Ｂ，およびＣ）の条件が必ず偽になる。したがって、上記を基に、図４中のＡ，Ｂ，Ｃ，およびＤの条件分岐コードを、図５中のＥ，Ｆ，およびＧの無条件分岐コード（「ｉｆ（．ｆａｌｓｅ．）」）ならびにＨの無条件分岐コード（「ｉｆ（．ｔｒｕｅ．）」）に変更する。
【００５０】
最後に、不要コード削除手段１５は、無条件分岐コードに変更されたコードと、当該変更により決して実行されなくなったコードとの削除を行う（ステップ２１０）。図５の場合には、無条件分岐コードのＥ，Ｆ，およびＧの条件が「．ｆａｌｓｅ．」（必ず偽になる条件）であるため、無条件分岐コードのＥ，Ｆ，およびＧと、それらに起因して決して実行されなくなったコードのＩ，Ｊ，およびＫとを、不要なコードとして削除する。また、無条件分岐コードのＨについては、その条件が「．ｔｒｕｅ．」（必ず真になる条件）であるため、無条件分岐コードのＨのみを削除する。図５のプログラム片から不要なコードが削除された結果は、図６に示すプログラム片のようになる。
【００５１】
上記の最適化（ループ内の条件分岐の削除による最適化）の結果、ループ内に存在する条件分岐コードが削除されるため、条件分岐命令の条件式である剰余の演算命令も削除され、ループ内で実行される命令数が減少する。また、一般的に分岐命令は最適化を阻害する要因となるので、条件分岐命令（条件分岐コード）が減ることにより、他の最適化の効果を期待することができるようになる。
【００５２】
（２）  第２の実施の形態
図１は、本発明の第２の実施の形態に係るコンパイラ装置の構成を示すブロック図でもある。すなわち、本実施の形態に係るコンパイラ装置も、ループ最適化部１０（中間テキスト２１を最適化して中間テキスト２２を生成する処理部）によって実現される。また、このループ最適化部１０は、ループ検出手段１１と、分岐検出手段１２と、アンロール段数決定手段１３と、ループアンローリング手段１４と、不要コード削除手段１５とを含んで構成されている。
【００５３】
本実施の形態においては、これらの各手段は、概略、次のように動作する。
【００５４】
ループ検出手段１１は、初期値が変数（１以外の定数を含むものとする）で増分値が１のインデックスを含むループの検出を行う。
【００５５】
分岐検出手段１２は、ループ検出手段１１で検出されたループ内に存在する条件分岐コードを検出し、「条件が剰余の結果と定数との比較であり、当該剰余を算出するための除算の被除数が当該ループのインデックスであり、当該除算の除数が正整数の定数である」という要件を満たす条件分岐コードを検出し、当該条件分岐コードに関する情報（当該インデックスの初期値，最終値，および増分値ならびに当該除数等）を記録する。
【００５６】
アンロール段数決定手段１３は、分岐検出手段１２で検出された条件分岐コードを含むループのアンロール段数を、分岐検出手段１２で記録された情報中の上記の除数の値に決定する。
【００５７】
ループアンローリング手段１４は、アンロール対象外コード群（ループの繰り返し数がアンロール段数決定手段１３により決定されたアンロール段数の倍数で可能な限り大きな値となるように調整した場合にアンロール対象のコード群以外のコード群として分割されたコード群）をアンロール対象のコード群の前段に生成した上で、アンロール段数決定手段１３で決定されたアンロール段数で当該ループのアンローリングを行う。また、当該アンローリングにおける各コードを展開する過程において当該各コードが何段目に展開されたコードであるかを示す情報と分岐検出手段１２で記録された情報とから、分岐検出手段１２で検出された条件分岐コードの条件について「必ず真／偽になるか否か」と「真および偽のいずれになるか」とを判断し、その判断に基づいて条件が必ず真／偽になる条件分岐コードを無条件分岐コードに変更する。
【００５８】
不要コード削除手段１５は、ループアンローリング手段１４による条件分岐コードから無条件分岐コードへの変更に起因して不要となったコード（当該無条件分岐コードおよび当該変更に起因して決して実行されなくなったコード）を削除する。
【００５９】
図７および図８は、本実施の形態に係るコンパイラ装置の具体的な動作を説明するための図である。
【００６０】
第１の実施の形態に係るコンパイラ装置では、ループ検出手段１１において、初期値が１であり増分値が１であるインデックスを含むループが最適化の対象とされていた。これに対して、第２の実施の形態に係るコンパイラ装置では、ループのインデックスの初期値が変数や１以外の定数であっても当該ループを最適化の対象とすることができる。
【００６１】
次に、本実施の形態に係るコンパイラ装置の具体的な動作について、図７および図８を参照して説明する。
【００６２】
ここでは、図７に示すＦｏｒｔｒａｎプログラム片（インデックスｉの初期値が変数ｋで増分値が１のｄｏループを含むプログラム片）を有する中間テキスト２１の最適化が行われる場合の具体例について説明する。
【００６３】
図７のＦｏｒｔｒａｎプログラム片において、ｄｏループのインデックスｉの初期値が図７中のＡで設定されているが、初期値が変数ｋであり定数の１ではない。したがって、第１の実施の形態におけるループ検出手段１１のインデックスの抽出条件（図２のステップ２０２の判定における「処理対象のインデックス」に該当する要件）は、満たされていない。しかし、本実施の形態におけるループ検出手段１１は、そのようなインデックスを含むループも最適化の対象とすることができる。
【００６４】
また、アンロール段数決定手段１３は、図７中のＢの条件分岐コードの条件式において剰余を求める関数ｍｏｄの除数が４であるため、アンロール段数を４段と決定する。
【００６５】
ループアンローリング手段１４は、アンロール対象外コード群（ループの繰り返し数がアンロール段数決定手段１３により決定されたアンロール段数の倍数で可能な限り大きな値になるように調整した場合にアンロール対象のコード群以外のコード群として分割されたコード群）をアンロール対象のコード群の前段に生成した上で、アンロール段数決定手段１３で決定された段数でループのアンローリングを行う。図８中のＣの部分が、アンロール対象のコード群（図８中のＤの部分）におけるｄｏループの繰り返し数を上記の除数の４の倍数になるようにしたとき（アンロール段数を４段としたとき）のアンローリング対象外コード群である。ここで、「ｉａｎｄ」は、Ｆｏｒｔｒａｎにおけるビット操作に関する関数の１つであり、各ビットの論理積を求める関数である。また、「ｍａｘ」は、Ｆｏｒｔｒａｎにおける最大値を求めるための関数である。
【００６６】
この場合に、ループアンローリング手段１４は、第１の実施の形態におけると同様に、図８中のＤの部分に存在していた条件分岐コードが必ず真／偽になると判断できるため、当該部分に対して、第１の実施の形態におけると同様のアンローリングおよび「条件分岐コードから無条件分岐コードへの変更」を適用することが可能になる。
【００６７】
そして、不要コード削除手段１５は、当該部分における不要コードの削除を実行し、図８に示すようなＦｏｒｔｒａｎプログラム片を有する中間テキスト２２を生成する。
【００６８】
このようにして、本実施の形態においても、第１の実施の形態におけると同様に、実行される命令数を減少させることができるため（図８参照）、本実施の形態に係るコンパイラ装置によって生成されるオブジェクトプログラムの実行性能は向上する。
【００６９】
（３）  第３の実施の形態
図１は、本発明の第３の実施の形態に係るコンパイラ装置の構成を示すブロック図でもある。すなわち、本実施の形態に係るコンパイラ装置も、ループ最適化部１０（中間テキスト２１を最適化して中間テキスト２２を生成する処理部）によって実現される。また、このループ最適化部１０は、ループ検出手段１１と、分岐検出手段１２と、アンロール段数決定手段１３と、ループアンローリング手段１４と、不要コード削除手段１５とを含んで構成されている。
【００７０】
本実施の形態においては、これらの各手段は、概略、次のように動作する。
【００７１】
ループ検出手段１１は、初期値が１で増分値が定数のインデックスを含むループの検出を行う。
【００７２】
分岐検出手段１２は、ループ検出手段１１で検出されたループ内に存在する条件分岐コードを検出し、「条件が剰余の結果と定数との比較であり、当該剰余を算出するための除算の被除数が当該ループのインデックスであり、当該除算の除数が正整数の定数である」という要件を満たす条件分岐コードを検出し、当該条件分岐コードに関する情報（当該インデックスの初期値，最終値，および増分値ならびに当該除数等）を記録する。
【００７３】
アンロール段数決定手段１３は、分岐検出手段１２で検出された条件分岐コードを含むループのアンロール段数を、分岐検出手段１２で記録された情報に基づいて、「変形後の増分値が変形前の増分値と上記の除数との最小公倍数になる」という要件を満たす値と当該ループの繰り返し数との最大公約数の値となるように決定する。
【００７４】
ループアンローリング手段１４は、アンロール段数決定手段１３で決定されたアンロール段数で当該ループのアンローリングを行い、当該アンローリングにおける各コードを展開する過程において当該各コードが何段目に展開されたコードであるかを示す情報と分岐検出手段１２で記録された情報とから分岐検出手段１２で検出された条件分岐コードの条件について「必ず真／偽になるか否か」と「真および偽のいずれになるか」とを判断し、その判断に基づいて条件が必ず真／偽になる条件分岐コードを無条件分岐コードに変更する。
【００７５】
不要コード削除手段１５は、ループアンローリング手段１４による条件分岐コードから無条件分岐コードへの変更に起因して不要となったコード（当該無条件分岐コードおよび当該変更に起因して決して実行されなくなったコード）を削除する。
【００７６】
図９および図１０は、本実施の形態に係るコンパイラ装置の具体的な動作を説明するための図である。
【００７７】
第１の実施の形態に係るコンパイラ装置では、ループ検出手段１１において、インデックスの増分値が１であるループが最適化の対象とされていた。これに対して、第３の実施の形態に係るコンパイラ装置では、インデックスの増分値が１でないループも最適化の対象とすることができる。
【００７８】
次に、本実施の形態に係るコンパイラ装置の具体的な動作について、図９および図１０を参照して説明する。
【００７９】
ここでは、図９に示すＦｏｒｔｒａｎプログラム片（インデックスｉの初期値が１で増分値が６のｄｏループを含むプログラム片）を有する中間テキスト２１の最適化が行われる場合の具体例について説明する。
【００８０】
図９のＦｏｒｔｒａｎプログラム片において、ｄｏループのインデックスｉの増分値が、図９中のＡで６と設定されている。したがって、第１の実施の形態におけるループ検出手段１１のインデックスの抽出条件（増分値に関する条件）は、満たされていない。しかし、本実施の形態におけるループ検出手段１１は、そのような増分値に関するインデックスの抽出条件の制約がないので、そのようなインデックスを含むループも最適化の対象とすることができる。
【００８１】
このとき、アンロール段数決定手段１３は、変形後の増分値が変形前の増分値の６と図９中のＢの剰余を求める関数ｍｏｄの除数４との最小公倍数の１２になるように、アンロール段数を決定する。
【００８２】
そして、ループアンローリング手段１４は、１２段のアンロール段数でアンローリングを行うことによって、図９中のｄｏループの変形（展開）を行い、本発明のコンパイラ装置の適用を可能とする。
【００８３】
つまり、不要コード削除手段１５は、ループアンローリング手段１４によるアンローリングおよび「条件分岐コードから無条件分岐コードへの変更」を受けて、不要コードの削除を実行し、図１０に示すようなＦｏｒｔｒａｎプログラム片を有する中間テキスト２２を生成する。
【００８４】
本実施の形態においても、本発明の適用により、ループ内で実行される命令が削除されるため（図１０参照）、本実施の形態に係るコンパイラ装置によって生成されるオブジェクトプログラムの実行性能が向上する。
【００８５】
（４）  第４の実施の形態
図１は、本発明の第４の実施の形態に係るコンパイラ装置の構成を示すブロック図でもある。すなわち、本実施の形態に係るコンパイラ装置も、ループ最適化部１０（中間テキスト２１を最適化して中間テキスト２２を生成する処理部）によって実現される。また、このループ最適化部１０は、ループ検出手段１１と、分岐検出手段１２と、アンロール段数決定手段１３と、ループアンローリング手段１４と、不要コード削除手段１５とを含んで構成されている。
【００８６】
本実施の形態においては、これらの各手段は、概略、次のように動作する。
【００８７】
ループ検出手段１１は、初期値が１で増分値が１のインデックスを含むループの検出を行う。
【００８８】
分岐検出手段１２は、ループ検出手段１１で検出されたループ内に存在する条件分岐コードを検出し、「条件が剰余の結果と定数との比較であり、当該剰余を算出するための除算の被除数が当該ループのインデックスであり、当該除算の除数が正整数の定数である」という要件を満たす条件分岐コードを検出し、当該条件分岐コードに関する情報（当該インデックスの初期値，最終値，および増分値ならびに当該除数等）を記録する。
【００８９】
アンロール段数決定手段１３は、分岐検出手段１２で検出された条件分岐コードを含むループのアンロール段数を、分岐検出手段１２で記録された情報中の上記の除数と当該ループの繰り返し数との最大公約数よりも小さな値であり当該ループの繰り返し数の約数である値に決定する。
【００９０】
ループアンローリング手段１４は、アンロール段数決定手段１３で決定されたアンロール段数で当該ループのアンローリングを行い、当該アンローリングにおける各コードを展開する過程において当該各コードが何段目に展開されたコードであるかを示す情報と分岐検出手段１２で記録された情報とから分岐検出手段１２で検出された条件分岐コードの条件について「必ず真／偽になるか否か」と「真および偽のいずれになるか」とを判断し、その判断に基づいて条件が必ず真／偽になる条件分岐コードを無条件分岐コードに変更する。
【００９１】
不要コード削除手段１５は、ループアンローリング手段１４による条件分岐コードから無条件分岐コードへの変更に起因して不要となったコード（当該無条件分岐コードおよび当該変更に起因して決して実行されなくなったコード）を削除する。
【００９２】
図１１および図１２は、本実施の形態に係るコンパイラ装置の具体的な動作を説明するための図である。
【００９３】
第１の実施の形態に係るコンパイラ装置では、アンロール段数を条件分岐コードにおける剰余に係る除数と当該ループの繰り返し数との最大公約数の値としていた。これに対して、第４の実施の形態に係るコンパイラ装置は、アンロール段数を上記のような値には限定せず、「上記の除数と当該ループの繰り返し数との最大公約数よりも小さな値であり、当該ループの繰り返し数の約数である値」（条件分岐コードの削除を可能とする他の値）となるように、アンロール段数を決定している。これにより、当該除数が大きな値であっても、アンローリング後のコード群を大きなものとすることなく、本発明の考え方を適用することが可能になる。
【００９４】
次に、本実施の形態に係るコンパイラ装置の具体的な動作について、図１１および図１２を参照して説明する。
【００９５】
ここでは、図１１に示すＦｏｒｔｒａｎプログラム片（条件中の剰余に係る除数が１０００と大きな値である条件分岐コードを有するｄｏループ（インデックスｉの初期値が１で増分値が１で繰り返し数が１００００００のｄｏループ）を含むプログラム片）を有する中間テキスト２１の最適化が行われる場合の具体例について説明する。
【００９６】
図１１のＦｏｒｔｒａｎプログラム片において、剰余を求める関数ｍｏｄの除数は１０００であり、第１の実施の形態に係るコンパイラ装置の処理を適用するとアンローリング後のコード群が非常に大きなものになってしまう。
【００９７】
これに対して、本実施の形態に係るコンパイラ装置を適用すると、図１２に示すように、当該ｄｏループの繰り返し数の１００００００の約数である４という適切なアンロール段数でアンローリングを行うことができ、本発明の考え方の適用が可能になる。
【００９８】
本実施の形態に係るコンパイラ装置の適用により、アンローリング後において、分岐検出手段１２によって検出された条件分岐コードの全てを削除することはできないものの、当該ｄｏループ中の３つの条件分岐コードを削除することはできるため（図１２参照）、本実施の形態に係るコンパイラ装置によって生成されるオブジェクトプログラムの実行性能は向上する。
【００９９】
（５）  他の実施の形態
本発明のコンパイラ装置では、上述の第１の実施の形態〜第４の実施の形態の他に、以下のａ〜ｄに示す実施の形態も考えられる。なお、これらの実施の形態に係るコンパイラ装置も、図１に示すブロック図によって、その構成を示すことができる。
【０１００】
ａ．第２の実施の形態の考え方と第３の実施の形態の考え方とを併有させて、第５の実施の形態を実現することができる。この実施の形態に係るコンパイラ装置は、以下に示すような各手段を備えた構成となる。
【０１０１】
ループ検出手段１１は、初期値が変数で増分値が定数のインデックスを含むループの検出を行う。
【０１０２】
分岐検出手段１２は、ループ検出手段１１で検出されたループ内に存在する条件分岐コードを検出し、「条件が剰余の結果と定数との比較であり、当該剰余を算出するための除算の被除数が当該ループのインデックスであり、当該除算の除数が正整数の定数である」という要件を満たす条件分岐コードを検出し、当該条件分岐コードに関する情報を記録する。
【０１０３】
アンロール段数決定手段１３は、分岐検出手段１２で検出された条件分岐コードを含むループのアンロール段数を分岐検出手段１２で記録された情報に基づいて「変形後の増分値が変形前の増分値と上記の除数との最小公倍数になる」という要件を満たす値に決定する。
【０１０４】
ループアンローリング手段１４は、アンロール対象外コード群をアンロール対象のコード群の前段に生成した上で、アンロール段数決定手段１３で決定されたアンロール段数で当該ループのアンローリングを行い、当該アンローリングにおける各コードを展開する過程において当該各コードが何段目に展開されたコードであるかを示す情報と分岐検出手段１２で記録された情報とから分岐検出手段１２で検出された条件分岐コードの条件について「必ず真／偽になるか否か」と「真および偽のいずれになるか」とを判断し、その判断に基づいて条件が必ず真／偽になる条件分岐コードを無条件分岐コードに変更する。
【０１０５】
不要コード削除手段１５は、ループアンローリング手段１４による条件分岐コードから無条件分岐コードへの変更に起因して不要となったコードを削除する。
【０１０６】
ｂ．第２の実施の形態の考え方と第４の実施の形態の考え方とを併有させて、第６の実施の形態を実現することができる。この実施の形態に係るコンパイラ装置は、以下に示すような各手段を備えた構成となる。
【０１０７】
ループ検出手段１１は、初期値が変数で増分値が１のインデックスを含むループの検出を行う。
【０１０８】
分岐検出手段１２は、ループ検出手段１１で検出されたループ内に存在する条件分岐コードを検出し、「条件が剰余の結果と定数との比較であり、当該剰余を算出するための除算の被除数が当該ループのインデックスであり、当該除算の除数が正整数の定数である」という要件を満たす条件分岐コードを検出し、当該条件分岐コードに関する情報を記録する。
【０１０９】
アンロール段数決定手段１３は、分岐検出手段１２で検出された条件分岐コードを含むループのアンロール段数を分岐検出手段１２で記録された情報中の上記の除数よりも小さな値であり当該ループの繰り返し数の約数である値に決定する。
【０１１０】
ループアンローリング手段１４は、アンロール対象外コード群をアンロール対象のコード群の前段に生成した上で、アンロール段数決定手段で決定されたアンロール段数で当該ループのアンローリングを行い、当該アンローリングにおける各コードを展開する過程において当該各コードが何段目に展開されたコードであるかを示す情報と分岐検出手段１２で記録された情報とから分岐検出手段１２で検出された条件分岐コードの条件について「必ず真／偽になるか否か」と「真および偽のいずれになるか」とを判断し、その判断に基づいて条件が必ず真／偽になる条件分岐コードを無条件分岐コードに変更する。
【０１１１】
不要コード削除手段１５は、ループアンローリング手段１４による条件分岐コードから無条件分岐コードへの変更に起因して不要となったコードを削除する。
【０１１２】
ｃ．第３の実施の形態の考え方と第４の実施の形態の考え方とを併有させて、第７の実施の形態を実現することができる。この実施の形態に係るコンパイラ装置は、以下に示すような各手段を備えた構成となる。
【０１１３】
ループ検出手段１１は、初期値が１で増分値が定数のインデックスを含むループの検出を行う。
【０１１４】
分岐検出手段１２は、ループ検出手段１１で検出されたループ内に存在する条件分岐コードを検出し、「条件が剰余の結果と定数との比較であり、当該剰余を算出するための除算の被除数が当該ループのインデックスであり、当該除算の除数が正整数の定数である」という要件を満たす条件分岐コードを検出し、当該条件分岐コードに関する情報を記録する。
【０１１５】
アンロール段数決定手段１３は、分岐検出手段１２で検出された条件分岐コードを含むループのアンロール段数を分岐検出手段１２で記録された情報に基づいて「変形後の増分値が変形前の増分値と上記の除数との最小公倍数になる」という要件を満たす値と当該ループの繰り返し数との最大公約数よりも小さな値であり当該ループの繰り返し数の約数である値に決定する。
【０１１６】
ループアンローリング手段１４は、アンロール段数決定手段１３で決定されたアンロール段数で当該ループのアンローリングを行い、当該アンローリングにおける各コードを展開する過程において当該各コードが何段目に展開されたコードであるかを示す情報と分岐検出手段１２で記録された情報とから分岐検出手段１２で検出された条件分岐コードの条件について「必ず真／偽になるか否か」と「真および偽のいずれになるか」とを判断し、その判断に基づいて条件が必ず真／偽になる条件分岐コードを無条件分岐コードに変更する。
【０１１７】
不要コード削除手段１５は、ループアンローリング手段１４による条件分岐コードから無条件分岐コードへの変更に起因して不要となったコードを削除する。
【０１１８】
ｄ．第２の実施の形態の考え方と第３の実施の形態の考え方と第４の実施の形態の考え方とを併有させて、第８の実施の形態を実現することができる。この実施の形態に係るコンパイラ装置は、以下に示すような各手段を備えた構成となる。
【０１１９】
ループ検出手段１１は、初期値が変数で増分値が定数のインデックスを含むループの検出を行う。
【０１２０】
分岐検出手段１２は、ループ検出手段１１で検出されたループ内に存在する条件分岐コードを検出し、「条件が剰余の結果と定数との比較であり、当該剰余を算出するための除算の被除数が当該ループのインデックスであり、当該除算の除数が正整数の定数である」という要件を満たす条件分岐コードを検出し、当該条件分岐コードに関する情報を記録する。
【０１２１】
アンロール段数決定手段１３は、分岐検出手段１２で検出された条件分岐コードを含むループのアンロール段数を分岐検出手段１２で記録された情報に基づいて「変形後の増分値が変形前の増分値と上記の除数との最小公倍数になる」という要件を満たす値よりも小さな値であり当該ループの繰り返し数の約数である値に決定する。
【０１２２】
ループアンローリング手段１４は、アンロール対象外コード群をアンロール対象のコード群の前段に生成した上で、アンロール段数決定手段１３で決定されたアンロール段数で当該ループのアンローリングを行い、当該アンローリングにおける各コードを展開する過程において当該各コードが何段目に展開されたコードであるかを示す情報と分岐検出手段１２で記録された情報とから分岐検出手段１２で検出された条件分岐コードの条件について「必ず真／偽になるか否か」と「真および偽のいずれになるか」とを判断し、その判断に基づいて条件が必ず真／偽になる条件分岐コードを無条件分岐コードに変更する。
【０１２３】
不要コード削除手段１５は、ループアンローリング手段１４による条件分岐コードから無条件分岐コードへの変更に起因して不要となったコードを削除する。
【０１２４】
（６）  第９の実施の形態
図１３は、本発明の第９の実施の形態に係るコンパイラ装置の構成を示すブロック図である。
【０１２５】
図１３を参照すると、本発明の第９の実施の形態に係るコンパイラ装置は、図１に示した第１〜第８の各実施の形態に係るコンパイラ装置に対して、コンパイラを格納した記録媒体１００を備える点が異なっている。この記録媒体１００は、磁気ディスク，半導体メモリ，その他の記録媒体であってよい。
【０１２６】
コンパイラは、記録媒体１００からループ最適化部１０（中間テキスト２１を最適化して中間テキスト２２を生成し、ループ検出手段１１，分岐検出手段１２，アンロール段数決定手段１３，ループアンローリング手段１４，および不要コード削除手段１５を備えるループ最適化部１０）を実現するコンピュータに読み込まれ、当該ループ最適化部１０の動作をループ検出手段１１，分岐検出手段１２，アンロール段数決定手段１３，ループアンローリング手段１４，および不要コード削除手段１５として制御する。コンパイラの制御によるループ検出手段１１，分岐検出手段１２，アンロール段数決定手段１３，ループアンローリング手段１４，および不要コード削除手段１５の動作は、第１〜第８の各実施の形態におけるループ検出手段１１，分岐検出手段１２，アンロール段数決定手段１３，ループアンローリング手段１４，および不要コード削除手段１５の動作と全く同様になるので、その詳しい説明を割愛する。
【０１２７】
【発明の効果】
以上説明したように、本発明によると、実行時間が短いオブジェクトプログラムの生成が可能となるコンパイラ装置を実現することができる（実行時間を短縮するための最適化を確実に実現することができる）という効果が生じる。
【０１２８】
このような効果が生じる理由は、従来技術におけるような「ループの中で特定の条件のみで実行される式を実行するか否かの判定を行うための分岐命令を生成する必要」がなくなり、従来できなかった他の最適化を行うことが可能になるためである。また、ループ内に存在する条件分岐（条件分岐コード）を当該ループのアンローリングを行うことによって無条件分岐（無条件分岐コード）に変更し、当該変更に基づいて不要なコード（条件分岐コードおよびそれに付随する演算命令のためのコード等）を適切に削除することができ、従来であればループ内で常に実行されていた命令が実行されなくなるためである。
【図面の簡単な説明】
【図１】本発明の第１〜第８の各実施の形態に係るコンパイラ装置の構成を示すブロック図である。
【図２】本発明の第１の実施の形態に係るコンパイラ装置の処理を示す流れ図である。
【図３】本発明の第１の実施の形態に係るコンパイラ装置の具体的な動作を説明するための図（最適化の対象となる中間テキストにおけるＦｏｒｔｒａｎプログラム片を示す図）である。
【図４】本発明の第１の実施の形態に係るコンパイラ装置の具体的な動作を説明するための図（アンローリングを適用した後の当該Ｆｏｒｔｒａｎプログラム片を示す図）である。
【図５】本発明の第１の実施の形態に係るコンパイラ装置の具体的な動作を説明するための図（条件分岐コードから無条件分岐コードへの変更を適用した後の当該Ｆｏｒｔｒａｎプログラム片を示す図）である。
【図６】本発明の第１の実施の形態に係るコンパイラ装置の具体的な動作を説明するための図（最適化の適用後の当該Ｆｏｒｔｒａｎプログラム片を示す図）である。
【図７】本発明の第２の実施の形態に係るコンパイラ装置の具体的な動作を説明するための図（最適化の対象となる中間テキストにおけるＦｏｒｔｒａｎプログラム片を示す図）である。
【図８】本発明の第２の実施の形態に係るコンパイラ装置の具体的な動作を説明するための図（最適化の適用後の当該Ｆｏｒｔｒａｎプログラム片を示す図）である。
【図９】本発明の第３の実施の形態に係るコンパイラ装置の具体的な動作を説明するための図（最適化の対象となる中間テキストにおけるＦｏｒｔｒａｎプログラム片を示す図）である。
【図１０】本発明の第３の実施の形態に係るコンパイラ装置の具体的な動作を説明するための図（最適化の適用後の当該Ｆｏｒｔｒａｎプログラム片を示す図）である。
【図１１】本発明の第４の実施の形態に係るコンパイラ装置の具体的な動作を説明するための図（最適化の対象となる中間テキストにおけるＦｏｒｔｒａｎプログラム片を示す図）である。
【図１２】本発明の第４の実施の形態に係るコンパイラ装置の具体的な動作を説明するための図（最適化の適用後の当該Ｆｏｒｔｒａｎプログラム片を示す図）である。
【図１３】本発明の第９の実施の形態に係るコンパイラ装置の構成を示すブロック図である。
【符号の説明】
１０  ループ最適化部
１１  ループ検出手段
１２  分岐検出手段
１３  アンロール段数決定手段
１４  ループアンローリング手段
１５  不要コード削除手段
２１，２２  中間テキスト
１００  記録媒体
【図１】
0003613454.tif 000002
【図２】
0003613454.tif 000003
【図３】
0003613454.tif 000004
【図４】
0003613454.tif 000005
【図５】
0003613454.tif 000006
【図６】
0003613454.tif 000007
【図７】
0003613454.tif 000008
【図８】
0003613454.tif 000009
【図９】
0003613454.tif 000010
【図１０】
0003613454.tif 000011
【図１１】
0003613454.tif 000012
【図１２】
0003613454.tif 000013
【図１３】
0003613454.tif 000014