2010-07-27 Paolo Carlini <paolo.carlini@oracle.com>
[official-gcc/alias-decl.git] / gcc / dominance.c
blob2e5f3ee26a2cdc789ad86a1368e682da4c90127f
1 /* Calculate (post)dominators in slightly super-linear time.
2 Copyright (C) 2000, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
3 Free Software Foundation, Inc.
4 Contributed by Michael Matz (matz@ifh.de).
6 This file is part of GCC.
8 GCC is free software; you can redistribute it and/or modify it
9 under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 3, or (at your option)
11 any later version.
13 GCC is distributed in the hope that it will be useful, but WITHOUT
14 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
15 or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
16 License for more details.
18 You should have received a copy of the GNU General Public License
19 along with GCC; see the file COPYING3. If not see
20 <http://www.gnu.org/licenses/>. */
22 /* This file implements the well known algorithm from Lengauer and Tarjan
23 to compute the dominators in a control flow graph. A basic block D is said
24 to dominate another block X, when all paths from the entry node of the CFG
25 to X go also over D. The dominance relation is a transitive reflexive
26 relation and its minimal transitive reduction is a tree, called the
27 dominator tree. So for each block X besides the entry block exists a
28 block I(X), called the immediate dominator of X, which is the parent of X
29 in the dominator tree.
31 The algorithm computes this dominator tree implicitly by computing for
32 each block its immediate dominator. We use tree balancing and path
33 compression, so it's the O(e*a(e,v)) variant, where a(e,v) is the very
34 slowly growing functional inverse of the Ackerman function. */
36 #include "config.h"
37 #include "system.h"
38 #include "coretypes.h"
39 #include "tm.h"
40 #include "rtl.h"
41 #include "hard-reg-set.h"
42 #include "obstack.h"
43 #include "basic-block.h"
44 #include "diagnostic-core.h"
45 #include "toplev.h"
46 #include "et-forest.h"
47 #include "timevar.h"
48 #include "vecprim.h"
49 #include "pointer-set.h"
50 #include "graphds.h"
51 #include "bitmap.h"
53 /* We name our nodes with integers, beginning with 1. Zero is reserved for
54 'undefined' or 'end of list'. The name of each node is given by the dfs
55 number of the corresponding basic block. Please note, that we include the
56 artificial ENTRY_BLOCK (or EXIT_BLOCK in the post-dom case) in our lists to
57 support multiple entry points. Its dfs number is of course 1. */
59 /* Type of Basic Block aka. TBB */
60 typedef unsigned int TBB;
62 /* We work in a poor-mans object oriented fashion, and carry an instance of
63 this structure through all our 'methods'. It holds various arrays
64 reflecting the (sub)structure of the flowgraph. Most of them are of type
65 TBB and are also indexed by TBB. */
67 struct dom_info
69 /* The parent of a node in the DFS tree. */
70 TBB *dfs_parent;
71 /* For a node x key[x] is roughly the node nearest to the root from which
72 exists a way to x only over nodes behind x. Such a node is also called
73 semidominator. */
74 TBB *key;
75 /* The value in path_min[x] is the node y on the path from x to the root of
76 the tree x is in with the smallest key[y]. */
77 TBB *path_min;
78 /* bucket[x] points to the first node of the set of nodes having x as key. */
79 TBB *bucket;
80 /* And next_bucket[x] points to the next node. */
81 TBB *next_bucket;
82 /* After the algorithm is done, dom[x] contains the immediate dominator
83 of x. */
84 TBB *dom;
86 /* The following few fields implement the structures needed for disjoint
87 sets. */
88 /* set_chain[x] is the next node on the path from x to the representative
89 of the set containing x. If set_chain[x]==0 then x is a root. */
90 TBB *set_chain;
91 /* set_size[x] is the number of elements in the set named by x. */
92 unsigned int *set_size;
93 /* set_child[x] is used for balancing the tree representing a set. It can
94 be understood as the next sibling of x. */
95 TBB *set_child;
97 /* If b is the number of a basic block (BB->index), dfs_order[b] is the
98 number of that node in DFS order counted from 1. This is an index
99 into most of the other arrays in this structure. */
100 TBB *dfs_order;
101 /* If x is the DFS-index of a node which corresponds with a basic block,
102 dfs_to_bb[x] is that basic block. Note, that in our structure there are
103 more nodes that basic blocks, so only dfs_to_bb[dfs_order[bb->index]]==bb
104 is true for every basic block bb, but not the opposite. */
105 basic_block *dfs_to_bb;
107 /* This is the next free DFS number when creating the DFS tree. */
108 unsigned int dfsnum;
109 /* The number of nodes in the DFS tree (==dfsnum-1). */
110 unsigned int nodes;
112 /* Blocks with bits set here have a fake edge to EXIT. These are used
113 to turn a DFS forest into a proper tree. */
114 bitmap fake_exit_edge;
117 static void init_dom_info (struct dom_info *, enum cdi_direction);
118 static void free_dom_info (struct dom_info *);
119 static void calc_dfs_tree_nonrec (struct dom_info *, basic_block, bool);
120 static void calc_dfs_tree (struct dom_info *, bool);
121 static void compress (struct dom_info *, TBB);
122 static TBB eval (struct dom_info *, TBB);
123 static void link_roots (struct dom_info *, TBB, TBB);
124 static void calc_idoms (struct dom_info *, bool);
125 void debug_dominance_info (enum cdi_direction);
126 void debug_dominance_tree (enum cdi_direction, basic_block);
128 /* Helper macro for allocating and initializing an array,
129 for aesthetic reasons. */
130 #define init_ar(var, type, num, content) \
131 do \
133 unsigned int i = 1; /* Catch content == i. */ \
134 if (! (content)) \
135 (var) = XCNEWVEC (type, num); \
136 else \
138 (var) = XNEWVEC (type, (num)); \
139 for (i = 0; i < num; i++) \
140 (var)[i] = (content); \
143 while (0)
145 /* Allocate all needed memory in a pessimistic fashion (so we round up).
146 This initializes the contents of DI, which already must be allocated. */
148 static void
149 init_dom_info (struct dom_info *di, enum cdi_direction dir)
151 /* We need memory for n_basic_blocks nodes. */
152 unsigned int num = n_basic_blocks;
153 init_ar (di->dfs_parent, TBB, num, 0);
154 init_ar (di->path_min, TBB, num, i);
155 init_ar (di->key, TBB, num, i);
156 init_ar (di->dom, TBB, num, 0);
158 init_ar (di->bucket, TBB, num, 0);
159 init_ar (di->next_bucket, TBB, num, 0);
161 init_ar (di->set_chain, TBB, num, 0);
162 init_ar (di->set_size, unsigned int, num, 1);
163 init_ar (di->set_child, TBB, num, 0);
165 init_ar (di->dfs_order, TBB, (unsigned int) last_basic_block + 1, 0);
166 init_ar (di->dfs_to_bb, basic_block, num, 0);
168 di->dfsnum = 1;
169 di->nodes = 0;
171 switch (dir)
173 case CDI_DOMINATORS:
174 di->fake_exit_edge = NULL;
175 break;
176 case CDI_POST_DOMINATORS:
177 di->fake_exit_edge = BITMAP_ALLOC (NULL);
178 break;
179 default:
180 gcc_unreachable ();
181 break;
185 #undef init_ar
187 /* Map dominance calculation type to array index used for various
188 dominance information arrays. This version is simple -- it will need
189 to be modified, obviously, if additional values are added to
190 cdi_direction. */
192 static unsigned int
193 dom_convert_dir_to_idx (enum cdi_direction dir)
195 gcc_assert (dir == CDI_DOMINATORS || dir == CDI_POST_DOMINATORS);
196 return dir - 1;
199 /* Free all allocated memory in DI, but not DI itself. */
201 static void
202 free_dom_info (struct dom_info *di)
204 free (di->dfs_parent);
205 free (di->path_min);
206 free (di->key);
207 free (di->dom);
208 free (di->bucket);
209 free (di->next_bucket);
210 free (di->set_chain);
211 free (di->set_size);
212 free (di->set_child);
213 free (di->dfs_order);
214 free (di->dfs_to_bb);
215 BITMAP_FREE (di->fake_exit_edge);
218 /* The nonrecursive variant of creating a DFS tree. DI is our working
219 structure, BB the starting basic block for this tree and REVERSE
220 is true, if predecessors should be visited instead of successors of a
221 node. After this is done all nodes reachable from BB were visited, have
222 assigned their dfs number and are linked together to form a tree. */
224 static void
225 calc_dfs_tree_nonrec (struct dom_info *di, basic_block bb, bool reverse)
227 /* We call this _only_ if bb is not already visited. */
228 edge e;
229 TBB child_i, my_i = 0;
230 edge_iterator *stack;
231 edge_iterator ei, einext;
232 int sp;
233 /* Start block (ENTRY_BLOCK_PTR for forward problem, EXIT_BLOCK for backward
234 problem). */
235 basic_block en_block;
236 /* Ending block. */
237 basic_block ex_block;
239 stack = XNEWVEC (edge_iterator, n_basic_blocks + 1);
240 sp = 0;
242 /* Initialize our border blocks, and the first edge. */
243 if (reverse)
245 ei = ei_start (bb->preds);
246 en_block = EXIT_BLOCK_PTR;
247 ex_block = ENTRY_BLOCK_PTR;
249 else
251 ei = ei_start (bb->succs);
252 en_block = ENTRY_BLOCK_PTR;
253 ex_block = EXIT_BLOCK_PTR;
256 /* When the stack is empty we break out of this loop. */
257 while (1)
259 basic_block bn;
261 /* This loop traverses edges e in depth first manner, and fills the
262 stack. */
263 while (!ei_end_p (ei))
265 e = ei_edge (ei);
267 /* Deduce from E the current and the next block (BB and BN), and the
268 next edge. */
269 if (reverse)
271 bn = e->src;
273 /* If the next node BN is either already visited or a border
274 block the current edge is useless, and simply overwritten
275 with the next edge out of the current node. */
276 if (bn == ex_block || di->dfs_order[bn->index])
278 ei_next (&ei);
279 continue;
281 bb = e->dest;
282 einext = ei_start (bn->preds);
284 else
286 bn = e->dest;
287 if (bn == ex_block || di->dfs_order[bn->index])
289 ei_next (&ei);
290 continue;
292 bb = e->src;
293 einext = ei_start (bn->succs);
296 gcc_assert (bn != en_block);
298 /* Fill the DFS tree info calculatable _before_ recursing. */
299 if (bb != en_block)
300 my_i = di->dfs_order[bb->index];
301 else
302 my_i = di->dfs_order[last_basic_block];
303 child_i = di->dfs_order[bn->index] = di->dfsnum++;
304 di->dfs_to_bb[child_i] = bn;
305 di->dfs_parent[child_i] = my_i;
307 /* Save the current point in the CFG on the stack, and recurse. */
308 stack[sp++] = ei;
309 ei = einext;
312 if (!sp)
313 break;
314 ei = stack[--sp];
316 /* OK. The edge-list was exhausted, meaning normally we would
317 end the recursion. After returning from the recursive call,
318 there were (may be) other statements which were run after a
319 child node was completely considered by DFS. Here is the
320 point to do it in the non-recursive variant.
321 E.g. The block just completed is in e->dest for forward DFS,
322 the block not yet completed (the parent of the one above)
323 in e->src. This could be used e.g. for computing the number of
324 descendants or the tree depth. */
325 ei_next (&ei);
327 free (stack);
330 /* The main entry for calculating the DFS tree or forest. DI is our working
331 structure and REVERSE is true, if we are interested in the reverse flow
332 graph. In that case the result is not necessarily a tree but a forest,
333 because there may be nodes from which the EXIT_BLOCK is unreachable. */
335 static void
336 calc_dfs_tree (struct dom_info *di, bool reverse)
338 /* The first block is the ENTRY_BLOCK (or EXIT_BLOCK if REVERSE). */
339 basic_block begin = reverse ? EXIT_BLOCK_PTR : ENTRY_BLOCK_PTR;
340 di->dfs_order[last_basic_block] = di->dfsnum;
341 di->dfs_to_bb[di->dfsnum] = begin;
342 di->dfsnum++;
344 calc_dfs_tree_nonrec (di, begin, reverse);
346 if (reverse)
348 /* In the post-dom case we may have nodes without a path to EXIT_BLOCK.
349 They are reverse-unreachable. In the dom-case we disallow such
350 nodes, but in post-dom we have to deal with them.
352 There are two situations in which this occurs. First, noreturn
353 functions. Second, infinite loops. In the first case we need to
354 pretend that there is an edge to the exit block. In the second
355 case, we wind up with a forest. We need to process all noreturn
356 blocks before we know if we've got any infinite loops. */
358 basic_block b;
359 bool saw_unconnected = false;
361 FOR_EACH_BB_REVERSE (b)
363 if (EDGE_COUNT (b->succs) > 0)
365 if (di->dfs_order[b->index] == 0)
366 saw_unconnected = true;
367 continue;
369 bitmap_set_bit (di->fake_exit_edge, b->index);
370 di->dfs_order[b->index] = di->dfsnum;
371 di->dfs_to_bb[di->dfsnum] = b;
372 di->dfs_parent[di->dfsnum] = di->dfs_order[last_basic_block];
373 di->dfsnum++;
374 calc_dfs_tree_nonrec (di, b, reverse);
377 if (saw_unconnected)
379 FOR_EACH_BB_REVERSE (b)
381 if (di->dfs_order[b->index])
382 continue;
383 bitmap_set_bit (di->fake_exit_edge, b->index);
384 di->dfs_order[b->index] = di->dfsnum;
385 di->dfs_to_bb[di->dfsnum] = b;
386 di->dfs_parent[di->dfsnum] = di->dfs_order[last_basic_block];
387 di->dfsnum++;
388 calc_dfs_tree_nonrec (di, b, reverse);
393 di->nodes = di->dfsnum - 1;
395 /* This aborts e.g. when there is _no_ path from ENTRY to EXIT at all. */
396 gcc_assert (di->nodes == (unsigned int) n_basic_blocks - 1);
399 /* Compress the path from V to the root of its set and update path_min at the
400 same time. After compress(di, V) set_chain[V] is the root of the set V is
401 in and path_min[V] is the node with the smallest key[] value on the path
402 from V to that root. */
404 static void
405 compress (struct dom_info *di, TBB v)
407 /* Btw. It's not worth to unrecurse compress() as the depth is usually not
408 greater than 5 even for huge graphs (I've not seen call depth > 4).
409 Also performance wise compress() ranges _far_ behind eval(). */
410 TBB parent = di->set_chain[v];
411 if (di->set_chain[parent])
413 compress (di, parent);
414 if (di->key[di->path_min[parent]] < di->key[di->path_min[v]])
415 di->path_min[v] = di->path_min[parent];
416 di->set_chain[v] = di->set_chain[parent];
420 /* Compress the path from V to the set root of V if needed (when the root has
421 changed since the last call). Returns the node with the smallest key[]
422 value on the path from V to the root. */
424 static inline TBB
425 eval (struct dom_info *di, TBB v)
427 /* The representative of the set V is in, also called root (as the set
428 representation is a tree). */
429 TBB rep = di->set_chain[v];
431 /* V itself is the root. */
432 if (!rep)
433 return di->path_min[v];
435 /* Compress only if necessary. */
436 if (di->set_chain[rep])
438 compress (di, v);
439 rep = di->set_chain[v];
442 if (di->key[di->path_min[rep]] >= di->key[di->path_min[v]])
443 return di->path_min[v];
444 else
445 return di->path_min[rep];
448 /* This essentially merges the two sets of V and W, giving a single set with
449 the new root V. The internal representation of these disjoint sets is a
450 balanced tree. Currently link(V,W) is only used with V being the parent
451 of W. */
453 static void
454 link_roots (struct dom_info *di, TBB v, TBB w)
456 TBB s = w;
458 /* Rebalance the tree. */
459 while (di->key[di->path_min[w]] < di->key[di->path_min[di->set_child[s]]])
461 if (di->set_size[s] + di->set_size[di->set_child[di->set_child[s]]]
462 >= 2 * di->set_size[di->set_child[s]])
464 di->set_chain[di->set_child[s]] = s;
465 di->set_child[s] = di->set_child[di->set_child[s]];
467 else
469 di->set_size[di->set_child[s]] = di->set_size[s];
470 s = di->set_chain[s] = di->set_child[s];
474 di->path_min[s] = di->path_min[w];
475 di->set_size[v] += di->set_size[w];
476 if (di->set_size[v] < 2 * di->set_size[w])
478 TBB tmp = s;
479 s = di->set_child[v];
480 di->set_child[v] = tmp;
483 /* Merge all subtrees. */
484 while (s)
486 di->set_chain[s] = v;
487 s = di->set_child[s];
491 /* This calculates the immediate dominators (or post-dominators if REVERSE is
492 true). DI is our working structure and should hold the DFS forest.
493 On return the immediate dominator to node V is in di->dom[V]. */
495 static void
496 calc_idoms (struct dom_info *di, bool reverse)
498 TBB v, w, k, par;
499 basic_block en_block;
500 edge_iterator ei, einext;
502 if (reverse)
503 en_block = EXIT_BLOCK_PTR;
504 else
505 en_block = ENTRY_BLOCK_PTR;
507 /* Go backwards in DFS order, to first look at the leafs. */
508 v = di->nodes;
509 while (v > 1)
511 basic_block bb = di->dfs_to_bb[v];
512 edge e;
514 par = di->dfs_parent[v];
515 k = v;
517 ei = (reverse) ? ei_start (bb->succs) : ei_start (bb->preds);
519 if (reverse)
521 /* If this block has a fake edge to exit, process that first. */
522 if (bitmap_bit_p (di->fake_exit_edge, bb->index))
524 einext = ei;
525 einext.index = 0;
526 goto do_fake_exit_edge;
530 /* Search all direct predecessors for the smallest node with a path
531 to them. That way we have the smallest node with also a path to
532 us only over nodes behind us. In effect we search for our
533 semidominator. */
534 while (!ei_end_p (ei))
536 TBB k1;
537 basic_block b;
539 e = ei_edge (ei);
540 b = (reverse) ? e->dest : e->src;
541 einext = ei;
542 ei_next (&einext);
544 if (b == en_block)
546 do_fake_exit_edge:
547 k1 = di->dfs_order[last_basic_block];
549 else
550 k1 = di->dfs_order[b->index];
552 /* Call eval() only if really needed. If k1 is above V in DFS tree,
553 then we know, that eval(k1) == k1 and key[k1] == k1. */
554 if (k1 > v)
555 k1 = di->key[eval (di, k1)];
556 if (k1 < k)
557 k = k1;
559 ei = einext;
562 di->key[v] = k;
563 link_roots (di, par, v);
564 di->next_bucket[v] = di->bucket[k];
565 di->bucket[k] = v;
567 /* Transform semidominators into dominators. */
568 for (w = di->bucket[par]; w; w = di->next_bucket[w])
570 k = eval (di, w);
571 if (di->key[k] < di->key[w])
572 di->dom[w] = k;
573 else
574 di->dom[w] = par;
576 /* We don't need to cleanup next_bucket[]. */
577 di->bucket[par] = 0;
578 v--;
581 /* Explicitly define the dominators. */
582 di->dom[1] = 0;
583 for (v = 2; v <= di->nodes; v++)
584 if (di->dom[v] != di->key[v])
585 di->dom[v] = di->dom[di->dom[v]];
588 /* Assign dfs numbers starting from NUM to NODE and its sons. */
590 static void
591 assign_dfs_numbers (struct et_node *node, int *num)
593 struct et_node *son;
595 node->dfs_num_in = (*num)++;
597 if (node->son)
599 assign_dfs_numbers (node->son, num);
600 for (son = node->son->right; son != node->son; son = son->right)
601 assign_dfs_numbers (son, num);
604 node->dfs_num_out = (*num)++;
607 /* Compute the data necessary for fast resolving of dominator queries in a
608 static dominator tree. */
610 static void
611 compute_dom_fast_query (enum cdi_direction dir)
613 int num = 0;
614 basic_block bb;
615 unsigned int dir_index = dom_convert_dir_to_idx (dir);
617 gcc_assert (dom_info_available_p (dir));
619 if (dom_computed[dir_index] == DOM_OK)
620 return;
622 FOR_ALL_BB (bb)
624 if (!bb->dom[dir_index]->father)
625 assign_dfs_numbers (bb->dom[dir_index], &num);
628 dom_computed[dir_index] = DOM_OK;
631 /* The main entry point into this module. DIR is set depending on whether
632 we want to compute dominators or postdominators. */
634 void
635 calculate_dominance_info (enum cdi_direction dir)
637 struct dom_info di;
638 basic_block b;
639 unsigned int dir_index = dom_convert_dir_to_idx (dir);
640 bool reverse = (dir == CDI_POST_DOMINATORS) ? true : false;
642 if (dom_computed[dir_index] == DOM_OK)
643 return;
645 timevar_push (TV_DOMINANCE);
646 if (!dom_info_available_p (dir))
648 gcc_assert (!n_bbs_in_dom_tree[dir_index]);
650 FOR_ALL_BB (b)
652 b->dom[dir_index] = et_new_tree (b);
654 n_bbs_in_dom_tree[dir_index] = n_basic_blocks;
656 init_dom_info (&di, dir);
657 calc_dfs_tree (&di, reverse);
658 calc_idoms (&di, reverse);
660 FOR_EACH_BB (b)
662 TBB d = di.dom[di.dfs_order[b->index]];
664 if (di.dfs_to_bb[d])
665 et_set_father (b->dom[dir_index], di.dfs_to_bb[d]->dom[dir_index]);
668 free_dom_info (&di);
669 dom_computed[dir_index] = DOM_NO_FAST_QUERY;
672 compute_dom_fast_query (dir);
674 timevar_pop (TV_DOMINANCE);
677 /* Free dominance information for direction DIR. */
678 void
679 free_dominance_info (enum cdi_direction dir)
681 basic_block bb;
682 unsigned int dir_index = dom_convert_dir_to_idx (dir);
684 if (!dom_info_available_p (dir))
685 return;
687 FOR_ALL_BB (bb)
689 et_free_tree_force (bb->dom[dir_index]);
690 bb->dom[dir_index] = NULL;
692 et_free_pools ();
694 n_bbs_in_dom_tree[dir_index] = 0;
696 dom_computed[dir_index] = DOM_NONE;
699 /* Return the immediate dominator of basic block BB. */
700 basic_block
701 get_immediate_dominator (enum cdi_direction dir, basic_block bb)
703 unsigned int dir_index = dom_convert_dir_to_idx (dir);
704 struct et_node *node = bb->dom[dir_index];
706 gcc_assert (dom_computed[dir_index]);
708 if (!node->father)
709 return NULL;
711 return (basic_block) node->father->data;
714 /* Set the immediate dominator of the block possibly removing
715 existing edge. NULL can be used to remove any edge. */
716 void
717 set_immediate_dominator (enum cdi_direction dir, basic_block bb,
718 basic_block dominated_by)
720 unsigned int dir_index = dom_convert_dir_to_idx (dir);
721 struct et_node *node = bb->dom[dir_index];
723 gcc_assert (dom_computed[dir_index]);
725 if (node->father)
727 if (node->father->data == dominated_by)
728 return;
729 et_split (node);
732 if (dominated_by)
733 et_set_father (node, dominated_by->dom[dir_index]);
735 if (dom_computed[dir_index] == DOM_OK)
736 dom_computed[dir_index] = DOM_NO_FAST_QUERY;
739 /* Returns the list of basic blocks immediately dominated by BB, in the
740 direction DIR. */
741 VEC (basic_block, heap) *
742 get_dominated_by (enum cdi_direction dir, basic_block bb)
744 unsigned int dir_index = dom_convert_dir_to_idx (dir);
745 struct et_node *node = bb->dom[dir_index], *son = node->son, *ason;
746 VEC (basic_block, heap) *bbs = NULL;
748 gcc_assert (dom_computed[dir_index]);
750 if (!son)
751 return NULL;
753 VEC_safe_push (basic_block, heap, bbs, (basic_block) son->data);
754 for (ason = son->right; ason != son; ason = ason->right)
755 VEC_safe_push (basic_block, heap, bbs, (basic_block) ason->data);
757 return bbs;
760 /* Returns the list of basic blocks that are immediately dominated (in
761 direction DIR) by some block between N_REGION ones stored in REGION,
762 except for blocks in the REGION itself. */
764 VEC (basic_block, heap) *
765 get_dominated_by_region (enum cdi_direction dir, basic_block *region,
766 unsigned n_region)
768 unsigned i;
769 basic_block dom;
770 VEC (basic_block, heap) *doms = NULL;
772 for (i = 0; i < n_region; i++)
773 region[i]->flags |= BB_DUPLICATED;
774 for (i = 0; i < n_region; i++)
775 for (dom = first_dom_son (dir, region[i]);
776 dom;
777 dom = next_dom_son (dir, dom))
778 if (!(dom->flags & BB_DUPLICATED))
779 VEC_safe_push (basic_block, heap, doms, dom);
780 for (i = 0; i < n_region; i++)
781 region[i]->flags &= ~BB_DUPLICATED;
783 return doms;
786 /* Returns the list of basic blocks including BB dominated by BB, in the
787 direction DIR. The vector will be sorted in preorder. */
789 VEC (basic_block, heap) *
790 get_all_dominated_blocks (enum cdi_direction dir, basic_block bb)
792 VEC(basic_block, heap) *bbs = NULL;
793 unsigned i;
795 i = 0;
796 VEC_safe_push (basic_block, heap, bbs, bb);
800 basic_block son;
802 bb = VEC_index (basic_block, bbs, i++);
803 for (son = first_dom_son (dir, bb);
804 son;
805 son = next_dom_son (dir, son))
806 VEC_safe_push (basic_block, heap, bbs, son);
808 while (i < VEC_length (basic_block, bbs));
810 return bbs;
813 /* Redirect all edges pointing to BB to TO. */
814 void
815 redirect_immediate_dominators (enum cdi_direction dir, basic_block bb,
816 basic_block to)
818 unsigned int dir_index = dom_convert_dir_to_idx (dir);
819 struct et_node *bb_node, *to_node, *son;
821 bb_node = bb->dom[dir_index];
822 to_node = to->dom[dir_index];
824 gcc_assert (dom_computed[dir_index]);
826 if (!bb_node->son)
827 return;
829 while (bb_node->son)
831 son = bb_node->son;
833 et_split (son);
834 et_set_father (son, to_node);
837 if (dom_computed[dir_index] == DOM_OK)
838 dom_computed[dir_index] = DOM_NO_FAST_QUERY;
841 /* Find first basic block in the tree dominating both BB1 and BB2. */
842 basic_block
843 nearest_common_dominator (enum cdi_direction dir, basic_block bb1, basic_block bb2)
845 unsigned int dir_index = dom_convert_dir_to_idx (dir);
847 gcc_assert (dom_computed[dir_index]);
849 if (!bb1)
850 return bb2;
851 if (!bb2)
852 return bb1;
854 return (basic_block) et_nca (bb1->dom[dir_index], bb2->dom[dir_index])->data;
858 /* Find the nearest common dominator for the basic blocks in BLOCKS,
859 using dominance direction DIR. */
861 basic_block
862 nearest_common_dominator_for_set (enum cdi_direction dir, bitmap blocks)
864 unsigned i, first;
865 bitmap_iterator bi;
866 basic_block dom;
868 first = bitmap_first_set_bit (blocks);
869 dom = BASIC_BLOCK (first);
870 EXECUTE_IF_SET_IN_BITMAP (blocks, 0, i, bi)
871 if (dom != BASIC_BLOCK (i))
872 dom = nearest_common_dominator (dir, dom, BASIC_BLOCK (i));
874 return dom;
877 /* Given a dominator tree, we can determine whether one thing
878 dominates another in constant time by using two DFS numbers:
880 1. The number for when we visit a node on the way down the tree
881 2. The number for when we visit a node on the way back up the tree
883 You can view these as bounds for the range of dfs numbers the
884 nodes in the subtree of the dominator tree rooted at that node
885 will contain.
887 The dominator tree is always a simple acyclic tree, so there are
888 only three possible relations two nodes in the dominator tree have
889 to each other:
891 1. Node A is above Node B (and thus, Node A dominates node B)
900 In the above case, DFS_Number_In of A will be <= DFS_Number_In of
901 B, and DFS_Number_Out of A will be >= DFS_Number_Out of B. This is
902 because we must hit A in the dominator tree *before* B on the walk
903 down, and we will hit A *after* B on the walk back up
905 2. Node A is below node B (and thus, node B dominates node A)
914 In the above case, DFS_Number_In of A will be >= DFS_Number_In of
915 B, and DFS_Number_Out of A will be <= DFS_Number_Out of B.
917 This is because we must hit A in the dominator tree *after* B on
918 the walk down, and we will hit A *before* B on the walk back up
920 3. Node A and B are siblings (and thus, neither dominates the other)
928 In the above case, DFS_Number_In of A will *always* be <=
929 DFS_Number_In of B, and DFS_Number_Out of A will *always* be <=
930 DFS_Number_Out of B. This is because we will always finish the dfs
931 walk of one of the subtrees before the other, and thus, the dfs
932 numbers for one subtree can't intersect with the range of dfs
933 numbers for the other subtree. If you swap A and B's position in
934 the dominator tree, the comparison changes direction, but the point
935 is that both comparisons will always go the same way if there is no
936 dominance relationship.
938 Thus, it is sufficient to write
940 A_Dominates_B (node A, node B)
942 return DFS_Number_In(A) <= DFS_Number_In(B)
943 && DFS_Number_Out (A) >= DFS_Number_Out(B);
946 A_Dominated_by_B (node A, node B)
948 return DFS_Number_In(A) >= DFS_Number_In(A)
949 && DFS_Number_Out (A) <= DFS_Number_Out(B);
950 } */
952 /* Return TRUE in case BB1 is dominated by BB2. */
953 bool
954 dominated_by_p (enum cdi_direction dir, const_basic_block bb1, const_basic_block bb2)
956 unsigned int dir_index = dom_convert_dir_to_idx (dir);
957 struct et_node *n1 = bb1->dom[dir_index], *n2 = bb2->dom[dir_index];
959 gcc_assert (dom_computed[dir_index]);
961 if (dom_computed[dir_index] == DOM_OK)
962 return (n1->dfs_num_in >= n2->dfs_num_in
963 && n1->dfs_num_out <= n2->dfs_num_out);
965 return et_below (n1, n2);
968 /* Returns the entry dfs number for basic block BB, in the direction DIR. */
970 unsigned
971 bb_dom_dfs_in (enum cdi_direction dir, basic_block bb)
973 unsigned int dir_index = dom_convert_dir_to_idx (dir);
974 struct et_node *n = bb->dom[dir_index];
976 gcc_assert (dom_computed[dir_index] == DOM_OK);
977 return n->dfs_num_in;
980 /* Returns the exit dfs number for basic block BB, in the direction DIR. */
982 unsigned
983 bb_dom_dfs_out (enum cdi_direction dir, basic_block bb)
985 unsigned int dir_index = dom_convert_dir_to_idx (dir);
986 struct et_node *n = bb->dom[dir_index];
988 gcc_assert (dom_computed[dir_index] == DOM_OK);
989 return n->dfs_num_out;
992 /* Verify invariants of dominator structure. */
993 DEBUG_FUNCTION void
994 verify_dominators (enum cdi_direction dir)
996 int err = 0;
997 basic_block bb, imm_bb, imm_bb_correct;
998 struct dom_info di;
999 bool reverse = (dir == CDI_POST_DOMINATORS) ? true : false;
1001 gcc_assert (dom_info_available_p (dir));
1003 init_dom_info (&di, dir);
1004 calc_dfs_tree (&di, reverse);
1005 calc_idoms (&di, reverse);
1007 FOR_EACH_BB (bb)
1009 imm_bb = get_immediate_dominator (dir, bb);
1010 if (!imm_bb)
1012 error ("dominator of %d status unknown", bb->index);
1013 err = 1;
1016 imm_bb_correct = di.dfs_to_bb[di.dom[di.dfs_order[bb->index]]];
1017 if (imm_bb != imm_bb_correct)
1019 error ("dominator of %d should be %d, not %d",
1020 bb->index, imm_bb_correct->index, imm_bb->index);
1021 err = 1;
1025 free_dom_info (&di);
1026 gcc_assert (!err);
1029 /* Determine immediate dominator (or postdominator, according to DIR) of BB,
1030 assuming that dominators of other blocks are correct. We also use it to
1031 recompute the dominators in a restricted area, by iterating it until it
1032 reaches a fixed point. */
1034 basic_block
1035 recompute_dominator (enum cdi_direction dir, basic_block bb)
1037 unsigned int dir_index = dom_convert_dir_to_idx (dir);
1038 basic_block dom_bb = NULL;
1039 edge e;
1040 edge_iterator ei;
1042 gcc_assert (dom_computed[dir_index]);
1044 if (dir == CDI_DOMINATORS)
1046 FOR_EACH_EDGE (e, ei, bb->preds)
1048 if (!dominated_by_p (dir, e->src, bb))
1049 dom_bb = nearest_common_dominator (dir, dom_bb, e->src);
1052 else
1054 FOR_EACH_EDGE (e, ei, bb->succs)
1056 if (!dominated_by_p (dir, e->dest, bb))
1057 dom_bb = nearest_common_dominator (dir, dom_bb, e->dest);
1061 return dom_bb;
1064 /* Use simple heuristics (see iterate_fix_dominators) to determine dominators
1065 of BBS. We assume that all the immediate dominators except for those of the
1066 blocks in BBS are correct. If CONSERVATIVE is true, we also assume that the
1067 currently recorded immediate dominators of blocks in BBS really dominate the
1068 blocks. The basic blocks for that we determine the dominator are removed
1069 from BBS. */
1071 static void
1072 prune_bbs_to_update_dominators (VEC (basic_block, heap) *bbs,
1073 bool conservative)
1075 unsigned i;
1076 bool single;
1077 basic_block bb, dom = NULL;
1078 edge_iterator ei;
1079 edge e;
1081 for (i = 0; VEC_iterate (basic_block, bbs, i, bb);)
1083 if (bb == ENTRY_BLOCK_PTR)
1084 goto succeed;
1086 if (single_pred_p (bb))
1088 set_immediate_dominator (CDI_DOMINATORS, bb, single_pred (bb));
1089 goto succeed;
1092 if (!conservative)
1093 goto fail;
1095 single = true;
1096 dom = NULL;
1097 FOR_EACH_EDGE (e, ei, bb->preds)
1099 if (dominated_by_p (CDI_DOMINATORS, e->src, bb))
1100 continue;
1102 if (!dom)
1103 dom = e->src;
1104 else
1106 single = false;
1107 dom = nearest_common_dominator (CDI_DOMINATORS, dom, e->src);
1111 gcc_assert (dom != NULL);
1112 if (single
1113 || find_edge (dom, bb))
1115 set_immediate_dominator (CDI_DOMINATORS, bb, dom);
1116 goto succeed;
1119 fail:
1120 i++;
1121 continue;
1123 succeed:
1124 VEC_unordered_remove (basic_block, bbs, i);
1128 /* Returns root of the dominance tree in the direction DIR that contains
1129 BB. */
1131 static basic_block
1132 root_of_dom_tree (enum cdi_direction dir, basic_block bb)
1134 return (basic_block) et_root (bb->dom[dom_convert_dir_to_idx (dir)])->data;
1137 /* See the comment in iterate_fix_dominators. Finds the immediate dominators
1138 for the sons of Y, found using the SON and BROTHER arrays representing
1139 the dominance tree of graph G. BBS maps the vertices of G to the basic
1140 blocks. */
1142 static void
1143 determine_dominators_for_sons (struct graph *g, VEC (basic_block, heap) *bbs,
1144 int y, int *son, int *brother)
1146 bitmap gprime;
1147 int i, a, nc;
1148 VEC (int, heap) **sccs;
1149 basic_block bb, dom, ybb;
1150 unsigned si;
1151 edge e;
1152 edge_iterator ei;
1154 if (son[y] == -1)
1155 return;
1156 if (y == (int) VEC_length (basic_block, bbs))
1157 ybb = ENTRY_BLOCK_PTR;
1158 else
1159 ybb = VEC_index (basic_block, bbs, y);
1161 if (brother[son[y]] == -1)
1163 /* Handle the common case Y has just one son specially. */
1164 bb = VEC_index (basic_block, bbs, son[y]);
1165 set_immediate_dominator (CDI_DOMINATORS, bb,
1166 recompute_dominator (CDI_DOMINATORS, bb));
1167 identify_vertices (g, y, son[y]);
1168 return;
1171 gprime = BITMAP_ALLOC (NULL);
1172 for (a = son[y]; a != -1; a = brother[a])
1173 bitmap_set_bit (gprime, a);
1175 nc = graphds_scc (g, gprime);
1176 BITMAP_FREE (gprime);
1178 sccs = XCNEWVEC (VEC (int, heap) *, nc);
1179 for (a = son[y]; a != -1; a = brother[a])
1180 VEC_safe_push (int, heap, sccs[g->vertices[a].component], a);
1182 for (i = nc - 1; i >= 0; i--)
1184 dom = NULL;
1185 for (si = 0; VEC_iterate (int, sccs[i], si, a); si++)
1187 bb = VEC_index (basic_block, bbs, a);
1188 FOR_EACH_EDGE (e, ei, bb->preds)
1190 if (root_of_dom_tree (CDI_DOMINATORS, e->src) != ybb)
1191 continue;
1193 dom = nearest_common_dominator (CDI_DOMINATORS, dom, e->src);
1197 gcc_assert (dom != NULL);
1198 for (si = 0; VEC_iterate (int, sccs[i], si, a); si++)
1200 bb = VEC_index (basic_block, bbs, a);
1201 set_immediate_dominator (CDI_DOMINATORS, bb, dom);
1205 for (i = 0; i < nc; i++)
1206 VEC_free (int, heap, sccs[i]);
1207 free (sccs);
1209 for (a = son[y]; a != -1; a = brother[a])
1210 identify_vertices (g, y, a);
1213 /* Recompute dominance information for basic blocks in the set BBS. The
1214 function assumes that the immediate dominators of all the other blocks
1215 in CFG are correct, and that there are no unreachable blocks.
1217 If CONSERVATIVE is true, we additionally assume that all the ancestors of
1218 a block of BBS in the current dominance tree dominate it. */
1220 void
1221 iterate_fix_dominators (enum cdi_direction dir, VEC (basic_block, heap) *bbs,
1222 bool conservative)
1224 unsigned i;
1225 basic_block bb, dom;
1226 struct graph *g;
1227 int n, y;
1228 size_t dom_i;
1229 edge e;
1230 edge_iterator ei;
1231 struct pointer_map_t *map;
1232 int *parent, *son, *brother;
1233 unsigned int dir_index = dom_convert_dir_to_idx (dir);
1235 /* We only support updating dominators. There are some problems with
1236 updating postdominators (need to add fake edges from infinite loops
1237 and noreturn functions), and since we do not currently use
1238 iterate_fix_dominators for postdominators, any attempt to handle these
1239 problems would be unused, untested, and almost surely buggy. We keep
1240 the DIR argument for consistency with the rest of the dominator analysis
1241 interface. */
1242 gcc_assert (dir == CDI_DOMINATORS);
1243 gcc_assert (dom_computed[dir_index]);
1245 /* The algorithm we use takes inspiration from the following papers, although
1246 the details are quite different from any of them:
1248 [1] G. Ramalingam, T. Reps, An Incremental Algorithm for Maintaining the
1249 Dominator Tree of a Reducible Flowgraph
1250 [2] V. C. Sreedhar, G. R. Gao, Y.-F. Lee: Incremental computation of
1251 dominator trees
1252 [3] K. D. Cooper, T. J. Harvey and K. Kennedy: A Simple, Fast Dominance
1253 Algorithm
1255 First, we use the following heuristics to decrease the size of the BBS
1256 set:
1257 a) if BB has a single predecessor, then its immediate dominator is this
1258 predecessor
1259 additionally, if CONSERVATIVE is true:
1260 b) if all the predecessors of BB except for one (X) are dominated by BB,
1261 then X is the immediate dominator of BB
1262 c) if the nearest common ancestor of the predecessors of BB is X and
1263 X -> BB is an edge in CFG, then X is the immediate dominator of BB
1265 Then, we need to establish the dominance relation among the basic blocks
1266 in BBS. We split the dominance tree by removing the immediate dominator
1267 edges from BBS, creating a forest F. We form a graph G whose vertices
1268 are BBS and ENTRY and X -> Y is an edge of G if there exists an edge
1269 X' -> Y in CFG such that X' belongs to the tree of the dominance forest
1270 whose root is X. We then determine dominance tree of G. Note that
1271 for X, Y in BBS, X dominates Y in CFG if and only if X dominates Y in G.
1272 In this step, we can use arbitrary algorithm to determine dominators.
1273 We decided to prefer the algorithm [3] to the algorithm of
1274 Lengauer and Tarjan, since the set BBS is usually small (rarely exceeding
1275 10 during gcc bootstrap), and [3] should perform better in this case.
1277 Finally, we need to determine the immediate dominators for the basic
1278 blocks of BBS. If the immediate dominator of X in G is Y, then
1279 the immediate dominator of X in CFG belongs to the tree of F rooted in
1280 Y. We process the dominator tree T of G recursively, starting from leaves.
1281 Suppose that X_1, X_2, ..., X_k are the sons of Y in T, and that the
1282 subtrees of the dominance tree of CFG rooted in X_i are already correct.
1283 Let G' be the subgraph of G induced by {X_1, X_2, ..., X_k}. We make
1284 the following observations:
1285 (i) the immediate dominator of all blocks in a strongly connected
1286 component of G' is the same
1287 (ii) if X has no predecessors in G', then the immediate dominator of X
1288 is the nearest common ancestor of the predecessors of X in the
1289 subtree of F rooted in Y
1290 Therefore, it suffices to find the topological ordering of G', and
1291 process the nodes X_i in this order using the rules (i) and (ii).
1292 Then, we contract all the nodes X_i with Y in G, so that the further
1293 steps work correctly. */
1295 if (!conservative)
1297 /* Split the tree now. If the idoms of blocks in BBS are not
1298 conservatively correct, setting the dominators using the
1299 heuristics in prune_bbs_to_update_dominators could
1300 create cycles in the dominance "tree", and cause ICE. */
1301 for (i = 0; VEC_iterate (basic_block, bbs, i, bb); i++)
1302 set_immediate_dominator (CDI_DOMINATORS, bb, NULL);
1305 prune_bbs_to_update_dominators (bbs, conservative);
1306 n = VEC_length (basic_block, bbs);
1308 if (n == 0)
1309 return;
1311 if (n == 1)
1313 bb = VEC_index (basic_block, bbs, 0);
1314 set_immediate_dominator (CDI_DOMINATORS, bb,
1315 recompute_dominator (CDI_DOMINATORS, bb));
1316 return;
1319 /* Construct the graph G. */
1320 map = pointer_map_create ();
1321 for (i = 0; VEC_iterate (basic_block, bbs, i, bb); i++)
1323 /* If the dominance tree is conservatively correct, split it now. */
1324 if (conservative)
1325 set_immediate_dominator (CDI_DOMINATORS, bb, NULL);
1326 *pointer_map_insert (map, bb) = (void *) (size_t) i;
1328 *pointer_map_insert (map, ENTRY_BLOCK_PTR) = (void *) (size_t) n;
1330 g = new_graph (n + 1);
1331 for (y = 0; y < g->n_vertices; y++)
1332 g->vertices[y].data = BITMAP_ALLOC (NULL);
1333 for (i = 0; VEC_iterate (basic_block, bbs, i, bb); i++)
1335 FOR_EACH_EDGE (e, ei, bb->preds)
1337 dom = root_of_dom_tree (CDI_DOMINATORS, e->src);
1338 if (dom == bb)
1339 continue;
1341 dom_i = (size_t) *pointer_map_contains (map, dom);
1343 /* Do not include parallel edges to G. */
1344 if (bitmap_bit_p ((bitmap) g->vertices[dom_i].data, i))
1345 continue;
1347 bitmap_set_bit ((bitmap) g->vertices[dom_i].data, i);
1348 add_edge (g, dom_i, i);
1351 for (y = 0; y < g->n_vertices; y++)
1352 BITMAP_FREE (g->vertices[y].data);
1353 pointer_map_destroy (map);
1355 /* Find the dominator tree of G. */
1356 son = XNEWVEC (int, n + 1);
1357 brother = XNEWVEC (int, n + 1);
1358 parent = XNEWVEC (int, n + 1);
1359 graphds_domtree (g, n, parent, son, brother);
1361 /* Finally, traverse the tree and find the immediate dominators. */
1362 for (y = n; son[y] != -1; y = son[y])
1363 continue;
1364 while (y != -1)
1366 determine_dominators_for_sons (g, bbs, y, son, brother);
1368 if (brother[y] != -1)
1370 y = brother[y];
1371 while (son[y] != -1)
1372 y = son[y];
1374 else
1375 y = parent[y];
1378 free (son);
1379 free (brother);
1380 free (parent);
1382 free_graph (g);
1385 void
1386 add_to_dominance_info (enum cdi_direction dir, basic_block bb)
1388 unsigned int dir_index = dom_convert_dir_to_idx (dir);
1390 gcc_assert (dom_computed[dir_index]);
1391 gcc_assert (!bb->dom[dir_index]);
1393 n_bbs_in_dom_tree[dir_index]++;
1395 bb->dom[dir_index] = et_new_tree (bb);
1397 if (dom_computed[dir_index] == DOM_OK)
1398 dom_computed[dir_index] = DOM_NO_FAST_QUERY;
1401 void
1402 delete_from_dominance_info (enum cdi_direction dir, basic_block bb)
1404 unsigned int dir_index = dom_convert_dir_to_idx (dir);
1406 gcc_assert (dom_computed[dir_index]);
1408 et_free_tree (bb->dom[dir_index]);
1409 bb->dom[dir_index] = NULL;
1410 n_bbs_in_dom_tree[dir_index]--;
1412 if (dom_computed[dir_index] == DOM_OK)
1413 dom_computed[dir_index] = DOM_NO_FAST_QUERY;
1416 /* Returns the first son of BB in the dominator or postdominator tree
1417 as determined by DIR. */
1419 basic_block
1420 first_dom_son (enum cdi_direction dir, basic_block bb)
1422 unsigned int dir_index = dom_convert_dir_to_idx (dir);
1423 struct et_node *son = bb->dom[dir_index]->son;
1425 return (basic_block) (son ? son->data : NULL);
1428 /* Returns the next dominance son after BB in the dominator or postdominator
1429 tree as determined by DIR, or NULL if it was the last one. */
1431 basic_block
1432 next_dom_son (enum cdi_direction dir, basic_block bb)
1434 unsigned int dir_index = dom_convert_dir_to_idx (dir);
1435 struct et_node *next = bb->dom[dir_index]->right;
1437 return (basic_block) (next->father->son == next ? NULL : next->data);
1440 /* Return dominance availability for dominance info DIR. */
1442 enum dom_state
1443 dom_info_state (enum cdi_direction dir)
1445 unsigned int dir_index = dom_convert_dir_to_idx (dir);
1447 return dom_computed[dir_index];
1450 /* Set the dominance availability for dominance info DIR to NEW_STATE. */
1452 void
1453 set_dom_info_availability (enum cdi_direction dir, enum dom_state new_state)
1455 unsigned int dir_index = dom_convert_dir_to_idx (dir);
1457 dom_computed[dir_index] = new_state;
1460 /* Returns true if dominance information for direction DIR is available. */
1462 bool
1463 dom_info_available_p (enum cdi_direction dir)
1465 unsigned int dir_index = dom_convert_dir_to_idx (dir);
1467 return dom_computed[dir_index] != DOM_NONE;
1470 DEBUG_FUNCTION void
1471 debug_dominance_info (enum cdi_direction dir)
1473 basic_block bb, bb2;
1474 FOR_EACH_BB (bb)
1475 if ((bb2 = get_immediate_dominator (dir, bb)))
1476 fprintf (stderr, "%i %i\n", bb->index, bb2->index);
1479 /* Prints to stderr representation of the dominance tree (for direction DIR)
1480 rooted in ROOT, indented by INDENT tabulators. If INDENT_FIRST is false,
1481 the first line of the output is not indented. */
1483 static void
1484 debug_dominance_tree_1 (enum cdi_direction dir, basic_block root,
1485 unsigned indent, bool indent_first)
1487 basic_block son;
1488 unsigned i;
1489 bool first = true;
1491 if (indent_first)
1492 for (i = 0; i < indent; i++)
1493 fprintf (stderr, "\t");
1494 fprintf (stderr, "%d\t", root->index);
1496 for (son = first_dom_son (dir, root);
1497 son;
1498 son = next_dom_son (dir, son))
1500 debug_dominance_tree_1 (dir, son, indent + 1, !first);
1501 first = false;
1504 if (first)
1505 fprintf (stderr, "\n");
1508 /* Prints to stderr representation of the dominance tree (for direction DIR)
1509 rooted in ROOT. */
1511 DEBUG_FUNCTION void
1512 debug_dominance_tree (enum cdi_direction dir, basic_block root)
1514 debug_dominance_tree_1 (dir, root, 0, false);