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)
