1 /* Calculate (post)dominators in slightly super-linear time.
2 Copyright (C) 2000-2015 Free Software Foundation, Inc.
3 Contributed by Michael Matz (matz@ifh.de).
5 This file is part of GCC.
7 GCC is free software; you can redistribute it and/or modify it
8 under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 3, or (at your option)
12 GCC is distributed in the hope that it will be useful, but WITHOUT
13 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
14 or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
15 License for more details.
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING3. If not see
19 <http://www.gnu.org/licenses/>. */
21 /* This file implements the well known algorithm from Lengauer and Tarjan
22 to compute the dominators in a control flow graph. A basic block D is said
23 to dominate another block X, when all paths from the entry node of the CFG
24 to X go also over D. The dominance relation is a transitive reflexive
25 relation and its minimal transitive reduction is a tree, called the
26 dominator tree. So for each block X besides the entry block exists a
27 block I(X), called the immediate dominator of X, which is the parent of X
28 in the dominator tree.
30 The algorithm computes this dominator tree implicitly by computing for
31 each block its immediate dominator. We use tree balancing and path
32 compression, so it's the O(e*a(e,v)) variant, where a(e,v) is the very
33 slowly growing functional inverse of the Ackerman function. */
37 #include "coretypes.h"
40 #include "hard-reg-set.h"
49 #include "dominance.h"
52 #include "basic-block.h"
53 #include "diagnostic-core.h"
54 #include "et-forest.h"
60 /* We name our nodes with integers, beginning with 1. Zero is reserved for
61 'undefined' or 'end of list'. The name of each node is given by the dfs
62 number of the corresponding basic block. Please note, that we include the
63 artificial ENTRY_BLOCK (or EXIT_BLOCK in the post-dom case) in our lists to
64 support multiple entry points. Its dfs number is of course 1. */
66 /* Type of Basic Block aka. TBB */
67 typedef unsigned int TBB
;
69 /* We work in a poor-mans object oriented fashion, and carry an instance of
70 this structure through all our 'methods'. It holds various arrays
71 reflecting the (sub)structure of the flowgraph. Most of them are of type
72 TBB and are also indexed by TBB. */
76 /* The parent of a node in the DFS tree. */
78 /* For a node x key[x] is roughly the node nearest to the root from which
79 exists a way to x only over nodes behind x. Such a node is also called
82 /* The value in path_min[x] is the node y on the path from x to the root of
83 the tree x is in with the smallest key[y]. */
85 /* bucket[x] points to the first node of the set of nodes having x as key. */
87 /* And next_bucket[x] points to the next node. */
89 /* After the algorithm is done, dom[x] contains the immediate dominator
93 /* The following few fields implement the structures needed for disjoint
95 /* set_chain[x] is the next node on the path from x to the representative
96 of the set containing x. If set_chain[x]==0 then x is a root. */
98 /* set_size[x] is the number of elements in the set named by x. */
99 unsigned int *set_size
;
100 /* set_child[x] is used for balancing the tree representing a set. It can
101 be understood as the next sibling of x. */
104 /* If b is the number of a basic block (BB->index), dfs_order[b] is the
105 number of that node in DFS order counted from 1. This is an index
106 into most of the other arrays in this structure. */
108 /* If x is the DFS-index of a node which corresponds with a basic block,
109 dfs_to_bb[x] is that basic block. Note, that in our structure there are
110 more nodes that basic blocks, so only dfs_to_bb[dfs_order[bb->index]]==bb
111 is true for every basic block bb, but not the opposite. */
112 basic_block
*dfs_to_bb
;
114 /* This is the next free DFS number when creating the DFS tree. */
116 /* The number of nodes in the DFS tree (==dfsnum-1). */
119 /* Blocks with bits set here have a fake edge to EXIT. These are used
120 to turn a DFS forest into a proper tree. */
121 bitmap fake_exit_edge
;
124 static void init_dom_info (struct dom_info
*, enum cdi_direction
);
125 static void free_dom_info (struct dom_info
*);
126 static void calc_dfs_tree_nonrec (struct dom_info
*, basic_block
, bool);
127 static void calc_dfs_tree (struct dom_info
*, bool);
128 static void compress (struct dom_info
*, TBB
);
129 static TBB
eval (struct dom_info
*, TBB
);
130 static void link_roots (struct dom_info
*, TBB
, TBB
);
131 static void calc_idoms (struct dom_info
*, bool);
132 void debug_dominance_info (enum cdi_direction
);
133 void debug_dominance_tree (enum cdi_direction
, basic_block
);
135 /* Helper macro for allocating and initializing an array,
136 for aesthetic reasons. */
137 #define init_ar(var, type, num, content) \
140 unsigned int i = 1; /* Catch content == i. */ \
142 (var) = XCNEWVEC (type, num); \
145 (var) = XNEWVEC (type, (num)); \
146 for (i = 0; i < num; i++) \
147 (var)[i] = (content); \
152 /* Allocate all needed memory in a pessimistic fashion (so we round up).
153 This initializes the contents of DI, which already must be allocated. */
156 init_dom_info (struct dom_info
*di
, enum cdi_direction dir
)
158 /* We need memory for n_basic_blocks nodes. */
159 unsigned int num
= n_basic_blocks_for_fn (cfun
);
160 init_ar (di
->dfs_parent
, TBB
, num
, 0);
161 init_ar (di
->path_min
, TBB
, num
, i
);
162 init_ar (di
->key
, TBB
, num
, i
);
163 init_ar (di
->dom
, TBB
, num
, 0);
165 init_ar (di
->bucket
, TBB
, num
, 0);
166 init_ar (di
->next_bucket
, TBB
, num
, 0);
168 init_ar (di
->set_chain
, TBB
, num
, 0);
169 init_ar (di
->set_size
, unsigned int, num
, 1);
170 init_ar (di
->set_child
, TBB
, num
, 0);
172 init_ar (di
->dfs_order
, TBB
,
173 (unsigned int) last_basic_block_for_fn (cfun
) + 1, 0);
174 init_ar (di
->dfs_to_bb
, basic_block
, num
, 0);
182 di
->fake_exit_edge
= NULL
;
184 case CDI_POST_DOMINATORS
:
185 di
->fake_exit_edge
= BITMAP_ALLOC (NULL
);
195 /* Map dominance calculation type to array index used for various
196 dominance information arrays. This version is simple -- it will need
197 to be modified, obviously, if additional values are added to
201 dom_convert_dir_to_idx (enum cdi_direction dir
)
203 gcc_checking_assert (dir
== CDI_DOMINATORS
|| dir
== CDI_POST_DOMINATORS
);
207 /* Free all allocated memory in DI, but not DI itself. */
210 free_dom_info (struct dom_info
*di
)
212 free (di
->dfs_parent
);
217 free (di
->next_bucket
);
218 free (di
->set_chain
);
220 free (di
->set_child
);
221 free (di
->dfs_order
);
222 free (di
->dfs_to_bb
);
223 BITMAP_FREE (di
->fake_exit_edge
);
226 /* The nonrecursive variant of creating a DFS tree. DI is our working
227 structure, BB the starting basic block for this tree and REVERSE
228 is true, if predecessors should be visited instead of successors of a
229 node. After this is done all nodes reachable from BB were visited, have
230 assigned their dfs number and are linked together to form a tree. */
233 calc_dfs_tree_nonrec (struct dom_info
*di
, basic_block bb
, bool reverse
)
235 /* We call this _only_ if bb is not already visited. */
237 TBB child_i
, my_i
= 0;
238 edge_iterator
*stack
;
239 edge_iterator ei
, einext
;
241 /* Start block (the entry block for forward problem, exit block for backward
243 basic_block en_block
;
245 basic_block ex_block
;
247 stack
= XNEWVEC (edge_iterator
, n_basic_blocks_for_fn (cfun
) + 1);
250 /* Initialize our border blocks, and the first edge. */
253 ei
= ei_start (bb
->preds
);
254 en_block
= EXIT_BLOCK_PTR_FOR_FN (cfun
);
255 ex_block
= ENTRY_BLOCK_PTR_FOR_FN (cfun
);
259 ei
= ei_start (bb
->succs
);
260 en_block
= ENTRY_BLOCK_PTR_FOR_FN (cfun
);
261 ex_block
= EXIT_BLOCK_PTR_FOR_FN (cfun
);
264 /* When the stack is empty we break out of this loop. */
269 /* This loop traverses edges e in depth first manner, and fills the
271 while (!ei_end_p (ei
))
275 /* Deduce from E the current and the next block (BB and BN), and the
281 /* If the next node BN is either already visited or a border
282 block the current edge is useless, and simply overwritten
283 with the next edge out of the current node. */
284 if (bn
== ex_block
|| di
->dfs_order
[bn
->index
])
290 einext
= ei_start (bn
->preds
);
295 if (bn
== ex_block
|| di
->dfs_order
[bn
->index
])
301 einext
= ei_start (bn
->succs
);
304 gcc_assert (bn
!= en_block
);
306 /* Fill the DFS tree info calculatable _before_ recursing. */
308 my_i
= di
->dfs_order
[bb
->index
];
310 my_i
= di
->dfs_order
[last_basic_block_for_fn (cfun
)];
311 child_i
= di
->dfs_order
[bn
->index
] = di
->dfsnum
++;
312 di
->dfs_to_bb
[child_i
] = bn
;
313 di
->dfs_parent
[child_i
] = my_i
;
315 /* Save the current point in the CFG on the stack, and recurse. */
324 /* OK. The edge-list was exhausted, meaning normally we would
325 end the recursion. After returning from the recursive call,
326 there were (may be) other statements which were run after a
327 child node was completely considered by DFS. Here is the
328 point to do it in the non-recursive variant.
329 E.g. The block just completed is in e->dest for forward DFS,
330 the block not yet completed (the parent of the one above)
331 in e->src. This could be used e.g. for computing the number of
332 descendants or the tree depth. */
338 /* The main entry for calculating the DFS tree or forest. DI is our working
339 structure and REVERSE is true, if we are interested in the reverse flow
340 graph. In that case the result is not necessarily a tree but a forest,
341 because there may be nodes from which the EXIT_BLOCK is unreachable. */
344 calc_dfs_tree (struct dom_info
*di
, bool reverse
)
346 /* The first block is the ENTRY_BLOCK (or EXIT_BLOCK if REVERSE). */
347 basic_block begin
= (reverse
348 ? EXIT_BLOCK_PTR_FOR_FN (cfun
) : ENTRY_BLOCK_PTR_FOR_FN (cfun
));
349 di
->dfs_order
[last_basic_block_for_fn (cfun
)] = di
->dfsnum
;
350 di
->dfs_to_bb
[di
->dfsnum
] = begin
;
353 calc_dfs_tree_nonrec (di
, begin
, reverse
);
357 /* In the post-dom case we may have nodes without a path to EXIT_BLOCK.
358 They are reverse-unreachable. In the dom-case we disallow such
359 nodes, but in post-dom we have to deal with them.
361 There are two situations in which this occurs. First, noreturn
362 functions. Second, infinite loops. In the first case we need to
363 pretend that there is an edge to the exit block. In the second
364 case, we wind up with a forest. We need to process all noreturn
365 blocks before we know if we've got any infinite loops. */
368 bool saw_unconnected
= false;
370 FOR_EACH_BB_REVERSE_FN (b
, cfun
)
372 if (EDGE_COUNT (b
->succs
) > 0)
374 if (di
->dfs_order
[b
->index
] == 0)
375 saw_unconnected
= true;
378 bitmap_set_bit (di
->fake_exit_edge
, b
->index
);
379 di
->dfs_order
[b
->index
] = di
->dfsnum
;
380 di
->dfs_to_bb
[di
->dfsnum
] = b
;
381 di
->dfs_parent
[di
->dfsnum
] =
382 di
->dfs_order
[last_basic_block_for_fn (cfun
)];
384 calc_dfs_tree_nonrec (di
, b
, reverse
);
389 FOR_EACH_BB_REVERSE_FN (b
, cfun
)
392 if (di
->dfs_order
[b
->index
])
394 b2
= dfs_find_deadend (b
);
395 gcc_checking_assert (di
->dfs_order
[b2
->index
] == 0);
396 bitmap_set_bit (di
->fake_exit_edge
, b2
->index
);
397 di
->dfs_order
[b2
->index
] = di
->dfsnum
;
398 di
->dfs_to_bb
[di
->dfsnum
] = b2
;
399 di
->dfs_parent
[di
->dfsnum
] =
400 di
->dfs_order
[last_basic_block_for_fn (cfun
)];
402 calc_dfs_tree_nonrec (di
, b2
, reverse
);
403 gcc_checking_assert (di
->dfs_order
[b
->index
]);
408 di
->nodes
= di
->dfsnum
- 1;
410 /* This aborts e.g. when there is _no_ path from ENTRY to EXIT at all. */
411 gcc_assert (di
->nodes
== (unsigned int) n_basic_blocks_for_fn (cfun
) - 1);
414 /* Compress the path from V to the root of its set and update path_min at the
415 same time. After compress(di, V) set_chain[V] is the root of the set V is
416 in and path_min[V] is the node with the smallest key[] value on the path
417 from V to that root. */
420 compress (struct dom_info
*di
, TBB v
)
422 /* Btw. It's not worth to unrecurse compress() as the depth is usually not
423 greater than 5 even for huge graphs (I've not seen call depth > 4).
424 Also performance wise compress() ranges _far_ behind eval(). */
425 TBB parent
= di
->set_chain
[v
];
426 if (di
->set_chain
[parent
])
428 compress (di
, parent
);
429 if (di
->key
[di
->path_min
[parent
]] < di
->key
[di
->path_min
[v
]])
430 di
->path_min
[v
] = di
->path_min
[parent
];
431 di
->set_chain
[v
] = di
->set_chain
[parent
];
435 /* Compress the path from V to the set root of V if needed (when the root has
436 changed since the last call). Returns the node with the smallest key[]
437 value on the path from V to the root. */
440 eval (struct dom_info
*di
, TBB v
)
442 /* The representative of the set V is in, also called root (as the set
443 representation is a tree). */
444 TBB rep
= di
->set_chain
[v
];
446 /* V itself is the root. */
448 return di
->path_min
[v
];
450 /* Compress only if necessary. */
451 if (di
->set_chain
[rep
])
454 rep
= di
->set_chain
[v
];
457 if (di
->key
[di
->path_min
[rep
]] >= di
->key
[di
->path_min
[v
]])
458 return di
->path_min
[v
];
460 return di
->path_min
[rep
];
463 /* This essentially merges the two sets of V and W, giving a single set with
464 the new root V. The internal representation of these disjoint sets is a
465 balanced tree. Currently link(V,W) is only used with V being the parent
469 link_roots (struct dom_info
*di
, TBB v
, TBB w
)
473 /* Rebalance the tree. */
474 while (di
->key
[di
->path_min
[w
]] < di
->key
[di
->path_min
[di
->set_child
[s
]]])
476 if (di
->set_size
[s
] + di
->set_size
[di
->set_child
[di
->set_child
[s
]]]
477 >= 2 * di
->set_size
[di
->set_child
[s
]])
479 di
->set_chain
[di
->set_child
[s
]] = s
;
480 di
->set_child
[s
] = di
->set_child
[di
->set_child
[s
]];
484 di
->set_size
[di
->set_child
[s
]] = di
->set_size
[s
];
485 s
= di
->set_chain
[s
] = di
->set_child
[s
];
489 di
->path_min
[s
] = di
->path_min
[w
];
490 di
->set_size
[v
] += di
->set_size
[w
];
491 if (di
->set_size
[v
] < 2 * di
->set_size
[w
])
494 s
= di
->set_child
[v
];
495 di
->set_child
[v
] = tmp
;
498 /* Merge all subtrees. */
501 di
->set_chain
[s
] = v
;
502 s
= di
->set_child
[s
];
506 /* This calculates the immediate dominators (or post-dominators if REVERSE is
507 true). DI is our working structure and should hold the DFS forest.
508 On return the immediate dominator to node V is in di->dom[V]. */
511 calc_idoms (struct dom_info
*di
, bool reverse
)
514 basic_block en_block
;
515 edge_iterator ei
, einext
;
518 en_block
= EXIT_BLOCK_PTR_FOR_FN (cfun
);
520 en_block
= ENTRY_BLOCK_PTR_FOR_FN (cfun
);
522 /* Go backwards in DFS order, to first look at the leafs. */
526 basic_block bb
= di
->dfs_to_bb
[v
];
529 par
= di
->dfs_parent
[v
];
532 ei
= (reverse
) ? ei_start (bb
->succs
) : ei_start (bb
->preds
);
536 /* If this block has a fake edge to exit, process that first. */
537 if (bitmap_bit_p (di
->fake_exit_edge
, bb
->index
))
541 goto do_fake_exit_edge
;
545 /* Search all direct predecessors for the smallest node with a path
546 to them. That way we have the smallest node with also a path to
547 us only over nodes behind us. In effect we search for our
549 while (!ei_end_p (ei
))
555 b
= (reverse
) ? e
->dest
: e
->src
;
562 k1
= di
->dfs_order
[last_basic_block_for_fn (cfun
)];
565 k1
= di
->dfs_order
[b
->index
];
567 /* Call eval() only if really needed. If k1 is above V in DFS tree,
568 then we know, that eval(k1) == k1 and key[k1] == k1. */
570 k1
= di
->key
[eval (di
, k1
)];
578 link_roots (di
, par
, v
);
579 di
->next_bucket
[v
] = di
->bucket
[k
];
582 /* Transform semidominators into dominators. */
583 for (w
= di
->bucket
[par
]; w
; w
= di
->next_bucket
[w
])
586 if (di
->key
[k
] < di
->key
[w
])
591 /* We don't need to cleanup next_bucket[]. */
596 /* Explicitly define the dominators. */
598 for (v
= 2; v
<= di
->nodes
; v
++)
599 if (di
->dom
[v
] != di
->key
[v
])
600 di
->dom
[v
] = di
->dom
[di
->dom
[v
]];
603 /* Assign dfs numbers starting from NUM to NODE and its sons. */
606 assign_dfs_numbers (struct et_node
*node
, int *num
)
610 node
->dfs_num_in
= (*num
)++;
614 assign_dfs_numbers (node
->son
, num
);
615 for (son
= node
->son
->right
; son
!= node
->son
; son
= son
->right
)
616 assign_dfs_numbers (son
, num
);
619 node
->dfs_num_out
= (*num
)++;
622 /* Compute the data necessary for fast resolving of dominator queries in a
623 static dominator tree. */
626 compute_dom_fast_query (enum cdi_direction dir
)
630 unsigned int dir_index
= dom_convert_dir_to_idx (dir
);
632 gcc_checking_assert (dom_info_available_p (dir
));
634 if (dom_computed
[dir_index
] == DOM_OK
)
637 FOR_ALL_BB_FN (bb
, cfun
)
639 if (!bb
->dom
[dir_index
]->father
)
640 assign_dfs_numbers (bb
->dom
[dir_index
], &num
);
643 dom_computed
[dir_index
] = DOM_OK
;
646 /* The main entry point into this module. DIR is set depending on whether
647 we want to compute dominators or postdominators. */
650 calculate_dominance_info (enum cdi_direction dir
)
654 unsigned int dir_index
= dom_convert_dir_to_idx (dir
);
655 bool reverse
= (dir
== CDI_POST_DOMINATORS
) ? true : false;
657 if (dom_computed
[dir_index
] == DOM_OK
)
660 timevar_push (TV_DOMINANCE
);
661 if (!dom_info_available_p (dir
))
663 gcc_assert (!n_bbs_in_dom_tree
[dir_index
]);
665 FOR_ALL_BB_FN (b
, cfun
)
667 b
->dom
[dir_index
] = et_new_tree (b
);
669 n_bbs_in_dom_tree
[dir_index
] = n_basic_blocks_for_fn (cfun
);
671 init_dom_info (&di
, dir
);
672 calc_dfs_tree (&di
, reverse
);
673 calc_idoms (&di
, reverse
);
675 FOR_EACH_BB_FN (b
, cfun
)
677 TBB d
= di
.dom
[di
.dfs_order
[b
->index
]];
680 et_set_father (b
->dom
[dir_index
], di
.dfs_to_bb
[d
]->dom
[dir_index
]);
684 dom_computed
[dir_index
] = DOM_NO_FAST_QUERY
;
687 compute_dom_fast_query (dir
);
689 timevar_pop (TV_DOMINANCE
);
692 /* Free dominance information for direction DIR. */
694 free_dominance_info (function
*fn
, enum cdi_direction dir
)
697 unsigned int dir_index
= dom_convert_dir_to_idx (dir
);
699 if (!dom_info_available_p (fn
, dir
))
702 FOR_ALL_BB_FN (bb
, fn
)
704 et_free_tree_force (bb
->dom
[dir_index
]);
705 bb
->dom
[dir_index
] = NULL
;
709 fn
->cfg
->x_n_bbs_in_dom_tree
[dir_index
] = 0;
711 fn
->cfg
->x_dom_computed
[dir_index
] = DOM_NONE
;
715 free_dominance_info (enum cdi_direction dir
)
717 free_dominance_info (cfun
, dir
);
720 /* Return the immediate dominator of basic block BB. */
722 get_immediate_dominator (enum cdi_direction dir
, basic_block bb
)
724 unsigned int dir_index
= dom_convert_dir_to_idx (dir
);
725 struct et_node
*node
= bb
->dom
[dir_index
];
727 gcc_checking_assert (dom_computed
[dir_index
]);
732 return (basic_block
) node
->father
->data
;
735 /* Set the immediate dominator of the block possibly removing
736 existing edge. NULL can be used to remove any edge. */
738 set_immediate_dominator (enum cdi_direction dir
, basic_block bb
,
739 basic_block dominated_by
)
741 unsigned int dir_index
= dom_convert_dir_to_idx (dir
);
742 struct et_node
*node
= bb
->dom
[dir_index
];
744 gcc_checking_assert (dom_computed
[dir_index
]);
748 if (node
->father
->data
== dominated_by
)
754 et_set_father (node
, dominated_by
->dom
[dir_index
]);
756 if (dom_computed
[dir_index
] == DOM_OK
)
757 dom_computed
[dir_index
] = DOM_NO_FAST_QUERY
;
760 /* Returns the list of basic blocks immediately dominated by BB, in the
763 get_dominated_by (enum cdi_direction dir
, basic_block bb
)
765 unsigned int dir_index
= dom_convert_dir_to_idx (dir
);
766 struct et_node
*node
= bb
->dom
[dir_index
], *son
= node
->son
, *ason
;
767 vec
<basic_block
> bbs
= vNULL
;
769 gcc_checking_assert (dom_computed
[dir_index
]);
774 bbs
.safe_push ((basic_block
) son
->data
);
775 for (ason
= son
->right
; ason
!= son
; ason
= ason
->right
)
776 bbs
.safe_push ((basic_block
) ason
->data
);
781 /* Returns the list of basic blocks that are immediately dominated (in
782 direction DIR) by some block between N_REGION ones stored in REGION,
783 except for blocks in the REGION itself. */
786 get_dominated_by_region (enum cdi_direction dir
, basic_block
*region
,
791 vec
<basic_block
> doms
= vNULL
;
793 for (i
= 0; i
< n_region
; i
++)
794 region
[i
]->flags
|= BB_DUPLICATED
;
795 for (i
= 0; i
< n_region
; i
++)
796 for (dom
= first_dom_son (dir
, region
[i
]);
798 dom
= next_dom_son (dir
, dom
))
799 if (!(dom
->flags
& BB_DUPLICATED
))
800 doms
.safe_push (dom
);
801 for (i
= 0; i
< n_region
; i
++)
802 region
[i
]->flags
&= ~BB_DUPLICATED
;
807 /* Returns the list of basic blocks including BB dominated by BB, in the
808 direction DIR up to DEPTH in the dominator tree. The DEPTH of zero will
809 produce a vector containing all dominated blocks. The vector will be sorted
813 get_dominated_to_depth (enum cdi_direction dir
, basic_block bb
, int depth
)
815 vec
<basic_block
> bbs
= vNULL
;
817 unsigned next_level_start
;
821 next_level_start
= 1; /* = bbs.length (); */
828 for (son
= first_dom_son (dir
, bb
);
830 son
= next_dom_son (dir
, son
))
833 if (i
== next_level_start
&& --depth
)
834 next_level_start
= bbs
.length ();
836 while (i
< next_level_start
);
841 /* Returns the list of basic blocks including BB dominated by BB, in the
842 direction DIR. The vector will be sorted in preorder. */
845 get_all_dominated_blocks (enum cdi_direction dir
, basic_block bb
)
847 return get_dominated_to_depth (dir
, bb
, 0);
850 /* Redirect all edges pointing to BB to TO. */
852 redirect_immediate_dominators (enum cdi_direction dir
, basic_block bb
,
855 unsigned int dir_index
= dom_convert_dir_to_idx (dir
);
856 struct et_node
*bb_node
, *to_node
, *son
;
858 bb_node
= bb
->dom
[dir_index
];
859 to_node
= to
->dom
[dir_index
];
861 gcc_checking_assert (dom_computed
[dir_index
]);
871 et_set_father (son
, to_node
);
874 if (dom_computed
[dir_index
] == DOM_OK
)
875 dom_computed
[dir_index
] = DOM_NO_FAST_QUERY
;
878 /* Find first basic block in the tree dominating both BB1 and BB2. */
880 nearest_common_dominator (enum cdi_direction dir
, basic_block bb1
, basic_block bb2
)
882 unsigned int dir_index
= dom_convert_dir_to_idx (dir
);
884 gcc_checking_assert (dom_computed
[dir_index
]);
891 return (basic_block
) et_nca (bb1
->dom
[dir_index
], bb2
->dom
[dir_index
])->data
;
895 /* Find the nearest common dominator for the basic blocks in BLOCKS,
896 using dominance direction DIR. */
899 nearest_common_dominator_for_set (enum cdi_direction dir
, bitmap blocks
)
905 first
= bitmap_first_set_bit (blocks
);
906 dom
= BASIC_BLOCK_FOR_FN (cfun
, first
);
907 EXECUTE_IF_SET_IN_BITMAP (blocks
, 0, i
, bi
)
908 if (dom
!= BASIC_BLOCK_FOR_FN (cfun
, i
))
909 dom
= nearest_common_dominator (dir
, dom
, BASIC_BLOCK_FOR_FN (cfun
, i
));
914 /* Given a dominator tree, we can determine whether one thing
915 dominates another in constant time by using two DFS numbers:
917 1. The number for when we visit a node on the way down the tree
918 2. The number for when we visit a node on the way back up the tree
920 You can view these as bounds for the range of dfs numbers the
921 nodes in the subtree of the dominator tree rooted at that node
924 The dominator tree is always a simple acyclic tree, so there are
925 only three possible relations two nodes in the dominator tree have
928 1. Node A is above Node B (and thus, Node A dominates node B)
937 In the above case, DFS_Number_In of A will be <= DFS_Number_In of
938 B, and DFS_Number_Out of A will be >= DFS_Number_Out of B. This is
939 because we must hit A in the dominator tree *before* B on the walk
940 down, and we will hit A *after* B on the walk back up
942 2. Node A is below node B (and thus, node B dominates node A)
951 In the above case, DFS_Number_In of A will be >= DFS_Number_In of
952 B, and DFS_Number_Out of A will be <= DFS_Number_Out of B.
954 This is because we must hit A in the dominator tree *after* B on
955 the walk down, and we will hit A *before* B on the walk back up
957 3. Node A and B are siblings (and thus, neither dominates the other)
965 In the above case, DFS_Number_In of A will *always* be <=
966 DFS_Number_In of B, and DFS_Number_Out of A will *always* be <=
967 DFS_Number_Out of B. This is because we will always finish the dfs
968 walk of one of the subtrees before the other, and thus, the dfs
969 numbers for one subtree can't intersect with the range of dfs
970 numbers for the other subtree. If you swap A and B's position in
971 the dominator tree, the comparison changes direction, but the point
972 is that both comparisons will always go the same way if there is no
973 dominance relationship.
975 Thus, it is sufficient to write
977 A_Dominates_B (node A, node B)
979 return DFS_Number_In(A) <= DFS_Number_In(B)
980 && DFS_Number_Out (A) >= DFS_Number_Out(B);
983 A_Dominated_by_B (node A, node B)
985 return DFS_Number_In(A) >= DFS_Number_In(A)
986 && DFS_Number_Out (A) <= DFS_Number_Out(B);
989 /* Return TRUE in case BB1 is dominated by BB2. */
991 dominated_by_p (enum cdi_direction dir
, const_basic_block bb1
, const_basic_block bb2
)
993 unsigned int dir_index
= dom_convert_dir_to_idx (dir
);
994 struct et_node
*n1
= bb1
->dom
[dir_index
], *n2
= bb2
->dom
[dir_index
];
996 gcc_checking_assert (dom_computed
[dir_index
]);
998 if (dom_computed
[dir_index
] == DOM_OK
)
999 return (n1
->dfs_num_in
>= n2
->dfs_num_in
1000 && n1
->dfs_num_out
<= n2
->dfs_num_out
);
1002 return et_below (n1
, n2
);
1005 /* Returns the entry dfs number for basic block BB, in the direction DIR. */
1008 bb_dom_dfs_in (enum cdi_direction dir
, basic_block bb
)
1010 unsigned int dir_index
= dom_convert_dir_to_idx (dir
);
1011 struct et_node
*n
= bb
->dom
[dir_index
];
1013 gcc_checking_assert (dom_computed
[dir_index
] == DOM_OK
);
1014 return n
->dfs_num_in
;
1017 /* Returns the exit dfs number for basic block BB, in the direction DIR. */
1020 bb_dom_dfs_out (enum cdi_direction dir
, basic_block bb
)
1022 unsigned int dir_index
= dom_convert_dir_to_idx (dir
);
1023 struct et_node
*n
= bb
->dom
[dir_index
];
1025 gcc_checking_assert (dom_computed
[dir_index
] == DOM_OK
);
1026 return n
->dfs_num_out
;
1029 /* Verify invariants of dominator structure. */
1031 verify_dominators (enum cdi_direction dir
)
1034 basic_block bb
, imm_bb
, imm_bb_correct
;
1036 bool reverse
= (dir
== CDI_POST_DOMINATORS
) ? true : false;
1038 gcc_assert (dom_info_available_p (dir
));
1040 init_dom_info (&di
, dir
);
1041 calc_dfs_tree (&di
, reverse
);
1042 calc_idoms (&di
, reverse
);
1044 FOR_EACH_BB_FN (bb
, cfun
)
1046 imm_bb
= get_immediate_dominator (dir
, bb
);
1049 error ("dominator of %d status unknown", bb
->index
);
1053 imm_bb_correct
= di
.dfs_to_bb
[di
.dom
[di
.dfs_order
[bb
->index
]]];
1054 if (imm_bb
!= imm_bb_correct
)
1056 error ("dominator of %d should be %d, not %d",
1057 bb
->index
, imm_bb_correct
->index
, imm_bb
->index
);
1062 free_dom_info (&di
);
1066 /* Determine immediate dominator (or postdominator, according to DIR) of BB,
1067 assuming that dominators of other blocks are correct. We also use it to
1068 recompute the dominators in a restricted area, by iterating it until it
1069 reaches a fixed point. */
1072 recompute_dominator (enum cdi_direction dir
, basic_block bb
)
1074 unsigned int dir_index
= dom_convert_dir_to_idx (dir
);
1075 basic_block dom_bb
= NULL
;
1079 gcc_checking_assert (dom_computed
[dir_index
]);
1081 if (dir
== CDI_DOMINATORS
)
1083 FOR_EACH_EDGE (e
, ei
, bb
->preds
)
1085 if (!dominated_by_p (dir
, e
->src
, bb
))
1086 dom_bb
= nearest_common_dominator (dir
, dom_bb
, e
->src
);
1091 FOR_EACH_EDGE (e
, ei
, bb
->succs
)
1093 if (!dominated_by_p (dir
, e
->dest
, bb
))
1094 dom_bb
= nearest_common_dominator (dir
, dom_bb
, e
->dest
);
1101 /* Use simple heuristics (see iterate_fix_dominators) to determine dominators
1102 of BBS. We assume that all the immediate dominators except for those of the
1103 blocks in BBS are correct. If CONSERVATIVE is true, we also assume that the
1104 currently recorded immediate dominators of blocks in BBS really dominate the
1105 blocks. The basic blocks for that we determine the dominator are removed
1109 prune_bbs_to_update_dominators (vec
<basic_block
> bbs
,
1114 basic_block bb
, dom
= NULL
;
1118 for (i
= 0; bbs
.iterate (i
, &bb
);)
1120 if (bb
== ENTRY_BLOCK_PTR_FOR_FN (cfun
))
1123 if (single_pred_p (bb
))
1125 set_immediate_dominator (CDI_DOMINATORS
, bb
, single_pred (bb
));
1134 FOR_EACH_EDGE (e
, ei
, bb
->preds
)
1136 if (dominated_by_p (CDI_DOMINATORS
, e
->src
, bb
))
1144 dom
= nearest_common_dominator (CDI_DOMINATORS
, dom
, e
->src
);
1148 gcc_assert (dom
!= NULL
);
1150 || find_edge (dom
, bb
))
1152 set_immediate_dominator (CDI_DOMINATORS
, bb
, dom
);
1161 bbs
.unordered_remove (i
);
1165 /* Returns root of the dominance tree in the direction DIR that contains
1169 root_of_dom_tree (enum cdi_direction dir
, basic_block bb
)
1171 return (basic_block
) et_root (bb
->dom
[dom_convert_dir_to_idx (dir
)])->data
;
1174 /* See the comment in iterate_fix_dominators. Finds the immediate dominators
1175 for the sons of Y, found using the SON and BROTHER arrays representing
1176 the dominance tree of graph G. BBS maps the vertices of G to the basic
1180 determine_dominators_for_sons (struct graph
*g
, vec
<basic_block
> bbs
,
1181 int y
, int *son
, int *brother
)
1186 basic_block bb
, dom
, ybb
;
1193 if (y
== (int) bbs
.length ())
1194 ybb
= ENTRY_BLOCK_PTR_FOR_FN (cfun
);
1198 if (brother
[son
[y
]] == -1)
1200 /* Handle the common case Y has just one son specially. */
1202 set_immediate_dominator (CDI_DOMINATORS
, bb
,
1203 recompute_dominator (CDI_DOMINATORS
, bb
));
1204 identify_vertices (g
, y
, son
[y
]);
1208 gprime
= BITMAP_ALLOC (NULL
);
1209 for (a
= son
[y
]; a
!= -1; a
= brother
[a
])
1210 bitmap_set_bit (gprime
, a
);
1212 nc
= graphds_scc (g
, gprime
);
1213 BITMAP_FREE (gprime
);
1215 /* ??? Needed to work around the pre-processor confusion with
1216 using a multi-argument template type as macro argument. */
1217 typedef vec
<int> vec_int_heap
;
1218 sccs
= XCNEWVEC (vec_int_heap
, nc
);
1219 for (a
= son
[y
]; a
!= -1; a
= brother
[a
])
1220 sccs
[g
->vertices
[a
].component
].safe_push (a
);
1222 for (i
= nc
- 1; i
>= 0; i
--)
1225 FOR_EACH_VEC_ELT (sccs
[i
], si
, a
)
1228 FOR_EACH_EDGE (e
, ei
, bb
->preds
)
1230 if (root_of_dom_tree (CDI_DOMINATORS
, e
->src
) != ybb
)
1233 dom
= nearest_common_dominator (CDI_DOMINATORS
, dom
, e
->src
);
1237 gcc_assert (dom
!= NULL
);
1238 FOR_EACH_VEC_ELT (sccs
[i
], si
, a
)
1241 set_immediate_dominator (CDI_DOMINATORS
, bb
, dom
);
1245 for (i
= 0; i
< nc
; i
++)
1249 for (a
= son
[y
]; a
!= -1; a
= brother
[a
])
1250 identify_vertices (g
, y
, a
);
1253 /* Recompute dominance information for basic blocks in the set BBS. The
1254 function assumes that the immediate dominators of all the other blocks
1255 in CFG are correct, and that there are no unreachable blocks.
1257 If CONSERVATIVE is true, we additionally assume that all the ancestors of
1258 a block of BBS in the current dominance tree dominate it. */
1261 iterate_fix_dominators (enum cdi_direction dir
, vec
<basic_block
> bbs
,
1265 basic_block bb
, dom
;
1271 int *parent
, *son
, *brother
;
1272 unsigned int dir_index
= dom_convert_dir_to_idx (dir
);
1274 /* We only support updating dominators. There are some problems with
1275 updating postdominators (need to add fake edges from infinite loops
1276 and noreturn functions), and since we do not currently use
1277 iterate_fix_dominators for postdominators, any attempt to handle these
1278 problems would be unused, untested, and almost surely buggy. We keep
1279 the DIR argument for consistency with the rest of the dominator analysis
1281 gcc_checking_assert (dir
== CDI_DOMINATORS
&& dom_computed
[dir_index
]);
1283 /* The algorithm we use takes inspiration from the following papers, although
1284 the details are quite different from any of them:
1286 [1] G. Ramalingam, T. Reps, An Incremental Algorithm for Maintaining the
1287 Dominator Tree of a Reducible Flowgraph
1288 [2] V. C. Sreedhar, G. R. Gao, Y.-F. Lee: Incremental computation of
1290 [3] K. D. Cooper, T. J. Harvey and K. Kennedy: A Simple, Fast Dominance
1293 First, we use the following heuristics to decrease the size of the BBS
1295 a) if BB has a single predecessor, then its immediate dominator is this
1297 additionally, if CONSERVATIVE is true:
1298 b) if all the predecessors of BB except for one (X) are dominated by BB,
1299 then X is the immediate dominator of BB
1300 c) if the nearest common ancestor of the predecessors of BB is X and
1301 X -> BB is an edge in CFG, then X is the immediate dominator of BB
1303 Then, we need to establish the dominance relation among the basic blocks
1304 in BBS. We split the dominance tree by removing the immediate dominator
1305 edges from BBS, creating a forest F. We form a graph G whose vertices
1306 are BBS and ENTRY and X -> Y is an edge of G if there exists an edge
1307 X' -> Y in CFG such that X' belongs to the tree of the dominance forest
1308 whose root is X. We then determine dominance tree of G. Note that
1309 for X, Y in BBS, X dominates Y in CFG if and only if X dominates Y in G.
1310 In this step, we can use arbitrary algorithm to determine dominators.
1311 We decided to prefer the algorithm [3] to the algorithm of
1312 Lengauer and Tarjan, since the set BBS is usually small (rarely exceeding
1313 10 during gcc bootstrap), and [3] should perform better in this case.
1315 Finally, we need to determine the immediate dominators for the basic
1316 blocks of BBS. If the immediate dominator of X in G is Y, then
1317 the immediate dominator of X in CFG belongs to the tree of F rooted in
1318 Y. We process the dominator tree T of G recursively, starting from leaves.
1319 Suppose that X_1, X_2, ..., X_k are the sons of Y in T, and that the
1320 subtrees of the dominance tree of CFG rooted in X_i are already correct.
1321 Let G' be the subgraph of G induced by {X_1, X_2, ..., X_k}. We make
1322 the following observations:
1323 (i) the immediate dominator of all blocks in a strongly connected
1324 component of G' is the same
1325 (ii) if X has no predecessors in G', then the immediate dominator of X
1326 is the nearest common ancestor of the predecessors of X in the
1327 subtree of F rooted in Y
1328 Therefore, it suffices to find the topological ordering of G', and
1329 process the nodes X_i in this order using the rules (i) and (ii).
1330 Then, we contract all the nodes X_i with Y in G, so that the further
1331 steps work correctly. */
1335 /* Split the tree now. If the idoms of blocks in BBS are not
1336 conservatively correct, setting the dominators using the
1337 heuristics in prune_bbs_to_update_dominators could
1338 create cycles in the dominance "tree", and cause ICE. */
1339 FOR_EACH_VEC_ELT (bbs
, i
, bb
)
1340 set_immediate_dominator (CDI_DOMINATORS
, bb
, NULL
);
1343 prune_bbs_to_update_dominators (bbs
, conservative
);
1352 set_immediate_dominator (CDI_DOMINATORS
, bb
,
1353 recompute_dominator (CDI_DOMINATORS
, bb
));
1357 /* Construct the graph G. */
1358 hash_map
<basic_block
, int> map (251);
1359 FOR_EACH_VEC_ELT (bbs
, i
, bb
)
1361 /* If the dominance tree is conservatively correct, split it now. */
1363 set_immediate_dominator (CDI_DOMINATORS
, bb
, NULL
);
1366 map
.put (ENTRY_BLOCK_PTR_FOR_FN (cfun
), n
);
1368 g
= new_graph (n
+ 1);
1369 for (y
= 0; y
< g
->n_vertices
; y
++)
1370 g
->vertices
[y
].data
= BITMAP_ALLOC (NULL
);
1371 FOR_EACH_VEC_ELT (bbs
, i
, bb
)
1373 FOR_EACH_EDGE (e
, ei
, bb
->preds
)
1375 dom
= root_of_dom_tree (CDI_DOMINATORS
, e
->src
);
1379 dom_i
= *map
.get (dom
);
1381 /* Do not include parallel edges to G. */
1382 if (!bitmap_set_bit ((bitmap
) g
->vertices
[dom_i
].data
, i
))
1385 add_edge (g
, dom_i
, i
);
1388 for (y
= 0; y
< g
->n_vertices
; y
++)
1389 BITMAP_FREE (g
->vertices
[y
].data
);
1391 /* Find the dominator tree of G. */
1392 son
= XNEWVEC (int, n
+ 1);
1393 brother
= XNEWVEC (int, n
+ 1);
1394 parent
= XNEWVEC (int, n
+ 1);
1395 graphds_domtree (g
, n
, parent
, son
, brother
);
1397 /* Finally, traverse the tree and find the immediate dominators. */
1398 for (y
= n
; son
[y
] != -1; y
= son
[y
])
1402 determine_dominators_for_sons (g
, bbs
, y
, son
, brother
);
1404 if (brother
[y
] != -1)
1407 while (son
[y
] != -1)
1422 add_to_dominance_info (enum cdi_direction dir
, basic_block bb
)
1424 unsigned int dir_index
= dom_convert_dir_to_idx (dir
);
1426 gcc_checking_assert (dom_computed
[dir_index
] && !bb
->dom
[dir_index
]);
1428 n_bbs_in_dom_tree
[dir_index
]++;
1430 bb
->dom
[dir_index
] = et_new_tree (bb
);
1432 if (dom_computed
[dir_index
] == DOM_OK
)
1433 dom_computed
[dir_index
] = DOM_NO_FAST_QUERY
;
1437 delete_from_dominance_info (enum cdi_direction dir
, basic_block bb
)
1439 unsigned int dir_index
= dom_convert_dir_to_idx (dir
);
1441 gcc_checking_assert (dom_computed
[dir_index
]);
1443 et_free_tree (bb
->dom
[dir_index
]);
1444 bb
->dom
[dir_index
] = NULL
;
1445 n_bbs_in_dom_tree
[dir_index
]--;
1447 if (dom_computed
[dir_index
] == DOM_OK
)
1448 dom_computed
[dir_index
] = DOM_NO_FAST_QUERY
;
1451 /* Returns the first son of BB in the dominator or postdominator tree
1452 as determined by DIR. */
1455 first_dom_son (enum cdi_direction dir
, basic_block bb
)
1457 unsigned int dir_index
= dom_convert_dir_to_idx (dir
);
1458 struct et_node
*son
= bb
->dom
[dir_index
]->son
;
1460 return (basic_block
) (son
? son
->data
: NULL
);
1463 /* Returns the next dominance son after BB in the dominator or postdominator
1464 tree as determined by DIR, or NULL if it was the last one. */
1467 next_dom_son (enum cdi_direction dir
, basic_block bb
)
1469 unsigned int dir_index
= dom_convert_dir_to_idx (dir
);
1470 struct et_node
*next
= bb
->dom
[dir_index
]->right
;
1472 return (basic_block
) (next
->father
->son
== next
? NULL
: next
->data
);
1475 /* Return dominance availability for dominance info DIR. */
1478 dom_info_state (function
*fn
, enum cdi_direction dir
)
1483 unsigned int dir_index
= dom_convert_dir_to_idx (dir
);
1484 return fn
->cfg
->x_dom_computed
[dir_index
];
1488 dom_info_state (enum cdi_direction dir
)
1490 return dom_info_state (cfun
, dir
);
1493 /* Set the dominance availability for dominance info DIR to NEW_STATE. */
1496 set_dom_info_availability (enum cdi_direction dir
, enum dom_state new_state
)
1498 unsigned int dir_index
= dom_convert_dir_to_idx (dir
);
1500 dom_computed
[dir_index
] = new_state
;
1503 /* Returns true if dominance information for direction DIR is available. */
1506 dom_info_available_p (function
*fn
, enum cdi_direction dir
)
1508 return dom_info_state (fn
, dir
) != DOM_NONE
;
1512 dom_info_available_p (enum cdi_direction dir
)
1514 return dom_info_available_p (cfun
, dir
);
1518 debug_dominance_info (enum cdi_direction dir
)
1520 basic_block bb
, bb2
;
1521 FOR_EACH_BB_FN (bb
, cfun
)
1522 if ((bb2
= get_immediate_dominator (dir
, bb
)))
1523 fprintf (stderr
, "%i %i\n", bb
->index
, bb2
->index
);
1526 /* Prints to stderr representation of the dominance tree (for direction DIR)
1527 rooted in ROOT, indented by INDENT tabulators. If INDENT_FIRST is false,
1528 the first line of the output is not indented. */
1531 debug_dominance_tree_1 (enum cdi_direction dir
, basic_block root
,
1532 unsigned indent
, bool indent_first
)
1539 for (i
= 0; i
< indent
; i
++)
1540 fprintf (stderr
, "\t");
1541 fprintf (stderr
, "%d\t", root
->index
);
1543 for (son
= first_dom_son (dir
, root
);
1545 son
= next_dom_son (dir
, son
))
1547 debug_dominance_tree_1 (dir
, son
, indent
+ 1, !first
);
1552 fprintf (stderr
, "\n");
1555 /* Prints to stderr representation of the dominance tree (for direction DIR)
1559 debug_dominance_tree (enum cdi_direction dir
, basic_block root
)
1561 debug_dominance_tree_1 (dir
, root
, 0, false);