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;