OSDN Git Service

2004-10-23 Daniel Berlin <dberlin@dberlin.org>
[pf3gnuchains/gcc-fork.git] / gcc / tree-phinodes.c
index 1b98fcd..6dc5c76 100644 (file)
@@ -202,10 +202,11 @@ make_phi_node (tree var, int len)
   memset (phi, 0, size);
   TREE_SET_CODE (phi, PHI_NODE);
   PHI_ARG_CAPACITY (phi) = len;
+  TREE_TYPE (phi) = TREE_TYPE (var);
   if (TREE_CODE (var) == SSA_NAME)
-    PHI_RESULT (phi) = var;
+    SET_PHI_RESULT (phi, var);
   else
-    PHI_RESULT (phi) = make_ssa_name (var, phi);
+    SET_PHI_RESULT (phi, make_ssa_name (var, phi));
 
   return phi;
 }
@@ -234,12 +235,9 @@ resize_phi_node (tree *phi, int len)
   int size, old_size;
   tree new_phi;
   int i, old_len, bucket = NUM_BUCKETS - 2;
-                                                                                
-#ifdef ENABLE_CHECKING
-  if (len < PHI_ARG_CAPACITY (*phi))
-    abort ();
-#endif
-                                                                                
+
+  gcc_assert (len >= PHI_ARG_CAPACITY (*phi));
+
   /* Note that OLD_SIZE is guaranteed to be smaller than SIZE.  */
   old_size = (sizeof (struct tree_phi_node)
             + (PHI_ARG_CAPACITY (*phi) - 1) * sizeof (struct phi_arg_d));
@@ -278,7 +276,7 @@ resize_phi_node (tree *phi, int len)
                                                                                 
   for (i = old_len; i < len; i++)
     {
-      PHI_ARG_DEF (new_phi, i) = NULL_TREE;
+      SET_PHI_ARG_DEF (new_phi, i, NULL_TREE);
       PHI_ARG_EDGE (new_phi, i) = NULL;
       PHI_ARG_NONZERO (new_phi, i) = false;
     }
@@ -293,7 +291,7 @@ create_phi_node (tree var, basic_block bb)
 {
   tree phi;
 
-  phi = make_phi_node (var, bb_ann (bb)->num_preds);
+  phi = make_phi_node (var, EDGE_COUNT (bb->preds));
 
   /* This is a new phi node, so note that is has not yet been
      rewritten.  */
@@ -334,24 +332,29 @@ add_phi_arg (tree *phi, tree def, edge e)
         release the old PHI node.  */
       if (*phi != old_phi)
        {
+         /* Extract the basic block for the PHI from the PHI's annotation
+            rather than the edge.  This works better as the edge's
+            destination may not currently be the block with the PHI
+            node if we are in the process of threading the edge to
+            a new destination.  */
+         basic_block bb = bb_for_stmt (*phi);
+
          release_phi_node (old_phi);
 
          /* Update the list head if replacing the first listed phi.  */
-         if (phi_nodes (e->dest) == old_phi)
-           bb_ann (e->dest)->phi_nodes = *phi;
+         if (phi_nodes (bb) == old_phi)
+           bb_ann (bb)->phi_nodes = *phi;
          else
            {
              /* Traverse the list looking for the phi node to chain to.  */
              tree p;
 
-             for (p = phi_nodes (e->dest);
+             for (p = phi_nodes (bb);
                   p && PHI_CHAIN (p) != old_phi;
                   p = PHI_CHAIN (p))
                ;
 
-             if (!p)
-               abort ();
-
+             gcc_assert (p);
              PHI_CHAIN (p) = *phi;
            }
        }
@@ -365,7 +368,7 @@ add_phi_arg (tree *phi, tree def, edge e)
       SSA_NAME_OCCURS_IN_ABNORMAL_PHI (PHI_RESULT (*phi)) = 1;
     }
 
-  PHI_ARG_DEF (*phi, i) = def;
+  SET_PHI_ARG_DEF (*phi, i, def);
   PHI_ARG_EDGE (*phi, i) = e;
   PHI_ARG_NONZERO (*phi, i) = false;
   PHI_NUM_ARGS (*phi)++;
@@ -408,13 +411,13 @@ remove_phi_arg_num (tree phi, int i)
      with the element we want to delete.  */
   if (i != num_elem - 1)
     {
-      PHI_ARG_DEF (phi, i) = PHI_ARG_DEF (phi, num_elem - 1);
+      SET_PHI_ARG_DEF (phi, i, PHI_ARG_DEF (phi, num_elem - 1));
       PHI_ARG_EDGE (phi, i) = PHI_ARG_EDGE (phi, num_elem - 1);
       PHI_ARG_NONZERO (phi, i) = PHI_ARG_NONZERO (phi, num_elem - 1);
     }
 
   /* Shrink the vector and return.  */
-  PHI_ARG_DEF (phi, num_elem - 1) = NULL_TREE;
+  SET_PHI_ARG_DEF (phi, num_elem - 1, NULL_TREE);
   PHI_ARG_EDGE (phi, num_elem - 1) = NULL;
   PHI_ARG_NONZERO (phi, num_elem - 1) = false;
   PHI_NUM_ARGS (phi)--;
@@ -516,8 +519,7 @@ remove_all_phi_nodes_for (bitmap vars)
       for (phi = phi_nodes (bb); phi; phi = PHI_CHAIN (phi))
        {
          tree var = SSA_NAME_VAR (PHI_RESULT (phi));
-         if (bitmap_bit_p (vars, var_ann (var)->uid))
-           abort ();
+         gcc_assert (!bitmap_bit_p (vars, var_ann (var)->uid));
        }
 #endif
     }