cfg.c 30.6 KB
Newer Older
1
/* Control flow graph manipulation code for GNU compiler.
2
   Copyright (C) 1987-2017 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 "backend.h"
53
#include "hard-reg-set.h"
54 55
#include "tree.h"
#include "cfghooks.h"
56
#include "df.h"
57
#include "cfganal.h"
58
#include "cfgloop.h" /* FIXME: For struct loop.  */
59
#include "dumpfile.h"
60 61

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

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

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

static void
88
free_edge (function *fn, edge e)
89
{
90
  n_edges_for_fn (fn)--;
91
  ggc_free (e);
92 93
}

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

void
97
clear_edges (struct function *fn)
98
{
99
  basic_block bb;
100
  edge e;
101
  edge_iterator ei;
102

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

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

116
  gcc_assert (!n_edges_for_fn (fn));
117 118
}

119
/* Allocate memory for basic_block.  */
120

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

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

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

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

155 156
  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
157

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

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

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

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

181
void
182
expunge_block (basic_block b)
183
{
184
  unlink_block (b);
185
  SET_BASIC_BLOCK_FOR_FN (cfun, b->index, NULL);
186
  n_basic_blocks_for_fn (cfun)--;
187 188 189 190 191
  /* 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.  */
192
}
193

194 195 196 197 198
/* Connect E to E->src.  */

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

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

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

/* 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)
	{
227
	  src->succs->unordered_remove (ei.index);
228
	  df_mark_solutions_dirty ();
229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245
	  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;

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

  /* 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;
252
  df_mark_solutions_dirty ();
253 254
}

255 256 257 258 259
/* 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
260
unchecked_make_edge (basic_block src, basic_block dst, int flags)
261 262
{
  edge e;
263
  e = ggc_cleared_alloc<edge_def> ();
David Malcolm committed
264
  n_edges_for_fn (cfun)++;
265 266 267 268

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

  connect_src (e);
  connect_dest (e);
272

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

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

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

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

297 298 299 300 301 302 303
  /* 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;
    }
304

305
  return NULL;
306 307 308 309 310 311
}

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

edge
312
make_edge (basic_block src, basic_block dest, int flags)
313
{
314 315 316 317 318 319 320 321 322 323
  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);
324 325
}

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

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

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

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

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

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

350
  free_edge (cfun, e);
351 352 353 354 355
}

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

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

360
  disconnect_dest (e);
361

362
  e->dest = new_succ;
363 364

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

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

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

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

377
  e->src = new_pred;
378 379

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

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

389
  FOR_ALL_BB_FN (bb, cfun)
390
    bb->flags &= BB_FLAGS_TO_PRESERVE;
391
}
392

393 394 395 396 397
/* 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.  */
398
static void
399
check_bb_profile (basic_block bb, FILE * file, int indent, dump_flags_t flags)
400 401 402 403
{
  edge e;
  int sum = 0;
  gcov_type lsum;
404
  edge_iterator ei;
405
  struct function *fun = DECL_STRUCT_FUNCTION (current_function_decl);
406 407 408
  char *s_indent = (char *) alloca ((size_t) indent + 1);
  memset ((void *) s_indent, ' ', (size_t) indent);
  s_indent[indent] = '\0';
409

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

413
  if (bb != EXIT_BLOCK_PTR_FOR_FN (fun))
414
    {
415
      bool found = false;
416
      FOR_EACH_EDGE (e, ei, bb->succs)
417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439
	{
	  if (!(e->flags & EDGE_EH))
	    found = true;
	  sum += e->probability;
	}
      /* Only report mismatches for non-EH control flow. If there are only EH
	 edges it means that the BB ends by noreturn call.  Here the control
	 flow may just terminate.  */
      if (found)
	{
	  if (EDGE_COUNT (bb->succs) && abs (sum - REG_BR_PROB_BASE) > 100)
	    fprintf (file, "%s%sInvalid sum of outgoing probabilities %.1f%%\n",
		     (flags & TDF_COMMENT) ? ";; " : "", s_indent,
		     sum * 100.0 / REG_BR_PROB_BASE);
	  lsum = 0;
	  FOR_EACH_EDGE (e, ei, bb->succs)
	    lsum += e->count;
	  if (EDGE_COUNT (bb->succs)
	      && (lsum - bb->count > 100 || lsum - bb->count < -100))
	    fprintf (file, "%s%sInvalid sum of outgoing counts %i, should be %i\n",
		     (flags & TDF_COMMENT) ? ";; " : "", s_indent,
		     (int) lsum, (int) bb->count);
	}
440
    }
441
    if (bb != ENTRY_BLOCK_PTR_FOR_FN (fun))
442 443
    {
      sum = 0;
444
      FOR_EACH_EDGE (e, ei, bb->preds)
445 446 447
	sum += EDGE_FREQUENCY (e);
      if (abs (sum - bb->frequency) > 100)
	fprintf (file,
448 449
		 "%s%sInvalid sum of incoming frequencies %i, should be %i\n",
		 (flags & TDF_COMMENT) ? ";; " : "", s_indent,
450 451
		 sum, bb->frequency);
      lsum = 0;
452
      FOR_EACH_EDGE (e, ei, bb->preds)
453 454
	lsum += e->count;
      if (lsum - bb->count > 100 || lsum - bb->count < -100)
455 456
	fprintf (file, "%s%sInvalid sum of incoming counts %i, should be %i\n",
		 (flags & TDF_COMMENT) ? ";; " : "", s_indent,
457 458
		 (int) lsum, (int) bb->count);
    }
459 460 461 462 463 464 465 466 467 468 469 470 471 472 473
  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);
        }
    }
