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

Subversion Repositories openrisc

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

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

Line No. Rev Author Line
1 684 jeremybenn
/* Control flow graph manipulation code for GNU compiler.
2
   Copyright (C) 1987, 1988, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
3
   1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010,
4
   2011, 2012 Free Software Foundation, Inc.
5
 
6
This file is part of GCC.
7
 
8
GCC is free software; you can redistribute it and/or modify it under
9
the terms of the GNU General Public License as published by the Free
10
Software Foundation; either version 3, or (at your option) any later
11
version.
12
 
13
GCC is distributed in the hope that it will be useful, but WITHOUT ANY
14
WARRANTY; without even the implied warranty of MERCHANTABILITY or
15
FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
16
for more details.
17
 
18
You should have received a copy of the GNU General Public License
19
along with GCC; see the file COPYING3.  If not see
20
<http://www.gnu.org/licenses/>.  */
21
 
22
/* This file contains low level functions to manipulate the CFG and analyze it
23
   that are aware of the RTL intermediate language.
24
 
25
   Available functionality:
26
     - Basic CFG/RTL manipulation API documented in cfghooks.h
27
     - CFG-aware instruction chain manipulation
28
         delete_insn, delete_insn_chain
29
     - Edge splitting and committing to edges
30
         insert_insn_on_edge, commit_edge_insertions
31
     - CFG updating after insn simplification
32
         purge_dead_edges, purge_all_dead_edges
33
     - CFG fixing after coarse manipulation
34
        fixup_abnormal_edges
35
 
36
   Functions not supposed for generic use:
37
     - Infrastructure to determine quickly basic block for insn
38
         compute_bb_for_insn, update_bb_for_insn, set_block_for_insn,
39
     - Edge redirection with updating and optimizing of insn chain
40
         block_label, tidy_fallthru_edge, force_nonfallthru  */
41
 
42
#include "config.h"
43
#include "system.h"
44
#include "coretypes.h"
45
#include "tm.h"
46
#include "tree.h"
47
#include "hard-reg-set.h"
48
#include "basic-block.h"
49
#include "regs.h"
50
#include "flags.h"
51
#include "output.h"
52
#include "function.h"
53
#include "except.h"
54
#include "rtl-error.h"
55
#include "tm_p.h"
56
#include "obstack.h"
57
#include "insn-attr.h"
58
#include "insn-config.h"
59
#include "cfglayout.h"
60
#include "expr.h"
61
#include "target.h"
62
#include "common/common-target.h"
63
#include "cfgloop.h"
64
#include "ggc.h"
65
#include "tree-pass.h"
66
#include "df.h"
67
 
68
static int can_delete_note_p (const_rtx);
69
static int can_delete_label_p (const_rtx);
70
static basic_block rtl_split_edge (edge);
71
static bool rtl_move_block_after (basic_block, basic_block);
72
static int rtl_verify_flow_info (void);
73
static basic_block cfg_layout_split_block (basic_block, void *);
74
static edge cfg_layout_redirect_edge_and_branch (edge, basic_block);
75
static basic_block cfg_layout_redirect_edge_and_branch_force (edge, basic_block);
76
static void cfg_layout_delete_block (basic_block);
77
static void rtl_delete_block (basic_block);
78
static basic_block rtl_redirect_edge_and_branch_force (edge, basic_block);
79
static edge rtl_redirect_edge_and_branch (edge, basic_block);
80
static basic_block rtl_split_block (basic_block, void *);
81
static void rtl_dump_bb (basic_block, FILE *, int, int);
82
static int rtl_verify_flow_info_1 (void);
83
static void rtl_make_forwarder_block (edge);
84
 
85
/* Return true if NOTE is not one of the ones that must be kept paired,
86
   so that we may simply delete it.  */
87
 
88
static int
89
can_delete_note_p (const_rtx note)
90
{
91
  switch (NOTE_KIND (note))
92
    {
93
    case NOTE_INSN_DELETED:
94
    case NOTE_INSN_BASIC_BLOCK:
95
    case NOTE_INSN_EPILOGUE_BEG:
96
      return true;
97
 
98
    default:
99
      return false;
100
    }
101
}
102
 
103
/* True if a given label can be deleted.  */
104
 
105
static int
106
can_delete_label_p (const_rtx label)
107
{
108
  return (!LABEL_PRESERVE_P (label)
109
          /* User declared labels must be preserved.  */
110
          && LABEL_NAME (label) == 0
111
          && !in_expr_list_p (forced_labels, label));
112
}
113
 
114
/* Delete INSN by patching it out.  Return the next insn.  */
115
 
116
rtx
117
delete_insn (rtx insn)
118
{
119
  rtx next = NEXT_INSN (insn);
120
  rtx note;
121
  bool really_delete = true;
122
 
123
  if (LABEL_P (insn))
124
    {
125
      /* Some labels can't be directly removed from the INSN chain, as they
126
         might be references via variables, constant pool etc.
127
         Convert them to the special NOTE_INSN_DELETED_LABEL note.  */
128
      if (! can_delete_label_p (insn))
129
        {
130
          const char *name = LABEL_NAME (insn);
131
 
132
          really_delete = false;
133
          PUT_CODE (insn, NOTE);
134
          NOTE_KIND (insn) = NOTE_INSN_DELETED_LABEL;
135
          NOTE_DELETED_LABEL_NAME (insn) = name;
136
        }
137
 
138
      remove_node_from_expr_list (insn, &nonlocal_goto_handler_labels);
139
    }
140
 
141
  if (really_delete)
142
    {
143
      /* If this insn has already been deleted, something is very wrong.  */
144
      gcc_assert (!INSN_DELETED_P (insn));
145
      remove_insn (insn);
146
      INSN_DELETED_P (insn) = 1;
147
    }
148
 
149
  /* If deleting a jump, decrement the use count of the label.  Deleting
150
     the label itself should happen in the normal course of block merging.  */
151
  if (JUMP_P (insn))
152
    {
153
      if (JUMP_LABEL (insn)
154
          && LABEL_P (JUMP_LABEL (insn)))
155
        LABEL_NUSES (JUMP_LABEL (insn))--;
156
 
157
      /* If there are more targets, remove them too.  */
158
      while ((note
159
              = find_reg_note (insn, REG_LABEL_TARGET, NULL_RTX)) != NULL_RTX
160
             && LABEL_P (XEXP (note, 0)))
161
        {
162
          LABEL_NUSES (XEXP (note, 0))--;
163
          remove_note (insn, note);
164
        }
165
    }
166
 
167
  /* Also if deleting any insn that references a label as an operand.  */
168
  while ((note = find_reg_note (insn, REG_LABEL_OPERAND, NULL_RTX)) != NULL_RTX
169
         && LABEL_P (XEXP (note, 0)))
170
    {
171
      LABEL_NUSES (XEXP (note, 0))--;
172
      remove_note (insn, note);
173
    }
174
 
175
  if (JUMP_TABLE_DATA_P (insn))
176
    {
177
      rtx pat = PATTERN (insn);
178
      int diff_vec_p = GET_CODE (PATTERN (insn)) == ADDR_DIFF_VEC;
179
      int len = XVECLEN (pat, diff_vec_p);
180
      int i;
181
 
182
      for (i = 0; i < len; i++)
183
        {
184
          rtx label = XEXP (XVECEXP (pat, diff_vec_p, i), 0);
185
 
186
          /* When deleting code in bulk (e.g. removing many unreachable
187
             blocks) we can delete a label that's a target of the vector
188
             before deleting the vector itself.  */
189
          if (!NOTE_P (label))
190
            LABEL_NUSES (label)--;
191
        }
192
    }
193
 
194
  return next;
195
}
196
 
197
/* Like delete_insn but also purge dead edges from BB.  */
198
 
199
rtx
200
delete_insn_and_edges (rtx insn)
201
{
202
  rtx x;
203
  bool purge = false;
204
 
205
  if (INSN_P (insn)
206
      && BLOCK_FOR_INSN (insn)
207
      && BB_END (BLOCK_FOR_INSN (insn)) == insn)
208
    purge = true;
209
  x = delete_insn (insn);
210
  if (purge)
211
    purge_dead_edges (BLOCK_FOR_INSN (insn));
212
  return x;
213
}
214
 
215
/* Unlink a chain of insns between START and FINISH, leaving notes
216
   that must be paired.  If CLEAR_BB is true, we set bb field for
217
   insns that cannot be removed to NULL.  */
218
 
219
void
220
delete_insn_chain (rtx start, rtx finish, bool clear_bb)
221
{
222
  rtx next;
223
 
224
  /* Unchain the insns one by one.  It would be quicker to delete all of these
225
     with a single unchaining, rather than one at a time, but we need to keep
226
     the NOTE's.  */
227
  while (1)
228
    {
229
      next = NEXT_INSN (start);
230
      if (NOTE_P (start) && !can_delete_note_p (start))
231
        ;
232
      else
233
        next = delete_insn (start);
234
 
235
      if (clear_bb && !INSN_DELETED_P (start))
236
        set_block_for_insn (start, NULL);
237
 
238
      if (start == finish)
239
        break;
240
      start = next;
241
    }
242
}
243
 
244
/* Create a new basic block consisting of the instructions between HEAD and END
245
   inclusive.  This function is designed to allow fast BB construction - reuses
246
   the note and basic block struct in BB_NOTE, if any and do not grow
247
   BASIC_BLOCK chain and should be used directly only by CFG construction code.
248
   END can be NULL in to create new empty basic block before HEAD.  Both END
249
   and HEAD can be NULL to create basic block at the end of INSN chain.
250
   AFTER is the basic block we should be put after.  */
251
 
252
basic_block
253
create_basic_block_structure (rtx head, rtx end, rtx bb_note, basic_block after)
254
{
255
  basic_block bb;
256
 
257
  if (bb_note
258
      && (bb = NOTE_BASIC_BLOCK (bb_note)) != NULL
259
      && bb->aux == NULL)
260
    {
261
      /* If we found an existing note, thread it back onto the chain.  */
262
 
263
      rtx after;
264
 
265
      if (LABEL_P (head))
266
        after = head;
267
      else
268
        {
269
          after = PREV_INSN (head);
270
          head = bb_note;
271
        }
272
 
273
      if (after != bb_note && NEXT_INSN (after) != bb_note)
274
        reorder_insns_nobb (bb_note, bb_note, after);
275
    }
276
  else
277
    {
278
      /* Otherwise we must create a note and a basic block structure.  */
279
 
280
      bb = alloc_block ();
281
 
282
      init_rtl_bb_info (bb);
283
      if (!head && !end)
284
        head = end = bb_note
285
          = emit_note_after (NOTE_INSN_BASIC_BLOCK, get_last_insn ());
286
      else if (LABEL_P (head) && end)
287
        {
288
          bb_note = emit_note_after (NOTE_INSN_BASIC_BLOCK, head);
289
          if (head == end)
290
            end = bb_note;
291
        }
292
      else
293
        {
294
          bb_note = emit_note_before (NOTE_INSN_BASIC_BLOCK, head);
295
          head = bb_note;
296
          if (!end)
297
            end = head;
298
        }
299
 
300
      NOTE_BASIC_BLOCK (bb_note) = bb;
301
    }
302
 
303
  /* Always include the bb note in the block.  */
304
  if (NEXT_INSN (end) == bb_note)
305
    end = bb_note;
306
 
307
  BB_HEAD (bb) = head;
308
  BB_END (bb) = end;
309
  bb->index = last_basic_block++;
310
  bb->flags = BB_NEW | BB_RTL;
311
  link_block (bb, after);
312
  SET_BASIC_BLOCK (bb->index, bb);
313
  df_bb_refs_record (bb->index, false);
314
  update_bb_for_insn (bb);
315
  BB_SET_PARTITION (bb, BB_UNPARTITIONED);
316
 
317
  /* Tag the block so that we know it has been used when considering
318
     other basic block notes.  */
319
  bb->aux = bb;
320
 
321
  return bb;
322
}
323
 
324
/* Create new basic block consisting of instructions in between HEAD and END
325
   and place it to the BB chain after block AFTER.  END can be NULL to
326
   create a new empty basic block before HEAD.  Both END and HEAD can be
327
   NULL to create basic block at the end of INSN chain.  */
328
 
329
static basic_block
330
rtl_create_basic_block (void *headp, void *endp, basic_block after)
331
{
332
  rtx head = (rtx) headp, end = (rtx) endp;
333
  basic_block bb;
334
 
335
  /* Grow the basic block array if needed.  */
336
  if ((size_t) last_basic_block >= VEC_length (basic_block, basic_block_info))
337
    {
338
      size_t new_size = last_basic_block + (last_basic_block + 3) / 4;
339
      VEC_safe_grow_cleared (basic_block, gc, basic_block_info, new_size);
340
    }
341
 
342
  n_basic_blocks++;
343
 
344
  bb = create_basic_block_structure (head, end, NULL, after);
345
  bb->aux = NULL;
346
  return bb;
347
}
348
 
349
static basic_block
350
cfg_layout_create_basic_block (void *head, void *end, basic_block after)
351
{
352
  basic_block newbb = rtl_create_basic_block (head, end, after);
353
 
354
  return newbb;
355
}
356
 
357
/* Delete the insns in a (non-live) block.  We physically delete every
358
   non-deleted-note insn, and update the flow graph appropriately.
359
 
360
   Return nonzero if we deleted an exception handler.  */
361
 
362
/* ??? Preserving all such notes strikes me as wrong.  It would be nice
363
   to post-process the stream to remove empty blocks, loops, ranges, etc.  */
364
 
365
static void
366
rtl_delete_block (basic_block b)
367
{
368
  rtx insn, end;
369
 
370
  /* If the head of this block is a CODE_LABEL, then it might be the
371
     label for an exception handler which can't be reached.  We need
372
     to remove the label from the exception_handler_label list.  */
373
  insn = BB_HEAD (b);
374
 
375
  end = get_last_bb_insn (b);
376
 
377
  /* Selectively delete the entire chain.  */
378
  BB_HEAD (b) = NULL;
379
  delete_insn_chain (insn, end, true);
380
 
381
 
382
  if (dump_file)
383
    fprintf (dump_file, "deleting block %d\n", b->index);
384
  df_bb_delete (b->index);
385
}
386
 
387
/* Records the basic block struct in BLOCK_FOR_INSN for every insn.  */
388
 
389
void
390
compute_bb_for_insn (void)
391
{
392
  basic_block bb;
393
 
394
  FOR_EACH_BB (bb)
395
    {
396
      rtx end = BB_END (bb);
397
      rtx insn;
398
 
399
      for (insn = BB_HEAD (bb); ; insn = NEXT_INSN (insn))
400
        {
401
          BLOCK_FOR_INSN (insn) = bb;
402
          if (insn == end)
403
            break;
404
        }
405
    }
406
}
407
 
408
/* Release the basic_block_for_insn array.  */
409
 
410
unsigned int
411
free_bb_for_insn (void)
412
{
413
  rtx insn;
414
  for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
415
    if (!BARRIER_P (insn))
416
      BLOCK_FOR_INSN (insn) = NULL;
417
  return 0;
418
}
419
 
420
static unsigned int
421
rest_of_pass_free_cfg (void)
422
{
423
#ifdef DELAY_SLOTS
424
  /* The resource.c machinery uses DF but the CFG isn't guaranteed to be
425
     valid at that point so it would be too late to call df_analyze.  */
426
  if (optimize > 0 && flag_delayed_branch)
427
    {
428
      df_note_add_problem ();
429
      df_analyze ();
430
    }
431
#endif
432
 
433
  free_bb_for_insn ();
434
  return 0;
435
}
436
 
437
struct rtl_opt_pass pass_free_cfg =
438
{
439
 {
440
  RTL_PASS,
441
  "*free_cfg",                          /* name */
442
  NULL,                                 /* gate */
443
  rest_of_pass_free_cfg,                /* execute */
444
  NULL,                                 /* sub */
445
  NULL,                                 /* next */
446
  0,                                    /* static_pass_number */
447
  TV_NONE,                              /* tv_id */
448
  0,                                    /* properties_required */
449
  0,                                    /* properties_provided */
450
  PROP_cfg,                             /* properties_destroyed */
451
  0,                                    /* todo_flags_start */
452
  0,                                    /* todo_flags_finish */
453
 }
454
};
455
 
