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