sibcall.c (skip_pic_restore): New.

* sibcall.c (skip_pic_restore): New.
        (identify_call_return_value): Use it.

From-SVN: r36596
This commit is contained in:
Richard Henderson 2000-09-24 16:49:22 -07:00 committed by Richard Henderson
parent e1389cac8d
commit fd442cef30
2 changed files with 29 additions and 6 deletions

View File

@ -2,6 +2,9 @@
* emit-rtl.c (gen_lowpart_common): Use trunc_int_for_mode.
* sibcall.c (skip_pic_restore): New.
(identify_call_return_value): Use it.
2000-09-24 Mark Mitchell <mark@codesourcery.com>
* c-tree.texi: Moved here from cp/ir.texi. Documented nested

View File

@ -36,6 +36,7 @@ static int identify_call_return_value PARAMS ((rtx, rtx *, rtx *));
static rtx skip_copy_to_return_value PARAMS ((rtx, rtx, rtx));
static rtx skip_use_of_return_value PARAMS ((rtx, enum rtx_code));
static rtx skip_stack_adjustment PARAMS ((rtx));
static rtx skip_pic_restore PARAMS ((rtx));
static rtx skip_jump_insn PARAMS ((rtx));
static int uses_addressof PARAMS ((rtx));
static int sequence_uses_addressof PARAMS ((rtx));
@ -82,6 +83,11 @@ identify_call_return_value (cp, p_hard_return, p_soft_return)
if (! insn)
return 0;
/* Restore of GP register may appear here. */
insn = skip_pic_restore (insn);
if (! insn)
return 0;
/* If there's nothing after, there's no soft return value. */
insn = NEXT_INSN (insn);
if (! insn)
@ -199,10 +205,6 @@ skip_stack_adjustment (orig_insn)
if (insn)
set = single_set (insn);
/* The source must be the same as the current function's return value to
ensure that any return value is put in the same place by the current
function and the function we're calling. The destination register
must be a pseudo. */
if (insn
&& set
&& GET_CODE (SET_SRC (set)) == PLUS
@ -211,8 +213,26 @@ skip_stack_adjustment (orig_insn)
&& SET_DEST (set) == stack_pointer_rtx)
return insn;
/* It did not look like a copy of the return value, so return the
same insn we were passed. */
return orig_insn;
}
/* If the first real insn after ORIG_INSN sets the pic register,
return it. Otherwise return ORIG_INSN. */
static rtx
skip_pic_restore (orig_insn)
rtx orig_insn;
{
rtx insn, set = NULL_RTX;
insn = next_nonnote_insn (orig_insn);
if (insn)
set = single_set (insn);
if (insn && set && SET_DEST (set) == pic_offset_table_rtx)
return insn;
return orig_insn;
}