https://gcc.gnu.org/bugzilla/show_bug.cgi?id=65957
Bug ID: 65957 Summary: Loop with if-statement yields different results for -O3 vs -O3 -fno-tree-vectorize Product: gcc Version: 5.1.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: tree-optimization Assignee: unassigned at gcc dot gnu.org Reporter: sbrozell at rci dot rutgers.edu Target Milestone: --- For gnu 5.1.0 this code fragment yields incorrect results with -O3 but correct results with -O3 -fno-tree-vectorize : do i = 1, nphih write (*,*) "before", gbl_dihed(i)%atm_i, gbl_dihed(i)%atm_j, gbl_dihed(i)%atm_k, gbl_dihed(i)%atm_l end do do i = 1, nphih gbl_dihed(i)%atm_i = gbl_dihed(i)%atm_i / 3 + 1 gbl_dihed(i)%atm_j = gbl_dihed(i)%atm_j / 3 + 1 if (gbl_dihed(i)%atm_k .gt. 0) then gbl_dihed(i)%atm_k = gbl_dihed(i)%atm_k / 3 + 1 else gbl_dihed(i)%atm_k = gbl_dihed(i)%atm_k / 3 - 1 end if if (gbl_dihed(i)%atm_l .gt. 0) then gbl_dihed(i)%atm_l = gbl_dihed(i)%atm_l / 3 + 1 else gbl_dihed(i)%atm_l = gbl_dihed(i)%atm_l / 3 - 1 end if end do do i = 1, nphih write (*,*) "after", gbl_dihed(i)%atm_i, gbl_dihed(i)%atm_j, gbl_dihed(i)%atm_k, gbl_dihed(i)%atm_l end do where all the components are integers and where correct is defined by our regression tests. nphih is 20: ===correct output before 0 3 12 15 before 0 3 12 42 before 3 12 15 18 before 6 3 12 15 before 6 3 12 42 before 9 3 12 15 before 9 3 12 42 before 12 21 15 -18 before 12 15 21 24 before 15 27 21 -24 before 18 15 21 24 before 18 15 21 27 before 18 15 12 42 before 21 27 30 33 before 21 27 30 36 before 24 21 27 30 before 24 21 27 39 before 27 33 30 -36 before 33 30 27 39 before 36 30 27 39 after 1 2 5 6 after 1 2 5 15 after 2 5 6 7 after 3 2 5 6 after 3 2 5 15 after 4 2 5 6 after 4 2 5 15 after 5 8 6 -7 after 5 6 8 9 after 6 10 8 -9 after 7 6 8 9 after 7 6 8 10 after 7 6 5 15 after 8 10 11 12 after 8 10 11 13 after 9 8 10 11 after 9 8 10 14 after 10 12 11 -13 after 12 11 10 14 after 13 11 10 14 === ===incorrect before 0 3 12 15 before 0 3 12 42 before 3 12 15 18 before 6 3 12 15 before 6 3 12 42 before 9 3 12 15 before 9 3 12 42 before 12 21 15 -18 before 12 15 21 24 before 15 27 21 -24 before 18 15 21 24 before 18 15 21 27 before 18 15 12 42 before 21 27 30 33 before 21 27 30 36 before 24 21 27 30 before 24 21 27 39 before 27 33 30 -36 before 33 30 27 39 before 36 30 27 39 after 1 2 5 6 after 1 2 5 15 after 2 5 6 7 after 3 2 5 6 after 3 2 5 15 after 4 2 5 6 after 4 2 5 15 after 5 8 6 -1 after 5 6 8 9 after 6 10 8 -1 after 7 6 8 9 after 7 6 8 10 after 7 6 5 15 after 8 10 11 12 after 8 10 11 13 after 9 8 10 11 after 9 8 10 14 after 10 12 11 -1 after 12 11 10 14 after 13 11 10 14 === type(dihed_rec), allocatable, save :: gbl_dihed(:) type dihed_rec integer :: atm_i integer :: atm_j integer :: atm_k integer :: atm_l integer :: parm_idx end type dihed_rec gcc -v Using built-in specs. COLLECT_GCC=gcc COLLECT_LTO_WRAPPER=/nfs/gpfs/gcc-5.1.0/libexec/gcc/x86_64-unknown-linux-gnu/5.1.0/lto-wrapper Target: x86_64-unknown-linux-gnu Configured with: ../gcc-5.1.0srcdir/configure --prefix=/nfs/gpfs/gcc-5.1.0 Thread model: posix gcc version 5.1.0 (GCC) I tried to create an example program, below, but it does not demonstrate the bug, sorry i probably dumbed it down too much. Since this bug smells like https://gcc.gnu.org/bugzilla/show_bug.cgi?id=64530 , I am hoping that the investigator will have enough clues to find the problem or to write a program to exercise the bug (which i wouldn't mind seeing). Thank you, scott === ! Failed example of bug with gfortran 5.1.0 -O3. ! compile with gfortran -O3 -fno-tree-vectorize bug.F90 ! compile with gfortran -O3 bug.F90 ! and compare, < is correct, > is incorrect in diff of outputs: !28c28 !< after 5 8 6 -7 !--- !> after 5 8 6 -1 !30c30 !< after 6 10 8 -9 !--- !> after 6 10 8 -1 !38c38 !< after 10 12 11 -13 !--- !> after 10 12 11 -1 program bug implicit none integer :: i integer, parameter :: size = 20 integer :: ai(size), aj(size), ak(size), al(size) ai(:) = (/0,0,3,6,6,9,9,12,12,15,18,18,18,21,21,24,24,27,33,36 /) aj(:) = (/3,3,12,3,3,3,3,21,15,27,15,15,15,27,27,21,21,33,30,30/) ak(:) = (/12,12,15,12,12,12,12,15,21,21,21,21,12,30,30,27,27,30,27,27/) al(:) = (/15,42,18,15,42,15,42,-18,24,-24,24,27,42,33,36,30,39,-36,39,39/) do i = 1, size write (*,*) "before", ai(i), aj(i), ak(i), al(i) end do do i = 1, size ai(i) = ai(i) / 3 + 1 aj(i) = aj(i) / 3 + 1 if (ak(i) .gt. 0) then ak(i) = ak(i) / 3 + 1 else ak(i) = ak(i) / 3 - 1 end if if (al(i) .gt. 0) then al(i) = al(i) / 3 + 1 else al(i) = al(i) / 3 - 1 end if end do do i = 1, size write (*,*) "after", ai(i), aj(i), ak(i), al(i) end do end ===