474 475
}

476
void
477
dump_edge_info (FILE *file, edge e, dump_flags_t flags, int do_succ)
478
{
479
  basic_block side = (do_succ ? e->dest : e->src);
480 481 482 483 484 485
  bool do_details = false;
  
  if ((flags & TDF_DETAILS) != 0
      && (flags & TDF_SLIM) == 0)
    do_details = true;

486
  if (side->index == ENTRY_BLOCK)
487
    fputs (" ENTRY", file);
488
  else if (side->index == EXIT_BLOCK)
489 490
    fputs (" EXIT", file);
  else
491
    fprintf (file, " %d", side->index);
492

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

496
  if (e->count && do_details)
497
    {
498
      fputs (" count:", file);
499
      fprintf (file, "%" PRId64, e->count);
500 501
    }

502
  if (e->flags && do_details)
503
    {
504 505 506 507 508 509 510 511
      static const char * const bitnames[] =
	{
#define DEF_EDGE_FLAG(NAME,IDX) #NAME ,
#include "cfg-flags.def"
	  NULL
#undef DEF_EDGE_FLAG
	};
      bool comma = false;
512
      int i, flags = e->flags;
513

514
      gcc_assert (e->flags <= EDGE_ALL_FLAGS);
515
      fputs (" (", file);
516 517 518 519 520 521 522
      for (i = 0; flags; i++)
	if (flags & (1 << i))
	  {
	    flags &= ~(1 << i);

	    if (comma)
	      fputc (',', file);
523 524
	    fputs (bitnames[i], file);
	    comma = true;
525
	  }
526

527 528 529
      fputc (')', file);
    }
}
530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546

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");
}
547

548
/* Simple routines to easily allocate AUX fields of basic blocks.  */
549

550 551 552 553
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;
554

555
/* Allocate a memory block of SIZE as BB->aux.  The obstack must
556
   be first initialized by alloc_aux_for_blocks.  */
557

558
static void
559
alloc_aux_for_block (basic_block bb, int size)
560
{
561
  /* Verify that aux field is clear.  */
562
  gcc_assert (!bb->aux && first_block_aux_obj);
563 564
  bb->aux = obstack_alloc (&block_aux_obstack, size);
  memset (bb->aux, 0, size);
565 566
}

567 568
/* Initialize the block_aux_obstack and if SIZE is nonzero, call
   alloc_aux_for_block for each basic block.  */
569 570

