#include "ggc.h"
#include "hash-table.h"
#include "dumpfile.h"
+#include "alloc-pool.h"
#include "cselib.h"
#include "predict.h"
#include "basic-block.h"
#include "bitmap.h"
/* A list of cselib_val structures. */
-struct elt_list {
- struct elt_list *next;
- cselib_val *elt;
+struct elt_list
+{
+ struct elt_list *next;
+ cselib_val *elt;
+
+ /* Pool allocation new operator. */
+ inline void *operator new (size_t)
+ {
+ return pool.allocate ();
+ }
+
+ /* Delete operator utilizing pool allocation. */
+ inline void operator delete (void *ptr)
+ {
+ pool.remove ((elt_list *) ptr);
+ }
+
+ /* Memory allocation pool. */
+ static pool_allocator<elt_list> pool;
};
static bool cselib_record_memory;
May or may not contain the useless values - the list is compacted
each time memory is invalidated. */
static cselib_val *first_containing_mem = &dummy_val;
-static alloc_pool elt_loc_list_pool, elt_list_pool, cselib_val_pool, value_pool;
+
+pool_allocator<elt_list> elt_list::pool ("elt_list", 10);
+pool_allocator<elt_loc_list> elt_loc_list::pool ("elt_loc_list", 10);
+pool_allocator<cselib_val> cselib_val::pool ("cselib_val_list", 10);
+
+static pool_allocator<rtx_def> value_pool ("value", 100, RTX_CODE_SIZE (VALUE),
+ true);
/* If nonnull, cselib will call this function before freeing useless
VALUEs. A VALUE is deemed useless if its "locs" field is null. */
static inline struct elt_list *
new_elt_list (struct elt_list *next, cselib_val *elt)
{
- struct elt_list *el;
- el = (struct elt_list *) pool_alloc (elt_list_pool);
+ elt_list *el = new elt_list ();
el->next = next;
el->elt = elt;
return el;
}
/* Chain LOC back to VAL. */
- el = (struct elt_loc_list *) pool_alloc (elt_loc_list_pool);
+ el = new elt_loc_list;
el->loc = val->val_rtx;
el->setting_insn = cselib_current_insn;
el->next = NULL;
CSELIB_VAL_PTR (loc)->locs = el;
}
- el = (struct elt_loc_list *) pool_alloc (elt_loc_list_pool);
+ el = new elt_loc_list;
el->loc = loc;
el->setting_insn = cselib_current_insn;
el->next = next;
struct elt_list *l = *pl;
*pl = l->next;
- pool_free (elt_list_pool, l);
+ delete l;
}
/* Likewise for elt_loc_lists. */
struct elt_loc_list *l = *pl;
*pl = l->next;
- pool_free (elt_loc_list_pool, l);
+ delete l;
}
/* Likewise for cselib_vals. This also frees the addr_list associated with
while (v->addr_list)
unchain_one_elt_list (&v->addr_list);
- pool_free (cselib_val_pool, v);
+ delete v;
}
/* Remove all entries from the hash table. Also used during
static inline cselib_val *
new_cselib_val (unsigned int hash, machine_mode mode, rtx x)
{
- cselib_val *e = (cselib_val *) pool_alloc (cselib_val_pool);
+ cselib_val *e = new cselib_val;
gcc_assert (hash);
gcc_assert (next_uid);
precisely when we can have VALUE RTXen (when cselib is active)
so we don't need to put them in garbage collected memory.
??? Why should a VALUE be an RTX in the first place? */
- e->val_rtx = (rtx) pool_alloc (value_pool);
+ e->val_rtx = value_pool.allocate ();
memset (e->val_rtx, 0, RTX_HDR_SIZE);
PUT_CODE (e->val_rtx, VALUE);
PUT_MODE (e->val_rtx, mode);
void
cselib_init (int record_what)
{
- elt_list_pool = create_alloc_pool ("elt_list",
- sizeof (struct elt_list), 10);
- elt_loc_list_pool = create_alloc_pool ("elt_loc_list",
- sizeof (struct elt_loc_list), 10);
- cselib_val_pool = create_alloc_pool ("cselib_val_list",
- sizeof (cselib_val), 10);
- value_pool = create_alloc_pool ("value", RTX_CODE_SIZE (VALUE), 100);
cselib_record_memory = record_what & CSELIB_RECORD_MEMORY;
cselib_preserve_constants = record_what & CSELIB_PRESERVE_CONSTANTS;
cselib_any_perm_equivs = false;
cselib_any_perm_equivs = false;
cfa_base_preserved_val = NULL;
cfa_base_preserved_regno = INVALID_REGNUM;
- free_alloc_pool (elt_list_pool);
- free_alloc_pool (elt_loc_list_pool);
- free_alloc_pool (cselib_val_pool);
- free_alloc_pool (value_pool);
+ elt_list::pool.release ();
+ elt_loc_list::pool.release ();
+ cselib_val::pool.release ();
+ value_pool.release ();
cselib_clear_table ();
delete cselib_hash_table;
cselib_hash_table = NULL;
#define GCC_CSELIB_H
/* Describe a value. */
-struct cselib_val {
+struct cselib_val
+{
/* The hash value. */
unsigned int hash;
struct elt_list *addr_list;
struct cselib_val *next_containing_mem;
+
+ /* Pool allocation new operator. */
+ inline void *operator new (size_t)
+ {
+ return pool.allocate ();
+ }
+
+ /* Delete operator utilizing pool allocation. */
+ inline void operator delete (void *ptr)
+ {
+ pool.remove ((cselib_val *) ptr);
+ }
+
+ /* Memory allocation pool. */
+ static pool_allocator<cselib_val> pool;
};
/* A list of rtl expressions that hold the same value. */
rtx loc;
/* The insn that made the equivalence. */
rtx_insn *setting_insn;
+
+ /* Pool allocation new operator. */
+ inline void *operator new (size_t)
+ {
+ return pool.allocate ();
+ }
+
+ /* Delete operator utilizing pool allocation. */
+ inline void operator delete (void *ptr)
+ {
+ pool.remove ((elt_loc_list *) ptr);
+ }
+
+ /* Memory allocation pool. */
+ static pool_allocator<elt_loc_list> pool;
};
/* Describe a single set that is part of an insn. */