Hi, in get_best_extraction_insn we use smallest_int_mode_for_size with struct_bits as size argument. In PR115495 struct_bits = 256 and we don't have a mode for that. This patch just bails for such cases.
This does not happen on the current trunk anymore (so the test passes unpatched) but we've seen it internally. Does it still make sense to install it (and backport to 14)? Bootstrapped and regtested on x86 and aarch64. Regtested on rv64gcv. Regards Robin PR middle-end/115495 gcc/ChangeLog: * optabs-query.cc (get_best_extraction_insn): Return if smallest_int_mode_for_size might not find a mode. gcc/testsuite/ChangeLog: * gcc.target/riscv/rvv/autovec/pr115495.c: New test. --- gcc/optabs-query.cc | 4 ++++ gcc/testsuite/gcc.target/riscv/rvv/autovec/pr115495.c | 9 +++++++++ 2 files changed, 13 insertions(+) create mode 100644 gcc/testsuite/gcc.target/riscv/rvv/autovec/pr115495.c diff --git a/gcc/optabs-query.cc b/gcc/optabs-query.cc index 93c1d7b8485..dc2690e720f 100644 --- a/gcc/optabs-query.cc +++ b/gcc/optabs-query.cc @@ -208,6 +208,10 @@ get_best_extraction_insn (extraction_insn *insn, machine_mode field_mode) { opt_scalar_int_mode mode_iter; + + if (maybe_gt (struct_bits, GET_MODE_PRECISION (MAX_MODE_INT))) + return false; + FOR_EACH_MODE_FROM (mode_iter, smallest_int_mode_for_size (struct_bits)) { scalar_int_mode mode = mode_iter.require (); diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/pr115495.c b/gcc/testsuite/gcc.target/riscv/rvv/autovec/pr115495.c new file mode 100644 index 00000000000..bbf4d720f63 --- /dev/null +++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/pr115495.c @@ -0,0 +1,9 @@ +/* { dg-do compile } */ +/* { dg-options "-march=rv64gcv_zvl256b -mabi=lp64d -O3" } */ + +extern short a[]; +short b; +int main() { + for (char c = 0; c < 18; c += 1) + a[c + 0] = b; +} -- 2.46.0