> Hi,
>
> On Mon, 2 May 2011, Richard Guenther wrote:
>
> > >> --- 348,367 ----
> > >> bool insert_at_next_slot_p)
> > >> {
> > >> void **slot;
> > >> unsigned ix;
> > >> bool existed_p;
> > >>
> > >> gcc_assert (t);
> > >>
> > >> ! slot = pointer_map_insert (cache->node_map, t);
> > >> ! if (!*slot)
> > >
> > > ix might legitimately be zero. Hence this transformation is not
> > > equivalent. You might want to enter ix+1 into the cache with the
> > > appropriate adjustment at read-out. Same for the other places.
> >
> > Or not use index zero.
>
> I never like these sentinals.
>
> > Maybe better than also have to deal with ix + 1 wrapping ...
>
> We don't handle ix wrapping, why should we now suddenly care about ix+1
> wrapping?
Duh, I actually intended to implement the ix+1 wrapping, but got dragged into
discussions
about thunks ;)
I am testing the following patch. Seems sane?
Honza
Index: lto-streamer.c
===================================================================
*** lto-streamer.c (revision 173251)
--- lto-streamer.c (working copy)
*************** lto_streamer_cache_insert_1 (struct lto_
*** 348,373 ****
bool insert_at_next_slot_p)
{
void **slot;
- struct tree_int_map d_entry, *entry;
unsigned ix;
bool existed_p;
gcc_assert (t);
! d_entry.base.from = t;
! slot = htab_find_slot (cache->node_map, &d_entry, INSERT);
! if (*slot == NULL)
{
/* Determine the next slot to use in the cache. */
if (insert_at_next_slot_p)
ix = VEC_length (tree, cache->nodes);
else
ix = *ix_p;
!
! entry = (struct tree_int_map *)pool_alloc (cache->node_map_entries);
! entry->base.from = t;
! entry->to = ix;
! *slot = entry;
lto_streamer_cache_add_to_node_array (cache, ix, t);
--- 348,367 ----
bool insert_at_next_slot_p)
{
void **slot;
unsigned ix;
bool existed_p;
gcc_assert (t);
! slot = pointer_map_insert (cache->node_map, t);
! if (!*slot)
{
/* Determine the next slot to use in the cache. */
if (insert_at_next_slot_p)
ix = VEC_length (tree, cache->nodes);
else
ix = *ix_p;
! *slot = (void *)(size_t) (ix + 1);
lto_streamer_cache_add_to_node_array (cache, ix, t);
*************** lto_streamer_cache_insert_1 (struct lto_
*** 376,383 ****
}
else
{
! entry = (struct tree_int_map *) *slot;
! ix = entry->to;
if (!insert_at_next_slot_p && ix != *ix_p)
{
--- 370,376 ----
}
else
{
! ix = (size_t) *slot - 1;
if (!insert_at_next_slot_p && ix != *ix_p)
{
*************** lto_streamer_cache_lookup (struct lto_st
*** 442,455 ****
unsigned *ix_p)
{
void **slot;
- struct tree_int_map d_slot;
bool retval;
unsigned ix;
gcc_assert (t);
! d_slot.base.from = t;
! slot = htab_find_slot (cache->node_map, &d_slot, NO_INSERT);
if (slot == NULL)
{
retval = false;
--- 435,446 ----
unsigned *ix_p)
{
void **slot;
bool retval;
unsigned ix;
gcc_assert (t);
! slot = pointer_map_contains (cache->node_map, t);
if (slot == NULL)
{
retval = false;
*************** lto_streamer_cache_lookup (struct lto_st
*** 458,464 ****
else
{
retval = true;
! ix = ((struct tree_int_map *) *slot)->to;
}
if (ix_p)
--- 449,455 ----
else
{
retval = true;
! ix = (size_t) *slot - 1;
}
if (ix_p)
*************** lto_streamer_cache_create (void)
*** 608,618 ****
cache = XCNEW (struct lto_streamer_cache_d);
! cache->node_map = htab_create (101, tree_int_map_hash, tree_int_map_eq,
NULL);
!
! cache->node_map_entries = create_alloc_pool ("node map",
! sizeof (struct tree_int_map),
! 100);
/* Load all the well-known tree nodes that are always created by
the compiler on startup. This prevents writing them out
--- 599,605 ----
cache = XCNEW (struct lto_streamer_cache_d);
! cache->node_map = pointer_map_create ();
/* Load all the well-known tree nodes that are always created by
the compiler on startup. This prevents writing them out
*************** lto_streamer_cache_delete (struct lto_st
*** 636,643 ****
if (c == NULL)
return;
! htab_delete (c->node_map);
! free_alloc_pool (c->node_map_entries);
VEC_free (tree, heap, c->nodes);
free (c);
}
--- 623,629 ----
if (c == NULL)
return;
! pointer_map_destroy (c->node_map);
VEC_free (tree, heap, c->nodes);
free (c);
}
Index: lto-streamer.h
===================================================================
*** lto-streamer.h (revision 173251)
--- lto-streamer.h (working copy)
*************** typedef void (lto_free_section_data_f) (
*** 346,355 ****
struct lto_streamer_cache_d
{
/* The mapping between tree nodes and slots into the nodes array. */
! htab_t node_map;
!
! /* Node map to store entries into. */
! alloc_pool node_map_entries;
/* The nodes pickled so far. */
VEC(tree,heap) *nodes;
--- 346,352 ----
struct lto_streamer_cache_d
{
/* The mapping between tree nodes and slots into the nodes array. */
! struct pointer_map_t *node_map;
/* The nodes pickled so far. */
VEC(tree,heap) *nodes;