(57)【要約】  【課題】  Packed Decimal型の符号を正しく設定する符号設定命令の使用を最適化する技法を提供すること。  【解決手段】  例えばZAP命令である、Packed Decimal型の符号を正しく設定する符号設定命令の入力・出力フィールドのサイズに着目し、それらが同一な場合、次のような方法により、最適化を行う。(1) ZAP命令の入力値が常に-0とはならないとわかる場合、当該ZAP命令を除去・またはコピー命令に置き換える処理。入力値が、足し算・引き算の結果であり、当該演算の前の値よりも増加しているとわかる場合にこのような処理を行う。（例えば１を加える演算など）。(2) 入力・出力のアドレスも同じ場合はZAPを除去。(3) 入力・出力のアドレスが違い、オーバーラップしていないことがわかる場合は、ZAPを入力を出力へコピーする命令に置き換え。【選択図】  図５
2013242700.tif 000002
【特許請求の範囲】
【請求項１】
コンピュータの処理により、コンピュータ・プログラム中のPacked Decimal型の符号を正しく設定する符号設定命令を最適化するための最適化方法であって、
(a)  前記コンピュータ・プログラムを読み出し、その入力オペランド及び出力オペランドのサイズが同一である符号設定命令を検出するステップと、
(b)  前記ステップ(a)で検出した符号設定命令の入力オペランドを解析し、入力オペランドの値が、加算又は減算の結果であり、かつ、演算前の値より増加しているか否かを判断するステップと、
(c) 前記ステップ(b)における肯定的な判断結果に応答して、符号設定命令の入力オペランド及び出力オペランドのアドレスが完全同一であることを条件に上記符号設定命令を除去し、及び、符号設定命令の入力オペランド及び出力オペランドのアドレスが完全同一でなくかつオーバーラップしないことを条件に上記符号設定命令を、該符号設定命令の入力オペランドの値を出力オペランドの値にコピーするコピー命令と置換するステップと、
を含む最適化方法。
【請求項２】
前記ステップ(b)は、符号設定命令の入力オペランドへの入力について符号設定が不要であると判断された場合にその出力についても符号設定が不要であると判断できることを条件に、入力オペランドについての前記ステップ(b)の処理を繰り返すステップを含む、請求項１に記載の方法。
【請求項３】
前記ステップ(b)における否定的な判定結果に応答して、符号設定命令の入力オペランド及び出力オペランドのアドレスが完全同一であることを条件に、上記符号設定命令の入力オペランドの値が-0である可能性があるか否かをチェックし、-0の可能性がある場合にのみ上記符号設定命令を実行する命令を生成し挿入するステップを更に含む、請求項１に記載の方法。
【請求項４】
前記ステップ(b)における否定的な判定結果に応答して、符号設定命令の入力オペランド及び出力オペランドのアドレスが完全同一でなくかつオーバーラップしないことを条件に、上記符号設定命令の入力オペランドの値が-0である可能性があるか否かをチェックし、-0である可能性がある場合のみ上記符号設定命令を実行し、-0である可能性がない場合は、上記コピー命令を生成し挿入するステップを更に含む、請求項１に記載の方法。
【請求項５】
符号設定命令の入力オペランドの値が-0である可能性があるか否かのチェックは、桁数に応じたマスク値を作り、符号部を９とANDをとる命令によって実現される、請求項３または請求項４に記載の方法。
【請求項６】
前記前記コンピュータ・プログラムは、バイナリ実行可能プログラムである、請求項１に記載の方法。
【請求項７】
前記前記コンピュータ・プログラムは、ＣＯＢＯＬバイナリ実行可能プログラムであり、Packed Decimal型の符号を正しく設定する符号設定命令はZAPである、請求項６に記載の方法。
【請求項８】
コンピュータの処理により、コンピュータ・プログラム中のPacked Decimal型の符号を正しく設定する符号設定命令を最適化するための最適化プログラムであって、
前記コンピュータに、
(a)  前記コンピュータ・プログラムを読み出し、その入力オペランド及び出力オペランドのサイズが同一である符号設定命令を検出するステップと、
(b)  前記ステップ(a)で検出した符号設定命令の入力オペランドを解析し、入力オペランドの値が、加算又は減算の結果であり、かつ、演算前の値より増加しているか否かを判断するステップと、
(c) 前記ステップ(b)における肯定的な判断結果に応答して、符号設定命令の入力オペランド及び出力オペランドのアドレスが完全同一であることを条件に上記符号設定命令を除去し、及び、符号設定命令の入力オペランド及び出力オペランドのアドレスが完全同一でなくかつオーバーラップしないことを条件に上記符号設定命令を、該符号設定命令の入力オペランドの値を出力オペランドの値にコピーするコピー命令と置換するステップを実行させる、
最適化プログラム。
【請求項９】
前記ステップ(b)は、符号設定命令の入力オペランドへの入力について符号設定が不要であると判断された場合にその出力についても符号設定が不要であると判断できることを条件に、入力オペランドについての前記ステップ(b)の処理を繰り返すステップを含む、請求項８に記載のプログラム。
【請求項１０】
前記ステップ(b)における否定的な判定結果に応答して、符号設定命令の入力オペランド及び出力オペランドのアドレスが完全同一であることを条件に、上記符号設定命令の入力オペランドの値が-0である可能性があるか否かをチェックし、-0の可能性がある場合にのみ上記符号設定命令を実行する命令を生成し挿入するステップを更に含む、請求項８に記載のプログラム。
【請求項１１】
前記ステップ(b)における否定的な判定結果に応答して、符号設定命令の入力オペランド及び出力オペランドのアドレスが完全同一でなくかつオーバーラップしないことを条件に、上記符号設定命令の入力オペランドの値が-0である可能性があるか否かをチェックし、-0である可能性がある場合のみ上記符号設定命令を実行し、-0である可能性がない場合は、上記コピー命令を生成し挿入するステップを更に含む、請求項８に記載のプログラム。
【請求項１２】
符号設定命令の入力オペランドの値が-0である可能性があるか否かのチェックは、桁数に応じたマスク値を作り、符号部を９とANDをとる命令によって実現される、請求項１０または請求項１１に記載のプログラム。
【請求項１３】
前記前記コンピュータ・プログラムは、バイナリ実行可能プログラムである、請求項８に記載のプログラム。
【請求項１４】
前記前記コンピュータ・プログラムは、ＣＯＢＯＬバイナリ実行可能プログラムであり、Packed Decimal型の符号を正しく設定する符号設定命令はZAPである、請求項１３に記載のプログラム。
【請求項１５】
コンピュータの処理により、コンピュータ・プログラム中のPacked Decimal型の符号を正しく設定する符号設定命令を最適化するための最適化システムであって、
前記コンピュータ・プログラムを読み出し、その入力オペランド及び出力オペランドのサイズが同一である符号設定命令を検出する手段と、
前記検出する手段が検出した符号設定命令の入力オペランドを解析し、入力オペランドの値が、加算又は減算の結果であり、かつ、演算前の値より増加しているか否かを判断する手段と、
前記判断する手段における肯定的な判断結果に応答して、符号設定命令の入力オペランド及び出力オペランドのアドレスが完全同一であることを条件に上記符号設定命令を除去し、及び、符号設定命令の入力オペランド及び出力オペランドのアドレスが完全同一でなくかつオーバーラップしないことを条件に上記符号設定命令を、該符号設定命令の入力オペランドの値を出力オペランドの値にコピーするコピー命令と置換する手段を有する、
最適化システム。
【請求項１６】
前記前記コンピュータ・プログラムは、バイナリ実行可能プログラムである、請求項１５に記載のシステム。
【請求項１７】
前記前記コンピュータ・プログラムは、ＣＯＢＯＬバイナリ実行可能プログラムであり、Packed Decimal型の符号を正しく設定する符号設定命令はZAPである、請求項１６に記載のシステム。
【発明の詳細な説明】
【技術分野】
【０００１】
この発明は、Packed Decimal型の変数を含む、ＣＯＢＯＬなどのプログラムを最適化する技法に関するものである。
【背景技術】
【０００２】
ＣＯＢＯＬは、１９５９年に主として事務計算用に作成されたコンピュータ・プログラミング言語であり、過去のプログラミング資産の継承などの意味もあって、現在でも、メインフレーム・コンピュータ・システムなどで使用されている。そのようなメインフレーム・コンピュータ・システムとして、インターナショナル・ビジネス・マシーンズ・コーポレーション（登録商標）のＳｙｓｔｅｍ  ｚなどがある。
【０００３】
ＣＯＢＯＬでは、Int型は、演算に使われるすべての型をBinary型で明示的に指定しない場合、内部的にはPacked Decimalで計算が行われる。
【０００４】
Packed Decimalを使う演算で、符号が正しく設定されない場合がある。例えば、４桁の変数に対して次の演算を行うと、符号が正しくない結果となる。
-9999 - 1 => -0
-1 / 10   => -0
-5000 * 2 => -0
これらは、正しくは+0とならなくてはならない。すなわち、-0のままディスプレイに表示されると、オペレータに奇異な印象を与える。そのため、符号（正負）を正しく設定する命令が生成される。以下、このような命令をZAPと表現する。
【０００５】
アセンブラ・コードの具体例は次のとおりである。例えば、"01 idx pic s9(4)"と定義された変数idxについての、ＣＯＢＯＬのcompute idx = idx - 1という式に対して、次のようなコードが生成される。
1. PACK  272(3,13),24(4,8)    tmp = PACK(idx)
2. SP    272(3,13),52(1,10)   tmp = tmp - 1
3. NI    272(13),X‘0F'       ５桁目を０にセット
4. ZAP   272(3,13),272(3,13)  tmp = ZAP(tmp)
5. UNPK  24(4,8),272(3,13)    idx = UNPK(tmp)
このとき、idxの初期値が-9999であったと仮定する。すると、2の演算結果は-10000となるが、変数idxは４桁である。そのため、3によって-0000と丸められる。この値は、符号が間違っている。そこで、4のZAP命令でこれを+0000に変更する。
【０００６】
しかし、ZAPはコストが大きく速度低下につながるため、これを改善したいという要望がある。
【０００７】
ＣＯＢＯＬなどのプログラムの最適化に適用可能と思われる従来技術として下記のものがある。
【０００８】
特願２００８−１０２７４０号公報は、計算機システムのプロセッサで実行される言語処理系で、分岐処理のうち、まず２つの参照が同じか比較し、結果が真なら分岐し、さもなくば、個々の参照が指示するインスタンスの等価性を検証するメソッドを呼び出し、返戻値が真ならば分岐するものについて、参照間の比較結果が真になる確率が十分小さく、かつ、参照間の比較とその結果に応じた分岐を除去しても、プログラムの実行結果が変化しない場合について、参照間の比較とその結果に応じた分岐を除去することを開示する。
【０００９】
特開２００９−１３４５２３号公報は、アセンブラソースプログラムをプロセッサ５で実行可能な機械語プログラムに変換するアセンブラ装置１では、アセンブラソースプログラムに含まれる拡張マクロ命令（Ｘｌｄ命令及びＸｊｎｚ命令）を、基本命令（ｌｄ命令及びｊｎｚ命令）と拡張命令（ｅｘｔ命令）とに展開する。次いで、展開したｅｘｔ命令について、オペランドの数値データを判断して冗長な命令を省略するｅｘｔ命令の最適化を行い、このｅｘｔ命令の最適化によってラベルのアドレスが変更された場合、再度、ｅｘｔ命令の最適化を行うことを開示する。
【００１０】
特開２００５−１０７８１６号公報は、最適化対象の対象プログラムにおいて、メモリからデータを読み出すロード命令を最適化する最適化コンパイラであって、メモリから変数にデータを読み出すロード命令に対して、変数がレジスタに割り当てられた場合にスピル処理を生じさせない部分冗長性の除去処理を行う部分冗長性除去手段と、ロード命令が読み出すデータを使用する命令から実行順序を遡ることによりロード命令に到達する実行経路において、何れの変数にも割り当てられていない空きレジスタを検出する後進方向レジスタ検出手段と、ロード命令がデータを読み出す読出先変数に、後進方向レジスタ検出手段により検出された空きレジスタを割り当てる空きレジスタ割当手段とを備える最適化コンパイラを開示する。
【００１１】
特開２０００−８１９８３号公報は、不要な配列レンジ・チェックを除去するために、ループに対するバージョニングにより不要な配列レンジ・チェックを除去する部分と、データ・フロー解析を実行順序とは逆順に行って配列レンジ・チェックを最適化する部分、及びデータ・フロー解析を実行順に行って配列レンジ・チェック済の情報を取得し、この情報から不要な配列レンジ・チェックを除去する部分を設けることを開示する。
【００１２】
CoBOL General discussion- Signed COMP-3 fields in COBOL http://www.tek-tips.com/viewthread.cfm?qid=1150690は、ＣＯＢＯＬにおけるZAP機能を説明する。
【００１３】
IBM Extra ZAP following AP in COBOL Compiler gerenrated object cod.-United  States http://www-01.ibm.com/support/docview.wss?uid=swg21001074は、ＣＯＢＯＬにおいて、ZAPを使用して符号を-から+に変更することを説明する。
【００１４】
しかし、上記どの従来技術にも、ZAPのような、Packed Decimal型の符号を正しく設定する符号設定命令の使用を最適化する技法は開示も示唆もされない。
【先行技術文献】
【特許文献】
【００１５】
【特許文献１】特願２００８−１０２７４０号公報
【特許文献２】特開２００９−１３４５２３号公報
【特許文献３】特開２００５−１０７８１６号公報
【特許文献４】特開２０００−８１９８３号公報
【非特許文献】
【００１６】
【非特許文献１】CoBOL General discussion- Signed COMP-3 fields in COBOL http://www.tek-tips.com/viewthread.cfm?qid=1150690
【非特許文献２】IBM Extra ZAP following AP in COBOL Compiler gerenrated object cod.-United  States http://www-01.ibm.com/support/docview.wss?uid=swg21001074
【発明の概要】
【発明が解決しようとする課題】
【００１７】
この発明の目的は、Packed Decimal型の符号を正しく設定する符号設定命令の使用を最適化する技法を提供することにある。
【００１８】
この発明の他の目的は、コストが大きい、Packed Decimal型の符号を正しく設定する符号設定命令を効率的に除去することで、プログラムの動作速度を最適化する技法を提供することにある。
【課題を解決するための手段】
【００１９】
本発明は、上記課題を解決するためになされたものであって、例えばZAP命令である、Packed Decimal型の符号を正しく設定する符号設定命令の入力・出力フィールドのサイズに着目し、それらが同一な場合、次のような方法により、最適化を行うものである。
【００２０】
ZAP命令の除去処理：
(1-1) ZAP命令の入力値が常に-0とはならないとわかる場合、当該ZAP命令を除去・またはコピー命令に置き換える処理。入力値が、足し算・引き算の結果であり、当該演算の前の値よりも増加しているとわかる場合にこのような処理を行う（例えば１を加える演算など）。
(1-2) 入力・出力のアドレスも同じ場合はZAPを除去。
(1-3) 入力・出力のアドレスが違い、オーバーラップしていないことがわかる場合は、ZAPを入力を出力へコピーする命令に置き換え。
【００２１】
ZAP命令の軽減処理：
(2-1) ZAP命令の入力値に対して-0の可能性をビット表現でチェックする命令を生成し、-0の可能性がない場合にはZAP命令をスキップ・またはコピー命令を実行するようにコード生成する処理。-0の可能性を検出する際には、桁数に応じたマスク値を作り、符号部を９とANDをとることによって高速に検出する。
(2-2) 入力・出力のアドレスも同じ場合はZAPを実行しない。
(2-3) 入力・出力のアドレスが違い、オーバーラップしていないことがわかる場合は、ZAPではなく入力を出力へコピーする命令を実行。
【００２２】
上記(1-1)、(1-2)、(1-3)の処理からなる除去技法と、上記(2-1)、(2-2)、(2-3)の処理からなる軽減技法は、それぞれ単独に実施してもよいし、また共に適用してもよい。また、軽減技法を先に適用してから、次に除去技法を適用するようにしてもよい。
【００２３】
本発明の第１の態様では、コンパイルされたＣＯＢＯＬのバイナリ実行ブログラムに対する変換ツールとして上記機能が実装される。
【００２４】
本発明の第２の態様では、ＣＯＢＯＬコンパイラの最適化機能として上記機能が実装される。
【発明の効果】
【００２５】
この発明によれば、Packed Decimal型の符号を正しく設定する符号設定命令を用いるプログラムにおいて、動作に支障がない範囲でPacked Decimal型の符号を正しく設定する符号設定命令が除去され、あるいは生成が抑制されるので、結果のコードの動作速度が向上する。
【図面の簡単な説明】
【００２６】
【図１】本発明を実施するためのハードウェアの構成のブロック図である。
【図２】本発明の第１の実施例の機能構成のブロック図である。
【図３】本発明の第２の実施例の機能構成のブロック図である。
【図４】本発明の第３の実施例の機能構成のブロック図である。
【図５】最適化モジュールの機能構成のブロック図である。
【図６】処理ルーチンの処理のフローチャートを示す図である。
【図７】検出ルーチンの処理のフローチャートを示す図である。
【図８】解析ルーチンの処理のフローチャートを示す図である。
【図９】除去ルーチンの処理のフローチャートを示す図である。
【図１０】軽減ルーチンの処理のフローチャートを示す図である。
【発明を実施するための形態】
【００２７】
以下、図面に従って、本発明の実施例を説明する。これらの実施例は、本発明の好適な態様を説明するためのものであり、発明の範囲をここで示すものに限定する意図はないことを理解されたい。また、以下の図を通して、特に断わらない限り、同一符号は、同一の対象を指すものとする。
【００２８】
図１を参照すると、本発明の一実施例に係るシステム構成及び処理を実現するためのコンピュータ・ハードウェアのブロック図が示されている。好適には、このコンピュータ・ハードウェアは、ＩＢＭ(登録商標) System z(登録商標)アーキテクチャに従う構成である。
【００２９】
図１において、システム・パス１０２には、ＣＰＵ１０４と、主記憶（ＲＡＭ）１０６と、ハードディスク・ドライブ（ＨＤＤ）１０８と、キーボード１１０と、マウス１１２と、ディスプレイ１１４が接続されている。ＣＰＵ１０４は、好適には、ｚ１０（商標）プロセッサ・チップである。主記憶１０６は、好適には、１６ＧＢ以上の容量をもつものである。ハードディスク・ドライブ１０８は、例えば、１ＴＢ以上の容量をもつものである。
【００３０】
ハードディスク・ドライブ１０８には、個々に図示しないが、オペレーティング・システムが、予め格納されている。オペレーティング・システムは、例えば、ｚ／ＯＳであるが、ｚ／ＶＭ、ｚ／ＶＳＥなど、使用するコンピュータ・ハードウェアに適合する、その他のオペレーティング・システムも使用可能である。
【００３１】
キーボード１１０及びマウス１１２は、オペレーティング・システムの機能によって、ハードディスク・ドライブ１０８から主記憶１０６にロードされ、ディスプレイ１１４に表示されたプログラム（図示しない）を操作したり、文字を打ち込んだりするために使用される。
【００３２】
ディスプレイ１１４は、好適には、液晶ディスプレイであり、例えば、ＸＧＡ（１０２４×７６８の解像度）、またはＵＸＧＡ（１６００×１２００の解像度）などの任意の解像度のものを使用することができる。ディスプレイ１１４は、図示しないが、ＣＯＢＯＬのプログラムで計算された会計データなどの数値を表示するために使用される。
【００３３】
本発明の第１の実施例では、図２に示すように、ハードディスク・ドライブ１０８に、ＣＯＢＯＬソースコード２０２と、本発明に係るZAP命令削減機能を実装したコンパイラ２０４が保存されている。この場合は、オペレータの操作に応答して、ＣＯＢＯＬソースコード２０２から直接、コンパイラ２０４によって、ZAP命令が適宜削減された、最適化されたＣＯＢＯＬバイナリ実行可能ファイル２０６が生成され、ハードディスク・ドライブ１０８に保存される。すなわち、コンパイラ２０４が、バイナリ・コードを生成する局面で、コンパイラ２０４が備える、本発明に係るコード最適化機能が呼び出される。第１の実施例は、ＣＯＢＯＬソースコード２０２がきちんと存在している場合に有効である。
【００３４】
本発明の第２の実施例では、図３に示すように、ハードディスク・ドライブ１０８に、本発明の意味では最適化されていないＣＯＢＯＬバイナリ実行可能ファイル３０２と、本発明に係る最適化モジュール３０４が保存されている。この場合は、オペレータの操作に応答して、ＣＯＢＯＬバイナリ実行可能ファイル２０６が、本発明に係るZAP命令削減機能を実行する変換モジュール３０４によって、最適化されたＣＯＢＯＬバイナリ実行可能ファイル３０６に変換される。第２の実施例は、レガシーなプログラムであるなどの理由で、ソースコードがなく、バイナリ実行可能ファイルしか存在しない場合に有効である。
【００３５】
本発明の第３の実施例では、図４に示すように、ハードディスク・ドライブ１０８に、ＣＯＢＯＬソースコード２０２と、本発明に係る最適化機能は実装していないコンパイラ４０２と、図３と同一の最適化モジュール３０４が保存されている。この場合は、オペレータの操作に応答して、ＣＯＢＯＬソースコード２０２が一旦、コンパイラ４０２によって、本発明の意味では最適化されていないＣＯＢＯＬバイナリ実行可能ファイル４０４に変換され、ＣＯＢＯＬバイナリ実行可能ファイル４０４は、変換モジュール３０４によって、最適化されたＣＯＢＯＬバイナリ実行可能ファイル４０６に変換される。第３の実施例は、ソースコードと、既存のＣＯＢＯＬコンパイラが揃っている場合に有効である。
【００３６】
次に、図５の機能ブロック図を参照して、最適化モジュール３０４の機能について説明する。なお、図２のコンパイラ２０４には、最適化モジュール３０４の同等の最適化機能が組み込まれているので、以下の最適化モジュール３０４の機能の説明は、コンパイラ２０４の、本発明に関するコード最適化機能の説明にもなっていることを理解されたい。
【００３７】
図５に示すように、最適化モジュール３０４は、処理ルーチン５０２、入力ルーチン５０４、検出ルーチン５０６、解析ルーチン５０８、除去ルーチン５１０、軽減ルーチン５１２、及び出力ルーチン５１４を具備している。処理ルーチン５０２は、最適化モジュール３０４の機能全体を統合するものであり、入力ルーチン５０４、検出ルーチン５０６、解析ルーチン５０８、除去ルーチン５１０、軽減ルーチン５１２、出力ルーチン５１４を適宜呼び出し、処理を行う。処理ルーチン５０２の機能は、図６のフローチャートを参照して、後で説明する。
【００３８】
入力ルーチン５０４は、ハードディスク・ドライブ１０８に保存されている、最適化されていないＣＯＢＯＬバイナリ実行可能ファイル３０２を読み込む機能をもつ。
【００３９】
検出ルーチン５０６は、ＣＯＢＯＬバイナリ実行可能ファイル３０２における、除去候補のZAPの位置を検出する機能をもつ。検出ルーチン５０６の機能は、図７のフローチャートを参照して、後で説明する。
【００４０】
解析ルーチン５０８は、検出ルーチン５０６中で呼び出され、ZAPの入力に対する定義に対する解析を行う。解析ルーチン５０８の機能は、図８のフローチャートを参照して、後で説明する。
【００４１】
除去ルーチン５１０は、検出ルーチン５０６中で呼び出され、ZAP命令を除去する機能を実行する。除去ルーチン５１０の機能は、図９のフローチャートを参照して、後で説明する。
【００４２】
軽減ルーチン５１２は、検出ルーチン５０６中で呼び出され、ZAPの演算強度軽減処理を実行する。軽減ルーチン５１２の機能は、図１０のフローチャートを参照して、後で説明する。
【００４３】
出力ルーチン５１４は、処理ルーチン５０２の処理の結果を、最適化されたＣＯＢＯＬバイナリ実行可能ファイル３０６としてハードディスク・ドライブ１０８に書き出す。
【００４４】
処理ルーチン５０２、入力ルーチン５０４、検出ルーチン５０６、解析ルーチン５０８、除去ルーチン５１０、軽減ルーチン５１２、出力ルーチン５１４などのプログラムは、ＰＬ／Ｉ、アセンブラ、ＲＥＸＸなどの、オペレーティング・システムに適合する任意のプログラミング言語で作成することができる。
【００４５】
次に、図６〜図１０のフローチャートを参照して、最適化モジュール３０４の各ルーチンの処理について説明する。
【００４６】
図６は、Packed Decimal型の命令の符号を正しく設定する命令を最適化するための、処理ルーチン５０２の処理のフローチャートを示す図である。図６において、ステップ６０２からステップ６０６までは、最適化対象領域内の全ての、符号を正しく設定するZAPについての処理である。
【００４７】
当該ループ内のステップ６０４で、処理ルーチン５０２は、ZAPについて「１つの符号設定命令についての除去処理」を実行するために、後述する図７のフローチャートで示す検出ルーチン５０６を呼び出す。
【００４８】
こうして、すべてのZAPを調べたら、ステップ６０６を抜けて処理を終了する。図６には示さないが、処理ルーチン５０２は、変換結果の最適化されたコードを、出力ルーチン５１４により出力する。
【００４９】
図７は、１つの符号設定命令についての除去処理を実行するために、ステップ６０４で呼び出される検出ルーチン５０６の処理のフローチャートを示す図である。
【００５０】
図７において、ステップ７０２で検出ルーチン５０６は、ZAPの入力・出力サイズが同一かどうか判断し、もしそうでなければ、なにもしないで処理を終る。
【００５１】
ステップ７０２で検出ルーチン５０６が、ZAPの入力・出力サイズが同一であると判断すると、ステップ７０２で、ZAPの入力に対する各定義Iについて符号設定の必要性をチェックするために、AnalyzeDEF(I)、すなわち、解析ルーチン５０８を呼び出す。解析ルーチン５０８の処理の詳細については、図８のフローチャートを参照して、後で説明する。
【００５２】
解析ルーチン５０８は、必要か不必要かの解析結果を返すので、その結果を以って検出ルーチン５０６は、ステップ７０６で、全ての定義について不必要かどうかの判断を行う。
【００５３】
そして、ステップ７０６で、全ての定義について不必要と判断すると、解析ルーチン５０８は、ステップ７０８で、ZAPの除去処理を行う、除去ルーチン５１０を呼び出し、処理を終了する。除去ルーチン５１０の詳細については、図９のフローチャートを参照して、後で説明する。
【００５４】
一方、ステップ７０６で、全ての定義について不必要とは限らない判断すると、解析ルーチン５０８は、ステップ７１０で、ZAPの軽減処理を行う、軽減ルーチン５１２を呼び出し、処理を終了する。軽減ルーチン５１２の詳細については、図１０のフローチャートを参照して、後で説明する。
【００５５】
図８は、解析ルーチン５０８、すなわちAnalyzeDEF(I)のフローチャートを示す図である。ここでIというのは、例えば、下記のような式のことで、ここではI1として示している。
001 COMPUTE INPUT = INPUT + 1   --- (I1)
002 ... = ZAP(INPUT)
【００５６】
もう少し複雑な例だと、下のZAPの入力INPUTに対する定義はI1とI2となる。
001 IF ...  THEN
002  COMPUTE INPUT = INPUT + 1  --- (I1)
003 ELSE 
004  COMPUTE INPUT = INPUT * 2  --- (I2)
005 END-IF.
006 ... = ZAP(INPUT)
【００５７】
解析ルーチン５０８は、ステップ８０２で、Iの符号はすでに正しいかどうか判断し、もしそうならステップ８０４で、不必要の判断を返す。
【００５８】
解析ルーチン５０８は、Iの符号がすでに正しいとは判断できない場合に、ステップ８０６で、Iは足し算命令かどうか判断する。もしそうなら、解析ルーチン５０８は、ステップ８０８で、Iを計算するためのどちらかのオペランドが0以上かどうか判断し、もしそうならステップ８１０で、不必要の判断を返し、そうでなければステップ８１２で、必要の判断を返す。
【００５９】
解析ルーチン５０８は、ステップ８０６で、Iが足し算命令でないと判断すると、ステップ８１４で、Iが引き算命令かどうか判断する。もしそうなら、解析ルーチン５０８は、ステップ８１６で、Iを計算するための第１オペランドが0以上、第２オペランドが0以下のどちらかの条件を満たすか判断し、もしそうならステップ８１８で、不必要の判断を返し、そうでなければステップ８２０で、必要の判断を返す。
【００６０】
解析ルーチン５０８は、ステップ８１４で、Iが引き算命令でないと判断すると、ステップ８２２で、Iの入力について符号設定不必要と判断された場合、出力についても不必要と判断できるかどうか判断する。これは、Iを計算するための式から判定できる。そしてもしそうでなければ、ステップ８２０で、必要の判断を返す。
【００６１】
解析ルーチン５０８は、ステップ８２２で、Iの入力について符号設定不必要と判断された場合、出力についても不必要と判断できると判断すると、ステップ８２４で、Iの入力に対する各定義Jについて符号設定の必要性のチェックを、AnalyzeDEF(J)を再帰的に呼び出すことによって行う。
【００６２】
そして、解析ルーチン５０８は、ステップ８２６で、全ての定義Jについて不必要と判断するとステップ８３０で不必要の判断を返し、そうでないなら、ステップ８２８で必要の判断を返す。
【００６３】
図９は、除去ルーチン５１０の処理のフローチャートを示す図である。図９において、ステップ９０２では、除去ルーチン５１０は、ZAPの入力・出力アドレスは完全に一致かどうか判断し、もしそうなら、ステップ９０４でZAPを除去して処理を終る。
【００６４】
ステップ９０２で、除去ルーチン５１０が、ZAPの入力・出力アドレスは完全に一致ではないと判断すると、除去ルーチン５１０はステップ９０６で、ZAPの入力・出力アドレスはオーバーラップする可能性があるかどうか判断する。そして、もしそうなら、単に処理を終了する。ここで、２つのメモリアクセスがあったとき、この２つがオーバーラップしているかどうかの判定技法は、従来技術で既知である。すなわち、メモリアクセスをベースアドレス、インデックス、オフセット、長さ、の組で表現したとすると、ベースアドレスとインデックスが入力・出力で同じであれば、オフセットと長さから判断することが出来る。ベースアドレスとインデックスが異なる場合は、多くの場合解析できないため、オーバーラップしていると仮定する必要があるが、エイリアス解析などで多少はオーバーラップしていないと判断できる場合もある。
【００６５】
ステップ９０６で、除去ルーチン５１０が、ZAPの入力・出力アドレスはオーバーラップする可能性がないと判定すると、ステップ９０８で、除去ルーチン５１０は、入力を出力にコピーする命令をZAPの代わりに生成して、処理を終る。
【００６６】
図１０は、軽減ルーチン５１２の処理のフローチャートを示す図である。図９において、ステップ１００２では、軽減ルーチン５１２は、ZAPの入力・出力アドレスは完全に同一かどうか判断し、もしそうなら、ステップ１００４で、ZAPの入力が-0かどうかをチェックする命令を生成し、-0のときだけZAPを実行する命令を生成して処理を終る。なお、ここで、ZAPの入力が-0かどうかのチェックは、桁数に応じたマスク値を作り、符号部を9とANDをとる命令によって実現される。この処理の詳細は、後でPacked Decimalに関する補足説明中で述べる。
【００６７】
ステップ１００２で、軽減ルーチン５１２が、ZAPの入力・出力アドレスは完全に同一ではないと判断すると、軽減ルーチン５１２はステップ１００６で、ZAPの入力・出力アドレスはオーバーラップする可能性があるかどうか判断する。そして、もしそうなら、処理を終了する。ここで、２つのメモリアクセスがあったとき、この２つがオーバーラップしているかどうかの判定技法は、ステップ９０６と同様でよい。
【００６８】
ステップ１００６で、軽減ルーチン５１２が、ZAPの入力・出力アドレスはオーバーラップする可能性がないと判定すると、ステップ１００８で、軽減ルーチン５１２は、ZAPの入力が-0かどうかをチェックする命令を生成し、-0でない場合は入力を出力にコピーし、-0のときはZAPを実行する命令を生成して処理を終る。
【００６９】
Packed Decimalについて、説明を以下のとおり補足する。まず、Packed Decimalの符号部は値によって次のように定められている。
正の符号：  12（望ましい）, 10, 14, 15
負の符号：  13（望ましい）, 11
【００７０】
負の符号はビット表現で、1101と1011である。符号部がこの値ではないことを高速に見つけるために、ZAP命令に対して、次のような擬似コードで示されるコードを生成する。
tmpReg = 10進値のサイズに応じてF9, FFF9, FFFFF9, FFFFFFF9  （それぞれ、1，2，3バイト,4バイト以上、の場合）
tmpReg &= *(10進値の右端のアドレス - 3)
if (tmpReg == 9 &&
((10進値の右端のバイト値 & 6) != 2 and ((10進値の右端のバイト値 & 6) != 4) {  // System zではTM命令を利用
<ZAPを行う>
}
【００７１】
System zの命令を使った場合、上の擬似コードに対応して、次のようなマシンコードが生成される。
IILF    GPR0,0xFFFFF9
N       GPR0,320(GPR2)  // 変数とAND
CHI     GPR0,9          // 結果は９か？
BRC     BNERC(0x6), Label SKIP  // ９でなければスキップ
TM      323(GPR2), 0x06  //  ビット表現で10か01の場合、CCは１がセットされる。
BRC     (0xb), Label SKIP  // ビット表現で10か01ではない場合、スキップ
ZAP     321(3,GPR2), 321(3,GPR2)
Label SKIP:
【００７２】
この擬似コードで記述された技法の有利なところは、 tmpReg == 9 のチェックで -0ではない数字の大部分を除外できる点である。
【００７３】
これ以外の方法として、符号バイトとのマスクをF9ではなくFFとANDをとり13でも11でもないかを比較する方法も考えられる。ただし、-0ではない数字は最低でも２回比較が必要となる。
【００７４】
上の例は３２ビット命令を使ったが、６４ビット命令を使うことも考えられる。また、パフォーマンスには大きく影響は無いと思われるが、変形後のZAP命令をさらに変換する方法も考えられる。具体的にはOR命令を使って符号部を15をセットするようにビット演算で符号だけを変更する方法が考えられる。ただし、これは３２ビット命令を使った場合、４バイト以内のPacked Decimalに限られる（64ビット命令なら８バイト以内）。
【００７５】
以上、本発明を、ＩＢＭ(登録商標) System z(登録商標)アーキテクチャ上のｚ／ＯＳでＣＯＢＯＬのコードを実行させる場合について説明したが、これには限定されず、パーソナル・コンピュータなど、任意のアーキテクチャのコンピュータ上で実施可能である。
【００７６】
また、ＣＯＢＯＬに限らず、Packed Decimal型の符号を正しく設定する符号設定命令を使用する任意のプログラミング言語に使用可能である。
【符号の説明】
【００７７】
１０４・・・ＣＰＵ
１０６・・・主記憶
１０８・・・ハードディスク・ドライブ
２０２・・・ＣＯＢＯＬソースコード
２０４・・・コンパイラ
３０２・・・ＣＯＢＯＬバイナリ実行可能ファイル
３０４・・・最適化モジュール
３０６・・・最適化されたＣＯＢＯＬバイナリ実行可能ファイル
５０２・・・処理ルーチン
５０６・・・検出ルーチン
５０８・・・解析ルーチン
５１０・・・除去ルーチン
５１２・・・軽減ルーチン
【図１】
2013242700.tif 000003
【図２】
2013242700.tif 000004
【図３】
2013242700.tif 000005
【図４】
2013242700.tif 000006
【図５】
2013242700.tif 000007
【図６】
2013242700.tif 000008
【図７】
2013242700.tif 000009
【図８】
2013242700.tif 000010
【図９】
2013242700.tif 000011
【図１０】
2013242700.tif 000012