summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/cse.c10
-rw-r--r--gcc/fold-const.c18
2 files changed, 14 insertions, 14 deletions
diff --git a/gcc/cse.c b/gcc/cse.c
index 6f8154b72fc..692eec5f4c4 100644
--- a/gcc/cse.c
+++ b/gcc/cse.c
@@ -2948,12 +2948,12 @@ simplify_unary_operation (code, mode, op, op_mode)
return gen_rtx (CONST_INT, VOIDmode, val);
}
#endif
- else if (GET_MODE_CLASS (mode) == MODE_INT
- || TARGET_FLOAT_FORMAT != IEEE_FLOAT_FORMAT)
+ /* This was formerly used only for non-IEEE float.
+ eggert@twinsun.com says it is safe for IEEE also. */
+ else
{
/* There are some simplifications we can do even if the operands
- aren't constant, but they don't apply to floating-point
- unless not IEEE. */
+ aren't constant. */
switch (code)
{
case NEG:
@@ -2979,8 +2979,6 @@ simplify_unary_operation (code, mode, op, op_mode)
return 0;
}
- else
- return 0;
}
/* Simplify a binary operation CODE with result mode MODE, operating on OP0
diff --git a/gcc/fold-const.c b/gcc/fold-const.c
index 029f25cde24..dd269861d55 100644
--- a/gcc/fold-const.c
+++ b/gcc/fold-const.c
@@ -3007,15 +3007,17 @@ fold (expr)
/* Except with IEEE floating point, x-0 equals x. */
if (real_zerop (arg1))
return non_lvalue (convert (type, arg0));
- }
- /* Fold &x - &x. This can happen from &x.foo - &x.
- Note that can't be done for certain floats even in non-IEEE formats.
- Also note that operand_equal_p is always false is an operand
- is volatile. */
- if (operand_equal_p (arg0, arg1,
- TREE_CODE (type) == REAL_TYPE))
- return convert (type, integer_zero_node);
+ /* Fold &x - &x. This can happen from &x.foo - &x.
+ This is unsafe for certain floats even in non-IEEE formats.
+ In IEEE, it is unsafe because it does wrong for NaNs.
+ Also note that operand_equal_p is always false is an operand
+ is volatile. */
+
+ if (operand_equal_p (arg0, arg1,
+ TREE_CODE (type) == REAL_TYPE))
+ return convert (type, integer_zero_node);
+ }
goto associate;
case MULT_EXPR: