This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[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 ----


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]