ipa-inline.c (can_inline_edge_p): Short circuit if inline_failed already is final.
authorJan Hubicka <hubicka@ucw.cz>
Fri, 20 Mar 2015 06:41:17 +0000 (07:41 +0100)
committerJan Hubicka <hubicka@gcc.gnu.org>
Fri, 20 Mar 2015 06:41:17 +0000 (06:41 +0000)
* 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

gcc/ChangeLog
gcc/cif-code.def
gcc/ipa-inline.c

index 30d6a5e74a25c0c5701d712f63aa8e75a1abc850..33369648c2f88c81e668640dcfecd3e3db941b4a 100644 (file)
@@ -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
index 467cfcc655e47b568c2ad4425253f932d9d9fa40..202fddf75ee04448652ab6d60617ac0c4fab96da 100644 (file)
@@ -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"))
index dd2e64ce28e2b50b0ad1cc08eb366c2a5ff0ae83..851ef3fa8e7c50750c711d5a53d5ba3e885ac88b 100644 (file)
@@ -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");