OSDN Git Service

* c-lex.c (interpret_float): Give a pedwarn rather than a warning
[pf3gnuchains/gcc-fork.git] / gcc / tree-outof-ssa.c
index 5b1e2a8..827f91d 100644 (file)
@@ -42,7 +42,6 @@ Boston, MA 02111-1307, USA.  */
 #include "tree-inline.h"
 #include "varray.h"
 #include "timevar.h"
-#include "tree-alias-common.h"
 #include "hashtab.h"
 #include "tree-dump.h"
 #include "tree-ssa-live.h"
@@ -146,10 +145,8 @@ create_temp (tree t)
 
   if (TREE_CODE (t) == SSA_NAME)
     t = SSA_NAME_VAR (t);
-  if (TREE_CODE (t) != VAR_DECL 
-      && TREE_CODE (t) != PARM_DECL)
-    abort ();
+
+  gcc_assert (TREE_CODE (t) == VAR_DECL || TREE_CODE (t) == PARM_DECL);
 
   type = TREE_TYPE (t);
   tmp = DECL_NAME (t);
@@ -368,8 +365,7 @@ eliminate_build (elim_graph g, basic_block B, int i)
             in the same order as all of the other PHI nodes. If they don't 
             match, find the appropriate index here.  */
          pi = phi_arg_from_edge (phi, g->e);
-         if (pi == -1)
-           abort();
+         gcc_assert (pi != -1);
          Ti = PHI_ARG_DEF (phi, pi);
        }
 
@@ -496,12 +492,8 @@ eliminate_phi (edge e, int i, elim_graph g)
   int x;
   basic_block B = e->dest;
 
-#if defined ENABLE_CHECKING
-  if (i == -1)
-    abort ();
-  if (VARRAY_ACTIVE_SIZE (g->const_copies) != 0)
-    abort ();
-#endif
+  gcc_assert (i != -1);
+  gcc_assert (VARRAY_ACTIVE_SIZE (g->const_copies) == 0);
 
   /* Abnormal edges already have everything coalesced, or the coalescer
      would have aborted.  */
@@ -589,13 +581,14 @@ coalesce_abnormal_edges (var_map map, conflict_graph graph, root_var_p rv)
   edge e;
   tree phi, var, tmp;
   int x, y;
+  edge_iterator ei;
 
   /* Code cannot be inserted on abnormal edges. Look for all abnormal 
      edges, and coalesce any PHI results with their arguments across 
      that edge.  */
 
   FOR_EACH_BB (bb)
