[06/10] Experiments with using optinfo for inlining

Message ID 1527626483-4723-7-git-send-email-dmalcolm@redhat.com
State New
Headers show
Series
  • RFC: Prototype of compiler-assisted performance analysis
Related show

Commit Message

David Malcolm May 29, 2018, 8:41 p.m.
gcc/ChangeLog:
	* ipa-inline.c: Include "optinfo.h".
	(report_inline_failed_reason): Use OPTINFO_FAILURE.
	(flatten_function): Use OPTINFO_SUCCESS.
	(early_inline_small_functions): Likewise.
	* tree-inline.c: Include "optinfo.h".
	(expand_call_inline): Use OPTINFO_SUCCESS.
---
 gcc/ipa-inline.c  | 25 +++++++++++++++++++++++++
 gcc/tree-inline.c | 10 ++++++++++
 2 files changed, 35 insertions(+)

-- 
1.8.5.3

Patch

diff --git a/gcc/ipa-inline.c b/gcc/ipa-inline.c
index b7f213f..3fd064a 100644
--- a/gcc/ipa-inline.c
+++ b/gcc/ipa-inline.c
@@ -120,6 +120,7 @@  along with GCC; see the file COPYING3.  If not see
 #include "stringpool.h"
 #include "attribs.h"
 #include "asan.h"
+#include "optinfo.h"
 
 typedef fibonacci_heap <sreal, cgraph_edge> edge_heap_t;
 typedef fibonacci_node <sreal, cgraph_edge> edge_heap_node_t;
@@ -250,6 +251,18 @@  report_inline_failed_reason (struct cgraph_edge *e)
 	  (dump_file, 2, opts_for_fn (e->caller->decl),
 	   opts_for_fn (e->callee->ultimate_alias_target ()->decl));
     }
+  /* FIXME: partial re-implementation in terms of optinfo.  */
+  if (optinfo_enabled_p ())
+    {
+      OPTINFO_FAILURE (e->call_stmt)
+	<< "not inlinable: "
+	<< e->caller
+	<< " -> "
+	<< e->callee
+	<< ": "
+	<< cgraph_inline_failed_string (e->inline_failed);
+      // FIXME: etc; see the option mismatch code above
+    }
 }
 
  /* Decide whether sanitizer-related attributes allow inlining. */
@@ -2167,6 +2180,12 @@  flatten_function (struct cgraph_node *node, bool early)
 	fprintf (dump_file, " Inlining %s into %s.\n",
 		 xstrdup_for_dump (callee->name ()),
 		 xstrdup_for_dump (e->caller->name ()));
+      if (optinfo_enabled_p ())
+	OPTINFO_SUCCESS (e->call_stmt)
+	  << "inlining "
+	  << callee
+	  << " into "
+	  << e->caller;
       orig_callee = callee;
       inline_call (e, true, NULL, NULL, false);
       if (e->callee != orig_callee)
@@ -2677,6 +2696,12 @@  early_inline_small_functions (struct cgraph_node *node)
 	fprintf (dump_file, " Inlining %s into %s.\n",
 		 xstrdup_for_dump (callee->name ()),
 		 xstrdup_for_dump (e->caller->name ()));
+      if (optinfo_enabled_p ())
+	OPTINFO_SUCCESS (e->call_stmt)
+	  << "inlining "
+	  << callee
+	  << " into "
+	  << e->caller;
       inline_call (e, true, NULL, NULL, false);
       inlined = true;
     }
diff --git a/gcc/tree-inline.c b/gcc/tree-inline.c
index 5a0a252..5d3598e 100644
--- a/gcc/tree-inline.c
+++ b/gcc/tree-inline.c
@@ -61,6 +61,7 @@  along with GCC; see the file COPYING3.  If not see
 #include "stringpool.h"
 #include "attribs.h"
 #include "sreal.h"
+#include "optinfo.h"
 
 /* I'm not real happy about this, but we need to handle gimple and
    non-gimple trees.  */
@@ -4719,6 +4720,15 @@  expand_call_inline (basic_block bb, gimple *stmt, copy_body_data *id)
       id->src_node->dump (dump_file);
       id->dst_node->dump (dump_file);
     }
+  /* FIXME.  */
+  if (optinfo_enabled_p ())
+    OPTINFO_SUCCESS(call_stmt)
+      << "Inlining "
+      << id->src_node
+      << " to "
+      << id->dst_node
+      << optinfo_printf (" with frequency %4.2f",
+			 cg_edge->sreal_frequency ().to_double ());
 
   /* This is it.  Duplicate the callee body.  Assume callee is
      pre-gimplified.  Note that we must not alter the caller