OpenCores
URL https://opencores.org/ocsvn/scarts/scarts/trunk

Subversion Repositories scarts

[/] [scarts/] [trunk/] [toolchain/] [scarts-gcc/] [gcc-4.1.1/] [gcc/] [dominance.c] - Blame information for rev 16

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 12 jlechner
/* Calculate (post)dominators in slightly super-linear time.
2
   Copyright (C) 2000, 2003, 2004, 2005 Free Software Foundation, Inc.
3
   Contributed by Michael Matz (matz@ifh.de).
4
 
5
   This file is part of GCC.
6
 
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
9
   the Free Software Foundation; either version 2, or (at your option)
10
   any later version.
11
 
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.
16
 
17
   You should have received a copy of the GNU General Public License
18
   along with GCC; see the file COPYING.  If not, write to the Free
19
   Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
20
   02110-1301, USA.  */
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
 
31
   The algorithm computes this dominator tree implicitly by computing for
32
   each block its immediate dominator.  We use tree balancing and path
33
   compression, so it's the O(e*a(e,v)) variant, where a(e,v) is the very
34
   slowly growing functional inverse of the Ackerman function.  */
35
 
36
#include "config.h"
37
#include "system.h"
38
#include "coretypes.h"
39
#include "tm.h"
40
#include "rtl.h"
41
#include "hard-reg-set.h"
42
#include "obstack.h"
43
#include "basic-block.h"
44
#include "toplev.h"
45
#include "et-forest.h"
46
 
47
/* Whether the dominators and the postdominators are available.  */
48
enum dom_state dom_computed[2];
49
 
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
54
   support multiple entry points.  As it has no real basic block index we use
55
   'last_basic_block' for that.  Its dfs number is of course 1.  */
56
 
57
/* Type of Basic Block aka. TBB */
58
typedef 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
 
65
struct 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;
99
  /* If x is the DFS-index of a node which corresponds with a basic block,
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
 
105
  /* This is the next free DFS number when creating the DFS tree.  */
106
  unsigned int dfsnum;
107
  /* The number of nodes in the DFS tree (==dfsnum-1).  */
108
  unsigned int nodes;
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;
113
};
114
 
115
static void init_dom_info (struct dom_info *, enum cdi_direction);
116
static void free_dom_info (struct dom_info *);
117
static void calc_dfs_tree_nonrec (struct dom_info *, basic_block,
118
                                  enum cdi_direction);
119
static void calc_dfs_tree (struct dom_info *, enum cdi_direction);
120
static void compress (struct dom_info *, TBB);
121
static TBB eval (struct dom_info *, TBB);
122
static void link_roots (struct dom_info *, TBB, TBB);
123
static void calc_idoms (struct dom_info *, enum cdi_direction);
124
void debug_dominance_info (enum cdi_direction);
125
 
126
/* Keeps track of the*/
127
static unsigned n_bbs_in_dom_tree[2];
128
 
129
/* Helper macro for allocating and initializing an array,
130
   for aesthetic reasons.  */
131
#define init_ar(var, type, num, content)                        \
132
  do                                                            \
133
    {                                                           \
134
      unsigned int i = 1;    /* Catch content == i.  */         \
135
      if (! (content))                                          \
136
        (var) = xcalloc ((num), sizeof (type));                 \
137
      else                                                      \
138
        {                                                       \
139
          (var) = xmalloc ((num) * sizeof (type));              \
140
          for (i = 0; i < num; i++)                              \
141
            (var)[i] = (content);                               \
142
        }                                                       \
143
    }                                                           \
144
  while (0)
145
 
146
/* Allocate all needed memory in a pessimistic fashion (so we round up).
147
   This initializes the contents of DI, which already must be allocated.  */
148
 
