https://gcc.gnu.org/bugzilla/show_bug.cgi?id=102989

--- Comment #96 from CVS Commits <cvs-commit at gcc dot gnu.org> ---
The master branch has been updated by Jakub Jelinek <ja...@gcc.gnu.org>:

https://gcc.gnu.org/g:4f4fa2501186e43d115238ae938b3df322c9e02a

commit r14-3745-g4f4fa2501186e43d115238ae938b3df322c9e02a
Author: Jakub Jelinek <ja...@redhat.com>
Date:   Wed Sep 6 17:25:49 2023 +0200

    Middle-end _BitInt support [PR102989]

    The following patch introduces the middle-end part of the _BitInt
    support, a new BITINT_TYPE, handling it where needed, except the lowering
    pass and sanitizer support.

    2023-09-06  Jakub Jelinek  <ja...@redhat.com>

            PR c/102989
            * tree.def (BITINT_TYPE): New type.
            * tree.h (TREE_CHECK6, TREE_NOT_CHECK6): Define.
            (NUMERICAL_TYPE_CHECK, INTEGRAL_TYPE_P): Include
            BITINT_TYPE.
            (BITINT_TYPE_P): Define.
            (CONSTRUCTOR_BITFIELD_P): Return true even for BLKmode bit-fields
if
            they have BITINT_TYPE type.
            (tree_check6, tree_not_check6): New inline functions.
            (any_integral_type_check): Include BITINT_TYPE.
            (build_bitint_type): Declare.
            * tree.cc (tree_code_size, wide_int_to_tree_1, cache_integer_cst,
            build_zero_cst, type_hash_canon_hash, type_cache_hasher::equal,
            type_hash_canon): Handle BITINT_TYPE.
            (bitint_type_cache): New variable.
            (build_bitint_type): New function.
            (signed_or_unsigned_type_for, verify_type_variant, verify_type):
            Handle BITINT_TYPE.
            (tree_cc_finalize): Free bitint_type_cache.
            * builtins.cc (type_to_class): Handle BITINT_TYPE.
            (fold_builtin_unordered_cmp): Handle BITINT_TYPE like INTEGER_TYPE.
            * cfgexpand.cc (expand_debug_expr): Punt on BLKmode BITINT_TYPE
            INTEGER_CSTs.
            * convert.cc (convert_to_pointer_1, convert_to_real_1,
            convert_to_complex_1): Handle BITINT_TYPE like INTEGER_TYPE.
            (convert_to_integer_1): Likewise.  For BITINT_TYPE don't check
            GET_MODE_PRECISION (TYPE_MODE (type)).
            * doc/generic.texi (BITINT_TYPE): Document.
            * doc/tm.texi.in (TARGET_C_BITINT_TYPE_INFO): New.
            * doc/tm.texi: Regenerated.
            * dwarf2out.cc (base_type_die, is_base_type, modified_type_die,
            gen_type_die_with_usage): Handle BITINT_TYPE.
            (rtl_for_decl_init): Punt on BLKmode BITINT_TYPE INTEGER_CSTs or
            handle those which fit into shwi.
            * expr.cc (expand_expr_real_1): Define EXTEND_BITINT macro, reduce
            to bitfield precision reads from BITINT_TYPE vars, parameters or
            memory locations.  Expand large/huge BITINT_TYPE INTEGER_CSTs into
            memory.
            * fold-const.cc (fold_convert_loc, make_range_step): Handle
            BITINT_TYPE.
            (extract_muldiv_1): For BITINT_TYPE use TYPE_PRECISION rather than
            GET_MODE_SIZE (SCALAR_INT_TYPE_MODE).
            (native_encode_int, native_interpret_int, native_interpret_expr):
            Handle BITINT_TYPE.
            * gimple-expr.cc (useless_type_conversion_p): Make BITINT_TYPE
            to some other integral type or vice versa conversions non-useless.
            * gimple-fold.cc (gimple_fold_builtin_memset): Punt for
BITINT_TYPE.
            (clear_padding_unit): Mention in comment that _BitInt types don't
need
            to fit either.
            (clear_padding_bitint_needs_padding_p): New function.
            (clear_padding_type_may_have_padding_p): Handle BITINT_TYPE.
            (clear_padding_type): Likewise.
            * internal-fn.cc (expand_mul_overflow): For unsigned non-mode
            precision operands force pos_neg? to 1.
            (expand_MULBITINT, expand_DIVMODBITINT, expand_FLOATTOBITINT,
            expand_BITINTTOFLOAT): New functions.
            * internal-fn.def (MULBITINT, DIVMODBITINT, FLOATTOBITINT,
            BITINTTOFLOAT): New internal functions.
            * internal-fn.h (expand_MULBITINT, expand_DIVMODBITINT,
            expand_FLOATTOBITINT, expand_BITINTTOFLOAT): Declare.
            * match.pd (non-equality compare simplifications from fold_binary):
            Punt if TYPE_MODE (arg1_type) is BLKmode.
            * pretty-print.h (pp_wide_int): Handle printing of large precision
            wide_ints which would buffer overflow digit_buffer.
            * stor-layout.cc (finish_bitfield_representative): For bit-fields
            with BITINT_TYPE, prefer representatives with precisions in
            multiple of limb precision.
            (layout_type): Handle BITINT_TYPE.  Handle COMPLEX_TYPE with
BLKmode
            element type and assert it is BITINT_TYPE.
            * target.def (bitint_type_info): New C target hook.
            * target.h (struct bitint_info): New type.
            * targhooks.cc (default_bitint_type_info): New function.
            * targhooks.h (default_bitint_type_info): Declare.
            * tree-pretty-print.cc (dump_generic_node): Handle BITINT_TYPE.
            Handle printing large wide_ints which would buffer overflow
            digit_buffer.
            * tree-ssa-sccvn.cc: Include target.h.
            (eliminate_dom_walker::eliminate_stmt): Punt for large/huge
            BITINT_TYPE.
            * tree-switch-conversion.cc (jump_table_cluster::emit): For more
than
            64-bit BITINT_TYPE subtract low bound from expression and cast to
            64-bit integer type both the controlling expression and case
labels.
            * typeclass.h (enum type_class): Add bitint_type_class enumerator.
            * varasm.cc (output_constant): Handle BITINT_TYPE INTEGER_CSTs.
            * vr-values.cc (check_for_binary_op_overflow): Use widest2_int
rather
            than widest_int.
            (simplify_using_ranges::simplify_internal_call_using_ranges): Use
            unsigned_type_for rather than build_nonstandard_integer_type.

Reply via email to