Commit 951771dc by James E. Wilson Committed by Jim Wilson

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
parent 6d1b0f92
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> 2010-05-19 Joseph Myers <joseph@codesourcery.com>
* diagnostic.c (FLOAT, FFS): Don't undefine. * diagnostic.c (FLOAT, FFS): Don't undefine.
......
...@@ -14006,23 +14006,35 @@ r10k_insert_cache_barriers (void) ...@@ -14006,23 +14006,35 @@ r10k_insert_cache_barriers (void)
} }
/* If INSN is a call, return the underlying CALL expr. Return NULL_RTX /* 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 static rtx
mips_call_expr_from_insn (rtx insn) mips_call_expr_from_insn (rtx insn, rtx *second_call)
{ {
rtx x; rtx x;
rtx x2;
if (!CALL_P (insn)) if (!CALL_P (insn))
return NULL_RTX; return NULL_RTX;
x = PATTERN (insn); x = PATTERN (insn);
if (GET_CODE (x) == PARALLEL) 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) if (GET_CODE (x) == SET)
x = XEXP (x, 1); x = XEXP (x, 1);
gcc_assert (GET_CODE (x) == CALL); gcc_assert (GET_CODE (x) == CALL);
return x; return x;
} }
...@@ -14154,9 +14166,10 @@ mips_annotate_pic_calls (void) ...@@ -14154,9 +14166,10 @@ mips_annotate_pic_calls (void)
FOR_EACH_BB (bb) FOR_EACH_BB (bb)
FOR_BB_INSNS (bb, insn) 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) if (!call)
continue; continue;
gcc_assert (MEM_P (XEXP (call, 0))); gcc_assert (MEM_P (XEXP (call, 0)));
...@@ -14166,7 +14179,11 @@ mips_annotate_pic_calls (void) ...@@ -14166,7 +14179,11 @@ mips_annotate_pic_calls (void)
symbol = mips_find_pic_call_symbol (insn, reg); symbol = mips_find_pic_call_symbol (insn, reg);
if (symbol) 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);
}
} }
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment