Partially undo r20786: Emit ret $0 especially when its BB is only reached by a fallt...
[libfirm] / ir / be / beabi.c
index 8430510..f2c3b01 100644 (file)
@@ -628,7 +628,7 @@ static ir_node *adjust_call(be_abi_irg_t *env, ir_node *irn, ir_node *curr_sp)
        }
 
        /** TODO: this is not correct for cases where return values are passed
-        * on the stack, but no known ABI does this currentl...
+        * on the stack, but no known ABI does this currently...
         */
        n_reg_results = n_res;
 
@@ -736,7 +736,7 @@ static ir_node *adjust_call(be_abi_irg_t *env, ir_node *irn, ir_node *curr_sp)
 
        /* kill the ProjT node */
        if (res_proj != NULL) {
-               be_kill_node(res_proj);
+               kill_node(res_proj);
        }
 
        /* Make additional projs for the caller save registers
@@ -1423,7 +1423,7 @@ static ir_node *create_be_return(be_abi_irg_t *env, ir_node *irn, ir_node *bl,
        stack = be_abi_reg_map_get(env->regs, arch_env->sp);
        if (keep) {
                stack = get_irn_n(keep, 0);
-               be_kill_node(keep);
+               kill_node(keep);
                remove_End_keepalive(get_irg_end(env->birg->irg), keep);
        }
 
@@ -1746,7 +1746,7 @@ static void modify_irg(be_abi_irg_t *env)
 
        /* value_param_base anchor is not needed anymore now */
        value_param_base = get_irg_value_param_base(irg);
-       be_kill_node(value_param_base);
+       kill_node(value_param_base);
        set_irg_value_param_base(irg, new_r_Bad(irg));
 
        env->frame = obstack_alloc(&env->obst, sizeof(env->frame[0]));
@@ -1942,7 +1942,7 @@ static void modify_irg(be_abi_irg_t *env)
 
        /* the arg proj is not needed anymore now and should be only used by the anchor */
        assert(get_irn_n_edges(arg_tuple) == 1);
-       be_kill_node(arg_tuple);
+       kill_node(arg_tuple);
        set_irg_args(irg, new_rd_Bad(irg));
 
        /* All Return nodes hang on the End node, so look for them there. */
@@ -2224,6 +2224,27 @@ void be_abi_put_ignore_regs(be_abi_irg_t *abi, const arch_register_class_t *cls,
                        bitset_set(bs, reg->index);
 }
 
+void be_abi_set_non_ignore_regs(be_abi_irg_t *abi, const arch_register_class_t *cls, unsigned *raw_bitset)
+{
+       unsigned         i;
+       arch_register_t *reg;
+
+       for (i = 0; i < cls->n_regs; ++i) {
+               if (arch_register_type_is(&cls->regs[i], ignore))
+                       continue;
+
+               rbitset_set(raw_bitset, i);
+       }
+
+       for (reg = pset_first(abi->ignore_regs); reg != NULL;
+            reg = pset_next(abi->ignore_regs)) {
+               if (reg->reg_class != cls)
+                       continue;
+
+               rbitset_clear(raw_bitset, reg->index);
+       }
+}
+
 /* Returns the stack layout from a abi environment. */
 const be_stack_layout_t *be_abi_get_stack_layout(const be_abi_irg_t *abi) {
        return abi->frame;