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.
(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
--- /dev/null
+/* { 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" } } */