https://gcc.gnu.org/bugzilla/show_bug.cgi?id=101757
Bug ID: 101757
Summary: Simple integer assigment fails (off-seted by -1) when
compiling with -O3
Product: gcc
Version: 7.1.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: fortran
Assignee: unassigned at gcc dot gnu.org
Reporter: federico.perini at gmail dot com
Target Milestone: ---
Created attachment 51251
--> https://gcc.gnu.org/bugzilla/attachment.cgi?id=51251&action=edit
test program
An extremely simple logical-flag-based assignment, which sets an integer to 1
if the logical is .true., and to 0 if .false., fails with gfortran 7.1.0 if
compiled with -O3. Using `WHERE`, `MERGE`, or a simple loop does not change the
result.
Test program:
program test_merge_
use iso_fortran_env
implicit none
integer, parameter :: N=10000
logical :: test(N)
integer :: i,itest(N)
do i=1,N
test(i) = mod(i,2)==0
end do
itest = merge(1,0,test)
print *, 'MERGE itest min (0) =',minval(itest),' max (1)=',maxval(itest)
where (test)
itest = 1
elsewhere
itest = 0
end where
print *, 'WHERE itest min (0) =',minval(itest),' max (1)=',maxval(itest)
do i=1,N
if (test(i)) then
itest(i) = 1
else
itest(i) = 0
endif
end do
print *, 'IFLOOP itest min (0) =',minval(itest),' max (1)=',maxval(itest)
end program test_merge_
Expected result is OK if "-O2", wrong if "-O3":
werc 1073% gfortran -O3 test_merge.f90
werc 1074% ./a.out
MERGE itest min (0) = -1 max (1)= 0
WHERE itest min (0) = -1 max (1)= 0
IFLOOP itest min (0) = -1 max (1)= 0
werc 1075% gfortran -O2 test_merge.f90
werc 1076% ./a.out
MERGE itest min (0) = 0 max (1)= 1
WHERE itest min (0) = 0 max (1)= 1
IFLOOP itest min (0) = 0 max (1)= 1
Tested OK on gfortran 9.2.0, 10.2.0, 10.3.0.
Thanks,
Federico