-    for (e = bb->succ; e; e = e->succ_next)
+    FOR_EACH_EDGE (e, ei, bb->succs)
       if (e->dest != EXIT_BLOCK_PTR && e->flags & EDGE_ABNORMAL)
        for (phi = phi_nodes (e->dest); phi; phi = PHI_CHAIN (phi))
          {
@@ -609,59 +602,71 @@ coalesce_abnormal_edges (var_map map, conflict_graph graph, root_var_p rv)
              continue;
 
            y = phi_arg_from_edge (phi, e);
-           if (y == -1)
-             abort ();
+           gcc_assert (y != -1);
 
            tmp = PHI_ARG_DEF (phi, y);
+#ifdef ENABLE_CHECKING
            if (!phi_ssa_name_p (tmp))
              {
                print_exprs_edge (stderr, e,
                                  "\nConstant argument in PHI. Can't insert :",
                                  var, " = ", tmp);
-               abort ();
+               internal_error ("SSA corruption");
              }
+#else
+           gcc_assert (phi_ssa_name_p (tmp));
+#endif
            y = var_to_partition (map, tmp);
-           if (x == NO_PARTITION || y == NO_PARTITION)
-             abort ();
+           gcc_assert (x != NO_PARTITION);
+           gcc_assert (y != NO_PARTITION);
+#ifdef ENABLE_CHECKING
            if (root_var_find (rv, x) != root_var_find (rv, y))
              {
                print_exprs_edge (stderr, e, "\nDifferent root vars: ",
                                  root_var (rv, root_var_find (rv, x)), 
                                  " and ", 
                                  root_var (rv, root_var_find (rv, y)));
-               abort ();
+               internal_error ("SSA corruption");
              }
+#else
+           gcc_assert (root_var_find (rv, x) == root_var_find (rv, y));
+#endif
 
            if (x != y)
              {
-               if (!conflict_graph_conflict_p (graph, x, y))
-                 {
-                   /* Now map the partitions back to their real variables.  */
-                   var = partition_to_var (map, x);
-                   tmp = partition_to_var (map, y);
-                   if (dump_file 
-                       && (dump_flags & TDF_DETAILS))
-                     {
-                       print_exprs_edge (dump_file, e, 
-                                         "ABNORMAL: Coalescing ",
-                                         var, " and ", tmp);
-                     }
-                   if (var_union (map, var, tmp) == NO_PARTITION)
-                     {
-                       print_exprs_edge (stderr, e, "\nUnable to coalesce", 
-                                         partition_to_var (map, x), " and ", 
-                                         partition_to_var (map, y));
-                       abort ();
-                     }
-                   conflict_graph_merge_regs (graph, x, y);
-                 }
-               else
+#ifdef ENABLE_CHECKING
+               if (conflict_graph_conflict_p (graph, x, y))
                  {
                    print_exprs_edge (stderr, e, "\n Conflict ", 
                                      partition_to_var (map, x),
                                      " and ", partition_to_var (map, y));
-                   abort ();
+                   internal_error ("SSA corruption");
                  }
+#else
+               gcc_assert (!conflict_graph_conflict_p (graph, x, y));
+#endif
+               
+               /* Now map the partitions back to their real variables.  */
+               var = partition_to_var (map, x);
+               tmp = partition_to_var (map, y);
+               if (dump_file && (dump_flags & TDF_DETAILS))
+                 {
+                   print_exprs_edge (dump_file, e, 
+                                     "ABNORMAL: Coalescing ",
+                                     var, " and ", tmp);
+                 }
+#ifdef ENABLE_CHECKING
+               if (var_union (map, var, tmp) == NO_PARTITION)
+                 {
+                   print_exprs_edge (stderr, e, "\nUnable to coalesce", 
+                                     partition_to_var (map, x), " and ", 
+                                     partition_to_var (map, y));
+                   internal_error ("SSA corruption");
+                 }
+#else
+               gcc_assert (var_union (map, var, tmp) != NO_PARTITION);
+#endif
+               conflict_graph_merge_regs (graph, x, y);
              }
          }
 }
@@ -801,12 +806,9 @@ coalesce_ssa_name (var_map map, int flags)
       /* If these aren't already coalesced...  */
       if (partition_to_var (map, x) != var)
        {
-         if (ann->out_of_ssa_tag)
-           {
-             /* This root variable has already been assigned to another
-                partition which is not coalesced with this one.  */
-             abort ();
-           }
+         /* This root variable should have not already been assigned
+            to another partition which is not coalesced with this one.  */
+         gcc_assert (!ann->out_of_ssa_tag);
 
          if (dump_file && (dump_flags & TDF_DETAILS))
            {
@@ -1032,7 +1034,7 @@ eliminate_virtual_phis (void)
                      print_generic_expr (stderr, arg, TDF_SLIM);
                      fprintf (stderr, "), but the result is :");
                      print_generic_stmt (stderr, phi, TDF_SLIM);
-                     abort();
+                     internal_error ("SSA corruption");
                    }
                }
 #endif
@@ -1278,8 +1280,7 @@ free_temp_expr_table (temp_expr_table_p t)
 #ifdef ENABLE_CHECKING
   int x;
   for (x = 0; x <= num_var_partitions (t->map); x++)
-    if (t->partition_dep_list[x] != NULL)
-      abort();
+    gcc_assert (!t->partition_dep_list[x]);
 #endif
 
   while ((p = t->free_list))
