"Richard Guenther" <richard.guenther@gmail.com> writes:
> Instead the following patch makes the C testcase above share the stack
> slot. (completely untested)
>
> Richard.
>
> Index: calls.c
> ===================================================================
> *** calls.c (revision 116273)
> --- calls.c (working copy)
> *************** expand_call (tree exp, rtx target, int i
> *** 1985,1991 ****
> /* For variable-sized objects, we must be called with a target
> specified. If we were to allocate space on the stack here,
> we would have no way of knowing when to free it. */
> ! rtx d = assign_temp (TREE_TYPE (exp), 1, 1, 1);
>
> mark_temp_addr_taken (d);
> structure_value_addr = XEXP (d, 0);
> --- 1985,1991 ----
> /* For variable-sized objects, we must be called with a target
> specified. If we were to allocate space on the stack here,
> we would have no way of knowing when to free it. */
> ! rtx d = assign_temp (TREE_TYPE (exp), 0, 1, 1);
>
> mark_temp_addr_taken (d);
> structure_value_addr = XEXP (d, 0);
I expect that would fail for something like
typedef struct { char x[1000]; } S;
S bar (void);
void quux (S, S);
void foo (void)
{
quux (bar(), bar());
}