From: Andi Kleen <a...@linux.intel.com>

WPA can spend a lot of time just resizing the type merging hash tables.
This adds experimental --params to size them large initially. On my large
LTO build I get a 1.1% improvement in build time from presizing the hash
tables to a large enough value.

Later on I think it's better to either always use large hash tables
(virtual memory is cheap) or to dynamically size them based on a
estimate of the available types. But as a first step having
these --params is useful to play around with it.

gcc/:

2013-04-19  Andi Kleen  <a...@linux.intel.com>

        * gimple.c (gimple_canonical_type_hash): Use param to size hash table.
        (gimple_register_canonical_type): dito.
        * lto/lto.c (read_cgraph_and_symbols): dito.
        * params.def (PARAM_TYPE_CACHE_HASH_SIZE, 
PARAM_CANONICAL_TYPE_HASH_SIZE,
        PARAM_CANONICAL_TYPE_CACHE_HASH_SIZE, PARAM_GIMPLE_TYPE_HASH_SIZE): Add.
---
 gcc/gimple.c   |  9 ++++++---
 gcc/lto/lto.c  |  7 +++++--
 gcc/params.def | 20 ++++++++++++++++++++
 3 files changed, 31 insertions(+), 5 deletions(-)

diff --git a/gcc/gimple.c b/gcc/gimple.c
index 64f7b1a..2777816 100644
--- a/gcc/gimple.c
+++ b/gcc/gimple.c
@@ -36,6 +36,7 @@ along with GCC; see the file COPYING3.  If not see
 #include "alias.h"
 #include "demangle.h"
 #include "langhooks.h"
+#include "params.h"
 
 /* Global canonical type table.  */
 static GTY((if_marked ("ggc_marked_p"), param_is (union tree_node)))
@@ -3173,8 +3174,9 @@ static hashval_t
 gimple_canonical_type_hash (const void *p)
 {
   if (canonical_type_hash_cache == NULL)
-    canonical_type_hash_cache = htab_create_ggc (512, tree_int_map_hash,
-                                                tree_int_map_eq, NULL);
+      canonical_type_hash_cache = htab_create_ggc (PARAM_VALUE 
(PARAM_CANONICAL_TYPE_CACHE_HASH_SIZE),
+                                                  tree_int_map_hash,
+                                                  tree_int_map_eq, NULL);
 
   return iterative_hash_canonical_type (CONST_CAST_TREE ((const_tree) p), 0);
 }
@@ -3429,7 +3431,8 @@ gimple_register_canonical_type (tree t)
     return TYPE_CANONICAL (t);
 
   if (gimple_canonical_types == NULL)
-    gimple_canonical_types = htab_create_ggc (16381, 
gimple_canonical_type_hash,
+    gimple_canonical_types = htab_create_ggc (PARAM_VALUE 
(PARAM_CANONICAL_TYPE_HASH_SIZE),
+                                             gimple_canonical_type_hash,
                                              gimple_canonical_type_eq, 0);
 
   slot = htab_find_slot (gimple_canonical_types, t, INSERT);
diff --git a/gcc/lto/lto.c b/gcc/lto/lto.c
index d757be0..4aaf2dc 100644
--- a/gcc/lto/lto.c
+++ b/gcc/lto/lto.c
@@ -38,6 +38,7 @@ along with GCC; see the file COPYING3.  If not see
 #include "ipa-prop.h"
 #include "common.h"
 #include "debug.h"
+#include "params.h"
 #include "gimple.h"
 #include "lto.h"
 #include "lto-tree.h"
@@ -2947,12 +2948,14 @@ read_cgraph_and_symbols (unsigned nfiles, const char 
**fnames)
 
   tree_with_vars = htab_create_ggc (101, htab_hash_pointer, htab_eq_pointer,
                                    NULL);
-  type_hash_cache = htab_create_ggc (512, tree_int_map_hash,
+  type_hash_cache = htab_create_ggc (PARAM_VALUE (PARAM_TYPE_CACHE_HASH_SIZE),
+                                    tree_int_map_hash,
                                     tree_int_map_eq, NULL);
   type_pair_cache = XCNEWVEC (struct type_pair_d, GIMPLE_TYPE_PAIR_SIZE);
   gimple_type_leader = ggc_alloc_cleared_vec_gimple_type_leader_entry_s
                        (GIMPLE_TYPE_LEADER_SIZE);
-  gimple_types = htab_create_ggc (16381, gimple_type_hash, gimple_type_eq, 0);
+  gimple_types = htab_create_ggc (PARAM_VALUE (PARAM_GIMPLE_TYPE_HASH_SIZE),
+                                 gimple_type_hash, gimple_type_eq, 0);
 
   if (!quiet_flag)
     fprintf (stderr, "Reading object files:");
diff --git a/gcc/params.def b/gcc/params.def
index 3c52651..46843df 100644
--- a/gcc/params.def
+++ b/gcc/params.def
@@ -1020,6 +1020,26 @@ DEFPARAM (PARAM_MAX_SLSR_CANDIDATE_SCAN,
          "strength reduction",
          50, 1, 999999)
 
+DEFPARAM (PARAM_TYPE_CACHE_HASH_SIZE,
+       "type-cache-hash-size",
+       "Initial size of the gimple type cache hash table",
+       512, 512, 0)
+
+DEFPARAM (PARAM_CANONICAL_TYPE_HASH_SIZE,
+       "canonical-type-hash-size",
+       "Initial size of the gimple canonical type hash table",
+       16381, 16381, 0)
+
+DEFPARAM (PARAM_CANONICAL_TYPE_CACHE_HASH_SIZE,
+       "canonical-type-cache-hash-size",
+       "Initial size of the gimple canonical type cache hash table",
+       512, 512, 0)
+
+DEFPARAM (PARAM_GIMPLE_TYPE_HASH_SIZE,
+       "type-hash-size",
+       "Initial size of the gimple type hash table",
+       16381, 16381, 0)
+
 /*
 Local variables:
 mode:c
-- 
1.8.1.4

Reply via email to