From: Jakub Jelinek Date: Fri, 29 Mar 2002 08:01:20 +0000 (+0100) Subject: combine.c (set_nonzero_bits_and_sign_copies): Don't call nonzero_bits if not needed. X-Git-Tag: releases/gcc-3.3.0~6045 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=0a0440c94f4e57a050348a0970a34ab496f9d5dc;p=thirdparty%2Fgcc.git 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 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 6c4928fb43ca..48a7dcf7aa3c 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,13 @@ +2002-03-29 Jakub Jelinek + + * 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 PR target/5715 diff --git a/gcc/combine.c b/gcc/combine.c index adb034d80cab..3e97a1afddd0 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)); }