diff options
Diffstat (limited to 'gcc/reg-stack.c')
-rw-r--r-- | gcc/reg-stack.c | 23 |
1 files changed, 22 insertions, 1 deletions
diff --git a/gcc/reg-stack.c b/gcc/reg-stack.c index 0b8b156..a96b6ef 100644 --- a/gcc/reg-stack.c +++ b/gcc/reg-stack.c @@ -2553,11 +2553,28 @@ print_stack (FILE *file, stack s) static int convert_regs_entry (void) { + tree params = DECL_ARGUMENTS (current_function_decl); + tree p; + HARD_REG_SET incoming_regs; + rtx inc_rtx; + int inserted = 0; edge e; edge_iterator ei; - /* Load something into each stack register live at function entry. + /* Find out which registers were used as argument passing registers. */ + + CLEAR_HARD_REG_SET (incoming_regs); + for (p = params; p; p = TREE_CHAIN (p)) + { + inc_rtx = DECL_INCOMING_RTL (p); + + if (REG_P (inc_rtx) + && IN_RANGE (REGNO (inc_rtx), FIRST_STACK_REG, LAST_STACK_REG)) + SET_HARD_REG_BIT (incoming_regs, REGNO (inc_rtx)); + } + + /* Load something into remaining stack register live at function entry. Such live registers can be caused by uninitialized variables or functions not returning values on all paths. In order to keep the push/pop code happy, and to not scrog the register stack, we @@ -2579,6 +2596,10 @@ convert_regs_entry (void) bi->stack_in.reg[++top] = reg; + /* Skip argument passing registers. */ + if (TEST_HARD_REG_BIT (incoming_regs, reg)) + continue; + init = gen_rtx_SET (VOIDmode, FP_MODE_REG (FIRST_STACK_REG, SFmode), not_a_num); |