456
/* Return RTX to emit after when we want to emit code on the entry of function.  */
457
rtx
458
entry_of_function (void)
459
{
460
  return (n_basic_blocks > NUM_FIXED_BLOCKS ?
461
          BB_HEAD (ENTRY_BLOCK_PTR->next_bb) : get_insns ());
462
}
463
 
464
/* Emit INSN at the entry point of the function, ensuring that it is only
465
   executed once per function.  */
466
void
467
emit_insn_at_entry (rtx insn)
468
{
469
  edge_iterator ei = ei_start (ENTRY_BLOCK_PTR->succs);
470
  edge e = ei_safe_edge (ei);
471
  gcc_assert (e->flags & EDGE_FALLTHRU);
472
 
473
  insert_insn_on_edge (insn, e);
474
  commit_edge_insertions ();
475
}
476
 
477
/* Update BLOCK_FOR_INSN of insns between BEGIN and END
478
   (or BARRIER if found) and notify df of the bb change.
479
   The insn chain range is inclusive
480
   (i.e. both BEGIN and END will be updated. */
481
 
482
static void
483
update_bb_for_insn_chain (rtx begin, rtx end, basic_block bb)
484
{
485
  rtx insn;
486
 
487
  end = NEXT_INSN (end);
488
  for (insn = begin; insn != end; insn = NEXT_INSN (insn))
489
    if (!BARRIER_P (insn))
490
      df_insn_change_bb (insn, bb);
491
}
492
 
493
/* Update BLOCK_FOR_INSN of insns in BB to BB,
494
   and notify df of the change.  */
495
 
496
void
497
update_bb_for_insn (basic_block bb)
498
{
499
  update_bb_for_insn_chain (BB_HEAD (bb), BB_END (bb), bb);
500
}
501
 
502
 
503
/* Return the NOTE_INSN_BASIC_BLOCK of BB.  */
504
rtx
505
bb_note (basic_block bb)
506
{
507
  rtx note;
508
 
509
  note = BB_HEAD (bb);
510
  if (LABEL_P (note))
511
    note = NEXT_INSN (note);
512
 
513
  gcc_assert (NOTE_INSN_BASIC_BLOCK_P (note));
514
  return note;
515
}
516
 
517
/* Return the INSN immediately following the NOTE_INSN_BASIC_BLOCK
518
   note associated with the BLOCK.  */
519
 
520
static rtx
521
first_insn_after_basic_block_note (basic_block block)
522
{
523
  rtx insn;
524
 
525
  /* Get the first instruction in the block.  */
526
  insn = BB_HEAD (block);
527
 
528
  if (insn == NULL_RTX)
529
    return NULL_RTX;
530
  if (LABEL_P (insn))
531
    insn = NEXT_INSN (insn);
532
  gcc_assert (NOTE_INSN_BASIC_BLOCK_P (insn));
533
 
534
  return NEXT_INSN (insn);
535
}
536
 
537
/* Creates a new basic block just after basic block B by splitting
538
   everything after specified instruction I.  */
539
 
540
static basic_block
541
rtl_split_block (basic_block bb, void *insnp)
542
{
543
  basic_block new_bb;
544
  rtx insn = (rtx) insnp;
545
  edge e;
546
  edge_iterator ei;
547
 
548
  if (!insn)
549
    {
550
      insn = first_insn_after_basic_block_note (bb);
551
 
552
      if (insn)
553
        {
554
          rtx next = insn;
555
 
556
          insn = PREV_INSN (insn);
557
 
558
          /* If the block contains only debug insns, insn would have
559
             been NULL in a non-debug compilation, and then we'd end
560
             up emitting a DELETED note.  For -fcompare-debug
561
             stability, emit the note too.  */
562
          if (insn != BB_END (bb)
563
              && DEBUG_INSN_P (next)
564
              && DEBUG_INSN_P (BB_END (bb)))
565
            {
566
              while (next != BB_END (bb) && DEBUG_INSN_P (next))
567
                next = NEXT_INSN (next);
568
 
569
              if (next == BB_END (bb))
570
                emit_note_after (NOTE_INSN_DELETED, next);
571
            }
572
        }
573
      else
574
        insn = get_last_insn ();
575
    }
576
 
577
  /* We probably should check type of the insn so that we do not create
578
     inconsistent cfg.  It is checked in verify_flow_info anyway, so do not
579
     bother.  */
580
  if (insn == BB_END (bb))
581
    emit_note_after (NOTE_INSN_DELETED, insn);
582
 
583
  /* Create the new basic block.  */
584
  new_bb = create_basic_block (NEXT_INSN (insn), BB_END (bb), bb);
585
  BB_COPY_PARTITION (new_bb, bb);
586
  BB_END (bb) = insn;
587
 
588
  /* Redirect the outgoing edges.  */
589
  new_bb->succs = bb->succs;
590
  bb->succs = NULL;
591
  FOR_EACH_EDGE (e, ei, new_bb->succs)
592
    e->src = new_bb;
593
 
594
  /* The new block starts off being dirty.  */
595
  df_set_bb_dirty (bb);
596
  return new_bb;
597
}
598
 
599
/* Blocks A and B are to be merged into a single block A.  The insns
600
   are already contiguous.  */
601
 
602
static void
603
rtl_merge_blocks (basic_block a, basic_block b)
604
{
605
  rtx b_head = BB_HEAD (b), b_end = BB_END (b), a_end = BB_END (a);
606
  rtx del_first = NULL_RTX, del_last = NULL_RTX;
607
  rtx b_debug_start = b_end, b_debug_end = b_end;
608
  bool forwarder_p = (b->flags & BB_FORWARDER_BLOCK) != 0;
609
  int b_empty = 0;
610
 
611
  if (dump_file)
612
    fprintf (dump_file, "Merging block %d into block %d...\n", b->index,
613
             a->index);
614
 
615
  while (DEBUG_INSN_P (b_end))
616
    b_end = PREV_INSN (b_debug_start = b_end);
617
 
618
  /* If there was a CODE_LABEL beginning B, delete it.  */
619
  if (LABEL_P (b_head))
620
    {
621
      /* Detect basic blocks with nothing but a label.  This can happen
622
         in particular at the end of a function.  */
623
      if (b_head == b_end)
624
        b_empty = 1;
625
 
626
      del_first = del_last = b_head;
627
      b_head = NEXT_INSN (b_head);
628
    }
629
 
630
  /* Delete the basic block note and handle blocks containing just that
631
     note.  */
632
  if (NOTE_INSN_BASIC_BLOCK_P (b_head))
633
    {
634
      if (b_head == b_end)
635
        b_empty = 1;
636
      if (! del_last)
637
        del_first = b_head;
638
 
639
      del_last = b_head;
640
      b_head = NEXT_INSN (b_head);
641
    }
642
 
643
  /* If there was a jump out of A, delete it.  */
644
  if (JUMP_P (a_end))
645
    {
646
      rtx prev;
647
 
648
      for (prev = PREV_INSN (a_end); ; prev = PREV_INSN (prev))
649
        if (!NOTE_P (prev)
650
            || NOTE_INSN_BASIC_BLOCK_P (prev)
651
            || prev == BB_HEAD (a))
652
          break;
653
 
654
      del_first = a_end;
655
 
656
#ifdef HAVE_cc0
657
      /* If this was a conditional jump, we need to also delete
658
         the insn that set cc0.  */
659
      if (only_sets_cc0_p (prev))
660
        {
661
          rtx tmp = prev;
662
 
663
          prev = prev_nonnote_insn (prev);
664
          if (!prev)
665
            prev = BB_HEAD (a);
666
          del_first = tmp;
667
        }
668
#endif
669
 
670
      a_end = PREV_INSN (del_first);
671
    }
672
  else if (BARRIER_P (NEXT_INSN (a_end)))
673
    del_first = NEXT_INSN (a_end);
674
 
675
  /* Delete everything marked above as well as crap that might be
676
     hanging out between the two blocks.  */
677
  BB_HEAD (b) = NULL;
678
  delete_insn_chain (del_first, del_last, true);
679
 
680
  /* Reassociate the insns of B with A.  */
681
  if (!b_empty)
682
    {
683
      update_bb_for_insn_chain (a_end, b_debug_end, a);
684
 
685
      a_end = b_debug_end;
686
    }
687
  else if (b_end != b_debug_end)
688
    {
689
      /* Move any deleted labels and other notes between the end of A
690
         and the debug insns that make up B after the debug insns,
691
         bringing the debug insns into A while keeping the notes after
692
         the end of A.  */
693
      if (NEXT_INSN (a_end) != b_debug_start)
694
        reorder_insns_nobb (NEXT_INSN (a_end), PREV_INSN (b_debug_start),
695
                            b_debug_end);
696
      update_bb_for_insn_chain (b_debug_start, b_debug_end, a);
697
      a_end = b_debug_end;
698
    }
699
 
700
  df_bb_delete (b->index);
701
  BB_END (a) = a_end;
702
 
703
  /* If B was a forwarder block, propagate the locus on the edge.  */
704
  if (forwarder_p && !EDGE_SUCC (b, 0)->goto_locus)
705
    EDGE_SUCC (b, 0)->goto_locus = EDGE_SUCC (a, 0)->goto_locus;
706
 
707
  if (dump_file)
708
    fprintf (dump_file, "Merged blocks %d and %d.\n", a->index, b->index);
709
}
710
 
711
 
712
/* Return true when block A and B can be merged.  */
713
 
714
static bool
715
rtl_can_merge_blocks (basic_block a, basic_block b)
716
{
717
  /* If we are partitioning hot/cold basic blocks, we don't want to
718
     mess up unconditional or indirect jumps that cross between hot
719
     and cold sections.
720
 
721
     Basic block partitioning may result in some jumps that appear to
722
     be optimizable (or blocks that appear to be mergeable), but which really
723
     must be left untouched (they are required to make it safely across
724
     partition boundaries).  See  the comments at the top of
725
     bb-reorder.c:partition_hot_cold_basic_blocks for complete details.  */
726
 
727
  if (BB_PARTITION (a) != BB_PARTITION (b))
728
    return false;
729
 
730
  /* There must be exactly one edge in between the blocks.  */
731
  return (single_succ_p (a)
732
          && single_succ (a) == b
733
          && single_pred_p (b)
734
          && a != b
735
          /* Must be simple edge.  */
736
          && !(single_succ_edge (a)->flags & EDGE_COMPLEX)
737
          && a->next_bb == b
738
          && a != ENTRY_BLOCK_PTR && b != EXIT_BLOCK_PTR
739
          /* If the jump insn has side effects,
740
             we can't kill the edge.  */
741
          && (!JUMP_P (BB_END (a))
742
              || (reload_completed
743
                  ? simplejump_p (BB_END (a)) : onlyjump_p (BB_END (a)))));
744
}
745
 
746
/* Return the label in the head of basic block BLOCK.  Create one if it doesn't
747
   exist.  */
748
 
749
rtx
750
block_label (basic_block block)
751
{
752
  if (block == EXIT_BLOCK_PTR)
753
    return NULL_RTX;
754
 
755
  if (!LABEL_P (BB_HEAD (block)))
756
    {
757
      BB_HEAD (block) = emit_label_before (gen_label_rtx (), BB_HEAD (block));
758
    }
759
 
760
  return BB_HEAD (block);
761
}
762
 
763
/* Attempt to perform edge redirection by replacing possibly complex jump
764
   instruction by unconditional jump or removing jump completely.  This can
765
   apply only if all edges now point to the same block.  The parameters and
766
   return values are equivalent to redirect_edge_and_branch.  */
767
 
768
edge
769
try_redirect_by_replacing_jump (edge e, basic_block target, bool in_cfglayout)
770
{
771
  basic_block src = e->src;
772
  rtx insn = BB_END (src), kill_from;
773
  rtx set;
774
  int fallthru = 0;
775
 
776
  /* If we are partitioning hot/cold basic blocks, we don't want to
777
     mess up unconditional or indirect jumps that cross between hot
778
     and cold sections.
779
 
780
     Basic block partitioning may result in some jumps that appear to
781
     be optimizable (or blocks that appear to be mergeable), but which really
782
     must be left untouched (they are required to make it safely across
783
     partition boundaries).  See  the comments at the top of
784
     bb-reorder.c:partition_hot_cold_basic_blocks for complete details.  */
785
 
786
  if (find_reg_note (insn, REG_CROSSING_JUMP, NULL_RTX)
787
      || BB_PARTITION (src) != BB_PARTITION (target))
788
    return NULL;
789
 
790
  /* We can replace or remove a complex jump only when we have exactly
791
     two edges.  Also, if we have exactly one outgoing edge, we can
792
     redirect that.  */
793
  if (EDGE_COUNT (src->succs) >= 3
794
      /* Verify that all targets will be TARGET.  Specifically, the
795
         edge that is not E must also go to TARGET.  */
796
      || (EDGE_COUNT (src->succs) == 2
797
          && EDGE_SUCC (src, EDGE_SUCC (src, 0) == e)->dest != target))
798
    return NULL;
799
 
800
  if (!onlyjump_p (insn))
801
    return NULL;
802
  if ((!optimize || reload_completed) && tablejump_p (insn, NULL, NULL))
803
    return NULL;
804
 
805
  /* Avoid removing branch with side effects.  */
806
  set = single_set (insn);
807
  if (!set || side_effects_p (set))
808
    return NULL;
809
 
810
  /* In case we zap a conditional jump, we'll need to kill
811
     the cc0 setter too.  */
812
  kill_from = insn;
813
#ifdef HAVE_cc0
814
  if (reg_mentioned_p (cc0_rtx, PATTERN (insn))
815
      && only_sets_cc0_p (PREV_INSN (insn)))
816
    kill_from = PREV_INSN (insn);
817
#endif
818
 
819
  /* See if we can create the fallthru edge.  */
820
  if (in_cfglayout || can_fallthru (src, target))
821
    {
822
      if (dump_file)
823
        fprintf (dump_file, "Removing jump %i.\n", INSN_UID (insn));
824
      fallthru = 1;
825
 
826
      /* Selectively unlink whole insn chain.  */
827
      if (in_cfglayout)
828
        {
829
          rtx insn = src->il.rtl->footer;
830
 
831
          delete_insn_chain (kill_from, BB_END (src), false);
832
 
833
          /* Remove barriers but keep jumptables.  */
834
          while (insn)
835
            {
836
              if (BARRIER_P (insn))
837
                {
838
                  if (PREV_INSN (insn))
839
                    NEXT_INSN (PREV_INSN (insn)) = NEXT_INSN (insn);
840
                  else
841
                    src->il.rtl->footer = NEXT_INSN (insn);
842
                  if (NEXT_INSN (insn))
843
                    PREV_INSN (NEXT_INSN (insn)) = PREV_INSN (insn);
844
                }
845
              if (LABEL_P (insn))
846
                break;
847
              insn = NEXT_INSN (insn);
848
            }
849
        }
850
      else
851
        delete_insn_chain (kill_from, PREV_INSN (BB_HEAD (target)),
852
                           false);
853
    }
854
 
855
  /* If this already is simplejump, redirect it.  */
856
  else if (simplejump_p (insn))
857
    {
858
      if (e->dest == target)
859
        return NULL;
860
      if (dump_file)
861
        fprintf (dump_file, "Redirecting jump %i from %i to %i.\n",
862
                 INSN_UID (insn), e->dest->index, target->index);
863
      if (!redirect_jump (insn, block_label (target), 0))
864
        {
865
          gcc_assert (target == EXIT_BLOCK_PTR);
866
          return NULL;
867
        }
868
    }
869
 
870
  /* Cannot do anything for target exit block.  */
871
  else if (target == EXIT_BLOCK_PTR)
872
    return NULL;
873
 
874
  /* Or replace possibly complicated jump insn by simple jump insn.  */
875
  else
876
    {
877
      rtx target_label = block_label (target);
878
      rtx barrier, label, table;
879
 
880
      emit_jump_insn_after_noloc (gen_jump (target_label), insn);
881
      JUMP_LABEL (BB_END (src)) = target_label;
882
      LABEL_NUSES (target_label)++;
883
      if (dump_file)
884
        fprintf (dump_file, "Replacing insn %i by jump %i\n",
885
                 INSN_UID (insn), INSN_UID (BB_END (src)));
886
 
887
 
888
      delete_insn_chain (kill_from, insn, false);
889
 
890
      /* Recognize a tablejump that we are converting to a
891
         simple jump and remove its associated CODE_LABEL
892
         and ADDR_VEC or ADDR_DIFF_VEC.  */
893
      if (tablejump_p (insn, &label, &table))
894
        delete_insn_chain (label, table, false);
895
 
896
      barrier = next_nonnote_insn (BB_END (src));
897
      if (!barrier || !BARRIER_P (barrier))
898
        emit_barrier_after (BB_END (src));
899
      else
900
        {
901
          if (barrier != NEXT_INSN (BB_END (src)))
902
            {
903
              /* Move the jump before barrier so that the notes
904
                 which originally were or were created before jump table are
905
                 inside the basic block.  */
906
              rtx new_insn = BB_END (src);
907
 
908
              update_bb_for_insn_chain (NEXT_INSN (BB_END (src)),
909
                                        PREV_INSN (barrier), src);
910
 
911
              NEXT_INSN (PREV_INSN (new_insn)) = NEXT_INSN (new_insn);
912
              PREV_INSN (NEXT_INSN (new_insn)) = PREV_INSN (new_insn);
913
 
914
              NEXT_INSN (new_insn) = barrier;
915
              NEXT_INSN (PREV_INSN (barrier)) = new_insn;
916
 
917
              PREV_INSN (new_insn) = PREV_INSN (barrier);
918
              PREV_INSN (barrier) = new_insn;
919
            }
920
        }
921
    }
922
 
923
  /* Keep only one edge out and set proper flags.  */
924
  if (!single_succ_p (src))
925
    remove_edge (e);
926
  gcc_assert (single_succ_p (src));
927
 
928
  e = single_succ_edge (src);
929
  if (fallthru)
930
    e->flags = EDGE_FALLTHRU;
931
  else
932
    e->flags = 0;
933
 
934
  e->probability = REG_BR_PROB_BASE;
935
  e->count = src->count;
936
 
937
  if (e->dest != target)
938
    redirect_edge_succ (e, target);
939
  return e;
940
}
941
 