149
static void
150
init_dom_info (struct dom_info *di, enum cdi_direction dir)
151
{
152
  /* We need memory for n_basic_blocks nodes and the ENTRY_BLOCK or
153
     EXIT_BLOCK.  */
154
  unsigned int num = n_basic_blocks + 1 + 1;
155
  init_ar (di->dfs_parent, TBB, num, 0);
156
  init_ar (di->path_min, TBB, num, i);
157
  init_ar (di->key, TBB, num, i);
158
  init_ar (di->dom, TBB, num, 0);
159
 
160
  init_ar (di->bucket, TBB, num, 0);
161
  init_ar (di->next_bucket, TBB, num, 0);
162
 
163
  init_ar (di->set_chain, TBB, num, 0);
164
  init_ar (di->set_size, unsigned int, num, 1);
165
  init_ar (di->set_child, TBB, num, 0);
166
 
167
  init_ar (di->dfs_order, TBB, (unsigned int) last_basic_block + 1, 0);
168
  init_ar (di->dfs_to_bb, basic_block, num, 0);
169
 
170
  di->dfsnum = 1;
171
  di->nodes = 0;
172
 
173
  di->fake_exit_edge = dir ? BITMAP_ALLOC (NULL) : NULL;
174
}
175
 
176
#undef init_ar
177
 
178
/* Free all allocated memory in DI, but not DI itself.  */
179
 
180
static void
181
free_dom_info (struct dom_info *di)
182
{
183
  free (di->dfs_parent);
184
  free (di->path_min);
185
  free (di->key);
186
  free (di->dom);
187
  free (di->bucket);
188
  free (di->next_bucket);
189
  free (di->set_chain);
190
  free (di->set_size);
191
  free (di->set_child);
192
  free (di->dfs_order);
193
  free (di->dfs_to_bb);
194
  BITMAP_FREE (di->fake_exit_edge);
195
}
196
 
197
/* The nonrecursive variant of creating a DFS tree.  DI is our working
198
   structure, BB the starting basic block for this tree and REVERSE
199
   is true, if predecessors should be visited instead of successors of a
200
   node.  After this is done all nodes reachable from BB were visited, have
201
   assigned their dfs number and are linked together to form a tree.  */
202
 
203
static void
204
calc_dfs_tree_nonrec (struct dom_info *di, basic_block bb,
205
                      enum cdi_direction reverse)
206
{
207
  /* We call this _only_ if bb is not already visited.  */
208
  edge e;
209
  TBB child_i, my_i = 0;
210
  edge_iterator *stack;
211
  edge_iterator ei, einext;
212
  int sp;
213
  /* Start block (ENTRY_BLOCK_PTR for forward problem, EXIT_BLOCK for backward
214
     problem).  */
215
  basic_block en_block;
216
  /* Ending block.  */
217
  basic_block ex_block;
218
 
219
  stack = xmalloc ((n_basic_blocks + 3) * sizeof (edge_iterator));
220
  sp = 0;
221
 
222
  /* Initialize our border blocks, and the first edge.  */
223
  if (reverse)
224
    {
225
      ei = ei_start (bb->preds);
226
      en_block = EXIT_BLOCK_PTR;
227
      ex_block = ENTRY_BLOCK_PTR;
228
    }
229
  else
230
    {
231
      ei = ei_start (bb->succs);
232
      en_block = ENTRY_BLOCK_PTR;
233
      ex_block = EXIT_BLOCK_PTR;
234
    }
235
 
236
  /* When the stack is empty we break out of this loop.  */
237
  while (1)
238
    {
239
      basic_block bn;
240
 
241
      /* This loop traverses edges e in depth first manner, and fills the
242
         stack.  */
243
      while (!ei_end_p (ei))
244
        {
245
          e = ei_edge (ei);
246
 
247
          /* Deduce from E the current and the next block (BB and BN), and the
248
             next edge.  */
249
          if (reverse)
250
            {
251
              bn = e->src;
252
 
253
              /* If the next node BN is either already visited or a border
254
                 block the current edge is useless, and simply overwritten
255
                 with the next edge out of the current node.  */
256
              if (bn == ex_block || di->dfs_order[bn->index])
257
                {
258
                  ei_next (&ei);
259
                  continue;
260
                }
261
              bb = e->dest;
262
              einext = ei_start (bn->preds);
263
            }
264
          else
265
            {
266
              bn = e->dest;
267
              if (bn == ex_block || di->dfs_order[bn->index])
268
                {
269
                  ei_next (&ei);
270
                  continue;
271
                }
272
              bb = e->src;
273
              einext = ei_start (bn->succs);
274
            }
275
 
276
          gcc_assert (bn != en_block);
277
 
278
          /* Fill the DFS tree info calculatable _before_ recursing.  */
279
          if (bb != en_block)
280
            my_i = di->dfs_order[bb->index];
281
          else
282
            my_i = di->dfs_order[last_basic_block];
283
          child_i = di->dfs_order[bn->index] = di->dfsnum++;
284
          di->dfs_to_bb[child_i] = bn;
285
          di->dfs_parent[child_i] = my_i;
286
 
287
          /* Save the current point in the CFG on the stack, and recurse.  */
288
          stack[sp++] = ei;
289
          ei = einext;
290
        }
291
 
292
      if (!sp)
293
        break;
294
      ei = stack[--sp];
295
 
296
      /* OK.  The edge-list was exhausted, meaning normally we would
297
         end the recursion.  After returning from the recursive call,
298
         there were (may be) other statements which were run after a
299
         child node was completely considered by DFS.  Here is the
300
         point to do it in the non-recursive variant.
301
         E.g. The block just completed is in e->dest for forward DFS,
302
         the block not yet completed (the parent of the one above)
303
         in e->src.  This could be used e.g. for computing the number of
304
         descendants or the tree depth.  */
305
      ei_next (&ei);
306
    }
307
  free (stack);
308
}
309
 
