-/**
- * Creates a barrier.
- */
-static ir_node *create_barrier(ir_node *bl, ir_node **mem, pmap *regs,
- int in_req)
-{
- int n_regs = pmap_count(regs);
- int n;
- ir_node *irn;
- ir_node **in;
- reg_node_map_t *rm;
-
- in = ALLOCAN(ir_node*, n_regs+1);
- rm = ALLOCAN(reg_node_map_t, n_regs);
- reg_map_to_arr(rm, regs);
- for (n = 0; n < n_regs; ++n) {
- in[n] = rm[n].irn;
- }
-
- if (mem) {
- in[n++] = *mem;
- }
-
- irn = be_new_Barrier(bl, n, in);
-
- for (n = 0; n < n_regs; ++n) {
- ir_node *pred = rm[n].irn;
- const arch_register_t *reg = rm[n].reg;
- arch_register_req_type_t add_type = arch_register_req_type_none;
- ir_node *proj;
- const backend_info_t *info;
-
- /* stupid workaround for now... as not all nodes report register
- * requirements. */
- info = be_get_info(skip_Proj(pred));
- if (info != NULL && info->out_infos != NULL) {
- const arch_register_req_t *ireq = arch_get_register_req_out(pred);
- if (ireq->type & arch_register_req_type_ignore)
- add_type |= arch_register_req_type_ignore;
- if (ireq->type & arch_register_req_type_produces_sp)
- add_type |= arch_register_req_type_produces_sp;
- }
-
- proj = new_r_Proj(irn, get_irn_mode(pred), n);
- be_node_set_reg_class_in(irn, n, reg->reg_class);
- if (in_req) {
- be_set_constr_single_reg_in(irn, n, reg,
- arch_register_req_type_none);
- }
- be_set_constr_single_reg_out(irn, n, reg, add_type);
- arch_set_irn_register(proj, reg);
-
- pmap_insert(regs, (void *) reg, proj);
- }
-
- if (mem) {
- *mem = new_r_Proj(irn, mode_M, n);
- }
-
- return irn;
-}
-