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?
2024-12-14 Jakub Jelinek <[email protected]>
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