310
/* The main entry for calculating the DFS tree or forest.  DI is our working
311
   structure and REVERSE is true, if we are interested in the reverse flow
312
   graph.  In that case the result is not necessarily a tree but a forest,
313
   because there may be nodes from which the EXIT_BLOCK is unreachable.  */
314
 
315
static void
316
calc_dfs_tree (struct dom_info *di, enum cdi_direction reverse)
317
{
318
  /* The first block is the ENTRY_BLOCK (or EXIT_BLOCK if REVERSE).  */
319
  basic_block begin = reverse ? EXIT_BLOCK_PTR : ENTRY_BLOCK_PTR;
320
  di->dfs_order[last_basic_block] = di->dfsnum;
321
  di->dfs_to_bb[di->dfsnum] = begin;
322
  di->dfsnum++;
323
 
324
  calc_dfs_tree_nonrec (di, begin, reverse);
325
 
326
  if (reverse)
327
    {
328
      /* In the post-dom case we may have nodes without a path to EXIT_BLOCK.
329
         They are reverse-unreachable.  In the dom-case we disallow such
330
         nodes, but in post-dom we have to deal with them.
331
 
332
         There are two situations in which this occurs.  First, noreturn
333
         functions.  Second, infinite loops.  In the first case we need to
334
         pretend that there is an edge to the exit block.  In the second
335
         case, we wind up with a forest.  We need to process all noreturn
336
         blocks before we know if we've got any infinite loops.  */
337
 
338
      basic_block b;
339
      bool saw_unconnected = false;
340
 
341
      FOR_EACH_BB_REVERSE (b)
342
        {
343
          if (EDGE_COUNT (b->succs) > 0)
344
            {
345
              if (di->dfs_order[b->index] == 0)
346
                saw_unconnected = true;
347
              continue;
348
            }
349
          bitmap_set_bit (di->fake_exit_edge, b->index);
350
          di->dfs_order[b->index] = di->dfsnum;
351
          di->dfs_to_bb[di->dfsnum] = b;
352
          di->dfs_parent[di->dfsnum] = di->dfs_order[last_basic_block];
353
          di->dfsnum++;
354
          calc_dfs_tree_nonrec (di, b, reverse);
355
        }
356
 
357
      if (saw_unconnected)
358
        {
359
          FOR_EACH_BB_REVERSE (b)
360
            {
361
              if (di->dfs_order[b->index])
362
                continue;
363
              bitmap_set_bit (di->fake_exit_edge, b->index);
364
              di->dfs_order[b->index] = di->dfsnum;
365
              di->dfs_to_bb[di->dfsnum] = b;
366
              di->dfs_parent[di->dfsnum] = di->dfs_order[last_basic_block];
367
              di->dfsnum++;
368
              calc_dfs_tree_nonrec (di, b, reverse);
369
            }
370
        }
371
    }
372
 
373
  di->nodes = di->dfsnum - 1;
374
 
375
  /* Make sure there is a path from ENTRY to EXIT at all.  */
376
  gcc_assert (di->nodes == (unsigned int) n_basic_blocks + 1);
377
}
378
 
379
/* Compress the path from V to the root of its set and update path_min at the
380
   same time.  After compress(di, V) set_chain[V] is the root of the set V is
381
   in and path_min[V] is the node with the smallest key[] value on the path
382
   from V to that root.  */
