OSDN Git Service

* combine.c (simplify_comparison): When widening modes, ignore
authoramodra <amodra@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 23 Mar 2002 01:53:44 +0000 (01:53 +0000)
committeramodra <amodra@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 23 Mar 2002 01:53:44 +0000 (01:53 +0000)
sign extension on CONST_INTs.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@51216 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/combine.c

index e2a2102..b95a707 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 0f17559..88495a6 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;
            }