Hi Richard,

> On 15 Oct 2026, at 17:31, Kyrylo Tkachov <[email protected]> wrote:
> 
> 
> 
>> On 15 Oct 2026, at 13:10, Richard Biener <[email protected]> wrote:
>> 
>> On Tue, Oct 13, 2026 at 10:20 AM <[email protected]> wrote:
>>> 
>>> From: Kyrylo Tkachov <[email protected]>
>>> 
>>> A GIMPLE FE test with a .CLZ or .CTZ call needs the clz or ctz
>>> instruction pattern for the mode of the call, because the expansion of
>>> these internal functions has no fallback.  The clz and ctz effective
>>> targets only check that __builtin_clz and __builtin_ctz do not become
>>> library calls.  They are also true when the expander makes the count
>>> from other patterns, for example ctz on s390 before z17.
>>> 
>>> Add clz_ifn and ctz_ifn.  They check that niter analysis turns a
>>> counting loop on unsigned int into a .CLZ or .CTZ call, which it does
>>> only if the target has the instruction pattern.
>> 
>> I'd like to see these kind of effective target checks to be named
>> after the respective optabs, so clz (without _ifn) or when for
>> a specific mode, clzsi.
>> 
>> I realize this clashes with the existing targets but can you check what
>> they were introduced for and see whether your variant would be a better
>> match?
>> 
> 
> The existing clz/ctz/clzl/... targets came with the niter cltz idiom 
> recognition. They only check that the builtin expands without a library call. 
> Their users are niter tests that also accept the __builtin_c[lt]z form. With 
> this variant, gcc.dg/tree-ssa/ctz-int.c would become UNSUPPORTED on s390x 
> -march=z13, where it passes now: ctz expands inline with flogr, but there is 
> no ctzsi2 pattern.
> 
> The new targets are for GIMPLE FE tests with .CLZ/.CTZ calls, which need the 
> pattern. I guess it’s a bit confusing :/
> 
>> Note targets can also chose to implement ctz with a series of other
>> operations, like generic expansion does, so even having an optab
>> doesn't mean it is a "native" instruction supported by the target.
> 
> So I kept the old targets and named the new ones clzsi and ctzsi. The 
> documentation now says that the pattern can be an expander.
> Updated patch attached.

Sorry for the early ping, but I realized I didn’t explicitly ask for an ok on 
this version and I didn’t want to get in a situation where I’m waiting for an 
okay and you assume I don’t need one.
So is this version ok?
https://gcc.gnu.org/pipermail/gcc-patches/2026-October/734872.html

Thanks,
Kyrill

> Thanks,
> Kyrill
> 
> 
>> 
>> 
>>> Bootstrapped and tested on aarch64-none-linux-gnu and x86_64-linux.
>>> 
>>> gcc/ChangeLog:
>>> 
>>>       * doc/sourcebuild.texi (clz_ifn, ctz_ifn): Document.
>>> 
>>> gcc/testsuite/ChangeLog:
>>> 
>>>       * lib/target-supports.exp (check_effective_target_clz_ifn)
>>>       (check_effective_target_ctz_ifn): New procedures.
>>> 
>>> Signed-off-by: Kyrylo Tkachov <[email protected]>
>>> ---
>>> gcc/doc/sourcebuild.texi              |  8 ++++++
>>> gcc/testsuite/lib/target-supports.exp | 38 +++++++++++++++++++++++++++
>>> 2 files changed, 46 insertions(+)
>>> 
>>> diff --git a/gcc/doc/sourcebuild.texi b/gcc/doc/sourcebuild.texi
>>> index 3aa9fcbb577..822e4df53a4 100644
>>> --- a/gcc/doc/sourcebuild.texi
>>> +++ b/gcc/doc/sourcebuild.texi
>>> @@ -2774,6 +2774,10 @@ Target supports a clz optab on long.
>>> @item clzll
>>> Target supports a clz optab on long long.
>>> 
>>> +@item clz_ifn
>>> +Target expands a @code{.CLZ} internal function call on @code{unsigned int}
>>> +with an instruction pattern.
>>> +
>>> @item ctz
>>> Target supports a ctz optab on int.
>>> 
>>> @@ -2783,6 +2787,10 @@ Target supports a ctz optab on long.
>>> @item ctzll
>>> Target supports a ctz optab on long long.
>>> 
>>> +@item ctz_ifn
>>> +Target expands a @code{.CTZ} internal function call on @code{unsigned int}
>>> +with an instruction pattern.
>>> +
>>> @item cmpccxadd
>>> Target supports the execution of @code{cmpccxadd} instructions.
>>> 
>>> diff --git a/gcc/testsuite/lib/target-supports.exp 
>>> b/gcc/testsuite/lib/target-supports.exp
>>> index ae04b6a8daa..ad27992c6db 100644
>>> --- a/gcc/testsuite/lib/target-supports.exp
>>> +++ b/gcc/testsuite/lib/target-supports.exp
>>> @@ -10726,6 +10726,44 @@ proc check_effective_target_ctzll { } {
>>>    } "" ]
>>> }
>>> 
>>> +# Return 1 if the target expands a .CLZ call on unsigned int with an
>>> +# instruction pattern.  Niter analysis turns the loop into such a call
>>> +# only in that case.
>>> +
>>> +proc check_effective_target_clz_ifn { } {
>>> +    return [check_no_messages_and_pattern clz_ifn "\\.CLZ \\(" 
>>> tree-optimized {
>>> +       int foo (unsigned int b)
>>> +         {
>>> +           int c = 0;
>>> +           while (b)
>>> +             {
>>> +               b >>= 1;
>>> +               c++;
>>> +             }
>>> +           return c;
>>> +         }
>>> +    } "-O2" ]
>>> +}
>>> +
>>> +# Return 1 if the target expands a .CTZ call on unsigned int with an
>>> +# instruction pattern.  Niter analysis turns the loop into such a call
>>> +# only in that case.
>>> +
>>> +proc check_effective_target_ctz_ifn { } {
>>> +    return [check_no_messages_and_pattern ctz_ifn "\\.CTZ \\(" 
>>> tree-optimized {
>>> +       int foo (unsigned int b)
>>> +         {
>>> +           int c = 0;
>>> +           while (b)
>>> +             {
>>> +               b <<= 1;
>>> +               c++;
>>> +             }
>>> +           return c;
>>> +         }
>>> +    } "-O2" ]
>>> +}
>>> +
>>> # Return 1 if the target supports atomic operations on "long long"
>>> # and can execute them.
>>> #
>>> --
>>> 2.54.0 (Apple Git-157)
> 
> 
> 
> <0001-testsuite-Add-clzsi-and-ctzsi-effective-targets.patch>

Reply via email to