void
571
alloc_aux_for_blocks (int size)
572
{
573
  static int initialized;
574

575
  if (!initialized)
576
    {
577 578
      gcc_obstack_init (&block_aux_obstack);
      initialized = 1;
579
    }
580 581 582
  else
    /* Check whether AUX data are still allocated.  */
    gcc_assert (!first_block_aux_obj);
Mike Stump committed
583

584
  first_block_aux_obj = obstack_alloc (&block_aux_obstack, 0);
585
  if (size)
586
    {
587
      basic_block bb;
588

589
      FOR_ALL_BB_FN (bb, cfun)
590
	alloc_aux_for_block (bb, size);
591 592
    }
}
593

594
/* Clear AUX pointers of all blocks.  */
595 596

void
597
clear_aux_for_blocks (void)
598
{
599
  basic_block bb;
600

601
  FOR_ALL_BB_FN (bb, cfun)
602
    bb->aux = NULL;
603 604 605 606 607 608
}

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

void
609
free_aux_for_blocks (void)
610
{
611
  gcc_assert (first_block_aux_obj);
612
  obstack_free (&block_aux_obstack, first_block_aux_obj);
613
  first_block_aux_obj = NULL;
614 615

  clear_aux_for_blocks ();
616
}
617

618
/* Allocate a memory edge of SIZE as E->aux.  The obstack must
619
   be first initialized by alloc_aux_for_edges.  */
620

621
void
622
alloc_aux_for_edge (edge e, int size)
623 624
{
  /* Verify that aux field is clear.  */
625
  gcc_assert (!e->aux && first_edge_aux_obj);
626 627 628
  e->aux = obstack_alloc (&edge_aux_obstack, size);
  memset (e->aux, 0, size);
}
629

630 631
/* Initialize the edge_aux_obstack and if SIZE is nonzero, call
   alloc_aux_for_edge for each basic edge.  */
632

633
void
634
alloc_aux_for_edges (int size)
635 636
{
  static int initialized;
637

638 639 640 641
  if (!initialized)
    {
      gcc_obstack_init (&edge_aux_obstack);
      initialized = 1;
642
    }
643 644 645
  else
    /* Check whether AUX data are still allocated.  */
    gcc_assert (!first_edge_aux_obj);
646

647
  first_edge_aux_obj = obstack_alloc (&edge_aux_obstack, 0);
648
  if (size)
649
    {
650 651
      basic_block bb;

652 653
      FOR_BB_BETWEEN (bb, ENTRY_BLOCK_PTR_FOR_FN (cfun),
		      EXIT_BLOCK_PTR_FOR_FN (cfun), next_bb)
654
	{
655
	  edge e;
656
	  edge_iterator ei;
657

658
	  FOR_EACH_EDGE (e, ei, bb->succs)
659
	    alloc_aux_for_edge (e, size);
660 661 662 663
	}
    }
}

664
/* Clear AUX pointers of all edges.  */
665 666

void
667
clear_aux_for_edges (void)
668
{
669 670
  basic_block bb;
  edge e;
671

672 673
  FOR_BB_BETWEEN (bb, ENTRY_BLOCK_PTR_FOR_FN (cfun),
		  EXIT_BLOCK_PTR_FOR_FN (cfun), next_bb)
674
    {
675 676
      edge_iterator ei;
      FOR_EACH_EDGE (e, ei, bb->succs)
677
	e->aux = NULL;
678
    }
679 680 681 682 683 684
}

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

void
685
free_aux_for_edges (void)
686
{
687
  gcc_assert (first_edge_aux_obj);
688
  obstack_free (&edge_aux_obstack, first_edge_aux_obj);
689
  first_edge_aux_obj = NULL;
690 691

  clear_aux_for_edges ();
692
}
693

694
DEBUG_FUNCTION void
695
debug_bb (basic_block bb)
696
{
697
  dump_bb (stderr, bb, 0, dump_flags);
698 699
}

700
DEBUG_FUNCTION basic_block
701
debug_bb_n (int n)
702
{
703
  basic_block bb = BASIC_BLOCK_FOR_FN (cfun, n);
704
  debug_bb (bb);
705
  return bb;
706
}
707

708 709 710 711 712 713
/* 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.  */
714

