https://gcc.gnu.org/g:0616834fef6dd7c3e5f81909368f30aa27a5f815
commit r16-6741-g0616834fef6dd7c3e5f81909368f30aa27a5f815 Author: Robin Dapp <[email protected]> Date: Fri Jan 9 21:57:49 2026 +0100 if-conv: Prevent vector types in scalar cond reduction [PR123301]. Currently we allow vector types in scalar conditional reductions by accident (via the GNU vector extension). This patch prevents that. 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. Diff: --- .../gcc.target/riscv/rvv/autovec/pr123301.c | 45 ++++++++++++++++++++++ gcc/tree-if-conv.cc | 1 + 2 files changed, 46 insertions(+) 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 000000000000..db4b8a43ac12 --- /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 c8f7b8453d85..51fbcc128c67 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,
