re PR tree-optimization/47234 (ipa-split is executed before profile feedback is read)
authorJan Hubicka <jh@suse.cz>
Mon, 10 Jan 2011 14:33:04 +0000 (15:33 +0100)
committerJan Hubicka <hubicka@gcc.gnu.org>
Mon, 10 Jan 2011 14:33:04 +0000 (14:33 +0000)
PR tree-optimization/47234
* tree-pass.h (TODO_rebuild_cgraph_edges): New TODO.
(pass_feedback_split_functions): Declare.
* passes.c (init_optimization_passes): Add ipa-split as subpass of
tree-profile.
* ipa-split.c (gate_split_functions): Update comments; disable
split-functions for profile_arc_flag and branch_probabilities.
(gate_feedback_split_functions): New function.
(execute_feedback_split_functions): New function.
(pass_feedback_split_functions): New global var.

From-SVN: r168632

gcc/ChangeLog
gcc/ipa-split.c
gcc/passes.c
gcc/tree-pass.h

index a07601f8dd829c0858449a2fcdfd5e30e4cb810d..4eff7926d8ca8df2e12636600089a4190bf87aeb 100644 (file)
@@ -1,3 +1,16 @@
+2011-01-10  Jan Hubicka  <jh@suse.cz>
+
+       PR tree-optimization/47234 
+       * tree-pass.h (TODO_rebuild_cgraph_edges): New TODO.
+       (pass_feedback_split_functions): Declare.
+       * passes.c (init_optimization_passes): Add ipa-split as subpass of
+       tree-profile.
+       * ipa-split.c (gate_split_functions): Update comments; disable
+       split-functions for profile_arc_flag and branch_probabilities.
+       (gate_feedback_split_functions): New function.
+       (execute_feedback_split_functions): New function.
+       (pass_feedback_split_functions): New global var.
+
 2011-01-10  H.J. Lu  <hongjiu.lu@intel.com>
 
        PR lto/46760
index fabd6d11bd9f6c89366a83625452df0c814e4c82..4fcbfe940ba57a95458807b1d427cee7ced148d4 100644 (file)
@@ -1265,7 +1265,9 @@ execute_split_functions (void)
   /* See if it makes sense to try to split.
      It makes sense to split if we inline, that is if we have direct calls to
      handle or direct calls are possibly going to appear as result of indirect
-     inlining or LTO.
+     inlining or LTO.  Also handle -fprofile-generate as LTO to allow non-LTO
+     training for LTO -fprofile-use build.
+
      Note that we are not completely conservative about disqualifying functions
      called once.  It is possible that the caller is called more then once and
      then inlining would still benefit.  */
@@ -1336,10 +1338,15 @@ execute_split_functions (void)
   return todo;
 }
 
+/* Gate function splitting pass.  When doing profile feedback, we want
+   to execute the pass after profiling is read.  So disable one in 
+   early optimization.  */
+
 static bool
 gate_split_functions (void)
 {
-  return flag_partial_inlining;
+  return (flag_partial_inlining
+         && !profile_arc_flag && !flag_branch_probabilities);
 }
 
 struct gimple_opt_pass pass_split_functions =
@@ -1360,3 +1367,44 @@ struct gimple_opt_pass pass_split_functions =
   TODO_dump_func                       /* todo_flags_finish */
  }
 };
+
+/* Gate feedback driven function splitting pass.
+   We don't need to split when profiling at all, we are producing
+   lousy code anyway.  */
+
+static bool
+gate_feedback_split_functions (void)
+{
+  return (flag_partial_inlining
+         && flag_branch_probabilities);
+}
+
+/* Execute function splitting pass.  */
+
+static unsigned int
+execute_feedback_split_functions (void)
+{
+  unsigned int retval = execute_split_functions ();
+  if (retval)
+    retval |= TODO_rebuild_cgraph_edges;
+  return retval;
+}
+
+struct gimple_opt_pass pass_feedback_split_functions =
+{
+ {
+  GIMPLE_PASS,
+  "feedback_fnsplit",                  /* name */
+  gate_feedback_split_functions,       /* gate */
+  execute_feedback_split_functions,    /* execute */
+  NULL,                                        /* sub */
+  NULL,                                        /* next */
+  0,                                   /* static_pass_number */
+  TV_IPA_FNSPLIT,                      /* tv_id */
+  PROP_cfg,                            /* properties_required */
+  0,                                   /* properties_provided */
+  0,                                   /* properties_destroyed */
+  0,                                   /* todo_flags_start */
+  TODO_dump_func                       /* todo_flags_finish */
+ }
+};
index 4be61a9455e577594d1d23c3948afb14ff7df631..804ac9f2a601f26157ba6802bd1bfd38aefe5dfe 100644 (file)
@@ -785,6 +785,10 @@ init_optimization_passes (void)
       NEXT_PASS (pass_inline_parameters);
     }
   NEXT_PASS (pass_ipa_tree_profile);
+    {
+      struct opt_pass **p = &pass_ipa_tree_profile.pass.sub;
+      NEXT_PASS (pass_feedback_split_functions);
+    }
   NEXT_PASS (pass_ipa_increase_alignment);
   NEXT_PASS (pass_ipa_matrix_reorg);
   NEXT_PASS (pass_ipa_lower_emutls);
@@ -1227,6 +1231,9 @@ execute_function_todo (void *data)
   if (flags & TODO_rebuild_frequencies)
     rebuild_frequencies ();
 
+  if (flags & TODO_rebuild_cgraph_edges)
+    rebuild_cgraph_edges ();
+
   /* If we've seen errors do not bother running any verifiers.  */
   if (seen_error ())
     return;
index a87a7706f77c4e3584388d19d975f57bb887cb48..32d8f40470cc29756617e653347f8a79149d5f3a 100644 (file)
@@ -312,6 +312,9 @@ struct dump_file_info
 /* Rebuild the addressable-vars bitmap and do register promotion.  */
 #define TODO_update_address_taken      (1 << 21)
 
+/* Rebuild the callgraph edges.  */
+#define TODO_rebuild_cgraph_edges       (1 << 22)
+
 /* Internally used in execute_function_todo().  */
 #define TODO_update_ssa_any            \
     (TODO_update_ssa                   \
@@ -442,6 +445,7 @@ extern struct gimple_opt_pass pass_local_pure_const;
 extern struct gimple_opt_pass pass_tracer;
 extern struct gimple_opt_pass pass_warn_unused_result;
 extern struct gimple_opt_pass pass_split_functions;
+extern struct gimple_opt_pass pass_feedback_split_functions;
 
 /* IPA Passes */
 extern struct simple_ipa_opt_pass pass_ipa_lower_emutls;