FORTRAN, C, C++の障害(実行結果の異常)について
翻訳時オプション-O2以上、-Kmfunc=2等特定の条件時実行結果異常となります。
障害番号 | PH05687 |
システム | FX10, CX400 |
言語 | FORTRAN, C, C++ |
修正予定 | FX10 : 未定 CX400 : 未定 |
現象と条件
以下の条件をすべて満たした場合、実行結果に誤りが生じることがあります。
- 以下の翻訳時オプションが全て有効である。または、条件1-2と同等の最適化指示子mfunc(2)またはmfunc(3)が有効である。
- 1-1. "-O2"以上
- 1-2. "-Kmfunc=2"、または"-Kmfunc=3"
- 1-3. "-Klib" (C/C++の場合)
- ループが存在する。
- 条件2のループの増分値は正の1であることが翻訳時に判断可能である。
- 条件2のループ内に、コンパイラの最適化により、マルチ演算関数に変換される以下の組込み関数またはべき乗演算が存在する。(*)
- asin, acos, atan, atan2, erf, erfc, exp, exp10, log, log10, sin, cos
- 条件4の組込み関数の引数に配列が存在する。
- 条件4の組込み関数の結果を配列に代入している。
- 条件5または条件6の配列は連続した降順アクセスである。
*)翻訳時メッセージjwd8300o-iにより、マルチ演算関数化が適用されたことを確認できます。
<プログラム例>
do i = 1, n-1 ! 2),3)
result(i) = log(a(n-i)) ! 4),5),6),7)
enddo
原因
組込み関数をマルチ演算関数に変換する最適化に誤りがありました。
回避方法
以下のいずれかの方法で回避できます。
a) 翻訳時オプション-Knomfuncまたは-Kmfunc=1を指定する。
b) 翻訳時オプション-Koclを指定し、かつソースプログラムの対象ループに最適化指示子nomfuncまたはmfunc(1)を追記する。