Hi, in PR116351 we try to vectorize with -march=...zve32x which does not have 64-bit vector element sizes, don't find a proper mode and end up using word_mode = DImode.
vect_verify_loop_lens calls get_len_load_store_mode which asserts VECTOR_MODE_P (vecmode) so DImode will cause an ICE. In check_load_store_for_partial_vectors we disable partial vectors when emulating vectors so this patch does the same in tree-vect-loop.cc before vect_verify_loop_lens is called. Is this the correct thing to do or should we have taken another turn somewhere else? Bootstrapped and regtested on x86, aarch64, and power10. Regtested on rv64gcv_zvl512b. Regards Robin PR target/116351 gcc/ChangeLog: * tree-vect-loop.cc: Disable partial vectors for emulated vectors. gcc/testsuite/ChangeLog: * gcc.target/riscv/rvv/autovec/pr116351.c: New test. --- .../gcc.target/riscv/rvv/autovec/pr116351.c | 15 +++++++++++++++ gcc/tree-vect-loop.cc | 10 ++++++++++ 2 files changed, 25 insertions(+) create mode 100644 gcc/testsuite/gcc.target/riscv/rvv/autovec/pr116351.c diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/pr116351.c b/gcc/testsuite/gcc.target/riscv/rvv/autovec/pr116351.c new file mode 100644 index 00000000000..ed1b985d8fa --- /dev/null +++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/pr116351.c @@ -0,0 +1,15 @@ +/* { dg-do compile } */ +/* { dg-options "-O3 -march=rv64imd_zve32x -mrvv-vector-bits=zvl" } */ + +int a, b, c; +short d, e, f; +long (g) (long h) { return h; } + +void i () +{ + for (; b; ++b) + { + f = 5 >> a ? d : d << a; + e &= c | g (f); + } +} diff --git a/gcc/tree-vect-loop.cc b/gcc/tree-vect-loop.cc index 4f401cd2d0c..2cf5a05b70c 100644 --- a/gcc/tree-vect-loop.cc +++ b/gcc/tree-vect-loop.cc @@ -3021,6 +3021,16 @@ start_over: LOOP_VINFO_CAN_USE_PARTIAL_VECTORS_P (loop_vinfo) = false; } + if (LOOP_VINFO_CAN_USE_PARTIAL_VECTORS_P (loop_vinfo) + && !VECTOR_MODE_P (loop_vinfo->vector_mode)) + { + if (dump_enabled_p ()) + dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location, + "can't operate on partial vectors when emulating" + " vector operations.\n"); + LOOP_VINFO_CAN_USE_PARTIAL_VECTORS_P (loop_vinfo) = false; + } + /* If we still have the option of using partial vectors, check whether we can generate the necessary loop controls. */ if (LOOP_VINFO_CAN_USE_PARTIAL_VECTORS_P (loop_vinfo)) -- 2.47.1