@@ -1438,10 +1439,7 @@ add_dependance (temp_expr_table_p tab, int version, tree var)
   else
     {
       i = var_to_partition (tab->map, var);
-#ifdef ENABLE_CHECKING
-      if (i== NO_PARTITION)
-       abort ();
-#endif
+      gcc_assert (i != NO_PARTITION);
       add_value_to_list (tab, &(tab->partition_dep_list[i]), version);
       add_value_to_list (tab, 
                         (value_expr_p *)&(tab->version_info[version]), i);
@@ -1461,8 +1459,9 @@ check_replaceable (temp_expr_table_p tab, tree stmt)
   def_optype defs;
   use_optype uses;
   tree var, def;
-  int num_use_ops, version, i;
+  int num_use_ops, version;
   var_map map = tab->map;
+  ssa_op_iter iter;
 
   if (TREE_CODE (stmt) != MODIFY_EXPR)
     return false;
@@ -1477,11 +1476,6 @@ check_replaceable (temp_expr_table_p tab, tree stmt)
   if (version_ref_count (map, def) != 1)
     return false;
 
-  /* Assignments to variables assigned to hard registers are not
-     replaceable.  */
-  if (DECL_HARD_REGISTER (SSA_NAME_VAR (def)))
-    return false;
-
   /* There must be no V_MAY_DEFS.  */
   if (NUM_V_MAY_DEFS (V_MAY_DEF_OPS (ann)) != 0)
     return false;
@@ -1512,9 +1506,8 @@ check_replaceable (temp_expr_table_p tab, tree stmt)
   version = SSA_NAME_VERSION (def);
 
   /* Add this expression to the dependency list for each use partition.  */
-  for (i = 0; i < num_use_ops; i++)
+  FOR_EACH_SSA_TREE_OPERAND (var, stmt, iter, SSA_OP_USE)
     {
-      var = USE_OP (uses, i);
       add_dependance (tab, version, var);
     }
 
@@ -1548,16 +1541,10 @@ finish_expr (temp_expr_table_p tab, int version, bool replace)
   for (info = (value_expr_p) tab->version_info[version]; info; info = tmp)
     {
       partition = info->value;
-#ifdef ENABLE_CHECKING
-      if (tab->partition_dep_list[partition] == NULL)
-        abort ();
-#endif
+      gcc_assert (tab->partition_dep_list[partition]);
       tmp = remove_value_from_list (&(tab->partition_dep_list[partition]), 
                                    version);
-#ifdef ENABLE_CHECKING
-      if (!tmp)
-        abort ();
-#endif
+      gcc_assert (tmp);
       free_value_expr (tab, tmp);
       /* Only clear the bit when the dependency list is emptied via 
          a replacement. Otherwise kill_expr will take care of it.  */
@@ -1575,10 +1562,7 @@ finish_expr (temp_expr_table_p tab, int version, bool replace)
     }
   else
     {
-#ifdef ENABLE_CHECKING
-      if (bitmap_bit_p (tab->replaceable, version))
-       abort ();
-#endif
+      gcc_assert (!bitmap_bit_p (tab->replaceable, version));
       tab->version_info[version] = NULL;
     }
 }
@@ -1646,11 +1630,10 @@ find_replaceable_in_bb (temp_expr_table_p tab, basic_block bb)
   block_stmt_iterator bsi;
   tree stmt, def;
   stmt_ann_t ann;
-  int partition, num, i;
-  use_optype uses;
-  def_optype defs;
+  int partition;
   var_map map = tab->map;
   value_expr_p p;
