aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJan Hubicka <hubicka@ucw.cz>2015-03-20 07:41:17 +0100
committerJan Hubicka <hubicka@gcc.gnu.org>2015-03-20 06:41:17 +0000
commit7ce7e4d49497bb1b3459dd6e35dea6b7327531d5 (patch)
treeaae13f8578d0f05cdbe59e21353a22070a4f17cb /gcc
parent21e357f1f2ecbd7b6ab479d8f2836e251681194b (diff)
downloadgcc-7ce7e4d49497bb1b3459dd6e35dea6b7327531d5.zip
gcc-7ce7e4d49497bb1b3459dd6e35dea6b7327531d5.tar.gz
gcc-7ce7e4d49497bb1b3459dd6e35dea6b7327531d5.tar.bz2
ipa-inline.c (can_inline_edge_p): Short circuit if inline_failed already is final.
* ipa-inline.c (can_inline_edge_p): Short circuit if inline_failed already is final. (ipa_inline): Recompute inline_failed codes. * cif-code.def (FUNCTION_NOT_OPTIMIZED, REDEFINED_EXTERN_INLINE, USES_COMDAT_LOCAL, ATTRIBUTE_MISMATCH, UNREACHABLE): Declare as CIF_FINAL_ERROR. From-SVN: r221530
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog9
-rw-r--r--gcc/cif-code.def14
-rw-r--r--gcc/ipa-inline.c33
3 files changed, 41 insertions, 15 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 30d6a5e..3336964 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,12 @@
+2015-03-20 Jan Hubicka <hubicka@ucw.cz>
+
+ * ipa-inline.c (can_inline_edge_p): Short circuit if inline_failed
+ already is final.
+ (ipa_inline): Recompute inline_failed codes.
+ * cif-code.def (FUNCTION_NOT_OPTIMIZED, REDEFINED_EXTERN_INLINE,
+ USES_COMDAT_LOCAL, ATTRIBUTE_MISMATCH, UNREACHABLE): Declare as
+ CIF_FINAL_ERROR.
+
2015-03-20 Uros Bizjak <ubizjak@gmail.com>
PR rtl-optimization/60851
diff --git a/gcc/cif-code.def b/gcc/cif-code.def
index 467cfcc..202fddf 100644
--- a/gcc/cif-code.def
+++ b/gcc/cif-code.def
@@ -39,7 +39,7 @@ DEFCIFCODE(FUNCTION_NOT_CONSIDERED, CIF_FINAL_NORMAL,
N_("function not considered for inlining"))
/* Caller is compiled with optimizations disabled. */
-DEFCIFCODE(FUNCTION_NOT_OPTIMIZED, CIF_FINAL_NORMAL,
+DEFCIFCODE(FUNCTION_NOT_OPTIMIZED, CIF_FINAL_ERROR,
N_("caller is not optimized"))
/* Inlining failed owing to unavailable function body. */
@@ -47,7 +47,7 @@ DEFCIFCODE(BODY_NOT_AVAILABLE, CIF_FINAL_ERROR,
N_("function body not available"))
/* Extern inline function that has been redefined. */
-DEFCIFCODE(REDEFINED_EXTERN_INLINE, CIF_FINAL_NORMAL,
+DEFCIFCODE(REDEFINED_EXTERN_INLINE, CIF_FINAL_ERROR,
N_("redefined extern inline functions are not considered for "
"inlining"))
@@ -87,10 +87,6 @@ DEFCIFCODE(UNLIKELY_CALL, CIF_FINAL_NORMAL,
DEFCIFCODE(NOT_DECLARED_INLINED, CIF_FINAL_NORMAL,
N_("function not declared inline and code size would grow"))
-/* Inlining suppressed due to size optimization. */
-DEFCIFCODE(OPTIMIZING_FOR_SIZE, CIF_FINAL_NORMAL,
- N_("optimizing for size and code size would grow"))
-
/* Caller and callee disagree on the arguments. */
DEFCIFCODE(MISMATCHED_ARGUMENTS, CIF_FINAL_ERROR,
N_("mismatched arguments"))
@@ -121,13 +117,13 @@ DEFCIFCODE(OPTIMIZATION_MISMATCH, CIF_FINAL_ERROR,
N_("optimization level attribute mismatch"))
/* We can't inline because the callee refers to comdat-local symbols. */
-DEFCIFCODE(USES_COMDAT_LOCAL, CIF_FINAL_NORMAL,
+DEFCIFCODE(USES_COMDAT_LOCAL, CIF_FINAL_ERROR,
N_("callee refers to comdat-local symbols"))
/* We can't inline because of mismatched caller/callee attributes. */
-DEFCIFCODE(ATTRIBUTE_MISMATCH, CIF_FINAL_NORMAL,
+DEFCIFCODE(ATTRIBUTE_MISMATCH, CIF_FINAL_ERROR,
N_("function attribute mismatch"))
/* We proved that the call is unreachable. */
-DEFCIFCODE(UNREACHABLE, CIF_FINAL_NORMAL,
+DEFCIFCODE(UNREACHABLE, CIF_FINAL_ERROR,
N_("unreachable"))
diff --git a/gcc/ipa-inline.c b/gcc/ipa-inline.c
index dd2e64c..851ef3f 100644
--- a/gcc/ipa-inline.c
+++ b/gcc/ipa-inline.c
@@ -312,6 +312,15 @@ static bool
can_inline_edge_p (struct cgraph_edge *e, bool report,
bool disregard_limits = false, bool early = false)
{
+ gcc_checking_assert (e->inline_failed);
+
+ if (cgraph_inline_failed_type (e->inline_failed) == CIF_FINAL_ERROR)
+ {
+ if (report)
+ report_inline_failed_reason (e);
+ return false;
+ }
+
bool inlinable = true;
enum availability avail;
cgraph_node *callee = e->callee->ultimate_alias_target (&avail);
@@ -323,9 +332,7 @@ can_inline_edge_p (struct cgraph_edge *e, bool report,
struct function *caller_fun = caller->get_fun ();
struct function *callee_fun = callee ? callee->get_fun () : NULL;
- gcc_assert (e->inline_failed);
-
- if (!callee || !callee->definition)
+ if (!callee->definition)
{
e->inline_failed = CIF_BODY_NOT_AVAILABLE;
inlinable = false;
@@ -363,8 +370,7 @@ can_inline_edge_p (struct cgraph_edge *e, bool report,
}
/* TM pure functions should not be inlined into non-TM_pure
functions. */
- else if (is_tm_pure (callee->decl)
- && !is_tm_pure (caller->decl))
+ else if (is_tm_pure (callee->decl) && !is_tm_pure (caller->decl))
{
e->inline_failed = CIF_UNSPECIFIED;
inlinable = false;
@@ -2289,7 +2295,22 @@ ipa_inline (void)
nnodes = ipa_reverse_postorder (order);
FOR_EACH_FUNCTION (node)
- node->aux = 0;
+ {
+ node->aux = 0;
+
+ /* Recompute the default reasons for inlining because they may have
+ changed during merging. */
+ if (in_lto_p)
+ {
+ for (cgraph_edge *e = node->callees; e; e = e->next_callee)
+ {
+ gcc_assert (e->inline_failed);
+ initialize_inline_failed (e);
+ }
+ for (cgraph_edge *e = node->indirect_calls; e; e = e->next_callee)
+ initialize_inline_failed (e);
+ }
+ }
if (dump_file)
fprintf (dump_file, "\nFlattening functions:\n");