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

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [gnu-dev/] [or1k-gcc/] [gcc/] [cfgloop.c] - Blame information for rev 867

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

Line No. Rev Author Line
1 684 jeremybenn
/* Natural loop discovery code for GNU compiler.
2
   Copyright (C) 2000, 2001, 2003, 2004, 2005, 2006, 2007, 2008, 2010
3
   Free Software Foundation, Inc.
4
 
5
This file is part of GCC.
6
 
7
GCC is free software; you can redistribute it and/or modify it under
8
the terms of the GNU General Public License as published by the Free
9
Software Foundation; either version 3, or (at your option) any later
10
version.
11
 
12
GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13
WARRANTY; without even the implied warranty of MERCHANTABILITY or
14
FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
15
for more details.
16
 
17
You should have received a copy of the GNU General Public License
18
along with GCC; see the file COPYING3.  If not see
19
<http://www.gnu.org/licenses/>.  */
20
 
21
#include "config.h"
22
#include "system.h"
23
#include "coretypes.h"
24
#include "tm.h"
25
#include "rtl.h"
26
#include "hard-reg-set.h"
27
#include "obstack.h"
28
#include "function.h"
29
#include "basic-block.h"
30
#include "cfgloop.h"
31
#include "diagnostic-core.h"
32
#include "flags.h"
33
#include "tree.h"
34
#include "tree-flow.h"
35
#include "pointer-set.h"
36
#include "output.h"
37
#include "ggc.h"
38
 
39
static void flow_loops_cfg_dump (FILE *);
40
 
41
/* Dump loop related CFG information.  */
42
 
43
static void
44
flow_loops_cfg_dump (FILE *file)
45
{
46
  basic_block bb;
47
 
48
  if (!file)
49
    return;
50
 
51
  FOR_EACH_BB (bb)
52
    {
53
      edge succ;
54
      edge_iterator ei;
55
 
56
      fprintf (file, ";; %d succs { ", bb->index);
57
      FOR_EACH_EDGE (succ, ei, bb->succs)
58
        fprintf (file, "%d ", succ->dest->index);
59
      fprintf (file, "}\n");
60
    }
61
}
62
 
63
/* Return nonzero if the nodes of LOOP are a subset of OUTER.  */
64
 
65
bool
66
flow_loop_nested_p (const struct loop *outer, const struct loop *loop)
67
{
68
  unsigned odepth = loop_depth (outer);
69
 
70
  return (loop_depth (loop) > odepth
71
          && VEC_index (loop_p, loop->superloops, odepth) == outer);
72
}
73
 
74
/* Returns the loop such that LOOP is nested DEPTH (indexed from zero)
75
   loops within LOOP.  */
76
 
77
struct loop *
78
superloop_at_depth (struct loop *loop, unsigned depth)
79
{
80
  unsigned ldepth = loop_depth (loop);
81
 
82
  gcc_assert (depth <= ldepth);
83
 
84
  if (depth == ldepth)
85
    return loop;
86
 
87
  return VEC_index (loop_p, loop->superloops, depth);
88
}
89
 
90
/* Returns the list of the latch edges of LOOP.  */
91
 
92
static VEC (edge, heap) *
93
get_loop_latch_edges (const struct loop *loop)
94
{
95
  edge_iterator ei;
96
  edge e;
97
  VEC (edge, heap) *ret = NULL;
98
 
99
  FOR_EACH_EDGE (e, ei, loop->header->preds)
100
    {
101
      if (dominated_by_p (CDI_DOMINATORS, e->src, loop->header))
102
        VEC_safe_push (edge, heap, ret, e);
103
    }
104
 
105
  return ret;
106
}
107
 
108
/* Dump the loop information specified by LOOP to the stream FILE
109
   using auxiliary dump callback function LOOP_DUMP_AUX if non null.  */
110
 
111
void
112
flow_loop_dump (const struct loop *loop, FILE *file,
113
                void (*loop_dump_aux) (const struct loop *, FILE *, int),
114
                int verbose)
115
{
116
  basic_block *bbs;
117
  unsigned i;
118
  VEC (edge, heap) *latches;
119
  edge e;
120
 
121
  if (! loop || ! loop->header)
122
    return;
123
 
124
  fprintf (file, ";;\n;; Loop %d\n", loop->num);
125
 
126
  fprintf (file, ";;  header %d, ", loop->header->index);
127
  if (loop->latch)
128
    fprintf (file, "latch %d\n", loop->latch->index);
129
  else
130
    {
131
      fprintf (file, "multiple latches:");
132
      latches = get_loop_latch_edges (loop);
133
      FOR_EACH_VEC_ELT (edge, latches, i, e)
134
        fprintf (file, " %d", e->src->index);
135
      VEC_free (edge, heap, latches);
136
      fprintf (file, "\n");
137
    }
138
 
139
  fprintf (file, ";;  depth %d, outer %ld\n",
140
           loop_depth (loop), (long) (loop_outer (loop)
141
                                      ? loop_outer (loop)->num : -1));
142
 
143
  fprintf (file, ";;  nodes:");
144
  bbs = get_loop_body (loop);
145
  for (i = 0; i < loop->num_nodes; i++)
146
    fprintf (file, " %d", bbs[i]->index);
147
  free (bbs);
148
  fprintf (file, "\n");
149
 
150
  if (loop_dump_aux)
151
    loop_dump_aux (loop, file, verbose);
152
}
153
 
154
/* Dump the loop information about loops to the stream FILE,
155
   using auxiliary dump callback function LOOP_DUMP_AUX if non null.  */
156
 
157
void
158
flow_loops_dump (FILE *file, void (*loop_dump_aux) (const struct loop *, FILE *, int), int verbose)
159
{
160
  loop_iterator li;
161
  struct loop *loop;
162
 
163
  if (!current_loops || ! file)
164
    return;
165
 
166
  fprintf (file, ";; %d loops found\n", number_of_loops ());
167
 
168
  FOR_EACH_LOOP (li, loop, LI_INCLUDE_ROOT)
169
    {
170
      flow_loop_dump (loop, file, loop_dump_aux, verbose);
171
    }
172
 
173
  if (verbose)
174
    flow_loops_cfg_dump (file);
175
}
176
 
177
/* Free data allocated for LOOP.  */
178
 
179
void
180
flow_loop_free (struct loop *loop)
181
{
182
  struct loop_exit *exit, *next;
183
 
184
  VEC_free (loop_p, gc, loop->superloops);
185
 
186
  /* Break the list of the loop exit records.  They will be freed when the
187
     corresponding edge is rescanned or removed, and this avoids
188
     accessing the (already released) head of the list stored in the
189
     loop structure.  */
190
  for (exit = loop->exits->next; exit != loop->exits; exit = next)
191
    {
192
      next = exit->next;
193
      exit->next = exit;
194
      exit->prev = exit;
195
    }
196
 
197
  ggc_free (loop->exits);
198
  ggc_free (loop);
199
}
200
 
201
/* Free all the memory allocated for LOOPS.  */
202
 
203
void
204
flow_loops_free (struct loops *loops)
205
{
206
  if (loops->larray)
207
    {
208
      unsigned i;
209
      loop_p loop;
210
 
211
      /* Free the loop descriptors.  */
212
      FOR_EACH_VEC_ELT (loop_p, loops->larray, i, loop)
213
        {
214
          if (!loop)
215
            continue;
216
 
217
          flow_loop_free (loop);
218
        }
219
 
220
      VEC_free (loop_p, gc, loops->larray);
221
    }
222
}
223
 
