summaryrefslogtreecommitdiff
path: root/gcc/tracer.c
diff options
context:
space:
mode:
authormarxin <marxin@138bc75d-0d04-0410-961f-82ee72b054a4>2014-11-18 16:15:52 +0000
committermarxin <marxin@138bc75d-0d04-0410-961f-82ee72b054a4>2014-11-18 16:15:52 +0000
commit2966eae44d82ce8e8b3b9038d81371189daa7e6b (patch)
treedfeeca70b05952ed8d0d087028c4afefaa5178ab /gcc/tracer.c
parent0849607218c9cd4f105d5e28930552038c572eca (diff)
downloadgcc-2966eae44d82ce8e8b3b9038d81371189daa7e6b.tar.gz
tracer ported to new fibonacci_heap data structure.
* tracer.c (tail_duplicate): New fibonacci_heap class is used. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@217722 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/tracer.c')
-rw-r--r--gcc/tracer.c24
1 files changed, 11 insertions, 13 deletions
diff --git a/gcc/tracer.c b/gcc/tracer.c
index b3a412cec49..cecefdcd8c4 100644
--- a/gcc/tracer.c
+++ b/gcc/tracer.c
@@ -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;
}