Exemplo n.º 1
0
ir_node *be_transform_phi(ir_node *node, const arch_register_req_t *req)
{
    ir_node  *block = be_transform_nodes_block(node);
    ir_graph *irg   = get_irn_irg(block);
    dbg_info *dbgi  = get_irn_dbg_info(node);

    /* phi nodes allow loops, so we use the old arguments for now
     * and fix this later */
    ir_node **ins   = get_irn_in(node)+1;
    int       arity = get_irn_arity(node);
    ir_mode  *mode  = req->cls != NULL ? req->cls->mode : get_irn_mode(node);
    ir_node  *phi   = new_ir_node(dbgi, irg, block, op_Phi, mode, arity, ins);
    copy_node_attr(irg, node, phi);

    backend_info_t *info = be_get_info(phi);
    info->in_reqs = be_allocate_in_reqs(irg, arity);
    for (int i = 0; i < arity; ++i) {
        info->in_reqs[i] = req;
    }

    arch_set_irn_register_req_out(phi, 0, req);
    be_enqueue_preds(node);

    return phi;
}
Exemplo n.º 2
0
/**
 * Transform helper for blocks.
 */
static ir_node *transform_block(ir_node *node)
{
	ir_node *const block = exact_copy(node);
	block->node_nr = node->node_nr;

	/* put the preds in the worklist */
	be_enqueue_preds(node);

	return block;
}
Exemplo n.º 3
0
static ir_node *transform_end(ir_node *node)
{
	/* Do not transform predecessors yet to keep the pre-transform
	 * phase from visiting all the graph. */
	ir_node *const block   = be_transform_nodes_block(node);
	ir_node *const new_end = exact_copy(node);
	set_nodes_block(new_end, block);

	ir_graph *const irg = get_irn_irg(new_end);
	set_irg_end(irg, new_end);

	be_enqueue_preds(node);

	return new_end;
}
Exemplo n.º 4
0
/**
 * Transform helper for blocks.
 */
static ir_node *transform_block(ir_node *node)
{
	ir_graph *irg   = get_irn_irg(node);
	dbg_info *dbgi  = get_irn_dbg_info(node);
	ir_mode  *mode  = get_irn_mode(node);
	ir_node  *block = new_ir_node(dbgi, irg, NULL, get_irn_op(node), mode,
	                              get_irn_arity(node), get_irn_in(node) + 1);
	copy_node_attr(irg, node, block);
	block->node_nr = node->node_nr;

	/* transfer execfreq value */
	double execfreq = get_block_execfreq(node);
	set_block_execfreq(block, execfreq);

	/* put the preds in the worklist */
	be_enqueue_preds(node);

	return block;
}
Exemplo n.º 5
0
static ir_node *transform_end(ir_node *node)
{
	/* end has to be duplicated manually because we need a dynamic in array */
	ir_graph *irg     = get_irn_irg(node);
	dbg_info *dbgi    = get_irn_dbg_info(node);
	ir_node  *block   = be_transform_node(get_nodes_block(node));
	ir_node  *new_end = new_ir_node(dbgi, irg, block, op_End, mode_X, -1, NULL);
	copy_node_attr(irg, node, new_end);
	be_duplicate_deps(node, new_end);

	set_irg_end(irg, new_end);

	/* do not transform predecessors yet to keep the pre-transform
	 * phase from visiting all the graph */
	int arity = get_irn_arity(node);
	for (int i = 0; i < arity; ++i) {
		ir_node *in = get_irn_n(node, i);
		add_End_keepalive(new_end, in);
	}
	be_enqueue_preds(node);

	return new_end;
}