P->Z = Q->Z; という代入について見てみましょう。ここで、Z は CHAR(6) BASED です。
OPT(0) を使用した場合、従来のコンパイラーは、代入元をまず 6 バイト の一時変数に代入してから、この一時変数を代入先に代入します。
ただし OPT(2) を使用した場合、従来のコンパイラーは、1 つの MVC を使用 してこの代入を実行します。
代入元と代入先が重複している場合は、これらの異なるインプリメンテーション方法により異 なる結果が得られます。
新しいコンパイラーでは、DEFAULT コンパイラー・オプションの OVERLAP サ ブオプションにより、次のようにこの動作が制御されます。
例えば SUBSTR(A,4,6) = SUBSTR(A,3,6); という代入について 、A = 'abcdefghijklm' である場合は、次のように処理されます。
したがって、最小限の作業で最大限の互換性を得るには、コンパイラー・オプ ション DFT(OVERLAP) を指定するとよいでしょう。
ただしこのオプションを指定した場合、コンパイラーは、代入元と代入先が 重複しないことが分かっている状況では低速なコードを生成するとともに、 他のいくつかの最適化処理を省略します。 代入元と代入先が重複しないようにコードを変更してから DFT(NOOVERLAP) を 使用することをお勧めします。
例えば次の代入は、
SUBSTR(A,4,6) = SUBSTR(A,3,6);
次の代入に置き換えることができます。
temp_Char6 = SUBSTR(A,3,6); SUBSTR(A,4,6) = temp_Char6;