On Wed, Aug 21, 2024 at 4:24 PM Richard Sandiford
<richard.sandif...@arm.com> wrote:
>
> Richard Biener <richard.guent...@gmail.com> writes:
> > 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?
>
> I can't remember whether we rely on the int_n stuff here.  (If we do though,
> it'd only be in a limited way, since the loop only tries int_n for the first
> size.)
>
> An alternative would be to make smallest_int_mode_for_size return an
> optional mode, which arguably it should be doing anyway.

Indeed though that might be a larger change.

Richard.

> Thanks,
> Richard
>
> >
> >>      {
> >>        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