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] Speedup streamer_read_uhwi


This speeds up streamer_read_uhwi (top in mozilla LTO profile) by
delaying the section overrun check and inlining streamer_read_uchar
manually, performing CSE and optimizing the 1-byte case.

LTO bootstrapped on x86_64-unknown-linux-gnu, applied.

Richard.

2013-06-20  Richard Biener  <rguenther@suse.de>

	* data-streamer-in.c (streamer_read_uhwi): Optimize single
	byte case, inline streamer_read_uchar and defer section
	overrun check.

Index: gcc/data-streamer-in.c
===================================================================
*** gcc/data-streamer-in.c	(revision 200189)
--- gcc/data-streamer-in.c	(working copy)
*************** bp_unpack_string (struct data_in *data_i
*** 120,137 ****
  unsigned HOST_WIDE_INT
  streamer_read_uhwi (struct lto_input_block *ib)
  {
!   unsigned HOST_WIDE_INT result = 0;
!   int shift = 0;
    unsigned HOST_WIDE_INT byte;
  
!   while (true)
      {
!       byte = streamer_read_uchar (ib);
!       result |= (byte & 0x7f) << shift;
!       shift += 7;
!       if ((byte & 0x80) == 0)
! 	return result;
      }
  }
  
  
--- 120,152 ----
  unsigned HOST_WIDE_INT
  streamer_read_uhwi (struct lto_input_block *ib)
  {
!   unsigned HOST_WIDE_INT result;
!   int shift;
    unsigned HOST_WIDE_INT byte;
+   unsigned int p = ib->p;
+   unsigned int len = ib->len;
  
!   const char *data = ib->data;
!   result = data[p++];
!   if ((result & 0x80) != 0)
      {
!       result &= 0x7f;
!       shift = 7;
!       do
! 	{
! 	  byte = data[p++];
! 	  result |= (byte & 0x7f) << shift;
! 	  shift += 7;
! 	}
!       while ((byte & 0x80) != 0);
      }
+ 
+   /* We check for section overrun after the fact for performance reason.  */
+   if (p > len)
+     lto_section_overrun (ib);
+ 
+   ib->p = p;
+   return result;
  }
  
  


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