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