942
/* Subroutine of redirect_branch_edge that tries to patch the jump
943
   instruction INSN so that it reaches block NEW.  Do this
944
   only when it originally reached block OLD.  Return true if this
945
   worked or the original target wasn't OLD, return false if redirection
946
   doesn't work.  */
947
 
948
static bool
949
patch_jump_insn (rtx insn, rtx old_label, basic_block new_bb)
950
{
951
  rtx tmp;
952
  /* Recognize a tablejump and adjust all matching cases.  */
953
  if (tablejump_p (insn, NULL, &tmp))
954
    {
955
      rtvec vec;
956
      int j;
957
      rtx new_label = block_label (new_bb);
958
 
959
      if (new_bb == EXIT_BLOCK_PTR)
960
        return false;
961
      if (GET_CODE (PATTERN (tmp)) == ADDR_VEC)
962
        vec = XVEC (PATTERN (tmp), 0);
963
      else
964
        vec = XVEC (PATTERN (tmp), 1);
965
 
966
      for (j = GET_NUM_ELEM (vec) - 1; j >= 0; --j)
967
        if (XEXP (RTVEC_ELT (vec, j), 0) == old_label)
968
          {
969
            RTVEC_ELT (vec, j) = gen_rtx_LABEL_REF (Pmode, new_label);
970
            --LABEL_NUSES (old_label);
971
            ++LABEL_NUSES (new_label);
972
          }
973
 
974
      /* Handle casesi dispatch insns.  */
975
      if ((tmp = single_set (insn)) != NULL
976
          && SET_DEST (tmp) == pc_rtx
977
          && GET_CODE (SET_SRC (tmp)) == IF_THEN_ELSE
978
          && GET_CODE (XEXP (SET_SRC (tmp), 2)) == LABEL_REF
979
          && XEXP (XEXP (SET_SRC (tmp), 2), 0) == old_label)
980
        {
981
          XEXP (SET_SRC (tmp), 2) = gen_rtx_LABEL_REF (Pmode,
982
                                                       new_label);
983
          --LABEL_NUSES (old_label);
984
          ++LABEL_NUSES (new_label);
985
        }
986
    }
987
  else if ((tmp = extract_asm_operands (PATTERN (insn))) != NULL)
988
    {
989
      int i, n = ASM_OPERANDS_LABEL_LENGTH (tmp);
990
      rtx new_label, note;
991
 
992
      if (new_bb == EXIT_BLOCK_PTR)
993
        return false;
994
      new_label = block_label (new_bb);
995
 
996
      for (i = 0; i < n; ++i)
997
        {
998
          rtx old_ref = ASM_OPERANDS_LABEL (tmp, i);
999
          gcc_assert (GET_CODE (old_ref) == LABEL_REF);
1000
          if (XEXP (old_ref, 0) == old_label)
1001
            {
1002
              ASM_OPERANDS_LABEL (tmp, i)
1003
                = gen_rtx_LABEL_REF (Pmode, new_label);
1004
              --LABEL_NUSES (old_label);
1005
              ++LABEL_NUSES (new_label);
1006
            }
1007
        }
1008
 
1009
      if (JUMP_LABEL (insn) == old_label)
1010
        {
1011
          JUMP_LABEL (insn) = new_label;
1012
          note = find_reg_note (insn, REG_LABEL_TARGET, new_label);
1013
          if (note)
1014
            remove_note (insn, note);
1015
        }
1016
      else
1017
        {
1018
          note = find_reg_note (insn, REG_LABEL_TARGET, old_label);
1019
          if (note)
1020
            remove_note (insn, note);
1021
          if (JUMP_LABEL (insn) != new_label
1022
              && !find_reg_note (insn, REG_LABEL_TARGET, new_label))
1023
            add_reg_note (insn, REG_LABEL_TARGET, new_label);
1024
        }
1025
      while ((note = find_reg_note (insn, REG_LABEL_OPERAND, old_label))
1026
             != NULL_RTX)
1027
        XEXP (note, 0) = new_label;
1028
    }
1029
  else
1030
    {
1031
      /* ?? We may play the games with moving the named labels from
1032
         one basic block to the other in case only one computed_jump is
1033
         available.  */
1034
      if (computed_jump_p (insn)
1035
          /* A return instruction can't be redirected.  */
1036
          || returnjump_p (insn))
1037
        return false;
1038
 
1039
      if (!currently_expanding_to_rtl || JUMP_LABEL (insn) == old_label)
1040
        {
1041
          /* If the insn doesn't go where we think, we're confused.  */
1042
          gcc_assert (JUMP_LABEL (insn) == old_label);
1043
 
1044
          /* If the substitution doesn't succeed, die.  This can happen
1045
             if the back end emitted unrecognizable instructions or if
1046
             target is exit block on some arches.  */
1047
          if (!redirect_jump (insn, block_label (new_bb), 0))
1048
            {
1049
              gcc_assert (new_bb == EXIT_BLOCK_PTR);
1050
              return false;
1051
            }
1052
        }
1053
    }
1054
  return true;
1055
}
1056
 
1057
 
1058
/* Redirect edge representing branch of (un)conditional jump or tablejump,
1059
   NULL on failure  */
1060
static edge
1061
redirect_branch_edge (edge e, basic_block target)
1062
{
1063
  rtx old_label = BB_HEAD (e->dest);
1064
  basic_block src = e->src;
1065
  rtx insn = BB_END (src);
1066
 
1067
  /* We can only redirect non-fallthru edges of jump insn.  */
1068
  if (e->flags & EDGE_FALLTHRU)
1069
    return NULL;
1070
  else if (!JUMP_P (insn) && !currently_expanding_to_rtl)
1071
    return NULL;
1072
 
1073
  if (!currently_expanding_to_rtl)
1074
    {
1075
      if (!patch_jump_insn (insn, old_label, target))
1076
        return NULL;
1077
    }
1078
  else
1079
    /* When expanding this BB might actually contain multiple
1080
       jumps (i.e. not yet split by find_many_sub_basic_blocks).
1081
       Redirect all of those that match our label.  */
1082
    FOR_BB_INSNS (src, insn)
1083
      if (JUMP_P (insn) && !patch_jump_insn (insn, old_label, target))
1084
        return NULL;
1085
 
1086
  if (dump_file)
1087
    fprintf (dump_file, "Edge %i->%i redirected to %i\n",
1088
             e->src->index, e->dest->index, target->index);
1089
 
1090
  if (e->dest != target)
1091
    e = redirect_edge_succ_nodup (e, target);
1092
 
1093
  return e;
1094
}
1095
 
1096
/* Attempt to change code to redirect edge E to TARGET.  Don't do that on
1097
   expense of adding new instructions or reordering basic blocks.
1098
 
1099
   Function can be also called with edge destination equivalent to the TARGET.
1100
   Then it should try the simplifications and do nothing if none is possible.
1101
 
1102
   Return edge representing the branch if transformation succeeded.  Return NULL
1103
   on failure.
1104
   We still return NULL in case E already destinated TARGET and we didn't
1105
   managed to simplify instruction stream.  */
1106
 
1107
static edge
1108
rtl_redirect_edge_and_branch (edge e, basic_block target)
1109
{
1110
  edge ret;
1111
  basic_block src = e->src;
1112
 
1113
  if (e->flags & (EDGE_ABNORMAL_CALL | EDGE_EH))
1114
    return NULL;
1115
 
1116
  if (e->dest == target)
1117
    return e;
1118
 
1119
  if ((ret = try_redirect_by_replacing_jump (e, target, false)) != NULL)
1120
    {
1121
      df_set_bb_dirty (src);
1122
      return ret;
1123
    }
1124
 
1125
  ret = redirect_branch_edge (e, target);
1126
  if (!ret)
1127
    return NULL;
1128
 
1129
  df_set_bb_dirty (src);
1130
  return ret;
1131
}
1132
 
1133
/* Like force_nonfallthru below, but additionally performs redirection
1134
   Used by redirect_edge_and_branch_force.  JUMP_LABEL is used only
1135
   when redirecting to the EXIT_BLOCK, it is either ret_rtx or
1136
   simple_return_rtx, indicating which kind of returnjump to create.
1137
   It should be NULL otherwise.  */
1138
 
1139
basic_block
1140
force_nonfallthru_and_redirect (edge e, basic_block target, rtx jump_label)
1141
{
1142
  basic_block jump_block, new_bb = NULL, src = e->src;
1143
  rtx note;
1144
  edge new_edge;
1145
  int abnormal_edge_flags = 0;
1146
  bool asm_goto_edge = false;
1147
  int loc;
1148
 
1149
  /* In the case the last instruction is conditional jump to the next
1150
     instruction, first redirect the jump itself and then continue
1151
     by creating a basic block afterwards to redirect fallthru edge.  */
1152
  if (e->src != ENTRY_BLOCK_PTR && e->dest != EXIT_BLOCK_PTR
1153
      && any_condjump_p (BB_END (e->src))
1154
      && JUMP_LABEL (BB_END (e->src)) == BB_HEAD (e->dest))
1155
    {
1156
      rtx note;
1157
      edge b = unchecked_make_edge (e->src, target, 0);
1158
      bool redirected;
1159
 
1160
      redirected = redirect_jump (BB_END (e->src), block_label (target), 0);
1161
      gcc_assert (redirected);
1162
 
1163
      note = find_reg_note (BB_END (e->src), REG_BR_PROB, NULL_RTX);
1164
      if (note)
1165
        {
1166
          int prob = INTVAL (XEXP (note, 0));
1167
 
1168
          b->probability = prob;
1169
          b->count = e->count * prob / REG_BR_PROB_BASE;
1170
          e->probability -= e->probability;
1171
          e->count -= b->count;
1172
          if (e->probability < 0)
1173
            e->probability = 0;
1174
          if (e->count < 0)
1175
            e->count = 0;
1176
        }
1177
    }
1178
 
1179
  if (e->flags & EDGE_ABNORMAL)
1180
    {
1181
      /* Irritating special case - fallthru edge to the same block as abnormal
1182
         edge.
1183
         We can't redirect abnormal edge, but we still can split the fallthru
1184
         one and create separate abnormal edge to original destination.
1185
         This allows bb-reorder to make such edge non-fallthru.  */
1186
      gcc_assert (e->dest == target);
1187
      abnormal_edge_flags = e->flags & ~(EDGE_FALLTHRU | EDGE_CAN_FALLTHRU);
1188
      e->flags &= EDGE_FALLTHRU | EDGE_CAN_FALLTHRU;
1189
    }
1190
  else
1191
    {
1192
      gcc_assert (e->flags & EDGE_FALLTHRU);
1193
      if (e->src == ENTRY_BLOCK_PTR)
1194
        {
1195
          /* We can't redirect the entry block.  Create an empty block
1196
             at the start of the function which we use to add the new
1197
             jump.  */
1198
          edge tmp;
1199
          edge_iterator ei;
1200
          bool found = false;
1201
 
1202
          basic_block bb = create_basic_block (BB_HEAD (e->dest), NULL, ENTRY_BLOCK_PTR);
1203
 
1204
          /* Change the existing edge's source to be the new block, and add
1205
             a new edge from the entry block to the new block.  */
1206
          e->src = bb;
1207
          for (ei = ei_start (ENTRY_BLOCK_PTR->succs); (tmp = ei_safe_edge (ei)); )
1208
            {
1209
              if (tmp == e)
1210
                {
1211
                  VEC_unordered_remove (edge, ENTRY_BLOCK_PTR->succs, ei.index);
1212
                  found = true;
1213
                  break;
1214
                }
1215
              else
1216
                ei_next (&ei);
1217
            }
1218
 
1219
          gcc_assert (found);
1220
 
1221
          VEC_safe_push (edge, gc, bb->succs, e);
1222
          make_single_succ_edge (ENTRY_BLOCK_PTR, bb, EDGE_FALLTHRU);
1223
        }
1224
    }
1225
 
1226
  /* If e->src ends with asm goto, see if any of the ASM_OPERANDS_LABELs
1227
     don't point to target label.  */
1228
  if (JUMP_P (BB_END (e->src))
1229
      && target != EXIT_BLOCK_PTR
1230
      && e->dest == target
1231
      && (e->flags & EDGE_FALLTHRU)
1232
      && (note = extract_asm_operands (PATTERN (BB_END (e->src)))))
1233
    {
1234
      int i, n = ASM_OPERANDS_LABEL_LENGTH (note);
1235
 
1236
      for (i = 0; i < n; ++i)
1237
        if (XEXP (ASM_OPERANDS_LABEL (note, i), 0) == BB_HEAD (target))
1238
          {
1239
            asm_goto_edge = true;
1240
            break;
1241
          }
1242
    }
1243
 
1244
  if (EDGE_COUNT (e->src->succs) >= 2 || abnormal_edge_flags || asm_goto_edge)
1245
    {
1246
      gcov_type count = e->count;
1247
      int probability = e->probability;
1248
      /* Create the new structures.  */
1249
 
1250
      /* If the old block ended with a tablejump, skip its table
1251
         by searching forward from there.  Otherwise start searching
1252
         forward from the last instruction of the old block.  */
1253
      if (!tablejump_p (BB_END (e->src), NULL, &note))
1254
        note = BB_END (e->src);
1255
      note = NEXT_INSN (note);
1256
 
1257
      jump_block = create_basic_block (note, NULL, e->src);
1258
      jump_block->count = count;
1259
      jump_block->frequency = EDGE_FREQUENCY (e);
1260
      jump_block->loop_depth = target->loop_depth;
1261
 
1262
      /* Make sure new block ends up in correct hot/cold section.  */
1263
 
1264
      BB_COPY_PARTITION (jump_block, e->src);
1265
      if (flag_reorder_blocks_and_partition
1266
          && targetm_common.have_named_sections
1267
          && JUMP_P (BB_END (jump_block))
1268
          && !any_condjump_p (BB_END (jump_block))
1269
          && (EDGE_SUCC (jump_block, 0)->flags & EDGE_CROSSING))
1270
        add_reg_note (BB_END (jump_block), REG_CROSSING_JUMP, NULL_RTX);
1271
 
1272
      /* Wire edge in.  */
1273
      new_edge = make_edge (e->src, jump_block, EDGE_FALLTHRU);
1274
      new_edge->probability = probability;
1275
      new_edge->count = count;
1276
 
1277
      /* Redirect old edge.  */
1278
      redirect_edge_pred (e, jump_block);
1279
      e->probability = REG_BR_PROB_BASE;
1280
 
1281
      /* If asm goto has any label refs to target's label,
1282
         add also edge from asm goto bb to target.  */
1283
      if (asm_goto_edge)
1284
        {
1285
          new_edge->probability /= 2;
1286
          new_edge->count /= 2;
1287
          jump_block->count /= 2;
1288
          jump_block->frequency /= 2;
1289
          new_edge = make_edge (new_edge->src, target,
1290
                                e->flags & ~EDGE_FALLTHRU);
1291
          new_edge->probability = probability - probability / 2;
1292
          new_edge->count = count - count / 2;
1293
        }
1294
 
1295
      new_bb = jump_block;
1296
    }
1297
  else
1298
    jump_block = e->src;
1299
 
1300
  if (e->goto_locus && e->goto_block == NULL)
1301
    loc = e->goto_locus;
1302
  else
1303
    loc = 0;
1304
  e->flags &= ~EDGE_FALLTHRU;
1305
  if (target == EXIT_BLOCK_PTR)
1306
    {
1307
      if (jump_label == ret_rtx)
1308
        {
1309
#ifdef HAVE_return
1310
          emit_jump_insn_after_setloc (gen_return (), BB_END (jump_block), loc);
1311
#else
1312
          gcc_unreachable ();
1313
#endif
1314
        }
1315
      else
1316
        {
1317
          gcc_assert (jump_label == simple_return_rtx);
1318
#ifdef HAVE_simple_return
1319
          emit_jump_insn_after_setloc (gen_simple_return (),
1320
                                       BB_END (jump_block), loc);
1321
#else
1322
          gcc_unreachable ();
1323
#endif
1324
        }
1325
      set_return_jump_label (BB_END (jump_block));
1326
    }
1327
  else
1328
    {
1329
      rtx label = block_label (target);
1330
      emit_jump_insn_after_setloc (gen_jump (label), BB_END (jump_block), loc);
1331
      JUMP_LABEL (BB_END (jump_block)) = label;
1332
      LABEL_NUSES (label)++;
1333
    }
1334
 
1335
  emit_barrier_after (BB_END (jump_block));
1336
  redirect_edge_succ_nodup (e, target);
1337
 
1338
  if (abnormal_edge_flags)
1339
    make_edge (src, target, abnormal_edge_flags);
1340
 
1341
  df_mark_solutions_dirty ();
1342
  return new_bb;
1343
}
1344
 
