cfg.c 23.1 KB
Newer Older
1 2
/* Control flow graph manipulation code for GNU compiler.
   Copyright (C) 1987, 1988, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
3
   1999, 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21

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
Software Foundation; either version 2, or (at your option) any later
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
along with GCC; see the file COPYING.  If not, write to the Free
Software Foundation, 59 Temple Place - Suite 330, Boston, MA
02111-1307, USA.  */

22
/* This file contains low level functions to manipulate the CFG and
23
   analyze it.  All other modules should not transform the data structure
24 25 26
   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).
27 28 29 30

   Available functionality:
     - Initialization/deallocation
	 init_flow, clear_edges
31 32
     - Low level basic block manipulation
	 alloc_block, expunge_block
33
     - Edge manipulation
34
	 make_edge, make_single_succ_edge, cached_make_edge, remove_edge
35 36
	 - Low level edge redirection (without updating instruction chain)
	     redirect_edge_succ, redirect_edge_succ_nodup, redirect_edge_pred
37
     - Dumping and debugging
38 39 40
	 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
41
     - clear_bb_flags
42 43 44 45
     - Consistency checking
	 verify_flow_info
     - Dumping and debugging
	 print_rtl_with_bb, dump_bb, debug_bb, debug_bb_n
46 47 48 49
 */

#include "config.h"
#include "system.h"
50 51
#include "coretypes.h"
#include "tm.h"
52 53 54 55 56 57 58 59 60
#include "tree.h"
#include "rtl.h"
#include "hard-reg-set.h"
#include "regs.h"
#include "flags.h"
#include "output.h"
#include "function.h"
#include "except.h"
#include "toplev.h"
61
#include "tm_p.h"
62
#include "alloc-pool.h"
63 64
#include "timevar.h"
#include "ggc.h"
65 66 67

/* The obstack on which the flow graph components are allocated.  */

68
struct bitmap_obstack reg_obstack;
69 70 71 72 73
struct obstack flow_obstack;
static char *flow_firstobj;

/* Number of basic blocks in the current function.  */

74
int n_basic_blocks;
75

76 77 78 79
/* First free basic block number.  */

int last_basic_block;

80 81 82 83 84 85 86 87 88
/* Number of edges in the current function.  */

int n_edges;

/* The basic block array.  */

varray_type basic_block_info;

/* The special entry and exit blocks.  */
89
basic_block ENTRY_BLOCK_PTR, EXIT_BLOCK_PTR;
90

91 92
/* Memory alloc pool for bb member rbi.  */
alloc_pool rbi_pool;
93

94 95
void debug_flow_info (void);
static void free_edge (edge);
96 97 98

/* Indicate the presence of the profile.  */
enum profile_status profile_status;
99

100
/* Called once at initialization time.  */
101 102

void
103
init_flow (void)
104 105 106
{
  static int initialized;

107 108
  n_edges = 0;

109 110 111
  if (!initialized)
    {
      gcc_obstack_init (&flow_obstack);
112
      flow_firstobj = obstack_alloc (&flow_obstack, 0);
113 114 115 116 117
      initialized = 1;
    }
  else
    {
      obstack_free (&flow_obstack, flow_firstobj);
118
      flow_firstobj = obstack_alloc (&flow_obstack, 0);
119
    }
120 121 122 123 124 125 126

  ENTRY_BLOCK_PTR = ggc_alloc_cleared (sizeof (*ENTRY_BLOCK_PTR));
  ENTRY_BLOCK_PTR->index = ENTRY_BLOCK;
  EXIT_BLOCK_PTR = ggc_alloc_cleared (sizeof (*EXIT_BLOCK_PTR));
  EXIT_BLOCK_PTR->index = EXIT_BLOCK;
  ENTRY_BLOCK_PTR->next_bb = EXIT_BLOCK_PTR;
  EXIT_BLOCK_PTR->prev_bb = ENTRY_BLOCK_PTR;
127 128
}

129 130 131 132
/* Helper function for remove_edge and clear_edges.  Frees edge structure
   without actually unlinking it from the pred/succ lists.  */

static void
133
free_edge (edge e ATTRIBUTE_UNUSED)
134 135
{
  n_edges--;
136
  ggc_free (e);
137 138
}

