OSDN Git Service

gcc/
authorrsandifo <rsandifo@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 14 Aug 2006 11:55:52 +0000 (11:55 +0000)
committerrsandifo <rsandifo@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 14 Aug 2006 11:55:52 +0000 (11:55 +0000)
PR rtl-optimization/28634
* reorg.c (fill_slots_from_thread): Do not assume A + X - X == A
for floating-point modes unless flag_unsafe_math_optimizations.

gcc/testsuite/
PR rtl-optimization/28634
* gcc.c-torture/execute/ieee/pr28634.c: New test.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@116124 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/reorg.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.c-torture/execute/ieee/pr28634.c [new file with mode: 0644]

index 37fbac8..8a53ade 100644 (file)
@@ -1,3 +1,9 @@
+2006-08-14  Richard Sandiford  <richard@codesourcery.com>
+
+       PR rtl-optimization/28634
+       * reorg.c (fill_slots_from_thread): Do not assume A + X - X == A
+       for floating-point modes unless flag_unsafe_math_optimizations.
+
 2006-08-13  Alexandre Oliva  <aoliva@redhat.com>
            Andrew Pinski  <pinskia@physics.uc.edu>
 
index 42ecda0..8c097dc 100644 (file)
@@ -2817,6 +2817,8 @@ fill_slots_from_thread (rtx insn, rtx condition, rtx thread,
       dest = SET_DEST (pat), src = SET_SRC (pat);
       if ((GET_CODE (src) == PLUS || GET_CODE (src) == MINUS)
          && rtx_equal_p (XEXP (src, 0), dest)
+         && (!FLOAT_MODE_P (GET_MODE (src))
+             || flag_unsafe_math_optimizations)
          && ! reg_overlap_mentioned_p (dest, XEXP (src, 1))
          && ! side_effects_p (pat))
        {
index de4f9e6..7481db0 100644 (file)
@@ -1,3 +1,8 @@
+2006-08-14  Richard Sandiford  <richard@codesourcery.com>
+
+       PR rtl-optimization/28634
+       * gcc.c-torture/execute/ieee/pr28634.c: New test.
+
 2006-08-13  Alexandre Oliva  <aoliva@redhat.com>
 
        PR c/27184
diff --git a/gcc/testsuite/gcc.c-torture/execute/ieee/pr28634.c b/gcc/testsuite/gcc.c-torture/execute/ieee/pr28634.c
new file mode 100644 (file)
index 0000000..a0c5254
--- /dev/null
@@ -0,0 +1,15 @@
+/* PR rtl-optimization/28634.  On targets with delayed branches,
+   dbr_schedule could do the next iteration's addition in the
+   branch delay slot, then subtract the value again if the branch
+   wasn't taken.  This can lead to rounding errors.  */
+double x = -0x1.0p53;
+double y = 1;
+int
+main (void)
+{
+  while (y > 0)
+    y += x;
+  if (y != x + 1)
+    abort ();
+  exit (0);
+}