The two implementations of the reg_nonzero_bits and reg_num_sign_bits hooks ignored the "known_x", "known_mode" and "known_ret" arguments, so this patch removes them. It adds a new scalar_int_mode parameter that specifies the mode of "x". (This mode might be different from "mode", which is the mode in which "x" is used.)
gcc/ 2016-11-24 Richard Sandiford <richard.sandif...@arm.com> Alan Hayward <alan.hayw...@arm.com> David Sherwood <david.sherw...@arm.com> * rtl.h (rtl_hooks::reg_nonzero_bits): Add a scalar_int_mode parameter for the mode of "x". Remove the "known_x", "known_mode" and "known_ret" arguments. Change the type of the mode argument to scalar_int_mode. (rtl_hooks:reg_num_sign_bit_copies): Likewise. * combine.c (reg_nonzero_bits_for_combine): Update accordingly. (reg_num_sign_bits_copies_for_combine): Likewise. * rtlanal.c (nonzero_bits1): Likewise. (num_sign_bit_copies1): Likewise. * rtlhooks-def.h (reg_nonzero_bits_general): Likewise. (reg_num_sign_bit_copies_general): Likewise. * rtlhooks.c (reg_num_sign_bit_copies_general): Likewise. (reg_nonzero_bits_general): Likewise. diff --git a/gcc/combine.c b/gcc/combine.c index fac82d4..6e32b37 100644 --- a/gcc/combine.c +++ b/gcc/combine.c @@ -411,13 +411,12 @@ static struct undobuf undobuf; static int n_occurrences; -static rtx reg_nonzero_bits_for_combine (const_rtx, machine_mode, const_rtx, - machine_mode, - unsigned HOST_WIDE_INT, +static rtx reg_nonzero_bits_for_combine (const_rtx, scalar_int_mode, + scalar_int_mode, unsigned HOST_WIDE_INT *); -static rtx reg_num_sign_bit_copies_for_combine (const_rtx, machine_mode, const_rtx, - machine_mode, - unsigned int, unsigned int *); +static rtx reg_num_sign_bit_copies_for_combine (const_rtx, scalar_int_mode, + scalar_int_mode, + unsigned int *); static void do_SUBST (rtx *, rtx); static void do_SUBST_INT (int *, int); static void init_reg_last (void); @@ -10010,17 +10009,15 @@ simplify_and_const_int (rtx x, scalar_int_mode mode, rtx varop, return x; } -/* Given a REG, X, compute which bits in X can be nonzero. +/* Given a REG X of mode XMODE, compute which bits in X can be nonzero. We don't care about bits outside of those defined in MODE. For most X this is simply GET_MODE_MASK (GET_MODE (MODE)), but if X is a shift, AND, or zero_extract, we can do better. */ static rtx -reg_nonzero_bits_for_combine (const_rtx x, machine_mode mode, - const_rtx known_x ATTRIBUTE_UNUSED, - machine_mode known_mode ATTRIBUTE_UNUSED, - unsigned HOST_WIDE_INT known_ret ATTRIBUTE_UNUSED, +reg_nonzero_bits_for_combine (const_rtx x, scalar_int_mode xmode, + scalar_int_mode mode, unsigned HOST_WIDE_INT *nonzero) { rtx tem; @@ -10032,9 +10029,12 @@ reg_nonzero_bits_for_combine (const_rtx x, machine_mode mode, for this register. */ rsp = ®_stat[REGNO (x)]; + + scalar_int_mode last_mode; if (rsp->last_set_value != 0 - && (rsp->last_set_mode == mode - || (GET_MODE_CLASS (rsp->last_set_mode) == MODE_INT + && is_a <scalar_int_mode> (rsp->last_set_mode, &last_mode) + && (last_mode == mode + || (GET_MODE_CLASS (last_mode) == MODE_INT && GET_MODE_CLASS (mode) == MODE_INT)) && ((rsp->last_set_label >= label_tick_ebb_start && rsp->last_set_label < label_tick) @@ -10061,8 +10061,7 @@ reg_nonzero_bits_for_combine (const_rtx x, machine_mode mode, if (tem) { if (SHORT_IMMEDIATES_SIGN_EXTEND) - tem = sign_extend_short_imm (tem, GET_MODE (x), - GET_MODE_PRECISION (mode)); + tem = sign_extend_short_imm (tem, xmode, GET_MODE_PRECISION (mode)); return tem; } @@ -10071,9 +10070,9 @@ reg_nonzero_bits_for_combine (const_rtx x, machine_mode mode, { unsigned HOST_WIDE_INT mask = rsp->nonzero_bits; - if (GET_MODE_PRECISION (GET_MODE (x)) < GET_MODE_PRECISION (mode)) + if (GET_MODE_PRECISION (xmode) < GET_MODE_PRECISION (mode)) /* We don't know anything about the upper bits. */ - mask |= GET_MODE_MASK (mode) ^ GET_MODE_MASK (GET_MODE (x)); + mask |= GET_MODE_MASK (mode) ^ GET_MODE_MASK (xmode); *nonzero &= mask; } @@ -10081,17 +10080,14 @@ reg_nonzero_bits_for_combine (const_rtx x, machine_mode mode, return NULL; } -/* Return the number of bits at the high-order end of X that are known to - be equal to the sign bit. X will be used in mode MODE; if MODE is - VOIDmode, X will be used in its own mode. The returned value will always - be between 1 and the number of bits in MODE. */ +/* Given a reg X of mode XMODE, return the number of bits at the high-order + end of X that are known to be equal to the sign bit. X will be used + in mode MODE; the returned value will always be between 1 and the + number of bits in MODE. */ static rtx -reg_num_sign_bit_copies_for_combine (const_rtx x, machine_mode mode, - const_rtx known_x ATTRIBUTE_UNUSED, - machine_mode known_mode - ATTRIBUTE_UNUSED, - unsigned int known_ret ATTRIBUTE_UNUSED, +reg_num_sign_bit_copies_for_combine (const_rtx x, scalar_int_mode xmode, + scalar_int_mode mode, unsigned int *result) { rtx tem; @@ -10120,7 +10116,7 @@ reg_num_sign_bit_copies_for_combine (const_rtx x, machine_mode mode, return tem; if (nonzero_sign_valid && rsp->sign_bit_copies != 0 - && GET_MODE_PRECISION (GET_MODE (x)) == GET_MODE_PRECISION (mode)) + && GET_MODE_PRECISION (xmode) == GET_MODE_PRECISION (mode)) *result = rsp->sign_bit_copies; return NULL; diff --git a/gcc/rtl.h b/gcc/rtl.h index 7d44e3f..35f61c8 100644 --- a/gcc/rtl.h +++ b/gcc/rtl.h @@ -3761,10 +3761,10 @@ struct rtl_hooks { rtx (*gen_lowpart) (machine_mode, rtx); rtx (*gen_lowpart_no_emit) (machine_mode, rtx); - rtx (*reg_nonzero_bits) (const_rtx, machine_mode, const_rtx, machine_mode, - unsigned HOST_WIDE_INT, unsigned HOST_WIDE_INT *); - rtx (*reg_num_sign_bit_copies) (const_rtx, machine_mode, const_rtx, machine_mode, - unsigned int, unsigned int *); + rtx (*reg_nonzero_bits) (const_rtx, scalar_int_mode, scalar_int_mode, + unsigned HOST_WIDE_INT *); + rtx (*reg_num_sign_bit_copies) (const_rtx, scalar_int_mode, scalar_int_mode, + unsigned int *); bool (*reg_truncated_to_mode) (machine_mode, const_rtx); /* Whenever you add entries here, make sure you adjust rtlhooks-def.h. */ diff --git a/gcc/rtlanal.c b/gcc/rtlanal.c index b70f6ce..42d08a2 100644 --- a/gcc/rtlanal.c +++ b/gcc/rtlanal.c @@ -4409,9 +4409,8 @@ nonzero_bits1 (const_rtx x, scalar_int_mode mode, const_rtx known_x, { unsigned HOST_WIDE_INT nonzero_for_hook = nonzero; - rtx new_rtx = rtl_hooks.reg_nonzero_bits (x, mode, known_x, - known_mode, known_ret, - &nonzero_for_hook); + rtx new_rtx = rtl_hooks.reg_nonzero_bits (x, xmode, mode, + &nonzero_for_hook); if (new_rtx) nonzero_for_hook &= cached_nonzero_bits (new_rtx, mode, known_x, @@ -4905,9 +4904,8 @@ num_sign_bit_copies1 (const_rtx x, scalar_int_mode mode, const_rtx known_x, { unsigned int copies_for_hook = 1, copies = 1; - rtx new_rtx = rtl_hooks.reg_num_sign_bit_copies (x, mode, known_x, - known_mode, known_ret, - &copies_for_hook); + rtx new_rtx = rtl_hooks.reg_num_sign_bit_copies (x, xmode, mode, + &copies_for_hook); if (new_rtx) copies = cached_num_sign_bit_copies (new_rtx, mode, known_x, diff --git a/gcc/rtlhooks-def.h b/gcc/rtlhooks-def.h index 5415114..f56f3d3 100644 --- a/gcc/rtlhooks-def.h +++ b/gcc/rtlhooks-def.h @@ -38,13 +38,11 @@ along with GCC; see the file COPYING3. If not see } extern rtx gen_lowpart_general (machine_mode, rtx); -extern rtx reg_nonzero_bits_general (const_rtx, machine_mode, const_rtx, - machine_mode, - unsigned HOST_WIDE_INT, +extern rtx reg_nonzero_bits_general (const_rtx, scalar_int_mode, + scalar_int_mode, unsigned HOST_WIDE_INT *); -extern rtx reg_num_sign_bit_copies_general (const_rtx, machine_mode, const_rtx, - machine_mode, - unsigned int, unsigned int *); +extern rtx reg_num_sign_bit_copies_general (const_rtx, scalar_int_mode, + scalar_int_mode, unsigned int *); extern bool reg_truncated_to_mode_general (machine_mode, const_rtx); #endif /* GCC_RTL_HOOKS_DEF_H */ diff --git a/gcc/rtlhooks.c b/gcc/rtlhooks.c index 6bebcd6..be50f3b 100644 --- a/gcc/rtlhooks.c +++ b/gcc/rtlhooks.c @@ -86,23 +86,15 @@ gen_lowpart_general (machine_mode mode, rtx x) } rtx -reg_num_sign_bit_copies_general (const_rtx x ATTRIBUTE_UNUSED, - machine_mode mode ATTRIBUTE_UNUSED, - const_rtx known_x ATTRIBUTE_UNUSED, - machine_mode known_mode ATTRIBUTE_UNUSED, - unsigned int known_ret ATTRIBUTE_UNUSED, - unsigned int *result ATTRIBUTE_UNUSED) +reg_num_sign_bit_copies_general (const_rtx, scalar_int_mode, scalar_int_mode, + unsigned int *) { return NULL; } rtx -reg_nonzero_bits_general (const_rtx x ATTRIBUTE_UNUSED, - machine_mode mode ATTRIBUTE_UNUSED, - const_rtx known_x ATTRIBUTE_UNUSED, - machine_mode known_mode ATTRIBUTE_UNUSED, - unsigned HOST_WIDE_INT known_ret ATTRIBUTE_UNUSED, - unsigned HOST_WIDE_INT *nonzero ATTRIBUTE_UNUSED) +reg_nonzero_bits_general (const_rtx, scalar_int_mode, scalar_int_mode, + unsigned HOST_WIDE_INT *) { return NULL; }