- ir_node *c;
- const ir_edge_t *edge;
- ir_node **df_list = NEW_ARR_F(ir_node *, 0);
- ir_node **df;
- int len;
-
- /* Add local dominance frontiers */
- foreach_block_succ(blk, edge) {
- ir_node *y = edge->src;
-
- if (get_idom(y) != blk) {
- ARR_APP1(ir_node *, df_list, y);
- }
- }
-
- /*
- * Go recursively down the dominance tree and add all blocks
- * into the dominance frontiers of the children, which are not
- * dominated by the given block.
- */
- for (c = get_Block_dominated_first(blk); c; c = get_Block_dominated_next(c)) {
- int i;
- ir_node **df_c_list = compute_df(c, info);
-
- for (i = ARR_LEN(df_c_list) - 1; i >= 0; --i) {
- ir_node *w = df_c_list[i];
- if (get_idom(w) != blk)
- ARR_APP1(ir_node *, df_list, w);
- }
- }
-
- /* now copy the flexible array to the obstack */
- len = ARR_LEN(df_list);
- df = NEW_ARR_D(ir_node *, &info->obst, len);
- memcpy(df, df_list, len * sizeof(df[0]));
- DEL_ARR_F(df_list);
-
- pmap_insert(info->df_map, blk, df);
- return df;
-}
-
-be_dom_front_info_t *be_compute_dominance_frontiers(ir_graph *irg)
-{
- be_dom_front_info_t *info = xmalloc(sizeof(*info));
-
- edges_assure(irg);
- obstack_init(&info->obst);
- info->df_map = pmap_create();
- assure_doms(irg);
- (void)compute_df(get_irg_start_block(irg), info);
-
- return info;
-}
-
-void be_free_dominance_frontiers(be_dom_front_info_t *info)
-{
- obstack_free(&info->obst, NULL);
- pmap_destroy(info->df_map);
- free(info);
-}
-
-/* Get the dominance frontier of a block. */
-ir_node **be_get_dominance_frontier(be_dom_front_info_t *info, ir_node *block)
-{
- return pmap_get(info->df_map, block);
-}
-
-static void determine_phi_blocks(pset *copies, pset *copy_blocks, pset *phi_blocks, be_dom_front_info_t *df_info)
-{
- ir_node *bl;
- waitq *worklist = new_waitq();
- FIRM_DBG_REGISTER(firm_dbg_module_t *dbg, DBG_MODULE);
-
- /*
- * Fill the worklist queue and the rest of the orig blocks array.
- */
- for (bl = pset_first(copy_blocks); bl; bl = pset_next(copy_blocks)) {
- waitq_put(worklist, bl);
- }
-
- while (!pdeq_empty(worklist)) {
- ir_node *bl = waitq_get(worklist);
- ir_node **df = be_get_dominance_frontier(df_info, bl);
- int i;
-
- ir_node *y;
-
- DBG((dbg, LEVEL_3, "dom front of %+F\n", bl));
- DEBUG_ONLY(
- for (i = ARR_LEN(df) - 1; i >= 0; --i)
- DBG((dbg, LEVEL_3, "\t%+F\n", df[i]))
- );
-
- for (i = ARR_LEN(df) - 1; i >= 0; --i) {
- y = df[i];
- if (!pset_find_ptr(phi_blocks, y)) {
- pset_insert_ptr(phi_blocks, y);
-
- /*
- * Clear the link field of a possible phi block, since
- * the possibly created phi will be stored there. See,
- * search_def()
- */
- set_irn_link(y, NULL);
-
- if(!pset_find_ptr(copy_blocks, y))
- waitq_put(worklist, y);
- }
- }
- }
-
- del_waitq(worklist);