PATCH: speed up pch file loading

Matt Austern austern@apple.com
Thu Apr 3 21:06:00 GMT 2003


This patch speeds up loading a pch file by moving the loop that clears 
macros from the hash table from just after the pch file is loaded, to 
just before the pch file is saved.  Surprising as it may sound, 
resetting the hash table was one of the most expensive parts of loading 
a pch file.  (Largely because it required that we page in things that 
we had no good reason to touch ever again.)  On Apple's usual test 
case, this cut total build time by about 5%.

Testing: I've verified that it doesn't break the bootstrap on Linux, 
and that it introduces no new test suite failures.

Geoff has already approved this, and I've already committed it to 
mainline.

			--Matt



Index: gcc/ChangeLog
===================================================================
RCS file: /cvs/gcc/gcc/gcc/ChangeLog,v
retrieving revision 1.17317
diff -u -r1.17317 ChangeLog
--- gcc/ChangeLog	3 Apr 2003 20:28:38 -0000	1.17317
+++ gcc/ChangeLog	3 Apr 2003 20:59:22 -0000
@@ -1,3 +1,18 @@
+2003-04-03  Matt Austern  <austern@apple.com>
+
+	* cpppch.c (reset_ht): Remove.
+	(cpp_read_state): Remove loop to reset hashtable identifiers.
+	* ggc-common.c (gt_pch_save): Add call to gt_pch_fixup_stringpool
+	after pch file is written.
+	* ggc.h (gt_pch_fixup_stringpool): Declare.
+	* stringpool.c (ht_copy_and_clear): Define.  Callback.  Copy
+	hashnode's value to another hashtable, then clear the original.
+	(saved_ident_hash): Define.
+	(gt_pch_save_stringpool): Create saved_ident_hash, use it to
+	store definitions in ident_hash, and clear ident_hash.
+	(gt_pch_fixup_stringpool): Define.  Restore definitions from
+	saved_ident_hash to ident_hash, then destroy saved_ident_hash.
+
  Thu Apr  3 22:27:40 CEST 2003  Jan Hubicka  <jh@suse.cz>

  	* cfgrtl.c (update_bb_for_insn): Do not set block for barriers.
Index: gcc/cpppch.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/cpppch.c,v
retrieving revision 1.4
diff -u -r1.4 cpppch.c
--- gcc/cpppch.c	31 Mar 2003 20:02:40 -0000	1.4
+++ gcc/cpppch.c	3 Apr 2003 20:59:22 -0000
@@ -34,7 +34,6 @@
  static int collect_ht_nodes PARAMS ((cpp_reader *, cpp_hashnode *, 
void *));
  static int write_defs PARAMS ((cpp_reader *, cpp_hashnode *, void *));
  static int save_macros PARAMS ((cpp_reader *, cpp_hashnode *, void *));
-static int reset_ht PARAMS ((cpp_reader *, cpp_hashnode *, void *));

  /* This structure represents a macro definition on disk.  */
  struct macrodef_struct
@@ -628,23 +627,6 @@
    *data = d;
  }

-/* Erase all the existing macros and assertions.  */
-
-static int
-reset_ht (r, h, unused)
-     cpp_reader *r ATTRIBUTE_UNUSED;
-     cpp_hashnode *h;
-     void *unused ATTRIBUTE_UNUSED;
-{
-  if (h->type != NT_VOID
-      && (h->flags & NODE_BUILTIN) == 0)
-    {
-      h->type = NT_VOID;
-      memset (&h->value, 0, sizeof (h->value));
-    }
-  return 1;
-}
-
  /* Given a precompiled header that was previously determined to be 
valid,
     apply all its definitions (and undefinitions) to the current state.
     DEPNAME is passed to deps_restore.  */
@@ -663,11 +645,6 @@
    struct save_macro_item *d;
    size_t i, mac_count;
    int saved_line = r->line;
-
-  /* Erase all the existing hashtable entries for macros.  At this
-     point, they're all from the PCH file, and their pointers won't be
-     valid.  */
-  cpp_forall_identifiers (r, reset_ht, NULL);

    /* Restore spec_nodes, which will be full of references to the old
       hashtable entries and so will now be invalid.  */
