]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR tree-optimization/20742 (Hang in tree_ssa_iv_optimize_loop)
authorSebastian Pop <pop@cri.ensmp.fr>
Mon, 6 Jun 2005 12:12:50 +0000 (14:12 +0200)
committerSebastian Pop <spop@gcc.gnu.org>
Mon, 6 Jun 2005 12:12:50 +0000 (12:12 +0000)
PR tree-optimization/20742
* params.def (PARAM_SCEV_MAX_EXPR_SIZE): New parameter with
default value 20.
* tree-chrec.c: Depend on params.h.  Replace build with buildN,
and fold build with fold_buildN.
(chrec_fold_plus_1): Fail with a chrec_don_know when the size of
the expression exceeds PARAM_SCEV_MAX_EXPR_SIZE.
(tree_contains_chrecs): Compute an estimation of the size of the
given expression.
* tree-chrec.h (tree_contains_chrecs): Modify its declaration.
(tree_does_not_contain_chrecs): Update the use of tree_contains_chrecs.
* tree-scalar-evolution.c (simple_iv): Ditto.
* doc/invoke.texi (scev-max-expr-size): Documented.

From-SVN: r100660

gcc/ChangeLog
gcc/doc/invoke.texi
gcc/params.def
gcc/tree-chrec.c
gcc/tree-chrec.h
gcc/tree-scalar-evolution.c

index f19a1123c48d5485a8b10d0605c010ddee98ddcb..4e3c714e9ceeb14adcaff865d587432b730b1f68 100644 (file)
@@ -1,3 +1,19 @@
+2005-06-06  Sebastian Pop <pop@cri.ensmp.fr>
+
+       PR tree-optimization/20742
+       * params.def (PARAM_SCEV_MAX_EXPR_SIZE): New parameter with
+       default value 20.
+       * tree-chrec.c: Depend on params.h.  Replace build with buildN,
+       and fold build with fold_buildN.
+       (chrec_fold_plus_1): Fail with a chrec_don_know when the size of
+       the expression exceeds PARAM_SCEV_MAX_EXPR_SIZE.
+       (tree_contains_chrecs): Compute an estimation of the size of the
+       given expression.
+       * tree-chrec.h (tree_contains_chrecs): Modify its declaration.
+       (tree_does_not_contain_chrecs): Update the use of tree_contains_chrecs.
+       * tree-scalar-evolution.c (simple_iv): Ditto.
+       * doc/invoke.texi (scev-max-expr-size): Documented.
+
 2005-06-04  Richard Henderson  <rth@redhat.com>
 
         PR target/21888
index 3c86517cb52ba84a76dc8cdf99df1a90cad74938..d207c30d702b2c857e7f9fae3ffdcca16376176a 100644 (file)
@@ -5568,6 +5568,10 @@ If number of candidates in the set is smaller than this value,
 we always try to remove unnecessary ivs from the set during its
 optimization when a new iv is added to the set.
 
+@item scev-max-expr-size
+Bound on size of expressions used in the scalar evolutions analyzer.
+Large expressions slow the analyzer.
+
 @item max-iterations-to-track
 
 The maximum number of iterations of a loop the brute force algorithm
index 64cb88040e6fd7d0e2b0911f97e7e18c74ce1ca1..e3d2a7b6272eb53b6fc7b3b06ef173386fe99ff0 100644 (file)
@@ -364,6 +364,11 @@ DEFPARAM(PARAM_IV_ALWAYS_PRUNE_CAND_SET_BOUND,
         "If number of candidates in the set is smaller, we always try to remove unused ivs during its optimization",
         10, 0, 0)
 
+DEFPARAM(PARAM_SCEV_MAX_EXPR_SIZE,
+        "scev-max-expr-size",
+        "Bound on size of expressions used in the scalar evolutions analyzer",
+        20, 0, 0)
+
 /* The product of the next two is used to decide whether or not to
    use .GLOBAL_VAR.  See tree-dfa.c.  */
 DEFPARAM(PARAM_GLOBAL_VAR_THRESHOLD,
index b6276e929fd2dba8fe233cbc5226af5b5d647c70..cb0f698c04289e062dc90f3554677c52aceb88a2 100644 (file)
@@ -35,6 +35,7 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
 #include "varray.h"
 #include "tree-chrec.h"
 #include "tree-pass.h"
+#include "params.h"
 
 \f
 
@@ -286,11 +287,17 @@ chrec_fold_plus_1 (enum tree_code code,
                                    build_int_cst_type (type, -1)));
 
        default:
