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

Reply via email to