+  ssa_op_iter iter;
 
   for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi))
     {
@@ -1658,11 +1641,8 @@ find_replaceable_in_bb (temp_expr_table_p tab, basic_block bb)
       ann = stmt_ann (stmt);
 
       /* Determine if this stmt finishes an existing expression.  */
-      uses = USE_OPS (ann);
-      num = NUM_USES (uses);
-      for (i = 0; i < num; i++)
+      FOR_EACH_SSA_TREE_OPERAND (def, stmt, iter, SSA_OP_USE)
        {
-         def = USE_OP (uses, i);
          if (tab->version_info[SSA_NAME_VERSION (def)])
            {
              /* Mark expression as replaceable unless stmt is volatile.  */
@@ -1674,11 +1654,8 @@ find_replaceable_in_bb (temp_expr_table_p tab, basic_block bb)
        }
       
       /* Next, see if this stmt kills off an active expression.  */
-      defs = DEF_OPS (ann);
-      num = NUM_DEFS (defs);
-      for (i = 0; i < num; i++)
+      FOR_EACH_SSA_TREE_OPERAND (def, stmt, iter, SSA_OP_DEF)
        {
-         def = DEF_OP (defs, i);
          partition = var_to_partition (map, def);
          if (partition != NO_PARTITION && tab->partition_dep_list[partition])
            kill_expr (tab, partition, true);
@@ -1725,11 +1702,13 @@ find_replaceable_exprs (var_map map)
   table = new_temp_expr_table (map);
   FOR_EACH_BB (bb)
     {
+      bitmap_iterator bi;
+
       find_replaceable_in_bb (table, bb);
-      EXECUTE_IF_SET_IN_BITMAP ((table->partition_in_use), 0, i,
+      EXECUTE_IF_SET_IN_BITMAP ((table->partition_in_use), 0, i, bi)
         {
          kill_expr (table, i, false);
-       });
+       }
     }
 
   ret = free_temp_expr_table (table);
@@ -1769,7 +1748,7 @@ discover_nonconstant_array_refs_r (tree * tp, int *walk_subtrees,
 {
   tree t = *tp;
 
-  if (TYPE_P (t) || DECL_P (t))
+  if (IS_TYPE_OR_DECL_P (t))
     *walk_subtrees = 0;
   else if (TREE_CODE (t) == ARRAY_REF || TREE_CODE (t) == ARRAY_RANGE_REF)
     {
@@ -1865,7 +1844,7 @@ rewrite_trees (var_map map, tree *values)
                      print_generic_expr (stderr, arg, TDF_SLIM);
                      fprintf (stderr, "), but the result is not :");
                      print_generic_stmt (stderr, phi, TDF_SLIM);
-                     abort();
+                     internal_error ("SSA corruption");
                    }
                }
            }
@@ -1880,13 +1859,15 @@ rewrite_trees (var_map map, tree *values)
     {
       for (si = bsi_start (bb); !bsi_end_p (si); )
        {
-         size_t i, num_uses, num_defs;
+         size_t num_uses, num_defs;
          use_optype uses;
          def_optype defs;
          tree stmt = bsi_stmt (si);
          use_operand_p use_p;
+         def_operand_p def_p;
          int remove = 0, is_copy = 0;
          stmt_ann_t ann;
+         ssa_op_iter iter;
 
          get_stmt_operands (stmt);
          ann = stmt_ann (stmt);
@@ -1898,10 +1879,8 @@ rewrite_trees (var_map map, tree *values)
 
          uses = USE_OPS (ann);
          num_uses = NUM_USES (uses);
-
-         for (i = 0; i < num_uses; i++)
+         FOR_EACH_SSA_USE_OPERAND (use_p, stmt, iter, SSA_OP_USE)
            {
-             use_p = USE_OP_PTR (uses, i);
              if (replace_use_variable (map, use_p, values))
                changed = true;
            }
@@ -1921,10 +1900,8 @@ rewrite_trees (var_map map, tree *values)
            }
          if (!remove)
            {
-             for (i = 0; i < num_defs; i++)
+             FOR_EACH_SSA_DEF_OPERAND (def_p, stmt, iter, SSA_OP_DEF)
                {
-                 def_operand_p def_p = DEF_OP_PTR (defs, i);
-
                  if (replace_def_variable (map, def_p, NULL))
                    changed = true;
 
@@ -1949,7 +1926,8 @@ rewrite_trees (var_map map, tree *values)
       phi = phi_nodes (bb);
       if (phi)
         {
-         for (e = bb->pred; e; e = e->pred_next)
+         edge_iterator ei;
+         FOR_EACH_EDGE (e, ei, bb->preds)
            eliminate_phi (e, phi_arg_from_edge (phi, e), g);
        }
     }
@@ -2111,5 +2089,6 @@ struct tree_opt_pass pass_del_ssa =
   PROP_ssa,                            /* properties_destroyed */
   TODO_verify_ssa | TODO_verify_flow
     | TODO_verify_stmts,               /* todo_flags_start */
-  TODO_dump_func | TODO_ggc_collect    /* todo_flags_finish */
+  TODO_dump_func | TODO_ggc_collect,   /* todo_flags_finish */
+  0                                    /* letter */
 };