-         if (tree_contains_chrecs (op0)
-             || tree_contains_chrecs (op1))
-           return build (code, type, op0, op1);
-         else
-           return fold (build (code, type, op0, op1));
+         {
+           int size = 0;
+           if ((tree_contains_chrecs (op0, &size)
+                || tree_contains_chrecs (op1, &size))
+               && size < PARAM_VALUE (PARAM_SCEV_MAX_EXPR_SIZE))
+             return build2 (code, type, op0, op1);
+           else if (size < PARAM_VALUE (PARAM_SCEV_MAX_EXPR_SIZE))
+             return fold (build2 (code, type, op0, op1));
+           else
+             return chrec_dont_know;
+         }
        }
     }
 }
@@ -374,7 +381,7 @@ chrec_fold_multiply (tree type,
            return op0;
          if (integer_zerop (op1))
            return build_int_cst_type (type, 0);
-         return fold (build (MULT_EXPR, type, op0, op1));
+         return fold (build2 (MULT_EXPR, type, op0, op1));
        }
     }
 }
@@ -717,7 +724,7 @@ reset_evolution_in_loop (unsigned loop_num,
 {
   if (TREE_CODE (chrec) == POLYNOMIAL_CHREC
       && CHREC_VARIABLE (chrec) > loop_num)
-    return build 
+    return build2
       (TREE_CODE (chrec), 
        build_int_cst (NULL_TREE, CHREC_VARIABLE (chrec)), 
        reset_evolution_in_loop (loop_num, CHREC_LEFT (chrec), new_evol), 
@@ -862,29 +869,34 @@ chrec_contains_undetermined (tree chrec)
     }
 }
 
-/* Determines whether the tree EXPR contains chrecs.  */
+/* Determines whether the tree EXPR contains chrecs, and increment
+   SIZE if it is not a NULL pointer by an estimation of the depth of
+   the tree.  */
 
 bool
-tree_contains_chrecs (tree expr)
+tree_contains_chrecs (tree expr, int *size)
 {
   if (expr == NULL_TREE)
     return false;
+
+  if (size)
+    (*size)++;
   
   if (tree_is_chrec (expr))
     return true;
-  
+
   switch (TREE_CODE_LENGTH (TREE_CODE (expr)))
     {
     case 3:
-      if (tree_contains_chrecs (TREE_OPERAND (expr, 2)))
+      if (tree_contains_chrecs (TREE_OPERAND (expr, 2), size))
        return true;
       
     case 2:
-      if (tree_contains_chrecs (TREE_OPERAND (expr, 1)))
+      if (tree_contains_chrecs (TREE_OPERAND (expr, 1), size))
        return true;
       
     case 1:
-      if (tree_contains_chrecs (TREE_OPERAND (expr, 0)))
+      if (tree_contains_chrecs (TREE_OPERAND (expr, 0), size))
        return true;
       
     default:
index a3e219086d2a8f9bf67b5a99c07c57116a9637b6..8f8c065470d87c9991a0a16be6ff025b62b1a0d0 100644 (file)
@@ -87,7 +87,7 @@ extern bool chrec_is_positive (tree, bool *);
 extern bool chrec_contains_symbols (tree);
 extern bool chrec_contains_symbols_defined_in_loop (tree, unsigned);
 extern bool chrec_contains_undetermined (tree);
-extern bool tree_contains_chrecs (tree);
+extern bool tree_contains_chrecs (tree, int *);
 extern bool evolution_function_is_affine_multivariate_p (tree);
 extern bool evolution_function_is_univariate_p (tree);
 extern unsigned nb_vars_in_chrec (tree);
@@ -183,7 +183,7 @@ evolution_function_is_affine_or_constant_p (tree chrec)
 static inline bool
 tree_does_not_contain_chrecs (tree expr)
 {
-  return !tree_contains_chrecs (expr);
+  return !tree_contains_chrecs (expr, NULL);
 }
 
 /* Determines whether CHREC is a loop invariant with respect to LOOP_NUM.  
index 576fce0ae11325d6dcebfcc83e7d92bc3d42b666..da72177ade65ebdab19534076e8dbc856f7c892c 100644 (file)
@@ -2563,7 +2563,7 @@ simple_iv (struct loop *loop, tree stmt, tree op, tree *base, tree *step)
   if (TREE_CODE (*step) != INTEGER_CST)
     return false;
   *base = CHREC_LEFT (ev);
-  if (tree_contains_chrecs (*base)
+  if (tree_contains_chrecs (*base, NULL)
       || chrec_contains_symbols_defined_in_loop (*base, loop->num))
     return false;