Commit 6790d1ab by Jan Hubicka Committed by Jan Hubicka

cselib.c (hash_table): Remove GTY marker.

	* cselib.c (hash_table):  Remove GTY marker.
	(reg_values): Turn into array.
	(used_regs): Likewise.
	(n_used_regs): New static variable.
	(reg_values_old): Kill.
	(clear_table): Update uses of arrays.
	(cselib_lookup): Likewise.
	(cselib_record_set): Likewise.
	(cselib_init): Likewise.
	(cselib_finish): Likewise.
	(cselib_udpate_varray_sizes): Kill.
	* cselib.h (cselib_update_varray_sizes): Kill.

From-SVN: r78830
parent 33e6a97a
2004-03-03 Jan Hubicka <jh@suse.cz>
* cselib.c (hash_table): Remove GTY marker.
(reg_values): Turn into array.
(used_regs): Likewise.
(n_used_regs): New static variable.
(reg_values_old): Kill.
(clear_table): Update uses of arrays.
(cselib_lookup): Likewise.
(cselib_record_set): Likewise.
(cselib_init): Likewise.
(cselib_finish): Likewise.
(cselib_udpate_varray_sizes): Kill.
* cselib.h (cselib_update_varray_sizes): Kill.
2004-03-03 Paul Brook <paul@codesourcery.com> 2004-03-03 Paul Brook <paul@codesourcery.com>
* flow.c (ior_reg_cond, and_reg_cond): Remove stray ")". * flow.c (ior_reg_cond, and_reg_cond): Remove stray ")".
......
...@@ -74,7 +74,7 @@ static void cselib_record_sets (rtx); ...@@ -74,7 +74,7 @@ static void cselib_record_sets (rtx);
the locations of the entries with the rtx we are looking up. */ the locations of the entries with the rtx we are looking up. */
/* A table that enables us to look up elts by their value. */ /* A table that enables us to look up elts by their value. */
static GTY((param_is (cselib_val))) htab_t hash_table; static htab_t hash_table;
/* This is a global so we don't have to pass this through every function. /* This is a global so we don't have to pass this through every function.
It is used in new_elt_loc_list to set SETTING_INSN. */ It is used in new_elt_loc_list to set SETTING_INSN. */
...@@ -101,9 +101,9 @@ static int n_useless_values; ...@@ -101,9 +101,9 @@ static int n_useless_values;
which the register was set; if the mode is unknown or the value is which the register was set; if the mode is unknown or the value is
no longer valid in that mode, ELT will be NULL for the first no longer valid in that mode, ELT will be NULL for the first
element. */ element. */
static GTY(()) varray_type reg_values; struct elt_list **reg_values;
static GTY((deletable (""))) varray_type reg_values_old; unsigned int reg_values_size;
#define REG_VALUES(I) VARRAY_ELT_LIST (reg_values, (I)) #define REG_VALUES(i) reg_values[i]
/* The largest number of hard regs used by any entry added to the /* The largest number of hard regs used by any entry added to the
REG_VALUES table. Cleared on each clear_table() invocation. */ REG_VALUES table. Cleared on each clear_table() invocation. */
...@@ -111,8 +111,8 @@ static unsigned int max_value_regs; ...@@ -111,8 +111,8 @@ static unsigned int max_value_regs;
/* Here the set of indices I with REG_VALUES(I) != 0 is saved. This is used /* Here the set of indices I with REG_VALUES(I) != 0 is saved. This is used
in clear_table() for fast emptying. */ in clear_table() for fast emptying. */
static GTY(()) varray_type used_regs; static unsigned int *used_regs;
static GTY((deletable (""))) varray_type used_regs_old; static unsigned int n_used_regs;
/* We pass this to cselib_invalidate_mem to invalidate all of /* We pass this to cselib_invalidate_mem to invalidate all of
memory for a non-const call instruction. */ memory for a non-const call instruction. */
...@@ -206,12 +206,12 @@ clear_table (void) ...@@ -206,12 +206,12 @@ clear_table (void)
{ {
unsigned int i; unsigned int i;
for (i = 0; i < VARRAY_ACTIVE_SIZE (used_regs); i++) for (i = 0; i < n_used_regs; i++)
REG_VALUES (VARRAY_UINT (used_regs, i)) = 0; REG_VALUES (used_regs[i]) = 0;
max_value_regs = 0; max_value_regs = 0;
VARRAY_POP_ALL (used_regs); n_used_regs = 0;
htab_empty (hash_table); htab_empty (hash_table);
...@@ -913,7 +913,7 @@ cselib_lookup (rtx x, enum machine_mode mode, int create) ...@@ -913,7 +913,7 @@ cselib_lookup (rtx x, enum machine_mode mode, int create)
/* Maintain the invariant that the first entry of /* Maintain the invariant that the first entry of
REG_VALUES, if present, must be the value used to set the REG_VALUES, if present, must be the value used to set the
register, or NULL. */ register, or NULL. */
VARRAY_PUSH_UINT (used_regs, i); used_regs[n_used_regs++] = i;
REG_VALUES (i) = new_elt_list (REG_VALUES (i), NULL); REG_VALUES (i) = new_elt_list (REG_VALUES (i), NULL);
} }
REG_VALUES (i)->next = new_elt_list (REG_VALUES (i)->next, e); REG_VALUES (i)->next = new_elt_list (REG_VALUES (i)->next, e);
...@@ -1185,7 +1185,7 @@ cselib_record_set (rtx dest, cselib_val *src_elt, cselib_val *dest_addr_elt) ...@@ -1185,7 +1185,7 @@ cselib_record_set (rtx dest, cselib_val *src_elt, cselib_val *dest_addr_elt)
if (REG_VALUES (dreg) == 0) if (REG_VALUES (dreg) == 0)
{ {
VARRAY_PUSH_UINT (used_regs, dreg); used_regs[n_used_regs++] = dreg;
REG_VALUES (dreg) = new_elt_list (REG_VALUES (dreg), src_elt); REG_VALUES (dreg) = new_elt_list (REG_VALUES (dreg), src_elt);
} }
else else
...@@ -1371,22 +1371,6 @@ cselib_process_insn (rtx insn) ...@@ -1371,22 +1371,6 @@ cselib_process_insn (rtx insn)
remove_useless_values (); remove_useless_values ();
} }
/* Make sure our varrays are big enough. Not called from any cselib routines;
it must be called by the user if it allocated new registers. */
void
cselib_update_varray_sizes (void)
{
unsigned int nregs = max_reg_num ();
if (nregs == cselib_nregs)
return;
cselib_nregs = nregs;
VARRAY_GROW (reg_values, nregs);
VARRAY_GROW (used_regs, nregs);
}
/* Initialize cselib for one pass. The caller must also call /* Initialize cselib for one pass. The caller must also call
init_alias_analysis. */ init_alias_analysis. */
...@@ -1406,18 +1390,22 @@ cselib_init (void) ...@@ -1406,18 +1390,22 @@ cselib_init (void)
callmem = gen_rtx_MEM (BLKmode, const0_rtx); callmem = gen_rtx_MEM (BLKmode, const0_rtx);
cselib_nregs = max_reg_num (); cselib_nregs = max_reg_num ();
if (reg_values_old != NULL && VARRAY_SIZE (reg_values_old) >= cselib_nregs)
{ /* We preserve reg_values to allow expensive clearing of the whole thing.
reg_values = reg_values_old; Reallocate it however if it happens to be too large. */
used_regs = used_regs_old; if (!reg_values || reg_values_size < cselib_nregs
} || (reg_values_size > 10 && reg_values_size > cselib_nregs * 4))
else
{ {
VARRAY_ELT_LIST_INIT (reg_values, cselib_nregs, "reg_values"); if (reg_values)
VARRAY_UINT_INIT (used_regs, cselib_nregs, "used_regs"); free (reg_values);
/* Some space for newly emit instructions so we don't end up
reallocating in between passes. */
reg_values_size = cselib_nregs + (63 + cselib_nregs) / 16;
reg_values = xcalloc (reg_values_size, sizeof (reg_values));
} }
hash_table = htab_create_ggc (31, get_value_hash, entry_and_rtx_equal_p, used_regs = xmalloc (sizeof (*used_regs) * cselib_nregs);
NULL); n_used_regs = 0;
hash_table = htab_create (31, get_value_hash, entry_and_rtx_equal_p, NULL);
cselib_current_insn_in_libcall = false; cselib_current_insn_in_libcall = false;
} }
...@@ -1431,13 +1419,14 @@ cselib_finish (void) ...@@ -1431,13 +1419,14 @@ cselib_finish (void)
free_alloc_pool (cselib_val_pool); free_alloc_pool (cselib_val_pool);
free_alloc_pool (value_pool); free_alloc_pool (value_pool);
clear_table (); clear_table ();
reg_values_old = reg_values; htab_delete (hash_table);
reg_values = 0; reg_values = 0;
used_regs_old = used_regs;
used_regs = 0; used_regs = 0;
hash_table = 0; hash_table = 0;
n_useless_values = 0; n_useless_values = 0;
next_unknown_value = 0; next_unknown_value = 0;
free (used_regs);
used_regs = 0;
} }
#include "gt-cselib.h" #include "gt-cselib.h"
...@@ -64,7 +64,6 @@ struct elt_list GTY(()) ...@@ -64,7 +64,6 @@ struct elt_list GTY(())
}; };
extern cselib_val *cselib_lookup (rtx, enum machine_mode, int); extern cselib_val *cselib_lookup (rtx, enum machine_mode, int);
extern void cselib_update_varray_sizes (void);
extern void cselib_init (void); extern void cselib_init (void);
extern void cselib_finish (void); extern void cselib_finish (void);
extern void cselib_process_insn (rtx); extern void cselib_process_insn (rtx);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment