https://gcc.gnu.org/g:7f4e85a954d24cc30bf85f4040fcd204bd5e23fd

commit r15-6254-g7f4e85a954d24cc30bf85f4040fcd204bd5e23fd
Author: Jakub Jelinek <ja...@redhat.com>
Date:   Sat Dec 14 11:28:25 2024 +0100

    gimple-fold: Fix the recent ifcombine optimization for _BitInt [PR118023]
    
    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.
    
    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.

Diff:
---
 gcc/gimple-fold.cc                |  4 +++-
 gcc/testsuite/gcc.dg/bitint-119.c | 11 +++++++++++
 2 files changed, 14 insertions(+), 1 deletion(-)

diff --git a/gcc/gimple-fold.cc b/gcc/gimple-fold.cc
index e1b4b65dd662..6c11654a2c65 100644
--- a/gcc/gimple-fold.cc
+++ b/gcc/gimple-fold.cc
@@ -7643,7 +7643,9 @@ decode_field_reference (tree *pexp, HOST_WIDE_INT 
*pbitsize,
       /* 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;
diff --git a/gcc/testsuite/gcc.dg/bitint-119.c 
b/gcc/testsuite/gcc.dg/bitint-119.c
new file mode 100644
index 000000000000..8283d50b3a68
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/bitint-119.c
@@ -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;
+}

Reply via email to