This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Avoid useless overhead of -freorder-blocks-and-partition


Hi,
enabling -freorder-functions-and-partition leads to outputting many dead
labels for cold sections of functions that was not partitioned as well
as to many addition COMDAT sections for empty partitions.

This patch fixes it by using the partitined path of final codegen only when
function was actually partitioned.  I have double checked that those checks that
are executed for x86-64 at all are actually checked after has_bb_partition
is initialized.

There is additional check in scheduled and holoop but those are both done
from machine reorg that is late as well.

Bootstrapped/regtested x86_64 and profiledbootstrapped with additional patches,
will commit it shortly.

Honza

	* cfgrtl.c (cfg_layout_initialize): Check crtl->has_bb_partition
	instead of flag_reorder_blocks_and_partition.
	* dbxout.c (dbxout_function_end): Likewise.
	* dwarf2out.c (gen_subprogram_die): Likewise.
	* haifa-sched.c (sched_create_recovery_edges): Likewise.
	* hw-doloop.c (reorg_loops): Likewise.
	* varasm.c (assemble_start_function,
	assemble_end_function): Likewise.
	(decide_function_section): Do not check for
	flag_reorder_blocks_and_partition.
Index: cfgrtl.c
===================================================================
--- cfgrtl.c	(revision 249013)
+++ cfgrtl.c	(working copy)
@@ -4249,8 +4249,7 @@ cfg_layout_initialize (int flags)
      layout required moving a block from the hot to the cold
      section. This would create an illegal partitioning unless some
      manual fixup was performed.  */
-  gcc_assert (!(crtl->bb_reorder_complete
-		&& flag_reorder_blocks_and_partition));
+  gcc_assert (!crtl->bb_reorder_complete || !crtl->has_bb_partition);
 
   initialize_original_copy_tables ();
 
Index: dbxout.c
===================================================================
--- dbxout.c	(revision 249013)
+++ dbxout.c	(working copy)
@@ -916,7 +916,7 @@ dbxout_function_end (tree decl ATTRIBUTE
 
   /* By convention, GCC will mark the end of a function with an N_FUN
      symbol and an empty string.  */
-  if (flag_reorder_blocks_and_partition)
+  if (crtl->has_bb_partition)
     {
       dbxout_begin_empty_stabs (N_FUN);
       dbxout_stab_value_label_diff (crtl->subsections.hot_section_end_label,
Index: dwarf2out.c
===================================================================
--- dwarf2out.c	(revision 249013)
+++ dwarf2out.c	(working copy)
@@ -22152,7 +22152,7 @@ gen_subprogram_die (tree decl, dw_die_re
 
       struct function *fun = DECL_STRUCT_FUNCTION (decl);
 
-      if (!flag_reorder_blocks_and_partition)
+      if (!crtl->has_bb_partition)
 	{
 	  dw_fde_ref fde = fun->fde;
 	  if (fde->dw_fde_begin)
@@ -26472,7 +26472,7 @@ set_cur_line_info_table (section *sec)
     {
       const char *end_label;
 
-      if (flag_reorder_blocks_and_partition)
+      if (crtl->has_bb_partition)
 	{
 	  if (in_cold_section_p)
 	    end_label = crtl->subsections.cold_section_end_label;
@@ -26514,7 +26514,7 @@ dwarf2out_begin_function (tree fun)
   if (sec != text_section)
     have_multiple_function_sections = true;
 
-  if (flag_reorder_blocks_and_partition && !cold_text_section)
+  if (crtl->has_bb_partition && !cold_text_section)
     {
       gcc_assert (current_function_decl == fun);
       cold_text_section = unlikely_text_section ();
Index: haifa-sched.c
===================================================================
--- haifa-sched.c	(revision 249013)
+++ haifa-sched.c	(working copy)
@@ -8313,8 +8313,7 @@ sched_create_recovery_edges (basic_block
     /* Partition type is the same, if it is "unpartitioned".  */
     {
       /* Rewritten from cfgrtl.c.  */
-      if (flag_reorder_blocks_and_partition
-	  && targetm_common.have_named_sections)
+      if (crtl->has_bb_partition && targetm_common.have_named_sections)
 	{
 	  /* We don't need the same note for the check because
 	     any_condjump_p (check) == true.  */
Index: hw-doloop.c
===================================================================
--- hw-doloop.c	(revision 249013)
+++ hw-doloop.c	(working copy)
@@ -634,7 +634,7 @@ reorg_loops (bool do_reorder, struct hw_
 
   /* We can't enter cfglayout mode anymore if basic block partitioning
      already happened.  */
-  if (do_reorder && !flag_reorder_blocks_and_partition)
+  if (do_reorder && !crtl->has_bb_partition)
     {
       reorder_loops (loops);
       free_loops (loops);
Index: varasm.c
===================================================================
--- varasm.c	(revision 249013)
+++ varasm.c	(working copy)
@@ -1670,10 +1670,6 @@ decide_function_section (tree decl)
 {
   first_function_block_is_cold = false;
 
-  if (flag_reorder_blocks_and_partition)
-    /* We will decide in assemble_start_function.  */
-    return;
-
  if (DECL_SECTION_NAME (decl))
     {
       struct cgraph_node *node = cgraph_node::get (current_function_decl);
@@ -1711,7 +1707,7 @@ assemble_start_function (tree decl, cons
   char tmp_label[100];
   bool hot_label_written = false;
 
-  if (flag_reorder_blocks_and_partition)
+  if (crtl->has_bb_partition)
     {
       ASM_GENERATE_INTERNAL_LABEL (tmp_label, "LHOTB", const_labelno);
       crtl->subsections.hot_section_label = ggc_strdup (tmp_label);
@@ -1746,7 +1742,7 @@ assemble_start_function (tree decl, cons
      has both hot and cold sections, because we don't want to re-set
      the alignment when the section switch happens mid-function.  */
 
-  if (flag_reorder_blocks_and_partition)
+  if (crtl->has_bb_partition)
     {
       first_function_block_is_cold = false;
 
@@ -1773,8 +1769,7 @@ assemble_start_function (tree decl, cons
   /* Switch to the correct text section for the start of the function.  */
 
   switch_to_section (function_section (decl));
-  if (flag_reorder_blocks_and_partition
-      && !hot_label_written)
+  if (crtl->has_bb_partition && !hot_label_written)
     ASM_OUTPUT_LABEL (asm_out_file, crtl->subsections.hot_section_label);
 
   /* Tell assembler to move to target machine's alignment for functions.  */
@@ -1850,7 +1845,7 @@ assemble_end_function (tree decl, const
 {
 #ifdef ASM_DECLARE_FUNCTION_SIZE
   /* We could have switched section in the middle of the function.  */
-  if (flag_reorder_blocks_and_partition)
+  if (crtl->has_bb_partition)
     switch_to_section (function_section (decl));
   ASM_DECLARE_FUNCTION_SIZE (asm_out_file, fnname, decl);
 #endif
@@ -1861,7 +1856,7 @@ assemble_end_function (tree decl, const
     }
   /* Output labels for end of hot/cold text sections (to be used by
      debug info.)  */
-  if (flag_reorder_blocks_and_partition)
+  if (crtl->has_bb_partition)
     {
       section *save_text_section;
 


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]