On Sun, Jul 19, 2026 at 11:32 PM Torbjörn Svensson via Sourceware
Forge <[email protected]> wrote:
>
> From: Torbjörn SVENSSON <[email protected]>
>
> Fold `(x == CST) ? x : CST` and `(x != CST) ? CST : x` to `CST` for
> integral scalar and vector types. This catches cases where earlier
> folding has converted bitwise mask expressions into conditional selects,
> including ARM MVE predicate-to-vector mask forms.
>
>         PR tree-optimization/124663
>
> gcc/ChangeLog:
>
>         * match.pd: Fold constant conditional selects.

Ok.

>
> gcc/testsuite/ChangeLog:
>
>         * g++.dg/tree-ssa/pr124663.C: New test.
>
> Signed-off-by: Torbjörn SVENSSON <[email protected]>
> ---
>  gcc/match.pd                             | 16 +++++++++++++++-
>  gcc/testsuite/g++.dg/tree-ssa/pr124663.C | 13 +++++++++++++
>  2 files changed, 28 insertions(+), 1 deletion(-)
>  create mode 100644 gcc/testsuite/g++.dg/tree-ssa/pr124663.C
>
> diff --git a/gcc/match.pd b/gcc/match.pd
> index b3738fdde1da..df9689131b65 100644
> --- a/gcc/match.pd
> +++ b/gcc/match.pd
> @@ -7119,7 +7119,21 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
>    /* For CONDs, don't handle signed values here. */
>    (if (cnd == VEC_COND_EXPR
>         || TYPE_UNSIGNED (TREE_TYPE (@0)))
> -   (cnd @0 @2 @1))))
> +   (cnd @0 @2 @1)))
> +
> + /* A == CST ? A : CST -> CST.  */
> + (simplify
> +  (cnd (eq @0 CONSTANT_CLASS_P@1) (nop_convert? @0) CONSTANT_CLASS_P@2)
> +  (if (ANY_INTEGRAL_TYPE_P (type)
> +       && operand_equal_p (@1, @2))
> +   (convert @1)))
> +
> + /* A != CST ? CST : A -> CST.  */
> + (simplify
> +  (cnd (ne @0 CONSTANT_CLASS_P@1) CONSTANT_CLASS_P@2 (nop_convert? @0))
> +  (if (ANY_INTEGRAL_TYPE_P (type)
> +       && operand_equal_p (@1, @2))
> +   (convert @1))))
>
>  /* abs/negative simplifications moved from fold_cond_expr_with_comparison.
>
> diff --git a/gcc/testsuite/g++.dg/tree-ssa/pr124663.C 
> b/gcc/testsuite/g++.dg/tree-ssa/pr124663.C
> new file mode 100644
> index 000000000000..dfd12debff95
> --- /dev/null
> +++ b/gcc/testsuite/g++.dg/tree-ssa/pr124663.C
> @@ -0,0 +1,13 @@
> +// PR c++/124663
> +// { dg-do compile }
> +// { dg-options "-O2 -fdump-tree-forwprop3-raw" }
> +
> +#define vector __attribute__((vector_size(4*sizeof(int))))
> +void f(vector int *a)
> +{
> +  vector int cst = {1,2,3,4};
> +  vector int t = (*a == cst);
> +  *a = (t ? *a : cst);
> +}
> +
> +// { dg-final { scan-tree-dump-not "_expr" "forwprop3" } }
> --
> 2.54.0
>

Reply via email to