139 140 141
/* Free the memory associated with the edge structures.  */

void
142
clear_edges (void)
143
{
144
  basic_block bb;
145
  edge e;
146
  edge_iterator ei;
147

148
  FOR_EACH_BB (bb)
149
    {
150 151 152 153
      FOR_EACH_EDGE (e, ei, bb->succs)
	free_edge (e);
      VEC_truncate (edge, bb->succs, 0);
      VEC_truncate (edge, bb->preds, 0);
154
    }
155

156 157 158 159
  FOR_EACH_EDGE (e, ei, ENTRY_BLOCK_PTR->succs)
    free_edge (e);
  VEC_truncate (edge, EXIT_BLOCK_PTR->preds, 0);
  VEC_truncate (edge, ENTRY_BLOCK_PTR->succs, 0);
160

161
  gcc_assert (!n_edges);
162 163
}

164
/* Allocate memory for basic_block.  */
165

166
basic_block
167
alloc_block (void)
168 169
{
  basic_block bb;
170
  bb = ggc_alloc_cleared (sizeof (*bb));
171
  return bb;
172 173
}

174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197
/* Create memory pool for rbi_pool.  */

void
alloc_rbi_pool (void)
{
  rbi_pool = create_alloc_pool ("rbi pool", 
				sizeof (struct reorder_block_def),
				n_basic_blocks + 2);
}

/* Free rbi_pool.  */

void
free_rbi_pool (void)
{
  free_alloc_pool (rbi_pool);
}

/* Initialize rbi (the structure containing data used by basic block
   duplication and reordering) for the given basic block.  */

void
initialize_bb_rbi (basic_block bb)
{
198
  gcc_assert (!bb->rbi);
199 200 201 202
  bb->rbi = pool_alloc (rbi_pool);
  memset (bb->rbi, 0, sizeof (struct reorder_block_def));
}

203 204
/* Link block B to chain after AFTER.  */
void
205
link_block (basic_block b, basic_block after)
206 207 208 209 210 211
{
  b->next_bb = after->next_bb;
  b->prev_bb = after;
  after->next_bb = b;
  b->next_bb->prev_bb = b;
}
212

213 214
/* Unlink block B from chain.  */
void
215
unlink_block (basic_block b)
216 217 218
{
  b->next_bb->prev_bb = b->prev_bb;
  b->prev_bb->next_bb = b->next_bb;
219 220
  b->prev_bb = NULL;
  b->next_bb = NULL;
221
}
222

223 224
/* Sequentially order blocks and compact the arrays.  */
void
225
compact_blocks (void)
226 227 228
{
  int i;
  basic_block bb;
229

230 231 232 233 234 235 236 237
  i = 0;
  FOR_EACH_BB (bb)
    {
      BASIC_BLOCK (i) = bb;
      bb->index = i;
      i++;
    }

238
  gcc_assert (i == n_basic_blocks);
239

240 241 242
  for (; i < last_basic_block; i++)
    BASIC_BLOCK (i) = NULL;

243 244 245 246
  last_basic_block = n_basic_blocks;
}

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

248
void
249
expunge_block (basic_block b)
250
{
251
  unlink_block (b);
252 253
  BASIC_BLOCK (b->index) = NULL;
  n_basic_blocks--;
254 255 256 257 258
  /* 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.  */
259
}
260

261 262 263 264 265
/* 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
266
unchecked_make_edge (basic_block src, basic_block dst, int flags)
267 268
{
  edge e;
269
  e = ggc_alloc_cleared (sizeof (*e));
270 271
  n_edges++;

272 273
  VEC_safe_push (edge, src->succs, e);
  VEC_safe_push (edge, dst->preds, e);
274

275 276 277
  e->src = src;
  e->dest = dst;
  e->flags = flags;
278
  e->dest_idx = EDGE_COUNT (dst->preds) - 1;
279

280 281
  execute_on_growing_pred (e);

282 283 284
  return e;
}

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

288
edge
289
cached_make_edge (sbitmap *edge_cache, basic_block src, basic_block dst, int flags)
290 291 292 293
{
  int use_edge_cache;
  edge e;

294 295
  /* Don't bother with edge cache for ENTRY or EXIT, if there aren't that
     many edges to them, or we didn't allocate memory for it.  */
