-#define is_Perm(arch_env, irn) (arch_irn_classify(arch_env, irn) == arch_irn_class_perm)
+#define is_Perm(arch_env, irn) (arch_irn_class_is(arch_env, irn, perm))
/* associates op with it's copy and CopyKeep */
typedef struct {
ir_node *op; /* an irn which must be different */
pset *copies; /* all non-spillable copies of this irn */
/* associates op with it's copy and CopyKeep */
typedef struct {
ir_node *op; /* an irn which must be different */
pset *copies; /* all non-spillable copies of this irn */
const arch_register_class_t *reg_class;
const arch_env_t *arch_env;
lower_env_t *env = walk_env;
const arch_register_class_t *reg_class;
const arch_env_t *arch_env;
lower_env_t *env = walk_env;
- int real_size = 0;
- int n, i, pn, do_copy, j, n_ops;
+ int real_size = 0;
+ int keep_perm = 0;
+ int n, i, pn, do_copy, j, n_ops;
/* reroute the edges from the proj to the argument */
edges_reroute(pairs[i].out_node, pairs[i].in_node, env->chord_env->irg);
/* reroute the edges from the proj to the argument */
edges_reroute(pairs[i].out_node, pairs[i].in_node, env->chord_env->irg);
-static void fix_in(ir_node *irn, ir_node *old, ir_node *nw) {
- int i, n;
-
- irn = belower_skip_proj(irn);
- n = get_irn_arity(irn);
-
- for (i = 0; i < n; i++) {
- if (get_irn_n(irn, i) == old) {
- set_irn_n(irn, i, nw);
- break;
- }
- }
-}
-
static void gen_assure_different_pattern(ir_node *irn, ir_node *other_different, constraint_env_t *env) {
be_irg_t *birg = env->birg;
pset *op_set = env->op_set;
static void gen_assure_different_pattern(ir_node *irn, ir_node *other_different, constraint_env_t *env) {
be_irg_t *birg = env->birg;
pset *op_set = env->op_set;
- entry = obstack_alloc(&env->obst, sizeof(*entry));
- entry->copies = pset_new_ptr_default();
- entry->copy_keeps = pset_new_ptr_default();
- entry->op = other_different;
+ entry = obstack_alloc(&env->obst, sizeof(*entry));
+ entry->copies = pset_new_ptr_default();
+ entry->op = other_different;
DBG((mod, LEVEL_1, "created %+F for %+F to assure should_be_different\n", keep, irn));
}
DBG((mod, LEVEL_1, "created %+F for %+F to assure should_be_different\n", keep, irn));
}
DB((mod, LEVEL_1, ", %+F ", cp));
}
DB((mod, LEVEL_1, ", %+F ", cp));
}
- /* collect all CopyKeeps */
- foreach_pset(entry->copy_keeps, cp) {
- nodes[n++] = cp;
- DB((mod, LEVEL_1, ", %+F ", cp));
- }
-
DB((mod, LEVEL_1, "\n"));
/* introduce the copies for the operand and it's copies */
DB((mod, LEVEL_1, "\n"));
/* introduce the copies for the operand and it's copies */
/* Could be that not all CopyKeeps are really needed, */
/* so we transform unnecessary ones into Keeps. */
/* Could be that not all CopyKeeps are really needed, */
/* so we transform unnecessary ones into Keeps. */
- foreach_pset(entry->copy_keeps, cp) {
- if (get_irn_n_edges(cp) < 1) {
+ foreach_pset(entry->copies, cp) {
+ if (be_is_CopyKeep(cp) && get_irn_n_edges(cp) < 1) {
ir_node *keep;
int n = get_irn_arity(cp);
keep = be_new_Keep(arch_get_irn_reg_class(birg->main_env->arch_env, cp, -1),
birg->irg, get_nodes_block(cp), n, (ir_node **)&get_irn_in(cp)[1]);
sched_add_before(cp, keep);
ir_node *keep;
int n = get_irn_arity(cp);
keep = be_new_Keep(arch_get_irn_reg_class(birg->main_env->arch_env, cp, -1),
birg->irg, get_nodes_block(cp), n, (ir_node **)&get_irn_in(cp)[1]);
sched_add_before(cp, keep);