[Bug tree-optimization/48295] New: Incorrect code generated with dynamic floating point rounding mode switches

2011-03-26 Thread frederic.riss at gmail dot com
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=48295

   Summary: Incorrect code generated with dynamic floating point
rounding mode switches
   Product: gcc
   Version: 4.7.0
Status: UNCONFIRMED
  Severity: normal
  Priority: P3
 Component: tree-optimization
AssignedTo: unassig...@gcc.gnu.org
ReportedBy: frederic.r...@gmail.com


The attached code is compiled incorrectly with every GCC version I could try.

The code tries to do a floating point multiplication with a non-default
rounding mode and then switches the rounding mode back to normal before
checking the result.

The result is wrong even if -frounding-math is specified on the command line. I
tracked it down to tree-ssa-ter used during RTL expansion. The multiplication
is detected to be a replaceable statement and is thus emitted after the
floating point rounding mode has been reset back to normal.

That simple hack fixes it :

--- a/gcc/tree-ssa-ter.c
+++ b/gcc/tree-ssa-ter.c
@@ -429,8 +429,10 @@ is_replaceable_p (gimple stmt, bool ter)
   && !is_gimple_val (gimple_assign_rhs1 (stmt)))
 return false;

-  /* Float expressions must go through memory if float-store is on.  */
-  if (flag_float_store
+  /* Float expressions must go through memory if float-store is on.
+ Also, don't move float operations around if we're not sure the
+ rounding mode never changes.  */
+  if ((flag_float_store || flag_rounding_math)
   && FLOAT_TYPE_P (gimple_expr_type (stmt)))
 return false;


However it's clearly not the optimal solution, as we might be able to detect
that the rounding didn't change. AFAIU, tree-ssa-ter doesn't allow to
replacements spanning calls, so it might be better to extend that logic to
consider asm and builtins as replacement barriers when in flag_rounding_math
mode. What do you think?


[Bug tree-optimization/48295] Incorrect code generated with dynamic floating point rounding mode switches

2011-03-26 Thread frederic.riss at gmail dot com
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=48295

--- Comment #1 from Frederic Riss  2011-03-26 
16:15:22 UTC ---
Created attachment 23779
  --> http://gcc.gnu.org/bugzilla/attachment.cgi?id=23779
Failing code


[Bug tree-optimization/48295] Incorrect code generated with dynamic floating point rounding mode switches

2011-03-28 Thread frederic.riss at gmail dot com
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=48295

--- Comment #3 from Frederic Riss  2011-03-28 
09:58:50 UTC ---
In bug #34678 I thought you were agreeing with Joseph that -frounding-math had
a more general meaning than the one you are expressing here, but I get your
point that a more general solution should be implemented.

Regarding the validity of the testcase, I took glibc's implementation of
fesetround that I inlined. I did that because I saw that /usr/include/fenv.h
has provisions for including inline versions of the fenv routines, although
it's not the case yet for x86. So I guess it's possible that someday you get
exactly that situation even though people are using the standard routines to
switch rounding mode. In fact my private port does exactly this.

Can you think of other places than CSE that would exhibit these issues?
Unfortunately, I have to put some band-aids into place for our numerical
analysts to be able to do their jobs.