296
  use_edge_cache = (edge_cache
297
		    && src != ENTRY_BLOCK_PTR && dst != EXIT_BLOCK_PTR);
298 299 300 301 302

  /* Make sure we don't add duplicate edges.  */
  switch (use_edge_cache)
    {
    default:
303
      /* Quick test for non-existence of the edge.  */
304
      if (! TEST_BIT (edge_cache[src->index], dst->index))
305 306 307 308
	break;

      /* The edge exists; early exit if no work to do.  */
      if (flags == 0)
309
	return NULL;
310

311
      /* Fall through.  */
312
    case 0:
313 314 315 316 317 318
      e = find_edge (src, dst);
      if (e)
	{
	  e->flags |= flags;
	  return NULL;
	}
319 320
      break;
    }
321

322
  e = unchecked_make_edge (src, dst, flags);
323 324

  if (use_edge_cache)
325
    SET_BIT (edge_cache[src->index], dst->index);
326 327 328 329 330 331 332 333

  return e;
}

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

edge
334
make_edge (basic_block src, basic_block dest, int flags)
335 336 337 338
{
  return cached_make_edge (NULL, src, dest, flags);
}

339
/* Create an edge connecting SRC to DEST and set probability by knowing
340 341 342
   that it is the single edge leaving SRC.  */

edge
343
make_single_succ_edge (basic_block src, basic_block dest, int flags)
344 345 346 347 348 349
{
  edge e = make_edge (src, dest, flags);

  e->probability = REG_BR_PROB_BASE;
  e->count = src->count;
  return e;
350 351 352 353 354
}

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

void
355
remove_edge (edge e)
356 357 358
{
  edge tmp;
  basic_block src, dest;
359
  unsigned int dest_idx;
360 361
  bool found = false;
  edge_iterator ei;
362

363 364
  execute_on_shrinking_pred (e);

365 366
  src = e->src;
  dest = e->dest;
367
  dest_idx = e->dest_idx;
368

369 370 371 372
  for (ei = ei_start (src->succs); (tmp = ei_safe_edge (ei)); )
    {
      if (tmp == e)
	{
373
	  VEC_unordered_remove (edge, src->succs, ei.index);
374 375 376 377 378 379
	  found = true;
	  break;
	}
      else
	ei_next (&ei);
    }
380

381
  gcc_assert (found);
382

383
  VEC_unordered_remove (edge, dest->preds, dest_idx);
384

385 386 387 388
  /* 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;
389

390
  free_edge (e);
391 392 393 394 395
}

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

void
396
redirect_edge_succ (edge e, basic_block new_succ)
397
{
398 399
  basic_block dest = e->dest;
  unsigned int dest_idx = e->dest_idx;
400

401 402
  execute_on_shrinking_pred (e);

403
  VEC_unordered_remove (edge, dest->preds, dest_idx);
404

405 406 407 408
  /* 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;
409 410

  /* Reconnect the edge to the new successor block.  */
411
  VEC_safe_push (edge, new_succ->preds, e);
412
  e->dest = new_succ;
413
  e->dest_idx = EDGE_COUNT (new_succ->preds) - 1;
414
  execute_on_growing_pred (e);
415 416
}

417
/* Like previous but avoid possible duplicate edge.  */
418 419

edge
420
redirect_edge_succ_nodup (edge e, basic_block new_succ)
421 422
{
  edge s;
423

424 425
  s = find_edge (e->src, new_succ);
  if (s && s != e)
426 427 428
    {
      s->flags |= e->flags;
      s->probability += e->probability;
429 430
      if (s->probability > REG_BR_PROB_BASE)
	s->probability = REG_BR_PROB_BASE;
431 432 433 434 435 436
      s->count += e->count;
      remove_edge (e);
      e = s;
    }
  else
    redirect_edge_succ (e, new_succ);
437

438 439 440 441 442 443
  return e;
}

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

