This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug tree-optimization/65957] New: Loop with if-statement yields different results for -O3 vs -O3 -fno-tree-vectorize
- From: "sbrozell at rci dot rutgers.edu" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: Fri, 01 May 2015 06:19:53 +0000
- Subject: [Bug tree-optimization/65957] New: Loop with if-statement yields different results for -O3 vs -O3 -fno-tree-vectorize
- Auto-submitted: auto-generated
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
===