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 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 with CFG and analyze it.
23 All other modules should not transform the datastructure directly and use
24 abstraction instead. The file is supposed to be ordered bottom-up and should
25 not contain any code depdendent on particular intermediate language (RTL or trees)
27 Available functionality:
28 - Initialization/deallocation
29 init_flow, clear_edges
30 - Low level basic block manipulation
31 alloc_block, expunge_block
33 make_edge, make_single_succ_edge, cached_make_edge, remove_edge
34 - Low level edge redirection (without updating instruction chain)
35 redirect_edge_succ, redirect_edge_succ_nodup, redirect_edge_pred
36 - Dumpipng and debugging
37 dump_flow_info, debug_flow_info, dump_edge_info
38 - Allocation of AUX fields for basic blocks
39 alloc_aux_for_blocks, free_aux_for_blocks, alloc_aux_for_block
46 #include "hard-reg-set.h"
47 #include "basic-block.h"
57 /* The obstack on which the flow graph components are allocated. */
59 struct obstack flow_obstack;
60 static char *flow_firstobj;
62 /* Number of basic blocks in the current function. */
66 /* Number of edges in the current function. */
70 /* First edge in the deleted edges chain. */
72 edge first_deleted_edge;
73 static basic_block first_deleted_block;
75 /* The basic block array. */
77 varray_type basic_block_info;
79 /* The special entry and exit blocks. */
81 struct basic_block_def entry_exit_blocks[2]
89 NULL, /* cond_local_set */
90 NULL, /* global_live_at_start */
91 NULL, /* global_live_at_end */
93 ENTRY_BLOCK, /* index */
102 NULL, /* head_tree */
106 NULL, /* local_set */
107 NULL, /* cond_local_set */
108 NULL, /* global_live_at_start */
109 NULL, /* global_live_at_end */
111 EXIT_BLOCK, /* index */
119 void debug_flow_info PARAMS ((void));
121 /* Called once at intialization time. */
126 static int initialized;
128 first_deleted_edge = 0;
129 first_deleted_block = 0;
134 gcc_obstack_init (&flow_obstack);
135 flow_firstobj = (char *) obstack_alloc (&flow_obstack, 0);
140 obstack_free (&flow_obstack, flow_firstobj);
141 flow_firstobj = (char *) obstack_alloc (&flow_obstack, 0);
145 /* Free the memory associated with the edge structures. */
152 for (i = 0; i < n_basic_blocks; ++i)
154 basic_block bb = BASIC_BLOCK (i);
157 remove_edge (bb->succ);
160 while (ENTRY_BLOCK_PTR->succ)
161 remove_edge (ENTRY_BLOCK_PTR->succ);
167 /* Allocate memory for basic_block. */
174 if (first_deleted_block)
176 bb = first_deleted_block;
177 first_deleted_block = (basic_block) bb->succ;
182 bb = (basic_block) obstack_alloc (&flow_obstack, sizeof (*bb));
183 memset (bb, 0, sizeof (*bb));
188 /* Remove block B from the basic block array and compact behind it. */
194 int i, n = n_basic_blocks;
196 for (i = b->index; i + 1 < n; ++i)
198 basic_block x = BASIC_BLOCK (i + 1);
203 /* Invalidate data to make bughunting easier. */
204 memset (b, 0, sizeof (*b));
206 basic_block_info->num_elements--;
208 b->succ = (edge) first_deleted_block;
209 first_deleted_block = (basic_block) b;
212 /* Create an edge connecting SRC and DST with FLAGS optionally using
213 edge cache CACHE. Return the new edge, NULL if already exist. */
216 cached_make_edge (edge_cache, src, dst, flags)
218 basic_block src, dst;
224 /* Don't bother with edge cache for ENTRY or EXIT; there aren't that
225 many edges to them, and we didn't allocate memory for it. */
226 use_edge_cache = (edge_cache
227 && src != ENTRY_BLOCK_PTR
228 && dst != EXIT_BLOCK_PTR);
230 /* Make sure we don't add duplicate edges. */
231 switch (use_edge_cache)
234 /* Quick test for non-existance of the edge. */
235 if (! TEST_BIT (edge_cache[src->index], dst->index))
238 /* The edge exists; early exit if no work to do. */
244 for (e = src->succ; e; e = e->succ_next)
253 if (first_deleted_edge)
255 e = first_deleted_edge;
256 first_deleted_edge = e->succ_next;
260 e = (edge) obstack_alloc (&flow_obstack, sizeof (*e));
261 memset (e, 0, sizeof (*e));
265 e->succ_next = src->succ;
266 e->pred_next = dst->pred;
275 SET_BIT (edge_cache[src->index], dst->index);
280 /* Create an edge connecting SRC and DEST with flags FLAGS. Return newly
281 created edge or NULL if already exist. */
284 make_edge (src, dest, flags)
285 basic_block src, dest;
288 return cached_make_edge (NULL, src, dest, flags);
291 /* Create an edge connecting SRC to DEST and set probability by knowling
292 that it is the single edge leaving SRC. */
295 make_single_succ_edge (src, dest, flags)
296 basic_block src, dest;
299 edge e = make_edge (src, dest, flags);
301 e->probability = REG_BR_PROB_BASE;
302 e->count = src->count;
306 /* This function will remove an edge from the flow graph. */
312 edge last_pred = NULL;
313 edge last_succ = NULL;
315 basic_block src, dest;
318 for (tmp = src->succ; tmp && tmp != e; tmp = tmp->succ_next)
324 last_succ->succ_next = e->succ_next;
326 src->succ = e->succ_next;
328 for (tmp = dest->pred; tmp && tmp != e; tmp = tmp->pred_next)
334 last_pred->pred_next = e->pred_next;
336 dest->pred = e->pred_next;
339 memset (e, 0, sizeof (*e));
340 e->succ_next = first_deleted_edge;
341 first_deleted_edge = e;
344 /* Redirect an edge's successor from one block to another. */
347 redirect_edge_succ (e, new_succ)
349 basic_block new_succ;
353 /* Disconnect the edge from the old successor block. */
354 for (pe = &e->dest->pred; *pe != e; pe = &(*pe)->pred_next)
356 *pe = (*pe)->pred_next;
358 /* Reconnect the edge to the new successor block. */
359 e->pred_next = new_succ->pred;
364 /* Like previous but avoid possible dupplicate edge. */
367 redirect_edge_succ_nodup (e, new_succ)
369 basic_block new_succ;
372 /* Check whether the edge is already present. */
373 for (s = e->src->succ; s; s = s->succ_next)
374 if (s->dest == new_succ && s != e)
378 s->flags |= e->flags;
379 s->probability += e->probability;
380 s->count += e->count;
385 redirect_edge_succ (e, new_succ);
389 /* Redirect an edge's predecessor from one block to another. */
392 redirect_edge_pred (e, new_pred)
394 basic_block new_pred;
398 /* Disconnect the edge from the old predecessor block. */
399 for (pe = &e->src->succ; *pe != e; pe = &(*pe)->succ_next)
401 *pe = (*pe)->succ_next;
403 /* Reconnect the edge to the new predecessor block. */
404 e->succ_next = new_pred->succ;
410 dump_flow_info (file)
414 static const char * const reg_class_names[] = REG_CLASS_NAMES;
416 fprintf (file, "%d registers.\n", max_regno);
417 for (i = FIRST_PSEUDO_REGISTER; i < max_regno; i++)
420 enum reg_class class, altclass;
421 fprintf (file, "\nRegister %d used %d times across %d insns",
422 i, REG_N_REFS (i), REG_LIVE_LENGTH (i));
423 if (REG_BASIC_BLOCK (i) >= 0)
424 fprintf (file, " in block %d", REG_BASIC_BLOCK (i));
426 fprintf (file, "; set %d time%s", REG_N_SETS (i),
427 (REG_N_SETS (i) == 1) ? "" : "s");
428 if (REG_USERVAR_P (regno_reg_rtx[i]))
429 fprintf (file, "; user var");
430 if (REG_N_DEATHS (i) != 1)
431 fprintf (file, "; dies in %d places", REG_N_DEATHS (i));
432 if (REG_N_CALLS_CROSSED (i) == 1)
433 fprintf (file, "; crosses 1 call");
434 else if (REG_N_CALLS_CROSSED (i))
435 fprintf (file, "; crosses %d calls", REG_N_CALLS_CROSSED (i));
436 if (PSEUDO_REGNO_BYTES (i) != UNITS_PER_WORD)
437 fprintf (file, "; %d bytes", PSEUDO_REGNO_BYTES (i));
438 class = reg_preferred_class (i);
439 altclass = reg_alternate_class (i);
440 if (class != GENERAL_REGS || altclass != ALL_REGS)
442 if (altclass == ALL_REGS || class == ALL_REGS)
443 fprintf (file, "; pref %s", reg_class_names[(int) class]);
444 else if (altclass == NO_REGS)
445 fprintf (file, "; %s or none", reg_class_names[(int) class]);
447 fprintf (file, "; pref %s, else %s",
448 reg_class_names[(int) class],
449 reg_class_names[(int) altclass]);
451 if (REG_POINTER (regno_reg_rtx[i]))
452 fprintf (file, "; pointer");
453 fprintf (file, ".\n");
456 fprintf (file, "\n%d basic blocks, %d edges.\n", n_basic_blocks, n_edges);
457 for (i = 0; i < n_basic_blocks; i++)
459 basic_block bb = BASIC_BLOCK (i);
462 fprintf (file, "\nBasic block %d: first insn %d, last %d, loop_depth %d, count ",
463 i, INSN_UID (bb->head), INSN_UID (bb->end), bb->loop_depth);
464 fprintf (file, HOST_WIDEST_INT_PRINT_DEC, (HOST_WIDEST_INT) bb->count);
465 fprintf (file, ", freq %i.\n", bb->frequency);
467 fprintf (file, "Predecessors: ");
468 for (e = bb->pred; e; e = e->pred_next)
469 dump_edge_info (file, e, 0);
471 fprintf (file, "\nSuccessors: ");
472 for (e = bb->succ; e; e = e->succ_next)
473 dump_edge_info (file, e, 1);
475 fprintf (file, "\nRegisters live at start:");
476 dump_regset (bb->global_live_at_start, file);
478 fprintf (file, "\nRegisters live at end:");
479 dump_regset (bb->global_live_at_end, file);
490 dump_flow_info (stderr);
494 dump_edge_info (file, e, do_succ)
499 basic_block side = (do_succ ? e->dest : e->src);
501 if (side == ENTRY_BLOCK_PTR)
502 fputs (" ENTRY", file);
503 else if (side == EXIT_BLOCK_PTR)
504 fputs (" EXIT", file);
506 fprintf (file, " %d", side->index);
509 fprintf (file, " [%.1f%%] ", e->probability * 100.0 / REG_BR_PROB_BASE);
513 fprintf (file, " count:");
514 fprintf (file, HOST_WIDEST_INT_PRINT_DEC, (HOST_WIDEST_INT) e->count);
519 static const char * const bitnames[] = {
520 "fallthru", "ab", "abcall", "eh", "fake", "dfs_back"
523 int i, flags = e->flags;
527 for (i = 0; flags; i++)
528 if (flags & (1 << i))
534 if (i < (int) ARRAY_SIZE (bitnames))
535 fputs (bitnames[i], file);
537 fprintf (file, "%d", i);
544 /* Simple routies to easilly allocate AUX fields of basic blocks. */
545 static struct obstack block_aux_obstack;
546 static void *first_block_aux_obj = 0;
547 static struct obstack edge_aux_obstack;
548 static void *first_edge_aux_obj = 0;
550 /* Allocate an memory block of SIZE as BB->aux. The obstack must
551 be first initialized by alloc_aux_for_blocks. */
554 alloc_aux_for_block (bb, size)
558 /* Verify that aux field is clear. */
559 if (bb->aux || !first_block_aux_obj)
561 bb->aux = obstack_alloc (&block_aux_obstack, size);
562 memset (bb->aux, 0, size);
565 /* Initialize the block_aux_obstack and if SIZE is nonzero, call
566 alloc_aux_for_block for each basic block. */
569 alloc_aux_for_blocks (size)
572 static int initialized;
576 gcc_obstack_init (&block_aux_obstack);
579 /* Check whether AUX data are still allocated. */
580 else if (first_block_aux_obj)
582 first_block_aux_obj = (char *) obstack_alloc (&block_aux_obstack, 0);
586 for (i = 0; i < n_basic_blocks; i++)
587 alloc_aux_for_block (BASIC_BLOCK (i), size);
588 alloc_aux_for_block (ENTRY_BLOCK_PTR, size);
589 alloc_aux_for_block (EXIT_BLOCK_PTR, size);
593 /* Free data allocated in block_aux_obstack and clear AUX pointers
597 free_aux_for_blocks ()
601 if (!first_block_aux_obj)
603 obstack_free (&block_aux_obstack, first_block_aux_obj);
604 for (i = 0; i < n_basic_blocks; i++)
605 BASIC_BLOCK (i)->aux = NULL;
606 ENTRY_BLOCK_PTR->aux = NULL;
607 EXIT_BLOCK_PTR->aux = NULL;
608 first_block_aux_obj = NULL;
611 /* Allocate an memory edge of SIZE as BB->aux. The obstack must
612 be first initialized by alloc_aux_for_edges. */
615 alloc_aux_for_edge (e, size)
619 /* Verify that aux field is clear. */
620 if (e->aux || !first_edge_aux_obj)
622 e->aux = obstack_alloc (&edge_aux_obstack, size);
623 memset (e->aux, 0, size);
626 /* Initialize the edge_aux_obstack and if SIZE is nonzero, call
627 alloc_aux_for_edge for each basic edge. */
630 alloc_aux_for_edges (size)
633 static int initialized;
637 gcc_obstack_init (&edge_aux_obstack);
640 /* Check whether AUX data are still allocated. */
641 else if (first_edge_aux_obj)
643 first_edge_aux_obj = (char *) obstack_alloc (&edge_aux_obstack, 0);
647 for (i = -1; i < n_basic_blocks; i++)
653 bb = BASIC_BLOCK (i);
655 bb = ENTRY_BLOCK_PTR;
656 for (e = bb->succ; e; e = e->succ_next)
657 alloc_aux_for_edge (e, size);
662 /* Free data allocated in edge_aux_obstack and clear AUX pointers
666 free_aux_for_edges ()
670 if (!first_edge_aux_obj)
672 obstack_free (&edge_aux_obstack, first_edge_aux_obj);
673 for (i = -1; i < n_basic_blocks; i++)
679 bb = BASIC_BLOCK (i);
681 bb = ENTRY_BLOCK_PTR;
682 for (e = bb->succ; e; e = e->succ_next)
685 first_edge_aux_obj = NULL;