-void be_ssa_constr_ignore(dom_front_info_t *info, int n_origs, ir_node *orig_nodes[],
- int n_copies, ir_node *copy_nodes[], pset *ignore_uses)
-{
- int n_all = n_copies + n_origs;
- pset *copies = pset_new_ptr(2 * n_all);
- pset *copy_blocks = pset_new_ptr(2 * n_all);
- pset *phi_blocks = pset_new_ptr(2 * n_all);
- int save_optimize = get_optimize();
- int save_normalize = get_opt_normalize();
- firm_dbg_module_t *dbg = DBG_MODULE;
-
- int i;
-
- firm_dbg_set_mask(dbg, DBG_LEVEL);
- // DBG((dbg, LEVEL_1, "Introducing following copies of %+F\n", orig));
-
- /* Fill the sets. */
- for(i = 0; i < n_origs; ++i) {
- pset_insert_ptr(copies, orig_nodes[i]);
- pset_insert_ptr(copy_blocks, get_nodes_block(orig_nodes[i]));
- }
-
- /*
- * All phis using the original values are also copies of it
- * and must be present in the copies set.
- */
- for(i = 0; i < n_copies; ++i) {
- ir_node *bl = get_nodes_block(copy_nodes[i]);
- DBG((dbg, LEVEL_1, "\t%+F in block %+F\n", copy_nodes[i], bl));
- pset_insert_ptr(copies, copy_nodes[i]);
- pset_insert_ptr(copy_blocks, get_nodes_block(bl));
- }
-
- /*
- * Disable optimization so that the phi functions do not
- * disappear.
- */
- set_optimize(0);
- set_opt_normalize(0);
-
- /*
- * Place the phi functions and reroute the usages.
- */
- determine_phi_blocks(copies, copy_blocks, phi_blocks, info);
- fix_usages(n_origs, orig_nodes, copies, copy_blocks, phi_blocks, ignore_uses);
-
- /* reset the optimizations */
- set_optimize(save_optimize);
- set_opt_normalize(save_normalize);
-
- del_pset(copies);
- del_pset(phi_blocks);
- del_pset(copy_blocks);
-
-}
-
-void be_ssa_constr(dom_front_info_t *info, int n_origs, ir_node *orig[], int n_copies, ir_node *copy_nodes[])
-{
- pset *empty_set = be_empty_set();
-
- assert(pset_count(empty_set) == 0);
- be_ssa_constr_ignore(info, n_origs, orig, n_copies, copy_nodes, empty_set);
-}
-
-
-void be_ssa_constr_single(dom_front_info_t *info, ir_node *orig, int n, ir_node *copy_nodes[])
-{
- pset *empty_set = be_empty_set();
-
- assert(pset_count(empty_set) == 0);
- be_ssa_constr_single_ignore(info, orig, n, copy_nodes, empty_set);
-}
-
-void be_ssa_constr_sets(dom_front_info_t *info, pset *origs, pset *copies)
-{
- int n_origs = pset_count(origs);
- int n_copies = pset_count(copies);
-
- ir_node **orig_nodes = alloca(n_origs * sizeof(orig_nodes[0]));
- ir_node **copy_nodes = alloca(n_copies * sizeof(orig_nodes[0]));
-
- ir_node *irn;
- int i;
-
- for(i = 0, irn = pset_first(origs); irn; irn = pset_next(origs))
- orig_nodes[i++] = irn;
-
- for(i = 0, irn = pset_first(copies); irn; irn = pset_next(copies))
- copy_nodes[i++] = irn;
-
- be_ssa_constr(info, n_origs, orig_nodes, n_copies, copy_nodes);
-}