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