]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
Optimise hash_table::empty
authorRichard Sandiford <richard.sandiford@arm.com>
Sat, 16 Jan 2016 11:03:18 +0000 (11:03 +0000)
committerRichard Sandiford <rsandifo@gcc.gnu.org>
Sat, 16 Jan 2016 11:03:18 +0000 (11:03 +0000)
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.

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.

From-SVN: r232467

gcc/ChangeLog
gcc/hash-table.h

index cf0421880c0ff085200c04300797344d874a9d32..227acf96c273957f5a99fd8e56ab911f257be74c 100644 (file)
@@ -1,3 +1,10 @@
+2016-01-16  Richard Sandiford  <richard.sandiford@arm.com>
+
+       * 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.
+
 2016-01-15  David Malcolm  <dmalcolm@redhat.com>
 
        PR diagnostic/68899
index 2c52a4a653f560d06778eb1e8ae0c91bc491263e..e925e1e12d6e805faf9aff3e3445dc5e401731db 100644 (file)
@@ -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;