combine.c (simplify_comparison): When widening modes, ignore sign extension on CONST_...
authorAlan Modra <amodra@bigpond.net.au>
Sat, 23 Mar 2002 01:53:44 +0000 (01:53 +0000)
committerAlan Modra <amodra@gcc.gnu.org>
Sat, 23 Mar 2002 01:53:44 +0000 (12:23 +1030)
* combine.c (simplify_comparison): When widening modes, ignore
sign extension on CONST_INTs.

From-SVN: r51216

gcc/ChangeLog
gcc/combine.c

index e2a210283c5f90dfc8f282bab3e258556ced3492..b95a707cdb6eb9826603f0bf4e0aa42c20e6d3b2 100644 (file)
@@ -1,3 +1,8 @@
+2002-03-23  Alan Modra  <amodra@bigpond.net.au>
+
+       * combine.c (simplify_comparison): When widening modes, ignore
+       sign extension on CONST_INTs.
+
 2002-03-22  Bob Wilson  <bob.wilson@acm.org>
 
        * config/xtensa/xtensa.c (print_operand): Fix incorrect mode
index 0f175599b29bf15536b84a4a228483dc2d36ed8d..88495a69fbde75e21d01f48e2b69b29ab557eced 100644 (file)
@@ -10975,14 +10975,22 @@ simplify_comparison (code, pop0, pop1)
         tmode = GET_MODE_WIDER_MODE (tmode))
       if (have_insn_for (COMPARE, tmode))
        {
+         int zero_extended;
+
          /* If the only nonzero bits in OP0 and OP1 are those in the
             narrower mode and this is an equality or unsigned comparison,
             we can use the wider mode.  Similarly for sign-extended
             values, in which case it is true for all comparisons.  */
-         if (((code == EQ || code == NE
-               || code == GEU || code == GTU || code == LEU || code == LTU)
-              && (nonzero_bits (op0, tmode) & ~GET_MODE_MASK (mode)) == 0
-              && (nonzero_bits (op1, tmode) & ~GET_MODE_MASK (mode)) == 0)
+         zero_extended = ((code == EQ || code == NE
+                           || code == GEU || code == GTU
+                           || code == LEU || code == LTU)
+                          && (nonzero_bits (op0, tmode)
+                              & ~GET_MODE_MASK (mode)) == 0
+                          && ((GET_CODE (op1) == CONST_INT
+                               || (nonzero_bits (op1, tmode)
+                                   & ~GET_MODE_MASK (mode)) == 0)));
+
+         if (zero_extended
              || ((num_sign_bit_copies (op0, tmode)
                   > GET_MODE_BITSIZE (tmode) - GET_MODE_BITSIZE (mode))
                  && (num_sign_bit_copies (op1, tmode)
@@ -10999,6 +11007,8 @@ simplify_comparison (code, pop0, pop1)
                                                           XEXP (op0, 1)));
 
              op0 = gen_lowpart_for_combine (tmode, op0);
+             if (zero_extended && GET_CODE (op1) == CONST_INT)
+               op1 = GEN_INT (INTVAL (op1) & GET_MODE_MASK (mode));
              op1 = gen_lowpart_for_combine (tmode, op1);
              break;
            }