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

Reply via email to