On Tue, 5 Jul 2022, Tamar Christina wrote:

> Hi All,
> 
> My previous patch can cause a problem if the pattern matches after veclower
> as it may replace the construct with a vector sequence which the target may 
> not
> directly support.
> 
> As such don't perform the rewriting if after veclower.

Note that when doing the rewriting before veclower to a variant
not supported by the target can cause veclower to generate absymal
code.  In some cases we are very careful and try to at least preserve
code supported by the target over transforming that into a variant
not supported.

That said, a better fix would be to check whether the target
can perform the new comparison.  Before veclower it would be
OK to do the transform nevertheless in case it cannot do the
original transform.

Richard.

> Bootstrapped Regtested on aarch64-none-linux-gnu, x86_64-pc-linux-gnu
> and no issues.
> 
> Ok for master? and backport to GCC 12?
> 
> Thanks,
> Tamar
> 
> 
> gcc/ChangeLog:
> 
>       PR tree-optimization/106063
>       * match.pd: Do not apply pattern after veclower.
> 
> gcc/testsuite/ChangeLog:
> 
>       PR tree-optimization/106063
>       * gcc.dg/pr106063.c: New test.
> 
> --- inline copy of patch -- 
> diff --git a/gcc/match.pd b/gcc/match.pd
> index 
> 40c09bedadb89dabb6622559a8f69df5384e61fd..ba161892a98756c0278dc40fc377d7d0deaacbcf
>  100644
> --- a/gcc/match.pd
> +++ b/gcc/match.pd
> @@ -6040,7 +6040,8 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
>    (simplify
>     (cmp (bit_and:c@2 @0 cst@1) integer_zerop)
>      (with { tree csts = bitmask_inv_cst_vector_p (@1); }
> -     (if (csts && (VECTOR_TYPE_P (TREE_TYPE (@1)) || single_use (@2)))
> +     (if (csts && (VECTOR_TYPE_P (TREE_TYPE (@1)) || single_use (@2))
> +       && optimize_vectors_before_lowering_p ())
>        (if (TYPE_UNSIGNED (TREE_TYPE (@1)))
>         (icmp @0 { csts; })
>         (with { tree utype = unsigned_type_for (TREE_TYPE (@1)); }
> diff --git a/gcc/testsuite/gcc.dg/pr106063.c b/gcc/testsuite/gcc.dg/pr106063.c
> new file mode 100644
> index 
> 0000000000000000000000000000000000000000..b23596724f6bb98c53af2dce77d31509bab10378
> --- /dev/null
> +++ b/gcc/testsuite/gcc.dg/pr106063.c
> @@ -0,0 +1,9 @@
> +/* { dg-do compile } */
> +/* { dg-options "-O2 -fno-tree-forwprop --disable-tree-evrp" } */
> +typedef __int128 __attribute__((__vector_size__ (16))) V;
> +
> +V
> +foo (V v)
> +{
> +  return (v & (V){15}) == v;
> +}
> 
> 
> 
> 
> 

-- 
Richard Biener <rguent...@suse.de>
SUSE Software Solutions Germany GmbH, Frankenstra

Reply via email to