https://gcc.gnu.org/bugzilla/show_bug.cgi?id=82004

--- Comment #27 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
So, I've tried to create a small reproducer that actually shows what
sw_absorption.F90 is doing (from the above URL, so not actually from the SPEC
provided sources) and can't reproduce a problem:

! PR middle-end/82004
! { dg-do run }
! { dg-options "-Ofast" }

  integer, parameter :: r8 = selected_real_kind(13), i4 = kind(1)
  integer (i4), parameter :: a = 400, b = 31
  real (r8), parameter, dimension(b) :: c = (/ .001_r8, .005_r8, &
    .01_r8, .02_r8, .03_r8, .05_r8, .10_r8, .15_r8, .20_r8,      &
    .25_r8, .30_r8, .35_r8, .40_r8, .45_r8, .50_r8, .60_r8,      &
    .70_r8, .80_r8, .90_r8, 1.00_r8, 1.50_r8, 2.00_r8, 2.50_r8,  &
    3.00_r8, 4.00_r8, 5.00_r8, 6.00_r8, 7.00_r8, 8.00_r8,        &
    9.00_r8,10.00_r8 /)
  integer (i4), parameter, dimension(b) :: p = (/ 70, 31, 30,    &
    17, 22, 31, 17, 13, 9, 8, 7, 6, 5, 4, 8, 7, 6, 5, 5, 17, 13, &
    9, 8, 13, 9, 8, 7, 6, 5, 5, 0 /)
  real (r8) :: d, e, f, g, h
  integer (i4) :: n, m
  integer (i4), dimension(b) :: o

  d = c(1)
  e = c(b)
  o = 0
  f = (log10(e)-log10(d))/real(a)
  g = log10(d) - f
  do n = 0, a
    g = g + f
    h = 10**(g)
    do m = 1, b - 1
      if (c(m) .le. h .and. h .le. c(m + 1)) then
        o(m) = o(m) + 1
      end if
    end do
  end do
  if (any (o .ne. p)) stop 1
end

Maybe we peel off the first iteration (which is all we care about here, all
other values are not within ulps of the bounds) on this smaller testcase and
not on 628.pop2_s?

Reply via email to