]> gcc.gnu.org Git - gcc.git/blame - gcc/dominance.c
add hash_map class
[gcc.git] / gcc / dominance.c
CommitLineData
f8032688 1/* Calculate (post)dominators in slightly super-linear time.
23a5b65a 2 Copyright (C) 2000-2014 Free Software Foundation, Inc.
f8032688 3 Contributed by Michael Matz (matz@ifh.de).
3a538a66 4
1322177d 5 This file is part of GCC.
3a538a66 6
1322177d
LB
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
9dcd6f09 9 the Free Software Foundation; either version 3, or (at your option)
f8032688
MM
10 any later version.
11
1322177d
LB
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.
f8032688
MM
16
17 You should have received a copy of the GNU General Public License
9dcd6f09
NC
18 along with GCC; see the file COPYING3. If not see
19 <http://www.gnu.org/licenses/>. */
f8032688
MM
20
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.
29
a1f300c0 30 The algorithm computes this dominator tree implicitly by computing for
f8032688 31 each block its immediate dominator. We use tree balancing and path
f3b569ca 32 compression, so it's the O(e*a(e,v)) variant, where a(e,v) is the very
f8032688
MM
33 slowly growing functional inverse of the Ackerman function. */
34
35#include "config.h"
36#include "system.h"
4977bab6
ZW
37#include "coretypes.h"
38#include "tm.h"
f8032688
MM
39#include "rtl.h"
40#include "hard-reg-set.h"
7932a3db 41#include "obstack.h"
f8032688 42#include "basic-block.h"
718f9c0f 43#include "diagnostic-core.h"
355be0dc 44#include "et-forest.h"
74c96e0c 45#include "timevar.h"
1eb68d2d 46#include "hash-map.h"
66f97d31
ZD
47#include "pointer-set.h"
48#include "graphds.h"
7a8cba34 49#include "bitmap.h"
f8032688 50
f8032688
MM
51/* We name our nodes with integers, beginning with 1. Zero is reserved for
52 'undefined' or 'end of list'. The name of each node is given by the dfs
53 number of the corresponding basic block. Please note, that we include the
54 artificial ENTRY_BLOCK (or EXIT_BLOCK in the post-dom case) in our lists to
24bd1a0b 55 support multiple entry points. Its dfs number is of course 1. */
f8032688
MM
56
57/* Type of Basic Block aka. TBB */
58typedef unsigned int TBB;
59
60/* We work in a poor-mans object oriented fashion, and carry an instance of
61 this structure through all our 'methods'. It holds various arrays
62 reflecting the (sub)structure of the flowgraph. Most of them are of type
63 TBB and are also indexed by TBB. */
64
65struct dom_info
66{
67 /* The parent of a node in the DFS tree. */
68 TBB *dfs_parent;
69 /* For a node x key[x] is roughly the node nearest to the root from which
70 exists a way to x only over nodes behind x. Such a node is also called
71 semidominator. */
72 TBB *key;
73 /* The value in path_min[x] is the node y on the path from x to the root of
74 the tree x is in with the smallest key[y]. */
75 TBB *path_min;
76 /* bucket[x] points to the first node of the set of nodes having x as key. */
77 TBB *bucket;
78 /* And next_bucket[x] points to the next node. */
79 TBB *next_bucket;
80 /* After the algorithm is done, dom[x] contains the immediate dominator
81 of x. */
82 TBB *dom;
83
84 /* The following few fields implement the structures needed for disjoint
85 sets. */
fa10beec 86 /* set_chain[x] is the next node on the path from x to the representative
f8032688
MM
87 of the set containing x. If set_chain[x]==0 then x is a root. */
88 TBB *set_chain;
89 /* set_size[x] is the number of elements in the set named by x. */
90 unsigned int *set_size;
91 /* set_child[x] is used for balancing the tree representing a set. It can
92 be understood as the next sibling of x. */
93 TBB *set_child;
94
95 /* If b is the number of a basic block (BB->index), dfs_order[b] is the
96 number of that node in DFS order counted from 1. This is an index
97 into most of the other arrays in this structure. */
98 TBB *dfs_order;
09da1532 99 /* If x is the DFS-index of a node which corresponds with a basic block,
f8032688
MM
100 dfs_to_bb[x] is that basic block. Note, that in our structure there are
101 more nodes that basic blocks, so only dfs_to_bb[dfs_order[bb->index]]==bb
102 is true for every basic block bb, but not the opposite. */
103 basic_block *dfs_to_bb;
104
26e0e410 105 /* This is the next free DFS number when creating the DFS tree. */
f8032688
MM
106 unsigned int dfsnum;
107 /* The number of nodes in the DFS tree (==dfsnum-1). */
108 unsigned int nodes;
26e0e410
RH
109
110 /* Blocks with bits set here have a fake edge to EXIT. These are used
111 to turn a DFS forest into a proper tree. */
112 bitmap fake_exit_edge;
f8032688
MM
113};
114
26e0e410 115static void init_dom_info (struct dom_info *, enum cdi_direction);
7080f735 116static void free_dom_info (struct dom_info *);
2b28c07a
JC
117static void calc_dfs_tree_nonrec (struct dom_info *, basic_block, bool);
118static void calc_dfs_tree (struct dom_info *, bool);
7080f735
AJ
119static void compress (struct dom_info *, TBB);
120static TBB eval (struct dom_info *, TBB);
121static void link_roots (struct dom_info *, TBB, TBB);
2b28c07a 122static void calc_idoms (struct dom_info *, bool);
d47cc544 123void debug_dominance_info (enum cdi_direction);
1fc3998d 124void debug_dominance_tree (enum cdi_direction, basic_block);
f8032688
MM
125
126/* Helper macro for allocating and initializing an array,
127 for aesthetic reasons. */
128#define init_ar(var, type, num, content) \
3a538a66
KH
129 do \
130 { \
131 unsigned int i = 1; /* Catch content == i. */ \
132 if (! (content)) \
5ed6ace5 133 (var) = XCNEWVEC (type, num); \
3a538a66
KH
134 else \
135 { \
5ed6ace5 136 (var) = XNEWVEC (type, (num)); \
3a538a66
KH
137 for (i = 0; i < num; i++) \
138 (var)[i] = (content); \
139 } \
140 } \
141 while (0)
f8032688
MM
142
143/* Allocate all needed memory in a pessimistic fashion (so we round up).
4912a07c 144 This initializes the contents of DI, which already must be allocated. */
f8032688
MM
145
146static void
26e0e410 147init_dom_info (struct dom_info *di, enum cdi_direction dir)
f8032688 148{
6fb5fa3c 149 /* We need memory for n_basic_blocks nodes. */
0cae8d31 150 unsigned int num = n_basic_blocks_for_fn (cfun);
f8032688
MM
151 init_ar (di->dfs_parent, TBB, num, 0);
152 init_ar (di->path_min, TBB, num, i);
153 init_ar (di->key, TBB, num, i);
154 init_ar (di->dom, TBB, num, 0);
155
156 init_ar (di->bucket, TBB, num, 0);
157 init_ar (di->next_bucket, TBB, num, 0);
158
159 init_ar (di->set_chain, TBB, num, 0);
160 init_ar (di->set_size, unsigned int, num, 1);
161 init_ar (di->set_child, TBB, num, 0);
162
8b1c6fd7
DM
163 init_ar (di->dfs_order, TBB,
164 (unsigned int) last_basic_block_for_fn (cfun) + 1, 0);
f8032688
MM
165 init_ar (di->dfs_to_bb, basic_block, num, 0);
166
167 di->dfsnum = 1;
168 di->nodes = 0;
26e0e410 169
2b28c07a
JC
170 switch (dir)
171 {
172 case CDI_DOMINATORS:
173 di->fake_exit_edge = NULL;
174 break;
175 case CDI_POST_DOMINATORS:
176 di->fake_exit_edge = BITMAP_ALLOC (NULL);
177 break;
178 default:
179 gcc_unreachable ();
180 break;
181 }
f8032688
MM
182}
183
184#undef init_ar
185
2b28c07a
JC
186/* Map dominance calculation type to array index used for various
187 dominance information arrays. This version is simple -- it will need
188 to be modified, obviously, if additional values are added to
189 cdi_direction. */
190
191static unsigned int
192dom_convert_dir_to_idx (enum cdi_direction dir)
193{
2ba31c05 194 gcc_checking_assert (dir == CDI_DOMINATORS || dir == CDI_POST_DOMINATORS);
2b28c07a
JC
195 return dir - 1;
196}
197
f8032688
MM
198/* Free all allocated memory in DI, but not DI itself. */
199
200static void
7080f735 201free_dom_info (struct dom_info *di)
f8032688
MM
202{
203 free (di->dfs_parent);
204 free (di->path_min);
205 free (di->key);
206 free (di->dom);
207 free (di->bucket);
208 free (di->next_bucket);
209 free (di->set_chain);
210 free (di->set_size);
211 free (di->set_child);
212 free (di->dfs_order);
213 free (di->dfs_to_bb);
8bdbfff5 214 BITMAP_FREE (di->fake_exit_edge);
f8032688
MM
215}
216
217/* The nonrecursive variant of creating a DFS tree. DI is our working
218 structure, BB the starting basic block for this tree and REVERSE
219 is true, if predecessors should be visited instead of successors of a
220 node. After this is done all nodes reachable from BB were visited, have
221 assigned their dfs number and are linked together to form a tree. */
222
223static void
2b28c07a 224calc_dfs_tree_nonrec (struct dom_info *di, basic_block bb, bool reverse)
f8032688 225{
f8032688
MM
226 /* We call this _only_ if bb is not already visited. */
227 edge e;
228 TBB child_i, my_i = 0;
628f6a4e
BE
229 edge_iterator *stack;
230 edge_iterator ei, einext;
f8032688 231 int sp;
6626665f 232 /* Start block (the entry block for forward problem, exit block for backward
f8032688
MM
233 problem). */
234 basic_block en_block;
235 /* Ending block. */
236 basic_block ex_block;
237
0cae8d31 238 stack = XNEWVEC (edge_iterator, n_basic_blocks_for_fn (cfun) + 1);
f8032688
MM
239 sp = 0;
240
241 /* Initialize our border blocks, and the first edge. */
242 if (reverse)
243 {
628f6a4e 244 ei = ei_start (bb->preds);
fefa31b5
DM
245 en_block = EXIT_BLOCK_PTR_FOR_FN (cfun);
246 ex_block = ENTRY_BLOCK_PTR_FOR_FN (cfun);
f8032688
MM
247 }
248 else
249 {
628f6a4e 250 ei = ei_start (bb->succs);
fefa31b5
DM
251 en_block = ENTRY_BLOCK_PTR_FOR_FN (cfun);
252 ex_block = EXIT_BLOCK_PTR_FOR_FN (cfun);
f8032688
MM
253 }
254
255 /* When the stack is empty we break out of this loop. */
256 while (1)
257 {
258 basic_block bn;
259
260 /* This loop traverses edges e in depth first manner, and fills the
261 stack. */
628f6a4e 262 while (!ei_end_p (ei))
f8032688 263 {
628f6a4e 264 e = ei_edge (ei);
f8032688
MM
265
266 /* Deduce from E the current and the next block (BB and BN), and the
267 next edge. */
268 if (reverse)
269 {
270 bn = e->src;
271
272 /* If the next node BN is either already visited or a border
273 block the current edge is useless, and simply overwritten
274 with the next edge out of the current node. */
0b17ab2f 275 if (bn == ex_block || di->dfs_order[bn->index])
f8032688 276 {
628f6a4e 277 ei_next (&ei);
f8032688
MM
278 continue;
279 }
280 bb = e->dest;
628f6a4e 281 einext = ei_start (bn->preds);
f8032688
MM
282 }
283 else
284 {
285 bn = e->dest;
0b17ab2f 286 if (bn == ex_block || di->dfs_order[bn->index])
f8032688 287 {
628f6a4e 288 ei_next (&ei);
f8032688
MM
289 continue;
290 }
291 bb = e->src;
628f6a4e 292 einext = ei_start (bn->succs);
f8032688
MM
293 }
294
ced3f397 295 gcc_assert (bn != en_block);
f8032688
MM
296
297 /* Fill the DFS tree info calculatable _before_ recursing. */
298 if (bb != en_block)
0b17ab2f 299 my_i = di->dfs_order[bb->index];
f8032688 300 else
8b1c6fd7 301 my_i = di->dfs_order[last_basic_block_for_fn (cfun)];
0b17ab2f 302 child_i = di->dfs_order[bn->index] = di->dfsnum++;
f8032688
MM
303 di->dfs_to_bb[child_i] = bn;
304 di->dfs_parent[child_i] = my_i;
305
306 /* Save the current point in the CFG on the stack, and recurse. */
628f6a4e
BE
307 stack[sp++] = ei;
308 ei = einext;
f8032688
MM
309 }
310
311 if (!sp)
312 break;
628f6a4e 313 ei = stack[--sp];
f8032688
MM
314
315 /* OK. The edge-list was exhausted, meaning normally we would
316 end the recursion. After returning from the recursive call,
317 there were (may be) other statements which were run after a
318 child node was completely considered by DFS. Here is the
319 point to do it in the non-recursive variant.
320 E.g. The block just completed is in e->dest for forward DFS,
321 the block not yet completed (the parent of the one above)
322 in e->src. This could be used e.g. for computing the number of
323 descendants or the tree depth. */
628f6a4e 324 ei_next (&ei);
f8032688
MM
325 }
326 free (stack);
327}
328
329/* The main entry for calculating the DFS tree or forest. DI is our working
330 structure and REVERSE is true, if we are interested in the reverse flow
331 graph. In that case the result is not necessarily a tree but a forest,
332 because there may be nodes from which the EXIT_BLOCK is unreachable. */
333
334static void
2b28c07a 335calc_dfs_tree (struct dom_info *di, bool reverse)
f8032688
MM
336{
337 /* The first block is the ENTRY_BLOCK (or EXIT_BLOCK if REVERSE). */
fefa31b5
DM
338 basic_block begin = (reverse
339 ? EXIT_BLOCK_PTR_FOR_FN (cfun) : ENTRY_BLOCK_PTR_FOR_FN (cfun));
8b1c6fd7 340 di->dfs_order[last_basic_block_for_fn (cfun)] = di->dfsnum;
f8032688
MM
341 di->dfs_to_bb[di->dfsnum] = begin;
342 di->dfsnum++;
343
344 calc_dfs_tree_nonrec (di, begin, reverse);
345
346 if (reverse)
347 {
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
26e0e410
RH
350 nodes, but in post-dom we have to deal with them.
351
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. */
357
e0082a72 358 basic_block b;
26e0e410
RH
359 bool saw_unconnected = false;
360
4f42035e 361 FOR_EACH_BB_REVERSE_FN (b, cfun)
f8032688 362 {
628f6a4e 363 if (EDGE_COUNT (b->succs) > 0)
26e0e410
RH
364 {
365 if (di->dfs_order[b->index] == 0)
366 saw_unconnected = true;
367 continue;
368 }
369 bitmap_set_bit (di->fake_exit_edge, b->index);
0b17ab2f 370 di->dfs_order[b->index] = di->dfsnum;
f8032688 371 di->dfs_to_bb[di->dfsnum] = b;
8b1c6fd7
DM
372 di->dfs_parent[di->dfsnum] =
373 di->dfs_order[last_basic_block_for_fn (cfun)];
f8032688
MM
374 di->dfsnum++;
375 calc_dfs_tree_nonrec (di, b, reverse);
376 }
26e0e410
RH
377
378 if (saw_unconnected)
379 {
4f42035e 380 FOR_EACH_BB_REVERSE_FN (b, cfun)
26e0e410 381 {
03b06a83 382 basic_block b2;
26e0e410
RH
383 if (di->dfs_order[b->index])
384 continue;
03b06a83
SB
385 b2 = dfs_find_deadend (b);
386 gcc_checking_assert (di->dfs_order[b2->index] == 0);
387 bitmap_set_bit (di->fake_exit_edge, b2->index);
388 di->dfs_order[b2->index] = di->dfsnum;
389 di->dfs_to_bb[di->dfsnum] = b2;
8b1c6fd7
DM
390 di->dfs_parent[di->dfsnum] =
391 di->dfs_order[last_basic_block_for_fn (cfun)];
26e0e410 392 di->dfsnum++;
03b06a83
SB
393 calc_dfs_tree_nonrec (di, b2, reverse);
394 gcc_checking_assert (di->dfs_order[b->index]);
26e0e410
RH
395 }
396 }
f8032688
MM
397 }
398
399 di->nodes = di->dfsnum - 1;
400
24bd1a0b 401 /* This aborts e.g. when there is _no_ path from ENTRY to EXIT at all. */
0cae8d31 402 gcc_assert (di->nodes == (unsigned int) n_basic_blocks_for_fn (cfun) - 1);
f8032688
MM
403}
404
405/* Compress the path from V to the root of its set and update path_min at the
406 same time. After compress(di, V) set_chain[V] is the root of the set V is
407 in and path_min[V] is the node with the smallest key[] value on the path
408 from V to that root. */
409
410static void
7080f735 411compress (struct dom_info *di, TBB v)
f8032688
MM
412{
413 /* Btw. It's not worth to unrecurse compress() as the depth is usually not
414 greater than 5 even for huge graphs (I've not seen call depth > 4).
415 Also performance wise compress() ranges _far_ behind eval(). */
416 TBB parent = di->set_chain[v];
417 if (di->set_chain[parent])
418 {
419 compress (di, parent);
420 if (di->key[di->path_min[parent]] < di->key[di->path_min[v]])
421 di->path_min[v] = di->path_min[parent];
422 di->set_chain[v] = di->set_chain[parent];
423 }
424}
425
426/* Compress the path from V to the set root of V if needed (when the root has
427 changed since the last call). Returns the node with the smallest key[]
428 value on the path from V to the root. */
429
430static inline TBB
7080f735 431eval (struct dom_info *di, TBB v)
f8032688 432{
fa10beec 433 /* The representative of the set V is in, also called root (as the set
f8032688
MM
434 representation is a tree). */
435 TBB rep = di->set_chain[v];
436
437 /* V itself is the root. */
438 if (!rep)
439 return di->path_min[v];
440
441 /* Compress only if necessary. */
442 if (di->set_chain[rep])
443 {
444 compress (di, v);
445 rep = di->set_chain[v];
446 }
447
448 if (di->key[di->path_min[rep]] >= di->key[di->path_min[v]])
449 return di->path_min[v];
450 else
451 return di->path_min[rep];
452}
453
454/* This essentially merges the two sets of V and W, giving a single set with
455 the new root V. The internal representation of these disjoint sets is a
456 balanced tree. Currently link(V,W) is only used with V being the parent
457 of W. */
458
459static void
7080f735 460link_roots (struct dom_info *di, TBB v, TBB w)
f8032688
MM
461{
462 TBB s = w;
463
464 /* Rebalance the tree. */
465 while (di->key[di->path_min[w]] < di->key[di->path_min[di->set_child[s]]])
466 {
467 if (di->set_size[s] + di->set_size[di->set_child[di->set_child[s]]]
468 >= 2 * di->set_size[di->set_child[s]])
469 {
470 di->set_chain[di->set_child[s]] = s;
471 di->set_child[s] = di->set_child[di->set_child[s]];
472 }
473 else
474 {
475 di->set_size[di->set_child[s]] = di->set_size[s];
476 s = di->set_chain[s] = di->set_child[s];
477 }
478 }
479
480 di->path_min[s] = di->path_min[w];
481 di->set_size[v] += di->set_size[w];
482 if (di->set_size[v] < 2 * di->set_size[w])
483 {
484 TBB tmp = s;
485 s = di->set_child[v];
486 di->set_child[v] = tmp;
487 }
488
489 /* Merge all subtrees. */
490 while (s)
491 {
492 di->set_chain[s] = v;
493 s = di->set_child[s];
494 }
495}
496
497/* This calculates the immediate dominators (or post-dominators if REVERSE is
498 true). DI is our working structure and should hold the DFS forest.
499 On return the immediate dominator to node V is in di->dom[V]. */
500
501static void
2b28c07a 502calc_idoms (struct dom_info *di, bool reverse)
f8032688
MM
503{
504 TBB v, w, k, par;
505 basic_block en_block;
628f6a4e
BE
506 edge_iterator ei, einext;
507
f8032688 508 if (reverse)
fefa31b5 509 en_block = EXIT_BLOCK_PTR_FOR_FN (cfun);
f8032688 510 else
fefa31b5 511 en_block = ENTRY_BLOCK_PTR_FOR_FN (cfun);
f8032688
MM
512
513 /* Go backwards in DFS order, to first look at the leafs. */
514 v = di->nodes;
515 while (v > 1)
516 {
517 basic_block bb = di->dfs_to_bb[v];
628f6a4e 518 edge e;
f8032688
MM
519
520 par = di->dfs_parent[v];
521 k = v;
628f6a4e
BE
522
523 ei = (reverse) ? ei_start (bb->succs) : ei_start (bb->preds);
524
f8032688 525 if (reverse)
26e0e410 526 {
26e0e410
RH
527 /* If this block has a fake edge to exit, process that first. */
528 if (bitmap_bit_p (di->fake_exit_edge, bb->index))
529 {
628f6a4e
BE
530 einext = ei;
531 einext.index = 0;
26e0e410
RH
532 goto do_fake_exit_edge;
533 }
534 }
f8032688
MM
535
536 /* Search all direct predecessors for the smallest node with a path
537 to them. That way we have the smallest node with also a path to
538 us only over nodes behind us. In effect we search for our
539 semidominator. */
628f6a4e 540 while (!ei_end_p (ei))
f8032688
MM
541 {
542 TBB k1;
543 basic_block b;
544
628f6a4e
BE
545 e = ei_edge (ei);
546 b = (reverse) ? e->dest : e->src;
547 einext = ei;
548 ei_next (&einext);
549
f8032688 550 if (b == en_block)
26e0e410
RH
551 {
552 do_fake_exit_edge:
8b1c6fd7 553 k1 = di->dfs_order[last_basic_block_for_fn (cfun)];
26e0e410 554 }
f8032688 555 else
0b17ab2f 556 k1 = di->dfs_order[b->index];
f8032688
MM
557
558 /* Call eval() only if really needed. If k1 is above V in DFS tree,
559 then we know, that eval(k1) == k1 and key[k1] == k1. */
560 if (k1 > v)
561 k1 = di->key[eval (di, k1)];
562 if (k1 < k)
563 k = k1;
628f6a4e
BE
564
565 ei = einext;
f8032688
MM
566 }
567
568 di->key[v] = k;
569 link_roots (di, par, v);
570 di->next_bucket[v] = di->bucket[k];
571 di->bucket[k] = v;
572
573 /* Transform semidominators into dominators. */
574 for (w = di->bucket[par]; w; w = di->next_bucket[w])
575 {
576 k = eval (di, w);
577 if (di->key[k] < di->key[w])
578 di->dom[w] = k;
579 else
580 di->dom[w] = par;
581 }
582 /* We don't need to cleanup next_bucket[]. */
583 di->bucket[par] = 0;
584 v--;
585 }
586
a1f300c0 587 /* Explicitly define the dominators. */
f8032688
MM
588 di->dom[1] = 0;
589 for (v = 2; v <= di->nodes; v++)
590 if (di->dom[v] != di->key[v])
591 di->dom[v] = di->dom[di->dom[v]];
592}
593
d47cc544
SB
594/* Assign dfs numbers starting from NUM to NODE and its sons. */
595
596static void
597assign_dfs_numbers (struct et_node *node, int *num)
598{
599 struct et_node *son;
600
601 node->dfs_num_in = (*num)++;
602
603 if (node->son)
604 {
605 assign_dfs_numbers (node->son, num);
606 for (son = node->son->right; son != node->son; son = son->right)
6de9cd9a 607 assign_dfs_numbers (son, num);
d47cc544 608 }
f8032688 609
d47cc544
SB
610 node->dfs_num_out = (*num)++;
611}
f8032688 612
5d3cc252 613/* Compute the data necessary for fast resolving of dominator queries in a
d47cc544 614 static dominator tree. */
f8032688 615
d47cc544
SB
616static void
617compute_dom_fast_query (enum cdi_direction dir)
618{
619 int num = 0;
620 basic_block bb;
2b28c07a 621 unsigned int dir_index = dom_convert_dir_to_idx (dir);
d47cc544 622
2ba31c05 623 gcc_checking_assert (dom_info_available_p (dir));
d47cc544 624
2b28c07a 625 if (dom_computed[dir_index] == DOM_OK)
d47cc544
SB
626 return;
627
04a90bec 628 FOR_ALL_BB_FN (bb, cfun)
d47cc544 629 {
2b28c07a
JC
630 if (!bb->dom[dir_index]->father)
631 assign_dfs_numbers (bb->dom[dir_index], &num);
d47cc544
SB
632 }
633
2b28c07a 634 dom_computed[dir_index] = DOM_OK;
d47cc544
SB
635}
636
637/* The main entry point into this module. DIR is set depending on whether
638 we want to compute dominators or postdominators. */
639
640void
641calculate_dominance_info (enum cdi_direction dir)
f8032688
MM
642{
643 struct dom_info di;
355be0dc 644 basic_block b;
2b28c07a
JC
645 unsigned int dir_index = dom_convert_dir_to_idx (dir);
646 bool reverse = (dir == CDI_POST_DOMINATORS) ? true : false;
355be0dc 647
2b28c07a 648 if (dom_computed[dir_index] == DOM_OK)
d47cc544 649 return;
355be0dc 650
74c96e0c 651 timevar_push (TV_DOMINANCE);
fce22de5 652 if (!dom_info_available_p (dir))
d47cc544 653 {
2b28c07a 654 gcc_assert (!n_bbs_in_dom_tree[dir_index]);
f8032688 655
04a90bec 656 FOR_ALL_BB_FN (b, cfun)
d47cc544 657 {
2b28c07a 658 b->dom[dir_index] = et_new_tree (b);
d47cc544 659 }
0cae8d31 660 n_bbs_in_dom_tree[dir_index] = n_basic_blocks_for_fn (cfun);
f8032688 661
26e0e410 662 init_dom_info (&di, dir);
2b28c07a
JC
663 calc_dfs_tree (&di, reverse);
664 calc_idoms (&di, reverse);
355be0dc 665
11cd3bed 666 FOR_EACH_BB_FN (b, cfun)
d47cc544
SB
667 {
668 TBB d = di.dom[di.dfs_order[b->index]];
669
670 if (di.dfs_to_bb[d])
2b28c07a 671 et_set_father (b->dom[dir_index], di.dfs_to_bb[d]->dom[dir_index]);
d47cc544 672 }
e0082a72 673
d47cc544 674 free_dom_info (&di);
2b28c07a 675 dom_computed[dir_index] = DOM_NO_FAST_QUERY;
355be0dc
JH
676 }
677
d47cc544 678 compute_dom_fast_query (dir);
74c96e0c
ZD
679
680 timevar_pop (TV_DOMINANCE);
355be0dc
JH
681}
682
d47cc544 683/* Free dominance information for direction DIR. */
355be0dc 684void
e3f613cb 685free_dominance_info (function *fn, enum cdi_direction dir)
355be0dc
JH
686{
687 basic_block bb;
2b28c07a 688 unsigned int dir_index = dom_convert_dir_to_idx (dir);
355be0dc 689
e3f613cb 690 if (!dom_info_available_p (fn, dir))
d47cc544
SB
691 return;
692
e3f613cb 693 FOR_ALL_BB_FN (bb, fn)
d47cc544 694 {
2b28c07a
JC
695 et_free_tree_force (bb->dom[dir_index]);
696 bb->dom[dir_index] = NULL;
d47cc544 697 }
5a6ccafd 698 et_free_pools ();
d47cc544 699
e3f613cb
RB
700 fn->cfg->x_n_bbs_in_dom_tree[dir_index] = 0;
701
702 fn->cfg->x_dom_computed[dir_index] = DOM_NONE;
703}
6de9cd9a 704
e3f613cb
RB
705void
706free_dominance_info (enum cdi_direction dir)
707{
708 free_dominance_info (cfun, dir);
355be0dc
JH
709}
710
711/* Return the immediate dominator of basic block BB. */
712basic_block
d47cc544 713get_immediate_dominator (enum cdi_direction dir, basic_block bb)
355be0dc 714{
2b28c07a
JC
715 unsigned int dir_index = dom_convert_dir_to_idx (dir);
716 struct et_node *node = bb->dom[dir_index];
d47cc544 717
2ba31c05 718 gcc_checking_assert (dom_computed[dir_index]);
d47cc544
SB
719
720 if (!node->father)
721 return NULL;
722
f883e0a7 723 return (basic_block) node->father->data;
355be0dc
JH
724}
725
726/* Set the immediate dominator of the block possibly removing
727 existing edge. NULL can be used to remove any edge. */
7031a8b9 728void
d47cc544
SB
729set_immediate_dominator (enum cdi_direction dir, basic_block bb,
730 basic_block dominated_by)
355be0dc 731{
2b28c07a
JC
732 unsigned int dir_index = dom_convert_dir_to_idx (dir);
733 struct et_node *node = bb->dom[dir_index];
b8698a0f 734
2ba31c05 735 gcc_checking_assert (dom_computed[dir_index]);
355be0dc 736
d47cc544 737 if (node->father)
355be0dc 738 {
d47cc544 739 if (node->father->data == dominated_by)
6de9cd9a 740 return;
d47cc544 741 et_split (node);
355be0dc 742 }
d47cc544
SB
743
744 if (dominated_by)
2b28c07a 745 et_set_father (node, dominated_by->dom[dir_index]);
d47cc544 746
2b28c07a
JC
747 if (dom_computed[dir_index] == DOM_OK)
748 dom_computed[dir_index] = DOM_NO_FAST_QUERY;
355be0dc
JH
749}
750
66f97d31
ZD
751/* Returns the list of basic blocks immediately dominated by BB, in the
752 direction DIR. */
9771b263 753vec<basic_block>
66f97d31 754get_dominated_by (enum cdi_direction dir, basic_block bb)
355be0dc 755{
66f97d31 756 unsigned int dir_index = dom_convert_dir_to_idx (dir);
2b28c07a 757 struct et_node *node = bb->dom[dir_index], *son = node->son, *ason;
6e1aa848 758 vec<basic_block> bbs = vNULL;
66f97d31 759
2ba31c05 760 gcc_checking_assert (dom_computed[dir_index]);
d47cc544
SB
761
762 if (!son)
6e1aa848 763 return vNULL;
d47cc544 764
9771b263 765 bbs.safe_push ((basic_block) son->data);
2d888286 766 for (ason = son->right; ason != son; ason = ason->right)
9771b263 767 bbs.safe_push ((basic_block) ason->data);
355be0dc 768
66f97d31 769 return bbs;
355be0dc
JH
770}
771
66f97d31
ZD
772/* Returns the list of basic blocks that are immediately dominated (in
773 direction DIR) by some block between N_REGION ones stored in REGION,
774 except for blocks in the REGION itself. */
b8698a0f 775
9771b263 776vec<basic_block>
42759f1e 777get_dominated_by_region (enum cdi_direction dir, basic_block *region,
66f97d31 778 unsigned n_region)
42759f1e 779{
66f97d31 780 unsigned i;
42759f1e 781 basic_block dom;
6e1aa848 782 vec<basic_block> doms = vNULL;
42759f1e
ZD
783
784 for (i = 0; i < n_region; i++)
6580ee77 785 region[i]->flags |= BB_DUPLICATED;
42759f1e
ZD
786 for (i = 0; i < n_region; i++)
787 for (dom = first_dom_son (dir, region[i]);
788 dom;
789 dom = next_dom_son (dir, dom))
6580ee77 790 if (!(dom->flags & BB_DUPLICATED))
9771b263 791 doms.safe_push (dom);
42759f1e 792 for (i = 0; i < n_region; i++)
6580ee77 793 region[i]->flags &= ~BB_DUPLICATED;
42759f1e 794
66f97d31 795 return doms;
42759f1e
ZD
796}
797
438c239d 798/* Returns the list of basic blocks including BB dominated by BB, in the
cad9aa15
MK
799 direction DIR up to DEPTH in the dominator tree. The DEPTH of zero will
800 produce a vector containing all dominated blocks. The vector will be sorted
801 in preorder. */
438c239d 802
9771b263 803vec<basic_block>
cad9aa15 804get_dominated_to_depth (enum cdi_direction dir, basic_block bb, int depth)
438c239d 805{
6e1aa848 806 vec<basic_block> bbs = vNULL;
438c239d 807 unsigned i;
cad9aa15 808 unsigned next_level_start;
438c239d
RG
809
810 i = 0;
9771b263
DN
811 bbs.safe_push (bb);
812 next_level_start = 1; /* = bbs.length (); */
438c239d
RG
813
814 do
815 {
816 basic_block son;
817
9771b263 818 bb = bbs[i++];
438c239d
RG
819 for (son = first_dom_son (dir, bb);
820 son;
821 son = next_dom_son (dir, son))
9771b263 822 bbs.safe_push (son);
cad9aa15
MK
823
824 if (i == next_level_start && --depth)
9771b263 825 next_level_start = bbs.length ();
438c239d 826 }
cad9aa15 827 while (i < next_level_start);
438c239d
RG
828
829 return bbs;
830}
831
cad9aa15
MK
832/* Returns the list of basic blocks including BB dominated by BB, in the
833 direction DIR. The vector will be sorted in preorder. */
834
9771b263 835vec<basic_block>
cad9aa15
MK
836get_all_dominated_blocks (enum cdi_direction dir, basic_block bb)
837{
838 return get_dominated_to_depth (dir, bb, 0);
839}
840
355be0dc
JH
841/* Redirect all edges pointing to BB to TO. */
842void
d47cc544
SB
843redirect_immediate_dominators (enum cdi_direction dir, basic_block bb,
844 basic_block to)
355be0dc 845{
2b28c07a
JC
846 unsigned int dir_index = dom_convert_dir_to_idx (dir);
847 struct et_node *bb_node, *to_node, *son;
b8698a0f 848
2b28c07a
JC
849 bb_node = bb->dom[dir_index];
850 to_node = to->dom[dir_index];
d47cc544 851
2ba31c05 852 gcc_checking_assert (dom_computed[dir_index]);
355be0dc 853
d47cc544
SB
854 if (!bb_node->son)
855 return;
856
857 while (bb_node->son)
355be0dc 858 {
d47cc544
SB
859 son = bb_node->son;
860
861 et_split (son);
862 et_set_father (son, to_node);
355be0dc 863 }
d47cc544 864
2b28c07a
JC
865 if (dom_computed[dir_index] == DOM_OK)
866 dom_computed[dir_index] = DOM_NO_FAST_QUERY;
355be0dc
JH
867}
868
869/* Find first basic block in the tree dominating both BB1 and BB2. */
870basic_block
d47cc544 871nearest_common_dominator (enum cdi_direction dir, basic_block bb1, basic_block bb2)
355be0dc 872{
2b28c07a
JC
873 unsigned int dir_index = dom_convert_dir_to_idx (dir);
874
2ba31c05 875 gcc_checking_assert (dom_computed[dir_index]);
d47cc544 876
355be0dc
JH
877 if (!bb1)
878 return bb2;
879 if (!bb2)
880 return bb1;
d47cc544 881
f883e0a7 882 return (basic_block) et_nca (bb1->dom[dir_index], bb2->dom[dir_index])->data;
355be0dc
JH
883}
884
0bca51f0
DN
885
886/* Find the nearest common dominator for the basic blocks in BLOCKS,
887 using dominance direction DIR. */
888
889basic_block
890nearest_common_dominator_for_set (enum cdi_direction dir, bitmap blocks)
891{
892 unsigned i, first;
893 bitmap_iterator bi;
894 basic_block dom;
b8698a0f 895
0bca51f0 896 first = bitmap_first_set_bit (blocks);
06e28de2 897 dom = BASIC_BLOCK_FOR_FN (cfun, first);
0bca51f0 898 EXECUTE_IF_SET_IN_BITMAP (blocks, 0, i, bi)
06e28de2
DM
899 if (dom != BASIC_BLOCK_FOR_FN (cfun, i))
900 dom = nearest_common_dominator (dir, dom, BASIC_BLOCK_FOR_FN (cfun, i));
0bca51f0
DN
901
902 return dom;
903}
904
b629276a
DB
905/* Given a dominator tree, we can determine whether one thing
906 dominates another in constant time by using two DFS numbers:
907
908 1. The number for when we visit a node on the way down the tree
909 2. The number for when we visit a node on the way back up the tree
910
911 You can view these as bounds for the range of dfs numbers the
912 nodes in the subtree of the dominator tree rooted at that node
913 will contain.
b8698a0f 914
b629276a
DB
915 The dominator tree is always a simple acyclic tree, so there are
916 only three possible relations two nodes in the dominator tree have
917 to each other:
b8698a0f 918
b629276a
DB
919 1. Node A is above Node B (and thus, Node A dominates node B)
920
921 A
922 |
923 C
924 / \
925 B D
926
927
928 In the above case, DFS_Number_In of A will be <= DFS_Number_In of
929 B, and DFS_Number_Out of A will be >= DFS_Number_Out of B. This is
930 because we must hit A in the dominator tree *before* B on the walk
931 down, and we will hit A *after* B on the walk back up
b8698a0f 932
d8701f02 933 2. Node A is below node B (and thus, node B dominates node A)
b8698a0f
L
934
935
b629276a
DB
936 B
937 |
938 A
939 / \
940 C D
941
942 In the above case, DFS_Number_In of A will be >= DFS_Number_In of
943 B, and DFS_Number_Out of A will be <= DFS_Number_Out of B.
b8698a0f 944
b629276a
DB
945 This is because we must hit A in the dominator tree *after* B on
946 the walk down, and we will hit A *before* B on the walk back up
b8698a0f 947
b629276a
DB
948 3. Node A and B are siblings (and thus, neither dominates the other)
949
950 C
951 |
952 D
953 / \
954 A B
955
956 In the above case, DFS_Number_In of A will *always* be <=
957 DFS_Number_In of B, and DFS_Number_Out of A will *always* be <=
958 DFS_Number_Out of B. This is because we will always finish the dfs
959 walk of one of the subtrees before the other, and thus, the dfs
960 numbers for one subtree can't intersect with the range of dfs
961 numbers for the other subtree. If you swap A and B's position in
962 the dominator tree, the comparison changes direction, but the point
963 is that both comparisons will always go the same way if there is no
964 dominance relationship.
965
966 Thus, it is sufficient to write
967
968 A_Dominates_B (node A, node B)
969 {
b8698a0f 970 return DFS_Number_In(A) <= DFS_Number_In(B)
b629276a
DB
971 && DFS_Number_Out (A) >= DFS_Number_Out(B);
972 }
973
974 A_Dominated_by_B (node A, node B)
975 {
976 return DFS_Number_In(A) >= DFS_Number_In(A)
977 && DFS_Number_Out (A) <= DFS_Number_Out(B);
978 } */
0bca51f0 979
355be0dc
JH
980/* Return TRUE in case BB1 is dominated by BB2. */
981bool
ed7a4b4b 982dominated_by_p (enum cdi_direction dir, const_basic_block bb1, const_basic_block bb2)
b8698a0f 983{
2b28c07a
JC
984 unsigned int dir_index = dom_convert_dir_to_idx (dir);
985 struct et_node *n1 = bb1->dom[dir_index], *n2 = bb2->dom[dir_index];
b8698a0f 986
2ba31c05 987 gcc_checking_assert (dom_computed[dir_index]);
d47cc544 988
2b28c07a 989 if (dom_computed[dir_index] == DOM_OK)
d47cc544 990 return (n1->dfs_num_in >= n2->dfs_num_in
6de9cd9a 991 && n1->dfs_num_out <= n2->dfs_num_out);
d47cc544
SB
992
993 return et_below (n1, n2);
355be0dc
JH
994}
995
f074ff6c
ZD
996/* Returns the entry dfs number for basic block BB, in the direction DIR. */
997
998unsigned
999bb_dom_dfs_in (enum cdi_direction dir, basic_block bb)
1000{
2b28c07a
JC
1001 unsigned int dir_index = dom_convert_dir_to_idx (dir);
1002 struct et_node *n = bb->dom[dir_index];
f074ff6c 1003
2ba31c05 1004 gcc_checking_assert (dom_computed[dir_index] == DOM_OK);
f074ff6c
ZD
1005 return n->dfs_num_in;
1006}
1007
1008/* Returns the exit dfs number for basic block BB, in the direction DIR. */
1009
1010unsigned
1011bb_dom_dfs_out (enum cdi_direction dir, basic_block bb)
1012{
2b28c07a
JC
1013 unsigned int dir_index = dom_convert_dir_to_idx (dir);
1014 struct et_node *n = bb->dom[dir_index];
f074ff6c 1015
2ba31c05 1016 gcc_checking_assert (dom_computed[dir_index] == DOM_OK);
f074ff6c
ZD
1017 return n->dfs_num_out;
1018}
1019
355be0dc 1020/* Verify invariants of dominator structure. */
24e47c76 1021DEBUG_FUNCTION void
d47cc544 1022verify_dominators (enum cdi_direction dir)
355be0dc
JH
1023{
1024 int err = 0;
1fc3998d
ZD
1025 basic_block bb, imm_bb, imm_bb_correct;
1026 struct dom_info di;
1027 bool reverse = (dir == CDI_POST_DOMINATORS) ? true : false;
355be0dc 1028
fce22de5 1029 gcc_assert (dom_info_available_p (dir));
d47cc544 1030
1fc3998d
ZD
1031 init_dom_info (&di, dir);
1032 calc_dfs_tree (&di, reverse);
1033 calc_idoms (&di, reverse);
1034
11cd3bed 1035 FOR_EACH_BB_FN (bb, cfun)
355be0dc 1036 {
1fc3998d
ZD
1037 imm_bb = get_immediate_dominator (dir, bb);
1038 if (!imm_bb)
f8032688 1039 {
66f97d31 1040 error ("dominator of %d status unknown", bb->index);
355be0dc
JH
1041 err = 1;
1042 }
66f97d31 1043
1fc3998d
ZD
1044 imm_bb_correct = di.dfs_to_bb[di.dom[di.dfs_order[bb->index]]];
1045 if (imm_bb != imm_bb_correct)
e7bd94cc 1046 {
66f97d31 1047 error ("dominator of %d should be %d, not %d",
1fc3998d 1048 bb->index, imm_bb_correct->index, imm_bb->index);
66f97d31 1049 err = 1;
e7bd94cc
ZD
1050 }
1051 }
1052
1fc3998d 1053 free_dom_info (&di);
ced3f397 1054 gcc_assert (!err);
355be0dc
JH
1055}
1056
738ed977
ZD
1057/* Determine immediate dominator (or postdominator, according to DIR) of BB,
1058 assuming that dominators of other blocks are correct. We also use it to
1059 recompute the dominators in a restricted area, by iterating it until it
71cc389b 1060 reaches a fixed point. */
738ed977 1061
355be0dc 1062basic_block
66f97d31 1063recompute_dominator (enum cdi_direction dir, basic_block bb)
355be0dc 1064{
2b28c07a 1065 unsigned int dir_index = dom_convert_dir_to_idx (dir);
738ed977
ZD
1066 basic_block dom_bb = NULL;
1067 edge e;
628f6a4e 1068 edge_iterator ei;
355be0dc 1069
2ba31c05 1070 gcc_checking_assert (dom_computed[dir_index]);
d47cc544 1071
738ed977
ZD
1072 if (dir == CDI_DOMINATORS)
1073 {
628f6a4e 1074 FOR_EACH_EDGE (e, ei, bb->preds)
738ed977
ZD
1075 {
1076 if (!dominated_by_p (dir, e->src, bb))
1077 dom_bb = nearest_common_dominator (dir, dom_bb, e->src);
1078 }
1079 }
1080 else
1081 {
628f6a4e 1082 FOR_EACH_EDGE (e, ei, bb->succs)
738ed977
ZD
1083 {
1084 if (!dominated_by_p (dir, e->dest, bb))
1085 dom_bb = nearest_common_dominator (dir, dom_bb, e->dest);
1086 }
1087 }
f8032688 1088
738ed977 1089 return dom_bb;
355be0dc
JH
1090}
1091
66f97d31
ZD
1092/* Use simple heuristics (see iterate_fix_dominators) to determine dominators
1093 of BBS. We assume that all the immediate dominators except for those of the
1094 blocks in BBS are correct. If CONSERVATIVE is true, we also assume that the
1095 currently recorded immediate dominators of blocks in BBS really dominate the
1096 blocks. The basic blocks for that we determine the dominator are removed
1097 from BBS. */
1098
1099static void
9771b263 1100prune_bbs_to_update_dominators (vec<basic_block> bbs,
66f97d31
ZD
1101 bool conservative)
1102{
1103 unsigned i;
1104 bool single;
1105 basic_block bb, dom = NULL;
1106 edge_iterator ei;
1107 edge e;
1108
9771b263 1109 for (i = 0; bbs.iterate (i, &bb);)
66f97d31 1110 {
fefa31b5 1111 if (bb == ENTRY_BLOCK_PTR_FOR_FN (cfun))
66f97d31
ZD
1112 goto succeed;
1113
1114 if (single_pred_p (bb))
1115 {
1116 set_immediate_dominator (CDI_DOMINATORS, bb, single_pred (bb));
1117 goto succeed;
1118 }
1119
1120 if (!conservative)
1121 goto fail;
1122
1123 single = true;
1124 dom = NULL;
1125 FOR_EACH_EDGE (e, ei, bb->preds)
1126 {
1127 if (dominated_by_p (CDI_DOMINATORS, e->src, bb))
1128 continue;
1129
1130 if (!dom)
1131 dom = e->src;
1132 else
1133 {
1134 single = false;
1135 dom = nearest_common_dominator (CDI_DOMINATORS, dom, e->src);
1136 }
1137 }
1138
1139 gcc_assert (dom != NULL);
1140 if (single
1141 || find_edge (dom, bb))
1142 {
1143 set_immediate_dominator (CDI_DOMINATORS, bb, dom);
1144 goto succeed;
1145 }
1146
1147fail:
1148 i++;
1149 continue;
1150
1151succeed:
9771b263 1152 bbs.unordered_remove (i);
66f97d31
ZD
1153 }
1154}
1155
1156/* Returns root of the dominance tree in the direction DIR that contains
1157 BB. */
1158
1159static basic_block
1160root_of_dom_tree (enum cdi_direction dir, basic_block bb)
1161{
f883e0a7 1162 return (basic_block) et_root (bb->dom[dom_convert_dir_to_idx (dir)])->data;
66f97d31
ZD
1163}
1164
1165/* See the comment in iterate_fix_dominators. Finds the immediate dominators
1166 for the sons of Y, found using the SON and BROTHER arrays representing
1167 the dominance tree of graph G. BBS maps the vertices of G to the basic
1168 blocks. */
1169
1170static void
9771b263 1171determine_dominators_for_sons (struct graph *g, vec<basic_block> bbs,
66f97d31
ZD
1172 int y, int *son, int *brother)
1173{
1174 bitmap gprime;
1175 int i, a, nc;
9771b263 1176 vec<int> *sccs;
66f97d31
ZD
1177 basic_block bb, dom, ybb;
1178 unsigned si;
1179 edge e;
1180 edge_iterator ei;
1181
1182 if (son[y] == -1)
1183 return;
9771b263 1184 if (y == (int) bbs.length ())
fefa31b5 1185 ybb = ENTRY_BLOCK_PTR_FOR_FN (cfun);
66f97d31 1186 else
9771b263 1187 ybb = bbs[y];
66f97d31
ZD
1188
1189 if (brother[son[y]] == -1)
1190 {
1191 /* Handle the common case Y has just one son specially. */
9771b263 1192 bb = bbs[son[y]];
66f97d31
ZD
1193 set_immediate_dominator (CDI_DOMINATORS, bb,
1194 recompute_dominator (CDI_DOMINATORS, bb));
1195 identify_vertices (g, y, son[y]);
1196 return;
1197 }
1198
1199 gprime = BITMAP_ALLOC (NULL);
1200 for (a = son[y]; a != -1; a = brother[a])
1201 bitmap_set_bit (gprime, a);
1202
1203 nc = graphds_scc (g, gprime);
1204 BITMAP_FREE (gprime);
1205
9771b263
DN
1206 /* ??? Needed to work around the pre-processor confusion with
1207 using a multi-argument template type as macro argument. */
1208 typedef vec<int> vec_int_heap;
1209 sccs = XCNEWVEC (vec_int_heap, nc);
66f97d31 1210 for (a = son[y]; a != -1; a = brother[a])
9771b263 1211 sccs[g->vertices[a].component].safe_push (a);
66f97d31
ZD
1212
1213 for (i = nc - 1; i >= 0; i--)
1214 {
1215 dom = NULL;
9771b263 1216 FOR_EACH_VEC_ELT (sccs[i], si, a)
66f97d31 1217 {
9771b263 1218 bb = bbs[a];
66f97d31
ZD
1219 FOR_EACH_EDGE (e, ei, bb->preds)
1220 {
1221 if (root_of_dom_tree (CDI_DOMINATORS, e->src) != ybb)
1222 continue;
1223
1224 dom = nearest_common_dominator (CDI_DOMINATORS, dom, e->src);
1225 }
1226 }
1227
1228 gcc_assert (dom != NULL);
9771b263 1229 FOR_EACH_VEC_ELT (sccs[i], si, a)
66f97d31 1230 {
9771b263 1231 bb = bbs[a];
66f97d31
ZD
1232 set_immediate_dominator (CDI_DOMINATORS, bb, dom);
1233 }
1234 }
1235
1236 for (i = 0; i < nc; i++)
9771b263 1237 sccs[i].release ();
66f97d31
ZD
1238 free (sccs);
1239
1240 for (a = son[y]; a != -1; a = brother[a])
1241 identify_vertices (g, y, a);
1242}
1243
1244/* Recompute dominance information for basic blocks in the set BBS. The
1245 function assumes that the immediate dominators of all the other blocks
1246 in CFG are correct, and that there are no unreachable blocks.
1247
1248 If CONSERVATIVE is true, we additionally assume that all the ancestors of
1249 a block of BBS in the current dominance tree dominate it. */
1250
355be0dc 1251void
9771b263 1252iterate_fix_dominators (enum cdi_direction dir, vec<basic_block> bbs,
66f97d31 1253 bool conservative)
355be0dc 1254{
66f97d31
ZD
1255 unsigned i;
1256 basic_block bb, dom;
1257 struct graph *g;
1258 int n, y;
1259 size_t dom_i;
1260 edge e;
1261 edge_iterator ei;
66f97d31 1262 int *parent, *son, *brother;
2b28c07a 1263 unsigned int dir_index = dom_convert_dir_to_idx (dir);
355be0dc 1264
66f97d31
ZD
1265 /* We only support updating dominators. There are some problems with
1266 updating postdominators (need to add fake edges from infinite loops
1267 and noreturn functions), and since we do not currently use
1268 iterate_fix_dominators for postdominators, any attempt to handle these
1269 problems would be unused, untested, and almost surely buggy. We keep
1270 the DIR argument for consistency with the rest of the dominator analysis
1271 interface. */
2ba31c05 1272 gcc_checking_assert (dir == CDI_DOMINATORS && dom_computed[dir_index]);
d47cc544 1273
66f97d31
ZD
1274 /* The algorithm we use takes inspiration from the following papers, although
1275 the details are quite different from any of them:
1276
1277 [1] G. Ramalingam, T. Reps, An Incremental Algorithm for Maintaining the
1278 Dominator Tree of a Reducible Flowgraph
1279 [2] V. C. Sreedhar, G. R. Gao, Y.-F. Lee: Incremental computation of
1280 dominator trees
1281 [3] K. D. Cooper, T. J. Harvey and K. Kennedy: A Simple, Fast Dominance
1282 Algorithm
1283
1284 First, we use the following heuristics to decrease the size of the BBS
1285 set:
1286 a) if BB has a single predecessor, then its immediate dominator is this
1287 predecessor
1288 additionally, if CONSERVATIVE is true:
1289 b) if all the predecessors of BB except for one (X) are dominated by BB,
1290 then X is the immediate dominator of BB
1291 c) if the nearest common ancestor of the predecessors of BB is X and
1292 X -> BB is an edge in CFG, then X is the immediate dominator of BB
1293
1294 Then, we need to establish the dominance relation among the basic blocks
1295 in BBS. We split the dominance tree by removing the immediate dominator
0d52bcc1 1296 edges from BBS, creating a forest F. We form a graph G whose vertices
66f97d31 1297 are BBS and ENTRY and X -> Y is an edge of G if there exists an edge
0d52bcc1 1298 X' -> Y in CFG such that X' belongs to the tree of the dominance forest
66f97d31
ZD
1299 whose root is X. We then determine dominance tree of G. Note that
1300 for X, Y in BBS, X dominates Y in CFG if and only if X dominates Y in G.
1301 In this step, we can use arbitrary algorithm to determine dominators.
1302 We decided to prefer the algorithm [3] to the algorithm of
1303 Lengauer and Tarjan, since the set BBS is usually small (rarely exceeding
1304 10 during gcc bootstrap), and [3] should perform better in this case.
1305
1306 Finally, we need to determine the immediate dominators for the basic
1307 blocks of BBS. If the immediate dominator of X in G is Y, then
1308 the immediate dominator of X in CFG belongs to the tree of F rooted in
1309 Y. We process the dominator tree T of G recursively, starting from leaves.
1310 Suppose that X_1, X_2, ..., X_k are the sons of Y in T, and that the
1311 subtrees of the dominance tree of CFG rooted in X_i are already correct.
1312 Let G' be the subgraph of G induced by {X_1, X_2, ..., X_k}. We make
1313 the following observations:
1314 (i) the immediate dominator of all blocks in a strongly connected
1315 component of G' is the same
1316 (ii) if X has no predecessors in G', then the immediate dominator of X
1317 is the nearest common ancestor of the predecessors of X in the
1318 subtree of F rooted in Y
1319 Therefore, it suffices to find the topological ordering of G', and
1320 process the nodes X_i in this order using the rules (i) and (ii).
1321 Then, we contract all the nodes X_i with Y in G, so that the further
1322 steps work correctly. */
1323
1324 if (!conservative)
1325 {
1326 /* Split the tree now. If the idoms of blocks in BBS are not
1327 conservatively correct, setting the dominators using the
1328 heuristics in prune_bbs_to_update_dominators could
1329 create cycles in the dominance "tree", and cause ICE. */
9771b263 1330 FOR_EACH_VEC_ELT (bbs, i, bb)
66f97d31
ZD
1331 set_immediate_dominator (CDI_DOMINATORS, bb, NULL);
1332 }
1333
1334 prune_bbs_to_update_dominators (bbs, conservative);
9771b263 1335 n = bbs.length ();
66f97d31
ZD
1336
1337 if (n == 0)
1338 return;
e7bd94cc 1339
66f97d31 1340 if (n == 1)
355be0dc 1341 {
9771b263 1342 bb = bbs[0];
66f97d31
ZD
1343 set_immediate_dominator (CDI_DOMINATORS, bb,
1344 recompute_dominator (CDI_DOMINATORS, bb));
1345 return;
1346 }
1347
1348 /* Construct the graph G. */
1eb68d2d 1349 hash_map<basic_block, int> map (251);
9771b263 1350 FOR_EACH_VEC_ELT (bbs, i, bb)
66f97d31
ZD
1351 {
1352 /* If the dominance tree is conservatively correct, split it now. */
1353 if (conservative)
1354 set_immediate_dominator (CDI_DOMINATORS, bb, NULL);
1eb68d2d 1355 map.put (bb, i);
66f97d31 1356 }
1eb68d2d 1357 map.put (ENTRY_BLOCK_PTR_FOR_FN (cfun), n);
66f97d31
ZD
1358
1359 g = new_graph (n + 1);
1360 for (y = 0; y < g->n_vertices; y++)
1361 g->vertices[y].data = BITMAP_ALLOC (NULL);
9771b263 1362 FOR_EACH_VEC_ELT (bbs, i, bb)
66f97d31
ZD
1363 {
1364 FOR_EACH_EDGE (e, ei, bb->preds)
355be0dc 1365 {
66f97d31
ZD
1366 dom = root_of_dom_tree (CDI_DOMINATORS, e->src);
1367 if (dom == bb)
1368 continue;
1369
1eb68d2d 1370 dom_i = *map.get (dom);
66f97d31
ZD
1371
1372 /* Do not include parallel edges to G. */
fcaa4ca4 1373 if (!bitmap_set_bit ((bitmap) g->vertices[dom_i].data, i))
66f97d31
ZD
1374 continue;
1375
66f97d31 1376 add_edge (g, dom_i, i);
f8032688
MM
1377 }
1378 }
66f97d31
ZD
1379 for (y = 0; y < g->n_vertices; y++)
1380 BITMAP_FREE (g->vertices[y].data);
66f97d31
ZD
1381
1382 /* Find the dominator tree of G. */
1383 son = XNEWVEC (int, n + 1);
1384 brother = XNEWVEC (int, n + 1);
1385 parent = XNEWVEC (int, n + 1);
1386 graphds_domtree (g, n, parent, son, brother);
1387
1388 /* Finally, traverse the tree and find the immediate dominators. */
1389 for (y = n; son[y] != -1; y = son[y])
1390 continue;
1391 while (y != -1)
1392 {
1393 determine_dominators_for_sons (g, bbs, y, son, brother);
1394
1395 if (brother[y] != -1)
1396 {
1397 y = brother[y];
1398 while (son[y] != -1)
1399 y = son[y];
1400 }
1401 else
1402 y = parent[y];
1403 }
1404
1405 free (son);
1406 free (brother);
1407 free (parent);
e7bd94cc 1408
66f97d31 1409 free_graph (g);
355be0dc 1410}
f8032688 1411
355be0dc 1412void
d47cc544 1413add_to_dominance_info (enum cdi_direction dir, basic_block bb)
355be0dc 1414{
2b28c07a
JC
1415 unsigned int dir_index = dom_convert_dir_to_idx (dir);
1416
2ba31c05 1417 gcc_checking_assert (dom_computed[dir_index] && !bb->dom[dir_index]);
d47cc544 1418
2b28c07a 1419 n_bbs_in_dom_tree[dir_index]++;
b8698a0f 1420
2b28c07a 1421 bb->dom[dir_index] = et_new_tree (bb);
d47cc544 1422
2b28c07a
JC
1423 if (dom_computed[dir_index] == DOM_OK)
1424 dom_computed[dir_index] = DOM_NO_FAST_QUERY;
355be0dc
JH
1425}
1426
1427void
d47cc544
SB
1428delete_from_dominance_info (enum cdi_direction dir, basic_block bb)
1429{
2b28c07a 1430 unsigned int dir_index = dom_convert_dir_to_idx (dir);
d47cc544 1431
2ba31c05 1432 gcc_checking_assert (dom_computed[dir_index]);
d47cc544 1433
2b28c07a
JC
1434 et_free_tree (bb->dom[dir_index]);
1435 bb->dom[dir_index] = NULL;
1436 n_bbs_in_dom_tree[dir_index]--;
1437
1438 if (dom_computed[dir_index] == DOM_OK)
1439 dom_computed[dir_index] = DOM_NO_FAST_QUERY;
d47cc544
SB
1440}
1441
1442/* Returns the first son of BB in the dominator or postdominator tree
1443 as determined by DIR. */
1444
1445basic_block
1446first_dom_son (enum cdi_direction dir, basic_block bb)
355be0dc 1447{
2b28c07a
JC
1448 unsigned int dir_index = dom_convert_dir_to_idx (dir);
1449 struct et_node *son = bb->dom[dir_index]->son;
d47cc544 1450
f883e0a7 1451 return (basic_block) (son ? son->data : NULL);
d47cc544
SB
1452}
1453
1454/* Returns the next dominance son after BB in the dominator or postdominator
1455 tree as determined by DIR, or NULL if it was the last one. */
1456
1457basic_block
1458next_dom_son (enum cdi_direction dir, basic_block bb)
1459{
2b28c07a
JC
1460 unsigned int dir_index = dom_convert_dir_to_idx (dir);
1461 struct et_node *next = bb->dom[dir_index]->right;
d47cc544 1462
f883e0a7 1463 return (basic_block) (next->father->son == next ? NULL : next->data);
355be0dc
JH
1464}
1465
2b28c07a
JC
1466/* Return dominance availability for dominance info DIR. */
1467
1468enum dom_state
e3f613cb 1469dom_info_state (function *fn, enum cdi_direction dir)
2b28c07a 1470{
e3f613cb
RB
1471 if (!fn->cfg)
1472 return DOM_NONE;
1473
2b28c07a 1474 unsigned int dir_index = dom_convert_dir_to_idx (dir);
e3f613cb
RB
1475 return fn->cfg->x_dom_computed[dir_index];
1476}
2b28c07a 1477
e3f613cb
RB
1478enum dom_state
1479dom_info_state (enum cdi_direction dir)
1480{
1481 return dom_info_state (cfun, dir);
2b28c07a
JC
1482}
1483
1484/* Set the dominance availability for dominance info DIR to NEW_STATE. */
1485
1486void
1487set_dom_info_availability (enum cdi_direction dir, enum dom_state new_state)
1488{
1489 unsigned int dir_index = dom_convert_dir_to_idx (dir);
1490
1491 dom_computed[dir_index] = new_state;
1492}
1493
fce22de5
ZD
1494/* Returns true if dominance information for direction DIR is available. */
1495
1496bool
e3f613cb 1497dom_info_available_p (function *fn, enum cdi_direction dir)
fce22de5 1498{
e3f613cb
RB
1499 return dom_info_state (fn, dir) != DOM_NONE;
1500}
2b28c07a 1501
e3f613cb
RB
1502bool
1503dom_info_available_p (enum cdi_direction dir)
1504{
1505 return dom_info_available_p (cfun, dir);
fce22de5
ZD
1506}
1507
24e47c76 1508DEBUG_FUNCTION void
d47cc544 1509debug_dominance_info (enum cdi_direction dir)
355be0dc
JH
1510{
1511 basic_block bb, bb2;
11cd3bed 1512 FOR_EACH_BB_FN (bb, cfun)
d47cc544 1513 if ((bb2 = get_immediate_dominator (dir, bb)))
355be0dc 1514 fprintf (stderr, "%i %i\n", bb->index, bb2->index);
f8032688 1515}
1fc3998d
ZD
1516
1517/* Prints to stderr representation of the dominance tree (for direction DIR)
cea618ac 1518 rooted in ROOT, indented by INDENT tabulators. If INDENT_FIRST is false,
1fc3998d
ZD
1519 the first line of the output is not indented. */
1520
1521static void
1522debug_dominance_tree_1 (enum cdi_direction dir, basic_block root,
1523 unsigned indent, bool indent_first)
1524{
1525 basic_block son;
1526 unsigned i;
1527 bool first = true;
1528
1529 if (indent_first)
1530 for (i = 0; i < indent; i++)
1531 fprintf (stderr, "\t");
1532 fprintf (stderr, "%d\t", root->index);
1533
1534 for (son = first_dom_son (dir, root);
1535 son;
1536 son = next_dom_son (dir, son))
1537 {
1538 debug_dominance_tree_1 (dir, son, indent + 1, !first);
1539 first = false;
1540 }
1541
1542 if (first)
1543 fprintf (stderr, "\n");
1544}
1545
1546/* Prints to stderr representation of the dominance tree (for direction DIR)
1547 rooted in ROOT. */
1548
24e47c76 1549DEBUG_FUNCTION void
1fc3998d
ZD
1550debug_dominance_tree (enum cdi_direction dir, basic_block root)
1551{
1552 debug_dominance_tree_1 (dir, root, 0, false);
1553}
This page took 3.88553 seconds and 5 git commands to generate.