Handle TestJmp with Immediate
[libfirm] / ir / be / belower.c
index 80d6a7a..3b114da 100644 (file)
@@ -481,9 +481,10 @@ static ir_node *belower_skip_proj(ir_node *irn) {
 }
 
 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) {
@@ -495,7 +496,7 @@ static void fix_in(ir_node *irn, ir_node *old, ir_node *nw) {
 
 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);
@@ -517,22 +518,22 @@ static void gen_assure_different_pattern(ir_node *irn, be_irg_t *birg, ir_node *
        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));
 }