On Thu, 17 Jul 2025, Jakub Jelinek wrote: > Hi! > > The following testcase ICEs because SCALAR_INT_TYPE_MODE of course > doesn't work for large BITINT_TYPE types which have BLKmode. > native_encode* as well as e.g. r14-8276 use in cases like these > GET_MODE_SIZE (SCALAR_INT_TYPE_MODE ()) and TREE_INT_CST_LOW (TYPE_SIZE_UNIT > ()) for the BLKmode ones. > In this case, it wants bits rather than bytes, so I've used > GET_MODE_BITSIZE like before and TYPE_SIZE otherwise. > > Furthermore, the patch only computes encoding_size for big endian > targets, for little endian we don't really adjust anything, so there > is no point computing it. > > Bootstrapped/regtested on x86_64-linux and i686-linux, ok for > trunk/15.2/14.4?
OK. Thanks, Richard. > 2025-07-17 Jakub Jelinek <ja...@redhat.com> > > PR tree-optimization/121131 > * gimple-fold.cc (fold_nonarray_ctor_reference): Use > TREE_INT_CST_LOW (TYPE_SIZE ()) instead of > GET_MODE_BITSIZE (SCALAR_INT_TYPE_MODE ()) for BLKmode BITINT_TYPEs. > Don't compute encoding_size at all for little endian targets. > > * gcc.dg/bitint-124.c: New test. > > --- gcc/gimple-fold.cc.jj 2025-06-30 10:59:37.553460624 +0200 > +++ gcc/gimple-fold.cc 2025-07-17 16:09:34.993333798 +0200 > @@ -9916,10 +9916,17 @@ fold_nonarray_ctor_reference (tree type, > { > if (BYTES_BIG_ENDIAN != WORDS_BIG_ENDIAN) > return NULL_TREE; > - const unsigned int encoding_size > - = GET_MODE_BITSIZE (SCALAR_INT_TYPE_MODE (TREE_TYPE (cfield))); > if (BYTES_BIG_ENDIAN) > - inner_offset += encoding_size - wi::to_offset (field_size); > + { > + tree ctype = TREE_TYPE (cfield); > + unsigned int encoding_size; > + if (TYPE_MODE (ctype) != BLKmode) > + encoding_size > + = GET_MODE_BITSIZE (SCALAR_INT_TYPE_MODE (ctype)); > + else > + encoding_size = TREE_INT_CST_LOW (TYPE_SIZE (ctype)); > + inner_offset += encoding_size - wi::to_offset (field_size); > + } > } > > return fold_ctor_reference (type, cval, > --- gcc/testsuite/gcc.dg/bitint-124.c.jj 2025-07-17 16:17:52.412798465 > +0200 > +++ gcc/testsuite/gcc.dg/bitint-124.c 2025-07-17 16:21:03.803284269 +0200 > @@ -0,0 +1,30 @@ > +/* PR tree-optimization/121131 */ > +/* { dg-do run { target bitint } } */ > +/* { dg-options "-O2" } */ > + > +#if __BITINT_MAXWIDTH__ >= 156 > +struct A { _BitInt(156) b : 135; }; > + > +static inline _BitInt(156) > +foo (struct A *x) > +{ > + return x[1].b; > +} > + > +__attribute__((noipa)) _BitInt(156) > +bar (void) > +{ > + struct A a[] = { 1, 1, -13055525270329736316393717310914023773847wb, > + 1, 1, 1, 1, 1, 1, 1, 1, 1 }; > + return foo (&a[1]); > +} > +#endif > + > +int > +main () > +{ > +#if __BITINT_MAXWIDTH__ >= 156 > + if (bar () != -13055525270329736316393717310914023773847wb) > + __builtin_abort (); > +#endif > +} > > Jakub > > -- Richard Biener <rguent...@suse.de> SUSE Software Solutions Germany GmbH, Frankenstrasse 146, 90461 Nuernberg, Germany; GF: Ivo Totev, Andrew McDonald, Werner Knoblich; (HRB 36809, AG Nuernberg)