mirror of
https://github.com/gcc-mirror/gcc.git
synced 2026-05-06 14:59:39 +02:00
sibcall.c (indentify_call_return_value): Find last call in the chain; Allow stack adjustment after function call.
* sibcall.c (indentify_call_return_value): Find last call in the chain;
Allow stack adjustment after function call.
From-SVN: r32791
This commit is contained in:
@@ -25,6 +25,9 @@ Tue Mar 28 11:55:48 2000 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
|
||||
|
||||
Tue Mar 28 08:29:46 2000 Jan Hubicka <jh@suse.cz>
|
||||
|
||||
* sibcall.c (indentify_call_return_value): Find last call in the chain;
|
||||
Allow stack adjustment after function call.
|
||||
|
||||
* regmove.c (struct csa_memlist): Make mem field rtx *.
|
||||
(record_one_stack_ref): Accept rtx * instead of rtx as parameter.
|
||||
(try_apply_stack_adjustment): Replace whole MEM rtx.
|
||||
|
||||
@@ -53,10 +53,12 @@ identify_call_return_value (cp, p_hard_return, p_soft_return)
|
||||
{
|
||||
rtx insn, set, hard, soft;
|
||||
|
||||
/* Search forward through the "normal" call sequence to the CALL insn. */
|
||||
insn = XEXP (cp, 0);
|
||||
while (GET_CODE (insn) != CALL_INSN)
|
||||
/* Search backward through the "normal" call sequence to the CALL insn. */
|
||||
while (NEXT_INSN (insn))
|
||||
insn = NEXT_INSN (insn);
|
||||
while (GET_CODE (insn) != CALL_INSN)
|
||||
insn = PREV_INSN (insn);
|
||||
|
||||
/* Assume the pattern is (set (dest) (call ...)), or that the first
|
||||
member of a parallel is. This is the hard return register used
|
||||
@@ -75,6 +77,11 @@ identify_call_return_value (cp, p_hard_return, p_soft_return)
|
||||
if (GET_CODE (hard) != REG)
|
||||
return 0;
|
||||
|
||||
/* Stack adjustment done after call may appear here. */
|
||||
insn = skip_stack_adjustment (insn);
|
||||
if (! insn)
|
||||
return 0;
|
||||
|
||||
/* If there's nothing after, there's no soft return value. */
|
||||
insn = NEXT_INSN (insn);
|
||||
if (! insn)
|
||||
|
||||
Reference in New Issue
Block a user