diff options
author | Jakub Jelinek <jakub@redhat.com> | 2002-03-29 09:01:20 +0100 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2002-03-29 09:01:20 +0100 |
commit | 0a0440c94f4e57a050348a0970a34ab496f9d5dc (patch) | |
tree | 4cbadd2a4172d048aafb0cabc2311fd510f84b2f /gcc/combine.c | |
parent | c7f4981a5122c9b1dfcbe4596b05515d055a4b17 (diff) | |
download | gcc-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.c | 28 |
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)); } |