cfg.c 29.9 KB
Newer Older
1
/* Control flow graph manipulation code for GNU compiler.
2
   Copyright (C) 1987-2014 Free Software Foundation, Inc.
3 4 5 6 7

This file is part of GCC.

GCC is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free
8
Software Foundation; either version 3, or (at your option) any later
9 10 11 12 13 14 15 16
version.

GCC is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
for more details.

You should have received a copy of the GNU General Public License
17 18
along with GCC; see the file COPYING3.  If not see
<http://www.gnu.org/licenses/>.  */
19

20
/* This file contains low level functions to manipulate the CFG and
21
   analyze it.  All other modules should not transform the data structure
22 23 24
   directly and use abstraction instead.  The file is supposed to be
   ordered bottom-up and should not contain any code dependent on a
   particular intermediate language (RTL or trees).
25 26 27 28

   Available functionality:
     - Initialization/deallocation
	 init_flow, clear_edges
29 30
     - Low level basic block manipulation
	 alloc_block, expunge_block
31
     - Edge manipulation
32
	 make_edge, make_single_succ_edge, cached_make_edge, remove_edge
33 34
	 - Low level edge redirection (without updating instruction chain)
	     redirect_edge_succ, redirect_edge_succ_nodup, redirect_edge_pred
35
     - Dumping and debugging
36 37 38
	 dump_flow_info, debug_flow_info, dump_edge_info
     - Allocation of AUX fields for basic blocks
	 alloc_aux_for_blocks, free_aux_for_blocks, alloc_aux_for_block
39
     - clear_bb_flags
40 41 42 43
     - Consistency checking
	 verify_flow_info
     - Dumping and debugging
	 print_rtl_with_bb, dump_bb, debug_bb, debug_bb_n
44 45 46

   TODO: Document these "Available functionality" functions in the files
   that implement them.
47 48 49 50
 */

#include "config.h"
#include "system.h"
51
#include "coretypes.h"
52
#include "obstack.h"
53
#include "ggc.h"
54
#include "hash-table.h"
55
#include "alloc-pool.h"
56
#include "tree.h"
57
#include "basic-block.h"
58
#include "df.h"
59
#include "cfgloop.h" /* FIXME: For struct loop.  */
60
#include "dumpfile.h"
61 62


63 64
#define RDIV(X,Y) (((X) + (Y) / 2) / (Y))

65
/* Called once at initialization time.  */
66 67

void
Diego Novillo committed
68
init_flow (struct function *the_fun)
69
{
Diego Novillo committed
70
  if (!the_fun->cfg)
71
    the_fun->cfg = ggc_cleared_alloc<control_flow_graph> ();
David Malcolm committed
72
  n_edges_for_fn (the_fun) = 0;
73
  ENTRY_BLOCK_PTR_FOR_FN (the_fun)
74
    = ggc_cleared_alloc<basic_block_def> ();
75 76
  ENTRY_BLOCK_PTR_FOR_FN (the_fun)->index = ENTRY_BLOCK;
  EXIT_BLOCK_PTR_FOR_FN (the_fun)
77
    = ggc_cleared_alloc<basic_block_def> ();
78 79 80 81 82
  EXIT_BLOCK_PTR_FOR_FN (the_fun)->index = EXIT_BLOCK;
  ENTRY_BLOCK_PTR_FOR_FN (the_fun)->next_bb
    = EXIT_BLOCK_PTR_FOR_FN (the_fun);
  EXIT_BLOCK_PTR_FOR_FN (the_fun)->prev_bb
    = ENTRY_BLOCK_PTR_FOR_FN (the_fun);
83 84
}

85
/* Helper function for remove_edge and clear_edges.  Frees edge structure
86
   without actually removing it from the pred/succ arrays.  */
87 88

static void
89
free_edge (edge e)
90
{
David Malcolm committed
91
  n_edges_for_fn (cfun)--;
92
  ggc_free (e);
93 94
}

95 96 97
/* Free the memory associated with the edge structures.  */

void
98
clear_edges (void)
99
{
100
  basic_block bb;
101
  edge e;
102
  edge_iterator ei;
103

104
  FOR_EACH_BB_FN (bb, cfun)
105
    {
106 107
      FOR_EACH_EDGE (e, ei, bb->succs)
	free_edge (e);
108 109
      vec_safe_truncate (bb->succs, 0);
      vec_safe_truncate (bb->preds, 0);
110
    }
111

112
  FOR_EACH_EDGE (e, ei, ENTRY_BLOCK_PTR_FOR_FN (cfun)->succs)
113
    free_edge (e);
114 115
  vec_safe_truncate (EXIT_BLOCK_PTR_FOR_FN (cfun)->preds, 0);
  vec_safe_truncate (ENTRY_BLOCK_PTR_FOR_FN (cfun)->succs, 0);
116

David Malcolm committed
117
  gcc_assert (!n_edges_for_fn (cfun));
118 119
}

120
/* Allocate memory for basic_block.  */
121

122
basic_block
123
alloc_block (void)
124 125
{
  basic_block bb;
126
  bb = ggc_cleared_alloc<basic_block_def> ();
127
  return bb;
128 129
}

130 131
/* Link block B to chain after AFTER.  */
void
132
link_block (basic_block b, basic_block after)
133 134 135 136 137 138
{
  b->next_bb = after->next_bb;
  b->prev_bb = after;
  after->next_bb = b;
  b->next_bb->prev_bb = b;
}
139

