tree-complex.c (init_dont_simulate_again): Clear DONT_SIMULATE_AGAIN for control...
authorRichard Henderson <rth@redhat.com>
Sun, 19 Jun 2005 06:35:52 +0000 (23:35 -0700)
committerRichard Henderson <rth@gcc.gnu.org>
Sun, 19 Jun 2005 06:35:52 +0000 (23:35 -0700)
        * tree-complex.c (init_dont_simulate_again): Clear DONT_SIMULATE_AGAIN
        for control-altering statements; set it again for returns.
        (complex_visit_stmt): Return SSA_PROP_VARYING for stmts that are
        not MODIFY_EXPR.

From-SVN: r101178

gcc/ChangeLog
gcc/tree-complex.c

index 293b0a5..6e25cbb 100644 (file)
@@ -1,5 +1,12 @@
 2005-06-18  Richard Henderson  <rth@redhat.com>
 
+       * tree-complex.c (init_dont_simulate_again): Clear DONT_SIMULATE_AGAIN
+       for control-altering statements; set it again for returns.
+       (complex_visit_stmt): Return SSA_PROP_VARYING for stmts that are
+       not MODIFY_EXPR.
+
+2005-06-18  Richard Henderson  <rth@redhat.com>
+
        PR tree-opt/22116
        * tree-ssa-pre.c (create_expression_by_pieces): Set
        DECL_COMPLEX_GIMPLE_REG_P.
index a3470b1..f949633 100644 (file)
@@ -160,12 +160,20 @@ init_dont_simulate_again (void)
       for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi))
        {
          tree orig_stmt, stmt, rhs = NULL;
-         bool dsa = true;
+         bool dsa;
 
          orig_stmt = stmt = bsi_stmt (bsi);
+
+         /* Most control-altering statements must be initially 
+            simulated, else we won't cover the entire cfg.  */
+         dsa = !stmt_ends_bb_p (stmt);
+
          switch (TREE_CODE (stmt))
            {
            case RETURN_EXPR:
+             /* We don't care what the lattice value of <retval> is,
+                since it's never used as an input to another computation.  */
+             dsa = true;
              stmt = TREE_OPERAND (stmt, 0);
              if (!stmt || TREE_CODE (stmt) != MODIFY_EXPR)
                break;
@@ -228,15 +236,14 @@ complex_visit_stmt (tree stmt, edge *taken_edge_p ATTRIBUTE_UNUSED,
   unsigned int ver;
   tree lhs, rhs;
 
-  /* These conditions should be satisfied due to the initial filter
-     set up in init_dont_simulate_again.  */
-  if (TREE_CODE (stmt) == RETURN_EXPR)
-    stmt = TREE_OPERAND (stmt, 0);
-  gcc_assert (TREE_CODE (stmt) == MODIFY_EXPR);
+  if (TREE_CODE (stmt) != MODIFY_EXPR)
+    return SSA_PROP_VARYING;
 
   lhs = TREE_OPERAND (stmt, 0);
   rhs = TREE_OPERAND (stmt, 1);
 
+  /* These conditions should be satisfied due to the initial filter
+     set up in init_dont_simulate_again.  */
   gcc_assert (TREE_CODE (lhs) == SSA_NAME);
   gcc_assert (TREE_CODE (TREE_TYPE (lhs)) == COMPLEX_TYPE);