diff options
author | Richard Sandiford <richard.sandiford@linaro.org> | 2018-01-03 21:42:20 +0000 |
---|---|---|
committer | Richard Sandiford <rsandifo@gcc.gnu.org> | 2018-01-03 21:42:20 +0000 |
commit | bb94ec7613a4fd30c278b236eb8783d985a1b6ee (patch) | |
tree | 4107ec912099af2ee77d6199890da00ee700d935 /gcc/rtlanal.c | |
parent | 928686b1c6d0a8b791ec08b2588a5fb8118d191c (diff) | |
download | gcc-bb94ec7613a4fd30c278b236eb8783d985a1b6ee.zip gcc-bb94ec7613a4fd30c278b236eb8783d985a1b6ee.tar.gz gcc-bb94ec7613a4fd30c278b236eb8783d985a1b6ee.tar.bz2 |
poly_int: GET_MODE_PRECISION
This patch changes GET_MODE_PRECISION from an unsigned short
to a poly_uint16.
2018-01-03 Richard Sandiford <richard.sandiford@linaro.org>
Alan Hayward <alan.hayward@arm.com>
David Sherwood <david.sherwood@arm.com>
gcc/
* machmode.h (mode_precision): Change from unsigned short to
poly_uint16_pod.
(mode_to_precision): Return a poly_uint16 rather than an unsigned
short.
(GET_MODE_PRECISION): Return a constant if ONLY_FIXED_SIZE_MODES,
or if measurement_type is not polynomial.
(HWI_COMPUTABLE_MODE_P): Turn into a function. Optimize the case
in which the mode is already known to be a scalar_int_mode.
* genmodes.c (emit_mode_precision): Change the type of mode_precision
from unsigned short to poly_uint16_pod. Use ZERO_COEFFS for the
initializer.
* lto-streamer-in.c (lto_input_mode_table): Use bp_unpack_poly_value
for GET_MODE_PRECISION.
* lto-streamer-out.c (lto_write_mode_table): Use bp_pack_poly_value
for GET_MODE_PRECISION.
* combine.c (update_rsp_from_reg_equal): Treat GET_MODE_PRECISION
as polynomial.
(try_combine, find_split_point, combine_simplify_rtx): Likewise.
(expand_field_assignment, make_extraction): Likewise.
(make_compound_operation_int, record_dead_and_set_regs_1): Likewise.
(get_last_value): Likewise.
* convert.c (convert_to_integer_1): Likewise.
* cse.c (cse_insn): Likewise.
* expr.c (expand_expr_real_1): Likewise.
* lra-constraints.c (simplify_operand_subreg): Likewise.
* optabs-query.c (can_atomic_load_p): Likewise.
* optabs.c (expand_atomic_load): Likewise.
(expand_atomic_store): Likewise.
* ree.c (combine_reaching_defs): Likewise.
* rtl.h (partial_subreg_p, paradoxical_subreg_p): Likewise.
* rtlanal.c (nonzero_bits1, lsb_bitfield_op_p): Likewise.
* tree.h (type_has_mode_precision_p): Likewise.
* ubsan.c (instrument_si_overflow): Likewise.
gcc/ada/
* gcc-interface/misc.c (enumerate_modes): Treat GET_MODE_PRECISION
as polynomial.
Co-Authored-By: Alan Hayward <alan.hayward@arm.com>
Co-Authored-By: David Sherwood <david.sherwood@arm.com>
From-SVN: r256198
Diffstat (limited to 'gcc/rtlanal.c')
-rw-r--r-- | gcc/rtlanal.c | 14 |
1 files changed, 9 insertions, 5 deletions
diff --git a/gcc/rtlanal.c b/gcc/rtlanal.c index 33a0980..54b14d8 100644 --- a/gcc/rtlanal.c +++ b/gcc/rtlanal.c @@ -4431,6 +4431,7 @@ nonzero_bits1 (const_rtx x, scalar_int_mode mode, const_rtx known_x, unsigned HOST_WIDE_INT inner_nz; enum rtx_code code; machine_mode inner_mode; + unsigned int inner_width; scalar_int_mode xmode; unsigned int mode_width = GET_MODE_PRECISION (mode); @@ -4735,8 +4736,9 @@ nonzero_bits1 (const_rtx x, scalar_int_mode mode, const_rtx known_x, machines, we can compute this from which bits of the inner object might be nonzero. */ inner_mode = GET_MODE (SUBREG_REG (x)); - if (GET_MODE_PRECISION (inner_mode) <= BITS_PER_WORD - && GET_MODE_PRECISION (inner_mode) <= HOST_BITS_PER_WIDE_INT) + if (GET_MODE_PRECISION (inner_mode).is_constant (&inner_width) + && inner_width <= BITS_PER_WORD + && inner_width <= HOST_BITS_PER_WIDE_INT) { nonzero &= cached_nonzero_bits (SUBREG_REG (x), mode, known_x, known_mode, known_ret); @@ -4752,8 +4754,9 @@ nonzero_bits1 (const_rtx x, scalar_int_mode mode, const_rtx known_x, ? val_signbit_known_set_p (inner_mode, nonzero) : extend_op != ZERO_EXTEND) || (!MEM_P (SUBREG_REG (x)) && !REG_P (SUBREG_REG (x)))) - && xmode_width > GET_MODE_PRECISION (inner_mode)) - nonzero |= (GET_MODE_MASK (xmode) & ~GET_MODE_MASK (inner_mode)); + && xmode_width > inner_width) + nonzero + |= (GET_MODE_MASK (GET_MODE (x)) & ~GET_MODE_MASK (inner_mode)); } break; @@ -6078,8 +6081,9 @@ lsb_bitfield_op_p (rtx x) machine_mode mode = GET_MODE (XEXP (x, 0)); HOST_WIDE_INT len = INTVAL (XEXP (x, 1)); HOST_WIDE_INT pos = INTVAL (XEXP (x, 2)); + poly_int64 remaining_bits = GET_MODE_PRECISION (mode) - len; - return (pos == (BITS_BIG_ENDIAN ? GET_MODE_PRECISION (mode) - len : 0)); + return known_eq (pos, BITS_BIG_ENDIAN ? remaining_bits : 0); } return false; } |