224
/* Find the nodes contained within the LOOP with header HEADER.
225
   Return the number of nodes within the loop.  */
226
 
227
int
228
flow_loop_nodes_find (basic_block header, struct loop *loop)
229
{
230
  VEC (basic_block, heap) *stack = NULL;
231
  int num_nodes = 1;
232
  edge latch;
233
  edge_iterator latch_ei;
234
  unsigned depth = loop_depth (loop);
235
 
236
  header->loop_father = loop;
237
  header->loop_depth = depth;
238
 
239
  FOR_EACH_EDGE (latch, latch_ei, loop->header->preds)
240
    {
241
      if (latch->src->loop_father == loop
242
          || !dominated_by_p (CDI_DOMINATORS, latch->src, loop->header))
243
        continue;
244
 
245
      num_nodes++;
246
      VEC_safe_push (basic_block, heap, stack, latch->src);
247
      latch->src->loop_father = loop;
248
      latch->src->loop_depth = depth;
249
 
250
      while (!VEC_empty (basic_block, stack))
251
        {
252
          basic_block node;
253
          edge e;
254
          edge_iterator ei;
255
 
256
          node = VEC_pop (basic_block, stack);
257
 
258
          FOR_EACH_EDGE (e, ei, node->preds)
259
            {
260
              basic_block ancestor = e->src;
261
 
262
              if (ancestor->loop_father != loop)
263
                {
264
                  ancestor->loop_father = loop;
265
                  ancestor->loop_depth = depth;
266
                  num_nodes++;
267
                  VEC_safe_push (basic_block, heap, stack, ancestor);
268
                }
269
            }
270
        }
271
    }
272
  VEC_free (basic_block, heap, stack);
273
 
274
  return num_nodes;
275
}
276
 
277
/* Records the vector of superloops of the loop LOOP, whose immediate
278
   superloop is FATHER.  */
279
 
280
static void
281
establish_preds (struct loop *loop, struct loop *father)
282
{
283
  loop_p ploop;
284
  unsigned depth = loop_depth (father) + 1;
285
  unsigned i;
286
 
287
  VEC_truncate (loop_p, loop->superloops, 0);
288
  VEC_reserve (loop_p, gc, loop->superloops, depth);
289
  FOR_EACH_VEC_ELT (loop_p, father->superloops, i, ploop)
290
    VEC_quick_push (loop_p, loop->superloops, ploop);
291
  VEC_quick_push (loop_p, loop->superloops, father);
292
 
293
  for (ploop = loop->inner; ploop; ploop = ploop->next)
294
    establish_preds (ploop, loop);
295
}
296
 
297
/* Add LOOP to the loop hierarchy tree where FATHER is father of the
298
   added loop.  If LOOP has some children, take care of that their
299
   pred field will be initialized correctly.  */
300
 
301
void
302
flow_loop_tree_node_add (struct loop *father, struct loop *loop)
303
{
304
  loop->next = father->inner;
305
  father->inner = loop;
306
 
307
  establish_preds (loop, father);
308
}
309
 
310
/* Remove LOOP from the loop hierarchy tree.  */
311
 
312
void
313
flow_loop_tree_node_remove (struct loop *loop)
314
{
315
  struct loop *prev, *father;
316
 
317
  father = loop_outer (loop);
318
 
319
  /* Remove loop from the list of sons.  */
320
  if (father->inner == loop)
321
    father->inner = loop->next;
322
  else
323
    {
324
      for (prev = father->inner; prev->next != loop; prev = prev->next)
325
        continue;
326
      prev->next = loop->next;
327
    }
328
 
329
  VEC_truncate (loop_p, loop->superloops, 0);
330
}
331
 
332
/* Allocates and returns new loop structure.  */
333
 
334
struct loop *
335
alloc_loop (void)
336
{
337
  struct loop *loop = ggc_alloc_cleared_loop ();
338
 
339
  loop->exits = ggc_alloc_cleared_loop_exit ();
340
  loop->exits->next = loop->exits->prev = loop->exits;
341
  loop->can_be_parallel = false;
342
 
343
  return loop;
344
}
345
 
346
/* Initializes loops structure LOOPS, reserving place for NUM_LOOPS loops
347
   (including the root of the loop tree).  */
348
 
349
static void
350
init_loops_structure (struct loops *loops, unsigned num_loops)
351
{
352
  struct loop *root;
353
 
354
  memset (loops, 0, sizeof *loops);
355
  loops->larray = VEC_alloc (loop_p, gc, num_loops);
356
 
357
  /* Dummy loop containing whole function.  */
358
  root = alloc_loop ();
359
  root->num_nodes = n_basic_blocks;
360
  root->latch = EXIT_BLOCK_PTR;
361
  root->header = ENTRY_BLOCK_PTR;
362
  ENTRY_BLOCK_PTR->loop_father = root;
363
  EXIT_BLOCK_PTR->loop_father = root;
364
 
365
  VEC_quick_push (loop_p, loops->larray, root);
366
  loops->tree_root = root;
367
}
368
 
369
/* Find all the natural loops in the function and save in LOOPS structure and
370
   recalculate loop_depth information in basic block structures.
371
   Return the number of natural loops found.  */
372
 
