OSDN Git Service

2005-01-07 Andrew Pinski <pinskia@physics.uc.edu>
[pf3gnuchains/gcc-fork.git] / gcc / tree-ssa.c
index 1e2b59d..24b5697 100644 (file)
@@ -46,19 +46,6 @@ Boston, MA 02111-1307, USA.  */
 #include "tree-dump.h"
 #include "tree-pass.h"
 
-
-/* Remove edge E and remove the corresponding arguments from the PHI nodes
-   in E's destination block.  */
-
-void
-ssa_remove_edge (edge e)
-{
-  /* Remove all PHI arguments for E.  */
-  remove_phi_args (e);
-
-  remove_edge (e);
-}
-
 /* Remove the corresponding arguments from the PHI nodes in E's
    destination block and redirect it to DEST.  Return redirected edge.
    The list of removed arguments is stored in PENDING_STMT (e).  */
@@ -77,7 +64,7 @@ ssa_redirect_edge (edge e, basic_block dest)
       next = PHI_CHAIN (phi);
 
       i = phi_arg_from_edge (phi, e);
-      if (i < 0)
+      if (PHI_ARG_DEF (phi, i) == NULL_TREE)
        continue;
 
       src = PHI_ARG_DEF (phi, i);
@@ -85,8 +72,6 @@ ssa_redirect_edge (edge e, basic_block dest)
       node = build_tree_list (dst, src);
       *last = node;
       last = &TREE_CHAIN (node);
-
-      remove_phi_arg_num (phi, i);
     }
 
   e = redirect_edge_succ_nodup (e, dest);
@@ -111,7 +96,7 @@ flush_pending_stmts (edge e)
        phi = PHI_CHAIN (phi), arg = TREE_CHAIN (arg))
     {
       tree def = TREE_VALUE (arg);
-      add_phi_arg (&phi, def, e);
+      add_phi_arg (phi, def, e);
     }
 
   PENDING_STMT (e) = NULL;
@@ -292,7 +277,6 @@ verify_phi_args (tree phi, basic_block bb, basic_block *definition_block)
   edge e;
   bool err = false;
   unsigned i, phi_num_args = PHI_NUM_ARGS (phi);
-  edge_iterator ei;
 
   if (EDGE_COUNT (bb->preds) != phi_num_args)
     {
@@ -301,22 +285,27 @@ verify_phi_args (tree phi, basic_block bb, basic_block *definition_block)
       goto error;
     }
 
-  /* Mark all the incoming edges.  */
-  FOR_EACH_EDGE (e, ei, bb->preds)
-    e->aux = (void *) 1;
-
   for (i = 0; i < phi_num_args; i++)
     {
       tree op = PHI_ARG_DEF (phi, i);
 
+      e = EDGE_PRED (bb, i);
+
+      if (op == NULL_TREE)
+       {
+         error ("PHI argument is missing for edge %d->%d\n",
+                e->src->index,
+                e->dest->index);
+         err = true;
+         goto error;
+       }
+
       if (TREE_CODE (op) != SSA_NAME && !is_gimple_min_invariant (op))
        {
          error ("PHI argument is not SSA_NAME, or invariant");
          err = true;
        }
 
-      e = PHI_ARG_EDGE (phi, i);
-
       if (TREE_CODE (op) == SSA_NAME)
        err = verify_use (e->src, definition_block[SSA_NAME_VERSION (op)], op,
                          phi, e->flags & EDGE_ABNORMAL,
@@ -330,21 +319,12 @@ verify_phi_args (tree phi, basic_block bb, basic_block *definition_block)
          err = true;
        }
 
-      if (e->aux == (void *) 0)
-       {
-         error ("PHI argument flowing through dead or duplicated edge %d->%d\n",
-                e->src->index, e->dest->index);
-         err = true;
-       }
-
       if (err)
        {
          fprintf (stderr, "PHI argument\n");
          print_generic_stmt (stderr, op, TDF_VOPS);
          goto error;
        }
-
-      e->aux = (void *) 0;
     }
 
 error:
@@ -424,31 +404,34 @@ verify_flow_sensitive_alias_info (void)
 
   for (i = 1; i < num_ssa_names; i++)
     {
+      tree var;
       var_ann_t ann;
       struct ptr_info_def *pi;
 
       ptr = ssa_name (i);
       if (!ptr)
        continue;
-      ann = var_ann (SSA_NAME_VAR (ptr));
-      pi = SSA_NAME_PTR_INFO (ptr);
 
       /* We only care for pointers that are actually referenced in the
         program.  */
-      if (!TREE_VISITED (ptr) || !POINTER_TYPE_P (TREE_TYPE (ptr)))
+      if (!POINTER_TYPE_P (TREE_TYPE (ptr)) || !TREE_VISITED (ptr))
        continue;
 
       /* RESULT_DECL is special.  If it's a GIMPLE register, then it
         is only written-to only once in the return statement.
         Otherwise, aggregate RESULT_DECLs may be written-to more than
         once in virtual operands.  */
-      if (TREE_CODE (SSA_NAME_VAR (ptr)) == RESULT_DECL
+      var = SSA_NAME_VAR (ptr);
+      if (TREE_CODE (var) == RESULT_DECL
          && is_gimple_reg (ptr))
        continue;
 
+      pi = SSA_NAME_PTR_INFO (ptr);
       if (pi == NULL)
        continue;
 
+      ann = var_ann (var);
       if (pi->is_dereferenced && !pi->name_mem_tag && !ann->type_mem_tag)
        {
          error ("Dereferenced pointers should have a name or a type tag");
@@ -1155,7 +1138,7 @@ check_phi_redundancy (tree phi, tree *eq_to)
        }
 
       if (val
-         && !operand_equal_p (val, def, 0))
+         && !operand_equal_for_phi_arg_p (val, def))
        return;
 
       val = def;
@@ -1273,7 +1256,7 @@ struct tree_opt_pass pass_redundant_phi =
   NULL,                                        /* sub */
   NULL,                                        /* next */
   0,                                   /* static_pass_number */
-  0,                                   /* tv_id */
+  TV_TREE_REDPHI,                      /* tv_id */
   PROP_cfg | PROP_ssa | PROP_alias,    /* properties_required */
   0,                                   /* properties_provided */
   0,                                   /* properties_destroyed */