140 141
/* Unlink block B from chain.  */
void
142
unlink_block (basic_block b)
143 144 145
{
  b->next_bb->prev_bb = b->prev_bb;
  b->prev_bb->next_bb = b->next_bb;
146 147
  b->prev_bb = NULL;
  b->next_bb = NULL;
148
}
149

150 151
/* Sequentially order blocks and compact the arrays.  */
void
152
compact_blocks (void)
153 154
{
  int i;
155

156 157
  SET_BASIC_BLOCK_FOR_FN (cfun, ENTRY_BLOCK, ENTRY_BLOCK_PTR_FOR_FN (cfun));
  SET_BASIC_BLOCK_FOR_FN (cfun, EXIT_BLOCK, EXIT_BLOCK_PTR_FOR_FN (cfun));
H.J. Lu committed
158

159 160
  if (df)
    df_compact_blocks ();
H.J. Lu committed
161
  else
162
    {
163
      basic_block bb;
H.J. Lu committed
164

165
      i = NUM_FIXED_BLOCKS;
166
      FOR_EACH_BB_FN (bb, cfun)
167
	{
168
	  SET_BASIC_BLOCK_FOR_FN (cfun, i, bb);
169 170 171
	  bb->index = i;
	  i++;
	}
172
      gcc_assert (i == n_basic_blocks_for_fn (cfun));
173

174
      for (; i < last_basic_block_for_fn (cfun); i++)
175
	SET_BASIC_BLOCK_FOR_FN (cfun, i, NULL);
176
    }
177
  last_basic_block_for_fn (cfun) = n_basic_blocks_for_fn (cfun);
178 179 180
}

/* Remove block B from the basic block array.  */
181

182
void
183
expunge_block (basic_block b)
184
{
185
  unlink_block (b);
186
  SET_BASIC_BLOCK_FOR_FN (cfun, b->index, NULL);
187
  n_basic_blocks_for_fn (cfun)--;
188 189 190 191 192
  /* We should be able to ggc_free here, but we are not.
     The dead SSA_NAMES are left pointing to dead statements that are pointing
     to dead basic blocks making garbage collector to die.
     We should be able to release all dead SSA_NAMES and at the same time we should
     clear out BB pointer of dead statements consistently.  */
193
}
194

195 196 197 198 199
/* Connect E to E->src.  */

static inline void
connect_src (edge e)
{
200
  vec_safe_push (e->src->succs, e);
201
  df_mark_solutions_dirty ();
202 203 204 205 206 207 208 209
}

/* Connect E to E->dest.  */

static inline void
connect_dest (edge e)
{
  basic_block dest = e->dest;
210
  vec_safe_push (dest->preds, e);
211
  e->dest_idx = EDGE_COUNT (dest->preds) - 1;
212
  df_mark_solutions_dirty ();
213 214 215 216 217 218 219 220 221 222 223 224 225 226 227
}

/* Disconnect edge E from E->src.  */

static inline void
disconnect_src (edge e)
{
  basic_block src = e->src;
  edge_iterator ei;
  edge tmp;

  for (ei = ei_start (src->succs); (tmp = ei_safe_edge (ei)); )
    {
      if (tmp == e)
	{
228
	  src->succs->unordered_remove (ei.index);
229
	  df_mark_solutions_dirty ();
230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246
	  return;
	}
      else
	ei_next (&ei);
    }

  gcc_unreachable ();
}

/* Disconnect edge E from E->dest.  */

static inline void
disconnect_dest (edge e)
{
  basic_block dest = e->dest;
  unsigned int dest_idx = e->dest_idx;

247
  dest->preds->unordered_remove (dest_idx);
248 249 250 251 252

  /* If we removed an edge in the middle of the edge vector, we need
     to update dest_idx of the edge that moved into the "hole".  */
  if (dest_idx < EDGE_COUNT (dest->preds))
    EDGE_PRED (dest, dest_idx)->dest_idx = dest_idx;
253
  df_mark_solutions_dirty ();
254 255
}

256 257 258 259 260
/* Create an edge connecting SRC and DEST with flags FLAGS.  Return newly
   created edge.  Use this only if you are sure that this edge can't
   possibly already exist.  */

edge
261
unchecked_make_edge (basic_block src, basic_block dst, int flags)
262 263
{
  edge e;
264
  e = ggc_cleared_alloc<edge_def> ();
David Malcolm committed
265
  n_edges_for_fn (cfun)++;
266 267 268 269

  e->src = src;
  e->dest = dst;
  e->flags = flags;
270 271 272

  connect_src (e);
  connect_dest (e);
273

274
  execute_on_growing_pred (e);
275 276 277
  return e;
}

278
/* Create an edge connecting SRC and DST with FLAGS optionally using
279
   edge cache CACHE.  Return the new edge, NULL if already exist.  */
280

281
edge
282
cached_make_edge (sbitmap edge_cache, basic_block src, basic_block dst, int flags)
283
{
284
  if (edge_cache == NULL
285 286
      || src == ENTRY_BLOCK_PTR_FOR_FN (cfun)
      || dst == EXIT_BLOCK_PTR_FOR_FN (cfun))
287
    return make_edge (src, dst, flags);
288

289
  /* Does the requested edge already exist?  */
290
  if (! bitmap_bit_p (edge_cache, dst->index))
291
    {
292 293
      /* The edge does not exist.  Create one and update the
	 cache.  */
294
      bitmap_set_bit (edge_cache, dst->index);
295
      return unchecked_make_edge (src, dst, flags);
296
    }
297

298 299 300 301 302 303 304
  /* At this point, we know that the requested edge exists.  Adjust
     flags if necessary.  */
  if (flags)
    {
      edge e = find_edge (src, dst);
      e->flags |= flags;
    }
305

306
  return NULL;
307 308 309 310 311 312
}

