On Tue, May 28, 2024 at 9:09 AM Kewen.Lin <li...@linux.ibm.com> wrote:
>
> Hi,
>
> on 2024/5/27 20:54, Richard Biener wrote:
> > On Mon, May 27, 2024 at 11:37 AM HAO CHEN GUI <guih...@linux.ibm.com> wrote:
> >>
> >> Hi,
> >>   This patch adds an optab for __builtin_isfinite. The finite check can be
> >> implemented on rs6000 by a single instruction. It needs an optab to be
> >> expanded to the certain sequence of instructions.
> >>
> >>   The subsequent patches will implement the expand on rs6000.
> >>
> >>   Compared to previous version, the main change is to specify acceptable
> >> modes for the optab.
> >> https://gcc.gnu.org/pipermail/gcc-patches/2024-May/652170.html
> >>
> >>   Bootstrapped and tested on x86 and powerpc64-linux BE and LE with no
> >> regressions. Is this OK for trunk?
> >>
> >> Thanks
> >> Gui Haochen
> >>
> >> ChangeLog
> >> optab: Add isfinite_optab for isfinite builtin
> >>
> >> gcc/
> >>         * builtins.cc (interclass_mathfn_icode): Set optab to 
> >> isfinite_optab
> >>         for isfinite builtin.
> >>         * optabs.def (isfinite_optab): New.
> >>         * doc/md.texi (isfinite): Document.
> >>
> >>
> >> patch.diff
> >> diff --git a/gcc/builtins.cc b/gcc/builtins.cc
> >> index f8d94c4b435..b8432f84020 100644
> >> --- a/gcc/builtins.cc
> >> +++ b/gcc/builtins.cc
> >> @@ -2459,8 +2459,9 @@ interclass_mathfn_icode (tree arg, tree fndecl)
> >>        errno_set = true; builtin_optab = ilogb_optab; break;
> >>      CASE_FLT_FN (BUILT_IN_ISINF):
> >>        builtin_optab = isinf_optab; break;
> >> -    case BUILT_IN_ISNORMAL:
> >>      case BUILT_IN_ISFINITE:
> >> +      builtin_optab = isfinite_optab; break;
> >> +    case BUILT_IN_ISNORMAL:
> >>      CASE_FLT_FN (BUILT_IN_FINITE):
> >>      case BUILT_IN_FINITED32:
> >>      case BUILT_IN_FINITED64:
> >> diff --git a/gcc/doc/md.texi b/gcc/doc/md.texi
> >> index 5730bda80dc..67407fad37d 100644
> >> --- a/gcc/doc/md.texi
> >> +++ b/gcc/doc/md.texi
> >> @@ -8557,6 +8557,15 @@ operand 2, greater than operand 2 or is unordered 
> >> with operand 2.
> >>
> >>  This pattern is not allowed to @code{FAIL}.
> >>
> >> +@cindex @code{isfinite@var{m}2} instruction pattern
> >> +@item @samp{isfinite@var{m}2}
> >> +Set operand 0 to nonzero if operand 1 is a finite @code{SFmode},
> >> +@code{DFmode}, or @code{TFmode} floating point number and to 0
> >
> > It should probably say scalar floating-point mode?  But what about the 
> > result?
> > Is any integer mode OK?  That's esp. important if this might be used on
> > vector modes.
> >
> >> +otherwise.
> >> +
> >> +If this pattern @code{FAIL}, a call to the library function
> >> +@code{isfinite} is used.
> >
> > Or it's otherwise inline expanded?  Or does this imply targets
> > have to make sure to implement the pattern when isfinite is
> > not available in libc/libm?  I suggest to leave this sentence out,
> > we usually only say when a pattern may _not_ FAIL (and usually
> > FAILing isn't different from not providing a pattern).
>
> As Haochen's previous reply, I think there are three cases:
>   1) no optab defined, fold in a generic way;
>   2) optab defined, SUCC, expand as what it defines;
>   3) optab defined, FAIL, generate a library call;
>
> From above, I had the concern that ports may assume FAILing can
> fall back with the generic folding, but it's not actually.

Hmm, but it should.  Can you make that work?

> Does your comment imply ports usually don't make such assumption
> (or they just check what happens for FAIL)?
>
> BR,
> Kewen
>
> >
> >>  @end table
> >>
> >>  @end ifset
> >> diff --git a/gcc/optabs.def b/gcc/optabs.def
> >> index ad14f9328b9..dcd77315c2a 100644
> >> --- a/gcc/optabs.def
> >> +++ b/gcc/optabs.def
> >> @@ -352,6 +352,7 @@ OPTAB_D (fmod_optab, "fmod$a3")
> >>  OPTAB_D (hypot_optab, "hypot$a3")
> >>  OPTAB_D (ilogb_optab, "ilogb$a2")
> >>  OPTAB_D (isinf_optab, "isinf$a2")
> >> +OPTAB_D (isfinite_optab, "isfinite$a2")
> >>  OPTAB_D (issignaling_optab, "issignaling$a2")
> >>  OPTAB_D (ldexp_optab, "ldexp$a3")
> >>  OPTAB_D (log10_optab, "log10$a2")
>
>
>

Reply via email to