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" } } */
