1 /* Control flow graph manipulation code for GNU compiler.
2 Copyright (C) 1987, 1988, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
3 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
5 This file is part of GCC.
7 GCC is free software; you can redistribute it and/or modify it under
8 the terms of the GNU General Public License as published by the Free
9 Software Foundation; either version 2, or (at your option) any later
12 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13 WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING. If not, write to the Free
19 Software Foundation, 59 Temple Place - Suite 330, Boston, MA
22 /* This file contains low level functions to manipulate the CFG and
23 analyze it. All other modules should not transform the datastructure
24 directly and use abstraction instead. The file is supposed to be
25 ordered bottom-up and should not contain any code dependent on a
26 particular intermediate language (RTL or trees).
28 Available functionality:
29 - Initialization/deallocation
30 init_flow, clear_edges
31 - Low level basic block manipulation
32 alloc_block, expunge_block
34 make_edge, make_single_succ_edge, cached_make_edge, remove_edge
35 - Low level edge redirection (without updating instruction chain)
36 redirect_edge_succ, redirect_edge_succ_nodup, redirect_edge_pred
37 - Dumping and debugging
38 dump_flow_info, debug_flow_info, dump_edge_info
39 - Allocation of AUX fields for basic blocks
40 alloc_aux_for_blocks, free_aux_for_blocks, alloc_aux_for_block
48 #include "hard-reg-set.h"
49 #include "basic-block.h"
59 /* The obstack on which the flow graph components are allocated. */
61 struct obstack flow_obstack
;
62 static char *flow_firstobj
;
64 /* Number of basic blocks in the current function. */
68 /* First free basic block number. */
72 /* Number of edges in the current function. */
76 /* First edge in the deleted edges chain. */
78 edge first_deleted_edge
;
79 static basic_block first_deleted_block
;
81 /* The basic block array. */
83 varray_type basic_block_info
;
85 /* The special entry and exit blocks. */
87 struct basic_block_def entry_exit_blocks
[2]
95 NULL
, /* cond_local_set */
96 NULL
, /* global_live_at_start */
97 NULL
, /* global_live_at_end */
99 ENTRY_BLOCK
, /* index */
101 EXIT_BLOCK_PTR
, /* next_bb */
110 NULL
, /* head_tree */
114 NULL
, /* local_set */
115 NULL
, /* cond_local_set */
116 NULL
, /* global_live_at_start */
117 NULL
, /* global_live_at_end */
119 EXIT_BLOCK
, /* index */
120 ENTRY_BLOCK_PTR
, /* prev_bb */
129 void debug_flow_info
PARAMS ((void));
130 static void free_edge
PARAMS ((edge
));
132 /* Called once at initialization time. */
137 static int initialized
;
139 first_deleted_edge
= 0;
140 first_deleted_block
= 0;
145 gcc_obstack_init (&flow_obstack
);
146 flow_firstobj
= (char *) obstack_alloc (&flow_obstack
, 0);
151 obstack_free (&flow_obstack
, flow_firstobj
);
152 flow_firstobj
= (char *) obstack_alloc (&flow_obstack
, 0);
156 /* Helper function for remove_edge and clear_edges. Frees edge structure
157 without actually unlinking it from the pred/succ lists. */
164 memset (e
, 0, sizeof *e
);
165 e
->succ_next
= first_deleted_edge
;
166 first_deleted_edge
= e
;
169 /* Free the memory associated with the edge structures. */
183 edge next
= e
->succ_next
;
193 e
= ENTRY_BLOCK_PTR
->succ
;
196 edge next
= e
->succ_next
;
202 EXIT_BLOCK_PTR
->pred
= NULL
;
203 ENTRY_BLOCK_PTR
->succ
= NULL
;
209 /* Allocate memory for basic_block. */
216 if (first_deleted_block
)
218 bb
= first_deleted_block
;
219 first_deleted_block
= (basic_block
) bb
->succ
;
224 bb
= (basic_block
) obstack_alloc (&flow_obstack
, sizeof *bb
);
225 memset (bb
, 0, sizeof *bb
);
230 /* Link block B to chain after AFTER. */
232 link_block (b
, after
)
233 basic_block b
, after
;
235 b
->next_bb
= after
->next_bb
;
238 b
->next_bb
->prev_bb
= b
;
241 /* Unlink block B from chain. */
246 b
->next_bb
->prev_bb
= b
->prev_bb
;
247 b
->prev_bb
->next_bb
= b
->next_bb
;
250 /* Sequentially order blocks and compact the arrays. */
260 BASIC_BLOCK (i
) = bb
;
265 if (i
!= n_basic_blocks
)
268 last_basic_block
= n_basic_blocks
;
272 /* Remove block B from the basic block array. */
279 BASIC_BLOCK (b
->index
) = NULL
;
282 /* Invalidate data to make bughunting easier. */
283 memset (b
, 0, sizeof *b
);
285 b
->succ
= (edge
) first_deleted_block
;
286 first_deleted_block
= (basic_block
) b
;
289 /* Create an edge connecting SRC and DST with FLAGS optionally using
290 edge cache CACHE. Return the new edge, NULL if already exist. */
293 cached_make_edge (edge_cache
, src
, dst
, flags
)
295 basic_block src
, dst
;
301 /* Don't bother with edge cache for ENTRY or EXIT, if there aren't that
302 many edges to them, or we didn't allocate memory for it. */
303 use_edge_cache
= (edge_cache
304 && src
!= ENTRY_BLOCK_PTR
&& dst
!= EXIT_BLOCK_PTR
);
306 /* Make sure we don't add duplicate edges. */
307 switch (use_edge_cache
)
310 /* Quick test for non-existence of the edge. */
311 if (! TEST_BIT (edge_cache
[src
->index
], dst
->index
))
314 /* The edge exists; early exit if no work to do. */
320 for (e
= src
->succ
; e
; e
= e
->succ_next
)
329 if (first_deleted_edge
)
331 e
= first_deleted_edge
;
332 first_deleted_edge
= e
->succ_next
;
336 e
= (edge
) obstack_alloc (&flow_obstack
, sizeof *e
);
337 memset (e
, 0, sizeof *e
);
341 e
->succ_next
= src
->succ
;
342 e
->pred_next
= dst
->pred
;
351 SET_BIT (edge_cache
[src
->index
], dst
->index
);
356 /* Create an edge connecting SRC and DEST with flags FLAGS. Return newly
357 created edge or NULL if already exist. */
360 make_edge (src
, dest
, flags
)
361 basic_block src
, dest
;
364 return cached_make_edge (NULL
, src
, dest
, flags
);
367 /* Create an edge connecting SRC to DEST and set probability by knowing
368 that it is the single edge leaving SRC. */
371 make_single_succ_edge (src
, dest
, flags
)
372 basic_block src
, dest
;
375 edge e
= make_edge (src
, dest
, flags
);
377 e
->probability
= REG_BR_PROB_BASE
;
378 e
->count
= src
->count
;
382 /* This function will remove an edge from the flow graph. */
388 edge last_pred
= NULL
;
389 edge last_succ
= NULL
;
391 basic_block src
, dest
;
395 for (tmp
= src
->succ
; tmp
&& tmp
!= e
; tmp
= tmp
->succ_next
)
401 last_succ
->succ_next
= e
->succ_next
;
403 src
->succ
= e
->succ_next
;
405 for (tmp
= dest
->pred
; tmp
&& tmp
!= e
; tmp
= tmp
->pred_next
)
411 last_pred
->pred_next
= e
->pred_next
;
413 dest
->pred
= e
->pred_next
;
418 /* Redirect an edge's successor from one block to another. */
421 redirect_edge_succ (e
, new_succ
)
423 basic_block new_succ
;
427 /* Disconnect the edge from the old successor block. */
428 for (pe
= &e
->dest
->pred
; *pe
!= e
; pe
= &(*pe
)->pred_next
)
430 *pe
= (*pe
)->pred_next
;
432 /* Reconnect the edge to the new successor block. */
433 e
->pred_next
= new_succ
->pred
;
438 /* Like previous but avoid possible duplicate edge. */
441 redirect_edge_succ_nodup (e
, new_succ
)
443 basic_block new_succ
;
447 /* Check whether the edge is already present. */
448 for (s
= e
->src
->succ
; s
; s
= s
->succ_next
)
449 if (s
->dest
== new_succ
&& s
!= e
)
454 s
->flags
|= e
->flags
;
455 s
->probability
+= e
->probability
;
456 s
->count
+= e
->count
;
461 redirect_edge_succ (e
, new_succ
);
466 /* Redirect an edge's predecessor from one block to another. */
469 redirect_edge_pred (e
, new_pred
)
471 basic_block new_pred
;
475 /* Disconnect the edge from the old predecessor block. */
476 for (pe
= &e
->src
->succ
; *pe
!= e
; pe
= &(*pe
)->succ_next
)
479 *pe
= (*pe
)->succ_next
;
481 /* Reconnect the edge to the new predecessor block. */
482 e
->succ_next
= new_pred
->succ
;
492 FOR_BB_BETWEEN (bb
, ENTRY_BLOCK_PTR
, NULL
, next_bb
)
497 dump_flow_info (file
)
502 static const char * const reg_class_names
[] = REG_CLASS_NAMES
;
504 fprintf (file
, "%d registers.\n", max_regno
);
505 for (i
= FIRST_PSEUDO_REGISTER
; i
< max_regno
; i
++)
508 enum reg_class
class, altclass
;
510 fprintf (file
, "\nRegister %d used %d times across %d insns",
511 i
, REG_N_REFS (i
), REG_LIVE_LENGTH (i
));
512 if (REG_BASIC_BLOCK (i
) >= 0)
513 fprintf (file
, " in block %d", REG_BASIC_BLOCK (i
));
515 fprintf (file
, "; set %d time%s", REG_N_SETS (i
),
516 (REG_N_SETS (i
) == 1) ? "" : "s");
517 if (regno_reg_rtx
[i
] != NULL
&& REG_USERVAR_P (regno_reg_rtx
[i
]))
518 fprintf (file
, "; user var");
519 if (REG_N_DEATHS (i
) != 1)
520 fprintf (file
, "; dies in %d places", REG_N_DEATHS (i
));
521 if (REG_N_CALLS_CROSSED (i
) == 1)
522 fprintf (file
, "; crosses 1 call");
523 else if (REG_N_CALLS_CROSSED (i
))
524 fprintf (file
, "; crosses %d calls", REG_N_CALLS_CROSSED (i
));
525 if (regno_reg_rtx
[i
] != NULL
526 && PSEUDO_REGNO_BYTES (i
) != UNITS_PER_WORD
)
527 fprintf (file
, "; %d bytes", PSEUDO_REGNO_BYTES (i
));
529 class = reg_preferred_class (i
);
530 altclass
= reg_alternate_class (i
);
531 if (class != GENERAL_REGS
|| altclass
!= ALL_REGS
)
533 if (altclass
== ALL_REGS
|| class == ALL_REGS
)
534 fprintf (file
, "; pref %s", reg_class_names
[(int) class]);
535 else if (altclass
== NO_REGS
)
536 fprintf (file
, "; %s or none", reg_class_names
[(int) class]);
538 fprintf (file
, "; pref %s, else %s",
539 reg_class_names
[(int) class],
540 reg_class_names
[(int) altclass
]);
543 if (regno_reg_rtx
[i
] != NULL
&& REG_POINTER (regno_reg_rtx
[i
]))
544 fprintf (file
, "; pointer");
545 fprintf (file
, ".\n");
548 fprintf (file
, "\n%d basic blocks, %d edges.\n", n_basic_blocks
, n_edges
);
555 fprintf (file
, "\nBasic block %d: first insn %d, last %d, ",
556 bb
->index
, INSN_UID (bb
->head
), INSN_UID (bb
->end
));
557 fprintf (file
, "prev %d, next %d, ",
558 bb
->prev_bb
->index
, bb
->next_bb
->index
);
559 fprintf (file
, "loop_depth %d, count ", bb
->loop_depth
);
560 fprintf (file
, HOST_WIDEST_INT_PRINT_DEC
, bb
->count
);
561 fprintf (file
, ", freq %i", bb
->frequency
);
562 if (maybe_hot_bb_p (bb
))
563 fprintf (file
, ", maybe hot");
564 if (probably_never_executed_bb_p (bb
))
565 fprintf (file
, ", probably never executed");
566 fprintf (file
, ".\n");
568 fprintf (file
, "Predecessors: ");
569 for (e
= bb
->pred
; e
; e
= e
->pred_next
)
570 dump_edge_info (file
, e
, 0);
572 fprintf (file
, "\nSuccessors: ");
573 for (e
= bb
->succ
; e
; e
= e
->succ_next
)
574 dump_edge_info (file
, e
, 1);
576 fprintf (file
, "\nRegisters live at start:");
577 dump_regset (bb
->global_live_at_start
, file
);
579 fprintf (file
, "\nRegisters live at end:");
580 dump_regset (bb
->global_live_at_end
, file
);
584 /* Check the consistency of profile information. We can't do that
585 in verify_flow_info, as the counts may get invalid for incompletely
586 solved graphs, later elliminating of conditionals or roundoff errors.
587 It is still practical to have them reported for debugging of simple
590 for (e
= bb
->succ
; e
; e
= e
->succ_next
)
591 sum
+= e
->probability
;
592 if (bb
->succ
&& abs (sum
- REG_BR_PROB_BASE
) > 100)
593 fprintf (file
, "Invalid sum of outgoing probabilities %.1f%%\n",
594 sum
* 100.0 / REG_BR_PROB_BASE
);
596 for (e
= bb
->pred
; e
; e
= e
->pred_next
)
597 sum
+= EDGE_FREQUENCY (e
);
598 if (abs (sum
- bb
->frequency
) > 100)
600 "Invalid sum of incomming frequencies %i, should be %i\n",
603 for (e
= bb
->pred
; e
; e
= e
->pred_next
)
605 if (lsum
- bb
->count
> 100 || lsum
- bb
->count
< -100)
606 fprintf (file
, "Invalid sum of incomming counts %i, should be %i\n",
607 (int)lsum
, (int)bb
->count
);
609 for (e
= bb
->succ
; e
; e
= e
->succ_next
)
611 if (bb
->succ
&& (lsum
- bb
->count
> 100 || lsum
- bb
->count
< -100))
612 fprintf (file
, "Invalid sum of incomming counts %i, should be %i\n",
613 (int)lsum
, (int)bb
->count
);
622 dump_flow_info (stderr
);
626 dump_edge_info (file
, e
, do_succ
)
631 basic_block side
= (do_succ
? e
->dest
: e
->src
);
633 if (side
== ENTRY_BLOCK_PTR
)
634 fputs (" ENTRY", file
);
635 else if (side
== EXIT_BLOCK_PTR
)
636 fputs (" EXIT", file
);
638 fprintf (file
, " %d", side
->index
);
641 fprintf (file
, " [%.1f%%] ", e
->probability
* 100.0 / REG_BR_PROB_BASE
);
645 fprintf (file
, " count:");
646 fprintf (file
, HOST_WIDEST_INT_PRINT_DEC
, e
->count
);
651 static const char * const bitnames
[]
652 = {"fallthru", "ab", "abcall", "eh", "fake", "dfs_back", "can_fallthru"};
654 int i
, flags
= e
->flags
;
657 for (i
= 0; flags
; i
++)
658 if (flags
& (1 << i
))
664 if (i
< (int) ARRAY_SIZE (bitnames
))
665 fputs (bitnames
[i
], file
);
667 fprintf (file
, "%d", i
);
675 /* Simple routines to easily allocate AUX fields of basic blocks. */
677 static struct obstack block_aux_obstack
;
678 static void *first_block_aux_obj
= 0;
679 static struct obstack edge_aux_obstack
;
680 static void *first_edge_aux_obj
= 0;
682 /* Allocate an memory block of SIZE as BB->aux. The obstack must
683 be first initialized by alloc_aux_for_blocks. */
686 alloc_aux_for_block (bb
, size
)
690 /* Verify that aux field is clear. */
691 if (bb
->aux
|| !first_block_aux_obj
)
693 bb
->aux
= obstack_alloc (&block_aux_obstack
, size
);
694 memset (bb
->aux
, 0, size
);
697 /* Initialize the block_aux_obstack and if SIZE is nonzero, call
698 alloc_aux_for_block for each basic block. */
701 alloc_aux_for_blocks (size
)
704 static int initialized
;
708 gcc_obstack_init (&block_aux_obstack
);
712 /* Check whether AUX data are still allocated. */
713 else if (first_block_aux_obj
)
715 first_block_aux_obj
= (char *) obstack_alloc (&block_aux_obstack
, 0);
720 FOR_BB_BETWEEN (bb
, ENTRY_BLOCK_PTR
, NULL
, next_bb
)
721 alloc_aux_for_block (bb
, size
);
725 /* Clear AUX pointers of all blocks. */
728 clear_aux_for_blocks ()
732 FOR_BB_BETWEEN (bb
, ENTRY_BLOCK_PTR
, NULL
, next_bb
)
736 /* Free data allocated in block_aux_obstack and clear AUX pointers
740 free_aux_for_blocks ()
742 if (!first_block_aux_obj
)
744 obstack_free (&block_aux_obstack
, first_block_aux_obj
);
745 first_block_aux_obj
= NULL
;
747 clear_aux_for_blocks ();
750 /* Allocate an memory edge of SIZE as BB->aux. The obstack must
751 be first initialized by alloc_aux_for_edges. */
754 alloc_aux_for_edge (e
, size
)
758 /* Verify that aux field is clear. */
759 if (e
->aux
|| !first_edge_aux_obj
)
761 e
->aux
= obstack_alloc (&edge_aux_obstack
, size
);
762 memset (e
->aux
, 0, size
);
765 /* Initialize the edge_aux_obstack and if SIZE is nonzero, call
766 alloc_aux_for_edge for each basic edge. */
769 alloc_aux_for_edges (size
)
772 static int initialized
;
776 gcc_obstack_init (&edge_aux_obstack
);
780 /* Check whether AUX data are still allocated. */
781 else if (first_edge_aux_obj
)
784 first_edge_aux_obj
= (char *) obstack_alloc (&edge_aux_obstack
, 0);
789 FOR_BB_BETWEEN (bb
, ENTRY_BLOCK_PTR
, EXIT_BLOCK_PTR
, next_bb
)
793 for (e
= bb
->succ
; e
; e
= e
->succ_next
)
794 alloc_aux_for_edge (e
, size
);
799 /* Clear AUX pointers of all edges. */
802 clear_aux_for_edges ()
807 FOR_BB_BETWEEN (bb
, ENTRY_BLOCK_PTR
, EXIT_BLOCK_PTR
, next_bb
)
809 for (e
= bb
->succ
; e
; e
= e
->succ_next
)
814 /* Free data allocated in edge_aux_obstack and clear AUX pointers
818 free_aux_for_edges ()
820 if (!first_edge_aux_obj
)
822 obstack_free (&edge_aux_obstack
, first_edge_aux_obj
);
823 first_edge_aux_obj
= NULL
;
825 clear_aux_for_edges ();