void
444
redirect_edge_pred (edge e, basic_block new_pred)
445
{
446 447 448
  edge tmp;
  edge_iterator ei;
  bool found = false;
449 450

  /* Disconnect the edge from the old predecessor block.  */
451 452 453 454
  for (ei = ei_start (e->src->succs); (tmp = ei_safe_edge (ei)); )
    {
      if (tmp == e)
	{
455
	  VEC_unordered_remove (edge, e->src->succs, ei.index);
456 457 458 459 460 461
	  found = true;
	  break;
	}
      else
	ei_next (&ei);
    }
462

463
  gcc_assert (found);
464 465

  /* Reconnect the edge to the new predecessor block.  */
466
  VEC_safe_push (edge, new_pred->succs, e);
467 468
  e->src = new_pred;
}
469

470
/* Clear all basic block flags, with the exception of partitioning.  */
471
void
472
clear_bb_flags (void)
473
{
474 475 476
  basic_block bb;

  FOR_BB_BETWEEN (bb, ENTRY_BLOCK_PTR, NULL, next_bb)
477
    bb->flags = BB_PARTITION (bb);
478
}
479

480 481 482 483 484 485 486 487 488 489 490
/* 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.  */
void
check_bb_profile (basic_block bb, FILE * file)
{
  edge e;
  int sum = 0;
  gcov_type lsum;
491
  edge_iterator ei;
492 493 494 495 496 497

  if (profile_status == PROFILE_ABSENT)
    return;

  if (bb != EXIT_BLOCK_PTR)
    {
498
      FOR_EACH_EDGE (e, ei, bb->succs)
499
	sum += e->probability;
500
      if (EDGE_COUNT (bb->succs) && abs (sum - REG_BR_PROB_BASE) > 100)
501 502 503
	fprintf (file, "Invalid sum of outgoing probabilities %.1f%%\n",
		 sum * 100.0 / REG_BR_PROB_BASE);
      lsum = 0;
504
      FOR_EACH_EDGE (e, ei, bb->succs)
505
	lsum += e->count;
506 507
      if (EDGE_COUNT (bb->succs)
	  && (lsum - bb->count > 100 || lsum - bb->count < -100))
508 509 510 511 512 513
	fprintf (file, "Invalid sum of outgoing counts %i, should be %i\n",
		 (int) lsum, (int) bb->count);
    }
  if (bb != ENTRY_BLOCK_PTR)
    {
      sum = 0;
514
      FOR_EACH_EDGE (e, ei, bb->preds)
515 516 517
	sum += EDGE_FREQUENCY (e);
      if (abs (sum - bb->frequency) > 100)
	fprintf (file,
518
		 "Invalid sum of incoming frequencies %i, should be %i\n",
519 520
		 sum, bb->frequency);
      lsum = 0;
521
      FOR_EACH_EDGE (e, ei, bb->preds)
522 523
	lsum += e->count;
      if (lsum - bb->count > 100 || lsum - bb->count < -100)
524
	fprintf (file, "Invalid sum of incoming counts %i, should be %i\n",
525 526 527 528
		 (int) lsum, (int) bb->count);
    }
}