383
 
384
static void
385
compress (struct dom_info *di, TBB v)
386
{
387
  /* Btw. It's not worth to unrecurse compress() as the depth is usually not
388
     greater than 5 even for huge graphs (I've not seen call depth > 4).
389
     Also performance wise compress() ranges _far_ behind eval().  */
390
  TBB parent = di->set_chain[v];
391
  if (di->set_chain[parent])
392
    {
393
      compress (di, parent);
394
      if (di->key[di->path_min[parent]] < di->key[di->path_min[v]])
395
        di->path_min[v] = di->path_min[parent];
396
      di->set_chain[v] = di->set_chain[parent];
397
    }
398
}
399
 
400
/* Compress the path from V to the set root of V if needed (when the root has
401
   changed since the last call).  Returns the node with the smallest key[]
402
   value on the path from V to the root.  */
403
 
404
static inline TBB
405
eval (struct dom_info *di, TBB v)
406
{
407
  /* The representant of the set V is in, also called root (as the set
408
     representation is a tree).  */
409
  TBB rep = di->set_chain[v];
410
 
411
  /* V itself is the root.  */
412
  if (!rep)
413
    return di->path_min[v];
414
 
415
  /* Compress only if necessary.  */
416
  if (di->set_chain[rep])
417
    {
418
      compress (di, v);
419
      rep = di->set_chain[v];
420
    }
421
 
422
  if (di->key[di->path_min[rep]] >= di->key[di->path_min[v]])
423
    return di->path_min[v];
424
  else
425
    return di->path_min[rep];
426
}
427
 
428
/* This essentially merges the two sets of V and W, giving a single set with
429
   the new root V.  The internal representation of these disjoint sets is a
430
   balanced tree.  Currently link(V,W) is only used with V being the parent
431
   of W.  */
432
 
433
static void
434
link_roots (struct dom_info *di, TBB v, TBB w)
435
{
436
  TBB s = w;
437
 
438
  /* Rebalance the tree.  */
439
  while (di->key[di->path_min[w]] < di->key[di->path_min[di->set_child[s]]])
440
    {
441
      if (di->set_size[s] + di->set_size[di->set_child[di->set_child[s]]]
442
          >= 2 * di->set_size[di->set_child[s]])
443
        {
444
          di->set_chain[di->set_child[s]] = s;
445
          di->set_child[s] = di->set_child[di->set_child[s]];
446
        }
447
      else
448
        {
449
          di->set_size[di->set_child[s]] = di->set_size[s];
450
          s = di->set_chain[s] = di->set_child[s];
451
        }
452
    }
453
 
454
  di->path_min[s] = di->path_min[w];
455
  di->set_size[v] += di->set_size[w];
456
  if (di->set_size[v] < 2 * di->set_size[w])
457
    {
458
      TBB tmp = s;
459
      s = di->set_child[v];
460
      di->set_child[v] = tmp;
461
    }
462
 
463
  /* Merge all subtrees.  */
464
  while (s)
465
    {
466
      di->set_chain[s] = v;
467
      s = di->set_child[s];
468
    }
469
}
470
 
471
/* This calculates the immediate dominators (or post-dominators if REVERSE is
472
   true).  DI is our working structure and should hold the DFS forest.
473
   On return the immediate dominator to node V is in di->dom[V].  */
474
 