/* Create an edge connecting SRC and DEST with flags FLAGS.  Return newly
   created edge or NULL if already exist.  */

edge
313
make_edge (basic_block src, basic_block dest, int flags)
314
{
315 316 317 318 319 320 321 322 323 324
  edge e = find_edge (src, dest);

  /* Make sure we don't add duplicate edges.  */
  if (e)
    {
      e->flags |= flags;
      return NULL;
    }

  return unchecked_make_edge (src, dest, flags);
325 326
}

327
/* Create an edge connecting SRC to DEST and set probability by knowing
328 329 330
   that it is the single edge leaving SRC.  */

edge
331
make_single_succ_edge (basic_block src, basic_block dest, int flags)
332 333 334 335 336 337
{
  edge e = make_edge (src, dest, flags);

  e->probability = REG_BR_PROB_BASE;
  e->count = src->count;
  return e;
338 339 340 341 342
}

/* This function will remove an edge from the flow graph.  */

void
343
remove_edge_raw (edge e)
344
{
345
  remove_predictions_associated_with_edge (e);
346 347
  execute_on_shrinking_pred (e);

348 349
  disconnect_src (e);
  disconnect_dest (e);
350

351
  free_edge (e);
352 353 354 355 356
}

/* Redirect an edge's successor from one block to another.  */

void
357
redirect_edge_succ (edge e, basic_block new_succ)
358
{
359 360
  execute_on_shrinking_pred (e);

361
  disconnect_dest (e);
362

363
  e->dest = new_succ;
364 365

  /* Reconnect the edge to the new successor block.  */
366 367
  connect_dest (e);

368
  execute_on_growing_pred (e);
369 370 371 372 373
}

/* Redirect an edge's predecessor from one block to another.  */

void
374
redirect_edge_pred (edge e, basic_block new_pred)
375
{
376
  disconnect_src (e);
377

378
  e->src = new_pred;
379 380

  /* Reconnect the edge to the new predecessor block.  */
381
  connect_src (e);
382
}
383

384
/* Clear all basic block flags that do not have to be preserved.  */
385
void
386
clear_bb_flags (void)
387
{
388 389
  basic_block bb;

390
  FOR_BB_BETWEEN (bb, ENTRY_BLOCK_PTR_FOR_FN (cfun), NULL, next_bb)
391
    bb->flags &= BB_FLAGS_TO_PRESERVE;
392
}
393

394 395 396 397 398
/* Check the consistency of profile information.  We can't do that
   in verify_flow_info, as the counts may get invalid for incompletely
   solved graphs, later eliminating of conditionals or roundoff errors.
   It is still practical to have them reported for debugging of simple
   testcases.  */
399 400
static void
check_bb_profile (basic_block bb, FILE * file, int indent, int flags)
401 402 403 404
{
  edge e;
  int sum = 0;
  gcov_type lsum;
405
  edge_iterator ei;
406
  struct function *fun = DECL_STRUCT_FUNCTION (current_function_decl);
407 408 409
  char *s_indent = (char *) alloca ((size_t) indent + 1);
  memset ((void *) s_indent, ' ', (size_t) indent);
  s_indent[indent] = '\0';
410

411
  if (profile_status_for_fn (fun) == PROFILE_ABSENT)
412 413
    return;

414
  if (bb != EXIT_BLOCK_PTR_FOR_FN (fun))
415
    {
416
      FOR_EACH_EDGE (e, ei, bb->succs)
417
	sum += e->probability;
418
      if (EDGE_COUNT (bb->succs) && abs (sum - REG_BR_PROB_BASE) > 100)
419 420
	fprintf (file, "%s%sInvalid sum of outgoing probabilities %.1f%%\n",
		 (flags & TDF_COMMENT) ? ";; " : "", s_indent,
421 422
		 sum * 100.0 / REG_BR_PROB_BASE);
      lsum = 0;
423
      FOR_EACH_EDGE (e, ei, bb->succs)
424
	lsum += e->count;
425 426
      if (EDGE_COUNT (bb->succs)
	  && (lsum - bb->count > 100 || lsum - bb->count < -100))
427 428
	fprintf (file, "%s%sInvalid sum of outgoing counts %i, should be %i\n",
		 (flags & TDF_COMMENT) ? ";; " : "", s_indent,
429 430
		 (int) lsum, (int) bb->count);
    }
431
    if (bb != ENTRY_BLOCK_PTR_FOR_FN (fun))
432 433
    {
      sum = 0;
434
      FOR_EACH_EDGE (e, ei, bb->preds)
435 436 437
	sum += EDGE_FREQUENCY (e);
      if (abs (sum - bb->frequency) > 100)
	fprintf (file,
438 439
		 "%s%sInvalid sum of incoming frequencies %i, should be %i\n",
		 (flags & TDF_COMMENT) ? ";; " : "", s_indent,
440 441
		 sum, bb->frequency);
      lsum = 0;
442
      FOR_EACH_EDGE (e, ei, bb->preds)
443 444
	lsum += e->count;
      if (lsum - bb->count > 100 || lsum - bb->count < -100)
445 446
	fprintf (file, "%s%sInvalid sum of incoming counts %i, should be %i\n",
		 (flags & TDF_COMMENT) ? ";; " : "", s_indent,
447 448
		 (int) lsum, (int) bb->count);
    }
449 450 451 452 453 454 455 456 457 458 459 460 461 462 463
  if (BB_PARTITION (bb) == BB_COLD_PARTITION)
    {
      /* Warn about inconsistencies in the partitioning that are
         currently caused by profile insanities created via optimization.  */
      if (!probably_never_executed_bb_p (fun, bb))
        fprintf (file, "%s%sBlock in cold partition with hot count\n",
                 (flags & TDF_COMMENT) ? ";; " : "", s_indent);
      FOR_EACH_EDGE (e, ei, bb->preds)
        {
          if (!probably_never_executed_edge_p (fun, e))
            fprintf (file,
                     "%s%sBlock in cold partition with incoming hot edge\n",
                     (flags & TDF_COMMENT) ? ";; " : "", s_indent);
        }
    }
464 465
}