373
int
374
flow_loops_find (struct loops *loops)
375
{
376
  int b;
377
  int num_loops;
378
  edge e;
379
  sbitmap headers;
380
  int *dfs_order;
381
  int *rc_order;
382
  basic_block header;
383
  basic_block bb;
384
 
385
  /* Ensure that the dominators are computed.  */
386
  calculate_dominance_info (CDI_DOMINATORS);
387
 
388
  /* Taking care of this degenerate case makes the rest of
389
     this code simpler.  */
390
  if (n_basic_blocks == NUM_FIXED_BLOCKS)
391
    {
392
      init_loops_structure (loops, 1);
393
      return 1;
394
    }
395
 
396
  dfs_order = NULL;
397
  rc_order = NULL;
398
 
399
  /* Count the number of loop headers.  This should be the
400
     same as the number of natural loops.  */
401
  headers = sbitmap_alloc (last_basic_block);
402
  sbitmap_zero (headers);
403
 
404
  num_loops = 0;
405
  FOR_EACH_BB (header)
406
    {
407
      edge_iterator ei;
408
 
409
      header->loop_depth = 0;
410
 
411
      /* If we have an abnormal predecessor, do not consider the
412
         loop (not worth the problems).  */
413
      if (bb_has_abnormal_pred (header))
414
        continue;
415
 
416
      FOR_EACH_EDGE (e, ei, header->preds)
417
        {
418
          basic_block latch = e->src;
419
 
420
          gcc_assert (!(e->flags & EDGE_ABNORMAL));
421
 
422
          /* Look for back edges where a predecessor is dominated
423
             by this block.  A natural loop has a single entry
424
             node (header) that dominates all the nodes in the
425
             loop.  It also has single back edge to the header
426
             from a latch node.  */
427
          if (latch != ENTRY_BLOCK_PTR
428
              && dominated_by_p (CDI_DOMINATORS, latch, header))
429
            {
430
              /* Shared headers should be eliminated by now.  */
431
              SET_BIT (headers, header->index);
432
              num_loops++;
433
            }
434
        }
435
    }
436
 
437
  /* Allocate loop structures.  */
438
  init_loops_structure (loops, num_loops + 1);
439
 
440
  /* Find and record information about all the natural loops
441
     in the CFG.  */
442
  FOR_EACH_BB (bb)
443
    bb->loop_father = loops->tree_root;
444
 
445
  if (num_loops)
446
    {
447
      /* Compute depth first search order of the CFG so that outer
448
         natural loops will be found before inner natural loops.  */
449
      dfs_order = XNEWVEC (int, n_basic_blocks);
450
      rc_order = XNEWVEC (int, n_basic_blocks);
451
      pre_and_rev_post_order_compute (dfs_order, rc_order, false);
452
 
453
      num_loops = 1;
454
 
455
      for (b = 0; b < n_basic_blocks - NUM_FIXED_BLOCKS; b++)
456
        {
457
          struct loop *loop;
458
          edge_iterator ei;
459
 
460
          /* Search the nodes of the CFG in reverse completion order
461
             so that we can find outer loops first.  */
462
          if (!TEST_BIT (headers, rc_order[b]))
463
            continue;
464
 
465
          header = BASIC_BLOCK (rc_order[b]);
466
 
467
          loop = alloc_loop ();
468
          VEC_quick_push (loop_p, loops->larray, loop);
469
 
470
          loop->header = header;
471
          loop->num = num_loops;
472
          num_loops++;
473
 
474
          flow_loop_tree_node_add (header->loop_father, loop);
475
          loop->num_nodes = flow_loop_nodes_find (loop->header, loop);
476
 
477
          /* Look for the latch for this header block, if it has just a
478
             single one.  */
479
          FOR_EACH_EDGE (e, ei, header->preds)
480
            {
481
              basic_block latch = e->src;
482
 
483
              if (flow_bb_inside_loop_p (loop, latch))
484
                {
485
                  if (loop->latch != NULL)
486
                    {
487
                      /* More than one latch edge.  */
488
                      loop->latch = NULL;
489
                      break;
490
                    }
491
                  loop->latch = latch;
492
                }
493
            }
494
        }
495
 
496
      free (dfs_order);
497
      free (rc_order);
498
    }
499
 
500
  sbitmap_free (headers);
501
 
502
  loops->exits = NULL;
503
  return VEC_length (loop_p, loops->larray);
504
}
505
 
506
/* Ratio of frequencies of edges so that one of more latch edges is
507
   considered to belong to inner loop with same header.  */
508
#define HEAVY_EDGE_RATIO 8
509
 
510
/* Minimum number of samples for that we apply
511
   find_subloop_latch_edge_by_profile heuristics.  */
512
#define HEAVY_EDGE_MIN_SAMPLES 10
513
 
514
/* If the profile info is available, finds an edge in LATCHES that much more
515
   frequent than the remaining edges.  Returns such an edge, or NULL if we do
516
   not find one.
517
 
518
   We do not use guessed profile here, only the measured one.  The guessed
519
   profile is usually too flat and unreliable for this (and it is mostly based
520
   on the loop structure of the program, so it does not make much sense to
521
   derive the loop structure from it).  */
522
 
523
static edge
524
find_subloop_latch_edge_by_profile (VEC (edge, heap) *latches)
525
{
526
  unsigned i;
527
  edge e, me = NULL;
528
  gcov_type mcount = 0, tcount = 0;
529
 
530
  FOR_EACH_VEC_ELT (edge, latches, i, e)
531
    {
532
      if (e->count > mcount)
533
        {
534
          me = e;
535
          mcount = e->count;
536
        }
537
      tcount += e->count;
538
    }
539
 
540
  if (tcount < HEAVY_EDGE_MIN_SAMPLES
541
      || (tcount - mcount) * HEAVY_EDGE_RATIO > tcount)
542
    return NULL;
543
 
544
  if (dump_file)
545
    fprintf (dump_file,
546
             "Found latch edge %d -> %d using profile information.\n",
547
             me->src->index, me->dest->index);
548
  return me;
549
}
550
 
551
/* Among LATCHES, guesses a latch edge of LOOP corresponding to subloop, based
552
   on the structure of induction variables.  Returns this edge, or NULL if we
553
   do not find any.
554
 
555
   We are quite conservative, and look just for an obvious simple innermost
556
   loop (which is the case where we would lose the most performance by not
557
   disambiguating the loop).  More precisely, we look for the following
558
   situation: The source of the chosen latch edge dominates sources of all
559
   the other latch edges.  Additionally, the header does not contain a phi node
560
   such that the argument from the chosen edge is equal to the argument from
561
   another edge.  */
562
 
563
static edge
564
find_subloop_latch_edge_by_ivs (struct loop *loop ATTRIBUTE_UNUSED, VEC (edge, heap) *latches)
565
{
566
  edge e, latch = VEC_index (edge, latches, 0);
567
  unsigned i;
568
  gimple phi;
569
  gimple_stmt_iterator psi;
570
  tree lop;
571
  basic_block bb;
572
 
573
  /* Find the candidate for the latch edge.  */
574
  for (i = 1; VEC_iterate (edge, latches, i, e); i++)
575
    if (dominated_by_p (CDI_DOMINATORS, latch->src, e->src))
576
      latch = e;
577
 
578
  /* Verify that it dominates all the latch edges.  */
579
  FOR_EACH_VEC_ELT (edge, latches, i, e)
580
    if (!dominated_by_p (CDI_DOMINATORS, e->src, latch->src))
581
      return NULL;
582
 
583
  /* Check for a phi node that would deny that this is a latch edge of
584
     a subloop.  */
585
  for (psi = gsi_start_phis (loop->header); !gsi_end_p (psi); gsi_next (&psi))
586
    {
587
      phi = gsi_stmt (psi);
588
      lop = PHI_ARG_DEF_FROM_EDGE (phi, latch);
589
 
590
      /* Ignore the values that are not changed inside the subloop.  */
591
      if (TREE_CODE (lop) != SSA_NAME
592
          || SSA_NAME_DEF_STMT (lop) == phi)
593
        continue;
594
      bb = gimple_bb (SSA_NAME_DEF_STMT (lop));
595
      if (!bb || !flow_bb_inside_loop_p (loop, bb))
596
        continue;
597
 
598
      FOR_EACH_VEC_ELT (edge, latches, i, e)
599
        if (e != latch
600
            && PHI_ARG_DEF_FROM_EDGE (phi, e) == lop)
601
          return NULL;
602
    }
603
 
604
  if (dump_file)
605
    fprintf (dump_file,
606
             "Found latch edge %d -> %d using iv structure.\n",
607
             latch->src->index, latch->dest->index);
608
  return latch;
609
}
610
 
611
/* If we can determine that one of the several latch edges of LOOP behaves
612
   as a latch edge of a separate subloop, returns this edge.  Otherwise
613
   returns NULL.  */
614
 
