* @param start Index to start
* @return The cycle or chain
*/
-static perm_cycle_t *get_perm_cycle(perm_cycle_t *const cycle,
- reg_pair_t *const pairs,
- int const n,
- int start)
+static void get_perm_cycle(perm_cycle_t *const cycle,
+ reg_pair_t *const pairs,
+ int const n,
+ int start)
{
int head = pairs[start].in_reg->index;
int cur_idx = pairs[start].out_reg->index;
if (cur_pair_idx >= 0)
pairs[cur_pair_idx].checked = 1;
}
-
- return cycle;
}
/**
return get_irn_out_edge_first_kind(irn, EDGE_KIND_NORMAL) != 0;
}
-/**
- * Skip all Proj nodes.
- */
-static INLINE ir_node *belower_skip_proj(ir_node *irn) {
- while(is_Proj(irn))
- irn = get_Proj_pred(irn);
- return irn;
-}
-
static ir_node *find_copy(ir_node *irn, ir_node *op)
{
ir_node *cur_node;
}
static void gen_assure_different_pattern(ir_node *irn, ir_node *other_different, constraint_env_t *env) {
- be_irg_t *birg = env->birg;
- ir_graph *irg = be_get_birg_irg(birg);
- ir_nodemap_t *op_set = &env->op_set;
- ir_node *block = get_nodes_block(irn);
- const arch_register_class_t *cls = arch_get_irn_reg_class(other_different, -1);
- ir_node *in[2], *keep, *cpy;
+ ir_graph *irg;
+ ir_nodemap_t *op_set;
+ ir_node *block;
+ const arch_register_class_t *cls;
+ ir_node *keep, *cpy;
op_copy_assoc_t *entry;
if (arch_irn_is(other_different, ignore) ||
return;
}
+ irg = be_get_birg_irg(env->birg);
+ op_set = &env->op_set;
+ block = get_nodes_block(irn);
+ cls = arch_get_irn_reg_class(other_different, -1);
+
/* Make a not spillable copy of the different node */
/* this is needed because the different irn could be */
/* in block far far away */
/* The copy is optimized later if not needed */
/* check if already exists such a copy in the schedule immediately before */
- cpy = find_copy(belower_skip_proj(irn), other_different);
+ cpy = find_copy(skip_Proj(irn), other_different);
if (! cpy) {
cpy = be_new_Copy(cls, irg, block, other_different);
be_node_set_flags(cpy, BE_OUT_POS(0), arch_irn_flags_dont_spill);
DBG((dbg_constr, LEVEL_1, "created non-spillable %+F for value %+F\n", cpy, other_different));
- }
- else {
+ } else {
DBG((dbg_constr, LEVEL_1, "using already existing %+F for value %+F\n", cpy, other_different));
}
- in[0] = irn;
- in[1] = cpy;
-
/* Add the Keep resp. CopyKeep and reroute the users */
/* of the other_different irn in case of CopyKeep. */
if (has_irn_users(other_different)) {
keep = be_new_CopyKeep_single(cls, irg, block, cpy, irn, get_irn_mode(other_different));
be_node_set_reg_class(keep, 1, cls);
- }
- else {
+ } else {
+ ir_node *in[2];
+
+ in[0] = irn;
+ in[1] = cpy;
keep = be_new_Keep(cls, irg, block, 2, in);
}
/* insert copy and keep into schedule */
assert(sched_is_scheduled(irn) && "need schedule to assure constraints");
if (! sched_is_scheduled(cpy))
- sched_add_before(belower_skip_proj(irn), cpy);
+ sched_add_before(skip_Proj(irn), cpy);
sched_add_after(irn, keep);
/* insert the other different and it's copies into the map */
ir_nodeset_insert(&entry->copies, cpy);
/* insert keep in case of CopyKeep */
- if (be_is_CopyKeep(keep)) {
+ if (be_is_CopyKeep(keep))
ir_nodeset_insert(&entry->copies, keep);
- }
}
/**