466
void
467
dump_edge_info (FILE *file, edge e, int flags, int do_succ)
468
{
469
  basic_block side = (do_succ ? e->dest : e->src);
470 471 472 473 474 475
  bool do_details = false;
  
  if ((flags & TDF_DETAILS) != 0
      && (flags & TDF_SLIM) == 0)
    do_details = true;

476
  if (side->index == ENTRY_BLOCK)
477
    fputs (" ENTRY", file);
478
  else if (side->index == EXIT_BLOCK)
479 480
    fputs (" EXIT", file);
  else
481
    fprintf (file, " %d", side->index);
482

483
  if (e->probability && do_details)
484
    fprintf (file, " [%.1f%%] ", e->probability * 100.0 / REG_BR_PROB_BASE);
485

486
  if (e->count && do_details)
487
    {
488
      fputs (" count:", file);
489
      fprintf (file, "%"PRId64, e->count);
490 491
    }

492
  if (e->flags && do_details)
493
    {
494 495 496 497 498 499 500 501
      static const char * const bitnames[] =
	{
#define DEF_EDGE_FLAG(NAME,IDX) #NAME ,
#include "cfg-flags.def"
	  NULL
#undef DEF_EDGE_FLAG
	};
      bool comma = false;
502
      int i, flags = e->flags;
503

504
      gcc_assert (e->flags <= EDGE_ALL_FLAGS);
505
      fputs (" (", file);
506 507 508 509 510 511 512
      for (i = 0; flags; i++)
	if (flags & (1 << i))
	  {
	    flags &= ~(1 << i);

	    if (comma)
	      fputc (',', file);
513 514
	    fputs (bitnames[i], file);
	    comma = true;
515
	  }
516

517 518 519
      fputc (')', file);
    }
}
520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536

DEBUG_FUNCTION void
debug (edge_def &ref)
{
  /* FIXME (crowl): Is this desireable?  */
  dump_edge_info (stderr, &ref, 0, false);
  dump_edge_info (stderr, &ref, 0, true);
}

DEBUG_FUNCTION void
debug (edge_def *ptr)
{
  if (ptr)
    debug (*ptr);
  else
    fprintf (stderr, "<nil>\n");
}
537

538
/* Simple routines to easily allocate AUX fields of basic blocks.  */
539

540 541 542 543
static struct obstack block_aux_obstack;
static void *first_block_aux_obj = 0;
static struct obstack edge_aux_obstack;
static void *first_edge_aux_obj = 0;
544

545
/* Allocate a memory block of SIZE as BB->aux.  The obstack must
546
   be first initialized by alloc_aux_for_blocks.  */
547

548
static void
549
alloc_aux_for_block (basic_block bb, int size)
550
{
551
  /* Verify that aux field is clear.  */
552
  gcc_assert (!bb->aux && first_block_aux_obj);
553 554
  bb->aux = obstack_alloc (&block_aux_obstack, size);
  memset (bb->aux, 0, size);
555 556
}

557 558
/* Initialize the block_aux_obstack and if SIZE is nonzero, call
   alloc_aux_for_block for each basic block.  */
559 560

void
561
alloc_aux_for_blocks (int size)
562
{
563
  static int initialized;
564

565
  if (!initialized)
566
    {
567 568
      gcc_obstack_init (&block_aux_obstack);
      initialized = 1;
569
    }
570 571 572
  else
    /* Check whether AUX data are still allocated.  */
    gcc_assert (!first_block_aux_obj);
Mike Stump committed
573

574
  first_block_aux_obj = obstack_alloc (&block_aux_obstack, 0);
575
  if (size)
576
    {
577
      basic_block bb;
578

579
      FOR_ALL_BB_FN (bb, cfun)
580
	alloc_aux_for_block (bb, size);
581 582
    }
}
583

584
/* Clear AUX pointers of all blocks.  */
585 586

void
587
clear_aux_for_blocks (void)
588
{
589
  basic_block bb;
590

591
  FOR_ALL_BB_FN (bb, cfun)
592
    bb->aux = NULL;
593 594 595 596 597 598
}

/* Free data allocated in block_aux_obstack and clear AUX pointers
   of all blocks.  */

void
599
free_aux_for_blocks (void)
600
{
601
  gcc_assert (first_block_aux_obj);
602
  obstack_free (&block_aux_obstack, first_block_aux_obj);
603
  first_block_aux_obj = NULL;
604 605

  clear_aux_for_blocks ();
606
}
607

