Hi Steve,

On 4/14/23 21:33, Steve Kargl via Gcc-patches wrote:
On Fri, Apr 14, 2023 at 08:59:24PM +0200, Harald Anlauf via Fortran wrote:

the compile-time simplification of intrinsic SET_EXPONENT was
broken since the early days of gfortran for argument X < 1
(including negative X) and for I < 0.  I identified and fixed
several issues in the implementation.  The testcase explores
argument space comparing compile-time and runtime results and
is checked against Intel.

Regtested on x86_64-pc-linux-gnu.  OK for mainline?


Yes, it is certainly better than the current situation.

This is not a regression, but can lead to wrong code.
Would it be OK to backport to open branches?

Sure.  Looks simply and fairly specific.

OK, thanks, will proceed.


I was wondering about the difference between set_exponent()
and scale(), and found that set_exponent() talks about IEEE
values while scale() doesn't.  I'm wondering if we should
add the IEEE special cases to the testsuite.  Of particular
note, I doubt that this is true:

    If X is an IEEE NaN, the result is the same NaN.

program foo
    real x, y
    x = 1
    y = x - x
    x = (x - x) / y
    print '(F4.0,1X,Z8.8)', x, x
    y = set_exponent(x,1)
    print '(F4.0,1X,Z8.8)', y, y
end program foo

  gfcx -o z a.f90 && ./z
  NaN FFC00000
  NaN 7FC00000

Those are not the same NaN.  The second is a qNaN.
The first looks like a qNaN with the sign bit set.

Until now there was no testing at all of SET_EXPONENT in the testsuite.
It would be really good to have better coverage of compile-time and
runtime behavior of the intrinsics and checking consistency ... ;-)

I think you have much more experience in that area.  (Hint!)

Cheers,
Harald


Reply via email to