475
static void
476
calc_idoms (struct dom_info *di, enum cdi_direction reverse)
477
{
478
  TBB v, w, k, par;
479
  basic_block en_block;
480
  edge_iterator ei, einext;
481
 
482
  if (reverse)
483
    en_block = EXIT_BLOCK_PTR;
484
  else
485
    en_block = ENTRY_BLOCK_PTR;
486
 
487
  /* Go backwards in DFS order, to first look at the leafs.  */
488
  v = di->nodes;
489
  while (v > 1)
490
    {
491
      basic_block bb = di->dfs_to_bb[v];
492
      edge e;
493
 
494
      par = di->dfs_parent[v];
495
      k = v;
496
 
497
      ei = (reverse) ? ei_start (bb->succs) : ei_start (bb->preds);
498
 
499
      if (reverse)
500
        {
501
          /* If this block has a fake edge to exit, process that first.  */
502
          if (bitmap_bit_p (di->fake_exit_edge, bb->index))
503
            {
504
              einext = ei;
505
              einext.index = 0;
506
              goto do_fake_exit_edge;
507
            }
508
        }
509
 
510
      /* Search all direct predecessors for the smallest node with a path
511
         to them.  That way we have the smallest node with also a path to
512
         us only over nodes behind us.  In effect we search for our
513
         semidominator.  */
514
      while (!ei_end_p (ei))
515
        {
516
          TBB k1;
517
          basic_block b;
518
 
519
          e = ei_edge (ei);
520
          b = (reverse) ? e->dest : e->src;
521
          einext = ei;
522
          ei_next (&einext);
523
 
524
          if (b == en_block)
525
            {
526
            do_fake_exit_edge:
527
              k1 = di->dfs_order[last_basic_block];
528
            }
529
          else
530
            k1 = di->dfs_order[b->index];
531
 
532
          /* Call eval() only if really needed.  If k1 is above V in DFS tree,
533
             then we know, that eval(k1) == k1 and key[k1] == k1.  */
534
          if (k1 > v)
535
            k1 = di->key[eval (di, k1)];
536
          if (k1 < k)
537
            k = k1;
538
 
539
          ei = einext;
540
        }
541
 
542
      di->key[v] = k;
543
      link_roots (di, par, v);
544
      di->next_bucket[v] = di->bucket[k];
545
      di->bucket[k] = v;
546
 
547
      /* Transform semidominators into dominators.  */
548
      for (w = di->bucket[par]; w; w = di->next_bucket[w])
549
        {
550
          k = eval (di, w);
551
          if (di->key[k] < di->key[w])
552
            di->dom[w] = k;
553
          else
554
            di->dom[w] = par;
555
        }
556
      /* We don't need to cleanup next_bucket[].  */
557
      di->bucket[par] = 0;
558
      v--;
559
    }
560
 
561
  /* Explicitly define the dominators.  */
562
  di->dom[1] = 0;
563
  for (v = 2; v <= di->nodes; v++)
564
    if (di->dom[v] != di->key[v])
565
      di->dom[v] = di->dom[di->dom[v]];
566
}
567
 
568
/* Assign dfs numbers starting from NUM to NODE and its sons.  */
569
 
570
static void
571
assign_dfs_numbers (struct et_node *node, int *num)
572
{
573
  struct et_node *son;
574
 
575
  node->dfs_num_in = (*num)++;
576
 
577
  if (node->son)
578
    {
579
      assign_dfs_numbers (node->son, num);
580
      for (son = node->son->right; son != node->son; son = son->right)
581
        assign_dfs_numbers (son, num);
582
    }
583
 
584
  node->dfs_num_out = (*num)++;
585
}
586
 
587
/* Compute the data necessary for fast resolving of dominator queries in a
588
   static dominator tree.  */
589
 
590
static void
591
compute_dom_fast_query (enum cdi_direction dir)
592
{
593
  int num = 0;
594
  basic_block bb;
595
 
596
  gcc_assert (dom_info_available_p (dir));
597
 
598
  if (dom_computed[dir] == DOM_OK)
599
    return;
600
 
601
  FOR_ALL_BB (bb)
602
    {
603
      if (!bb->dom[dir]->father)
604
        assign_dfs_numbers (bb->dom[dir], &num);
605
    }
606
 
607
  dom_computed[dir] = DOM_OK;
608
}
609
 
610
/* The main entry point into this module.  DIR is set depending on whether
611
   we want to compute dominators or postdominators.  */
612
 
613
void
614
calculate_dominance_info (enum cdi_direction dir)
615
{
616
  struct dom_info di;
617
  basic_block b;
618
 
619
  if (dom_computed[dir] == DOM_OK)
620
    return;
621
 
622
  if (!dom_info_available_p (dir))
623
    {
624
      gcc_assert (!n_bbs_in_dom_tree[dir]);
625
 
626
      FOR_ALL_BB (b)
627
        {
628
          b->dom[dir] = et_new_tree (b);
629
        }
630
      n_bbs_in_dom_tree[dir] = n_basic_blocks + 2;
631
 
632
      init_dom_info (&di, dir);
633
      calc_dfs_tree (&di, dir);
634
      calc_idoms (&di, dir);
635
 
636
      FOR_EACH_BB (b)
637
        {
638
          TBB d = di.dom[di.dfs_order[b->index]];
639
 
640
          if (di.dfs_to_bb[d])
641
            et_set_father (b->dom[dir], di.dfs_to_bb[d]->dom[dir]);
642
        }
643
 
644
      free_dom_info (&di);
645
      dom_computed[dir] = DOM_NO_FAST_QUERY;
646
    }
647
 
648
  compute_dom_fast_query (dir);
649
}
650
 
