On Mon, Jan 12, 2026 at 10:13 AM Robin Dapp <[email protected]> wrote:
>
> Hi,
>
> Currently we allow vector types in scalar conditional reductions by
> accident (via the GNU vector extension).  This patch prevents that.
>
> Bootstrapped and regtested on x86, power10, and aarch64.
> Regtested on riscv64.

OK

> Regards
>  Robin
>
>         PR tree-optimization/123301
>
> gcc/ChangeLog:
>
>         * tree-if-conv.cc (convert_scalar_cond_reduction):
>         Disallow vector types.
>
> gcc/testsuite/ChangeLog:
>
>         * gcc.target/riscv/rvv/autovec/pr123301.c: New test.
> ---
>  .../gcc.target/riscv/rvv/autovec/pr123301.c   | 45 +++++++++++++++++++
>  gcc/tree-if-conv.cc                           |  1 +
>  2 files changed, 46 insertions(+)
>  create mode 100644 gcc/testsuite/gcc.target/riscv/rvv/autovec/pr123301.c
>
> diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/pr123301.c 
> b/gcc/testsuite/gcc.target/riscv/rvv/autovec/pr123301.c
> new file mode 100644
> index 00000000000..db4b8a43ac1
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/pr123301.c
> @@ -0,0 +1,45 @@
> +/* { dg-do compile } */
> +/* { dg-options "-O3 -march=rv64gcv -mabi=lp64d" } */
> +
> +#define BS_VEC(type, num) type __attribute__((vector_size(num * 
> sizeof(type))))
> +#define BITCAST(T, F, arg)                                                   
>   \
> +    ((union {                                                                
>   \
> +        F src;                                                               
>   \
> +        T dst;                                                               
>   \
> +    })arg)                                                                   
>   \
> +        .dst
> +#include <riscv_bitmanip.h>
> +BS_VEC(uint64_t, 2)
> +backsmith_snippet_423(BS_VEC(int16_t, 2), BS_VEC(int32_t, 8), uint8_t)
> +{}
> +uint32_t backsmith_pure_1(BS_VEC(uint32_t, 2) BS_ARG_2, int8_t BS_ARG_3)
> +{
> +    BS_VEC(uint64_t, 4) BS_VAR_0;
> +    int32_t BS_VAR_4;
> +    uint64_t BS_TEMP_105 = 8;
> +    for (uint64_t BS_INC_0 = 0; BS_INC_0 < BS_TEMP_105; BS_INC_0 += 1)
> +        if (BS_ARG_2[1])
> +        {
> +            BS_VAR_4 = BS_INC_0;
> +            BS_VEC(uint32_t, 2)
> +            BS_TEMP_107 = __builtin_convertvector(
> +                (BS_VEC(int32_t, 2)){ BS_VAR_4, BS_VAR_4 },
> +                BS_VEC(uint32_t, 2));
> +            BS_VEC(uint32_t, 2)
> +            BS_TEMP_108 = __builtin_convertvector(
> +                (BS_VEC(int8_t, 2)){ BS_ARG_3 }, BS_VEC(uint32_t, 2));
> +            if (BITCAST(uint64_t, BS_VEC(uint32_t, 2),
> +                        ((BS_VEC(uint32_t, 2)){
> +                            BS_TEMP_107[0] ? BS_TEMP_108[0] : 0,
> +                            BS_TEMP_107[1] ? BS_TEMP_108[1] : 0 }))
> +                < backsmith_snippet_423(
> +                    __builtin_convertvector((BS_VEC(uint64_t, 2)){},
> +                                            BS_VEC(int16_t, 2)),
> +                    (BS_VEC(int32_t, 8)){}, 0)[1])
> +                BS_VAR_0 |= __builtin_convertvector(
> +                    (BS_VEC(int32_t, 4)){ BS_VAR_4 }, BS_VEC(uint64_t, 4));
> +        }
> +    if (BS_VAR_0[0])
> +        for (;;)
> +            ;
> +}
> diff --git a/gcc/tree-if-conv.cc b/gcc/tree-if-conv.cc
> index c8f7b8453d8..51fbcc128c6 100644
> --- a/gcc/tree-if-conv.cc
> +++ b/gcc/tree-if-conv.cc
> @@ -1993,6 +1993,7 @@ convert_scalar_cond_reduction (gimple *reduc, 
> gimple_stmt_iterator *gsi,
>    ifn = get_conditional_internal_fn (reduction_op);
>    if (loop_versioned && ifn != IFN_LAST
>        && vectorized_internal_fn_supported_p (ifn, TREE_TYPE (lhs))
> +      && !VECTOR_TYPE_P (TREE_TYPE (lhs))
>        && !swap)
>      {
>        gcall *cond_call = gimple_build_call_internal (ifn, 4,
> --
> 2.52.0
>
>

Reply via email to