Commit 516fd7ce by Jan Hubicka Committed by Jan Hubicka

Add pool_allocator for fibonaci heaps.

	* fibonacci_heap.h (fibonacci_heap<K,V>::fibonacci_heap):
	Add allocator parameter.
	(fibonacci_heap<K,V>::~fibonacci_heap): Optimize destruction.
	(fibonacci_heap<K,V>::m_allocator): New.
	(fibonacci_heap<K,V>::m_own_allocator): New.
	(fibonacci_heap<K,V>::insert): Use allocator.
	(fibonacci_heap<K,V>::extract_min): Likewise.
	(fibonacci_heap<K,V>::union_with): Assert that both heaps share
	allocator.
	(fibonacci_heap<K,V>::consolidate): Allocate constant sized vector
	on stack.
	* fibonacci_heap.c: Include alloc-pool
	(test_empty_heap): Initialize allocator.
	(test_union): Likewise.
	* bb-reorder.c: Include alloc-pool.h.
	* tracer.c: Inlclude alloc-pool.h.

From-SVN: r278501
parent f6fbdc38
2019-11-20 Jan Hubicka <jh@suse.cz> 2019-11-20 Jan Hubicka <jh@suse.cz>
* fibonacci_heap.h (fibonacci_heap<K,V>::fibonacci_heap):
Add allocator parameter.
(fibonacci_heap<K,V>::~fibonacci_heap): Optimize destruction.
(fibonacci_heap<K,V>::m_allocator): New.
(fibonacci_heap<K,V>::m_own_allocator): New.
(fibonacci_heap<K,V>::insert): Use allocator.
(fibonacci_heap<K,V>::extract_min): Likewise.
(fibonacci_heap<K,V>::union_with): Assert that both heaps share
allocator.
(fibonacci_heap<K,V>::consolidate): Allocate constant sized vector
on stack.
* fibonacci_heap.c: Include alloc-pool
(test_empty_heap): Initialize allocator.
(test_union): Likewise.
* bb-reorder.c: Include alloc-pool.h.
* tracer.c: Inlclude alloc-pool.h.
2019-11-20 Jan Hubicka <jh@suse.cz>
* lto-streamer-out.c (DFS::sccstack): Turn into auto-vec. * lto-streamer-out.c (DFS::sccstack): Turn into auto-vec.
Preallocate for 32 entries. Preallocate for 32 entries.
(DFS::worklist): Likewise. (DFS::worklist): Likewise.
...@@ -112,6 +112,7 @@ ...@@ -112,6 +112,7 @@
#include "cfgcleanup.h" #include "cfgcleanup.h"
#include "bb-reorder.h" #include "bb-reorder.h"
#include "except.h" #include "except.h"
#include "alloc-pool.h"
#include "fibonacci_heap.h" #include "fibonacci_heap.h"
#include "stringpool.h" #include "stringpool.h"
#include "attribs.h" #include "attribs.h"
......
...@@ -21,6 +21,7 @@ along with GCC; see the file COPYING3. If not see ...@@ -21,6 +21,7 @@ along with GCC; see the file COPYING3. If not see
#include "config.h" #include "config.h"
#include "system.h" #include "system.h"
#include "coretypes.h" #include "coretypes.h"
#include "alloc-pool.h"
#include "fibonacci_heap.h" #include "fibonacci_heap.h"
#include "selftest.h" #include "selftest.h"
...@@ -38,13 +39,14 @@ typedef fibonacci_heap <int, int> int_heap_t; ...@@ -38,13 +39,14 @@ typedef fibonacci_heap <int, int> int_heap_t;
static void static void
test_empty_heap () test_empty_heap ()
{ {
int_heap_t *h1 = new int_heap_t (INT_MIN); pool_allocator allocator ("fibheap test", sizeof (int_heap_node_t));
int_heap_t *h1 = new int_heap_t (INT_MIN, &allocator);
ASSERT_TRUE (h1->empty ()); ASSERT_TRUE (h1->empty ());
ASSERT_EQ (0, h1->nodes ()); ASSERT_EQ (0, h1->nodes ());
ASSERT_EQ (NULL, h1->min ()); ASSERT_EQ (NULL, h1->min ());
int_heap_t *h2 = new int_heap_t (INT_MIN); int_heap_t *h2 = new int_heap_t (INT_MIN, &allocator);
int_heap_t *r = h1->union_with (h2); int_heap_t *r = h1->union_with (h2);
ASSERT_TRUE (r->empty ()); ASSERT_TRUE (r->empty ());
...@@ -169,12 +171,13 @@ static void ...@@ -169,12 +171,13 @@ static void
test_union () test_union ()
{ {
int value = 777; int value = 777;
pool_allocator allocator ("fibheap test", sizeof (int_heap_node_t));
int_heap_t *heap1 = new int_heap_t (INT_MIN); int_heap_t *heap1 = new int_heap_t (INT_MIN, &allocator);
for (unsigned i = 0; i < 2 * TEST_HEAP_N; i++) for (unsigned i = 0; i < 2 * TEST_HEAP_N; i++)
heap1->insert (i, &value); heap1->insert (i, &value);
int_heap_t *heap2 = new int_heap_t (INT_MIN); int_heap_t *heap2 = new int_heap_t (INT_MIN, &allocator);
for (unsigned i = 2 * TEST_HEAP_N; i < 3 * TEST_HEAP_N; i++) for (unsigned i = 2 * TEST_HEAP_N; i < 3 * TEST_HEAP_N; i++)
heap2->insert (i, &value); heap2->insert (i, &value);
...@@ -196,12 +199,13 @@ static void ...@@ -196,12 +199,13 @@ static void
test_union_of_equal_heaps () test_union_of_equal_heaps ()
{ {
int value = 777; int value = 777;
pool_allocator allocator ("fibheap test", sizeof (int_heap_node_t));
int_heap_t *heap1 = new int_heap_t (INT_MIN); int_heap_t *heap1 = new int_heap_t (INT_MIN, &allocator);
for (unsigned i = 0; i < TEST_HEAP_N; i++) for (unsigned i = 0; i < TEST_HEAP_N; i++)
heap1->insert (i, &value); heap1->insert (i, &value);
int_heap_t *heap2 = new int_heap_t (INT_MIN); int_heap_t *heap2 = new int_heap_t (INT_MIN, &allocator);
for (unsigned i = 0; i < TEST_HEAP_N; i++) for (unsigned i = 0; i < TEST_HEAP_N; i++)
heap2->insert (i, &value); heap2->insert (i, &value);
......
...@@ -145,17 +145,36 @@ class fibonacci_heap ...@@ -145,17 +145,36 @@ class fibonacci_heap
friend class fibonacci_node<K,V>; friend class fibonacci_node<K,V>;
public: public:
/* Default constructor. */ /* Default constructor. ALLOCATOR is optional and is primarily useful
fibonacci_heap (K global_min_key): m_nodes (0), m_min (NULL), m_root (NULL), when heaps are going to be merged (in that case they need to be allocated
m_global_min_key (global_min_key) in same alloc pool). */
fibonacci_heap (K global_min_key, pool_allocator *allocator = NULL):
m_nodes (0), m_min (NULL), m_root (NULL),
m_global_min_key (global_min_key),
m_allocator (allocator), m_own_allocator (false)
{ {
if (!m_allocator)
{
m_allocator = new pool_allocator ("Fibonacci heap",
sizeof (fibonacci_node_t));
m_own_allocator = true;
}
} }
/* Destructor. */ /* Destructor. */
~fibonacci_heap () ~fibonacci_heap ()
{ {
while (m_min != NULL) /* Actual memory will be released by the destructor of m_allocator. */
delete (extract_minimum_node ()); if (need_finalization_p<fibonacci_node_t> () || !m_own_allocator)
while (m_min != NULL)
{
fibonacci_node_t *n = extract_minimum_node ();
n->~fibonacci_node_t ();
if (!m_own_allocator)
m_allocator->remove (n);
}
if (m_own_allocator)
delete m_allocator;
} }
/* Insert new node given by KEY and DATA associated with the key. */ /* Insert new node given by KEY and DATA associated with the key. */
...@@ -259,6 +278,11 @@ private: ...@@ -259,6 +278,11 @@ private:
fibonacci_node_t *m_root; fibonacci_node_t *m_root;
/* Global minimum given in the heap construction. */ /* Global minimum given in the heap construction. */
K m_global_min_key; K m_global_min_key;
/* Allocator used to hold nodes. */
pool_allocator *m_allocator;
/* True if alocator is owned by the current heap only. */
bool m_own_allocator;
}; };
/* Remove fibonacci heap node. */ /* Remove fibonacci heap node. */
...@@ -333,7 +357,8 @@ fibonacci_node<K,V>* ...@@ -333,7 +357,8 @@ fibonacci_node<K,V>*
fibonacci_heap<K,V>::insert (K key, V *data) fibonacci_heap<K,V>::insert (K key, V *data)
{ {
/* Create the new node. */ /* Create the new node. */
fibonacci_node<K,V> *node = new fibonacci_node_t (key, data); fibonacci_node<K,V> *node = new (m_allocator->allocate ())
fibonacci_node_t (key, data);
return insert_node (node); return insert_node (node);
} }
...@@ -438,7 +463,10 @@ fibonacci_heap<K,V>::extract_min (bool release) ...@@ -438,7 +463,10 @@ fibonacci_heap<K,V>::extract_min (bool release)
ret = z->m_data; ret = z->m_data;
if (release) if (release)
delete (z); {
z->~fibonacci_node_t ();
m_allocator->remove (z);
}
} }
return ret; return ret;
...@@ -474,6 +502,9 @@ fibonacci_heap<K,V>::union_with (fibonacci_heap<K,V> *heapb) ...@@ -474,6 +502,9 @@ fibonacci_heap<K,V>::union_with (fibonacci_heap<K,V> *heapb)
fibonacci_node<K,V> *a_root, *b_root; fibonacci_node<K,V> *a_root, *b_root;
/* Both heaps must share allocator. */
gcc_checking_assert (m_allocator == heapb->m_allocator);
/* If one of the heaps is empty, the union is just the other heap. */ /* If one of the heaps is empty, the union is just the other heap. */
if ((a_root = heapa->m_root) == NULL) if ((a_root = heapa->m_root) == NULL)
{ {
...@@ -616,12 +647,13 @@ fibonacci_heap<K,V>::remove_root (fibonacci_node<K,V> *node) ...@@ -616,12 +647,13 @@ fibonacci_heap<K,V>::remove_root (fibonacci_node<K,V> *node)
template<class K, class V> template<class K, class V>
void fibonacci_heap<K,V>::consolidate () void fibonacci_heap<K,V>::consolidate ()
{ {
int D = 1 + 8 * sizeof (long); const int D = 1 + 8 * sizeof (long);
auto_vec<fibonacci_node<K,V> *> a (D); auto_vec<fibonacci_node<K,V> *, D> a;
a.safe_grow_cleared (D);
fibonacci_node<K,V> *w, *x, *y; fibonacci_node<K,V> *w, *x, *y;
int i, d; int i, d;
a.quick_grow_cleared (D);
while ((w = m_root) != NULL) while ((w = m_root) != NULL)
{ {
x = w; x = w;
......
...@@ -49,6 +49,7 @@ ...@@ -49,6 +49,7 @@
#include "tree-ssa.h" #include "tree-ssa.h"
#include "tree-inline.h" #include "tree-inline.h"
#include "cfgloop.h" #include "cfgloop.h"
#include "alloc-pool.h"
#include "fibonacci_heap.h" #include "fibonacci_heap.h"
#include "tracer.h" #include "tracer.h"
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment