]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
math: Add optimization barrier to ensure a1 + u.d is not reused [BZ #30664]
authorJohn David Anglin <danglin@gcc.gnu.org>
Tue, 25 Feb 2025 20:57:53 +0000 (15:57 -0500)
committerJohn David Anglin <danglin@gcc.gnu.org>
Tue, 25 Feb 2025 21:00:49 +0000 (16:00 -0500)
A number of fma tests started to fail on hppa when gcc was changed to
use Ranger rather than EVRP.  Eventually I found that the value of
a1 + u.d in this is block of code was being computed in FE_TOWARDZERO
mode and not the original rounding mode:

    if (TININESS_AFTER_ROUNDING)
      {
        w.d = a1 + u.d;
        if (w.ieee.exponent == 109)
          return w.d * 0x1p-108;
      }

This caused the exponent value to be wrong and the wrong return path
to be used.

Here we add an optimization barrier after the rounding mode is reset
to ensure that the previous value of a1 + u.d is not reused.

Signed-off-by: John David Anglin <dave.anglin@bell.net>
sysdeps/ieee754/dbl-64/s_fma.c

index c5f5abdc68cdf944503edecd285087e31f63a9c3..79a3cd721d0f9bfdbcbb93602cd6a7ea6bf4cf7b 100644 (file)
@@ -244,6 +244,9 @@ __fma (double x, double y, double z)
   /* Reset rounding mode and test for inexact simultaneously.  */
   int j = libc_feupdateenv_test (&env, FE_INEXACT) != 0;
 
+  /* Ensure value of a1 + u.d is not reused.  */
+  a1 = math_opt_barrier (a1);
+
   if (__glibc_likely (adjust == 0))
     {
       if ((u.ieee.mantissa1 & 1) == 0 && u.ieee.exponent != 0x7ff)