]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
combine.c (set_nonzero_bits_and_sign_copies): Don't call nonzero_bits if not needed.
authorJakub Jelinek <jakub@redhat.com>
Fri, 29 Mar 2002 08:01:20 +0000 (09:01 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Fri, 29 Mar 2002 08:01:20 +0000 (09:01 +0100)
* combine.c (set_nonzero_bits_and_sign_copies): Don't call
nonzero_bits if not needed.
(nonzero_bits) [XOR]: Likewise.
(nonzero_bits) [REG]: Use reg_last_set_nonzero_bits even if
reg_last_set_mode and mode are both MODE_INT, but not equal.
(record_value_for_reg): Compute reg_last_set_nonzero_bits
in nonzero_bits_mode for MODE_INT modes.

From-SVN: r51551

gcc/ChangeLog
gcc/combine.c

index 6c4928fb43ca97041a98ec11a071ad32df110962..48a7dcf7aa3caca807338794dc11445bb078bd2d 100644 (file)
@@ -1,3 +1,13 @@
+2002-03-29  Jakub Jelinek  <jakub@redhat.com>
+
+       * combine.c (set_nonzero_bits_and_sign_copies): Don't call
+       nonzero_bits if not needed.
+       (nonzero_bits) [XOR]: Likewise.
+       (nonzero_bits) [REG]: Use reg_last_set_nonzero_bits even if
+       reg_last_set_mode and mode are both MODE_INT, but not equal.
+       (record_value_for_reg): Compute reg_last_set_nonzero_bits
+       in nonzero_bits_mode for MODE_INT modes.
+
 2002-03-28  Richard Henderson  <rth@redhat.com>
 
        PR target/5715
index adb034d80cab98ca1a9d4e9a8d16e4da90a10d52..3e97a1afddd0734cdaeda11aae73899ad36b3310 100644 (file)
@@ -906,8 +906,10 @@ set_nonzero_bits_and_sign_copies (x, set, data)
                              << GET_MODE_BITSIZE (GET_MODE (x))));
 #endif
 
-         reg_nonzero_bits[REGNO (x)]
-           |= nonzero_bits (src, nonzero_bits_mode);
+         /* Don't call nonzero_bits if it cannot change anything.  */
+         if (reg_nonzero_bits[REGNO (x)] != ~(unsigned HOST_WIDE_INT) 0)
+           reg_nonzero_bits[REGNO (x)]
+             |= nonzero_bits (src, nonzero_bits_mode);
          num = num_sign_bit_copies (SET_SRC (set), GET_MODE (x));
          if (reg_sign_bit_copies[REGNO (x)] == 0
              || reg_sign_bit_copies[REGNO (x)] > num)
@@ -8049,7 +8051,9 @@ nonzero_bits (x, mode)
         for this register.  */
 
       if (reg_last_set_value[REGNO (x)] != 0
-         && reg_last_set_mode[REGNO (x)] == mode
+         && (reg_last_set_mode[REGNO (x)] == mode
+             || (GET_MODE_CLASS (reg_last_set_mode[REGNO (x)]) == MODE_INT
+                 && GET_MODE_CLASS (mode) == MODE_INT))
          && (reg_last_set_label[REGNO (x)] == label_tick
              || (REGNO (x) >= FIRST_PSEUDO_REGISTER
                  && REG_N_SETS (REGNO (x)) == 1
@@ -8191,8 +8195,14 @@ nonzero_bits (x, mode)
 
     case XOR:   case IOR:
     case UMIN:  case UMAX:  case SMIN:  case SMAX:
-      nonzero &= (nonzero_bits (XEXP (x, 0), mode)
-                 | nonzero_bits (XEXP (x, 1), mode));
+      {
+       unsigned HOST_WIDE_INT nonzero0 = nonzero_bits (XEXP (x, 0), mode);
+
+       /* Don't call nonzero_bits for the second time if it cannot change
+          anything.  */
+       if ((nonzero & nonzero0) != nonzero)
+         nonzero &= (nonzero0 | nonzero_bits (XEXP (x, 1), mode));
+      }
       break;
 
     case PLUS:  case MINUS:
@@ -11218,9 +11228,13 @@ record_value_for_reg (reg, insn, value)
 
   if (value)
     {
+      enum machine_mode mode = GET_MODE (reg);
       subst_low_cuid = INSN_CUID (insn);
-      reg_last_set_mode[regno] = GET_MODE (reg);
-      reg_last_set_nonzero_bits[regno] = nonzero_bits (value, GET_MODE (reg));
+      reg_last_set_mode[regno] = mode;
+      if (GET_MODE_CLASS (mode) == MODE_INT
+         && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT)
+       mode = nonzero_bits_mode;
+      reg_last_set_nonzero_bits[regno] = nonzero_bits (value, mode);
       reg_last_set_sign_bit_copies[regno]
        = num_sign_bit_copies (value, GET_MODE (reg));
     }