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