OSDN Git Service

PR tree-optimization/20139
authorkazu <kazu@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 8 Jul 2005 19:11:55 +0000 (19:11 +0000)
committerkazu <kazu@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 8 Jul 2005 19:11:55 +0000 (19:11 +0000)
* 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.

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

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 db2a8ea..adceec9 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 ac82940..862e457 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 8dd16ce..bfbf5a5 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 4b23a82..c29c3c6 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 bf5ffef..f794eae 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);