https://gcc.gnu.org/g:15e483f98bc4b8c65dd99bd7810029f1abf30b4b

commit r16-8895-g15e483f98bc4b8c65dd99bd7810029f1abf30b4b
Author: Artemiy Volkov <[email protected]>
Date:   Tue May 12 08:21:53 2026 +0000

    match.pd: rearrange (VCE (BFR)) simplification conditions [PR125259]
    
    The precondition for (view_convert (BIT_FIELD_REF)) simplification at
    match.pd:5881 last fixed in r16-4735-g44c27171c36a91 is still wrong,
    as it allows a vector type to be converted to/from _BitInt types (for
    which precision can be smaller than size).  Address this by always
    checking type_has_mode_precision_p () for all integer types.  (This fix
    was posted by Richard B. at
    https://gcc.gnu.org/bugzilla/show_bug.cgi?id=125259#c5.)
    
    Add a testcase as reduced in the PR as tree-ssa/pr125259.c.
    
    Bootstrapped and regtested on aarch64, arm, and x86_64.
    
    OK for trunk and 16?
    
            PR middle-end/125259
    
    gcc/ChangeLog:
    
            * match.pd: Fix the view_convert (BIT_FIELD_REF) pattern.
    
    gcc/testsuite/ChangeLog:
    
            * gcc.dg/tree-ssa/pr125259.c: New test.
    
    (cherry picked from commit c0e9c7415cf368b4bf852919725c8ba590a615c2)

Diff:
---
 gcc/match.pd                             |  6 +++---
 gcc/testsuite/gcc.dg/tree-ssa/pr125259.c | 14 ++++++++++++++
 2 files changed, 17 insertions(+), 3 deletions(-)

diff --git a/gcc/match.pd b/gcc/match.pd
index 7b652afb43de..12054c6bcc53 100644
--- a/gcc/match.pd
+++ b/gcc/match.pd
@@ -5734,9 +5734,9 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
   (view_convert (BIT_FIELD_REF@0 @1 @2 @3))
   (if (is_gimple_reg_type (type)
        && (!INTEGRAL_TYPE_P (type)
-          || !INTEGRAL_TYPE_P (TREE_TYPE (@0))
-          || (type_has_mode_precision_p (type)
-              && type_has_mode_precision_p (TREE_TYPE (@0)))))
+          || type_has_mode_precision_p (type))
+       && (!INTEGRAL_TYPE_P (TREE_TYPE (@0))
+          || type_has_mode_precision_p (TREE_TYPE (@0))))
    (BIT_FIELD_REF:type @1 @2 @3)))
 
 /* For integral conversions with the same precision or pointer
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr125259.c 
b/gcc/testsuite/gcc.dg/tree-ssa/pr125259.c
new file mode 100644
index 000000000000..f9596b798ae9
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/tree-ssa/pr125259.c
@@ -0,0 +1,14 @@
+/* { dg-do compile { target bitint } } */
+/* { dg-options "-O2 -fdump-tree-forwprop1" } */
+
+typedef __attribute__((__vector_size__(4))) char V4;
+typedef __attribute__((__vector_size__(8))) char V8;
+
+_BitInt(17) foo(V8 *xx)
+{
+       V8 x = *xx;
+       V4 v = *(V4 *)&x;
+       return *(_BitInt(17) *)&v;
+}
+
+/* { dg-final { scan-tree-dump "VIEW_CONVERT_EXPR" "forwprop1" } } */

Reply via email to