aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/reorg.c2
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.c-torture/execute/ieee/pr28634.c15
4 files changed, 28 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 37fbac8..8a53ade 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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>
diff --git a/gcc/reorg.c b/gcc/reorg.c
index 42ecda0..8c097dc 100644
--- a/gcc/reorg.c
+++ b/gcc/reorg.c
@@ -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))
{
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index de4f9e6..7481db0 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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
index 0000000..a0c5254
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/execute/ieee/pr28634.c
@@ -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);
+}