This is the mail archive of the gcc-bugs@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[Bug tree-optimization/65957] New: Loop with if-statement yields different results for -O3 vs -O3 -fno-tree-vectorize


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
===


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]