aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/match.pd8
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/forwprop-42.c12
2 files changed, 20 insertions, 0 deletions
diff --git a/gcc/match.pd b/gcc/match.pd
index eff70ad..00493d6 100644
--- a/gcc/match.pd
+++ b/gcc/match.pd
@@ -5656,6 +5656,14 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
(view_convert (view_convert @0))
(view_convert @0))
+/* Squash view_converts of BFRs if no precision is lost. */
+(simplify
+ (view_convert (BIT_FIELD_REF @1 @2 @3))
+ (if (is_gimple_reg_type (type)
+ && (!INTEGRAL_TYPE_P (type)
+ || type_has_mode_precision_p (type)))
+ (BIT_FIELD_REF:type @1 @2 @3)))
+
/* For integral conversions with the same precision or pointer
conversions use a NOP_EXPR instead. */
(simplify
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/forwprop-42.c b/gcc/testsuite/gcc.dg/tree-ssa/forwprop-42.c
new file mode 100644
index 0000000..5785e51
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/tree-ssa/forwprop-42.c
@@ -0,0 +1,12 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -fdump-tree-forwprop1" } */
+
+typedef unsigned int vec2 __attribute__ ((vector_size (2 * sizeof (unsigned int))));
+typedef unsigned int vec1 __attribute__ ((vector_size (sizeof (unsigned int))));
+
+vec1 foo (vec2 x)
+{
+ return (vec1) x[1];
+}
+
+/* { dg-final { scan-tree-dump-not "VIEW_CONVERT_EXPR" "forwprop1" } } */