651
/* Free dominance information for direction DIR.  */
652
void
653
free_dominance_info (enum cdi_direction dir)
654
{
655
  basic_block bb;
656
 
657
  if (!dom_info_available_p (dir))
658
    return;
659
 
660
  FOR_ALL_BB (bb)
661
    {
662
      et_free_tree_force (bb->dom[dir]);
663
      bb->dom[dir] = NULL;
664
    }
665
 
666
  n_bbs_in_dom_tree[dir] = 0;
667
 
668
  dom_computed[dir] = DOM_NONE;
669
}
670
 
671
/* Return the immediate dominator of basic block BB.  */
672
basic_block
673
get_immediate_dominator (enum cdi_direction dir, basic_block bb)
674
{
675
  struct et_node *node = bb->dom[dir];
676
 
677
  gcc_assert (dom_computed[dir]);
678
 
679
  if (!node->father)
680
    return NULL;
681
 
682
  return node->father->data;
683
}
684
 
685
/* Set the immediate dominator of the block possibly removing
686
   existing edge.  NULL can be used to remove any edge.  */
687
inline void
688
set_immediate_dominator (enum cdi_direction dir, basic_block bb,
689
                         basic_block dominated_by)
690
{
691
  struct et_node *node = bb->dom[dir];
692
 
693
  gcc_assert (dom_computed[dir]);
694
 
695
  if (node->father)
696
    {
697
      if (node->father->data == dominated_by)
698
        return;
699
      et_split (node);
700
    }
701
 
702
  if (dominated_by)
703
    et_set_father (node, dominated_by->dom[dir]);
704
 
705
  if (dom_computed[dir] == DOM_OK)
706
    dom_computed[dir] = DOM_NO_FAST_QUERY;
707
}
708
 
709
/* Store all basic blocks immediately dominated by BB into BBS and return
710
   their number.  */
711
int
712
get_dominated_by (enum cdi_direction dir, basic_block bb, basic_block **bbs)
713
{
714
  int n;
715
  struct et_node *node = bb->dom[dir], *son = node->son, *ason;
716
 
717
  gcc_assert (dom_computed[dir]);
718
 
719
  if (!son)
720
    {
721
      *bbs = NULL;
722
      return 0;
723
    }
724
 
725
  for (ason = son->right, n = 1; ason != son; ason = ason->right)
726
    n++;
727
 
728
  *bbs = xmalloc (n * sizeof (basic_block));
729
  (*bbs)[0] = son->data;
730
  for (ason = son->right, n = 1; ason != son; ason = ason->right)
731
    (*bbs)[n++] = ason->data;
732
 
733
  return n;
734
}
735
 
736
/* Find all basic blocks that are immediately dominated (in direction DIR)
737
   by some block between N_REGION ones stored in REGION, except for blocks
738
   in the REGION itself.  The found blocks are stored to DOMS and their number
739
   is returned.  */
740
 
741
unsigned
742
get_dominated_by_region (enum cdi_direction dir, basic_block *region,
743
                         unsigned n_region, basic_block *doms)
744
{
745
  unsigned n_doms = 0, i;
746
  basic_block dom;
747
 
748
  for (i = 0; i < n_region; i++)
749
    region[i]->flags |= BB_DUPLICATED;
750
  for (i = 0; i < n_region; i++)
751
    for (dom = first_dom_son (dir, region[i]);
752
         dom;
753
         dom = next_dom_son (dir, dom))
754
      if (!(dom->flags & BB_DUPLICATED))
755
        doms[n_doms++] = dom;
756
  for (i = 0; i < n_region; i++)
757
    region[i]->flags &= ~BB_DUPLICATED;
758
 
759
  return n_doms;
760
}
761
 
762
/* Redirect all edges pointing to BB to TO.  */
763
void
764
redirect_immediate_dominators (enum cdi_direction dir, basic_block bb,
765
                               basic_block to)
