mirror of
https://gcc.gnu.org/git/gcc.git
synced 2024-12-25 12:05:06 +08:00
re PR rtl-optimization/28634 (rounding problem with -fdelayed-branch on hppa/mips)
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. From-SVN: r116124
This commit is contained in:
parent
62eed976f5
commit
2b3969faee
@ -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>
|
||||
|
||||
|
@ -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))
|
||||
{
|
||||
|
@ -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
|
||||
|
15
gcc/testsuite/gcc.c-torture/execute/ieee/pr28634.c
Normal file
15
gcc/testsuite/gcc.c-torture/execute/ieee/pr28634.c
Normal file
@ -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);
|
||||
}
|
Loading…
Reference in New Issue
Block a user