JP3280332B2 - ループに対するバージョニングを実行する方法及び装置、配列レンジ・チェックに関する情報をベーシック・ブロック内において収集する方法及び装置、配列レンジ・チェックに関する情報を変更する方法、配列レンジ・チェック最適化方法、配列レンジ・チェックのためのコードを生成する方法、不要配列レンジ・チェック除去方法及び装置、配列レンジ・チェックを選択する方法、配列レンジ・チェック変更方法、配列レンジ・チェック収集方法、及び配列レンジ・チェック取扱判断方法 - Google Patents
ループに対するバージョニングを実行する方法及び装置、配列レンジ・チェックに関する情報をベーシック・ブロック内において収集する方法及び装置、配列レンジ・チェックに関する情報を変更する方法、配列レンジ・チェック最適化方法、配列レンジ・チェックのためのコードを生成する方法、不要配列レンジ・チェック除去方法及び装置、配列レンジ・チェックを選択する方法、配列レンジ・チェック変更方法、配列レンジ・チェック収集方法、及び配列レンジ・チェック取扱判断方法Info
- Publication number
- JP3280332B2 JP3280332B2 JP37046098A JP37046098A JP3280332B2 JP 3280332 B2 JP3280332 B2 JP 3280332B2 JP 37046098 A JP37046098 A JP 37046098A JP 37046098 A JP37046098 A JP 37046098A JP 3280332 B2 JP3280332 B2 JP 3280332B2
- Authority
- JP
- Japan
- Prior art keywords
- array
- check
- array range
- range
- range check
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Expired - Fee Related
Links
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/43—Checking; Contextual analysis
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/44—Encoding
- G06F8/443—Optimisation
Landscapes
- Engineering & Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Software Systems (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Devices For Executing Special Programs (AREA)
Description
【0001】
【発明の属する技術分野】本発明は、コンパイラに関
し、より詳しくは、コンパイラにおいて配列レンジ・チ
ェックを除去又は最適化する方法に関する。配列レンジ
・チェックとは、プログラムにおける配列アクセスがそ
の配列の範囲を越えているか否かに関する検査である。
し、より詳しくは、コンパイラにおいて配列レンジ・チ
ェックを除去又は最適化する方法に関する。配列レンジ
・チェックとは、プログラムにおける配列アクセスがそ
の配列の範囲を越えているか否かに関する検査である。
【0002】
【従来の技術】従来技術における配列レンジ・チェック
の除去方法には、次のようなものがある。 (1)ループ前でレンジが超える可能性をチェックする
方法(Priyadarshan Kolte and Michael Wolfe: Elimin
ation of Redundant Array Subscript Range Checks. I
n proceedings of the ACM SIGPLAN '95 Conference on
Programming Language Design and Implementation, P
ages270-278, Jun 1995.等を参照のこと) 配列の下限を0、配列の大きさをNとする表1を表2の
ように変形する。
の除去方法には、次のようなものがある。 (1)ループ前でレンジが超える可能性をチェックする
方法(Priyadarshan Kolte and Michael Wolfe: Elimin
ation of Redundant Array Subscript Range Checks. I
n proceedings of the ACM SIGPLAN '95 Conference on
Programming Language Design and Implementation, P
ages270-278, Jun 1995.等を参照のこと) 配列の下限を0、配列の大きさをNとする表1を表2の
ように変形する。
【表1】for (i = start; i <= end; i++) a[i] = 0;
【表2】 if ((start <= end) && (start < 0 || end > N-1)){ exception; /* ループ内で配列のレンジを越える */ } for (i = start; i <= end; i++) a[i] = 0; /* チェック不要 */
【0003】表1の擬似コードでは、配列aの各要素に
0を代入している。表2の擬似コードでは、if文の条
件を満たす場合には配列のレンジを越えるような配列ア
クセスであるため例外(exception)を発生させ、満た
さない場合には表1と同じ処理を実施するようになって
いる。
0を代入している。表2の擬似コードでは、if文の条
件を満たす場合には配列のレンジを越えるような配列ア
クセスであるため例外(exception)を発生させ、満た
さない場合には表1と同じ処理を実施するようになって
いる。
【0004】この方法の長所は、ループ内の配列アクセ
スの上限、下限が確実に分かる場合、ループ内の全ての
配列レンジ・チェックを除去できる点である。しかし、
以下のような欠点も有する。すなわち、この方法はレン
ジを超えるのは誤りであるという仕様の言語にしか適用
できない。また、ループ内の配列インデックスが単調変
化する時にしか適用できない。さらに、ループの終了条
件をループの外に出せない場合、例えば上の例において
endがグローバル変数等で、ループ内で自分自身あるい
は他のスレッドがendを変えるような時には適用できな
い。
スの上限、下限が確実に分かる場合、ループ内の全ての
配列レンジ・チェックを除去できる点である。しかし、
以下のような欠点も有する。すなわち、この方法はレン
ジを超えるのは誤りであるという仕様の言語にしか適用
できない。また、ループ内の配列インデックスが単調変
化する時にしか適用できない。さらに、ループの終了条
件をループの外に出せない場合、例えば上の例において
endがグローバル変数等で、ループ内で自分自身あるい
は他のスレッドがendを変えるような時には適用できな
い。
【0005】(2)ループを3つに分ける方法(Samuel
P. Midkiff, Jose E. Moreira, MarcSnir: Optimizing
Array Reference Checking in Java Programs. IBM Re
search Report RC21184(94652) 05/18/98 Computer Sci
ence/Mathematics 等を参照のこと) ループを下限値のチェック部分、チェック不要部分、上
限値のチェック部分の3つに分ける方法である。例え
ば、配列の下限を0、 配列の大きさをNとすると、表
1は表3のように変形される。
P. Midkiff, Jose E. Moreira, MarcSnir: Optimizing
Array Reference Checking in Java Programs. IBM Re
search Report RC21184(94652) 05/18/98 Computer Sci
ence/Mathematics 等を参照のこと) ループを下限値のチェック部分、チェック不要部分、上
限値のチェック部分の3つに分ける方法である。例え
ば、配列の下限を0、 配列の大きさをNとすると、表
1は表3のように変形される。
【表3】 for (i = start; i <= min( max(start, 0)-1, end ); i++) a[i] = 0; for (i = max( start, 0 ); i <= min( end, N-1 ); i++) a[i] = 0; /* チェック不要 */ for (i = max( start, min( end, N-1 ) + 1 ); i <= end; i++) a[i] = 0;
【0006】このように3つに分けると2つ目のforル
ープはレンジ・チェックを省くことができる。この方法
における基本的な考え方は(1)と類似している。この
方法の長所は、ループ内の配列アクセスの上限、下限が
確実に分かる場合、ループ内の全ての配列レンジ・チェ
ックを除去できる点である。しかし、この方法はループ
内の配列インデックスが単調変化する時にしか適用でき
ない。また、ループの終了条件をループの外に出せない
場合、例えば上の例においてendがグローバル変数等
で、ループ内で自分自身あるいは他のスレッドがendを
変えるような時には適用できない。さらに、コードサイ
ズが3倍になるので大きいループに適用する際は特別な
取扱いが必要となる。
ープはレンジ・チェックを省くことができる。この方法
における基本的な考え方は(1)と類似している。この
方法の長所は、ループ内の配列アクセスの上限、下限が
確実に分かる場合、ループ内の全ての配列レンジ・チェ
ックを除去できる点である。しかし、この方法はループ
内の配列インデックスが単調変化する時にしか適用でき
ない。また、ループの終了条件をループの外に出せない
場合、例えば上の例においてendがグローバル変数等
で、ループ内で自分自身あるいは他のスレッドがendを
変えるような時には適用できない。さらに、コードサイ
ズが3倍になるので大きいループに適用する際は特別な
取扱いが必要となる。
【0007】(3)同じ値の配列ベース、インデックス
はチェック済みにする方法(参考文献は(1)と同じ) この方法は、チェック済みのa[i]という配列アクセスが
あった場合、そこから支配されていて a 及び i の値が
変わらない範囲でのa[i]をチェック済みにするものであ
る。例を表4に示す。
はチェック済みにする方法(参考文献は(1)と同じ) この方法は、チェック済みのa[i]という配列アクセスが
あった場合、そこから支配されていて a 及び i の値が
変わらない範囲でのa[i]をチェック済みにするものであ
る。例を表4に示す。
【表4】
【0008】この方法の長所は、ループ以外の場所につ
いても適用できる点にある。しかし、チェック済と判断
できる範囲が狭いという欠点がある。
いても適用できる点にある。しかし、チェック済と判断
できる範囲が狭いという欠点がある。
【0009】(4)変数の持つ値のレンジを使って配列
チェック除去を行う方法(CRAIG CHAMBERS, DAVID UNGA
R: Iterative Type Analysis and Extended Message Sp
litting: Optimizing Dynamically-Typed Object-Orien
ted Programs 等を参照のこと) if 文などの情報から変数の持つ値の範囲を狭め、その
情報を利用して配列レンジ・チェック除去をする方法で
ある。例えば、配列の下限を0とした時、コメント部分
にチェック不要と書かれた部分が本方法によりチェック
不要と判断される配列アクセスである。
チェック除去を行う方法(CRAIG CHAMBERS, DAVID UNGA
R: Iterative Type Analysis and Extended Message Sp
litting: Optimizing Dynamically-Typed Object-Orien
ted Programs 等を参照のこと) if 文などの情報から変数の持つ値の範囲を狭め、その
情報を利用して配列レンジ・チェック除去をする方法で
ある。例えば、配列の下限を0とした時、コメント部分
にチェック不要と書かれた部分が本方法によりチェック
不要と判断される配列アクセスである。
【表5】 if (3 <= i && i <= 5){ /* iの持つ値の範囲は 3 〜 5 だと分かる。 */ a[i] = j; /* チェック必要 */ a[i-1] = 0; /* チェック不要 0 < i-1 < iより */ a[(i-3)*2] = 0; /* チェック不要 0 <= (i-3)*2 < i より */ }
【0010】この方法の長所はループ以外の場所につい
ても適用できる点にある。(1)のように配列インデッ
クスの式が複雑であってもチェック済みと扱える可能性
がある。しかし、実際には変数の値の範囲を狭められな
いケースが多い。
ても適用できる点にある。(1)のように配列インデッ
クスの式が複雑であってもチェック済みと扱える可能性
がある。しかし、実際には変数の値の範囲を狭められな
いケースが多い。
【0011】(5)データ・フロー解析(Data-flow an
alysis)を用いて配列チェック除去を行う方法(R. Gup
ta. Optimizing array bound checks using flow analy
sis. ACM Letters on Programming Languages and Syst
ems, 2(1-4): 135-150, March-December 1993.等を参照
のこと) この方法は、次のような2段階の処理で配列レンジ・チ
ェックを除去する。すなわち、(1)配列レンジ・チェ
ックを減らすために実行順の最初の方にチェックを挿入
する。(2)不要な配列レンジ・チェックを除去する。
alysis)を用いて配列チェック除去を行う方法(R. Gup
ta. Optimizing array bound checks using flow analy
sis. ACM Letters on Programming Languages and Syst
ems, 2(1-4): 135-150, March-December 1993.等を参照
のこと) この方法は、次のような2段階の処理で配列レンジ・チ
ェックを除去する。すなわち、(1)配列レンジ・チェ
ックを減らすために実行順の最初の方にチェックを挿入
する。(2)不要な配列レンジ・チェックを除去する。
【0012】この方法の長所はループ以外の場所につい
ても適用できる点にある。しかし、配列レンジ・チェッ
クを除去できる範囲が狭く、レンジを超えるのは誤りで
あるという仕様の言語にしか適用できないという欠点が
ある。
ても適用できる点にある。しかし、配列レンジ・チェッ
クを除去できる範囲が狭く、レンジを超えるのは誤りで
あるという仕様の言語にしか適用できないという欠点が
ある。
【0013】
【発明が解決しようとする課題】本発明の目的は、デー
タ・フロー解析等を使用して配列レンジ・チェック情報
を収集し、チェックの前倒し等を行うことにより、不要
な配列レンジ・チェックを除去することである。なお、
ここで言う不要な配列レンジ・チェックとは、先行する
配列アクセスにより、その配列アクセスではそのレンジ
を越えないことが保証できる配列アクセスに対する配列
レンジ・チェックのことである。
タ・フロー解析等を使用して配列レンジ・チェック情報
を収集し、チェックの前倒し等を行うことにより、不要
な配列レンジ・チェックを除去することである。なお、
ここで言う不要な配列レンジ・チェックとは、先行する
配列アクセスにより、その配列アクセスではそのレンジ
を越えないことが保証できる配列アクセスに対する配列
レンジ・チェックのことである。
【0014】また、Java(Sun Microsystems社の商
標)言語は仕様として配列アクセス時のレンジ・チェッ
クの結果により例外(Exception)が起きる。そして、
この例外の発生を利用してプログラムを書くことができ
るため、配列レンジ・チェックを行わないとプログラム
が正しく動作しなくなってしまう。本発明は、例外の発
生を利用してプログラムを書くことができる言語にも対
応させ、より多くの配列レンジ・チェックを除去できる
ようにすることも目的である。
標)言語は仕様として配列アクセス時のレンジ・チェッ
クの結果により例外(Exception)が起きる。そして、
この例外の発生を利用してプログラムを書くことができ
るため、配列レンジ・チェックを行わないとプログラム
が正しく動作しなくなってしまう。本発明は、例外の発
生を利用してプログラムを書くことができる言語にも対
応させ、より多くの配列レンジ・チェックを除去できる
ようにすることも目的である。
【0015】さらに、データ・フロー解析等を行って配
列レンジ・チェック情報を収集し、配列レンジ・チェッ
クの最適化を行うことも目的である。
列レンジ・チェック情報を収集し、配列レンジ・チェッ
クの最適化を行うことも目的である。
【0016】また、所定の条件にて配列レンジ・チェッ
ク情報を収集し、ループのバージョニングを行うことも
目的である。
ク情報を収集し、ループのバージョニングを行うことも
目的である。
【0017】
【課題を解決するための手段】以上の目的を達成するた
めに、本発明は以下の3つ大きな部分に分類できる。す
なわち、A.ループに対するバージョニングにより不要
な配列レンジ・チェックを除去する部分と、B.データ
・フロー解析を実行順序とは逆順に行って配列レンジ・
チェックを最適化する部分、及びC.データ・フロー解
析を実行順に行って配列レンジ・チェック済の情報を取
得し、この情報から不要な配列レンジ・チェックを除去
する部分である。
めに、本発明は以下の3つ大きな部分に分類できる。す
なわち、A.ループに対するバージョニングにより不要
な配列レンジ・チェックを除去する部分と、B.データ
・フロー解析を実行順序とは逆順に行って配列レンジ・
チェックを最適化する部分、及びC.データ・フロー解
析を実行順に行って配列レンジ・チェック済の情報を取
得し、この情報から不要な配列レンジ・チェックを除去
する部分である。
【0018】A.では以下のような処理を実施する(実
施例では図2)。すなわち、プログラム内の配列アクセ
スに対する配列レンジ・チェックの情報を用いて、ルー
プに対しバージョニングを実行する場合には、各ベーシ
ック・ブロック内において、実行とは逆順に、第1の条
件(実施例では表8)に従って配列レンジ・チェックの
集合である第1要処理配列レンジ・チェック情報(実施
例ではC_GEN[B])を収集し且つ記憶装置に記憶
する収集ステップと、深さ優先探索(DFS:Depth−F
irst Search)のポストオーダー・トラバーサル(Posto
rder Traversal)の順番で、第1要処理配列レンジ・チ
ェック情報を第2の条件に従って伝搬させ(実施例で
は、Backward(C_OUT[B], B)(表9)及びそれを用いた
処理(図3))、各ベーシック・ブロックの先頭におけ
る第2要処理配列レンジ・チェック情報(実施例ではC
_IN[B])を生成し且つ記憶装置に記憶する第2要
処理配列レンジ・チェック情報生成ステップと、第2要
処理配列レンジ・チェック情報を用いて、ループの前に
バージョニングのためのチェック・コード、及び各実行
状態における実行コードを生成し、記憶装置に記憶する
ステップとを実施する。これにより、チェック・コード
による分類で配列レンジ・チェックなしのループ、及び
配列レンジ・チェックありのループの2つの実行状態に
分けられるので、配列レンジ・チェックなしのループに
実行が遷移すれば、処理が高速化される。
施例では図2)。すなわち、プログラム内の配列アクセ
スに対する配列レンジ・チェックの情報を用いて、ルー
プに対しバージョニングを実行する場合には、各ベーシ
ック・ブロック内において、実行とは逆順に、第1の条
件(実施例では表8)に従って配列レンジ・チェックの
集合である第1要処理配列レンジ・チェック情報(実施
例ではC_GEN[B])を収集し且つ記憶装置に記憶
する収集ステップと、深さ優先探索(DFS:Depth−F
irst Search)のポストオーダー・トラバーサル(Posto
rder Traversal)の順番で、第1要処理配列レンジ・チ
ェック情報を第2の条件に従って伝搬させ(実施例で
は、Backward(C_OUT[B], B)(表9)及びそれを用いた
処理(図3))、各ベーシック・ブロックの先頭におけ
る第2要処理配列レンジ・チェック情報(実施例ではC
_IN[B])を生成し且つ記憶装置に記憶する第2要
処理配列レンジ・チェック情報生成ステップと、第2要
処理配列レンジ・チェック情報を用いて、ループの前に
バージョニングのためのチェック・コード、及び各実行
状態における実行コードを生成し、記憶装置に記憶する
ステップとを実施する。これにより、チェック・コード
による分類で配列レンジ・チェックなしのループ、及び
配列レンジ・チェックありのループの2つの実行状態に
分けられるので、配列レンジ・チェックなしのループに
実行が遷移すれば、処理が高速化される。
【0019】上で述べた第1の条件には、ベーシック・
ブロック内において、(1)配列アクセスのインデック
ス変数が変更されない場合には当該配列アクセスに対す
る配列レンジ・チェックの情報をそのまま収集し、
(2)配列レンジ・チェックにおけるインデックス変数
が正又は負の定数の加算により変更されている場合には
当該インデックス変数にその定数を加算することにより
生ずる変更を反映させた後の配列レンジ・チェックの情
報を収集するという条件を含むようにすることが考えら
れる。後者の条件により、取扱い可能な配列レンジ・チ
ェックの範囲が拡張されている。
ブロック内において、(1)配列アクセスのインデック
ス変数が変更されない場合には当該配列アクセスに対す
る配列レンジ・チェックの情報をそのまま収集し、
(2)配列レンジ・チェックにおけるインデックス変数
が正又は負の定数の加算により変更されている場合には
当該インデックス変数にその定数を加算することにより
生ずる変更を反映させた後の配列レンジ・チェックの情
報を収集するという条件を含むようにすることが考えら
れる。後者の条件により、取扱い可能な配列レンジ・チ
ェックの範囲が拡張されている。
【0020】上で述べた第2の条件には、あるベーシッ
ク・ブロックの第1要処理配列レンジ・チェック情報
と、当該あるベーシック・ブロックの後端における第3
要処理配列レンジ・チェック情報(実施例ではC_OU
T[B])を第3の条件(実施例ではbackward(C_OUT
[B], B))に従って変更した第4要処理配列レンジ・チ
ェック情報との和集合を計算するという条件を含むよう
にすることも考えられる。
ク・ブロックの第1要処理配列レンジ・チェック情報
と、当該あるベーシック・ブロックの後端における第3
要処理配列レンジ・チェック情報(実施例ではC_OU
T[B])を第3の条件(実施例ではbackward(C_OUT
[B], B))に従って変更した第4要処理配列レンジ・チ
ェック情報との和集合を計算するという条件を含むよう
にすることも考えられる。
【0021】上で述べた第3の条件には、あるベーシッ
ク・ブロックにおいて、第3要処理配列レンジ・チェッ
ク情報に含まれる配列レンジ・チェックにおけるインデ
ックス変数が正又は負の定数の加算により変更される場
合、当該インデックス変数に定数を加算することにより
生ずる変更を第3要処理配列レンジ・チェック情報に含
まれる配列レンジ・チェックに反映させる、という条件
を含むようにするとも考えられる。
ク・ブロックにおいて、第3要処理配列レンジ・チェッ
ク情報に含まれる配列レンジ・チェックにおけるインデ
ックス変数が正又は負の定数の加算により変更される場
合、当該インデックス変数に定数を加算することにより
生ずる変更を第3要処理配列レンジ・チェック情報に含
まれる配列レンジ・チェックに反映させる、という条件
を含むようにするとも考えられる。
【0022】上で述べた第3要処理配列レンジ・チェッ
ク情報が、あるベーシック・ブロックの直後のベーシッ
ク・ブロックであって当該あるベーシック・ブロックと
同じループに含まれる全てのベーシック・ブロックの第
2要処理配列レンジ・チェック情報を用いて生成される
ように構成することも可能である。
ク情報が、あるベーシック・ブロックの直後のベーシッ
ク・ブロックであって当該あるベーシック・ブロックと
同じループに含まれる全てのベーシック・ブロックの第
2要処理配列レンジ・チェック情報を用いて生成される
ように構成することも可能である。
【0023】上で述べた収集ステップは、さらに詳しく
説明すると、ベーシック・ブロック内の命令を、実行と
は逆順で、検査するステップと、当該検査においてこの
命令が配列アクセスを含む場合、当該配列アクセスに対
して必要となる配列レンジ・チェックの情報を記憶装置
に記憶するステップと、検査においてその命令が、記憶
された配列レンジ・チェックに関連する配列インデック
ス変数の変更を含む場合には、当該変更が配列インデッ
クス変数の正又は負の定数の加算であるか判断するステ
ップと、変更がその定数の加算である場合には、配列レ
ンジ・チェックにおける配列インデックス変数に定数を
加算することにより生じる、配列レンジ・チェックの変
更を計算するステップと、計算された配列レンジ・チェ
ックの変更を反映した後の配列レンジ・チェックを記憶
装置に記憶するステップとを含む。これは、従来技術
(5)の手法では取り扱われなかった処理である。
説明すると、ベーシック・ブロック内の命令を、実行と
は逆順で、検査するステップと、当該検査においてこの
命令が配列アクセスを含む場合、当該配列アクセスに対
して必要となる配列レンジ・チェックの情報を記憶装置
に記憶するステップと、検査においてその命令が、記憶
された配列レンジ・チェックに関連する配列インデック
ス変数の変更を含む場合には、当該変更が配列インデッ
クス変数の正又は負の定数の加算であるか判断するステ
ップと、変更がその定数の加算である場合には、配列レ
ンジ・チェックにおける配列インデックス変数に定数を
加算することにより生じる、配列レンジ・チェックの変
更を計算するステップと、計算された配列レンジ・チェ
ックの変更を反映した後の配列レンジ・チェックを記憶
装置に記憶するステップとを含む。これは、従来技術
(5)の手法では取り扱われなかった処理である。
【0024】なお、以下で説明するB.の場合には、収
集ステップは、以下のようなステップを含み得る。すな
わち、検査においてその命令が、配列レンジ・チェック
により発生する例外が当該命令より先に起こることによ
って副作用を生じるような命令である場合には、当該検
査までに記憶された配列レンジ・チェックを破棄するス
テップである。B.の場合には、副作用を生じるような
命令がある場合には処理不可能だからである。
集ステップは、以下のようなステップを含み得る。すな
わち、検査においてその命令が、配列レンジ・チェック
により発生する例外が当該命令より先に起こることによ
って副作用を生じるような命令である場合には、当該検
査までに記憶された配列レンジ・チェックを破棄するス
テップである。B.の場合には、副作用を生じるような
命令がある場合には処理不可能だからである。
【0025】次にB.の場合(実施例では図4)を説明
する。すなわち、プログラム内の配列アクセスに対する
配列レンジ・チェックを最適化する場合には、各ベーシ
ック・ブロック内において、実行とは逆順に、第1の条
件(実施例では表12)に従って配列レンジ・チェック
の集合である第1要処理配列レンジ・チェック情報(実
施例ではC_GEN[B])を収集し且つ記憶装置に記
憶する収集ステップと、プログラムにおけるデータ・フ
ロー解析(Data Flow Analysis)により、ベーシック・
ブロック中に例外を発生させる配列レンジ・チェックを
それより前に移動させることによって副作用を生じるよ
うな副作用命令を含むか否かの情報を用い且つ第2の条
件(実施例では、backward(C_OUT[B]、表13、及び図
5)に従って第1要処理配列レンジ・チェック情報を伝
搬させ、各ベーシック・ブロックの後端における第2要
処理配列レンジ・チェック情報(実施例ではC_OUT
[B])を生成し且つ記憶装置に記憶する第2要処理配
列レンジ・チェック情報生成ステップと、各ベーシック
・ブロック内において、第2要処理配列レンジ・チェッ
ク情報を第3の条件(実施例では表14)に従い修正し
ながら実行とは逆順に各命令をたどり、第2要処理配列
レンジ・チェック情報を用いて配列レンジ・チェックの
ためのコードを生成し且つ記憶装置に記憶するコード生
成ステップと、を実行する。この処理自体では配列レン
ジ・チェックは除去されないが、A.又はC.又はA.
且つC.と合わせて用いることにより、より好ましい配
列レンジ・チェックへ変換することができる。従来技術
の手法と組み合わせることも可能である。
する。すなわち、プログラム内の配列アクセスに対する
配列レンジ・チェックを最適化する場合には、各ベーシ
ック・ブロック内において、実行とは逆順に、第1の条
件(実施例では表12)に従って配列レンジ・チェック
の集合である第1要処理配列レンジ・チェック情報(実
施例ではC_GEN[B])を収集し且つ記憶装置に記
憶する収集ステップと、プログラムにおけるデータ・フ
ロー解析(Data Flow Analysis)により、ベーシック・
ブロック中に例外を発生させる配列レンジ・チェックを
それより前に移動させることによって副作用を生じるよ
うな副作用命令を含むか否かの情報を用い且つ第2の条
件(実施例では、backward(C_OUT[B]、表13、及び図
5)に従って第1要処理配列レンジ・チェック情報を伝
搬させ、各ベーシック・ブロックの後端における第2要
処理配列レンジ・チェック情報(実施例ではC_OUT
[B])を生成し且つ記憶装置に記憶する第2要処理配
列レンジ・チェック情報生成ステップと、各ベーシック
・ブロック内において、第2要処理配列レンジ・チェッ
ク情報を第3の条件(実施例では表14)に従い修正し
ながら実行とは逆順に各命令をたどり、第2要処理配列
レンジ・チェック情報を用いて配列レンジ・チェックの
ためのコードを生成し且つ記憶装置に記憶するコード生
成ステップと、を実行する。この処理自体では配列レン
ジ・チェックは除去されないが、A.又はC.又はA.
且つC.と合わせて用いることにより、より好ましい配
列レンジ・チェックへ変換することができる。従来技術
の手法と組み合わせることも可能である。
【0026】上で述べた第1の条件には、ベーシック・
ブロック内において、(1)配列アクセスのインデック
ス変数が変更されない場合には当該配列アクセスに対す
る配列レンジ・チェックの情報をそのまま収集し、
(2)配列レンジ・チェックにおけるインデックス変数
が正又は負の定数の加算により変更されている場合には
当該インデックス変数にその定数を加算することにより
生ずる変更を反映させた後の配列レンジ・チェックの情
報を収集し、(3)ベーシック・ブロックが副作用命令
を含む場合には、当該ベーシック・ブロックにおいて収
集した配列レンジ・チェックの情報を破棄する、という
条件を含むようにすることも考えられる。(2)及び
(3)の条件は、従来では取り扱われなかったものであ
る。
ブロック内において、(1)配列アクセスのインデック
ス変数が変更されない場合には当該配列アクセスに対す
る配列レンジ・チェックの情報をそのまま収集し、
(2)配列レンジ・チェックにおけるインデックス変数
が正又は負の定数の加算により変更されている場合には
当該インデックス変数にその定数を加算することにより
生ずる変更を反映させた後の配列レンジ・チェックの情
報を収集し、(3)ベーシック・ブロックが副作用命令
を含む場合には、当該ベーシック・ブロックにおいて収
集した配列レンジ・チェックの情報を破棄する、という
条件を含むようにすることも考えられる。(2)及び
(3)の条件は、従来では取り扱われなかったものであ
る。
【0027】上で述べた第2の条件には、(1)あるベ
ーシック・ブロックがプログラムの終端である場合又は
あるベーシック・ブロックがプログラムの終端でなく且
つ副作用命令を含む場合には、当該あるベーシック・ブ
ロックの第1要処理配列レンジ・チェック情報そのもの
を、(2)あるベーシック・ブロックがプログラムの終
端でなく且つ副作用命令を含まない場合には、あるベー
シック・ブロックの第2要処理配列レンジ・チェック情
報を第4の条件に従って変更した第3要処理配列レンジ
・チェック情報とあるベーシック・ブロックの第1要処
理配列レンジ・チェック情報の和集合を、あるベーシッ
ク・ブロックの先頭における要処理配列レンジ・チェッ
ク情報として伝搬するという条件を含むようにすること
も考えられる。
ーシック・ブロックがプログラムの終端である場合又は
あるベーシック・ブロックがプログラムの終端でなく且
つ副作用命令を含む場合には、当該あるベーシック・ブ
ロックの第1要処理配列レンジ・チェック情報そのもの
を、(2)あるベーシック・ブロックがプログラムの終
端でなく且つ副作用命令を含まない場合には、あるベー
シック・ブロックの第2要処理配列レンジ・チェック情
報を第4の条件に従って変更した第3要処理配列レンジ
・チェック情報とあるベーシック・ブロックの第1要処
理配列レンジ・チェック情報の和集合を、あるベーシッ
ク・ブロックの先頭における要処理配列レンジ・チェッ
ク情報として伝搬するという条件を含むようにすること
も考えられる。
【0028】上で述べた第3の条件には、(1)配列レ
ンジ・チェックにおけるインデックス変数が正又は負の
定数の加算により変更されている場合には当該インデッ
クス変数にその定数を加算することにより生ずる変更を
反映させた後の配列レンジ・チェックの情報に修正し、
(2)ベーシック・ブロックが副作用命令を含む場合に
は、当該ベーシック・ブロックにおいて収集した配列レ
ンジ・チェックの情報を破棄するという条件を含むよう
にすることも考えられる。
ンジ・チェックにおけるインデックス変数が正又は負の
定数の加算により変更されている場合には当該インデッ
クス変数にその定数を加算することにより生ずる変更を
反映させた後の配列レンジ・チェックの情報に修正し、
(2)ベーシック・ブロックが副作用命令を含む場合に
は、当該ベーシック・ブロックにおいて収集した配列レ
ンジ・チェックの情報を破棄するという条件を含むよう
にすることも考えられる。
【0029】また、上で述べたコード生成ステップが、
配列アクセスに対する配列レンジ・チェックの範囲が、
第2要処理配列レンジ・チェック情報に含まれる配列レ
ンジ・チェックの範囲より狭い場合には、当該配列アク
セスに対して、第2要処理配列レンジ・チェック情報に
含まれる配列レンジ・チェックのためのコードを生成す
るステップを含むようにすることも考えられる。
配列アクセスに対する配列レンジ・チェックの範囲が、
第2要処理配列レンジ・チェック情報に含まれる配列レ
ンジ・チェックの範囲より狭い場合には、当該配列アク
セスに対して、第2要処理配列レンジ・チェック情報に
含まれる配列レンジ・チェックのためのコードを生成す
るステップを含むようにすることも考えられる。
【0030】上で述べた第4の条件には、あるベーシッ
ク・ブロックにおいて、第2要処理配列レンジ・チェッ
ク情報に含まれる配列レンジ・チェックにおけるインデ
ックス変数が正又は負の定数の加算により変更される場
合、当該インデックス変数にその定数を加算することに
より生ずる変更を第2要処理配列レンジ・チェック情報
に含まれる配列レンジ・チェックに反映させる、という
条件を含むようにすることも考えられる。
ク・ブロックにおいて、第2要処理配列レンジ・チェッ
ク情報に含まれる配列レンジ・チェックにおけるインデ
ックス変数が正又は負の定数の加算により変更される場
合、当該インデックス変数にその定数を加算することに
より生ずる変更を第2要処理配列レンジ・チェック情報
に含まれる配列レンジ・チェックに反映させる、という
条件を含むようにすることも考えられる。
【0031】上で述べたコード生成ステップをさらに詳
しく述べると、プログラム内の配列レンジ・チェックを
最適化する場合に、各ベーシック・ブロックの後端まで
に伝搬された、配列アクセスに対して必要となる配列レ
ンジ・チェックの集合である要処理配列レンジ・チェッ
ク情報(実施例ではC_OUT[B])を用いて、挿入
すべき、配列レンジ・チェックのためのコードを生成す
る場合には、ベーシック・ブロック内の命令を、実行と
は逆順に、検査するステップと、当該検査においてその
命令が配列アクセスを含む場合、要処理配列レンジ・チ
ェック情報内の配列レンジ・チェックの範囲より、当該
配列アクセスに必要な配列レンジ・チェックの範囲が狭
いか判断するステップと、狭いと判断された場合には、
要処理配列レンジ・チェック情報内の配列レンジ・チェ
ックに対応するコードを生成するステップと、検査にお
いてその命令が、要処理配列レンジ・チェック情報に含
まれる配列のインデックス変数の変更を含む場合には、
当該変更が配列インデックス変数の正又は負の定数の加
算であるか判断するステップと、変更が定数の加算であ
る場合には、その定数を記憶装置に記憶するステップ
と、変更が定数の加算である場合には、配列レンジ・チ
ェックにおけるインデックス変数にその定数を加算する
ことにより生じる、配列レンジ・チェックの変更を計算
するステップと、計算された配列レンジ・チェックの変
更を反映した後の配列レンジ・チェックを記憶装置に記
憶するステップとを実行する。要処理配列レンジ・チェ
ック情報には、配列レンジ・チェックに対応するコード
を生成すべき範囲が含まれており、これを変形して用い
ながら最適な配列レンジ・チェックのためのコードを生
成する。
しく述べると、プログラム内の配列レンジ・チェックを
最適化する場合に、各ベーシック・ブロックの後端まで
に伝搬された、配列アクセスに対して必要となる配列レ
ンジ・チェックの集合である要処理配列レンジ・チェッ
ク情報(実施例ではC_OUT[B])を用いて、挿入
すべき、配列レンジ・チェックのためのコードを生成す
る場合には、ベーシック・ブロック内の命令を、実行と
は逆順に、検査するステップと、当該検査においてその
命令が配列アクセスを含む場合、要処理配列レンジ・チ
ェック情報内の配列レンジ・チェックの範囲より、当該
配列アクセスに必要な配列レンジ・チェックの範囲が狭
いか判断するステップと、狭いと判断された場合には、
要処理配列レンジ・チェック情報内の配列レンジ・チェ
ックに対応するコードを生成するステップと、検査にお
いてその命令が、要処理配列レンジ・チェック情報に含
まれる配列のインデックス変数の変更を含む場合には、
当該変更が配列インデックス変数の正又は負の定数の加
算であるか判断するステップと、変更が定数の加算であ
る場合には、その定数を記憶装置に記憶するステップ
と、変更が定数の加算である場合には、配列レンジ・チ
ェックにおけるインデックス変数にその定数を加算する
ことにより生じる、配列レンジ・チェックの変更を計算
するステップと、計算された配列レンジ・チェックの変
更を反映した後の配列レンジ・チェックを記憶装置に記
憶するステップとを実行する。要処理配列レンジ・チェ
ック情報には、配列レンジ・チェックに対応するコード
を生成すべき範囲が含まれており、これを変形して用い
ながら最適な配列レンジ・チェックのためのコードを生
成する。
【0032】上の検査において命令が、例外を発生させ
る配列レンジ・チェックをそれより前に移動させること
によって副作用を生じるような命令であるか判断するス
テップと、判断が真である場合、要処理配列レンジ・チ
ェック情報を破棄するステップとを含むようにすること
も考えられる。本発明では取り扱えない場合を示してい
る。
る配列レンジ・チェックをそれより前に移動させること
によって副作用を生じるような命令であるか判断するス
テップと、判断が真である場合、要処理配列レンジ・チ
ェック情報を破棄するステップとを含むようにすること
も考えられる。本発明では取り扱えない場合を示してい
る。
【0033】C.では以下のような処理を実施する(実
施例では図7)。すなわち、プログラム内の配列レンジ
・チェックのうち不要な配列レンジ・チェックを除去す
る場合には、各ベーシック・ブロック内において、実行
の順番で、第1の条件(実施例では表16)に従って配
列レンジ・チェックの集合である第1処理済配列レンジ
・チェック情報(実施例ではC_GEN[B])を収集
する収集ステップと、プログラムにおけるデータ・フロ
ーに従って、第1処理済配列レンジ・チェック情報を第
2の条件(実施例では、表17及び図8)に従って伝搬
させ、各ベーシック・ブロックの先頭における第2処理
済配列レンジ・チェック情報(実施例ではC_IN
[B])を生成する第2処理済配列レンジ・チェック情
報生成ステップと、各ベーシック・ブロック内におい
て、第2処理済配列レンジ・チェック情報を第3の条件
(実施例では表18)に従って修正しつつ実行の順番に
各命令をたどり、第2処理済配列レンジ・チェック情報
を用いて配列レンジ・チェックを除去するステップとを
実行する。データ・フロー解析を用いて不要な配列レン
ジ・チェックを除去していく。
施例では図7)。すなわち、プログラム内の配列レンジ
・チェックのうち不要な配列レンジ・チェックを除去す
る場合には、各ベーシック・ブロック内において、実行
の順番で、第1の条件(実施例では表16)に従って配
列レンジ・チェックの集合である第1処理済配列レンジ
・チェック情報(実施例ではC_GEN[B])を収集
する収集ステップと、プログラムにおけるデータ・フロ
ーに従って、第1処理済配列レンジ・チェック情報を第
2の条件(実施例では、表17及び図8)に従って伝搬
させ、各ベーシック・ブロックの先頭における第2処理
済配列レンジ・チェック情報(実施例ではC_IN
[B])を生成する第2処理済配列レンジ・チェック情
報生成ステップと、各ベーシック・ブロック内におい
て、第2処理済配列レンジ・チェック情報を第3の条件
(実施例では表18)に従って修正しつつ実行の順番に
各命令をたどり、第2処理済配列レンジ・チェック情報
を用いて配列レンジ・チェックを除去するステップとを
実行する。データ・フロー解析を用いて不要な配列レン
ジ・チェックを除去していく。
【0034】上で述べた第1の条件には、ベーシック・
ブロック内において、(1)配列アクセスのインデック
ス変数が変更されない場合には当該配列アクセスに対す
る配列レンジ・チェックの情報をそのまま収集し、
(2)配列レンジ・チェックにおけるインデックス変数
が正又は負の定数の加算により変更されている場合には
当該インデックス変数にその定数を減算することにより
生ずる変更を反映させた後の配列レンジ・チェックの情
報を収集する、という条件を含むようにすることも考え
られる。(2)の場合を含むため、従来より除去できる
配列レンジ・チェックの範囲が広い。
ブロック内において、(1)配列アクセスのインデック
ス変数が変更されない場合には当該配列アクセスに対す
る配列レンジ・チェックの情報をそのまま収集し、
(2)配列レンジ・チェックにおけるインデックス変数
が正又は負の定数の加算により変更されている場合には
当該インデックス変数にその定数を減算することにより
生ずる変更を反映させた後の配列レンジ・チェックの情
報を収集する、という条件を含むようにすることも考え
られる。(2)の場合を含むため、従来より除去できる
配列レンジ・チェックの範囲が広い。
【0035】さらに、上で述べた第1の条件には、配列
レンジ・チェックにおける配列インデックスの最小定数
オフセット及び最大定数オフセット及び配列の下限か
ら、定数インデックスについてチェック済みとして扱う
ことができる上限及び下限で規定される範囲を収集す
る、という条件を含むようにすることも可能である。さ
らに除去範囲が広がる。
レンジ・チェックにおける配列インデックスの最小定数
オフセット及び最大定数オフセット及び配列の下限か
ら、定数インデックスについてチェック済みとして扱う
ことができる上限及び下限で規定される範囲を収集す
る、という条件を含むようにすることも可能である。さ
らに除去範囲が広がる。
【0036】さらに、上で述べた第1の条件には、配列
レンジ・チェックにおけるインデックス変数の下限値又
は上限値及び配列の下限から、定数インデックスについ
てチェック済みとして扱うことができる上限及び下限で
規定される範囲を収集する、という条件を含むようにす
ることも考えられる。
レンジ・チェックにおけるインデックス変数の下限値又
は上限値及び配列の下限から、定数インデックスについ
てチェック済みとして扱うことができる上限及び下限で
規定される範囲を収集する、という条件を含むようにす
ることも考えられる。
【0037】また、上で述べた第2の条件には、(1)
あるベーシック・ブロックがプログラムの先頭である場
合にはあるベーシック・ブロックの第1処理済配列レン
ジ・チェック情報そのものを、(2)あるベーシック・
ブロックがプログラムの先頭でない場合にはあるベーシ
ック・ブロックの第2処理済配列レンジ・チェック情報
を第4の条件に従って変更した第3処理済配列レンジ・
チェック情報とあるベーシック・ブロックの第1処理済
配列レンジ・チェック情報の和集合を、あるベーシック
・ブロックの後端における要処理配列レンジ・チェック
情報として伝搬する、という条件を含むようにすること
も考えられる。
あるベーシック・ブロックがプログラムの先頭である場
合にはあるベーシック・ブロックの第1処理済配列レン
ジ・チェック情報そのものを、(2)あるベーシック・
ブロックがプログラムの先頭でない場合にはあるベーシ
ック・ブロックの第2処理済配列レンジ・チェック情報
を第4の条件に従って変更した第3処理済配列レンジ・
チェック情報とあるベーシック・ブロックの第1処理済
配列レンジ・チェック情報の和集合を、あるベーシック
・ブロックの後端における要処理配列レンジ・チェック
情報として伝搬する、という条件を含むようにすること
も考えられる。
【0038】上で述べた第3の条件には、配列レンジ・
チェックにおけるインデックス変数が正又は負の定数の
加算により変更されている場合には当該インデックス変
数にその定数を減算することにより生ずる変更を反映さ
せた後の配列レンジ・チェックの情報に修正する、とい
う条件を含むようにすることも考えられる。
チェックにおけるインデックス変数が正又は負の定数の
加算により変更されている場合には当該インデックス変
数にその定数を減算することにより生ずる変更を反映さ
せた後の配列レンジ・チェックの情報に修正する、とい
う条件を含むようにすることも考えられる。
【0039】上で述べた第4の条件には、あるベーシッ
ク・ブロックにおいて、第2処理済配列レンジ・チェッ
ク情報に含まれる配列レンジ・チェックにおけるインデ
ックス変数が正又は負の定数の加算により変更される場
合、当該インデックス変数にその定数を減算することに
より生ずる変更を第2処理済配列レンジ・チェック情報
に含まれる配列レンジ・チェックに反映させる、という
条件を含むようにすることも考えられる。
ク・ブロックにおいて、第2処理済配列レンジ・チェッ
ク情報に含まれる配列レンジ・チェックにおけるインデ
ックス変数が正又は負の定数の加算により変更される場
合、当該インデックス変数にその定数を減算することに
より生ずる変更を第2処理済配列レンジ・チェック情報
に含まれる配列レンジ・チェックに反映させる、という
条件を含むようにすることも考えられる。
【0040】上で述べた配列レンジ・チェックを除去す
るステップ(実施例では表18)をさらに詳しく説明す
ると以下のとおりになる。すなわち、プログラム内の配
列レンジ・チェックのうち不要なものを除去する場合
に、各ベーシック・ブロックの先頭に伝搬された、配列
アクセスに対する配列レンジ・チェックの集合である処
理済配列レンジ・チェック情報(実施例ではC_IN
[B])を用いて、除去の対象となる配列レンジ・チェ
ックを選択する場合には、ベーシック・ブロック内の命
令を、実行の順番で、検査するステップと、当該検査に
おいてその命令が配列アクセスを含む場合、当該配列ア
クセスに必要な配列レンジ・チェックの範囲が処理済配
列レンジ・チェック情報に含まれる配列レンジ・チェッ
クの範囲でカバーされるのか判断するステップと、カバ
ーされると判断された場合には、配列アクセスに必要な
配列レンジ・チェックを選択するステップと、上の検査
において命令が、処理済配列レンジ・チェック情報に含
まれる配列レンジ・チェックのインデックス変数の変更
を含む場合には、当該変更がインデックス変数の正又は
負の定数の加算であるか判断するステップと、変更が定
数の加算である場合には、定数を記憶装置に記憶するス
テップと、その変更が定数の加算である場合には、配列
レンジ・チェックにおけるインデックス変数に定数を減
算することにより生じる、配列レンジ・チェックの変更
を計算するステップと、計算された配列レンジ・チェッ
クの変更を反映した後の配列レンジ・チェックを記憶装
置に記憶するステップとを実行する。これにより除去さ
れる配列レンジ・チェックの範囲が広がる。
るステップ(実施例では表18)をさらに詳しく説明す
ると以下のとおりになる。すなわち、プログラム内の配
列レンジ・チェックのうち不要なものを除去する場合
に、各ベーシック・ブロックの先頭に伝搬された、配列
アクセスに対する配列レンジ・チェックの集合である処
理済配列レンジ・チェック情報(実施例ではC_IN
[B])を用いて、除去の対象となる配列レンジ・チェ
ックを選択する場合には、ベーシック・ブロック内の命
令を、実行の順番で、検査するステップと、当該検査に
おいてその命令が配列アクセスを含む場合、当該配列ア
クセスに必要な配列レンジ・チェックの範囲が処理済配
列レンジ・チェック情報に含まれる配列レンジ・チェッ
クの範囲でカバーされるのか判断するステップと、カバ
ーされると判断された場合には、配列アクセスに必要な
配列レンジ・チェックを選択するステップと、上の検査
において命令が、処理済配列レンジ・チェック情報に含
まれる配列レンジ・チェックのインデックス変数の変更
を含む場合には、当該変更がインデックス変数の正又は
負の定数の加算であるか判断するステップと、変更が定
数の加算である場合には、定数を記憶装置に記憶するス
テップと、その変更が定数の加算である場合には、配列
レンジ・チェックにおけるインデックス変数に定数を減
算することにより生じる、配列レンジ・チェックの変更
を計算するステップと、計算された配列レンジ・チェッ
クの変更を反映した後の配列レンジ・チェックを記憶装
置に記憶するステップとを実行する。これにより除去さ
れる配列レンジ・チェックの範囲が広がる。
【0041】上で述べた、カバーされるのか判断するス
テップが、処理済配列レンジ・チェック情報に、同一の
配列ベースを有する配列レンジ・チェックについて、イ
ンデックス変数Ik(k=1,...n)が含まれてい
るか検査するステップと、全てのkについてインデック
ス変数Ikが含まれていると判断された場合、定数Lと
nの関係が所定の条件に合致しているか判断するステッ
プと、定数Lとnの関係が所定の条件に合致している場
合、(I1+I2+...+In)/Lが配列インデック
スである配列アクセスの配列レンジ・チェックを選択す
るステップと、を含むようにすることも考えられる。こ
れにより、さらに除去可能な配列レンジ・チェックの範
囲が広がる。
テップが、処理済配列レンジ・チェック情報に、同一の
配列ベースを有する配列レンジ・チェックについて、イ
ンデックス変数Ik(k=1,...n)が含まれてい
るか検査するステップと、全てのkについてインデック
ス変数Ikが含まれていると判断された場合、定数Lと
nの関係が所定の条件に合致しているか判断するステッ
プと、定数Lとnの関係が所定の条件に合致している場
合、(I1+I2+...+In)/Lが配列インデック
スである配列アクセスの配列レンジ・チェックを選択す
るステップと、を含むようにすることも考えられる。こ
れにより、さらに除去可能な配列レンジ・チェックの範
囲が広がる。
【0042】また、カバーされるのか判断するステップ
が、処理済配列レンジ・チェック情報に、定数インデッ
クスに関する配列レンジ・チェックについて、定数Nの
絶対値に1を減じた定数が含まれているか検査するステ
ップと、定数Nの絶対値に1を減じた定数が含まれてお
り且つ処理済配列レンジ・チェック情報に定数0が実質
的に含まれている場合には、配列インデックスであるA
mod NのAが正であるか判断するステップと、Aが正
である場合、配列インデックスA mod Nを含む配列ア
クセスの配列レンジ・チェックを選択するステップとを
含むようにすることも考えられる。これにより、さらに
除去可能な配列レンジ・チェックの範囲が広がる。
が、処理済配列レンジ・チェック情報に、定数インデッ
クスに関する配列レンジ・チェックについて、定数Nの
絶対値に1を減じた定数が含まれているか検査するステ
ップと、定数Nの絶対値に1を減じた定数が含まれてお
り且つ処理済配列レンジ・チェック情報に定数0が実質
的に含まれている場合には、配列インデックスであるA
mod NのAが正であるか判断するステップと、Aが正
である場合、配列インデックスA mod Nを含む配列ア
クセスの配列レンジ・チェックを選択するステップとを
含むようにすることも考えられる。これにより、さらに
除去可能な配列レンジ・チェックの範囲が広がる。
【0043】なお、A.及びB.の収集ステップ及び第
2要処理配列レンジ・チェック情報生成ステップにおけ
る処理の一部は、プログラム内の配列アクセスが配列の
レンジを越えていないことを検査するための配列レンジ
・チェックをプログラム実行とは逆方向に移動させる処
理と考えることができ、この場合に配列レンジ・チェッ
クを変更するには、配列レンジ・チェックが当該配列の
インデックス変数に正又は負の定数を加算する処理を越
えて移動することになるか判断し、その定数を記憶装置
に記憶するステップと、判断が真である場合には、配列
レンジ・チェックにおけるインデックス変数にその定数
を加算することにより生じる、配列レンジ・チェックの
変更を計算するステップと、計算された配列レンジ・チ
ェックの変更を反映した後の配列レンジ・チェックを記
憶装置に記憶するステップとを実行する。
2要処理配列レンジ・チェック情報生成ステップにおけ
る処理の一部は、プログラム内の配列アクセスが配列の
レンジを越えていないことを検査するための配列レンジ
・チェックをプログラム実行とは逆方向に移動させる処
理と考えることができ、この場合に配列レンジ・チェッ
クを変更するには、配列レンジ・チェックが当該配列の
インデックス変数に正又は負の定数を加算する処理を越
えて移動することになるか判断し、その定数を記憶装置
に記憶するステップと、判断が真である場合には、配列
レンジ・チェックにおけるインデックス変数にその定数
を加算することにより生じる、配列レンジ・チェックの
変更を計算するステップと、計算された配列レンジ・チ
ェックの変更を反映した後の配列レンジ・チェックを記
憶装置に記憶するステップとを実行する。
【0044】また、C.の収集ステップ及び第2要処理
配列レンジ・チェック情報生成ステップにおける処理の
一部は、プログラム内の配列アクセスが配列のレンジを
越えていないことを検査するための配列レンジ・チェッ
クをプログラム実行と同一方向に移動させる処理と考え
ることができ、この場合に配列レンジ・チェックを変更
するには、配列レンジ・チェックが当該配列のインデッ
クス変数に正又は負の定数を加算する処理を越えて移動
することになるか判断し、前記定数を記憶装置に記憶す
るステップと、判断が真である場合には、配列レンジ・
チェックにおけるインデックス変数に前記定数を減算す
ることにより生じる、配列レンジ・チェックの変更を計
算するステップと、計算された配列レンジ・チェックの
変更を反映した後の配列レンジ・チェックを記憶装置に
記憶するステップとを実行する。
配列レンジ・チェック情報生成ステップにおける処理の
一部は、プログラム内の配列アクセスが配列のレンジを
越えていないことを検査するための配列レンジ・チェッ
クをプログラム実行と同一方向に移動させる処理と考え
ることができ、この場合に配列レンジ・チェックを変更
するには、配列レンジ・チェックが当該配列のインデッ
クス変数に正又は負の定数を加算する処理を越えて移動
することになるか判断し、前記定数を記憶装置に記憶す
るステップと、判断が真である場合には、配列レンジ・
チェックにおけるインデックス変数に前記定数を減算す
ることにより生じる、配列レンジ・チェックの変更を計
算するステップと、計算された配列レンジ・チェックの
変更を反映した後の配列レンジ・チェックを記憶装置に
記憶するステップとを実行する。
【0045】C.の収集ステップにおける特徴的な処理
をさらに詳しく述べると、プログラム内の配列アクセス
が配列のレンジを越えていないことを検査するための配
列レンジ・チェックであってチェック済みであるとして
取り扱うことができる配列レンジ・チェックをプログラ
ムのベーシック・ブロック内において収集する処理であ
って、配列レンジ・チェックを検出するステップと、検
出された配列レンジ・チェックを記憶装置に記憶するス
テップと、検出された配列レンジ・チェックにおける配
列インデックスの最小定数オフセット及び最大定数オフ
セット及び配列の下限から、定数インデックスについて
チェック済みとして扱うことができる上限及び下限を計
算し且つ記憶するステップと、計算された上限及び下限
で規定される範囲に関する配列レンジ・チェックを記憶
装置に記憶するステップとを含む。
をさらに詳しく述べると、プログラム内の配列アクセス
が配列のレンジを越えていないことを検査するための配
列レンジ・チェックであってチェック済みであるとして
取り扱うことができる配列レンジ・チェックをプログラ
ムのベーシック・ブロック内において収集する処理であ
って、配列レンジ・チェックを検出するステップと、検
出された配列レンジ・チェックを記憶装置に記憶するス
テップと、検出された配列レンジ・チェックにおける配
列インデックスの最小定数オフセット及び最大定数オフ
セット及び配列の下限から、定数インデックスについて
チェック済みとして扱うことができる上限及び下限を計
算し且つ記憶するステップと、計算された上限及び下限
で規定される範囲に関する配列レンジ・チェックを記憶
装置に記憶するステップとを含む。
【0046】C.の配列レンジ・チェックを除去するス
テップにおける特徴的な処理をさらに詳しく述べると、
プログラム内の配列アクセスが配列のレンジを越えてい
ないことを検査するための配列レンジ・チェックがチェ
ック済みであるとして取り扱うことができるか判断する
処理であって、チェック済みであると決定された配列レ
ンジ・チェックを記憶装置に記憶するステップと、チェ
ック済みであると決定され且つ同一の配列ベースを有す
る配列レンジ・チェックについて、インデックス変数I
k(k=1,...n)が記憶装置に記憶されているか
検査するステップと、定数Lとnの関係が所定の条件に
合致しているか判断するステップと、全てのkについて
前記インデックス変数Ikが記憶されていると判断され
且つ定数Lとnの関係が所定の条件に合致している場
合、(I1+I2+...+In)/Lが配列インデック
スである配列アクセスをチェック済みであるとして記憶
装置に記憶するステップとを含む。
テップにおける特徴的な処理をさらに詳しく述べると、
プログラム内の配列アクセスが配列のレンジを越えてい
ないことを検査するための配列レンジ・チェックがチェ
ック済みであるとして取り扱うことができるか判断する
処理であって、チェック済みであると決定された配列レ
ンジ・チェックを記憶装置に記憶するステップと、チェ
ック済みであると決定され且つ同一の配列ベースを有す
る配列レンジ・チェックについて、インデックス変数I
k(k=1,...n)が記憶装置に記憶されているか
検査するステップと、定数Lとnの関係が所定の条件に
合致しているか判断するステップと、全てのkについて
前記インデックス変数Ikが記憶されていると判断され
且つ定数Lとnの関係が所定の条件に合致している場
合、(I1+I2+...+In)/Lが配列インデック
スである配列アクセスをチェック済みであるとして記憶
装置に記憶するステップとを含む。
【0047】同様な処理において、チェック済みである
と決定された配列レンジ・チェックを記憶装置に記憶す
るステップと、チェック済みであると決定され且つ定数
インデックスに関する配列レンジ・チェックについて、
定数Nの絶対値に1を減じた定数が記憶装置に記憶され
ているか検査するステップと、配列インデックスである
A mod NのAが正であるか判断するステップと、定数
Nの絶対値に1を減じた定数が記憶装置に記憶されてお
り且つ定数0が実質的にチェック済みであり(配列イン
デックスの下限が0である場合及びそうでない場合を含
む)且つAが正である場合、前記配列インデックスA m
od Nをチェック済みであるとして記憶装置に記憶する
ステップとを実行することも可能である。
と決定された配列レンジ・チェックを記憶装置に記憶す
るステップと、チェック済みであると決定され且つ定数
インデックスに関する配列レンジ・チェックについて、
定数Nの絶対値に1を減じた定数が記憶装置に記憶され
ているか検査するステップと、配列インデックスである
A mod NのAが正であるか判断するステップと、定数
Nの絶対値に1を減じた定数が記憶装置に記憶されてお
り且つ定数0が実質的にチェック済みであり(配列イン
デックスの下限が0である場合及びそうでない場合を含
む)且つAが正である場合、前記配列インデックスA m
od Nをチェック済みであるとして記憶装置に記憶する
ステップとを実行することも可能である。
【0048】以上本発明を処理のフローとして表現して
きたが、以上の処理を実行するコンピュータ及びコンピ
ュータ・プログラム又は専用の回路又は装置により実施
することも可能である。なお、コンピュータ・プログラ
ムにより実施する場合には、CD−ROMやフロッピー
・ディスク、ハードディスクのような記憶媒体にコンピ
ュータ・プログラムを格納する場合がある。
きたが、以上の処理を実行するコンピュータ及びコンピ
ュータ・プログラム又は専用の回路又は装置により実施
することも可能である。なお、コンピュータ・プログラ
ムにより実施する場合には、CD−ROMやフロッピー
・ディスク、ハードディスクのような記憶媒体にコンピ
ュータ・プログラムを格納する場合がある。
【0049】
【発明の実施の形態】Javaを用いた環境における、
本発明の装置構成を図1を用いて説明する。サーバ・コ
ンピュータ1及びクライアント・コンピュータ5はネッ
トワーク3を介して接続されている。クライアント・コ
ンピュータ5は、JavaVM(Virtual Machine)5
2及びOS(Operating System)53及びハードウエア
(CPU及びメモリを含む)55を含む。さらに、Ja
vaVM52は、Javaインタープリタ54又はJa
va JITコンパイラ56を含む。インタープリタ5
4及びJITコンパイラ56の両者を有している場合も
ある。なお、クライアント・コンピュータ5は、通常の
コンピュータの他、メモリの大きさが小さかったり、ハ
ードディスク等の補助記憶装置を含まないような、いわ
ゆるネットワーク・コンピュータや情報家電の場合もあ
る。
本発明の装置構成を図1を用いて説明する。サーバ・コ
ンピュータ1及びクライアント・コンピュータ5はネッ
トワーク3を介して接続されている。クライアント・コ
ンピュータ5は、JavaVM(Virtual Machine)5
2及びOS(Operating System)53及びハードウエア
(CPU及びメモリを含む)55を含む。さらに、Ja
vaVM52は、Javaインタープリタ54又はJa
va JITコンパイラ56を含む。インタープリタ5
4及びJITコンパイラ56の両者を有している場合も
ある。なお、クライアント・コンピュータ5は、通常の
コンピュータの他、メモリの大きさが小さかったり、ハ
ードディスク等の補助記憶装置を含まないような、いわ
ゆるネットワーク・コンピュータや情報家電の場合もあ
る。
【0050】サーバ・コンピュータ1では、Javaソ
ースコード10は、Javaコンパイラ12によりコン
パイルされる。このコンパイルの結果が、バイトコード
14である。このバイトコード14は、ネットワーク3
を介してクライアント・コンピュータ5に送信される。
バイトコード14は、クライアント・コンピュータ5内
のWWWブラウザ(World Wide Web Browser)などに設
けられたJava仮想マシン(Java VM)52にとって
ネイティブ・コードであり、実際ハードウエア55のC
PUにて実行する場合には、Javaインタープリタ5
4や、JavaJITコンパイラ56を用いる。インタ
ープリタ54は、実行時にバイトコード14をデコード
し、命令ごとに用意される処理ルーチンを呼び出して実
行する。一方、JITコンパイラ56は、バイトコード
を事前にあるいは実行する直前にコンパイラを用いてマ
シン・コード58に変換してそれをCPUで実行する。
ースコード10は、Javaコンパイラ12によりコン
パイルされる。このコンパイルの結果が、バイトコード
14である。このバイトコード14は、ネットワーク3
を介してクライアント・コンピュータ5に送信される。
バイトコード14は、クライアント・コンピュータ5内
のWWWブラウザ(World Wide Web Browser)などに設
けられたJava仮想マシン(Java VM)52にとって
ネイティブ・コードであり、実際ハードウエア55のC
PUにて実行する場合には、Javaインタープリタ5
4や、JavaJITコンパイラ56を用いる。インタ
ープリタ54は、実行時にバイトコード14をデコード
し、命令ごとに用意される処理ルーチンを呼び出して実
行する。一方、JITコンパイラ56は、バイトコード
を事前にあるいは実行する直前にコンパイラを用いてマ
シン・コード58に変換してそれをCPUで実行する。
【0051】以下、JITコンパイラ56の本発明に関
連する部分について説明する。
連する部分について説明する。
【0052】A.ループに対するバージョニングにより
不要な配列レンジ・チェックを除去する部分 バージョニングとは、コンパイル時に、(1)プログラ
ムのある部分のコードが実行される状態をいくつかに分
類し、(2)実行時にその状態を分類するためのチェッ
ク・コードと、それぞれの状態に対する、当該プログラ
ムのある部分の実行コードを生成する処理である。Ja
vaで記述した例を表6及び表7に示す。表6中にはル
ープ変数iにより繰り返されるループが1つ存在する。
Javaでは、配列のアクセスに対して、配列変数自体
がnullかどうかのテストと、配列インデックスが配列の
範囲(range:レンジ)内に収まっているかどうかのチ
ェックとを、実行時に行うことが要求される。このルー
プに対して、配列変数aがnullでなく且つループ変数i
(ここでは配列インデックス変数でもある)の変化の範
囲が配列aの範囲内に収まるかどうかで、収まる場合と
収まらない場合の2つの場合に分類し、そのチェック・
コードと共に生成されたコードが表7のようになる。こ
のバージョニングにより、配列変数aがnullではなく且
つループ変数iが配列aの範囲内に収まる場合のコード
(then側のコード。但し、表7ではthenとは記されてい
ない。)では、配列アクセスに関するテストは必ず成功
するのでこれらのテストを除去することができる。一
方、配列変数aがnullか又はループ変数iが配列の範囲
外をアクセスする可能性がある場合のコード(else側の
コード)では、a[i]への配列アクセスに対して、aがnu
llであるか又はループ変数iが配列の範囲外をアクセス
する可能性があるので、それぞれに対するチェックを行
うコードを生成する。
不要な配列レンジ・チェックを除去する部分 バージョニングとは、コンパイル時に、(1)プログラ
ムのある部分のコードが実行される状態をいくつかに分
類し、(2)実行時にその状態を分類するためのチェッ
ク・コードと、それぞれの状態に対する、当該プログラ
ムのある部分の実行コードを生成する処理である。Ja
vaで記述した例を表6及び表7に示す。表6中にはル
ープ変数iにより繰り返されるループが1つ存在する。
Javaでは、配列のアクセスに対して、配列変数自体
がnullかどうかのテストと、配列インデックスが配列の
範囲(range:レンジ)内に収まっているかどうかのチ
ェックとを、実行時に行うことが要求される。このルー
プに対して、配列変数aがnullでなく且つループ変数i
(ここでは配列インデックス変数でもある)の変化の範
囲が配列aの範囲内に収まるかどうかで、収まる場合と
収まらない場合の2つの場合に分類し、そのチェック・
コードと共に生成されたコードが表7のようになる。こ
のバージョニングにより、配列変数aがnullではなく且
つループ変数iが配列aの範囲内に収まる場合のコード
(then側のコード。但し、表7ではthenとは記されてい
ない。)では、配列アクセスに関するテストは必ず成功
するのでこれらのテストを除去することができる。一
方、配列変数aがnullか又はループ変数iが配列の範囲
外をアクセスする可能性がある場合のコード(else側の
コード)では、a[i]への配列アクセスに対して、aがnu
llであるか又はループ変数iが配列の範囲外をアクセス
する可能性があるので、それぞれに対するチェックを行
うコードを生成する。
【表6】
【表7】 public void f( int a[], int n ) { int i; if ( a != null && n <= a.length ){ // 配列aがnullでなく且つ // iが配列aの範囲内のみをアクセスする場合 for ( i=0; i<n; i++ ) { a[i] = a[i] * i; // a[i]のnullテストと範囲テストは不要 } }else{ // iが配列aの範囲外をアクセスする場合が存在する場合 for ( i=0; i<n; i++ ) { // check( a != null ); // check( i >= 0 ); // check( i < a.length ); a[i] = a[i] * i; // a[i]のnullテストと範囲テストが必要 } } }
【0053】図2を用いて処理の概要を示しておく。ま
ず、各ベーシック・ブロックB内において、実行とは逆
順に、所定の条件に従ってC_GEN[B]を収集する
(ステップ110)。C_GEN[B]の情報は記憶装
置に記憶される。このC_GEN[B]は、ここでは配
列レンジ・チェックを必要とする配列アクセスにおける
配列インデックスの範囲の集合である。但し、後に詳し
く述べる所定の条件に従って収集されるものに限る。例
えば、配列aで配列インデックスvの場合には、配列a
の配列インデックスvの下限lb(a)と上限ub
(a)とから、lb≦v,ub(a)≧vであることが
確認されねばならない。よって、C_GEN[B]に
は、lb≦v,ub(a)≧vが加えられる。なお、一
般的にはlb(a)≦f(v),ub(a)≧f(v)
(fは関数)となる。このステップ110については後
に詳しく述べる。
ず、各ベーシック・ブロックB内において、実行とは逆
順に、所定の条件に従ってC_GEN[B]を収集する
(ステップ110)。C_GEN[B]の情報は記憶装
置に記憶される。このC_GEN[B]は、ここでは配
列レンジ・チェックを必要とする配列アクセスにおける
配列インデックスの範囲の集合である。但し、後に詳し
く述べる所定の条件に従って収集されるものに限る。例
えば、配列aで配列インデックスvの場合には、配列a
の配列インデックスvの下限lb(a)と上限ub
(a)とから、lb≦v,ub(a)≧vであることが
確認されねばならない。よって、C_GEN[B]に
は、lb≦v,ub(a)≧vが加えられる。なお、一
般的にはlb(a)≦f(v),ub(a)≧f(v)
(fは関数)となる。このステップ110については後
に詳しく述べる。
【0054】そして、深さ優先探索(Depth-First Sear
ch:DFS)のポストオーダー・トラバーサル(Postor
der Traversal)の順番で、C_GEN[B]を必要な
修正を加えつつ伝播させ、各ベーシック・ブロックBの
C_IN[B]を生成する(ステップ120)。C_I
N[B]の情報は記憶装置に記憶される。C_IN
[B]は、ベーシック・ブロックBの先頭における、配
列レンジ・チェックを必要とする配列アクセスにおける
配列インデックスの範囲の集合である。このステップ1
20についても後に詳しく述べる。
ch:DFS)のポストオーダー・トラバーサル(Postor
der Traversal)の順番で、C_GEN[B]を必要な
修正を加えつつ伝播させ、各ベーシック・ブロックBの
C_IN[B]を生成する(ステップ120)。C_I
N[B]の情報は記憶装置に記憶される。C_IN
[B]は、ベーシック・ブロックBの先頭における、配
列レンジ・チェックを必要とする配列アクセスにおける
配列インデックスの範囲の集合である。このステップ1
20についても後に詳しく述べる。
【0055】最後に、C_IN[B]を用いて、ループ
の前にバージョニングのチェック・コードと、各実行状
態における実行コードとを生成する(ステップ13
0)。チェック・コード及び実行コードは実行のため記
憶装置に記憶される。このようにして、ループ内の通常
必要とされる配列レンジ・チェックについて、ループの
先頭のチェック・コードにおいてその要否を可能な限り
判断してしまう。そうすると表7に示したように、チェ
ック・コードである3行目のif文の条件が満たされれ
ば、本発明が適用可能なものに限りループ内の配列レン
ジ・チェックは除去される。表7では全ての配列レンジ
・チェックが除去されている。一方、if文の条件が満
たされなければ、必要な配列レンジ・チェックを実行す
る。ステップ130についても後に詳しく述べる。
の前にバージョニングのチェック・コードと、各実行状
態における実行コードとを生成する(ステップ13
0)。チェック・コード及び実行コードは実行のため記
憶装置に記憶される。このようにして、ループ内の通常
必要とされる配列レンジ・チェックについて、ループの
先頭のチェック・コードにおいてその要否を可能な限り
判断してしまう。そうすると表7に示したように、チェ
ック・コードである3行目のif文の条件が満たされれ
ば、本発明が適用可能なものに限りループ内の配列レン
ジ・チェックは除去される。表7では全ての配列レンジ
・チェックが除去されている。一方、if文の条件が満
たされなければ、必要な配列レンジ・チェックを実行す
る。ステップ130についても後に詳しく述べる。
【0056】では、ステップ110から順に詳しく説明
する。ステップ110では、原則として配列インデック
ス又は配列ベースを変更する命令に関わる配列レンジ・
チェックを本ステップの対象外として取り扱いながら、
ベーシック・ブロックの先頭における、配列レンジ・チ
ェックの集合C_GEN[B]を、実行とは逆順に収集
する。但し、配列インデックス変数をv=v+c(cは
正又は負の定数)のように変更する場合には、本ステッ
プの対象外とはしないで、集合情報C_GEN[B]内
の配列インデックスの式f(v)をf(v+c)として
再計算し、置き換える。以下にステップ110の擬似コ
ードを示す。
する。ステップ110では、原則として配列インデック
ス又は配列ベースを変更する命令に関わる配列レンジ・
チェックを本ステップの対象外として取り扱いながら、
ベーシック・ブロックの先頭における、配列レンジ・チ
ェックの集合C_GEN[B]を、実行とは逆順に収集
する。但し、配列インデックス変数をv=v+c(cは
正又は負の定数)のように変更する場合には、本ステッ
プの対象外とはしないで、集合情報C_GEN[B]内
の配列インデックスの式f(v)をf(v+c)として
再計算し、置き換える。以下にステップ110の擬似コ
ードを示す。
【表8】 for (各ベーシック・ブロックについて実行とは逆順に命令を取り出す){ switch(命令){ 配列アクセス命令: その配列レンジ・チェックCに対して C_GEN[B] += C; break; 配列のベース変数 a の変更命令: for (全てのC∈ C_GEN[B]){ if (Cの中に変更された配列ベース a によるlb(a)又はub(a)が含まれる){ C_GEN[B] -= C; } } break; インデックス変数 v の変更命令: for (全てのC∈ C_GEN[B]){ if (Cは変更されたインデックス変数v 又はvの式 f(v) で構成される){ if (インデックス変数vが v = v + c (cは正又は負の定数:定数の加算又は減算)で変更される){ Cのvを v + c、又はf(v)をf(v + c)として置き換える。 } else { C_GEN[B] -= C; } } } break; } }
【0057】表8全体は各ベーシック・ブロックについ
て行われる。そして、各ベーシック・ブロックの各命令
ごとにforループ内の処理が実施される。命令の取り
出し順番は実行順とは逆順となる。switch文は、取り出
した命令が、それ以下の条件(ここでは3つの条件)の
いずれかに該当する場合には、該当する条件の下に規定
された処理を実行するものである。この条件は、配列ア
クセス命令、配列ベース変数aの変更命令、及びインデ
ックス変数vの変更命令である。配列アクセス命令の場
合には、その配列アクセス命令に対する配列レンジ・チ
ェックCをC_GEN[B]に入れる。配列ベース変数
aの変更命令の場合には、このベース変数aに関連する
配列レンジ・チェックCを本発明では取り扱うことがで
きないので、C_GEN[B]からCを除去する処理を
実施する。インデックス変数vの変更の場合には、まず
C_GEN[B]内の各配列レンジ・チェックCがその
変更された配列インデックス変数vに関連するか検査す
る。もし定数と配列インデックスの上限又は下限とによ
る検査であれば、インデックス変数vの変更操作はその
検査には影響が無い。そして、インデックス変数vの変
更命令が、定数の加算又は減算命令であるか判断する。
インデックス変数vの変更命令が、定数の加算又は減算
命令である場合には、C_GEN[B]内の配列レンジ
・チェックCも、その定数の加算又は減算に従って、定
数の加算又は減算を実施する。本発明で取り扱い不可能
なインデックス変数vの変更を実施している場合には、
そのインデックス変数vに関連する配列レンジ・チェッ
クCはC_GEN[B]から取り除かれる。
て行われる。そして、各ベーシック・ブロックの各命令
ごとにforループ内の処理が実施される。命令の取り
出し順番は実行順とは逆順となる。switch文は、取り出
した命令が、それ以下の条件(ここでは3つの条件)の
いずれかに該当する場合には、該当する条件の下に規定
された処理を実行するものである。この条件は、配列ア
クセス命令、配列ベース変数aの変更命令、及びインデ
ックス変数vの変更命令である。配列アクセス命令の場
合には、その配列アクセス命令に対する配列レンジ・チ
ェックCをC_GEN[B]に入れる。配列ベース変数
aの変更命令の場合には、このベース変数aに関連する
配列レンジ・チェックCを本発明では取り扱うことがで
きないので、C_GEN[B]からCを除去する処理を
実施する。インデックス変数vの変更の場合には、まず
C_GEN[B]内の各配列レンジ・チェックCがその
変更された配列インデックス変数vに関連するか検査す
る。もし定数と配列インデックスの上限又は下限とによ
る検査であれば、インデックス変数vの変更操作はその
検査には影響が無い。そして、インデックス変数vの変
更命令が、定数の加算又は減算命令であるか判断する。
インデックス変数vの変更命令が、定数の加算又は減算
命令である場合には、C_GEN[B]内の配列レンジ
・チェックCも、その定数の加算又は減算に従って、定
数の加算又は減算を実施する。本発明で取り扱い不可能
なインデックス変数vの変更を実施している場合には、
そのインデックス変数vに関連する配列レンジ・チェッ
クCはC_GEN[B]から取り除かれる。
【0058】次にステップ120の詳細について説明す
る。このステップ120では、上で収集したC_GEN
[B]を用いてDFSのポスト・トラバーサルの順番、
すなわち後続のベーシック・ブロックが先に来るような
順番で全てのベーシック・ブロックについて、次の式を
一回実行する。S∈ Succ(B) であってBとSは同じル
ープ内という条件を満たす全てのSについて、 C_OUT[B] = ∪ C_IN[S] C_IN[B] = C_GEN[B] ∪ backward(C_OUT[B], B) Succ(B)は、Bの直後に来る全てのベーシック・ブロッ
クの意味である。上の式は以下のことを示している。あ
るベーシック・ブロックBの後端における、配列レンジ
・チェックの集合C_OUT[B]は、S∈ Succ(B)で
あってベーシック・ブロックBとベーシック・ブロック
Sが同じループ内という条件を満たす全てのベーシック
・ブロックSの先頭における、配列レンジ・チェックの
集合C_IN[S]の和集合である。また、C_OUT
[B]は、後に述べる処理により、ベーシック・ブロッ
クBにおいて行われる配列インデックスに対する変更に
応じて所定の修正が行われ、新たに集合backward(C_OUT
[B], B)となる。この集合backward(C_OUT[B], B)及び先
に求めたC_GEN[B]の和集合がC_IN[B]と
なる。最終的に必要なのはこのC_IN[B]である。
この処理を図3にまとめておく。
る。このステップ120では、上で収集したC_GEN
[B]を用いてDFSのポスト・トラバーサルの順番、
すなわち後続のベーシック・ブロックが先に来るような
順番で全てのベーシック・ブロックについて、次の式を
一回実行する。S∈ Succ(B) であってBとSは同じル
ープ内という条件を満たす全てのSについて、 C_OUT[B] = ∪ C_IN[S] C_IN[B] = C_GEN[B] ∪ backward(C_OUT[B], B) Succ(B)は、Bの直後に来る全てのベーシック・ブロッ
クの意味である。上の式は以下のことを示している。あ
るベーシック・ブロックBの後端における、配列レンジ
・チェックの集合C_OUT[B]は、S∈ Succ(B)で
あってベーシック・ブロックBとベーシック・ブロック
Sが同じループ内という条件を満たす全てのベーシック
・ブロックSの先頭における、配列レンジ・チェックの
集合C_IN[S]の和集合である。また、C_OUT
[B]は、後に述べる処理により、ベーシック・ブロッ
クBにおいて行われる配列インデックスに対する変更に
応じて所定の修正が行われ、新たに集合backward(C_OUT
[B], B)となる。この集合backward(C_OUT[B], B)及び先
に求めたC_GEN[B]の和集合がC_IN[B]と
なる。最終的に必要なのはこのC_IN[B]である。
この処理を図3にまとめておく。
【0059】では、backward(C_OUT[B], B)の処理を以
下の擬似コードを用いて説明する。
下の擬似コードを用いて説明する。
【表9】 backward(C_OUT[B], B){ T = 0; for (各配列レンジ・チェック C ∈ C_OUT[B]) { case C of lb <= v: case AFFECT(B, v) of unchanged: T = T ∪ { lb <= v } increment: if 加算する値 c が定数 then T = T ∪ { lb <= v + c } /* そうでなければTには入れない */ decrement: if 減算する値 c が定数 then T = T ∪ { lb <= v - c } else T = T ∪ { lb <= v } multiply: /* Tには入れない */ div > 1: T = T ∪ { lb <= v } div < 1: /* Tには入れない */ changed: /* Tには入れない */ end case v <= ub: case AFFECT(B, v) of unchanged: T = T ∪ { v <= ub } increment: if 加算する値 c が定数 then T = T ∪ { v + c <= ub } else T = T ∪ { v <= ub } decrement: if 減算する値 c が定数 then T = T ∪ { v - c <= ub } /* そうでなければTに入れない */ multiply: T = T ∪ { v <= ub } div > 1: /* Tには入れない */ div < 1: T = T ∪ { v <= ub } changed: /* Tには入れない */ end case lb <= f(v): case AFFECT(B, v) of unchanged: T = T ∪ { lb <= f(v) } increment: if f(v)が単調な関数であり且つ 加算する値 c が定数 then T = T ∪ { lb <= f( v + c ) } else if vが増加するとf(v) は減少する then T = T ∪ { lb <= f(v) } decrement: if f(v)が単調な関数であり且つ 減算する値 c が定数 then T = T ∪ { lb <= f( v - c ) } else if vが減少するとf(v)も減少する then T = T ∪ { lb <= f(v) } multiply, div < 1: if vが増加するとf(v)は減少する then T = T ∪ { lb <= f(v) } div > 1: if vが減少するとf(v)も減少する then T = T ∪ { lb <= f(v) } changed: /* Tには入れない */ end case f(v) <= ub: case AFFECT(B, v) of unchanged: T = T ∪ { f(v) <= ub } increment: if f(v)は単調な関数であり且つ 加算する値 c が定数 then T = T ∪ { f( v + c ) <= ub } else if vが増加するとf(v)も増加 then T = T ∪ { f(v) <= ub } decrement: if f(v)が単調な関数であり且つ 減算する値 c が定数 then T = T ∪ { f( v - c ) <= ub } else if vが減少するとf(v)は増加 then T = T ∪ { f(v) <= ub } multiply, div < 1: if vが増加するとf(v)も増加する then T = T ∪ { f(v) <= ub } div > 1: if vが減少するとf(v)は増加する then T = T ∪ { f(v) <= ub } changed: /* Tには入れない */ end case end case } return(T) }
【0060】backward(C_OUT[B], B)の最終的な出力は
Tである。backward(C_OUT[B], B)はC_OUT[B]
に含まれる配列レンジ・チェックの内容により大きく4
つの部分に分けられる。すなわち、配列インデックス変
数vについて、lb≦vの場合及びv≦ubの場合、配
列インデックスf(v)について、lb≦f(v)の場
合及びf(v)≦ubの場合である。そして、それぞれ
の場合において、配列インデックス変数vに対する操作
(表9におけるAFFECT(B,v)。Bは処理を行っているベ
ーシック・ブロックを示している。)によってさらに場
合分けされる。以下、それぞれについて説明する。
Tである。backward(C_OUT[B], B)はC_OUT[B]
に含まれる配列レンジ・チェックの内容により大きく4
つの部分に分けられる。すなわち、配列インデックス変
数vについて、lb≦vの場合及びv≦ubの場合、配
列インデックスf(v)について、lb≦f(v)の場
合及びf(v)≦ubの場合である。そして、それぞれ
の場合において、配列インデックス変数vに対する操作
(表9におけるAFFECT(B,v)。Bは処理を行っているベ
ーシック・ブロックを示している。)によってさらに場
合分けされる。以下、それぞれについて説明する。
【0061】(1)lb≦vの場合 配列インデックス変数vに対する操作が何も無い場合
(unchanged)には、lb≦vをそのまま配列レンジ・
チェックの集合であるTに入れる。なお、配列インデッ
クスが定数の場合にはこのunchangedに含まれる。配列
インデックス変数vを増加させる操作の場合(incremen
t)、加算する値cが定数であるかどうか判断する。も
し加算する値cが定数であれば、Tにはlb≦v+cを
入れる。これ以外のvを増加させる操作の場合には、本
発明では取り扱わないので、その配列レンジ・チェック
をTには入れない。配列インデックス変数vを減少させ
る操作の場合(decrement)、減算する値cが定数であ
るかどうか判断する。もし減算する値cが定数であれ
ば、Tにlb≦v−cを入れる。これ以外のvを減少さ
せる操作の場合には、lb≦vをTに入れる。配列イン
デックス変数vが掛け算される場合(multiply)、本発
明では取り扱うことができないので、その配列レンジ・
チェックをTには入れない。配列インデックス変数vが
1より大きな値で割り算される場合(div>1)には、l
b≦vをそのままTに入れる。配列インデックス変数v
が1より小さな値で割り算される場合(div<1)には、
本発明では取り扱うことができないので、その配列レン
ジ・チェックをTには入れない。以上述べた操作以外の
操作の場合(changed)、本発明では取り扱うことがで
きないので、その配列レンジ・チェックをTには入れな
い。
(unchanged)には、lb≦vをそのまま配列レンジ・
チェックの集合であるTに入れる。なお、配列インデッ
クスが定数の場合にはこのunchangedに含まれる。配列
インデックス変数vを増加させる操作の場合(incremen
t)、加算する値cが定数であるかどうか判断する。も
し加算する値cが定数であれば、Tにはlb≦v+cを
入れる。これ以外のvを増加させる操作の場合には、本
発明では取り扱わないので、その配列レンジ・チェック
をTには入れない。配列インデックス変数vを減少させ
る操作の場合(decrement)、減算する値cが定数であ
るかどうか判断する。もし減算する値cが定数であれ
ば、Tにlb≦v−cを入れる。これ以外のvを減少さ
せる操作の場合には、lb≦vをTに入れる。配列イン
デックス変数vが掛け算される場合(multiply)、本発
明では取り扱うことができないので、その配列レンジ・
チェックをTには入れない。配列インデックス変数vが
1より大きな値で割り算される場合(div>1)には、l
b≦vをそのままTに入れる。配列インデックス変数v
が1より小さな値で割り算される場合(div<1)には、
本発明では取り扱うことができないので、その配列レン
ジ・チェックをTには入れない。以上述べた操作以外の
操作の場合(changed)、本発明では取り扱うことがで
きないので、その配列レンジ・チェックをTには入れな
い。
【0062】(2)v≦ubの場合 配列インデックス変数vに対する操作が何も無い場合
(unchanged)には、Tにv≦ubを入れる。配列イン
デックス変数vを増加させる操作の場合(incremen
t)、加算する値cが定数であるならばv+c≦ubを
Tに入れる。一方、それ以外のvを増加させる操作の場
合にはv≦ubをTに入れる。配列インデックス変数v
を減少させる操作の場合(decrement)、減算する値c
が定数であるならばv−c≦ubをTに入れる。それ以
外のvを減少させる操作の場合にはその配列レンジ・チ
ェックをTには入れない。配列インデックス変数vが掛
け算される場合(multiply)、その配列レンジ・チェッ
クをTには入れない。配列インデックス変数vを1より
大きい値で割り算する場合(div>1)、その配列レンジ
・チェックをTには入れない。配列インデックス変数v
が1より小さい値で割り算する場合(div<1)、v≦u
bをTに入れる。以上述べた以外の操作の場合(change
d)、その配列レンジ・チェックをTには入れない。
(unchanged)には、Tにv≦ubを入れる。配列イン
デックス変数vを増加させる操作の場合(incremen
t)、加算する値cが定数であるならばv+c≦ubを
Tに入れる。一方、それ以外のvを増加させる操作の場
合にはv≦ubをTに入れる。配列インデックス変数v
を減少させる操作の場合(decrement)、減算する値c
が定数であるならばv−c≦ubをTに入れる。それ以
外のvを減少させる操作の場合にはその配列レンジ・チ
ェックをTには入れない。配列インデックス変数vが掛
け算される場合(multiply)、その配列レンジ・チェッ
クをTには入れない。配列インデックス変数vを1より
大きい値で割り算する場合(div>1)、その配列レンジ
・チェックをTには入れない。配列インデックス変数v
が1より小さい値で割り算する場合(div<1)、v≦u
bをTに入れる。以上述べた以外の操作の場合(change
d)、その配列レンジ・チェックをTには入れない。
【0063】(3)lb≦f(v)の場合 配列インデックス変数vに対する操作が何も無い場合
(unchanged)には、Tにlb≦f(v)を入れる。配
列インデックス変数vを増加させる操作の場合(increm
ent)、f(v)が単調な関数(monotone)であって且つ
加算する値cが定数であるならば、lb≦f(v+c)
を入れる。また、そうでない場合であっても、vが増加
するとf(v)が減少するような場合には、lb≦f
(v)をTに入れる。配列インデックス変数vを減少さ
せる操作の場合(decrement)、f(v)が単調な関数
であって且つ減算する値cが定数であるならば、lb≦
f(v−c)をTに入れる。そうでない場合であって
も、vが減少するとf(v)が減少する場合には、lb
≦f(v)をTに入れる。配列インデックス変数vが掛
け算される場合及び1より小さい値で割り算される場合
(mutiply,div<1)、vが増加するとf(v)が減少す
るならばlb≦f(v)をTに入れる。配列インデック
スvを1より大きな値で割り算する場合(div>1)、l
b≦f(v)をTに入れる。以上述べた以外の操作の場
合(changed)、その配列レンジ・チェックをTには入
れない。
(unchanged)には、Tにlb≦f(v)を入れる。配
列インデックス変数vを増加させる操作の場合(increm
ent)、f(v)が単調な関数(monotone)であって且つ
加算する値cが定数であるならば、lb≦f(v+c)
を入れる。また、そうでない場合であっても、vが増加
するとf(v)が減少するような場合には、lb≦f
(v)をTに入れる。配列インデックス変数vを減少さ
せる操作の場合(decrement)、f(v)が単調な関数
であって且つ減算する値cが定数であるならば、lb≦
f(v−c)をTに入れる。そうでない場合であって
も、vが減少するとf(v)が減少する場合には、lb
≦f(v)をTに入れる。配列インデックス変数vが掛
け算される場合及び1より小さい値で割り算される場合
(mutiply,div<1)、vが増加するとf(v)が減少す
るならばlb≦f(v)をTに入れる。配列インデック
スvを1より大きな値で割り算する場合(div>1)、l
b≦f(v)をTに入れる。以上述べた以外の操作の場
合(changed)、その配列レンジ・チェックをTには入
れない。
【0064】(4)f(v)≦ubの場合 配列インデックス変数vに対する操作が何もない場合
(unchanged)には、f(v)≦ubをTに入れる。配
列インデックス変数vを増加させる操作の場合(increm
ent)、f(v)が単調な関数であって且つ加算する値
cが定数ならば、f(v+c)≦ubをTに入れる。ま
た、そうでない場合であっても、vが増加するとf
(v)が増加する場合には、f(v)≦ubをTに入れ
る。配列インデックス変数vを減少させる操作の場合、
f(v)が単調な関数であって且つ減算する値cが定数
ならば、f(v−c)≦ubをTに入れる。そうでない
場合であっても、vが減少するとf(v)は増加するな
らば、f(v)≦ubをTに入れる。配列インデックス
変数vを掛け算する場合及び1より小さな値で割り算す
る場合(multiply,div <1)、vが増加するとf(v)
も増加するならば、f(v)≦ubをTに入れる。配列
インデックスvを1より大きな値で割り算する場合(di
v>1)、f(v)≦ubをTに入れる。以上述べた以外
の操作の場合(unchanged)、その配列レンジ・チェッ
クをTに入れない。
(unchanged)には、f(v)≦ubをTに入れる。配
列インデックス変数vを増加させる操作の場合(increm
ent)、f(v)が単調な関数であって且つ加算する値
cが定数ならば、f(v+c)≦ubをTに入れる。ま
た、そうでない場合であっても、vが増加するとf
(v)が増加する場合には、f(v)≦ubをTに入れ
る。配列インデックス変数vを減少させる操作の場合、
f(v)が単調な関数であって且つ減算する値cが定数
ならば、f(v−c)≦ubをTに入れる。そうでない
場合であっても、vが減少するとf(v)は増加するな
らば、f(v)≦ubをTに入れる。配列インデックス
変数vを掛け算する場合及び1より小さな値で割り算す
る場合(multiply,div <1)、vが増加するとf(v)
も増加するならば、f(v)≦ubをTに入れる。配列
インデックスvを1より大きな値で割り算する場合(di
v>1)、f(v)≦ubをTに入れる。以上述べた以外
の操作の場合(unchanged)、その配列レンジ・チェッ
クをTに入れない。
【0065】次にステップ130を詳細に述べる。ルー
プのバージョニングをする場合には、ループの先頭(エ
ントリポイント)におけるC_IN[B]及びループ変
数の取り得る範囲から、配列レンジ・チェックが不要に
なる条件を導き出す。例えば、ループ変数がiであっ
て、取り得る範囲が1以上n未満であることが分かれ
ば、ub(a)についてはi=n−1である場合につい
てチェックし、lb(a)についてはi=1であるとし
てチェックする。なお、本発明で取扱い可能なものにつ
いて配列レンジ・チェックを不要にするということであ
って、本発明で取扱い不可能なものについては上の条件
に含めない。この条件に基づきチェック・コードをルー
プの先頭に生成し、配列レンジ・チェック不要のループ
処理のためのコード、及び配列レンジ・チェックが必要
なループ処理のためのコードをそれぞれ生成する。
プのバージョニングをする場合には、ループの先頭(エ
ントリポイント)におけるC_IN[B]及びループ変
数の取り得る範囲から、配列レンジ・チェックが不要に
なる条件を導き出す。例えば、ループ変数がiであっ
て、取り得る範囲が1以上n未満であることが分かれ
ば、ub(a)についてはi=n−1である場合につい
てチェックし、lb(a)についてはi=1であるとし
てチェックする。なお、本発明で取扱い可能なものにつ
いて配列レンジ・チェックを不要にするということであ
って、本発明で取扱い不可能なものについては上の条件
に含めない。この条件に基づきチェック・コードをルー
プの先頭に生成し、配列レンジ・チェック不要のループ
処理のためのコード、及び配列レンジ・チェックが必要
なループ処理のためのコードをそれぞれ生成する。
【0066】なお、A.の処理とC.の処理を組み合わ
せて行う場合には、以下のような処理を行っておく。バ
ージョンニングを行うループに対してバージョニング前
のエントリポイントをB、同ループのバージョニング後
のバージョニング条件を満たす方のエントリポイントを
B2とした時に、C_IN[B]をVERSION[B
2]にコピーする。ループのエントリポイント以外のV
ERSION_OR[B2]はφとする。
せて行う場合には、以下のような処理を行っておく。バ
ージョンニングを行うループに対してバージョニング前
のエントリポイントをB、同ループのバージョニング後
のバージョニング条件を満たす方のエントリポイントを
B2とした時に、C_IN[B]をVERSION[B
2]にコピーする。ループのエントリポイント以外のV
ERSION_OR[B2]はφとする。
【0067】では、表10に示すサンプル・プログラム
に、以上説明した処理を実施した場合の例を説明する。
に、以上説明した処理を実施した場合の例を説明する。
【表10】 なお、BBはベーシック・ブロックを表し、その後の番号
はベーシック・ブロックの番号である。
はベーシック・ブロックの番号である。
【0068】最初に、図2のステップ110を各ベーシ
ック・ブロックにつき実行する。BB1は配列アクセスが
存在しないのでC_GEN[BB1]は空である。ステッ
プ110は実行とは逆順に行われるため、最初にC_G
EN[BB2]に含まれるのは、lb(a)≦i−2及び
i≦ub(a)である。次の命令はi++でi=i+1
が実行されるので、配列インデックスの定数の加算であ
る。よって、lb(a)≦i−2及びi≦ub(a)の
iを+1する。すなわち、lb(a)≦(i+1)−2
=i−1及びi+1≦ub(a)がC_GEN[BB2]
に入力される。
ック・ブロックにつき実行する。BB1は配列アクセスが
存在しないのでC_GEN[BB1]は空である。ステッ
プ110は実行とは逆順に行われるため、最初にC_G
EN[BB2]に含まれるのは、lb(a)≦i−2及び
i≦ub(a)である。次の命令はi++でi=i+1
が実行されるので、配列インデックスの定数の加算であ
る。よって、lb(a)≦i−2及びi≦ub(a)の
iを+1する。すなわち、lb(a)≦(i+1)−2
=i−1及びi+1≦ub(a)がC_GEN[BB2]
に入力される。
【0069】C_GEN[BB3]に最初に含まれるの
は、lb(a)≦i−2、i≦ub(a)、lb(a)
≦5及び5≦ub(a)である。実行とは逆順で次の命
令i++によりC_GEN[BB3]を変更すると、lb
(a)≦i−1、i+1≦ub(a)、lb(a)≦5
及び5≦ub(a)となる。同様にすると、C_GEN
[BB4]はlb(a)≦i−2、i+1≦ub(a)と
なる。以下にまとめておく。
は、lb(a)≦i−2、i≦ub(a)、lb(a)
≦5及び5≦ub(a)である。実行とは逆順で次の命
令i++によりC_GEN[BB3]を変更すると、lb
(a)≦i−1、i+1≦ub(a)、lb(a)≦5
及び5≦ub(a)となる。同様にすると、C_GEN
[BB4]はlb(a)≦i−2、i+1≦ub(a)と
なる。以下にまとめておく。
【0070】例えば、配列レンジ・チェックは以下のよ
うに記憶装置に記憶される。すなわち、(1)配列ベー
ス(2)配列インデックスのうちインデックス変数を含
む項(3)配列インデックスの最大定数オフセット及び
(4)配列インデックスの最小定数オフセットである。
C_GEN[BB2]の場合、最初はa[i]が出現する
ので、(1)a(2)i(3)0(4)0が記憶され
る。次いでa[i−1]が出現するので、(1)a
(2)i(3)0(4)−1となる。最後にa[i−
2]が出現するので、(1)a(2)i(3)0(4)
−2となる。ところが、実行とは逆順に次の命令を見る
とi++であるから、(2)のiがi+1になるが、こ
のような変更の結果は(3)及び(4)に反映されて、
(1)a(2)i(3)+1(4)−1が記憶装置に記
憶される。
うに記憶装置に記憶される。すなわち、(1)配列ベー
ス(2)配列インデックスのうちインデックス変数を含
む項(3)配列インデックスの最大定数オフセット及び
(4)配列インデックスの最小定数オフセットである。
C_GEN[BB2]の場合、最初はa[i]が出現する
ので、(1)a(2)i(3)0(4)0が記憶され
る。次いでa[i−1]が出現するので、(1)a
(2)i(3)0(4)−1となる。最後にa[i−
2]が出現するので、(1)a(2)i(3)0(4)
−2となる。ところが、実行とは逆順に次の命令を見る
とi++であるから、(2)のiがi+1になるが、こ
のような変更の結果は(3)及び(4)に反映されて、
(1)a(2)i(3)+1(4)−1が記憶装置に記
憶される。
【0071】同様にして、C_GEN[BB3]の場合、
(1)a(2)i(3)0(4)0から(1)a(2)
i(3)0(4)−1となり、(1)a(2)i(3)
0(4)−2に変化し、さらに(1)a(2)i(3)
1(4)−1となる。また、(1)a(2)null(3)
5(4)5というデータも記憶装置に記憶される。C_
GEN[BB4]の場合には、(1)a(2)i(3)0
(4)0から(1)a(2)i(3)0(4)−1とな
り、(1)a(2)i(3)0(4)−2を経て(1)
a(2)i(3)0(4)−3に変化する。そして、i
++により(2)の変更が(3)及び(4)に反映され
て(1)a(2)i(3)+1(4)−2が記憶装置に
記憶される。
(1)a(2)i(3)0(4)0から(1)a(2)
i(3)0(4)−1となり、(1)a(2)i(3)
0(4)−2に変化し、さらに(1)a(2)i(3)
1(4)−1となる。また、(1)a(2)null(3)
5(4)5というデータも記憶装置に記憶される。C_
GEN[BB4]の場合には、(1)a(2)i(3)0
(4)0から(1)a(2)i(3)0(4)−1とな
り、(1)a(2)i(3)0(4)−2を経て(1)
a(2)i(3)0(4)−3に変化する。そして、i
++により(2)の変更が(3)及び(4)に反映され
て(1)a(2)i(3)+1(4)−2が記憶装置に
記憶される。
【0072】次に、表10のフローグラフを図4に示
す。BB2の先頭がループのエントリポイントになる。S
∈Succ(B)は、Bの直後のベーシック・ブロックである
から、BB1にとってはBB2、BB2にとってはBB3及びBB4、B
B3にとってはBB4、BB4にとってはBB5及びBB2、BB5にと
っては無しである。但し、本発明では、S∈Succ(B)で
あってBとSは同じループ内という条件を満たさなけれ
ばならないので、BB1には該当するベーシック・ブロッ
クはない。またBB4にとってはBB5は同じループ内ではな
いのでBB2のみが対象となる。以下S∈Succ(B)であって
BとSは同じループ内という条件を満たすベーシック・
ブロックをまとめておく。 BB1: φ BB2: BB3, BB4 BB3: BB4 BB4: BB2 BB5: φ
す。BB2の先頭がループのエントリポイントになる。S
∈Succ(B)は、Bの直後のベーシック・ブロックである
から、BB1にとってはBB2、BB2にとってはBB3及びBB4、B
B3にとってはBB4、BB4にとってはBB5及びBB2、BB5にと
っては無しである。但し、本発明では、S∈Succ(B)で
あってBとSは同じループ内という条件を満たさなけれ
ばならないので、BB1には該当するベーシック・ブロッ
クはない。またBB4にとってはBB5は同じループ内ではな
いのでBB2のみが対象となる。以下S∈Succ(B)であって
BとSは同じループ内という条件を満たすベーシック・
ブロックをまとめておく。 BB1: φ BB2: BB3, BB4 BB3: BB4 BB4: BB2 BB5: φ
【0073】図2のステップ120ではDFSのポスト
オーダー・トラバーサルの順番にC_IN[B]を求め
る。表10の例ではBB5、BB4、BB3、BB2、BB1の順番で
1回図3の処理が実施される。まず、BB5については、
先に示した条件を満たすベーシック・ブロックSが空で
あるからC_OUT[BB5]も空であり、C_GEN[B
B5]も空であるから、C_IN[BB5]も空である。BB4
について先に示した条件を満たすベーシック・ブロック
はBB2であるが、C_IN[BB2]はまだ計算されていな
いので、C_OUT[BB4]は空となる。しかし、C_
GEN[BB4]は上で述べたようにlb(a) ≦ i-2, i+1
≦ ub(a)であるから、C_IN[BB4]はlb(a) <= i-2,
i+1 <= ub(a)となる(先に示した記憶方法の場合、
(1)a(2)i(3)+1(4)−2)。
オーダー・トラバーサルの順番にC_IN[B]を求め
る。表10の例ではBB5、BB4、BB3、BB2、BB1の順番で
1回図3の処理が実施される。まず、BB5については、
先に示した条件を満たすベーシック・ブロックSが空で
あるからC_OUT[BB5]も空であり、C_GEN[B
B5]も空であるから、C_IN[BB5]も空である。BB4
について先に示した条件を満たすベーシック・ブロック
はBB2であるが、C_IN[BB2]はまだ計算されていな
いので、C_OUT[BB4]は空となる。しかし、C_
GEN[BB4]は上で述べたようにlb(a) ≦ i-2, i+1
≦ ub(a)であるから、C_IN[BB4]はlb(a) <= i-2,
i+1 <= ub(a)となる(先に示した記憶方法の場合、
(1)a(2)i(3)+1(4)−2)。
【0074】BB3について先に示した条件を満たすベー
シック・ブロックはBB4であるから、C_OUT[BB3]
=C_IN[BB4]となる。backward(C_OUT[BB3], BB
3)を次に求める。BB3でなされている配列インデックス
変数iの操作は1(定数)の加算であるから、C_OU
T[BB3]内のlb(a) ≦ i-2, i+1 ≦ ub(a)のiはi+
1で置換される。よって、T={lb(a) ≦ i-1, i+2 ≦
ub(a)}となる(先に示した記憶方法の場合、(1)a
(2)i(3)+2(4)−1)。さらに、C_GEN
[BB3]はlb(a) ≦ i-1, i+1 ≦ ub(a),lb(a) ≦ 5, 5
≦ ub(a)であるから、C_GEN[BB3]とTの和集合
C_IN[BB3]は、lb(a) ≦ i-1, i+2≦ ub(a)、lb
(a) ≦ 5, 5 ≦ ub(a)となる(先に示した記憶方法の場
合、(1)a(2)null(3)5(4)5,(1)a
(2)i(3)+2(4)−1)。
シック・ブロックはBB4であるから、C_OUT[BB3]
=C_IN[BB4]となる。backward(C_OUT[BB3], BB
3)を次に求める。BB3でなされている配列インデックス
変数iの操作は1(定数)の加算であるから、C_OU
T[BB3]内のlb(a) ≦ i-2, i+1 ≦ ub(a)のiはi+
1で置換される。よって、T={lb(a) ≦ i-1, i+2 ≦
ub(a)}となる(先に示した記憶方法の場合、(1)a
(2)i(3)+2(4)−1)。さらに、C_GEN
[BB3]はlb(a) ≦ i-1, i+1 ≦ ub(a),lb(a) ≦ 5, 5
≦ ub(a)であるから、C_GEN[BB3]とTの和集合
C_IN[BB3]は、lb(a) ≦ i-1, i+2≦ ub(a)、lb
(a) ≦ 5, 5 ≦ ub(a)となる(先に示した記憶方法の場
合、(1)a(2)null(3)5(4)5,(1)a
(2)i(3)+2(4)−1)。
【0075】BB2について先に示した条件を満たすベー
シック・ブロックはBB3及びBB4であるから、C_OUT
[BB2]=C_IN[BB3]∪C_IN[BB4]となる。
但し、C_IN[BB4]は空であるから、C_OUT[B
B2]=C_IN[BB3]となる。また、backward(C_OUT
[BB2], BB2)を次に求める。BB2でなされている配列イン
デックス変数iの操作は1(定数)の加算であるから、
C_OUT[BB2]内のlb(a) ≦ i-1, i+2 ≦ ub(a)、l
b(a) ≦ 5, 5 ≦ ub(a)のiをi+1で置換する。すな
わち、T={lb(a) ≦ i, i+3 ≦ ub(a)、lb(a) ≦ 5,
5 ≦ ub(a)}となる(先に示した記憶方法の場合、
(1)a(2)null(3)5(4)5,(1)a(2)
i(3)+3(4)0)。そしてC_GEN[BB2]
(=lb(a) ≦ i-1, i+1 ≦ ub(a))とTとの和集合C_
IN[BB2]をとると、lb(a) ≦ i-1, i+3 ≦ ub(a)、l
b(a) ≦ 5, 5 ≦ ub(a)となる(先に示した記憶方法の
場合、(1)a(2)null(3)5(4)5,(1)a
(2)i(3)+3(4)−1)。
シック・ブロックはBB3及びBB4であるから、C_OUT
[BB2]=C_IN[BB3]∪C_IN[BB4]となる。
但し、C_IN[BB4]は空であるから、C_OUT[B
B2]=C_IN[BB3]となる。また、backward(C_OUT
[BB2], BB2)を次に求める。BB2でなされている配列イン
デックス変数iの操作は1(定数)の加算であるから、
C_OUT[BB2]内のlb(a) ≦ i-1, i+2 ≦ ub(a)、l
b(a) ≦ 5, 5 ≦ ub(a)のiをi+1で置換する。すな
わち、T={lb(a) ≦ i, i+3 ≦ ub(a)、lb(a) ≦ 5,
5 ≦ ub(a)}となる(先に示した記憶方法の場合、
(1)a(2)null(3)5(4)5,(1)a(2)
i(3)+3(4)0)。そしてC_GEN[BB2]
(=lb(a) ≦ i-1, i+1 ≦ ub(a))とTとの和集合C_
IN[BB2]をとると、lb(a) ≦ i-1, i+3 ≦ ub(a)、l
b(a) ≦ 5, 5 ≦ ub(a)となる(先に示した記憶方法の
場合、(1)a(2)null(3)5(4)5,(1)a
(2)i(3)+3(4)−1)。
【0076】BB1について先に示した条件を満たすベー
シック・ブロックはなく且つC_GEN[BB1]も空で
あるから、C_OUT[BB1]及びC_IN[BB1]は共
に空になる。以上を下にまとめておく。
シック・ブロックはなく且つC_GEN[BB1]も空で
あるから、C_OUT[BB1]及びC_IN[BB1]は共
に空になる。以上を下にまとめておく。
【0077】次に、ループのエントリポイントであるBB
2の先頭の情報C_IN[BB2]を用いて、バージョニン
グのためのチェック・コードの生成を行う。ここでは、
C_IN[BB2]={lb(a) <= i-1, i+3 <= ub(a),lb
(a) <= 5, 5 <= ub(a)}である。さらに、表10のBB1
の最初のラインでi=1、BB4の最後のラインでi<n
であることが示されているため、1≦i≦n−1である
ことが分かる。よって、1≦n−1であって、iが最小
であると1であるからlb(a)≦1−1=0、iが最
大であるとn−1であるから(n−1)+3=n+2≦
ub(a)、5≦ub(a)となる。なお、lb(a)
≦5は、lb(a)≦0に含まれる条件である。
2の先頭の情報C_IN[BB2]を用いて、バージョニン
グのためのチェック・コードの生成を行う。ここでは、
C_IN[BB2]={lb(a) <= i-1, i+3 <= ub(a),lb
(a) <= 5, 5 <= ub(a)}である。さらに、表10のBB1
の最初のラインでi=1、BB4の最後のラインでi<n
であることが示されているため、1≦i≦n−1である
ことが分かる。よって、1≦n−1であって、iが最小
であると1であるからlb(a)≦1−1=0、iが最
大であるとn−1であるから(n−1)+3=n+2≦
ub(a)、5≦ub(a)となる。なお、lb(a)
≦5は、lb(a)≦0に含まれる条件である。
【0078】そして、以上の条件が満たされれば、配列
レンジ・チェックは不要となる。一方、以上の条件が満
たされなければ、配列レンジ・チェックが必要になる。
配列レンジ・チェックが必要となる場合の実行コード
は、表10に、必要な配列レンジ・チェックを行うコー
ドを付加する形になる。付加するコードは従来技術によ
る方法で生成してもよいし、後に述べる本発明の方法を
使用して付加することも可能である。以下、表11に表
10の処理結果を示すが、ここでは配列レンジ・チェッ
クが必要な部分については何等の特別な処理を実施して
いない状況を示す。表11は本発明の処理結果を分かり
やすく示したものであって、実際は表11のような実行
可能なコードが生成される。
レンジ・チェックは不要となる。一方、以上の条件が満
たされなければ、配列レンジ・チェックが必要になる。
配列レンジ・チェックが必要となる場合の実行コード
は、表10に、必要な配列レンジ・チェックを行うコー
ドを付加する形になる。付加するコードは従来技術によ
る方法で生成してもよいし、後に述べる本発明の方法を
使用して付加することも可能である。以下、表11に表
10の処理結果を示すが、ここでは配列レンジ・チェッ
クが必要な部分については何等の特別な処理を実施して
いない状況を示す。表11は本発明の処理結果を分かり
やすく示したものであって、実際は表11のような実行
可能なコードが生成される。
【表11】 i = 1; t = 0; if (1 <= n-1 && lb(a) <= 0 && /* lb(a)が0以下の言語はこのチェックは必要ない */ n+2 <= ub(a) && 5 <= ub(a)){ /* 条件を満たす時 */ do { /* BB2の先頭の点でC_IN[BB2]内の集合要素についてのチェック check(lb(a) <= i-1); check(i+3 <= ub(a)); check(lb(a) <= 5); check(5 <= ub(a)); が行われているものとして扱い、挿入及び除去を行う。 */ i++; t += a[i] + a[i-1] + a[i-2]; /* チェック不要 */ if (t < 0) { i++; t += a[i] + a[i-1] + a[i-2] + a[5]; /* チェック不要 */ } i++; t += a[i] + a[i-1] + a[i-2] + a[i-3]; /* チェック不要 */ } while(i < n); } else { /* 条件を満たさない時 */ do { i++; check(lb(a) <= i-2); check(i <= ub(a)); t += a[i] + a[i-1] + a[i-2]; if (t < 0) { i++; check(i <= ub(a)); check(lb(a) <= i-2); check(lb(a) <= 5); /* lb(a)が5以下の言語はこのチェックは必要ない */ check(5 <= ub(a)); t += a[i] + a[i-1] + a[i-2] + a[5]; } i++; check(lb(a)<=i-3) check(i<=ub(a)) t += a[i] + a[i-1] + a[i-2] + a[i-3]; } while(i < n); } コメント文に示されているように、lb(a)が5以下
であることが明らかな言語の場合には必要のない配列レ
ンジ・チェックも示してある。例えばJavaはlb
(a)が0であるから、check(lb(a) <= 5)は不要であ
る。
であることが明らかな言語の場合には必要のない配列レ
ンジ・チェックも示してある。例えばJavaはlb
(a)が0であるから、check(lb(a) <= 5)は不要であ
る。
【0079】B.データ・フロー解析を実行順序とは逆
順に行って配列レンジ・チェックを最適化する部分 本処理の概要を図5に示す。まず、各ベーシック・ブロ
ック内において、実行とは逆順に、所定の条件に従って
C_GEN[B]を収集する(ステップ210)。収集
結果は、記憶装置に記憶される。所定の条件は以下に説
明するが図2のステップ110とは異なる。しかし、C
_GEN[B]の意味は同じである。そして、プログラ
ムにおけるデータ・フロー解析の順番で、処理中のベー
シック・ブロック中に副作用を生じるような命令が含ま
れているか否かの情報を用い且つ第2の条件に従ってC
_GEN[B]を伝搬させ、各ベーシック・ブロックに
おけるC_OUT[B]を生成する(ステップ22
0)。C_OUT[B]は記憶装置に記憶される。第2
の条件に関連してA.におけるBackward処理を実施す
る。最後に、各ベーシック・ブロックにおいて、C_O
UT[B]を第3の条件に従って修正しつつ実行とは逆
順に各命令を辿り、C_OUT[B]を用いて配列レン
ジ・チェックのためのコードを生成する(ステップ23
0)。生成されたコードは記憶装置に記憶される。以
下、各ステップについて詳しく説明する。
順に行って配列レンジ・チェックを最適化する部分 本処理の概要を図5に示す。まず、各ベーシック・ブロ
ック内において、実行とは逆順に、所定の条件に従って
C_GEN[B]を収集する(ステップ210)。収集
結果は、記憶装置に記憶される。所定の条件は以下に説
明するが図2のステップ110とは異なる。しかし、C
_GEN[B]の意味は同じである。そして、プログラ
ムにおけるデータ・フロー解析の順番で、処理中のベー
シック・ブロック中に副作用を生じるような命令が含ま
れているか否かの情報を用い且つ第2の条件に従ってC
_GEN[B]を伝搬させ、各ベーシック・ブロックに
おけるC_OUT[B]を生成する(ステップ22
0)。C_OUT[B]は記憶装置に記憶される。第2
の条件に関連してA.におけるBackward処理を実施す
る。最後に、各ベーシック・ブロックにおいて、C_O
UT[B]を第3の条件に従って修正しつつ実行とは逆
順に各命令を辿り、C_OUT[B]を用いて配列レン
ジ・チェックのためのコードを生成する(ステップ23
0)。生成されたコードは記憶装置に記憶される。以
下、各ステップについて詳しく説明する。
【0080】ステップ210では、例外を発生させる配
列レンジ・チェックがそれより前に移動させることによ
って副作用を生じるような命令が存在する場合にはC_
GEN[B]を空にし、且つ配列インデックス変数を正
又は負の定数の加算以外で変更する場合には変更された
配列インデックス変数に関連する配列レンジ・チェック
を取り扱わないものとして、ベーシック・ブロック中で
必要とされる配列レンジ・チェックの集合情報C_GE
N[B]を実行とは逆順で求める。なお、副作用とは、
移動前と後では実行結果が異なる、すなわちその命令が
実行されなくなるという結果をもたらすことを言う。こ
の副作用を生じるような命令の例としては、例外(Exce
ption)を発生する命令、ヒープ領域への書き込み命
令、関数呼び出し、Javaではトライ領域(Try Regi
on)内でローカル変数の書き込み命令のようなチェック
を移動することにより副作用を生じる命令等、である。
以下にステップ210の擬似コードを示す。
列レンジ・チェックがそれより前に移動させることによ
って副作用を生じるような命令が存在する場合にはC_
GEN[B]を空にし、且つ配列インデックス変数を正
又は負の定数の加算以外で変更する場合には変更された
配列インデックス変数に関連する配列レンジ・チェック
を取り扱わないものとして、ベーシック・ブロック中で
必要とされる配列レンジ・チェックの集合情報C_GE
N[B]を実行とは逆順で求める。なお、副作用とは、
移動前と後では実行結果が異なる、すなわちその命令が
実行されなくなるという結果をもたらすことを言う。こ
の副作用を生じるような命令の例としては、例外(Exce
ption)を発生する命令、ヒープ領域への書き込み命
令、関数呼び出し、Javaではトライ領域(Try Regi
on)内でローカル変数の書き込み命令のようなチェック
を移動することにより副作用を生じる命令等、である。
以下にステップ210の擬似コードを示す。
【表12】 for (各ベーシック・ブロックについて実行とは逆順に命令を取り出す){ switch(命令){ 配列アクセス: 配列レンジ・チェックCに対して C_GEN[B] += C; break; 配列のベース変数 a の変更: for (全てのC∈ C_GEN[B]){ if (Cの中に変更された配列ベース a による lb(a)またはub(a)が含まれる){ C_GEN[B] -= C; } } break; インデックス v の変更: for (全てのC∈ C_GEN[B]){ if (Cは変更されたインデックス v 又は v の式 f(v) で構成される){ if (インデックス v が v = v + c (cは定数)で変更される){ Cの v を v + c、又はf(v)をf(v + c)として置き換える。 } else { C_GEN[B] -= C; } } } break; 例外を発生させる配列レンジ・チェックをそれより前に移動 することにより副作用を生じるような命令: C_GEN[B] = φ; break; } }
【0081】例外を発生させる配列レンジ・チェックが
それより前に移動することにより副作用を生じるような
命令(以下副作用命令と呼ぶ)の場合に、C_GEN
[B]を空φにする場合が追加されたことを除き、表8
に示された処理と同じである。このような条件が満たさ
れる場合には、配列レンジ・チェックを移動させること
ができないので、C_GEN[B]を空にする。
それより前に移動することにより副作用を生じるような
命令(以下副作用命令と呼ぶ)の場合に、C_GEN
[B]を空φにする場合が追加されたことを除き、表8
に示された処理と同じである。このような条件が満たさ
れる場合には、配列レンジ・チェックを移動させること
ができないので、C_GEN[B]を空にする。
【0082】ステップ220では、このC_GEN
[B]を用いて次の式によるデータフロー解析(Data-f
low Analysis)を実施し、C_OUT[B]を生成す
る。
[B]を用いて次の式によるデータフロー解析(Data-f
low Analysis)を実施し、C_OUT[B]を生成す
る。
【表13】 Bが終端のベーシック・ブロックでない場合には、S∈Succ(B)に対して、 C_OUT[B] = ∩ C_IN[S] 一方、Bが終端のベーシック・ブロックである場合には、 C_OUT[B] = φ if (Bの中に副作用命令がある){ C_IN[B] = C_GEN[B] } else { C_IN[B] = C_GEN[B] ∪ backward(C_OUT[B], B) } なお、backward(C_OUT[B],B)は表9に示したものと同じ
である。表13は、C_OUT[B]を求める際には、
Bが終端でない場合にはC_IN[S]の積集合を計算
し、Bが終端の場合にはC_OUT[B]を空にする必
要があることを示している。Sは上でも述べたがBの直
後の全てのベーシック・ブロックである。C_IN
[B]は、Bの中に副作用を生ずる命令が存在する場合
にはC_IN[B]=C_GEN[B]により、また副
作用を生ずる命令が存在しない場合にはC_IN[B]
=C_GEN[B]∪ backward(C_OUT[B], B)により求
められる。以上を図6にまとめておく。
である。表13は、C_OUT[B]を求める際には、
Bが終端でない場合にはC_IN[S]の積集合を計算
し、Bが終端の場合にはC_OUT[B]を空にする必
要があることを示している。Sは上でも述べたがBの直
後の全てのベーシック・ブロックである。C_IN
[B]は、Bの中に副作用を生ずる命令が存在する場合
にはC_IN[B]=C_GEN[B]により、また副
作用を生ずる命令が存在しない場合にはC_IN[B]
=C_GEN[B]∪ backward(C_OUT[B], B)により求
められる。以上を図6にまとめておく。
【0083】ステップ230はC_OUT[B]を基に
配列レンジ・チェックのためのコードを生成する処理で
ある。以下に擬似コードを示す。
配列レンジ・チェックのためのコードを生成する処理で
ある。以下に擬似コードを示す。
【表14】 for (各ベーシック・ブロックについて実行とは逆順に命令を取り出す){ switch(命令){ 配列アクセス: その配列レンジ・チェックCに対して exist = FALSE; for (全てのC'∈ C_OUT[B]){ if (C ⊆ C'){ exist = TRUE; if (C ⊂ C') { CをC'として配列レンジ・チェックのコードを生成。 break; } } } if (!exist){ C_OUT[B] += C; Cの配列レンジ・チェックのコードを生成。 break; } 配列のベース変数 a の変更: for (全てのC∈ C_OUT[B]){ if (Cの中に変更された配列ベース a による lb(a)またはub(a)が含まれる){ C_OUT[B] -= C; } } break; インデックス v の変更: for (全てのC∈ C_OUT[B]){ if (Cは変更されたインデックス v 又は v の式 f(v) で構成される){ if (インデックス v が i = i + c(cは正又は負の定数) で変更される){ Cの v を v + c、又はf(v)をf(v + c)として置換。 } else { C_OUT[B] -= C; } } } break; 副作用命令: C_OUT[B] = φ; break; } }
【0084】表14は表12に似ているが、最初のswit
chの条件である、取り出した命令が配列アクセスである
場合の処理内容が異なる。まず、existをFALSEに初期化
した後、C_OUT[B]内の全てのC'について処理
中の配列アクセスに対する配列レンジ・チェックCを検
査する。そして、C⊆C'であるならば、existをTRUEに
して、CがC_OUT[B]と重複関係があることを記
録する。そして、さらにC⊂C'であるならば(配列レ
ンジ・チェックCの範囲が、C_OUT[B]内のC'
の範囲より狭い場合)、ここでCの配列チェックをする
よりもC'の方が好ましいのでCをC'として配列レンジ
・チェックのためのコードを生成する。一方、いずれの
C'についてもC⊆C'でなければ、existはTRUEになら
ないので、このCにて配列レンジ・チェックのためのコ
ードを生成する。但し、ここでCについて配列レンジ・
チェックのためのコードを生成するので、以降同じ範囲
の配列レンジ・チェックを行わないようにするため、C
をC_OUT[B]に加える。
chの条件である、取り出した命令が配列アクセスである
場合の処理内容が異なる。まず、existをFALSEに初期化
した後、C_OUT[B]内の全てのC'について処理
中の配列アクセスに対する配列レンジ・チェックCを検
査する。そして、C⊆C'であるならば、existをTRUEに
して、CがC_OUT[B]と重複関係があることを記
録する。そして、さらにC⊂C'であるならば(配列レ
ンジ・チェックCの範囲が、C_OUT[B]内のC'
の範囲より狭い場合)、ここでCの配列チェックをする
よりもC'の方が好ましいのでCをC'として配列レンジ
・チェックのためのコードを生成する。一方、いずれの
C'についてもC⊆C'でなければ、existはTRUEになら
ないので、このCにて配列レンジ・チェックのためのコ
ードを生成する。但し、ここでCについて配列レンジ・
チェックのためのコードを生成するので、以降同じ範囲
の配列レンジ・チェックを行わないようにするため、C
をC_OUT[B]に加える。
【0085】以上のようにして配列レンジ・チェックが
最適化される。表10の例に本発明の最適化処理を施し
た例を以下に示しておく。C_GEN[B]は、表10
が副作用命令を含まないので、A.における処理結果と
同じである。一方、C_OUT[B]はステップ220
が異なるため、異なる。BB5は、終端ベーシック・ブロ
ックであるからC_OUT[BB5]は空である。そし
て、C_GEN[BB5]も空であるからC_IN[BB5]
も空である。BB4のC_OUT[BB4]も、C_OUT[B] =
∩ C_IN[S]の要件から空になる。しかし、C_GEN
[BB4]がlb(a) <= i-2, i+1 <= ub(a)であるから、C
_IN[BB4]もlb(a) <= i-2, i+1 <= ub(a)となる。
(1)配列ベース(2)配列インデックスのうちインデ
ックス変数を含む項(3)配列インデックスの最大定数
オフセット及び(4)配列インデックスの最小定数オフ
セットのように記憶装置に記憶する場合には、(1)a
(2)i(3)+1(4)−2となる。
最適化される。表10の例に本発明の最適化処理を施し
た例を以下に示しておく。C_GEN[B]は、表10
が副作用命令を含まないので、A.における処理結果と
同じである。一方、C_OUT[B]はステップ220
が異なるため、異なる。BB5は、終端ベーシック・ブロ
ックであるからC_OUT[BB5]は空である。そし
て、C_GEN[BB5]も空であるからC_IN[BB5]
も空である。BB4のC_OUT[BB4]も、C_OUT[B] =
∩ C_IN[S]の要件から空になる。しかし、C_GEN
[BB4]がlb(a) <= i-2, i+1 <= ub(a)であるから、C
_IN[BB4]もlb(a) <= i-2, i+1 <= ub(a)となる。
(1)配列ベース(2)配列インデックスのうちインデ
ックス変数を含む項(3)配列インデックスの最大定数
オフセット及び(4)配列インデックスの最小定数オフ
セットのように記憶装置に記憶する場合には、(1)a
(2)i(3)+1(4)−2となる。
【0086】C_OUT[BB3]はC_IN[BB4]のみ
から得られるので、C_OUT[BB3]もlb(a) <= i-2,
i+1 <= ub(a)となる。一方、C_IN[BB3]はC_G
EN[BB3]とbackward(C_OUT[BB3], BB3)から得られ
る。BB3には1(定数)の加算が含まれているので、lb
(a) <= i-2, i+1 <= ub(a)は、T={lb(a) <= i-1, i+
2 <= ub(a)}に修正される(先に示した記憶方法では、
(1)a(2)i(3)+2(4)−1)。C_GEN
[BB3]がlb(a) <= i-1, i+1 <= ub(a),lb(a) <= 5, 5
<= ub(a)であるから、最終的にC_IN[BB3]は、lb
(a) <= i-1, i+2<= ub(a),lb(a) <= 5, 5 <= ub(a)と
なる(先に示した記憶方法では(1)a(2)i(3)
+2(4)−1,(1)a(2)null(3)5(4)
5)。
から得られるので、C_OUT[BB3]もlb(a) <= i-2,
i+1 <= ub(a)となる。一方、C_IN[BB3]はC_G
EN[BB3]とbackward(C_OUT[BB3], BB3)から得られ
る。BB3には1(定数)の加算が含まれているので、lb
(a) <= i-2, i+1 <= ub(a)は、T={lb(a) <= i-1, i+
2 <= ub(a)}に修正される(先に示した記憶方法では、
(1)a(2)i(3)+2(4)−1)。C_GEN
[BB3]がlb(a) <= i-1, i+1 <= ub(a),lb(a) <= 5, 5
<= ub(a)であるから、最終的にC_IN[BB3]は、lb
(a) <= i-1, i+2<= ub(a),lb(a) <= 5, 5 <= ub(a)と
なる(先に示した記憶方法では(1)a(2)i(3)
+2(4)−1,(1)a(2)null(3)5(4)
5)。
【0087】C_OUT[BB2]はC_IN[BB4]及び
C_IN[BB3]の積集合から得られる。C_IN[BB
4]はlb(a) <= i-2, i+1 <= ub(a)、C_IN[BB3]は
lb(a) <= i-1, i+2 <= ub(a),lb(a) <= 5, 5 <= ub(a)
であるから、C_OUT[BB2]はlb(a) <= i-1, i+1 <
= ub(a)となる(先に示した記憶方法では(1)a
(2)i(3)+1(4)ー1)。一方、C_IN[BB
2]は、C_GEN[BB2]とbackward(C_OUT[BB2],BB
2)の和集合となる。backward(C_OUT[BB2],BB2)は、BB2
に1(定数)の加算操作を含むので、lb(a) <= i, i+2
<= ub(a)となる(先に示した記憶方法では(1)a
(2)i(3)+2(4)0)。C_GEN[BB2]はl
b(a) <= i-1, i+1 <= ub(a)であるから、最終的にC_
IN[BB2]はlb(a) <= i-1, i+2 <= ub(a)となる(先
に示した記憶方法では(1)a(2)i(3)+2
(4)−1)。
C_IN[BB3]の積集合から得られる。C_IN[BB
4]はlb(a) <= i-2, i+1 <= ub(a)、C_IN[BB3]は
lb(a) <= i-1, i+2 <= ub(a),lb(a) <= 5, 5 <= ub(a)
であるから、C_OUT[BB2]はlb(a) <= i-1, i+1 <
= ub(a)となる(先に示した記憶方法では(1)a
(2)i(3)+1(4)ー1)。一方、C_IN[BB
2]は、C_GEN[BB2]とbackward(C_OUT[BB2],BB
2)の和集合となる。backward(C_OUT[BB2],BB2)は、BB2
に1(定数)の加算操作を含むので、lb(a) <= i, i+2
<= ub(a)となる(先に示した記憶方法では(1)a
(2)i(3)+2(4)0)。C_GEN[BB2]はl
b(a) <= i-1, i+1 <= ub(a)であるから、最終的にC_
IN[BB2]はlb(a) <= i-1, i+2 <= ub(a)となる(先
に示した記憶方法では(1)a(2)i(3)+2
(4)−1)。
【0088】C_OUT[BB1]はC_IN[BB2]から
得られる。よって、C_OUT[BB1]はlb(a) <= i-1,
i+2 <= ub(a)となる(先に示した記憶方法では(1)
a(2)i(3)+2(4)−1)。C_IN[BB1]
はC_GEN[BB1]とbackward(C_OUT[BB1], BB1)の和
集合になる。しかし、C_GEN[BB1]は空であり、B
ackward処理の中でBB1にはiの定数代入(i=0)があ
るので、C_OUT[BB1]の全てのCは除去されてT
は空になる。よって、C_IN[BB1]は空となる。以
下、上の処理結果をまとめておく。
得られる。よって、C_OUT[BB1]はlb(a) <= i-1,
i+2 <= ub(a)となる(先に示した記憶方法では(1)
a(2)i(3)+2(4)−1)。C_IN[BB1]
はC_GEN[BB1]とbackward(C_OUT[BB1], BB1)の和
集合になる。しかし、C_GEN[BB1]は空であり、B
ackward処理の中でBB1にはiの定数代入(i=0)があ
るので、C_OUT[BB1]の全てのCは除去されてT
は空になる。よって、C_IN[BB1]は空となる。以
下、上の処理結果をまとめておく。
【0089】次にステップ230の処理を実施する。ま
ず、C_OUT[BB1]を用いてBB1を処理する。しか
し、BB1には配列アクセスがないので、配列レンジ・チ
ェックのためのコードは生成されない。次にC_OUT
[BB2]を用いてBB2を処理する。BB2には配列アクセス
が存在する。本発明適用前には、check(i<=ub(a))及びc
heck(i-2>=lb(a))が必要であった。しかし、C_OUT
[BB2]のi+1<= ub(a)の方がi<=ub(a)よりも広い範囲を
カバーすることになるので、check(i<=ub(a))はcheck(i
+1<=ub(a))で置換される。また、C_OUT[BB3]を
用いてBB3を処理する場合、本発明適用前には、check(i
<= ub(a))、check(lb(a) <= i-2)、check(lb(a) <=
5)、及びcheck(5 <= ub(a))が必要であった。しかし、
C_OUT[BB3]内のi+1 <= ub(a)はcheck(i <= ub
(a))より広い範囲をカバーするので、このcheck(i <= u
b(a))をcheck(i+1 <= ub(a))に置換してコードを生成す
る。BB3には配列インデックス変数を定数で加算する操
作が含まれるが、実行とは逆順でその操作の後に配列ア
クセスが存在しないので影響はない。次にC_OUT
[BB4]を用いてBB4を処理するが、C_OUT[BB4]
が空であるから、本発明の適用前と同じ状態になる。BB
5についても処理は必要ない。以下表15に表10に対
し本処理を実施した結果を示す。なお、表15は本発明
の適用結果がわかるように示しているものであって、現
実には実行可能コードが生成される。
ず、C_OUT[BB1]を用いてBB1を処理する。しか
し、BB1には配列アクセスがないので、配列レンジ・チ
ェックのためのコードは生成されない。次にC_OUT
[BB2]を用いてBB2を処理する。BB2には配列アクセス
が存在する。本発明適用前には、check(i<=ub(a))及びc
heck(i-2>=lb(a))が必要であった。しかし、C_OUT
[BB2]のi+1<= ub(a)の方がi<=ub(a)よりも広い範囲を
カバーすることになるので、check(i<=ub(a))はcheck(i
+1<=ub(a))で置換される。また、C_OUT[BB3]を
用いてBB3を処理する場合、本発明適用前には、check(i
<= ub(a))、check(lb(a) <= i-2)、check(lb(a) <=
5)、及びcheck(5 <= ub(a))が必要であった。しかし、
C_OUT[BB3]内のi+1 <= ub(a)はcheck(i <= ub
(a))より広い範囲をカバーするので、このcheck(i <= u
b(a))をcheck(i+1 <= ub(a))に置換してコードを生成す
る。BB3には配列インデックス変数を定数で加算する操
作が含まれるが、実行とは逆順でその操作の後に配列ア
クセスが存在しないので影響はない。次にC_OUT
[BB4]を用いてBB4を処理するが、C_OUT[BB4]
が空であるから、本発明の適用前と同じ状態になる。BB
5についても処理は必要ない。以下表15に表10に対
し本処理を実施した結果を示す。なお、表15は本発明
の適用結果がわかるように示しているものであって、現
実には実行可能コードが生成される。
【表15】 i = 1; t = 0; do { i++; check(lb(a) <= i-2); check(i+1 <= ub(a)); /*check(i <= ub(a))の置換後*/ t += a[i] + a[i-1] + a[i-2]; if (t < 0) { i++; check(lb(a) <= i-2); check(i+1 <= ub(a)); /* check(i <= ub(a))の置換後*/ check(lb(a) <= 5); /* lb(a)が5以下の言語はこのチェックは必要ない */ check(5 <= ub(a)); t += a[i] + a[i-1] + a[i-2] + a[5]; } i++; check(lb(a) <= i-3); check(i <= ub(a)); t += a[i] + a[i-1] + a[i-2] + a[i-3]; } while(i < n);
【0090】C.データ・フロー解析を実行順に行って
配列レンジ・チェック済の情報を取得し、この情報から
不要な配列レンジ・チェックを除去する部分 図7に本処理の概要を示す。まず、各ベーシック・ブロ
ック内において、実行の順番で、所定の条件に従ってチ
ェック済みとして取り扱われる配列レンジ・チェックの
集合C_GEN[B]を収集する(ステップ310)。
このC_GEN[B]は記憶装置に記憶される。そし
て、プログラムのデータフロー解析の順番で、C_GE
N[B]を第2の条件で修正しつつ伝搬させ、各ベーシ
ック・ブロックの先頭においてチェック済みとして取り
扱われる配列レンジ・チェックの集合C_IN[B]を
生成する(ステップ320)。C_IN[B]は記憶装
置に記憶される。そして、最後に、各ベーシック・ブロ
ック内において、実行順番に各命令をたどり、C_IN
[B]を第3の条件で修正し、C_IN[B]を用いて
配列レンジ・チェックを除去する(ステップ330)。
配列レンジ・チェック済の情報を取得し、この情報から
不要な配列レンジ・チェックを除去する部分 図7に本処理の概要を示す。まず、各ベーシック・ブロ
ック内において、実行の順番で、所定の条件に従ってチ
ェック済みとして取り扱われる配列レンジ・チェックの
集合C_GEN[B]を収集する(ステップ310)。
このC_GEN[B]は記憶装置に記憶される。そし
て、プログラムのデータフロー解析の順番で、C_GE
N[B]を第2の条件で修正しつつ伝搬させ、各ベーシ
ック・ブロックの先頭においてチェック済みとして取り
扱われる配列レンジ・チェックの集合C_IN[B]を
生成する(ステップ320)。C_IN[B]は記憶装
置に記憶される。そして、最後に、各ベーシック・ブロ
ック内において、実行順番に各命令をたどり、C_IN
[B]を第3の条件で修正し、C_IN[B]を用いて
配列レンジ・チェックを除去する(ステップ330)。
【0091】ではステップ310について説明する。こ
こでは配列ベースを変更する命令を本発明の対象外とす
る。一方、配列インデックス変数の正又は負の定数によ
る加算命令が含まれていても、当該配列インデックス変
数に関連する配列レンジ・チェックは本発明の対象であ
るとして取り扱う。それ以外の変更命令に関連する配列
レンジ・チェックは本発明の対象外である。このような
条件の下、ベーシック・ブロック内でチェック済みとし
て取り扱われる配列レンジ・チェックの集合C_GEN
[B]を実行順に収集する。なお、配列インデックス変
数iをi+c(cは正又は負の定数)のように変更する
場合には、C_GEN[B]の配列インデックスの式f
(i)をf(i−c)として配列レンジ・チェックの情
報を更新する。以下、この処理の擬似コードを示す。
こでは配列ベースを変更する命令を本発明の対象外とす
る。一方、配列インデックス変数の正又は負の定数によ
る加算命令が含まれていても、当該配列インデックス変
数に関連する配列レンジ・チェックは本発明の対象であ
るとして取り扱う。それ以外の変更命令に関連する配列
レンジ・チェックは本発明の対象外である。このような
条件の下、ベーシック・ブロック内でチェック済みとし
て取り扱われる配列レンジ・チェックの集合C_GEN
[B]を実行順に収集する。なお、配列インデックス変
数iをi+c(cは正又は負の定数)のように変更する
場合には、C_GEN[B]の配列インデックスの式f
(i)をf(i−c)として配列レンジ・チェックの情
報を更新する。以下、この処理の擬似コードを示す。
【表16】 for (各ベーシック・ブロックについて実行順に命令を取り出す){ switch(命令){ 配列アクセス命令: その配列レンジ・チェックCに対し C_GEN[B] += C; C_GEN[B] += Cの拡張; break; 配列のベース変数 a の変更: for (全てのC∈ C_GEN[B]){ if (Cの中に変更された配列ベース a による lb(a)またはub(a)が含まれる){ C_GEN[B] -= C; } } break; インデックス v の変更: for (全てのC∈ C_GEN[B]){ if (Cは変更されたインデックス v 又は v の式 f(v) で構成される){ if (インデックス v が i = i + c (cは正又は負の定数)で変更される){ C内の v を v - c、又はf(v)をf(v - c)として置き換える。 } else { C_GEN[B] -= C; } } } break; } }
【0092】上で述べたA.及びB.とは異なり、ステ
ップ310では実行の順番で各ベーシック・ブロックの
命令を走査していく。そして、配列アクセス命令である
場合には、当該配列アクセスの配列レンジ・チェックC
をC_GEN[B]に入れる。可能であれば、Cの拡張
についてもC_GEN[B]に入れる。この拡張は以下
のようなものである。 (1)配列インデックスの最小定数オフセット値及び最
大定数オフセット値及び配列の下限から計算される範囲
の配列レンジ・チェック。すなわち、(配列の下限,配
列の下限+(最大定数オフセット値−最小定数オフセッ
ト値))の定数インデックスの範囲がチェック済みであ
るとされる。例えば、Java言語でa[i-1]、a[i+1]が
配列レンジ・チェック済みである場合には、定数インデ
ックスに関してa[0]からa[2]もチェック済みであるとし
てC_GEN[B]に加える。 (2)配列の下限及び配列インデックス変数の下限値及
び上限値から計算される範囲の配列レンジ・チェック次
のいずれかの条件を満たし、下限値又は上限値を基に計
算したインデックスの式の値が配列の下限以上の値をと
る時に、(配列の下限,変数の下限値又は上限値を基に
計算したインデックスの式の値)の定数インデックスの
範囲がチェック済みであるとされる。 条件: インデックスの式が単調増加し、インデックス変数の下
限値が分かるとき インデックスの式が単調減少し、インデックス変数の上
限値が分かるとき 例えばJava言語で配列アクセスがa[2*i+1]という形
で行われ、iの下限値が5であと分かった場合には、こ
のチェックが行われた時点でa[0]からa[13]までもチェ
ック済みであるとしてC_GEN[B]に追加する。ま
た、配列アクセスがa[10-i]という形であり、iの上限
値が5であることが分かった場合には、このチェックが
行われた時点でa[0]からa[5]までもチェック済みである
としてC_GEN[B]に加える。
ップ310では実行の順番で各ベーシック・ブロックの
命令を走査していく。そして、配列アクセス命令である
場合には、当該配列アクセスの配列レンジ・チェックC
をC_GEN[B]に入れる。可能であれば、Cの拡張
についてもC_GEN[B]に入れる。この拡張は以下
のようなものである。 (1)配列インデックスの最小定数オフセット値及び最
大定数オフセット値及び配列の下限から計算される範囲
の配列レンジ・チェック。すなわち、(配列の下限,配
列の下限+(最大定数オフセット値−最小定数オフセッ
ト値))の定数インデックスの範囲がチェック済みであ
るとされる。例えば、Java言語でa[i-1]、a[i+1]が
配列レンジ・チェック済みである場合には、定数インデ
ックスに関してa[0]からa[2]もチェック済みであるとし
てC_GEN[B]に加える。 (2)配列の下限及び配列インデックス変数の下限値及
び上限値から計算される範囲の配列レンジ・チェック次
のいずれかの条件を満たし、下限値又は上限値を基に計
算したインデックスの式の値が配列の下限以上の値をと
る時に、(配列の下限,変数の下限値又は上限値を基に
計算したインデックスの式の値)の定数インデックスの
範囲がチェック済みであるとされる。 条件: インデックスの式が単調増加し、インデックス変数の下
限値が分かるとき インデックスの式が単調減少し、インデックス変数の上
限値が分かるとき 例えばJava言語で配列アクセスがa[2*i+1]という形
で行われ、iの下限値が5であと分かった場合には、こ
のチェックが行われた時点でa[0]からa[13]までもチェ
ック済みであるとしてC_GEN[B]に追加する。ま
た、配列アクセスがa[10-i]という形であり、iの上限
値が5であることが分かった場合には、このチェックが
行われた時点でa[0]からa[5]までもチェック済みである
としてC_GEN[B]に加える。
【0093】配列のベース変数aの変更の処理は上の
A.及びB.の場合と変わりない。配列インデックス変
数vの変更処理は上で述べたA.及びB.の場合とは異
なる。当該配列レンジ・チェックがv又はf(v)で表
され且つ正又は負の定数による加算又は減算による場合
のみC_GEN[B]に含めておくことができる。すな
わち、正又は負の定数による加算でない場合には、変更
される配列インデックス変数vに関連するC_GEN
[B]の要素はC_GEN[B]から除去される。一
方、正又は負の定数による加算の場合には、その変更と
は反対に当該定数による減算がC_GEN[B]内の関
係する配列レンジ・チェックに対して実施される。すな
わち、変更がv+cの場合には、配列レンジ・チェック
Cのv又はf(v)がv−c又はf(v−c)に置換さ
れる。
A.及びB.の場合と変わりない。配列インデックス変
数vの変更処理は上で述べたA.及びB.の場合とは異
なる。当該配列レンジ・チェックがv又はf(v)で表
され且つ正又は負の定数による加算又は減算による場合
のみC_GEN[B]に含めておくことができる。すな
わち、正又は負の定数による加算でない場合には、変更
される配列インデックス変数vに関連するC_GEN
[B]の要素はC_GEN[B]から除去される。一
方、正又は負の定数による加算の場合には、その変更と
は反対に当該定数による減算がC_GEN[B]内の関
係する配列レンジ・チェックに対して実施される。すな
わち、変更がv+cの場合には、配列レンジ・チェック
Cのv又はf(v)がv−c又はf(v−c)に置換さ
れる。
【0094】このように反対の変更を実施しなければな
らないのは、命令をたどる方向が異なるからである。上
で述べたA.及びB.の場合には実行とは逆順であった
ので、例えばi++という変更がC_GEN[B]に収
集されたi≦ub(a)より上(前)に存在している場
合には、このi≦ub(a)のiはそのベーシック・ブ
ロックの先頭から見るとi+1になる。一方、ここでは
実行順に命令をたどるので、例えばi++という変更が
C_GEN[B]に収集されたi≦ub(a)より下
(後)に存在している場合には、このi≦ub(a)の
iをそのベーシック・ブロックの後端から見るとi−1
になる。よってこのような取扱いの差が生じるのであ
る。
らないのは、命令をたどる方向が異なるからである。上
で述べたA.及びB.の場合には実行とは逆順であった
ので、例えばi++という変更がC_GEN[B]に収
集されたi≦ub(a)より上(前)に存在している場
合には、このi≦ub(a)のiはそのベーシック・ブ
ロックの先頭から見るとi+1になる。一方、ここでは
実行順に命令をたどるので、例えばi++という変更が
C_GEN[B]に収集されたi≦ub(a)より下
(後)に存在している場合には、このi≦ub(a)の
iをそのベーシック・ブロックの後端から見るとi−1
になる。よってこのような取扱いの差が生じるのであ
る。
【0095】次にステップ320を説明する。ここでは
上で収集したC_GEN[B]を用いて次の式によるデ
ータ・フロー解析(data-flow analysis)を行う。 全てのP∈Pred(B)について、Bが初期ブロックでない
場合、 C_IN[B] = ∩ C_OUT[P] Bが初期ブロックである場合、 C_IN[B] = φ C_OUT[B] = C_GEN[B] ∪ forward(C_IN[B], B) なお、Pred(B)は、Bの直前にくるベーシック・ブロッ
クPを示すものである。また、forward(C_IN[B], B)は
以下に詳述する。上の式でC_IN[B]は、そのベー
シック・ブロックBの直前のベーシック・ブロックPの
C_OUT[P]の積集合となることを示している。但
し、Bがプログラムの先頭のベーシック・ブロックであ
る場合には、C_IN[B]は空である。そして、この
C_IN[B]をもちいて、C_OUT[B]が求めら
れる。すなわち、C_OUT[B]=C_GEN[B]
∪ forward((C_IN[B], B)である。これを図8にまとめ
ておく。
上で収集したC_GEN[B]を用いて次の式によるデ
ータ・フロー解析(data-flow analysis)を行う。 全てのP∈Pred(B)について、Bが初期ブロックでない
場合、 C_IN[B] = ∩ C_OUT[P] Bが初期ブロックである場合、 C_IN[B] = φ C_OUT[B] = C_GEN[B] ∪ forward(C_IN[B], B) なお、Pred(B)は、Bの直前にくるベーシック・ブロッ
クPを示すものである。また、forward(C_IN[B], B)は
以下に詳述する。上の式でC_IN[B]は、そのベー
シック・ブロックBの直前のベーシック・ブロックPの
C_OUT[P]の積集合となることを示している。但
し、Bがプログラムの先頭のベーシック・ブロックであ
る場合には、C_IN[B]は空である。そして、この
C_IN[B]をもちいて、C_OUT[B]が求めら
れる。すなわち、C_OUT[B]=C_GEN[B]
∪ forward((C_IN[B], B)である。これを図8にまとめ
ておく。
【0096】A.の処理と組み合わせてC.の実施する
場合には、次の式によるデータ・ブロー解析を行う。な
お、VERSION_OR[B]はA.の処理で作成し
たものを使用する。 全てのP∈Pred(B)について、Bが初期ブロックでない
場合、 C_IN[B] = (∩ C_OUT[P])∪VERSION_OR[B] Bが初期ブロックである場合、 C_IN[B] = VERSION_OR[B] C_OUT[B] = C_GEN[B] ∪ forward(C_IN[B], B)
場合には、次の式によるデータ・ブロー解析を行う。な
お、VERSION_OR[B]はA.の処理で作成し
たものを使用する。 全てのP∈Pred(B)について、Bが初期ブロックでない
場合、 C_IN[B] = (∩ C_OUT[P])∪VERSION_OR[B] Bが初期ブロックである場合、 C_IN[B] = VERSION_OR[B] C_OUT[B] = C_GEN[B] ∪ forward(C_IN[B], B)
【0097】ではforward(C_IN[B], B)を擬似コードで
表17に示す。
表17に示す。
【表17】 forward(C_IN[B], B){ T = 0; for each check C ∈ C_IN[B] do case C of lb <= v: case AFFECT(B, v) of unchanged: T = T ∪ { lb <= v } increment: if 加算する値 c が定数 then T = T ∪ { lb <= v - c } else T = T ∪ { lb <= v } decrement: if 減算する値 c が定数 then T = T ∪ { lb <= v + c } /* そうでなければTに入れない */ multiply: T = T ∪ { lb <= v } div > 1: /* Tに入れない */ div < 1: T = T ∪ { lb <= v } changed: /* Tに入れない */ end case v <= ub: case AFFECT(B, v) of unchanged: T = T ∪ { v <= ub } increment: if 加算する値 c が定数 then T = T ∪ { v - c <= ub } /* そうでなければTに入れない */ decrement: if 減算する値 c が定数 then T = T ∪ { v + c <= ub } else T = T ∪ { v <= ub } multiply: /* Tには入れない */ div > 1: T = T ∪ { v <= ub } div < 1: /* Tには入れない */ changed: /* Tには入れない */ end case lb <= f(v): case AFFECT(B, v) of unchanged: T = T ∪ { lb <= f(v) } increment: if f(v)が単調な関数 and 加算する値 c が定数 then T = T ∪ { lb <= f( v - c ) } else if vが増加するとf(v)も増加 then T = T ∪ { lb <= f(v) } decrement: if f(v)が単調な関数 and 減算する値 c が定数 then T = T ∪ { lb <= f( v + c ) } else if vが減少するとf(v)が増加 then T = T ∪ { lb <= f(v) } /* そうでなければTに入れない */ multiply, div < 1: if vが増加するとf(v)も増加 then T = T ∪ { lb <= f(v) } div > 1: if vが減少するとf(v)は増加 then T = T ∪ { lb <= f(v) } changed: /* Tに入れない */ end case f(v) <= ub: case AFFECT(B, v) of unchanged: T = T ∪ { f(v) <= ub } increment: if f(v)が単調な関数 and 加算する値 c が定数 then T = T ∪ { f( v - c ) <= ub } else if vが増加するとf(v)は減少 then T = T ∪ { f(v) <= ub } decrement: if f(v)が単調な関数 and 減算する値 c が定数 then T = T ∪ { f( v + c ) <= ub }
else if vが減少するとf(v)も減少 then T = T ∪ { f(v) <= ub } /* そうでなければTに入れない */ multiply, div < 1: if vが増加するとf(v)は減少 then T = T ∪ { f(v) <= ub } div > 1: if vが減少するとf(v)も減少 then T = T ∪ { f(v) <= ub } changed: /* Tに入れない */ end case end case } return(T) }
else if vが減少するとf(v)も減少 then T = T ∪ { f(v) <= ub } /* そうでなければTに入れない */ multiply, div < 1: if vが増加するとf(v)は減少 then T = T ∪ { f(v) <= ub } div > 1: if vが減少するとf(v)も減少 then T = T ∪ { f(v) <= ub } changed: /* Tに入れない */ end case end case } return(T) }
【0098】forward(C_IN[B], B)の最終的な出力はT
である。forward(C_IN[B], B)はC_IN[B]に含ま
れる配列レンジ・チェックの形式により大きく4つの部
分に分けられる。すなわち、配列インデックス変数vに
ついて、lb≦v(配列の下限)の形式の場合、v≦u
b(配列の上限)の場合、lb≦f(v)の場合、f
(v)≦ubの場合である。そして、それぞれの場合の
中で、配列インデックス変数vに対する操作(AFFECT
(B, v))によってさらに場合分けされる。以下それぞれ
の場合について説明する。
である。forward(C_IN[B], B)はC_IN[B]に含ま
れる配列レンジ・チェックの形式により大きく4つの部
分に分けられる。すなわち、配列インデックス変数vに
ついて、lb≦v(配列の下限)の形式の場合、v≦u
b(配列の上限)の場合、lb≦f(v)の場合、f
(v)≦ubの場合である。そして、それぞれの場合の
中で、配列インデックス変数vに対する操作(AFFECT
(B, v))によってさらに場合分けされる。以下それぞれ
の場合について説明する。
【0099】(1)lb≦vの場合 配列インデックス変数vに何等の操作も実施しない場合
(unchanged)には、lb≦vをそのままTに入れる。
配列インデックス変数vを増加させる操作を実施する場
合(increment)、加算する値cが定数であるならばl
b≦v−cをTに入れる。もしcが定数でない場合には
lb≦vをTに入れる。配列インデックス変数vを減少
させる操作を実施する場合(decrement)、減算する値
cが定数であるならばlb≦v+cをTに入れる。cが
定数でなければ、その配列レンジ・チェックをTには入
れない。配列インデックス変数vを掛け算する場合(mu
ltiply)には、lb≦vをTに入れる。配列インデック
ス変数vを1より大きい値で割り算する場合(div>1)
には、その配列レンジ・チェックをTに入れない。配列
インデックス変数vを1より小さな値で割り算する場合
(div<1)には、lb≦vをTに入れる。以上述べた操
作以外の操作を配列インデックス変数vに行う場合(ch
anged)には、その配列レンジ・チェックをTには入れ
ない。
(unchanged)には、lb≦vをそのままTに入れる。
配列インデックス変数vを増加させる操作を実施する場
合(increment)、加算する値cが定数であるならばl
b≦v−cをTに入れる。もしcが定数でない場合には
lb≦vをTに入れる。配列インデックス変数vを減少
させる操作を実施する場合(decrement)、減算する値
cが定数であるならばlb≦v+cをTに入れる。cが
定数でなければ、その配列レンジ・チェックをTには入
れない。配列インデックス変数vを掛け算する場合(mu
ltiply)には、lb≦vをTに入れる。配列インデック
ス変数vを1より大きい値で割り算する場合(div>1)
には、その配列レンジ・チェックをTに入れない。配列
インデックス変数vを1より小さな値で割り算する場合
(div<1)には、lb≦vをTに入れる。以上述べた操
作以外の操作を配列インデックス変数vに行う場合(ch
anged)には、その配列レンジ・チェックをTには入れ
ない。
【0100】(2)v≦ubの場合 配列インデックス変数vに何等の操作も実施しない場合
(unchanged)には、v≦ubをTに入れる。配列イン
デックス変数vを増加させる操作を実施する場合(incr
ement)には、加算する値cが定数であるならばv−c
≦ubをTに入れる。cが定数でない場合にはその配列
レンジ・チェックをTには入れない。配列インデックス
変数vを減少させる操作を実施する場合(decrement)
には、減算する値cが定数であるならばv+c≦ubを
Tに入れる。cが定数でない場合にはv≦ubをTに入
れる。配列インデックス変数vを掛け算する場合(mult
iply)には、その配列レンジ・チェックをTには入れな
い。配列インデックス変数vを1より大きな値で割り算
する場合(div>1)には、v≦ubをTに入れる。配列
インデックス変数vを1より小さな値で割り算する場合
(div<1)には、その配列レンジ・チェックをTには入
れない。以上述べた操作以外の操作を配列インデックス
変数vに行う場合(changed)には、その配列レンジ・
チェックをTには入れない。
(unchanged)には、v≦ubをTに入れる。配列イン
デックス変数vを増加させる操作を実施する場合(incr
ement)には、加算する値cが定数であるならばv−c
≦ubをTに入れる。cが定数でない場合にはその配列
レンジ・チェックをTには入れない。配列インデックス
変数vを減少させる操作を実施する場合(decrement)
には、減算する値cが定数であるならばv+c≦ubを
Tに入れる。cが定数でない場合にはv≦ubをTに入
れる。配列インデックス変数vを掛け算する場合(mult
iply)には、その配列レンジ・チェックをTには入れな
い。配列インデックス変数vを1より大きな値で割り算
する場合(div>1)には、v≦ubをTに入れる。配列
インデックス変数vを1より小さな値で割り算する場合
(div<1)には、その配列レンジ・チェックをTには入
れない。以上述べた操作以外の操作を配列インデックス
変数vに行う場合(changed)には、その配列レンジ・
チェックをTには入れない。
【0101】(3)lb≦f(v)の場合 配列インデックス変数vに何等の操作も実施しない場合
(unchanged)には、lb≦f(v)をそのままTに入
れる。配列インデックス変数vを増加させる操作を実施
する場合(increment)には、f(v)が単調な関数で
あり且つ加算する値cが定数であれば、lb≦f(v−
c)をTに入れる。この条件が当てはまらない場合であ
ってvが増加するとf(v)も増加するならば、lb≦
f(v)をTに入れる。配列インデックス変数vを減少
させる操作を実施する場合(decrement)には、f
(v)が単調な関数であって減算する値cが定数なら
ば、lb≦f(v+c)をTに入れる。上の条件が満た
されない場合であってvが減少するとf(v)が増加す
る場合には、lb≦f(v)をTに入れる。そうでない
場合には、その配列レンジ・チェックをTには入れな
い。配列インデックス変数vを掛け算する場合(multip
ly)及び1より小さな値で割り算する場合(div<1)、
vが増加するとf(v)も増加するならば、lb≦f
(v)をTに入れる。配列インデックス変数vを1より
大きな値で割り算する場合(div>1)には、vが減少す
るとf(v)が増加するならば、lb≦f(v)をTに
入れる。以上の操作以外の操作を配列インデックス変数
vに施す場合(changed)には、その配列レンジ・チェ
ックをTには入れない。
(unchanged)には、lb≦f(v)をそのままTに入
れる。配列インデックス変数vを増加させる操作を実施
する場合(increment)には、f(v)が単調な関数で
あり且つ加算する値cが定数であれば、lb≦f(v−
c)をTに入れる。この条件が当てはまらない場合であ
ってvが増加するとf(v)も増加するならば、lb≦
f(v)をTに入れる。配列インデックス変数vを減少
させる操作を実施する場合(decrement)には、f
(v)が単調な関数であって減算する値cが定数なら
ば、lb≦f(v+c)をTに入れる。上の条件が満た
されない場合であってvが減少するとf(v)が増加す
る場合には、lb≦f(v)をTに入れる。そうでない
場合には、その配列レンジ・チェックをTには入れな
い。配列インデックス変数vを掛け算する場合(multip
ly)及び1より小さな値で割り算する場合(div<1)、
vが増加するとf(v)も増加するならば、lb≦f
(v)をTに入れる。配列インデックス変数vを1より
大きな値で割り算する場合(div>1)には、vが減少す
るとf(v)が増加するならば、lb≦f(v)をTに
入れる。以上の操作以外の操作を配列インデックス変数
vに施す場合(changed)には、その配列レンジ・チェ
ックをTには入れない。
【0102】(4)f(v)≦ubの場合 配列インデックス変数vに何等の操作も施さない場合
(unchanged)には、f(v)≦ubをそのままTに入
れる。配列インデックス変数vを増加させる操作を実施
する場合(increment)には、f(v)が単調な関数で
あって加算する値cが定数ならば、f(v−c)≦ub
をTに入れる。上の条件が満たされない場合には、vが
増加するとf(v)が減少するならば、f(v)≦ub
をTに入れる。配列インデックス変数vを減少させる操
作を実施する場合(decrement)には、f(v)が単調
な関数であって減算する値cが定数ならば、f(v+
c)≦ubをTに入れる。上の条件が満たされない場合
には、vが減少するとf(v)も減少するならば、f
(v)≦ubをTに入れる。そうでなければ、その配列
レンジ・チェックをTには入れない。配列インデックス
vに掛け算を実施する場合(multiply)及び1より小さ
な値で割り算する場合(div<1)、vが増加するとf
(v)が減少するならば、f(v)≦ubをTに入れ
る。配列インデックス変数vを1より大きな値で割り算
する場合には、vが減少するとf(v)も減少するなら
ば、f(v)≦ubをTに入れる。以上の操作以外の操
作を実施する場合(changed)には、その配列レンジ・
チェックをTには入れない。
(unchanged)には、f(v)≦ubをそのままTに入
れる。配列インデックス変数vを増加させる操作を実施
する場合(increment)には、f(v)が単調な関数で
あって加算する値cが定数ならば、f(v−c)≦ub
をTに入れる。上の条件が満たされない場合には、vが
増加するとf(v)が減少するならば、f(v)≦ub
をTに入れる。配列インデックス変数vを減少させる操
作を実施する場合(decrement)には、f(v)が単調
な関数であって減算する値cが定数ならば、f(v+
c)≦ubをTに入れる。上の条件が満たされない場合
には、vが減少するとf(v)も減少するならば、f
(v)≦ubをTに入れる。そうでなければ、その配列
レンジ・チェックをTには入れない。配列インデックス
vに掛け算を実施する場合(multiply)及び1より小さ
な値で割り算する場合(div<1)、vが増加するとf
(v)が減少するならば、f(v)≦ubをTに入れ
る。配列インデックス変数vを1より大きな値で割り算
する場合には、vが減少するとf(v)も減少するなら
ば、f(v)≦ubをTに入れる。以上の操作以外の操
作を実施する場合(changed)には、その配列レンジ・
チェックをTには入れない。
【0103】ステップ330の処理はC_IN[B]を
基に次のようなアルゴリズムで行う。
基に次のようなアルゴリズムで行う。
【表18】 for (各ベーシック・ブロックについて実行順に命令を取り出す){ switch(命令){ 配列アクセス命令: その配列レンジ・チェックCに対して if (CがC_IN[B]からチェック済と判断できる){ 配列レンジ・チェックCを除去 } else { C_IN[B] += C; } break; 配列のベース変数 a の変更: for (全てのC∈ C_IN[B]){ if (Cの中に変更された配列ベース a による lb(a)またはub(a)が含まれる){ C_IN[B] -= C; } } break; インデックス v の変更: for (全てのC∈ C_IN[B]){ if (Cは変更されたインデックス v 又は v の式 f(v) で構成される){ if (インデックス v が i = i + c (cは正又は負の定数)で変更される){ v を v - c、又はf(v)をf(v - c)として置き換える。 } else { C_IN[B] -= C; } } } break; } }
【0104】表18が表16と異なる部分は、取り出し
た配列アクセス命令の場合の処理である。ここでは、当
該配列アクセスの配列レンジ・チェックCがC_IN
[B]からチェック済みであると判断できる場合には、
当該配列レンジ・チェックCを除去対象として選択す
る。そうでなければ配列レンジ・チェックが必要である
からその配列レンジ・チェックは残す。但し、残した場
合には後の配列レンジ・チェックを除去するのに用いる
ことができるので当該配列レンジ・チェックCをC_I
N[B]に入れる。ところで、C_IN[B]からチェ
ック済であると判断できる場合とは、C_IN[B]の
配列レンジ・チェックに直接包含される場合される場合
に限定されない。以下の場合も、除去対象として選択す
ることができる。
た配列アクセス命令の場合の処理である。ここでは、当
該配列アクセスの配列レンジ・チェックCがC_IN
[B]からチェック済みであると判断できる場合には、
当該配列レンジ・チェックCを除去対象として選択す
る。そうでなければ配列レンジ・チェックが必要である
からその配列レンジ・チェックは残す。但し、残した場
合には後の配列レンジ・チェックを除去するのに用いる
ことができるので当該配列レンジ・チェックCをC_I
N[B]に入れる。ところで、C_IN[B]からチェ
ック済であると判断できる場合とは、C_IN[B]の
配列レンジ・チェックに直接包含される場合される場合
に限定されない。以下の場合も、除去対象として選択す
ることができる。
【0105】(1)配列インデックスが (I1 + I2 +
... + In) / N の時にインデックス変数I1 から Inま
で全て配列ベースに対してチェック済みであり、Nがn
に等しい時、この式も配列レンジ・チェック済みの部分
にカバーされているとして扱うことができる。また、配
列の下限が0の言語に限ってはNがn以上の値ならばチ
ェック済として扱える。 (2)Java言語においては、配列のインデックス
が、A(任意の式) modN(Nは定数)というように剰
余の形になっている時、Aが必ず正の値をとれば結果は
0からabs(N)−1(absは絶対値)の範囲に収まる。こ
れを利用してAが必ず正の値をとる時、abs(N)−1の定
数値が配列ベースに対してチェック済であればこの配列
アクセスもチェック済として扱える。もし、配列インデ
ックスの下限が0でないプログラミング言語の場合に
は、定数0がチェック済みであるかどうかということも
検査しなければならない。
... + In) / N の時にインデックス変数I1 から Inま
で全て配列ベースに対してチェック済みであり、Nがn
に等しい時、この式も配列レンジ・チェック済みの部分
にカバーされているとして扱うことができる。また、配
列の下限が0の言語に限ってはNがn以上の値ならばチ
ェック済として扱える。 (2)Java言語においては、配列のインデックス
が、A(任意の式) modN(Nは定数)というように剰
余の形になっている時、Aが必ず正の値をとれば結果は
0からabs(N)−1(absは絶対値)の範囲に収まる。こ
れを利用してAが必ず正の値をとる時、abs(N)−1の定
数値が配列ベースに対してチェック済であればこの配列
アクセスもチェック済として扱える。もし、配列インデ
ックスの下限が0でないプログラミング言語の場合に
は、定数0がチェック済みであるかどうかということも
検査しなければならない。
【0106】以上の処理を表15に適用した場合の例を
示す。まず、ステップ310を表15に適用した場合
に、C_GEN[B]は以下のようになる。すなわち、
BB1については、配列アクセスがないのでC_GEN[B
B1]は空である。また、BB2には2つの配列レンジ・チ
ェックが存在しており、lb(a)≦i−2,i+1≦
ub(a)はそのままC_GEN[BB2]に入れられる
((1)配列ベース(2)配列インデックスのうちイン
デックス変数を含む項(3)配列インデックスの最大定
数オフセット及び(4)配列インデックスの最小定数オ
フセットのように記憶装置に記憶する場合には、(1)
a(2)i(3)+1(4)−2となる。)。さらに、
これらの拡張として、i+1−(i−2)=3であるか
らlb(a)+3≦ub(a)もチェック済であるとし
て扱える。よってこの情報もC_GEN[BB2]に入れ
られる(Java言語の場合であって、先に示した記憶
方法では(1)a(2)null(3)3(4)0)。BB3
には4つの配列レンジ・チェックが存在しており、lb
(a)≦i−2,i+1≦ub(a),lb(a)≦
5,及び5≦ub(a)はそのままC_GEN[BB3]
に入れられる(先に示した記憶方法では、(1)a
(2)i(3)+1(4)−2、(1)a(2)null
(3)5(4)5)。ここでは、lb(a)+3≦ub
(a)をC_GEN[BB3]に入れてもよいが、lb
(a)が0のようなJava言語等では5≦ub(a)
に包含されるので、ここでは入れない。BB4について
は、配列レンジ・チェックが2つ存在している。lb
(a)≦i−3及びi≦ub(a)はそのままC_GE
N[BB4]に入れられる(先に示した記憶方法の場合、
(1)a(2)i(3)0(4)−3)。またlb
(a)+3≦ub(a)もこれらから導き出されるので
C_GEN[BB4]に入れる(Java言語の場合であ
って、先に示した記憶方法では(1)a(2)null
(3)3(4)0)。BB5は配列アクセスがないのでC
_GEN[BB5]は空である。以下にC_GEN[B]
の結果をまとめておく。
示す。まず、ステップ310を表15に適用した場合
に、C_GEN[B]は以下のようになる。すなわち、
BB1については、配列アクセスがないのでC_GEN[B
B1]は空である。また、BB2には2つの配列レンジ・チ
ェックが存在しており、lb(a)≦i−2,i+1≦
ub(a)はそのままC_GEN[BB2]に入れられる
((1)配列ベース(2)配列インデックスのうちイン
デックス変数を含む項(3)配列インデックスの最大定
数オフセット及び(4)配列インデックスの最小定数オ
フセットのように記憶装置に記憶する場合には、(1)
a(2)i(3)+1(4)−2となる。)。さらに、
これらの拡張として、i+1−(i−2)=3であるか
らlb(a)+3≦ub(a)もチェック済であるとし
て扱える。よってこの情報もC_GEN[BB2]に入れ
られる(Java言語の場合であって、先に示した記憶
方法では(1)a(2)null(3)3(4)0)。BB3
には4つの配列レンジ・チェックが存在しており、lb
(a)≦i−2,i+1≦ub(a),lb(a)≦
5,及び5≦ub(a)はそのままC_GEN[BB3]
に入れられる(先に示した記憶方法では、(1)a
(2)i(3)+1(4)−2、(1)a(2)null
(3)5(4)5)。ここでは、lb(a)+3≦ub
(a)をC_GEN[BB3]に入れてもよいが、lb
(a)が0のようなJava言語等では5≦ub(a)
に包含されるので、ここでは入れない。BB4について
は、配列レンジ・チェックが2つ存在している。lb
(a)≦i−3及びi≦ub(a)はそのままC_GE
N[BB4]に入れられる(先に示した記憶方法の場合、
(1)a(2)i(3)0(4)−3)。またlb
(a)+3≦ub(a)もこれらから導き出されるので
C_GEN[BB4]に入れる(Java言語の場合であ
って、先に示した記憶方法では(1)a(2)null
(3)3(4)0)。BB5は配列アクセスがないのでC
_GEN[BB5]は空である。以下にC_GEN[B]
の結果をまとめておく。
【0107】次にステップ320の結果を考える。BB1
は初期ブロックであるのでC_IN[BB1]は空であ
る。またBB1ではC_GEN[BB1]も空であるからC_
OUT[BB1]も空である。C_IN[BB2]はC_OU
T[BB1]が空であるから同じく空である。C_GEN
[BB2]が存在するのでC_GEN[BB2]がそのままC
_OUT[BB2]となる。すなわち、lb(a)≦i−
2,i+1≦ub(a),lb(a)+3≦ub(a)
である(先に示した記憶方法では、(1)a(2)i
(3)+1(4)−2、Java言語である場合には
(1)a(2)null(3)3(4)0)。C_IN[BB
3]は、C_OUT[BB2]と同じになる。C_OUT
[BB3]は、C_GEN[BB3]とforward(C_IN[BB3], B
B3)との和集合である。T=forward(C_IN[BB3], BB3)
は、BB3がi++を含むので、C_IN[BB3]のlb
(a)≦i−2,i+1≦ub(a),lb(a)+3
≦ub(a)は、lb(a)≦i−3,i≦ub
(a),lb(a)+3≦ub(a)に修正される(先
に示した記憶方法では、(1)a(2)i(3)0
(4)−3、Java言語である場合には(1)a
(2)null(3)3(4)0)。よって、C_GEN
[BB3]のlb(a)≦i−2,i+1≦ub(a),
lb(a)≦5,及び5≦ub(a)との和集合は、l
b(a)≦i−3,i+1≦ub(a),lb(a)≦
5,及び5≦ub(a)及びlb(a)+3≦ub
(a)である(先に示した記憶方法では、(1)a
(2)i(3)+1(4)−3、(1)a(2)null
(3)5(4)5、Java言語である場合には(1)
a(2)null(3)3(4)0)。
は初期ブロックであるのでC_IN[BB1]は空であ
る。またBB1ではC_GEN[BB1]も空であるからC_
OUT[BB1]も空である。C_IN[BB2]はC_OU
T[BB1]が空であるから同じく空である。C_GEN
[BB2]が存在するのでC_GEN[BB2]がそのままC
_OUT[BB2]となる。すなわち、lb(a)≦i−
2,i+1≦ub(a),lb(a)+3≦ub(a)
である(先に示した記憶方法では、(1)a(2)i
(3)+1(4)−2、Java言語である場合には
(1)a(2)null(3)3(4)0)。C_IN[BB
3]は、C_OUT[BB2]と同じになる。C_OUT
[BB3]は、C_GEN[BB3]とforward(C_IN[BB3], B
B3)との和集合である。T=forward(C_IN[BB3], BB3)
は、BB3がi++を含むので、C_IN[BB3]のlb
(a)≦i−2,i+1≦ub(a),lb(a)+3
≦ub(a)は、lb(a)≦i−3,i≦ub
(a),lb(a)+3≦ub(a)に修正される(先
に示した記憶方法では、(1)a(2)i(3)0
(4)−3、Java言語である場合には(1)a
(2)null(3)3(4)0)。よって、C_GEN
[BB3]のlb(a)≦i−2,i+1≦ub(a),
lb(a)≦5,及び5≦ub(a)との和集合は、l
b(a)≦i−3,i+1≦ub(a),lb(a)≦
5,及び5≦ub(a)及びlb(a)+3≦ub
(a)である(先に示した記憶方法では、(1)a
(2)i(3)+1(4)−3、(1)a(2)null
(3)5(4)5、Java言語である場合には(1)
a(2)null(3)3(4)0)。
【0108】C_IN[BB4]はC_OUT[BB2]及び
C_OUT[BB3]の積集合となる。よって、lb
(a)≦i−2,i+1≦ub(a),lb(a)+3
≦ub(a)となる(先に示した記憶方法では、(1)
a(2)i(3)+1(4)−2、Java言語である
場合には(1)a(2)null(3)3(4)0)。C_
OUT[BB4]はC_GEN[BB4]とforward(C_IN[BB
4], BB4)の和集合である。forward(C_IN[BB4], BB4)
は、BB4にi++が含まれているので、lb(a)≦i
−3,i≦ub(a),lb(a)+3≦ub(a)と
なる(先に示した記憶方法では、(1)a(2)i
(3)0(4)−3、Java言語である場合には
(1)a(2)null(3)3(4)0)。よって、C_
GEN[BB4]であるlb(a)≦i−3,i≦ub
(a),lb(a)+3≦ub(a)との和集合C_O
UT[BB4]は、lb(a)≦i−3,i≦ub
(a),lb(a)+3≦ub(a)となる(先に示し
た記憶方法では、(1)a(2)i(3)0(4)−
3、Java言語である場合には(1)a(2)null
(3)3(4)0)。C_IN[BB5]は、C_OUT
[BB4]と同じである。また、C_OUT[BB5]も、C
_GEN[BB5]が空であり且つBB5には配列インデック
スの操作が存在してないので、C_IN[BB5]と同じ
である。以下、結果をまとめておく。
C_OUT[BB3]の積集合となる。よって、lb
(a)≦i−2,i+1≦ub(a),lb(a)+3
≦ub(a)となる(先に示した記憶方法では、(1)
a(2)i(3)+1(4)−2、Java言語である
場合には(1)a(2)null(3)3(4)0)。C_
OUT[BB4]はC_GEN[BB4]とforward(C_IN[BB
4], BB4)の和集合である。forward(C_IN[BB4], BB4)
は、BB4にi++が含まれているので、lb(a)≦i
−3,i≦ub(a),lb(a)+3≦ub(a)と
なる(先に示した記憶方法では、(1)a(2)i
(3)0(4)−3、Java言語である場合には
(1)a(2)null(3)3(4)0)。よって、C_
GEN[BB4]であるlb(a)≦i−3,i≦ub
(a),lb(a)+3≦ub(a)との和集合C_O
UT[BB4]は、lb(a)≦i−3,i≦ub
(a),lb(a)+3≦ub(a)となる(先に示し
た記憶方法では、(1)a(2)i(3)0(4)−
3、Java言語である場合には(1)a(2)null
(3)3(4)0)。C_IN[BB5]は、C_OUT
[BB4]と同じである。また、C_OUT[BB5]も、C
_GEN[BB5]が空であり且つBB5には配列インデック
スの操作が存在してないので、C_IN[BB5]と同じ
である。以下、結果をまとめておく。
【0109】なお、配列aの下限lb(a)が0である
言語の場合には、以下のような結果が得られる。
言語の場合には、以下のような結果が得られる。
【0110】ステップ330の処理を実施すると以下の
ようになる。BB1には配列アクセスはないので処理は行
われない。BB2にはまずi++が存在しているのがC_
IN[BB2]は空であるから内容の修正は行われず、且
つ2つの配列レンジ・チェックは除去されずに残る。こ
こで2つの配列レンジ・チェックはC_IN[BB2]に
追加されるが、このBB2にはもう配列アクセスは存在し
ないのでBB2についての処理は終了する。次にBB3に処理
は移行する。C_IN[BB3]はlb(a)≦i−2,
i+1≦ub(a),lb(a)+3≦ub(a)で、
まずi++が存在するのでこれを修正する。C_IN
[BB3]はlb(a)≦i−3,i≦ub(a),lb
(a)+3≦ub(a)となる(先に示した記憶方法で
は、(1)a(2)i(3)0(4)−3、Java言
語である場合には(1)a(2)null(3)3(4)
0)。次に、4つの配列レンジ・チェック(lb(a)
≦i−2,i+1≦ub(a),lb≦5及び5≦ub
(a))が存在するので、C_IN[BB3]から除去で
きるものは、lb(a)≦i−2である。残った配列レ
ンジ・チェックはC_IN[BB3]に入れられるがその
後の処理はない。次にBB4に処理は移行する。C_IN
[BB4]はlb(a)≦i−3,i≦ub(a),lb
(a)+3≦ub(a)である。BB4にはまずi++が
あるので、lb(a)≦i−2,i+1≦ub(a),
lb(a)+3≦ub(a)をlb(a)≦i−3,i
≦ub(a),lb(a)+3≦ub(a)に修正する
(先に示した記憶方法では、(1)a(2)i(3)0
(4)−3、Java言語である場合には(1)a
(2)null(3)3(4)0)。そして、BB4に存在す
る2つの配列レンジ・チェック(lb(a)≦i−3,
i≦ub(a))は共に修正されたC_IN[BB4]に
カバーされる。よって、BB4では配列レンジ・チェック
は全て除去されることになる。BB5には配列レンジ・チ
ェックは存在しないので、処理は終了する。以上の結果
を表19に示す。なお、表19では擬似コードを示す
が、実際には実行可能なコードが生成される。
ようになる。BB1には配列アクセスはないので処理は行
われない。BB2にはまずi++が存在しているのがC_
IN[BB2]は空であるから内容の修正は行われず、且
つ2つの配列レンジ・チェックは除去されずに残る。こ
こで2つの配列レンジ・チェックはC_IN[BB2]に
追加されるが、このBB2にはもう配列アクセスは存在し
ないのでBB2についての処理は終了する。次にBB3に処理
は移行する。C_IN[BB3]はlb(a)≦i−2,
i+1≦ub(a),lb(a)+3≦ub(a)で、
まずi++が存在するのでこれを修正する。C_IN
[BB3]はlb(a)≦i−3,i≦ub(a),lb
(a)+3≦ub(a)となる(先に示した記憶方法で
は、(1)a(2)i(3)0(4)−3、Java言
語である場合には(1)a(2)null(3)3(4)
0)。次に、4つの配列レンジ・チェック(lb(a)
≦i−2,i+1≦ub(a),lb≦5及び5≦ub
(a))が存在するので、C_IN[BB3]から除去で
きるものは、lb(a)≦i−2である。残った配列レ
ンジ・チェックはC_IN[BB3]に入れられるがその
後の処理はない。次にBB4に処理は移行する。C_IN
[BB4]はlb(a)≦i−3,i≦ub(a),lb
(a)+3≦ub(a)である。BB4にはまずi++が
あるので、lb(a)≦i−2,i+1≦ub(a),
lb(a)+3≦ub(a)をlb(a)≦i−3,i
≦ub(a),lb(a)+3≦ub(a)に修正する
(先に示した記憶方法では、(1)a(2)i(3)0
(4)−3、Java言語である場合には(1)a
(2)null(3)3(4)0)。そして、BB4に存在す
る2つの配列レンジ・チェック(lb(a)≦i−3,
i≦ub(a))は共に修正されたC_IN[BB4]に
カバーされる。よって、BB4では配列レンジ・チェック
は全て除去されることになる。BB5には配列レンジ・チ
ェックは存在しないので、処理は終了する。以上の結果
を表19に示す。なお、表19では擬似コードを示す
が、実際には実行可能なコードが生成される。
【表19】 i = 1; t = 0; do { i++; check(lb(a) <= i-2); check(i+1 <= ub(a)); t += a[i] + a[i-1] + a[i-2]; if (t < 0) { i++; check(i+1 <= ub(a)); check(lb(a) <= 5); /* lb(a)が5以下の言語はこのチェックは必要ない */ check(5 <= ub(a)); t += a[i] + a[i-1] + a[i-2] + a[5]; } i++; t += a[i] + a[i-1] + a[i-2] + a[i-3]; } while(i < n);
【0111】以上述べたA,B,C.の処理は、単独で
も組み合わせても又は従来技術と組み合わせて実行する
ことも可能である。
も組み合わせても又は従来技術と組み合わせて実行する
ことも可能である。
【0112】さらに、このような処理を実行する回路を
作成し、ハードウエアにて実行させることも可能であ
る。
作成し、ハードウエアにて実行させることも可能であ
る。
【0113】
【効果】データ・フロー解析を使用して配列レンジ・チ
ェック情報を収集し、バージョニングやチェックの前倒
しを行い、不要な配列レンジ・チェックを除去するもの
ことができた。
ェック情報を収集し、バージョニングやチェックの前倒
しを行い、不要な配列レンジ・チェックを除去するもの
ことができた。
【0114】例外の発生を利用してプログラムを書くこ
とができる言語にも対応させ、より多くの配列レンジチ
ェックを除去できるようにすることもできた。
とができる言語にも対応させ、より多くの配列レンジチ
ェックを除去できるようにすることもできた。
【0115】さらに、データ・フロー解析を行って配列
レンジ・チェック情報を収集し、配列レンジ・チェック
の最適化を行うこともできた。
レンジ・チェック情報を収集し、配列レンジ・チェック
の最適化を行うこともできた。
【0116】また、ループのバージョニングも行うこと
ができた。
ができた。
【図1】本発明のシステム全体の概要図である。
【図2】A.ループに対するバージョニングにより不要
な配列レンジ・チェックを除去する部分のメイン・フロ
ーを表した図である。
な配列レンジ・チェックを除去する部分のメイン・フロ
ーを表した図である。
【図3】図2のステップ120の処理フローを表した図
である。
である。
【図4】表10の例のフローグラフである。
【図5】B.データ・フロー解析を実行順序とは逆順に
行って配列レンジ・チェックを最適化する部分のメイン
・フローを表した図である。
行って配列レンジ・チェックを最適化する部分のメイン
・フローを表した図である。
【図6】図5のステップ220の処理フローを表した図
である。
である。
【図7】C.データ・フロー解析を実行順に行って配列
レンジ・チェック済の情報を取得し、この情報から不要
な配列レンジ・チェックを除去する部分のメイン・フロ
ーを表した図である。
レンジ・チェック済の情報を取得し、この情報から不要
な配列レンジ・チェックを除去する部分のメイン・フロ
ーを表した図である。
【図8】図7のステップ320の処理フローを表した図
である。
である。
100−340 処理ステップ
フロントページの続き (72)発明者 安江 俊明 神奈川県大和市下鶴間1623番地14 日本 アイ・ビー・エム株式会社 東京基礎研 究所内 (72)発明者 小松 秀昭 神奈川県大和市下鶴間1623番地14 日本 アイ・ビー・エム株式会社 東京基礎研 究所内 (56)参考文献 特開 平1−205231(JP,A) 特開 昭63−98031(JP,A) Asuru.J.M.,Optimi zation of array su bscipt range check s,ACM Letters on P rogramming Languag es and Systems,1992, Vol.1,No.2,p.109−118 Chin,W−N他,A reexa mination of Optimi zation of array su bscript range chec ks,ACM Transaction s on Programming L anguages and Syste ms,1995,Vol.17,No.2, p.217−227 Adl−Tabatabai,A−R 他,Fast,Effective C ode Generation in a Just−In−Time Jav a Compiler,ACM SIG PLAN Notices,1998,Vo l.33,No.5,p.280−290 Kolte,P他,Eliminat ion of Redundant A rray Subscript Ran ge checks,Proceedi ngs of the ACM SIG PLAN’95 Conference on Programming Lan guage Design and I mplementation,p.270 −278 (58)調査した分野(Int.Cl.7,DB名) G06F 9/44,9/45 (54)【発明の名称】 ループに対するバージョニングを実行する方法及び装置、配列レンジ・チェックに関する情報を ベーシック・ブロック内において収集する方法及び装置、配列レンジ・チェックに関する情報を 変更する方法、配列レンジ・チェック最適化方法、配列レンジ・チェックのためのコードを生成 する方法、不要配列レンジ・チェック除去方法及び装置、配列レンジ・チェックを選択する方 法、配列レンジ・チェック変更方法、配列レンジ・チェック収集方法、及び配列レンジ・チェッ ク取扱判断方法
Claims (34)
- 【請求項1】プログラム内の配列アクセスに対する配列
レンジ・チェックの情報を用いて、ループに対しバージ
ョニングを実行する方法であって、実行とは逆順に、各ベーシックブロックの先頭でバージ
ョニングの対象となる各ベーシックブロック内の 配列レ
ンジ・チェックの集合である第1要処理配列レンジ・チ
ェック情報を収集し且つ記憶装置に記憶する収集ステッ
プと、 深さ優先探索のポストオーダー・トラバーサルの順番
で、前記第1要処理配列レンジ・チェック情報を第2の
条件に従って伝搬させ、各ベーシック・ブロックの先頭
でバージョニングの対象となる配列レンジ・チェックの
集合である第2要処理配列レンジ・チェック情報を生成
し且つ記憶装置に記憶する第2要処理配列レンジ・チェ
ック情報生成ステップと、 前記第2要処理配列レンジ・チェック情報を用いて、ル
ープの前に前記バージョニングのためのチェック・コー
ド、及び各実行状態における実行コードを生成し、記憶
装置に記憶するステップと、 を含むループに対するバージョニングを実行する方法。 - 【請求項2】前記第1要処理配列レンジ・チェック情報
の収集ステップは、ベーシック・ブロック内において、 配列アクセスのインデックス変数が変更されない場合に
は当該配列アクセスに対する配列レンジ・チェックの情
報をそのまま収集し、 配列レンジ・チェックにおけるインデックス変数が正又
は負の定数の加算により変更されている場合には当該イ
ンデックス変数に前記定数を加算することにより生ずる
変更を反映させた後の配列レンジ・チェックの情報を収
集する、 請求項1記載のループに対するバージョニングを実行す
る方法。 - 【請求項3】前記第2要処理配列レンジ・チェック情報
の生成ステップは、 あるベーシック・ブロックの前記第1要処理配列レンジ
・チェック情報と、当該あるベーシック・ブロックの後
端でバージョニングの対象となる配列レンジ・チェック
の集合である第3要処理配列レンジ・チェック情報をベ
ーシックブロック内のインデックス変数の変更に応じて
変更した第4要処理配列レンジ・チェック情報との和集
合を計算する、 請求項1記載のループに対するバージョニングを実行す
る方法。 - 【請求項4】前記第4要処理配列レンジ・チェック情報
は、 前記あるベーシック・ブロックにおいて、前記第3要処
理配列レンジ・チェック情報に含まれる配列レンジ・チ
ェックにおけるインデックス変数が正又は負の定数の加
算により変更される場合、当該インデックス変数に前記
定数を加算することにより生ずる変更を前記第3要処理
配列レンジ・チェック情報に含まれる配列レンジ・チェ
ックに反映させることにより生成される、 請求項3記載のループに対するバージョニングを実行す
る方法。 - 【請求項5】前記第3要処理配列レンジ・チェック情報
は、 前記あるベーシック・ブロックの直後のベーシック・ブ
ロックであって前記あるベーシック・ブロックと同じル
ープに含まれる全てのベーシック・ブロックの第2要処
理配列レンジ・チェック情報を用いて生成される、 請求項4記載のループに対するバージョニングを実行す
る方法。 - 【請求項6】プログラム内の配列アクセスに対する配列
レンジ・チェックに関する情報を、ベーシック・ブロッ
ク内において収集する方法であって、 前記ベーシック・ブロック内の命令を、実行とは逆順
で、検査するステップと、 当該検査において前記命令が配列アクセスを含む場合、
当該配列アクセスに対して必要となる配列レンジ・チェ
ックの情報を記憶装置に記憶するステップと、 前記検査において前記命令が、記憶された配列レンジ・
チェックに関連する配列インデックス変数の変更を含む
場合には、当該変更が配列インデックス変数の正又は負
の定数の加算であるか判断するステップと、 前記変更が前記定数の加算である場合には、前記配列レ
ンジ・チェックにおける配列インデックス変数に前記定
数を加算することにより生じる、前記配列レンジ・チェ
ックの変更を計算するステップと、 計算された前記配列レンジ・チェックの変更を反映した
後の配列レンジ・チェックを記憶装置に記憶するステッ
プと、 を含む配列レンジ・チェックに関する情報をベーシック
・ブロック内において収集する方法。 - 【請求項7】前記検査において前記命令が、前記配列レ
ンジ・チェックにより発生する例外が当該命令より先に
起こることによって副作用を生じるような命令である場
合には、当該検査までに記憶された配列レンジ・チェッ
クを破棄するステップをさらに含む請求項6記載の配列
レンジ・チェックに関する情報をベーシック・ブロック
内において収集する方法。 - 【請求項8】プログラム内の配列アクセスに対する配列
レンジ・チェックを最適化する方法であって、実行とは逆順に、ベーシックブロックの先頭に移動可能
な各ベーシックブロック内の 配列レンジ・チェックの集
合である第1要処理配列レンジ・チェック情報を収集し
且つ記憶装置に記憶する収集ステップと、 前記プログラムにおけるデータ・フローに従って、ベー
シック・ブロック中に例外を発生させる配列レンジ・チ
ェックをそれより前に移動させることによって副作用を
生じるような副作用命令を含むか否かの情報を用い且つ
前記第1要処理配列レンジ・チェック情報を伝搬させ、
各ベーシック・ブロックの後端に移動可能な配列レンジ
・チェックの集合である第2要処理配列レンジ・チェッ
ク情報を生成し且つ記憶装置に記憶する第2要処理配列
レンジ・チェック情報生成ステップと、 各ベーシック・ブロック内において、前記第2要処理配
列レンジ・チェック情報をプログラムの意味を変えない
ように修正しながら実行とは逆順に各命令をたどり、前
記第2要処理配列レンジ・チェック情報を用いて配列レ
ンジ・チェックのためのコードを生成し且つ記憶装置に
記憶するコード生成ステップと、 を含む配列レンジ・チェック最適化方法。 - 【請求項9】前記第1要処理配列レンジ・チェック情報
の収集ステップは、ベーシック・ブロック内において、 配列アクセスのインデックス変数が変更されない場合に
は当該配列アクセスに対する配列レンジ・チェックの情
報をそのまま収集し、 配列レンジ・チェックにおけるインデックス変数が正又
は負の定数の加算により変更されている場合には当該イ
ンデックス変数に前記定数を加算することにより生ずる
変更を反映させた後の配列レンジ・チェックの情報を収
集し、 前記ベーシック・ブロックが前記副作用命令を含む場合
には、当該ベーシック・ブロックにおいて収集した配列
レンジ・チェックの情報を破棄する、 請求項8記載の配列レンジ・チェック最適化方法。 - 【請求項10】前記第2要処理配列レンジ・チェック情
報の生成ステップは、1)あるベーシック・ブロックの直後にあるすべての後
続ベーシック・ブロックについて、下記の(1−1)ま
たは(1−2)を第3要処理配列レンジ・チェック情報
として生成し、 (1−1)前記後続 ベーシック・ブロックが前記プログ
ラムの終端である場合又は前記後続ベーシック・ブロッ
クが前記プログラムの終端でなく且つ前記副作用命令を
含む場合には、当該後続ベーシック・ブロックの前記第
1要処理配列レンジ・チェック情報そのもの、 (1−2) 前記後続ベーシック・ブロックが前記プログ
ラムの終端でなく且つ前記副作用命令を含まない場合に
は、前記後続ベーシック・ブロックの前記第2要処理配
列レンジ・チェック情報を当該ベーシックブロック内の
インデックス変数の変更に応じて変更した第4要処理配
列レンジ・チェック情報と前記後続ベーシック・ブロッ
クの前記第1要処理配列レンジ・チェック情報の和集
合、 2)すべての前記後続ベーシック・ブロックについて生
成された前記第3要処理配列レンジ・チェック情報の積
集合を、 前記あるベーシック・ブロックの第2要処理配
列レンジ・チェック情報として生成し、 3)上記1)および2)をすべてのベーシック・ブロッ
クについて実行する、 請求項8記載の配列レンジ・チェ
ック最適化方法。 - 【請求項11】前記コードの生成ステップは、前記第2要処理配列レンジ・チェック情報の修正処理に
おいて、 配列レンジ・チェックにおけるインデックス変
数が正又は負の定数の加算により変更されている場合に
は、当該インデックス変数に前記定数を加算することに
より生ずる変更を反映させた後の配列レンジ・チェック
の情報に修正するとともに、前記ベーシック・ブロック
が前記副作用命令を含む場合には、当該ベーシック・ブ
ロックにおいて収集した配列レンジ・チェックの情報を
破棄し、 配列アクセスに対する配列レンジ・チェックの範囲が、
前記第2要処理配列レンジ・チェック情報に含まれる配
列レンジ・チェックの範囲より狭い場合には、当該配列
アクセスに対して、前記第2要処理配列レンジ・チェッ
ク情報に含まれる配列レンジ・チェックのためのコード
を生成するステップを含む、請求項8記載の配列レンジ
・チェック最適化方法。 - 【請求項12】前記第4要処理配列レンジ・チェック情
報は、 前記後続ベーシック・ブロックにおいて、前記第2要処
理配列レンジ・チェック情報に含まれる配列レンジ・チ
ェックにおけるインデックス変数が正又は負の定数の加
算により変更される場合、当該インデックス変数に前記
定数を加算することにより生ずる変更を前記第2要処理
配列レンジ・チェック情報に含まれる配列レンジ・チェ
ックに反映させることにより生成される、 請求項10記載の配列レンジ・チェック最適化方法。 - 【請求項13】プログラム内の配列レンジ・チェックを
最適化する場合に、各ベーシック・ブロックの後端まで
に伝搬された、配列アクセスに対して必要となる配列レ
ンジ・チェックの集合である要処理配列レンジ・チェッ
ク情報を用いて、挿入すべき、配列レンジ・チェックの
ためのコードを生成する方法であって、 前記ベーシック・ブロック内の命令を、実行とは逆順
に、検査するステップと、 当該検査において前記命令が配列アクセスを含む場合に
は、前記要処理配列レンジ・チェック情報内の配列レン
ジ・チェックの範囲より、当該配列アクセスに必要な配
列レンジ・チェックの範囲が狭いか判断し、狭いと判断
された場合には、前記要処理配列レンジ・チェック情報
内の配列レンジ・チェックに対応するコードを生成する
ステップと、 前記検査において前記命令が、前記要処理配列レンジ・
チェック情報に含まれる配列のインデックス変数の変更
を含む場合には、当該変更が配列インデックス変数の正
又は負の定数の加算であるか判断し、前記変更が前記定
数の加算である場合には、前記定数を記憶装置に記憶す
るとともに、前記配列レンジ・チェックにおけるインデ
ックス変数に前記定数を加算することにより生じる前記
配列レンジ・チェックの変更を計算し、当該変更を反映
した後の配列レンジ・チェックを記憶装置に記憶するス
テップと、 を含む配列レンジ・チェックのためのコードを生成する
方法。 - 【請求項14】前記検査において前記命令が、例外を発
生させる配列レンジ・チェックをそれより前に移動させ
ることによって副作用を生じるような命令であるか判断
するステップと、 前記判断が真である場合、前記要処理配列レンジ・チェ
ック情報を破棄するステップとを含む請求項13記載の
配列レンジ・チェックのためのコードを生成する方法。 - 【請求項15】プログラム内の配列レンジ・チェックの
うち不要な配列レンジ・チェックを除去する方法であっ
て、実行の順番で、各ベーシックブロックの終端でチェック
済みとして取り扱うことができる各ベーシックブロック
内の 配列レンジ・チェックの集合である第1処理済配列
レンジ・チェック情報を収集する収集ステップと、 前記プログラムにおけるデータ・フローに従って、前記
第1処理済配列レンジ・チェック情報を伝搬させ、各ベ
ーシック・ブロックの先頭でチェック済みとして取り扱
うことができる配列レンジ・チェックの集合である第2
処理済配列レンジ・チェック情報を生成する第2処理済
配列レンジ・チェック情報生成ステップと、 各ベーシック・ブロック内において、前記第2処理済配
列レンジ・チェック情報をプログラムの意味を変えない
ように修正しつつ実行の順番に各命令をたどり、前記第
2処理済配列レンジ・チェック情報を用いて配列レンジ
・チェックを除去するステップとを含む不要配列レンジ
・チェック除去方法。 - 【請求項16】前記第1処理済配列レンジ・チェック情
報の収集ステップは、ベーシック・ブロック内におい
て、 配列アクセスのインデックス変数が変更されない場合に
は当該配列アクセスに対する配列レンジ・チェックの情
報をそのまま収集し、 配列レンジ・チェックにおけるインデックス変数が正又
は負の定数の加算により変更されている場合には当該イ
ンデックス変数に前記定数を減算することにより生ずる
変更を反映させた後の配列レンジ・チェックの情報を収
集する、 請求項15記載の不要配列レンジ・チェック除去方法。 - 【請求項17】前記第1処理済配列レンジ・チェック情
報の収集ステップは、 配列レンジ・チェックにおける配列インデックスの最小
定数オフセット及び最大定数オフセット及び配列の下限
から、定数インデックスについてチェック済みとして扱
うことができる上限及び下限で規定される範囲を収集す
るステップをさらに含む、 請求項15記載の不要配列レンジ・チェック除去方法。 - 【請求項18】前記第1処理済配列レンジ・チェック情
報の収集ステップは、 配列レンジ・チェックにおけるインデックス変数の下限
値又は上限値及び配列の下限から、定数インデックスに
ついてチェック済みとして扱うことができる上限及び下
限で規定される範囲を収集するステップをさらに含む、 請求項15記載の不要配列レンジ・チェック除去方法。 - 【請求項19】前記第2処理済配列レンジ・チェック情
報の生成ステップは、1)あるベーシック・ブロックの直前にあるすべての先
行ベーシック・ブロックについて、下記の(1−1)ま
たは(1−2)を第3処理済配列レンジ・チェック情報
として生成し、 (1−1) 前記先行 ベーシック・ブロックが前記プロ
グラムの先頭である場合には、前記先行ベーシック・ブ
ロックの前記第1処理済配列レンジ・チェック情報その
もの、 (1−2) 前記先行ベーシック・ブロックが前記プログ
ラムの先頭でない場合には、前記先行ベーシック・ブロ
ックの前記第2処理済配列レンジ・チェック情報をペー
ジブロック内のインデックス変数の変更に応じて変更し
た第4処理済配列レンジ・チェック情報と前記先行ベー
シック・ブロックの前記第1処理済配列レンジ・チェッ
ク情報の和集合、 2)すべての前記先行ベーシック・ブロックについて生
成された前記第3処理済配列レンジ・チェック情報の積
集合を、 前記あるベーシック・ブロックの第2処理済配
列レンジ・チェック情報として生成し、 3)上記1)および2)をすべてのベーシック・ブロッ
クについて実行する、 請求項15記載の不要配列レンジ
・チェック除去方法。 - 【請求項20】前記配列レンジの除去ステップは、前記第2要処理済配列レンジ・チェック情報の修正処理
において、 配列レンジ・チェックにおけるインデックス
変数が正又は負の定数の加算により変更されている場合
には当該インデックス変数に前記定数を減算することに
より生ずる変更を反映させた後の配列レンジ・チェック
の情報に修正する、 請求項15記載の不要配列レンジ・チェック除去方法。 - 【請求項21】前記第4処理済配列レンジ・チェック情
報は、 前記先行ベーシック・ブロックにおいて、前記第2処理
済配列レンジ・チェック情報に含まれる配列レンジ・チ
ェックにおけるインデックス変数が正又は負の定数の加
算により変更される場合、当該インデックス変数に前記
定数を減算することにより生ずる変更を前記第2処理済
配列レンジ・チェック情報に含まれる配列レンジ・チェ
ックに反映させることにより生成される、 請求項19記載の不要配列レンジ・チェック除去方法。 - 【請求項22】プログラム内の配列レンジ・チェックの
うち不要なものを除去する場合に、各ベーシック・ブロ
ックの先頭に伝搬された、配列アクセスに対する配列レ
ンジ・チェックの集合である処理済配列レンジ・チェッ
ク情報を用いて、除去の対象となる配列レンジ・チェッ
クを選択する方法であって、 前記ベーシック・ブロック内の命令を、実行の順番で、
検査するステップと、 当該検査において前記命令が配列アクセスを含む場合、
当該配列アクセスに必要な配列レンジ・チェックの範囲
が前記処理済配列レンジ・チェック情報に含まれる配列
レンジ・チェックの範囲でカバーされるのか判断するス
テップと、 カバーされると判断された場合には、前記配列アクセス
に必要な配列レンジ・チェックを選択するステップと、 前記検査において前記命令が、前記処理済配列レンジ・
チェック情報に含まれる配列レンジ・チェックのインデ
ックス変数の変更を含む場合には、当該変更がインデッ
クス変数の正又は負の定数の加算であるか判断するステ
ップと、 前記変更が定数の加算である場合には、前記定数を記憶
装置に記憶するステップと、 前記変更が前記定数の加算である場合には、前記配列レ
ンジ・チェックにおけるインデックス変数に前記定数を
減算することにより生じる、前記配列レンジ・チェック
の変更を計算するステップと、 計算された前記配列レンジ・チェックの変更を反映した
後の配列レンジ・チェックを記憶装置に記憶するステッ
プと、 を含む配列レンジ・チェックを選択する方法。 - 【請求項23】前記カバーされるのか判断するステップ
が、 前記処理済配列レンジ・チェック情報に、同一の配列ベ
ースを有する配列レンジ・チェックについて、インデッ
クス変数Ik(k=1,...n)が含まれているか検
査するステップと、 定数Lがn以上という条件に合致するか判断するステッ
プと、 全てのkについて前記インデックス変数Ikが含まれて
いると判断され且つ定数Lとnの関係が所定の条件に合
致する場合、(I1+I2+...+In)/Lが配列イ
ンデックスである配列アクセスの配列レンジ・チェック
を選択するステップと、 を含む請求項22記載の配列レンジ・チェックを選択す
る方法。 - 【請求項24】前記カバーされるのか判断するステップ
が、 前記処理済配列レンジ・チェック情報に、定数インデッ
クスに関する配列レンジ・チェックについて、定数Nの
絶対値に1を減じた定数が含まれているか検査するステ
ップと、 配列インデックスであるA mod NのAが正であるか判
断するステップと、 前記定数Nの絶対値に1を減じた定数が含まれており且
つ前記処理済配列レンジ・チェック情報に定数0を実質
的に含み且つ前記Aが正である場合、前記配列インデッ
クスA mod Nを含む配列アクセスの配列レンジ・チェ
ックを選択するステップと、 を含む請求項22記載の配列レンジ・チェックを選択す
る方法。 - 【請求項25】プログラム内の配列アクセスが配列のレ
ンジを越えていないことを検査するための配列レンジ・
チェックであってチェック済みであるとして取り扱うこ
とができる配列レンジ・チェックを前記プログラムのベ
ーシック・ブロック内において収集する方法であって、 配列レンジ・チェックを検出するステップと、 前記検出された配列レンジ・チェックにおける配列イン
デックスの最小定数オフセット及び最大定数オフセット
及び配列の下限から、定数インデックスについてチェッ
ク済みとして扱うことができる上限及び下限を計算し、
計算された当該上限及び下限で規定される範囲に関する
配列レンジ・チェックを記憶装置に記憶するステップ
と、 を含む配列レンジ・チェック収集方法。 - 【請求項26】プログラム内の配列アクセスが配列のレ
ンジを越えていないことを検査するための配列レンジ・
チェックであってチェック済みであるとして取り扱うこ
とができる配列レンジ・チェックを前記プログラムのベ
ーシック・ブロック内において収集する方法であって、 配列レンジ・チェックを検出するステップと、 前記検出された配列レンジ・チェックにおけるインデッ
クス変数の下限値又は上限値及び配列の下限から、定数
インデックスについてチェック済みとして扱うことがで
きる上限及び下限を計算し、計算された当該上限及び下
限で規定される範囲に関する配列レンジ・チェックを記
憶装置に記憶するステップと、 を含む配列レンジ・チェック収集方法。 - 【請求項27】プログラム内の配列アクセスに対する配
列レンジ・チェックの情報を用いて、ループに対しバー
ジョニングを実行する装置であって、実行とは逆順に、各ベーシックブロックの先頭でバージ
ョニングの対象となる各ベーシックブロック内の 配列レ
ンジ・チェックの集合である第1要処理配列レンジ・チ
ェック情報を収集し且つ記憶装置に記憶する収集手段
と、 深さ優先探索のポストオーダー・トラバーサルの順番
で、前記第1要処理配列レンジ・チェック情報を伝搬さ
せ、各ベーシック・ブロックの先頭でバージョニングの
対象となる配列レンジ・チェックの集合である第2要処
理配列レンジ・チェック情報を生成し且つ記憶装置に記
憶する第2要処理配列レンジ・チェック情報生成手段
と、 前記第2要処理配列レンジ・チェック情報を用いて、ル
ープの前に前記バージョニングのためのチェック・コー
ド、及び各実行状態における実行コードを生成し、記憶
装置に記憶する手段と、 を含むループに対するバージョニングを実行する装置。 - 【請求項28】プログラム内の配列アクセスに対する配
列レンジ・チェックに関する情報を、ベーシック・ブロ
ック内において収集する装置であって、 前記ベーシック・ブロック内の命令を、実行とは逆順
で、検査する手段と、 当該検査において前記命令が配列アクセスを含む場合、
当該配列アクセスに対して必要となる配列レンジ・チェ
ックの情報を記憶装置に記憶する手段と、 前記検査において前記命令が、記憶された配列レンジ・
チェックに関連する配列インデックス変数の変更を含む
場合には、当該変更が配列インデックス変数の正又は負
の定数の加算であるか判断する手段と、 前記変更が前記定数の加算である場合には、前記配列レ
ンジ・チェックにおける配列インデックス変数に前記定
数を加算することにより生じる、前記配列レンジ・チェ
ックの変更を計算する手段と、 計算された前記配列レンジ・チェックの変更を反映した
後の配列レンジ・チェックを記憶装置に記憶する手段
と、 を含む配列レンジ・チェックに関する情報をベーシック
・ブロック内において収集する装置。 - 【請求項29】プログラム内の配列レンジ・チェックの
うち不要な配列レンジ・チェックを除去する装置であっ
て、実行の順番で、各ベーシックブロックの終端でチェック
済みとして取り扱うことができる各ベーシックブロック
内の 配列レンジ・チェックの集合である第1処理済配列
レンジ・チェック情報を収集する収集手段と、 前記プログラムにおけるデータ・フローに従って、前記
第1処理済配列レンジ・チェック情報を伝搬させ、各ベ
ーシック・ブロックの先頭でチェック済みとして取り扱
うことができる配列レンジチェックの集合である第2処
理済配列レンジ・チェック情報を生成する第2処理済配
列レンジ・チェック情報生成手段と、 各ベーシック・ブロック内において、前記第2処理済配
列レンジ・チェック情報をプログラムの意味を変えない
ように修正しつつ実行の順番に各命令をたどり、前記第
2処理済配列レンジ・チェック情報を用いて配列レンジ
・チェックを除去する手段と、 を含む不要配列レンジ・チェック除去装置。 - 【請求項30】プログラム内の配列アクセスに対する配
列レンジ・チェックの情報を用いて、ループに対しバー
ジョニングを実行するバージョニング・プログラムを格
納した記憶媒体であって、 前記バージョニング・プログラムは、コンピュータに、実行とは逆順に、各ベーシックブロックの先頭でバージ
ョニングの対象となる各ベーシックブロック内の 配列レ
ンジ・チェックの集合である第1要処理配列レンジ・チ
ェック情報を収集し且つ記憶装置に記憶する収集ステッ
プであって、各ベーシック・ブロック内において、配列
アクセスのインデックス変数が変更されない場合には当
該配列アクセスに対する配列レンジ・チェックの情報を
そのまま収集し、配列レンジ・チェックにおけるインデ
ックス変数が正又は負の定数の加算により変更されてい
る場合には当該インデックス変数に前記定数を加算する
ことにより生ずる変更を反映させた後の配列レンジ・チ
ェックの情報を収集するステップと、 深さ優先探索のポストオーダー・トラバーサルの順番
で、前記第1要処理配列レンジ・チェック情報を伝搬さ
せ、各ベーシック・ブロックの先頭でバージョニングの
対象となる配列レンジ・チェックの集合である第2要処
理配列レンジ・チェック情報を生成し且つ記憶装置に記
憶する第2要処理配列レンジ・チェック情報生成ステッ
プであって、あるベーシック・ブロックの前記第1要処
理配列レンジ・チェック情報と、当該あるベーシック・
ブロックの後端でバージョニングの対象となる第3要処
理配列レンジ・チェック情報をインデックス変数の変更
に応じ変更して生成される第4要処理配列レンジ・チェ
ック情報との和集合を計算して第2要処理配列レンジ・
チェック情報を生成するステップと、 前記第2要処理配列レンジ・チェック情報を用いて、ル
ープの前に前記バージョニングのためのチェック・コー
ド、及び各実行状態における実行コードを生成し、記憶
装置に記憶するステップと、 を実行させる、記憶媒体。 - 【請求項31】プログラム内の配列アクセスが配列のレ
ンジを越えていないことを検査するための配列レンジ・
チェックをプログラム実行とは逆方向に移動させる場合
に、前記配列レンジ・チェックを変更するプログラムを
記憶した記憶媒体であって、 前記配列レンジ・チェックを変更するプログラムは、コ
ンピュータに、 前記配列レンジ・チェックが当該配列のインデックス変
数に正又は負の定数を加算する処理を越えて移動するこ
とになるか判断し、前記定数を記憶装置に記憶するステ
ップと、 前記判断が真である場合には、前記配列レンジ・チェッ
クにおけるインデックス変数に前記定数を加算すること
により生じる、前記配列レンジ・チェックの変更を計算
するステップと、 計算された前記配列レンジ・チェックの変更を反映した
後の配列レンジ・チェックを記憶装置に記憶するステッ
プと、 を実行させる、記憶媒体。 - 【請求項32】プログラム内の配列アクセスが配列のレ
ンジを越えていないことを検査するための配列レンジ・
チェックをプログラム実行と同一方向に移動させる場合
に、前記配列レンジ・チェックを変更するプログラムを
記憶する記憶媒体であって、 前記配列レンジ・チェックを変更するプログラムを、コ
ンピュータに、 前記配列レンジ・チェックが当該配列のインデックス変
数に正又は負の定数を加算する処理を越えて移動するこ
とになるか判断し、前記定数を記憶装置に記憶するステ
ップと、 前記判断が真である場合には、前記配列レンジ・チェッ
クにおけるインデックス変数に前記定数を減算すること
により生じる、前記配列レンジ・チェックの変更を計算
するステップと、 計算された前記配列レンジ・チェックの変更を反映した
後の配列レンジ・チェックを記憶装置に記憶するステッ
プと、 を実行させる、記憶媒体。 - 【請求項33】プログラム内の配列アクセスが配列のレ
ンジを越えていないことを検査するための配列レンジ・
チェックであってチェック済みであるとして取り扱うこ
とができる配列レンジ・チェックを前記プログラムのベ
ーシック・ブロック内において収集する配列レンジ・チ
ェック収集プログラムを記憶した記憶媒体であって、前
記配列レンジ・チェック収集プログラムは、コンピュー
タに、 配列レンジ・チェックを検出するステップと、 前記検出された配列レンジ・チェックにおける配列イン
デックスの最小定数オフセット及び最大定数オフセット
及び配列の下限から、定数インデックスについてチェッ
ク済みとして扱うことができる上限及び下限を計算し、
計算された当該上限及び下限で規定される範囲に関する
配列レンジ・チェックを記憶装置に記憶するステップ
と、 を実行させる、記憶媒体。 - 【請求項34】プログラム内の配列アクセスが配列のレ
ンジを越えていないことを検査するための配列レンジ・
チェックであってチェック済みであるとして取り扱うこ
とができる配列レンジ・チェックを前記プログラムのベ
ーシック・ブロック内において収集する配列レンジ・チ
ェック収集プログラムを記憶した記憶媒体であって、 前記配列レンジ・チェック収集プログラムは、コンピュ
ータに、 配列レンジ・チェックを検出するステップと、 前記検出された配列レンジ・チェックにおけるインデッ
クス変数の下限値又は上限値及び配列の下限から、定数
インデックスについてチェック済みとして扱うことがで
きる上限及び下限を計算し、計算された当該上限及び下
限で規定される範囲に関する配列レンジ・チェックを記
憶装置に記憶するステップと、 を実行させる、記憶媒体。
Priority Applications (3)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP37046098A JP3280332B2 (ja) | 1998-07-10 | 1998-12-25 | ループに対するバージョニングを実行する方法及び装置、配列レンジ・チェックに関する情報をベーシック・ブロック内において収集する方法及び装置、配列レンジ・チェックに関する情報を変更する方法、配列レンジ・チェック最適化方法、配列レンジ・チェックのためのコードを生成する方法、不要配列レンジ・チェック除去方法及び装置、配列レンジ・チェックを選択する方法、配列レンジ・チェック変更方法、配列レンジ・チェック収集方法、及び配列レンジ・チェック取扱判断方法 |
US09/350,242 US6519765B1 (en) | 1998-07-10 | 1999-07-09 | Method and apparatus for eliminating redundant array range checks in a compiler |
US11/838,734 US7950005B2 (en) | 1998-07-10 | 2007-08-14 | Method and apparatus for performing versioning for loop, method and apparatus for collecting array range check information in basic blocks, method for modifying array range check information, method for optimizing array range checks, method for generating codes for array range checks, method and apparatus for eliminating redundant array range checks, method for selecting array range checks, method for modifying array range checks, method for collecting array range checks, and method for determining handling of array range checks |
Applications Claiming Priority (3)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP10-195316 | 1998-07-10 | ||
JP19531698 | 1998-07-10 | ||
JP37046098A JP3280332B2 (ja) | 1998-07-10 | 1998-12-25 | ループに対するバージョニングを実行する方法及び装置、配列レンジ・チェックに関する情報をベーシック・ブロック内において収集する方法及び装置、配列レンジ・チェックに関する情報を変更する方法、配列レンジ・チェック最適化方法、配列レンジ・チェックのためのコードを生成する方法、不要配列レンジ・チェック除去方法及び装置、配列レンジ・チェックを選択する方法、配列レンジ・チェック変更方法、配列レンジ・チェック収集方法、及び配列レンジ・チェック取扱判断方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
JP2000081983A JP2000081983A (ja) | 2000-03-21 |
JP3280332B2 true JP3280332B2 (ja) | 2002-05-13 |
Family
ID=26509042
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
JP37046098A Expired - Fee Related JP3280332B2 (ja) | 1998-07-10 | 1998-12-25 | ループに対するバージョニングを実行する方法及び装置、配列レンジ・チェックに関する情報をベーシック・ブロック内において収集する方法及び装置、配列レンジ・チェックに関する情報を変更する方法、配列レンジ・チェック最適化方法、配列レンジ・チェックのためのコードを生成する方法、不要配列レンジ・チェック除去方法及び装置、配列レンジ・チェックを選択する方法、配列レンジ・チェック変更方法、配列レンジ・チェック収集方法、及び配列レンジ・チェック取扱判断方法 |
Country Status (2)
Country | Link |
---|---|
US (1) | US6519765B1 (ja) |
JP (1) | JP3280332B2 (ja) |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JP3437932B2 (ja) | 1999-01-05 | 2003-08-18 | インターナショナル・ビジネス・マシーンズ・コーポレーション | 配列レンジ・チェックのためのコード生成方法及び装置、並びにバージョニング方法及び装置 |
Families Citing this family (21)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6424969B1 (en) * | 1999-07-20 | 2002-07-23 | Inmentia, Inc. | System and method for organizing data |
US7222337B2 (en) * | 2001-05-31 | 2007-05-22 | Sun Microsystems, Inc. | System and method for range check elimination via iteration splitting in a dynamic compiler |
US6948160B2 (en) * | 2001-05-31 | 2005-09-20 | Sun Microsystems, Inc. | System and method for loop unrolling in a dynamic compiler |
US20030018970A1 (en) * | 2001-07-19 | 2003-01-23 | Digeo, Inc. | Object representation of television programs within an interactive television system |
WO2003009126A1 (en) * | 2001-07-19 | 2003-01-30 | Digeo, Inc. | System and method for managing television programs within an entertainment system |
JP3900485B2 (ja) * | 2002-07-29 | 2007-04-04 | インターナショナル・ビジネス・マシーンズ・コーポレーション | 最適化装置、コンパイラプログラム、最適化方法、及び記録媒体 |
US7073166B2 (en) * | 2002-11-25 | 2006-07-04 | International Business Machines Corporation | Conformance of computer programs with predetermined design structures |
US6986110B1 (en) * | 2003-01-02 | 2006-01-10 | Hewlett-Packard Development Company, L.P. | Automated method and system for backtracing of instruction parameters from specified instruction in test cases |
US7669193B1 (en) | 2003-09-25 | 2010-02-23 | Lantronix, Inc. | Program transformation using flow-sensitive type constraint analysis |
US7448029B2 (en) * | 2004-04-26 | 2008-11-04 | International Business Machines Corporation | Modification of array access checking in AIX |
EP1916583A1 (de) * | 2006-10-26 | 2008-04-30 | Siemens Aktiengesellschaft | Verfahren zur Durchführung von Online-Programmänderungen an einem Automatisierungssystem |
US8813063B2 (en) * | 2006-12-06 | 2014-08-19 | International Business Machines Corporation | Verification of successful installation of computer software |
US8006239B2 (en) * | 2007-01-16 | 2011-08-23 | Nec Laboratories America, Inc. | Program analysis using symbolic ranges |
US7937695B2 (en) * | 2007-04-27 | 2011-05-03 | International Business Machines Corporation | Reducing number of exception checks |
JP5505192B2 (ja) * | 2010-08-17 | 2014-05-28 | 富士通株式会社 | 競合試験装置 |
US8533695B2 (en) * | 2010-09-28 | 2013-09-10 | Microsoft Corporation | Compile-time bounds checking for user-defined types |
WO2012134122A2 (en) * | 2011-03-26 | 2012-10-04 | Samsung Electronics Co., Ltd. | Method and apparatus for eliminating partially redundant array bounds checks in an embedded compiler |
JP2013242700A (ja) | 2012-05-21 | 2013-12-05 | Internatl Business Mach Corp <Ibm> | コード最適化方法、プログラム及びシステム |
JP6164054B2 (ja) | 2013-11-08 | 2017-07-19 | 富士通株式会社 | 情報処理装置、コンパイル方法およびコンパイラプログラム |
US10394786B2 (en) * | 2015-04-20 | 2019-08-27 | Futurewei Technologies, Inc. | Serialization scheme for storing data and lightweight indices on devices with append-only bands |
US9495138B1 (en) * | 2016-01-04 | 2016-11-15 | International Business Machines Corporation | Scheme for verifying the effects of program optimizations |
Family Cites Families (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US5107418A (en) * | 1990-06-11 | 1992-04-21 | Supercomputer Systems Limited Partnership | Method for representing scalar data dependences for an optimizing compiler |
US5193180A (en) * | 1991-06-21 | 1993-03-09 | Pure Software Inc. | System for modifying relocatable object code files to monitor accesses to dynamically allocated memory |
US5293631A (en) * | 1991-08-06 | 1994-03-08 | Hewlett-Packard Company | Analysis and optimization of array variables in compiler for instruction level parallel processor |
US5889999A (en) * | 1996-05-15 | 1999-03-30 | Motorola, Inc. | Method and apparatus for sequencing computer instruction execution in a data processing system |
US5933855A (en) * | 1997-03-21 | 1999-08-03 | Rubinstein; Richard | Shared, reconfigurable memory architectures for digital signal processing |
US6343375B1 (en) * | 1998-04-24 | 2002-01-29 | International Business Machines Corporation | Method for optimizing array bounds checks in programs |
US6324629B1 (en) * | 1998-07-24 | 2001-11-27 | Coware N.V., Frontier Design Byba | Method for determining an optimized data organization |
US6378066B1 (en) * | 1999-02-04 | 2002-04-23 | Sun Microsystems, Inc. | Method, apparatus, and article of manufacture for developing and executing data flow programs, and optimizing user input specifications |
-
1998
- 1998-12-25 JP JP37046098A patent/JP3280332B2/ja not_active Expired - Fee Related
-
1999
- 1999-07-09 US US09/350,242 patent/US6519765B1/en not_active Expired - Fee Related
Non-Patent Citations (4)
Title |
---|
Adl−Tabatabai,A−R他,Fast,Effective Code Generation in a Just−In−Time Java Compiler,ACM SIGPLAN Notices,1998,Vol.33,No.5,p.280−290 |
Asuru.J.M.,Optimization of array subscipt range checks,ACM Letters on Programming Languages and Systems,1992,Vol.1,No.2,p.109−118 |
Chin,W−N他,A reexamination of Optimization of array subscript range checks,ACM Transactions on Programming Languages and Systems,1995,Vol.17,No.2,p.217−227 |
Kolte,P他,Elimination of Redundant Array Subscript Range checks,Proceedings of the ACM SIGPLAN’95 Conference on Programming Language Design and Implementation,p.270−278 |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JP3437932B2 (ja) | 1999-01-05 | 2003-08-18 | インターナショナル・ビジネス・マシーンズ・コーポレーション | 配列レンジ・チェックのためのコード生成方法及び装置、並びにバージョニング方法及び装置 |
Also Published As
Publication number | Publication date |
---|---|
US6519765B1 (en) | 2003-02-11 |
JP2000081983A (ja) | 2000-03-21 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
JP3280332B2 (ja) | ループに対するバージョニングを実行する方法及び装置、配列レンジ・チェックに関する情報をベーシック・ブロック内において収集する方法及び装置、配列レンジ・チェックに関する情報を変更する方法、配列レンジ・チェック最適化方法、配列レンジ・チェックのためのコードを生成する方法、不要配列レンジ・チェック除去方法及び装置、配列レンジ・チェックを選択する方法、配列レンジ・チェック変更方法、配列レンジ・チェック収集方法、及び配列レンジ・チェック取扱判断方法 | |
US7725883B1 (en) | Program interpreter | |
US7950005B2 (en) | Method and apparatus for performing versioning for loop, method and apparatus for collecting array range check information in basic blocks, method for modifying array range check information, method for optimizing array range checks, method for generating codes for array range checks, method and apparatus for eliminating redundant array range checks, method for selecting array range checks, method for modifying array range checks, method for collecting array range checks, and method for determining handling of array range checks | |
US6412109B1 (en) | Method for optimizing java bytecodes in the presence of try-catch blocks | |
EP1636701B1 (en) | An intermediate representation for multiple exception handling models | |
US8146070B2 (en) | Method and apparatus for optimizing software program using inter-procedural strength reduction | |
US7571427B2 (en) | Methods for comparing versions of a program | |
US8291398B2 (en) | Compiler for optimizing program | |
US20040255279A1 (en) | Block translation optimizations for program code conversation | |
US20090249307A1 (en) | Program analysis apparatus, program analysis method, and program storage medium | |
JPH09330233A (ja) | 最適目的コード生成方法 | |
JP2002149416A (ja) | プログラムの最適化方法及びこれを用いたコンパイラ | |
JP2000347872A (ja) | 例外を正規制御フローとして処理する方法及び装置 | |
US7373641B2 (en) | Method, computer unit and program for converting a program | |
US20040015918A1 (en) | Program optimization method and compiler using the program optimization method | |
JP3437932B2 (ja) | 配列レンジ・チェックのためのコード生成方法及び装置、並びにバージョニング方法及び装置 | |
US6292937B1 (en) | Program conversion device for translating an object-oriented language source program | |
US6854110B2 (en) | System and method for obtaining scratch registers in computer executable binaries | |
US7152223B1 (en) | Methods and systems for compiling and interpreting one or more associations between declarations and implementations in a language neutral fashion | |
US20010044930A1 (en) | Loop optimization method and a compiler | |
JP3049814B2 (ja) | マイクロコンピュータの言語処理装置 | |
Saleil | Simple Optimizing JIT Compilation of Higher-Order Dynamic Programming Languages | |
Dean et al. | Training compilers for better inlining decisions | |
JP2006202134A (ja) | プロファイル情報収集方法および装置 | |
Tonella et al. | Variable‐precision reaching definitions analysis |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
FPAY | Renewal fee payment (event date is renewal date of database) |
Free format text: PAYMENT UNTIL: 20080222 Year of fee payment: 6 |
|
FPAY | Renewal fee payment (event date is renewal date of database) |
Free format text: PAYMENT UNTIL: 20090222 Year of fee payment: 7 |
|
LAPS | Cancellation because of no payment of annual fees |