715
void
716
dump_bb_info (FILE *outf, basic_block bb, int indent, dump_flags_t flags,
717
	      bool do_header, bool do_footer)
718
{
719
  edge_iterator ei;
720
  edge e;
721 722
  static const char * const bb_bitnames[] =
    {
723 724 725 726
#define DEF_BASIC_BLOCK_FLAG(NAME,IDX) #NAME ,
#include "cfg-flags.def"
      NULL
#undef DEF_BASIC_BLOCK_FLAG
727 728
    };
  const unsigned n_bitnames = sizeof (bb_bitnames) / sizeof (char *);
729
  bool first;
730 731 732
  char *s_indent = (char *) alloca ((size_t) indent + 1);
  memset ((void *) s_indent, ' ', (size_t) indent);
  s_indent[indent] = '\0';
733

734 735 736 737 738 739 740 741
  gcc_assert (bb->flags <= BB_ALL_FLAGS);

  if (do_header)
    {
      unsigned i;

      if (flags & TDF_COMMENT)
	fputs (";; ", outf);
742
      fprintf (outf, "%sbasic block %d, loop depth %d",
743
	       s_indent, bb->index, bb_loop_depth (bb));
744 745
      if (flags & TDF_DETAILS)
	{
746
	  struct function *fun = DECL_STRUCT_FUNCTION (current_function_decl);
747
	  fprintf (outf, ", count " "%" PRId64,
748
		   (int64_t) bb->count);
749
	  fprintf (outf, ", freq %i", bb->frequency);
750
	  if (maybe_hot_bb_p (fun, bb))
751
	    fputs (", maybe hot", outf);
752
	  if (probably_never_executed_bb_p (fun, bb))
753 754 755 756 757 758
	    fputs (", probably never executed", outf);
	}
      fputc ('\n', outf);

      if (flags & TDF_DETAILS)
	{
759
	  check_bb_profile (bb, outf, indent, flags);
760 761 762 763 764 765 766 767 768 769 770 771 772 773
	  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);
774
	  first = true;
775 776 777 778 779 780 781 782 783 784 785 786
	  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);
787
	  fputc ('\n', outf);
788 789 790 791 792
	}

      if (flags & TDF_COMMENT)
	fputs (";; ", outf);
      fprintf (outf, "%s pred:      ", s_indent);
793
      first = true;
794
      FOR_EACH_EDGE (e, ei, bb->preds)
795 796 797 798 799 800 801 802 803 804 805
	{
	  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);
	}
806 807
      if (first)
	fputc ('\n', outf);
808 809 810 811 812 813 814
    }

  if (do_footer)
    {
      if (flags & TDF_COMMENT)
	fputs (";; ", outf);
      fprintf (outf, "%s succ:      ", s_indent);
815
      first = true;
816
      FOR_EACH_EDGE (e, ei, bb->succs)
817 818 819 820 821 822 823 824 825 826 827
        {
	  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);
	}
828 829
      if (first)
	fputc ('\n', outf);
830
    }
831 832 833 834 835
}

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

void
836
brief_dump_cfg (FILE *file, dump_flags_t flags)
837 838 839
{
  basic_block bb;

840
  FOR_EACH_BB_FN (bb, cfun)
841
    {
842 843 844
      dump_bb_info (file, bb, 0,
		    flags & (TDF_COMMENT | TDF_DETAILS),
		    true, true);
845 846
    }
}
847 848 849

/* 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
850
   redirected to destination of TAKEN_EDGE.
851 852 853

   This function may leave the profile inconsistent in the case TAKEN_EDGE
   frequency or count is believed to be lower than FREQUENCY or COUNT
854
   respectively.  */
855 856 857 858 859 860
void
update_bb_profile_for_threading (basic_block bb, int edge_frequency,
				 gcov_type count, edge taken_edge)
{
  edge c;
  int prob;
861
  edge_iterator ei;
862 863 864

  bb->count -= count;
  if (bb->count < 0)
865 866 867 868 869 870
    {
      if (dump_file)
	fprintf (dump_file, "bb %i count became negative after threading",
		 bb->index);
      bb->count = 0;
    }
871

872 873 874 875
  bb->frequency -= edge_frequency;
  if (bb->frequency < 0)
    bb->frequency = 0;

876 877 878
  /* Compute the probability of TAKEN_EDGE being reached via threaded edge.
     Watch for overflows.  */
  if (bb->frequency)
879
    prob = GCOV_COMPUTE_SCALE (edge_frequency, bb->frequency);
880 881 882 883 884 885 886 887 888
  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);
