Commit 72e2cf16 by Andreas Krebbel Committed by Andreas Krebbel

re PR target/43635 (ICE in s390_emit_call, at config/s390/s390.c:9484)

2010-04-20  Andreas Krebbel  <Andreas.Krebbel@de.ibm.com>

	PR target/43635
	* config/s390/s390.c (s390_emit_call): Turn direct into indirect
	calls for -fpic -m31 if they have been sibcall optimized.

2010-04-20  Andreas Krebbel  <Andreas.Krebbel@de.ibm.com>

	PR target/43635
	* gcc.c-torture/compile/pr43635.c: New testcase.

From-SVN: r158540
parent 4a863f3a
2010-04-20 Andreas Krebbel <Andreas.Krebbel@de.ibm.com>
PR target/43635
* config/s390/s390.c (s390_emit_call): Turn direct into indirect
calls for -fpic -m31 if they have been sibcall optimized.
2010-04-19 James E. Wilson <wilson@codesourcery.com>
PR rtl-optimization/43520
......
......@@ -9539,11 +9539,25 @@ s390_emit_call (rtx addr_location, rtx tls_call, rtx result_reg,
replace the symbol itself with the PLT stub. */
if (flag_pic && !SYMBOL_REF_LOCAL_P (addr_location))
{
addr_location = gen_rtx_UNSPEC (Pmode,
gen_rtvec (1, addr_location),
UNSPEC_PLT);
addr_location = gen_rtx_CONST (Pmode, addr_location);
plt_call = true;
if (retaddr_reg != NULL_RTX)
{
addr_location = gen_rtx_UNSPEC (Pmode,
gen_rtvec (1, addr_location),
UNSPEC_PLT);
addr_location = gen_rtx_CONST (Pmode, addr_location);
plt_call = true;
}
else
/* For -fpic code the PLT entries might use r12 which is
call-saved. Therefore we cannot do a sibcall when
calling directly using a symbol ref. When reaching
this point we decided (in s390_function_ok_for_sibcall)
to do a sibcall for a function pointer but one of the
optimizers was able to get rid of the function pointer
by propagating the symbol ref into the call. This
optimization is illegal for S/390 so we turn the direct
call into a indirect call again. */
addr_location = force_reg (Pmode, addr_location);
}
/* Unless we can use the bras(l) insn, force the
......
2010-04-20 Andreas Krebbel <Andreas.Krebbel@de.ibm.com>
PR target/43635
* gcc.c-torture/compile/pr43635.c: New testcase.
2010-04-19 Jakub Jelinek <jakub@redhat.com>
PR fortran/43339
......
extern void d (void);
void (*foo (void)) (float)
{
void (*(*x) (void)) (float) = d;
return (*x) ();
}
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