Hi. There's a patch candidate for the issue that moves the hash to sem_item. Doing that you'll have control over it when you'll use sem_{item,variable,function} classes.
Is it fine? Martin
>From 95f2d9d940554ba40d5889df5b2c0e3d3f558388 Mon Sep 17 00:00:00 2001 From: marxin <mli...@suse.cz> Date: Wed, 29 Aug 2018 15:49:33 +0200 Subject: [PATCH] IPA ICF: make type cache a static field sem_item. gcc/ChangeLog: 2018-08-29 Martin Liska <mli...@suse.cz> * ipa-icf.c (sem_item::add_type): Use sem_item::m_type_hash_cache. * ipa-icf.h: Move the cache from sem_item_optimizer to sem_item. --- gcc/ipa-icf.c | 6 ++++-- gcc/ipa-icf.h | 6 +++--- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/gcc/ipa-icf.c b/gcc/ipa-icf.c index 39b96ba13be..8a6a7a3f32f 100644 --- a/gcc/ipa-icf.c +++ b/gcc/ipa-icf.c @@ -227,6 +227,8 @@ void sem_item::set_hash (hashval_t hash) m_hash_set = true; } +hash_map<const_tree, hashval_t> sem_item::m_type_hash_cache; + /* Semantic function constructor that uses STACK as bitmap memory stack. */ sem_function::sem_function (bitmap_obstack *stack) @@ -1587,7 +1589,7 @@ sem_item::add_type (const_tree type, inchash::hash &hstate) return; } - hashval_t *val = optimizer->m_type_hash_cache.get (type); + hashval_t *val = m_type_hash_cache.get (type); if (!val) { @@ -1607,7 +1609,7 @@ sem_item::add_type (const_tree type, inchash::hash &hstate) hstate2.add_int (nf); hash = hstate2.end (); hstate.add_hwi (hash); - optimizer->m_type_hash_cache.put (type, hash); + m_type_hash_cache.put (type, hash); } else hstate.add_hwi (*val); diff --git a/gcc/ipa-icf.h b/gcc/ipa-icf.h index 622aebc00c0..a64b3852efb 100644 --- a/gcc/ipa-icf.h +++ b/gcc/ipa-icf.h @@ -281,6 +281,9 @@ private: /* Initialize internal data structures. Bitmap STACK is used for bitmap memory allocation process. */ void setup (bitmap_obstack *stack); + + /* Because types can be arbitrarily large, avoid quadratic bottleneck. */ + static hash_map<const_tree, hashval_t> m_type_hash_cache; }; // class sem_item class sem_function: public sem_item @@ -524,9 +527,6 @@ public: /* Gets a congruence class group based on given HASH value and TYPE. */ congruence_class_group *get_group_by_hash (hashval_t hash, sem_item_type type); - - /* Because types can be arbitrarily large, avoid quadratic bottleneck. */ - hash_map<const_tree, hashval_t> m_type_hash_cache; private: /* For each semantic item, append hash values of references. */ -- 2.18.0