608
/* Allocate a memory edge of SIZE as E->aux.  The obstack must
609
   be first initialized by alloc_aux_for_edges.  */
610

611
void
612
alloc_aux_for_edge (edge e, int size)
613 614
{
  /* Verify that aux field is clear.  */
615
  gcc_assert (!e->aux && first_edge_aux_obj);
616 617 618
  e->aux = obstack_alloc (&edge_aux_obstack, size);
  memset (e->aux, 0, size);
}
619

620 621
/* Initialize the edge_aux_obstack and if SIZE is nonzero, call
   alloc_aux_for_edge for each basic edge.  */
622

623
void
624
alloc_aux_for_edges (int size)
625 626
{
  static int initialized;
627

628 629 630 631
  if (!initialized)
    {
      gcc_obstack_init (&edge_aux_obstack);
      initialized = 1;
632
    }
633 634 635
  else
    /* Check whether AUX data are still allocated.  */
    gcc_assert (!first_edge_aux_obj);
636

637
  first_edge_aux_obj = obstack_alloc (&edge_aux_obstack, 0);
638
  if (size)
639
    {
640 641
      basic_block bb;

642 643
      FOR_BB_BETWEEN (bb, ENTRY_BLOCK_PTR_FOR_FN (cfun),
		      EXIT_BLOCK_PTR_FOR_FN (cfun), next_bb)
644
	{
645
	  edge e;
646
	  edge_iterator ei;
647

648
	  FOR_EACH_EDGE (e, ei, bb->succs)
649
	    alloc_aux_for_edge (e, size);
650 651 652 653
	}
    }
}

654
/* Clear AUX pointers of all edges.  */
655 656

void
657
clear_aux_for_edges (void)
658
{
659 660
  basic_block bb;
  edge e;
661

662 663
  FOR_BB_BETWEEN (bb, ENTRY_BLOCK_PTR_FOR_FN (cfun),
		  EXIT_BLOCK_PTR_FOR_FN (cfun), next_bb)
664
    {
665 666
      edge_iterator ei;
      FOR_EACH_EDGE (e, ei, bb->succs)
667
	e->aux = NULL;
668
    }
669 670 671 672 673 674
}

/* Free data allocated in edge_aux_obstack and clear AUX pointers
   of all edges.  */

void
675
free_aux_for_edges (void)
676
{
677
  gcc_assert (first_edge_aux_obj);
678
  obstack_free (&edge_aux_obstack, first_edge_aux_obj);
679
  first_edge_aux_obj = NULL;
680 681

  clear_aux_for_edges ();
682
}
683

684
DEBUG_FUNCTION void
685
debug_bb (basic_block bb)
686
{
687
  dump_bb (stderr, bb, 0, dump_flags);
688 689
}

690
DEBUG_FUNCTION basic_block
691
debug_bb_n (int n)
692
{
693
  basic_block bb = BASIC_BLOCK_FOR_FN (cfun, n);
694
  debug_bb (bb);
695
  return bb;
696
}
697

698 699 700 701 702 703
/* Dumps cfg related information about basic block BB to OUTF.
   If HEADER is true, dump things that appear before the instructions
   contained in BB.  If FOOTER is true, dump things that appear after.
   Flags are the TDF_* masks as documented in dumpfile.h.
   NB: With TDF_DETAILS, it is assumed that cfun is available, so
   that maybe_hot_bb_p and probably_never_executed_bb_p don't ICE.  */
704

705 706 707
void
dump_bb_info (FILE *outf, basic_block bb, int indent, int flags,
	      bool do_header, bool do_footer)
