From: H.J. Lu Date: Fri, 8 Nov 2002 22:12:37 +0000 (+0000) Subject: Fix c/5351 and optimization/7591. X-Git-Tag: releases/gcc-3.2.1~40 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=d22909ba59798e7b86c99ed79e76423c92c4d7d8;p=thirdparty%2Fgcc.git Fix c/5351 and optimization/7591. 2002-11-08 H.J. Lu Fix c/5351 and optimization/7591. * calls.c (store_one_arg): Remove ATTRIBUTE_UNUSED on variable_size. Mark any slots used for the argument as in-use only if we can't pass all arguments to a library call in registers. From-SVN: r58937 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 447403410998..40983df71fae 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,12 @@ +2002-11-08 H.J. Lu + + Fix c/5351 and optimization/7591. + + * calls.c (store_one_arg): Remove ATTRIBUTE_UNUSED on + variable_size. Mark any slots used for the argument as in-use + only if we can't pass all arguments to a library call in + registers. + 2002-11-07 H.J. Lu Fix bootstrap/8146 and diff --git a/gcc/calls.c b/gcc/calls.c index df39596ed100..a40b466e4a96 100644 --- a/gcc/calls.c +++ b/gcc/calls.c @@ -4284,7 +4284,7 @@ store_one_arg (arg, argblock, flags, variable_size, reg_parm_stack_space) struct arg_data *arg; rtx argblock; int flags; - int variable_size ATTRIBUTE_UNUSED; + int variable_size; int reg_parm_stack_space; { tree pval = arg->tree_value; @@ -4359,14 +4359,22 @@ store_one_arg (arg, argblock, flags, variable_size, reg_parm_stack_space) emit_move_insn (arg->save_area, stack_area); } } + + /* Now that we have saved any slots that will be overwritten + by this store, mark all slots this store will use. We + must do this before we actually expand the argument since + the expansion itself may trigger library calls which might + need to use the same stack slot. We only do it if we can't + pass all arguments to a library call in registers. */ + if (arg->partial) + { + for (i = lower_bound; i < upper_bound; i++) + stack_usage_map[i] = 1; + + /* Set it so that we don't do it again. */ + variable_size = 1; + } } - /* Now that we have saved any slots that will be overwritten by this - store, mark all slots this store will use. We must do this before - we actually expand the argument since the expansion itself may - trigger library calls which might need to use the same stack slot. */ - if (argblock && ! variable_size && arg->stack) - for (i = lower_bound; i < upper_bound; i++) - stack_usage_map[i] = 1; } /* If this isn't going to be placed on both the stack and in registers, @@ -4594,6 +4602,11 @@ store_one_arg (arg, argblock, flags, variable_size, reg_parm_stack_space) arg->value = arg->stack_slot; } + if (ACCUMULATE_OUTGOING_ARGS && !(flags & ECF_SIBCALL) + && argblock && ! variable_size && arg->stack) + for (i = lower_bound; i < upper_bound; i++) + stack_usage_map[i] = 1; + /* Once we have pushed something, pops can't safely be deferred during the rest of the arguments. */ NO_DEFER_POP;