]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
VN: Fix VN ICE for large _BitInt types
authorKito Cheng <kito.cheng@sifive.com>
Mon, 29 Dec 2025 06:14:25 +0000 (14:14 +0800)
committerKito Cheng <kito.cheng@sifive.com>
Tue, 13 Jan 2026 03:23:40 +0000 (11:23 +0800)
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.

For BITINT_TYPE with maxsizei > MAX_FIXED_MODE_SIZE, use build_bitint_type
instead of build_nonstandard_integer_type, similar to what tree-sra.cc does.

gcc/ChangeLog:

* tree-ssa-sccvn.cc (vn_walk_cb_data::push_partial_def): Use
build_bitint_type for BITINT_TYPE when maxsizei exceeds
MAX_FIXED_MODE_SIZE.

gcc/tree-ssa-sccvn.cc

index b152dcb5943f93a4785a618b144881bd5f39a47c..13deccb6c6b13a62de3f431df4f8ec9fdfd39048 100644 (file)
@@ -2316,7 +2316,13 @@ 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)
+       type = build_bitint_type (maxsizei, TYPE_UNSIGNED (type));
+      else
+       type = build_nonstandard_integer_type (maxsizei, TYPE_UNSIGNED (type));
+    }
   tree val;
   if (BYTES_BIG_ENDIAN)
     {