re PR target/79439 (Missing nop instruction after recursive call corrupts TOC register)

[gcc]
2017-03-01  Michael Meissner  <meissner@linux.vnet.ibm.com>

	PR target/79439
	* config/rs6000/predicates.md (current_file_function_operand): Do
	not allow self calls to be local if the function is replaceable.

[gcc/testsuite]
2017-03-01  Michael Meissner  <meissner@linux.vnet.ibm.com>

	PR target/79439
	* gcc.target/powerpc/pr79439.c: New test.

From-SVN: r245813
This commit is contained in:
Michael Meissner 2017-03-01 18:33:21 +00:00 committed by Michael Meissner
parent f5ef6bfc30
commit c7f0c9f34f
4 changed files with 42 additions and 1 deletions

View File

@ -1,3 +1,9 @@
2017-03-01 Michael Meissner <meissner@linux.vnet.ibm.com>
PR target/79439
* config/rs6000/predicates.md (current_file_function_operand): Do
not allow self calls to be local if the function is replaceable.
2017-03-01 Kelvin Nilsen <kelvin@gcc.gnu.org>
PR target/79395

View File

@ -1110,7 +1110,8 @@
(and (match_code "symbol_ref")
(match_test "(DEFAULT_ABI != ABI_AIX || SYMBOL_REF_FUNCTION_P (op))
&& (SYMBOL_REF_LOCAL_P (op)
|| op == XEXP (DECL_RTL (current_function_decl), 0))
|| (op == XEXP (DECL_RTL (current_function_decl), 0)
&& !decl_replaceable_p (current_function_decl)))
&& !((DEFAULT_ABI == ABI_AIX
|| DEFAULT_ABI == ABI_ELFv2)
&& (SYMBOL_REF_EXTERNAL_P (op)

View File

@ -1,3 +1,8 @@
2017-03-01 Michael Meissner <meissner@linux.vnet.ibm.com>
PR target/79439
* gcc.target/powerpc/pr79439.c: New test.
2017-03-01 Pat Haugen <pthaugen@us.ibm.com>
* gcc.target/powerpc/pr79544.c: Add test for vec_vsrad and fix up

View File

@ -0,0 +1,29 @@
/* { dg-do compile { target { powerpc64*-*-linux* && lp64 } } } */
/* { dg-options "-O2 -fpic" } */
/* On the Linux 64-bit ABIs, we should not eliminate NOP in the 'rec' call if
-fpic is used because rec can be interposed at link time (since it is
external), and the recursive call should call the interposed function. The
Linux 32-bit ABIs do not require NOPs after the BL instruction. */
int f (void);
void
g (void)
{
}
int
rec (int a)
{
int ret = 0;
if (a > 10 && f ())
ret += rec (a - 1);
g ();
return a + ret;
}
/* { dg-final { scan-assembler-times {\mbl f\M} 1 } } */
/* { dg-final { scan-assembler-times {\mbl g\M} 1 } } */
/* { dg-final { scan-assembler-times {\mbl rec\M} 1 } } */
/* { dg-final { scan-assembler-times {\mnop\M} 3 } } */