diff options
author | Richard Stallman <rms@gnu.org> | 1992-05-17 07:07:44 +0000 |
---|---|---|
committer | Richard Stallman <rms@gnu.org> | 1992-05-17 07:07:44 +0000 |
commit | a6acbe157bfce225b8f91b2496ae4588af7cd5e0 (patch) | |
tree | 2c768c4ea7d3392df2ae5d195cd62d9656ec05bb /gcc | |
parent | b8168f0d34366808143d0f0365243d0a13e520eb (diff) | |
download | gcc-a6acbe157bfce225b8f91b2496ae4588af7cd5e0.zip gcc-a6acbe157bfce225b8f91b2496ae4588af7cd5e0.tar.gz gcc-a6acbe157bfce225b8f91b2496ae4588af7cd5e0.tar.bz2 |
*** empty log message ***
From-SVN: r999
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cse.c | 10 | ||||
-rw-r--r-- | gcc/fold-const.c | 18 |
2 files changed, 14 insertions, 14 deletions
@@ -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 029f25c..dd26986 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: |