tracer ported to new fibonacci_heap data structure.
authorMartin Liska <mliska@suse.cz>
Tue, 18 Nov 2014 16:15:52 +0000 (17:15 +0100)
committerMartin Liska <marxin@gcc.gnu.org>
Tue, 18 Nov 2014 16:15:52 +0000 (16:15 +0000)
* tracer.c (tail_duplicate): New fibonacci_heap class is used.

From-SVN: r217722

gcc/ChangeLog
gcc/tracer.c

index 3f285a57a618a265f581c6f5de95f2621b897f82..6d2d5f7a72eec6c3e8d00fd48d9f8cadb72261ca 100644 (file)
@@ -1,3 +1,7 @@
+2014-11-18  Martin Liska  <mliska@suse.cz>
+
+       * tracer.c (tail_duplicate): New fibonacci_heap class is used.
+
 2014-11-18  Martin Liska  <mliska@suse.cz>
 
        * bb-reorder.c (mark_bb_visited): New fibonacci_heap is used.
index b3a412cec49b10622b57763c87e24844790e27fb..cecefdcd8c46d7f9ede54c282113e022a34be6d4 100644 (file)
@@ -52,7 +52,6 @@
 #include "cfg.h"
 #include "cfganal.h"
 #include "basic-block.h"
-#include "fibheap.h"
 #include "flags.h"
 #include "params.h"
 #include "coverage.h"
@@ -67,6 +66,7 @@
 #include "tree-ssa.h"
 #include "tree-inline.h"
 #include "cfgloop.h"
+#include "fibonacci_heap.h"
 
 static int count_insns (basic_block);
 static bool ignore_bb_p (const_basic_block);
@@ -241,12 +241,14 @@ find_trace (basic_block bb, basic_block *trace)
 static bool
 tail_duplicate (void)
 {
-  fibnode_t *blocks = XCNEWVEC (fibnode_t, last_basic_block_for_fn (cfun));
+  auto_vec<fibonacci_node<long, basic_block_def>*> blocks;
+  blocks.safe_grow_cleared (last_basic_block_for_fn (cfun));
+
   basic_block *trace = XNEWVEC (basic_block, n_basic_blocks_for_fn (cfun));
   int *counts = XNEWVEC (int, last_basic_block_for_fn (cfun));
   int ninsns = 0, nduplicated = 0;
   gcov_type weighted_insns = 0, traced_insns = 0;
-  fibheap_t heap = fibheap_new ();
+  fibonacci_heap<long, basic_block_def> heap (LONG_MIN);
   gcov_type cover_insns;
   int max_dup_insns;
   basic_block bb;
@@ -271,8 +273,7 @@ tail_duplicate (void)
     {
       int n = count_insns (bb);
       if (!ignore_bb_p (bb))
-       blocks[bb->index] = fibheap_insert (heap, -bb->frequency,
-                                           bb);
+       blocks[bb->index] = heap.insert (-bb->frequency, bb);
 
       counts [bb->index] = n;
       ninsns += n;
@@ -287,9 +288,9 @@ tail_duplicate (void)
   max_dup_insns = (ninsns * PARAM_VALUE (TRACER_MAX_CODE_GROWTH) + 50) / 100;
 
   while (traced_insns < cover_insns && nduplicated < max_dup_insns
-         && !fibheap_empty (heap))
+         && !heap.empty ())
     {
-      basic_block bb = (basic_block) fibheap_extract_min (heap);
+      basic_block bb = heap.extract_min ();
       int n, pos;
 
       if (!bb)
@@ -307,7 +308,7 @@ tail_duplicate (void)
       traced_insns += bb->frequency * counts [bb->index];
       if (blocks[bb->index])
        {
-         fibheap_delete_node (heap, blocks[bb->index]);
+         heap.delete_node (blocks[bb->index]);
          blocks[bb->index] = NULL;
        }
 
@@ -317,7 +318,7 @@ tail_duplicate (void)
 
          if (blocks[bb2->index])
            {
-             fibheap_delete_node (heap, blocks[bb2->index]);
+             heap.delete_node (blocks[bb2->index]);
              blocks[bb2->index] = NULL;
            }
          traced_insns += bb2->frequency * counts [bb2->index];
@@ -344,8 +345,7 @@ tail_duplicate (void)
              /* Reconsider the original copy of block we've duplicated.
                 Removing the most common predecessor may make it to be
                 head.  */
-             blocks[bb2->index] =
-               fibheap_insert (heap, -bb2->frequency, bb2);
+             blocks[bb2->index] = heap.insert (-bb2->frequency, bb2);
 
              if (dump_file)
                fprintf (dump_file, "Duplicated %i as %i [%i]\n",
@@ -370,10 +370,8 @@ tail_duplicate (void)
 
   free_original_copy_tables ();
   sbitmap_free (bb_seen);
-  free (blocks);
   free (trace);
   free (counts);
-  fibheap_delete (heap);
 
   return changed;
 }