gfortran 4.9.0 bug?WHERE语句优化了

use*_*069 3 fortran gfortran

我有一段代码在调试版本和优化版本之间的gfortran下产生不同的结果.

PROGRAM test

IMPLICIT NONE

REAL, DIMENSION(10) :: a = 0.0
REAL, DIMENSION(10) :: b = 1.0

WRITE (*,*) b
WHERE (a .ne. 0.0) b = a
WRITE (*,*) b

END PROGRAM
Run Code Online (Sandbox Code Playgroud)

当我将其编译为调试版本时,它会生成正确的结果.当我将它编译为优化构建时,它用a替换b的每个元素.

$ gfortran test.f
$ ./a.out
1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0
1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0
$ gfortran -O3 test.f
$ ./a.out
1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0     
0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 
Run Code Online (Sandbox Code Playgroud)

如果这是一个编译器错误,我该如何解决它?

Hig*_*ark 5

您的代码没有任何问题,英特尔Fortran编译器会生成带有和不带-O3标志的相同,正确的输出.虽然,作为@eriktous指出,有比较浮点数时须遵守的美味佳肴,都01恰恰表示的平等和比较(当然它实现IEEE浮点运算的任何机器上),比如你的代码的展品应该是精细.

如果这是一个编译器错误,我怀疑它可能是,通常的解决方法是使用另一个编译器(版本).


jan*_*neb 5

我无法重现你的问题.我正在使用

gcc版本4.9.0 20140313(实验性)(GCC)

在x86_64-unknown-linux-gnu(Ubuntu 12.04 amd64)上.对我来说,您的示例程序会导致:

$ gfortran where.f $ ./a.out 1.00000000 1.00000000 1.00000000 1.00000000 1.00000000 1.00000000 1.00000000 1.00000000 1.00000000 1.00000000
1.00000000 1.00000000 1.00000000 1.00000000 1.00000000 1.00000000 1.00000000 1.00000000 1.00000000 1.00000000
$ gfortran -O3 where.f $ ./a.out 1.00000000 1.00000000 1.00000000 1.00000000 1.00000000 1.00000000 1.00000000 1.00000000 1.00000000 1.00000000
1.00000000 1.00000000 1.00000000 1.00000000 1.00000000 1.00000000 1.00000000 1.00000000 1.00000000 1.00000000

那么,您使用的是哪个版本的gfortran?请记住,4.9尚未发布,因此您的预发布版本的日期可能很重要.此外,您使用的是哪个目标(即操作系统和位数)?如果您自己构建了GCC,那么您是否运行GCC测试套件来检查您的gfortran构建是否正常工作并且没有绝对破坏?