public inbox for gcc-cvs@sourceware.org
help / color / mirror / Atom feed
* [gcc r14-8964] c++/modules: use optimized crc32 from zlib
@ 2024-02-13 19:27 Patrick Palka
  0 siblings, 0 replies; only message in thread
From: Patrick Palka @ 2024-02-13 19:27 UTC (permalink / raw)
  To: gcc-cvs

https://gcc.gnu.org/g:0eb9265fe737d901f484e4bcd73ffe386eb35693

commit r14-8964-g0eb9265fe737d901f484e4bcd73ffe386eb35693
Author: Patrick Palka <ppalka@redhat.com>
Date:   Tue Feb 13 14:26:48 2024 -0500

    c++/modules: use optimized crc32 from zlib
    
    The current implementation of bytes::calc_crc computes the checksum one
    byte at a time which turns out to be quite slow, accounting for 15% of
    streaming in time for a modular Hello World.  We have a crc32_unsigned
    version that processes 4 bytes at a time which we could use here, but
    since we bundle zlib we might as well use its highly optimized crc
    routines that can process up to 32 bytes at a time.
    
    So this patch makes us use zlib's crc32 in this hot code path.  This
    reduces stream in time for a modular Hello World by around 15% for me
    with a release compiler.
    
    gcc/cp/ChangeLog:
    
            * Make-lang.in (CFLAGS-cp/module.o): Add $(ZLIBINC).
            * module.cc: Include <zlib.h>.
            (bytes::calc_crc): Use crc32 from zlib.
            (bytes_out::set_crc): Use crc32_combine from zlib.
    
    Reviewed-by: Jason Merill <jason@redhat.com>

Diff:
---
 gcc/cp/Make-lang.in | 2 +-
 gcc/cp/module.cc    | 8 +++-----
 2 files changed, 4 insertions(+), 6 deletions(-)

diff --git a/gcc/cp/Make-lang.in b/gcc/cp/Make-lang.in
index 630db41d87e8..f153891a1ef6 100644
--- a/gcc/cp/Make-lang.in
+++ b/gcc/cp/Make-lang.in
@@ -55,7 +55,7 @@ c++.serial = cc1plus$(exeext)
 CFLAGS-cp/g++spec.o += $(DRIVER_DEFINES)
 
 CFLAGS-cp/module.o += -DHOST_MACHINE=\"$(host)\" \
-	-DTARGET_MACHINE=\"$(target)\"
+	-DTARGET_MACHINE=\"$(target)\" $(ZLIBINC)
 
 # In non-release builds, use a date-related module version.
 ifneq ($(DEVPHASE_c),)
diff --git a/gcc/cp/module.cc b/gcc/cp/module.cc
index 34fafe7c9788..0291d456ff5c 100644
--- a/gcc/cp/module.cc
+++ b/gcc/cp/module.cc
@@ -233,6 +233,7 @@ Classes used:
 /* This TU doesn't need or want to see the networking.  */
 #define CODY_NETWORKING 0
 #include "mapper-client.h"
+#include <zlib.h> // for crc32, crc32_combine
 
 #if 0 // 1 for testing no mmap
 #define MAPPED_READING 0
@@ -487,10 +488,7 @@ protected:
 unsigned
 bytes::calc_crc (unsigned l) const
 {
-  unsigned crc = 0;
-  for (size_t ix = 4; ix < l; ix++)
-    crc = crc32_byte (crc, buffer[ix]);
-  return crc;
+  return crc32 (0, (unsigned char *)buffer + 4, l - 4);
 }
 
 class elf_in;
@@ -717,7 +715,7 @@ bytes_out::set_crc (unsigned *crc_ptr)
       unsigned crc = calc_crc (pos);
       unsigned accum = *crc_ptr;
       /* Only mix the existing *CRC_PTR if it is non-zero.  */
-      accum = accum ? crc32_unsigned (accum, crc) : crc;
+      accum = accum ? crc32_combine (accum, crc, pos - 4) : crc;
       *crc_ptr = accum;
 
       /* Buffer will be sufficiently aligned.  */

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2024-02-13 19:27 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2024-02-13 19:27 [gcc r14-8964] c++/modules: use optimized crc32 from zlib Patrick Palka

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).