529
void
530
dump_flow_info (FILE *file)
531
{
532
  int i;
533
  basic_block bb;
534 535
  static const char * const reg_class_names[] = REG_CLASS_NAMES;

536
  if (reg_n_info)
537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582
    {
      int max_regno = max_reg_num ();
      fprintf (file, "%d registers.\n", max_regno);
      for (i = FIRST_PSEUDO_REGISTER; i < max_regno; i++)
	if (REG_N_REFS (i))
	  {
	    enum reg_class class, altclass;

	    fprintf (file, "\nRegister %d used %d times across %d insns",
		     i, REG_N_REFS (i), REG_LIVE_LENGTH (i));
	    if (REG_BASIC_BLOCK (i) >= 0)
	      fprintf (file, " in block %d", REG_BASIC_BLOCK (i));
	    if (REG_N_SETS (i))
	      fprintf (file, "; set %d time%s", REG_N_SETS (i),
		       (REG_N_SETS (i) == 1) ? "" : "s");
	    if (regno_reg_rtx[i] != NULL && REG_USERVAR_P (regno_reg_rtx[i]))
	      fprintf (file, "; user var");
	    if (REG_N_DEATHS (i) != 1)
	      fprintf (file, "; dies in %d places", REG_N_DEATHS (i));
	    if (REG_N_CALLS_CROSSED (i) == 1)
	      fprintf (file, "; crosses 1 call");
	    else if (REG_N_CALLS_CROSSED (i))
	      fprintf (file, "; crosses %d calls", REG_N_CALLS_CROSSED (i));
	    if (regno_reg_rtx[i] != NULL
		&& PSEUDO_REGNO_BYTES (i) != UNITS_PER_WORD)
	      fprintf (file, "; %d bytes", PSEUDO_REGNO_BYTES (i));

	    class = reg_preferred_class (i);
	    altclass = reg_alternate_class (i);
	    if (class != GENERAL_REGS || altclass != ALL_REGS)
	      {
		if (altclass == ALL_REGS || class == ALL_REGS)
		  fprintf (file, "; pref %s", reg_class_names[(int) class]);
		else if (altclass == NO_REGS)
		  fprintf (file, "; %s or none", reg_class_names[(int) class]);
		else
		  fprintf (file, "; pref %s, else %s",
			   reg_class_names[(int) class],
			   reg_class_names[(int) altclass]);
	      }

	    if (regno_reg_rtx[i] != NULL && REG_POINTER (regno_reg_rtx[i]))
	      fprintf (file, "; pointer");
	    fprintf (file, ".\n");
	  }
    }
583

584
  fprintf (file, "\n%d basic blocks, %d edges.\n", n_basic_blocks, n_edges);
585
  FOR_EACH_BB (bb)
586
    {
587
      edge e;
588
      edge_iterator ei;
589

590
      fprintf (file, "\nBasic block %d ", bb->index);
591 592
      fprintf (file, "prev %d, next %d, ",
	       bb->prev_bb->index, bb->next_bb->index);
593 594
      fprintf (file, "loop_depth %d, count ", bb->loop_depth);
      fprintf (file, HOST_WIDEST_INT_PRINT_DEC, bb->count);
595 596 597 598 599
      fprintf (file, ", freq %i", bb->frequency);
      if (maybe_hot_bb_p (bb))
	fprintf (file, ", maybe hot");
      if (probably_never_executed_bb_p (bb))
	fprintf (file, ", probably never executed");
600
      fprintf (file, ".\n");
601

602
      fprintf (file, "Predecessors: ");
603
      FOR_EACH_EDGE (e, ei, bb->preds)
604
	dump_edge_info (file, e, 0);
605

606
      fprintf (file, "\nSuccessors: ");
607
      FOR_EACH_EDGE (e, ei, bb->succs)
608
	dump_edge_info (file, e, 1);
609

610 611 612 613 614 615 616 617 618 619 620 621 622 623
      if (bb->global_live_at_start)
	{
	  fprintf (file, "\nRegisters live at start:");
	  dump_regset (bb->global_live_at_start, file);
	}

      if (bb->global_live_at_end)
	{
	  fprintf (file, "\nRegisters live at end:");
	  dump_regset (bb->global_live_at_end, file);
	}

      putc ('\n', file);
      check_bb_profile (bb, file);
624 625
    }

626
  putc ('\n', file);
627 628
}

629
void
630
debug_flow_info (void)
631 632 633
{
  dump_flow_info (stderr);
}
634 635

void
636
dump_edge_info (FILE *file, edge e, int do_succ)
637
{
638 639 640 641 642 643 644
  basic_block side = (do_succ ? e->dest : e->src);

  if (side == ENTRY_BLOCK_PTR)
    fputs (" ENTRY", file);
  else if (side == EXIT_BLOCK_PTR)
    fputs (" EXIT", file);
  else
645
    fprintf (file, " %d", side->index);
646 647 648

  if (e->probability)
    fprintf (file, " [%.1f%%] ", e->probability * 100.0 / REG_BR_PROB_BASE);
649

650
  if (e->count)
651
    {
652
      fprintf (file, " count:");
653
      fprintf (file, HOST_WIDEST_INT_PRINT_DEC, e->count);
654 655
    }

656
  if (e->flags)
657
    {
658 659
      static const char * const bitnames[] = {
	"fallthru", "ab", "abcall", "eh", "fake", "dfs_back",
660 661
	"can_fallthru", "irreducible", "sibcall", "loop_exit",
	"true", "false", "exec"
662
      };
663 664
      int comma = 0;
      int i, flags = e->flags;
665

666
      fputs (" (", file);
667 668 669 670 671 672 673 674 675 676 677 678 679
      for (i = 0; flags; i++)
	if (flags & (1 << i))
	  {
	    flags &= ~(1 << i);

	    if (comma)
	      fputc (',', file);
	    if (i < (int) ARRAY_SIZE (bitnames))
	      fputs (bitnames[i], file);
	    else
	      fprintf (file, "%d", i);
	    comma = 1;
	  }
680

681 682 683 684
      fputc (')', file);
    }
}

