This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[PATCH] Avoid re-allocating bitpacks
- From: Richard Guenther <rguenther at suse dot de>
- To: gcc-patches at gcc dot gnu dot org
- Date: Sat, 29 May 2010 19:35:21 +0200 (CEST)
- Subject: [PATCH] Avoid re-allocating bitpacks
This avoids re-allocating bitpacks all the time by caching a single
one.
Bootstrapped and tested on x86_64-unknown-linux-gnu, applied to trunk.
Richard.
2010-05-29 Richard Guenther <rguenther@suse.de>
* lto-streamer.c (cached_bp): New global variable.
(bitpack_create): Return the cached bitpack, if available.
(bitpack_delete): Clear and cache the bitpack, if appropriate.
(bp_pack_value): Remove redundant asserts.
Index: gcc/lto-streamer.c
===================================================================
*** gcc/lto-streamer.c (revision 159992)
--- gcc/lto-streamer.c (working copy)
*************** print_lto_report (void)
*** 266,277 ****
--- 266,286 ----
lto_section_name[i], lto_stats.section_size[i]);
}
+ /* We cache a single bitpack assuming that usually at most one is
+ life. This saves repeated re-allocations. */
+ static struct bitpack_d *cached_bp;
/* Create a new bitpack. */
struct bitpack_d *
bitpack_create (void)
{
+ if (cached_bp)
+ {
+ struct bitpack_d *bp = cached_bp;
+ cached_bp = NULL;
+ return bp;
+ }
return XCNEW (struct bitpack_d);
}
*************** bitpack_create (void)
*** 281,286 ****
--- 290,303 ----
void
bitpack_delete (struct bitpack_d *bp)
{
+ if (!cached_bp)
+ {
+ bp->num_bits = 0;
+ bp->first_unused_bit = 0;
+ VEC_truncate (bitpack_word_t, bp->values, 0);
+ cached_bp = bp;
+ return;
+ }
VEC_free (bitpack_word_t, heap, bp->values);
free (bp);
}
*************** bp_pack_value (struct bitpack_d *bp, bit
*** 324,330 ****
--- 341,349 ----
bitpack_word_t word;
/* We cannot encode more bits than BITS_PER_BITPACK_WORD. */
+ #ifdef ENABLE_CHECKING
gcc_assert (nbits > 0 && nbits <= BITS_PER_BITPACK_WORD);
+ #endif
/* Compute which word will contain the next NBITS. */
ix = bp_get_next_word (bp, nbits);
*************** bp_pack_value (struct bitpack_d *bp, bit
*** 334,340 ****
array, add a new word. Additionally, we should only
need to add a single word, since every pack operation cannot
use more bits than fit in a single word. */
- gcc_assert (ix < VEC_length (bitpack_word_t, bp->values) + 1);
VEC_safe_push (bitpack_word_t, heap, bp->values, 0);
}
--- 353,358 ----
*************** bp_pack_value (struct bitpack_d *bp, bit
*** 343,349 ****
/* To fit VAL in WORD, we need to shift VAL to the left to
skip the bottom BP->FIRST_UNUSED_BIT bits. */
- gcc_assert (BITS_PER_BITPACK_WORD >= bp->first_unused_bit + nbits);
val <<= bp->first_unused_bit;
/* Update WORD with VAL. */
--- 361,366 ----