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:
parent
f5ef6bfc30
commit
c7f0c9f34f
4 changed files with 42 additions and 1 deletions
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
|
|
29
gcc/testsuite/gcc.target/powerpc/pr79439.c
Normal file
29
gcc/testsuite/gcc.target/powerpc/pr79439.c
Normal 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 } } */
|
Loading…
Add table
Reference in a new issue