+/* Reserve PHI arguments for a new edge to basic block BB. */
+
+void
+reserve_phi_args_for_new_edge (basic_block bb)
+{
+ tree *loc;
+ int len = EDGE_COUNT (bb->preds);
+ int cap = ideal_phi_node_len (len + 4);
+
+ for (loc = &(bb_ann (bb)->phi_nodes);
+ *loc;
+ loc = &PHI_CHAIN (*loc))
+ {
+ if (len > PHI_ARG_CAPACITY (*loc))
+ {
+ tree old_phi = *loc;
+
+ resize_phi_node (loc, cap);
+
+ /* The result of the phi is defined by this phi node. */
+ SSA_NAME_DEF_STMT (PHI_RESULT (*loc)) = *loc;
+
+ release_phi_node (old_phi);
+ }
+
+ /* We represent a "missing PHI argument" by placing NULL_TREE in
+ the corresponding slot. If PHI arguments were added
+ immediately after an edge is created, this zeroing would not
+ be necessary, but unfortunately this is not the case. For
+ example, the loop optimizer duplicates several basic blocks,
+ redirects edges, and then fixes up PHI arguments later in
+ batch. */
+ SET_PHI_ARG_DEF (*loc, len - 1, NULL_TREE);
+
+ PHI_NUM_ARGS (*loc)++;
+ }
+}
+