http://gcc.gnu.org/bugzilla/show_bug.cgi?id=57698

--- Comment #7 from Sriraman Tallam <tmsriram at google dot com> ---
Taking a stab at fixing this.  Here is what is going on. In rev. 200179, this
change to tree-inline.c

Index: tree-inline.c
===================================================================
--- tree-inline.c       (revision 200178)
+++ tree-inline.c       (revision 200179)
@@ -3905,8 +3905,6 @@
             for inlining, but we can't do that because frontends overwrite
             the body.  */
          && !cg_edge->callee->local.redefined_extern_inline
-         /* Avoid warnings during early inline pass. */
-         && cgraph_global_info_ready
          /* PR 20090218-1_0.c. Body can be provided by another module. */
          && (reason != CIF_BODY_NOT_AVAILABLE || !flag_generate_lto))
        {

made inline failure errors during early inlining reportable.  Now, this
function is called when the early_inliner calls  optimize_inline_calls.  The
reason for the failure, CIF_INDIRECT_UNKNOWN_CALL, should not be reported
because it is not a valid reason,(see can_inline_edge_p in ipa-inline.c for the
list of reasons we intend to report) but it gets reported because of the above
change. 

I have the following patch to tree-inline.c to fix this by enumerating all the
early inliner failures that should be reported. I took this list by simply
looking at can_inline_edge_p. Please see patch below. Comments please? 

Index: tree-inline.c
===================================================================
--- tree-inline.c       (revision 200912)
+++ tree-inline.c       (working copy)
@@ -3838,6 +3838,32 @@ add_local_variables (struct function *callee, stru
       }
 }

+/* Should an error be reported when early inliner fails to inline an
+   always_inline function?  That depends on the REASON.  */
+
+static inline bool
+report_early_inliner_always_inline_failure (cgraph_inline_failed_t reason)
+{
+  /* Only the following reasons need to be reported when the early inliner
+     fails to inline an always_inline function.  Called from
+     expand_call_inline.*/
+  switch (reason)
+  {
+  case CIF_BODY_NOT_AVAILABLE:
+  case CIF_FUNCTION_NOT_INLINABLE:
+  case CIF_OVERWRITABLE:
+  case CIF_MISMATCHED_ARGUMENTS:
+  case CIF_EH_PERSONALITY:
+  case CIF_UNSPECIFIED:
+  case CIF_NON_CALL_EXCEPTIONS:
+  case CIF_TARGET_OPTION_MISMATCH:
+  case CIF_OPTIMIZATION_MISMATCH:
+    return true;
+  default:
+    return false;
+  }
+}
+
 /* If STMT is a GIMPLE_CALL, replace it with its inline expansion.  */

 static bool
@@ -3905,6 +3931,9 @@ expand_call_inline (basic_block bb, gimple stmt, c
             for inlining, but we can't do that because frontends overwrite
             the body.  */
          && !cg_edge->callee->local.redefined_extern_inline
+         /* During early inline pass, check if the reason is reportable.  */
+         && (cgraph_global_info_ready
+             || report_early_inliner_always_inline_failure (reason))
          /* PR 20090218-1_0.c. Body can be provided by another module. */
          && (reason != CIF_BODY_NOT_AVAILABLE || !flag_generate_lto))
        {

Reply via email to