615
static edge
616
find_subloop_latch_edge (struct loop *loop)
617
{
618
  VEC (edge, heap) *latches = get_loop_latch_edges (loop);
619
  edge latch = NULL;
620
 
621
  if (VEC_length (edge, latches) > 1)
622
    {
623
      latch = find_subloop_latch_edge_by_profile (latches);
624
 
625
      if (!latch
626
          /* We consider ivs to guess the latch edge only in SSA.  Perhaps we
627
             should use cfghook for this, but it is hard to imagine it would
628
             be useful elsewhere.  */
629
          && current_ir_type () == IR_GIMPLE)
630
        latch = find_subloop_latch_edge_by_ivs (loop, latches);
631
    }
632
 
633
  VEC_free (edge, heap, latches);
634
  return latch;
635
}
636
 
637
/* Callback for make_forwarder_block.  Returns true if the edge E is marked
638
   in the set MFB_REIS_SET.  */
639
 
640
static struct pointer_set_t *mfb_reis_set;
641
static bool
642
mfb_redirect_edges_in_set (edge e)
643
{
644
  return pointer_set_contains (mfb_reis_set, e);
645
}
646
 
647
/* Creates a subloop of LOOP with latch edge LATCH.  */
648
 
649
static void
650
form_subloop (struct loop *loop, edge latch)
651
{
652
  edge_iterator ei;
653
  edge e, new_entry;
654
  struct loop *new_loop;
655
 
656
  mfb_reis_set = pointer_set_create ();
657
  FOR_EACH_EDGE (e, ei, loop->header->preds)
658
    {
659
      if (e != latch)
660
        pointer_set_insert (mfb_reis_set, e);
661
    }
662
  new_entry = make_forwarder_block (loop->header, mfb_redirect_edges_in_set,
663
                                    NULL);
664
  pointer_set_destroy (mfb_reis_set);
665
 
666
  loop->header = new_entry->src;
667
 
668
  /* Find the blocks and subloops that belong to the new loop, and add it to
669
     the appropriate place in the loop tree.  */
670
  new_loop = alloc_loop ();
671
  new_loop->header = new_entry->dest;
672
  new_loop->latch = latch->src;
673
  add_loop (new_loop, loop);
674
}
675
 
676
/* Make all the latch edges of LOOP to go to a single forwarder block --
677
   a new latch of LOOP.  */
678
 
679
static void
680
merge_latch_edges (struct loop *loop)
681
{
682
  VEC (edge, heap) *latches = get_loop_latch_edges (loop);
683
  edge latch, e;
684
  unsigned i;
685
 
686
  gcc_assert (VEC_length (edge, latches) > 0);
687
 
688
  if (VEC_length (edge, latches) == 1)
689
    loop->latch = VEC_index (edge, latches, 0)->src;
690
  else
691
    {
692
      if (dump_file)
693
        fprintf (dump_file, "Merged latch edges of loop %d\n", loop->num);
694
 
695
      mfb_reis_set = pointer_set_create ();
696
      FOR_EACH_VEC_ELT (edge, latches, i, e)
697
        pointer_set_insert (mfb_reis_set, e);
698
      latch = make_forwarder_block (loop->header, mfb_redirect_edges_in_set,
699
                                    NULL);
700
      pointer_set_destroy (mfb_reis_set);
701
 
702
      loop->header = latch->dest;
703
      loop->latch = latch->src;
704
    }
705
 
706
  VEC_free (edge, heap, latches);
707
}
708
 
709
/* LOOP may have several latch edges.  Transform it into (possibly several)
710
   loops with single latch edge.  */
711
 
712
static void
713
disambiguate_multiple_latches (struct loop *loop)
714
{
715
  edge e;
716
 
717
  /* We eliminate the multiple latches by splitting the header to the forwarder
718
     block F and the rest R, and redirecting the edges.  There are two cases:
719
 
720
     1) If there is a latch edge E that corresponds to a subloop (we guess
721
        that based on profile -- if it is taken much more often than the
722
        remaining edges; and on trees, using the information about induction
723
        variables of the loops), we redirect E to R, all the remaining edges to
724
        F, then rescan the loops and try again for the outer loop.
725
     2) If there is no such edge, we redirect all latch edges to F, and the
726
        entry edges to R, thus making F the single latch of the loop.  */
727
 
728
  if (dump_file)
729
    fprintf (dump_file, "Disambiguating loop %d with multiple latches\n",
730
             loop->num);
731
 
732
  /* During latch merging, we may need to redirect the entry edges to a new
733
     block.  This would cause problems if the entry edge was the one from the
734
     entry block.  To avoid having to handle this case specially, split
735
     such entry edge.  */
736
  e = find_edge (ENTRY_BLOCK_PTR, loop->header);
737
  if (e)
738
    split_edge (e);
739
 
740
  while (1)
741
    {
742
      e = find_subloop_latch_edge (loop);
743
      if (!e)
744
        break;
745
 
746
      form_subloop (loop, e);
747
    }
748
 
749
  merge_latch_edges (loop);
750
}
751
 
752
/* Split loops with multiple latch edges.  */
753
 
754
void
755
disambiguate_loops_with_multiple_latches (void)
756
{
757
  loop_iterator li;
758
  struct loop *loop;
759
 
760
  FOR_EACH_LOOP (li, loop, 0)
761
    {
762
      if (!loop->latch)
763
        disambiguate_multiple_latches (loop);
764
    }
765
}
766
 
767
/* Return nonzero if basic block BB belongs to LOOP.  */
768
bool
769
flow_bb_inside_loop_p (const struct loop *loop, const_basic_block bb)
770
{
771
  struct loop *source_loop;
772
 
773
  if (bb == ENTRY_BLOCK_PTR || bb == EXIT_BLOCK_PTR)
774
    return 0;
775
 
776
  source_loop = bb->loop_father;
777
  return loop == source_loop || flow_loop_nested_p (loop, source_loop);
778
}
779
 
780
/* Enumeration predicate for get_loop_body_with_size.  */
781
static bool
782
glb_enum_p (const_basic_block bb, const void *glb_loop)
783
{
784
  const struct loop *const loop = (const struct loop *) glb_loop;
785
  return (bb != loop->header
786
          && dominated_by_p (CDI_DOMINATORS, bb, loop->header));
787
}
788
 
789
/* Gets basic blocks of a LOOP.  Header is the 0-th block, rest is in dfs
790
   order against direction of edges from latch.  Specially, if
791
   header != latch, latch is the 1-st block.  LOOP cannot be the fake
792
   loop tree root, and its size must be at most MAX_SIZE.  The blocks
793
   in the LOOP body are stored to BODY, and the size of the LOOP is
794
   returned.  */
795
 
796
unsigned
797
get_loop_body_with_size (const struct loop *loop, basic_block *body,
798
                         unsigned max_size)
799
{
800
  return dfs_enumerate_from (loop->header, 1, glb_enum_p,
801
                             body, max_size, loop);
802
}
803
 
804
/* Gets basic blocks of a LOOP.  Header is the 0-th block, rest is in dfs
805
   order against direction of edges from latch.  Specially, if
806
   header != latch, latch is the 1-st block.  */
807
 
