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

Reply via email to