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]

[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;


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