808
basic_block *
809
get_loop_body (const struct loop *loop)
810
{
811
  basic_block *body, bb;
812
  unsigned tv = 0;
813
 
814
  gcc_assert (loop->num_nodes);
815
 
816
  body = XCNEWVEC (basic_block, loop->num_nodes);
817
 
818
  if (loop->latch == EXIT_BLOCK_PTR)
819
    {
820
      /* There may be blocks unreachable from EXIT_BLOCK, hence we need to
821
         special-case the fake loop that contains the whole function.  */
822
      gcc_assert (loop->num_nodes == (unsigned) n_basic_blocks);
823
      body[tv++] = loop->header;
824
      body[tv++] = EXIT_BLOCK_PTR;
825
      FOR_EACH_BB (bb)
826
        body[tv++] = bb;
827
    }
828
  else
829
    tv = get_loop_body_with_size (loop, body, loop->num_nodes);
830
 
831
  gcc_assert (tv == loop->num_nodes);
832
  return body;
833
}
834
 
835
/* Fills dominance descendants inside LOOP of the basic block BB into
836
   array TOVISIT from index *TV.  */
837
 
838
static void
839
fill_sons_in_loop (const struct loop *loop, basic_block bb,
840
                   basic_block *tovisit, int *tv)
841
{
842
  basic_block son, postpone = NULL;
843
 
844
  tovisit[(*tv)++] = bb;
845
  for (son = first_dom_son (CDI_DOMINATORS, bb);
846
       son;
847
       son = next_dom_son (CDI_DOMINATORS, son))
848
    {
849
      if (!flow_bb_inside_loop_p (loop, son))
850
        continue;
851
 
852
      if (dominated_by_p (CDI_DOMINATORS, loop->latch, son))
853
        {
854
          postpone = son;
855
          continue;
856
        }
857
      fill_sons_in_loop (loop, son, tovisit, tv);
858
    }
859
 
860
  if (postpone)
861
    fill_sons_in_loop (loop, postpone, tovisit, tv);
862
}
863
 
864
/* Gets body of a LOOP (that must be different from the outermost loop)
865
   sorted by dominance relation.  Additionally, if a basic block s dominates
866
   the latch, then only blocks dominated by s are be after it.  */
867
 
868
basic_block *
869
get_loop_body_in_dom_order (const struct loop *loop)
870
{
871
  basic_block *tovisit;
872
  int tv;
873
 
874
  gcc_assert (loop->num_nodes);
875
 
876
  tovisit = XCNEWVEC (basic_block, loop->num_nodes);
877
 
878
  gcc_assert (loop->latch != EXIT_BLOCK_PTR);
879
 
880
  tv = 0;
881
  fill_sons_in_loop (loop, loop->header, tovisit, &tv);
882
 
883
  gcc_assert (tv == (int) loop->num_nodes);
884
 
885
  return tovisit;
886
}
887
 
888
/* Gets body of a LOOP sorted via provided BB_COMPARATOR.  */
889
 
890
basic_block *
891
get_loop_body_in_custom_order (const struct loop *loop,
892
                               int (*bb_comparator) (const void *, const void *))
893
{
894
  basic_block *bbs = get_loop_body (loop);
895
 
896
  qsort (bbs, loop->num_nodes, sizeof (basic_block), bb_comparator);
897
 
898
  return bbs;
899
}
900
 
901
/* Get body of a LOOP in breadth first sort order.  */
902
 
903
basic_block *
904
get_loop_body_in_bfs_order (const struct loop *loop)
905
{
906
  basic_block *blocks;
907
  basic_block bb;
908
  bitmap visited;
909
  unsigned int i = 0;
910
  unsigned int vc = 1;
911
 
912
  gcc_assert (loop->num_nodes);
913
  gcc_assert (loop->latch != EXIT_BLOCK_PTR);
914
 
915
  blocks = XCNEWVEC (basic_block, loop->num_nodes);
916
  visited = BITMAP_ALLOC (NULL);
917
 
918
  bb = loop->header;
919
  while (i < loop->num_nodes)
920
    {
921
      edge e;
922
      edge_iterator ei;
923
 
924
      if (bitmap_set_bit (visited, bb->index))
925
        /* This basic block is now visited */
926
        blocks[i++] = bb;
927
 
928
      FOR_EACH_EDGE (e, ei, bb->succs)
929
        {
930
          if (flow_bb_inside_loop_p (loop, e->dest))
931
            {
932
              if (bitmap_set_bit (visited, e->dest->index))
933
                blocks[i++] = e->dest;
934
            }
935
        }
936
 
937
      gcc_assert (i >= vc);
938
 
939
      bb = blocks[vc++];
940
    }
941
 
942
  BITMAP_FREE (visited);
943
  return blocks;
944
}
945
 
946
/* Hash function for struct loop_exit.  */
947
 
948
static hashval_t
949
loop_exit_hash (const void *ex)
950
{
951
  const struct loop_exit *const exit = (const struct loop_exit *) ex;
952
 
953
  return htab_hash_pointer (exit->e);
954
}
955
 
956
/* Equality function for struct loop_exit.  Compares with edge.  */
957
 
958
static int
959
loop_exit_eq (const void *ex, const void *e)
960
{
961
  const struct loop_exit *const exit = (const struct loop_exit *) ex;
962
 
963
  return exit->e == e;
964
}
965
 
966
/* Frees the list of loop exit descriptions EX.  */
967
 
968
static void
969
loop_exit_free (void *ex)
970
{
971
  struct loop_exit *exit = (struct loop_exit *) ex, *next;
972
 
973
  for (; exit; exit = next)
974
    {
975
      next = exit->next_e;
976
 
977
      exit->next->prev = exit->prev;
978
      exit->prev->next = exit->next;
979
 
980
      ggc_free (exit);
981
    }
982
}
983
 
984
/* Returns the list of records for E as an exit of a loop.  */
985
 
986
static struct loop_exit *
987
get_exit_descriptions (edge e)
988
{
989
  return (struct loop_exit *) htab_find_with_hash (current_loops->exits, e,
990
                                                   htab_hash_pointer (e));
991
}
992
 
993
/* Updates the lists of loop exits in that E appears.
994
   If REMOVED is true, E is being removed, and we
995
   just remove it from the lists of exits.
996
   If NEW_EDGE is true and E is not a loop exit, we
997
   do not try to remove it from loop exit lists.  */
998
 
999
void
1000
rescan_loop_exit (edge e, bool new_edge, bool removed)
1001
{
1002
  void **slot;
1003
  struct loop_exit *exits = NULL, *exit;
1004
  struct loop *aloop, *cloop;
1005
 
1006
  if (!loops_state_satisfies_p (LOOPS_HAVE_RECORDED_EXITS))
1007
    return;
1008
 
1009
  if (!removed
1010
      && e->src->loop_father != NULL
1011
      && e->dest->loop_father != NULL
1012
      && !flow_bb_inside_loop_p (e->src->loop_father, e->dest))
1013
    {
1014
      cloop = find_common_loop (e->src->loop_father, e->dest->loop_father);
1015
      for (aloop = e->src->loop_father;
1016
           aloop != cloop;
1017
           aloop = loop_outer (aloop))
1018
        {
1019
          exit = ggc_alloc_loop_exit ();
1020
          exit->e = e;
1021
 
1022
          exit->next = aloop->exits->next;
1023
          exit->prev = aloop->exits;
1024
          exit->next->prev = exit;
1025
          exit->prev->next = exit;
1026
 
1027
          exit->next_e = exits;
1028
          exits = exit;
1029
        }
1030
    }
1031
 
1032
  if (!exits && new_edge)
1033
    return;
1034
 
1035
  slot = htab_find_slot_with_hash (current_loops->exits, e,
1036
                                   htab_hash_pointer (e),
1037
                                   exits ? INSERT : NO_INSERT);
1038
  if (!slot)
1039
    return;
1040
 
1041
  if (exits)
1042
    {
1043
      if (*slot)
1044
        loop_exit_free (*slot);
1045
      *slot = exits;
1046
    }
1047
  else
1048
    htab_clear_slot (current_loops->exits, slot);
1049
}
1050
 
