Calling redirect_edge_var_map_empty after each pass was slowing things down because hash_table::empty () cleared all slots even if the hash table was already empty.
Tested on x86_64-linux-gnu, where it gives a 1% compile time improvement for fold-const.ii at -O and -O2. OK to install? Thanks, Richard gcc/ * hash-table.h (hash_table::empty): Turn into an inline wrapper that checks whether the table is already empty. Rename the original implementation to... (hash_table::empty_slot): ...this new private function. diff --git a/gcc/hash-table.h b/gcc/hash-table.h index 2c52a4a..e925e1e 100644 --- a/gcc/hash-table.h +++ b/gcc/hash-table.h @@ -390,8 +390,8 @@ public: /* Return the current number of elements in this hash table. */ size_t elements_with_deleted () const { return m_n_elements; } - /* This function clears all entries in the given hash table. */ - void empty (); + /* This function clears all entries in this hash table. */ + void empty () { if (elements ()) empty_slow (); } /* This function clears a specified SLOT in a hash table. It is useful when you've already done the lookup and don't want to do it @@ -499,6 +499,8 @@ private: template<typename T> friend void gt_cleare_cache (hash_table<T> *); + void empty_slow (); + value_type *alloc_entries (size_t n CXX_MEM_STAT_INFO) const; value_type *find_empty_slot_for_expand (hashval_t); void expand (); @@ -755,9 +757,11 @@ hash_table<Descriptor, Allocator>::expand () ggc_free (oentries); } +/* Implements empty() in cases where it isn't a no-op. */ + template<typename Descriptor, template<typename Type> class Allocator> void -hash_table<Descriptor, Allocator>::empty () +hash_table<Descriptor, Allocator>::empty_slow () { size_t size = m_size; value_type *entries = m_entries;