> Am 31.01.2025 um 10:24 schrieb Jakub Jelinek <ja...@redhat.com>:
> 
> Hi!
> 
> Since my r15-7223 the niter analysis can recognize one loop during bootstrap
> as being ctz like.
> The patch just turned
> @@ -2173,7 +2173,7 @@ PROC m2pim_NumberIO_BinToStr (CARDINAL x
>   _T535_44 = &buf[i.40_2]{lb: 1 sz: 4};
>   _T536_45 = x_21 & 1;
>   *_T535_44 = _T536_45;
> -  _T537_47 = x_21 / 2;
> +  _T537_47 = x_21 >> 1;
>   x_48 = _T537_47;
>   # DEBUG x => x_48
>   if (x_48 != 0)
> which is not a big deal for the number_of_iterations_cltz optimization, it
> recognizes both right shift by 1 and unsigned division by 2 (and similarly
> for clz left shift by 1 or multiplication by 2).
> But starting with forwprop1 that change also resulted in
> @@ -1875,9 +1875,9 @@ PROC m2pim_NumberIO_BinToStr (CARDINAL x
>   i.40_2 = (INTEGER) _T530_34;
>   _T536_45 = x_21 & 1;
>   MEM <CARDINAL[1:64]> [(CARDINAL *)&buf][i.40_2]{lb: 1 sz: 4} = _T536_45;
> -  _T537_47 = x_21 / 2;
> +  _T537_47 = x_21 >> 1;
>   # DEBUG x => _T537_47
> -  if (x_21 > 1)
> +  if (_T537_47 != 0)
>     goto <bb 3>; [INV]
>   else
>     goto <bb 8>; [INV]
> and apparently it is only the latter form that number_of_iterations_cltz
> pattern matches, not the former (after all, that was the exact reason
> for r15-7223).
> The problem is that build_cltz_expr assumes if IFN_C[LT]Z can't be used it
> can use the __builtin_c[lt]z{,l,ll} builtins, and while most of the FEs do
> create them, modula 2 does not.
> 
> The following patch just let us punt if the FE doesn't build those builtins.
> I've filed a PR against modula2 so that they add the builtins too.
> 
> Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?

Ok

I suppose the middle end could step in for Thors builtins as well, as we do for 
memcpy and others.

Richard 

> 2025-01-31  Jakub Jelinek  <ja...@redhat.com>
> 
>    PR tree-optimization/118689
>    PR modula2/115032
>    * tree-ssa-loop-niter.cc (build_cltz_expr): Return NULL_TREE if fn is
>    NULL and use_ifn is false.
> 
> --- gcc/tree-ssa-loop-niter.cc.jj    2025-01-17 11:29:34.080683133 +0100
> +++ gcc/tree-ssa-loop-niter.cc    2025-01-30 14:51:57.528933620 +0100
> @@ -2238,6 +2238,8 @@ build_cltz_expr (tree src, bool leading,
>                  build_int_cst (integer_type_node, prec));
>    }
>     }
> +  else if (fn == NULL_TREE)
> +    return NULL_TREE;
>   else if (prec == 2 * lli_prec)
>     {
>       tree src1 = fold_convert (long_long_unsigned_type_node,
> 
>    Jakub
> 

Reply via email to