On Fri, 19 Jan 2024, Jakub Jelinek wrote: > Hi! > > sccvn uses GET_MODE_SIZE (SCALAR_INT_TYPE_MODE (type)) for INTEGER_TYPEs, > most likely because that is what native_{interpret,encode}_int used. > This obviously doesn't work for larger BITINT_TYPEs which have BLKmode > and the above ICEs on those. native_{interpret,encode}_int checks whether > the BITINT_TYPE is medium/large/huge (i.e. an array of 2+ ABI limbs) > and uses TYPE_SIZE_UNIT for that case, otherwise SCALAR_INT_TYPE_MODE like > for the INTEGER_TYPE case. > > The following patch instead just uses SCALAR_INT_TYPE_MODE for non-BLKmode > TYPE_MODE and TYPE_SIZE_UNIT otherwise. > > Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?
OK. Thanks, Richard. > 2024-01-19 Jakub Jelinek <ja...@redhat.com> > > PR tree-optimization/113459 > * tree-ssa-sccvn.cc (vn_walk_cb_data::push_partial_def): Use > TREE_INT_CST_LOW of TYPE_SIZE_UNIT rather than GET_MODE_SIZE > of SCALAR_INT_TYPE_MODE if type has BLKmode. > (vn_reference_lookup_3): Likewise. Formatting fix. > > * gcc.dg/bitint-73.c: New test. > > --- gcc/tree-ssa-sccvn.cc.jj 2024-01-03 11:51:42.361580881 +0100 > +++ gcc/tree-ssa-sccvn.cc 2024-01-18 12:39:52.789606975 +0100 > @@ -2287,7 +2287,12 @@ vn_walk_cb_data::push_partial_def (pd_da > BITS_PER_UNIT > - (maxsizei % BITS_PER_UNIT)); > if (INTEGRAL_TYPE_P (type)) > - sz = GET_MODE_SIZE (SCALAR_INT_TYPE_MODE (type)); > + { > + if (TYPE_MODE (type) != BLKmode) > + sz = GET_MODE_SIZE (SCALAR_INT_TYPE_MODE (type)); > + else > + sz = TREE_INT_CST_LOW (TYPE_SIZE_UNIT (type)); > + } > if (sz > needed_len) > { > memcpy (this_buffer + (sz - needed_len), buffer, needed_len); > @@ -2967,8 +2972,10 @@ vn_reference_lookup_3 (ao_ref *ref, tree > } > else > { > - unsigned buflen = TREE_INT_CST_LOW (TYPE_SIZE_UNIT (vr->type)) + > 1; > - if (INTEGRAL_TYPE_P (vr->type)) > + unsigned buflen > + = TREE_INT_CST_LOW (TYPE_SIZE_UNIT (vr->type)) + 1; > + if (INTEGRAL_TYPE_P (vr->type) > + && TYPE_MODE (vr->type) != BLKmode) > buflen = GET_MODE_SIZE (SCALAR_INT_TYPE_MODE (vr->type)) + 1; > unsigned char *buf = XALLOCAVEC (unsigned char, buflen); > memset (buf, TREE_INT_CST_LOW (gimple_call_arg (def_stmt, 1)), > @@ -3165,7 +3172,12 @@ vn_reference_lookup_3 (ao_ref *ref, tree > offset + maxsize - 1. */ > HOST_WIDE_INT sz = maxsizei / BITS_PER_UNIT; > if (INTEGRAL_TYPE_P (type)) > - sz = GET_MODE_SIZE (SCALAR_INT_TYPE_MODE (type)); > + { > + if (TYPE_MODE (type) != BLKmode) > + sz = GET_MODE_SIZE (SCALAR_INT_TYPE_MODE (type)); > + else > + sz = TREE_INT_CST_LOW (TYPE_SIZE_UNIT (type)); > + } > amnt = ((unsigned HOST_WIDE_INT) offset2i + size2i > - offseti - maxsizei) % BITS_PER_UNIT; > if (amnt) > --- gcc/testsuite/gcc.dg/bitint-73.c.jj 2024-01-18 12:29:07.586634031 > +0100 > +++ gcc/testsuite/gcc.dg/bitint-73.c 2024-01-18 12:28:42.406986342 +0100 > @@ -0,0 +1,18 @@ > +/* PR tree-optimization/113459 */ > +/* { dg-do compile { target bitint } } */ > +/* { dg-options "-std=c23 -O2" } */ > + > +#if __BITINT_MAXWIDTH__ >= 129 > +# define N 129 > +#else > +# define N 63 > +#endif > + > +_BitInt(N) a; > + > +_BitInt(N) > +foo (void) > +{ > + __builtin_memset (&a, 6, sizeof a); > + return a; > +} > > 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)