aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJan Hubicka <hubicka@ucw.cz>2015-02-03 00:46:31 +0100
committerJan Hubicka <hubicka@gcc.gnu.org>2015-02-02 23:46:31 +0000
commitd67bce7ce8500397d0f8a8109d6026961f99c87a (patch)
tree4c2422df208e99dff694860c414a8756065c70ba
parenta4bb6959b818841e232449c9d092c3df3630ea5c (diff)
downloadgcc-d67bce7ce8500397d0f8a8109d6026961f99c87a.zip
gcc-d67bce7ce8500397d0f8a8109d6026961f99c87a.tar.gz
gcc-d67bce7ce8500397d0f8a8109d6026961f99c87a.tar.bz2
ipa-inline.c (early_inliner): Skip inlining only in always_inlined...
* ipa-inline.c (early_inliner): Skip inlining only in always_inlined; if some always_inline was inlined, apply changes before inlining heuristically. * g++.dg/ipa/devirt-37.C: Disable early inlining. From-SVN: r220359
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/ipa-inline.c16
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/g++.dg/ipa/devirt-37.C2
4 files changed, 26 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 467a668..9f6e800 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2015-02-02 Jan Hubicka <hubicka@ucw.cz>
+
+ * ipa-inline.c (early_inliner): Skip inlining only in always_inlined;
+ if some always_inline was inlined, apply changes before inlining
+ heuristically.
+
2015-02-02 David Malcolm <dmalcolm@redhat.com>
PR jit/64810
diff --git a/gcc/ipa-inline.c b/gcc/ipa-inline.c
index be22890..d9ab56a 100644
--- a/gcc/ipa-inline.c
+++ b/gcc/ipa-inline.c
@@ -2528,7 +2528,9 @@ early_inliner (function *fun)
cycles of edges to be always inlined in the callgraph.
We might want to be smarter and just avoid this type of inlining. */
- || DECL_DISREGARD_INLINE_LIMITS (node->decl))
+ || (DECL_DISREGARD_INLINE_LIMITS (node->decl)
+ && lookup_attribute ("always_inline",
+ DECL_ATTRIBUTES (node->decl))))
;
else if (lookup_attribute ("flatten",
DECL_ATTRIBUTES (node->decl)) != NULL)
@@ -2543,6 +2545,18 @@ early_inliner (function *fun)
}
else
{
+ /* If some always_inline functions was inlined, apply the changes.
+ This way we will not account always inline into growth limits and
+ moreover we will inline calls from always inlines that we skipped
+ previously becuase of conditional above. */
+ if (inlined)
+ {
+ timevar_push (TV_INTEGRATION);
+ todo |= optimize_inline_calls (current_function_decl);
+ inline_update_overall_summary (node);
+ inlined = false;
+ timevar_pop (TV_INTEGRATION);
+ }
/* We iterate incremental inlining to get trivial cases of indirect
inlining. */
while (iterations < PARAM_VALUE (PARAM_EARLY_INLINER_MAX_ITERATIONS)
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 1bb46b3..2039b4c 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,7 @@
+2015-02-02 Jan Hubicka <hubicka@ucw.cz>
+
+ * g++.dg/ipa/devirt-37.C: Disable early inlining.
+
2015-02-02 Christophe Lyon <christophe.lyon@linaro.org>
* gcc.target/aarch64/advsimd-intrinsics/arm-neon-ref.h
diff --git a/gcc/testsuite/g++.dg/ipa/devirt-37.C b/gcc/testsuite/g++.dg/ipa/devirt-37.C
index 0dc4d27..7e1acdc 100644
--- a/gcc/testsuite/g++.dg/ipa/devirt-37.C
+++ b/gcc/testsuite/g++.dg/ipa/devirt-37.C
@@ -1,4 +1,4 @@
-/* { dg-options "-fpermissive -O2 -fno-indirect-inlining -fno-devirtualize-speculatively -fdump-tree-fre2-details" } */
+/* { dg-options "-fpermissive -O2 -fno-indirect-inlining -fno-devirtualize-speculatively -fdump-tree-fre2-details -fno-early-inlining" } */
#include <stdlib.h>
struct A {virtual void test() {abort ();}};
struct B:A