re PR target/43764 (-mrelax-pic-calls fails with complex types)

PR target/43764
* mips.c (mips_call_expr_from_insn): New arg second_call.  Set it.
(mips_annotate_pic_calls): Pass new arg to mips_call_expr_from_insn.
Use it.

From-SVN: r159610
This commit is contained in:
James E. Wilson 2010-05-20 06:26:52 +00:00 committed by Jim Wilson
parent 6d1b0f922a
commit 951771dc6b
2 changed files with 31 additions and 7 deletions

View File

@ -1,3 +1,10 @@
2010-05-19 James E. Wilson <wilson@codesourcery.com>
PR target/43764
* mips.c (mips_call_expr_from_insn): New arg second_call. Set it.
(mips_annotate_pic_calls): Pass new arg to mips_call_expr_from_insn.
Use it.
2010-05-19 Joseph Myers <joseph@codesourcery.com>
* diagnostic.c (FLOAT, FFS): Don't undefine.

View File

@ -14006,23 +14006,35 @@ r10k_insert_cache_barriers (void)
}
/* If INSN is a call, return the underlying CALL expr. Return NULL_RTX
otherwise. */
otherwise. If INSN has two call rtx, then store the second one in
SECOND_CALL. */
static rtx
mips_call_expr_from_insn (rtx insn)
mips_call_expr_from_insn (rtx insn, rtx *second_call)
{
rtx x;
rtx x2;
if (!CALL_P (insn))
return NULL_RTX;
x = PATTERN (insn);
if (GET_CODE (x) == PARALLEL)
x = XVECEXP (x, 0, 0);
{
/* Calls returning complex values have two CALL rtx. Look for the second
one here, and return it via the SECOND_CALL arg. */
x2 = XVECEXP (x, 0, 1);
if (GET_CODE (x2) == SET)
x2 = XEXP (x2, 1);
if (GET_CODE (x2) == CALL)
*second_call = x2;
x = XVECEXP (x, 0, 0);
}
if (GET_CODE (x) == SET)
x = XEXP (x, 1);
gcc_assert (GET_CODE (x) == CALL);
return x;
}
@ -14154,9 +14166,10 @@ mips_annotate_pic_calls (void)
FOR_EACH_BB (bb)
FOR_BB_INSNS (bb, insn)
{
rtx call, reg, symbol;
rtx call, reg, symbol, second_call;
call = mips_call_expr_from_insn (insn);
second_call = 0;
call = mips_call_expr_from_insn (insn, &second_call);
if (!call)
continue;
gcc_assert (MEM_P (XEXP (call, 0)));
@ -14166,7 +14179,11 @@ mips_annotate_pic_calls (void)
symbol = mips_find_pic_call_symbol (insn, reg);
if (symbol)
mips_annotate_pic_call_expr (call, symbol);
{
mips_annotate_pic_call_expr (call, symbol);
if (second_call)
mips_annotate_pic_call_expr (second_call, symbol);
}
}
}