1051
/* For each loop, record list of exit edges, and start maintaining these
1052
   lists.  */
1053
 
1054
void
1055
record_loop_exits (void)
1056
{
1057
  basic_block bb;
1058
  edge_iterator ei;
1059
  edge e;
1060
 
1061
  if (!current_loops)
1062
    return;
1063
 
1064
  if (loops_state_satisfies_p (LOOPS_HAVE_RECORDED_EXITS))
1065
    return;
1066
  loops_state_set (LOOPS_HAVE_RECORDED_EXITS);
1067
 
1068
  gcc_assert (current_loops->exits == NULL);
1069
  current_loops->exits = htab_create_ggc (2 * number_of_loops (),
1070
                                          loop_exit_hash, loop_exit_eq,
1071
                                          loop_exit_free);
1072
 
1073
  FOR_EACH_BB (bb)
1074
    {
1075
      FOR_EACH_EDGE (e, ei, bb->succs)
1076
        {
1077
          rescan_loop_exit (e, true, false);
1078
        }
1079
    }
1080
}
1081
 
1082
/* Dumps information about the exit in *SLOT to FILE.
1083
   Callback for htab_traverse.  */
1084
 
1085
static int
1086
dump_recorded_exit (void **slot, void *file)
1087
{
1088
  struct loop_exit *exit = (struct loop_exit *) *slot;
1089
  unsigned n = 0;
1090
  edge e = exit->e;
1091
 
1092
  for (; exit != NULL; exit = exit->next_e)
1093
    n++;
1094
 
1095
  fprintf ((FILE*) file, "Edge %d->%d exits %u loops\n",
1096
           e->src->index, e->dest->index, n);
1097
 
1098
  return 1;
1099
}
1100
 
1101
/* Dumps the recorded exits of loops to FILE.  */
1102
 
1103
extern void dump_recorded_exits (FILE *);
1104
void
1105
dump_recorded_exits (FILE *file)
1106
{
1107
  if (!current_loops->exits)
1108
    return;
1109
  htab_traverse (current_loops->exits, dump_recorded_exit, file);
1110
}
1111
 
1112
/* Releases lists of loop exits.  */
1113
 
1114
void
1115
release_recorded_exits (void)
1116
{
1117
  gcc_assert (loops_state_satisfies_p (LOOPS_HAVE_RECORDED_EXITS));
1118
  htab_delete (current_loops->exits);
1119
  current_loops->exits = NULL;
1120
  loops_state_clear (LOOPS_HAVE_RECORDED_EXITS);
1121
}
1122
 
1123
/* Returns the list of the exit edges of a LOOP.  */
1124
 
1125
VEC (edge, heap) *
1126
get_loop_exit_edges (const struct loop *loop)
1127
{
1128
  VEC (edge, heap) *edges = NULL;
1129
  edge e;
1130
  unsigned i;
1131
  basic_block *body;
1132
  edge_iterator ei;
1133
  struct loop_exit *exit;
1134
 
1135
  gcc_assert (loop->latch != EXIT_BLOCK_PTR);
1136
 
1137
  /* If we maintain the lists of exits, use them.  Otherwise we must
1138
     scan the body of the loop.  */
1139
  if (loops_state_satisfies_p (LOOPS_HAVE_RECORDED_EXITS))
1140
    {
1141
      for (exit = loop->exits->next; exit->e; exit = exit->next)
1142
        VEC_safe_push (edge, heap, edges, exit->e);
1143
    }
1144
  else
1145
    {
1146
      body = get_loop_body (loop);
1147
      for (i = 0; i < loop->num_nodes; i++)
1148
        FOR_EACH_EDGE (e, ei, body[i]->succs)
1149
          {
1150
            if (!flow_bb_inside_loop_p (loop, e->dest))
1151
              VEC_safe_push (edge, heap, edges, e);
1152
          }
1153
      free (body);
1154
    }
1155
 
1156
  return edges;
1157
}
1158
 
1159
/* Counts the number of conditional branches inside LOOP.  */
1160
 
1161
unsigned
1162
num_loop_branches (const struct loop *loop)
1163
{
1164
  unsigned i, n;
1165
  basic_block * body;
1166
 
1167
  gcc_assert (loop->latch != EXIT_BLOCK_PTR);
1168
 
1169
  body = get_loop_body (loop);
1170
  n = 0;
1171
  for (i = 0; i < loop->num_nodes; i++)
1172
    if (EDGE_COUNT (body[i]->succs) >= 2)
1173
      n++;
1174
  free (body);
1175
 
1176
  return n;
1177
}
1178
 
1179
/* Adds basic block BB to LOOP.  */
1180
void
1181
add_bb_to_loop (basic_block bb, struct loop *loop)
1182
{
1183
  unsigned i;
1184
  loop_p ploop;
1185
  edge_iterator ei;
1186
  edge e;
1187
 
1188
  gcc_assert (bb->loop_father == NULL);
1189
  bb->loop_father = loop;
1190
  bb->loop_depth = loop_depth (loop);
1191
  loop->num_nodes++;
1192
  FOR_EACH_VEC_ELT (loop_p, loop->superloops, i, ploop)
1193
    ploop->num_nodes++;
1194
 
1195
  FOR_EACH_EDGE (e, ei, bb->succs)
1196
    {
1197
      rescan_loop_exit (e, true, false);
1198
    }
1199
  FOR_EACH_EDGE (e, ei, bb->preds)
1200
    {
1201
      rescan_loop_exit (e, true, false);
1202
    }
1203
}
1204
 
1205
/* Remove basic block BB from loops.  */
1206
void
1207
remove_bb_from_loops (basic_block bb)
1208
{
1209
  int i;
1210
  struct loop *loop = bb->loop_father;
1211
  loop_p ploop;
1212
  edge_iterator ei;
1213
  edge e;
1214
 
1215
  gcc_assert (loop != NULL);
1216
  loop->num_nodes--;
1217
  FOR_EACH_VEC_ELT (loop_p, loop->superloops, i, ploop)
1218
    ploop->num_nodes--;
1219
  bb->loop_father = NULL;
1220
  bb->loop_depth = 0;
1221
 
1222
  FOR_EACH_EDGE (e, ei, bb->succs)
1223
    {
1224
      rescan_loop_exit (e, false, true);
1225
    }
1226
  FOR_EACH_EDGE (e, ei, bb->preds)
1227
    {
1228
      rescan_loop_exit (e, false, true);
1229
    }
1230
}
1231
 
