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: speed up pch file loading


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 at apple dot 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 at suse dot 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


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