From: Matthias Braun Date: Tue, 7 Feb 2012 11:51:39 +0000 (+0100) Subject: Route stackpointer through Restore node X-Git-Url: http://nsz.repo.hu/git/?a=commitdiff_plain;h=7a5bb07f226ea9de2796b5a47d718572ee96504a;p=libfirm Route stackpointer through Restore node (This avoids effects where compilation fails because of an unused stackpointer) --- diff --git a/ir/be/sparc/sparc_finish.c b/ir/be/sparc/sparc_finish.c index 0021d333a..44f8ecab3 100644 --- a/ir/be/sparc/sparc_finish.c +++ b/ir/be/sparc/sparc_finish.c @@ -91,8 +91,10 @@ static void introduce_epilog(ir_node *ret) if (!layout->sp_relative) { const arch_register_t *fp_reg = &sparc_registers[REG_FRAME_POINTER]; + const arch_register_t *sp_reg = &sparc_registers[REG_SP]; ir_node *fp = be_get_initial_reg_value(irg, fp_reg); - ir_node *restore = new_bd_sparc_RestoreZero(NULL, block, fp); + ir_node *sp = be_get_initial_reg_value(irg, sp_reg); + ir_node *restore = new_bd_sparc_RestoreZero(NULL, block, sp, fp); sched_add_before(ret, restore); arch_set_irn_register(restore, sp_reg); set_irn_n(ret, sp_idx, restore); @@ -433,10 +435,12 @@ static void replace_with_restore_reg(ir_node *node, ir_node *replaced, ir_node *op0, ir_node *op1) { dbg_info *dbgi = get_irn_dbg_info(node); + ir_node *stack_in = get_irn_n(node, n_sparc_RestoreZero_stack); ir_node *fp = get_irn_n(node, n_sparc_RestoreZero_frame_pointer); ir_node *block = get_nodes_block(node); ir_mode *mode = get_irn_mode(node); - ir_node *new_node = new_bd_sparc_Restore_reg(dbgi, block, fp, op0, op1); + ir_node *new_node = new_bd_sparc_Restore_reg(dbgi, block, stack_in, fp, + op0, op1); ir_node *stack = new_r_Proj(new_node, mode, pn_sparc_Restore_stack); ir_node *res = new_r_Proj(new_node, mode, pn_sparc_Restore_res); const arch_register_t *reg = arch_get_irn_register(replaced); @@ -454,11 +458,12 @@ static void replace_with_restore_imm(ir_node *node, ir_node *replaced, int32_t immediate) { dbg_info *dbgi = get_irn_dbg_info(node); + ir_node *stack_in = get_irn_n(node, n_sparc_RestoreZero_stack); ir_node *fp = get_irn_n(node, n_sparc_RestoreZero_frame_pointer); ir_node *block = get_nodes_block(node); ir_mode *mode = get_irn_mode(node); - ir_node *new_node - = new_bd_sparc_Restore_imm(dbgi, block, fp, op, imm_entity, immediate); + ir_node *new_node = new_bd_sparc_Restore_imm(dbgi, block, stack_in, fp, + op, imm_entity, immediate); ir_node *stack = new_r_Proj(new_node, mode, pn_sparc_Restore_stack); ir_node *res = new_r_Proj(new_node, mode, pn_sparc_Restore_res); const arch_register_t *reg = arch_get_irn_register(replaced); diff --git a/ir/be/sparc/sparc_spec.pl b/ir/be/sparc/sparc_spec.pl index 0ab5f7332..f53ccfb6c 100644 --- a/ir/be/sparc/sparc_spec.pl +++ b/ir/be/sparc/sparc_spec.pl @@ -428,19 +428,19 @@ Restore => { imm => { attr => "ir_entity *immediate_entity, int32_t immediate_value", custominit => "sparc_set_attr_imm(res, immediate_entity, immediate_value);", - reg_req => { in => [ "frame_pointer", "gp" ], out => [ "sp:I|S", "gp" ] }, - ins => [ "frame_pointer", "left" ], + reg_req => { in => [ "sp", "frame_pointer", "gp" ], out => [ "sp:I|S", "gp" ] }, + ins => [ "stack", "frame_pointer", "left" ], }, reg => { - reg_req => { in => [ "frame_pointer", "gp", "gp" ], out => [ "sp:I|S", "gp" ] }, - ins => [ "frame_pointer", "left", "right" ], + reg_req => { in => [ "sp", "frame_pointer", "gp", "gp" ], out => [ "sp:I|S", "gp" ] }, + ins => [ "stack", "frame_pointer", "left", "right" ], } }, }, RestoreZero => { - reg_req => { in => [ "frame_pointer" ], out => [ "sp:I|S" ] }, - ins => [ "frame_pointer" ], + reg_req => { in => [ "sp", "frame_pointer" ], out => [ "sp:I|S" ] }, + ins => [ "stack", "frame_pointer" ], outs => [ "stack" ], emit => '. restore', mode => $mode_gp,