aboutsummaryrefslogtreecommitdiff
path: root/gcc/dse.c
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2011-03-17 13:36:04 +0100
committerJakub Jelinek <jakub@gcc.gnu.org>2011-03-17 13:36:04 +0100
commitdabd47e701a73fca7f4e2495b5a86704bf0a1855 (patch)
treec09b459b96bf1b799f0dc616fcf477cc1bb299cd /gcc/dse.c
parent1b6fa86002afb4a8f28ab40afc812ec5e73ccba6 (diff)
downloadgcc-dabd47e701a73fca7f4e2495b5a86704bf0a1855.zip
gcc-dabd47e701a73fca7f4e2495b5a86704bf0a1855.tar.gz
gcc-dabd47e701a73fca7f4e2495b5a86704bf0a1855.tar.bz2
re PR rtl-optimization/48141 (DSE compile time hog)
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
Diffstat (limited to 'gcc/dse.c')
-rw-r--r--gcc/dse.c22
1 files changed, 22 insertions, 0 deletions
diff --git a/gcc/dse.c b/gcc/dse.c
index e43ab72..a15b735 100644
--- 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. */