aboutsummaryrefslogtreecommitdiff
path: root/gcc/combine.c
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2002-03-29 09:01:20 +0100
committerJakub Jelinek <jakub@gcc.gnu.org>2002-03-29 09:01:20 +0100
commit0a0440c94f4e57a050348a0970a34ab496f9d5dc (patch)
tree4cbadd2a4172d048aafb0cabc2311fd510f84b2f /gcc/combine.c
parentc7f4981a5122c9b1dfcbe4596b05515d055a4b17 (diff)
downloadgcc-0a0440c94f4e57a050348a0970a34ab496f9d5dc.zip
gcc-0a0440c94f4e57a050348a0970a34ab496f9d5dc.tar.gz
gcc-0a0440c94f4e57a050348a0970a34ab496f9d5dc.tar.bz2
combine.c (set_nonzero_bits_and_sign_copies): Don't call nonzero_bits if not needed.
* 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
Diffstat (limited to 'gcc/combine.c')
-rw-r--r--gcc/combine.c28
1 files changed, 21 insertions, 7 deletions
diff --git a/gcc/combine.c b/gcc/combine.c
index adb034d..3e97a1a 100644
--- a/gcc/combine.c
+++ b/gcc/combine.c
@@ -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));
}