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];
> > 

Reply via email to