re PR rtl-optimization/48141 (DSE compile time hog)
authorJakub Jelinek <jakub@redhat.com>
Thu, 17 Mar 2011 12:36:04 +0000 (13:36 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Thu, 17 Mar 2011 12:36:04 +0000 (13:36 +0100)
PR rtl-optimization/48141
* params.def (PARAM_MAX_DSE_ACTIVE_LOCAL_STORES): New.
* dse.c: Include params.h.
(active_local_stores_len): New variable.
(add_wild_read, dse_step1): Clear it when setting active_local_stores
to NULL.
(record_store, check_mem_read_rtx): Decrease it when removing
from the chain.
(scan_insn): Likewise.  Increase it when adding to chain, if it
reaches PARAM_MAX_DSE_ACTIVE_LOCAL_STORES limit, set to 1 and
set active_local_stores to NULL before the addition.
* Makefile.in (dse.o): Depend on $(PARAMS_H).

From-SVN: r171090

gcc/ChangeLog
gcc/Makefile.in
gcc/dse.c
gcc/params.def

index a0bdc239f2de65a52cc038d959934c466813063c..fce8c0ab3876f6275c199ae4d8ad2b46e725b2cb 100644 (file)
@@ -1,5 +1,18 @@
 2011-03-17  Jakub Jelinek  <jakub@redhat.com>
 
+       PR rtl-optimization/48141
+       * params.def (PARAM_MAX_DSE_ACTIVE_LOCAL_STORES): New.
+       * dse.c: Include params.h.
+       (active_local_stores_len): New variable.
+       (add_wild_read, dse_step1): Clear it when setting active_local_stores
+       to NULL.
+       (record_store, check_mem_read_rtx): Decrease it when removing
+       from the chain.
+       (scan_insn): Likewise.  Increase it when adding to chain, if it
+       reaches PARAM_MAX_DSE_ACTIVE_LOCAL_STORES limit, set to 1 and
+       set active_local_stores to NULL before the addition.
+       * Makefile.in (dse.o): Depend on $(PARAMS_H).
+
        PR rtl-optimization/48141
        * dse.c (record_store): If no positions are needed in an insn
        that cannot be deleted, at least unchain it from active_local_stores.
index b4de74b00bae875f57c7e83678acac2094bac914..97133db78e2c84d5e644c0edafc41790deacab3f 100644 (file)
@@ -3070,7 +3070,7 @@ dse.o : dse.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(RTL_H) \
    $(TREE_H) $(TM_P_H) $(REGS_H) hard-reg-set.h $(FLAGS_H) insn-config.h \
    $(RECOG_H) $(EXPR_H) $(DF_H) cselib.h $(DBGCNT_H) $(TIMEVAR_H) \
    $(TREE_PASS_H) alloc-pool.h $(ALIAS_H) dse.h $(OPTABS_H) $(TARGET_H) \
-   $(BITMAP_H)
+   $(BITMAP_H) $(PARAMS_H)
 fwprop.o : fwprop.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(RTL_H) \
    $(DIAGNOSTIC_CORE_H) insn-config.h $(RECOG_H) $(FLAGS_H) $(OBSTACK_H) $(BASIC_BLOCK_H) \
    output.h $(DF_H) alloc-pool.h $(TIMEVAR_H) $(TREE_PASS_H) $(TARGET_H) \
index e43ab72d7427dba66d68b09bc4ae8c60a2a989e0..a15b7351fcc163ee5e63054879fdde27b90e45ea 100644 (file)
--- a/gcc/dse.c
+++ b/gcc/dse.c
@@ -47,6 +47,7 @@ along with GCC; see the file COPYING3.  If not see
 #include "optabs.h"
 #include "dbgcnt.h"
 #include "target.h"
+#include "params.h"
 
 /* This file contains three techniques for performing Dead Store
    Elimination (dse).
@@ -387,6 +388,7 @@ static alloc_pool insn_info_pool;
 /* The linked list of stores that are under consideration in this
    basic block.  */
 static insn_info_t active_local_stores;
+static int active_local_stores_len;
 
 struct bb_info
 {
@@ -947,6 +949,7 @@ add_wild_read (bb_info_t bb_info)
     }
   insn_info->wild_read = true;
   active_local_stores = NULL;
+  active_local_stores_len = 0;
 }
 
 
