summaryrefslogtreecommitdiff
path: root/gcc/lto-streamer.c
diff options
context:
space:
mode:
authorrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>2010-05-29 17:39:56 +0000
committerrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>2010-05-29 17:39:56 +0000
commit2cc621c5e912c53a678925c5ed6abfe4218bf95f (patch)
tree28374f45b0af34eb28452e521d147f31dd022001 /gcc/lto-streamer.c
parent16d6ea49020b60c7a978b4dd4bd5fe53a695e31d (diff)
downloadgcc-2cc621c5e912c53a678925c5ed6abfe4218bf95f.tar.gz
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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@160032 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/lto-streamer.c')
-rw-r--r--gcc/lto-streamer.c21
1 files changed, 19 insertions, 2 deletions
diff --git a/gcc/lto-streamer.c b/gcc/lto-streamer.c
index 561ecbc1a7e..a086d918004 100644
--- a/gcc/lto-streamer.c
+++ b/gcc/lto-streamer.c
@@ -266,12 +266,21 @@ print_lto_report (void)
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);
}
@@ -281,6 +290,14 @@ bitpack_create (void)
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);
}
@@ -324,7 +341,9 @@ bp_pack_value (struct bitpack_d *bp, bitpack_word_t val, unsigned nbits)
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);
@@ -334,7 +353,6 @@ bp_pack_value (struct bitpack_d *bp, bitpack_word_t val, unsigned nbits)
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);
}
@@ -343,7 +361,6 @@ bp_pack_value (struct bitpack_d *bp, bitpack_word_t val, unsigned nbits)
/* 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. */