(find_comparison_args): Look for comparison operations if the second arg is 0 in...
authorRichard Kenner <kenner@gcc.gnu.org>
Wed, 19 Aug 1992 22:19:34 +0000 (18:19 -0400)
committerRichard Kenner <kenner@gcc.gnu.org>
Wed, 19 Aug 1992 22:19:34 +0000 (18:19 -0400)
(find_comparison_args): Look for comparison operations if the second arg is
0 in any mode.
(record_jump_cond): Don't make classes equivalent for floating-point equality
comparison.

From-SVN: r1900

gcc/cse.c

index 497766c2a70af54d1f28d27e8259f1bfd979e7ba..24dbac63c5f75b56bb2966a86ea0215c2d4dc7c4 100644 (file)
--- a/gcc/cse.c
+++ b/gcc/cse.c
@@ -2639,7 +2639,7 @@ find_comparison_args (code, parg1, parg2)
 
   /* If ARG2 is const0_rtx, see what ARG1 is equivalent to.  */
 
-  while (arg2 == const0_rtx)
+  while (arg2 == CONST0_RTX (GET_MODE (arg1)))
     {
       /* Set non-zero when we find something of interest.  */
       rtx x = 0;
@@ -5366,8 +5366,12 @@ record_jump_cond (code, mode, op0, op1, reversed_nonequality)
   op1_elt = lookup (op1, op1_hash_code, mode);
 
   /* If we aren't setting two things equal all we can do is save this
-     comparison.  */
-  if (code != EQ)
+     comparison.   Similarly if this is floating-point.  In the latter
+     case, OP1 might be zero and both -0.0 and 0.0 are equal to it.
+     If we record the equality, we might inadvertently delete code
+     whose intent was to change -0 to +0.  */
+
+  if (code != EQ || GET_MODE_CLASS (GET_MODE (op0)) == MODE_FLOAT)
     {
       /* If we reversed a floating-point comparison, if OP0 is not a
         register, or if OP1 is neither a register or constant, we can't