1345
/* Edge E is assumed to be fallthru edge.  Emit needed jump instruction
1346
   (and possibly create new basic block) to make edge non-fallthru.
1347
   Return newly created BB or NULL if none.  */
1348
 
1349
static basic_block
1350
rtl_force_nonfallthru (edge e)
1351
{
1352
  return force_nonfallthru_and_redirect (e, e->dest, NULL_RTX);
1353
}
1354
 
1355
/* Redirect edge even at the expense of creating new jump insn or
1356
   basic block.  Return new basic block if created, NULL otherwise.
1357
   Conversion must be possible.  */
1358
 
1359
static basic_block
1360
rtl_redirect_edge_and_branch_force (edge e, basic_block target)
1361
{
1362
  if (redirect_edge_and_branch (e, target)
1363
      || e->dest == target)
1364
    return NULL;
1365
 
1366
  /* In case the edge redirection failed, try to force it to be non-fallthru
1367
     and redirect newly created simplejump.  */
1368
  df_set_bb_dirty (e->src);
1369
  return force_nonfallthru_and_redirect (e, target, NULL_RTX);
1370
}
1371
 
1372
/* The given edge should potentially be a fallthru edge.  If that is in
1373
   fact true, delete the jump and barriers that are in the way.  */
1374
 
1375
static void
1376
rtl_tidy_fallthru_edge (edge e)
1377
{
1378
  rtx q;
1379
  basic_block b = e->src, c = b->next_bb;
1380
 
1381
  /* ??? In a late-running flow pass, other folks may have deleted basic
1382
     blocks by nopping out blocks, leaving multiple BARRIERs between here
1383
     and the target label. They ought to be chastised and fixed.
1384
 
1385
     We can also wind up with a sequence of undeletable labels between
1386
     one block and the next.
1387
 
1388
     So search through a sequence of barriers, labels, and notes for
1389
     the head of block C and assert that we really do fall through.  */
1390
 
1391
  for (q = NEXT_INSN (BB_END (b)); q != BB_HEAD (c); q = NEXT_INSN (q))
1392
    if (INSN_P (q))
1393
      return;
1394
 
1395
  /* Remove what will soon cease being the jump insn from the source block.
1396
     If block B consisted only of this single jump, turn it into a deleted
1397
     note.  */
1398
  q = BB_END (b);
1399
  if (JUMP_P (q)
1400
      && onlyjump_p (q)
1401
      && (any_uncondjump_p (q)
1402
          || single_succ_p (b)))
1403
    {
1404
#ifdef HAVE_cc0
1405
      /* If this was a conditional jump, we need to also delete
1406
         the insn that set cc0.  */
1407
      if (any_condjump_p (q) && only_sets_cc0_p (PREV_INSN (q)))
1408
        q = PREV_INSN (q);
1409
#endif
1410
 
1411
      q = PREV_INSN (q);
1412
    }
1413
 
1414
  /* Selectively unlink the sequence.  */
1415
  if (q != PREV_INSN (BB_HEAD (c)))
1416
    delete_insn_chain (NEXT_INSN (q), PREV_INSN (BB_HEAD (c)), false);
1417
 
1418
  e->flags |= EDGE_FALLTHRU;
1419
}
1420
 
1421
/* Should move basic block BB after basic block AFTER.  NIY.  */
1422
 
1423
static bool
1424
rtl_move_block_after (basic_block bb ATTRIBUTE_UNUSED,
1425
                      basic_block after ATTRIBUTE_UNUSED)
1426
{
1427
  return false;
1428
}
1429
 
1430
/* Split a (typically critical) edge.  Return the new block.
1431
   The edge must not be abnormal.
1432
 
1433
   ??? The code generally expects to be called on critical edges.
1434
   The case of a block ending in an unconditional jump to a
1435
   block with multiple predecessors is not handled optimally.  */
1436
 
1437
static basic_block
1438
rtl_split_edge (edge edge_in)
1439
{
1440
  basic_block bb;
1441
  rtx before;
1442
 
1443
  /* Abnormal edges cannot be split.  */
1444
  gcc_assert (!(edge_in->flags & EDGE_ABNORMAL));
1445
 
1446
  /* We are going to place the new block in front of edge destination.
1447
     Avoid existence of fallthru predecessors.  */
1448
  if ((edge_in->flags & EDGE_FALLTHRU) == 0)
1449
    {
1450
      edge e = find_fallthru_edge (edge_in->dest->preds);
1451
 
1452
      if (e)
1453
        force_nonfallthru (e);
1454
    }
1455
 
1456
  /* Create the basic block note.  */
1457
  if (edge_in->dest != EXIT_BLOCK_PTR)
1458
    before = BB_HEAD (edge_in->dest);
1459
  else
1460
    before = NULL_RTX;
1461
 
1462
  /* If this is a fall through edge to the exit block, the blocks might be
1463
     not adjacent, and the right place is after the source.  */
1464
  if ((edge_in->flags & EDGE_FALLTHRU) && edge_in->dest == EXIT_BLOCK_PTR)
1465
    {
1466
      before = NEXT_INSN (BB_END (edge_in->src));
1467
      bb = create_basic_block (before, NULL, edge_in->src);
1468
      BB_COPY_PARTITION (bb, edge_in->src);
1469
    }
1470
  else
1471
    {
1472
      bb = create_basic_block (before, NULL, edge_in->dest->prev_bb);
1473
      /* ??? Why not edge_in->dest->prev_bb here?  */
1474
      BB_COPY_PARTITION (bb, edge_in->dest);
1475
    }
1476
 
1477
  make_single_succ_edge (bb, edge_in->dest, EDGE_FALLTHRU);
1478
 
1479
  /* For non-fallthru edges, we must adjust the predecessor's
1480
     jump instruction to target our new block.  */
1481
  if ((edge_in->flags & EDGE_FALLTHRU) == 0)
1482
    {
1483
      edge redirected = redirect_edge_and_branch (edge_in, bb);
1484
      gcc_assert (redirected);
1485
    }
1486
  else
1487
    {
1488
      if (edge_in->src != ENTRY_BLOCK_PTR)
1489
        {
1490
          /* For asm goto even splitting of fallthru edge might
1491
             need insn patching, as other labels might point to the
1492
             old label.  */
1493
          rtx last = BB_END (edge_in->src);
1494
          if (last
1495
              && JUMP_P (last)
1496
              && edge_in->dest != EXIT_BLOCK_PTR
1497
              && extract_asm_operands (PATTERN (last)) != NULL_RTX
1498
              && patch_jump_insn (last, before, bb))
1499
            df_set_bb_dirty (edge_in->src);
1500
        }
1501
      redirect_edge_succ (edge_in, bb);
1502
    }
1503
 
1504
  return bb;
1505
}
1506
 
1507
/* Queue instructions for insertion on an edge between two basic blocks.
1508
   The new instructions and basic blocks (if any) will not appear in the
1509
   CFG until commit_edge_insertions is called.  */
1510
 
1511
void
1512
insert_insn_on_edge (rtx pattern, edge e)
1513
{
1514
  /* We cannot insert instructions on an abnormal critical edge.
1515
     It will be easier to find the culprit if we die now.  */
1516
  gcc_assert (!((e->flags & EDGE_ABNORMAL) && EDGE_CRITICAL_P (e)));
1517
 
1518
  if (e->insns.r == NULL_RTX)
1519
    start_sequence ();
1520
  else
1521
    push_to_sequence (e->insns.r);
1522
 
1523
  emit_insn (pattern);
1524
 
1525
  e->insns.r = get_insns ();
1526
  end_sequence ();
1527
}
1528
 
1529
/* Update the CFG for the instructions queued on edge E.  */
1530
 
1531
void
1532
commit_one_edge_insertion (edge e)
1533
{
1534
  rtx before = NULL_RTX, after = NULL_RTX, insns, tmp, last;
1535
  basic_block bb;
1536
 
1537
  /* Pull the insns off the edge now since the edge might go away.  */
1538
  insns = e->insns.r;
1539
  e->insns.r = NULL_RTX;
1540
 
1541
  /* Figure out where to put these insns.  If the destination has
1542
     one predecessor, insert there.  Except for the exit block.  */
1543
  if (single_pred_p (e->dest) && e->dest != EXIT_BLOCK_PTR)
1544
    {
1545
      bb = e->dest;
1546
 
1547
      /* Get the location correct wrt a code label, and "nice" wrt
1548
         a basic block note, and before everything else.  */
1549
      tmp = BB_HEAD (bb);
1550
      if (LABEL_P (tmp))
1551
        tmp = NEXT_INSN (tmp);
1552
      if (NOTE_INSN_BASIC_BLOCK_P (tmp))
1553
        tmp = NEXT_INSN (tmp);
1554
      if (tmp == BB_HEAD (bb))
1555
        before = tmp;
1556
      else if (tmp)
1557
        after = PREV_INSN (tmp);
1558
      else
1559
        after = get_last_insn ();
1560
    }
1561
 
1562
  /* If the source has one successor and the edge is not abnormal,
1563
     insert there.  Except for the entry block.  */
1564
  else if ((e->flags & EDGE_ABNORMAL) == 0
1565
           && single_succ_p (e->src)
1566
           && e->src != ENTRY_BLOCK_PTR)
1567
    {
1568
      bb = e->src;
1569
 
1570
      /* It is possible to have a non-simple jump here.  Consider a target
1571
         where some forms of unconditional jumps clobber a register.  This
1572
         happens on the fr30 for example.
1573
 
1574
         We know this block has a single successor, so we can just emit
1575
         the queued insns before the jump.  */
1576
      if (JUMP_P (BB_END (bb)))
1577
        before = BB_END (bb);
1578
      else
1579
        {
1580
          /* We'd better be fallthru, or we've lost track of what's what.  */
1581
          gcc_assert (e->flags & EDGE_FALLTHRU);
1582
 
1583
          after = BB_END (bb);
1584
        }
1585
    }
1586
 
1587
  /* Otherwise we must split the edge.  */
1588
  else
1589
    {
1590
      bb = split_edge (e);
1591
      after = BB_END (bb);
1592
 
1593
      if (flag_reorder_blocks_and_partition
1594
          && targetm_common.have_named_sections
1595
          && e->src != ENTRY_BLOCK_PTR
1596
          && BB_PARTITION (e->src) == BB_COLD_PARTITION
1597
          && !(e->flags & EDGE_CROSSING)
1598
          && JUMP_P (after)
1599
          && !any_condjump_p (after)
1600
          && (single_succ_edge (bb)->flags & EDGE_CROSSING))
1601
        add_reg_note (after, REG_CROSSING_JUMP, NULL_RTX);
1602
    }
1603
 
1604
  /* Now that we've found the spot, do the insertion.  */
1605
  if (before)
1606
    {
1607
      emit_insn_before_noloc (insns, before, bb);
1608
      last = prev_nonnote_insn (before);
1609
    }
1610
  else
1611
    last = emit_insn_after_noloc (insns, after, bb);
1612
 
1613
  if (returnjump_p (last))
1614
    {
1615
      /* ??? Remove all outgoing edges from BB and add one for EXIT.
1616
         This is not currently a problem because this only happens
1617
         for the (single) epilogue, which already has a fallthru edge
1618
         to EXIT.  */
1619
 
1620
      e = single_succ_edge (bb);
1621
      gcc_assert (e->dest == EXIT_BLOCK_PTR
1622
                  && single_succ_p (bb) && (e->flags & EDGE_FALLTHRU));
1623
 
1624
      e->flags &= ~EDGE_FALLTHRU;
1625
      emit_barrier_after (last);
1626
 
1627
      if (before)
1628
        delete_insn (before);
1629
    }
1630
  else
1631
    gcc_assert (!JUMP_P (last));
1632
}
1633
 
1634
/* Update the CFG for all queued instructions.  */
1635
 
1636
void
1637
commit_edge_insertions (void)
1638
{
1639
  basic_block bb;
1640
 
1641
#ifdef ENABLE_CHECKING
1642
  verify_flow_info ();
1643
#endif
1644
 
1645
  FOR_BB_BETWEEN (bb, ENTRY_BLOCK_PTR, EXIT_BLOCK_PTR, next_bb)
1646
    {
1647
      edge e;
1648
      edge_iterator ei;
1649
 
1650
      FOR_EACH_EDGE (e, ei, bb->succs)
1651
        if (e->insns.r)
1652
          commit_one_edge_insertion (e);
1653
    }
1654
}
1655
 
1656
 
1657
/* Print out RTL-specific basic block information (live information
1658
   at start and end).  */
1659
 
1660
static void
1661
rtl_dump_bb (basic_block bb, FILE *outf, int indent, int flags ATTRIBUTE_UNUSED)
1662
{
1663
  rtx insn;
1664
  rtx last;
1665
  char *s_indent;
1666
 
1667
  s_indent = (char *) alloca ((size_t) indent + 1);
1668
  memset (s_indent, ' ', (size_t) indent);
1669
  s_indent[indent] = '\0';
1670
 
1671
  if (df)
1672
    {
1673
      df_dump_top (bb, outf);
1674
      putc ('\n', outf);
1675
    }
1676
 
1677
  if (bb->index != ENTRY_BLOCK && bb->index != EXIT_BLOCK)
1678
    for (insn = BB_HEAD (bb), last = NEXT_INSN (BB_END (bb)); insn != last;
1679
         insn = NEXT_INSN (insn))
1680
      print_rtl_single (outf, insn);
1681
 
1682
  if (df)
1683
    {
1684
      df_dump_bottom (bb, outf);
1685
      putc ('\n', outf);
1686
    }
1687
 
1688
}
1689
 
1690
/* Like print_rtl, but also print out live information for the start of each
1691
   basic block.  */
1692
 
