> -----Original Message-----
> From: Jiang, Haochen
> Sent: Wednesday, October 25, 2023 4:47 PM
> To: Richard Sandiford <richard.sandif...@arm.com>; HAO CHEN GUI
> <guih...@linux.ibm.com>
> Cc: gcc-patches <gcc-patches@gcc.gnu.org>
> Subject: RE: [PATCH-1v4, expand] Enable vector mode for compare_by_pieces
> [PR111449]
> 
> > -----Original Message-----
> > From: Richard Sandiford <richard.sandif...@arm.com>
> > Sent: Wednesday, October 25, 2023 4:40 PM
> > To: HAO CHEN GUI <guih...@linux.ibm.com>
> > Cc: Jiang, Haochen <haochen.ji...@intel.com>; gcc-patches <gcc-
> > patc...@gcc.gnu.org>
> > Subject: Re: [PATCH-1v4, expand] Enable vector mode for
> > compare_by_pieces [PR111449]
> >
> > HAO CHEN GUI <guih...@linux.ibm.com> writes:
> > > Hi Haochen,
> > >   The regression cases are caused by "targetm.scalar_mode_supported_p"
> > > I added for scalar mode checking. XImode, OImode and TImode (with
> > > -m32) are not enabled in ix86_scalar_mode_supported_p. So they're
> > > excluded from by pieces operations on i386.
> > >
> > >   The original code doesn't do a check for scalar modes. I think it
> > > might be incorrect as not all scalar modes support move and compare
> optabs. (e.g.
> > > TImode with -m32 on rs6000).
> > >
> > >   I drafted a new patch to manually check optabs for scalar mode.
> > > Now both vector and scalar modes are checked for optabs.
> > >
> > >   I did a simple test. All former regression cases are back. Could
> > > you help do a full regression test? I am worry about the coverage of my CI
> system.
> 
> Thanks for that. I am running the regression test now.

The patch works. Thanks a lot!

Sorry for the delay since my CI accidentally crashed.

Thx,
Haochen

> 
> Thx,
> Haochen
> 
> >
> > Thanks for the quick fix.  The patch LGTM FWIW.  Just a small
> > suggestion for the function name:
> >
> > >
> > > Thanks
> > > Gui Haochen
> > >
> > > patch.diff
> > > diff --git a/gcc/expr.cc b/gcc/expr.cc index
> > > 7aac575eff8..2af9fcbed18
> > > 100644
> > > --- a/gcc/expr.cc
> > > +++ b/gcc/expr.cc
> > > @@ -1000,18 +1000,21 @@ can_use_qi_vectors (by_pieces_operation
> op)
> > >  /* Return true if optabs exists for the mode and certain by pieces
> > >     operations.  */
> > >  static bool
> > > -qi_vector_mode_supported_p (fixed_size_mode mode,
> > by_pieces_operation
> > > op)
> > > +mode_supported_p (fixed_size_mode mode, by_pieces_operation op)
> >
> > Might be worth calling this something more specific, such as
> > by_pieces_mode_supported_p.
> >
> > Otherwise the patch is OK for trunk if it passes the x86 testing.
> >
> > Thanks,
> > Richard
> >
> > >  {
> > > +  if (optab_handler (mov_optab, mode) == CODE_FOR_nothing)
> > > +    return false;
> > > +
> > >    if ((op == SET_BY_PIECES || op == CLEAR_BY_PIECES)
> > > -      && optab_handler (vec_duplicate_optab, mode) !=
> CODE_FOR_nothing)
> > > -    return true;
> > > +      && VECTOR_MODE_P (mode)
> > > +      && optab_handler (vec_duplicate_optab, mode) ==
> > CODE_FOR_nothing)
> > > +    return false;
> > >
> > >    if (op == COMPARE_BY_PIECES
> > > -      && optab_handler (mov_optab, mode) != CODE_FOR_nothing
> > > -      && can_compare_p (EQ, mode, ccp_jump))
> > > -    return true;
> > > +      && !can_compare_p (EQ, mode, ccp_jump))
> > > +    return false;
> > >
> > > -  return false;
> > > +  return true;
> > >  }
> > >
> > >  /* Return the widest mode that can be used to perform part of an @@
> > > -1035,7 +1038,7 @@ widest_fixed_size_mode_for_size (unsigned int
> > > size,
> > by_pieces_operation op)
> > >     {
> > >       if (GET_MODE_SIZE (candidate) >= size)
> > >         break;
> > > -     if (qi_vector_mode_supported_p (candidate, op))
> > > +     if (mode_supported_p (candidate, op))
> > >         result = candidate;
> > >     }
> > >
> > > @@ -1049,7 +1052,7 @@ widest_fixed_size_mode_for_size (unsigned int
> > size, by_pieces_operation op)
> > >      {
> > >        mode = tmode.require ();
> > >        if (GET_MODE_SIZE (mode) < size
> > > -   && targetm.scalar_mode_supported_p (mode))
> > > +   && mode_supported_p (mode, op))
> > >        result = mode;
> > >      }
> > >
> > > @@ -1454,7 +1457,7 @@
> > op_by_pieces_d::smallest_fixed_size_mode_for_size (unsigned int size)
> > >         break;
> > >
> > >       if (GET_MODE_SIZE (candidate) >= size
> > > -         && qi_vector_mode_supported_p (candidate, m_op))
> > > +         && mode_supported_p (candidate, m_op))
> > >         return candidate;
> > >     }
> > >      }

Reply via email to