From 8fad553f7e00eb5005fa1cb8db38f66583829989 Mon Sep 17 00:00:00 2001 From: Michael Meissner Date: Fri, 10 Mar 2017 20:53:18 +0000 Subject: [PATCH] backport: re PR target/79439 (Missing nop instruction after recursive call corrupts TOC register) [gcc] 2017-03-10 Michael Meissner Back port from trunk 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-10 Michael Meissner Back port from trunk 2017-03-01 Michael Meissner PR target/79439 * gcc.target/powerpc/pr79439.c: New test. From-SVN: r246058 --- gcc/ChangeLog | 9 +++++++ gcc/config/rs6000/predicates.md | 3 ++- gcc/testsuite/ChangeLog | 8 ++++++ gcc/testsuite/gcc.target/powerpc/pr79439.c | 29 ++++++++++++++++++++++ 4 files changed, 48 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/gcc.target/powerpc/pr79439.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 820965b6f686..e7c87c4b9d02 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,12 @@ +2017-03-10 Michael Meissner + + Back port from trunk + 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-07 Uros Bizjak Backport from mainline diff --git a/gcc/config/rs6000/predicates.md b/gcc/config/rs6000/predicates.md index 978ed9ba1eb0..33fbd46984b2 100644 --- a/gcc/config/rs6000/predicates.md +++ b/gcc/config/rs6000/predicates.md @@ -1049,7 +1049,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 fee2c8cd5a80..684c841f073e 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,11 @@ +2017-03-10 Michael Meissner + + Back port from trunk + 2017-03-01 Michael Meissner + + PR target/79439 + * gcc.target/powerpc/pr79439.c: New test. + 2017-03-02 Uros Bizjak PR target/79514 diff --git a/gcc/testsuite/gcc.target/powerpc/pr79439.c b/gcc/testsuite/gcc.target/powerpc/pr79439.c new file mode 100644 index 000000000000..c9b99871a5e3 --- /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} 2 } } */ +/* { dg-final { scan-assembler-times {\mbl rec\M} 1 } } */ +/* { dg-final { scan-assembler-times {\mnop\M} 4 } } */ -- 2.47.2