1232
/* Finds nearest common ancestor in loop tree for given loops.  */
1233
struct loop *
1234
find_common_loop (struct loop *loop_s, struct loop *loop_d)
1235
{
1236
  unsigned sdepth, ddepth;
1237
 
1238
  if (!loop_s) return loop_d;
1239
  if (!loop_d) return loop_s;
1240
 
1241
  sdepth = loop_depth (loop_s);
1242
  ddepth = loop_depth (loop_d);
1243
 
1244
  if (sdepth < ddepth)
1245
    loop_d = VEC_index (loop_p, loop_d->superloops, sdepth);
1246
  else if (sdepth > ddepth)
1247
    loop_s = VEC_index (loop_p, loop_s->superloops, ddepth);
1248
 
1249
  while (loop_s != loop_d)
1250
    {
1251
      loop_s = loop_outer (loop_s);
1252
      loop_d = loop_outer (loop_d);
1253
    }
1254
  return loop_s;
1255
}
1256
 
1257
/* Removes LOOP from structures and frees its data.  */
1258
 
1259
void
1260
delete_loop (struct loop *loop)
1261
{
1262
  /* Remove the loop from structure.  */
1263
  flow_loop_tree_node_remove (loop);
1264
 
1265
  /* Remove loop from loops array.  */
1266
  VEC_replace (loop_p, current_loops->larray, loop->num, NULL);
1267
 
1268
  /* Free loop data.  */
1269
  flow_loop_free (loop);
1270
}
1271
 
1272
/* Cancels the LOOP; it must be innermost one.  */
1273
 
1274
static void
1275
cancel_loop (struct loop *loop)
1276
{
1277
  basic_block *bbs;
1278
  unsigned i;
1279
  struct loop *outer = loop_outer (loop);
1280
 
1281
  gcc_assert (!loop->inner);
1282
 
1283
  /* Move blocks up one level (they should be removed as soon as possible).  */
1284
  bbs = get_loop_body (loop);
1285
  for (i = 0; i < loop->num_nodes; i++)
1286
    bbs[i]->loop_father = outer;
1287
 
1288
  free (bbs);
1289
  delete_loop (loop);
1290
}
1291
 
1292
/* Cancels LOOP and all its subloops.  */
1293
void
1294
cancel_loop_tree (struct loop *loop)
1295
{
1296
  while (loop->inner)
1297
    cancel_loop_tree (loop->inner);
1298
  cancel_loop (loop);
1299
}
1300
 
1301
/* Checks that information about loops is correct
1302
     -- sizes of loops are all right
1303
     -- results of get_loop_body really belong to the loop
1304
     -- loop header have just single entry edge and single latch edge
1305
     -- loop latches have only single successor that is header of their loop
1306
     -- irreducible loops are correctly marked
1307
  */
1308
DEBUG_FUNCTION void
1309
verify_loop_structure (void)
1310
{
1311
  unsigned *sizes, i, j;
1312
  sbitmap irreds;
1313
  basic_block *bbs, bb;
1314
  struct loop *loop;
1315
  int err = 0;
1316
  edge e;
1317
  unsigned num = number_of_loops ();
1318
  loop_iterator li;
1319
  struct loop_exit *exit, *mexit;
1320
 
1321
  /* Check sizes.  */
1322
  sizes = XCNEWVEC (unsigned, num);
1323
  sizes[0] = 2;
1324
 
1325
  FOR_EACH_BB (bb)
1326
    for (loop = bb->loop_father; loop; loop = loop_outer (loop))
1327
      sizes[loop->num]++;
1328
 
1329
  FOR_EACH_LOOP (li, loop, LI_INCLUDE_ROOT)
1330
    {
1331
      i = loop->num;
1332
 
1333
      if (loop->num_nodes != sizes[i])
1334
        {
1335
          error ("size of loop %d should be %d, not %d",
1336
                   i, sizes[i], loop->num_nodes);
1337
          err = 1;
1338
        }
1339
    }
1340
 
1341
  /* Check get_loop_body.  */
1342
  FOR_EACH_LOOP (li, loop, 0)
1343
    {
1344
      bbs = get_loop_body (loop);
1345
 
1346
      for (j = 0; j < loop->num_nodes; j++)
1347
        if (!flow_bb_inside_loop_p (loop, bbs[j]))
1348
          {
1349
            error ("bb %d do not belong to loop %d",
1350
                    bbs[j]->index, loop->num);
1351
            err = 1;
1352
          }
1353
      free (bbs);
1354
    }
1355
 
1356
  /* Check headers and latches.  */
1357
  FOR_EACH_LOOP (li, loop, 0)
1358
    {
1359
      i = loop->num;
1360
 
1361
      if (loops_state_satisfies_p (LOOPS_HAVE_PREHEADERS)
1362
          && EDGE_COUNT (loop->header->preds) != 2)
1363
        {
1364
          error ("loop %d%'s header does not have exactly 2 entries", i);
1365
          err = 1;
1366
        }
1367
      if (loops_state_satisfies_p (LOOPS_HAVE_SIMPLE_LATCHES))
1368
        {
1369
          if (!single_succ_p (loop->latch))
1370
            {
1371
              error ("loop %d%'s latch does not have exactly 1 successor", i);
1372
              err = 1;
1373
            }
1374
          if (single_succ (loop->latch) != loop->header)
1375
            {
1376
              error ("loop %d%'s latch does not have header as successor", i);
1377
              err = 1;
1378
            }
1379
          if (loop->latch->loop_father != loop)
1380
            {
1381
              error ("loop %d%'s latch does not belong directly to it", i);
1382
              err = 1;
1383
            }
1384
        }
1385
      if (loop->header->loop_father != loop)
1386
        {
1387
          error ("loop %d%'s header does not belong directly to it", i);
1388
          err = 1;
1389
        }
1390
      if (loops_state_satisfies_p (LOOPS_HAVE_MARKED_IRREDUCIBLE_REGIONS)
1391
          && (loop_latch_edge (loop)->flags & EDGE_IRREDUCIBLE_LOOP))
1392
        {
1393
          error ("loop %d%'s latch is marked as part of irreducible region", i);
1394
          err = 1;
1395
        }
1396
    }
1397
 
1398
  /* Check irreducible loops.  */
1399
  if (loops_state_satisfies_p (LOOPS_HAVE_MARKED_IRREDUCIBLE_REGIONS))
1400
    {
1401
      /* Record old info.  */
1402
      irreds = sbitmap_alloc (last_basic_block);
1403
      FOR_EACH_BB (bb)
1404
        {
1405
          edge_iterator ei;
1406
          if (bb->flags & BB_IRREDUCIBLE_LOOP)
1407
            SET_BIT (irreds, bb->index);
1408
          else
1409
            RESET_BIT (irreds, bb->index);
1410
          FOR_EACH_EDGE (e, ei, bb->succs)
1411
            if (e->flags & EDGE_IRREDUCIBLE_LOOP)
1412
              e->flags |= EDGE_ALL_FLAGS + 1;
1413
        }
1414
 
1415
      /* Recount it.  */
1416
      mark_irreducible_loops ();
1417
 
1418
      /* Compare.  */
1419
      FOR_EACH_BB (bb)
1420
        {
1421
          edge_iterator ei;
1422
 
1423
          if ((bb->flags & BB_IRREDUCIBLE_LOOP)
1424
              && !TEST_BIT (irreds, bb->index))
1425
            {
1426
              error ("basic block %d should be marked irreducible", bb->index);
1427
              err = 1;
1428
            }
1429
          else if (!(bb->flags & BB_IRREDUCIBLE_LOOP)
1430
              && TEST_BIT (irreds, bb->index))
1431
            {
1432
              error ("basic block %d should not be marked irreducible", bb->index);
1433
              err = 1;
1434
            }
1435
          FOR_EACH_EDGE (e, ei, bb->succs)
1436
            {
1437
              if ((e->flags & EDGE_IRREDUCIBLE_LOOP)
1438
                  && !(e->flags & (EDGE_ALL_FLAGS + 1)))
1439
                {
1440
                  error ("edge from %d to %d should be marked irreducible",
1441
                         e->src->index, e->dest->index);
1442
                  err = 1;
1443
                }
1444
              else if (!(e->flags & EDGE_IRREDUCIBLE_LOOP)
1445
                       && (e->flags & (EDGE_ALL_FLAGS + 1)))
1446
                {
1447
                  error ("edge from %d to %d should not be marked irreducible",
1448
                         e->src->index, e->dest->index);
1449
                  err = 1;
1450
                }
1451
              e->flags &= ~(EDGE_ALL_FLAGS + 1);
1452
            }
1453
        }
1454
      free (irreds);
1455
    }
1456
 
1457
  /* Check the recorded loop exits.  */
1458
  FOR_EACH_LOOP (li, loop, 0)
1459
    {
1460
      if (!loop->exits || loop->exits->e != NULL)
1461
        {
1462
          error ("corrupted head of the exits list of loop %d",
1463
                 loop->num);
1464
          err = 1;
1465
        }
1466
      else
1467
        {
1468
          /* Check that the list forms a cycle, and all elements except
1469
             for the head are nonnull.  */
1470
          for (mexit = loop->exits, exit = mexit->next, i = 0;
1471
               exit->e && exit != mexit;
1472
               exit = exit->next)
1473
            {
1474
              if (i++ & 1)
1475
                mexit = mexit->next;
1476
            }
1477
 
1478
          if (exit != loop->exits)
1479
            {
1480
              error ("corrupted exits list of loop %d", loop->num);
1481
              err = 1;
1482
            }
1483
        }
1484
 
1485
      if (!loops_state_satisfies_p (LOOPS_HAVE_RECORDED_EXITS))
1486
        {
1487
          if (loop->exits->next != loop->exits)
1488
            {
1489
              error ("nonempty exits list of loop %d, but exits are not recorded",
1490
                     loop->num);
1491
              err = 1;
1492
            }
1493
        }
1494
    }
1495
 
1496
  if (loops_state_satisfies_p (LOOPS_HAVE_RECORDED_EXITS))
1497
    {
1498
      unsigned n_exits = 0, eloops;
1499
 
1500
      memset (sizes, 0, sizeof (unsigned) * num);
1501
      FOR_EACH_BB (bb)
1502
        {
1503
          edge_iterator ei;
1504
          if (bb->loop_father == current_loops->tree_root)
1505
            continue;
1506
          FOR_EACH_EDGE (e, ei, bb->succs)
1507
            {
1508
              if (flow_bb_inside_loop_p (bb->loop_father, e->dest))
1509
                continue;
1510
 
1511
              n_exits++;
1512
              exit = get_exit_descriptions (e);
1513
              if (!exit)
1514
                {
1515
                  error ("exit %d->%d not recorded",
1516
                         e->src->index, e->dest->index);
1517
                  err = 1;
1518
                }
1519
              eloops = 0;
1520
              for (; exit; exit = exit->next_e)
1521
                eloops++;
1522
 
1523
              for (loop = bb->loop_father;
1524
                   loop != e->dest->loop_father;
1525
                   loop = loop_outer (loop))
1526
                {
1527
                  eloops--;
1528
                  sizes[loop->num]++;
1529
                }
1530
 
1531
              if (eloops != 0)
1532
                {
1533
                  error ("wrong list of exited loops for edge  %d->%d",
1534
                         e->src->index, e->dest->index);
1535
                  err = 1;
1536
                }
1537
            }
1538
        }
1539
 
1540
      if (n_exits != htab_elements (current_loops->exits))
1541
        {
1542
          error ("too many loop exits recorded");
1543
          err = 1;
1544
        }
1545
 
1546
      FOR_EACH_LOOP (li, loop, 0)
1547
        {
1548
          eloops = 0;
1549
          for (exit = loop->exits->next; exit->e; exit = exit->next)
1550
            eloops++;
1551
          if (eloops != sizes[loop->num])
1552
            {
1553
              error ("%d exits recorded for loop %d (having %d exits)",
1554
                     eloops, loop->num, sizes[loop->num]);
1555
              err = 1;
1556
            }
1557
        }
1558
    }
1559
 
1560
  gcc_assert (!err);
1561
 
1562
  free (sizes);
1563
}
1564
 
