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