[committed] match.pd: Relax rule to include POLY_INT_CSTs

Richard Biener richard.guenther@gmail.com
Thu Jul 8 12:17:58 GMT 2021


On Thu, Jul 8, 2021 at 1:52 PM Richard Sandiford via Gcc-patches
<gcc-patches@gcc.gnu.org> wrote:
>
> match.pd has a rule to simplify an extension, operation and truncation
> back to the original type:
>
>  (simplify
>    (convert (op:s@0 (convert1?@3 @1) (convert2?@4 @2)))
>
> Currently it handles cases in which @2 is an INTEGER_CST, but it
> also works for POLY_INT_CSTs.[*]
>
> For INTEGER_CST it doesn't matter whether we test @2 or @4,
> but for POLY_INT_CST it is possible to have unfolded (convert …)s.

But if it is an unfolded conversion then @4 is the conversion and of
course not POLY_INT_CST_P, so I'm not sure what you says makes
sense.  But maybe you want to _not_ simplify the unfolded
conversion case?

> Originally I saw this leading to some bad ivopts decisions, because
> we weren't folding away redundancies from candidate iv expressions.
> It's also possible to test the fold directly using the SVE ACLE.
>
> Tested on aarch64-linux-gnu and x86_64-linux-gnu, pushed as obvious.
>
> Richard
>
> [*] Not all INTEGER_CST rules work for POLY_INT_CSTs, since extensions
>     don't necessarily distribute over the internals of the POLY_INT_CST.
>     But in this case that isn't an issue.
>
>
> gcc/
>         * match.pd: Simplify an extend-operate-truncate sequence involving
>         a POLY_INT_CST.
>
> gcc/testsuite/
>         * gcc.target/aarch64/sve/acle/general/cntb_1.c: New test.
> ---
>  gcc/match.pd                                       |  2 +-
>  .../gcc.target/aarch64/sve/acle/general/cntb_1.c   | 14 ++++++++++++++
>  2 files changed, 15 insertions(+), 1 deletion(-)
>  create mode 100644 gcc/testsuite/gcc.target/aarch64/sve/acle/general/cntb_1.c
>
> diff --git a/gcc/match.pd b/gcc/match.pd
> index 334e8cc0496..30680d488ab 100644
> --- a/gcc/match.pd
> +++ b/gcc/match.pd
> @@ -6175,7 +6175,7 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
>         && (types_match (@1, @2)
>             /* Or the second operand is const integer or converted const
>                integer from valueize.  */
> -           || TREE_CODE (@2) == INTEGER_CST))
> +           || poly_int_tree_p (@4)))
>       (if (TYPE_OVERFLOW_WRAPS (TREE_TYPE (@1)))
>         (op @1 (convert @2))
>         (with { tree utype = unsigned_type_for (TREE_TYPE (@1)); }
> diff --git a/gcc/testsuite/gcc.target/aarch64/sve/acle/general/cntb_1.c b/gcc/testsuite/gcc.target/aarch64/sve/acle/general/cntb_1.c
> new file mode 100644
> index 00000000000..b43fcf0ed6d
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/aarch64/sve/acle/general/cntb_1.c
> @@ -0,0 +1,14 @@
> +/* { dg-options "-O -fdump-tree-optimized" } */
> +
> +#include <arm_sve.h>
> +
> +unsigned int
> +foo (unsigned int x)
> +{
> +  unsigned long tmp = x;
> +  tmp += svcntb ();
> +  x = tmp;
> +  return x - svcntb ();
> +}
> +
> +/* { dg-final { scan-tree-dump-not { POLY_INT_CST } optimized } } */
> --
> 2.17.1
>


More information about the Gcc-patches mailing list