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:
Jakub Jelinek 2004-06-14 19:45:08 +02:00 committed by Jakub Jelinek
parent 4493093524
commit 6355b2d5bb
2 changed files with 41 additions and 0 deletions

View File

@ -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.

View File

@ -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);