1693
void
1694
print_rtl_with_bb (FILE *outf, const_rtx rtx_first)
1695
{
1696
  const_rtx tmp_rtx;
1697
  if (rtx_first == 0)
1698
    fprintf (outf, "(nil)\n");
1699
  else
1700
    {
1701
      enum bb_state { NOT_IN_BB, IN_ONE_BB, IN_MULTIPLE_BB };
1702
      int max_uid = get_max_uid ();
1703
      basic_block *start = XCNEWVEC (basic_block, max_uid);
1704
      basic_block *end = XCNEWVEC (basic_block, max_uid);
1705
      enum bb_state *in_bb_p = XCNEWVEC (enum bb_state, max_uid);
1706
 
1707
      basic_block bb;
1708
 
1709
      if (df)
1710
        df_dump_start (outf);
1711
 
1712
      FOR_EACH_BB_REVERSE (bb)
1713
        {
1714
          rtx x;
1715
 
1716
          start[INSN_UID (BB_HEAD (bb))] = bb;
1717
          end[INSN_UID (BB_END (bb))] = bb;
1718
          for (x = BB_HEAD (bb); x != NULL_RTX; x = NEXT_INSN (x))
1719
            {
1720
              enum bb_state state = IN_MULTIPLE_BB;
1721
 
1722
              if (in_bb_p[INSN_UID (x)] == NOT_IN_BB)
1723
                state = IN_ONE_BB;
1724
              in_bb_p[INSN_UID (x)] = state;
1725
 
1726
              if (x == BB_END (bb))
1727
                break;
1728
            }
1729
        }
1730
 
1731
      for (tmp_rtx = rtx_first; NULL != tmp_rtx; tmp_rtx = NEXT_INSN (tmp_rtx))
1732
        {
1733
          int did_output;
1734
 
1735
          bb = start[INSN_UID (tmp_rtx)];
1736
          if (bb != NULL)
1737
            dump_bb_info (bb, true, false, dump_flags, ";; ", outf);
1738
 
1739
          if (in_bb_p[INSN_UID (tmp_rtx)] == NOT_IN_BB
1740
              && !NOTE_P (tmp_rtx)
1741
              && !BARRIER_P (tmp_rtx))
1742
            fprintf (outf, ";; Insn is not within a basic block\n");
1743
          else if (in_bb_p[INSN_UID (tmp_rtx)] == IN_MULTIPLE_BB)
1744
            fprintf (outf, ";; Insn is in multiple basic blocks\n");
1745
 
1746
          did_output = print_rtl_single (outf, tmp_rtx);
1747
 
1748
          bb = end[INSN_UID (tmp_rtx)];
1749
          if (bb != NULL)
1750
            dump_bb_info (bb, false, true, dump_flags, ";; ", outf);
1751
          if (did_output)
1752
            putc ('\n', outf);
1753
        }
1754
 
1755
      free (start);
1756
      free (end);
1757
      free (in_bb_p);
1758
    }
1759
 
1760
  if (crtl->epilogue_delay_list != 0)
1761
    {
1762
      fprintf (outf, "\n;; Insns in epilogue delay list:\n\n");
1763
      for (tmp_rtx = crtl->epilogue_delay_list; tmp_rtx != 0;
1764
           tmp_rtx = XEXP (tmp_rtx, 1))
1765
        print_rtl_single (outf, XEXP (tmp_rtx, 0));
1766
    }
1767
}
1768
 
1769
void
1770
update_br_prob_note (basic_block bb)
1771
{
1772
  rtx note;
1773
  if (!JUMP_P (BB_END (bb)))
1774
    return;
1775
  note = find_reg_note (BB_END (bb), REG_BR_PROB, NULL_RTX);
1776
  if (!note || INTVAL (XEXP (note, 0)) == BRANCH_EDGE (bb)->probability)
1777
    return;
1778
  XEXP (note, 0) = GEN_INT (BRANCH_EDGE (bb)->probability);
1779
}
1780
 
1781
/* Get the last insn associated with block BB (that includes barriers and
1782
   tablejumps after BB).  */
1783
rtx
1784
get_last_bb_insn (basic_block bb)
1785
{
1786
  rtx tmp;
1787
  rtx end = BB_END (bb);
1788
 
1789
  /* Include any jump table following the basic block.  */
1790
  if (tablejump_p (end, NULL, &tmp))
1791
    end = tmp;
1792
 
1793
  /* Include any barriers that may follow the basic block.  */
1794
  tmp = next_nonnote_insn_bb (end);
1795
  while (tmp && BARRIER_P (tmp))
1796
    {
1797
      end = tmp;
1798
      tmp = next_nonnote_insn_bb (end);
1799
    }
1800
 
1801
  return end;
1802
}
1803
 
1804
/* Verify the CFG and RTL consistency common for both underlying RTL and
1805
   cfglayout RTL.
1806
 
1807
   Currently it does following checks:
1808
 
1809
   - overlapping of basic blocks
1810
   - insns with wrong BLOCK_FOR_INSN pointers
1811
   - headers of basic blocks (the NOTE_INSN_BASIC_BLOCK note)
1812
   - tails of basic blocks (ensure that boundary is necessary)
1813
   - scans body of the basic block for JUMP_INSN, CODE_LABEL
1814
     and NOTE_INSN_BASIC_BLOCK
1815
   - verify that no fall_thru edge crosses hot/cold partition boundaries
1816
   - verify that there are no pending RTL branch predictions
1817
 
1818
   In future it can be extended check a lot of other stuff as well
1819
   (reachability of basic blocks, life information, etc. etc.).  */
1820
 
1821
static int
1822
rtl_verify_flow_info_1 (void)
1823
{
1824
  rtx x;
1825
  int err = 0;
1826
  basic_block bb;
1827
 
1828
  /* Check the general integrity of the basic blocks.  */
1829
  FOR_EACH_BB_REVERSE (bb)
1830
    {
1831
      rtx insn;
1832
 
1833
      if (!(bb->flags & BB_RTL))
1834
        {
1835
          error ("BB_RTL flag not set for block %d", bb->index);
1836
          err = 1;
1837
        }
1838
 
1839
      FOR_BB_INSNS (bb, insn)
1840
        if (BLOCK_FOR_INSN (insn) != bb)
1841
          {
1842
            error ("insn %d basic block pointer is %d, should be %d",
1843
                   INSN_UID (insn),
1844
                   BLOCK_FOR_INSN (insn) ? BLOCK_FOR_INSN (insn)->index : 0,
1845
                   bb->index);
1846
            err = 1;
1847
          }
1848
 
1849
      for (insn = bb->il.rtl->header; insn; insn = NEXT_INSN (insn))
1850
        if (!BARRIER_P (insn)
1851
            && BLOCK_FOR_INSN (insn) != NULL)
1852
          {
1853
            error ("insn %d in header of bb %d has non-NULL basic block",
1854
                   INSN_UID (insn), bb->index);
1855
            err = 1;
1856
          }
1857
      for (insn = bb->il.rtl->footer; insn; insn = NEXT_INSN (insn))
1858
        if (!BARRIER_P (insn)
1859
            && BLOCK_FOR_INSN (insn) != NULL)
1860
          {
1861
            error ("insn %d in footer of bb %d has non-NULL basic block",
1862
                   INSN_UID (insn), bb->index);
1863
            err = 1;
1864
          }
1865
    }
1866
 
1867
  /* Now check the basic blocks (boundaries etc.) */
1868
  FOR_EACH_BB_REVERSE (bb)
1869
    {
1870
      int n_fallthru = 0, n_eh = 0, n_call = 0, n_abnormal = 0, n_branch = 0;
1871
      edge e, fallthru = NULL;
1872
      rtx note;
1873
      edge_iterator ei;
1874
 
1875
      if (JUMP_P (BB_END (bb))
1876
          && (note = find_reg_note (BB_END (bb), REG_BR_PROB, NULL_RTX))
1877
          && EDGE_COUNT (bb->succs) >= 2
1878
          && any_condjump_p (BB_END (bb)))
1879
        {
1880
          if (INTVAL (XEXP (note, 0)) != BRANCH_EDGE (bb)->probability
1881
              && profile_status != PROFILE_ABSENT)
1882
            {
1883
              error ("verify_flow_info: REG_BR_PROB does not match cfg %wi %i",
1884
                     INTVAL (XEXP (note, 0)), BRANCH_EDGE (bb)->probability);
1885
              err = 1;
1886
            }
1887
        }
1888
      FOR_EACH_EDGE (e, ei, bb->succs)
1889
        {
1890
          bool is_crossing;
1891
 
1892
          if (e->flags & EDGE_FALLTHRU)
1893
            n_fallthru++, fallthru = e;
1894
 
1895
          is_crossing = (BB_PARTITION (e->src) != BB_PARTITION (e->dest)
1896
                         && e->src != ENTRY_BLOCK_PTR
1897
                         && e->dest != EXIT_BLOCK_PTR);
1898
          if (e->flags & EDGE_CROSSING)
1899
            {
1900
              if (!is_crossing)
1901
                {
1902
                  error ("EDGE_CROSSING incorrectly set across same section");
1903
                  err = 1;
1904
                }
1905
              if (e->flags & EDGE_FALLTHRU)
1906
                {
1907
                  error ("fallthru edge crosses section boundary (bb %i)",
1908
                         e->src->index);
1909
                  err = 1;
1910
                }
1911
              if (e->flags & EDGE_EH)
1912
                {
1913
                  error ("EH edge crosses section boundary (bb %i)",
1914
                         e->src->index);
1915
                  err = 1;
1916
                }
1917
            }
1918
          else if (is_crossing)
1919
            {
1920
              error ("EDGE_CROSSING missing across section boundary");
1921
              err = 1;
1922
            }
1923
 
1924
          if ((e->flags & ~(EDGE_DFS_BACK
1925
                            | EDGE_CAN_FALLTHRU
1926
                            | EDGE_IRREDUCIBLE_LOOP
1927
                            | EDGE_LOOP_EXIT
1928
                            | EDGE_CROSSING
1929
                            | EDGE_PRESERVE)) == 0)
1930
            n_branch++;
1931
 
1932
          if (e->flags & EDGE_ABNORMAL_CALL)
1933
            n_call++;
1934
 
1935
          if (e->flags & EDGE_EH)
1936
            n_eh++;
1937
          else if (e->flags & EDGE_ABNORMAL)
1938
            n_abnormal++;
1939
        }
1940
 
1941
      if (n_eh && !find_reg_note (BB_END (bb), REG_EH_REGION, NULL_RTX))
1942
        {
1943
          error ("missing REG_EH_REGION note in the end of bb %i", bb->index);
1944
          err = 1;
1945
        }
1946
      if (n_eh > 1)
1947
        {
1948
          error ("too many eh edges %i", bb->index);
1949
          err = 1;
1950
        }
1951
      if (n_branch
1952
          && (!JUMP_P (BB_END (bb))
1953
              || (n_branch > 1 && (any_uncondjump_p (BB_END (bb))
1954
                                   || any_condjump_p (BB_END (bb))))))
1955
        {
1956
          error ("too many outgoing branch edges from bb %i", bb->index);
1957
          err = 1;
1958
        }
1959
      if (n_fallthru && any_uncondjump_p (BB_END (bb)))
1960
        {
1961
          error ("fallthru edge after unconditional jump %i", bb->index);
1962
          err = 1;
1963
        }
1964
      if (n_branch != 1 && any_uncondjump_p (BB_END (bb)))
1965
        {
1966
          error ("wrong number of branch edges after unconditional jump %i",
1967
                 bb->index);
1968
          err = 1;
1969
        }
1970
      if (n_branch != 1 && any_condjump_p (BB_END (bb))
1971
          && JUMP_LABEL (BB_END (bb)) != BB_HEAD (fallthru->dest))
1972
        {
1973
          error ("wrong amount of branch edges after conditional jump %i",
1974
                 bb->index);
1975
          err = 1;
1976
        }
1977
      if (n_call && !CALL_P (BB_END (bb)))
1978
        {
1979
          error ("call edges for non-call insn in bb %i", bb->index);
1980
          err = 1;
1981
        }
1982
      if (n_abnormal
1983
          && (!CALL_P (BB_END (bb)) && n_call != n_abnormal)
1984
          && (!JUMP_P (BB_END (bb))
1985
              || any_condjump_p (BB_END (bb))
1986
              || any_uncondjump_p (BB_END (bb))))
1987
        {
1988
          error ("abnormal edges for no purpose in bb %i", bb->index);
1989
          err = 1;
1990
        }
1991
 
1992
      for (x = BB_HEAD (bb); x != NEXT_INSN (BB_END (bb)); x = NEXT_INSN (x))
1993
        /* We may have a barrier inside a basic block before dead code
1994
           elimination.  There is no BLOCK_FOR_INSN field in a barrier.  */
1995
        if (!BARRIER_P (x) && BLOCK_FOR_INSN (x) != bb)
1996
          {
1997
            debug_rtx (x);
1998
            if (! BLOCK_FOR_INSN (x))
1999
              error
2000
                ("insn %d inside basic block %d but block_for_insn is NULL",
2001
                 INSN_UID (x), bb->index);
2002
            else
2003
              error
2004
                ("insn %d inside basic block %d but block_for_insn is %i",
2005
                 INSN_UID (x), bb->index, BLOCK_FOR_INSN (x)->index);
2006
 
2007
            err = 1;
2008
          }
2009
 
2010
      /* OK pointers are correct.  Now check the header of basic
2011
         block.  It ought to contain optional CODE_LABEL followed
2012
         by NOTE_BASIC_BLOCK.  */
2013
      x = BB_HEAD (bb);
2014
      if (LABEL_P (x))
2015
        {
2016
          if (BB_END (bb) == x)
2017
            {
2018
              error ("NOTE_INSN_BASIC_BLOCK is missing for block %d",
2019
                     bb->index);
2020
              err = 1;
2021
            }
2022
 
2023
          x = NEXT_INSN (x);
2024
        }
2025
 
2026
      if (!NOTE_INSN_BASIC_BLOCK_P (x) || NOTE_BASIC_BLOCK (x) != bb)
2027
        {
2028
          error ("NOTE_INSN_BASIC_BLOCK is missing for block %d",
2029
                 bb->index);
2030
          err = 1;
2031
        }
2032
 
2033
      if (BB_END (bb) == x)
2034
        /* Do checks for empty blocks here.  */
2035
        ;
2036
      else
2037
        for (x = NEXT_INSN (x); x; x = NEXT_INSN (x))
2038
          {
2039
            if (NOTE_INSN_BASIC_BLOCK_P (x))
2040
              {
2041
                error ("NOTE_INSN_BASIC_BLOCK %d in middle of basic block %d",
2042
                       INSN_UID (x), bb->index);
2043
                err = 1;
2044
              }
2045
 
2046
            if (x == BB_END (bb))
2047
              break;
2048
 
2049
            if (control_flow_insn_p (x))
2050
              {
2051
                error ("in basic block %d:", bb->index);
2052
                fatal_insn ("flow control insn inside a basic block", x);
2053
              }
2054
          }
2055
    }
2056
 
2057
  /* Clean up.  */
2058
  return err;
2059
}
2060
 
2061
/* Verify the CFG and RTL consistency common for both underlying RTL and
2062
   cfglayout RTL.
2063
 
2064
   Currently it does following checks:
2065
   - all checks of rtl_verify_flow_info_1
2066
   - test head/end pointers
2067
   - check that all insns are in the basic blocks
2068
     (except the switch handling code, barriers and notes)
2069
   - check that all returns are followed by barriers
2070
   - check that all fallthru edge points to the adjacent blocks.  */
2071
 
