On Mon, Jan 5, 2026 at 3:57 AM Kito Cheng <[email protected]> wrote:
>
> gcc.dg/torture/bitint-18.c triggers an ICE in push_partial_def when
> compiling for RISC-V with -O2. The issue occurs because
> build_nonstandard_integer_type cannot handle bit widths larger than
> MAX_FIXED_MODE_SIZE. Bail out early for such cases.
>
> gcc/ChangeLog:
>
> * tree-ssa-sccvn.cc (vn_walk_cb_data::push_partial_def): Bail out
> for BITINT_TYPE when maxsizei exceeds MAX_FIXED_MODE_SIZE.
> ---
> gcc/tree-ssa-sccvn.cc | 12 +++++++++++-
> 1 file changed, 11 insertions(+), 1 deletion(-)
>
> diff --git a/gcc/tree-ssa-sccvn.cc b/gcc/tree-ssa-sccvn.cc
> index 0c519cf4c21..e931a227afd 100644
> --- a/gcc/tree-ssa-sccvn.cc
> +++ b/gcc/tree-ssa-sccvn.cc
> @@ -2315,7 +2315,17 @@ vn_walk_cb_data::push_partial_def (pd_data pd,
> /* Make sure to interpret in a type that has a range covering the whole
> access size. */
> if (INTEGRAL_TYPE_P (vr->type) && maxsizei != TYPE_PRECISION (vr->type))
> - type = build_nonstandard_integer_type (maxsizei, TYPE_UNSIGNED (type));
> + {
> + if (TREE_CODE (vr->type) == BITINT_TYPE
> + && maxsizei > MAX_FIXED_MODE_SIZE)
Hmm. I'd like to catch this earlier. We have
void *
vn_walk_cb_data::push_partial_def (pd_data pd,
alias_set_type set, alias_set_type base_set,
HOST_WIDE_INT offseti,
HOST_WIDE_INT maxsizei)
{
/* We're using a fixed buffer for encoding so fail early if the object
we want to interpret is bigger. */
if (maxsizei > bufsize * BITS_PER_UNIT
|| CHAR_BIT != 8
|| BITS_PER_UNIT != 8
/* Not prepared to handle PDP endian. */
|| BYTES_BIG_ENDIAN != WORDS_BIG_ENDIAN)
return (void *)-1;
so either we disregard integral types with > MAX_FIXED_MODE_SIZE here or
if there's a compelling reason to handle partial-def BIT_INT_TYPE we should
instead build a proper bit int type instead of failing with
non-standard integer type?
Jakub?
> + {
> + if (dump_file && (dump_flags & TDF_DETAILS))
> + fprintf (dump_file, "Failed to combine %u partial definitions "
> + "(exceeds MAX_FIXED_MODE_SIZE)\n", ndefs);
> + return (void *)-1;
> + }
> + type = build_nonstandard_integer_type (maxsizei, TYPE_UNSIGNED (type));
> + }
> tree val;
> if (BYTES_BIG_ENDIAN)
> {
> --
> 2.52.0
>