]> gcc.gnu.org Git - gcc.git/blame - gcc/dominance.c
m68k.c (override_options): Don't override REAL_MODE_FORMAT.
[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"
f8032688 47
d47cc544 48/* Whether the dominators and the postdominators are available. */
2b28c07a 49static enum dom_state dom_computed[2];
f8032688
MM
50
51/* We name our nodes with integers, beginning with 1. Zero is reserved for
52 'undefined' or 'end of list'. The name of each node is given by the dfs
53 number of the corresponding basic block. Please note, that we include the
54 artificial ENTRY_BLOCK (or EXIT_BLOCK in the post-dom case) in our lists to
24bd1a0b 55 support multiple entry points. Its dfs number is of course 1. */
f8032688
MM
56
57/* Type of Basic Block aka. TBB */
58typedef unsigned int TBB;
59
60/* We work in a poor-mans object oriented fashion, and carry an instance of
61 this structure through all our 'methods'. It holds various arrays
62 reflecting the (sub)structure of the flowgraph. Most of them are of type
63 TBB and are also indexed by TBB. */
64
65struct dom_info
66{
67 /* The parent of a node in the DFS tree. */
68 TBB *dfs_parent;
69 /* For a node x key[x] is roughly the node nearest to the root from which
70 exists a way to x only over nodes behind x. Such a node is also called
71 semidominator. */
72 TBB *key;
73 /* The value in path_min[x] is the node y on the path from x to the root of
74 the tree x is in with the smallest key[y]. */
75 TBB *path_min;
76 /* bucket[x] points to the first node of the set of nodes having x as key. */
77 TBB *bucket;
78 /* And next_bucket[x] points to the next node. */
79 TBB *next_bucket;
80 /* After the algorithm is done, dom[x] contains the immediate dominator
81 of x. */
82 TBB *dom;
83
84 /* The following few fields implement the structures needed for disjoint
85 sets. */
86 /* set_chain[x] is the next node on the path from x to the representant
87 of the set containing x. If set_chain[x]==0 then x is a root. */
88 TBB *set_chain;
89 /* set_size[x] is the number of elements in the set named by x. */
90 unsigned int *set_size;
91 /* set_child[x] is used for balancing the tree representing a set. It can
92 be understood as the next sibling of x. */
93 TBB *set_child;
94
95 /* If b is the number of a basic block (BB->index), dfs_order[b] is the
96 number of that node in DFS order counted from 1. This is an index
97 into most of the other arrays in this structure. */
98 TBB *dfs_order;
09da1532 99 /* If x is the DFS-index of a node which corresponds with a basic block,
f8032688
MM
100 dfs_to_bb[x] is that basic block. Note, that in our structure there are
101 more nodes that basic blocks, so only dfs_to_bb[dfs_order[bb->index]]==bb
102 is true for every basic block bb, but not the opposite. */
103 basic_block *dfs_to_bb;
104
26e0e410 105 /* This is the next free DFS number when creating the DFS tree. */
f8032688
MM
106 unsigned int dfsnum;
107 /* The number of nodes in the DFS tree (==dfsnum-1). */
108 unsigned int nodes;
26e0e410
RH
109
110 /* Blocks with bits set here have a fake edge to EXIT. These are used
111 to turn a DFS forest into a proper tree. */
112 bitmap fake_exit_edge;
f8032688
MM
113};
114
26e0e410 115static void init_dom_info (struct dom_info *, enum cdi_direction);
7080f735 116static void free_dom_info (struct dom_info *);
2b28c07a
JC
117static void calc_dfs_tree_nonrec (struct dom_info *, basic_block, bool);
118static void calc_dfs_tree (struct dom_info *, bool);
7080f735
AJ
119static void compress (struct dom_info *, TBB);
120static TBB eval (struct dom_info *, TBB);
121static void link_roots (struct dom_info *, TBB, TBB);
2b28c07a 122static void calc_idoms (struct dom_info *, bool);
d47cc544 123void debug_dominance_info (enum cdi_direction);
f8032688 124
6de9cd9a
DN
125/* Keeps track of the*/
126static unsigned n_bbs_in_dom_tree[2];
127
f8032688
MM
128/* Helper macro for allocating and initializing an array,
129 for aesthetic reasons. */
130#define init_ar(var, type, num, content) \
3a538a66
KH
131 do \
132 { \
133 unsigned int i = 1; /* Catch content == i. */ \
134 if (! (content)) \
5ed6ace5 135 (var) = XCNEWVEC (type, num); \
3a538a66
KH
136 else \
137 { \
5ed6ace5 138 (var) = XNEWVEC (type, (num)); \
3a538a66
KH
139 for (i = 0; i < num; i++) \
140 (var)[i] = (content); \
141 } \
142 } \
143 while (0)
f8032688
MM
144
145/* Allocate all needed memory in a pessimistic fashion (so we round up).
4912a07c 146 This initializes the contents of DI, which already must be allocated. */
f8032688
MM
147
148static void
26e0e410 149init_dom_info (struct dom_info *di, enum cdi_direction dir)
f8032688 150{
24bd1a0b 151 unsigned int num = n_basic_blocks;
f8032688
MM
152 init_ar (di->dfs_parent, TBB, num, 0);
153 init_ar (di->path_min, TBB, num, i);
154 init_ar (di->key, TBB, num, i);
155 init_ar (di->dom, TBB, num, 0);
156
157 init_ar (di->bucket, TBB, num, 0);
158 init_ar (di->next_bucket, TBB, num, 0);
159
160 init_ar (di->set_chain, TBB, num, 0);
161 init_ar (di->set_size, unsigned int, num, 1);
162 init_ar (di->set_child, TBB, num, 0);
163
d55bc081 164 init_ar (di->dfs_order, TBB, (unsigned int) last_basic_block + 1, 0);
f8032688
MM
165 init_ar (di->dfs_to_bb, basic_block, num, 0);
166
167 di->dfsnum = 1;
168 di->nodes = 0;
26e0e410 169
2b28c07a
JC
170 switch (dir)
171 {
172 case CDI_DOMINATORS:
173 di->fake_exit_edge = NULL;
174 break;
175 case CDI_POST_DOMINATORS:
176 di->fake_exit_edge = BITMAP_ALLOC (NULL);
177 break;
178 default:
179 gcc_unreachable ();
180 break;
181 }
f8032688
MM
182}
183
184#undef init_ar
185
2b28c07a
JC
186/* Map dominance calculation type to array index used for various
187 dominance information arrays. This version is simple -- it will need
188 to be modified, obviously, if additional values are added to
189 cdi_direction. */
190
191static unsigned int
192dom_convert_dir_to_idx (enum cdi_direction dir)
193{
194 gcc_assert (dir == CDI_DOMINATORS || dir == CDI_POST_DOMINATORS);
195 return dir - 1;
196}
197
f8032688
MM
198/* Free all allocated memory in DI, but not DI itself. */
199
200static void
7080f735 201free_dom_info (struct dom_info *di)
f8032688
MM
202{
203 free (di->dfs_parent);
204 free (di->path_min);
205 free (di->key);
206 free (di->dom);
207 free (di->bucket);
208 free (di->next_bucket);
209 free (di->set_chain);
210 free (di->set_size);
211 free (di->set_child);
212 free (di->dfs_order);
213 free (di->dfs_to_bb);
8bdbfff5 214 BITMAP_FREE (di->fake_exit_edge);
f8032688
MM
215}
216
217/* The nonrecursive variant of creating a DFS tree. DI is our working
218 structure, BB the starting basic block for this tree and REVERSE
219 is true, if predecessors should be visited instead of successors of a
220 node. After this is done all nodes reachable from BB were visited, have
221 assigned their dfs number and are linked together to form a tree. */
222
223static void
2b28c07a 224calc_dfs_tree_nonrec (struct dom_info *di, basic_block bb, bool reverse)
f8032688 225{
f8032688
MM
226 /* We call this _only_ if bb is not already visited. */
227 edge e;
228 TBB child_i, my_i = 0;
628f6a4e
BE
229 edge_iterator *stack;
230 edge_iterator ei, einext;
f8032688
MM
231 int sp;
232 /* Start block (ENTRY_BLOCK_PTR for forward problem, EXIT_BLOCK for backward
233 problem). */
234 basic_block en_block;
235 /* Ending block. */
236 basic_block ex_block;
237
5ed6ace5 238 stack = XNEWVEC (edge_iterator, n_basic_blocks + 1);
f8032688
MM
239 sp = 0;
240
241 /* Initialize our border blocks, and the first edge. */
242 if (reverse)
243 {
628f6a4e 244 ei = ei_start (bb->preds);
f8032688
MM
245 en_block = EXIT_BLOCK_PTR;
246 ex_block = ENTRY_BLOCK_PTR;
247 }
248 else
249 {
628f6a4e 250 ei = ei_start (bb->succs);
f8032688
MM
251 en_block = ENTRY_BLOCK_PTR;
252 ex_block = EXIT_BLOCK_PTR;
253 }
254
255 /* When the stack is empty we break out of this loop. */
256 while (1)
257 {
258 basic_block bn;
259
260 /* This loop traverses edges e in depth first manner, and fills the
261 stack. */
628f6a4e 262 while (!ei_end_p (ei))
f8032688 263 {
628f6a4e 264 e = ei_edge (ei);
f8032688
MM
265
266 /* Deduce from E the current and the next block (BB and BN), and the
267 next edge. */
268 if (reverse)
269 {
270 bn = e->src;
271
272 /* If the next node BN is either already visited or a border
273 block the current edge is useless, and simply overwritten
274 with the next edge out of the current node. */
0b17ab2f 275 if (bn == ex_block || di->dfs_order[bn->index])
f8032688 276 {
628f6a4e 277 ei_next (&ei);
f8032688
MM
278 continue;
279 }
280 bb = e->dest;
628f6a4e 281 einext = ei_start (bn->preds);
f8032688
MM
282 }
283 else
284 {
285 bn = e->dest;
0b17ab2f 286 if (bn == ex_block || di->dfs_order[bn->index])
f8032688 287 {
628f6a4e 288 ei_next (&ei);
f8032688
MM
289 continue;
290 }
291 bb = e->src;
628f6a4e 292 einext = ei_start (bn->succs);
f8032688
MM
293 }
294
ced3f397 295 gcc_assert (bn != en_block);
f8032688
MM
296
297 /* Fill the DFS tree info calculatable _before_ recursing. */
298 if (bb != en_block)
0b17ab2f 299 my_i = di->dfs_order[bb->index];
f8032688 300 else
d55bc081 301 my_i = di->dfs_order[last_basic_block];
0b17ab2f 302 child_i = di->dfs_order[bn->index] = di->dfsnum++;
f8032688
MM
303 di->dfs_to_bb[child_i] = bn;
304 di->dfs_parent[child_i] = my_i;
305
306 /* Save the current point in the CFG on the stack, and recurse. */
628f6a4e
BE
307 stack[sp++] = ei;
308 ei = einext;
f8032688
MM
309 }
310
311 if (!sp)
312 break;
628f6a4e 313 ei = stack[--sp];
f8032688
MM
314
315 /* OK. The edge-list was exhausted, meaning normally we would
316 end the recursion. After returning from the recursive call,
317 there were (may be) other statements which were run after a
318 child node was completely considered by DFS. Here is the
319 point to do it in the non-recursive variant.
320 E.g. The block just completed is in e->dest for forward DFS,
321 the block not yet completed (the parent of the one above)
322 in e->src. This could be used e.g. for computing the number of
323 descendants or the tree depth. */
628f6a4e 324 ei_next (&ei);
f8032688
MM
325 }
326 free (stack);
327}
328
329/* The main entry for calculating the DFS tree or forest. DI is our working
330 structure and REVERSE is true, if we are interested in the reverse flow
331 graph. In that case the result is not necessarily a tree but a forest,
332 because there may be nodes from which the EXIT_BLOCK is unreachable. */
333
334static void
2b28c07a 335calc_dfs_tree (struct dom_info *di, bool reverse)
f8032688
MM
336{
337 /* The first block is the ENTRY_BLOCK (or EXIT_BLOCK if REVERSE). */
338 basic_block begin = reverse ? EXIT_BLOCK_PTR : ENTRY_BLOCK_PTR;
d55bc081 339 di->dfs_order[last_basic_block] = 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;
26e0e410 371 di->dfs_parent[di->dfsnum] = di->dfs_order[last_basic_block];
f8032688
MM
372 di->dfsnum++;
373 calc_dfs_tree_nonrec (di, b, reverse);
374 }
26e0e410
RH
375
376 if (saw_unconnected)
377 {
378 FOR_EACH_BB_REVERSE (b)
379 {
380 if (di->dfs_order[b->index])
381 continue;
382 bitmap_set_bit (di->fake_exit_edge, b->index);
383 di->dfs_order[b->index] = di->dfsnum;
384 di->dfs_to_bb[di->dfsnum] = b;
385 di->dfs_parent[di->dfsnum] = di->dfs_order[last_basic_block];
386 di->dfsnum++;
387 calc_dfs_tree_nonrec (di, b, reverse);
388 }
389 }
f8032688
MM
390 }
391
392 di->nodes = di->dfsnum - 1;
393
24bd1a0b
DB
394 /* This aborts e.g. when there is _no_ path from ENTRY to EXIT at all. */
395 gcc_assert (di->nodes == (unsigned int) n_basic_blocks - 1);
f8032688
MM
396}
397
398/* Compress the path from V to the root of its set and update path_min at the
399 same time. After compress(di, V) set_chain[V] is the root of the set V is
400 in and path_min[V] is the node with the smallest key[] value on the path
401 from V to that root. */
402
403static void
7080f735 404compress (struct dom_info *di, TBB v)
f8032688
MM
405{
406 /* Btw. It's not worth to unrecurse compress() as the depth is usually not
407 greater than 5 even for huge graphs (I've not seen call depth > 4).
408 Also performance wise compress() ranges _far_ behind eval(). */
409 TBB parent = di->set_chain[v];
410 if (di->set_chain[parent])
411 {
412 compress (di, parent);
413 if (di->key[di->path_min[parent]] < di->key[di->path_min[v]])
414 di->path_min[v] = di->path_min[parent];
415 di->set_chain[v] = di->set_chain[parent];
416 }
417}
418
419/* Compress the path from V to the set root of V if needed (when the root has
420 changed since the last call). Returns the node with the smallest key[]
421 value on the path from V to the root. */
422
423static inline TBB
7080f735 424eval (struct dom_info *di, TBB v)
f8032688
MM
425{
426 /* The representant of the set V is in, also called root (as the set
427 representation is a tree). */
428 TBB rep = di->set_chain[v];
429
430 /* V itself is the root. */
431 if (!rep)
432 return di->path_min[v];
433
434 /* Compress only if necessary. */
435 if (di->set_chain[rep])
436 {
437 compress (di, v);
438 rep = di->set_chain[v];
439 }
440
441 if (di->key[di->path_min[rep]] >= di->key[di->path_min[v]])
442 return di->path_min[v];
443 else
444 return di->path_min[rep];
445}
446
447/* This essentially merges the two sets of V and W, giving a single set with
448 the new root V. The internal representation of these disjoint sets is a
449 balanced tree. Currently link(V,W) is only used with V being the parent
450 of W. */
451
452static void
7080f735 453link_roots (struct dom_info *di, TBB v, TBB w)
f8032688
MM
454{
455 TBB s = w;
456
457 /* Rebalance the tree. */
458 while (di->key[di->path_min[w]] < di->key[di->path_min[di->set_child[s]]])
459 {
460 if (di->set_size[s] + di->set_size[di->set_child[di->set_child[s]]]
461 >= 2 * di->set_size[di->set_child[s]])
462 {
463 di->set_chain[di->set_child[s]] = s;
464 di->set_child[s] = di->set_child[di->set_child[s]];
465 }
466 else
467 {
468 di->set_size[di->set_child[s]] = di->set_size[s];
469 s = di->set_chain[s] = di->set_child[s];
470 }
471 }
472
473 di->path_min[s] = di->path_min[w];
474 di->set_size[v] += di->set_size[w];
475 if (di->set_size[v] < 2 * di->set_size[w])
476 {
477 TBB tmp = s;
478 s = di->set_child[v];
479 di->set_child[v] = tmp;
480 }
481
482 /* Merge all subtrees. */
483 while (s)
484 {
485 di->set_chain[s] = v;
486 s = di->set_child[s];
487 }
488}
489
490/* This calculates the immediate dominators (or post-dominators if REVERSE is
491 true). DI is our working structure and should hold the DFS forest.
492 On return the immediate dominator to node V is in di->dom[V]. */
493
494static void
2b28c07a 495calc_idoms (struct dom_info *di, bool reverse)
f8032688
MM
496{
497 TBB v, w, k, par;
498 basic_block en_block;
628f6a4e
BE
499 edge_iterator ei, einext;
500
f8032688
MM
501 if (reverse)
502 en_block = EXIT_BLOCK_PTR;
503 else
504 en_block = ENTRY_BLOCK_PTR;
505
506 /* Go backwards in DFS order, to first look at the leafs. */
507 v = di->nodes;
508 while (v > 1)
509 {
510 basic_block bb = di->dfs_to_bb[v];
628f6a4e 511 edge e;
f8032688
MM
512
513 par = di->dfs_parent[v];
514 k = v;
628f6a4e
BE
515
516 ei = (reverse) ? ei_start (bb->succs) : ei_start (bb->preds);
517
f8032688 518 if (reverse)
26e0e410 519 {
26e0e410
RH
520 /* If this block has a fake edge to exit, process that first. */
521 if (bitmap_bit_p (di->fake_exit_edge, bb->index))
522 {
628f6a4e
BE
523 einext = ei;
524 einext.index = 0;
26e0e410
RH
525 goto do_fake_exit_edge;
526 }
527 }
f8032688
MM
528
529 /* Search all direct predecessors for the smallest node with a path
530 to them. That way we have the smallest node with also a path to
531 us only over nodes behind us. In effect we search for our
532 semidominator. */
628f6a4e 533 while (!ei_end_p (ei))
f8032688
MM
534 {
535 TBB k1;
536 basic_block b;
537
628f6a4e
BE
538 e = ei_edge (ei);
539 b = (reverse) ? e->dest : e->src;
540 einext = ei;
541 ei_next (&einext);
542
f8032688 543 if (b == en_block)
26e0e410
RH
544 {
545 do_fake_exit_edge:
546 k1 = di->dfs_order[last_basic_block];
547 }
f8032688 548 else
0b17ab2f 549 k1 = di->dfs_order[b->index];
f8032688
MM
550
551 /* Call eval() only if really needed. If k1 is above V in DFS tree,
552 then we know, that eval(k1) == k1 and key[k1] == k1. */
553 if (k1 > v)
554 k1 = di->key[eval (di, k1)];
555 if (k1 < k)
556 k = k1;
628f6a4e
BE
557
558 ei = einext;
f8032688
MM
559 }
560
561 di->key[v] = k;
562 link_roots (di, par, v);
563 di->next_bucket[v] = di->bucket[k];
564 di->bucket[k] = v;
565
566 /* Transform semidominators into dominators. */
567 for (w = di->bucket[par]; w; w = di->next_bucket[w])
568 {
569 k = eval (di, w);
570 if (di->key[k] < di->key[w])
571 di->dom[w] = k;
572 else
573 di->dom[w] = par;
574 }
575 /* We don't need to cleanup next_bucket[]. */
576 di->bucket[par] = 0;
577 v--;
578 }
579
a1f300c0 580 /* Explicitly define the dominators. */
f8032688
MM
581 di->dom[1] = 0;
582 for (v = 2; v <= di->nodes; v++)
583 if (di->dom[v] != di->key[v])
584 di->dom[v] = di->dom[di->dom[v]];
585}
586
d47cc544
SB
587/* Assign dfs numbers starting from NUM to NODE and its sons. */
588
589static void
590assign_dfs_numbers (struct et_node *node, int *num)
591{
592 struct et_node *son;
593
594 node->dfs_num_in = (*num)++;
595
596 if (node->son)
597 {
598 assign_dfs_numbers (node->son, num);
599 for (son = node->son->right; son != node->son; son = son->right)
6de9cd9a 600 assign_dfs_numbers (son, num);
d47cc544 601 }
f8032688 602
d47cc544
SB
603 node->dfs_num_out = (*num)++;
604}
f8032688 605
5d3cc252 606/* Compute the data necessary for fast resolving of dominator queries in a
d47cc544 607 static dominator tree. */
f8032688 608
d47cc544
SB
609static void
610compute_dom_fast_query (enum cdi_direction dir)
611{
612 int num = 0;
613 basic_block bb;
2b28c07a 614 unsigned int dir_index = dom_convert_dir_to_idx (dir);
d47cc544 615
fce22de5 616 gcc_assert (dom_info_available_p (dir));
d47cc544 617
2b28c07a 618 if (dom_computed[dir_index] == DOM_OK)
d47cc544
SB
619 return;
620
621 FOR_ALL_BB (bb)
622 {
2b28c07a
JC
623 if (!bb->dom[dir_index]->father)
624 assign_dfs_numbers (bb->dom[dir_index], &num);
d47cc544
SB
625 }
626
2b28c07a 627 dom_computed[dir_index] = DOM_OK;
d47cc544
SB
628}
629
630/* The main entry point into this module. DIR is set depending on whether
631 we want to compute dominators or postdominators. */
632
633void
634calculate_dominance_info (enum cdi_direction dir)
f8032688
MM
635{
636 struct dom_info di;
355be0dc 637 basic_block b;
2b28c07a
JC
638 unsigned int dir_index = dom_convert_dir_to_idx (dir);
639 bool reverse = (dir == CDI_POST_DOMINATORS) ? true : false;
355be0dc 640
2b28c07a 641 if (dom_computed[dir_index] == DOM_OK)
d47cc544 642 return;
355be0dc 643
74c96e0c 644 timevar_push (TV_DOMINANCE);
fce22de5 645 if (!dom_info_available_p (dir))
d47cc544 646 {
2b28c07a 647 gcc_assert (!n_bbs_in_dom_tree[dir_index]);
f8032688 648
d47cc544
SB
649 FOR_ALL_BB (b)
650 {
2b28c07a 651 b->dom[dir_index] = et_new_tree (b);
d47cc544 652 }
2b28c07a 653 n_bbs_in_dom_tree[dir_index] = n_basic_blocks;
f8032688 654
26e0e410 655 init_dom_info (&di, dir);
2b28c07a
JC
656 calc_dfs_tree (&di, reverse);
657 calc_idoms (&di, reverse);
355be0dc 658
d47cc544
SB
659 FOR_EACH_BB (b)
660 {
661 TBB d = di.dom[di.dfs_order[b->index]];
662
663 if (di.dfs_to_bb[d])
2b28c07a 664 et_set_father (b->dom[dir_index], di.dfs_to_bb[d]->dom[dir_index]);
d47cc544 665 }
e0082a72 666
d47cc544 667 free_dom_info (&di);
2b28c07a 668 dom_computed[dir_index] = DOM_NO_FAST_QUERY;
355be0dc
JH
669 }
670
d47cc544 671 compute_dom_fast_query (dir);
74c96e0c
ZD
672
673 timevar_pop (TV_DOMINANCE);
355be0dc
JH
674}
675
d47cc544 676/* Free dominance information for direction DIR. */
355be0dc 677void
d47cc544 678free_dominance_info (enum cdi_direction dir)
355be0dc
JH
679{
680 basic_block bb;
2b28c07a 681 unsigned int dir_index = dom_convert_dir_to_idx (dir);
355be0dc 682
fce22de5 683 if (!dom_info_available_p (dir))
d47cc544
SB
684 return;
685
686 FOR_ALL_BB (bb)
687 {
2b28c07a
JC
688 et_free_tree_force (bb->dom[dir_index]);
689 bb->dom[dir_index] = NULL;
d47cc544 690 }
5a6ccafd 691 et_free_pools ();
d47cc544 692
2b28c07a 693 n_bbs_in_dom_tree[dir_index] = 0;
6de9cd9a 694
2b28c07a 695 dom_computed[dir_index] = DOM_NONE;
355be0dc
JH
696}
697
698/* Return the immediate dominator of basic block BB. */
699basic_block
d47cc544 700get_immediate_dominator (enum cdi_direction dir, basic_block bb)
355be0dc 701{
2b28c07a
JC
702 unsigned int dir_index = dom_convert_dir_to_idx (dir);
703 struct et_node *node = bb->dom[dir_index];
d47cc544 704
2b28c07a 705 gcc_assert (dom_computed[dir_index]);
d47cc544
SB
706
707 if (!node->father)
708 return NULL;
709
6de9cd9a 710 return node->father->data;
355be0dc
JH
711}
712
713/* Set the immediate dominator of the block possibly removing
714 existing edge. NULL can be used to remove any edge. */
715inline void
d47cc544
SB
716set_immediate_dominator (enum cdi_direction dir, basic_block bb,
717 basic_block dominated_by)
355be0dc 718{
2b28c07a
JC
719 unsigned int dir_index = dom_convert_dir_to_idx (dir);
720 struct et_node *node = bb->dom[dir_index];
721
722 gcc_assert (dom_computed[dir_index]);
355be0dc 723
d47cc544 724 if (node->father)
355be0dc 725 {
d47cc544 726 if (node->father->data == dominated_by)
6de9cd9a 727 return;
d47cc544 728 et_split (node);
355be0dc 729 }
d47cc544
SB
730
731 if (dominated_by)
2b28c07a 732 et_set_father (node, dominated_by->dom[dir_index]);
d47cc544 733
2b28c07a
JC
734 if (dom_computed[dir_index] == DOM_OK)
735 dom_computed[dir_index] = DOM_NO_FAST_QUERY;
355be0dc
JH
736}
737
5d3cc252 738/* Store all basic blocks immediately dominated by BB into BBS and return
d47cc544 739 their number. */
355be0dc 740int
d47cc544 741get_dominated_by (enum cdi_direction dir, basic_block bb, basic_block **bbs)
355be0dc 742{
2b28c07a 743 unsigned int dir_index = dom_convert_dir_to_idx (dir);
d47cc544 744 int n;
2b28c07a
JC
745 struct et_node *node = bb->dom[dir_index], *son = node->son, *ason;
746
747 gcc_assert (dom_computed[dir_index]);
d47cc544
SB
748
749 if (!son)
750 {
751 *bbs = NULL;
752 return 0;
753 }
754
755 for (ason = son->right, n = 1; ason != son; ason = ason->right)
756 n++;
757
5ed6ace5 758 *bbs = XNEWVEC (basic_block, n);
d47cc544
SB
759 (*bbs)[0] = son->data;
760 for (ason = son->right, n = 1; ason != son; ason = ason->right)
761 (*bbs)[n++] = ason->data;
355be0dc 762
355be0dc
JH
763 return n;
764}
765
42759f1e
ZD
766/* Find all basic blocks that are immediately dominated (in direction DIR)
767 by some block between N_REGION ones stored in REGION, except for blocks
768 in the REGION itself. The found blocks are stored to DOMS and their number
769 is returned. */
770
771unsigned
772get_dominated_by_region (enum cdi_direction dir, basic_block *region,
773 unsigned n_region, basic_block *doms)
774{
775 unsigned n_doms = 0, i;
776 basic_block dom;
777
778 for (i = 0; i < n_region; i++)
6580ee77 779 region[i]->flags |= BB_DUPLICATED;
42759f1e
ZD
780 for (i = 0; i < n_region; i++)
781 for (dom = first_dom_son (dir, region[i]);
782 dom;
783 dom = next_dom_son (dir, dom))
6580ee77 784 if (!(dom->flags & BB_DUPLICATED))
42759f1e
ZD
785 doms[n_doms++] = dom;
786 for (i = 0; i < n_region; i++)
6580ee77 787 region[i]->flags &= ~BB_DUPLICATED;
42759f1e
ZD
788
789 return n_doms;
790}
791
355be0dc
JH
792/* Redirect all edges pointing to BB to TO. */
793void
d47cc544
SB
794redirect_immediate_dominators (enum cdi_direction dir, basic_block bb,
795 basic_block to)
355be0dc 796{
2b28c07a
JC
797 unsigned int dir_index = dom_convert_dir_to_idx (dir);
798 struct et_node *bb_node, *to_node, *son;
799
800 bb_node = bb->dom[dir_index];
801 to_node = to->dom[dir_index];
d47cc544 802
2b28c07a 803 gcc_assert (dom_computed[dir_index]);
355be0dc 804
d47cc544
SB
805 if (!bb_node->son)
806 return;
807
808 while (bb_node->son)
355be0dc 809 {
d47cc544
SB
810 son = bb_node->son;
811
812 et_split (son);
813 et_set_father (son, to_node);
355be0dc 814 }
d47cc544 815
2b28c07a
JC
816 if (dom_computed[dir_index] == DOM_OK)
817 dom_computed[dir_index] = DOM_NO_FAST_QUERY;
355be0dc
JH
818}
819
820/* Find first basic block in the tree dominating both BB1 and BB2. */
821basic_block
d47cc544 822nearest_common_dominator (enum cdi_direction dir, basic_block bb1, basic_block bb2)
355be0dc 823{
2b28c07a
JC
824 unsigned int dir_index = dom_convert_dir_to_idx (dir);
825
826 gcc_assert (dom_computed[dir_index]);
d47cc544 827
355be0dc
JH
828 if (!bb1)
829 return bb2;
830 if (!bb2)
831 return bb1;
d47cc544 832
2b28c07a 833 return et_nca (bb1->dom[dir_index], bb2->dom[dir_index])->data;
355be0dc
JH
834}
835
0bca51f0
DN
836
837/* Find the nearest common dominator for the basic blocks in BLOCKS,
838 using dominance direction DIR. */
839
840basic_block
841nearest_common_dominator_for_set (enum cdi_direction dir, bitmap blocks)
842{
843 unsigned i, first;
844 bitmap_iterator bi;
845 basic_block dom;
846
847 first = bitmap_first_set_bit (blocks);
848 dom = BASIC_BLOCK (first);
849 EXECUTE_IF_SET_IN_BITMAP (blocks, 0, i, bi)
850 if (dom != BASIC_BLOCK (i))
851 dom = nearest_common_dominator (dir, dom, BASIC_BLOCK (i));
852
853 return dom;
854}
855
b629276a
DB
856/* Given a dominator tree, we can determine whether one thing
857 dominates another in constant time by using two DFS numbers:
858
859 1. The number for when we visit a node on the way down the tree
860 2. The number for when we visit a node on the way back up the tree
861
862 You can view these as bounds for the range of dfs numbers the
863 nodes in the subtree of the dominator tree rooted at that node
864 will contain.
865
866 The dominator tree is always a simple acyclic tree, so there are
867 only three possible relations two nodes in the dominator tree have
868 to each other:
869
870 1. Node A is above Node B (and thus, Node A dominates node B)
871
872 A
873 |
874 C
875 / \
876 B D
877
878
879 In the above case, DFS_Number_In of A will be <= DFS_Number_In of
880 B, and DFS_Number_Out of A will be >= DFS_Number_Out of B. This is
881 because we must hit A in the dominator tree *before* B on the walk
882 down, and we will hit A *after* B on the walk back up
883
d8701f02 884 2. Node A is below node B (and thus, node B dominates node A)
b629276a
DB
885
886
887 B
888 |
889 A
890 / \
891 C D
892
893 In the above case, DFS_Number_In of A will be >= DFS_Number_In of
894 B, and DFS_Number_Out of A will be <= DFS_Number_Out of B.
895
896 This is because we must hit A in the dominator tree *after* B on
897 the walk down, and we will hit A *before* B on the walk back up
898
899 3. Node A and B are siblings (and thus, neither dominates the other)
900
901 C
902 |
903 D
904 / \
905 A B
906
907 In the above case, DFS_Number_In of A will *always* be <=
908 DFS_Number_In of B, and DFS_Number_Out of A will *always* be <=
909 DFS_Number_Out of B. This is because we will always finish the dfs
910 walk of one of the subtrees before the other, and thus, the dfs
911 numbers for one subtree can't intersect with the range of dfs
912 numbers for the other subtree. If you swap A and B's position in
913 the dominator tree, the comparison changes direction, but the point
914 is that both comparisons will always go the same way if there is no
915 dominance relationship.
916
917 Thus, it is sufficient to write
918
919 A_Dominates_B (node A, node B)
920 {
921 return DFS_Number_In(A) <= DFS_Number_In(B)
922 && DFS_Number_Out (A) >= DFS_Number_Out(B);
923 }
924
925 A_Dominated_by_B (node A, node B)
926 {
927 return DFS_Number_In(A) >= DFS_Number_In(A)
928 && DFS_Number_Out (A) <= DFS_Number_Out(B);
929 } */
0bca51f0 930
355be0dc
JH
931/* Return TRUE in case BB1 is dominated by BB2. */
932bool
d47cc544 933dominated_by_p (enum cdi_direction dir, basic_block bb1, basic_block bb2)
6de9cd9a 934{
2b28c07a
JC
935 unsigned int dir_index = dom_convert_dir_to_idx (dir);
936 struct et_node *n1 = bb1->dom[dir_index], *n2 = bb2->dom[dir_index];
937
938 gcc_assert (dom_computed[dir_index]);
d47cc544 939
2b28c07a 940 if (dom_computed[dir_index] == DOM_OK)
d47cc544 941 return (n1->dfs_num_in >= n2->dfs_num_in
6de9cd9a 942 && n1->dfs_num_out <= n2->dfs_num_out);
d47cc544
SB
943
944 return et_below (n1, n2);
355be0dc
JH
945}
946
f074ff6c
ZD
947/* Returns the entry dfs number for basic block BB, in the direction DIR. */
948
949unsigned
950bb_dom_dfs_in (enum cdi_direction dir, basic_block bb)
951{
2b28c07a
JC
952 unsigned int dir_index = dom_convert_dir_to_idx (dir);
953 struct et_node *n = bb->dom[dir_index];
f074ff6c 954
2b28c07a 955 gcc_assert (dom_computed[dir_index] == DOM_OK);
f074ff6c
ZD
956 return n->dfs_num_in;
957}
958
959/* Returns the exit dfs number for basic block BB, in the direction DIR. */
960
961unsigned
962bb_dom_dfs_out (enum cdi_direction dir, basic_block bb)
963{
2b28c07a
JC
964 unsigned int dir_index = dom_convert_dir_to_idx (dir);
965 struct et_node *n = bb->dom[dir_index];
f074ff6c 966
2b28c07a 967 gcc_assert (dom_computed[dir_index] == DOM_OK);
f074ff6c
ZD
968 return n->dfs_num_out;
969}
970
355be0dc
JH
971/* Verify invariants of dominator structure. */
972void
d47cc544 973verify_dominators (enum cdi_direction dir)
355be0dc
JH
974{
975 int err = 0;
976 basic_block bb;
977
fce22de5 978 gcc_assert (dom_info_available_p (dir));
d47cc544 979
355be0dc
JH
980 FOR_EACH_BB (bb)
981 {
982 basic_block dom_bb;
df485d80 983 basic_block imm_bb;
355be0dc 984
d47cc544 985 dom_bb = recount_dominator (dir, bb);
df485d80
FCE
986 imm_bb = get_immediate_dominator (dir, bb);
987 if (dom_bb != imm_bb)
f8032688 988 {
df485d80
FCE
989 if ((dom_bb == NULL) || (imm_bb == NULL))
990 error ("dominator of %d status unknown", bb->index);
08fb229e
FCE
991 else
992 error ("dominator of %d should be %d, not %d",
df485d80 993 bb->index, dom_bb->index, imm_bb->index);
355be0dc
JH
994 err = 1;
995 }
996 }
e7bd94cc 997
fce22de5 998 if (dir == CDI_DOMINATORS)
e7bd94cc
ZD
999 {
1000 FOR_EACH_BB (bb)
1001 {
1002 if (!dominated_by_p (dir, bb, ENTRY_BLOCK_PTR))
1003 {
1004 error ("ENTRY does not dominate bb %d", bb->index);
1005 err = 1;
1006 }
1007 }
1008 }
1009
ced3f397 1010 gcc_assert (!err);
355be0dc
JH
1011}
1012
738ed977
ZD
1013/* Determine immediate dominator (or postdominator, according to DIR) of BB,
1014 assuming that dominators of other blocks are correct. We also use it to
1015 recompute the dominators in a restricted area, by iterating it until it
71cc389b 1016 reaches a fixed point. */
738ed977 1017
355be0dc 1018basic_block
d47cc544 1019recount_dominator (enum cdi_direction dir, basic_block bb)
355be0dc 1020{
2b28c07a 1021 unsigned int dir_index = dom_convert_dir_to_idx (dir);
738ed977
ZD
1022 basic_block dom_bb = NULL;
1023 edge e;
628f6a4e 1024 edge_iterator ei;
355be0dc 1025
2b28c07a 1026 gcc_assert (dom_computed[dir_index]);
d47cc544 1027
738ed977
ZD
1028 if (dir == CDI_DOMINATORS)
1029 {
628f6a4e 1030 FOR_EACH_EDGE (e, ei, bb->preds)
738ed977 1031 {
e7bd94cc
ZD
1032 /* Ignore the predecessors that either are not reachable from
1033 the entry block, or whose dominator was not determined yet. */
1034 if (!dominated_by_p (dir, e->src, ENTRY_BLOCK_PTR))
1035 continue;
1036
738ed977
ZD
1037 if (!dominated_by_p (dir, e->src, bb))
1038 dom_bb = nearest_common_dominator (dir, dom_bb, e->src);
1039 }
1040 }
1041 else
1042 {
628f6a4e 1043 FOR_EACH_EDGE (e, ei, bb->succs)
738ed977
ZD
1044 {
1045 if (!dominated_by_p (dir, e->dest, bb))
1046 dom_bb = nearest_common_dominator (dir, dom_bb, e->dest);
1047 }
1048 }
f8032688 1049
738ed977 1050 return dom_bb;
355be0dc
JH
1051}
1052
1053/* Iteratively recount dominators of BBS. The change is supposed to be local
1054 and not to grow further. */
1055void
d47cc544 1056iterate_fix_dominators (enum cdi_direction dir, basic_block *bbs, int n)
355be0dc 1057{
2b28c07a 1058 unsigned int dir_index = dom_convert_dir_to_idx (dir);
355be0dc
JH
1059 int i, changed = 1;
1060 basic_block old_dom, new_dom;
1061
2b28c07a 1062 gcc_assert (dom_computed[dir_index]);
d47cc544 1063
e7bd94cc
ZD
1064 for (i = 0; i < n; i++)
1065 set_immediate_dominator (dir, bbs[i], NULL);
1066
355be0dc
JH
1067 while (changed)
1068 {
1069 changed = 0;
1070 for (i = 0; i < n; i++)
1071 {
d47cc544
SB
1072 old_dom = get_immediate_dominator (dir, bbs[i]);
1073 new_dom = recount_dominator (dir, bbs[i]);
355be0dc
JH
1074 if (old_dom != new_dom)
1075 {
1076 changed = 1;
d47cc544 1077 set_immediate_dominator (dir, bbs[i], new_dom);
355be0dc 1078 }
f8032688
MM
1079 }
1080 }
e7bd94cc
ZD
1081
1082 for (i = 0; i < n; i++)
ced3f397 1083 gcc_assert (get_immediate_dominator (dir, bbs[i]));
355be0dc 1084}
f8032688 1085
355be0dc 1086void
d47cc544 1087add_to_dominance_info (enum cdi_direction dir, basic_block bb)
355be0dc 1088{
2b28c07a
JC
1089 unsigned int dir_index = dom_convert_dir_to_idx (dir);
1090
1091 gcc_assert (dom_computed[dir_index]);
1092 gcc_assert (!bb->dom[dir_index]);
d47cc544 1093
2b28c07a 1094 n_bbs_in_dom_tree[dir_index]++;
6de9cd9a 1095
2b28c07a 1096 bb->dom[dir_index] = et_new_tree (bb);
d47cc544 1097
2b28c07a
JC
1098 if (dom_computed[dir_index] == DOM_OK)
1099 dom_computed[dir_index] = DOM_NO_FAST_QUERY;
355be0dc
JH
1100}
1101
1102void
d47cc544
SB
1103delete_from_dominance_info (enum cdi_direction dir, basic_block bb)
1104{
2b28c07a 1105 unsigned int dir_index = dom_convert_dir_to_idx (dir);
d47cc544 1106
2b28c07a 1107 gcc_assert (dom_computed[dir_index]);
d47cc544 1108
2b28c07a
JC
1109 et_free_tree (bb->dom[dir_index]);
1110 bb->dom[dir_index] = NULL;
1111 n_bbs_in_dom_tree[dir_index]--;
1112
1113 if (dom_computed[dir_index] == DOM_OK)
1114 dom_computed[dir_index] = DOM_NO_FAST_QUERY;
d47cc544
SB
1115}
1116
1117/* Returns the first son of BB in the dominator or postdominator tree
1118 as determined by DIR. */
1119
1120basic_block
1121first_dom_son (enum cdi_direction dir, basic_block bb)
355be0dc 1122{
2b28c07a
JC
1123 unsigned int dir_index = dom_convert_dir_to_idx (dir);
1124 struct et_node *son = bb->dom[dir_index]->son;
d47cc544
SB
1125
1126 return son ? son->data : NULL;
1127}
1128
1129/* Returns the next dominance son after BB in the dominator or postdominator
1130 tree as determined by DIR, or NULL if it was the last one. */
1131
1132basic_block
1133next_dom_son (enum cdi_direction dir, basic_block bb)
1134{
2b28c07a
JC
1135 unsigned int dir_index = dom_convert_dir_to_idx (dir);
1136 struct et_node *next = bb->dom[dir_index]->right;
d47cc544
SB
1137
1138 return next->father->son == next ? NULL : next->data;
355be0dc
JH
1139}
1140
2b28c07a
JC
1141/* Return dominance availability for dominance info DIR. */
1142
1143enum dom_state
1144dom_info_state (enum cdi_direction dir)
1145{
1146 unsigned int dir_index = dom_convert_dir_to_idx (dir);
1147
1148 return dom_computed[dir_index];
1149}
1150
1151/* Set the dominance availability for dominance info DIR to NEW_STATE. */
1152
1153void
1154set_dom_info_availability (enum cdi_direction dir, enum dom_state new_state)
1155{
1156 unsigned int dir_index = dom_convert_dir_to_idx (dir);
1157
1158 dom_computed[dir_index] = new_state;
1159}
1160
fce22de5
ZD
1161/* Returns true if dominance information for direction DIR is available. */
1162
1163bool
1164dom_info_available_p (enum cdi_direction dir)
1165{
2b28c07a
JC
1166 unsigned int dir_index = dom_convert_dir_to_idx (dir);
1167
1168 return dom_computed[dir_index] != DOM_NONE;
fce22de5
ZD
1169}
1170
355be0dc 1171void
d47cc544 1172debug_dominance_info (enum cdi_direction dir)
355be0dc
JH
1173{
1174 basic_block bb, bb2;
1175 FOR_EACH_BB (bb)
d47cc544 1176 if ((bb2 = get_immediate_dominator (dir, bb)))
355be0dc 1177 fprintf (stderr, "%i %i\n", bb->index, bb2->index);
f8032688 1178}
This page took 1.793028 seconds and 5 git commands to generate.