Patchwork Call math_opt_barrier inside if

login
register
mail settings
Submitter H.J. Lu
Date Jan. 14, 2016, 9:41 p.m.
Message ID <20160114214145.GA22984@intel.com>
Download mbox | patch
Permalink /patch/10386/
State New
Headers show

Comments

H.J. Lu - Jan. 14, 2016, 9:41 p.m.
Since floating-point operation may trigger floating-point exceptions,
we call math_opt_barrier inside if to prevent code motion.

Tested on x86-64.  OK for trunk?

H.J.
---
	[BZ #19465]
	* sysdeps/ieee754/dbl-64/s_fma.c (__fma): Call math_opt_barrier
	inside if.
---
 sysdeps/ieee754/dbl-64/s_fma.c | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)
Joseph Myers - Jan. 14, 2016, 10:13 p.m.
On Thu, 14 Jan 2016, H.J. Lu wrote:

> Since floating-point operation may trigger floating-point exceptions,
> we call math_opt_barrier inside if to prevent code motion.
> 
> Tested on x86-64.  OK for trunk?

Please send a patch updating all implementations for which this issue is 
applicable.
H.J. Lu - Jan. 14, 2016, 10:27 p.m.
On Thu, Jan 14, 2016 at 2:13 PM, Joseph Myers <joseph@codesourcery.com> wrote:
> On Thu, 14 Jan 2016, H.J. Lu wrote:
>
>> Since floating-point operation may trigger floating-point exceptions,
>> we call math_opt_barrier inside if to prevent code motion.
>>
>> Tested on x86-64.  OK for trunk?
>
> Please send a patch updating all implementations for which this issue is
> applicable.

There are

dbl-64/e_sqrt.c:      libc_feholdexcept_setround (&env, FE_TONEAREST);
dbl-64/s_fma.c:  libc_feholdexcept_setround (&env, FE_TONEAREST);
dbl-64/s_fmaf.c:  libc_feholdexcept_setround (&env, FE_TOWARDZERO);

under sysdeps/ieee754.   dbl-64/s_fma.c is the only one with this
problem.
Joseph Myers - Jan. 14, 2016, 10:38 p.m.
On Thu, 14 Jan 2016, H.J. Lu wrote:

> On Thu, Jan 14, 2016 at 2:13 PM, Joseph Myers <joseph@codesourcery.com> wrote:
> > On Thu, 14 Jan 2016, H.J. Lu wrote:
> >
> >> Since floating-point operation may trigger floating-point exceptions,
> >> we call math_opt_barrier inside if to prevent code motion.
> >>
> >> Tested on x86-64.  OK for trunk?
> >
> > Please send a patch updating all implementations for which this issue is
> > applicable.
> 
> There are
> 
> dbl-64/e_sqrt.c:      libc_feholdexcept_setround (&env, FE_TONEAREST);
> dbl-64/s_fma.c:  libc_feholdexcept_setround (&env, FE_TONEAREST);
> dbl-64/s_fmaf.c:  libc_feholdexcept_setround (&env, FE_TOWARDZERO);
> 
> under sysdeps/ieee754.   dbl-64/s_fma.c is the only one with this
> problem.

I disagree with that analysis.  The question isn't whether there's a call 
to a particular internal interface.  The question is whether there are 
conditionals on arithmetic, such that the arithmetic is exact in the 
conditional case but may be inexact if moved before the conditional.  I 
think at least ldbl-96/s_fmal.c, ldbl-96/s_fma.c and ldbl-128/s_fmal.c 
have the same issue.

Patch

diff --git a/sysdeps/ieee754/dbl-64/s_fma.c b/sysdeps/ieee754/dbl-64/s_fma.c
index bc3677d..a349243 100644
--- a/sysdeps/ieee754/dbl-64/s_fma.c
+++ b/sysdeps/ieee754/dbl-64/s_fma.c
@@ -175,7 +175,10 @@  __fma (double x, double y, double z)
 
   /* Ensure correct sign of exact 0 + 0.  */
   if (__glibc_unlikely ((x == 0 || y == 0) && z == 0))
-    return x * y + z;
+    {
+      x = math_opt_barrier (x);
+      return x * y + z;
+    }
 
   fenv_t env;
   libc_feholdexcept_setround (&env, FE_TONEAREST);