Jeff Law <l...@redhat.com> writes: > 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.
FWIW, I'd expect these two constructors to go away if we switch to C++11 in future, rather than become "() = default". We only really need them because of C++03 restrictions. > Otherwise this is OK. Thanks, Richard