766
{
767
  struct et_node *bb_node = bb->dom[dir], *to_node = to->dom[dir], *son;
768
 
769
  gcc_assert (dom_computed[dir]);
770
 
771
  if (!bb_node->son)
772
    return;
773
 
774
  while (bb_node->son)
775
    {
776
      son = bb_node->son;
777
 
778
      et_split (son);
779
      et_set_father (son, to_node);
780
    }
781
 
782
  if (dom_computed[dir] == DOM_OK)
783
    dom_computed[dir] = DOM_NO_FAST_QUERY;
784
}
785
 
786
/* Find first basic block in the tree dominating both BB1 and BB2.  */
787
basic_block
788
nearest_common_dominator (enum cdi_direction dir, basic_block bb1, basic_block bb2)
789
{
790
  gcc_assert (dom_computed[dir]);
791
 
792
  if (!bb1)
793
    return bb2;
794
  if (!bb2)
795
    return bb1;
796
 
797
  return et_nca (bb1->dom[dir], bb2->dom[dir])->data;
798
}
799
 
800
 
801
/* Find the nearest common dominator for the basic blocks in BLOCKS,
802
   using dominance direction DIR.  */
803
 
804
basic_block
805
nearest_common_dominator_for_set (enum cdi_direction dir, bitmap blocks)
806
{
807
  unsigned i, first;
808
  bitmap_iterator bi;
809
  basic_block dom;
810
 
811
  first = bitmap_first_set_bit (blocks);
812
  dom = BASIC_BLOCK (first);
813
  EXECUTE_IF_SET_IN_BITMAP (blocks, 0, i, bi)
814
    if (dom != BASIC_BLOCK (i))
815
      dom = nearest_common_dominator (dir, dom, BASIC_BLOCK (i));
816
 
817
  return dom;
818
}
819
 
820
 
821
/* Return TRUE in case BB1 is dominated by BB2.  */
822
bool
823
dominated_by_p (enum cdi_direction dir, basic_block bb1, basic_block bb2)
824
{
825
  struct et_node *n1 = bb1->dom[dir], *n2 = bb2->dom[dir];
826
 
827
  gcc_assert (dom_computed[dir]);
828
 
829
  if (dom_computed[dir] == DOM_OK)
830
    return (n1->dfs_num_in >= n2->dfs_num_in
831
            && n1->dfs_num_out <= n2->dfs_num_out);
832
 
833
  return et_below (n1, n2);
834
}
835
 
836
/* Verify invariants of dominator structure.  */
837
void
838
verify_dominators (enum cdi_direction dir)
839
{
840
  int err = 0;
841
  basic_block bb;
842
 
843
  gcc_assert (dom_info_available_p (dir));
844
 
845
  FOR_EACH_BB (bb)
846
    {
847
      basic_block dom_bb;
848
      basic_block imm_bb;
849
 
850
      dom_bb = recount_dominator (dir, bb);
851
      imm_bb = get_immediate_dominator (dir, bb);
852
      if (dom_bb != imm_bb)
853
        {
854
          if ((dom_bb == NULL) || (imm_bb == NULL))
855
            error ("dominator of %d status unknown", bb->index);
856
          else
857
            error ("dominator of %d should be %d, not %d",
858
                   bb->index, dom_bb->index, imm_bb->index);
859
          err = 1;
860
        }
861
    }
862
 
863
  if (dir == CDI_DOMINATORS)
864
    {
865
      FOR_EACH_BB (bb)
866
        {
867
          if (!dominated_by_p (dir, bb, ENTRY_BLOCK_PTR))
868
            {
869
              error ("ENTRY does not dominate bb %d", bb->index);
870
              err = 1;
871
            }
872
        }
873
    }
874
 
875
  gcc_assert (!err);
876
}
877
 
878
/* Determine immediate dominator (or postdominator, according to DIR) of BB,
879
   assuming that dominators of other blocks are correct.  We also use it to
880
   recompute the dominators in a restricted area, by iterating it until it
881
   reaches a fixed point.  */
882
 
