-/* Maps the old ssa name FROM_NAME to TO_NAME. */
-
-struct ssa_name_map_entry
-{
- tree from_name;
- tree to_name;
-};
-
-/* Hash function for ssa_name_map_entry. */
-
-static hashval_t
-ssa_name_map_entry_hash (const void *entry)
-{
- const struct ssa_name_map_entry *en = entry;
- return SSA_NAME_VERSION (en->from_name);
-}
-
-/* Equality function for ssa_name_map_entry. */
-
-static int
-ssa_name_map_entry_eq (const void *in_table, const void *ssa_name)
-{
- const struct ssa_name_map_entry *en = in_table;
-
- return en->from_name == ssa_name;
-}
-
-/* Allocate duplicates of ssa names in list DEFINITIONS and store the mapping
- to MAP. */
-
-void
-allocate_ssa_names (bitmap definitions, htab_t *map)
-{
- tree name;
- struct ssa_name_map_entry *entry;
- PTR *slot;
- unsigned ver;
- bitmap_iterator bi;
-
- if (!*map)
- *map = htab_create (10, ssa_name_map_entry_hash,
- ssa_name_map_entry_eq, free);
- EXECUTE_IF_SET_IN_BITMAP (definitions, 0, ver, bi)
- {
- name = ssa_name (ver);
- slot = htab_find_slot_with_hash (*map, name, SSA_NAME_VERSION (name),
- INSERT);
- if (*slot)
- entry = *slot;
- else
- {
- entry = xmalloc (sizeof (struct ssa_name_map_entry));
- entry->from_name = name;
- *slot = entry;
- }
- entry->to_name = duplicate_ssa_name (name, SSA_NAME_DEF_STMT (name));
- }
-}
-
-/* Rewrite the definition DEF in statement STMT to new ssa name as specified
- by the mapping MAP. */
-
-static void
-rewrite_to_new_ssa_names_def (def_operand_p def, tree stmt, htab_t map)
-{
- tree name = DEF_FROM_PTR (def);
- struct ssa_name_map_entry *entry;
-
- gcc_assert (TREE_CODE (name) == SSA_NAME);
-
- entry = htab_find_with_hash (map, name, SSA_NAME_VERSION (name));
- if (!entry)
- return;
-
- SET_DEF (def, entry->to_name);
- SSA_NAME_DEF_STMT (entry->to_name) = stmt;
-}
-
-/* Rewrite the USE to new ssa name as specified by the mapping MAP. */
-
-static void
-rewrite_to_new_ssa_names_use (use_operand_p use, htab_t map)
-{
- tree name = USE_FROM_PTR (use);
- struct ssa_name_map_entry *entry;
-
- if (TREE_CODE (name) != SSA_NAME)
- return;
-
- entry = htab_find_with_hash (map, name, SSA_NAME_VERSION (name));
- if (!entry)
- return;
-
- SET_USE (use, entry->to_name);
-}
-
-/* Rewrite the ssa names in basic block BB to new ones as specified by the
- mapping MAP. */
-
-void
-rewrite_to_new_ssa_names_bb (basic_block bb, htab_t map)
-{
- unsigned i;
- edge e;
- edge_iterator ei;
- tree phi, stmt;
- block_stmt_iterator bsi;
- use_optype uses;
- vuse_optype vuses;
- def_optype defs;
- v_may_def_optype v_may_defs;
- v_must_def_optype v_must_defs;
- stmt_ann_t ann;
-
- FOR_EACH_EDGE (e, ei, bb->preds)
- if (e->flags & EDGE_ABNORMAL)
- break;
-
- for (phi = phi_nodes (bb); phi; phi = PHI_CHAIN (phi))
- {
- rewrite_to_new_ssa_names_def (PHI_RESULT_PTR (phi), phi, map);
- if (e)
- SSA_NAME_OCCURS_IN_ABNORMAL_PHI (PHI_RESULT (phi)) = 1;
- }
-
- for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi))
- {
- stmt = bsi_stmt (bsi);
- get_stmt_operands (stmt);
- ann = stmt_ann (stmt);
-
- uses = USE_OPS (ann);
- for (i = 0; i < NUM_USES (uses); i++)
- rewrite_to_new_ssa_names_use (USE_OP_PTR (uses, i), map);
-
- defs = DEF_OPS (ann);
- for (i = 0; i < NUM_DEFS (defs); i++)
- rewrite_to_new_ssa_names_def (DEF_OP_PTR (defs, i), stmt, map);
-
- vuses = VUSE_OPS (ann);
- for (i = 0; i < NUM_VUSES (vuses); i++)
- rewrite_to_new_ssa_names_use (VUSE_OP_PTR (vuses, i), map);
-
- v_may_defs = V_MAY_DEF_OPS (ann);
- for (i = 0; i < NUM_V_MAY_DEFS (v_may_defs); i++)
- {
- rewrite_to_new_ssa_names_use
- (V_MAY_DEF_OP_PTR (v_may_defs, i), map);
- rewrite_to_new_ssa_names_def
- (V_MAY_DEF_RESULT_PTR (v_may_defs, i), stmt, map);
- }
-
- v_must_defs = V_MUST_DEF_OPS (ann);
- for (i = 0; i < NUM_V_MUST_DEFS (v_must_defs); i++)
- {
- rewrite_to_new_ssa_names_def
- (V_MUST_DEF_RESULT_PTR (v_must_defs, i), stmt, map);
- rewrite_to_new_ssa_names_use
- (V_MUST_DEF_KILL_PTR (v_must_defs, i), map);
- }
- }
-
- FOR_EACH_EDGE (e, ei, bb->succs)
- for (phi = phi_nodes (e->dest); phi; phi = PHI_CHAIN (phi))
- {
- rewrite_to_new_ssa_names_use
- (PHI_ARG_DEF_PTR_FROM_EDGE (phi, e), map);
-
- if (e->flags & EDGE_ABNORMAL)
- {
- tree op = PHI_ARG_DEF_FROM_EDGE (phi, e);
- SSA_NAME_OCCURS_IN_ABNORMAL_PHI (op) = 1;
- }
- }
-}
-
-/* Rewrite the ssa names in N_REGION blocks REGION to the new ones as specified
- by the mapping MAP. */
-
-void
-rewrite_to_new_ssa_names (basic_block *region, unsigned n_region, htab_t map)
-{
- unsigned r;
-
- for (r = 0; r < n_region; r++)
- rewrite_to_new_ssa_names_bb (region[r], map);
-}
-