On 10/23/2017 11:00 AM, Richard Sandiford wrote: > This patch adds a tree representation for poly_ints. Unlike the > rtx version, the coefficients are INTEGER_CSTs rather than plain > integers, so that we can easily access them as poly_widest_ints > and poly_offset_ints. > > The patch also adjusts some places that previously > relied on "constant" meaning "INTEGER_CST". It also makes > sure that the TYPE_SIZE agrees with the TYPE_SIZE_UNIT for > vector booleans, given the existing: > > /* Several boolean vector elements may fit in a single unit. */ > if (VECTOR_BOOLEAN_TYPE_P (type) > && type->type_common.mode != BLKmode) > TYPE_SIZE_UNIT (type) > = size_int (GET_MODE_SIZE (type->type_common.mode)); > else > TYPE_SIZE_UNIT (type) = int_const_binop (MULT_EXPR, > TYPE_SIZE_UNIT (innertype), > size_int (nunits)); > > > 2017-10-23 Richard Sandiford <richard.sandif...@linaro.org> > Alan Hayward <alan.hayw...@arm.com> > David Sherwood <david.sherw...@arm.com> > > gcc/ > * doc/generic.texi (POLY_INT_CST): Document. > * tree.def (POLY_INT_CST): New tree code. > * treestruct.def (TS_POLY_INT_CST): New tree layout. > * tree-core.h (tree_poly_int_cst): New struct. > (tree_node): Add a poly_int_cst field. > * tree.h (POLY_INT_CST_P, POLY_INT_CST_COEFF): New macros. > (wide_int_to_tree, force_fit_type): Take a poly_wide_int_ref > instead of a wide_int_ref. > (build_int_cst, build_int_cst_type): Take a poly_int64 instead > of a HOST_WIDE_INT. > (build_int_cstu, build_array_type_nelts): Take a poly_uint64 > instead of an unsigned HOST_WIDE_INT. > (build_poly_int_cst, tree_fits_poly_int64_p, tree_fits_poly_uint64_p) > (ptrdiff_tree_p): Declare. > (tree_to_poly_int64, tree_to_poly_uint64): Likewise. Provide > extern inline implementations if the target doesn't use POLY_INT_CST. > (poly_int_tree_p): New function. > (wi::unextended_tree): New class. > (wi::int_traits <unextended_tree>): New override. > (wi::extended_tree): Add a default constructor. > (wi::extended_tree::get_tree): New function. > (wi::widest_extended_tree, wi::offset_extended_tree): New typedefs. > (wi::tree_to_widest_ref, wi::tree_to_offset_ref): Use them. > (wi::tree_to_poly_widest_ref, wi::tree_to_poly_offset_ref) > (wi::tree_to_poly_wide_ref): New typedefs. > (wi::ints_for): Provide overloads for extended_tree and > unextended_tree. > (poly_int_cst_value, wi::to_poly_widest, wi::to_poly_offset) > (wi::to_wide): New functions. > (wi::fits_to_boolean_p, wi::fits_to_tree_p): Handle poly_ints. > * tree.c (poly_int_cst_hasher): New struct. > (poly_int_cst_hash_table): New variable. > (tree_node_structure_for_code, tree_code_size, simple_cst_equal) > (valid_constant_size_p, add_expr, drop_tree_overflow): Handle > POLY_INT_CST. > (initialize_tree_contains_struct): Handle TS_POLY_INT_CST. > (init_ttree): Initialize poly_int_cst_hash_table. > (build_int_cst, build_int_cst_type, build_invariant_address): Take > a poly_int64 instead of a HOST_WIDE_INT. > (build_int_cstu, build_array_type_nelts): Take a poly_uint64 > instead of an unsigned HOST_WIDE_INT. > (wide_int_to_tree): Rename to... > (wide_int_to_tree_1): ...this. > (build_new_poly_int_cst, build_poly_int_cst): New functions. > (force_fit_type): Take a poly_wide_int_ref instead of a wide_int_ref. > (wide_int_to_tree): New function that takes a poly_wide_int_ref. > (ptrdiff_tree_p, tree_to_poly_int64, tree_to_poly_uint64) > (tree_fits_poly_int64_p, tree_fits_poly_uint64_p): New functions. > * lto-streamer-out.c (DFS::DFS_write_tree_body, hash_tree): Handle > TS_POLY_INT_CST. > * tree-streamer-in.c (lto_input_ts_poly_tree_pointers): Likewise. > (streamer_read_tree_body): Likewise. > * tree-streamer-out.c (write_ts_poly_tree_pointers): Likewise. > (streamer_write_tree_body): Likewise. > * tree-streamer.c (streamer_check_handled_ts_structures): Likewise. > * asan.c (asan_protect_global): Require the size to be an INTEGER_CST. > * cfgexpand.c (expand_debug_expr): Handle POLY_INT_CST. > * expr.c (const_vector_element, expand_expr_real_1): Likewise. > * gimple-expr.h (is_gimple_constant): Likewise. > * gimplify.c (maybe_with_size_expr): Likewise. > * print-tree.c (print_node): Likewise. > * tree-data-ref.c (data_ref_compare_tree): Likewise. > * tree-pretty-print.c (dump_generic_node): Likewise. > * tree-ssa-address.c (addr_for_mem_ref): Likewise. > * tree-vect-data-refs.c (dr_group_sort_cmp): Likewise. > * tree-vrp.c (compare_values_warnv): Likewise. > * tree-ssa-loop-ivopts.c (determine_base_object, constant_multiple_of) > (get_loop_invariant_expr, add_candidate_1, get_computation_aff_1) > (force_expr_to_var_cost): Likewise. > * tree-ssa-loop.c (for_each_index): Likewise. > * fold-const.h (build_invariant_address, size_int_kind): Take a > poly_int64 instead of a HOST_WIDE_INT. > * fold-const.c (fold_negate_expr_1, const_binop, const_unop) > (fold_convert_const, multiple_of_p, fold_negate_const): Handle > POLY_INT_CST. > (size_binop_loc): Likewise. Allow int_const_binop_1 to fail. > (int_const_binop_2): New function, split out from... > (int_const_binop_1): ...here. Handle POLY_INT_CST. > (size_int_kind): Take a poly_int64 instead of a HOST_WIDE_INT. > * expmed.c (make_tree): Handle CONST_POLY_INT_P. > * gimple-ssa-strength-reduction.c (slsr_process_add) > (slsr_process_mul): Check for INTEGER_CSTs before using them > as candidates. > * stor-layout.c (bits_from_bytes): New function. > (bit_from_pos): Use it. > (layout_type): Likewise. For vectors, multiply the TYPE_SIZE_UNIT > by BITS_PER_UNIT to get the TYPE_SIZE. > * tree-cfg.c (verify_expr, verify_types_in_gimple_reference): Allow > MEM_REF and TARGET_MEM_REF offsets to be a POLY_INT_CST. > > Index: gcc/tree.h > =================================================================== > --- gcc/tree.h 2017-10-23 16:52:20.504766418 +0100 > +++ gcc/tree.h 2017-10-23 17:00:57.784962010 +0100 > @@ -5132,6 +5195,29 @@ extern bool anon_aggrname_p (const_tree) > /* The tree and const_tree overload templates. */ > namespace wi > { > + class unextended_tree > + { > + private: > + const_tree m_t; > + > + public: > + unextended_tree () {} > + unextended_tree (const_tree t) : m_t (t) {} > + > + unsigned int get_precision () const; > + const HOST_WIDE_INT *get_val () const; > + unsigned int get_len () const; > + const_tree get_tree () const { return m_t; } > + }; > + > + template <> > + struct int_traits <unextended_tree> > + { > + static const enum precision_type precision_type = VAR_PRECISION; > + static const bool host_dependent_precision = false; > + static const bool is_sign_extended = false; > + }; > + > template <int N> > class extended_tree > { > @@ -5139,11 +5225,13 @@ extern bool anon_aggrname_p (const_tree) > const_tree m_t; > > public: > + extended_tree () {} > extended_tree (const_tree); > > unsigned int get_precision () const; > const HOST_WIDE_INT *get_val () const; > unsigned int get_len () const; > + const_tree get_tree () const { return m_t; } > }; Similarly I'll defer on part of the patch since the empty ctors play into the initialization question that's still on the table.
Otherwise this is OK. Jeff