X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fbe%2Fbeabi.c;h=df362d9c5b83e44a7de1de393845244600486271;hb=bd31a5350ce9e110c058b4ad2223d460c9eb5c4e;hp=e4c280213007296e28fa41f6358cfb0e6f08ea31;hpb=a70660f699871be4a0af96eb09683bfbf17bda0a;p=libfirm diff --git a/ir/be/beabi.c b/ir/be/beabi.c index e4c280213..df362d9c5 100644 --- a/ir/be/beabi.c +++ b/ir/be/beabi.c @@ -90,8 +90,6 @@ struct _be_abi_irg_t { ir_node *init_sp; /**< The node representing the stack pointer at the start of the function. */ - ir_node *start_barrier; /**< The barrier of the start block */ - ir_node *reg_params; /**< The reg params node. */ pmap *regs; /**< A map of all callee-save and ignore regs to their Projs to the RegParams node. */ @@ -494,11 +492,9 @@ static ir_node *adjust_call(be_abi_irg_t *env, ir_node *irn, ir_node *curr_sp) curr_sp = be_new_IncSP(sp, irg, bl, curr_sp, stack_size); } + curr_mem = get_Call_mem(irn); if (! do_seq) { - obstack_ptr_grow(obst, get_Call_mem(irn)); - curr_mem = new_NoMem(); - } else { - curr_mem = get_Call_mem(irn); + obstack_ptr_grow(obst, curr_mem); } for (i = 0; i < n_stack_params; ++i) { @@ -538,7 +534,8 @@ static ir_node *adjust_call(be_abi_irg_t *env, ir_node *irn, ir_node *curr_sp) /* Insert a store for primitive arguments. */ if (is_atomic_type(param_type)) { ir_node *store; - store = new_r_Store(irg, bl, curr_mem, addr, param); + ir_node *mem_input = do_seq ? curr_mem : new_NoMem(); + store = new_r_Store(irg, bl, mem_input, addr, param); mem = new_r_Proj(irg, bl, store, mode_M, pn_Store_M); } @@ -1157,86 +1154,6 @@ static void process_calls(be_abi_irg_t *env) heights_free(ir_heights); } -#if 0 /* -static ir_node *setup_frame(be_abi_irg_t *env) -{ - const arch_isa_t *isa = env->birg->main_env->arch_env->isa; - const arch_register_t *sp = isa->sp; - const arch_register_t *bp = isa->bp; - be_abi_call_flags_bits_t flags = env->call->flags.bits; - ir_graph *irg = env->birg->irg; - ir_node *bl = get_irg_start_block(irg); - ir_node *no_mem = get_irg_no_mem(irg); - ir_node *old_frame = get_irg_frame(irg); - ir_node *stack = pmap_get(env->regs, (void *) sp); - ir_node *frame = pmap_get(env->regs, (void *) bp); - - int stack_nr = get_Proj_proj(stack); - - if(flags.try_omit_fp) { - stack = be_new_IncSP(sp, irg, bl, stack, no_mem, BE_STACK_FRAME_SIZE_EXPAND); - frame = stack; - } - - else { - frame = be_new_Copy(bp->reg_class, irg, bl, stack); - - be_node_set_flags(frame, -1, arch_irn_flags_dont_spill); - if(!flags.fp_free) { - be_set_constr_single_reg(frame, -1, bp); - be_node_set_flags(frame, -1, arch_irn_flags_ignore); - arch_set_irn_register(env->birg->main_env->arch_env, frame, bp); - } - - stack = be_new_IncSP(sp, irg, bl, stack, frame, BE_STACK_FRAME_SIZE_EXPAND); - } - - be_node_set_flags(env->reg_params, -(stack_nr + 1), arch_irn_flags_ignore); - env->init_sp = stack; - set_irg_frame(irg, frame); - edges_reroute(old_frame, frame, irg); - - return frame; -} - -static void clearup_frame(be_abi_irg_t *env, ir_node *ret, pmap *reg_map, struct obstack *obst) -{ - const arch_isa_t *isa = env->birg->main_env->arch_env->isa; - const arch_register_t *sp = isa->sp; - const arch_register_t *bp = isa->bp; - ir_graph *irg = env->birg->irg; - ir_node *ret_mem = get_Return_mem(ret); - ir_node *frame = get_irg_frame(irg); - ir_node *bl = get_nodes_block(ret); - ir_node *stack = get_irn_link(bl); - - pmap_entry *ent; - - if(env->call->flags.bits.try_omit_fp) { - stack = be_new_IncSP(sp, irg, bl, stack, ret_mem, -BE_STACK_FRAME_SIZE_SHRINK); - } - - else { - stack = be_new_SetSP(sp, irg, bl, stack, frame, ret_mem); - be_set_constr_single_reg(stack, -1, sp); - be_node_set_flags(stack, -1, arch_irn_flags_ignore); - } - - pmap_foreach(env->regs, ent) { - const arch_register_t *reg = ent->key; - ir_node *irn = ent->value; - - if(reg == sp) - obstack_ptr_grow(&env->obst, stack); - else if(reg == bp) - obstack_ptr_grow(&env->obst, frame); - else if(arch_register_type_is(reg, callee_save) || arch_register_type_is(reg, ignore)) - obstack_ptr_grow(obst, irn); - } -} -*/ -#endif - /** * Computes the stack argument layout type. * Changes a possibly allocated value param type by moving @@ -1691,7 +1608,7 @@ static void fix_address_of_parameter_access(be_abi_irg_t *env, ir_entity *value_ } } -#if 0 +#if 1 /** * The start block has no jump, instead it has an initial exec Proj. * The backend wants to handle all blocks the same way, so we replace @@ -1747,7 +1664,6 @@ static void modify_irg(be_abi_irg_t *env) reg_node_map_t *rm; const arch_register_t *fp_reg; ir_node *frame_pointer; - ir_node *barrier; ir_node *reg_params_bl; ir_node **args; ir_node *arg_tuple; @@ -1905,7 +1821,7 @@ static void modify_irg(be_abi_irg_t *env) env->init_sp = be_new_IncSP(sp, irg, bl, env->init_sp, BE_STACK_FRAME_SIZE_EXPAND); be_abi_reg_map_set(env->regs, sp, env->init_sp); - env->start_barrier = barrier = create_barrier(env, bl, &mem, env->regs, 0); + create_barrier(env, bl, &mem, env->regs, 0); env->init_sp = be_abi_reg_map_get(env->regs, sp); arch_set_irn_register(env->birg->main_env->arch_env, env->init_sp, sp); @@ -1991,12 +1907,9 @@ static void modify_irg(be_abi_irg_t *env) del_pset(dont_save); obstack_free(&env->obst, args); - /* this was needed for STA backend... */ -#if 0 /* handle start block here (place a jump in the block) */ i = 0; irg_block_walk_graph(irg, fix_start_block, NULL, &i); -#endif } /** Fix the state inputs of calls that still hang on unknowns */ @@ -2325,11 +2238,6 @@ ir_node *be_abi_get_ignore_irn(be_abi_irg_t *abi, const arch_register_t *reg) return pmap_get(abi->regs, (void *) reg); } -ir_node *be_abi_get_start_barrier(be_abi_irg_t *abi) -{ - return abi->start_barrier; -} - /** * Returns non-zero if the ABI has omitted the frame pointer in * the current graph.