https://gcc.gnu.org/bugzilla/show_bug.cgi?id=82004
--- Comment #29 from Jakub Jelinek <jakub at gcc dot gnu.org> --- Tried to enlarge the testcase, so it better matches what sw_absorption.F90 does, but still it works with -Ofast, just not with -Ofast -fno-tree-pre: ! 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 /) real (r8), parameter, dimension(b) :: a3 = (/ & 0.4421_r8, 0.4451_r8, 0.4488_r8, 0.4563_r8, & 0.4622_r8, 0.4715_r8, 0.4877_r8, 0.4993_r8, & 0.5084_r8, 0.5159_r8, 0.5223_r8, 0.5278_r8, & 0.5326_r8, 0.5369_r8, 0.5408_r8, 0.5474_r8, & 0.5529_r8, 0.5576_r8, 0.5615_r8, 0.5649_r8, & 0.5757_r8, 0.5802_r8, 0.5808_r8, 0.5788_r8, & 0.56965_r8, 0.55638_r8, 0.54091_r8, 0.52442_r8, & 0.50766_r8,0.49110_r8,0.47505_r8 /) real (r8), parameter, dimension(b) :: a4 = (/ & 0.2981_r8, 0.2963_r8, 0.2940_r8, 0.2894_r8, & 0.2858_r8, 0.2800_r8, 0.2703_r8, 0.2628_r8, & 0.2571_r8, 0.2523_r8, 0.2481_r8, 0.2444_r8, & 0.2411_r8, 0.2382_r8, 0.2356_r8, 0.2309_r8, & 0.2269_r8, 0.2235_r8, 0.2206_r8, 0.2181_r8, & 0.2106_r8, 0.2089_r8, 0.2113_r8, 0.2167_r8, & 0.23357_r8, 0.25504_r8, 0.27829_r8, 0.30274_r8, & 0.32698_r8, 0.35056_r8, 0.37303_r8 /) real (r8), parameter, dimension(b) :: b3 = (/ & 0.0287_r8, 0.0301_r8, 0.0319_r8, 0.0355_r8, & 0.0384_r8, 0.0434_r8, 0.0532_r8, 0.0612_r8, & 0.0681_r8, 0.0743_r8, 0.0800_r8, 0.0853_r8, & 0.0902_r8, 0.0949_r8, 0.0993_r8, 0.1077_r8, & 0.1154_r8, 0.1227_r8, 0.1294_r8, 0.1359_r8, & 0.1640_r8, 0.1876_r8, 0.2082_r8, 0.2264_r8, & 0.25808_r8, 0.28498_r8, 0.30844_r8, 0.32932_r8, & 0.34817_r8, 0.36540_r8, 0.38132_r8 /) real (r8), parameter, dimension(b) :: b4 = (/ & 0.3192_r8, 0.3243_r8, 0.3306_r8, 0.3433_r8, & 0.3537_r8, 0.3705_r8, 0.4031_r8, 0.4262_r8, & 0.4456_r8, 0.4621_r8, 0.4763_r8, 0.4889_r8, & 0.4999_r8, 0.5100_r8, 0.5191_r8, 0.5347_r8, & 0.5477_r8, 0.5588_r8, 0.5682_r8, 0.5764_r8, & 0.6042_r8, 0.6206_r8, 0.6324_r8, 0.6425_r8, & 0.66172_r8, 0.68144_r8, 0.70086_r8, 0.72144_r8, & 0.74178_r8, 0.76190_r8, 0.78155_r8 /) real (r8) :: d, e, f, g, h, w1, w2, a1, a2, b1, b2 integer (i4) :: n, m, o integer, volatile :: p d = c(1) e = c(b) o = 0 p = 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 goto 10 end if end do if (p == 0) then print *, 'Failed', n, h stop 1 end if 10 continue w2 = (h - c(o)) / (c(o + 1) - c(o)) w1 = 1.0_r8 - w2 a1 = a3(o) * w1 + a3(o + 1) * w2 a2 = a4(o) * w1 + a4(o + 1) * w2 b1 = b3(o) * w1 + b3(o + 1) * w2 b2 = b4(o) * w1 + b4(o + 1) * w2 if (p == 0) then print *, n, h, a1, a2, b1, b2 endif end do end