685
/* Simple routines to easily allocate AUX fields of basic blocks.  */
686

687 688 689 690
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;
691

692
/* Allocate a memory block of SIZE as BB->aux.  The obstack must
693
   be first initialized by alloc_aux_for_blocks.  */
694

695
inline void
696
alloc_aux_for_block (basic_block bb, int size)
697
{
698
  /* Verify that aux field is clear.  */
699
  gcc_assert (!bb->aux && first_block_aux_obj);
700 701
  bb->aux = obstack_alloc (&block_aux_obstack, size);
  memset (bb->aux, 0, size);
702 703
}

704 705
/* Initialize the block_aux_obstack and if SIZE is nonzero, call
   alloc_aux_for_block for each basic block.  */
706 707

void
708
alloc_aux_for_blocks (int size)
709
{
710
  static int initialized;
711

712
  if (!initialized)
713
    {
714 715
      gcc_obstack_init (&block_aux_obstack);
      initialized = 1;
716
    }
717 718 719 720
  else
    /* Check whether AUX data are still allocated.  */
    gcc_assert (!first_block_aux_obj);
  
721
  first_block_aux_obj = obstack_alloc (&block_aux_obstack, 0);
722
  if (size)
723
    {
724
      basic_block bb;
725

726 727
      FOR_BB_BETWEEN (bb, ENTRY_BLOCK_PTR, NULL, next_bb)
	alloc_aux_for_block (bb, size);
728 729
    }
}
730

731
/* Clear AUX pointers of all blocks.  */
732 733

void
734
clear_aux_for_blocks (void)
735
{
736
  basic_block bb;
737

738 739
  FOR_BB_BETWEEN (bb, ENTRY_BLOCK_PTR, NULL, next_bb)
    bb->aux = NULL;
740 741 742 743 744 745
}

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

void
746
free_aux_for_blocks (void)
747
{
748
  gcc_assert (first_block_aux_obj);
749
  obstack_free (&block_aux_obstack, first_block_aux_obj);
750
  first_block_aux_obj = NULL;
751 752

  clear_aux_for_blocks ();
753
}
754

755
/* Allocate a memory edge of SIZE as BB->aux.  The obstack must
756
   be first initialized by alloc_aux_for_edges.  */
757

758
inline void
759
alloc_aux_for_edge (edge e, int size)
760 761
{
  /* Verify that aux field is clear.  */
762
  gcc_assert (!e->aux && first_edge_aux_obj);
763 764 765
  e->aux = obstack_alloc (&edge_aux_obstack, size);
  memset (e->aux, 0, size);
}
766

767 768
/* Initialize the edge_aux_obstack and if SIZE is nonzero, call
   alloc_aux_for_edge for each basic edge.  */
769

770
void
771
alloc_aux_for_edges (int size)
772 773
{
  static int initialized;
774

775 776 777 778
  if (!initialized)
    {
      gcc_obstack_init (&edge_aux_obstack);
      initialized = 1;
779
    }
780 781 782
  else
    /* Check whether AUX data are still allocated.  */
    gcc_assert (!first_edge_aux_obj);
783

784
  first_edge_aux_obj = obstack_alloc (&edge_aux_obstack, 0);
785
  if (size)
786
    {
787 788 789
      basic_block bb;

      FOR_BB_BETWEEN (bb, ENTRY_BLOCK_PTR, EXIT_BLOCK_PTR, next_bb)
790
	{
791
	  edge e;
792
	  edge_iterator ei;
793

794
	  FOR_EACH_EDGE (e, ei, bb->succs)
795
	    alloc_aux_for_edge (e, size);
796 797 798 799
	}
    }
}

