From c7f0c9f34f82df40f1bff7662e64c9d5342b3585 Mon Sep 17 00:00:00 2001 From: Michael Meissner Date: Wed, 1 Mar 2017 18:33:21 +0000 Subject: [PATCH] re PR target/79439 (Missing nop instruction after recursive call corrupts TOC register) [gcc] 2017-03-01 Michael Meissner 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 PR target/79439 * gcc.target/powerpc/pr79439.c: New test. From-SVN: r245813 --- gcc/ChangeLog | 6 +++++ gcc/config/rs6000/predicates.md | 3 ++- gcc/testsuite/ChangeLog | 5 ++++ gcc/testsuite/gcc.target/powerpc/pr79439.c | 29 ++++++++++++++++++++++ 4 files changed, 42 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/gcc.target/powerpc/pr79439.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index febbf100946..c4f879818a4 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2017-03-01 Michael Meissner + + 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 PR target/79395 diff --git a/gcc/config/rs6000/predicates.md b/gcc/config/rs6000/predicates.md index 43e7a1ce605..eb9321bf5cd 100644 --- a/gcc/config/rs6000/predicates.md +++ b/gcc/config/rs6000/predicates.md @@ -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) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 25b59da1a76..b3ba66bc7c9 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2017-03-01 Michael Meissner + + PR target/79439 + * gcc.target/powerpc/pr79439.c: New test. + 2017-03-01 Pat Haugen * gcc.target/powerpc/pr79544.c: Add test for vec_vsrad and fix up diff --git a/gcc/testsuite/gcc.target/powerpc/pr79439.c b/gcc/testsuite/gcc.target/powerpc/pr79439.c new file mode 100644 index 00000000000..23c9a24fdc3 --- /dev/null +++ b/gcc/testsuite/gcc.target/powerpc/pr79439.c @@ -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 } } */ -- 2.30.2