Hi. As noticed here: https://gcc.gnu.org/ml/gcc/2018-08/msg00004.html
There's ugly usage of a static variable in sem_item_optimizer that's called from sem_item. I believe logically the hash should live in sem_item. Patch can bootstrap on x86_64-linux-gnu and survives regression tests. Ready to be installed? Martin 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. */