889
      prob = taken_edge->probability * 6 / 8;
890 891 892 893 894 895 896 897 898 899 900
    }

  /* Now rescale the probabilities.  */
  taken_edge->probability -= prob;
  prob = REG_BR_PROB_BASE - prob;
  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);
901 902 903 904
      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))
905 906
	c->probability = 0;
    }
907 908
  else if (prob != REG_BR_PROB_BASE)
    {
909
      int scale = RDIV (65536 * REG_BR_PROB_BASE, prob);
910 911

      FOR_EACH_EDGE (c, ei, bb->succs)
912
	{
913 914
	  /* Protect from overflow due to additional scaling.  */
	  if (c->probability > prob)
915
	    c->probability = REG_BR_PROB_BASE;
916 917 918 919 920 921
	  else
	    {
	      c->probability = RDIV (c->probability * scale, 65536);
	      if (c->probability > REG_BR_PROB_BASE)
		c->probability = REG_BR_PROB_BASE;
	    }
922
	}
923
    }
924

925
  gcc_assert (bb == taken_edge->src);
926 927
  taken_edge->count -= count;
  if (taken_edge->count < 0)
928 929 930 931 932 933
    {
      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;
    }
934
}
935 936 937 938 939 940 941 942

/* 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;
943 944
  if (num < 0)
    num = 0;
945 946 947 948 949 950 951 952 953 954 955 956 957

  /* 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)
958
    return;
959

960 961 962
  for (i = 0; i < nbbs; i++)
    {
      edge_iterator ei;
963
      bbs[i]->frequency = RDIV (bbs[i]->frequency * num, den);
964 965 966
      /* Make sure the frequencies do not grow over BB_FREQ_MAX.  */
      if (bbs[i]->frequency > BB_FREQ_MAX)
	bbs[i]->frequency = BB_FREQ_MAX;
967 968
      bbs[i]->count = RDIV (bbs[i]->count * num, den);
      FOR_EACH_EDGE (e, ei, bbs[i]->succs)
969
	e->count = RDIV (e->count * num, den);
970 971 972
    }
}

973 974
/* numbers smaller than this value are safe to multiply without getting
   64bit overflow.  */
975
#define MAX_SAFE_MULTIPLIER (1 << (sizeof (int64_t) * 4 - 1))
976

977 978 979 980
/* 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
981 982
scale_bbs_frequencies_gcov_type (basic_block *bbs, int nbbs, gcov_type num,
				 gcov_type den)
983 984 985
{
  int i;
  edge e;
986
  gcov_type fraction = RDIV (num * 65536, den);
987

988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016
  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);
      }
1017
}
1018

1019
/* Helper types for hash tables.  */
1020 1021 1022 1023 1024 1025 1026 1027 1028

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;
};

1029
struct bb_copy_hasher : nofree_ptr_hash <htab_bb_copy_original_entry>
1030
{
1031 1032 1033
  static inline hashval_t hash (const htab_bb_copy_original_entry *);
  static inline bool equal (const htab_bb_copy_original_entry *existing,
			    const htab_bb_copy_original_entry * candidate);
1034
};
1035

1036
inline hashval_t
1037
bb_copy_hasher::hash (const htab_bb_copy_original_entry *data)
1038
{
1039 1040 1041
  return data->index1;
}

1042
inline bool
1043 1044
bb_copy_hasher::equal (const htab_bb_copy_original_entry *data,
		       const htab_bb_copy_original_entry *data2)
1045
{
1046 1047 1048
  return data->index1 == data2->index1;
}

1049 1050
/* Data structures used to maintain mapping between basic blocks and
   copies.  */
1051 1052
static hash_table<bb_copy_hasher> *bb_original;
static hash_table<bb_copy_hasher> *bb_copy;
1053 1054

