On Thu, 2026-09-03 at 14:08 +0200, Richard Biener wrote: > On Thu, 27 Aug 2026, Avinash Jayakar wrote: > > > The mode_unit_size array that is generated from > > emit_mode_unit_size_inline function currently hard codes the type > > of > > this array to unsigned char, since for most architectures the > > mode_unit_size never exceeded 255. > > > > For rs6000 however, we add an opaque mode with 256 bytes which > > overflows > > this type. Therefore this patch adds a macro named > > MODE_UNIT_SIZE_TYPE > > in the generated file which is defined based on the maximum value > > that > > the mode_unit_size array will hold. > > if < 256, unsigned char > > else if < 1^16, unsigned short > > else, usigned int > > LGTM, but please give others a chance to raise issues.
Sure, please do let me know in case I missed anyone in the cc. Thanks, Avinash > > Thanks, > Richard. > > > 2026-08-26 Avinash Jayakar <[email protected]> > > > > gcc/ChangeLog: > > * genmodes.cc (emit_mode_unit_size): Generate > > MODE_UNIT_SIZE_TYPE macro based > > on values in mode_unit_size. > > * machmode.h: Use the new macro. > > --- > > gcc/genmodes.cc | 20 +++++++++++++++++--- > > gcc/machmode.h | 2 +- > > 2 files changed, 18 insertions(+), 4 deletions(-) > > > > diff --git a/gcc/genmodes.cc b/gcc/genmodes.cc > > index fa5f8923519..f50d39e4ea4 100644 > > --- a/gcc/genmodes.cc > > +++ b/gcc/genmodes.cc > > @@ -1167,16 +1167,30 @@ emit_mode_unit_size_inline (void) > > int c; > > struct mode_data *m; > > > > + unsigned int max_type_size = 0; > > + for_all_modes (c, m) > > + { > > + if (max_type_size < m->bytesize) > > + max_type_size = (c != MODE_PARTIAL_INT && m->component) > > + ? m->component->bytesize : m->bytesize; > > + } > > + if (max_type_size < (1 << 8)) > > + puts ("#define MODE_UNIT_SIZE_TYPE unsigned char\n"); > > + else if (max_type_size < (1 << 16)) > > + puts ("#define MODE_UNIT_SIZE_TYPE unsigned short\n"); > > + else > > + puts ("#define MODE_UNIT_SIZE_TYPE unsigned int\n"); > > + > > puts ("\ > > #ifdef __cplusplus\n\ > > inline __attribute__((__always_inline__))\n\ > > #else\n\ > > extern __inline__ __attribute__((__always_inline__, > > __gnu_inline__))\n\ > > #endif\n\ > > -unsigned char\n\ > > +MODE_UNIT_SIZE_TYPE\n\ > > mode_unit_size_inline (machine_mode mode)\n\ > > {\n\ > > - extern CONST_MODE_UNIT_SIZE unsigned char > > mode_unit_size[NUM_MACHINE_MODES];\ > > + extern CONST_MODE_UNIT_SIZE MODE_UNIT_SIZE_TYPE > > mode_unit_size[NUM_MACHINE_MODES];\ > > \n\ > > gcc_assert (mode >= 0 && mode < NUM_MACHINE_MODES);\n\ > > switch (mode)\n\ > > @@ -1683,7 +1697,7 @@ emit_mode_unit_size (void) > > int c; > > struct mode_data *m; > > > > - print_maybe_const_decl ("%sunsigned char", "mode_unit_size", > > + print_maybe_const_decl ("%sMODE_UNIT_SIZE_TYPE", > > "mode_unit_size", > > "NUM_MACHINE_MODES", adj_bytesize); > > > > for_all_modes (c, m) > > diff --git a/gcc/machmode.h b/gcc/machmode.h > > index b92b1572d8d..468fa886910 100644 > > --- a/gcc/machmode.h > > +++ b/gcc/machmode.h > > @@ -26,7 +26,7 @@ extern CONST_MODE_SIZE poly_uint16 > > mode_size[NUM_MACHINE_MODES]; > > extern CONST_MODE_PRECISION poly_uint16 > > mode_precision[NUM_MACHINE_MODES]; > > extern const unsigned short mode_inner[NUM_MACHINE_MODES]; > > extern CONST_MODE_NUNITS poly_uint16 > > mode_nunits[NUM_MACHINE_MODES]; > > -extern CONST_MODE_UNIT_SIZE unsigned char > > mode_unit_size[NUM_MACHINE_MODES]; > > +extern CONST_MODE_UNIT_SIZE MODE_UNIT_SIZE_TYPE > > mode_unit_size[NUM_MACHINE_MODES]; > > extern const unsigned short > > mode_unit_precision[NUM_MACHINE_MODES]; > > extern const unsigned short mode_next[NUM_MACHINE_MODES]; > > extern const unsigned short mode_wider[NUM_MACHINE_MODES]; > >
