On Wed, 17 Jan 2024, Jakub Jelinek wrote: > Hi! > > WHen a VLA is created with some very high precision size expression > (say __int128, or _BitInt(65535) etc.), we cast it to sizetype, because > we can't have arrays longer than what can be expressed in sizetype. > > But the maybe_check_access_sizes code when trying to determine ranges > wasn't doing this but was using fixed buffers for the sizes. While > __int128 could still be handled (fit into the buffers), obviously > arbitrary _BitInt parameter ranges can't, they can be in the range of > up to almost 20KB per number. It doesn't make sense to print such > ranges though, no array can be larger than sizetype precision, and > ranger's range_of_expr can handle NOP_EXPRs/CONVERT_EXPRs wrapping a > PARM_DECL just fine, so the following patch just casts the excessively > large counters for the range determination purposes to sizetype. > > Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?
OK > 2024-01-17 Jakub Jelinek <ja...@redhat.com> > > PR middle-end/113410 > * gimple-ssa-warn-access.cc (pass_waccess::maybe_check_access_sizes): > If access_nelts is integral with larger precision than sizetype, > fold_convert it to sizetype. > > * gcc.dg/bitint-72.c: New test. > > --- gcc/gimple-ssa-warn-access.cc.jj 2024-01-03 11:51:30.087751231 +0100 > +++ gcc/gimple-ssa-warn-access.cc 2024-01-16 19:25:35.408958088 +0100 > @@ -3406,6 +3406,15 @@ pass_waccess::maybe_check_access_sizes ( > else > access_nelts = rwm->get (sizidx)->size; > > + /* If access_nelts is e.g. a PARM_DECL with larger precision than > + sizetype, such as __int128 or _BitInt(34123) parameters, > + cast it to sizetype. */ > + if (access_nelts > + && INTEGRAL_TYPE_P (TREE_TYPE (access_nelts)) > + && (TYPE_PRECISION (TREE_TYPE (access_nelts)) > + > TYPE_PRECISION (sizetype))) > + access_nelts = fold_convert (sizetype, access_nelts); > + > /* Format the value or range to avoid an explosion of messages. */ > char sizstr[80]; > tree sizrng[2] = { size_zero_node, build_all_ones_cst (sizetype) }; > --- gcc/testsuite/gcc.dg/bitint-72.c.jj 2024-01-16 19:31:33.839938120 > +0100 > +++ gcc/testsuite/gcc.dg/bitint-72.c 2024-01-16 19:31:06.000328741 +0100 > @@ -0,0 +1,16 @@ > +/* PR middle-end/113410 */ > +/* { dg-do compile { target bitint } } */ > +/* { dg-options "-std=c23" } */ > + > +#if __BITINT_MAXWIDTH__ >= 905 > +void bar (_BitInt(905) n, int[n]); > +#else > +void bar (int n, int[n]); > +#endif > + > +void > +foo (int n) > +{ > + int buf[n]; > + bar (n, buf); > +} > > 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)