}
static void fix_in(ir_node *irn, ir_node *old, ir_node *nw) {
- int i, n = get_irn_arity(irn);
+ 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) {
static void gen_assure_different_pattern(ir_node *irn, be_irg_t *birg, ir_node *other_different) {
const arch_env_t *arch_env = birg->main_env->arch_env;
- ir_node *in[2], *keep, *cpy, *temp;
+ ir_node *in[1], *keep, *cpy, *temp;
ir_node *block = get_nodes_block(irn);
firm_dbg_module_t *mod = firm_dbg_register("firm.be.lower");
const arch_register_class_t *cls = arch_get_irn_reg_class(arch_env, other_different, -1);
in[0] = irn;
in[1] = cpy;
+ /* Let the irn use the copy instead of the old other_different */
+ fix_in(irn, other_different, cpy);
+
/* Add the Keep resp. CopyKeep and reroute the users */
/* of the other_different irn in case of CopyKeep. */
- if (get_n_out_edges(other_different) == 1) {
+ if (get_n_out_edges(other_different) == 0) {
keep = be_new_Keep(cls, birg->irg, block, 2, in);
}
else {
- keep = be_new_CopyKeep(cls, birg->irg, block, cpy, 2, in, get_irn_mode(other_different));
+ keep = be_new_CopyKeep_single(cls, birg->irg, block, cpy, irn, get_irn_mode(other_different));
edges_reroute(other_different, keep, birg->irg);
}
/* after rerouting: let the copy point to the other_different irn */
set_irn_n(cpy, 0, other_different);
- /* Let the irn use the copy instead of the old other_different */
- fix_in(irn, other_different, cpy);
-
DBG((mod, LEVEL_1, "created %+F for %+F to assure should_be_different\n", keep, irn));
}