708
{
709
  edge_iterator ei;
710
  edge e;
711 712
  static const char * const bb_bitnames[] =
    {
713 714 715 716
#define DEF_BASIC_BLOCK_FLAG(NAME,IDX) #NAME ,
#include "cfg-flags.def"
      NULL
#undef DEF_BASIC_BLOCK_FLAG
717 718
    };
  const unsigned n_bitnames = sizeof (bb_bitnames) / sizeof (char *);
719
  bool first;
720 721 722
  char *s_indent = (char *) alloca ((size_t) indent + 1);
  memset ((void *) s_indent, ' ', (size_t) indent);
  s_indent[indent] = '\0';
723

724 725 726 727 728 729 730 731
  gcc_assert (bb->flags <= BB_ALL_FLAGS);

  if (do_header)
    {
      unsigned i;

      if (flags & TDF_COMMENT)
	fputs (";; ", outf);
732
      fprintf (outf, "%sbasic block %d, loop depth %d",
733
	       s_indent, bb->index, bb_loop_depth (bb));
734 735
      if (flags & TDF_DETAILS)
	{
736
	  struct function *fun = DECL_STRUCT_FUNCTION (current_function_decl);
737 738
	  fprintf (outf, ", count " "%"PRId64,
		   (int64_t) bb->count);
739
	  fprintf (outf, ", freq %i", bb->frequency);
740
	  if (maybe_hot_bb_p (fun, bb))
741
	    fputs (", maybe hot", outf);
742
	  if (probably_never_executed_bb_p (fun, bb))
743 744 745 746 747 748
	    fputs (", probably never executed", outf);
	}
      fputc ('\n', outf);

      if (flags & TDF_DETAILS)
	{
749
	  check_bb_profile (bb, outf, indent, flags);
750 751 752 753 754 755 756 757 758 759 760 761 762 763
	  if (flags & TDF_COMMENT)
	    fputs (";; ", outf);
	  fprintf (outf, "%s prev block ", s_indent);
	  if (bb->prev_bb)
	    fprintf (outf, "%d", bb->prev_bb->index);
	  else
	    fprintf (outf, "(nil)");
	  fprintf (outf, ", next block ");
	  if (bb->next_bb)
	    fprintf (outf, "%d", bb->next_bb->index);
	  else
	    fprintf (outf, "(nil)");

	  fputs (", flags:", outf);
764
	  first = true;
765 766 767 768 769 770 771 772 773 774 775 776
	  for (i = 0; i < n_bitnames; i++)
	    if (bb->flags & (1 << i))
	      {
		if (first)
		  fputs (" (", outf);
		else
		  fputs (", ", outf);
		first = false;
		fputs (bb_bitnames[i], outf);
	      }
	  if (!first)
	    fputc (')', outf);
777
	  fputc ('\n', outf);
778 779 780 781 782
	}

      if (flags & TDF_COMMENT)
	fputs (";; ", outf);
      fprintf (outf, "%s pred:      ", s_indent);
783
      first = true;
784
      FOR_EACH_EDGE (e, ei, bb->preds)
785 786 787 788 789 790 791 792 793 794 795
	{
	  if (! first)
	    {
	      if (flags & TDF_COMMENT)
		fputs (";; ", outf);
	      fprintf (outf, "%s            ", s_indent);
	    }
	  first = false;
	  dump_edge_info (outf, e, flags, 0);
	  fputc ('\n', outf);
	}
796 797
      if (first)
	fputc ('\n', outf);
798 799 800 801 802 803 804
    }

  if (do_footer)
    {
      if (flags & TDF_COMMENT)
	fputs (";; ", outf);
      fprintf (outf, "%s succ:      ", s_indent);
805
      first = true;
806
      FOR_EACH_EDGE (e, ei, bb->succs)
807 808 809 810 811 812 813 814 815 816 817
        {
	  if (! first)
	    {
	      if (flags & TDF_COMMENT)
		fputs (";; ", outf);
	      fprintf (outf, "%s            ", s_indent);
	    }
	  first = false;
	  dump_edge_info (outf, e, flags, 1);
	  fputc ('\n', outf);
	}
818 819
      if (first)
	fputc ('\n', outf);
820
    }
821 822 823 824 825
}

/* Dumps a brief description of cfg to FILE.  */

void
826
brief_dump_cfg (FILE *file, int flags)
827 828 829
{
  basic_block bb;

830
  FOR_EACH_BB_FN (bb, cfun)
831
    {
832 833 834
      dump_bb_info (file, bb, 0,
		    flags & (TDF_COMMENT | TDF_DETAILS),
		    true, true);
835 836
    }
}
837 838 839

/* An edge originally destinating BB of FREQUENCY and COUNT has been proved to
   leave the block by TAKEN_EDGE.  Update profile of BB such that edge E can be
Mike Stump committed
840
   redirected to destination of TAKEN_EDGE.
841 842 843

   This function may leave the profile inconsistent in the case TAKEN_EDGE
   frequency or count is believed to be lower than FREQUENCY or COUNT
844
   respectively.  */
845 846 847 848 849 850
void
update_bb_profile_for_threading (basic_block bb, int edge_frequency,
				 gcov_type count, edge taken_edge)
{
  edge c;
  int prob;
851
  edge_iterator ei;
852 853 854

  bb->count -= count;
  if (bb->count < 0)
855 856 857 858 859 860
    {
      if (dump_file)
	fprintf (dump_file, "bb %i count became negative after threading",
		 bb->index);
      bb->count = 0;
    }
861 862 863 864

  /* Compute the probability of TAKEN_EDGE being reached via threaded edge.
     Watch for overflows.  */
  if (bb->frequency)
865
    prob = GCOV_COMPUTE_SCALE (edge_frequency, bb->frequency);
866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889
  else
    prob = 0;
  if (prob > taken_edge->probability)
    {
      if (dump_file)
	fprintf (dump_file, "Jump threading proved probability of edge "
		 "%i->%i too small (it is %i, should be %i).\n",
		 taken_edge->src->index, taken_edge->dest->index,
		 taken_edge->probability, prob);
      prob = taken_edge->probability;
    }

  /* Now rescale the probabilities.  */
  taken_edge->probability -= prob;
  prob = REG_BR_PROB_BASE - prob;
  bb->frequency -= edge_frequency;
  if (bb->frequency < 0)
    bb->frequency = 0;
  if (prob <= 0)
    {
      if (dump_file)
	fprintf (dump_file, "Edge frequencies of bb %i has been reset, "
		 "frequency of block should end up being 0, it is %i\n",
		 bb->index, bb->frequency);
890 891 892 893
      EDGE_SUCC (bb, 0)->probability = REG_BR_PROB_BASE;
      ei = ei_start (bb->succs);
      ei_next (&ei);
      for (; (c = ei_safe_edge (ei)); ei_next (&ei))
894 895
	c->probability = 0;
    }
896 897
  else if (prob != REG_BR_PROB_BASE)
    {
898
      int scale = RDIV (65536 * REG_BR_PROB_BASE, prob);
899 900

      FOR_EACH_EDGE (c, ei, bb->succs)
901
	{
902 903
	  /* Protect from overflow due to additional scaling.  */
	  if (c->probability > prob)
904
	    c->probability = REG_BR_PROB_BASE;
905 906 907 908 909 910
	  else
	    {
	      c->probability = RDIV (c->probability * scale, 65536);
	      if (c->probability > REG_BR_PROB_BASE)
		c->probability = REG_BR_PROB_BASE;
	    }
911
	}
912
    }
913

914
  gcc_assert (bb == taken_edge->src);
915 916
  taken_edge->count -= count;
  if (taken_edge->count < 0)
917 918 919 920 921 922
    {
      if (dump_file)
	fprintf (dump_file, "edge %i->%i count became negative after threading",
		 taken_edge->src->index, taken_edge->dest->index);
      taken_edge->count = 0;
    }
923
}
924 925 926 927 928 929 930 931

