This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Avoid useless overhead of -freorder-blocks-and-partition
- From: Jan Hubicka <hubicka at ucw dot cz>
- To: gcc-patches at gcc dot gnu dot org
- Date: Thu, 8 Jun 2017 16:22:30 +0200
- Subject: Avoid useless overhead of -freorder-blocks-and-partition
- Authentication-results: sourceware.org; auth=none
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;