@@ -1537,6 +1540,7 @@ record_store (rtx body, bb_info_t bb_info)
        {
          insn_info_t insn_to_delete = ptr;
 
+         active_local_stores_len--;
          if (last)
            last->next_local_store = ptr->next_local_store;
          else
@@ -2074,6 +2078,7 @@ check_mem_read_rtx (rtx *loc, void *data)
              if (dump_file)
                dump_insn_info ("removing from active", i_ptr);
 
+             active_local_stores_len--;
              if (last)
                last->next_local_store = i_ptr->next_local_store;
              else
@@ -2163,6 +2168,7 @@ check_mem_read_rtx (rtx *loc, void *data)
              if (dump_file)
                dump_insn_info ("removing from active", i_ptr);
 
+             active_local_stores_len--;
              if (last)
                last->next_local_store = i_ptr->next_local_store;
              else
@@ -2222,6 +2228,7 @@ check_mem_read_rtx (rtx *loc, void *data)
              if (dump_file)
                dump_insn_info ("removing from active", i_ptr);
 
+             active_local_stores_len--;
              if (last)
                last->next_local_store = i_ptr->next_local_store;
              else
@@ -2426,6 +2433,7 @@ scan_insn (bb_info_t bb_info, rtx insn)
                  if (dump_file)
                    dump_insn_info ("removing from active", i_ptr);
 
+                 active_local_stores_len--;
                  if (last)
                    last->next_local_store = i_ptr->next_local_store;
                  else
@@ -2453,6 +2461,12 @@ scan_insn (bb_info_t bb_info, rtx insn)
                    fprintf (dump_file, "handling memset as BLKmode store\n");
                  if (mems_found == 1)
                    {
+                     if (active_local_stores_len++
+                         >= PARAM_VALUE (PARAM_MAX_DSE_ACTIVE_LOCAL_STORES))
+                       {
+                         active_local_stores_len = 1;
+                         active_local_stores = NULL;
+                       }
                      insn_info->next_local_store = active_local_stores;
                      active_local_stores = insn_info;
                    }
@@ -2496,6 +2510,12 @@ scan_insn (bb_info_t bb_info, rtx insn)
      it as cannot delete.  This simplifies the processing later.  */
   if (mems_found == 1)
     {
+      if (active_local_stores_len++
+         >= PARAM_VALUE (PARAM_MAX_DSE_ACTIVE_LOCAL_STORES))
+       {
+         active_local_stores_len = 1;
+         active_local_stores = NULL;
+       }
       insn_info->next_local_store = active_local_stores;
       active_local_stores = insn_info;
     }
@@ -2534,6 +2554,7 @@ remove_useless_values (cselib_val *base)
 
       if (del)
        {
+         active_local_stores_len--;
          if (last)
            last->next_local_store = insn_info->next_local_store;
          else
@@ -2584,6 +2605,7 @@ dse_step1 (void)
            = create_alloc_pool ("cse_store_info_pool",
                                 sizeof (struct store_info), 100);
          active_local_stores = NULL;
+         active_local_stores_len = 0;
          cselib_clear_table ();
 
          /* Scan the insns.  */
index 5749eb2e5f34bc1ba2126a3b2889963fee321d22..e5a82e906b8264ac6762b628e067b86d680fcbb5 100644 (file)
@@ -698,6 +698,12 @@ DEFPARAM(PARAM_MAX_SCHED_READY_INSNS,
         "The maximum number of instructions ready to be issued to be considered by the scheduler during the first scheduling pass",
         100, 0, 0)
 
+/* This is the maximum number of active local stores RTL DSE will consider.  */
+DEFPARAM (PARAM_MAX_DSE_ACTIVE_LOCAL_STORES,
+         "max-dse-active-local-stores",
+         "Maximum number of active local stores in RTL dead store elimination",
+         5000, 0, 0)
+
 /* Prefetching and cache-optimizations related parameters.  Default values are
    usually set by machine description.  */