2006-06-21 Richrad Guenther <rguenther@suse.de>
authorrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 21 Jun 2006 08:11:28 +0000 (08:11 +0000)
committerrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 21 Jun 2006 08:11:28 +0000 (08:11 +0000)
* tree-ssa-loop-niter.c (simplify_using_initial_conditions):
Limit iteration over the dominators.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@114840 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/tree-ssa-loop-niter.c

index de72952..9b190b4 100644 (file)
@@ -1,3 +1,8 @@
+2006-06-21  Richrad Guenther  <rguenther@suse.de>
+
+       * tree-ssa-loop-niter.c (simplify_using_initial_conditions):
+       Limit iteration over the dominators.
+
 2006-06-20  Roger Sayle  <roger@eyesopen.com>
 
        * config/mips/iris6.h (LIB_SPEC): Add support for -pthread.
index a896d03..9428dd6 100644 (file)
@@ -886,7 +886,12 @@ tree_simplify_using_condition (tree cond, tree expr)
 
   return tree_simplify_using_condition_1 (cond, expr);
 }
-     
+
+/* The maximum number of dominator BBs we search for conditions
+   of loop header copies we use for simplifying a conditional
+   expression.  */
+#define MAX_DOMINATORS_TO_WALK 8
+
 /* Tries to simplify EXPR using the conditions on entry to LOOP.
    Record the conditions used for simplification to CONDS_USED.
    Returns the simplified expression (or EXPR unchanged, if no
@@ -899,12 +904,16 @@ simplify_using_initial_conditions (struct loop *loop, tree expr,
   edge e;
   basic_block bb;
   tree exp, cond;
+  int cnt = 0;
 
   if (TREE_CODE (expr) == INTEGER_CST)
     return expr;
 
+  /* Limit walking the dominators to avoid quadraticness in
+     the number of BBs times the number of loops in degenerate
+     cases.  */
   for (bb = loop->header;
-       bb != ENTRY_BLOCK_PTR;
+       bb != ENTRY_BLOCK_PTR && cnt < MAX_DOMINATORS_TO_WALK;
        bb = get_immediate_dominator (CDI_DOMINATORS, bb))
     {
       if (!single_pred_p (bb))
@@ -926,6 +935,7 @@ simplify_using_initial_conditions (struct loop *loop, tree expr,
                                   cond);
 
       expr = exp;
+      ++cnt;
     }
 
   return expr;