https://gcc.gnu.org/g:a729b1227bc8c84cd91a3b8c9c9d11bc43d415de

commit r13-8482-ga729b1227bc8c84cd91a3b8c9c9d11bc43d415de
Author: Richard Biener <rguent...@suse.de>
Date:   Mon Mar 4 10:38:31 2024 +0100

    tree-optimization/114203 - wrong CLZ niter computation
    
    For precision less than int we apply the adjustment to make it defined
    at zero after the adjustment to make it compute CLZ rather than CTZ.
    That's wrong.
    
            PR tree-optimization/114203
            * tree-ssa-loop-niter.cc (build_cltz_expr): Apply CTZ->CLZ
            adjustment before making the result defined at zero.
    
            * gcc.dg/torture/pr114203.c: New testcase.
    
    (cherry picked from commit cde50296a19b109909089b91d532d2c8455f5f10)

Diff:
---
 gcc/testsuite/gcc.dg/torture/pr114203.c | 21 +++++++++++++++++++++
 gcc/tree-ssa-loop-niter.cc              |  7 +++----
 2 files changed, 24 insertions(+), 4 deletions(-)

diff --git a/gcc/testsuite/gcc.dg/torture/pr114203.c 
b/gcc/testsuite/gcc.dg/torture/pr114203.c
new file mode 100644
index 00000000000..0ef6279942a
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/torture/pr114203.c
@@ -0,0 +1,21 @@
+/* { dg-do run } */
+
+int __attribute__((noipa))
+foo (unsigned char b)
+{
+  int c = 0;
+
+  while (b) {
+      b >>= 1;
+      c++;
+  }
+
+  return c;
+}
+
+int main()
+{
+  if (foo(0) != 0)
+    __builtin_abort ();
+  return 0;
+}
diff --git a/gcc/tree-ssa-loop-niter.cc b/gcc/tree-ssa-loop-niter.cc
index dc4c7a418f6..0ffe4b8465d 100644
--- a/gcc/tree-ssa-loop-niter.cc
+++ b/gcc/tree-ssa-loop-niter.cc
@@ -2299,6 +2299,9 @@ build_cltz_expr (tree src, bool leading, bool 
define_at_zero)
        src = fold_convert (unsigned_type_node, src);
 
       call = build_call_expr (fn, 1, src);
+      if (leading && prec < i_prec)
+       call = fold_build2 (MINUS_EXPR, integer_type_node, call,
+                           build_int_cst (integer_type_node, i_prec - prec));
       if (define_at_zero)
        {
          tree is_zero = fold_build2 (NE_EXPR, boolean_type_node, src,
@@ -2306,10 +2309,6 @@ build_cltz_expr (tree src, bool leading, bool 
define_at_zero)
          call = fold_build3 (COND_EXPR, integer_type_node, is_zero, call,
                              build_int_cst (integer_type_node, prec));
        }
-
-      if (leading && prec < i_prec)
-       call = fold_build2 (MINUS_EXPR, integer_type_node, call,
-                           build_int_cst (integer_type_node, i_prec - prec));
     }
 
   return call;

Reply via email to