> 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.
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)



Attachment: 0001-testsuite-Add-clzsi-and-ctzsi-effective-targets.patch
Description: 0001-testsuite-Add-clzsi-and-ctzsi-effective-targets.patch

Reply via email to