diff options
| author | rsandifo <rsandifo@138bc75d-0d04-0410-961f-82ee72b054a4> | 2006-08-14 11:55:52 +0000 |
|---|---|---|
| committer | rsandifo <rsandifo@138bc75d-0d04-0410-961f-82ee72b054a4> | 2006-08-14 11:55:52 +0000 |
| commit | 4438235082d92dd64278dc9b15cb0f9b19b1e2e7 (patch) | |
| tree | 708c5891d7f7a0a2c10d910822ab1ea133ae9978 | |
| parent | 863b3aaff1a0e18aa76ea7526b98141e50d5d260 (diff) | |
| download | ppe42-gcc-4438235082d92dd64278dc9b15cb0f9b19b1e2e7.tar.gz ppe42-gcc-4438235082d92dd64278dc9b15cb0f9b19b1e2e7.zip | |
gcc/
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
| -rw-r--r-- | gcc/ChangeLog | 6 | ||||
| -rw-r--r-- | gcc/reorg.c | 2 | ||||
| -rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
| -rw-r--r-- | gcc/testsuite/gcc.c-torture/execute/ieee/pr28634.c | 15 |
4 files changed, 28 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 37fbac8519c..8a53adee42f 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 42ecda0db4c..8c097dca412 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 de4f9e6a789..7481db0ec6d 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 00000000000..a0c525497d7 --- /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); +} |

