> Am 14.12.2024 um 09:26 schrieb Jakub Jelinek <ja...@redhat.com>:
>
> Hi!
>
> The BIT_FIELD_REF verifier has:
> if (INTEGRAL_TYPE_P (TREE_TYPE (op))
> && !type_has_mode_precision_p (TREE_TYPE (op)))
> {
> error ("%qs of non-mode-precision operand", code_name);
> return true;
> }
> check among other things, so one can't extract something out of say
> _BitInt(63) or _BitInt(4096).
> The new ifcombine optimization happily creates such BIT_FIELD_REFs
> and ICEs during their verification.
>
> The following patch fixes that by rejecting those in decode_field_reference.
>
> Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?
Ok
Richard
> 2024-12-14 Jakub Jelinek <ja...@redhat.com>
>
> PR tree-optimization/118023
> * gimple-fold.cc (decode_field_reference): Return NULL_TREE if
> inner has non-type_has_mode_precision_p integral type.
>
> * gcc.dg/bitint-119.c: New test.
>
> --- gcc/gimple-fold.cc.jj 2024-12-12 19:46:59.000000000 +0100
> +++ gcc/gimple-fold.cc 2024-12-13 14:50:16.575652767 +0100
> @@ -7643,7 +7643,9 @@ decode_field_reference (tree *pexp, HOST
> /* Reject out-of-bound accesses (PR79731). */
> || (! AGGREGATE_TYPE_P (TREE_TYPE (inner))
> && compare_tree_int (TYPE_SIZE (TREE_TYPE (inner)),
> - bp + bs) < 0))
> + bp + bs) < 0)
> + || (INTEGRAL_TYPE_P (TREE_TYPE (inner))
> + && !type_has_mode_precision_p (TREE_TYPE (inner))))
> return NULL_TREE;
>
> *pbitsize = bs;
> --- gcc/testsuite/gcc.dg/bitint-119.c.jj 2024-12-13 15:44:22.507548292
> +0100
> +++ gcc/testsuite/gcc.dg/bitint-119.c 2024-12-13 15:43:44.608086854 +0100
> @@ -0,0 +1,11 @@
> +/* PR tree-optimization/118023 */
> +/* { dg-do compile { target bitint } } */
> +/* { dg-options "-O2" } */
> +
> +_BitInt(63) b;
> +
> +int
> +foo (void)
> +{
> + return !*(_Complex char *) &b;
> +}
>
> Jakub
>