* Creates a be_Return for a Return node.
*
* @param @env the abi environment
- * @param irn the Return node or NULL if there was none
- * @param bl the block where the be_Retun should be placed
- * @param mem the current memory
- * @param n_res number of return results
+ * @param irn the Return node
*/
-static ir_node *create_be_return(be_abi_irg_t *env, ir_node *irn, ir_node *bl,
- ir_node *mem, int n_res)
+static ir_node *create_be_return(be_abi_irg_t *const env, ir_node *const irn)
{
+ ir_node *const bl = get_nodes_block(irn);
be_abi_call_t *call = env->call;
ir_graph *irg = get_Block_irg(bl);
const arch_env_t *arch_env = be_get_irg_arch_env(irg);
- dbg_info *dbgi;
pmap *reg_map = pmap_create();
ir_node *keep = pmap_get(ir_node, env->keep_map, bl);
size_t in_max;
- ir_node *ret;
int i, n;
- unsigned pop;
ir_node **in;
ir_node *stack;
const arch_register_t **regs;
remove_End_keepalive(get_irg_end(irg), keep);
}
+ int const n_res = get_Return_n_ress(irn);
/* Insert results for Return into the register map. */
for (i = 0; i < n_res; ++i) {
ir_node *res = get_Return_res(irn, i);
in = ALLOCAN(ir_node*, in_max);
regs = ALLOCAN(arch_register_t const*, in_max);
- in[0] = mem;
+ in[0] = get_Return_mem(irn);
in[1] = be_abi_reg_map_get(reg_map, arch_env->sp);
regs[0] = NULL;
regs[1] = arch_env->sp;
}
/* The in array for the new back end return is now ready. */
- if (irn != NULL) {
- dbgi = get_irn_dbg_info(irn);
- } else {
- dbgi = NULL;
- }
- /* we have to pop the shadow parameter in in case of struct returns */
- pop = call->pop;
- ret = be_new_Return(dbgi, irg, bl, n_res, pop, n, in);
+ dbg_info *const dbgi = get_irn_dbg_info(irn);
+ ir_node *const ret = be_new_Return(dbgi, irg, bl, n_res, call->pop, n, in);
/* Set the register classes of the return's parameter accordingly. */
for (i = 0; i < n; ++i) {
ir_node *irn = get_Block_cfgpred(end, i);
if (is_Return(irn)) {
- ir_node *blk = get_nodes_block(irn);
- ir_node *mem = get_Return_mem(irn);
- ir_node *ret = create_be_return(env, irn, blk, mem, get_Return_n_ress(irn));
+ ir_node *const ret = create_be_return(env, irn);
exchange(irn, ret);
}
}