/* Multiply all frequencies of basic blocks in array BBS of length NBBS
   by NUM/DEN, in int arithmetic.  May lose some accuracy.  */
void
scale_bbs_frequencies_int (basic_block *bbs, int nbbs, int num, int den)
{
  int i;
  edge e;
932 933
  if (num < 0)
    num = 0;
934 935 936 937 938 939 940 941 942 943 944 945 946

  /* Scale NUM and DEN to avoid overflows.  Frequencies are in order of
     10^4, if we make DEN <= 10^3, we can afford to upscale by 100
     and still safely fit in int during calculations.  */
  if (den > 1000)
    {
      if (num > 1000000)
	return;

      num = RDIV (1000 * num, den);
      den = 1000;
    }
  if (num > 100 * den)
947
    return;
948

949 950 951
  for (i = 0; i < nbbs; i++)
    {
      edge_iterator ei;
952
      bbs[i]->frequency = RDIV (bbs[i]->frequency * num, den);
953 954 955
      /* Make sure the frequencies do not grow over BB_FREQ_MAX.  */
      if (bbs[i]->frequency > BB_FREQ_MAX)
	bbs[i]->frequency = BB_FREQ_MAX;
956 957
      bbs[i]->count = RDIV (bbs[i]->count * num, den);
      FOR_EACH_EDGE (e, ei, bbs[i]->succs)
958
	e->count = RDIV (e->count * num, den);
959 960 961
    }
}

962 963
/* numbers smaller than this value are safe to multiply without getting
   64bit overflow.  */
964
#define MAX_SAFE_MULTIPLIER (1 << (sizeof (int64_t) * 4 - 1))
965

966 967 968 969
/* Multiply all frequencies of basic blocks in array BBS of length NBBS
   by NUM/DEN, in gcov_type arithmetic.  More accurate than previous
   function but considerably slower.  */
void
Mike Stump committed
970 971
scale_bbs_frequencies_gcov_type (basic_block *bbs, int nbbs, gcov_type num,
				 gcov_type den)
972 973 974
{
  int i;
  edge e;
975
  gcov_type fraction = RDIV (num * 65536, den);
976

977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005
  gcc_assert (fraction >= 0);

  if (num < MAX_SAFE_MULTIPLIER)
    for (i = 0; i < nbbs; i++)
      {
	edge_iterator ei;
	bbs[i]->frequency = RDIV (bbs[i]->frequency * num, den);
	if (bbs[i]->count <= MAX_SAFE_MULTIPLIER)
	  bbs[i]->count = RDIV (bbs[i]->count * num, den);
	else
	  bbs[i]->count = RDIV (bbs[i]->count * fraction, 65536);
	FOR_EACH_EDGE (e, ei, bbs[i]->succs)
	  if (bbs[i]->count <= MAX_SAFE_MULTIPLIER)
	    e->count = RDIV (e->count * num, den);
	  else
	    e->count = RDIV (e->count * fraction, 65536);
      }
   else
    for (i = 0; i < nbbs; i++)
      {
	edge_iterator ei;
	if (sizeof (gcov_type) > sizeof (int))
	  bbs[i]->frequency = RDIV (bbs[i]->frequency * num, den);
	else
	  bbs[i]->frequency = RDIV (bbs[i]->frequency * fraction, 65536);
	bbs[i]->count = RDIV (bbs[i]->count * fraction, 65536);
	FOR_EACH_EDGE (e, ei, bbs[i]->succs)
	  e->count = RDIV (e->count * fraction, 65536);
      }
1006
}
1007

1008
/* Helper types for hash tables.  */
1009 1010 1011 1012 1013 1014 1015 1016 1017

struct htab_bb_copy_original_entry
{
  /* Block we are attaching info to.  */
  int index1;
  /* Index of original or copy (depending on the hashtable) */
  int index2;
};

1018
struct bb_copy_hasher : typed_noop_remove <htab_bb_copy_original_entry>
1019
{
1020 1021 1022 1023 1024
  typedef htab_bb_copy_original_entry value_type;
  typedef htab_bb_copy_original_entry compare_type;
  static inline hashval_t hash (const value_type *);
  static inline bool equal (const value_type *existing,
			    const compare_type * candidate);
1025
};
1026

1027
inline hashval_t
1028
bb_copy_hasher::hash (const value_type *data)
1029
{
1030 1031 1032
  return data->index1;
}

1033
inline bool
1034
bb_copy_hasher::equal (const value_type *data, const compare_type *data2)
1035
{
1036 1037 1038
  return data->index1 == data2->index1;
}

1039 1040
/* Data structures used to maintain mapping between basic blocks and
   copies.  */
