This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[patch] cfglayout fixes
- From: Steven Bosscher <stevenb dot gcc at gmail dot com>
- To: GCC Patches <gcc-patches at gcc dot gnu dot org>
- Cc: Jakub Jelinek <jakub at redhat dot com>
- Date: Thu, 6 Dec 2012 13:48:31 +0100
- Subject: [patch] cfglayout fixes
Hello,
This patch has 3 parts:
1. Benign comment fixes.
2. Using DF_REF_REG_MEM_P idiom. Also benign.
3. Real bug fixes for cfglayout mode.
For (3) the fixes are:
- Pointers to the unlinked parts of the insns chain are not cleared,
which results in complete RTL bodies being left not
garbage-collectable until the next function goes into cfglayout mode.
When compiling an artificial test case with two very large functions,
this patch reduces memory footprint by ~33%.
- Looking for BARRIERs as, well, barriers between basic blocks doesn't
work in cfglayout mode: the barriers are not there (they're in
BB_FOOTER, not in the insns chain).
Bootstrapped&tested on powerpc64-unknown-linux-gnu. OK for trunk?
Ciao!
Steven
* bitmap.h: Fix "set_difference" references in comment.
* dse.c (dse_bitmap_obstack): Fix comment.
* loop-invariant.c (record_use): Use DF_REF_REG_MEM_P instead of
looking at specific flags.
* cfgrtl.c (rtl_verify_flow_info): Fix code style (indentation).
(fixup_reorder_chain): Set cfg_layout_function_header to NULL to
avoid dangling pointers into GC-allocated insns. Clear BB_HEADER,
BB_FOOTER, and cfg_layout_function_footer for the same reason.
Do not link new barriers for cfgrtl mode to cfglayout's BB_FOOTER.
* combine.c (combine_instructions): Fix end-of-block check to not
expect BARRIERs, which may not exist in cfglayout mode.
Index: bitmap.h
===================================================================
--- bitmap.h (revision 194247)
+++ bitmap.h (working copy)
@@ -81,7 +81,7 @@ along with GCC; see the file COPYING3. If not see
EXECUTE_IF_AND_IN_BITMAP
* set_union : bitmap_ior / bitmap_ior_into
* set_difference : bitmap_intersect_compl_p /
- bitmap_and_comp / bitmap_and_comp_into /
+ bitmap_and_compl / bitmap_and_compl_into /
EXECUTE_IF_AND_COMPL_IN_BITMAP
* set_disjuction : bitmap_xor_comp / bitmap_xor_comp_into
* set_compare : bitmap_equal_p
Index: dse.c
===================================================================
--- dse.c (revision 194247)
+++ dse.c (working copy)
@@ -204,7 +204,7 @@ along with GCC; see the file COPYING3. If not see
on the default obstack because these bitmaps can grow quite large
(~2GB for the small (!) test case of PR54146) and we'll hold on to
all that memory until the end of the compiler run.
- As a bonus, delete_tree_live_info can destroy all the bitmaps by just
+ As a bonus, dse_step7 can destroy all the bitmaps by just
releasing the whole obstack. */
static bitmap_obstack dse_bitmap_obstack;
Index: loop-invariant.c
===================================================================
--- loop-invariant.c (revision 194247)
+++ loop-invariant.c (working copy)
@@ -756,8 +756,7 @@ record_use (struct def *def, df_ref use)
u->pos = DF_REF_REAL_LOC (use);
u->insn = DF_REF_INSN (use);
- u->addr_use_p = (DF_REF_TYPE (use) == DF_REF_REG_MEM_LOAD
- || DF_REF_TYPE (use) == DF_REF_REG_MEM_STORE);
+ u->addr_use_p = DF_REF_REG_MEM_P (use);
u->next = def->uses;
def->uses = u;
def->n_uses++;
Index: cfgrtl.c
===================================================================
--- cfgrtl.c (revision 194247)
+++ cfgrtl.c (working copy)
@@ -2361,13 +2361,13 @@ rtl_verify_flow_info (void)
break;
/* And that the code outside of basic blocks has NULL bb field. */
- if (!BARRIER_P (x)
- && BLOCK_FOR_INSN (x) != NULL)
- {
- error ("insn %d outside of basic blocks has non-NULL bb field",
- INSN_UID (x));
- err = 1;
- }
+ if (!BARRIER_P (x)
+ && BLOCK_FOR_INSN (x) != NULL)
+ {
+ error ("insn %d outside of basic blocks has non-NULL bb field",
+ INSN_UID (x));
+ err = 1;
+ }
}
if (!x)
@@ -3159,6 +3159,7 @@ fixup_reorder_chain (void)
insn = cfg_layout_function_header;
while (NEXT_INSN (insn))
insn = NEXT_INSN (insn);
+ cfg_layout_function_header = NULL_RTX;
}
/* First do the bulk reordering -- rechain the blocks without regard to
@@ -3190,15 +3191,18 @@ fixup_reorder_chain (void)
while (NEXT_INSN (insn))
insn = NEXT_INSN (insn);
}
+ BB_HEADER (bb) = BB_FOOTER (bb) = NULL_RTX;
}
NEXT_INSN (insn) = cfg_layout_function_footer;
if (cfg_layout_function_footer)
- PREV_INSN (cfg_layout_function_footer) = insn;
+ {
+ PREV_INSN (cfg_layout_function_footer) = insn;
+ while (NEXT_INSN (insn))
+ insn = NEXT_INSN (insn);
+ cfg_layout_function_footer = NULL_RTX;
+ }
- while (NEXT_INSN (insn))
- insn = NEXT_INSN (insn);
-
set_last_insn (insn);
#ifdef ENABLE_CHECKING
verify_insn_chain ();
@@ -3242,7 +3246,7 @@ fixup_reorder_chain (void)
{
gcc_assert (!onlyjump_p (bb_end_insn)
|| returnjump_p (bb_end_insn));
- BB_FOOTER (bb) = emit_barrier_after (bb_end_insn);
+ emit_barrier_after (bb_end_insn);
continue;
}
Index: combine.c
===================================================================
--- combine.c (revision 194247)
+++ combine.c (working copy)
@@ -1223,11 +1223,10 @@ combine_instructions (rtx f, unsigned int nregs)
if (NONDEBUG_INSN_P (insn))
{
while (last_combined_insn
- && INSN_DELETED_P (last_combined_insn))
+ && INSN_DELETED_P (last_combined_insn)
+ && last_combined_insn != BB_HEAD (this_basic_block))
last_combined_insn = PREV_INSN (last_combined_insn);
if (last_combined_insn == NULL_RTX
- || BARRIER_P (last_combined_insn)
- || BLOCK_FOR_INSN (last_combined_insn) != this_basic_block
|| DF_INSN_LUID (last_combined_insn) <= DF_INSN_LUID (insn))
last_combined_insn = insn;