On Wed, Aug 21, 2024 at 8:37 AM Robin Dapp <rdapp....@gmail.com> wrote: > > 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))
I think we instead should change this iteration to use FOR_EACH_MODE_IN_CLASS (like smallest_mode_for_size does) and skip to small modes? > { > 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 >