re PR regression/20139 (cris-elf testsuite: gcc.c-torture/execute/20020720-1.c)
authorKazu Hirata <kazu@codesourcery.com>
Fri, 8 Jul 2005 19:11:55 +0000 (19:11 +0000)
committerKazu Hirata <kazu@gcc.gnu.org>
Fri, 8 Jul 2005 19:11:55 +0000 (19:11 +0000)
PR tree-optimization/20139
* tree-cfg.c (remove_bb): Check in_ssa_p before calling
release_defs.
* tree-optimize.c (execute_cleanup_cfg_post_optimizing): Call
fold_cond_expr_cond.
* tree-ssanames.c (release_defs): Assert in_ssa_p.
* tree.c (upper_bound_in_type, lower_bound_in_type): Rewrite.

From-SVN: r101787

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/tree-ssa/pr20139.c [new file with mode: 0644]
gcc/tree-cfg.c
gcc/tree-optimize.c
gcc/tree-ssanames.c

index db2a8ea62d7e31cd17542946ddee9bd5f04698eb..adceec9b3108df08637da8c1404b31a2b4affffc 100644 (file)
@@ -7,6 +7,14 @@
        (lower_bound_in_type): Fix calculations for casting to a
        non-wider signed type.
 
+       PR tree-optimization/20139
+       * tree-cfg.c (remove_bb): Check in_ssa_p before calling
+       release_defs.
+       * tree-optimize.c (execute_cleanup_cfg_post_optimizing): Call
+       fold_cond_expr_cond.
+       * tree-ssanames.c (release_defs): Assert in_ssa_p.
+       * tree.c (upper_bound_in_type, lower_bound_in_type): Rewrite.
+
 2005-07-08  Andrew Pinski  <pinskia@physics.uc.edu>
 
        PR tree-opt/22356
index ac82940d4279cffc02e7685c66a585e68ce1f3c7..862e457baff8731fd2d71f382a725a906b21b570 100644 (file)
@@ -1,3 +1,8 @@
+2005-07-08  Kazu Hirata  <kazu@codesourcery.com>
+
+       PR tree-optimization/20139
+       * gcc.dg/tree-ssa/pr20139.c: New.
+
 2005-07-08  Andrew Pinski  <pinskia@physics.uc.edu>
 
        PR tree-opt/22356
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr20139.c b/gcc/testsuite/gcc.dg/tree-ssa/pr20139.c
new file mode 100644 (file)
index 0000000..054e4b2
--- /dev/null
@@ -0,0 +1,23 @@
+/* PR tree-optimization/20139
+   This testcase is derived from gcc.dg/20020720-1.c.  Here we check
+   that the optimization happens at tree level.  */
+
+/* { dg-do compile } */
+/* { dg-options "-O2 -fdump-tree-final_cleanup" } */
+
+extern double fabs (double);
+extern void link_error (void);
+
+void
+foo (double x)
+{
+  double p, q;
+
+  p = fabs (x);
+  q = 0.0;
+  if (p < q)
+    link_error ();
+}
+
+/* { dg-final { scan-tree-dump-times "link_error" 0 "final_cleanup" } } */
+/* { dg-final { cleanup-tree-dump "final_cleanup" } } */
index 8dd16ce844b99fd02842c647bf1b68dac2637a9d..bfbf5a5fd802a28a8b7d19b4f2026d738df328c1 100644 (file)
@@ -1981,7 +1981,12 @@ remove_bb (basic_block bb)
        }
       else
         {
-         release_defs (stmt);
+         /* Release SSA definitions if we are in SSA.  Note that we
+            may be called when not in SSA.  For example,
+            final_cleanup calls this function via
+            cleanup_tree_cfg.  */
+         if (in_ssa_p)
+           release_defs (stmt);
 
          bsi_remove (&i);
        }
index 4b23a82fbf01da50f551d60eb1b1abec9f6d446f..c29c3c6a422b6ae474f737c861fa232a68d078f9 100644 (file)
@@ -132,6 +132,7 @@ struct tree_opt_pass pass_cleanup_cfg =
 static void 
 execute_cleanup_cfg_post_optimizing (void)
 {
+  fold_cond_expr_cond ();
   cleanup_tree_cfg ();
   cleanup_dead_labels ();
   group_case_labels ();
index bf5ffef9e5e47580ddfeb057f827f3013fa7ac37..f794eaec6be7bc1ce4f7ad54257af5694ced3f2f 100644 (file)
@@ -289,6 +289,10 @@ release_defs (tree stmt)
   tree def;
   ssa_op_iter iter;
 
+  /* Make sure that we are in SSA.  Otherwise, operand cache may point
+     to garbage.  */
+  gcc_assert (in_ssa_p);
+
   FOR_EACH_SSA_TREE_OPERAND (def, stmt, iter, SSA_OP_ALL_DEFS)
     if (TREE_CODE (def) == SSA_NAME)
       release_ssa_name (def);