From: Artemiy Volkov Date: Mon, 27 Oct 2025 14:47:31 +0000 (+0000) Subject: match.pd: simplify (view_convert (BIT_FIELD_REF)) X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=r16-4682-g5eafa8d16be873;p=thirdparty%2Fgcc.git match.pd: simplify (view_convert (BIT_FIELD_REF)) This patch adds a match.pd transformation to strip unnecessary view_converts of BIT_FIELD_REFs. This is only valid when the type of the view_convert is a register type, and no loss of precision is involved when casting to an integer type; both of these conditions are checked for in the if clause of the new pattern. The change survives bootstrap + regtest on aarch64 and x86_64, and one additional test case has been added to gcc.dg/tree-ssa. Changes since v1: - Require is_gimple_reg_type (type) and remove conditions on @0 - Reword the commit message to reflect code changes gcc/ChangeLog: * match.pd: Add pattern to simplify view_convert (BIT_FIELD_REF). gcc/testsuite/ChangeLog: * gcc.dg/tree-ssa/forwprop-42.c: New test. --- diff --git a/gcc/match.pd b/gcc/match.pd index eff70ad9bb4..00493d6ad99 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 00000000000..5785e51c089 --- /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" } } */