On Mon, 11 Sep 2023, Jakub Jelinek wrote:
> Hi!
>
> The following testcase ICEs, because vn_walk_cb_data::push_partial_def
> uses a fixed size buffer (64 target bytes) for its
> construction/deconstruction of partial stores and fails if larger precision
> than that is needed, and the PR93582 changes assert push_partial_def
> succeeds (and check the various other conditions much earlier when seeing
> the BIT_AND_EXPR statement, like CHAR_BIT == 8, BITS_PER_UNIT == 8,
> BYTES_BIG_ENDIAN == WORDS_BIG_ENDIAN, etc.). So, just removing the assert
> and allowing it fail there doesn't really work and ICEs later on.
>
> The following patch moves the bufsize out of the method and tests it
> together with the other checks.
>
> Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?
OK.
> BTW, perhaps we could increase the bufsize as well or in addition to
> increasing it make the buffer allocated using XALLOCAVEC, but still I think
> it is useful to have some upper bound and so I think this patch is useful
> even in that case.
Yeah, the size is choosen to match the largest vector mode we currently
have.
Richard.
> 2023-09-11 Jakub Jelinek
>
> PR middle-end/111338
> * tree-ssa-sccvn.cc (struct vn_walk_cb_data): Add bufsize non-static
> data member.
> (vn_walk_cb_data::push_partial_def): Remove bufsize variable.
> (visit_nary_op): Avoid the BIT_AND_EXPR with constant rhs2
> optimization if type's precision is too large for
> vn_walk_cb_data::bufsize.
>
> * gcc.dg/bitint-37.c: New test.
>
> --- gcc/tree-ssa-sccvn.cc.jj 2023-09-06 17:28:24.232977433 +0200
> +++ gcc/tree-ssa-sccvn.cc 2023-09-08 13:22:27.928158846 +0200
> @@ -1903,6 +1903,7 @@ struct vn_walk_cb_data
>alias_set_type first_base_set;
>splay_tree known_ranges;
>obstack ranges_obstack;
> + static constexpr HOST_WIDE_INT bufsize = 64;
> };
>
> vn_walk_cb_data::~vn_walk_cb_data ()
> @@ -1973,7 +1974,6 @@ vn_walk_cb_data::push_partial_def (pd_da
> HOST_WIDE_INT offseti,
> HOST_WIDE_INT maxsizei)
> {
> - const HOST_WIDE_INT bufsize = 64;
>/* We're using a fixed buffer for encoding so fail early if the object
> we want to interpret is bigger. */
>if (maxsizei > bufsize * BITS_PER_UNIT
> @@ -5414,6 +5414,7 @@ visit_nary_op (tree lhs, gassign *stmt)
> && CHAR_BIT == 8
> && BITS_PER_UNIT == 8
> && BYTES_BIG_ENDIAN == WORDS_BIG_ENDIAN
> + && TYPE_PRECISION (type) <= vn_walk_cb_data::bufsize * BITS_PER_UNIT
> && !integer_all_onesp (gimple_assign_rhs2 (stmt))
> && !integer_zerop (gimple_assign_rhs2 (stmt)))
> {
> --- gcc/testsuite/gcc.dg/bitint-37.c.jj 2023-09-08 13:27:51.676882523
> +0200
> +++ gcc/testsuite/gcc.dg/bitint-37.c 2023-09-08 13:27:22.460268614 +0200
> @@ -0,0 +1,11 @@
> +/* PR middle-end/111338 */
> +/* { dg-do compile { target bitint575 } } */
> +/* { dg-options "-O1" } */
> +
> +_BitInt(575) e;
> +
> +_BitInt(575)
> +foo (void)
> +{
> + return e & 1;
> +}
>
> Jakub
>
>
--
Richard Biener
SUSE Software Solutions Germany GmbH,
Frankenstrasse 146, 90461 Nuernberg, Germany;
GF: Ivo Totev, Andrew McDonald, Werner Knoblich; (HRB 36809, AG Nuernberg)