on 2024/5/28 20:09, Richard Biener wrote: > 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?
Good point, sure, I'll follow up this. BR, Kewen > >> 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") >> >> >>