1565
/* Returns latch edge of LOOP.  */
1566
edge
1567
loop_latch_edge (const struct loop *loop)
1568
{
1569
  return find_edge (loop->latch, loop->header);
1570
}
1571
 
1572
/* Returns preheader edge of LOOP.  */
1573
edge
1574
loop_preheader_edge (const struct loop *loop)
1575
{
1576
  edge e;
1577
  edge_iterator ei;
1578
 
1579
  gcc_assert (loops_state_satisfies_p (LOOPS_HAVE_PREHEADERS));
1580
 
1581
  FOR_EACH_EDGE (e, ei, loop->header->preds)
1582
    if (e->src != loop->latch)
1583
      break;
1584
 
1585
  return e;
1586
}
1587
 
1588
/* Returns true if E is an exit of LOOP.  */
1589
 
1590
bool
1591
loop_exit_edge_p (const struct loop *loop, const_edge e)
1592
{
1593
  return (flow_bb_inside_loop_p (loop, e->src)
1594
          && !flow_bb_inside_loop_p (loop, e->dest));
1595
}
1596
 
1597
/* Returns the single exit edge of LOOP, or NULL if LOOP has either no exit
1598
   or more than one exit.  If loops do not have the exits recorded, NULL
1599
   is returned always.  */
1600
 
1601
edge
1602
single_exit (const struct loop *loop)
1603
{
1604
  struct loop_exit *exit = loop->exits->next;
1605
 
1606
  if (!loops_state_satisfies_p (LOOPS_HAVE_RECORDED_EXITS))
1607
    return NULL;
1608
 
1609
  if (exit->e && exit->next == loop->exits)
1610
    return exit->e;
1611
  else
1612
    return NULL;
1613
}
1614
 
1615
/* Returns true when BB has an incoming edge exiting LOOP.  */
1616
 
1617
bool
1618
loop_exits_to_bb_p (struct loop *loop, basic_block bb)
1619
{
1620
  edge e;
1621
  edge_iterator ei;
1622
 
1623
  FOR_EACH_EDGE (e, ei, bb->preds)
1624
    if (loop_exit_edge_p (loop, e))
1625
      return true;
1626
 
1627
  return false;
1628
}
1629
 
1630
/* Returns true when BB has an outgoing edge exiting LOOP.  */
1631
 
1632
bool
1633
loop_exits_from_bb_p (struct loop *loop, basic_block bb)
1634
{
1635
  edge e;
1636
  edge_iterator ei;
1637
 
1638
  FOR_EACH_EDGE (e, ei, bb->succs)
1639
    if (loop_exit_edge_p (loop, e))
1640
      return true;
1641
 
1642
  return false;
1643
}

powered by: WebSVN 2.1.0

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