On Thu, Jun 19, 2025 at 05:59:04PM +0800, Yang Yujie wrote: > For targets that treat small _BitInts like the fundamental > integral types, we should allow their machine modes to be promoted > in the same way. > > gcc/ChangeLog: > > * explow.cc (promote_function_mode): Add a case for > small/medium _BitInts. > (promote_mode): Same. > --- > gcc/explow.cc | 31 ++++++++++++++++++++++++++++++- > 1 file changed, 30 insertions(+), 1 deletion(-) > > diff --git a/gcc/explow.cc b/gcc/explow.cc > index 7799a98053b..00d0380c664 100644 > --- a/gcc/explow.cc > +++ b/gcc/explow.cc > @@ -856,7 +856,21 @@ promote_function_mode (const_tree type, machine_mode > mode, int *punsignedp, > { > case INTEGER_TYPE: case ENUMERAL_TYPE: case BOOLEAN_TYPE: > case REAL_TYPE: case OFFSET_TYPE: case FIXED_POINT_TYPE: > - case POINTER_TYPE: case REFERENCE_TYPE: > + case POINTER_TYPE: case REFERENCE_TYPE: case BITINT_TYPE: > + /* Handle _BitInt(N) that does not require promotion. */ > + if (TREE_CODE (type) == BITINT_TYPE) > + { > + if (TYPE_MODE (type) == BLKmode) > + return mode; > + > + struct bitint_info info; > + bool ok = targetm.c.bitint_type_info (TYPE_PRECISION (type), &info); > + gcc_assert (ok); > + > + if (!info.extended) > + return mode; > + } > +
Having tons of case ...: followed by if is wasteful. Instead, please do: { case BITINT_TYPE: if (TYPE_MODE (type) == BLKmode) return mode; struct bitint_info info; bool ok; ok = targetm.c.bitint_type_info (TYPE_PRECISION (type), &info); gcc_assert (ok); if (!info.extended) return mode; /* FALLTHRU */ case INTEGER_TYPE: case ENUMERAL_TYPE: case BOOLEAN_TYPE: case REAL_TYPE: case OFFSET_TYPE: case FIXED_POINT_TYPE: case POINTER_TYPE: case REFERENCE_TYPE: return targetm.calls.promote_function_mode (type, mode, punsignedp, funtype, for_return); > @@ -895,6 +909,21 @@ promote_mode (const_tree type ATTRIBUTE_UNUSED, > machine_mode mode, > { > case INTEGER_TYPE: case ENUMERAL_TYPE: case BOOLEAN_TYPE: > case REAL_TYPE: case OFFSET_TYPE: case FIXED_POINT_TYPE: > + case BITINT_TYPE: > + /* Handle _BitInt(N) that does not require promotion. */ > + if (code == BITINT_TYPE) > + { > + if (TYPE_MODE (type) == BLKmode) > + return mode; > + > + struct bitint_info info; > + bool ok = targetm.c.bitint_type_info (TYPE_PRECISION (type), &info); > + gcc_assert (ok); > + > + if (!info.extended) > + return mode; > + } > + > /* Values of these types always have scalar mode. */ > smode = as_a <scalar_mode> (mode); > PROMOTE_MODE (smode, unsignedp, type); And here similarly. Jakub