mirror of
https://gcc.gnu.org/git/gcc.git
synced 2025-01-18 10:24:30 +08:00
re PR middle-end/15945 (Incorrect floating point optimization)
PR middle-end/15945 * simplify-rtx.c (simplify_binary_operation): Don't optimize out Inf + -Inf, Inf - Inf, Inf / Inf and 0 * Inf if flag_trapping_math. From-SVN: r83121
This commit is contained in:
parent
4493093524
commit
6355b2d5bb
@ -1,3 +1,9 @@
|
||||
2004-06-14 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
PR middle-end/15945
|
||||
* simplify-rtx.c (simplify_binary_operation): Don't optimize out
|
||||
Inf + -Inf, Inf - Inf, Inf / Inf and 0 * Inf if flag_trapping_math.
|
||||
|
||||
2004-06-14 Zdenek Dvorak <rakdver@atrey.karlin.mff.cuni.cz>
|
||||
|
||||
* opts.sh (var_args): Fix regexp.
|
||||
|
@ -1277,6 +1277,41 @@ simplify_binary_operation (enum rtx_code code, enum machine_mode mode,
|
||||
&& (flag_trapping_math || ! MODE_HAS_INFINITIES (mode)))
|
||||
return 0;
|
||||
|
||||
if (MODE_HAS_INFINITIES (mode) && HONOR_NANS (mode)
|
||||
&& flag_trapping_math
|
||||
&& REAL_VALUE_ISINF (f0) && REAL_VALUE_ISINF (f1))
|
||||
{
|
||||
int s0 = REAL_VALUE_NEGATIVE (f0);
|
||||
int s1 = REAL_VALUE_NEGATIVE (f1);
|
||||
|
||||
switch (code)
|
||||
{
|
||||
case PLUS:
|
||||
/* Inf + -Inf = NaN plus exception. */
|
||||
if (s0 != s1)
|
||||
return 0;
|
||||
break;
|
||||
case MINUS:
|
||||
/* Inf - Inf = NaN plus exception. */
|
||||
if (s0 == s1)
|
||||
return 0;
|
||||
break;
|
||||
case DIV:
|
||||
/* Inf / Inf = NaN plus exception. */
|
||||
return 0;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (code == MULT && MODE_HAS_INFINITIES (mode) && HONOR_NANS (mode)
|
||||
&& flag_trapping_math
|
||||
&& ((REAL_VALUE_ISINF (f0) && REAL_VALUES_EQUAL (f1, dconst0))
|
||||
|| (REAL_VALUE_ISINF (f1)
|
||||
&& REAL_VALUES_EQUAL (f0, dconst0))))
|
||||
/* Inf * 0 = NaN plus exception. */
|
||||
return 0;
|
||||
|
||||
REAL_ARITHMETIC (value, rtx_to_tree_code (code), f0, f1);
|
||||
|
||||
value = real_value_truncate (mode, value);
|
||||
|
Loading…
Reference in New Issue
Block a user