2072
static int
2073
rtl_verify_flow_info (void)
2074
{
2075
  basic_block bb;
2076
  int err = rtl_verify_flow_info_1 ();
2077
  rtx x;
2078
  rtx last_head = get_last_insn ();
2079
  basic_block *bb_info;
2080
  int num_bb_notes;
2081
  const rtx rtx_first = get_insns ();
2082
  basic_block last_bb_seen = ENTRY_BLOCK_PTR, curr_bb = NULL;
2083
  const int max_uid = get_max_uid ();
2084
 
2085
  bb_info = XCNEWVEC (basic_block, max_uid);
2086
 
2087
  FOR_EACH_BB_REVERSE (bb)
2088
    {
2089
      edge e;
2090
      rtx head = BB_HEAD (bb);
2091
      rtx end = BB_END (bb);
2092
 
2093
      for (x = last_head; x != NULL_RTX; x = PREV_INSN (x))
2094
        {
2095
          /* Verify the end of the basic block is in the INSN chain.  */
2096
          if (x == end)
2097
            break;
2098
 
2099
          /* And that the code outside of basic blocks has NULL bb field.  */
2100
        if (!BARRIER_P (x)
2101
            && BLOCK_FOR_INSN (x) != NULL)
2102
          {
2103
            error ("insn %d outside of basic blocks has non-NULL bb field",
2104
                   INSN_UID (x));
2105
            err = 1;
2106
          }
2107
        }
2108
 
2109
      if (!x)
2110
        {
2111
          error ("end insn %d for block %d not found in the insn stream",
2112
                 INSN_UID (end), bb->index);
2113
          err = 1;
2114
        }
2115
 
2116
      /* Work backwards from the end to the head of the basic block
2117
         to verify the head is in the RTL chain.  */
2118
      for (; x != NULL_RTX; x = PREV_INSN (x))
2119
        {
2120
          /* While walking over the insn chain, verify insns appear
2121
             in only one basic block.  */
2122
          if (bb_info[INSN_UID (x)] != NULL)
2123
            {
2124
              error ("insn %d is in multiple basic blocks (%d and %d)",
2125
                     INSN_UID (x), bb->index, bb_info[INSN_UID (x)]->index);
2126
              err = 1;
2127
            }
2128
 
2129
          bb_info[INSN_UID (x)] = bb;
2130
 
2131
          if (x == head)
2132
            break;
2133
        }
2134
      if (!x)
2135
        {
2136
          error ("head insn %d for block %d not found in the insn stream",
2137
                 INSN_UID (head), bb->index);
2138
          err = 1;
2139
        }
2140
 
2141
      last_head = PREV_INSN (x);
2142
 
2143
      e = find_fallthru_edge (bb->succs);
2144
      if (!e)
2145
        {
2146
          rtx insn;
2147
 
2148
          /* Ensure existence of barrier in BB with no fallthru edges.  */
2149
          for (insn = NEXT_INSN (BB_END (bb)); ; insn = NEXT_INSN (insn))
2150
            {
2151
              if (!insn || NOTE_INSN_BASIC_BLOCK_P (insn))
2152
                {
2153
                  error ("missing barrier after block %i", bb->index);
2154
                  err = 1;
2155
                  break;
2156
                }
2157
              if (BARRIER_P (insn))
2158
                break;
2159
            }
2160
        }
2161
      else if (e->src != ENTRY_BLOCK_PTR
2162
               && e->dest != EXIT_BLOCK_PTR)
2163
        {
2164
          rtx insn;
2165
 
2166
          if (e->src->next_bb != e->dest)
2167
            {
2168
              error
2169
                ("verify_flow_info: Incorrect blocks for fallthru %i->%i",
2170
                 e->src->index, e->dest->index);
2171
              err = 1;
2172
            }
2173
          else
2174
            for (insn = NEXT_INSN (BB_END (e->src)); insn != BB_HEAD (e->dest);
2175
                 insn = NEXT_INSN (insn))
2176
              if (BARRIER_P (insn) || INSN_P (insn))
2177
                {
2178
                  error ("verify_flow_info: Incorrect fallthru %i->%i",
2179
                         e->src->index, e->dest->index);
2180
                  fatal_insn ("wrong insn in the fallthru edge", insn);
2181
                  err = 1;
2182
                }
2183
        }
2184
    }
2185
 
2186
  for (x = last_head; x != NULL_RTX; x = PREV_INSN (x))
2187
    {
2188
      /* Check that the code before the first basic block has NULL
2189
         bb field.  */
2190
      if (!BARRIER_P (x)
2191
          && BLOCK_FOR_INSN (x) != NULL)
2192
        {
2193
          error ("insn %d outside of basic blocks has non-NULL bb field",
2194
                 INSN_UID (x));
2195
          err = 1;
2196
        }
2197
    }
2198
  free (bb_info);
2199
 
2200
  num_bb_notes = 0;
2201
  last_bb_seen = ENTRY_BLOCK_PTR;
2202
 
2203
  for (x = rtx_first; x; x = NEXT_INSN (x))
2204
    {
2205
      if (NOTE_INSN_BASIC_BLOCK_P (x))
2206
        {
2207
          bb = NOTE_BASIC_BLOCK (x);
2208
 
2209
          num_bb_notes++;
2210
          if (bb != last_bb_seen->next_bb)
2211
            internal_error ("basic blocks not laid down consecutively");
2212
 
2213
          curr_bb = last_bb_seen = bb;
2214
        }
2215
 
2216
      if (!curr_bb)
2217
        {
2218
          switch (GET_CODE (x))
2219
            {
2220
            case BARRIER:
2221
            case NOTE:
2222
              break;
2223
 
2224
            case CODE_LABEL:
2225
              /* An addr_vec is placed outside any basic block.  */
2226
              if (NEXT_INSN (x)
2227
                  && JUMP_TABLE_DATA_P (NEXT_INSN (x)))
2228
                x = NEXT_INSN (x);
2229
 
2230
              /* But in any case, non-deletable labels can appear anywhere.  */
2231
              break;
2232
 
2233
            default:
2234
              fatal_insn ("insn outside basic block", x);
2235
            }
2236
        }
2237
 
2238
      if (JUMP_P (x)
2239
          && returnjump_p (x) && ! condjump_p (x)
2240
          && ! (next_nonnote_insn (x) && BARRIER_P (next_nonnote_insn (x))))
2241
            fatal_insn ("return not followed by barrier", x);
2242
      if (curr_bb && x == BB_END (curr_bb))
2243
        curr_bb = NULL;
2244
    }
2245
 
2246
  if (num_bb_notes != n_basic_blocks - NUM_FIXED_BLOCKS)
2247
    internal_error
2248
      ("number of bb notes in insn chain (%d) != n_basic_blocks (%d)",
2249
       num_bb_notes, n_basic_blocks);
2250
 
2251
   return err;
2252
}
2253
 
2254
/* Assume that the preceding pass has possibly eliminated jump instructions
2255
   or converted the unconditional jumps.  Eliminate the edges from CFG.
2256
   Return true if any edges are eliminated.  */
2257
 
2258
bool
2259
purge_dead_edges (basic_block bb)
2260
{
2261
  edge e;
2262
  rtx insn = BB_END (bb), note;
2263
  bool purged = false;
2264
  bool found;
2265
  edge_iterator ei;
2266
 
2267
  if (DEBUG_INSN_P (insn) && insn != BB_HEAD (bb))
2268
    do
2269
      insn = PREV_INSN (insn);
2270
    while ((DEBUG_INSN_P (insn) || NOTE_P (insn)) && insn != BB_HEAD (bb));
2271
 
2272
  /* If this instruction cannot trap, remove REG_EH_REGION notes.  */
2273
  if (NONJUMP_INSN_P (insn)
2274
      && (note = find_reg_note (insn, REG_EH_REGION, NULL)))
2275
    {
2276
      rtx eqnote;
2277
 
2278
      if (! may_trap_p (PATTERN (insn))
2279
          || ((eqnote = find_reg_equal_equiv_note (insn))
2280
              && ! may_trap_p (XEXP (eqnote, 0))))
2281
        remove_note (insn, note);
2282
    }
2283
 
2284
  /* Cleanup abnormal edges caused by exceptions or non-local gotos.  */
2285
  for (ei = ei_start (bb->succs); (e = ei_safe_edge (ei)); )
2286
    {
2287
      bool remove = false;
2288
 
2289
      /* There are three types of edges we need to handle correctly here: EH
2290
         edges, abnormal call EH edges, and abnormal call non-EH edges.  The
2291
         latter can appear when nonlocal gotos are used.  */
2292
      if (e->flags & EDGE_ABNORMAL_CALL)
2293
        {
2294
          if (!CALL_P (insn))
2295
            remove = true;
2296
          else if (can_nonlocal_goto (insn))
2297
            ;
2298
          else if ((e->flags & EDGE_EH) && can_throw_internal (insn))
2299
            ;
2300
          else if (flag_tm && find_reg_note (insn, REG_TM, NULL))
2301
            ;
2302
          else
2303
            remove = true;
2304
        }
2305
      else if (e->flags & EDGE_EH)
2306
        remove = !can_throw_internal (insn);
2307
 
2308
      if (remove)
2309
        {
2310
          remove_edge (e);
2311
          df_set_bb_dirty (bb);
2312
          purged = true;
2313
        }
2314
      else
2315
        ei_next (&ei);
2316
    }
2317
 
2318
  if (JUMP_P (insn))
2319
    {
2320
      rtx note;
2321
      edge b,f;
2322
      edge_iterator ei;
2323
 
2324
      /* We do care only about conditional jumps and simplejumps.  */
2325
      if (!any_condjump_p (insn)
2326
          && !returnjump_p (insn)
2327
          && !simplejump_p (insn))
2328
        return purged;
2329
 
2330
      /* Branch probability/prediction notes are defined only for
2331
         condjumps.  We've possibly turned condjump into simplejump.  */
2332
      if (simplejump_p (insn))
2333
        {
2334
          note = find_reg_note (insn, REG_BR_PROB, NULL);
2335
          if (note)
2336
            remove_note (insn, note);
2337
          while ((note = find_reg_note (insn, REG_BR_PRED, NULL)))
2338
            remove_note (insn, note);
2339
        }
2340
 
2341
      for (ei = ei_start (bb->succs); (e = ei_safe_edge (ei)); )
2342
        {
2343
          /* Avoid abnormal flags to leak from computed jumps turned
2344
             into simplejumps.  */
2345
 
2346
          e->flags &= ~EDGE_ABNORMAL;
2347
 
2348
          /* See if this edge is one we should keep.  */
2349
          if ((e->flags & EDGE_FALLTHRU) && any_condjump_p (insn))
2350
            /* A conditional jump can fall through into the next
2351
               block, so we should keep the edge.  */
2352
            {
2353
              ei_next (&ei);
2354
              continue;
2355
            }
2356
          else if (e->dest != EXIT_BLOCK_PTR
2357
                   && BB_HEAD (e->dest) == JUMP_LABEL (insn))
2358
            /* If the destination block is the target of the jump,
2359
               keep the edge.  */
2360
            {
2361
              ei_next (&ei);
2362
              continue;
2363
            }
2364
          else if (e->dest == EXIT_BLOCK_PTR && returnjump_p (insn))
2365
            /* If the destination block is the exit block, and this
2366
               instruction is a return, then keep the edge.  */
2367
            {
2368
              ei_next (&ei);
2369
              continue;
2370
            }
2371
          else if ((e->flags & EDGE_EH) && can_throw_internal (insn))
2372
            /* Keep the edges that correspond to exceptions thrown by
2373
               this instruction and rematerialize the EDGE_ABNORMAL
2374
               flag we just cleared above.  */
2375
            {
2376
              e->flags |= EDGE_ABNORMAL;
2377
              ei_next (&ei);
2378
              continue;
2379
            }
2380
 
2381
          /* We do not need this edge.  */
2382
          df_set_bb_dirty (bb);
2383
          purged = true;
2384
          remove_edge (e);
2385
        }
2386
 
2387
      if (EDGE_COUNT (bb->succs) == 0 || !purged)
2388
        return purged;
2389
 
2390
      if (dump_file)
2391
        fprintf (dump_file, "Purged edges from bb %i\n", bb->index);
2392
 
2393
      if (!optimize)
2394
        return purged;
2395
 
2396
      /* Redistribute probabilities.  */
2397
      if (single_succ_p (bb))
2398
        {
2399
          single_succ_edge (bb)->probability = REG_BR_PROB_BASE;
2400
          single_succ_edge (bb)->count = bb->count;
2401
        }
2402
      else
2403
        {
2404
          note = find_reg_note (insn, REG_BR_PROB, NULL);
2405
          if (!note)
2406
            return purged;
2407
 
2408
          b = BRANCH_EDGE (bb);
2409
          f = FALLTHRU_EDGE (bb);
2410
          b->probability = INTVAL (XEXP (note, 0));
2411
          f->probability = REG_BR_PROB_BASE - b->probability;
2412
          b->count = bb->count * b->probability / REG_BR_PROB_BASE;
2413
          f->count = bb->count * f->probability / REG_BR_PROB_BASE;
2414
        }
2415
 
2416
      return purged;
2417
    }
2418
  else if (CALL_P (insn) && SIBLING_CALL_P (insn))
2419
    {
2420
      /* First, there should not be any EH or ABCALL edges resulting
2421
         from non-local gotos and the like.  If there were, we shouldn't
2422
         have created the sibcall in the first place.  Second, there
2423
         should of course never have been a fallthru edge.  */
2424
      gcc_assert (single_succ_p (bb));
2425
      gcc_assert (single_succ_edge (bb)->flags
2426
                  == (EDGE_SIBCALL | EDGE_ABNORMAL));
2427
 
2428
      return 0;
2429
    }
2430
 
2431
  /* If we don't see a jump insn, we don't know exactly why the block would
2432
     have been broken at this point.  Look for a simple, non-fallthru edge,
2433
     as these are only created by conditional branches.  If we find such an
2434
     edge we know that there used to be a jump here and can then safely
2435
     remove all non-fallthru edges.  */
2436
  found = false;
2437
  FOR_EACH_EDGE (e, ei, bb->succs)
2438
    if (! (e->flags & (EDGE_COMPLEX | EDGE_FALLTHRU)))
2439
      {
2440
        found = true;
2441
        break;
2442
      }
2443
 
2444
  if (!found)
2445
    return purged;
2446
 
2447
  /* Remove all but the fake and fallthru edges.  The fake edge may be
2448
     the only successor for this block in the case of noreturn
2449
     calls.  */
2450
  for (ei = ei_start (bb->succs); (e = ei_safe_edge (ei)); )
2451
    {
2452
      if (!(e->flags & (EDGE_FALLTHRU | EDGE_FAKE)))
2453
        {
2454
          df_set_bb_dirty (bb);
2455
          remove_edge (e);
2456
          purged = true;
2457
        }
2458
      else
2459
        ei_next (&ei);
2460
    }
2461
 
2462
  gcc_assert (single_succ_p (bb));
2463
 
2464
  single_succ_edge (bb)->probability = REG_BR_PROB_BASE;
2465
  single_succ_edge (bb)->count = bb->count;
2466
 
2467
  if (dump_file)
2468
    fprintf (dump_file, "Purged non-fallthru edges from bb %i\n",
2469
             bb->index);
2470
  return purged;
2471
}
2472
 
2473
/* Search all basic blocks for potentially dead edges and purge them.  Return
2474
   true if some edge has been eliminated.  */
2475
 
2476
bool
2477
purge_all_dead_edges (void)
2478
{
2479
  int purged = false;
2480
  basic_block bb;
2481
 
2482
  FOR_EACH_BB (bb)
2483
    {
2484
      bool purged_here = purge_dead_edges (bb);
2485
 
2486
      purged |= purged_here;
2487
    }
2488
 
2489
  return purged;
2490
}
2491
 
2492
/* This is used by a few passes that emit some instructions after abnormal
2493
   calls, moving the basic block's end, while they in fact do want to emit
2494
   them on the fallthru edge.  Look for abnormal call edges, find backward
2495
   the call in the block and insert the instructions on the edge instead.
2496
 
2497
   Similarly, handle instructions throwing exceptions internally.
2498
 
2499
   Return true when instructions have been found and inserted on edges.  */
2500
 
2501
bool
2502
fixup_abnormal_edges (void)
2503
{
2504
  bool inserted = false;
2505
  basic_block bb;
2506
 
2507
  FOR_EACH_BB (bb)
2508
    {
2509
      edge e;
2510
      edge_iterator ei;
2511
 
2512
      /* Look for cases we are interested in - calls or instructions causing
2513
         exceptions.  */
2514
      FOR_EACH_EDGE (e, ei, bb->succs)
2515
        if ((e->flags & EDGE_ABNORMAL_CALL)
2516
            || ((e->flags & (EDGE_ABNORMAL | EDGE_EH))
2517
                == (EDGE_ABNORMAL | EDGE_EH)))
2518
          break;
2519
 
2520
      if (e && !CALL_P (BB_END (bb)) && !can_throw_internal (BB_END (bb)))
2521
        {
2522
          rtx insn;
2523
 
2524
          /* Get past the new insns generated.  Allow notes, as the insns
2525
             may be already deleted.  */
2526
          insn = BB_END (bb);
2527
          while ((NONJUMP_INSN_P (insn) || NOTE_P (insn))
2528
                 && !can_throw_internal (insn)
2529
                 && insn != BB_HEAD (bb))
2530
            insn = PREV_INSN (insn);
2531
 
2532
          if (CALL_P (insn) || can_throw_internal (insn))
2533
            {
2534
              rtx stop, next;
2535
 
2536
              e = find_fallthru_edge (bb->succs);
2537
 
2538
              stop = NEXT_INSN (BB_END (bb));
2539
              BB_END (bb) = insn;
2540
 
2541
              for (insn = NEXT_INSN (insn); insn != stop; insn = next)
2542
                {
2543
                  next = NEXT_INSN (insn);
2544
                  if (INSN_P (insn))
2545
                    {
2546
                      delete_insn (insn);
2547
 
2548
                      /* Sometimes there's still the return value USE.
2549
                         If it's placed after a trapping call (i.e. that
2550
                         call is the last insn anyway), we have no fallthru
2551
                         edge.  Simply delete this use and don't try to insert
2552
                         on the non-existent edge.  */
2553
                      if (GET_CODE (PATTERN (insn)) != USE)
2554
                        {
2555
                          /* We're not deleting it, we're moving it.  */
2556
                          INSN_DELETED_P (insn) = 0;
2557
                          PREV_INSN (insn) = NULL_RTX;
2558
                          NEXT_INSN (insn) = NULL_RTX;
2559
 
2560
                          insert_insn_on_edge (insn, e);
2561
                          inserted = true;
2562
                        }
2563
                    }
2564
                  else if (!BARRIER_P (insn))
2565
                    set_block_for_insn (insn, NULL);
2566
                }
2567
            }
2568
 
2569
          /* It may be that we don't find any trapping insn.  In this
2570
             case we discovered quite late that the insn that had been
2571
             marked as can_throw_internal in fact couldn't trap at all.
2572
             So we should in fact delete the EH edges out of the block.  */
2573
          else
2574
            purge_dead_edges (bb);
2575
        }
2576
    }
2577
 
2578
  return inserted;
2579
}
2580
 
