From: Robin Dapp Date: Tue, 9 Dec 2025 12:07:36 +0000 (+0100) Subject: vect: Reset using_select_vl_p before starting over [PR123074]. X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=87b1ac612af1447b508354a5ffa2e6b9344044c4;p=thirdparty%2Fgcc.git vect: Reset using_select_vl_p before starting over [PR123074]. In the PR we ICE accessing the loop lens in vect_get_loop_variant_data_ptr_increment when building 510.parest. This function only gets called when we use SELECT_VL for the loop control, however during initialization of the loop lens partial vectors, a prerequisite for SELECT_VL, was false while using_select_vl was true. We reset using_partial_vectors when restarting the analysis after forcing single-lane SLP but don't reset using_select_vl. This patch resets it as well. PR tree-optimization/123074 gcc/ChangeLog: * tree-vect-loop.cc: Reset LOOP_VINFO_USING_SELECT_VL_P. gcc/testsuite/ChangeLog: * gcc.target/riscv/rvv/rvv.exp: Include *.C. * gcc.target/riscv/rvv/autovec/pr123074.C: New test. --- diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/pr123074.C b/gcc/testsuite/gcc.target/riscv/rvv/autovec/pr123074.C new file mode 100644 index 00000000000..d203477c301 --- /dev/null +++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/pr123074.C @@ -0,0 +1,124 @@ +/* { dg-do compile } */ +/* { dg-options "-O3 -march=rv64gcv_zvl256b -mabi=lp64d -mrvv-vector-bits=zvl -mrvv-max-lmul=m2 -fpermissive -Wno-return-type" } */ + +namespace std { +template _Iterator __miter_base(_Iterator); +template class> +struct __detector { + using type = _Default; +}; +template class _Op> +using __detected_or = __detector<_Default, void, _Op>; +template class _Op> +using __detected_or_t = typename __detected_or<_Default, _Op>::type; +template class allocator { +public: + typedef _Tp value_type; +}; +template struct pointer_traits { + template using rebind = _Up *; +}; +} // namespace std +namespace __gnu_cxx { +template class __normal_iterator { +public: + _Iterator base(); +}; +} // namespace __gnu_cxx +namespace std { +template +void __assign_one(_OutIter __out, _InIter __in) { + *__out = *__in; +} +template +__copy_move_backward_a2(_BI1 __first, _BI1 __last, _BI2 __result) { /* { dg-warning "with no type" "" } */ + while (__first != __last) { + --__last; + --__result; + __assign_one<_IsMove>(__result, __last); + } +} +template +__copy_move_backward_a1(_BI1 __first, _BI1 __last, _BI2 __result) { /* { dg-warning "with no type" "" } */ + __copy_move_backward_a2<_IsMove>(__first, __last, __result); +} +template +__copy_move_backward_a(_II __first, _II __last, _OI __result) { /* { dg-warning "with no type" "" } */ + __copy_move_backward_a1<_IsMove>(__first, __last, __result); +} +template +move_backward(_BI1 __first, _BI1 __last, _BI2 __result) { /* { dg-warning "with no type" "" } */ + __copy_move_backward_a(__first, __miter_base(__last), __result); +} +struct __allocator_traits_base { + template using __pointer = typename _Tp::pointer; + template using __c_pointer = typename _Tp::const_pointer; +}; +template struct allocator_traits : __allocator_traits_base { + typedef typename _Alloc::value_type value_type; + using pointer = __detected_or_t; + template