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