800
/* Clear AUX pointers of all edges.  */
801 802

void
803
clear_aux_for_edges (void)
804
{
805 806
  basic_block bb;
  edge e;
807

808
  FOR_BB_BETWEEN (bb, ENTRY_BLOCK_PTR, EXIT_BLOCK_PTR, next_bb)
809
    {
810 811
      edge_iterator ei;
      FOR_EACH_EDGE (e, ei, bb->succs)
812
	e->aux = NULL;
813
    }
814 815 816 817 818 819
}

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

void
820
free_aux_for_edges (void)
821
{
822
  gcc_assert (first_edge_aux_obj);
823
  obstack_free (&edge_aux_obstack, first_edge_aux_obj);
824
  first_edge_aux_obj = NULL;
825 826

  clear_aux_for_edges ();
827
}
828

829
void
830
debug_bb (basic_block bb)
831
{
832
  dump_bb (bb, stderr, 0);
833 834 835
}

basic_block
836
debug_bb_n (int n)
837 838
{
  basic_block bb = BASIC_BLOCK (n);
839
  dump_bb (bb, stderr, 0);
840
  return bb;
841
}
842 843 844 845 846 847 848

/* Dumps cfg related information about basic block BB to FILE.  */

static void
dump_cfg_bb_info (FILE *file, basic_block bb)
{
  unsigned i;
849
  edge_iterator ei;
850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873
  bool first = true;
  static const char * const bb_bitnames[] =
    {
      "dirty", "new", "reachable", "visited", "irreducible_loop", "superblock"
    };
  const unsigned n_bitnames = sizeof (bb_bitnames) / sizeof (char *);
  edge e;

  fprintf (file, "Basic block %d", bb->index);
  for (i = 0; i < n_bitnames; i++)
    if (bb->flags & (1 << i))
      {
	if (first)
	  fprintf (file, " (");
	else
	  fprintf (file, ", ");
	first = false;
	fprintf (file, bb_bitnames[i]);
      }
  if (!first)
    fprintf (file, ")");
  fprintf (file, "\n");

  fprintf (file, "Predecessors: ");
874
  FOR_EACH_EDGE (e, ei, bb->preds)
875 876 877
    dump_edge_info (file, e, 0);

  fprintf (file, "\nSuccessors: ");
878
  FOR_EACH_EDGE (e, ei, bb->succs)
879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894
    dump_edge_info (file, e, 1);
  fprintf (file, "\n\n");
}

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

void
brief_dump_cfg (FILE *file)
{
  basic_block bb;

  FOR_EACH_BB (bb)
    {
      dump_cfg_bb_info (file, bb);
    }
}
895 896 897

/* 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
898
   redirected to destination of TAKEN_EDGE. 
899 900 901

   This function may leave the profile inconsistent in the case TAKEN_EDGE
   frequency or count is believed to be lower than FREQUENCY or COUNT
902
   respectively.  */
903 904 905 906 907 908
void
update_bb_profile_for_threading (basic_block bb, int edge_frequency,
				 gcov_type count, edge taken_edge)
{
  edge c;
  int prob;
909
  edge_iterator ei;
910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942

  bb->count -= count;
  if (bb->count < 0)
    bb->count = 0;

  /* Compute the probability of TAKEN_EDGE being reached via threaded edge.
     Watch for overflows.  */
  if (bb->frequency)
    prob = edge_frequency * REG_BR_PROB_BASE / bb->frequency;
  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);
943 944 945 946
      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))
947 948
	c->probability = 0;
    }
949 950 951 952 953 954 955
  else if (prob != REG_BR_PROB_BASE)
    {
      int scale = REG_BR_PROB_BASE / prob;

      FOR_EACH_EDGE (c, ei, bb->succs)
	c->probability *= scale;
    }
956 957 958 959 960 961 962

  if (bb != taken_edge->src)
    abort ();
  taken_edge->count -= count;
  if (taken_edge->count < 0)
    taken_edge->count = 0;
}