883
basic_block
884
recount_dominator (enum cdi_direction dir, basic_block bb)
885
{
886
  basic_block dom_bb = NULL;
887
  edge e;
888
  edge_iterator ei;
889
 
890
  gcc_assert (dom_computed[dir]);
891
 
892
  if (dir == CDI_DOMINATORS)
893
    {
894
      FOR_EACH_EDGE (e, ei, bb->preds)
895
        {
896
          /* Ignore the predecessors that either are not reachable from
897
             the entry block, or whose dominator was not determined yet.  */
898
          if (!dominated_by_p (dir, e->src, ENTRY_BLOCK_PTR))
899
            continue;
900
 
901
          if (!dominated_by_p (dir, e->src, bb))
902
            dom_bb = nearest_common_dominator (dir, dom_bb, e->src);
903
        }
904
    }
905
  else
906
    {
907
      FOR_EACH_EDGE (e, ei, bb->succs)
908
        {
909
          if (!dominated_by_p (dir, e->dest, bb))
910
            dom_bb = nearest_common_dominator (dir, dom_bb, e->dest);
911
        }
912
    }
913
 
914
  return dom_bb;
915
}
916
 
917
/* Iteratively recount dominators of BBS. The change is supposed to be local
918
   and not to grow further.  */
919
void
920
iterate_fix_dominators (enum cdi_direction dir, basic_block *bbs, int n)
921
{
922
  int i, changed = 1;
923
  basic_block old_dom, new_dom;
924
 
925
  gcc_assert (dom_computed[dir]);
926
 
927
  for (i = 0; i < n; i++)
928
    set_immediate_dominator (dir, bbs[i], NULL);
929
 
930
  while (changed)
931
    {
932
      changed = 0;
933
      for (i = 0; i < n; i++)
934
        {
935
          old_dom = get_immediate_dominator (dir, bbs[i]);
936
          new_dom = recount_dominator (dir, bbs[i]);
937
          if (old_dom != new_dom)
938
            {
939
              changed = 1;
940
              set_immediate_dominator (dir, bbs[i], new_dom);
941
            }
942
        }
943
    }
944
 
945
  for (i = 0; i < n; i++)
946
    gcc_assert (get_immediate_dominator (dir, bbs[i]));
947
}
948
 
949
void
950
add_to_dominance_info (enum cdi_direction dir, basic_block bb)
951
{
952
  gcc_assert (dom_computed[dir]);
953
  gcc_assert (!bb->dom[dir]);
954
 
955
  n_bbs_in_dom_tree[dir]++;
956
 
957
  bb->dom[dir] = et_new_tree (bb);
958
 
959
  if (dom_computed[dir] == DOM_OK)
960
    dom_computed[dir] = DOM_NO_FAST_QUERY;
961
}
962
 
963
void
964
delete_from_dominance_info (enum cdi_direction dir, basic_block bb)
965
{
966
  gcc_assert (dom_computed[dir]);
967
 
968
  et_free_tree (bb->dom[dir]);
969
  bb->dom[dir] = NULL;
970
  n_bbs_in_dom_tree[dir]--;
971
 
972
  if (dom_computed[dir] == DOM_OK)
973
    dom_computed[dir] = DOM_NO_FAST_QUERY;
974
}
975
 
976
/* Returns the first son of BB in the dominator or postdominator tree
977
   as determined by DIR.  */
978
 
979
basic_block
980
first_dom_son (enum cdi_direction dir, basic_block bb)
981
{
982
  struct et_node *son = bb->dom[dir]->son;
983
 
984
  return son ? son->data : NULL;
985
}
986
 
987
/* Returns the next dominance son after BB in the dominator or postdominator
988
   tree as determined by DIR, or NULL if it was the last one.  */
989
 
990
basic_block
991
next_dom_son (enum cdi_direction dir, basic_block bb)
992
{
993
  struct et_node *next = bb->dom[dir]->right;
994
 
995
  return next->father->son == next ? NULL : next->data;
996
}
997
 
998
/* Returns true if dominance information for direction DIR is available.  */
999
 
1000
bool
1001
dom_info_available_p (enum cdi_direction dir)
1002
{
1003
  return dom_computed[dir] != DOM_NONE;
1004
}
1005
 
1006
void
1007
debug_dominance_info (enum cdi_direction dir)
1008
{
1009
  basic_block bb, bb2;
1010
  FOR_EACH_BB (bb)
1011
    if ((bb2 = get_immediate_dominator (dir, bb)))
1012
      fprintf (stderr, "%i %i\n", bb->index, bb2->index);
1013
}

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.