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;