Bootstrap & regtest running on x86_64-unknown-linux-gnu.

Richard.

2018-06-21  Richard Biener  <rguent...@suse.de>

        PR tree-optimization/86232
        * tree-ssa-loop-niter.c (number_of_iterations_popcount): Adjust
        max for constant niter.

        * gcc.dg/torture/pr86232.c: New testcase.

diff --git a/gcc/testsuite/gcc.dg/torture/pr86232.c 
b/gcc/testsuite/gcc.dg/torture/pr86232.c
new file mode 100644
index 00000000000..f5b61d3dfb7
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/torture/pr86232.c
@@ -0,0 +1,10 @@
+/* { dg-do compile } */
+
+enum { a = 1 } b;
+int c()
+{
+  int d = a;
+  for (; d;)
+    d &= d - 1;
+  return b;
+}
diff --git a/gcc/tree-ssa-loop-niter.c b/gcc/tree-ssa-loop-niter.c
index 936591502d0..f5ffc0f19ad 100644
--- a/gcc/tree-ssa-loop-niter.c
+++ b/gcc/tree-ssa-loop-niter.c
@@ -2575,9 +2575,6 @@ number_of_iterations_popcount (loop_p loop, edge exit,
     return false;
 
   /* Update NITER params accordingly  */
-  max = TYPE_PRECISION (TREE_TYPE (src));
-  if (adjust)
-    max = max - 1;
   tree utype = unsigned_type_for (TREE_TYPE (src));
   src = fold_convert (utype, src);
   tree call = fold_convert (utype, build_call_expr (fn, 1, src));
@@ -2588,6 +2585,15 @@ number_of_iterations_popcount (loop_p loop, edge exit,
   else
     iter = call;
 
+  if (TREE_CODE (call) == INTEGER_CST)
+    max = tree_to_uhwi (call);
+  else
+    {
+      max = TYPE_PRECISION (TREE_TYPE (src));
+      if (adjust)
+       max = max - 1;
+    }
+
   niter->niter = iter;
   niter->assumptions = boolean_true_node;
   if (adjust)

Reply via email to