1041 1042
static hash_table<bb_copy_hasher> *bb_original;
static hash_table<bb_copy_hasher> *bb_copy;
1043 1044

/* And between loops and copies.  */
1045
static hash_table<bb_copy_hasher> *loop_copy;
1046 1047 1048
static alloc_pool original_copy_bb_pool;


1049 1050
/* Initialize the data structures to maintain mapping between blocks
   and its copies.  */
1051 1052 1053 1054 1055 1056 1057
void
initialize_original_copy_tables (void)
{
  gcc_assert (!original_copy_bb_pool);
  original_copy_bb_pool
    = create_alloc_pool ("original_copy",
			 sizeof (struct htab_bb_copy_original_entry), 10);
1058 1059 1060
  bb_original = new hash_table<bb_copy_hasher> (10);
  bb_copy = new hash_table<bb_copy_hasher> (10);
  loop_copy = new hash_table<bb_copy_hasher> (10);
1061 1062
}

1063 1064
/* Free the data structures to maintain mapping between blocks and
   its copies.  */
1065 1066 1067 1068
void
free_original_copy_tables (void)
{
  gcc_assert (original_copy_bb_pool);
1069 1070 1071 1072 1073 1074
  delete bb_copy;
  bb_copy = NULL;
  delete bb_original;
  bb_copy = NULL;
  delete loop_copy;
  loop_copy = NULL;
1075 1076 1077 1078
  free_alloc_pool (original_copy_bb_pool);
  original_copy_bb_pool = NULL;
}

1079 1080 1081
/* Removes the value associated with OBJ from table TAB.  */

static void
1082
copy_original_table_clear (hash_table<bb_copy_hasher> *tab, unsigned obj)
1083
{
1084
  htab_bb_copy_original_entry **slot;
1085 1086 1087 1088 1089 1090
  struct htab_bb_copy_original_entry key, *elt;

  if (!original_copy_bb_pool)
    return;

  key.index1 = obj;
1091
  slot = tab->find_slot (&key, NO_INSERT);
1092 1093 1094
  if (!slot)
    return;

1095
  elt = *slot;
1096
  tab->clear_slot (slot);
1097 1098 1099 1100 1101 1102 1103
  pool_free (original_copy_bb_pool, elt);
}

/* Sets the value associated with OBJ in table TAB to VAL.
   Do nothing when data structures are not initialized.  */

static void
1104
copy_original_table_set (hash_table<bb_copy_hasher> *tab,
1105
			 unsigned obj, unsigned val)
1106 1107 1108 1109 1110 1111 1112 1113
{
  struct htab_bb_copy_original_entry **slot;
  struct htab_bb_copy_original_entry key;

  if (!original_copy_bb_pool)
    return;

  key.index1 = obj;
1114
  slot = tab->find_slot (&key, INSERT);
1115 1116
  if (!*slot)
    {
1117 1118
      *slot = (struct htab_bb_copy_original_entry *)
		pool_alloc (original_copy_bb_pool);
1119 1120 1121 1122 1123
      (*slot)->index1 = obj;
    }
  (*slot)->index2 = val;
}

1124 1125
/* Set original for basic block.  Do nothing when data structures are not
   initialized so passes not needing this don't need to care.  */
1126 1127 1128
void
set_bb_original (basic_block bb, basic_block original)
{
1129
  copy_original_table_set (bb_original, bb->index, original->index);
1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141
}

/* Get the original basic block.  */
basic_block
get_bb_original (basic_block bb)
{
  struct htab_bb_copy_original_entry *entry;
  struct htab_bb_copy_original_entry key;

  gcc_assert (original_copy_bb_pool);

  key.index1 = bb->index;
1142
  entry = bb_original->find (&key);
1143
  if (entry)
1144
    return BASIC_BLOCK_FOR_FN (cfun, entry->index2);
1145 1146 1147 1148
  else
    return NULL;
}

1149 1150
/* Set copy for basic block.  Do nothing when data structures are not
   initialized so passes not needing this don't need to care.  */
1151 1152 1153
void
set_bb_copy (basic_block bb, basic_block copy)
{
1154
  copy_original_table_set (bb_copy, bb->index, copy->index);
1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166
}

/* Get the copy of basic block.  */
basic_block
get_bb_copy (basic_block bb)
{
  struct htab_bb_copy_original_entry *entry;
  struct htab_bb_copy_original_entry key;

  gcc_assert (original_copy_bb_pool);

  key.index1 = bb->index;
1167
  entry = bb_copy->find (&key);
1168
  if (entry)
1169
    return BASIC_BLOCK_FOR_FN (cfun, entry->index2);
1170 1171 1172
  else
    return NULL;
}
1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196

/* Set copy for LOOP to COPY.  Do nothing when data structures are not
   initialized so passes not needing this don't need to care.  */

void
set_loop_copy (struct loop *loop, struct loop *copy)
{
  if (!copy)
    copy_original_table_clear (loop_copy, loop->num);
  else
    copy_original_table_set (loop_copy, loop->num, copy->num);
}

/* Get the copy of LOOP.  */

struct loop *
get_loop_copy (struct loop *loop)
{
  struct htab_bb_copy_original_entry *entry;
  struct htab_bb_copy_original_entry key;

  gcc_assert (original_copy_bb_pool);

  key.index1 = loop->num;
1197
  entry = loop_copy->find (&key);
1198
  if (entry)
1199
    return get_loop (cfun, entry->index2);
1200 1201 1202
  else
    return NULL;
}