/* And between loops and copies.  */
1055
static hash_table<bb_copy_hasher> *loop_copy;
1056
static object_allocator<htab_bb_copy_original_entry> *original_copy_bb_pool;
1057

1058 1059
/* Initialize the data structures to maintain mapping between blocks
   and its copies.  */
1060 1061 1062
void
initialize_original_copy_tables (void)
{
1063
  original_copy_bb_pool = new object_allocator<htab_bb_copy_original_entry>
1064
    ("original_copy");
1065 1066 1067
  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);
1068 1069
}

1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081
/* Reset the data structures to maintain mapping between blocks and
   its copies.  */

void
reset_original_copy_tables (void)
{
  gcc_assert (original_copy_bb_pool);
  bb_original->empty ();
  bb_copy->empty ();
  loop_copy->empty ();
}

1082 1083
/* Free the data structures to maintain mapping between blocks and
   its copies.  */
1084 1085 1086 1087
void
free_original_copy_tables (void)
{
  gcc_assert (original_copy_bb_pool);
1088 1089 1090
  delete bb_copy;
  bb_copy = NULL;
  delete bb_original;
1091
  bb_original = NULL;
1092 1093
  delete loop_copy;
  loop_copy = NULL;
1094
  delete original_copy_bb_pool;
1095 1096 1097
  original_copy_bb_pool = NULL;
}

David Malcolm committed
1098 1099 1100 1101 1102 1103 1104 1105 1106
/* Return true iff we have had a call to initialize_original_copy_tables
   without a corresponding call to free_original_copy_tables.  */

bool
original_copy_tables_initialized_p (void)
{
  return original_copy_bb_pool != NULL;
}

1107 1108 1109
/* Removes the value associated with OBJ from table TAB.  */

static void
1110
copy_original_table_clear (hash_table<bb_copy_hasher> *tab, unsigned obj)
1111
{
1112
  htab_bb_copy_original_entry **slot;
1113 1114 1115 1116 1117 1118
  struct htab_bb_copy_original_entry key, *elt;

  if (!original_copy_bb_pool)
    return;

  key.index1 = obj;
1119
  slot = tab->find_slot (&key, NO_INSERT);
1120 1121 1122
  if (!slot)
    return;

1123
  elt = *slot;
1124
  tab->clear_slot (slot);
1125
  original_copy_bb_pool->remove (elt);
1126 1127 1128 1129 1130 1131
}

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

static void
1132
copy_original_table_set (hash_table<bb_copy_hasher> *tab,
1133
			 unsigned obj, unsigned val)
1134 1135 1136 1137 1138 1139 1140 1141
{
  struct htab_bb_copy_original_entry **slot;
  struct htab_bb_copy_original_entry key;

  if (!original_copy_bb_pool)
    return;

  key.index1 = obj;
1142
  slot = tab->find_slot (&key, INSERT);
1143 1144
  if (!*slot)
    {
1145
      *slot = original_copy_bb_pool->allocate ();
1146 1147 1148 1149 1150
      (*slot)->index1 = obj;
    }
  (*slot)->index2 = val;
}

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

/* 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;
1169
  entry = bb_original->find (&key);
1170
  if (entry)
1171
    return BASIC_BLOCK_FOR_FN (cfun, entry->index2);
1172 1173 1174 1175
  else
    return NULL;
}

1176 1177
/* Set copy for basic block.  Do nothing when data structures are not
   initialized so passes not needing this don't need to care.  */
1178 1179 1180
void
set_bb_copy (basic_block bb, basic_block copy)
{
1181
  copy_original_table_set (bb_copy, bb->index, copy->index);
1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193
}

/* 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;
1194
  entry = bb_copy->find (&key);
1195
  if (entry)
1196
    return BASIC_BLOCK_FOR_FN (cfun, entry->index2);
1197 1198 1199
  else
    return NULL;
}
1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223

/* 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;
1224
  entry = loop_copy->find (&key);
1225
  if (entry)
1226
    return get_loop (cfun, entry->index2);
1227 1228 1229
  else
    return NULL;
}