2581
/* Same as split_block but update cfg_layout structures.  */
2582
 
2583
static basic_block
2584
cfg_layout_split_block (basic_block bb, void *insnp)
2585
{
2586
  rtx insn = (rtx) insnp;
2587
  basic_block new_bb = rtl_split_block (bb, insn);
2588
 
2589
  new_bb->il.rtl->footer = bb->il.rtl->footer;
2590
  bb->il.rtl->footer = NULL;
2591
 
2592
  return new_bb;
2593
}
2594
 
2595
/* Redirect Edge to DEST.  */
2596
static edge
2597
cfg_layout_redirect_edge_and_branch (edge e, basic_block dest)
2598
{
2599
  basic_block src = e->src;
2600
  edge ret;
2601
 
2602
  if (e->flags & (EDGE_ABNORMAL_CALL | EDGE_EH))
2603
    return NULL;
2604
 
2605
  if (e->dest == dest)
2606
    return e;
2607
 
2608
  if (e->src != ENTRY_BLOCK_PTR
2609
      && (ret = try_redirect_by_replacing_jump (e, dest, true)))
2610
    {
2611
      df_set_bb_dirty (src);
2612
      return ret;
2613
    }
2614
 
2615
  if (e->src == ENTRY_BLOCK_PTR
2616
      && (e->flags & EDGE_FALLTHRU) && !(e->flags & EDGE_COMPLEX))
2617
    {
2618
      if (dump_file)
2619
        fprintf (dump_file, "Redirecting entry edge from bb %i to %i\n",
2620
                 e->src->index, dest->index);
2621
 
2622
      df_set_bb_dirty (e->src);
2623
      redirect_edge_succ (e, dest);
2624
      return e;
2625
    }
2626
 
2627
  /* Redirect_edge_and_branch may decide to turn branch into fallthru edge
2628
     in the case the basic block appears to be in sequence.  Avoid this
2629
     transformation.  */
2630
 
2631
  if (e->flags & EDGE_FALLTHRU)
2632
    {
2633
      /* Redirect any branch edges unified with the fallthru one.  */
2634
      if (JUMP_P (BB_END (src))
2635
          && label_is_jump_target_p (BB_HEAD (e->dest),
2636
                                     BB_END (src)))
2637
        {
2638
          edge redirected;
2639
 
2640
          if (dump_file)
2641
            fprintf (dump_file, "Fallthru edge unified with branch "
2642
                     "%i->%i redirected to %i\n",
2643
                     e->src->index, e->dest->index, dest->index);
2644
          e->flags &= ~EDGE_FALLTHRU;
2645
          redirected = redirect_branch_edge (e, dest);
2646
          gcc_assert (redirected);
2647
          redirected->flags |= EDGE_FALLTHRU;
2648
          df_set_bb_dirty (redirected->src);
2649
          return redirected;
2650
        }
2651
      /* In case we are redirecting fallthru edge to the branch edge
2652
         of conditional jump, remove it.  */
2653
      if (EDGE_COUNT (src->succs) == 2)
2654
        {
2655
          /* Find the edge that is different from E.  */
2656
          edge s = EDGE_SUCC (src, EDGE_SUCC (src, 0) == e);
2657
 
2658
          if (s->dest == dest
2659
              && any_condjump_p (BB_END (src))
2660
              && onlyjump_p (BB_END (src)))
2661
            delete_insn (BB_END (src));
2662
        }
2663
      if (dump_file)
2664
        fprintf (dump_file, "Redirecting fallthru edge %i->%i to %i\n",
2665
                 e->src->index, e->dest->index, dest->index);
2666
      ret = redirect_edge_succ_nodup (e, dest);
2667
    }
2668
  else
2669
    ret = redirect_branch_edge (e, dest);
2670
 
2671
  /* We don't want simplejumps in the insn stream during cfglayout.  */
2672
  gcc_assert (!simplejump_p (BB_END (src)));
2673
 
2674
  df_set_bb_dirty (src);
2675
  return ret;
2676
}
2677
 
2678
/* Simple wrapper as we always can redirect fallthru edges.  */
2679
static basic_block
2680
cfg_layout_redirect_edge_and_branch_force (edge e, basic_block dest)
2681
{
2682
  edge redirected = cfg_layout_redirect_edge_and_branch (e, dest);
2683
 
2684
  gcc_assert (redirected);
2685
  return NULL;
2686
}
2687
 
2688
/* Same as delete_basic_block but update cfg_layout structures.  */
2689
 
2690
static void
2691
cfg_layout_delete_block (basic_block bb)
2692
{
2693
  rtx insn, next, prev = PREV_INSN (BB_HEAD (bb)), *to, remaints;
2694
 
2695
  if (bb->il.rtl->header)
2696
    {
2697
      next = BB_HEAD (bb);
2698
      if (prev)
2699
        NEXT_INSN (prev) = bb->il.rtl->header;
2700
      else
2701
        set_first_insn (bb->il.rtl->header);
2702
      PREV_INSN (bb->il.rtl->header) = prev;
2703
      insn = bb->il.rtl->header;
2704
      while (NEXT_INSN (insn))
2705
        insn = NEXT_INSN (insn);
2706
      NEXT_INSN (insn) = next;
2707
      PREV_INSN (next) = insn;
2708
    }
2709
  next = NEXT_INSN (BB_END (bb));
2710
  if (bb->il.rtl->footer)
2711
    {
2712
      insn = bb->il.rtl->footer;
2713
      while (insn)
2714
        {
2715
          if (BARRIER_P (insn))
2716
            {
2717
              if (PREV_INSN (insn))
2718
                NEXT_INSN (PREV_INSN (insn)) = NEXT_INSN (insn);
2719
              else
2720
                bb->il.rtl->footer = NEXT_INSN (insn);
2721
              if (NEXT_INSN (insn))
2722
                PREV_INSN (NEXT_INSN (insn)) = PREV_INSN (insn);
2723
            }
2724
          if (LABEL_P (insn))
2725
            break;
2726
          insn = NEXT_INSN (insn);
2727
        }
2728
      if (bb->il.rtl->footer)
2729
        {
2730
          insn = BB_END (bb);
2731
          NEXT_INSN (insn) = bb->il.rtl->footer;
2732
          PREV_INSN (bb->il.rtl->footer) = insn;
2733
          while (NEXT_INSN (insn))
2734
            insn = NEXT_INSN (insn);
2735
          NEXT_INSN (insn) = next;
2736
          if (next)
2737
            PREV_INSN (next) = insn;
2738
          else
2739
            set_last_insn (insn);
2740
        }
2741
    }
2742
  if (bb->next_bb != EXIT_BLOCK_PTR)
2743
    to = &bb->next_bb->il.rtl->header;
2744
  else
2745
    to = &cfg_layout_function_footer;
2746
 
2747
  rtl_delete_block (bb);
2748
 
2749
  if (prev)
2750
    prev = NEXT_INSN (prev);
2751
  else
2752
    prev = get_insns ();
2753
  if (next)
2754
    next = PREV_INSN (next);
2755
  else
2756
    next = get_last_insn ();
2757
 
2758
  if (next && NEXT_INSN (next) != prev)
2759
    {
2760
      remaints = unlink_insn_chain (prev, next);
2761
      insn = remaints;
2762
      while (NEXT_INSN (insn))
2763
        insn = NEXT_INSN (insn);
2764
      NEXT_INSN (insn) = *to;
2765
      if (*to)
2766
        PREV_INSN (*to) = insn;
2767
      *to = remaints;
2768
    }
2769
}
2770
 
2771
/* Return true when blocks A and B can be safely merged.  */
2772
 
2773
static bool
2774
cfg_layout_can_merge_blocks_p (basic_block a, basic_block b)
2775
{
2776
  /* If we are partitioning hot/cold basic blocks, we don't want to
2777
     mess up unconditional or indirect jumps that cross between hot
2778
     and cold sections.
2779
 
2780
     Basic block partitioning may result in some jumps that appear to
2781
     be optimizable (or blocks that appear to be mergeable), but which really
2782
     must be left untouched (they are required to make it safely across
2783
     partition boundaries).  See  the comments at the top of
2784
     bb-reorder.c:partition_hot_cold_basic_blocks for complete details.  */
2785
 
2786
  if (BB_PARTITION (a) != BB_PARTITION (b))
2787
    return false;
2788
 
2789
  /* If we would end up moving B's instructions, make sure it doesn't fall
2790
     through into the exit block, since we cannot recover from a fallthrough
2791
     edge into the exit block occurring in the middle of a function.  */
2792
  if (NEXT_INSN (BB_END (a)) != BB_HEAD (b))
2793
    {
2794
      edge e = find_fallthru_edge (b->succs);
2795
      if (e && e->dest == EXIT_BLOCK_PTR)
2796
        return false;
2797
    }
2798
 
2799
  /* There must be exactly one edge in between the blocks.  */
2800
  return (single_succ_p (a)
2801
          && single_succ (a) == b
2802
          && single_pred_p (b) == 1
2803
          && a != b
2804
          /* Must be simple edge.  */
2805
          && !(single_succ_edge (a)->flags & EDGE_COMPLEX)
2806
          && a != ENTRY_BLOCK_PTR && b != EXIT_BLOCK_PTR
2807
          /* If the jump insn has side effects, we can't kill the edge.
2808
             When not optimizing, try_redirect_by_replacing_jump will
2809
             not allow us to redirect an edge by replacing a table jump.  */
2810
          && (!JUMP_P (BB_END (a))
2811
              || ((!optimize || reload_completed)
2812
                  ? simplejump_p (BB_END (a)) : onlyjump_p (BB_END (a)))));
2813
}
2814
 
2815
/* Merge block A and B.  The blocks must be mergeable.  */
2816
 
2817
static void
2818
cfg_layout_merge_blocks (basic_block a, basic_block b)
2819
{
2820
  bool forwarder_p = (b->flags & BB_FORWARDER_BLOCK) != 0;
2821
 
2822
  gcc_checking_assert (cfg_layout_can_merge_blocks_p (a, b));
2823
 
2824
  if (dump_file)
2825
    fprintf (dump_file, "Merging block %d into block %d...\n", b->index,
2826
                         a->index);
2827
 
2828
  /* If there was a CODE_LABEL beginning B, delete it.  */
2829
  if (LABEL_P (BB_HEAD (b)))
2830
    {
2831
      delete_insn (BB_HEAD (b));
2832
    }
2833
 
2834
  /* We should have fallthru edge in a, or we can do dummy redirection to get
2835
     it cleaned up.  */
2836
  if (JUMP_P (BB_END (a)))
2837
    try_redirect_by_replacing_jump (EDGE_SUCC (a, 0), b, true);
2838
  gcc_assert (!JUMP_P (BB_END (a)));
2839
 
2840
  /* When not optimizing and the edge is the only place in RTL which holds
2841
     some unique locus, emit a nop with that locus in between.  */
2842
  if (!optimize && EDGE_SUCC (a, 0)->goto_locus)
2843
    {
2844
      rtx insn = BB_END (a), end = PREV_INSN (BB_HEAD (a));
2845
      int goto_locus = EDGE_SUCC (a, 0)->goto_locus;
2846
 
2847
      while (insn != end && (!INSN_P (insn) || INSN_LOCATOR (insn) == 0))
2848
        insn = PREV_INSN (insn);
2849
      if (insn != end && locator_eq (INSN_LOCATOR (insn), goto_locus))
2850
        goto_locus = 0;
2851
      else
2852
        {
2853
          insn = BB_HEAD (b);
2854
          end = NEXT_INSN (BB_END (b));
2855
          while (insn != end && !INSN_P (insn))
2856
            insn = NEXT_INSN (insn);
2857
          if (insn != end && INSN_LOCATOR (insn) != 0
2858
              && locator_eq (INSN_LOCATOR (insn), goto_locus))
2859
            goto_locus = 0;
2860
        }
2861
      if (goto_locus)
2862
        {
2863
          BB_END (a) = emit_insn_after_noloc (gen_nop (), BB_END (a), a);
2864
          INSN_LOCATOR (BB_END (a)) = goto_locus;
2865
        }
2866
    }
2867
 
2868
  /* Possible line number notes should appear in between.  */
2869
  if (b->il.rtl->header)
2870
    {
2871
      rtx first = BB_END (a), last;
2872
 
2873
      last = emit_insn_after_noloc (b->il.rtl->header, BB_END (a), a);
2874
      /* The above might add a BARRIER as BB_END, but as barriers
2875
         aren't valid parts of a bb, remove_insn doesn't update
2876
         BB_END if it is a barrier.  So adjust BB_END here.  */
2877
      while (BB_END (a) != first && BARRIER_P (BB_END (a)))
2878
        BB_END (a) = PREV_INSN (BB_END (a));
2879
      delete_insn_chain (NEXT_INSN (first), last, false);
2880
      b->il.rtl->header = NULL;
2881
    }
2882
 
2883
  /* In the case basic blocks are not adjacent, move them around.  */
2884
  if (NEXT_INSN (BB_END (a)) != BB_HEAD (b))
2885
    {
2886
      rtx first = unlink_insn_chain (BB_HEAD (b), BB_END (b));
2887
 
2888
      emit_insn_after_noloc (first, BB_END (a), a);
2889
      /* Skip possible DELETED_LABEL insn.  */
2890
      if (!NOTE_INSN_BASIC_BLOCK_P (first))
2891
        first = NEXT_INSN (first);
2892
      gcc_assert (NOTE_INSN_BASIC_BLOCK_P (first));
2893
      BB_HEAD (b) = NULL;
2894
 
2895
      /* emit_insn_after_noloc doesn't call df_insn_change_bb.
2896
         We need to explicitly call. */
2897
      update_bb_for_insn_chain (NEXT_INSN (first),
2898
                                BB_END (b),
2899
                                a);
2900
 
2901
      delete_insn (first);
2902
    }
2903
  /* Otherwise just re-associate the instructions.  */
2904
  else
2905
    {
2906
      rtx insn;
2907
 
2908
      update_bb_for_insn_chain (BB_HEAD (b), BB_END (b), a);
2909
 
2910
      insn = BB_HEAD (b);
2911
      /* Skip possible DELETED_LABEL insn.  */
2912
      if (!NOTE_INSN_BASIC_BLOCK_P (insn))
2913
        insn = NEXT_INSN (insn);
2914
      gcc_assert (NOTE_INSN_BASIC_BLOCK_P (insn));
2915
      BB_HEAD (b) = NULL;
2916
      BB_END (a) = BB_END (b);
2917
      delete_insn (insn);
2918
    }
2919
 
2920
  df_bb_delete (b->index);
2921
 
2922
  /* Possible tablejumps and barriers should appear after the block.  */
2923
  if (b->il.rtl->footer)
2924
    {
2925
      if (!a->il.rtl->footer)
2926
        a->il.rtl->footer = b->il.rtl->footer;
2927
      else
2928
        {
2929
          rtx last = a->il.rtl->footer;
2930
 
2931
          while (NEXT_INSN (last))
2932
            last = NEXT_INSN (last);
2933
          NEXT_INSN (last) = b->il.rtl->footer;
2934
          PREV_INSN (b->il.rtl->footer) = last;
2935
        }
2936
      b->il.rtl->footer = NULL;
2937
    }
2938
 
2939
  /* If B was a forwarder block, propagate the locus on the edge.  */
2940
  if (forwarder_p && !EDGE_SUCC (b, 0)->goto_locus)
2941
    EDGE_SUCC (b, 0)->goto_locus = EDGE_SUCC (a, 0)->goto_locus;
2942
 
2943
  if (dump_file)
2944
    fprintf (dump_file, "Merged blocks %d and %d.\n", a->index, b->index);
2945
}
2946
 
