- pre_env *env = ctx;
- block_info *dom_info;
- block_info *info = get_block_info(block);
- ir_node *dom_blk;
-
- /* we don't need the end block Avail */
- if (block == env->end_block)
- return;
-
- /*
- * First add all nodes from the dominator.
- * This must be done to ensure that Antic_out contains the leader
- * for every node. The root has no dominator.
- */
- if (block != env->start_block) {
- dom_blk = get_Block_idom(block);
- assert(is_Block(dom_blk));
-
- dom_info = get_block_info(dom_blk);
- assert(dom_info);
-
- value_union(info->avail_out, dom_info->avail_out);
- }
- value_union_nodes(info->avail_out, info->nodes);
-
- dump_value_set(info->avail_out, "Avail_out", block);
-}
-
-/**
- * returns non-zero if a tree node must be copied because of
- * a phi_translate.
- */
-static int need_copy(ir_node *node, ir_node *block)
-{
- int i, arity;
-
- /* Phi always stop the recursion */
- if (is_Phi(node))
- return get_irn_intra_n(node, -1) == block;
-
- if (! is_nice_value(node))
- return 0;
-
- /* check predecessor */
- arity = get_irn_intra_arity(node);
- for (i = 0; i < arity; ++i) {
- ir_node *pred = get_irn_intra_n(node, i);
- ir_node *local_bl = get_irn_intra_n(pred, -1);
- ir_node *leader = value_lookup(get_block_info(local_bl)->avail_out, pred);
-
- pred = leader != NULL ? leader : pred;
- if (need_copy(pred, block))
- return 1;
- }
- return 0;
-}
-
-/**
- * Translate a node
- */
-static ir_node *translate(ir_node *node, ir_node *block, int pos, pre_env *env)
-{
- int i, arity, need_new;
- ir_node *res, *nn, **in;
-
- /* Phi always stop the recursion */
- if (is_Phi(node)) {
- if (get_irn_intra_n(node, -1) == block)
- return get_Phi_pred(node, pos);
- return node;
- }
-
- if (! is_nice_value(node))
- return node;
-
- arity = get_irn_intra_arity(node);
- if (arity > 0) {
- NEW_ARR_A(ir_node *, in, arity);
- i = arity - 1;
- need_new = 0;
- do {
- ir_node *pred = get_irn_intra_n(node, i);
- ir_node *pred_blk = get_irn_intra_n(pred, -1);
- ir_node *leader = value_lookup(get_block_info(pred_blk)->avail_out, pred);
- in[i] = translate(leader ? leader : pred, block, pos, env);
- need_new |= (in[i] != pred);
- --i;
- } while(i >= 0);
- if (! need_new)
- return node;
-
- /* create a copy */
- nn = new_ir_node(
- get_irn_dbg_info(node),
- current_ir_graph,
- get_Block_cfgpred_block(block, pos),
- get_irn_op(node),
- get_irn_mode(node),
- arity,
- in);
- /* We need the attribute copy here, because the Hash value of a
- node might depend on that. */
- copy_node_attr(node, nn);
- res = node_add(env->trans_set, nn);
- if (nn != res)
- obstack_free(env->obst, nn);
- else
- DB((dbg, LEVEL_2, "--> Translate %+F in <%+F,%d> into %+F\n", node, block, pos, res));
- return res;
- }
- return node;
-}
-
-/**
- * Implements phi_translate.
- */
-static ir_node *deep_phi_translate(ir_node *node, ir_node *block, int pos, pre_env *env)
-{
- struct obstack *old;
- ir_node *res;
-
- if (! need_copy(node, block))
- return node;
-
- /* Create a copy of the node in the pos'th predecessor block.
- Use our environmental obstack, as these nodes are always
- temporary. */
- old = current_ir_graph->obst;
- current_ir_graph->obst = env->obst;
- res = translate(node, block, pos, env);
- current_ir_graph->obst = old;
-
- return res;
-} /* phi_translate */
-
-/**
- * Implements phi_translate.
- */
-static ir_node *phi_translate(ir_node *node, ir_node *block, int pos, pre_env *env)
-{
- ir_node *nn, *res;
- int i, arity;
- struct obstack *old;
- ir_node *pred_block = get_Block_cfgpred_block(block, pos);
- block_info *pred_info = get_block_info(pred_block);
-
- if (is_Phi(node)) {
- if (get_irn_intra_n(node, -1) == block)
- return get_Phi_pred(node, pos);
- return node;
- }
-
- arity = get_irn_intra_arity(node);
-
- /* check if the node has at least one Phi predecessor */
- for (i = 0; i < arity; ++i) {
- ir_node *pred = get_irn_intra_n(node, i);
- ir_node *pred_bl = get_irn_intra_n(pred, -1);
- ir_node *leader = value_lookup(get_block_info(pred_bl)->avail_out, pred);
-
- leader = leader != NULL ? leader : pred;
- if (is_Phi(leader) && get_irn_intra_n(pred, -1) == block)
- break;
- }
- if (i >= arity) {
- /* no Phi in the predecessors */
- return node;
- }
-
- /* Create a copy of the node in the pos'th predecessor block.
- Use our environmental obstack, as these nodes are always
- temporary. */
- old = current_ir_graph->obst;
- current_ir_graph->obst = env->obst;
- nn = new_ir_node(
- get_irn_dbg_info(node),
- current_ir_graph,
- NULL,
- get_irn_op(node),
- get_irn_mode(node),
- arity,
- get_irn_in(node));
- /* We need the attribute copy here, because the Hash value of a
- node might depend on that. */
- copy_node_attr(node, nn);
-
- set_irn_n(nn, -1, get_irn_intra_n(node, -1));
- for (i = 0; i < arity; ++i) {
- ir_node *pred = get_irn_intra_n(node, i);
- ir_node *pred_bl = get_irn_intra_n(pred, -1);
- ir_node *leader = value_lookup(get_block_info(pred_bl)->avail_out, pred);
-
- leader = leader != NULL ? leader : pred;
- if (is_Phi(leader) && get_irn_intra_n(pred, -1) == block)
- set_irn_n(nn, i, get_Phi_pred(leader, pos));
- else
- set_irn_n(nn, i, leader);
- }
- res = node_add(env->trans_set, nn);
- current_ir_graph->obst = old;
-
- if (nn != res)
- obstack_free(env->obst, nn);
- else {
- DB((dbg, LEVEL_2, "--> Translate %+F in <%+F,%d> into %+F\n", node, block, pos, res));
- }
- return res;
-} /* phi_translate */