JP5689366B2 - ゾーン10進数形式の変数へのアクセスを有する言語のバイナリコードを最適化する方法、並びにその最適化装置及びコンピュータ・プログラム - Google Patents
ゾーン10進数形式の変数へのアクセスを有する言語のバイナリコードを最適化する方法、並びにその最適化装置及びコンピュータ・プログラム Download PDFInfo
- Publication number
- JP5689366B2 JP5689366B2 JP2011121446A JP2011121446A JP5689366B2 JP 5689366 B2 JP5689366 B2 JP 5689366B2 JP 2011121446 A JP2011121446 A JP 2011121446A JP 2011121446 A JP2011121446 A JP 2011121446A JP 5689366 B2 JP5689366 B2 JP 5689366B2
- Authority
- JP
- Japan
- Prior art keywords
- code
- instruction
- variable
- binary
- binary code
- 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
- 238000000034 method Methods 0.000 title claims description 182
- 238000005457 optimization Methods 0.000 title claims description 127
- 238000004590 computer program Methods 0.000 title claims description 12
- 238000004364 calculation method Methods 0.000 claims description 180
- 230000008569 process Effects 0.000 claims description 144
- 238000012545 processing Methods 0.000 claims description 100
- 230000000694 effects Effects 0.000 claims description 96
- 238000012217 deletion Methods 0.000 claims description 94
- 230000037430 deletion Effects 0.000 claims description 94
- 238000006243 chemical reaction Methods 0.000 claims description 82
- 238000001514 detection method Methods 0.000 claims description 73
- 230000008859 change Effects 0.000 claims description 23
- 230000009467 reduction Effects 0.000 claims description 12
- 238000004458 analytical method Methods 0.000 description 17
- 230000000116 mitigating effect Effects 0.000 description 14
- 238000004891 communication Methods 0.000 description 8
- 238000010586 diagram Methods 0.000 description 6
- 230000004044 response Effects 0.000 description 5
- 230000006872 improvement Effects 0.000 description 4
- 230000015556 catabolic process Effects 0.000 description 3
- 238000006731 degradation reaction Methods 0.000 description 3
- 230000006870 function Effects 0.000 description 3
- 230000004048 modification Effects 0.000 description 3
- 238000012986 modification Methods 0.000 description 3
- 231100000957 no side effect Toxicity 0.000 description 2
- 239000007787 solid Substances 0.000 description 2
- XUIMIQQOPSSXEZ-UHFFFAOYSA-N Silicon Chemical compound [Si] XUIMIQQOPSSXEZ-UHFFFAOYSA-N 0.000 description 1
- 230000004913 activation Effects 0.000 description 1
- 230000002411 adverse Effects 0.000 description 1
- 230000008901 benefit Effects 0.000 description 1
- 230000000295 complement effect Effects 0.000 description 1
- 238000007796 conventional method Methods 0.000 description 1
- 238000005516 engineering process Methods 0.000 description 1
- 238000005206 flow analysis Methods 0.000 description 1
- 238000009434 installation Methods 0.000 description 1
- 239000004973 liquid crystal related substance Substances 0.000 description 1
- 239000003607 modifier Substances 0.000 description 1
- 229910052710 silicon Inorganic materials 0.000 description 1
- 239000010703 silicon Substances 0.000 description 1
Images
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/44—Encoding
- G06F8/443—Optimisation
- G06F8/4441—Reducing the execution time required by the program code
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
メモリ内に読み込まれた上記バイナリコード中から、各変数について、ゾーン10進数形式の変数へのアクセスを含み且つ副作用となり得る命令のない領域を検出するステップと、
上記検出された領域内において、ゾーン10進数形式の変数を2進型へ変換する処理、PACK/UNPACKのコードを削除しても変換された結果が変わらないPACK/UNPACKのコードを上記バイナリコードから削除する処理、又はそれらの組み合わせの処理を行うステップと
を実行することを含む。
(A)上記変数がn1桁であり、さらに当該変数をn2桁にする剰余算命令についてn1≧n2の条件を満たす場合には、上記n1桁に桁合わせをするための剰余算命令のコードを上記バイナリコードから削除するステップと、
(B)上記(A)の条件下にない場合には、
(a)上記変数が符号なしの場合に、
(a1)上記検出された領域内において、足し算、掛け算又は引き算の演算が連続している場合において、2進計算のオーバーフローが起きないことが保証できる演算の範囲がコンパイル時にわかる場合にのみ、上記保証できる連続した演算のうち、最後の一回の剰余算命令のコード以外の剰余算命令のコードを上記バイナリコードから削除するステップと、
(a2)上記(a1)以外の場合において、当該(a1)の条件を満たさない演算の前で桁が正しいことを保証するステップと、
(b)上記変数が符号ありの場合に、
(b1)上記検出された領域内において、足し算、掛け算又は引き算の演算が連続している場合において、当該連続している一連の演算の式の途中で符号が変わらないこと及び2進計算のオーバーフローが起きないことが保証できる演算の範囲がコンパイル時にわかる場合にのみ、上記保証できる連続した演算のうち、最後の一回の剰余算命令のコード以外の剰余算命令のコードを上記バイナリコードから削除するステップと、
(b2)上記(b1)以外の場合において、当該(b1)の条件を満たさない演算の前で桁が正しいことを保証するステップと
を含みうる。
上記軽減が、上記剰余を求める演算を下記式:
結果 = (分子 < 分母 && 分子 >= 0) ? 分子 : (分子 % 分母)
に置き換えることによって行われうる。
上記バイナリコード中の各ブロックにおいて、副作用となり得る命令の後にアクセスがある変数の集合体(以下、GEN(B)ともいう)及び上記各ブロックにおいて、副作用となり得る命令が存在する場合には変数全体の集合体(以下、KILL(B)ともいう)を作成するステップであって、上記KILL(B)は、副作用となり得る命令が存在しない場合には空集合である、上記作成するステップと、
各ブロックの先頭における変数の集合(以下、IN(B)ともいう)を、各ブロックの終わりにおける変数の集合(以下、OUT(B)ともいう)、上記GEN(B)及び上記KILL(B)から求めるステップと、
各ブロック内の各命令において変更された集合情報を上記各ブロック内の各命令に付加情報としてそれぞれ設定するステップであって、上記集合情報は上記IN(B)を基にして求められる、上記設定するステップと、
上記各命令に設定された付加情報について、各変数が連続している領域を、当該変数に対する副作用となり得る命令のない領域とするステップと
を含みうる。
各ブロック内の命令が変数へのアクセスであるかどうか、及び、上記命令が副作用となり得る命令であるかどうかを判定するステップと、
上記判定を各命令の実行順に繰り返すステップと、
上記判定の結果から、上記GEN(B)及び上記KILL(B)を作成するステップと
を含みうる。
OUT(B) = (IN(B) - KILL(B)) ∪ GEN(B)
IN(B) = ∩N∈Pred(B) OUT(N)
のデータ・フロー方程式から求められうる。OUT(N)は、上記式で処理中のブロックBの直前にあるブロックNの終わりにおける変数の集合であり、副作用となり得る命令の後でアクセスがあった変数の集合である。
各ブロック内の命令が変数へのアクセスであるかどうか、及び、上記命令が副作用となり得る命令であるかどうかを判定し、上記IN(B)の集合情報を変更するステップと、
各ブロック内の各命令において変更された集合情報を上記各ブロック内の各命令に付加情報としてそれぞれ設定するステップであって、上記集合情報は上記IN(B)を基にして求められる、上記設定するステップと、
上記判定及び上記IN(B)の集合情報の変更を各命令の実行順に繰り返すステップと
を含みうる。
(c1)副作用となり得る命令のない上記領域中に書き込みがある変数の場合に、上記副作用となり得る命令のない上記領域内にあるゾーン10進数形式の変数に対するPACK/UNPACKのコードのうち、最初と最後の型変換命令以外のコードを上記バイナリコードから削除する処理と、
(c2)副作用となり得る命令のない上記領域中に書き込みがない変数の場合に、上記副作用となり得る命令のない上記領域内にあるゾーン10進数形式の変数に対するPACK/UNPACKのコードのうち、最初の型変換命令以外のコードを上記バイナリコードから削除する処理と
を含みうる。
(c3)上記(c1)及び/又は(c2)の上記型変換命令以外のコードを削除する際に、当該削除するコードに付随する符号処理のコードを上記バイナリコードからさらに削除する処理をさらに含みうる。
上記PACK/UNPACKのコードを上記バイナリコードから削除する処理が、上記コスト差の見積もりの計算によって上記変換する処理がされなかった部分について行われうる。
コスト差=(変数がゾーン10進数形式である場合と2進型である場合とでの当該変数へアクセスする命令のコスト差にその実行頻度を乗じた値)
+(2進型への変換コストに各上記検出された領域内へ入る実行頻度を乗じた値)
+(ゾーン10進数形式への変換コストに各上記検出された領域から出る実行頻度を乗じた値)
+(桁合わせをするための剰余算命令のコストにその剰余算命令の実行頻度を乗じた値)
によって求められうる。
上記剰余算命令のコードの削除が行われた後に、メモリ内に読み込まれ且つ上記剰余算命令のコードが削除されたバイナリコード中から、各変数について、ゾーン10進数形式の変数へのアクセスを含み且つ副作用となり得る命令のない領域を検出するステップと、
上記検出された領域内において、ゾーン10進数形式の変数を2進型へ変換する処理、PACK/UNPACKのコードを削除しても変換された結果が変わらないPACK/UNPACKのコードを上記バイナリコードから削除する処理、又はそれらの組み合わせの処理を行うステップと
をさらに実行することを含みうる。
各変数について、ゾーン10進数形式の変数へのアクセスを含み且つ副作用となり得る命令のない領域を検出する検出部と、
上記検出された領域内において、ゾーン10進数形式の変数を2進型へ変換する処理、PACK/UNPACKのコードを削除しても変換された結果が変わらないPACK/UNPACKのコードを上記バイナリコードから削除する処理、及びそれらの組み合わせの処理のうちの1つを行う処理部と
を備えている。
(A)上記変数がn1桁であり、さらに当該変数をn2桁にする剰余算命令についてn1≧n2の条件を満たす場合には、上記n1桁に桁合わせをするための剰余算命令のコードを上記バイナリコードから削除し、
(B)上記(A)の条件下にない場合には、
(a)上記変数が符号なしの場合に、
(a1)上記検出された領域内において、足し算、掛け算又は引き算の演算が連続している場合において、2進計算のオーバーフローが起きないことが保証できる演算の範囲がコンパイル時にわかる場合にのみ、上記保証できる連続した演算のうち、最後の一回の剰余算命令のコード以外の剰余算命令のコードを上記バイナリコードから削除し、
(a2)上記(a1)以外の場合において、当該(a1)の条件を満たさない演算の前で桁が正しいことを保証し、
(b)上記変数が符号ありの場合に、
(b1)上記検出された領域内において、足し算、掛け算又は引き算の演算が連続している場合において、当該連続している一連の演算の式の途中で符号が変わらないこと及び2進計算のオーバーフローが起きないことが保証できる演算の範囲がコンパイル時にわかる場合にのみ、上記保証できる連続した演算のうち、最後の一回の剰余算命令のコード以外の剰余算命令のコードを上記バイナリコードから削除し、
(b2)上記(b1)以外の場合において、当該(b1)の条件を満たさない演算の前で桁が正しいことを保証しうる。
結果 = (分子 < 分母 && 分子 >= 0) ? 分子 : (分子 % 分母)
に置き換えることによって上記軽減を行いうる。
上記バイナリコード中の各ブロックにおいて、副作用となり得る命令の後にアクセスがある変数の集合体(以下、GEN(B)ともいう)及び上記各ブロックにおいて、副作用となり得る命令が存在する場合には変数全体の集合体(以下、KILL(B)ともいう)を作成し、ここで上記KILL(B)は、副作用となり得る命令が存在しない場合には空集合であり、
各ブロックの先頭における変数の集合(以下、IN(B)ともいう)を、各ブロックの終わりにおける変数の集合(以下、OUT(B)ともいう)、上記GEN(B)及び上記KILL(B)から求め、
各ブロック内の各命令において変更された集合情報を上記各ブロック内の各命令に付加情報としてそれぞれ設定し、ここで前記集合情報は前記IN(B)を基にして求められ、
上記各命令に設定された付加情報について、各変数が連続している領域を、当該変数に対する副作用となり得る命令のない領域としうる。
各ブロック内の命令が変数へのアクセスであるかどうか、及び、上記命令が副作用となり得る命令であるかどうかを判定し、
上記判定を各命令の実行順に繰り返し、
上記判定の結果から、上記GEN(B)及び上記KILL(B)を作成しうる。
OUT(B) = (IN(B) - KILL(B)) ∪ GEN(B)
IN(B) = ∩N∈Pred(B) OUT(N)
のデータ・フロー方程式から求めうる。OUT(N)は、上記式で処理中のブロックBの直前にあるブロックNの終わりにおける変数の集合であり、副作用となり得る命令の後でアクセスがあった変数の集合である。
各ブロック内の命令が変数へのアクセスであるかどうか、及び、上記命令が副作用となり得る命令であるかどうかを判定し、上記IN(B)の集合情報を変更し、
上記各ブロック内の各命令において変更された集合情報を上記ブロック内各命令にそれぞれ設定し、
上記判定及び上記IN(B)の集合情報の変更を各命令の実行順に繰り返しうる。上記集合情報は、上記IN(B)を基にして求められる。
(c1)副作用となり得る命令のない上記領域中に書き込みがある変数の場合に、上記副作用となり得る命令のない上記領域内にあるゾーン10進数形式の変数に対するPACK/UNPACKのコードのうち、最初と最後の型変換命令以外のコードを上記バイナリコードから削除し、
(c2)副作用となり得る命令のない上記領域中に書き込みがない変数の場合に、上記副作用となり得る命令のない上記領域内にあるゾーン10進数形式の変数に対するPACK/UNPACKのコードのうち、最初の型変換命令以外のコードを上記バイナリコードから削除しうる。
(c3)上記(c1)及び/又は(c2)の上記型変換命令以外のコードを削除する際に、当該削除するコードに付随する符号処理のコードを上記バイナリコードから削除しうる。
ゾーン10進数形式の変数を2進型へ変換する上記処理を、当該変換処理前後のコスト差を見積もり、変換処理後の見積もりコストが変換処理前の見積もりコストよりも小さいことを条件に行い、次に、
上記PACK/UNPACKのコードを上記バイナリコードから削除する処理を、上記コスト差の見積もりの計算によって上記変換する処理がされなかった部分について行いうる。
コスト差=(変数がゾーン10進数形式である場合と2進型である場合とでの当該変数へアクセスする命令のコスト差にその実行頻度を乗じた値)
+(2進型への変換コストに各上記検出された領域内へ入る実行頻度を乗じた値)
+(ゾーン10進数形式への変換コストに各上記検出された領域から出る実行頻度を乗じた値)
+(桁合わせをするための剰余算命令のコストにその剰余算命令の実行頻度を乗じた値)
によって求めうる。
上記削除が上記削除部によって行われた後に、メモリ内に読み込まれ且つ上記剰余算命令のコードが削除されたバイナリコード中から、各変数について、ゾーン10進数形式の変数へのアクセスを含み且つ副作用となり得る命令のない領域を検出する検出部と、
上記検出された領域内において、ゾーン10進数形式の変数を2進型へ変換する処理、PACK/UNPACKのコードを削除しても変換された結果が変わらないPACK/UNPACKのコードを上記バイナリコードから削除する処理、及びそれらの組み合わせの処理のうちの1つを行う処理部と
をさらに備えうる。
を備えている。上記装置は、上記最適化を、上記に記載された方法の各ステップを実行することによって行う。
コンピュータ(101)は、CPU(102)とメイン・メモリ(103)とを備えており、これらはバス(104)に接続されている。CPU(102)は好ましくは、32ビット又は64ビットのアーキテクチャに基づくものであり、例えば、インテル社のCore i(商標)シリーズ、Core 2(商標)シリーズ、Atom(商標)シリーズ、Xeon(商標)シリーズ、Pentium(登録商標)シリーズ、Celeron(登録商標)シリーズ、AMD社のPhenom(商標)シリーズ、Athlon(商標)シリーズ、Turion(商標)シリーズ又はSempron(商標)が使用されうる。バス(104)には、ディスプレイ・コントローラ(105)を介して、ディスプレイ(106)、例えば液晶ディスプレイ(LCD)が接続されうる。ディスプレイ(106)は、コンピュータの管理のために、通信回線を介してネットワークに接続されたコンピュータについての情報と、そのコンピュータ上で動作中のソフトウェアについての情報を、適当なグラフィック・インタフェースで表示するために使用される。バス(104)にはまた、SATA又はIDEコントローラ(107)を介して、ディスク(108)、例えばハードディスク又はシリコン・ディスクと、ドライブ(109)、例えばCD、DVD又はBDドライブとが接続されうる。バス(104)にはさらに、キーボード・マウスコントローラ(110)又はUSBバス(図示せず)を介して、キーボード(111)及びマウス(112)が接続されうる。
ドライブ(109)は、必要に応じて、CD−ROM、DVD−ROM又はBDからプログラムをディスク(108)にインストールするために使用される。
コンピュータ(201)は、図1のコンピュータ(101)に対応する。コンピュータ(201)は、図1のコンピュータ(101)に示されている構成、例えばCPU及びメモリを備えている。コンピュータ(201)は、本発明に従う最適化技法を実施するためのバイナリコード最適化装置又はコンパイラ装置でありうる。
(1)検出部(221)は、上記バイナリコード中の各ブロックにおいて、GEN(B)及びKILL(B)を作成する;
(2)検出部(221)は、各ブロックの先頭における変数の集合(以下、IN(B)ともいう)を、各ブロックの終わりにおける変数の集合(以下、OUT(B)ともいう)、上記GEN(B)及び上記KILL(B)から求める;
(3)検出部(221)は、各ブロック内の各命令において変更された集合情報を上記各ブロック内の各命令に付加情報としてそれぞれ設定する;
(4)検出部(221)は、上記各命令に設定された付加情報について、各変数が連続している領域を、当該変数に対する副作用となり得る命令のない領域とする。上記集合情報は、上記IN(B)を基にして求められる。
(1a)検出部(221)は、各ブロック内の命令が変数へのアクセスであるかどうか、及び、上記命令が副作用となり得る命令であるかどうかを判定する;
(1b)検出部(221)は、上記判定を各命令の実行順に繰り返す;
(1c)検出部(221)は、上記判定の結果から、上記GEN(B)及び上記KILL(B)を作成する。
OUT(B) = (IN(B) - KILL(B)) ∪ GEN(B)
IN(B) = ∩N∈Pred(B) OUT(N)
(3a)検出部(221)は、各ブロック内の命令が変数へのアクセスであるかどうか、及び、上記命令が副作用となり得る命令であるかどうかを判定し、上記IN(B)の集合情報を変更する;
(3b)検出部(221)は、上記各ブロック内の各命令において変更された集合情報を上記各ブロック内の各命令に付加情報としてそれぞれ設定する;
(3c)検出部(221)は、上記判定及び上記IN(B)の集合情報の変更を各命令の実行順に繰り返す。上記集合情報は上記IN(B)を基にして求められる。
上記PACK/UNPACKのコードを上記バイナリコードから削除する処理を、上記コスト差の見積もりの計算によって上記変換する処理がされなかった部分について行いうる。
コスト差=(変数がゾーン10進数形式である場合と2進型である場合とでの当該変数へアクセスする命令のコスト差にその実行頻度を乗じた値)
+(2進型への変換コストに各上記検出された領域内へ入る実行頻度を乗じた値)
+(ゾーン10進数形式への変換コストに各上記検出された領域から出る実行頻度を乗じた値)
+(桁合わせをするための剰余算命令のコストにその剰余算命令の実行頻度を乗じた値)
(c1)処理部(222)は、副作用となり得る命令のない上記領域中に書き込みがある変数の場合に、上記副作用となり得る命令のない上記領域内にあるゾーン10進数形式の変数に対するPACK/UNPACKのコードのうち、最初と最後の型変換命令以外のコードを上記バイナリコードから削除する;
(c2)処理部(222)は、副作用となり得る命令のない上記領域中に書き込みがない変数の場合に、上記副作用となり得る命令のない上記領域内にあるゾーン10進数形式の変数に対するPACK/UNPACKのコードのうち、最初の型変換命令以外のコードを上記バイナリコードから削除する。
(A)削除部(223)は、上記変数がn1桁であり、さらに当該変数をn2桁にする剰余算命令についてn1≧n2の条件を満たす場合には、上記n1桁に桁合わせをするための剰余算命令のコードを上記バイナリコードから削除する;
(B)削除部(223)は、上記(A)の条件下にない場合には、変数が符号なしか又は符号ありかに応じて下記処理(a)〜(b)を行う。すなわち、
(a)上記変数が符号なしの場合に(下記図9のステップ9015で判定される)、
(a1)削除部(223)は、上記検出された領域内において、足し算、掛け算又は引き算の演算が連続している場合において(図9のステップ905で判定される)、2進計算のオーバーフローが起きないこと(図9のステップ9014で判定される)が保証できる演算の範囲がコンパイル時にわかる場合にのみ、上記保証できる連続した演算のうち、最後の一回の剰余算命令のコード以外の剰余算命令のコードを上記バイナリコードから削除する;
(a2)削除部(223)は、上記(a1)以外の場合において、当該(a1)の条件を満たさない演算の前で桁が正しいことを保証する;
(b)上記変数が符号ありの場合に(下記図9のステップ9015で判定される)、
(b1)削除部(223)は、上記検出された領域内において、足し算、掛け算又は引き算の演算が連続している場合において(図9のステップ905で判定される)、当該連続している一連の演算の式の途中で符号が変わらないこと(図9のステップ9018で判定される)及び2進計算のオーバーフローが起きないこと(図9のステップ9014で判定される)が保証できる演算の範囲がコンパイル時にわかる場合にのみ、上記保証できる連続した演算のうち、最後の一回の剰余算命令のコード以外の剰余算命令のコードを上記バイナリコードから削除する;
(b2)削除部(223)は、上記(b1)以外の場合において、当該(b1)の条件を満たさない演算の前で桁が正しいことを保証する。
結果 = (分子 < 分母 && 分子 >= 0) ? 分子 : (分子 % 分母)
に置き換えられる。
最適化処理は、下記の点で3つのフローチャートに分けられうる。
A.ステップ301で開始する最適化処理(以下、最適化処理301という)では、最適化は、ゾーン10進数形式の変数を2進型へ変換する処理(ステップ303)を含む。
B.ステップ311で開始する最適化処理(以下、最適化処理311という)では、最適化は、PACK/UNPACKのコードを削除しても変換された結果が変わらないPACK/UNPACKのコードをバイナリコードから削除する処理(ステップ314)を含む。変換された結果が変わらないとは、変換された結果が保証されるということである。
C.ステップ321で開始する最適化処理(以下、最適化処理321という)では、最適化は、最適化処理301のステップ303の処理(ステップ323)及び、最適化処理311のステップ314(ステップ324)の組み合わせを含む。
ステップ301では、コンピュータ(201)は、バイナリコードを記憶部(202)から受け取る。または、コンピュータ(201)は、COBOLコンパイラで変換されたバイナリコードを変換部(214)から受け取る。コンピュータ(201)は、上記受け取ったバイナリコードを最適化部(215)に渡す。
コスト差=(変数がゾーン10進数形式である場合と2進型である場合とでの当該変数(一時計算領域を含む)へアクセスする命令のコスト差にその実行頻度を乗じた値)
+(2進型への変換コストに各上記検出された領域内へ入る実行頻度を乗じた値)
+(ゾーン10進数形式への変換コストに各上記検出された領域から出る実行頻度を乗じた値)
+(桁合わせをするための剰余算命令のコストにその剰余算命令の実行頻度を乗じた値)
ステップ311〜312及びステップ315〜317は、最適化処理301のステップ301〜302及びステップ305〜307にそれぞれ対応する。
ステップ314では、処理部(222)は、ステップ312で検出された最適化対象領域内において、PACK/UNPACKのコードを削除する処理を行う。削除するPACK/UNPACKのコードは、ステップ311で検出された最適化対象領域内にあり、PACK/UNPACKのコードを削除してもPACK/UNPACKにより変換された結果が変わらないPACK/UNPACKのコードである。本発明の実施態様に従うPACK/UNPACKのコードの削除の例については、下記図14及び図15に示されている。
処理部(222)は、副作用となり得る命令のない領域中に書き込みがある変数(更新のある変数ともいう)であるか、又は、副作用となり得る命令のない領域中に書き込みがない変数(更新のない変数ともいう)であるかを判定する。
処理部(222)は、更新のある変数の場合に、上記副作用となり得る命令のない領域内にあるゾーン10進数形式の変数に対するPACK/UNPACKのコードのうち、最初と最後の型変換命令以外のコードをバイナリコードから削除する。言い換えれば、最初と最後の型変換命令は削除されないので、当該最初と最後の型変換命令は、最適化されたバイナリコードの実行において実行される。また、処理部(222)は、上記削除するコードに付随する符号処理のコードも上記バイナリコードから削除しうる。
一方、処理部(222)は、更新のない変数の場合に、上記副作用となり得る命令のない領域内にあるゾーン10進数形式の変数に対するPACK/UNPACKのコードのうち、最初の型変換命令以外のコードをバイナリコードから削除する。言い換えれば、最初の型変換命令は削除されないので、当該最初の型変換命令は、最適化されたバイナリコードの実行において実行される。また、処理部(222)は、上記削除するコードに付随する符号処理のコードも上記バイナリコードから削除しうる。削除するコードに付随する符号処理のコードは、例えば、図14のバイナリコード(1402)中のコード(1412)内及び図15のバイナリコード(1502)中のコード(1512)内に記載されている「OI」のコードである。
ステップ321〜ステップ322、ステップ323及びステップ325〜327は、最適化処理301のステップ301〜302、ステップ303及びステップ305〜307にそれぞれ対応する。
ステップ324は、下記点を除き、最適化処理311のステップ314に対応する。
ステップ324では、処理部(222)は、ステップ322において検出された最適化対象領域のうち、ステップ323の変換処理がされなかった部分(例えば、コスト計算によって変換処理が行われなかった部分)について、PACK/UNPACKのコードを削除する処理を行う。
なお、処理部(222)は、ステップ324に記載の処理をステップ323に記載の処理よりも先行して行ってもよい。この場合、ステップ323では、処理部(222)は、ステップ322において検出された最適化対象領域のうち、ステップ324に記載の処理がされなかった部分について、ゾーン10進数形式の変数を2進型へ変換する処理を行う。ただし、ステップ324に記載の処理をステップ323に記載の処理よりも先行して行う場合のコンパイル時間は、ステップ324に記載の処理をステップ323に記載の処理よりも先行して行う場合のコンパイル時間よりも長い。
ステップ331では、コンピュータ(201)は、バイナリコードを記憶部(202)から受け取る。または、コンピュータ(201)は、COBOLコンパイラで変換されたバイナリコードを変換部(214)から受け取る。
ステップ332では、削除部(223)は、桁合わせをするための剰余算命令のコードを最適化する。剰余算命令のコードを最適化は、図3Aのステップ305、ステップ315及びステップ325に対応する。
ステップ333では、検出部(221)は、上記剰余算命令のコードが最適化された後のバイナリコード内における各変数について、ゾーン10進数形式の変数へのアクセスを含み且つ副作用となり得る命令のない領域(最適化対象領域)を検出する。最適化対象領域の検出は、図3Aのステップ302、ステップ312及びステップ322に対応する。
ステップ334では、処理部(222)は、ステップ333で検出された最適化対象領域内において、ゾーン10進数形式の変数を2進型へ変換する処理を行う。ゾーン10進数形式の変数を2進型へ変換する処理は、図3Aのステップ303及びステップ323に対応する。
ステップ335では、処理部(222)は、ステップ334で検出された最適化対象領域内において、PACK/UNPACKのコードを削除する処理を行う。なお、処理部(222)は、ステップ335に記載の処理をステップ334に記載の処理よりも先行して行ってもよい。この場合、ステップ334では、処理部(222)は、ステップ333において検出された最適化対象領域のうち、ステップ335に記載の処理がされなかった部分について、ゾーン10進数形式の変数を2進型へ変換する処理を行う。PACK/UNPACKのコードを削除する処理は、図3Aのステップ314及びステップ324に対応する。
ステップ336では、軽減部(224)は、ステップ335の後に、上記バイナリコード中の残った個々の剰余算命令に対して、演算子強度の軽減を行う。なお、軽減部(224)は、図8に示すように、ステップ332の処理内において、又は、ステップ332の直後に、バイナリコード中の残った個々の剰余算命令に対して、演算子強度の軽減を行いうる。演算子強度の軽減は、図3Aのステップ306、316及び326に対応する。
ステップ337では、コンピュータ(201)は、バイナリコードの最適化処理を終了する。
ステップ401では、検出部(221)は、ゾーン10進数形式の変数へのアクセスを含み且つ副作用となり得る命令のない領域を検出する処理を開始する。
ステップ402では、検出部(221)は、GEN(B)及びKILL(B)を作成する。GEN(B)は、バイナリコード中の各ブロックBにおいて、副作用となり得る命令の後にアクセスがある変数の集合体である。KILL(B)は、上記各ブロックBにおいて、副作用となり得る命令が1個でも存在する場合には変数全体の集合体である(ただし、副作用となりうる命令が存在しない場合には空集合である)。GEN(B)及びKILL(B)は、下記ステップ403に示すデータ・フロー解析で使用するデータ・フロー方程式の入力データである。GEN(B)及びKILL(B)の作成については、下記図5に記載のフローチャートに従い説明する。
ステップ403では、検出部(221)は、図4に記載のデータ・フロー方程式を用いて、当該データ・フロー方程式にステップ402で作成されたGEN(B)及びKILL(B)を適用してIN(B)を求める。
IN(B)は、各ブロックBの先頭における変数の集合であり、副作用となり得る命令の後でアクセスがあった変数の集合である。IN(B)を基にして、下記ステップ404及び405において、副作用となり得る命令のない領域が、バイナリコード中から検出される。
データ・フロー方程式のうち、IN(B)を求める式中のOUT(N)は、データ・フロー方程式で処理中のブロックBの直前にあるブロックNの終わりにおける変数の集合であり、副作用となり得る命令の後でアクセスがあった変数の集合である。ブロックNは、ブロックBの直前に処理される任意のブロックであって、1又は複数である。ブロックNは、複数であることが多い。
データ・フロー方程式のうち、IN(B)を求める式中のN∈Pred(B)は、処理中のブロックBの直前にあるブロックNに対して行われる処理であることを意味する。
ステップ404では、検出部(221)は、各ブロックB内の各命令iに、VSETの集合情報の内容を付加情報として設定する。付加情報は、例えば作業領域であるVSETの集合情報から命令i毎に設定される。VSETは、例えばメモリ内の作業領域である。付加情報は、「メモリ内に読み込まれたバイナリコード中において、ゾーン10進数形式の変数vへのアクセスを含み且つ副作用となり得る命令のない領域」を特定するための情報である。各ブロック内の各命令iにVSETの集合情報の内容を付加情報として設定するためのフローチャートが、下記図6に示されている。また、集合情報の内容の例が下記図11において示されており、例えば、ブロック1102の上から順に、IN(B)、V1、V1,V2、φ、そしてV1である。
ステップ405では、検出部(221)は、ステップ404において各命令iに設定した付加情報について、各変数が連続している領域を、その変数に対する副作用となり得る命令のない領域とする。
ステップ406では、検出部(221)は、ゾーン10進数形式の変数へのアクセスを含み且つ副作用となり得る命令のない領域を検出する処理を終了する。
VSET = IN(B);
for (each i ∈ ブロックB内の各命令iを実行順にスキャン){
if (i はvへのアクセス){
VSET |= v;
} else if (i ∈ 副作用となり得る命令){
VSET = φ;
}
i にVSETの集合情報の内容を付加情報として設定;
}
ステップ501では、検出部(221)は、GEN(B)及びKILL(B)を作成する処理を開始する。
ステップ502では、検出部(221)は、GEN(B)及びKILL(B)を空集合(φ)で初期化する。
ステップ503では、検出部(221)は、ブロックB内の各命令iを実行順にスキャンする。
ステップ504では、検出部(221)は、命令iが変数vへのアクセスであるかどうかを検査する。命令iが変数vへのアクセスである場合、検出部(221)は、ステップ505に進む。一方、命令iが変数vへのアクセスでない場合、検出部(221)は、ステップ506に進む。
ステップ505では、検出部(221)は、ステップ504で判定された命令iからGEN(B) |= vを求める。
ステップ506では、検出部(221)は、命令iが副作用となり得る命令かどうかを検査する。命令iが副作用となり得る命令である場合、検出部(221)は、ステップ507に進む。一方、命令iが変数vへのアクセスでない場合、検出部(221)は、ステップ508に進む。
ステップ507では、検出部(221)は、ステップ506で判定された命令iから、KILL(B) = φの補集合を求める。また、検出部(221)は、GEN(B)を空集合(φ)で初期化する。
ステップ508では、検出部(221)は、各ブロックB内の各命令iについて実行順にステップ503〜507を繰り返す。検出部(221)は、全ての命令iについて、ステップ503〜507の処理が終了することに応じて、ステップ509に進む。
ステップ509では、検出部(221)は、GEN(B)及びKILL(B)を作成する処理を終了する。
ステップ601では、検出部(221)は、各ブロックB内の各命令iに、作業領域であるVSETの集合情報の内容を付加情報として設定する処理を開始する。
ステップ602では、検出部(221)は、VSETにIN(B)の内容をコピーする。
ステップ603では、検出部(221)は、ブロックB内の各命令iを実行順にスキャンする。
ステップ604では、検出部(221)は、命令iが変数vへのアクセスであるかどうかを検査する。命令iが変数vへのアクセスである場合、検出部(221)は、ステップ605に進む。一方、命令iが変数vへのアクセスでない場合、検出部(221)は、ステップ606に進む。
ステップ605では、検出部(221)は、ステップ604で判定された命令iからGEN(B) |= vを求める。
ステップ606では、検出部(221)は、命令iが副作用となり得る命令かどうかを検査する。命令iが副作用となり得る命令である場合、検出部(221)は、ステップ607に進む。一方、命令iが変数vへのアクセスでない場合、検出部(221)は、ステップ608に進む。
ステップ607では、検出部(221)は、VSETを空集合(φ)で初期化する。
ステップ608では、検出部(221)は、命令iに、VSETの集合情報を付加情報として設定する。ステップ604においてYesの場合、ステップ606においてYesの場合、及びステップ606においてNoの場合のそれぞれに応じて、VSETに異なる集合情報が追加され、初期化され、又は、変更されない。VSETの集合情報の内容の例について、下記図11に示す。
ステップ609では、検出部(221)は、各ブロックB内の各命令iについて実行順にステップ603〜608を繰り返す。検出部(221)は、全ての命令iについて、ステップ603〜608の処理が終了することに応じて、ステップ610に進む。
ステップ610では、検出部(221)は、各ブロックB内の各命令に、VSETの集合情報の内容を付加情報として設定する処理を終了する。
ステップ701では、削除部(223)は、桁合わせのための剰余算命令REMを最適化する処理を開始する。
ステップ702では、削除部(223)は、最適化対象領域内の桁合わせのための全ての剰余算命令REMについて、ステップ703の削除処理を実行するループを開始する。
ステップ703では、削除部(223)は、剰余算命令REMについて、1つの剰余算命令についての削除処理を実行する。1つの剰余算命令についての削除処理については、下記図8〜図10においてさらにその詳細な内容を説明する。
ステップ704では、削除部(223)は、未処理の剰余算命令についての削除処理を実行する。削除部(223)は、全ての剰余算命令についてステップ703の処理が終わることに応じて、ステップ705に進む。
ステップ705では、削除部(223)は、桁合わせのための剰余算命令REMを最適化する処理を終了する。
剰余算命令を削除できる条件は、桁が合っていなくても問題無いこと、又は、既に桁が合っているために問題無いことである。桁が合っていなくても問題無いことは、下記のAnalyzeUSE(REM, I, NDIGITS)に従い判定される。既に桁が合っているため問題無いことは、下記のAnalyzeDEF(J, NDIGITS)に従い判定される。
ステップ802では、削除部(223)は、剰余算命令REMの分母が10のn乗であるかどうかを判定する。削除部(223)は、分母が10のn乗である場合にステップ803に進み、一方、分母が10のn乗でない場合にステップ810に進み、1つの剰余算命令についての削除処理を終了する。
ステップ803では、削除部(223)は、変数NDIGITSにnを入れる。
ステップ804では、削除部(223)は、剰余算命令REMの各使用Iについて、剰余算命令の必要性をAnalyzeUSE(REM, I, NDIGITS)に従い判定する。AnalyzeUSE(REM, I, NDIGITS)については、下記図9に記載のフローチャートにおいて説明する。
ステップ805では、削除部(223)は、全ての使用Iについて不必要であるかどうかを判定する。削除部(223)は、全ての使用Iについて不必要である場合にステップ808に進みREMを削除し、一方、全ての使用Iについて不必要でない場合にステップ806に進む。
ステップ806では、削除部(223)は、剰余算命令REMの各定義Jについて、剰余算命令の必要性をAnalyzeDEF(J, NDIGITS)に従い判定する。AnalyzeDEF(J, NDIGITS)については、下記図10に記載のフローチャートにおいて説明する。
ステップ807では、削除部(223)は、全ての定義Jについて不必要であるかどうかを判定する。削除部(223)は、全ての定義Jについて不必要である場合にステップ808に進みREMを削除し、一方、全ての使用Iについて不必要でない場合にステップ809に進む。なお、図8では、全ての使用Iについて不必要でない場合にステップ809に進むが、ステップ809を経ずに、ステップ810に進み、1つの剰余算命令についての削除処理を終了するようにしてもよい。
ステップ808では、削除部(223)は、ステップ805における全ての使用Iについて不必要であることに応じて又はステップ807における全ての定義Jについて不必要であることに応じて、剰余算命令REMを削除する。
ステップ809では、削除部(223)は、REMについて演算子強度(命令の)実行コストの軽減を軽減部(224)に要求する。軽減部(224)は、剰余を求める演算を、結果 = (分子 < 分母 && 分子 >= 0) ? 分子 : (分子 % 分母)に置き換えることによって、上記演算子強度の軽減を果たす。当該置き換えは、上記剰余を求める演算が、最適化対象領域内に限定されず、バイナリコード中の剰余算命令について削除されなかった残りの個々の剰余算命令について行われうる。軽減部(224)は、演算子強度の軽減後に、処理を削除部(223)に戻す。削除部は、軽減部(224)での演算子強度の軽減が終わることに応じて、ステップ810に進む。
ステップ810では、削除部(223)は、1つの剰余算命令についての削除処理を終了する。
ステップ901では、削除部(223)は、REMの各使用Iについて剰余の必要性をチェックする処理 AnalyzeUSE(REM, I, NDIGITS)に従い、使用Iが必要であるか又は不必要であるかの判定を開始する。
ステップ902では、削除部(223)は、使用Iがすでにチェック済みかどうかを判定する。削除部(223)は、使用Iがすでにチェック済みである場合にステップ903に進み、一方、使用Iがすでにチェック済みでない場合に当該使用Iは不必要であると判定する(904)。
ステップ903では、削除部(223)は、使用Iが剰余算命令であるかどうかを判定する。削除部(223)は、使用Iが剰余算命令である場合にステップ9011に進み、一方、使用Iが剰余算命令でない場合にステップ905に進む。
ステップ905では、削除部(223)は、使用Iが足し算、引き算、又は掛け算のいずれかであるかどうかを判定する。削除部(223)は、使用Iが足し算、引き算、又は掛け算のいずれかである場合にステップ907に進み、一方、使用Iが足し算、引き算、及び掛け算のいずれでもない場合にステップ9014に進む。
ステップ907では、削除部(223)は、使用Iの出力について剰余不必要と判定された場合に当該使用Iの入力についても不必要であるかどうかを判定する。削除部(223)は、上記入力についても不必要である場合にステップ9017に進み、一方、上記入力についても不必要でない場合にステップ909に進み、REMの各使用Iについて剰余の必要性をチェックする処理 AnalyzeUSE(REM, I, NDIGITS)を終了する。
ステップ9011では、削除部(223)は、使用Iの分母が、10のn乗&& NDIGITS >= n であるかどうかを判定する。削除部(223)は、使用Iの分母が10のn乗&& NDIGITS >= n である場合に当該使用Iは不必要であると判定し(9013)、一方、使用Iの分母が10のn乗 && NDIGITS >= n でない場合に当該使用Iは必要であると判定する(9012)。NDIGITS>= nである場合には、その剰余算命令は必要であることから(9012)削除できない。一方、NDIGITS >= nである場合には、その剰余算命令は必要でないことから(9013)削除しうる。NDIGITS>= n において、NDIGITS はn1桁に対応し、nはn2桁に対応する。よって、ある変数をn1桁で丸める剰余算命令があり、当該変数をさらにn2桁(≦n1)で丸めるための剰余算命令がある場合には、n1桁で丸める剰余算命令を削除することを意味する。
例えば、n1桁が5桁の剰余算命令であり、n2桁が4桁の剰余算命令である場合には、削除部(223)は、n1桁の剰余算命令、すなわち5桁の剰余算命令を削除できる。
ステップ9014では、削除部(223)は、使用Iによって2進上のオーバーフローが起きないかどうかを判定する。削除部(223)は、2進上のオーバーフローが起きない場合にステップ9015に進み、一方、2進上のオーバーフローが起きる場合(使用Iによって2進上のオーバーフローが起きないことがない場合)に当該使用Iは必要であると判定する(9016)。
ステップ9015では、削除部(223)は、使用Iの分子は符号ありかどうかを判定する。削除部(223)は、使用Iの分子が符号なしの場合にステップ9017に進み、一方、使用Iの分子が符号ありの場合にステップ9018に進む。符号あり又はなしであるかどうかは、アセンブラ言語の命令であるZAPを使っているかどうか、又は、10進数形式の変数の符号フィールドに何をセットしているかどうかで判定可能である。また、符号あり又はなしであるかをコンパイル時に見つける方法として、例えば、10進数形式の変数の符号フィールドにFをセットしているならば符号なしと判定し、それ以外であれば符号ありと判定する方法を採用しうる。
ステップ9017では、ステップ907の上記入力についても不必要であることに応じて、又は、ステップ9018の10進上の符号が変わらないことに応じて、削除部(223)は、使用Iの各使用Kについて、剰余の必要性をAnalyzeUSE(REM, K, NDIGITS)に従い判定する。AnalyzeUSE(REM, K, NDIGITS)については、図9のフローチャートと同じである。
ステップ9020では、削除部(223)は、全ての使用Kについて不必要であるかどうかを判定する。削除部(223)は、全ての使用Iについて不必要である場合に当該使用Kは不必要であると判定し(9021)、一方、全ての使用Iについて不必要でない場合に当該使用Kは必要であると判定する(9022)。
ステップ9018では、削除部(223)は、使用Iによって10進上の符号が変わらないかどうかを判定する。削除部(223)は、10進上の符号が変わらない場合にステップ9017に進み、一方、10進上の符号が変わる場合に当該使用Iは必要であると判定する(9019)。
ステップ909では、REMの各使用Iについて剰余の必要性をチェックする処理 AnalyzeUSE(REM, I, NDIGITS)を終了する。
ステップ1001では、削除部(223)は、REMの各定義Jについて剰余の必要性をチェックする処理 AnalyzeUSE(REM, I, NDIGITS)に従い、定義Jが必要であるか又は不必要であるかの判定を開始する。
ステップ1002では、削除部(223)は、定義Jが桁及び符号とも正しいかどうかを判定する。削除部(223)は、定義Jが桁及び符号とも正しくない場合にステップ1003に進み、一方、定義Jが桁及び符号とも正しい場合に当該定義Jが不必要であると判定する(1004)。
ステップ1003では、削除部(223)は、定義Jの入力について剰余が不必要と判断された場合に当該定義Jの出力についても不必要であるかどうかを判定する。削除部(223)は、上記出力についても不必要である場合にステップ1005に進み、一方、上記出力についても不必要でない場合に当該定義Jが必要であると判定する(1006)。
ステップ1005では、削除部(223)は、定義Jの各定義Lについて剰余の必要性をAnalyzeDEF(L, NDIGITS)に従い判定する。AnalyzeDEF(L, NDIGITS)については、図10のフローチャートと同じである。
ステップ1005では、削除部(223)は、全ての定義Lについて不必要であるかどうかを判定する。削除部(223)は、全ての定義Lについて不必要である場合に当該定義Lについて不必要であると判定し(1008)、一方全ての定義Lについて不必要でない場合に当該定義Lについて必要であると判定する(1009)。
VSETには、(1)ステップ604においてYesの場合、(2)ステップ606においてYesの場合、及び(3)ステップ606においてNoの場合のそれぞれに応じて、異なる集合情報が追加され、初期化され、又は、変更されない。
ブロック(1101)はバイナリコードの一部を示し、ブロック(1101)には、例えば、上から、変数V1、変数V2へのアクセス、副作用となり得る命令、及び変数V1へのアクセスがあるとする。そうすると、上から見ていくと、最終的に、GEN(B)はV1となり、KILL(B)はV1、V2となる。
ブロック(1102)において、最初にVSETにIN(B)の内容をコピーする。次に、変数V1へのアクセスがあることから、VSETにV1が追加される(ステップ605)。次に、変数V2へのアクセスがあることから、VSETにV1,V2が追加される(副作用となり得る命令の直前まで)(ステップ605)。次に、副作用となり得る命令があるのでVSETは空集合(φ)で初期化される(ステップ607)。次に、副作用となり得る命令の次に変数V1へのアクセスがあることから、VSETにV1が追加される(ステップ605)。
COBOLコード(1201)は最適化対象であるバイナリコード(1202)へ変換する前のソースコードである。
バイナリコード(1202)は、COBOLコード(1201)をCOBOLコンパイラによって変換した結果のコードである。
最適化されたコード(1203)は、バイナリコード(1202)を本発明の実施態様に従う最適化技法で最適化されたバイナリコードである。
処理部(222)は、検出部(221)によって検出された最適化対象領域内において、3〜8行目に示すコード(1212)を、最適化されたコード(1203)の3〜13行目に示すコード(1213)に書き換える。すなわち、処理部(222)は、バイナリコード(1202)中のゾーン10進数形式の変数を2進型へ変換している。当該変換の結果、最適化されたコード(1203)が得られる。
COBOLコード(1301)は最適化対象であるバイナリコード(1302)へ変換する前のソースコードである。
バイナリコード(1302)は、COBOLコード(1301)をCOBOLコンパイラによって変換した結果のコードである。
最適化されたコード(1303)は、バイナリコード(1302)を本発明の実施態様に従う最適化技法で最適化されたバイナリコードである。
処理部(222)は、検出部(221)によって検出された最適化対象領域内において、5〜19行目に示すコード(1312)を、最適化されたコード(1303)の5〜17行目に示すコード(1313)に書き換える。すなわち、処理部(222)は、バイナリコード(1302)中のゾーン10進数形式の変数を2進型へ変換している。当該変換の結果、最適化されたコード(1303)が得られる。
COBOLコード(1401)は最適化対象であるバイナリコード(1402)へ変換する前のソースコードである。
バイナリコード(1402)は、COBOLコード(1401)をCOBOLコンパイラによって変換した結果のコードである。
最適化されたコード(1403)は、バイナリコード(1402)を本発明の実施態様に従う最適化技法で最適化されたバイナリコードである。
また、バイナリコード(1402)は、副作用となり得る命令のない領域中に書き込みがある変数(すなわち、更新がある変数)の場合の例である。更新がある変数であることは、バイナリコード(1402)から特定できる。
処理部(222)は、検出部(221)によって検出された最適化対象領域内において、4行目のUNPACのコード「UNPK 0(8,8),256(4,13)」及びそれに付随する5行目の符号処理のコード「OI 7(8),X'F0'」、並びに6行目のPACKのコード「PACK 256(4,13),0(8,8)」及びそれに付随する7行目の符号処理のコード「OI 259(13),X'0F'」をバイナリコード(1402)から削除する。すなわち、処理部(222)は、PACK/UNPACKのコードのうち、最初(1行目)と最後(最後から2行目)の型変換命令以外のコード(4〜7行目)(1412)を削除している。当該削除の結果、最適化されたコード(1403)が得られる。
COBOLコード(1501)は最適化対象であるバイナリコード(1502)へ変換する前のソースコードである。
バイナリコード(1502)は、COBOLコード(1501)をCOBOLコンパイラによって変換した結果のコードである。
最適化されたコード(1503)は、バイナリコード(1502)を本発明の実施態様に従う最適化技法で最適化されたバイナリコードである。
また、バイナリコード(1502)は、副作用となり得る命令のない領域中に書き込みがない変数(すなわち、更新がない変数)の場合の例である。更新がない変数であることは、バイナリコード(1502)から特定できる。
処理部(222)は、検出部(221)によって検出された最適化対象領域内において、5行目のPACKのコード「PACK 256(16,13),40(7,8)」及びそれに付随する6行目の符号処理のコード「OI 271(13),X'0F'」をバイナリコード(1502)から削除する。すなわち、処理部(222)は、変数idx2に対するPACK/UNPACKのコードのうち、最初(1行目)の型変換命令以外のコード(5〜6行目)を削除している。当該削除の結果、最適化されたコード(1503)が得られる。
なお、変数idxに対するPACK/UNPACKのコードであるPACKのコード(下から5行目)及びUNPKのコード(下から2行目)も除去可能である。
Claims (20)
- ゾーン10進数形式の変数へのアクセスを有する言語のバイナリコードを最適化する方法であって、コンピュータが、
メモリ内に読み込まれた前記バイナリコード中から、各変数について、ゾーン10進数形式の変数へのアクセスを含み且つ副作用となり得る命令のない領域を検出するステップと、
前記検出された領域内において、ゾーン10進数形式の変数を2進型へ変換する処理、PACK/UNPACKのコードを削除しても変換された結果が変わらないPACK/UNPACKのコードを前記バイナリコードから削除する処理、又はそれらの組み合わせの処理を行うステップと
を実行することを含む、前記方法。 - 前記処理を行うステップの後に、前記コンピュータが、桁合わせをするための剰余算命令のコードを前記バイナリコードから削除するステップをさらに実行することを含む、請求項1に記載の方法。
- 前記桁合わせをするための剰余算命令のコードを前記バイナリコードから削除するステップが、
(A)前記変数がn1桁であり、さらに当該変数をn2桁にする剰余算命令についてn1≧n2の条件を満たす場合には、前記n1桁に桁合わせをするための剰余算命令のコードを前記バイナリコードから削除するステップと、
(B)前記(A)の条件下にない場合には、
(a)前記変数が符号なしの場合に、
(a1)前記検出された領域内において、足し算、掛け算又は引き算の演算が連続している場合において、2進計算のオーバーフローが起きないことが保証できる演算の範囲がコンパイル時にわかる場合にのみ、前記保証できる連続した演算のうち、最後の一回の剰余算命令のコード以外の剰余算命令のコードを前記バイナリコードから削除するステップと、
(a2)前記(a1)以外の場合において、当該(a1)の条件を満たさない演算の前で桁が正しいことを保証するステップと、
(b)前記変数が符号ありの場合に、
(b1)前記検出された領域内において、足し算、掛け算又は引き算の演算が連続している場合において、当該連続している一連の演算の式の途中で符号が変わらないこと及び2進計算のオーバーフローが起きないことが保証できる演算の範囲がコンパイル時にわかる場合にのみ、前記保証できる連続した演算のうち、最後の一回の剰余算命令のコード以外の剰余算命令のコードを前記バイナリコードから削除するステップと、
(b2)前記(b1)以外の場合において、当該(b1)の条件を満たさない演算の前で桁が正しいことを保証するステップと
を含む、請求項2に記載の方法。 - 前記桁合わせをするための剰余算命令のコードを前記バイナリコードから削除するステップの後に、前記コンピュータが、前記バイナリコード中の残った個々の剰余算命令に対して、演算子強度の軽減を行うステップをさらに実行することを含み、
前記軽減が、前記剰余を求める演算を下記式:
結果 = (分子 < 分母 && 分子 >= 0) ? 分子 : (分子 % 分母)
に置き換えることによって行われる、請求項2に記載の方法。 - 前記(a2)の保証するステップが、前記(a1)の条件を満たさない演算の前で桁が正しいことを保証する剰余算命令のコードを生成し、当該生成した剰余算命令のコードを前記バイナリコードに挿入するステップを含む、請求項3に記載の方法。
- 前記(b2)の保証するステップが、前記(b1)の条件を満たさない演算の前で桁が正しいことを保証する剰余算命令のコードを生成し、当該生成した剰余算命令のコードを前記バイナリコードに挿入するステップを含む、請求項3に記載の方法。
- 前記検出するステップが、
前記バイナリコード中の各ブロックにおいて、副作用となり得る命令の後にアクセスがある変数の集合体(以下、GEN(B)ともいう)及び前記各ブロックにおいて、副作用となり得る命令が存在する場合には変数全体の集合体(以下、KILL(B)ともいう)を作成するステップであって、前記KILL(B)は、副作用となり得る命令が存在しない場合には空集合である、前記作成するステップと、
各ブロックの先頭における変数の集合(以下、IN(B)ともいう)を、各ブロックの終わりにおける変数の集合(以下、OUT(B)ともいう)、前記GEN(B)及び前記KILL(B)から求めるステップと、
各ブロック内の各命令において変更された集合情報を前記各ブロック内の各命令に付加情報としてそれぞれ設定するステップであって、前記集合情報は前記IN(B)を基にして求められる、前記設定するステップと、
前記各命令に設定された付加情報について、各変数が連続している領域を、当該変数に対する副作用となり得る命令のない領域とするステップと
を含む、請求項1に記載の方法。 - 前記作成するステップが、
各ブロック内の命令が変数へのアクセスであるかどうか、及び、前記命令が副作用となり得る命令であるかどうかを判定するステップと、
前記判定を各命令の実行順に繰り返すステップと、
前記判定の結果から、前記GEN(B)及び前記KILL(B)を作成するステップと
を含む、請求項7に記載の方法。 - 前記OUT(B)及び前記IN(B)が、
OUT(B) = (IN(B) - KILL(B)) ∪ GEN(B)
IN(B) = ∩N∈Pred(B) OUT(N)
のデータ・フロー方程式から求められ、OUT(N)は、上記式で処理中のブロックBの直前にあるブロックNの終わりにおける変数の集合であり、副作用となり得る命令の後でアクセスがあった変数の集合である、請求項7に記載の方法。 - 前記設定するステップが、
各ブロック内の命令が変数へのアクセスであるかどうか、及び、前記命令が副作用となり得る命令であるかどうかを判定し、前記IN(B)の集合情報を変更するステップと、
前記各ブロック内の各命令において変更された集合情報を前記ブロック内の各命令に付加情報としてそれぞれ設定するステップであって、前記集合情報は前記IN(B)を基にして求められる、上記設定するステップと、
前記判定及び前記IN(B)の集合情報の変更を各命令の実行順に繰り返すステップと
を含む、請求項7に記載の方法。 - 前記PACK/UNPACKのコードを前記バイナリコードから削除する前記処理が、
(c1)副作用となり得る命令のない前記領域中に書き込みがある変数の場合に、前記副作用となり得る命令のない前記領域内にあるゾーン10進数形式の変数に対するPACK/UNPACKのコードのうち、最初と最後の型変換命令以外のコードを前記バイナリコードから削除する処理と、
(c2)副作用となり得る命令のない前記領域中に書き込みがない変数の場合に、前記副作用となり得る命令のない前記領域内にあるゾーン10進数形式の変数に対するPACK/UNPACKのコードのうち、最初の型変換命令以外のコードを前記バイナリコードから削除する処理と
を含む、請求項1に記載の方法。 - 前記PACK/UNPACKのコードを前記バイナリコードから削除する前記処理が、
(c3)前記(c1)及び/又は(c2)の前記型変換命令以外のコードを削除する際に、当該削除するコードに付随する符号処理のコードを前記バイナリコードからさらに削除する処理をさらに含む、請求項11に記載の方法。 - ゾーン10進数形式の変数を2進型へ変換する前記処理が、当該変換処理前後のコスト差を見積もり、変換処理後の見積もりコストが変換処理前の見積もりコストよりも小さいことを条件に行われ、次に、
前記PACK/UNPACKのコードを前記バイナリコードから削除する処理が、前記コスト差の見積もりの計算によって前記変換する処理がされなかった部分について行われる、請求項1に記載の方法。 - 前記変換処理前後の前記コスト差が、下記式:
コスト差=変数がゾーン10進数形式である場合と2進型である場合とでの当該変数へアクセスする命令のコスト差にその実行頻度を乗じた値
+2進型への変換コストに各前記検出された領域内へ入る実行頻度を乗じた値
+ゾーン10進数形式への変換コストに各前記検出された領域から出る実行頻度を乗じた値
+桁合わせをするための剰余算命令のコストにその剰余算命令の実行頻度を乗じた値
によって求められる、請求項13に記載の方法。 - 前記副作用となり得る命令が、ゾーン10進数形式の変数を2進型への型変換を行うと処理矛盾を起こし得る命令、又は、PACK/UNPACKのコードを削除すると処理矛盾を起こし得る命令である、請求項1に記載の方法。
- 前記副作用となり得る命令が、
コンパイル・スコープ外の命令を実行する命令、
アプリケーションから観測可能な例外を起こし得る命令、及び、
前記変数のベースアドレス・レジスタ又はインデックス・レジスタを変更する命令
の少なくとも1つである、請求項1に記載の方法。 - ゾーン10進数形式の変数へのアクセスを有する言語のバイナリコードを最適化する装置であって、
各変数について、ゾーン10進数形式の変数へのアクセスを含み且つ副作用となり得る命令のない領域を検出する検出部と、
前記検出された領域内において、ゾーン10進数形式の変数を2進型へ変換する処理、PACK/UNPACKのコードを削除しても変換された結果が変わらないPACK/UNPACKのコードを前記バイナリコードから削除する処理、及びそれらの組み合わせの処理のうちの1つを行う処理部と
を備えている、前記装置。 - 前記処理が前記処理部によって行われた後に、桁合わせをするための剰余算命令のコードを前記バイナリコードから削除する削除部をさらに備えており、
前記削除部は、
(A)前記変数がn1桁であり、さらに当該変数をn2桁にする剰余算命令についてn1≧n2の条件を満たす場合には、前記n1桁に桁合わせをするための剰余算命令のコードを前記バイナリコードから削除し、
(B)前記(A)の条件下にない場合には、
(a)前記変数が符号なしの場合に、
(a1)前記検出された領域内において、足し算、掛け算又は引き算の演算が連続している場合において、2進計算のオーバーフローが起きないことが保証できる演算の範囲がコンパイル時にわかる場合にのみ、前記保証できる連続した演算のうち、最後の一回の剰余算命令のコード以外の剰余算命令のコードを前記バイナリコードから削除し、
(a2)前記(a1)以外の場合において、当該(a1)の条件を満たさない演算の前で桁が正しいことを保証し、
(b)前記変数が符号ありの場合に、
(b1)前記検出された領域内において、足し算、掛け算又は引き算の演算が連続している場合において、当該連続している一連の演算の式の途中で符号が変わらないこと及び2進計算のオーバーフローが起きないことが保証できる演算の範囲がコンパイル時にわかる場合にのみ、前記保証できる連続した演算のうち、最後の一回の剰余算命令のコード以外の剰余算命令のコードを前記バイナリコードから削除し、
(b2)前記(b1)以外の場合において、当該(b1)の条件を満たさない演算の前で桁が正しいことを保証する、
請求項17に記載の装置。 - ゾーン10進数形式の変数へのアクセスを有する言語のバイナリコードを最適化する装置であって、
前記バイナリコードを読み込むためのメモリと、
前記メモリ上で前記バイナリコードを最適化するためのプロセッサと
を備えており、
前記最適化が、請求項1〜16のいずれか一項に記載の方法の各ステップを実行することによって行われる、前記装置。 - ゾーン10進数形式の変数へのアクセスを有する言語のバイナリコードを最適化するためのコンピュータ・プログラムであって、コンピュータに、請求項1〜16のいずれか一項に記載の方法の各ステップを実行させる、前記コンピュータ・プログラム。
Priority Applications (3)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2011121446A JP5689366B2 (ja) | 2011-05-31 | 2011-05-31 | ゾーン10進数形式の変数へのアクセスを有する言語のバイナリコードを最適化する方法、並びにその最適化装置及びコンピュータ・プログラム |
US13/483,300 US20120311550A1 (en) | 2011-05-31 | 2012-05-30 | Method for optimizing binary codes in language having access to zoned decimal type variable, optimization apparatus and computer program for the same |
US13/591,330 US20120317560A1 (en) | 2011-05-31 | 2012-08-22 | Method for optimizing binary codes in language having access to zoned decimal type variable, optimization apparatus and computer program for the same |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2011121446A JP5689366B2 (ja) | 2011-05-31 | 2011-05-31 | ゾーン10進数形式の変数へのアクセスを有する言語のバイナリコードを最適化する方法、並びにその最適化装置及びコンピュータ・プログラム |
Publications (2)
Publication Number | Publication Date |
---|---|
JP2012248139A JP2012248139A (ja) | 2012-12-13 |
JP5689366B2 true JP5689366B2 (ja) | 2015-03-25 |
Family
ID=47262721
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
JP2011121446A Expired - Fee Related JP5689366B2 (ja) | 2011-05-31 | 2011-05-31 | ゾーン10進数形式の変数へのアクセスを有する言語のバイナリコードを最適化する方法、並びにその最適化装置及びコンピュータ・プログラム |
Country Status (2)
Country | Link |
---|---|
US (2) | US20120311550A1 (ja) |
JP (1) | JP5689366B2 (ja) |
Families Citing this family (9)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US8856759B2 (en) * | 2010-02-01 | 2014-10-07 | Bull Hn Information Systems Inc. | Method and apparatus providing COBOL decimal type arithmetic functions with improved performance |
JP5967618B2 (ja) | 2013-04-17 | 2016-08-10 | インターナショナル・ビジネス・マシーンズ・コーポレーションInternational Business Machines Corporation | 二進化十進数型変数へのアクセスを有する言語のバイナリコードを最適化する方法、並びにそのコンピュータ及びコンピュータ・プログラム |
US9858058B2 (en) * | 2014-03-31 | 2018-01-02 | International Business Machines Corporation | Partition mobility for partitions with extended code |
FR3030077B1 (fr) * | 2014-12-10 | 2016-12-02 | Arnault Ioualalen | Procede d'ajustement de la precision d'un programme d'ordinateur manipulant au moins un nombre a virgule. |
US10083015B2 (en) | 2016-12-15 | 2018-09-25 | International Business Machines Corporation | Mobile accessibility evaluation from application binary |
US10713145B2 (en) * | 2018-01-05 | 2020-07-14 | International Business Machines Corporation | Automated debugging with combined static and dynamic analysis |
US11144840B2 (en) | 2018-07-26 | 2021-10-12 | International Business Machines Corporation | Completing decision logic to avoid a side effect |
US11221835B2 (en) * | 2020-02-10 | 2022-01-11 | International Business Machines Corporation | Determining when to perform and performing runtime binary slimming |
US11442726B1 (en) | 2021-02-26 | 2022-09-13 | International Business Machines Corporation | Vector pack and unpack instructions |
Family Cites Families (11)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US4141005A (en) * | 1976-11-11 | 1979-02-20 | International Business Machines Corporation | Data format converting apparatus for use in a digital data processor |
JPH0721033A (ja) * | 1993-07-07 | 1995-01-24 | Nec Corp | 言語処理装置及びその方法 |
US6041177A (en) * | 1997-02-26 | 2000-03-21 | Fujitsu Limited | Program analyzing apparatus which categorizes variables into domains and method thereof |
US6064817A (en) * | 1997-07-23 | 2000-05-16 | International Business Machines Corporation | Compiler-assisted or interpreter-assisted solution to the year 2000 problem for computer programs |
US7383529B2 (en) * | 2004-02-13 | 2008-06-03 | The Regents Of The University Of California | Method and apparatus for designing circuits using high-level synthesis |
EP1643362A3 (en) * | 2004-10-01 | 2006-04-26 | Electronic Data Systems Corporation | System and method for optimizing mainframe applications |
US7389499B2 (en) * | 2004-10-21 | 2008-06-17 | International Business Machines Corporation | Method and apparatus for automatically converting numeric data to a processor efficient format for performing arithmetic operations |
US7730471B2 (en) * | 2005-07-13 | 2010-06-01 | Compuware Corporation | Method and system for processing COBOL language record description entries that specify data items that include a varying length characteristic and computer readable storage medium for storing instructions for performing the method |
US7873952B2 (en) * | 2006-03-09 | 2011-01-18 | Oracle America, Inc. | Code transformation to optimize fragments that implement constant loading |
US8140608B1 (en) * | 2007-05-31 | 2012-03-20 | Nvidia Corporation | Pipelined integer division using floating-point reciprocal |
US20100251227A1 (en) * | 2009-03-25 | 2010-09-30 | Microsoft Corporation | Binary resource format and compiler |
-
2011
- 2011-05-31 JP JP2011121446A patent/JP5689366B2/ja not_active Expired - Fee Related
-
2012
- 2012-05-30 US US13/483,300 patent/US20120311550A1/en not_active Abandoned
- 2012-08-22 US US13/591,330 patent/US20120317560A1/en not_active Abandoned
Also Published As
Publication number | Publication date |
---|---|
US20120311550A1 (en) | 2012-12-06 |
US20120317560A1 (en) | 2012-12-13 |
JP2012248139A (ja) | 2012-12-13 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
JP5689366B2 (ja) | ゾーン10進数形式の変数へのアクセスを有する言語のバイナリコードを最適化する方法、並びにその最適化装置及びコンピュータ・プログラム | |
US9733913B2 (en) | Methods and systems to vectorize scalar computer program loops having loop-carried dependences | |
KR101381274B1 (ko) | 효율적인 동적 이진 변환을 위한 레지스터 매핑 방법, 시스템 및 컴퓨터 판독가능 저장 매체 | |
US7873952B2 (en) | Code transformation to optimize fragments that implement constant loading | |
US9858054B2 (en) | Method for optimizing binary code in language having access to binary coded decimal variable, and computer and computer program | |
EP0732650B1 (en) | Resource assigning apparatus | |
US8447956B2 (en) | Running subtract and running divide instructions for processing vectors | |
US20100095286A1 (en) | Register reduction and liveness analysis techniques for program code | |
US20120159461A1 (en) | Program optimizing apparatus, program optimizing method, and program optimizing article of manufacture | |
JPH0695311B2 (ja) | コード最適化方法 | |
JP2009110299A (ja) | プログラムを最適化するコンパイラ | |
US8332833B2 (en) | Procedure control descriptor-based code specialization for context sensitive memory disambiguation | |
JPH096627A (ja) | 最適化装置 | |
JP2007286671A (ja) | ソフトウェア/ハードウェア分割プログラム、および分割方法。 | |
WO2014136611A1 (ja) | コスト算出装置、コスト算出方法、及びコンピュータ読み取り可能な記録媒体 | |
US8056066B2 (en) | Method and apparatus for address taken refinement using control flow information | |
JP6366033B2 (ja) | プログラム中のif文の最適化方法 | |
US6584611B2 (en) | Critical path optimization—unload hard extended scalar block | |
JP6481515B2 (ja) | 情報処理装置、コンパイル方法、及びコンパイラプログラム | |
JP6409639B2 (ja) | コンパイラプログラム、システム、方法、及び装置 | |
El Moussawi et al. | Superword level parallelism aware word length optimization | |
JP2002312176A (ja) | 変換プログラム、コンパイラ、コンピュータ装置、プログラム変換方法及び記憶媒体 | |
JP6627630B2 (ja) | コンパイル方法、コンパイルプログラム及び情報処理装置 | |
JP4768214B2 (ja) | コンパイル方法、及びデータ処理装置。 | |
JPH11149380A (ja) | コンパイラとプログラム最適化方法およびその処理プログラムを記録した記録媒体 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
A621 | Written request for application examination |
Free format text: JAPANESE INTERMEDIATE CODE: A621 Effective date: 20140210 |
|
A977 | Report on retrieval |
Free format text: JAPANESE INTERMEDIATE CODE: A971007 Effective date: 20141211 |
|
TRDD | Decision of grant or rejection written | ||
A521 | Request for written amendment filed |
Free format text: JAPANESE INTERMEDIATE CODE: A821 Effective date: 20150107 |
|
RD14 | Notification of resignation of power of sub attorney |
Free format text: JAPANESE INTERMEDIATE CODE: A7434 Effective date: 20150107 |
|
A01 | Written decision to grant a patent or to grant a registration (utility model) |
Free format text: JAPANESE INTERMEDIATE CODE: A01 Effective date: 20150107 |
|
A61 | First payment of annual fees (during grant procedure) |
Free format text: JAPANESE INTERMEDIATE CODE: A61 Effective date: 20150128 |
|
R150 | Certificate of patent or registration of utility model |
Ref document number: 5689366 Country of ref document: JP Free format text: JAPANESE INTERMEDIATE CODE: R150 |
|
LAPS | Cancellation because of no payment of annual fees |