return new_len;
}
-/* Return a PHI node for variable VAR defined in statement STMT.
- STMT may be an empty statement for artificial references (e.g., default
- definitions created when a variable is used without a preceding
- definition). */
+
+/* Return a PHI node with LEN argument slots for variable VAR. */
static tree
make_phi_node (tree var, int len)
{
tree phi;
- int capacity;
+ int capacity, i;
capacity = ideal_phi_node_len (len);
else
SET_PHI_RESULT (phi, make_ssa_name (var, phi));
+ for (i = 0; i < capacity; i++)
+ {
+ ssa_imm_use_t * imm;
+ imm = &(PHI_ARG_IMM_USE_NODE (phi, i));
+ imm->use = &(PHI_ARG_DEF_TREE (phi, i));
+ imm->prev = NULL;
+ imm->next = NULL;
+ imm->stmt = phi;
+ }
return phi;
}
{
int bucket;
int len = PHI_ARG_CAPACITY (phi);
+ int x;
+
+ for (x = 0; x < PHI_NUM_ARGS (phi); x++)
+ {
+ ssa_imm_use_t * imm;
+ imm = &(PHI_ARG_IMM_USE_NODE (phi, x));
+ delink_imm_use (imm);
+ }
bucket = len > NUM_BUCKETS - 1 ? NUM_BUCKETS - 1 : len;
bucket -= 2;
static void
resize_phi_node (tree *phi, int len)
{
- int old_size;
+ int old_size, i;
tree new_phi;
gcc_assert (len > PHI_ARG_CAPACITY (*phi));
memcpy (new_phi, *phi, old_size);
+ for (i = 0; i < PHI_NUM_ARGS (new_phi); i++)
+ {
+ ssa_imm_use_t *imm, *old_imm;
+ imm = &(PHI_ARG_IMM_USE_NODE (new_phi, i));
+ old_imm = &(PHI_ARG_IMM_USE_NODE (*phi, i));
+ imm->use = &(PHI_ARG_DEF_TREE (new_phi, i));
+ relink_imm_use_stmt (imm, old_imm, new_phi);
+ }
+
PHI_ARG_CAPACITY (new_phi) = len;
+ for (i = PHI_NUM_ARGS (new_phi); i < len; i++)
+ {
+ ssa_imm_use_t * imm;
+ imm = &(PHI_ARG_IMM_USE_NODE (new_phi, i));
+ imm->use = &(PHI_ARG_DEF_TREE (new_phi, i));
+ imm->prev = NULL;
+ imm->next = NULL;
+ imm->stmt = new_phi;
+ }
+
+
*phi = new_phi;
}
gcc_assert (i < num_elem);
+ /* Delink the last item, which is being removed. */
+ delink_imm_use (&(PHI_ARG_IMM_USE_NODE (phi, num_elem - 1)));
+
/* If we are not at the last element, switch the last element
with the element we want to delete. */
if (i != num_elem - 1)
used as the node immediately before PHI in the linked list. */
void
-remove_phi_node (tree phi, tree prev, basic_block bb)
+remove_phi_node (tree phi, tree prev)
{
tree *loc;
}
else
{
- for (loc = &(bb_ann (bb)->phi_nodes);
+ for (loc = &(bb_ann (bb_for_stmt (phi))->phi_nodes);
*loc != phi;
loc = &PHI_CHAIN (*loc))
;
/* If we are deleting the PHI node, then we should release the
SSA_NAME node so that it can be reused. */
- release_ssa_name (PHI_RESULT (phi));
release_phi_node (phi);
+ release_ssa_name (PHI_RESULT (phi));
}
-/* Remove all the PHI nodes for variables in the VARS bitmap. */
+/* Find the first PHI node P in basic block BB for symbol SYM. If
+ PREV_P is given, the PHI node preceding P is stored in *PREV_P. */
-void
-remove_all_phi_nodes_for (bitmap vars)
+tree
+find_phi_node_for (basic_block bb, tree sym, tree *prev_p)
{
- basic_block bb;
-
- FOR_EACH_BB (bb)
- {
- /* Build a new PHI list for BB without variables in VARS. */
- tree phi, new_phi_list, next;
- tree *lastp = &new_phi_list;
+ tree phi;
- for (phi = phi_nodes (bb); phi; phi = next)
- {
- tree var = SSA_NAME_VAR (PHI_RESULT (phi));
-
- next = PHI_CHAIN (phi);
- /* Only add PHI nodes for variables not in VARS. */
- if (!bitmap_bit_p (vars, var_ann (var)->uid))
- {
- /* If we're not removing this PHI node, then it must have
- been rewritten by a previous call into the SSA rewriter.
- Note that fact in PHI_REWRITTEN. */
- PHI_REWRITTEN (phi) = 1;
-
- *lastp = phi;
- lastp = &PHI_CHAIN (phi);
- }
- else
- {
- /* If we are deleting the PHI node, then we should release the
- SSA_NAME node so that it can be reused. */
- release_ssa_name (PHI_RESULT (phi));
- release_phi_node (phi);
- }
- }
+ if (prev_p)
+ *prev_p = NULL_TREE;
- /* Make sure the last node in the new list has no successors. */
- *lastp = NULL;
- bb_ann (bb)->phi_nodes = new_phi_list;
+ for (phi = phi_nodes (bb); phi; phi = PHI_CHAIN (phi))
+ {
+ if (SSA_NAME_VAR (PHI_RESULT (phi)) == sym)
+ return phi;
-#if defined ENABLE_CHECKING
- for (phi = phi_nodes (bb); phi; phi = PHI_CHAIN (phi))
- {
- tree var = SSA_NAME_VAR (PHI_RESULT (phi));
- gcc_assert (!bitmap_bit_p (vars, var_ann (var)->uid));
- }
-#endif
+ if (prev_p)
+ *prev_p = phi;
}
+
+ return NULL_TREE;
}
+
/* Reverse the order of PHI nodes in the chain PHI.
Return the new head of the chain (old last PHI node). */
}
#include "gt-tree-phinodes.h"
-