(57)【要約】【課題】本発明は、ＢＣＤ型変数へのアクセスを有する言語のバイナリコードの最適化において、メモリ単位の計算であるＢＣＤ演算の型からレジスタ単位の計算であるＤＦＰ演算の型への変換により生じる困難を解決して、該ＢＣＤ演算の型から該ＤＦＰ演算の型への変換を可能にする最適化技法を提供することを目的とする。【解決手段】本発明に従う最適化技法は、バイナリコードの第１のコンパイラ表現を生成すること、該第１のコンパイラ表現に対して使用−定義連鎖及び／又は定義−使用連鎖を解析し、該解析の結果に基づき上記第１のコンパイラ表現中の論理ＢＣＤ変数を識別し、該識別した論理ＢＣＤ変数に一時変数を割り当てして第２のコンパイラ表現を生成し、該第２のコンパイラ表現中のパック１０進数の演算と一時変数の型とを、ＢＣＤ演算の型からＤＦＰ演算の型への変換によって符号情報と精度情報とが失われないことを条件にＤＦＰ型に変換する。【選択図】図２
2014211696.tif 000002
【特許請求の範囲】
【請求項１】
二進化十進数（Binary Coded Decimal；以下、ＢＣＤという）演算の型を十進浮動小数点（Decimal Floating Point；以下、ＤＦＰという）演算の型に変換することによって、ＢＣＤ型変数へのアクセスを有する言語のバイナリコードを最適化する方法であって、コンピュータが、
（ａ）前記バイナリコードの第１のコンパイラ表現を生成するステップと、
（ｂ）前記第１のコンパイラ表現に対して使用−定義連鎖（use-definition chain）及び／又は定義−使用連鎖（definition-use chain）を解析するステップと、
（ｃ）前記解析の結果に基づき前記第１のコンパイラ表現中の論理ＢＣＤ変数を識別し、当該識別した論理ＢＣＤ変数に一時変数を割り当てして、第２のコンパイラ表現を生成するステップであって、前記第２のコンパイラ表現が、パック１０進数（packed decimal）の演算と前記割り当てされた一時変数とを含む、前記第２のコンパイラ表現を生成するステップと、
（ｄ）ＢＣＤ演算の型からＤＦＰ演算の型への変換によって符号情報と精度情報とが失われないことを条件に、前記第２のコンパイラ表現中の前記パック１０進数の前記演算のうちの少なくとも１つの演算の型と前記割り当てされた一時変数のうちの少なくとも１つの一時変数の型とをＤＦＰ型に変換するステップと
を実行することを含み、
前記ステップ（ｃ）の識別するステップが、前記第１のコンパイラ表現中のオペランドの使用−定義連鎖及び／又は定義−使用連鎖において、定義（def）のオペランドと使用（use）のオペランドとを同一の論理ＢＣＤ変数とみなすステップを含む、前記方法。
【請求項２】
前記ステップ（ｃ）の同一の論理ＢＣＤ変数とみなすステップが、
前記第１のコンパイラ表現中のオペランドの前記使用−定義連鎖及び／又は定義−使用連鎖において、定義（def）が支配する使用（use）があり、当該定義（def）から当該使用（use）の間の全てのパスに当該使用（use）に対する他の定義（def）が存在せず、且つ、当該定義（def）に対して上記使用（use）がただ一つ存在する場合に、
前記使用（use）及び前記定義（def）の各オペランドの右端のアドレスが同一であること；且つ、
前記使用（use）及び前記定義（def）の各オペランドの型が同一のＢＣＤ型であること；且つ、
前記使用（use）及び前記定義（def）の各オペランドのサイズが同じであること
を条件に、前記使用（use）のオペランドと前記定義（def）のオペランドとを同一の論理ＢＣＤ変数とみなすステップを含む、
請求項１に記載の方法。
【請求項３】
前記ステップ（ｃ）の同一の論理ＢＣＤ変数とみなすステップが、
前記第１のコンパイラ表現中のオペランドの前記使用−定義連鎖及び／又は定義−使用連鎖において、定義（def）が支配する使用（use）があり、当該定義（def）から当該使用（use）の間の全てのパスに当該使用（use）に対する他の定義（def）が存在せず、且つ、当該定義（def）に対して上記使用（use）がただ一つ存在する場合に、
前記使用（use）及び前記定義（def）の各オペランドの右端のアドレスが同一であること；且つ、
前記使用（use）及び前記定義（def）の各オペランドの型が同一のＢＣＤ型であること；且つ、
前記使用（use）のオペランドのサイズが前記定義（def）のオペランドのサイズよりも小さいこと；且つ、
前記第２のコンパイラ表現の生成において桁合わせのための命令を前記第１のコンパイラ表現中に挿入すること
を条件に、前記使用（use）のオペランドと前記定義（def）のオペランドとを同一の論理ＢＣＤ変数とみなすステップを含む、
請求項１又は２に記載の方法。
【請求項４】
前記ステップ（ｃ）の同一の論理ＢＣＤ変数とみなすステップが、
前記第１のコンパイラ表現中のオペランドの前記使用−定義連鎖及び／又は定義−使用連鎖において、定義（def）が支配する使用（use）があり、当該定義（def）から当該使用（use）の間の全てのパスに当該使用（use）に対する他の定義（def）が存在せず、且つ、当該定義（def）に対して上記使用（use）がただ一つ存在する場合に、
前記使用（use）及び前記定義（def）の各オペランドの右端のアドレスが同一であること；且つ、
前記使用（use）及び前記定義（def）の各オペランドの型が同一のＢＣＤ型であること；且つ、
前記使用（use）のオペランドのサイズが前記定義（def）のオペランドのサイズよりも大きいこと；且つ、
前記使用（use）のオペランドと前記定義（def）のオペランドとが重なっていない領域にゼロが入っていること
を条件に、前記使用（use）のオペランドと前記定義（def）のオペランドとを同一の論理ＢＣＤ変数とみなすステップを含む、
請求項１〜３のいずれか一項に記載の最適化方法。
【請求項５】
前記ステップ（ｂ）と（ｃ）との間において、前記コンピュータが、
前記第１のコンパイラ表現中のオペランドの前記使用−定義連鎖及び／又は定義−使用連鎖において、定義（def）が支配する使用（use）があり、当該定義（def）から当該使用（use）の間の全てのパスに当該使用（use）に対する他の定義（def）が存在せず、且つ、当該定義（def）に対して上記使用（use）がただ一つ存在する場合に、
前記使用（use）及び前記定義（def）の各オペランドの右端のアドレスが同一でない１又は複数の命令を、前記同一の論理ＢＣＤ変数とみなすステップが適用できる他の命令に変換するステップ
をさらに実行することを含む、請求項１に記載の方法。
【請求項６】
前記ステップ（ｂ）と（ｃ）との間において、前記コンピュータが、
前記第１のコンパイラ表現中の２つのＢＣＤ演算を１つのＢＣＤ演算に結合するステップ
をさらに実行することを含む、請求項１に記載の方法。
【請求項７】
前記結合するステップが、
２つの連続した第１及び第２の命令のパック１０進数型のオペランドからゾーン１０進数型のオペランドへの変換を行う命令があること；
前記第１の命令のパック１０進数型のオペランドの右端のバイトアドレスが、前記第２の命令のパック１０進数型のオペランドの左端のバイトアドレスと同一であること；且つ、
前記第１の命令のパック１０進数型のオペランドをゾーン１０進数型に変換した第１の命令のゾーン１０進数型のオペランドの右端のバイトアドレスが、前記第２の命令のパック１０進数型のオペランドをゾーン１０進数型に変換した第２の命令のゾーン１０進数型のオペランドの左端のバイトアドレスと同一であること
を条件に、前記第１の命令のパック１０進数型のオペランドと前記第２の命令のパック１０進数型のオペランドとを結合したオペランドを、前記第１の命令のゾーン１０進数型のオペランドと前記第２の命令のゾーン１０進数型のオペランドとを結合したオペランドに変換を行うステップ、又は、
２つの連続した第１及び第２の命令のゾーン１０進数型のオペランドからパック１０進数型のオペランドへの変換を行う命令があること；
前記第１の命令のゾーン１０進数型のオペランドの右端のバイトアドレスが、前記第２の命令のゾーン１０進数型のオペランドの左端のバイトアドレスと同一であること；且つ、
前記第１の命令のゾーン１０進数型のオペランドをパック１０進数型に変換した第１の命令のパック１０進数型のオペランドの右端のバイトアドレスが、前記第２の命令のゾーン１０進数型のオペランドをパック１０進数型の変換した第２の命令のパック１０進数型のオペランドの左端のバイトアドレスと同一であること
を条件に、前記第１の命令のゾーン１０進数型のオペランドと前記第２の命令のゾーン１０進数型のオペランドとを結合したオペランドを、前記第１の命令のパック１０進数型のオペランドと前記第２の命令のパック１０進数型のオペランドとを結合したオペランドに変換を行うステップ
を含む、請求項６に記載の方法。
【請求項８】
前記ステップ（ｂ）と（ｃ）との間において、前記コンピュータが、
前記第１のコンパイラ表現中の非ＢＣＤ演算の型をＢＣＤ演算の型に変換するステップ
をさらに実行することを含む、請求項１に記載の方法。
【請求項９】
前記第１のコンパイラ表現中の非ＢＣＤ演算の型をＢＣＤ演算の型に変換するステップが下記（１）〜（４）のいずれか一つの条件を満たす場合に行われる、請求項８に記載の方法：
（１）前記非ＢＣＤ演算がバイト長のオペランドに対する定数値の論理和の演算であり、
前記バイト長のオペランドの使用（use）に対する定義（def）が一意に存在し、且つ当該定義（def）がパック１０進数型のオペランド又はゾーン１０進数型のオペランドであること；且つ、
前記バイト長のオペランドの前記使用（use）のアドレスが、当該使用（use）に対する定義（def）の右端のアドレスと同一であること；且つ、
前記第１のコンパイラ表現中に定数として表現されている値が符号部のビットのみを全て１にする値であること
という条件；
（２）前記非ＢＣＤ演算がバイト長のオペランドに対する定数値の論理積の演算であり、
前記バイト長のオペランドの使用（use）に対する定義（def）が一意に存在し、且つ当該定義（def）がパック１０進数型のオペランドであること；且つ、
前記バイト長のオペランドの前記使用（use）のアドレスが、当該使用（use）に対する定義（def）の右端のアドレスと異なること；且つ、
前記第１のコンパイラ表現中に定数として表現されている値が上位の桁をゼロにする値であること
という条件；
（３）前記非ＢＣＤ演算がメモリ比較の演算であり、
前記第１のコンパイラ表現中のメモリ比較の第１のオペランドの前記使用−定義連鎖及び／又は前記定義−使用連鎖において、当該第１のオペランドの使用（use）を支配する定義（def）があり、当該定義（def）から当該使用（use）の間の全てのパスに当該使用（use）に対する他の定義（def）が存在せず、且つ、当該定義（def）に対して上記使用（use）がただ一つ存在すること；且つ、
前記第１のオペランドの前記使用（use）の右端のアドレスが、前記第１のオペランドの前記定義（def）の右端のアドレスと同一であること；且つ、
前記第１のオペランドの前記定義（def）がパック１０進数型のオペランドであること；且つ、
前記第１のオペランドの前記使用（use）のサイズが前記第１のオペランドの前記定義（def）のサイズと同じであること、又は、前記第１のオペランドの前記使用（use）のサイズが前記第１のオペランドの前記定義（def）のサイズよりも小さいこと、又は、前記第１のオペランドの前記使用（use）のサイズが前記第１のオペランドの前記定義（def）のサイズよりも大きく且つ前記第１のオペランドの前記使用（use）と前記第１のオペランドの前記定義（def）の重なっていない領域にゼロが入っていること；且つ、
前記第１のコンパイラ表現中のメモリ比較の第２のオペランドの前記使用−定義連鎖及び／又は前記定義−使用連鎖において、当該第２のオペランドの使用（use）を支配する定義（def）があり、当該定義（def）から当該使用（use）の間の全てのパスに当該使用（use）に対する他の定義（def）が存在せず、且つ、当該定義（def）に対して上記使用（use）がただ一つ存在すること；且つ、
前記第２のオペランドの前記使用（use）の右端のアドレスが、前記第２のオペランドの前記定義（def）の右端のアドレスと同一であること；且つ、
前記第２のオペランドの前記定義（def）がパック１０進数型のオペランドであること；且つ、
前記第２のオペランドの前記使用（use）のサイズが前記第２のオペランドの前記定義（def）のサイズと同じであること、又は、前記第２のオペランドの前記使用（use）のサイズが前記第２のオペランドの前記定義（def）のサイズよりも小さいこと、又は、前記第２のオペランドの前記使用（use）のサイズが前記第２のオペランドの前記定義（def）のサイズよりも大きく且つ前記第２のオペランドの前記使用（use）と前記第２のオペランドの前記定義（def）の重なっていない領域にゼロが入っていること
という条件、又は、
（４）前記非ＢＣＤ演算がメモリ・コピーの演算であり、
前記第１のコンパイラ表現中のメモリ・コピー元のオペランドの使用−定義連鎖及び／又は定義−使用連鎖において、定義（def）が支配する使用（use）があり、当該定義（def）から当該使用（use）の間の全てのパスに当該使用（use）に対する他の定義（def）が存在せず、且つ、当該定義（def）に対して上記使用（use）がただ一つ存在すること；且つ、
前記メモリ・コピー元のオペランドの使用（use）の右端のアドレスが、前記メモリ・コピー元のオペランドの前記定義（def）の右端のアドレスと同一であること；且つ、
前記メモリ・コピー元の前記定義（def）がパック１０進数型のオペランドであること；且つ、
前記第メモリ・コピー元の前記使用（use）のサイズが前記メモリ・コピー元の前記定義（def）のサイズと同じであること、又は、前記メモリ・コピー元の第２のオペランドの前記使用（use）のサイズが前記メモリ・コピー元のオペランドの前記定義（def）のサイズよりも小さいこと、又は、前記第２のオペランドの前記使用（use）のサイズが前記第２のオペランドの前記定義（def）のサイズよりも大きく且つ前記第２のオペランドの前記使用（use）と前記第２のオペランドの前記定義（def）の重なっていない領域にゼロが入っていること
という条件。
【請求項１０】
前記ステップ（ｂ）と（ｃ）との間において、前記コンピュータが、
前記第１のコンパイラ表現中のオペランドの定義（def）の左端の桁からのゼロの桁数を解析するステップ
をさらに実行することを含む、請求項４に記載の方法。
【請求項１１】
前記ステップ（ｃ）の同一の論理ＢＣＤ変数とみなすステップが、
前記ゼロの桁数の解析の結果を使用して、前記使用（use）のオペランドと前記定義（def）のオペランドとが重なっていない領域にゼロが入っていることを判断するステップをさらに含む、請求項１０に記載の方法。
【請求項１２】
前記ステップ（ｄ）が、
ＤＦＰ型の符号コードをＢＣＤ型が有する符号コード中の優先符号コード（preferred sign-code）とみなし、前記第２のコンパイラ表現中の演算についての論理ＢＣＤ変数の符号コードすべてを優先符号コードに置き換えた場合においても、当該優先符号コードに置き換えた演算について同一の結果が得られることを条件に前記変換を行うステップ
を含む、請求項１に記載の方法。
【請求項１３】
前記ステップ（ｄ）が、
論理ＢＣＤ変数の最大精度よりも大きい精度の浮動小数点レジスタを割り当て、各ＢＣＤ演算命令について前記解析の結果をもとにオーバーフロー（overflow）が発生する可能性があるかを解析するステップと、
前記オーバーフローが発生する可能性がある場合に桁合わせのための命令を前記第２のコンパイラ表現中に挿入するステップと
をさらに含む、請求項１に記載の方法。
【請求項１４】
二進化十進数（Binary Coded Decimal；以下、ＢＣＤという）演算を十進浮動小数点（Decimal Floating Point；以下、ＤＦＰという）演算に変換することによって、ＢＣＤ型変数へのアクセスを有する言語のバイナリコードから生成されるコンパイラ表現を最適化し、当該最適化されたコンパイラ表現をマシンコードに変換する方法であって、コンピュータが、
請求項１〜１３のいずれか一項に記載の方法の各ステップを実行するステップと、
前記ステップ（ｄ）の前記変換によって生成された第３のコンパイラ表現をマシンコードに変換するステップと
を実行することを含む、前記方法。
【請求項１５】
二進化十進数（Binary Coded Decimal；以下、ＢＣＤという）演算の型を十進浮動小数点（Decimal Floating Point；以下、ＤＦＰという）演算の型に変換することによって、ＢＣＤ型変数へのアクセスを有する言語のバイナリコードを最適化するコンピュータであって、
前記バイナリコードの第１のコンパイラ表現を生成する第１のコンパイラ表現生成部と、
前記第１のコンパイラ表現に対して使用−定義連鎖（use-definition chain）及び／又は定義−使用連鎖（definition-use chain）を解析する解析部と、
前記解析の結果に基づき前記第１のコンパイラ表現中の論理ＢＣＤ変数を識別する識別部と、
前記識別した論理ＢＣＤ変数に一時変数を割り当てして、第２のコンパイラ表現を生成する第２のコンパイラ表現生成部であって、前記第２のコンパイラ表現が、パック１０進数（packed decimal）の演算と前記割り当てされた一時変数とを含む、前記第２のコンパイラ表現生成部と、
ＢＣＤ演算の型からＤＦＰ演算の型への変換によって符号情報と精度情報とが失われないことを条件に、前記第２のコンパイラ表現中の前記パック１０進数の前記演算のうちの少なくとも１つの演算の型と前記割り当てされた一時変数のうちの少なくとも１つの一時変数の型とをＤＦＰ型に変換し、第３のコンパイラ表現を生成する第３のコンパイラ表現生成部と
を備えており、
前記識別部が、前記第１のコンパイラ表現中のオペランドの使用−定義連鎖及び／又は定義−使用連鎖において、定義（def）のオペランドと使用（use）のオペランドとを同一の論理ＢＣＤ変数とみなす処理を実行する、前記コンピュータ。
【請求項１６】
前記識別部が、
前記第１のコンパイラ表現中のオペランドの前記使用−定義連鎖及び／又は定義−使用連鎖において、定義（def）が支配する使用（use）があり、当該定義（def）から当該使用（use）の間の全てのパスに当該使用（use）に対する他の定義（def）が存在せず、且つ、当該定義（def）に対して上記使用（use）がただ一つ存在する場合に、
前記使用（use）及び前記定義（def）の各オペランドの右端のアドレスが同一であること；且つ、
前記使用（use）及び前記定義（def）の各オペランドの型が同一のＢＣＤ型であること；且つ、
前記使用（use）及び前記定義（def）の各オペランドのサイズが同じであること
を条件に、前記使用（use）のオペランドと前記定義（def）のオペランドとを同一の論理ＢＣＤ変数とみなす処理を実行する、請求項１５に記載のコンピュータ。
【請求項１７】
前記識別部が、
前記第１のコンパイラ表現中のオペランドの前記使用−定義連鎖及び／又は定義−使用連鎖において、定義（def）が支配する使用（use）があり、当該定義（def）から当該使用（use）の間の全てのパスに当該使用（use）に対する他の定義（def）が存在せず、且つ、当該定義（def）に対して上記使用（use）がただ一つ存在する場合に、
前記使用（use）及び前記定義（def）の各オペランドの右端のアドレスが同一であること；且つ、
前記使用（use）及び前記定義（def）の各オペランドの型が同一のＢＣＤ型であること；且つ、
前記使用（use）のオペランドのサイズが前記定義（def）のオペランドのサイズよりも小さいこと；且つ、
前記第２のコンパイラ表現の生成において桁合わせのための命令を前記第１のコンパイラ表現中に挿入すること
を条件に、前記使用（use）のオペランドと前記定義（def）のオペランドとを同一の論理ＢＣＤ変数とみなす処理を実行する、請求項１５又は１６に記載のコンピュータ。
【請求項１８】
前記識別部が、
前記第１のコンパイラ表現中のオペランドの前記使用−定義連鎖及び／又は定義−使用連鎖において、定義（def）が支配する使用（use）があり、当該定義（def）から当該使用（use）の間の全てのパスに当該使用（use）に対する他の定義（def）が存在せず、且つ、当該定義（def）に対して上記使用（use）がただ一つ存在する場合に、
前記使用（use）及び前記定義（def）の各オペランドの右端のアドレスが同一であること；且つ、
前記使用（use）及び前記定義（def）の各オペランドの型が同一のＢＣＤ型であること；且つ、
前記使用（use）のオペランドのサイズが前記定義（def）のオペランドのサイズよりも大きいこと；且つ、
前記使用（use）のオペランドと前記定義（def）のオペランドとが重なっていない領域にゼロが入っていること
を条件に、前記使用（use）のオペランドと前記定義（def）のオペランドとを同一の論理ＢＣＤ変数とみなす処理を実行する、請求項１５〜１７のいずれか一項に記載のコンピュータ。
【請求項１９】
二進化十進数（Binary Coded Decimal；以下、ＢＣＤという）演算の型を十進浮動小数点（Decimal Floating Point；以下、ＤＦＰという）演算の型に変換することによって、ＢＣＤ型変数へのアクセスを有する言語のバイナリコードを最適化するコンピュータであって、
前記バイナリコードを読み込むためのメモリと、
前記メモリ上で前記バイナリコードを最適化するためのプロセッサと
を備えており、
前記プロセッサが、請求項１〜１３のいずれか一項に記載の方法の各ステップを実行することによって前記バイナリコードの最適化を行う、前記コンピュータ。
【請求項２０】
二進化十進数（Binary Coded Decimal；以下、ＢＣＤという）演算の型を十進浮動小数点（Decimal Floating Point；以下、ＤＦＰという）演算の型に変換することによって、ＢＣＤ型変数へのアクセスを有する言語のバイナリコードを最適化するためのコンピュータ・プログラムであって、コンピュータに、請求項１〜１３のいずれか一項に記載の方法の各ステップを実行させる、前記コンピュータ・プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、二進化十進数型（Binary Coded Decimal；以下、ＢＣＤという）変数へのアクセスを有する言語のバイナリコードを最適化する技法に関する。特には、本発明は、二進化十進数（ＢＣＤ）演算の型を十進浮動小数点（Decimal Floating Point；以下、ＤＦＰという）演算の型に変換することによって、上記バイナリコードを最適化する技法に関する。
【背景技術】
【０００２】
ＣＯＢＯＬは、１９５９年にアメリカ合衆国で生まれた高級言語であり、種々の言語の中でもその歴史が古い。また、ＣＯＢＯＬ言語は、事務処理系のプログラムを効率よく開発できることから、現在でも基幹システム（例えば、メインフレーム）において使用されている。例えば、インターナショナル・ビジネス・マシーンズ・コーポレーション（登録商標）から販売されているメインフレームであるＩＢＭ（登録商標）  Ｓｙｓｔｅｍ  ｚ（登録商標）上でＣＯＢＯＬのバイナリコードが多く使われている。
【０００３】
ＣＯＢＯＬにおいて、Ｉｎｔ型が何も指定されない場合には、数字は、ゾーン１０進数（Zoned Decimal）形式（外部１０進形式ともいう）で表される。また、ＣＯＢＯＬにおいて、通常の２進演算を行うためには、ＢＩＮＡＲＹ修飾詞が必要である。しかし、多くのＣＯＢＯＬプログラマーは、Ｉｎｔ型として何も指定しない。そのために、ＣＯＢＯＬでは、ゾーン１０進数形式が多く使用されている。
【０００４】
ゾーン１０進数形式は、ＣＯＢＯＬの実行において内部的にはパック形式（内部１０進形式ともいう）に毎回変換される。そのために、性能低下や速度低下が顕著である。
【０００５】
そこで、上記に述べた性能低下や速度低下を改善する為に、ＣＯＢＯＬのソースコードをコンパイルする際に、当該ソースコードを最適化することが行われてきている。当該最適化は、例えば、上記ソースコードに対して１０進数形式から２進型の演算へ型変換することである。
【０００６】
ＰＬ／Ｉは、１９６４年に生まれた汎用プログラミング言語の一つである。ＰＬ／Ｉは、ＩＢＭ（登録商標）のメインフレーム、例えばＯＳ／３９０、ｚ／ＯＳ、ＩＭＳ（Information Management System）、又はＣＩＣＳ（Customer Information Control System）で広く使われている。
【０００７】
下記特許文献１は、コンパイル処理において、最適化処理を汎用化することができる技術を記載する（段落０００９）。当該技術は、原始プログラムを二分木形式の内部データに変換し、この内部データを最適化することを含む（請求項１）。
【０００８】
下記特許文献２は、ＢＣＤ型変数へのアクセスを有する言語のバイナリコードを最適化する技法を記載する（段落０００１）。当該技法は、前記バイナリコード中から、各変数について、ゾーン１０進数形式の変数へのアクセスを含み且つ副作用となり得る命令のない領域を検出すること、及び当該検出された領域内において、ゾーン１０進数形式の変数を２進型へ変換する処理、PACK/UNPACKのコードを削除しても変換された結果が変わらないPACK/UNPACKのコードを上記バイナリコードから削除する処理、又はそれらの組み合わせの処理を行うことを含む（請求項１）。
【０００９】
下記特許文献３は、アドレスの差分値として解決すべき定数のサイズをリンク前に見積もる命令列最適化装置を記載する（要約）。
【００１０】
下記特許文献４は、命令列から最適化コードを生成する命令列最適化装置を記載する（請求項１）。
【００１１】
下記特許文献５は、ユーザが定義した組込関数を用いた処理動作と同等の動作を行う命令文を、ユーザが定義した組込関数に応じた機械語に最適化することができるコンパイラを記載する（段落０００９）。
【００１２】
下記特許文献６は、１０進数演算命令が実行可能なデータ処理装置において、中央処理装置の命令実行時に、アンパック形式とパック形式の１０進数データを固定小数点数の２進数データに変換することを記載する（請求項１）。
【先行技術文献】
【特許文献】
【００１３】
【特許文献１】特開２００１−３４４８２号公報
【特許文献２】特開２０１２−２４８１３９号公報
【特許文献３】特開２０００−１３２４０４号公報
【特許文献４】特開２００１−２３６２３５号公報
【特許文献５】特開２００４−２９５３９８号公報
【特許文献６】特開平５−３２４３１３号公報
【特許文献７】特開２００２−３４２０８９号公報
【発明の概要】
【発明が解決しようとする課題】
【００１４】
ＢＣＤ計算は、ＢＣＤ型変数へのアクセスを有する言語のバイナリコードにおいて広く使用されている。しかしながら、ＢＣＤ計算はメモリ単位の計算である為に効率的でない。そこで、ＢＣＤ計算を、メモリ単位の計算ではなく、レジスタ単位の計算に変換することが好ましい。
【００１５】
また、ＩＢＭ（登録商標）  ｚＥｎｔｅｒｐｒｉｚｅ  ＥＣ１２（ｚＥＣ１２）命令は、ゾーン１０進数型からＤＦＰ型への変換命令を新規にサポートする。この新規の変換命令は、ＢＣＤ型を２進型へ変換する場合よりも効率的である。
【００１６】
また、ＤＦＰは、１２８ビットの浮動小数点レジスタ（ＦＰＲ）又はＤＦＰレジスタ（ＤＦＰＲ）を使用して、３４までの桁を表現することが可能である。ＦＰＲの使用は、汎用レジスタ（ＧＰＲ）のレジスタ・プレッシャ（register pressure）（レジスタ・プレッシャというのは、「どれだけのレジスタを処理中に必要とするか」である）を減少させる点で有用である。
【００１７】
しかしながら、論理ＢＣＤ変数の識別は、当該論理ＢＣＤ変数がＢＣＤ命令のオペランドと一致しない故に困難である。例えば、バイナリコード中の演算命令が論理ＢＣＤ変数の一部のバイトにアクセスすること、ＢＣＤ命令が異なる精度で元の命令の結果にアクセスすること、非ＢＣＤ命令が論理ＢＣＤ変数にアクセスすること、及び同じメモリ位置が異なる目的の為に再使用されることによって、上記困難が生じる。
【００１８】
また、ＢＣＤ演算の型からＤＦＰ演算の型への変換は、ＢＣＤ演算の型及びＤＦＰ演算の型が非常に異なる特性を有する故に困難である。例えば、ＢＣＤ演算の型は４ビットの符号コードを有するのに対してＤＦＰ演算の型は１ビットの符号コードを有すること並びに、ＤＦＰ演算の型が３つの型の精度のみを有することによって、上記困難が生じる。
【００１９】
従って、本願発明は、ＢＣＤ型変数へのアクセスを有する言語のバイナリコードの最適化において、上記困難な点を解決して、メモリ単位の計算であるＢＣＤ演算の型から、レジスタ単位の計算であるＤＦＰ演算の型への変換を可能にすることを目的とする。
【００２０】
また、上記の通り、ＣＯＢＯＬ言語はその歴史が古いために、場合によってはＣＯＢＯＬのバイナリコードだけが存在し（または保存されており）、ＣＯＢＯＬのソースコードが逸失してしまっている場合がある。このような場合には、ＣＯＢＯＬのソースコードを再コンパイルしてバイナリコードを最適化することができない。従って、ＣＯＢＯＬのソースコードに対してではなく、ＣＯＢＯＬのバイナリコードそれ自体を最適化したいという要望がある。
【課題を解決するための手段】
【００２１】
本発明は、ＢＣＤ演算の型をＤＦＰ演算の型に変換することによって、ＢＣＤ型変数へのアクセスを有する言語のバイナリコードを最適化する技法を提供する。当該技法は、ＢＣＤ演算の型をＤＦＰ演算の型に変換することによって、上記バイナリコードを最適化する方法、そのコンピュータ・プログラム及びコンピュータ・プログラム製品、並びに、ＢＣＤ演算の型をＤＦＰ演算の型に変換することによって、上記バイナリコードを最適化するコンピュータを包含しうる。
【００２２】
本発明に従う上記最適化方法は、メモリ内に読み込まれた上記バイナリコードの第１のコンパイラ表現を生成すること、当該生成された第１のコンパイラ表現に対して使用−定義連鎖（use-definition chain：以下、「ＵＤ連鎖」ともいう）及び／又は定義−使用連鎖（definition-use chain：以下、「ＤＵ連鎖」ともいう）を解析すること、当該解析の結果に基づき上記第１のコンパイラ表現中の論理ＢＣＤ変数を識別すること、当該識別した論理ＢＣＤ変数に一時変数を割り当てして第２のコンパイラ表現を生成すること、当該生成された第２のコンパイラ表現中のパック１０進数（packed decimal）の演算のうちの少なくとも１つの演算の型と上記割り当てされた一時変数のうちの少なくとも１つの一時変数の型とを、ＢＣＤ演算の型からＤＦＰ演算の型への変換によって符号情報と精度情報とが失われないことを条件に、ＤＦＰ型に変換することを含む。
【００２３】
本発明に従う上記最適化方法は、コンピュータ、例えばバイナリコード最適化装置が、上記最適化方法を上記バイナリコードに対して適用することによって実行されうる。または、上記方法は、コンピュータ、例えばコンパイラ装置が、上記最適化方法が実装されたコンパイラによってＢＣＤ型変数へのアクセスを有する言語、例えばＣＯＢＯＬのソースコード又はＰＬ／Ｉコードをコンパイルすることによって、上記コンピュータによって実行されうる。
【００２４】
また、本発明に従うコンピュータ・プログラム及びコンピュータ・プログラム製品は、上記コンピュータに、本発明に従う上記最適化方法の各ステップを実行させる。本発明に従う上記コンピュータ・プログラムは、上記バイナリコードを最適化するためのコンピュータ・プログラム中に実装されうる。または、当該コンピュータ・プログラムは、コンパイラ中に実装されうる。
【００２５】
本発明の実施態様に従うコンピュータ・プログラムはそれぞれ、一つ又は複数のフレキシブル・ディスク、ＭＯ、ＣＤ−ＲＯＭ、ＤＶＤ、ＢＤ、ハードディスク装置、ソリッド・ステート・ドライブ、ＵＳＢに接続可能なメモリ媒体、ＲＯＭ、ＭＲＡＭ、ＲＡＭ等の任意のコンピュータ読み取り可能な記録媒体に格納することができる。当該コンピュータ・プログラムは、記録媒体への格納のために、通信回線で接続する他のデータ処理システム、例えばサーバ・コンピュータからダウンロードしたり、又は他の記録媒体から複製したりすることができる。また、本発明の実施態様に従うコンピュータ・プログラムは、圧縮し、又は複数に分割して、単一又は複数の記録媒体に格納することもできる。また、様々な形態で、本発明の実施態様に従うコンピュータ・プログラム製品を提供することも勿論可能であることにも留意されたい。本発明の実施態様に従うコンピュータ・プログラム製品は、例えば、上記コンピュータ・プログラムを記録した記憶媒体、又は、上記コンピュータ・プログラムを伝送する伝送媒体を包含しうる。
【００２６】
本発明に従う上記コンピュータは、
上記バイナリコードの第１のコンパイラ表現を生成する第１のコンパイラ表現生成部と、
上記第１のコンパイラ表現に対してＵＤ連鎖及び／又はＤＵ連鎖を解析する解析部と、
上記解析の結果に基づき上記第１のコンパイラ表現中の論理ＢＣＤ変数を識別する識別部であって、上記第１のコンパイラ表現中のオペランドのＵＤ連鎖及び／又はＤＵ連鎖において、定義（def）のオペランドと使用（use）のオペランドとを同一の論理ＢＣＤ変数とみなす処理を実行する上記識別部と、
上記識別した論理ＢＣＤ変数に一時変数を割り当てして、第２のコンパイラ表現を生成する第２のコンパイラ表現生成部であって、上記第２のコンパイラ表現が、パック１０進数の少なくとも１つの演算と上記割り当てされた一時変数とを含む、上記第２のコンパイラ表現生成部と、
ＢＣＤ演算の型からＤＦＰ演算の型への変換によって符号情報と精度情報とが失われないことを条件に、上記第２のコンパイラ表現中の上記パック１０進数の上記演算のうちの少なくとも１つの演算の型と上記割り当てされた一時変数のうちの少なくとも１つの一時変数の型とをＤＦＰ型に変換し、第３のコンパイラ表現を生成する第３のコンパイラ表現生成部と
を備えている。
【００２７】
本発明の一つの実施態様において、上記コンピュータは、識別部が論理ＢＣＤ変数の識別をする前に、特定のパターンに一致するコンパイラ表現中の演算を別の演算に変換するコンパイラ表現変換部をさらに備えうる。
【００２８】
また、本発明に従う上記コンピュータは、上記バイナリコードを読み込むためのメモリと、上記メモリ上で上記バイナリコードを最適化するためのプロセッサとを備えており、上記プロセッサが、本発明に従う最適化方法の各ステップを実行することによって上記バイナリコードの最適化を行う。
【００２９】
また、本発明は、本発明に従う方法によって最適化されたコンパイラ表現をマシンコードに変換する技法を提供する。当該技法は、上記マシンコードに変換する方法、そのコンピュータ・プログラム及びコンピュータ・プログラム製品、並びに、上記マシンコードに変換するコンピュータを包含しうる。
【００３０】
本発明の上記概要は、本発明の必要な特徴の全てを列挙したものではなく、これらの構成要素のコンビネーション又はサブコンビネーションもまた、本発明となりうることに留意すべきである。
【００３１】
本発明の実施態様において使用されるコンピュータの各ハードウェア構成要素を、複数のマシンと組み合わせ、それらに機能を配分し実施する等の種々の変更は当業者によって容易に想定され得ることは勿論である。それらの変更は、当然に本発明の思想に包含される概念である。ただし、これらの構成要素は例示であり、そのすべての構成要素が本発明の必須構成要素となるわけではない。
【００３２】
また、本発明は、ハードウェア、ソフトウェア、又は、ハードウェア及びソフトウェアの組み合わせとして実現可能である。ハードウェアとソフトウェアとの組み合わせによる実行において、上記コンピュータ・プログラムのインストールされたコンピュータにおける実行が典型的な例として挙げられる。かかる場合、当該コンピュータ・プログラムが当該コンピュータのメモリにロードされて実行されることにより、当該コンピュータ・プログラムは、当該コンピュータを制御し、本発明にかかる処理を実行させる。当該コンピュータ・プログラムは、任意の言語、コード、又は、表記によって表現可能な命令群から構成されうる。そのような命令群は、当該コンピュータが特定の機能を、直接的に、又は、１．他の言語、コード若しくは表記への変換及び、２．他の媒体への複製、のいずれか一方若しくは双方が行われた後に、実行することを可能にするものである。
【発明の効果】
【００３３】
本発明の最適化技法では、メモリ単位の計算であるＢＣＤ演算の型から、レジスタ単位の計算であるＤＦＰ演算の型への変換を可能にする。メモリ単位の計算では、中央演算処理装置にデータを読み込む速度がレジスタ単位の計算に比べて遅い。従って、本発明の実施態様に従いＢＣＤ演算の型をＤＦＰ演算の型に変換することによって中央演算処理装置における処理速度が向上する点で有用である。
【００３４】
また、本発明の最適化技法では、ＣＯＢＯＬのソースコードが存在しない場合であっても、言い換えればＣＯＢＯＬのソースコードを再コンパイルすることができない状況下にあっても、ＣＯＢＯＬのバイナリコードに対して本発明に従う最適化技法を適用することができる。従って、本発明の最適化技法では、ＣＯＢＯＬのバイナリコードに対して最適化技法を直接的に適用することができる点で、特にビジネス上において有用である。
【図面の簡単な説明】
【００３５】
【図１】本発明の実施形態におけるコンピュータ・ハードウェアの基本的なブロック図を示す。
【図２】本発明の実施形態に従い、ＢＣＤ演算の型をＤＦＰ演算の型に変換することによって、ＢＣＤ型変数へのアクセスを有する言語のバイナリコードを最適化する処理のためのフローチャートを示す。
【図３Ａ】図２に示すフローチャートの各ステップのうちの、特定のパターンに一致するコンパイラ表現中の演算を別の演算に変換するステップの詳細なフローチャートを示す。
【図３Ｂ】図２に示すフローチャートの各ステップのうちの、特定のパターンに一致するコンパイラ表現中の演算を別の演算に変換するステップの詳細なフローチャートを示す。
【図３Ｃ】図２に示すフローチャートの各ステップのうちの、特定のパターンに一致するコンパイラ表現中の演算を別の演算に変換するステップの詳細なフローチャートを示す。
【図３Ｄ】図２に示すフローチャートの各ステップのうちの、特定のパターンに一致するコンパイラ表現中の演算を別の演算に変換するステップの詳細なフローチャートを示す。
【図３Ｅ】図２に示すフローチャートの各ステップのうちの、特定のパターンに一致するコンパイラ表現中の演算を別の演算に変換するステップの詳細なフローチャートを示す。
【図４Ａ】図２に示すフローチャートの各ステップのうちの、論理ＢＣＤ変数を識別し、第１のコンパイラ表現中のuseのオペランドと当該第１のコンパイラ表現中のdefのオペランドとを同一の論理ＢＣＤ変数と見なすステップの詳細なフローチャートを示す。
【図４Ｂ】図２に示すフローチャートの各ステップのうちの、論理ＢＣＤ変数を識別し、第１のコンパイラ表現中のuseのオペランドと当該第１のコンパイラ表現中のdefのオペランドとを同一の論理ＢＣＤ変数と見なすステップの詳細なフローチャートを示す。
【図４Ｃ】図２に示すフローチャートの各ステップのうちの、論理ＢＣＤ変数に一時変数を割り当てるステップの詳細なフローチャートを示す。
【図５Ａ】図２に示すフローチャートの各ステップのうちの、第３のコンパイラ表現を生成するステップの詳細なフローチャートを示す。
【図５Ｂ】図２に示すフローチャートの各ステップのうちの、第３のコンパイラ表現を生成するステップの詳細なフローチャートを示す。
【図６Ａ】本発明の実施形態に従い変換される前のオリジナルのバイナリコード、当該バイナリコードの各コンパイラ表現、本発明の実施形態に従い最適化されたコンパイラ表現、及び当該最適化されたコンパイラ表現を変換したマシンコードの例を示す。
【図６Ｂ】図６Ａに示すオリジナルのバイナリコード及び最適化されたマシンコードの各説明を示す。
【図６Ｃ】本発明の実施形態に従い最適化されたコンパイラ表現をマシンコードに変換した場合に、当該マシンコードにおいて使用されうる演算の例を示す。
【図７Ａ】本発明の実施形態に従い変換される前のオリジナルのバイナリコード、当該バイナリコードの各コンパイラ表現、本発明の実施形態に従い最適化されたコンパイラ表現、及び当該最適化されたコンパイラ表現を変換したマシンコードの例を示す。
【図７Ｂ】本発明の実施形態に従い変換される前のオリジナルのバイナリコード、当該バイナリコードのコンパイラ表現、本発明の実施形態に従い最適化されたコンパイラ表現、及び当該最適化されたコンパイラ表現を変換したマシンコードの例を示す。
【図８】図３Ａ〜図３Ｅに示す特定のパターンに一致するコンパイラ表現中の演算を別の演算に変換する処理のうちの、２つのＢＣＤ演算を１つのＢＣＤ演算に結合する処理によって生成されるコンパイラ表現の例を示す。
【図９Ａ】図３Ａ〜図３Ｅに示す特定のパターンに一致するコンパイラ表現中の演算を別の演算に変換する処理のうちの、非ＢＣＤ演算をＢＣＤ演算に変換する処理によって生成されるコンパイラ表現の例を示す。
【図９Ｂ】図３Ａ〜図３Ｅに示す特定のパターンに一致するコンパイラ表現中の演算を別の演算に変換する処理のうちの、非ＢＣＤ演算をＢＣＤ演算に変換する処理によって生成されるコンパイラ表現の例を示す。
【図１０】図３Ａ〜図３Ｅに示す特定のパターンに一致するコンパイラ表現中の演算を別の演算に変換する処理のうちの、各オペランドの左端の桁からのゼロの桁数を解析する処理によって生成されるコンパイラ表現の例を示す。
【図１１Ａ】図４Ａ〜図４Ｂに示す論理ＢＣＤ変数を識別する処理によって生成されるコンパイラ表現の例を示す。
【図１１Ｂ】図４Ａ〜図４Ｂに示す論理ＢＣＤ変数を識別する処理によって生成されるコンパイラ表現の例を示す。
【図１１Ｃ】図４Ａ〜図４Ｂに示す論理ＢＣＤ変数を識別する処理によって生成されるコンパイラ表現の例を示す。
【図１１Ｄ】図４Ａ〜図４Ｂに示す論理ＢＣＤ変数を識別する処理において論理ＢＣＤ変数を識別し、当該識別した論理ＢＣＤ変数に一時変数を割り当てることによって生成された第２のコンパイラ表現を示す。
【図１１Ｅ】図４Ａ〜図４Ｂに示す論理ＢＣＤ変数を識別する処理において論理ＢＣＤ変数を識別し、当該識別した論理ＢＣＤ変数に一時変数を割り当てることによって生成された第２のコンパイラ表現を示す。
【図１１Ｆ】コンパイラ表現中の各演算において実際にアクセスされたメモリ領域を示す。
【図１２】本発明の実施形態に従い、パック１０進数型の演算の型及び一時変数の型のＤＦＰ型への変換によって生成されるコンパイラ表現、及び当該コンパイラ表現を変換した最適化されたマシンコードの例を示す。
【図１３】ＢＣＤ型変数へのアクセスを有する言語であるＣＯＢＯＬのソースコード、当該ＣＯＢＯＬのソースコードを変換したオリジナルのバイナリコード、及び当該オリジナルのバイナリコードを変換した最適化されたバイナリコードを示す。
【図１４】本発明の実施態様に従い最適化されたマシンコードのベンチマーク結果を示す。
【図１５】図１に従うハードウェア構成を好ましくは備えており、本発明の実施態様に従うコンピュータの機能ブロック図の一例を示した図である。
【発明を実施するための形態】
【００３６】
本発明の実施形態を、以下に図面に従って説明する。以下の図を通して、特に断らない限り、同一の符号は同一の対象を指す。本発明の実施形態は、本発明の好適な態様を説明するためのものであり、本発明の範囲をここで示すものに限定する意図はないことを理解されたい。
【００３７】
図１は、本発明の実施形態に従うコンピュータ・ハードウェアの基本的なブロック図を示す。
コンピュータ（１０１）は、ＣＰＵ（１０２）とメイン・メモリ（１０３）とを備えており、これらはバス（１０４）に接続されている。ＣＰＵ（１０２）は好ましくは、３２ビット又は６４ビットのアーキテクチャに基づくものであり、例えば、インターナショナル・ビジネス・マシーンズ・コーポレーション（登録商標）のＰｏｗｅｒ（登録商標）シリーズ、インテル社のＣｏｒｅ  ｉ（商標）シリーズ、Ｃｏｒｅ  ２（商標）シリーズ、Ａｔｏｍ（商標）シリーズ、Ｘｅｏｎ（商標）シリーズ、Ｐｅｎｔｉｕｍ（登録商標）シリーズ、Ｃｅｌｅｒｏｎ（登録商標）シリーズ、ＡＭＤ社のＰｈｅｎｏｍ（商標）シリーズ、Ａｔｈｌｏｎ（商標）シリーズ、Ｔｕｒｉｏｎ（商標）シリーズ又はＳｅｍｐｒｏｎ（商標）が使用されうる。
【００３８】
バス（１０４）には、ディスプレイ・コントローラ（１０５）を介して、ディスプレイ（１０６）、例えば液晶ディスプレイ（ＬＣＤ）が接続されうる。ディスプレイ（１０６）は、当該コンピュータ上で動作中のソフトウェア、例えば本発明の実施態様に従うコンピュータ・ソフトウェアについての情報を、適当なグラフィック・インタフェースで表示するために使用される。
【００３９】
バス（１０４）にはまた、ＳＡＴＡ又はＩＤＥコントローラ（１０７）を介して、ディスク（１０８）、例えばハードディスク又はソリッド・ステート・ドライブと、ドライブ（１０９）、例えばＣＤ、ＤＶＤ又はＢＤドライブとが接続されうる。
【００４０】
バス（１０４）にはさらに、キーボード・マウスコントローラ（１１０）又はＵＳＢバス（図示せず）を介して、キーボード（１１１）及びマウス（１１２）が接続されうる。
【００４１】
ディスク（１０８）には、任意的に、オペレーティング・システム、ＣＯＢＯＬのソースコード又はＰＬ／Ｉコード作成のための処理プログラム、ＣＯＢＯＬのソースコード又はＰＬ／ＩコードをコンパイルするためのＣＯＢＯＬコンパイラ又はＰＬ／Ｉコンパイラ、及びその他のプログラム、並びにＣＯＢＯＬのソースコード又はＰＬ／Ｉコード、オリジナルのバイナリコード、最適化されたバイナリコード及び最適化されたマシンコードが、メイン・メモリ（１０３）にロード可能なように記憶されうる。
【００４２】
ディスク（１０８）は、コンピュータ（１０１）内に内蔵されていてもよく、当該コンピュータ（１０１）がアクセス可能なようにケーブルを介して接続されていてもよく、又は、当該コンピュータ（１０１）がアクセス可能なように有線又は無線ネットワークを介して接続されていてもよい。
【００４３】
ドライブ（１０９）は、必要に応じて、ＣＤ−ＲＯＭ、ＤＶＤ−ＲＯＭ又はＢＤからプログラム、例えばオペレーティング・システム又はアプリケーションをディスク（１０８）にインストールするために使用されうる。
【００４４】
通信インタフェース（１１４）は、例えばイーサネット（登録商標）・プロトコルに従う。通信インタフェース（１１４）は、通信コントローラ（１１３）を介してバス（１０４）に接続され、コンピュータ（１０１）を通信回線（１１５）に有線又は無線接続する役割を担い、コンピュータ（１０１）のオペレーティング・システムの通信機能のＴＣＰ／ＩＰ通信プロトコルに対して、ネットワーク・インタフェース層を提供する。無線通信回線は例えば、無線ＬＡＮ接続規格に基づく無線ＬＡＮ環境、ＩＥＥＥ８０２．１１ａ／ｂ／ｇ／ｎなどのＷｉＦｉ無線ＬＡＮ環境、又は携帯電話網環境（例えば、３Ｇ又は４Ｇ環境）でありうる。
【００４５】
図２、図３Ａ〜図３Ｅ、図４Ａ〜図４Ｂ及び図４Ｃ並びに図５Ａ〜図５Ｂは、本発明の実施形態に従い、ＢＣＤ演算の型をＤＦＰ演算の型に変換することによって、ＢＣＤ型変数へのアクセスを有する言語のコンパイラ表現を最適化する処理のためのフローチャートを示す。図６Ａ〜図６Ｃ及び図７Ａ〜図７Ｂは、本発明の実施態様に従い生成されうる最適化されたコンパイラ表現及び当該最適化されたコンパイラ表現を変換して生成されるマシンコードの例を示す。
【００４６】
ＢＣＤ型変数へのアクセスを有する言語は、１０進数演算を含む言語であれば特にその種類は限定されない。ＢＣＤ型変数へのアクセスを有する言語は、例えば、ＣＯＢＯＬ又はＰＬ／Ｉである。
【００４７】
図２は、本発明の実施形態に従い、ＢＣＤ演算の型をＤＦＰ演算の型に変換することによって、ＢＣＤ型変数へのアクセスを有する言語のバイナリコードを最適化する処理のための全体的なフローチャートを示す。
【００４８】
ステップ２０１において、コンピュータ（１０１）は、上記バイナリコードを最適化する処理を開始する。
【００４９】
ステップ２０２において、コンピュータ（１０１）は、最適化対象のバイナリコード（以下、オリジナルのバイナリコードともいう）がソースコードの態様で例えば記憶媒体（１０８）中に存在しているかどうかを判断し、当該最適化対象のオリジナルのバイナリコードがソースコードの態様で存在していることに応じて、当該ソースコードをメモリ（１０３）に読み込み、そして当該メモリ（１０３）に読み込んだソースコードからオリジナルのバイナリコードを生成しうる。当該オリジナルのバイナリコードは、本発明に従う最適化技法が適用されていないものである。コンピュータ（１０１）は、当該ソースコードから上記オリジナルのバイナリコードへ変換するために、当業者に知られている任意の技法、例えばエミュレータ上でコンパイラを使用しうる。コンピュータ（１０１）は、例えばＩＢＭ（登録商標）のｐｏｗｅｒ（登録商標）シリーズ又はインテル（登録商標）社のＸｅｏｎ（登録商標）シリーズの中央演算処理装置上において実装されるエミュレータ上で、ｚＥＣ１２のオリジナルのバイナリコードを生成しうる。一方、コンピュータ（１０１）は、最適化対象のオリジナルのバイナリコードがソースコードの態様で存在していないことに応じて、処理をステップ２０３に進める。なお、例えば、オリジナルのバイナリコードが例えば記憶媒体（１０８）中に既に格納されている場合には、コンピュータ（１０１）は当該ステップ２０２の処理を省略しうる。
【００５０】
なお、図１３は、ＣＯＢＯＬソースコード（１３０１）をオリジナルのバイナリコード（１３０２）に変換した例を示す。
【００５１】
ステップ２０３において、コンピュータ（１０１）は、オリジナルのバイナリコードのコンパイラ表現（特許請求の範囲に記載の「第１のコンパイラ表現」に対応する、以下、「第１のコンパイラ表現」という）を生成する。
【００５２】
なお、図６Ａは、オリジナルのバイナリコード（６０１）を変換した第１のコンパイラ表現（６０２）の例を示す。また、図７Ａは、オリジナルのバイナリコード（７０１）を変換した第１のコンパイラ表現（７０２）の例を示す。
【００５３】
ステップ２０４において、コンピュータ（１０１）は、第１のコンパイラ表現に対して、ＵＤ連鎖及び／又はＤＵ連鎖を解析する。ＵＤ連鎖とは、各変数の使用（use）について、そこで使用される値がどの命令で定義（def）されるか又は定義（def）される可能性があるかを命令の集合として表現したものである。ＤＵ連鎖とは、各変数の定義について、そこで定義（def）された値がどの命令で使用（use）される又は使用（use）される可能性があるかを命令の集合として表現したものである。当該解析によって、第１のコンパイラ表現に対する使用（use）及び定義（def）の連鎖の情報が得られる。使用（use）及び定義（def）の連鎖の情報は、使用（use）している場所と定義（def）している場所とを連鎖した情報でもある。ＵＤ連鎖とＤＵ連鎖とでは、使用（use）と定義（def）のいずれをキーにして上記情報にアクセスするかという点で異なる。本発明の実施態様において、ＵＤ連鎖及びＤＵ連鎖のいずれの解析においても当業者に知られている任意の方法が使用されうる（例えば、特許文献７を参照）。
【００５４】
例えば、下記図６Ａに示す第１のコンパイラ表現に対してＵＤ連鎖及び／又はＤＵ連鎖を解析すると、下記解析の結果（一部を示す）が得られる；すなわち、１行目の307〜319がdefであり且つ２行目の311がuseであること（def-use）、当該関係を逆に見て、２行目の311がuseであり且つ１行目の307〜319がdefであること（use-def）という情報である。
【００５５】
ステップ２０５において、コンピュータ（１０１）は、任意的に、特定のパターンに一致するコンパイラ表現中の演算を別の演算に事前変換に変換しうる。当該事前変換は、例えば、オペランドの右端のアドレスが同一でない（すなわち、right-alignedでない）命令又はＢＣＤ型でない命令を別の演算に変換することによって、下記ステップ２０７において同一の論理ＢＣＤ変数とみなせるようにするためである。コンピュータ（１０１）は、上記事前変換が終わることに応じて、ＵＤ連鎖及び／又はＤＵ連鎖を再解析して更新を行う。ステップ２０５の処理の詳細については、図３Ａ〜図３Ｅ、並びに、図８（２つのＢＣＤ演算を１つのＢＣＤ演算に結合）、図９Ａ〜図９Ｂ（非ＢＣＤ演算をＢＣＤ演算に変換）、及び図１０（各オペランドの左端の桁からのゼロの桁数の解析）において説明する。
【００５６】
なお、図７Ａは、特定のパターンに一致するコンパイラ表現中の演算を別の演算に事前変換したコンパイラ表現（７０３、７０４、７０５）の例を示す。
【００５７】
ステップ２０６において、コンピュータ（１０１）は、ステップ２０５の処理が行われていないコンパイラ表現（以下、「未処理のコンパイラ表現」という）があるかどうかを判断する。未処理のコンパイラ表現があることに応じて、コンピュータ（１０１）は処理をステップ２０５に戻す。一方、未処理のコンパイラ表現がないことに応じて、コンピュータ（１０１）は処理をステップ２０７に進める。
【００５８】
ステップ２０７において、コンピュータ（１０１）は、ステップ２０４におけるＵＤ連鎖及び／又はＤＵ連鎖の解析の結果に基づいて、論理ＢＣＤ変数を識別し、第１のコンパイラ表現中のuseのオペランドと当該第１のコンパイラ表現中のdefのオペランドとを同一の論理ＢＣＤ変数と見なす。コンピュータ（１０１）は、上記同一の論理ＢＣＤ変数と見なす処理が終わることに応じて、ＵＤ連鎖及び／又はＤＵ連鎖を再解析して更新を行う。ステップ２０７の処理の詳細については、図４Ａ〜図４Ｂ、並びに、図１１Ａ〜図１１Ｃにおいて説明する。
【００５９】
ステップ２０８において、コンピュータ（１０１）は、ステップ２０７の処理が行われていないコンパイラ表現（以下、「未処理のコンパイラ表現」という）があるかどうかを判断する。未処理のコンパイラ表現があることに応じて、コンピュータ（１０１）は処理をステップ２０７に戻す。一方、未処理のコンパイラ表現がないことに応じて、コンピュータ（１０１）は処理をステップ２０９に進める。
【００６０】
ステップ２０９において、コンピュータ（１０１）は、ステップ２０７で識別した論理ＢＣＤ変数に一時変数を割り当てして、当該一時変数が割り当てられたコンパイラ表現（特許請求の範囲に記載の「第２のコンパイラ表現」に対応する、以下、「第２のコンパイラ表現」という）を生成する。第２のコンパイラ表現は、パック１０進数の少なくとも１つの演算とステップ２０８で割り当てされた一時変数とを含む。ステップ２０９の処理の詳細については、図４Ｃ、並びに、図１１Ｅ〜図１１Ｆにおいて説明する。
【００６１】
なお、図６Ａは、論理ＢＣＤ変数に一時変数（例えば、TMP1〜3）を割り当てしたコンパイラ表現（６０３）の例を示す。また、図７Ａは、論理ＢＣＤ変数に一時変数（例えば、TMP1〜2）を割り当てしたコンパイラ表現（７０６）の例を示す。
【００６２】
ステップ２１０において、コンピュータ（１０１）は、ステップ２０９の処理が行われていない論理ＢＣＤ変数（以下、「未処理の論理ＢＣＤ変数」という）があるかどうかを判断する。未処理の論理ＢＣＤ変数があることに応じて、コンピュータ（１０１）は処理をステップ２０９に戻す。一方、未処理の論理ＢＣＤ変数がないことに応じて、コンピュータ（１０１）は処理をステップ２１１に進める。
【００６３】
ステップ２１１において、コンピュータ（１０１）は、第２のコンパイラ表現中のパック１０進数の演算のうちの少なくとも１つの演算の型とステップ２０９で割り当てられた一時変数のうちの少なくとも１つの一時変数の型とをＤＦＰ型に変換して、第３のコンパイラ表現（本発明の実施態様に従い最適化されたコンパイラ表現である）を生成する。ステップ２１１の処理の詳細については、図５Ａ〜図５Ｂ、並びに、図１２において説明する。
【００６４】
ステップ２１２において、コンピュータ（１０１）は、第２のコンパイラ表現において、上記ＤＦＰ型への変換が行われていない演算又は一時変数（以下、「未処理の演算又は一時変数」という）があるかどうかを判断する。未処理の演算又は一時変数があることに応じて、コンピュータ（１０１）は処理をステップ２１１に戻す。一方、未処理の演算及び一時変数がないことに応じて、コンピュータ（１０１）は処理をステップ２１３に進める。なお、ステップ２１１のＢＣＤ演算の型からＤＦＰ演算の型への変換処理は、符号情報と精度情報とが失われないことが保証されるように行われる。
【００６５】
なお、図６Ａは、第２のコンパイラ表現（６０３）中のパック１０進数の上記演算のうちの少なくとも１つの演算の型とステップ２０９で割り当てられた一時変数のうちの少なくとも１つの一時変数の型とをそれぞれＤＦＰ型に変換したコンパイラ表現（６０４）の例を示す。また、図７Ａ及び図７Ｂは、第２のコンパイラ表現（７０６）中のパック１０進数の上記演算のうちの少なくとも１つの演算の型とステップ２０９で割り当てられた一時変数のうちの少なくとも１つの一時変数の型とをそれぞれＤＦＰ型に変換したコンパイラ表現（７０７）の例を示す。
【００６６】
ステップ２１３において、コンピュータ（１０１）は、第３のコンパイラ表現に対して他の最適化処理をさらに適用するかどうか又は他の最適化処理が適用可能かどうかを判断する。他の最適化処理として、例えば、当業者に知られている任意の最適化手段が使用されうる。他の最適化処理をさらに適用することに応じて、コンピュータ（１０１）は処理をステップ２１４に進める。一方、他の最適化処理をさらに適用しないことに応じて、コンピュータ（１０１）は処理をステップ２１５に進める。
【００６７】
なお、図７Ｂのコンパイラ表現（７０８）は、第３のコンパイラ表現（７０７）について他の最適化処理をさらに適用可能かどうかの判定をしている例を示す。
【００６８】
ステップ２１４において、コンピュータ（１０１）は、第３のコンパイラ表現に対して他の最適化処理をさらに適用して、当該他の最適化処理で最適化されたコンパイラ表現を生成する。
【００６９】
なお、図７Ｂは、第３のコンパイラ表現（７０７）を他の最適化処理で最適化したコンパイラ表現（７０９）の例を示す。
【００７０】
ステップ２１５において、コンピュータ（１０１）は、ステップ２１１で生成された第３のコンパイラ表現（本発明の実施態様に従い最適化されたコンパイラ表現である）又はステップ２１４で他の最適化処理でさらに最適化されたコンパイラ表現（７０８）をマシンコードに変換する。
【００７１】
なお、図６Ａは、第３のコンパイラ表現（６０４）から変換した最適化されたマシンコード（６０５）の例を示す。また、図７Ｂは、他の最適化処理でさらに最適化されたコンパイラ表現（７０９）から変換した最適化されたマシンコード（７１０）の例を示す。
【００７２】
ステップ２１６において、コンピュータ（１０１）は、上記バイナリコードを最適化する処理を終了する。
【００７３】
図３Ａ〜図３Ｅは、図２に示すフローチャートの各ステップのうちの、特定のパターンに一致するコンパイラ表現中の演算を別の演算に事前変換するステップの詳細なフローチャートを示す。特定のパターンに一致する演算を別の演算に事前変換する態様として、以下では、２つのＢＣＤ演算を１つのＢＣＤ演算に結合する実施態様（ステップ３０２〜３０６）、非ＢＣＤ演算をＢＣＤ演算に変換する実施態様（ステップ３１１〜３１５、ステップ３２１〜３２５、ステップ３３１〜３４０、及びステップ３５１〜３５６）、並びに、第１のコンパイラ表現中のオペランドのdefの左端の桁からのゼロの桁数を解析する実施態様（ステップ３６１〜３６８）を示す。
【００７４】
ステップ３０１において、コンピュータ（１０１）は、特定のパターンに一致するコンパイラ表現中の演算を別の演算に事前変換するための処理（以下、事前変換処理ともいう）を開始する。
【００７５】
（２つのＢＣＤ演算を１つのＢＣＤ演算に結合する実施態様）
【００７６】
ステップ３０２において、コンピュータ（１０１）は、特定のパターンに一致するコンパイラ表現中の演算の別の演算への事前変換が、２つの連続した第１及び第２の命令のパック１０進数型のオペランドからゾーン１０進数型のオペランドへの変換を行う命令（例えば、「pack_to_zoned」）があるか、又は、２つの連続した第１及び第２の命令のゾーン１０進数型のオペランドからパック１０進数型のオペランドへの変換を行う命令（例えば、「zone_to_packed」）があるかを判断する。上記ゾーン１０進数型のオペランドへの変換を行う命令又は上記パック１０進数型のオペランドへの変換を行う命令があることに応じて、コンピュータ（１０１）は処理をステップ３０３に進める。一方、上記ゾーン１０進数型のオペランドへの変換を行う命令及び上記パック１０進数型のオペランドへの変換を行う命令のいずれもがないことに応じて、コンピュータ（１０１）は処理をステップ３１１（図３Ｂ）へ進める。
【００７７】
ステップ３０３において、コンピュータ（１０１）は、第１の命令のパック１０進数型のオペランドの右端のバイトアドレスと第２の命令のパック１０進数型のオペランドの左端のバイトアドレスとが同一であるかどうかを判断する。代替的には、コンピュータ（１０１）は、上記第１の命令のゾーン１０進数型のオペランドをパック１０進数型に変換した第１の命令のパック１０進数型のオペランドの右端のバイトアドレスと、上記第２の命令のゾーン１０進数型のオペランドをパック１０進数型に変換した第２の命令のパック１０進数型のオペランドの左端のバイトアドレスとが同一であるかどうかを判断する。上記右端のバイトアドレスと上記左端のバイトアドレスとが同一であることに応じて、コンピュータ（１０１）は処理をステップ３０４に進める。一方、上記右端のバイトアドレスと上記左端のバイトアドレスとが同一でないことに応じて、コンピュータ（１０１）は処理をステップ３１１（図３Ｂ）へ進める。
【００７８】
ステップ３０４において、コンピュータ（１０１）は、第１の命令のゾーン１０進数型のオペランドの右端のバイトアドレスと第２の命令のゾーン１０進数型のオペランドの左端のバイトアドレスとが同一であるかどうかを判断する。代替的には、上記第１の命令のパック１０進数型のオペランドをゾーン１０進数型に変換した第１の命令のゾーン１０進数型のオペランドの右端のバイトアドレスと、上記第２の命令のパック１０進数型のオペランドをゾーン１０進数型に変換した第２の命令のゾーン１０進数型のオペランドの左端のバイトアドレスとが同一であるかどうかを判断する。上記右端のバイトアドレスと上記左端のバイトアドレスとが同一であることに応じて、コンピュータ（１０１）は処理をステップ３０５に進める。一方、上記右端のバイトアドレスと上記左端のバイトアドレスとが同一でないことに応じて、コンピュータ（１０１）は処理をステップ３１１（図３Ｂ）へ進める。
【００７９】
ステップ３０５において、コンピュータ（１０１）は、２つの連続した第１及び第２の命令がパック１０進数型のオペランドからゾーン１０進数型のオペランドへの変換を行う命令である場合には、上記第１の命令のパック１０進数型のオペランドと上記第２の命令のパック１０進数型のオペランドとを結合したオペランドを、上記第１の命令のゾーン１０進数型のオペランドと上記第２の命令のゾーン１０進数型のオペランドとを結合したオペランドに変換を行う命令に変換を行う。また、コンピュータ（１０１）は、２つの連続した第１及び第２の命令がゾーン１０進数型のオペランドからパック１０進数型のオペランドへの変換を行う命令である場合には、上記第１の命令のゾーン１０進数型のオペランドと上記第２の命令のゾーン１０進数型のオペランドとを結合したオペランドを、上記第１の命令のパック１０進数型のオペランドと上記第２の命令のパック１０進数型のオペランドとを結合したオペランドに変換を行う命令に変換を行う。上記のようにして、コンピュータ（１０１）は、２つの連続したパック１０進数型のオペランドを１つのパック１０進数型のオペランドに変換し、且つ、２つの連続したゾーン１０進数型のオペランドを１つのゾーン１０進数型のオペランドに変換して１つのＢＣＤ演算とする。上記結合が終了することに応じて、コンピュータ（１０１）は処理を終了ステップ３０６に進める。
【００８０】
２つのＢＣＤ演算を１つのＢＣＤ演算に結合する事前変換処理は、変換前の２つのＢＣＤ演算のオペランドの右端のアドレスが同一でない（すなわち、right-alignedでない）命令を別の演算に変換することによって、当該変換後の演算が図２に示すステップ２０７において同一の論理ＢＣＤ変数とみなせるようにすることを可能にする。
【００８１】
なお、図７Ａは、２つのＢＣＤ演算を１つのＢＣＤ演算に結合後のコンパイラ表現（７０３）の例を示す。同様に、図８は、２つのＢＣＤ演算を１つのＢＣＤ演算に結合後のコンパイラ表現（８０３、８１３及び８２３）の例を示す。
【００８２】
ステップ３０６において、コンピュータ（１０１）は、事前変換処理を終了する。
【００８３】
（非ＢＣＤ演算をＢＣＤ演算に変換する実施態様）
【００８４】
（非ＢＣＤ演算が論理和の演算の場合）
ステップ３１１において、コンピュータ（１０１）は、非ＢＣＤ演算がバイト長のオペランド（メモリ・オペランド）に対する定数値の論理和の演算（例えば、「byte_or」）であるかどうかを判断する。論理和の演算であることに応じて、コンピュータ（１０１）は処理をステップ３１２に進める。一方、論理和の演算でないことに応じて、コンピュータ（１０１）は処理をステップ３２１に進める。
【００８５】
ステップ３１２において、コンピュータ（１０１）は、上記バイト長のオペランドの上記useに対する上記defが一意に存在し（すなわち、ただ１つ存在し）、且つ当該defがパック１０進数型のオペランド又はゾーン１０進数型のオペランドであるかどうかを判断する。上記一意に存在するdefがパック１０進数型又はゾーン１０進数型のオペランドであることに応じて、コンピュータ（１０１）は処理をステップ３１３に進める。一方、上記一意に存在するdefがパック１０進数型及びゾーン１０進数型のいずれでもないことに応じて、コンピュータ（１０１）は処理をステップ３３１（図３Ｃ）に進める。
【００８６】
ステップ３１３において、コンピュータ（１０１）は、上記バイト長のオペランドの上記useのアドレスが、当該useに対するdefの右端のアドレスと同一であるかどうかを判断する。上記useのアドレスが上記右端のアドレスと同一であることに応じて、コンピュータ（１０１）は処理をステップ３１４に進める。一方、上記useのアドレスが上記右端のアドレスと同一でない（すなわち、異なる）ことに応じて、コンピュータ（１０１）は処理をステップ３３１（図３Ｃ）に進める。
【００８７】
ステップ３１４において、コンピュータ（１０１）は、第１のコンパイラ表現中に定数として表現されている値（すなわち、論理和の定数オペランド）が符号部のビットのみを全て１にする値であるかどうかを判断する。符号部のビットのみを全て１にする値とは、例えば、第１のコンパイラ表現中の定数として表現されている値がdefのオペランドの型がパック１０進数型である場合に0xfであり、又は第１のコンパイラ表現中の定数として表現されている値がdefのオペランドの型がゾーン１０進数型である場合に0xf0でありうる。当該定数値が符号部のビットのみを全て１にする値であることに応じて、コンピュータ（１０１）は処理をステップ３１５に進める。一方、当該定数値が符号部のビットのみを全て１にする値でないことに応じて、コンピュータ（１０１）は処理をステップ３３１（図３Ｃ）に進める。
【００８８】
ステップ３１５において、コンピュータ（１０１）は、論理和の演算（例えば、「byte_or」）をパック１０進数型又はゾーン１０進数型に対して符号ビットを全て１にする演算（それぞれ、例えば「packed_set_sign」又は「zoned_set_sign」）に変換する。当該変換が終了することに応じて、コンピュータ（１０１）は処理を終了ステップ３０６に進める。
【００８９】
なお、図９Ａは、非ＢＣＤ演算である「byte_or」をＢＣＤ演算である「packed_set_sign」又は「zoned_set_sign」に変換後のコンパイラ表現（９０３及び９１３）の例を示す。
【００９０】
（非ＢＣＤ演算が論理積の演算の場合）
ステップ３２１において、コンピュータ（１０１）は、非ＢＣＤ演算がバイト長のオペランド（メモリ・オペランド）に対する定数値の論理積の演算（例えば、「byte_and」）であるかどうかを判断する。論理積の演算であることに応じて、コンピュータ（１０１）は処理をステップ３２２に進める。一方、論理積の演算でないことに応じて、コンピュータ（１０１）は処理をステップ３３１（図３Ｃ）に進める。
【００９１】
ステップ３２２において、コンピュータ（１０１）は、上記バイト長のオペランドの上記useに対する上記defが一意に存在し（すなわち、ただ１つ存在し）、且つ当該defがパック１０進数型のオペランドであるかどうかを判断する。上記一意に存在するdefがパック１０進数型のオペランドであることに応じて、コンピュータ（１０１）は処理をステップ３２３に進める。一方、上記一意に存在するdefがパック１０進数型のオペランドでないことに応じて、コンピュータ（１０１）は処理をステップ３３１（図３Ｃ）に進める。
【００９２】
ステップ３２３において、コンピュータ（１０１）は、上記バイト長のオペランドの上記useのアドレスが、当該useに対するdefの右端のアドレスと異なるかどうかを判断する。上記useのアドレスが上記右端のアドレスと異なることに応じて、コンピュータ（１０１）は処理をステップ３２４に進める。一方、上記useのアドレスが上記右端のアドレスと異ならない（すなわち、同一である）ことに応じて、コンピュータ（１０１）は処理をステップ３３１（図３Ｃ）に進める。
【００９３】
ステップ３２４において、コンピュータ（１０１）は、第１のコンパイラ表現中に定数として表現されている値（すなわち、論理積の定数オペランド）が上位の桁をゼロにする値であるかどうかを判断する。当該定数値が上位の桁をゼロにする値であることに応じて、コンピュータ（１０１）は処理をステップ３２５に進める。一方、当該定数値が上位の桁をゼロにする値でないことに応じて、コンピュータ（１０１）は処理をステップ３３１（図３Ｃ）に進める。
【００９４】
ステップ３２５において、コンピュータ（１０１）は、論理積の演算（例えば、byte_and）をパック１０進数型の上位桁の切り落とし（truncate）の演算（例えば「packed_truncate」）に変換する。当該変換が終了することに応じて、コンピュータ（１０１）は処理を終了ステップ３０６に進める。
【００９５】
なお、図７Ａは、非ＢＣＤ演算であるbyte_andをＢＣＤ演算であるpacked_truncateに変換後のコンパイラ表現（７０４）の例を示す。同様に、図９Ａは、非ＢＣＤ演算であるbyte_andをＢＣＤ演算であるpacked_truncateに変換後のコンパイラ表現（９２３及び９３３）の例を示す。
【００９６】
（非ＢＣＤ演算がメモリ比較の演算の場合）
ステップ３３１において、コンピュータ（１０１）は、非ＢＣＤ演算が第１のオペランドと第２のオペランドのメモリ・オペランドに対するメモリ比較の演算（例えば、「memory_cmp」）であるかどうかを判断する。メモリ比較の演算であることに応じて、コンピュータ（１０１）は処理をステップ３３２に進める。一方、メモリ比較の演算でないことに応じて、コンピュータ（１０１）は処理をステップ３５１（図３Ｄ）に進める。
【００９７】
ステップ３３２において、コンピュータ（１０１）は、上記第１のオペランドのuseを支配するdefがあり、当該defから当該useの間の全てのパスに当該useに対する他のdefが存在せず、且つ、当該defに対して上記useがただ一つ存在するかという要件を満たすかどうかを判断する。上記要件を満たすことに応じて、コンピュータ（１０１）は処理をステップ３３３に進める。一方、上記要件を満たさないことに応じて、コンピュータ（１０１）は処理をステップ３５１（図３Ｄ）に進める。
【００９８】
ステップ３３３において、コンピュータ（１０１）は、上記第１のオペランドの上記useの右端のアドレスが、上記第１のオペランドの上記defの右端のアドレスと同一であるかどうかを判断する。上記useの右端のアドレスが上記defの右端のアドレスと同一であることに応じて、コンピュータ（１０１）は処理をステップ３３４に進める。一方、上記useの右端のアドレスが上記defの右端のアドレスと同一でないことに応じて、コンピュータ（１０１）は処理をステップ３５１（図３Ｄ）に進める。
【００９９】
ステップ３３４において、コンピュータ（１０１）は、上記第１のオペランドの上記defがパック１０進数型のオペランドであるかどうかを判断する。上記defがパック１０進数型のオペランドであることに応じて、コンピュータ（１０１）は処理をステップ３３５に進める。一方、上記defがパック１０進数型のオペランドでないことに応じて、コンピュータ（１０１）は処理をステップ３５１（図３Ｄ）に進める。
【０１００】
ステップ３３５において、コンピュータ（１０１）は、上記第１のオペランドの上記useのサイズ（sizeof(use)）が上記第１のオペランドの上記defのサイズ（sizeof(def)）と同じである（sizeof(use) == sizeof(def)）こと、又は、上記第１のオペランドの上記useのサイズが上記第１のオペランドの上記defのサイズよりも小さい（sizeof(use) < sizeof(def)）こと、又は、上記第１のオペランドの上記useのサイズが上記第１のオペランドの上記defのサイズよりも大きく（sizeof(use) > sizeof(def)）且つ上記第１のオペランドの上記useと上記第１のオペランドの上記defの重なっていない領域にゼロが入っていることの３つの条件のうちのいずれか一つの条件を満たすかどうかを判断する。上記３つの条件のうちのいずれか一つの条件を満たすことに応じて、コンピュータ（１０１）は処理をステップ３３６に進める。一方、上記３つのいずれの条件をも満たさないことに応じて、コンピュータ（１０１）は処理をステップ３５１（図３Ｄ）に進める。
【０１０１】
ステップ３３６において、コンピュータ（１０１）は、上記第２のオペランドのuseを支配するdefがあり、当該defから当該useの間の全てのパスに当該useに対する他のdefが存在せず、且つ、当該defに対して上記useがただ一つ存在するかという要件を満たすかどうかを判断する。上記要件を満たすことに応じて、コンピュータ（１０１）は処理をステップ３３７に進める。一方、上記要件を満たさないことに応じて、コンピュータ（１０１）は処理をステップ３５１（図３Ｄ）に進める。
【０１０２】
ステップ３３７において、コンピュータ（１０１）は、上記第２のオペランドの上記useの右端のアドレスが、上記第２のオペランドの上記defの右端のアドレスと同一であるかどうかを判断する。上記useの右端のアドレスが上記defの右端のアドレスと同一であることに応じて、コンピュータ（１０１）は処理をステップ３３８に進める。一方、上記useの右端のアドレスが上記defの右端のアドレスと同一でないことに応じて、コンピュータ（１０１）は処理をステップ３５１（図３Ｄ）に進める。
【０１０３】
ステップ３３８において、コンピュータ（１０１）は、上記第２のオペランドの上記defがパック１０進数型のオペランドであるかどうかを判断する。上記defがパック１０進数型のオペランドであることに応じて、コンピュータ（１０１）は処理をステップ３３９に進める。一方、上記defがパック１０進数型のオペランドでないことに応じて、コンピュータ（１０１）は処理をステップ３５１（図３Ｄ）に進める。
【０１０４】
ステップ３３９において、コンピュータ（１０１）は、上記第２のオペランドの上記useのサイズ（sizeof(use)）が上記第１のオペランドの上記defのサイズ（sizeof(def)）と同じである（sizeof(use) == sizeof(def)）こと、又は、上記第１のオペランドの上記useのサイズが上記第２のオペランドの上記defのサイズよりも小さい（sizeof(use) < sizeof(def)）こと、又は、上記第２のオペランドの上記useのサイズが上記第２のオペランドの上記defのサイズよりも大きく（sizeof(use) > sizeof(def)）且つ上記第２のオペランドの上記useと上記第２のオペランドの上記defの重なっていない領域にゼロが入っていることの３つの条件のうちのいずれか一つの条件を満たすかどうかを判断する。上記３つの条件のうちのいずれか一つの条件を満たすことに応じて、コンピュータ（１０１）は処理をステップ３４０に進める。一方、上記３つのいずれの条件をも満たさないことに応じて、コンピュータ（１０１）は処理をステップ３５１（図３Ｄ）に進める。
【０１０５】
ステップ３４０において、コンピュータ（１０１）は、メモリ比較の演算（例えば、memory_cmp）をパック１０進数の比較の演算（例えばpacked_cmp）に変換する。当該変換が終了することに応じて、コンピュータ（１０１）は処理を終了ステップ３０６に進める。
【０１０６】
なお、図９Ｂは、非ＢＣＤ演算であるmemory_cmpをＢＣＤ演算であるpacked_cmpに変換後のコンパイラ表現（９４３）の例を示す。
【０１０７】
（非ＢＣＤ演算がメモリ・コピーの演算の場合）
ステップ３５１において、コンピュータ（１０１）は、非ＢＣＤ演算がメモリ・コピーの演算（例えば、memory_copy）であるかどうかを判断する。メモリ・コピーの演算であることに応じて、コンピュータ（１０１）は処理をステップ３５２に進める。一方、メモリ・コピーの演算でないことに応じて、コンピュータ（１０１）は処理をステップ３６１（図３Ｅ）に進める。
【０１０８】
ステップ３５２において、コンピュータ（１０１）は、コピー元のオペランドのuseを支配するdefがあり、当該defから当該useの間の全てのパスに当該useに対する他のdefが存在せず、且つ、当該defに対して上記useがただ一つ存在するかという要件を満たすかどうかを判断する。上記要件を満たすことに応じて、コンピュータ（１０１）は処理をステップ３５３に進める。一方、上記要件を満たさないことに応じて、コンピュータ（１０１）は処理をステップ３６１（図３Ｅ）に進める。
【０１０９】
ステップ３５３において、コンピュータ（１０１）は、上記コピー元のオペランドの上記useの右端のアドレスが、上記コピー元のオペランドの上記defの右端のアドレスと同一であるかどうかを判断する。上記useの右端のアドレスが上記defの右端のアドレスと同一であることに応じて、コンピュータ（１０１）は処理をステップ３５４に進める。一方、上記useの右端のアドレスが上記defの右端のアドレスと同一でないことに応じて、コンピュータ（１０１）は処理をステップ３６１（図３Ｅ）に進める。
【０１１０】
ステップ３５４において、コンピュータ（１０１）は、上記コピー元のオペランドの上記defがパック１０進数型のオペランドであるかどうかを判断する。パック１０進数型のオペランドであることに応じて、コンピュータ（１０１）は処理をステップ３５５に進める。一方、パック１０進数型のオペランドでないことに応じて、コンピュータ（１０１）は処理をステップ３６１（図３Ｅ）に進める。
【０１１１】
ステップ３５５において、コンピュータ（１０１）は、上記コピー元のオペランドの上記useのサイズ（sizeof(use)）が上記コピー元のオペランドの上記defのサイズ（sizeof(def)）と同じである（sizeof(use) == sizeof(def)）こと、又は、上記コピー元のオペランドの上記useのサイズが上記コピー元のオペランドの上記defのサイズよりも小さい（sizeof(use) < sizeof(def)）こと、又は、上記コピー元のオペランドの上記useのサイズが上記コピー元のオペランドの上記defのサイズよりも大きく（sizeof(use) > sizeof(def)）且つ上記コピー元のオペランドの上記useと上記コピー元のオペランドの上記defの重なっていない領域にゼロが入っていることの３つの条件のうちのいずれか一つの条件を満たすかどうかを判断する。上記３つの条件のうちのいずれか一つの条件を満たすことに応じて、コンピュータ（１０１）は処理をステップ３５６に進める。一方、上記３つのいずれの条件をも満たさないことに応じて、コンピュータ（１０１）は処理をステップ３６１（図３Ｅ）に進める。
【０１１２】
ステップ３５６において、コンピュータ（１０１）は、メモリ・コピーの演算（例えば、memory_copy）をパック１０進数型の値のコピーの演算（例えばpacked_copy）に変換する。当該変換が終了することに応じて、コンピュータ（１０１）は処理を終了ステップ３０６に進める。
【０１１３】
なお、図９Ｂは、非ＢＣＤ演算であるmemory_copyをＢＣＤ演算であるpacked_copyに変換後のコンパイラ表現（９５３）の例を示す。
【０１１４】
変換前の非ＢＣＤ演算をＢＣＤ演算に変換する事前変換処理は、当該事前変換処理後のＢＣＤ演算が図２に示すステップ２０７において同一の論理ＢＣＤ変数とみなされるようにすることを可能にする。
【０１１５】
（第１のコンパイラ表現中のオペランドのdefの左端の桁からのゼロの桁数を解析する実施態様）
【０１１６】
ステップ３６１において、コンピュータ（１０１）は、上記defがゾーン１０進数型のオペランドからパック１０進数型のオペランドへの変換（例えば、ステップ３０２を参照）であるかどうかを判断する。上記defがゾーン１０進数型のオペランドからパック１０進数型のオペランドへの変換であることに応じて、コンピュータ（１０１）は処理をステップ３６２に進める。一方、上記defがゾーン１０進数型のオペランドからパック１０進数型のオペランドへの変換でないことに応じて、コンピュータ（１０１）は処理をステップ３６３に進める。
【０１１７】
ステップ３６２において、コンピュータ（１０１）は、式「左端かの桁からのゼロのバイト数＝パック１０進数型のオペランド長−（ゾーン１０進数型のオペランド長＋２）／２」（但し、除算は切り捨て、計算結果である左端からのゼロのバイト数が０よりも大きい場合）とみなす。上記式は、「左端かの桁からのゼロのバイト数＝ＭＡＸ（パック１０進数型のオペランド長−（ゾーン１０進数型のオペランド長＋２／２，０））」とも示しうる。そして、コンピュータ（１０１）は、処理を終了ステップ３０６に進める。
【０１１８】
ステップ３６３において、コンピュータ（１０１）は、上記defがパック１０進数型に対する符号ビットの設定（ステップ３１５を参照）であるかどうかを判断する。上記defがパック１０進数型に対する符号ビットの設定であることに応じて、コンピュータ（１０１）は処理をステップ３６４に進める。一方、上記defがパック１０進数型に対する符号ビットの設定でないことに応じて、コンピュータ（１０１）は処理をステップ３６５に進める。
【０１１９】
ステップ３６４において、コンピュータ（１０１）は、式「左端の桁からのゼロのバイト数＝符号ビットの設定を行うオペランドのuseに対して一意に決まるdefの左端の桁からのゼロのバイト数」（但し、図３Ｅに示す解析の結果が存在する場合）とみなす。そして、コンピュータ（１０１）は、処理を終了ステップ３０６に進める。
【０１２０】
ステップ３６５において、コンピュータ（１０１）は、上記defが４バイト長の整数型からパック１０進数型への変換であるかどうかを判断する。上記defが４バイト長の整数型からパック１０進数型への変換であることに応じて、コンピュータ（１０１）は処理をステップ３６６に進める。一方、上記defが４バイト長の整数型からパック１０進数型への変換でないことに応じて、コンピュータ（１０１）は処理をステップ３６７に進める。
【０１２１】
ステップ３６６において、コンピュータ（１０１）は、「左端の桁からのゼロのバイト数＝パック１０進数のオペランド長−６」（但し、計算結果である左端からのゼロのバイト数が０よりも大きい場合）とみなす。上記式は、「左端かの桁からのゼロのバイト数＝ＭＡＸ（パック１０進数型のオペランド長−６，０）」とも示しうる。そして、コンピュータ（１０１）は、処理を終了ステップ３０６に進める。
【０１２２】
ステップ３６７において、コンピュータ（１０１）は、上記defがリテラル・プール（literal pool）中の定数ゼロの配列からのメモリ・コピーであるかどうかを判断する。上記defがリテラル・プール中の定数ゼロの配列からのメモリ・コピーであることに応じて、コンピュータ（１０１）は処理をステップ３６８に進める。一方、上記defがリテラル・プール中の定数ゼロの配列からのメモリ・コピーでないことに応じて、コンピュータ（１０１）は処理を終了ステップ３０６に進める。
【０１２３】
ステップ３６８において、コンピュータ（１０１）は、「左端の桁からのゼロのバイト数＝メモリ・コピーのバイト数」とみなす。そして、コンピュータ（１０１）は、処理を終了ステップ３０６に進める。
【０１２４】
図４Ａ〜図４Ｂは、図２に示すフローチャートの各ステップのうちの、論理ＢＣＤ変数を識別し、第１のコンパイラ表現中のuseのオペランドと当該第１のコンパイラ表現中のdefのオペランドとを同一の論理ＢＣＤ変数と見なすステップの詳細なフローチャートを示す。
【０１２５】
ステップ４０１において、コンピュータ（１０１）は、論理ＢＣＤ変数を識別する処理を開始する。
【０１２６】
ステップ４０２において、コンピュータ（１０１）は、第１のコンパイラ表現又は当該第１のコンパイラ表現を事前変換処理して生成されたコンパイラ表現（以下、図４Ａの処理に関連する説明において、「第１のコンパイラ表現」とまとめていう）中にdefが支配するuseがあり、当該defから当該useの間の全てのパスに当該useに対する他のdefが存在せず、且つ、当該defに対して上記useがただ一つ存在するかという要件を満たすかどうかを判断する。上記要件を満たすことに応じて、コンピュータ（１０１）は処理をステップ４０３に進める。一方、上記要件を満たさないことに応じて、コンピュータ（１０１）は処理を終了ステップ４１１に進める。
【０１２７】
ステップ４０３において、コンピュータ（１０１）は、上記第１のコンパイラ表現中の上記useの右端のアドレスが、上記第１のコンパイラ表現中の上記defの右端のアドレスと同一であるかどうかを判断する。上記useの右端のアドレスが上記defの右端のアドレスと同一であること（right-aligned）に応じて、コンピュータ（１０１）は処理をステップ４０４に進める。一方、上記useの右端のアドレスが上記defの右端のアドレスと同一でないことに応じて、コンピュータ（１０１）は処理を終了ステップ４１１に進める。
【０１２８】
ステップ４０４において、コンピュータ（１０１）は、上記第１のコンパイラ表現中の上記use及び上記defの各オペランドの型が同一のＢＣＤ演算型（特に、パック１０進数型）（以下、同一のＢＣＤ型ともいう）であるかどうかを判断する。上記各オペランドの型が同一のＢＣＤ型であることに応じて、コンピュータ（１０１）は処理をステップ４０５に進める。一方、上記各オペランドの型が同一のＢＣＤ型でないことに応じて、コンピュータ（１０１）は処理を終了ステップ４１１に進める。
【０１２９】
ステップ４０５において、コンピュータ（１０１）は、上記第１のコンパイラ表現中の上記useのオペランドのサイズ（sizeof(use)）が上記第１のコンパイラ表現中の上記defのオペランドのサイズ（sizeof(def)）と同一かどうかを判断する。上記use及び上記defの各オペランドのサイズが同一である（sizeof(use) == sizeof(def)）ことに応じて、コンピュータ（１０１）は処理をステップ４０６に進める。一方、上記use及び上記defの各オペランドのサイズが同一でないことに応じて、コンピュータ（１０１）は処理をステップ４０７（図４Ｂ）に進める。
【０１３０】
ステップ４０６において、コンピュータ（１０１）は、上記第１のコンパイラ表現中の上記useのオペランドと上記第１のコンパイラ表現中の上記defのオペランドとを同一の論理ＢＣＤ変数とみなす。そして、コンピュータ（１０１）は、処理を終了ステップ４１１に進める。
【０１３１】
ステップ４０７において、コンピュータ（１０１）は、上記第１のコンパイラ表現中の上記useのオペランドのサイズが上記第１のコンパイラ表現中の上記defのオペランドのサイズよりも小さいかどうかを判断する。上記useのオペランドのサイズが上記defのオペランドのサイズよりも小さい（sizeof(use)< sizeof(def)）ことに応じて、コンピュータ（１０１）は処理をステップ４０８に進める。一方、上記useのオペランドのサイズが上記defのオペランドのサイズよりも小さくない、すなわち、上記useのオペランドのサイズが上記defのオペランドのサイズよりも大きい（sizeof(use) > sizeof(def)）ことに応じて、コンピュータ（１０１）は処理をステップ４０９に進める。
【０１３２】
ステップ４０８において、コンピュータ（１０１）は、上記第１のコンパイラ表現中の上記use及び上記defの各オペランドを上位桁の切り落としが必要な同一の論理ＢＣＤ変数とみなす。従って、コンピュータ（１０１）は、上記第１のコンパイラ表現中の上記useのオペランドを上位桁の切り落としが必要な同一の論理ＢＣＤ変数とみなすことに応じて、第２のコンパイラ表現の生成において、上位桁の切り落としの命令を上記第１のコンパイラ表現中に挿入することを要する（図４Ｃのステップ４２５を参照）。この際、論理ＢＣＤ変数のオペランドの桁数はdef側に合わせられる（例えば、下記図１１Ｂの桁合わせの為の命令１１１３及び１１１４を参照）。そして、コンピュータ（１０１）は、処理を終了ステップ４１１（図４Ａ）に進める。
【０１３３】
ステップ４０９において、コンピュータ（１０１）は、上記第１のコンパイラ表現中の上記useのオペランドと上記第１のコンパイラ表現中の上記defのオペランドとが重なっていない領域にゼロが入っているかどうかを判断する。上記useのオペランドと上記defのオペランドとが重なっていない領域にゼロが入っていることに応じて、コンピュータ（１０１）は処理をステップ４１０に進める。なお、各オペランドのゼロが含まれている領域は、命令の演算結果の長さ又はゼロ  フィル（zero fill）などを解析して求められうる（図３Ｅに示す処理を参照）。一方、上記useのオペランドと上記defのオペランドとが重なっていない領域にゼロが入っていないことに応じて、コンピュータ（１０１）は処理を終了ステップ４１１（図４Ａ）に進める。
【０１３４】
ステップ４１０において、コンピュータ（１０１）は、上記第１のコンパイラ表現中の上記useのオペランドと上記第１のコンパイラ表現中の上記defのオペランドとを同一の論理ＢＣＤ変数とみなす。この際、論理ＢＣＤ変数のオペランドの桁数はuse側に合わせられる。そして、コンピュータ（１０１）は、処理を終了ステップ４１１（図４Ａ）に進める。
【０１３５】
ステップ４１１において、コンピュータ（１０１）は、論理ＢＣＤ変数を識別する処理を終了する。
【０１３６】
図４Ａに示すフローチャートにおいて、useとdefの各オペランドを同一の論理変数とみなす条件を３つ示した（ステップ４０６、４０８及び４１０）。コンピュータ（１０１）は、第１のコンパイラ表現が上記条件を満たす場合に上記条件の１又は複数を当該第１のコンパイラ表現に対して適用することが可能である。
【０１３７】
図４Ｃは、図２に示すフローチャートの各ステップのうちの、論理ＢＣＤ変数に一時変数を割り当てるステップの詳細なフローチャートを示す。
【０１３８】
ステップ４２１において、コンピュータ（１０１）は、ステップ２０７で識別した論理ＢＣＤに一時変数を割り当てする処理を開始する。
【０１３９】
ステップ４２２において、コンピュータ（１０１）は、論理ＢＣＤ変数に書き込まれる値が当該論理ＢＣＤ変数以外のオペランドから参照されないかどうかをＵＤ連鎖及び／又はＤＵ連鎖の解析の結果に基づいて判断する。すなわち、コンピュータ（１０１）は、論理ＢＣＤ変数と認識されたオペランドのdefに対するuseが全て同一の論理ＢＣＤ変数であると認識されているかどうかを判断する。上記値が参照がされないことに応じて、コンピュータ（１０１）は処理をステップ４２３に進める。一方、上記値が参照がされることに応じて、コンピュータ（１０１）は処理をステップ４２４に進める。
【０１４０】
ステップ４２３において、コンピュータ（１０１）は、論理ＢＣＤ変数のオペランドに一時変数を割り当てる（すなわち、論理ＢＣＤ変数のオペランドを一時変数に置き換える）。一時変数は、例えば、TMP1〜n（nは、正の整数）でありうる。
【０１４１】
ステップ４２４において、コンピュータ（１０１）は、論理ＢＣＤ変数のオペランドに一時変数を割り当てない（すなわち、論理ＢＣＤ変数のオペランドを一時変数に置き換えない）。置き換えられなかったオペランドを含む命令は、以降のＤＦＰ変換対象にならない。そして、コンピュータ（１０１）は、処理をステップ終了ステップ４２６に進める。
【０１４２】
ステップ４２５において、コンピュータ（１０１）は、ステップ４０８で識別したuseのオペランドについて、上位桁の切り落としの命令をuseオペランドを持つ命令の直前に挿入する。例えば、下記図７Ｂに示す第３のコンパイラ表現（７０７）の６行目、下記図１１Ｂに示す第３のコンパイラ表現（１１１２）の３行目及び５行目に上記上位桁の切り落としの命令が挿入されている。
【０１４３】
ステップ４２６において、コンピュータ（１０１）は、上記論理ＢＣＤに一時変数を割り当てする処理を終了する。
【０１４４】
図５Ａ〜図５Ｂは、図２に示すフローチャートの各ステップのうちの、第３のコンパイラ表現を生成するステップの詳細なフローチャートを示す。
【０１４５】
図５Ａは、第３のコンパイラ表現を生成するステップの全体の処理を示すフローチャートである。
【０１４６】
ステップ５０１において、コンピュータ（１０１）は、ステップ２０９において生成された第１のコンパイラ表現中のパック１０進数型の演算のうちの少なくとも１つの演算の型及び当該第１のコンパイラ表現中の一時変数のうちの少なくとも１つの一時変数のＤＦＰ型への変換処理を開始する。
【０１４７】
ステップ５０２において、コンピュータ（１０１）は、第１のコンパイラ表現又は当該第１のコンパイラ表現について事前処理（図３Ａ〜図３Ｅに示す少なくとも１つの事前処理）したコンパイラ表現（以下、図５Ａ〜図５Ｂの説明において、単に「第１のコンパイラ表現」ともいう）中の一時変数の演算結果が優先符号コード若しくは定数の符号コードを持つか（要件１）どうか、又は、一時変数の演算結果が優先符号コード若しくは定数の符号コードを生成する演算のオペランドとして使われるか（要件２）どうかを判断する。要件１又は要件２が満たされることに応じて、コンピュータ（１０１）は処理をステップ５０３に進める。一方、要件１及び要件２のいずれも満たされないことに応じて、コンピュータ（１０１）は処理をステップ５０４に進める。なお、前者（要件１）は、下記図７Ａの第２のコンパイラ表現（７０６）中のTMP2に対応し、及び、後者（要件２）は、同図７Ａの第２のコンパイラ表現（７０６）中のTMP1に対応する。TMP2の演算結果は、第２のコンパイラ表現（７０６）中の「packed_add」による物であるので、優先符号コードを必ず持つ。また、TMP1の演算結果は、上記「packed_add」のオペランドとして使用されるので、優先符号を生成するための演算のオペランドとして使用される。
【０１４８】
ステップ５０３において、コンピュータ（１０１）は、第１のコンパイラ表現中の一時変数の最大長がＤＦＰレジスタの最大桁長で表現可能かどうかを判断する。上記一時変数の最大長がＤＦＰレジスタの最大桁長で表現可能であることに応じて、コンピュータ（１０１）は処理をステップ５０５に進める。上記一時変数の最大長がＤＦＰレジスタの最大桁長で表現可能でないことに応じて、コンピュータ（１０１）は処理をステップ５０４に進める。
【０１４９】
ステップ５０４において、コンピュータ（１０１）は、第１のコンパイラ表現中の演算をＤＦＰ型の演算に変換することなしに、処理を終了ステップ５０９に進める。
【０１５０】
ステップ５０５において、コンピュータ（１０１）は、一時変数の最大長を表現可能な最少のＤＦＰレジスタ長の選択をする。ＤＦＰレジスタ長は、例えば、単精度レジスタ、倍精度レジスタ、又は拡張精度（extended precision）レジスタから選択されうる。単精度レジスタは例えば７桁の精度であり、倍精度レジスタは例えば１６桁の精度であり、及び拡張精度は例えば３４桁の精度でありうる。
【０１５１】
ステップ５０６において、コンピュータ（１０１）は、一時変数を使ったパック１０進数型演算のそれぞれについて、オペランドの桁長からオーバーフローの可能性を調査する。ステップ５０６の処理の詳細については、図５Ｂにおいて説明する。
【０１５２】
ステップ５０７において、コンピュータ（１０１）は、ステップ５０６での調査の結果に基づいて、桁のオーバーフローの可能性があるかどうかを判断する。桁のオーバーフローの可能性があることに応じて、コンピュータ（１０１）は処理をステップ５０８に進める。一方、桁のオーバーフローの可能性がないことに応じて、処理をステップ５０９に進める。
【０１５３】
ステップ５０８において、コンピュータ（１０１）は、桁合わせのための命令を第２のコンパイラ表現中に挿入する。例えば、下記図７Ｂに示す第３のコンパイラ表現（７０７）の５行目に上記桁合わせのための命令が挿入されている。
【０１５４】
ステップ５０９において、コンピュータ（１０１）は、第２のコンパイラ表現中のパック１０進数の演算のうちの少なくとも１つの演算の型とステップ２０９で割り当てられた一時変数のうちの少なくとも１つの一時変数の型とをＤＦＰ型に変換する。すなわち、第３のコンパイラ表現が生成される。
【０１５５】
ステップ５１０において、コンピュータ（１０１）は、上記パック１０進数型の演算及び上記一時変数のＤＦＰ型への変換処理を終了する。
【０１５６】
図５Ｂは、図５Ａに示すステップ５０６の詳細を示すフローチャートである。
【０１５７】
ステップ５１１において、コンピュータ（１０１）は、桁のオーバーフローの可能性を調査する処理を開始する。
【０１５８】
ステップ５１２において、コンピュータ（１０１）は、一時変数を使ったパック１０進数型演算が加減算であるかどうかを判断する。パック１０進数型演算が加減算であることに応じて、コンピュータ（１０１）は処理をステップ５１３に進める。一方、パック１０進数型演算が加減算でないことに応じて、コンピュータ（１０１）は処理をステップ５１４に進める。
【０１５９】
ステップ５１３において、コンピュータ（１０１）は、パック１０進数型演算の加減算の計算結果の桁長が、「桁長 >= MAX（第１オペランドの桁長, 第２オペランドの桁長）＋1」という式を満たすかどうかを判断する。上記計算結果の桁長が当該式を満たすことに応じて、コンピュータ（１０１）は処理をステップ５２０に進める。一方、上記計算結果の桁長が当該式を満たないことに応じて、コンピュータ（１０１）は処理をステップ５２１に進める。
【０１６０】
ステップ５１４において、コンピュータ（１０１）は、一時変数を使ったパック１０進数型演算が乗算であるかどうかを判断する。パック１０進数型演算が乗算であることに応じて、コンピュータ（１０１）は処理をステップ５１５進める。一方、パック１０進数型演算が乗算でないことに応じて、コンピュータ（１０１）は処理をステップ５１６に進める。
【０１６１】
ステップ５１５において、コンピュータ（１０１）は、パック１０進数型演算の乗算の計算結果の桁長が、「桁長 >= 第１オペランドの桁長＋第２オペランドの桁長」という式を満たすかどうかを判断する。上記計算結果の桁長が当該式を満たすことに応じて、コンピュータ（１０１）は処理をステップ５２０に進める。一方、上記計算結果の桁長が当該式を満たないことに応じて、コンピュータ（１０１）は処理をステップ５２１に進める。
【０１６２】
ステップ５１６において、コンピュータ（１０１）は、一時変数を使ったパック１０進数型演算がパック１０進数の左シフトであるかどうかを判断する。パック１０進数型演算が左シフトであることに応じて、コンピュータ（１０１）は処理をステップ５１７進める。一方、パック１０進数型演算が左シフトでないことに応じて、コンピュータ（１０１）は処理をステップ５１８に進める。
【０１６３】
ステップ５１７において、コンピュータ（１０１）は、パック１０進数型演算の左シフトの計算結果の桁長が、「桁長 >= 第１オペランドの桁長＋シフトする桁数」という式を満たすかどうかを判断する。上記計算結果の桁長が当該式を満たすことに応じて、コンピュータ（１０１）は処理をステップ５２０に進める。一方、上記計算結果の桁長が当該式を満たないことに応じて、コンピュータ（１０１）は処理をステップ５２１に進める。
【０１６４】
ステップ５１８において、コンピュータ（１０１）は、一時変数を使ったパック１０進数型演算がパック１０進数の右シフトであるかどうかを判断する。パック１０進数型演算が右シフトであることに応じて、コンピュータ（１０１）は処理をステップ５１９進める。一方、パック１０進数型演算が右シフトでないことに応じて、コンピュータ（１０１）は処理をステップ５２１に進める。
【０１６５】
ステップ５１９において、コンピュータ（１０１）は、パック１０進数型演算の右シフトの計算結果の桁長が、「桁長 >= 第１オペランドの桁長−シフトする桁数」という式を満たすかどうかを判断する。上記計算結果の桁長が当該式を満たすことに応じて、コンピュータ（１０１）は処理をステップ５２０に進める。一方、上記計算結果の桁長が当該式を満たないことに応じて、コンピュータ（１０１）は処理をステップ５２１に進める。
【０１６６】
ステップ５２０において、コンピュータ（１０１）は、桁のオーバーフローがないと判断する。そして、コンピュータ（１０１）は、処理を終了ステップ５２２に進める。
【０１６７】
ステップ５２１において、コンピュータ（１０１）は、桁のオーバーフローの可能性があると判断する。そして、コンピュータ（１０１）は、処理を終了ステップ５２２に進める。
【０１６８】
ステップ５２２において、コンピュータ（１０１）は、桁のオーバーフローの可能性を調査する処理を終了する。
【０１６９】
図６Ａは、本発明の実施形態に従い変換される前のオリジナルのバイナリコード、当該バイナリコードの各コンパイラ表現、本発明の実施形態に従い最適化されたコンパイラ表現、及び当該最適化されたコンパイラ表現を変換した最適化されたマシンコードの例を示す。図６Ｂは、図６Ａに示すオリジナルのバイナリコード及び最適化されたマシンコードの各説明を示す。なお、バイナリコード、コンパイラ表現及びマシンコードの例において、左側に示されている数字は説明のために便宜的に付されているものであり、当該数字は実装において不要であることに留意されたい（図７Ａ〜図７Ｂ、図９Ｂ、図１１Ａ〜図１１Ｂ及び図１１Ｄ〜図１１Ｅ、並びに、図１２においても同じである）。
【０１７０】
オリジナルのバイナリコード（６０１）は、ＢＣＤ型変数へのアクセスを有する言語から生成されたバイナリコード（すなわち、ＢＣＤ型変数へのアクセスを有する言語のバイナリコード）である。オリジナルのバイナリコード（６０１）は、図６Ｂに示すようにメモリ単位の計算である。
【０１７１】
オリジナルのバイナリコード（６０１）中の各演算命令は、論理ＢＣＤ変数の一部のバイトにアクセスする。
【０１７２】
なお、上記においてマシンコードにおける各命令がアクセスするメモリ領域について説明をした。コンパイラ表現における各命令がアクセスするメモリ領域についても、マシンコードにおける各命令がアクセスするメモリ領域と同様である。コンパイラ表現における各命令がアクセスするメモリ領域の詳細については、図１１Ｆの説明を参照されたい。
【０１７３】
第１のコンパイラ表現（６０２）はオリジナルのバイナリコード（６０１）から生成したものであり（６１１）、バイナリコードのコンパイラ表現である。
【０１７４】
第２のコンパイラ表現（６０３）は、第１のコンパイラ表現（６０２）に対してＵＤ連鎖及び／又はＤＵ連鎖を解析し、当該解析結果に基づき上記第１のコンパイラ表現中の論理ＢＣＤ変数を識別し、当該識別した論理ＢＣＤ変数に一時変数TMP1〜4を割り当てして生成したものである（６１２）。第２のコンパイラ表現（６０３）は、パック１０進数の１又は複数の演算と上記割り当てされた一時変数TMP1〜4とを含む。また、第２のコンパイラ表現（６０３）中に示す一時変数TMP1のメモリ領域は307〜319であり、同一時変数TMP2のメモリ領域324〜335であり、同一時変数TMP3のメモリ領域は304〜319であり、及び同一時変数TMP4のメモリ領域は336〜344である。例えば、一時変数TMP1のメモリ領域307〜319が、異なる論理ＢＣＤ変数（TMP3）として再使用される。また、一時変数TMP3は、第１のコンパイラ表現（６０２）中の５、６及び７行目に対して論理ＢＣＤ変数の識別を行うことによって求められる。
【０１７５】
第３のコンパイラ表現（６０４）は、第２のコンパイラ表現（６０３）中のパック１０進数（packed）の演算及び一時変数TMP1〜4それぞれをＤＦＰ型（それぞれ、dfp及びFPR1〜4）に変換したものである（６１３）。第２のコンパイラ表現（６０３）中のパック１０進数の演算は、「packed_」という語を有する演算であり、第２のコンパイラ表現（６０３）中の１行、２行、３行、５行及び６行目に見られる（「packed_add」，「packed_truncate」，「packed_to_zoned」，「packed_shift_left」，及び「packed_add」）。第２のコンパイラ表現（６０３）から第３のコンパイラ表現（６０４）への変換において、すなわちＢＣＤ演算の型からＤＦＰ演算の型への変換によって符号情報と精度情報とが失われていない。符号情報は、オリジナルのバイナリコード（６０１）の演算結果は３行目の311(9,R13)と７行目の311(9,R13)であり、いずれの演算結果も「packed_add」の演算結果であるので優先符号コードを持つ。第３のコンパイラ表現（６０４）において、上記311(9,R13)及び上記311(9,R13)に対応するFPR1及びFPR3は優先符号を持つと見なすので、符号情報は失われていない。また、精度情報は、FPR1〜4にTMP1〜4を表現するのに十分な精度のＦＰＲを割り当てて、それにより桁あふれが発生する可能性がある場合には、第３のコンパイラ表現（６０４）の「dfp_truncate」になるように桁合わせをすることで元のバイナリコードの精度が保たれる。第３のコンパイラ表現（６０４）は、本願発明の実施態様に従って得られる最適化されたコンパイラ表現である。
【０１７６】
最適化されたマシンコード（６０５）は、第３のコンパイラ表現（６０４）をマシンコードに変換したものであり、本願発明の実施態様に従って得られるものである。最適化されたマシンコード（６０５）は、図６Ｂに示すようにレジスタ単位の計算である。
【０１７７】
図６Ｃは、本発明の実施形態に従い最適化されたコンパイラ表現をマシンコードに変換した場合に、当該マシンコードにおいて使用されうる演算の例を示す。図６Ｃの演算は、インターナショナル・ビジネス・マシーンズ・コーポレーション（登録商標）から販売されているメインフレームであるＩＢＭ（登録商標）  Ｓｙｓｔｅｍ  ｚ（登録商標）において使用されうる演算の例を示すが、本発明は本例に制限されるものではない。
【０１７８】
図７Ａ〜図７Ｂは、本発明の実施形態に従い変換される前のオリジナルのバイナリコード、当該バイナリコードの各コンパイラ表現、本発明の実施形態に従い最適化されたコンパイラ表現、及び当該最適化されたコンパイラ表現を変換したマシンコードの例を示す。
【０１７９】
オリジナルのバイナリコード（７０１）は、ＢＣＤ型変数へのアクセスを有する言語のバイナリコードである。
【０１８０】
第１のコンパイラ表現（７０２）はオリジナルのバイナリコード（７０１）から生成したものであり（７１１）、バイナリコードのコンパイラ表現である。
【０１８１】
コンパイラ表現（７０３）は第１のコンパイラ表現（７０２）から生成されたものであり（７１２）、第１のコンパイラ表現（７０２）中の１行目及び２行目それぞれに記載の２つのＢＣＤ演算（zoned_to_packed）を１つのＢＣＤ演算（zoned_to_packed）に結合した（７１２）後のコンパイラ表現である。コンパイラ表現（７０３）中、結合後のＢＣＤ演算は１行目に示す通りである。２つのＢＣＤ演算を１つのＢＣＤ演算に結合する処理の詳細については、図３Ａ及び図８を参照されたい。
【０１８２】
コンパイラ表現（７０４）はコンパイラ表現（７０３）から生成されたものであり（７１３）、コンパイラ表現（７０３）中の６行目に記載の非ＢＣＤ演算（byte_and）をＢＣＤ演算（packed_truncate）に変換した後のコンパイラ表現である。コンパイラ表現（７０４）中、変換後のＢＣＤ演算は６行目に示す通りである。非ＢＣＤ演算をＢＣＤ演算に変換する処理の詳細については、図３Ｂ〜図３Ｅ及び図９Ａ〜図９Ｂを参照されたい。
【０１８３】
コンパイラ表現（７０５）はコンパイラ表現（７０４）中のオペランドの左端の桁からのゼロの桁数を解析によって得られる情報（２行目上の「# 8(R13) == 0 && 9(R13) == 0」及び３行目上の「# 18(R12) is an array of zeros」（# 18(R12)は、ゼロの配列である））をコンパイラ表現（７０４）中に併記したものである。コンパイラ表現（７０４）中の２行目の演算「int_to_packed」の解析から、上記「8(R13) == 0」及び上記「9(R13)== 0」であることがわかる。次に、同３行目の演算「memory_copy」の解析から、「0(8,R13) == 0」であることがわかる。そして、上記２つの解析結果を併せて、「0(10,R13) == 0」であることがわかる。また、「left_zero_len」= 8 - 6 = 2であるので、「8(R13)」及び「9(R13)」の２バイトがゼロである。上記「# 18(R12) is an array of zeros」は、「18(R12)」がゼロの配列であることを説明したものである。なお、コンパイラ表現（７０５）は上記解析によって得られる情報の理解を容易にするために示したものであることを理解されたい。各オペランドの左端の桁からのゼロの桁数を解析する処理の詳細については、図３Ｅ及び図１０を参照されたい。
【０１８４】
第２のコンパイラ表現（７０６）はコンパイラ表現（７０４）又はコンパイラ表現（７０５）から生成されたものであり（７１４又は７１５）、コンパイラ表現（７０４又は７０５）中の論理ＢＣＤ変数を一時変数TMP1〜3に変換し、且つ第２のコンパイラ表現（７０６）中に示すように３行及び５行目に桁合わせのための命令をそれぞれ挿入した後のコンパイラ表現である。
【０１８５】
コンパイラ表現（７０５）において、１行目「zoned_to_packed  32(14,R13),112(18,R2)」中の「32(14,R13)」がＵＤ連鎖及び／又はＤＵ連鎖の解析結果であるdefであり、５行目「packed_add  7(9,R13),36(10,R13)」中の「36(10,R13)」が同解析結果であるuseである。すなわち、「def = 32(14,R13)」、「use = 36(10,R13)」であり、当該defは当該useを支配し、当該defから当該useの間の全てのパスに当該useに対する他のdefが存在せず、且つ、当該defに対して上記useがただ一つ存在する。また、当該use及び当該defの各オペランドの右端のアドレスがいずれも45で同一であり（right aligned）、且つ、当該use及び当該defの各オペランドの型が同一のＢＣＤ型であり、且つ、当該useのオペランドのサイズ（sizeof(use)）は当該defのオペランドのサイズ（sizeof(def)）よりも小さい（sizeof(def) > sizeof(use)）。従って、１行目「zoned_to_packed  32(14,R13),112(18,R2)」中の「32(14,R13)」と５行目「packed_add  7(9,R13),36(10,R13)」中の「36(10,R13)」とが同一の論理ＢＣＤ変数とみなされる。その結果、第２のコンパイラ表現（７０６）において、同一の一時変数TMP1が１行目「zoned_to_packed_27」と６行目「packed_add_17」中にそれぞれ割り当てられている。また、第２のコンパイラ表現（７０６）中、５行目に桁合わせのための命令「packed_truncate_19  TMP1,19digits」が挿入されている。
【０１８６】
コンパイラ表現（７０５）において、２行目「int_to_packed  R4,8(8,R13)」中の「8(8,R13)」がＵＤ連鎖及び／又はＤＵ連鎖の解析結果であるdefであり、４行目「packed_shift_left  10(6,R13),2」中の「10(6,R13)」が同解析結果であるuseである。すなわち、def = 8(8,R13)、use = 10(6,R13)であり、当該defは当該useを支配し、当該defから当該useの間の全てのパスに当該useに対する他のdefが存在せず、且つ、当該defに対して上記useがただ一つ存在する。また、当該use及び当該defの各オペランドの右端のアドレスがいずれも15で同一であり（right aligned）、且つ、当該use及び当該defの各オペランドの型が同一のＢＣＤ型であり、且つ、当該useのオペランドのサイズ（sizeof(use)）は、当該defのオペランドのサイズ（sizeof(def)）よりも小さい（sizeof(def) > sizeof(use)）。従って、２行目「int_to_packed  R4,8(8,R13)」中の「8(8,R13)」と４行目「packed_shift_left  10(6,R13),2」中の「10(6,R13)」とが同一の論理ＢＣＤ変数とみなされる。その結果、第２のコンパイラ表現（７０６）において、同一の一時変数TMP2が２行目「int_to_packed_15」と４行目「packed_shift_left」中にそれぞれ割り当てられている。また、第２のコンパイラ表現（７０６）中、３行目に桁合わせのための命令「packed_truncate_11  TMP2,11digits」が挿入されている。
【０１８７】
コンパイラ表現（７０５）において、４行目「packed_shift_left  10(6,R13),2」中の「10(6,R13)」がＵＤ連鎖及び／又はＤＵ連鎖の解析結果であるdefであり、５行目「packed_add  7(9,R13),36(10,R13)」中の「7(9,R13)」が同解析結果であるuseである。すなわち、def = 10(6,R13)、use = 7(9,R13)であり、当該defは当該useを支配し、当該defから当該useの間の全てのパスに当該useに対する他のdefが存在せず、且つ、当該defに対して上記useがただ一つ存在する。また、当該use及び当該defの各オペランドの右端のアドレスがいずれも15で同一であり（right aligned）、且つ、当該use及び当該defの各オペランドの型が同一のＢＣＤ型であり、且つ、当該defのオペランドのサイズ（sizeof(def)）は、当該useのオペランドのサイズ（sizeof(use)）よりも小さい（sizeof(def) < sizeof(use)）。また、「7(R13) == 0 && 8(R13) == 0 && 9(R13) == 0」である（コンパイラ表現（７０５）中の２行目上の「# 8(R13) == 0 && 9(R13)== 0」を参照）。「8(R13) == 0」及び「9(R13)」は、上記の通り、コンパイラ表現（７０４）中の２行目の演算「int_to_packed」の解析結果であり、並びに、「7(R13)」は３行目の演算「memory_copy」の解析結果である。従って、４行目「packed_shift_left  10(6,R13),2」中の「10(6,R13)」と５行目「packed_add  7(9,R13),36(10,R13)」中の「7(9,R13)」とが同一の論理ＢＣＤ変数とみなされる。その結果、第２のコンパイラ表現（７０６）において、同一の一時変数TMP2が４行目「packed_shift_left_11」と６行目「packed_add_17」中にそれぞれ割り当てられている。
【０１８８】
コンパイラ表現（７０５）において、５行目「packed_add  7(9,R13),36(10,R13)」中の「7(9,R13)」がＵＤ連鎖及び／又はＤＵ連鎖の解析結果であるdefであり、６行目「packed_truncate  7(9,R13),16digits」中の「7(9,R13)」が同解析結果であるuseである。すなわち、def = 7(9,R13)、use = 7(9,R13)であり、当該defは当該useを支配し、当該defから当該useの間の全てのパスに当該useに対する他のdefが存在せず、且つ、当該defに対して上記useがただ一つ存在する。また、当該use及び当該defの各オペランドの右端のアドレスがいずれも15で同一であり（right aligned）、且つ、当該use及び当該defの各オペランドの型が同一のＢＣＤ型であり、且つ、当該defのオペランドのサイズ（sizeof(def)）は、当該useのオペランドのサイズ（sizeof(use)）と同じである（sizeof(def) = sizeof(use)）。従って、５行目「packed_add  7(9,R13),36(10,R13)」中の「7(9,R13)」と６行目「packed_truncate  7(9,R13),16digits」中の「7(9,R13)」とが同一の論理ＢＣＤ変数とみなされる。その結果、第２のコンパイラ表現（７０６）において、同一の一時変数TMP2が６行目「packed_add_17」と７行目「packed_truncate_16」中にそれぞれ割り当てられている。
【０１８９】
コンパイラ表現（７０５）において、６行目「packed_truncate  7(9,R13),16digits」中の「7(9,R13)」がＵＤ連鎖及び／又はＤＵ連鎖の解析結果であるdefであり、７行目「packed_to_zoned  96(16,R3),7(9,R13)」中の「7(9,R13)」が同解析結果であるuseである。すなわち、def = 7(9,R13)、use = 7(9,R13)であり、当該defは当該useを支配し、当該defから当該useの間の全てのパスに当該useに対する他のdefが存在せず、且つ、当該defに対して上記useがただ一つ存在する。また、当該use及び当該defの各オペランドの右端のアドレスがいずれも15で同一であり（right aligned）、且つ、当該use及び当該defの各オペランドの型が同一のＢＣＤ型であり、且つ、当該defのオペランドのサイズ（sizeof(def)）は、当該useのオペランドのサイズ（sizeof(use)）と同じである（sizeof(def) = sizeof(use)）。従って、６行目「packed_truncate  7(9,R13),16digits」中の「7(9,R13)」と７行目「packed_to_zoned  96(16,R3),7(9,R13)」中の「7(9,R13)」とが同一の論理ＢＣＤ変数とみなされる。その結果、第２のコンパイラ表現（７０６）において、同一の一時変数TMP2が７行目「packed_truncate_16」と８行目「packed_to_zoned_16」中にそれぞれ割り当てられている。
【０１９０】
第２のコンパイラ表現（７０６）中の各演算中の最後のアンダーバー後の数字は、当該演算の精度（桁数）を表す。「packed」型の場合は、バイト数×２−１  で計算される。例えば、第２のコンパイラ表現（７０６）中の１行目の演算「zoned_to_packed_27」に対応する元のコンパイラ表現（７０４，７０５）中の１行目の「zoned_to_packed  32(14,R13),112(18,R2)」中の「32(14,R13)」から、精度は、１４×２−１＝２７桁である。従って、第２のコンパイラ表現（７０６）中の１行目の演算「zoned_to_packed_27」中の最後のアンダーバー後の数字が27であることから、当該演算の精度（桁数）が上記計算された精度27に対応する。同様に、第２のコンパイラ表現（７０６）中の２行目の演算「Int_to_packed_15  R4,TMP2」に対応する元のコンパイラ表現（７０４，７０５）中の２行目の「int_to_packed  R4,8(8,R13)」中の「8(8,R13)」から、精度は、８×２−１＝１５桁である。従って、第２のコンパイラ表現（７０６）中の２行目の演算「Int_to_packed_15」中の最後のアンダーバー後の数字が15であることから、当該演算の精度（桁数）が上記計算された精度15に対応する。同様に、第２のコンパイラ表現（７０６）中の４行目の演算「packed_shift_left_11 TMP2,2」に対応する元のコンパイラ表現（７０４，７０５）中の４行目の「packed_shift_left  10(6,R13),2」中の「10(6,R13)」から、精度は、６×２−１＝１１桁である。従って、第２のコンパイラ表現（７０６）中の４行目の演算「packed_shift_left_11」中の最後のアンダーバー後の数字が11であることから、当該演算の精度（桁数）が上記計算された精度11に対応する。同様に、第２のコンパイラ表現（７０６）中の６行目の演算「packed_add_17  TMP2,TMP1」に対応する元のコンパイラ表現（７０４，７０５）中の４行目の「packed_add  7(9,R13),36(10,R13)」中の「7(9,R13)」から、精度は、９×２−１＝１７桁である。従って、第２のコンパイラ表現（７０６）中の６行目の演算「packed_add_17」中の最後のアンダーバー後の数字が17であることから、当該演算の精度（桁数）が上記計算された精度17に対応する。同様に、第２のコンパイラ表現（７０６）中の７行目の演算「packed_truncate_16  TMP2,16digits」に対応する元のコンパイラ表現（７０４，７０５）中の６行目の「packed_truncate  7(9,R13),16digits」中の「7(9,R13)」から、精度は、９×２−１＝１７桁である。しかしながら、本演算では、第２のコンパイラ表現（７０６）中の７行目の演算「packed_truncate_16  TMP2,16digits」中に「16digits」とあることから、桁が16桁に桁合わせされている。従って、第２のコンパイラ表現（７０６）中の６行目の演算「packed_truncate_16」中の最後のアンダーバー後の数字が16であることから、当該演算の精度（桁数）が上記計算された精度17ではなく、上記桁合わせされた16桁に対応する。第２のコンパイラ表現（７０６）中の８行目の演算「packed_to_zoned_16  96(16,R3),TMP2」については、ゾーン１０進数の桁数はバイト数と等しい。従って、オペランド「96(16,R3)」の桁数は16桁である。
【０１９１】
第３のコンパイラ表現（７０７）は第２のコンパイラ表現（７０６）から生成されたものであり（７１６）、第２のコンパイラ表現（７０６）中のパック１０進数の演算（packedの表記を含む演算）の型と一時変数（TMP1〜3）の型とをＤＦＰ型（それぞれ、dfpの表記を含む演算及びVFPR1〜3）に変換にし、且つ第３のコンパイラ表現（７０７）中に示すように５行及び８行目に桁合わせのための命令をそれぞれ挿入した後のコンパイラ表現である。第３のコンパイラ表現（７０７）は、本発明の実施態様に従い最適化されたコンパイラ表現でもある。なお、第２のコンパイラ表現（７０６）の最大精度が27（１行目の「zoned_to_packed_27」）である為に、浮動小数点レジスタとして拡張精度レジスタ（例えば３４桁の精度を有する）を採用しうる。
【０１９２】
第３のコンパイラ表現（７０７）中の５行目に演算「dfp_truncate  VFPR2,11digits」が追加された理由は、同４行目の「dfp_shift_left」が11桁の値を左に2桁シフトして11桁にストアしているために、当該「dfp_shift_left」の結果がオーバーフローしうるからである。同様に、第３のコンパイラ表現（７０７）中の８行目に演算「dfp_truncate  VFPR2,17digits」が追加された理由は、同７行目の「dfp_add」が19桁と11桁の値を足して17桁にストアしているために、当該「dfp_add」の結果がオーバーフローしうるからである。
【０１９３】
コンパイラ表現（７０８）は第３のコンパイラ表現（７０７）を本発明の実施態様以外の最適化技法を使用して最適化するために、削除又は結合可能な演算があるかどうかを判定し、当該判定の結果を第３のコンパイラ表現（７０７）中に注釈として追加した後のコンパイラ表現である。コンパイラ表現（７０８）は、上記判定の結果の理解を容易にするために示したものであることを了解されたい。コンパイラ表現（７０８）は、３行、６行、８行及び９行の演算が削除可能であることを示している。
【０１９４】
コンパイラ表現（７０８）中の３行目の演算「dfp_truncate  VFPR2,11digits」が削除可能である理由は、同２行目の「int_to_dfp」が11桁であるからである（「int_to_packed」が最大６バイトであるために、6×2-1=11桁である）。コンパイラ表現（７０８）中の６行目の演算「dfp_truncate  VFPR1,19digits」が削除可能である理由は、同１行目の「zoned_to_dfp」の演算結果が18桁であり、ゾーン１０進数の桁数がバイト数に等しい為である。コンパイラ表現（７０８）中の８及び９行目の演算「dfp_truncate」が削除可能である理由は、同１０行目の「dfp_to_zoned」でＤＦＰ型をゾーン１０進数に変換する際に桁合わせもされている為である。
【０１９５】
コンパイラ表現（７０９）は第３のコンパイラ表現（７０７）又はコンパイラ表現（７０８）から生成されたものであり（７１７又は７１８）、コンパイラ表現（７０８）中に示すように、３行、６行、８行及び９行の演算を削除した後のコンパイラ表現である。
【０１９６】
コンパイラ表現（７０９）中の１行目の演算「zoned_to_dfp  VFPR1,112(18,R2)」においてオペランド「112(18,R2)」が最大１８桁であるので、１９桁の切り落とし（truncate）が不要となる。同様に、コンパイラ表現（７０９）中の６行目の演算「dfp_to_zoned  VFPR2,96(16,R3)」中、１６桁に桁の切り落としがされている。なお、zoned型の場合はバイト数＝桁数であるために、桁数が１６となる。
【０１９７】
マシンコード（７１０）はコンパイラ表現（７０９）から変換されたものであり（７１９）、オリジナルのバイナリコード（７０１）のコンパイラ表現に種々の最適化処理を適用した結果から得られる最適化されたマシンコードである。
【０１９８】
図８、図９Ａ〜図９Ｂ、及び図１０それぞれは、図３Ａ、図３Ｂ〜図３Ｄ、及び図３Ｅそれぞれに示す特定のパターンに一致するコンパイラ表現中の演算を別の演算に変換する各処理（それぞれ、２つのＢＣＤ演算を１つのＢＣＤ演算に結合する処理、非ＢＣＤ演算をＢＣＤ演算に変換、及び各オペランドの左ゼロ桁を解析）の具体例を示す。
【０１９９】
図８は、図３Ａ〜図３Ｅに示す特定のパターンに一致するコンパイラ表現中の演算を別の演算に変換する処理のうちの、２つのＢＣＤ演算を１つのＢＣＤ演算に結合する処理の例（１）〜（２）、及び当該各処理によって生成されるコンパイラ表現を示す。
【０２００】
例（１）に示す結合例２つはいずれも、２つの連続した第１（１行目）及び第２（２行目）の命令であるＢＣＤ演算zoned_to_packedを１つのＢＣＤ演算zoned_to_packedに結合する例を示す。
・第１のコンパイラ表現（８０２）中、第１の命令zoned_to_packed中のオペランド32(7,R13)はメモリアドレスが32〜38であり、第２の命令zoned_to_packed中のオペランド38(8,R13)はメモリアドレスが38〜45である。従って、第１の命令zoned_to_packed中のオペランド32(7,R13)と第２の命令zoned_to_packed中のオペランド38(8,R13)とを結合して、結合した命令zoned_to_packed中のオペランド32(14,R13)（８０３）に変換する。上記オペランド32(14,R13)はメモリアドレスが32〜45であり、結合前の２つの連続した第１及び第２の命令zoned_to_packedのメモリアドレス（それぞれ、32〜38及び38〜45）を全てカバーする。同様に、第１の命令zoned_to_packed中のオペランド112(4,R3)はメモリアドレスが112〜115であり、第２の命令zoned_to_packed中のオペランド115(15,R3)はメモリアドレスが115〜129である。従って、第１の命令zoned_to_packed中のオペランド112(4,R3)と第２の命令zoned_to_packed中のオペランド115(15,R3)とを結合して、結合した命令zoned_to_packed中のオペランド112(18,R2)（８０３）に変換する。上記オペランド112(18,R2)はメモリアドレスが112〜129であり、結合前の２つの連続した第１及び第２の命令zoned_to_packedのメモリアドレス（それぞれ、112〜115及び115〜129）をカバーする。結果的に、コンパイラ表現（８０３）は、２つのオペランド32(14,R13)及び112(18,R2)を有し、これら２つのオペランドはそれぞれ論理的に単一の論理ＢＣＤ変数である。
・第１のコンパイラ表現（８１２）中、第１の命令zoned_to_packed中のオペランド368(7,R13)はメモリアドレスが368〜374であり、第２の命令zoned_to_packed中のオペランド374(8,R13)はメモリアドレスが374〜381である。従って、第１の命令zoned_to_packed中のオペランド368(7,R13)と第２の命令zoned_to_packed中のオペランド374(8,R13)とを結合して、結合した命令zoned_to_packed中のオペランド368(14,R13)に変換する（８１３）。上記オペランド368(14,R13)はメモリアドレスが368〜381であり、結合前の２つの連続した第１及び第２の命令zoned_to_packedのメモリアドレス（それぞれ、368〜374及び374〜381）をカバーする。同様に、第１の命令zoned_to_packed中のオペランド800(4,R2)はメモリアドレスが800〜803であり、第２の命令zoned_to_packed中のオペランド803(15,R2)はメモリアドレスが803〜817である。従って、第１の命令zoned_to_packed中のオペランド800(4,R2)と第２の命令zoned_to_packed中のオペランド803(15,R2)とを結合して、結合した命令zoned_to_packed中のオペランド800(18,R2)に変換する（８１３）。上記オペランド800(18,R2)はメモリアドレスが800〜817であり、結合前の２つの連続した第１及び第２の命令zoned_to_packedのメモリアドレス（それぞれ、800〜803及び803〜817）をカバーする。結果的に、コンパイラ表現（８１３）は、２つのオペランド368(14,R13)及び800(18,R2)を有し、これら２つのオペランドはそれぞれ論理的に単一の論理ＢＣＤ変数である。
【０２０１】
例（２）に示す結合例は、２つの連続した第１（１行目）及び第２（２行目）の命令であるＢＣＤ演算packed_to_zonedを１つのＢＣＤ演算packed_to_zonedに結合する例を示す。
・第１のコンパイラ表現（８２２）中、第１の命令packed_to_zoned中のオペランド836(4,R2)はメモリアドレスが836〜839であり、第２の命令packed_to_zoned中のオペランド839(15,R2)はメモリアドレスが839〜853である。従って、第１の命令packed_to_zoned中のオペランド836(4,R2)と第２の命令packed_to_zoned中のオペランド839(15,R2)とを結合して、結合した命令packed_to_zoned中のオペランド836(18,R2)（８２３）に変換する。上記オペランド836(18,R2)はメモリアドレスが836〜853であり、結合前の２つの連続した第１及び第２の命令packed_to_zonedのメモリアドレス（それぞれ、836〜839及び839〜853）を全てカバーする。同様に、第１の命令packed_to_zoned中のオペランド368(3,R13)はメモリアドレスが368〜370であり、第２の命令packed_to_zoned中のオペランド370(8,R13)はメモリアドレスが370〜377である。従って、第１の命令packed_to_zoned中のオペランド368(3,R13)と第２の命令packed_to_zoned中のオペランド370(8,R13)とを結合して、結合した命令zoned_to_packed中のオペランド368(10,R13)（８２３）に変換する。上記オペランド368(10,R13)はメモリアドレスが368〜377であり、結合前の２つの連続した第１及び第２の命令packed_to_zonedのメモリアドレス（それぞれ、368〜370及び370〜377）をカバーする。結果的に、コンパイラ表現（８２３）は、２つのオペランド836(18,R2)及び368(10,R13)を有し、これら２つのオペランドはそれぞれ論理的に単一の論理ＢＣＤ変数である。
【０２０２】
図９Ａ〜図９Ｂは、図３Ａ〜図３Ｅに示す特定のパターンに一致するコンパイラ表現中の演算を別の演算に変換する処理のうちの、非ＢＣＤ演算をＢＣＤ演算に変換する処理の例（１）〜（４）、及び当該各処理によって生成されるコンパイラ表現を示す。
【０２０３】
例（１）は、非ＢＣＤ演算がバイト長のオペランドに対する定数値の論理和の演算でり、当該論理和の演算をパック１０進数型又はゾーン１０進数型に対して符号ビットを全て１にする演算に変換する例（図３Ｂのステップ３１１〜３１５を参照）であり、その例として、「byte_or」を「packed_set_sign」又は「zoned_set sign」に変換する例を示す。
・第１のコンパイラ表現（９０２）中、２行目の論理和の非ＢＣＤ演算「byte_or」が「packed_set_sign」（９０３）に変換される条件、又は、第１のコンパイラ表現（９１２）中、２行目の「byte_or」が「zoned_set sign」（９１３）に変換される条件は、下記の通りである：
上記バイト長のオペランドのuseに対するdefが一意に存在し、パック１０進数型又はゾーン１０進数型であること、且つ、当該オペランドのuseのアドレスと該useに対するdefの右端のアドレスとが同一であること、且つ、定数値が符号部のビットのみを全て１にする値であることである。
【０２０４】
第１のコンパイラ表現（９０２）中のuse「381(R13)」に対するdef「376(6,R13)」が一意に存在し、当該def「376(6,R13)」はパック10進数型であり、オペランド「381(R13)」がオペランド「376(6,R13)」の右端のバイトアドレスであり、定数値0xfが符号部に当たる下位の４ビット全てを１にする値である。
【０２０５】
第１のコンパイラ表現（９０２）の生成元であるオリジナルのバイトコード（９０１）中、２行目の「OI」は「OR IMMEDIATE」の一般命令である。「OI」は、一部のバイトにアクセスするという問題を有する命令である。しかしながら、「OI」はＢＣＤ符号を設定するために使用されている。当該「OI」は、非ＢＣＤ演算をＢＣＤ演算に変換後のコンパイラ表現（９０３）中の、２行目の演算「packed_set_sign」（本来の目的であるＢＣＤ符号の設定を意図する）に変換される。
【０２０６】
例（２）は、非ＢＣＤ演算がバイト長のオペランドに対する定数値の論理積の演算であり、当該論理積の演算をパック１０進数型の上位桁の切り落としの演算に変換する例（図３Ｂのステップ３２１〜３２５を参照）であり、その例として「byte_and」を「packed_truncate」に変換する例を示す。
・第１のコンパイラ表現（９２２又は９３２）中、２行目の論理積の非ＢＣＤ演算「byte_and」が「packed_truncate」（それぞれ、９２３又は９３３）に変換される条件は、下記の通りである：
上記バイト長のオペランドのuseに対するdefが一意に存在し、パック１０進数型であること、且つ、当該オペランドのuseのアドレスが該useに対するdefの右端のアドレスと異なること、且つ、定数値が上位の桁をゼロにする値であることである。
【０２０７】
第１のコンパイラ表現（９２２）中のuse「311(R13)」に対するdef「307(13,R13)」が一意に存在し、当該def「307(13,R13)」はパック10進数型であり、オペランド「311(R13)」がオペランド「307(13,R13)」の右端のバイトアドレスでなく、定数値0xfが上位の４ビット全てをゼロにする値である。
【０２０８】
例（３）は、非ＢＣＤ演算がメモリ比較の演算であり、当該メモリ比較の演算をパック１０進数型の比較の演算に変換する例（図３Ｃのステップ３３１〜３４０）であり、その例として「memory_cmp」を「packed_cmp」に変換する例を示す。
・第１のコンパイラ表現（９４２）中、５行目のメモリ比較の非ＢＣＤ演算「memory_cmp」が「packed_cmp」（９４４）に変換される条件は、下記の通りである：
第１のオペランド中のＵＤ連鎖及び／又はＤＵ連鎖において、（ａ１）defが支配するuseがあり、当該defから当該useの間の全てのパスに当該useに対する他のdefが存在せず、且つ、当該defに対して上記useがただ一つ存在すること、且つ、（ｂ１）上記useの右端のアドレスが上記defの右端のアドレスと同一であること、且つ、（ｃ１）上記defがパック１０進数型であること、且つ、（ｄ１）（ｉ）上記useのサイズ（sizeof(use)）が上記defのサイズ（sizeof(def)）と同じである（sizeof(use) == sizeof(def)）こと、又は、（ｉｉ）sizeof(use) < sizeof(def)であること、又は、（ｉｉｉ）sizeof(use) > sizeof(def)であり且つ上記useと上記defの重なっていない領域にゼロが入っていることの３つの条件（ｉ）〜（ｉｉｉ）のうちのいずれか一つであること、並びに、
第２のオペランド中のＵＤ連鎖及び／又はＤＵ連鎖において、（ａ２）defが支配するuseがあり、当該defから当該useの間の全てのパスに当該useに対する他のdefが存在せず、且つ、当該defに対して上記useがただ一つ存在すること、且つ、（ｂ２）上記useの右端のアドレスが上記defの右端のアドレスと同一であること、且つ、（ｃ２）上記defがパック１０進数型であること、且つ、（ｄ２）（ｉ）上記useのサイズ（sizeof(use)）が上記defのサイズ（sizeof(def)）と同じである（sizeof(use) == sizeof(def)）こと、又は、（ｉｉ）sizeof(use) < sizeof(def)であること、又は、（ｉｉｉ）sizeof(use) > sizeof(def)であり且つ上記useと上記defの重なっていない領域にゼロが入っていることの３つの条件（ｉ）〜（ｉｉｉ）のうちのいずれか一つであること
である。
【０２０９】
コンパイラ表現（９４３）中、第１のオペランド「264(3,R13)」はuseであり、当該useに対するdefは、２行目の演算命令「packed_set_sign」のオペランド「264(3,R13)」である。当該defと当該useは、上記（ａ１），（ｂ１）及び（ｃ１）の要件を満たす。また、「sizeof(use) == sizeof(def)」であるので上記（ｄ１）の要件についても満たす。同様に、コンパイラ表現（９４３）中、第２のオペランド「272(3,R13)」はuseであり、当該useに対するdefは、４行目の演算命令「packed_set_sign」のオペランド「272(3,R13)」である。当該defと当該useは、上記（ａ２），（ｂ２）及び（ｃ２）の要件を満たす。また、「sizeof(use) == sizeof(def)」であるので上記（ｄ２）の要件についても満たす。
【０２１０】
なお、例（３）に示すコンパイラ表現（９４２〜９４４）は、上記「memory_cmp」を「packed_cmp」に変換する例とともに、論理和の演算（第１のコンパイラ表現（９４２）中の「byte_or」）をパック１０進数型に対して符号ビットを全て１にする演算（コンパイラ表現（９４３）中の「packed_set_sign」）に変換するコンパイラ表現（９４２〜９４３）の例をまた示している。
【０２１１】
例（４）は、非ＢＣＤ演算がメモリ・コピーの演算であり、当該メモリ・コピーの演算をパック１０進数型の値のコピーの演算に変換する例であり、その例として「memory_copy」を「packed_copy」に変換する例を示す。
・第１のコンパイラ表現（９５２）中、２行目のメモリ・コピーの非ＢＣＤ演算「memory_copy」が「packed_copy」（９５３）に変換される条件は、下記の通りである：
コピー元のオペランド中のＵＤ連鎖及び／又はＤＵ連鎖において、（ａ）defが支配するuseがあり、当該defから当該useの間の全てのパスに当該useに対する他のdefが存在せず、且つ、当該defに対して上記useがただ一つ存在すること、且つ、（ｂ）上記useの右端のアドレスが上記defの右端のアドレスと同一であること、且つ、（ｃ）上記defがパック１０進数型であること、且つ、（ｄ）（ｉ）上記コピー元のオペランドの上記useのサイズ（sizeof(use)）が上記コピー元のオペランドの上記defのサイズ（sizeof(def)）と同じである（sizeof(use) == sizeof(def)）こと、又は、（ｉｉ）上記コピー元のオペランドの上記useのサイズが上記コピー元のオペランドの上記defのサイズよりも小さい（sizeof(use) < sizeof(def)）こと、又は、（ｉｉｉ）上記コピー元のオペランドの上記useのサイズが上記コピー元のオペランドの上記defのサイズよりも大きく（sizeof(use) > sizeof(def)）且つ上記コピー元のオペランドの上記useと上記コピー元のオペランドの上記defの重なっていない領域にゼロが入っていることの３つの条件（ｉ）〜（ｉｉｉ）のうちのいずれか一つであること
である。
【０２１２】
第１のコンパイラ表現（９５２）中のコピー元のオペランドのuseは２行目の「307(R13)」（307(13,R13)」の省略形である）あり、当該useに対するdefは、１行目の演算命令「packed_mul」のオペランド「308(12,R13)」である。当該defと当該useは上記（ａ）、（ｂ）及び（ｃ）の要件を満たす。また、「sizeof(use) > sizeof(def)」であり且つ重なっていない領域にゼロが入っている(307(R13) == 0と仮定する)ので、上記（ｄ）の要件についても満たす。
【０２１３】
図１０は、図３Ａ〜図３Ｅに示す特定のパターンに一致するコンパイラ表現中の演算を別の演算に変換する処理のうちの、各オペランドの左端の桁からのゼロの桁数を解析する処理の例（１）〜（４）、及び当該各処理によって生成されるコンパイラ表現を示す。
【０２１４】
例（１）は、defがゾーン１０進数型からパック１０進数型への変換（例えば、「zoned_to_packed」）である場合に、「左端の桁からのゼロのバイト数＝パック１０進数型のオペランド長−（ゾーン１０進数型のオペランド長＋２）／２」（但し、除算は切り捨て、０よりも大きい場合）（すなわち、「left_zero_len = packed_len - (zoned_len + 2) / 2」）と解析する例である（図３Ｅのステップ３６１〜３６２を参照）。
・第１のコンパイラ表現（１００２）中、defは「zoned_to_packed」のオペランド「304(16,R13) 」である。従って、「left_zero_len = packed_len - (zoned_len + 2) / 2」の式に、「packed_len」= 16, 「zoned_len」= 10 を入れて、「left_zero_len」 = 「left_zero_lenof zoned_to_packed」= 16 - (10 + 2) / 2 = 10」と解析される（１００３）。
【０２１５】
例（２）は、defがパック１０進数型に対する符号ビットの設定（例えば、「packed_set_sign」）である場合に、「左端の桁からのゼロのバイト数＝符号ビットの設定を行うオペランドのuseに対して一意に決まるdefの左端の桁からのゼロのバイト数」（但し、解析の結果が存在する場合）（すなわち、「left_zero_len = left_zero_len_of_prev_def」）と解析する例である（図３Ｅのステップ３６３〜３６４を参照）。
・第１のコンパイラ表現（１０１２）中、defは「zoned_to_packed」のオペランド「304(16,R13) 」である。従って、「left_zero_len f」 = 「left_zero_len_of_prev_def」 = 「left_zero_lenof zoned_to_packed」= 16 - (10 + 2) / 2 = 10」と解析される（１０１３）。
【０２１６】
例（３）は、defが４バイト長の整数型からパック１０進数型への変換（例えば、「int_to_packed」）である場合に、「左端の桁からのゼロのバイト数＝パック１０進数のオペランド長−６」（但し、０よりも大きい場合）（すなわち、「left_zero_len = packed_len &#8211; 6」）( -2147483648 〜 +2147483647は、 6バイト中にフィットする)と解析する例である（図３Ｅのステップ３６５〜３６６を参照）。
・第１のコンパイラ表現（１０２２）中、defは「int_to_packed」のオペランド「312(8,R13)」である。従って、「left_zero_len =  8 - 6 = 2」と解析される（１０２３）。
【０２１７】
例（４）は、defがリテラル・プール中の定数ゼロの配列からのメモリ・コピー（例えば、「memory_copy」）である場合に、「左端の桁からのゼロのバイト数＝メモリ・コピーのバイト数」（すなわち、「left_zero_len = copy_length」）と解析する例である（図３Ｅのステップ３６７〜３６８を参照）。
・第１のコンパイラ表現（１０３２）（但し、18(R12) が、リテラル・プール中の定数ゼロの配列であると仮定する）中、defは「memory_copy」のオペランド「18(R12)」である。従って、「left_zero_len = 8」(すなわち、copy_length)と解析される（１０３３）。なお、オリジナルのバイナリコード（１０３１）及び第１のコンパイラ表現（１０３２）中のオペランド「18(R12)」は、「18(8,R12)」と同じことを意味する。すなわち、「18(R12)」では、オペランドの長さである8が省略して表記されている。この理由は、「memory_copy」の第１オペランドと第２オペランドとは、必ず同一の長さであるので、第２オペランドの長さの表記が省略可能であるからである。
【０２１８】
図１１Ａ〜図１１Ｃは、図４Ａ〜図４Ｂに示す論理ＢＣＤ変数を識別する処理において、defのオペランドとuseのオペランドとを同一の論理ＢＣＤ変数とみなす条件（１）〜（３）を示す。
【０２１９】
図１１Ａに示す条件（１）は、オペランドのuseを支配するdefがあり、当該defから当該useの間の全てのパスに当該useに対する他のdefが存在せず、且つ、当該defに対して上記useがただ一つ存在する場合に、
・上記useのオペランドのサイズ（sizeof(use)）と上記defのオペランドのサイズ（sizeof(def)）が同じであること（sizeof(def) == sizeof(use)）；且つ、
・上記use及び上記defの各オペランドの右端のアドレスが同一であること（right aligned）；且つ、
・上記use及び上記defの各オペランドの型が同一のＢＣＤ型であること
を満たすことである。
【０２２０】
コンパイラ表現（１１０１）において、５行目「packed_add  7(9,R13),36(10,R13)」中の「7(9,R13)」がＵＤ連鎖及び／又はＤＵ連鎖の解析結果であるdefであり、６行目「packed_truncate  7(9,R13),16digits」中の「7(9,R13)」が同解析結果であるuseである。すなわち、def = 7(9,R13)、use = 7(9,R13)であり、当該defは当該useを支配し、当該defから当該useの間の全てのパスに当該useに対する他のdefが存在せず、且つ、当該defに対して上記useがただ一つ存在する。また、当該use及び当該defの各オペランドの右端のアドレスがいずれも15で同一であり（right aligned）、且つ、当該use及び当該defの各オペランドの型が同一のＢＣＤ型であり、且つ、当該defのオペランドのサイズ（sizeof(def)）は、当該useのオペランドのサイズ（sizeof(use)）と同じである（sizeof(def) = sizeof(use)）（１１０３）。従って、５行目「packed_add  7(9,R13),36(10,R13)」中の「7(9,R13)」と６行目「packed_truncate  7(9,R13),16digits」中の「7(9,R13)」とが同一の論理ＢＣＤ変数とみなされる。その結果、コンパイラ表現（１１０２）において、同一の一時変数TMP2が６行目「packed_add_17」と７行目「packed_truncate_16」中にそれぞれ割り当てられている。
【０２２１】
コンパイラ表現（１１０１）において、６行目「packed_truncate  7(9,R13),16digits」中の「7(9,R13)」がＵＤ連鎖及び／又はＤＵ連鎖の解析結果であるdefであり、７行目「packed_to_zoned  96(16,R3),7(9,R13)」中の「7(9,R13)」が同解析結果であるuseである。すなわち、def = 7(9,R13)、use = 7(9,R13)であり、当該defは当該useを支配し、当該defから当該useの間の全てのパスに当該useに対する他のdefが存在せず、且つ、当該defに対して上記useがただ一つ存在する。また、当該use及び当該defの各オペランドの右端のアドレスがいずれも15で同一であり（right aligned）、且つ、当該use及び当該defの各オペランドの型が同一のＢＣＤ型であり、且つ、当該defのオペランドのサイズ（sizeof(def)）は、当該useのオペランドのサイズ（sizeof(use)）と同じである（sizeof(def) = sizeof(use)）（１１０４）。従って、６行目「packed_truncate  7(9,R13),16digits」中の「7(9,R13)」と７行目「packed_to_zoned  96(16,R3),7(9,R13)」中の「7(9,R13)」とが同一の論理ＢＣＤ変数とみなされる。その結果、コンパイラ表現（１１０２）において、同一の一時変数TMP2が７行目「packed_truncate_16」と８行目「packed_to_zoned_16」中にそれぞれ割り当てられている。
【０２２２】
図１１Ｂに示す条件（２）は、オペランドのuseを支配するdefがあり、当該defから当該useの間の全てのパスに当該useに対する他のdefが存在せず、且つ、当該defに対して上記useがただ一つ存在する場合に、
・上記useのオペランドのサイズ（sizeof(use)）が上記defのオペランドのサイズ（sizeof(def)）よりも小さいこと；且つ、
・上記use及び上記defの各オペランドの右端のアドレスが同一であること（right aligned）；且つ、
・上記use及び上記defの各オペランドの型が同一のＢＣＤ型であること；且つ、
・第２のコンパイラ表現の生成において、桁合わせのための命令を第１のコンパイラ表現中に挿入すること
を満たすことである。
【０２２３】
コンパイラ表現（１１１１）において、１行目「zoned_to_packed  32(14,R13),112(18,R2)」中の「32(14,R13)」がＵＤ連鎖及び／又はＤＵ連鎖の解析結果であるdefであり、５行目「packed_add  7(9,R13),36(10,R13)」中の「36(10,R13)」が同解析結果であるuseである。すなわち、def = 32(14,R13)、use = 36(10,R13)であり、当該defは当該useを支配し、当該defから当該useの間の全てのパスに当該useに対する他のdefが存在せず、且つ、当該defに対して上記useがただ一つ存在する。また、当該use及び当該defの各オペランドの右端のアドレスがいずれも45で同一であり（right aligned）、且つ、当該use及び当該defの各オペランドの型が同一のＢＣＤ型であり、且つ、当該useのオペランドのサイズ（sizeof(use)）は当該defのオペランドのサイズ（sizeof(def)）よりも小さい（sizeof(def) > sizeof(use)）。従って、１行目「zoned_to_packed  32(14,R13),112(18,R2)」中の「32(14,R13)」と５行目「packed_add  7(9,R13),36(10,R13)」中の「36(10,R13)」とが同一の論理ＢＣＤ変数とみなされる。その結果、第２のコンパイラ表現（１１１２）において、同一の一時変数TMP1が１行目「zoned_to_packed_27」と６行目「packed_add_17」中にそれぞれ割り当てられている。また、第２のコンパイラ表現（１１１２）中、５行目に桁合わせのための命令「packed_truncate_19  TMP1,19digits」が挿入されている（１１１３）。
【０２２４】
コンパイラ表現（１１１１）において、２行目「int_to_packed  R4,8(8,R13)」中の「8(8,R13)」がＵＤ連鎖及び／又はＤＵ連鎖の解析結果であるdefであり、４行目「packed_shift_left  10(6,R13),2」中の「10(6,R13)」が同解析結果であるuseである。すなわち、def = 8(8,R13)、use = 10(6,R13)であり、当該defは当該useを支配し、当該defから当該useの間の全てのパスに当該useに対する他のdefが存在せず、且つ、当該defに対して上記useがただ一つ存在する。また、当該use及び当該defの各オペランドの右端のアドレスがいずれも15で同一であり（right aligned）、且つ、当該use及び当該defの各オペランドの型が同一のＢＣＤ型であり、且つ、当該useのオペランドのサイズ（sizeof(use)）は当該defのオペランドのサイズ（sizeof(def)）よりも小さい（sizeof(def) > sizeof(use)）。従って、２行目「int_to_packed  R4,8(8,R13)」中の「8(8,R13)」と４行目「packed_shift_left  10(6,R13),2」中の「10(6,R13)」とが同一の論理ＢＣＤ変数とみなされる。その結果、第２のコンパイラ表現（１１１２）において、同一の一時変数TMP2が２行目「int_to_packed_15」と４行目「packed_shift_left_11」中にそれぞれ割り当てられている。また、第２のコンパイラ表現（１１１２）中、３行目に桁合わせのための命令「packed_truncate_11  TMP2,11digits」が挿入されている（１１１４）。
【０２２５】
図１１Ｃに示す条件（３）は、オペランドのuseを支配するdefがあり、当該defから当該useの間の全てのパスに当該useに対する他のdefが存在せず、且つ、当該defに対して上記useがただ一つ存在する場合に、
・上記useのオペランドのサイズ（sizeof(use)）が上記defのオペランドのサイズ（sizeof(def)）よりも大きいこと；且つ、
・上記use及び上記defの各オペランドの右端のアドレスが同一であること（right aligned）；且つ、
・上記use及び上記defの各オペランドの型が同一のＢＣＤ型であること；且つ、
・上記useのオペランドと上記defのオペランドとが重なっていない領域にゼロが入っていること
を満たすことである。
【０２２６】
コンパイラ表現（１１２１）において、４行目「packed_shift_left  10(6,R13),2」中の「10(6,R13)」がＵＤ連鎖及び／又はＤＵ連鎖の解析結果であるdefであり、５行目「packed_add  7(9,R13),36(10,R13)」中の「7(9,R13)」が同解析結果であるuseである。すなわち、def = 10(6,R13)、use = 7(9,R13)であり、当該defは当該useを支配し、当該defから当該useの間の全てのパスに当該useに対する他のdefが存在せず、且つ、当該defに対して上記useがただ一つ存在する。また、当該use及び当該defの各オペランドの右端のアドレスがいずれも15で同一であり（right aligned）、且つ、当該use及び当該defの各オペランドの型が同一のＢＣＤ型であり、且つ、当該defのオペランドのサイズ（sizeof(def)）は、当該useのオペランドのサイズ（sizeof(use)）よりも小さい（sizeof(def) < sizeof(use)）。コンパイラ表現（１１２１）中の２行目の演算「int_to_packed」の解析から、「8(R13)== 0」及び上記「9(R13) == 0」であることがわかる。次に、同３行目の演算「memory_copy」の解析から、「0(8,R13) == 0」であることがわかる。そして、上記２つの解析結果を併せて、「0(10,R13) == 0」であることがわかる。従って、４行目「packed_shift_left  10(6,R13),2」中の「10(6,R13)」と５行目「packed_add  7(9,R13),36(10,R13)」中の「7(9,R13)」とが同一の論理ＢＣＤ変数とみなされる。その結果、第２のコンパイラ表現（１１２２）において、同一の一時変数TMP2が４行目「packed_shift_left_11」と６行目「packed_add_17」中にそれぞれ割り当てられている。
【０２２７】
図１１Ｄは、図４Ａ〜図４Ｂに示す論理ＢＣＤ変数を識別する処理において論理ＢＣＤ変数を識別し、当該識別した論理ＢＣＤ変数に一時変数を割り当てることによって生成された第２のコンパイラ表現を示す。
第１のコンパイラ表現（１１３２）は、オリジナルのバイナリコード（１１３１）をコンパイラ表現に変換したものである。ここで、オリジナルのバイナリコード（１１３１）において、336(9,R13)及び376(6,R13)がデッド（dead）（すなわち、書き込まれる値が以降のコードで参照されない）であると仮定する。
【０２２８】
第１のコンパイラ表現（１１３２）中、１行目の「336(9,R13)」及び３行目の「336(9,R13)」は、図１１Ａに示す条件（１）を満たすために、同一の論理ＢＣＤ変数であるとみなされる。同様に、同３行目の「336(9,R13)」及び同４行目の「336(9,R13)」は、図１１Ａに示す条件（１）を満たすために、同一の論理ＢＣＤ変数であるとみなされる。
【０２２９】
また、第１のコンパイラ表現（１１３２）中、２行目の「376(6,R13)」及び３行目の「376(6,R13)」は同一の論理ＢＣＤ変数とみなされる。
【０２３０】
第２のコンパイラ表現（１１３３）は、第１のコンパイラ表現（１１３２）において識別された論理ＢＣＤ変数に一時変数を割り当てて生成されたものである。
【０２３１】
図１１Ｅは、図４Ａ〜図４Ｂに示す論理ＢＣＤ変数を識別する処理において論理ＢＣＤ変数を識別し、当該識別した論理ＢＣＤ変数に一時変数を割り当てることによって生成された第２のコンパイラ表現を示す。
第１のコンパイラ表現（１１４２）は、オリジナルのバイナリコード（１１４１）をコンパイラ表現に変換したものである。ここで、オリジナルのバイナリコード（１１４１）において、２行目の演算命令「MVC」のオペランド「304(8,R13),18(R12) 」中の第２オペランドに対応する「18(R12)」（「18(8,R12)」と同じである）がゼロの配列であり、且つ、304(16,R13)及び336(9,R13)がデッドであると仮定する。オリジナルのバイトコード（１１４１）において、３行目の演算命令SRPは、１行目の演算命令CVDの切り落とし（truncation）結果である314(6,R13)にアクセスし、且つ、５行目の演算命令APは、上記演算命令SRPのゼロ拡張（zero-extended、ゼロで上位桁を埋めること）の結果である311(9,R13)にアクセスする。
【０２３２】
各オペランドの左端の桁からのゼロの桁数を解析した結果（１行目の「left_zero_len = 2」と２行目の「left_zero_len = 8」）を使用して、第１のコンパイラ表現（１１４２）中、３行目の「314(6,R13)」及び５行目の「311(9,R13)」は、図１１Ａに示す条件（３）を満たすために同一の論理ＢＣＤ変数とみなされる。
【０２３３】
第１のコンパイラ表現（１１４２）中、図１１Ａに示す条件（１）を満たすために、５行目の「311(9,R13)」及び６行目の「311(9,R13)」は同一の論理ＢＣＤ変数とみなされる。また、第１のコンパイラ表現（１１４２）中、図１１Ａに示す条件（１）を満たすために、４行目の「336(9,R13)」及び５行目の「336(9,R13)」は同一の論理ＢＣＤ変数とみなされる。
【０２３４】
第２のコンパイラ表現（１１４３）は、第１のコンパイラ表現（１１４２）において識別された論理ＢＣＤ変数に一時変数を割り当てて生成されたものである。
【０２３５】
図１１Ｆは、コンパイラ表現（１１６１）中の各命令が実際にアクセスするメモリ領域を示す。
オペランド  0(16,R13)は、メモリ領域０〜１５にアクセスする。Disp(Len,Rn)がアクセスするメモリ領域は、開始点がRn+Disp及び終了点がRn+Disp+Len-1と表現される。従って、例えば、オペランド  0(16,R13)は、メモリ領域０〜１５（0+（16-1））にアクセスする（１１７１）。
【０２３６】
コンパイラ表現（１１６１）の各演算は、下記メモリ領域にアクセスする：
・１行目のオペランド  8(8,R13)は、メモリ領域８〜１５にアクセス（１１８１）；
・２行目のオペランド  0(8,R13)は、メモリ領域０〜７にアクセス（１１８２）；
・３行目のオペランド  10(6,R13)は、メモリ領域１０〜１５にアクセス（１１８３）；
・５行目のオペランド  7(9,R13)は、メモリ領域７〜１５にアクセス（１１８５）；
・６行目のオペランド  7(R13)は、メモリ領域７にアクセス（１１８６）；
・７行目のオペランド  7(9,R13)は、メモリ領域７〜１５にアクセス（１１８７）。
ゼロ拡張が、３行目の演算から５行目の演算において行われている。
【０２３７】
コンパイラ表現（１１６１）の６行目の非ＢＣＤ演算（byte_and）がＢＣＤ演算（packed_truncate）に変換された場合（図９Ａの（２）を参照）（１１６２）、変換後のオペランド  7(9,R13)は、メモリ領域７〜１５にアクセスする（１１９７）。
【０２３８】
図１２は、本発明の実施形態に従い、パック１０進数型の演算の型及び一時変数の型のＤＦＰ型への変換によって生成されるコンパイラ表現、及び当該コンパイラ表現を変換した最適されたマシンコードの例を示す。
第３のコンパイラ表現（１２０３）は、第１のコンパイラ表現（１２０１）そして、第２のコンパイラ表現（１２０２）を経て生成されたものである。
【０２３９】
第２のコンパイラ表現（１２０２）から第３のコンパイラ表現（１２０３）への変換において、第２のコンパイラ表現（１２０２）中のパック１０進数型の演算の型及び一時変数の型がＤＦＰ型へ変換される。当該ＤＦＰ型への変換において、下記（１）及び（２）に示す処理が行われうる。
【０２４０】
（１）ＤＦＰ型の符号コードをＢＣＤ型が有する符号コード中の優先符号コード（preferred sign-code）とみなし、第２のコンパイラ表現（１２０２）中の演算についての論理ＢＣＤ変数の符号コードすべてを優先符号コードに置き換えた場合においても、当該優先符号コードに置き換えた演算について同一の結果が得られることを条件に上記ＤＦＰ型への変換を行う。
【０２４１】
ＢＣＤ命令は４ビットの符号コードを有し、一方ＤＦＰは１ビットの符号コードを有する。プロセッサは、ＢＣＤ命令の「0xc」と「0xd」をそれぞれプラスとマイナスの優先符号コードとして扱う。また、プロセッサは、ＢＣＤ命令の他の４ビットの値を非優先符号コードとして扱う。アーキテクチャ依存ではあるが、多くのＢＣＤ型の演算命令は、優先又は非優先の符号コードを持つオペランドから優先符号コードを持つ結果を生成する。従って、当該演算に使用されている論理ＢＣＤ変数はＤＦＰ型に置き換えられる。例えば、第１のコンパイラ表現（１２０１）中の、(3)「packed_shift_left」及び(5)「packed_add」の各オペランドは、優先符号コード又は非優先コードを有するオペランドを用いる。上記(3)「packed_shift_left」及び(5)「packed_add」の各オペランドは常に、優先符号コードを有する結果を生成する。このことは、「packed_shift_left」及び(5)「packed_add」の各オペランドをＤＦＰ型に変換しても、符号情報は失われない。
【０２４２】
（２）論理ＢＣＤ変数の最大精度よりも大きい精度の浮動小数点レジスタを割り当て、各ＢＣＤ演算命令についてＤＵ連鎖及び／又はＤＵ連鎖の解析の結果をもとにオーバーフローが発生する可能性があるかを解析し、当該解析結果に基づいて上記オーバーフローが発生する可能性がある場合に桁合わせのための命令を第２のコンパイラ表現（１２０２）中に挿入する。
【０２４３】
ＢＣＤ型の命令は、バイト単位で各オペランドの精度を示すことができる。一方、ＤＦＰ型の命令は、３つの精度の型、すなわち単精度（例えば７桁）、倍精度（例えば１６桁）及び拡張精度（例えば３４桁）のみを有する。各ＢＣＤ命令を解析して、ＢＣＤ計算について十分な浮動小数点レジスタ長を割り当て、そして桁合わせのための命令を追加する必要がある。桁合わせは、指数部を変更することなしに、仮数を左及び右にシフトすることによって実行することが可能である。
【０２４４】
上記オーバーフローが発生するかどうかの解析は、図５Ｂに示すフローチャートに従って行われうる。第１のコンパイラ表現（１２０１）中の(3)の結果の精度は１１桁（パックド１０進数型の精度は「長さ×２−１」で計算されるので、長さ６×２−１＝１１桁である）であり、オペランドの最大長も１１桁であるので、(3)のオペランドを２桁左シフトすると上記１１桁を超えてオーバーフローする可能性がある。従って、第３のコンパイラ表現（１２０３）中の(3)において桁合わせのための命令「dfp_truncate  VFPR1,11digits」（ＦＰＲ型の命令におけるオペランドの桁を１１桁に切り落とす）が挿入されている。第１のコンパイラ表現（１２０１）中の(5)の演算結果の精度は１７桁（長さ９×２−１＝１７桁）であり、オペランドの最大長は(3)の演算結果の１１桁と(4)の演算結果の１６桁（ゾーン１０進数型の精度は長さに等しいので、長さ＝１６桁である）であるので、オーバーフローの可能性はない。従って、第１のコンパイラ表現（１２０１）中に第１のコンパイラ表現（１２０１）中の(5)の演算命令に対する桁合わせのための命令を挿入する必要はない。
【０２４５】
最適化されたマシンコード（１２０４）は、第３のコンパイラ表現（１２０３）を変換して得られるコードである。
【０２４６】
図１３は、ＢＣＤ型変数へのアクセスを有する言語であるＣＯＢＯＬのソースコード（１３０１）、当該ＣＯＢＯＬのソースコード（１３０１）を変換したオリジナルのバイナリコード（１３０２）、及び当該オリジナルのバイナリコード（１３０２）を変換した最適化されたバイナリコード（１３０３）を示す。本発明の実施態様において、図１３に示すように、ＣＯＢＯＬのソースコード（１３０１）から処理を開始して当該ＣＯＢＯＬのソースコード（１３０１）をオリジナルのバイナリコード（１３０２）に変換し、当該変換したオリジナルのバイナリコード（１３０２）に本発明の最適化を適用してもよいし、或いは、図６Ａ及び図７Ａ〜図７Ｂに示すように、オリジナルのバイナリコード（１３０２）から処理を開始して当該オリジナルのバイナリコード（６０１、７０１）に本発明の最適化を適用してもよい。後者の場合、ＣＯＢＯＬのソースコードが逸失してしまっている場合であっても、本発明の実施態様に従いバイナリコードそれ自体を最適化可能である。
【０２４７】
本発明の実施態様において、論理ＢＣＤ変数の識別は当該論理ＢＣＤ変数がＢＣＤ命令のオペランドと一致しない故に困難であるという問題点を下記に示す処理によって解決した。
【０２４８】
・バイナリコード中の演算命令が論理ＢＣＤ変数の一部のバイトにアクセスするという点については、事前変換処理として２つのＢＣＤ演算を１つのＢＣＤ演算に結合することによって解決した（図３Ａ及び図８を参照）。例えば、図８に示す第２のコンパイラ表現（８１３）は論理ＢＣＤ変数であるオペランド368(14,R13)及び800(18,R2)を有し、これらオペランドはそれぞれ論理的に単一の論理ＢＣＤ変数となるように、第１のコンパイラ表現（８１２）に示す２つの演算命令を結合することによって生成されたオペランドである。
【０２４９】
・ＢＣＤ命令が異なる精度で元の命令の結果にアクセスするという点については、事前変換処理として各オペランドの左端の桁からのゼロの桁数を解析すること（図３Ｅ、図１０及び図１１Ｄを参照）、そして２つの各オペランドを同一の論理ＢＣＤ変数と見なすこと（図４Ａ〜図４Ｃ及び図１１Ａ〜図１１Ｃ、並びに図１１Ｅを参照）によって解決した。例えば図１１Ｅに示す例において、第１のコンパイラ表現（１１４２）中、３行目の「314(6,R13)」及び５行目の「311(9,R13)」は、図１１Ａに示す条件（３）を満たすために同一の論理ＢＣＤ変数とみなされる。
【０２５０】
・非ＢＣＤ命令が論理ＢＣＤ変数にアクセスするという点については、非ＢＣＤ演算をＢＣＤ演算に変換すること、具体的にはＢＣＤ演算命令のために使用されうる命令（非ＢＣＤ演算）を、当該命令が本来意図する目的に従ってＢＣＤ演算に変換することによって解決した。例えば図９Ａに示す例（１）において、オリジナルのバイトコード（９０１）中、２行目の「OI」は「OR IMMEDIATE」の一般命令である。しかしながら、オリジナルのバイトコード（９０１）において「OI」はＢＣＤ符号を設定するために使用されている。従って、当該「OI」は、非ＢＣＤ演算をＢＣＤ演算に変換後のコンパイラ表現（９０３）中の、２行目の演算「packed_set_sign」（本来の目的であるＢＣＤ符号の設定を意図する）に変換されて、論理ＢＣＤ変数の識別において使用されうる。
【０２５１】
・同じメモリ位置が異なる目的の為に再使用されるという点については、ＵＤ連鎖及び／又はＤＵ連鎖の解析の結果を使用して、図４Ａ〜図４Ｃの処理に示すように同じメモリ領域に対する異なる論理ＢＣＤ変数は異なるものとして識別することによって解決した。例えば、図６Ａのオリジナルのバイトコード（６０１）において、演算AP（１行目；307〜319）、NI（２行目；311）及びUNPK（３行目；311〜319）、CVD（４行目；312）、MVC（５行目；304〜311）、SRP（６行目；314〜319）及びAP（７行目；311〜319）は同じメモリ位置にアクセスするが、それらは２つの異なる論理ＢＣＤ変数である（なお、演算命令NI及び演算MVCはいずれも非ＢＣＤ命令であるが、最終的に論理ＢＣＤ変数として識別されるので異なる論理ＢＣＤ変数であるといえる）。従って、第２のコンパイラ表現（６０３）に示すように、異なる論理ＢＣＤ変数に対して異なる一時変数（TMP1及びTMP3）が割り当てされている。第２のコンパイラ表現（６０３）において、再使用に関係している演算は、１、２及び３行目における一時変数TMP1、並びに、５、６及び７行目における一時変数TMP3である。
【０２５２】
本発明の実施態様において、ＢＣＤ演算の型からＤＦＰ演算の型への変換はＢＣＤ演算の型及びＤＦＰ演算の型が非常に異なる特性を有する故に困難であるという問題点を下記に示す処理によって解決した。
【０２５３】
・ＢＣＤ型は４ビットの符号コードを有するのに対してＤＦＰ型は１ビットの符号コードを有するという点については、ＤＦＰの符号コードを優先符号コードとして扱うことによって解決した（図１２を参照）。図１２に示す第１のコンパイラ表現（１２０１）中、(3)「packed_shift_left」及び(5)「packed_add」の各オペランドは、当該「packed_shift_left」及び(5)「packed_add」の各オペランドをＤＦＰ型に変換しても、符号情報が失われない。
【０２５４】
・ＤＦＰ型が３つの型の精度のみを有するという点については、第１のコンパイラ表現中の一時変数の最大長がＤＦＰレジスタの最大桁長で表現可能であるようにＤＦＰレジスタの精度を決定することによって解決した（図５Ａのステップ５０５を参照）。
【０２５５】
図１４は、本発明の実施態様に従い最適化されたコンパイラ表現から変換されたマシンコードの演算処理のベンチマーク結果を示す。
３つの１０進数型ベンチマークテスト（ＤＪＰＣＯＭ８５，ＣＯＭＰＴＸ２及びＳＥＱＰＲ２）を使用した。オリジナルのソースコードから変換されたマシンコードのベンチマーク結果を１００％として、上記オリジナルのバイナリコードのコンパイラ表現について本発明の実施態様に従い最適化されたコンパイラ表現から変換されたマシンコードの性能を比較した。本発明の実施態様に従い最適化されたコンパイラ表現から変換されたマシンコードの場合、その性能は最大８７．２％向上し（ＣＯＭＰＴＸ２）、また、上記３つのベンチマークテストの幾何学的平均（geo.mean）ではその性能は５２．８％改善された。
【０２５６】
図１５は、図１に従うハードウェア構成を好ましくは備えており、本発明の実施態様に従うコンピュータの機能ブロック図の一例を示した図である。ここで、以下の説明において、当該defは当該useを支配し、当該defから当該useの間の全てのパスに当該useに対する他のdefが存在せず、且つ、当該defに対して上記useがただ一つ存在するものである。
【０２５７】
コンピュータ（１５０１）は、図１のコンピュータ（１０１）に対応する。コンピュータ（１５０１）は、図１のコンピュータ（１０１）に示されている構成、例えばＣＰＵ（１０２）、メイン・メモリ（１０３）及びディスク（１０８）を備えている。コンピュータ（１５０１）は、本発明に従う最適化技法を実施するためのバイナリコード最適化装置又はコンパイラ装置でありうる。
【０２５８】
記憶部（１５０２）は、ＢＣＤ型変数へのアクセスを有する言語のソースコード（例えば、ＣＯＢＯＬ又はＰＬ／Ｉのソースコード）、ＢＣＤ型変数へのアクセスを有する言語のバイナリコード（例えばＣＯＢＯＬ又はＰＬ／Ｉのバイナリコード）を格納する。また、記憶部（１５０２）は、本発明に従う最適化技法に従って最適化されたバイナリコード及び／又は最適化されたマシンコードを格納する。
【０２５９】
以下では、ＢＣＤ型変数へのアクセスを有する言語のソースコードとして、ＣＯＢＯＬのソースコードを例として述べる。同様に、以下では、ＢＣＤ型変数へのアクセスを有する言語のバイナリコードとして、ＣＯＢＯＬのバイナリコード（本願発明でいう、オリジナルのバイナリコードである）を例として述べる。
【０２６０】
記憶部（１５０２）は、コンピュータ（１５０１）内に備え付けられた内蔵記憶媒体、コンピュータ（１５０１）に直接的に又はネットワークを介して接続された外部記憶媒体でありうる。記憶部（１５０２）は、例えばハードディスク又はソリッド・ステート・ディスクでありうるがこれらに限定されない。
【０２６１】
コンピュータ（１５０１）は、本発明に従う最適化技法を実施するための少なくとも最適化部（１５１５）を備えており、字句解析部（１５１１）、構文解析部（１５１２）、意味解析部（１５１３）を任意に備えうる。コンピュータ（１５０１）が、コンパイラ（図示せず）を備えている場合、当該コンパイラが、字句解析部（１５１１）、構文解析部（１５１２）、意味解析部（１５１３）及び最適化部（１５１５）に加えて、ＣＯＢＯＬのソースコードをオリジナルのバイナリコードに変換するための第１の変換部（１５１４）及び最適化されたコンパイラ表現をマシンコードに変換するための第２の変換部（１５１６）を備えうる。コンピュータ（１５０１）は記憶部（１５０２）から読み出した文字列がＣＯＢＯＬのソースコードである場合には、当該ソースコードを字句解析部（１５１１）に渡す。一方、コンピュータ（１５０１）は記憶部（１５０２）から読み出した文字列がＣＯＢＯＬのバイナリコードである場合には、当該バイナリコードを最適化部（１５１５）中の第１のコンパイラ表現生成部（１５２１）に直接渡す。
【０２６２】
字句解析部（１５１１）は、上記読み出したＣＯＢＯＬのソースコードについて、字句解析を行う。
【０２６３】
構文解析部（１５１２）は、字句解析部（１５１１）によって字句解析された結果について構文解析を行う。
【０２６４】
意味解析部（１５１３）は、構文解析部（１５１２）によって構文解析された結果について意味解析を行う。
【０２６５】
第１の変換部（１５１４）は、ＣＯＢＯＬのソースコードをオリジナルのバイナリコードに変換する。
【０２６６】
最適化部（１５１５）は、本発明に従う最適化技法に従い、オリジナルのバイナリコードを最適化する。また、最適化部（１５１５）は、本発明以外の最適化技法、例えばソースコードの最適化技法及びバイナリコードの最適化技法を含んでいてもよい。
【０２６７】
最適化部（１５１５）は、少なくとも第１のコンパイラ表現生成部（１５２１）、解析部（１５２２）、識別部（１５２４）、第２のコンパイラ表現生成部（１５２５）及び第３のコンパイラ表現生成部（１５２６）を備えており、任意的に、コンパイラ表現変換部（１５２３）を備えていてもよい。第１のコンパイラ表現生成部（１５２１）、解析部（１５２２）、コンパイラ表現変換部（１５２３）、識別部（１５２４）、第２のコンパイラ表現生成部（１５２５）及び第３のコンパイラ表現生成部（１５２６）は、起動信号を与える機能を有するコンピュータ・プログラムで実装され、又は、専用のハードウェア（回路）で実現されてもよい。特に、本願発明に従うコンピュータ・プログラムにおいて、各ステップの主体が第１のコンパイラ表現生成部（１５２１）、解析部（１５２２）、コンパイラ表現変換部（１５２３）、識別部（１５２４）、第２のコンパイラ表現生成部（１５２５）及び第３のコンパイラ表現生成部（１５２６）のいずれかでありうる場合、各部（１５２１〜１５２６）の一部又は全部が専用のハードウェア（回路）で実現されてもよく、専用のハードウェア（回路）で実現されない部（１５２１〜１５２６の少なくとも１つ）若しくは全ての部（１５２１〜１５２６）がプログラム・コードとして実装されてもよい。
【０２６８】
第１のコンパイラ表現生成部（１５２１）は、ＢＣＤ型変数へのアクセスを有する言語のバイナリコードから第１のコンパイラ表現を生成する。
【０２６９】
第１のコンパイラ表現生成部（１５２１）は、図２に示すステップ２０３を実行する。
【０２７０】
解析部（１５２２）は、第１のコンパイラ表現生成部（１５２１）において生成された第１のコンパイラ表現に対してＵＤ連鎖及び／又はＤＵ連鎖を解析する。
【０２７１】
解析部（１５２２）は、図２に示すステップ２０４を実行する。
【０２７２】
コンパイラ表現変換部（１５２３）は、use及びdefの各オペランドの右端のアドレスが同一でない１又は複数の命令を、上記同一の論理ＢＣＤ変数とみなすステップが適用できる他の命令に変換することを行う。また、コンパイラ表現変換部（１５２３）は、同一のＢＣＤ型でなく且つ上記use及び上記defの各オペランドの右端のアドレスが同一でない１又は複数の命令を、上記同一の論理ＢＣＤ変数とみなす処理が適用できる他の命令に変換することを行う。
【０２７３】
コンパイラ表現変換部（１５２３）は、特には、第１のコンパイラ表現中の２つのＢＣＤ演算を１つのＢＣＤ演算に結合することを行う。
【０２７４】
コンパイラ表現変換部（１５２３）は、第１のコンパイラ表現中の２つのＢＣＤ演算を１つのＢＣＤ演算に結合することを、
２つの連続した第１及び第２の命令のパック１０進数型のオペランドからゾーン１０進数型のオペランドへの変換を行う命令があること；且つ、
上記第１の命令のパック１０進数型のオペランドの右端のバイトアドレスが、上記第２の命令のパック１０進数型のオペランドの左端のバイトアドレスと同一であること；且つ、
上記第１の命令のパック１０進数型のオペランドをゾーン１０進数型に変換した第１の命令のゾーン１０進数型のオペランドの右端のバイトアドレスが、上記第２の命令のパック１０進数型のオペランドをゾーン１０進数型に変換した第２の命令のゾーン１０進数型のオペランドの左端のバイトアドレスと同一であること
を条件に実行しうる。上記結合の実行によって、上記第１の命令のパック１０進数型のオペランドと上記第２の命令のパック１０進数型のオペランドとを結合したオペランドが、上記第１の命令のゾーン１０進数型のオペランドと上記第２の命令のゾーン１０進数型のオペランドとを結合したオペランドに変換される。
【０２７５】
コンパイラ表現変換部（１５２３）は、第１のコンパイラ表現中の２つのＢＣＤ演算を１つのＢＣＤ演算に結合することを、
２つの連続した第１及び第２の命令のゾーン１０進数型のオペランドからパック１０進数型のオペランドへの変換を行う命令があること；且つ、
上記第１の命令のゾーン１０進数型のオペランドの右端のバイトアドレスが、上記第２の命令のゾーン１０進数型のオペランドの左端のバイトアドレスと同一であること；且つ、
上記第１の命令のゾーン１０進数型のオペランドをパック１０進数型に変換した第１の命令のパック１０進数型のオペランドの右端のバイトアドレスが、上記第２の命令のゾーン１０進数型のオペランドをパック１０進数型の変換した第２の命令のパック１０進数型のオペランドの左端のバイトアドレスと同一であること
を条件に実行しうる。上記結合の実行によって、上記第１の命令のゾーン１０進数型のオペランドと上記第２の命令のゾーン１０進数型のオペランドとを結合したオペランドが、上記第１の命令のパック１０進数型のオペランドと上記第２の命令のパック１０進数型のオペランドとを結合したオペランドに変換される。
【０２７６】
コンパイラ表現変換部（１５２３）は、特には、上記第１のコンパイラ表現中の非ＢＣＤ演算をＢＣＤ演算に変換することを行う。
【０２７７】
コンパイラ表現変換部（１５２３）は、上記第１のコンパイラ表現中の非ＢＣＤ演算をＢＣＤ演算に変換することを下記（１）〜（４）のいずれか一つの条件を満たす場合に行いうる：
（１）上記非ＢＣＤ演算がバイト長のオペランドに対する定数値の論理和の演算であり、
上記バイト長のオペランドのuseに対するdefが一意に存在し、当該defがパック１０進数型のオペランド又はゾーン１０進数型のオペランドであること；且つ、
上記バイト長のオペランドの上記useのアドレス（バイト長なので左端のアドレス＝右端のアドレスである）が、当該useに対するdefの右端のアドレスと同一であること；且つ、
上記第１のコンパイラ表現中に定数として表現されている値（すなわち、論理和の定数オペランド）が符号部のビットのみを全て１にする値であること
という条件；
（２）上記非ＢＣＤ演算がバイト長のオペランドに対する定数値の論理積の演算であり、
上記バイト長のオペランドのuseに対するdefが一意に存在し、当該defがパック１０進数型のオペランドであること；且つ、
上記バイト長のオペランドの上記useのアドレス（バイト長なので左端のアドレス＝右端のアドレスである）が、当該useに対するdefの右端のアドレスと異なること；且つ、
上記第１のコンパイラ表現中に定数として表現されている値（すなわち、論理積の定数オペランド）が上位の桁をゼロにする値であること
という条件；
（３）上記非ＢＣＤ演算がメモリ比較の演算であり、
上記第１のコンパイラ表現中のメモリ比較の第１のオペランドのＵＤ連鎖及び／又はＤＵ連鎖中のuse及びdefにおいて、defが支配するuseがあり、当該defから当該useの間の全てのパスに当該useに対する他のdefが存在せず、且つ、当該defに対して上記useがただ一つ存在すること；且つ、
上記第１のオペランドの上記useの右端のアドレスが、上記第１のオペランドの上記defの右端のアドレスと同一であること；且つ、
上記第１のオペランドの上記defがパック１０進数型のオペランドであること；且つ、
（ｉ）上記第１のオペランドの上記useのサイズが上記第１のオペランドの上記defのサイズと同じであること、又は、（ｉｉ）上記第１のオペランドの上記useのサイズが上記第１のオペランドの上記defのサイズよりも小さいこと、又は、（ｉｉｉ）上記第１のオペランドの上記useのサイズが上記第１のオペランドの上記defのサイズよりも大きく且つ上記第１のオペランドの上記useと上記第１のオペランドの上記defの重なっていない領域にゼロが入っていること；且つ、
上記第１のコンパイラ表現中のメモリ比較の第２のオペランドのＵＤ連鎖及び／又はＤＵ連鎖中のuse及びdefにおいて、当該defが支配する当該useがあり、当該defから当該useの間の全てのパスに当該useに対する他のdefが存在せず、且つ、当該defに対して上記useがただ一つ存在すること；且つ、
上記第２のオペランドの上記useの右端のアドレスが、上記第２のオペランドの上記defの右端のアドレスと同一であること；且つ、
上記第２のオペランドの上記defがパック１０進数型のオペランドであること；且つ、
（ｉ）上記第２のオペランドの上記useのサイズが上記第２のオペランドの上記defのサイズと同じであること、又は、（ｉｉ）上記第２のオペランドの上記useのサイズが上記第２のオペランドの上記defのサイズよりも小さいこと、又は、（ｉｉｉ）上記第２のオペランドの上記useのサイズが上記第２のオペランドの上記defのサイズよりも大きく且つ上記第２のオペランドの上記useと上記第２のオペランドの上記defの重なっていない領域にゼロが入っていること
という条件、又は、
（４）上記非ＢＣＤ演算がメモリ・コピーの演算であり、
上記第１のコンパイラ表現中のメモリ・コピー元のオペランドのＵＤ連鎖及び／又はＤＵ連鎖中のuse及びdefにおいて、当該defが支配する当該useがあり、当該defから当該useの間の全てのパスに当該useに対する他のdefが存在せず、且つ、当該defに対して上記useがただ一つ存在すること；且つ、
上記メモリ・コピー元のオペランドのuseの右端のアドレスが、上記メモリ・コピー元のオペランドの上記defの右端のアドレスと同一であること；且つ、
上記メモリ・コピー元の上記defがパック１０進数型のオペランドであること；且つ、
（ｉ）上記第メモリ・コピー元の上記useのサイズが上記メモリ・コピー元の上記defのサイズと同じであること、又は、（ｉｉ）上記メモリ・コピー元の第２のオペランドの上記useのサイズが上記メモリ・コピー元のオペランドの上記defのサイズよりも小さいこと、又は、（ｉｉｉ）上記第２のオペランドの上記useのサイズが上記第２のオペランドの上記defのサイズよりも大きく且つ上記第２のオペランドの上記useと上記第２のオペランドの上記defの重なっていない領域にゼロが入っていること
という条件。
【０２７８】
コンパイラ表現変換部（１５２３）は、上記第１のコンパイラ表現中のオペランドのdefの左端の桁からのゼロの桁数を解析しうる。当該解析の結果は、識別部（１５２４）が第１のコンパイラ表現中のオペランドのＵＤ連鎖及び／又はＤＵ連鎖中のuseのオペランドとdefのオペランドとが重なっていない領域にゼロが入っているかどうかを判断するために使用される。例えば、当該解析の結果は、上記第１のコンパイラ表現中の非ＢＣＤ演算をＢＣＤ演算に変換する上で、（３）非ＢＣＤ演算がメモリ比較の演算である場合、及び（４）非ＢＣＤ演算がメモリ・コピーの演算である場合の判断においても使用される。
【０２７９】
コンパイラ表現変換部（１５２３）は、図２に示すステップ２０５〜２０６を実行する。また、コンパイラ表現変換部（１５２３）は、図３Ａ〜図３Ｅに示す各ステップを実行する。
【０２８０】
識別部（１５２４）は、解析部（１５２２）における第１のコンパイラ表現に対するＵＤ連鎖及び／又はＤＵ連鎖の解析の結果に基づき上記第１のコンパイラ表現中の論理ＢＣＤ変数を識別する。
【０２８１】
識別部（１５２４）は、下記に示す（１）〜（３）に示すいずれか一つの条件を満たすことに応じて、useのオペランドとdefのオペランドとを同一の論理ＢＣＤ変数とみなす処理を実行しうる。
【０２８２】
（１）識別部（１５２４）は、
オペランドのuseを支配するdefがあり、当該defから当該useの間の全てのパスに当該useに対する他のdefが存在せず、且つ、当該defに対して上記useがただ一つ存在する場合に、
上記use及び上記defの各オペランドのサイズが同じであること；且つ、
上記use及び上記defの各オペランドの右端のアドレスが同一であること；且つ、
上記use及び上記defの各オペランドの型が同一のＢＣＤ型であること
を条件に、上記useのオペランドと上記defのオペランドとを同一の論理ＢＣＤ変数とみなす処理を実行しうる。
【０２８３】
（２）識別部（１５２４）は、
オペランドのuseを支配するdefがあり、当該defから当該useの間の全てのパスに当該useに対する他のdefが存在せず、且つ、当該defに対して上記useがただ一つ存在する場合に、
上記useのオペランドのサイズが上記defのオペランドのサイズよりも小さいこと；且つ、
上記use及び上記defの各オペランドの右端のアドレスが同一であること；且つ、
上記use及び上記defの各オペランドの型が同一のＢＣＤ型であること；且つ、
上記第２のコンパイラ表現の生成において、桁合わせのための命令を上記第１のコンパイラ表現中に挿入すること
を条件に、上記useのオペランドと上記defのオペランドとを同一の論理ＢＣＤ変数とみなす処理を実行しうる。
【０２８４】
（３）識別部（１５２４）は、
オペランドのuseを支配するdefがあり、当該defから当該useの間の全てのパスに当該useに対する他のdefが存在せず、且つ、当該defに対して上記useがただ一つ存在する場合に、
上記useのオペランドのサイズが上記defのオペランドのサイズよりも大きいこと；且つ、
上記use及び上記defの各オペランドの右端のアドレスが同一であること；且つ、
上記use及び上記defの各オペランドの型が同一のＢＣＤ型であること；且つ、
上記useのオペランドと上記defのオペランドとが重なっていない領域にゼロが入っていること
を条件に、上記useのオペランドと上記defのオペランドとを同一の論理ＢＣＤ変数とみなす処理を実行しうる。
【０２８５】
識別部（１５２４）は、図２に示すステップ２０７〜２０８を実行する。また、識別部（１５２４）は、図４Ａ〜図４Ｂに示す各ステップを実行する。
【０２８６】
第２のコンパイラ表現生成部（１５２５）は、識別部（１５２４）において識別した論理ＢＣＤ変数に一時変数を割り当てして第２のコンパイラ表現を生成する。
【０２８７】
第２のコンパイラ表現生成部（１５２５）は、図２に示すステップ２０９〜２１０を実行する。また、第２のコンパイラ表現生成部（１５２５）は、図４Ｃに示す各ステップを実行する。
【０２８８】
第３のコンパイラ表現生成部（１５２６）は、第２のコンパイラ表現生成部（１５２５）において生成された第２のコンパイラ表現中のパック１０進数の演算のうちの少なくとも１つの演算の型と上記割り当てされた一時変数のうちの少なくとも１つの一時変数の型とを、ＢＣＤ演算の型からＤＦＰ演算の型への変換によって符号情報と精度情報とが失われないことを条件に、ＤＦＰ型に変換して、第３のコンパイラ表現を生成する。
【０２８９】
第３のコンパイラ表現生成部（１５２６）は、ＤＦＰ型の符号コードをＢＣＤ型が有する符号コード中の優先符号コード（preferred sign-code）とみなし、第２のコンパイラ表現中の演算についての論理ＢＣＤ変数の符号コードすべてを優先符号コードに置き換えた場合においても、当該優先符号コードに置き換えた演算について同一の結果が得られることを条件に上記変換を行う。
【０２９０】
第３のコンパイラ表現生成部（１５２６）は、論理ＢＣＤ変数の最大精度よりも大きい精度の浮動小数点レジスタを割り当て、各ＢＣＤ演算命令について上記解析の結果をもとにオーバーフローが発生する可能性があるかを解析し、上記オーバーフローが発生する可能性がある場合に桁合わせのための命令を第２のコンパイラ表現中に挿入する。
【０２９１】
第３のコンパイラ表現生成部（１５２６）は、図２に示すステップ２１１〜２１２を実行する。また、第３のコンパイラ表現生成部（１５２６）は、図５Ａ〜図５Ｂに示す各ステップを実行する。
【０２９２】
最適化部（１５１５）は、本発明の実施態様に従うコンパイラ表現の最適化を行う第１の最適化モジュール（１５２１〜１５２６）に加えて、本発明の実施態様以外の最適化を行う第２の最適化モジュール（図示せず）を備えうる。当該第２の最適化モジュールは、図２に示すステップ２１３〜２１４を実行する。
【０２９３】
第２の変換部（１５１６）は、第３のコンパイラ表現又は当該第３のコンパイラ表現をさらに本発明の実施態様に従う最適化技法以外の最適化技法によって最適化されたコンパイラ表現をマシンコードに変換する。
【０２９４】
第２の変換部（１５１６）は、図２に示すステップ２１５を実行する。
【図１】
2014211696.tif 000003
【図２】
2014211696.tif 000004
【図３Ａ】
2014211696.tif 000005
【図３Ｂ】
2014211696.tif 000006
【図３Ｃ】
2014211696.tif 000007
【図３Ｄ】
2014211696.tif 000008
【図３Ｅ】
2014211696.tif 000009
【図４Ａ】
2014211696.tif 000010
【図４Ｂ】
2014211696.tif 000011
【図４Ｃ】
2014211696.tif 000012
【図５Ａ】
2014211696.tif 000013
【図５Ｂ】
2014211696.tif 000014
【図６Ａ】
2014211696.tif 000015
【図６Ｂ】
2014211696.tif 000016
【図６Ｃ】
2014211696.tif 000017
【図７Ａ】
2014211696.tif 000018
【図７Ｂ】
2014211696.tif 000019
【図８】
2014211696.tif 000020
【図９Ａ】
2014211696.tif 000021
【図９Ｂ】
2014211696.tif 000022
【図１０】
2014211696.tif 000023
【図１１Ａ】
2014211696.tif 000024
【図１１Ｂ】
2014211696.tif 000025
【図１１Ｃ】
2014211696.tif 000026
【図１１Ｄ】
2014211696.tif 000027
【図１１Ｅ】
2014211696.tif 000028
【図１１Ｆ】
2014211696.tif 000029
【図１２】
2014211696.tif 000030
【図１３】
2014211696.tif 000031
【図１４】
2014211696.tif 000032
【図１５】
2014211696.tif 000033