This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Modernize loop_finite_p


Hi,
this patch changes finite_loop_p to use max_loop_iterations.  Long time ago I made
finite_loop_p as rip-off from the max_loop_iterations skipping parts that are not
exactly related to the number of iteration estimates.  It went out of date since then
completelly missing the bounds derived from overflows and array bounds that are quite
useful.

So I guess these days it is better to simply implement it using max_loop_iterations,
we do not save that much of effort and we can store the result.

Bootstrapped/regtested x86_64, OK?

Honza

	* tree-ssa-loop-niter.c (finite_loop_p): Reorg to use max_loop_iterations.
Index: tree-ssa-loop-niter.c
===================================================================
--- tree-ssa-loop-niter.c	(revision 192991)
+++ tree-ssa-loop-niter.c	(working copy)
@@ -1993,11 +1990,7 @@ find_loop_niter (struct loop *loop, edge
 bool
 finite_loop_p (struct loop *loop)
 {
-  unsigned i;
-  VEC (edge, heap) *exits;
-  edge ex;
-  struct tree_niter_desc desc;
-  bool finite = false;
+  double_int nit;
   int flags;
 
   if (flag_unsafe_loop_optimizations)
@@ -2011,26 +2004,22 @@ finite_loop_p (struct loop *loop)
       return true;
     }
 
-  exits = get_loop_exit_edges (loop);
-  FOR_EACH_VEC_ELT (edge, exits, i, ex)
+  if (loop->any_upper_bound)
     {
-      if (!just_once_each_iteration_p (loop, ex->src))
-	continue;
+      if (dump_file && (dump_flags & TDF_DETAILS))
+	fprintf (dump_file, "Found loop %i to be finite: upper bound is recorded.\n",
+		 loop->num);
+      return true;
+    }
 
-      if (number_of_iterations_exit (loop, ex, &desc, false))
-        {
-	  if (dump_file && (dump_flags & TDF_DETAILS))
-	    {
-	      fprintf (dump_file, "Found loop %i to be finite: iterating ", loop->num);
-	      print_generic_expr (dump_file, desc.niter, TDF_SLIM);
-	      fprintf (dump_file, " times\n");
-	    }
-	  finite = true;
-	  break;
-	}
+  if (max_loop_iterations (loop, &nit))
+    {
+      if (dump_file && (dump_flags & TDF_DETAILS))
+	fprintf (dump_file, "Found loop %i to be finite: upper bound found.\n",
+		 loop->num);
+      return true;
     }
-  VEC_free (edge, heap, exits);
-  return finite;
+  return false;
 }
 
 /*


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]