On Mon, 19 Oct 2026, Kyrylo Tkachov wrote:

> 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?

Yes.

Thanks,
Richard.

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

-- 
Richard Biener <[email protected]>
SUSE Software Solutions Germany GmbH,
Frankenstrasse 146, 90461 Nuernberg, Germany;
GF: Stefan Gaiser, Jochen Jaser, Abhinav Puri; (HRB 36809, AG Nuernberg)

Reply via email to