re PR tree-optimization/34244 (VRP/SCEV miscompiles Firefox)
authorRichard Guenther <rguenther@suse.de>
Sat, 31 May 2008 13:01:10 +0000 (13:01 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Sat, 31 May 2008 13:01:10 +0000 (13:01 +0000)
2008-05-31  Richard Guenther  <rguenther@suse.de>

PR tree-optimization/34244
* fold-const.c (tree_expr_nonnegative_warnv_p): Do not ask VRP.
(tree_expr_nonzero_warnv_p): Likewise.
* tree-vrp.c (vrp_expr_computes_nonnegative): Call
ssa_name_nonnegative_p.
(vrp_expr_computes_nonzero): Call ssa_name_nonzero_p.
(extract_range_from_unary_expr): Use vrp_expr_computes_nonzero,
not tree_expr_nonzero_warnv_p.

PR tree-optimization/36262
Revert
2007-11-29  Zdenek Dvorak  <ook@ucw.cz>

        PR tree-optimization/34244
        * tree-vrp.c (adjust_range_with_scev): Clear scev cache.
        (record_numbers_of_iterations): New function.
        (execute_vrp): Cache the numbers of iterations of loops.
        * tree-scalar-evolution.c (scev_reset_except_niters):
        New function.
        (scev_reset): Use scev_reset_except_niters.
        * tree-scalar-evolution.h (scev_reset_except_niters): Declare.

From-SVN: r136237

gcc/ChangeLog
gcc/fold-const.c
gcc/tree-scalar-evolution.c
gcc/tree-scalar-evolution.h
gcc/tree-vrp.c

index cd4d66c27ac32bcd743f1013284392b70f4c253d..41a7306da3a5ef8e5d2032d45df84ab36483f122 100644 (file)
@@ -1,3 +1,27 @@
+2008-05-31  Richard Guenther  <rguenther@suse.de>
+
+       PR tree-optimization/34244
+       * fold-const.c (tree_expr_nonnegative_warnv_p): Do not ask VRP.
+       (tree_expr_nonzero_warnv_p): Likewise.
+       * tree-vrp.c (vrp_expr_computes_nonnegative): Call
+       ssa_name_nonnegative_p.
+       (vrp_expr_computes_nonzero): Call ssa_name_nonzero_p.
+       (extract_range_from_unary_expr): Use vrp_expr_computes_nonzero,
+       not tree_expr_nonzero_warnv_p.
+
+       PR tree-optimization/36262
+       Revert
+       2007-11-29  Zdenek Dvorak  <ook@ucw.cz>
+
+        PR tree-optimization/34244
+        * tree-vrp.c (adjust_range_with_scev): Clear scev cache.
+        (record_numbers_of_iterations): New function.
+        (execute_vrp): Cache the numbers of iterations of loops.
+        * tree-scalar-evolution.c (scev_reset_except_niters):
+        New function.
+        (scev_reset): Use scev_reset_except_niters.
+        * tree-scalar-evolution.h (scev_reset_except_niters): Declare.
+
 2008-05-31  Bernd Schmidt  <bernd.schmidt@analog.com>
 
        * config/bfin/bfin.h (TARGET_CPU_CPP_BUILTINS): Define
index 4a9d55ff238cc55a2c40fa12b21000ab02773037..609217b755fd3a7d5f60e9e2d412f55a3bbf5a07 100644 (file)
@@ -14074,11 +14074,6 @@ tree_single_nonnegative_warnv_p (tree t, bool *strict_overflow_p)
 
   switch (TREE_CODE (t))
     {
-    case SSA_NAME:
-      /* Query VRP to see if it has recorded any information about
-        the range of this object.  */
-      return ssa_name_nonnegative_p (t);
-
     case INTEGER_CST:
       return tree_int_cst_sgn (t) >= 0;
 
@@ -14563,11 +14558,6 @@ tree_single_nonzero_warnv_p (tree t, bool *strict_overflow_p)
   bool sub_strict_overflow_p;
   switch (TREE_CODE (t))
     {
-    case SSA_NAME:
-      /* Query VRP to see if it has recorded any information about
-        the range of this object.  */
-      return ssa_name_nonzero_p (t);
-
     case INTEGER_CST:
       return !integer_zerop (t);
 
index 7c9736a3b0245074c085b4f0de2d3d70a30db7b1..2cc008020e22fd4fc95bc79fb3d00b16073c7613 100644 (file)
@@ -2645,16 +2645,6 @@ scev_initialize (void)
     }
 }
 
-/* Clean the scalar evolution analysis cache, but preserve the cached
-   numbers of iterations for the loops.  */
-
-void
-scev_reset_except_niters (void)
-{
-  if (scalar_evolution_info)
-    htab_empty (scalar_evolution_info);
-}
-
 /* Cleans up the information cached by the scalar evolutions analysis.  */
 
 void
@@ -2666,8 +2656,7 @@ scev_reset (void)
   if (!scalar_evolution_info || !current_loops)
     return;
 
-  scev_reset_except_niters ();
-
+  htab_empty (scalar_evolution_info);
   FOR_EACH_LOOP (li, loop, 0)
     {
       loop->nb_iterations = NULL_TREE;
index 54e543ceccc93c516ed3432d9bc1e74f5d1e9c98..472b194d307bf4fd609ded5176cab3d941b4d9eb 100644 (file)
@@ -27,7 +27,6 @@ extern tree get_loop_exit_condition (const struct loop *);
 
 extern void scev_initialize (void);
 extern void scev_reset (void);
-extern void scev_reset_except_niters (void);
 extern void scev_finalize (void);
 extern tree analyze_scalar_evolution (struct loop *, tree);
 extern tree instantiate_scev (struct loop *, struct loop *, tree);
index 15e7ee57dd69ac85dbb099bdefde4de45752a3b2..fe39a24f0966d2468bff502d117d1e41284decbf 100644 (file)
@@ -772,7 +772,9 @@ usable_range_p (value_range_t *vr, bool *strict_overflow_p)
 static bool
 vrp_expr_computes_nonnegative (tree expr, bool *strict_overflow_p)
 {
-  return tree_expr_nonnegative_warnv_p (expr, strict_overflow_p);
+  return (tree_expr_nonnegative_warnv_p (expr, strict_overflow_p)
+         || (TREE_CODE (expr) == SSA_NAME
+             && ssa_name_nonnegative_p (expr)));
 }
 
 /* Like tree_expr_nonzero_warnv_p, but this function uses value ranges
@@ -781,7 +783,9 @@ vrp_expr_computes_nonnegative (tree expr, bool *strict_overflow_p)
 static bool
 vrp_expr_computes_nonzero (tree expr, bool *strict_overflow_p)
 {
-  if (tree_expr_nonzero_warnv_p (expr, strict_overflow_p))
+  if (tree_expr_nonzero_warnv_p (expr, strict_overflow_p)
+      || (TREE_CODE (expr) == SSA_NAME
+         && ssa_name_nonzero_p (expr)))
     return true;
 
   /* If we have an expression of the form &X->a, then the expression
@@ -2799,13 +2803,6 @@ adjust_range_with_scev (value_range_t *vr, struct loop *loop, tree stmt,
   if (vr->type == VR_ANTI_RANGE)
     return;
 
-  /* Ensure that there are not values in the scev cache based on assumptions
-     on ranges of ssa names that were changed
-     (in set_value_range/set_value_range_to_varying).  Preserve cached numbers
-     of iterations, that were computed before the start of VRP (we do not
-     recompute these each time to save the compile time).  */
-  scev_reset_except_niters ();
-
   chrec = instantiate_parameters (loop, analyze_scalar_evolution (loop, var));
 
   /* Like in PR19590, scev can return a constant function.  */
@@ -6636,20 +6633,6 @@ vrp_finalize (void)
   vr_phi_edge_counts = NULL;
 }
 
-/* Calculates number of iterations for all loops, to ensure that they are
-   cached.  */
-
-static void
-record_numbers_of_iterations (void)
-{
-  loop_iterator li;
-  struct loop *loop;
-
-  FOR_EACH_LOOP (li, loop, 0)
-    {
-      number_of_latch_executions (loop);
-    }
-}
 
 /* Main entry point to VRP (Value Range Propagation).  This pass is
    loosely based on J. R. C. Patterson, ``Accurate Static Branch
@@ -6708,17 +6691,6 @@ execute_vrp (void)
 
   insert_range_assertions ();
 
-  /* Compute the # of iterations for each loop before we start the VRP
-     analysis.  The value ranges determined by VRP are used in expression
-     simplification, that is also used by the # of iterations analysis.
-     However, in the middle of the VRP analysis, the value ranges do not take
-     all the possible paths in CFG into account, so they do not have to be
-     correct, and the # of iterations analysis can obtain wrong results.
-     This is a problem, since the results of the # of iterations analysis
-     are cached, so these mistakes would not be corrected when the value
-     ranges are corrected.  */
-  record_numbers_of_iterations ();
-
   to_remove_edges = VEC_alloc (edge, heap, 10);
   to_update_switch_stmts = VEC_alloc (switch_update, heap, 5);