Index: gcc/ggc-common.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/ggc-common.c,v
retrieving revision 1.66
diff -u -r1.66 ggc-common.c
--- gcc/ggc-common.c	17 Mar 2003 17:59:57 -0000	1.66
+++ gcc/ggc-common.c	3 Apr 2003 20:59:22 -0000
@@ -543,6 +543,7 @@
  	memcpy (state.ptrs[i]->obj, this_object, state.ptrs[i]->size);
      }
    ggc_pch_finish (state.d, state.f);
+  gt_pch_fixup_stringpool ();

    free (state.ptrs);
    htab_delete (saving_htab);
Index: gcc/ggc.h
===================================================================
RCS file: /cvs/gcc/gcc/gcc/ggc.h,v
retrieving revision 1.49
diff -u -r1.49 ggc.h
--- gcc/ggc.h	22 Feb 2003 03:08:46 -0000	1.49
+++ gcc/ggc.h	3 Apr 2003 20:59:22 -0000
@@ -124,6 +124,7 @@
  /* Save and restore the string pool entries for PCH.  */

  extern void gt_pch_save_stringpool	PARAMS ((void));
+extern void gt_pch_fixup_stringpool     PARAMS ((void));
  extern void gt_pch_restore_stringpool	PARAMS ((void));

  /* PCH and GGC handling for strings, mostly trivial.  */
Index: gcc/stringpool.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/stringpool.c,v
retrieving revision 1.18
diff -u -r1.18 stringpool.c
--- gcc/stringpool.c	10 Jan 2003 02:22:04 -0000	1.18
+++ gcc/stringpool.c	3 Apr 2003 20:59:22 -0000
@@ -34,6 +34,7 @@
  #include "ggc.h"
  #include "tree.h"
  #include "hashtable.h"
+#include "cpplib.h"

  /* The "" allocated string.  */
  const char empty_string[] = "";
@@ -50,6 +51,7 @@

  static hashnode alloc_node PARAMS ((hash_table *));
  static int mark_ident PARAMS ((struct cpp_reader *, hashnode, const 
PTR));
+static int ht_copy_and_clear PARAMS ((struct cpp_reader *, hashnode, 
const void *));

  /* Initialize the string pool.  */
  void
@@ -214,6 +216,33 @@

  static GTY(()) struct string_pool_data * spd;

+static int
+ht_copy_and_clear (r, hp, ht2_p)
+     cpp_reader *r ATTRIBUTE_UNUSED;
+     hashnode hp;
+     const void *ht2_p;
+{
+  cpp_hashnode *h = CPP_HASHNODE (hp);
+  struct ht *ht2 = (struct ht *) ht2_p;
+
+  if (h->type != NT_VOID
+      && (h->flags & NODE_BUILTIN) == 0)
+    {
+      cpp_hashnode *h2 = CPP_HASHNODE (ht_lookup (ht2,
+						  NODE_NAME (h),
+						  NODE_LEN (h),
+						  HT_ALLOC));
+      h2->type = h->type;
+      memcpy (&h2->value, &h->value, sizeof (h->value));
+
+      h->type = NT_VOID;
+      memset (&h->value, 0, sizeof (h->value));
+    }
+  return 1;
+}
+
+static struct ht *saved_ident_hash;
+
  void
  gt_pch_save_stringpool ()
  {
@@ -228,6 +257,18 @@
        spd->entries[i] = HT_IDENT_TO_GCC_IDENT (ident_hash->entries[i]);
      else
        spd->entries[i] = NULL;
+
+  saved_ident_hash = ht_create (14);
+  saved_ident_hash->alloc_node = alloc_node;
+  ht_forall (ident_hash, ht_copy_and_clear, saved_ident_hash);
+}
+
+void
+gt_pch_fixup_stringpool ()
+{
+  ht_forall (saved_ident_hash, ht_copy_and_clear, ident_hash);
+  ht_destroy (saved_ident_hash);
+  saved_ident_hash = 0;
  }

  void



More information about the Gcc-patches mailing list