2947
/* Split edge E.  */
2948
 
2949
static basic_block
2950
cfg_layout_split_edge (edge e)
2951
{
2952
  basic_block new_bb =
2953
    create_basic_block (e->src != ENTRY_BLOCK_PTR
2954
                        ? NEXT_INSN (BB_END (e->src)) : get_insns (),
2955
                        NULL_RTX, e->src);
2956
 
2957
  if (e->dest == EXIT_BLOCK_PTR)
2958
    BB_COPY_PARTITION (new_bb, e->src);
2959
  else
2960
    BB_COPY_PARTITION (new_bb, e->dest);
2961
  make_edge (new_bb, e->dest, EDGE_FALLTHRU);
2962
  redirect_edge_and_branch_force (e, new_bb);
2963
 
2964
  return new_bb;
2965
}
2966
 
2967
/* Do postprocessing after making a forwarder block joined by edge FALLTHRU.  */
2968
 
2969
static void
2970
rtl_make_forwarder_block (edge fallthru ATTRIBUTE_UNUSED)
2971
{
2972
}
2973
 
2974
/* Return 1 if BB ends with a call, possibly followed by some
2975
   instructions that must stay with the call, 0 otherwise.  */
2976
 
2977
static bool
2978
rtl_block_ends_with_call_p (basic_block bb)
2979
{
2980
  rtx insn = BB_END (bb);
2981
 
2982
  while (!CALL_P (insn)
2983
         && insn != BB_HEAD (bb)
2984
         && (keep_with_call_p (insn)
2985
             || NOTE_P (insn)
2986
             || DEBUG_INSN_P (insn)))
2987
    insn = PREV_INSN (insn);
2988
  return (CALL_P (insn));
2989
}
2990
 
2991
/* Return 1 if BB ends with a conditional branch, 0 otherwise.  */
2992
 
2993
static bool
2994
rtl_block_ends_with_condjump_p (const_basic_block bb)
2995
{
2996
  return any_condjump_p (BB_END (bb));
2997
}
2998
 
2999
/* Return true if we need to add fake edge to exit.
3000
   Helper function for rtl_flow_call_edges_add.  */
3001
 
3002
static bool
3003
need_fake_edge_p (const_rtx insn)
3004
{
3005
  if (!INSN_P (insn))
3006
    return false;
3007
 
3008
  if ((CALL_P (insn)
3009
       && !SIBLING_CALL_P (insn)
3010
       && !find_reg_note (insn, REG_NORETURN, NULL)
3011
       && !(RTL_CONST_OR_PURE_CALL_P (insn))))
3012
    return true;
3013
 
3014
  return ((GET_CODE (PATTERN (insn)) == ASM_OPERANDS
3015
           && MEM_VOLATILE_P (PATTERN (insn)))
3016
          || (GET_CODE (PATTERN (insn)) == PARALLEL
3017
              && asm_noperands (insn) != -1
3018
              && MEM_VOLATILE_P (XVECEXP (PATTERN (insn), 0, 0)))
3019
          || GET_CODE (PATTERN (insn)) == ASM_INPUT);
3020
}
3021
 
3022
/* Add fake edges to the function exit for any non constant and non noreturn
3023
   calls, volatile inline assembly in the bitmap of blocks specified by
3024
   BLOCKS or to the whole CFG if BLOCKS is zero.  Return the number of blocks
3025
   that were split.
3026
 
3027
   The goal is to expose cases in which entering a basic block does not imply
3028
   that all subsequent instructions must be executed.  */
3029
 
3030
static int
3031
rtl_flow_call_edges_add (sbitmap blocks)
3032
{
3033
  int i;
3034
  int blocks_split = 0;
3035
  int last_bb = last_basic_block;
3036
  bool check_last_block = false;
3037
 
3038
  if (n_basic_blocks == NUM_FIXED_BLOCKS)
3039
    return 0;
3040
 
3041
  if (! blocks)
3042
    check_last_block = true;
3043
  else
3044
    check_last_block = TEST_BIT (blocks, EXIT_BLOCK_PTR->prev_bb->index);
3045
 
3046
  /* In the last basic block, before epilogue generation, there will be
3047
     a fallthru edge to EXIT.  Special care is required if the last insn
3048
     of the last basic block is a call because make_edge folds duplicate
3049
     edges, which would result in the fallthru edge also being marked
3050
     fake, which would result in the fallthru edge being removed by
3051
     remove_fake_edges, which would result in an invalid CFG.
3052
 
3053
     Moreover, we can't elide the outgoing fake edge, since the block
3054
     profiler needs to take this into account in order to solve the minimal
3055
     spanning tree in the case that the call doesn't return.
3056
 
3057
     Handle this by adding a dummy instruction in a new last basic block.  */
3058
  if (check_last_block)
3059
    {
3060
      basic_block bb = EXIT_BLOCK_PTR->prev_bb;
3061
      rtx insn = BB_END (bb);
3062
 
3063
      /* Back up past insns that must be kept in the same block as a call.  */
3064
      while (insn != BB_HEAD (bb)
3065
             && keep_with_call_p (insn))
3066
        insn = PREV_INSN (insn);
3067
 
3068
      if (need_fake_edge_p (insn))
3069
        {
3070
          edge e;
3071
 
3072
          e = find_edge (bb, EXIT_BLOCK_PTR);
3073
          if (e)
3074
            {
3075
              insert_insn_on_edge (gen_use (const0_rtx), e);
3076
              commit_edge_insertions ();
3077
            }
3078
        }
3079
    }
3080
 
3081
  /* Now add fake edges to the function exit for any non constant
3082
     calls since there is no way that we can determine if they will
3083
     return or not...  */
3084
 
3085
  for (i = NUM_FIXED_BLOCKS; i < last_bb; i++)
3086
    {
3087
      basic_block bb = BASIC_BLOCK (i);
3088
      rtx insn;
3089
      rtx prev_insn;
3090
 
3091
      if (!bb)
3092
        continue;
3093
 
3094
      if (blocks && !TEST_BIT (blocks, i))
3095
        continue;
3096
 
3097
      for (insn = BB_END (bb); ; insn = prev_insn)
3098
        {
3099
          prev_insn = PREV_INSN (insn);
3100
          if (need_fake_edge_p (insn))
3101
            {
3102
              edge e;
3103
              rtx split_at_insn = insn;
3104
 
3105
              /* Don't split the block between a call and an insn that should
3106
                 remain in the same block as the call.  */
3107
              if (CALL_P (insn))
3108
                while (split_at_insn != BB_END (bb)
3109
                       && keep_with_call_p (NEXT_INSN (split_at_insn)))
3110
                  split_at_insn = NEXT_INSN (split_at_insn);
3111
 
3112
              /* The handling above of the final block before the epilogue
3113
                 should be enough to verify that there is no edge to the exit
3114
                 block in CFG already.  Calling make_edge in such case would
3115
                 cause us to mark that edge as fake and remove it later.  */
3116
 
3117
#ifdef ENABLE_CHECKING
3118
              if (split_at_insn == BB_END (bb))
3119
                {
3120
                  e = find_edge (bb, EXIT_BLOCK_PTR);
3121
                  gcc_assert (e == NULL);
3122
                }
3123
#endif
3124
 
3125
              /* Note that the following may create a new basic block
3126
                 and renumber the existing basic blocks.  */
3127
              if (split_at_insn != BB_END (bb))
3128
                {
3129
                  e = split_block (bb, split_at_insn);
3130
                  if (e)
3131
                    blocks_split++;
3132
                }
3133
 
3134
              make_edge (bb, EXIT_BLOCK_PTR, EDGE_FAKE);
3135
            }
3136
 
3137
          if (insn == BB_HEAD (bb))
3138
            break;
3139
        }
3140
    }
3141
 
3142
  if (blocks_split)
3143
    verify_flow_info ();
3144
 
3145
  return blocks_split;
3146
}
3147
 
3148
/* Add COMP_RTX as a condition at end of COND_BB.  FIRST_HEAD is
3149
   the conditional branch target, SECOND_HEAD should be the fall-thru
3150
   there is no need to handle this here the loop versioning code handles
3151
   this.  the reason for SECON_HEAD is that it is needed for condition
3152
   in trees, and this should be of the same type since it is a hook.  */
3153
static void
3154
rtl_lv_add_condition_to_bb (basic_block first_head ,
3155
                            basic_block second_head ATTRIBUTE_UNUSED,
3156
                            basic_block cond_bb, void *comp_rtx)
3157
{
3158
  rtx label, seq, jump;
3159
  rtx op0 = XEXP ((rtx)comp_rtx, 0);
3160
  rtx op1 = XEXP ((rtx)comp_rtx, 1);
3161
  enum rtx_code comp = GET_CODE ((rtx)comp_rtx);
3162
  enum machine_mode mode;
3163
 
3164
 
3165
  label = block_label (first_head);
3166
  mode = GET_MODE (op0);
3167
  if (mode == VOIDmode)
3168
    mode = GET_MODE (op1);
3169
 
3170
  start_sequence ();
3171
  op0 = force_operand (op0, NULL_RTX);
3172
  op1 = force_operand (op1, NULL_RTX);
3173
  do_compare_rtx_and_jump (op0, op1, comp, 0,
3174
                           mode, NULL_RTX, NULL_RTX, label, -1);
3175
  jump = get_last_insn ();
3176
  JUMP_LABEL (jump) = label;
3177
  LABEL_NUSES (label)++;
3178
  seq = get_insns ();
3179
  end_sequence ();
3180
 
3181
  /* Add the new cond , in the new head.  */
3182
  emit_insn_after(seq, BB_END(cond_bb));
3183
}
3184
 
3185
 
3186
/* Given a block B with unconditional branch at its end, get the
3187
   store the return the branch edge and the fall-thru edge in
3188
   BRANCH_EDGE and FALLTHRU_EDGE respectively.  */
3189
static void
3190
rtl_extract_cond_bb_edges (basic_block b, edge *branch_edge,
3191
                           edge *fallthru_edge)
3192
{
3193
  edge e = EDGE_SUCC (b, 0);
3194
 
3195
  if (e->flags & EDGE_FALLTHRU)
3196
    {
3197
      *fallthru_edge = e;
3198
      *branch_edge = EDGE_SUCC (b, 1);
3199
    }
3200
  else
3201
    {
3202
      *branch_edge = e;
3203
      *fallthru_edge = EDGE_SUCC (b, 1);
3204
    }
3205
}
3206
 
3207
void
3208
init_rtl_bb_info (basic_block bb)
3209
{
3210
  gcc_assert (!bb->il.rtl);
3211
  bb->il.rtl = ggc_alloc_cleared_rtl_bb_info ();
3212
}
3213
 
3214
/* Returns true if it is possible to remove edge E by redirecting
3215
   it to the destination of the other edge from E->src.  */
3216
 
3217
static bool
3218
rtl_can_remove_branch_p (const_edge e)
3219
{
3220
  const_basic_block src = e->src;
3221
  const_basic_block target = EDGE_SUCC (src, EDGE_SUCC (src, 0) == e)->dest;
3222
  const_rtx insn = BB_END (src), set;
3223
 
3224
  /* The conditions are taken from try_redirect_by_replacing_jump.  */
3225
  if (target == EXIT_BLOCK_PTR)
3226
    return false;
3227
 
3228
  if (e->flags & (EDGE_ABNORMAL_CALL | EDGE_EH))
3229
    return false;
3230
 
3231
  if (find_reg_note (insn, REG_CROSSING_JUMP, NULL_RTX)
3232
      || BB_PARTITION (src) != BB_PARTITION (target))
3233
    return false;
3234
 
3235
  if (!onlyjump_p (insn)
3236
      || tablejump_p (insn, NULL, NULL))
3237
    return false;
3238
 
3239
  set = single_set (insn);
3240
  if (!set || side_effects_p (set))
3241
    return false;
3242
 
3243
  return true;
3244
}
3245
 
3246
/* We do not want to declare these functions in a header file, since they
3247
   should only be used through the cfghooks interface, and we do not want to
3248
   move them here since it would require also moving quite a lot of related
3249
   code.  They are in cfglayout.c.  */
3250
extern bool cfg_layout_can_duplicate_bb_p (const_basic_block);
3251
extern basic_block cfg_layout_duplicate_bb (basic_block);
3252
 
3253
static basic_block
3254
rtl_duplicate_bb (basic_block bb)
3255
{
3256
  bb = cfg_layout_duplicate_bb (bb);
3257
  bb->aux = NULL;
3258
  return bb;
3259
}
3260
 
3261
/* Implementation of CFG manipulation for linearized RTL.  */
3262
struct cfg_hooks rtl_cfg_hooks = {
3263
  "rtl",
3264
  rtl_verify_flow_info,
3265
  rtl_dump_bb,
3266
  rtl_create_basic_block,
3267
  rtl_redirect_edge_and_branch,
3268
  rtl_redirect_edge_and_branch_force,
3269
  rtl_can_remove_branch_p,
3270
  rtl_delete_block,
3271
  rtl_split_block,
3272
  rtl_move_block_after,
3273
  rtl_can_merge_blocks,  /* can_merge_blocks_p */
3274
  rtl_merge_blocks,
3275
  rtl_predict_edge,
3276
  rtl_predicted_by_p,
3277
  cfg_layout_can_duplicate_bb_p,
3278
  rtl_duplicate_bb,
3279
  rtl_split_edge,
3280
  rtl_make_forwarder_block,
3281
  rtl_tidy_fallthru_edge,
3282
  rtl_force_nonfallthru,
3283
  rtl_block_ends_with_call_p,
3284
  rtl_block_ends_with_condjump_p,
3285
  rtl_flow_call_edges_add,
3286
  NULL, /* execute_on_growing_pred */
3287
  NULL, /* execute_on_shrinking_pred */
3288
  NULL, /* duplicate loop for trees */
3289
  NULL, /* lv_add_condition_to_bb */
3290
  NULL, /* lv_adjust_loop_header_phi*/
3291
  NULL, /* extract_cond_bb_edges */
3292
  NULL          /* flush_pending_stmts */
3293
};
3294
 
3295
/* Implementation of CFG manipulation for cfg layout RTL, where
3296
   basic block connected via fallthru edges does not have to be adjacent.
3297
   This representation will hopefully become the default one in future
3298
   version of the compiler.  */
3299
 
3300
struct cfg_hooks cfg_layout_rtl_cfg_hooks = {
3301
  "cfglayout mode",
3302
  rtl_verify_flow_info_1,
3303
  rtl_dump_bb,
3304
  cfg_layout_create_basic_block,
3305
  cfg_layout_redirect_edge_and_branch,
3306
  cfg_layout_redirect_edge_and_branch_force,
3307
  rtl_can_remove_branch_p,
3308
  cfg_layout_delete_block,
3309
  cfg_layout_split_block,
3310
  rtl_move_block_after,
3311
  cfg_layout_can_merge_blocks_p,
3312
  cfg_layout_merge_blocks,
3313
  rtl_predict_edge,
3314
  rtl_predicted_by_p,
3315
  cfg_layout_can_duplicate_bb_p,
3316
  cfg_layout_duplicate_bb,
3317
  cfg_layout_split_edge,
3318
  rtl_make_forwarder_block,
3319
  NULL, /* tidy_fallthru_edge */
3320
  rtl_force_nonfallthru,
3321
  rtl_block_ends_with_call_p,
3322
  rtl_block_ends_with_condjump_p,
3323
  rtl_flow_call_edges_add,
3324
  NULL, /* execute_on_growing_pred */
3325
  NULL, /* execute_on_shrinking_pred */
3326
  duplicate_loop_to_header_edge, /* duplicate loop for trees */
3327
  rtl_lv_add_condition_to_bb, /* lv_add_condition_to_bb */
3328
  NULL, /* lv_adjust_loop_header_phi*/
3329
  rtl_extract_cond_bb_edges, /* extract_cond_bb_edges */
3330
  NULL          /* flush_pending_stmts */
3331
};

powered by: WebSVN 2.1.0

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