This is the mail archive of the
mailing list for the GCC project.
Re: [PATCH][Fortran][v2] Use MIN/MAX_EXPR for min/max intrinsics
On Wed, Jul 18, 2018 at 4:26 PM, Thomas König <email@example.com> wrote:
> Hi Kyrlll,
> > Am 18.07.2018 um 13:17 schrieb Kyrill Tkachov <
> > Thomas, Janne, would this relaxation of NaN handling be acceptable given
> the benefits
> > mentioned above? If so, what would be the recommended adjustment to the
> nan_1.f90 test?
> I would be a bit careful about changing behavior in such a major way. What
> would the results with NaN and infinity then be, with or without
> optimization? Would the results be consistent with min(nan,num) vs
> min(num,nan)? Would they be consistent with the new IEEE standard?
AFAIU, MIN/MAX_EXPR do the right thing when comparing a normal number with
Inf. For NaN the result is undefined, and you might indeed have
min(a, NaN) = a
min(NaN, a) = NaN
where "a" is a normal number.
(I think that happens at least on x86 if MIN_EXPR is expanded to
Apparently what the proper result for min(a, NaN) should be is contentious
enough that minnum was removed from the upcoming IEEE 754 revision, and new
operations AFAICS have the semantics
minimum(a, NaN) = minimum(NaN, a) = NaN
minimumNumber(a, NaN) = minimumNumber(NaN, a) = a
That is minimumNumber corresponds to minnum in IEEE 754-2008 and fmin* in
C, and to the current behavior of gfortran.
> In general, I think that min(nan,num) should be nan and that our current
> behavior is not the best.
There was some extensive discussion of that in the Julia bug report I
linked to in an earlier message, and they came to the same conclusion and
changed their behavior.
> Does anybody have dats points on how this is handled by other compilers?
The only other compiler I have access to at the moment is ifort (and not
the latest version), but maybe somebody has access to a wider variety?
> Oh, and if anything is changed, then compile and runtime behavior should
> always be the same.
Well, IFF we place some weight on the runtime behavior being particularly
sensible wrt NaN's, which it wouldn't be if we just use a plain
MIN/MAX_EXPR. Is it worth taking a performance hit for, though? In
particular, if other compilers are inconsistent, we might as well do
whatever is fastest.