]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/cfgrtl.c
snapshot-README: Note that snapshots come from the 3.1 branch.
[thirdparty/gcc.git] / gcc / cfgrtl.c
CommitLineData
ca6c03ca
JH
1/* Control flow graph manipulation code for GNU compiler.
2 Copyright (C) 1987, 1988, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
3 1999, 2000, 2001 Free Software Foundation, Inc.
4
5This file is part of GCC.
6
7GCC is free software; you can redistribute it and/or modify it under
8the terms of the GNU General Public License as published by the Free
9Software Foundation; either version 2, or (at your option) any later
10version.
11
12GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13WARRANTY; without even the implied warranty of MERCHANTABILITY or
14FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
15for more details.
16
17You should have received a copy of the GNU General Public License
18along with GCC; see the file COPYING. If not, write to the Free
19Software Foundation, 59 Temple Place - Suite 330, Boston, MA
2002111-1307, USA. */
21
5f0d2358
RK
22/* This file contains low level functions to manipulate the CFG and analyze it
23 that are aware of the RTL intermediate language.
ca6c03ca
JH
24
25 Available functionality:
5f0d2358 26 - CFG-aware instruction chain manipulation
ca6c03ca
JH
27 delete_insn, delete_insn_chain
28 - Basic block manipulation
5f0d2358
RK
29 create_basic_block, flow_delete_block, split_block,
30 merge_blocks_nomove
31 - Infrastructure to determine quickly basic block for insn
ca6c03ca 32 compute_bb_for_insn, update_bb_for_insn, set_block_for_insn,
5f0d2358
RK
33 - Edge redirection with updating and optimizing of insn chain
34 block_label, redirect_edge_and_branch,
35 redirect_edge_and_branch_force, tidy_fallthru_edge, force_nonfallthru
ca6c03ca 36 - Edge splitting and commiting to edges
5f0d2358 37 split_edge, insert_insn_on_edge, commit_edge_insertions
eaec9b3d 38 - Dumping and debugging
5f0d2358 39 print_rtl_with_bb, dump_bb, debug_bb, debug_bb_n
ca6c03ca 40 - Consistency checking
5f0d2358 41 verify_flow_info
ca6c03ca 42 - CFG updating after constant propagation
5f0d2358 43 purge_dead_edges, purge_all_dead_edges */
ca6c03ca
JH
44\f
45#include "config.h"
46#include "system.h"
47#include "tree.h"
48#include "rtl.h"
49#include "hard-reg-set.h"
50#include "basic-block.h"
51#include "regs.h"
52#include "flags.h"
53#include "output.h"
54#include "function.h"
55#include "except.h"
56#include "toplev.h"
57#include "tm_p.h"
58#include "obstack.h"
59
5f0d2358 60/* Stubs in case we don't have a return insn. */
ca6c03ca
JH
61#ifndef HAVE_return
62#define HAVE_return 0
63#define gen_return() NULL_RTX
64#endif
65
66/* The basic block structure for every insn, indexed by uid. */
ca6c03ca
JH
67varray_type basic_block_for_insn;
68
69/* The labels mentioned in non-jump rtl. Valid during find_basic_blocks. */
70/* ??? Should probably be using LABEL_NUSES instead. It would take a
71 bit of surgery to be able to use or co-opt the routines in jump. */
ca6c03ca
JH
72rtx label_value_list;
73rtx tail_recursion_label_list;
74
75static int can_delete_note_p PARAMS ((rtx));
76static int can_delete_label_p PARAMS ((rtx));
77static void commit_one_edge_insertion PARAMS ((edge));
78static bool try_redirect_by_replacing_jump PARAMS ((edge, basic_block));
79static rtx last_loop_beg_note PARAMS ((rtx));
80static bool back_edge_of_syntactic_loop_p PARAMS ((basic_block, basic_block));
81static basic_block force_nonfallthru_and_redirect PARAMS ((edge, basic_block));
82\f
83/* Return true if NOTE is not one of the ones that must be kept paired,
5f0d2358 84 so that we may simply delete it. */
ca6c03ca
JH
85
86static int
87can_delete_note_p (note)
88 rtx note;
89{
90 return (NOTE_LINE_NUMBER (note) == NOTE_INSN_DELETED
91 || NOTE_LINE_NUMBER (note) == NOTE_INSN_BASIC_BLOCK);
92}
93
94/* True if a given label can be deleted. */
95
96static int
97can_delete_label_p (label)
98 rtx label;
99{
5f0d2358
RK
100 return (!LABEL_PRESERVE_P (label)
101 /* User declared labels must be preserved. */
102 && LABEL_NAME (label) == 0
103 && !in_expr_list_p (forced_labels, label)
104 && !in_expr_list_p (label_value_list, label)
105 && !in_expr_list_p (exception_handler_labels, label));
ca6c03ca
JH
106}
107
108/* Delete INSN by patching it out. Return the next insn. */
109
110rtx
111delete_insn (insn)
112 rtx insn;
113{
114 rtx next = NEXT_INSN (insn);
115 rtx note;
116 bool really_delete = true;
117
118 if (GET_CODE (insn) == CODE_LABEL)
119 {
120 /* Some labels can't be directly removed from the INSN chain, as they
121 might be references via variables, constant pool etc.
122 Convert them to the special NOTE_INSN_DELETED_LABEL note. */
123 if (! can_delete_label_p (insn))
124 {
125 const char *name = LABEL_NAME (insn);
126
127 really_delete = false;
128 PUT_CODE (insn, NOTE);
129 NOTE_LINE_NUMBER (insn) = NOTE_INSN_DELETED_LABEL;
130 NOTE_SOURCE_FILE (insn) = name;
131 }
5f0d2358 132
ca6c03ca
JH
133 remove_node_from_expr_list (insn, &nonlocal_goto_handler_labels);
134 }
135
136 if (really_delete)
137 {
cda94cbb
RH
138 /* If this insn has already been deleted, something is very wrong. */
139 if (INSN_DELETED_P (insn))
140 abort ();
ca6c03ca
JH
141 remove_insn (insn);
142 INSN_DELETED_P (insn) = 1;
143 }
144
145 /* If deleting a jump, decrement the use count of the label. Deleting
146 the label itself should happen in the normal course of block merging. */
147 if (GET_CODE (insn) == JUMP_INSN
148 && JUMP_LABEL (insn)
149 && GET_CODE (JUMP_LABEL (insn)) == CODE_LABEL)
150 LABEL_NUSES (JUMP_LABEL (insn))--;
151
152 /* Also if deleting an insn that references a label. */
153 else if ((note = find_reg_note (insn, REG_LABEL, NULL_RTX)) != NULL_RTX
154 && GET_CODE (XEXP (note, 0)) == CODE_LABEL)
155 LABEL_NUSES (XEXP (note, 0))--;
156
157 if (GET_CODE (insn) == JUMP_INSN
158 && (GET_CODE (PATTERN (insn)) == ADDR_VEC
159 || GET_CODE (PATTERN (insn)) == ADDR_DIFF_VEC))
160 {
161 rtx pat = PATTERN (insn);
162 int diff_vec_p = GET_CODE (PATTERN (insn)) == ADDR_DIFF_VEC;
163 int len = XVECLEN (pat, diff_vec_p);
164 int i;
165
166 for (i = 0; i < len; i++)
a124fcda
RH
167 {
168 rtx label = XEXP (XVECEXP (pat, diff_vec_p, i), 0);
169
170 /* When deleting code in bulk (e.g. removing many unreachable
171 blocks) we can delete a label that's a target of the vector
172 before deleting the vector itself. */
173 if (GET_CODE (label) != NOTE)
174 LABEL_NUSES (label)--;
175 }
ca6c03ca
JH
176 }
177
178 return next;
179}
180
181/* Unlink a chain of insns between START and FINISH, leaving notes
182 that must be paired. */
183
184void
185delete_insn_chain (start, finish)
186 rtx start, finish;
187{
ca6c03ca
JH
188 rtx next;
189
5f0d2358
RK
190 /* Unchain the insns one by one. It would be quicker to delete all of these
191 with a single unchaining, rather than one at a time, but we need to keep
192 the NOTE's. */
ca6c03ca
JH
193 while (1)
194 {
195 next = NEXT_INSN (start);
196 if (GET_CODE (start) == NOTE && !can_delete_note_p (start))
197 ;
198 else
199 next = delete_insn (start);
200
201 if (start == finish)
202 break;
203 start = next;
204 }
205}
206\f
5f0d2358
RK
207/* Create a new basic block consisting of the instructions between HEAD and END
208 inclusive. This function is designed to allow fast BB construction - reuses
209 the note and basic block struct in BB_NOTE, if any and do not grow
210 BASIC_BLOCK chain and should be used directly only by CFG construction code.
211 END can be NULL in to create new empty basic block before HEAD. Both END
212 and HEAD can be NULL to create basic block at the end of INSN chain. */
ca6c03ca
JH
213
214basic_block
215create_basic_block_structure (index, head, end, bb_note)
216 int index;
217 rtx head, end, bb_note;
218{
219 basic_block bb;
220
221 if (bb_note
222 && ! RTX_INTEGRATED_P (bb_note)
223 && (bb = NOTE_BASIC_BLOCK (bb_note)) != NULL
224 && bb->aux == NULL)
225 {
226 /* If we found an existing note, thread it back onto the chain. */
227
228 rtx after;
229
230 if (GET_CODE (head) == CODE_LABEL)
231 after = head;
232 else
233 {
234 after = PREV_INSN (head);
235 head = bb_note;
236 }
237
238 if (after != bb_note && NEXT_INSN (after) != bb_note)
239 reorder_insns (bb_note, bb_note, after);
240 }
241 else
242 {
243 /* Otherwise we must create a note and a basic block structure. */
244
245 bb = alloc_block ();
246
247 if (!head && !end)
5f0d2358
RK
248 head = end = bb_note
249 = emit_note_after (NOTE_INSN_BASIC_BLOCK, get_last_insn ());
ca6c03ca
JH
250 else if (GET_CODE (head) == CODE_LABEL && end)
251 {
252 bb_note = emit_note_after (NOTE_INSN_BASIC_BLOCK, head);
253 if (head == end)
254 end = bb_note;
255 }
256 else
257 {
258 bb_note = emit_note_before (NOTE_INSN_BASIC_BLOCK, head);
259 head = bb_note;
260 if (!end)
261 end = head;
262 }
5f0d2358 263
ca6c03ca
JH
264 NOTE_BASIC_BLOCK (bb_note) = bb;
265 }
266
267 /* Always include the bb note in the block. */
268 if (NEXT_INSN (end) == bb_note)
269 end = bb_note;
270
271 bb->head = head;
272 bb->end = end;
273 bb->index = index;
38c1593d 274 bb->flags = BB_NEW;
ca6c03ca
JH
275 BASIC_BLOCK (index) = bb;
276 if (basic_block_for_insn)
277 update_bb_for_insn (bb);
278
279 /* Tag the block so that we know it has been used when considering
280 other basic block notes. */
281 bb->aux = bb;
282
283 return bb;
284}
285
5f0d2358
RK
286/* Create new basic block consisting of instructions in between HEAD and END
287 and place it to the BB chain at position INDEX. END can be NULL in to
288 create new empty basic block before HEAD. Both END and HEAD can be NULL to
289 create basic block at the end of INSN chain. */
ca6c03ca
JH
290
291basic_block
292create_basic_block (index, head, end)
293 int index;
294 rtx head, end;
295{
296 basic_block bb;
297 int i;
298
299 /* Place the new block just after the block being split. */
300 VARRAY_GROW (basic_block_info, ++n_basic_blocks);
301
302 /* Some parts of the compiler expect blocks to be number in
303 sequential order so insert the new block immediately after the
304 block being split.. */
305 for (i = n_basic_blocks - 1; i > index; --i)
306 {
307 basic_block tmp = BASIC_BLOCK (i - 1);
5f0d2358 308
ca6c03ca
JH
309 BASIC_BLOCK (i) = tmp;
310 tmp->index = i;
311 }
312
313 bb = create_basic_block_structure (index, head, end, NULL);
314 bb->aux = NULL;
315 return bb;
316}
317\f
318/* Delete the insns in a (non-live) block. We physically delete every
319 non-deleted-note insn, and update the flow graph appropriately.
320
321 Return nonzero if we deleted an exception handler. */
322
323/* ??? Preserving all such notes strikes me as wrong. It would be nice
324 to post-process the stream to remove empty blocks, loops, ranges, etc. */
325
326int
327flow_delete_block (b)
328 basic_block b;
329{
330 int deleted_handler = 0;
331 rtx insn, end, tmp;
332
333 /* If the head of this block is a CODE_LABEL, then it might be the
334 label for an exception handler which can't be reached.
335
336 We need to remove the label from the exception_handler_label list
337 and remove the associated NOTE_INSN_EH_REGION_BEG and
338 NOTE_INSN_EH_REGION_END notes. */
339
340 insn = b->head;
341
56d44285 342 never_reached_warning (insn, b->end);
ca6c03ca
JH
343
344 if (GET_CODE (insn) == CODE_LABEL)
345 maybe_remove_eh_handler (insn);
346
347 /* Include any jump table following the basic block. */
348 end = b->end;
349 if (GET_CODE (end) == JUMP_INSN
350 && (tmp = JUMP_LABEL (end)) != NULL_RTX
351 && (tmp = NEXT_INSN (tmp)) != NULL_RTX
352 && GET_CODE (tmp) == JUMP_INSN
353 && (GET_CODE (PATTERN (tmp)) == ADDR_VEC
354 || GET_CODE (PATTERN (tmp)) == ADDR_DIFF_VEC))
355 end = tmp;
356
357 /* Include any barrier that may follow the basic block. */
358 tmp = next_nonnote_insn (end);
359 if (tmp && GET_CODE (tmp) == BARRIER)
360 end = tmp;
361
362 /* Selectively delete the entire chain. */
363 b->head = NULL;
364 delete_insn_chain (insn, end);
365
366 /* Remove the edges into and out of this block. Note that there may
367 indeed be edges in, if we are removing an unreachable loop. */
368 while (b->pred != NULL)
369 remove_edge (b->pred);
370 while (b->succ != NULL)
371 remove_edge (b->succ);
372
373 b->pred = NULL;
374 b->succ = NULL;
375
376 /* Remove the basic block from the array, and compact behind it. */
377 expunge_block (b);
378
379 return deleted_handler;
380}
381\f
382/* Records the basic block struct in BB_FOR_INSN, for every instruction
383 indexed by INSN_UID. MAX is the size of the array. */
384
385void
386compute_bb_for_insn (max)
387 int max;
388{
389 int i;
390
391 if (basic_block_for_insn)
392 VARRAY_FREE (basic_block_for_insn);
5f0d2358 393
ca6c03ca
JH
394 VARRAY_BB_INIT (basic_block_for_insn, max, "basic_block_for_insn");
395
396 for (i = 0; i < n_basic_blocks; ++i)
397 {
398 basic_block bb = BASIC_BLOCK (i);
5f0d2358
RK
399 rtx end = bb->end;
400 rtx insn;
ca6c03ca 401
5f0d2358 402 for (insn = bb->head; ; insn = NEXT_INSN (insn))
ca6c03ca 403 {
5f0d2358
RK
404 if (INSN_UID (insn) < max)
405 VARRAY_BB (basic_block_for_insn, INSN_UID (insn)) = bb;
406
ca6c03ca
JH
407 if (insn == end)
408 break;
ca6c03ca
JH
409 }
410 }
411}
412
413/* Release the basic_block_for_insn array. */
414
415void
416free_bb_for_insn ()
417{
418 if (basic_block_for_insn)
419 VARRAY_FREE (basic_block_for_insn);
5f0d2358 420
ca6c03ca
JH
421 basic_block_for_insn = 0;
422}
423
424/* Update insns block within BB. */
425
426void
427update_bb_for_insn (bb)
428 basic_block bb;
429{
430 rtx insn;
431
432 if (! basic_block_for_insn)
433 return;
434
435 for (insn = bb->head; ; insn = NEXT_INSN (insn))
436 {
437 set_block_for_insn (insn, bb);
ca6c03ca
JH
438 if (insn == bb->end)
439 break;
440 }
441}
442
443/* Record INSN's block as BB. */
444
445void
446set_block_for_insn (insn, bb)
447 rtx insn;
448 basic_block bb;
449{
450 size_t uid = INSN_UID (insn);
5f0d2358 451
ca6c03ca
JH
452 if (uid >= basic_block_for_insn->num_elements)
453 {
ca6c03ca 454 /* Add one-eighth the size so we don't keep calling xrealloc. */
5f0d2358 455 size_t new_size = uid + (uid + 7) / 8;
ca6c03ca
JH
456
457 VARRAY_GROW (basic_block_for_insn, new_size);
458 }
5f0d2358 459
ca6c03ca
JH
460 VARRAY_BB (basic_block_for_insn, uid) = bb;
461}
462\f
463/* Split a block BB after insn INSN creating a new fallthru edge.
464 Return the new edge. Note that to keep other parts of the compiler happy,
465 this function renumbers all the basic blocks so that the new
466 one has a number one greater than the block split. */
467
468edge
469split_block (bb, insn)
470 basic_block bb;
471 rtx insn;
472{
473 basic_block new_bb;
474 edge new_edge;
475 edge e;
476
477 /* There is no point splitting the block after its end. */
478 if (bb->end == insn)
479 return 0;
480
481 /* Create the new basic block. */
482 new_bb = create_basic_block (bb->index + 1, NEXT_INSN (insn), bb->end);
483 new_bb->count = bb->count;
484 new_bb->frequency = bb->frequency;
485 new_bb->loop_depth = bb->loop_depth;
486 bb->end = insn;
487
488 /* Redirect the outgoing edges. */
489 new_bb->succ = bb->succ;
490 bb->succ = NULL;
491 for (e = new_bb->succ; e; e = e->succ_next)
492 e->src = new_bb;
493
494 new_edge = make_single_succ_edge (bb, new_bb, EDGE_FALLTHRU);
495
496 if (bb->global_live_at_start)
497 {
498 new_bb->global_live_at_start = OBSTACK_ALLOC_REG_SET (&flow_obstack);
499 new_bb->global_live_at_end = OBSTACK_ALLOC_REG_SET (&flow_obstack);
500 COPY_REG_SET (new_bb->global_live_at_end, bb->global_live_at_end);
501
502 /* We now have to calculate which registers are live at the end
503 of the split basic block and at the start of the new basic
504 block. Start with those registers that are known to be live
505 at the end of the original basic block and get
506 propagate_block to determine which registers are live. */
507 COPY_REG_SET (new_bb->global_live_at_start, bb->global_live_at_end);
508 propagate_block (new_bb, new_bb->global_live_at_start, NULL, NULL, 0);
509 COPY_REG_SET (bb->global_live_at_end,
510 new_bb->global_live_at_start);
511 }
512
513 return new_edge;
514}
515
516/* Blocks A and B are to be merged into a single block A. The insns
517 are already contiguous, hence `nomove'. */
518
519void
520merge_blocks_nomove (a, b)
521 basic_block a, b;
522{
5f0d2358 523 rtx b_head = b->head, b_end = b->end, a_end = a->end;
ca6c03ca
JH
524 rtx del_first = NULL_RTX, del_last = NULL_RTX;
525 int b_empty = 0;
5f0d2358 526 edge e;
ca6c03ca
JH
527
528 /* If there was a CODE_LABEL beginning B, delete it. */
ca6c03ca
JH
529 if (GET_CODE (b_head) == CODE_LABEL)
530 {
531 /* Detect basic blocks with nothing but a label. This can happen
532 in particular at the end of a function. */
533 if (b_head == b_end)
534 b_empty = 1;
5f0d2358 535
ca6c03ca
JH
536 del_first = del_last = b_head;
537 b_head = NEXT_INSN (b_head);
538 }
539
5f0d2358
RK
540 /* Delete the basic block note and handle blocks containing just that
541 note. */
ca6c03ca
JH
542 if (NOTE_INSN_BASIC_BLOCK_P (b_head))
543 {
544 if (b_head == b_end)
545 b_empty = 1;
546 if (! del_last)
547 del_first = b_head;
5f0d2358 548
ca6c03ca
JH
549 del_last = b_head;
550 b_head = NEXT_INSN (b_head);
551 }
552
553 /* If there was a jump out of A, delete it. */
ca6c03ca
JH
554 if (GET_CODE (a_end) == JUMP_INSN)
555 {
556 rtx prev;
557
558 for (prev = PREV_INSN (a_end); ; prev = PREV_INSN (prev))
559 if (GET_CODE (prev) != NOTE
560 || NOTE_LINE_NUMBER (prev) == NOTE_INSN_BASIC_BLOCK
561 || prev == a->head)
562 break;
563
564 del_first = a_end;
565
566#ifdef HAVE_cc0
567 /* If this was a conditional jump, we need to also delete
568 the insn that set cc0. */
569 if (only_sets_cc0_p (prev))
570 {
571 rtx tmp = prev;
5f0d2358 572
ca6c03ca
JH
573 prev = prev_nonnote_insn (prev);
574 if (!prev)
575 prev = a->head;
576 del_first = tmp;
577 }
578#endif
579
580 a_end = PREV_INSN (del_first);
581 }
582 else if (GET_CODE (NEXT_INSN (a_end)) == BARRIER)
583 del_first = NEXT_INSN (a_end);
584
585 /* Normally there should only be one successor of A and that is B, but
586 partway though the merge of blocks for conditional_execution we'll
587 be merging a TEST block with THEN and ELSE successors. Free the
588 whole lot of them and hope the caller knows what they're doing. */
589 while (a->succ)
590 remove_edge (a->succ);
591
592 /* Adjust the edges out of B for the new owner. */
593 for (e = b->succ; e; e = e->succ_next)
594 e->src = a;
595 a->succ = b->succ;
38c1593d 596 a->flags |= b->flags;
ca6c03ca
JH
597
598 /* B hasn't quite yet ceased to exist. Attempt to prevent mishap. */
599 b->pred = b->succ = NULL;
7dddfb65 600 a->global_live_at_end = b->global_live_at_end;
ca6c03ca
JH
601
602 expunge_block (b);
603
604 /* Delete everything marked above as well as crap that might be
605 hanging out between the two blocks. */
606 delete_insn_chain (del_first, del_last);
607
608 /* Reassociate the insns of B with A. */
609 if (!b_empty)
610 {
ca6c03ca
JH
611 if (basic_block_for_insn)
612 {
5f0d2358
RK
613 rtx x;
614
615 for (x = a_end; x != b_end; x = NEXT_INSN (x))
616 BLOCK_FOR_INSN (x) = a;
617
618 BLOCK_FOR_INSN (b_end) = a;
ca6c03ca 619 }
5f0d2358 620
ca6c03ca
JH
621 a_end = b_end;
622 }
5f0d2358 623
ca6c03ca
JH
624 a->end = a_end;
625}
626\f
5f0d2358
RK
627/* Return the label in the head of basic block BLOCK. Create one if it doesn't
628 exist. */
ca6c03ca
JH
629
630rtx
631block_label (block)
632 basic_block block;
633{
634 if (block == EXIT_BLOCK_PTR)
635 return NULL_RTX;
5f0d2358 636
ca6c03ca
JH
637 if (GET_CODE (block->head) != CODE_LABEL)
638 {
639 block->head = emit_label_before (gen_label_rtx (), block->head);
640 if (basic_block_for_insn)
641 set_block_for_insn (block->head, block);
642 }
5f0d2358 643
ca6c03ca
JH
644 return block->head;
645}
646
647/* Attempt to perform edge redirection by replacing possibly complex jump
5f0d2358
RK
648 instruction by unconditional jump or removing jump completely. This can
649 apply only if all edges now point to the same block. The parameters and
650 return values are equivalent to redirect_edge_and_branch. */
ca6c03ca
JH
651
652static bool
653try_redirect_by_replacing_jump (e, target)
654 edge e;
655 basic_block target;
656{
657 basic_block src = e->src;
658 rtx insn = src->end, kill_from;
659 edge tmp;
660 rtx set;
661 int fallthru = 0;
662
663 /* Verify that all targets will be TARGET. */
664 for (tmp = src->succ; tmp; tmp = tmp->succ_next)
665 if (tmp->dest != target && tmp != e)
666 break;
5f0d2358 667
ca6c03ca
JH
668 if (tmp || !onlyjump_p (insn))
669 return false;
670
671 /* Avoid removing branch with side effects. */
672 set = single_set (insn);
673 if (!set || side_effects_p (set))
674 return false;
675
676 /* In case we zap a conditional jump, we'll need to kill
677 the cc0 setter too. */
678 kill_from = insn;
679#ifdef HAVE_cc0
680 if (reg_mentioned_p (cc0_rtx, PATTERN (insn)))
681 kill_from = PREV_INSN (insn);
682#endif
683
684 /* See if we can create the fallthru edge. */
685 if (can_fallthru (src, target))
686 {
687 if (rtl_dump_file)
688 fprintf (rtl_dump_file, "Removing jump %i.\n", INSN_UID (insn));
689 fallthru = 1;
690
eaec9b3d 691 /* Selectively unlink whole insn chain. */
ca6c03ca
JH
692 delete_insn_chain (kill_from, PREV_INSN (target->head));
693 }
5f0d2358 694
ca6c03ca
JH
695 /* If this already is simplejump, redirect it. */
696 else if (simplejump_p (insn))
697 {
698 if (e->dest == target)
699 return false;
700 if (rtl_dump_file)
701 fprintf (rtl_dump_file, "Redirecting jump %i from %i to %i.\n",
702 INSN_UID (insn), e->dest->index, target->index);
6ee3c8e4
JJ
703 if (!redirect_jump (insn, block_label (target), 0))
704 {
705 if (target == EXIT_BLOCK_PTR)
706 return false;
707 abort ();
708 }
ca6c03ca 709 }
5f0d2358 710
6ee3c8e4
JJ
711 /* Cannot do anything for target exit block. */
712 else if (target == EXIT_BLOCK_PTR)
713 return false;
714
ca6c03ca
JH
715 /* Or replace possibly complicated jump insn by simple jump insn. */
716 else
717 {
718 rtx target_label = block_label (target);
5b1cacd8 719 rtx barrier, tmp;
ca6c03ca 720
09eb1aab 721 emit_jump_insn_after (gen_jump (target_label), insn);
ca6c03ca
JH
722 JUMP_LABEL (src->end) = target_label;
723 LABEL_NUSES (target_label)++;
724 if (rtl_dump_file)
725 fprintf (rtl_dump_file, "Replacing insn %i by jump %i\n",
726 INSN_UID (insn), INSN_UID (src->end));
727
5b1cacd8 728
ca6c03ca
JH
729 delete_insn_chain (kill_from, insn);
730
5b1cacd8
JL
731 /* Recognize a tablejump that we are converting to a
732 simple jump and remove its associated CODE_LABEL
733 and ADDR_VEC or ADDR_DIFF_VEC. */
734 if ((tmp = JUMP_LABEL (insn)) != NULL_RTX
735 && (tmp = NEXT_INSN (tmp)) != NULL_RTX
736 && GET_CODE (tmp) == JUMP_INSN
737 && (GET_CODE (PATTERN (tmp)) == ADDR_VEC
738 || GET_CODE (PATTERN (tmp)) == ADDR_DIFF_VEC))
739 {
740 delete_insn_chain (JUMP_LABEL (insn), tmp);
741 }
742
ca6c03ca
JH
743 barrier = next_nonnote_insn (src->end);
744 if (!barrier || GET_CODE (barrier) != BARRIER)
745 emit_barrier_after (src->end);
746 }
747
748 /* Keep only one edge out and set proper flags. */
749 while (src->succ->succ_next)
750 remove_edge (src->succ);
751 e = src->succ;
752 if (fallthru)
753 e->flags = EDGE_FALLTHRU;
754 else
755 e->flags = 0;
5f0d2358 756
ca6c03ca
JH
757 e->probability = REG_BR_PROB_BASE;
758 e->count = src->count;
759
760 /* We don't want a block to end on a line-number note since that has
761 the potential of changing the code between -g and not -g. */
762 while (GET_CODE (e->src->end) == NOTE
763 && NOTE_LINE_NUMBER (e->src->end) >= 0)
764 delete_insn (e->src->end);
765
766 if (e->dest != target)
767 redirect_edge_succ (e, target);
5f0d2358 768
ca6c03ca
JH
769 return true;
770}
771
772/* Return last loop_beg note appearing after INSN, before start of next
773 basic block. Return INSN if there are no such notes.
774
5f0d2358
RK
775 When emitting jump to redirect an fallthru edge, it should always appear
776 after the LOOP_BEG notes, as loop optimizer expect loop to either start by
777 fallthru edge or jump following the LOOP_BEG note jumping to the loop exit
778 test. */
ca6c03ca
JH
779
780static rtx
781last_loop_beg_note (insn)
782 rtx insn;
783{
784 rtx last = insn;
5f0d2358
RK
785
786 for (insn = NEXT_INSN (insn); insn && GET_CODE (insn) == NOTE
787 && NOTE_LINE_NUMBER (insn) != NOTE_INSN_BASIC_BLOCK;
788 insn = NEXT_INSN (insn))
789 if (NOTE_LINE_NUMBER (insn) == NOTE_INSN_LOOP_BEG)
790 last = insn;
791
ca6c03ca
JH
792 return last;
793}
794
5f0d2358
RK
795/* Attempt to change code to redirect edge E to TARGET. Don't do that on
796 expense of adding new instructions or reordering basic blocks.
ca6c03ca 797
5f0d2358
RK
798 Function can be also called with edge destination equivalent to the TARGET.
799 Then it should try the simplifications and do nothing if none is possible.
ca6c03ca 800
5f0d2358
RK
801 Return true if transformation succeeded. We still return false in case E
802 already destinated TARGET and we didn't managed to simplify instruction
ca6c03ca
JH
803 stream. */
804
805bool
806redirect_edge_and_branch (e, target)
807 edge e;
808 basic_block target;
809{
810 rtx tmp;
811 rtx old_label = e->dest->head;
812 basic_block src = e->src;
813 rtx insn = src->end;
814
25b44be5 815 if (e->flags & (EDGE_ABNORMAL_CALL | EDGE_EH))
ca6c03ca
JH
816 return false;
817
818 if (try_redirect_by_replacing_jump (e, target))
819 return true;
5f0d2358 820
ca6c03ca
JH
821 /* Do this fast path late, as we want above code to simplify for cases
822 where called on single edge leaving basic block containing nontrivial
823 jump insn. */
824 else if (e->dest == target)
825 return false;
826
827 /* We can only redirect non-fallthru edges of jump insn. */
828 if (e->flags & EDGE_FALLTHRU)
829 return false;
5f0d2358 830 else if (GET_CODE (insn) != JUMP_INSN)
ca6c03ca
JH
831 return false;
832
833 /* Recognize a tablejump and adjust all matching cases. */
834 if ((tmp = JUMP_LABEL (insn)) != NULL_RTX
835 && (tmp = NEXT_INSN (tmp)) != NULL_RTX
836 && GET_CODE (tmp) == JUMP_INSN
837 && (GET_CODE (PATTERN (tmp)) == ADDR_VEC
838 || GET_CODE (PATTERN (tmp)) == ADDR_DIFF_VEC))
839 {
840 rtvec vec;
841 int j;
842 rtx new_label = block_label (target);
843
6ee3c8e4
JJ
844 if (target == EXIT_BLOCK_PTR)
845 return false;
ca6c03ca
JH
846 if (GET_CODE (PATTERN (tmp)) == ADDR_VEC)
847 vec = XVEC (PATTERN (tmp), 0);
848 else
849 vec = XVEC (PATTERN (tmp), 1);
850
851 for (j = GET_NUM_ELEM (vec) - 1; j >= 0; --j)
852 if (XEXP (RTVEC_ELT (vec, j), 0) == old_label)
853 {
854 RTVEC_ELT (vec, j) = gen_rtx_LABEL_REF (Pmode, new_label);
855 --LABEL_NUSES (old_label);
856 ++LABEL_NUSES (new_label);
857 }
858
859 /* Handle casesi dispatch insns */
860 if ((tmp = single_set (insn)) != NULL
861 && SET_DEST (tmp) == pc_rtx
862 && GET_CODE (SET_SRC (tmp)) == IF_THEN_ELSE
863 && GET_CODE (XEXP (SET_SRC (tmp), 2)) == LABEL_REF
864 && XEXP (XEXP (SET_SRC (tmp), 2), 0) == old_label)
865 {
866 XEXP (SET_SRC (tmp), 2) = gen_rtx_LABEL_REF (VOIDmode,
867 new_label);
868 --LABEL_NUSES (old_label);
869 ++LABEL_NUSES (new_label);
870 }
871 }
872 else
873 {
874 /* ?? We may play the games with moving the named labels from
875 one basic block to the other in case only one computed_jump is
876 available. */
5f0d2358
RK
877 if (computed_jump_p (insn)
878 /* A return instruction can't be redirected. */
879 || returnjump_p (insn))
ca6c03ca
JH
880 return false;
881
882 /* If the insn doesn't go where we think, we're confused. */
6ee3c8e4 883 if (JUMP_LABEL (insn) != old_label)
a3623c48 884 abort ();
6ee3c8e4
JJ
885
886 /* If the substitution doesn't succeed, die. This can happen
887 if the back end emitted unrecognizable instructions or if
888 target is exit block on some arches. */
889 if (!redirect_jump (insn, block_label (target), 0))
890 {
891 if (target == EXIT_BLOCK_PTR)
892 return false;
893 abort ();
894 }
ca6c03ca
JH
895 }
896
897 if (rtl_dump_file)
898 fprintf (rtl_dump_file, "Edge %i->%i redirected to %i\n",
899 e->src->index, e->dest->index, target->index);
5f0d2358 900
ca6c03ca
JH
901 if (e->dest != target)
902 redirect_edge_succ_nodup (e, target);
5f0d2358 903
ca6c03ca
JH
904 return true;
905}
906
4fe9b91c 907/* Like force_nonfallthru below, but additionally performs redirection
ca6c03ca
JH
908 Used by redirect_edge_and_branch_force. */
909
910static basic_block
911force_nonfallthru_and_redirect (e, target)
912 edge e;
913 basic_block target;
914{
915 basic_block jump_block, new_bb = NULL;
916 rtx note;
917 edge new_edge;
918
919 if (e->flags & EDGE_ABNORMAL)
920 abort ();
5f0d2358 921 else if (!(e->flags & EDGE_FALLTHRU))
ca6c03ca 922 abort ();
24c545ff
BS
923 else if (e->src == ENTRY_BLOCK_PTR)
924 {
925 /* We can't redirect the entry block. Create an empty block at the
926 start of the function which we use to add the new jump. */
927 edge *pe1;
928 basic_block bb = create_basic_block (0, e->dest->head, NULL);
929
930 /* Change the existing edge's source to be the new block, and add
931 a new edge from the entry block to the new block. */
932 e->src = bb;
933 for (pe1 = &ENTRY_BLOCK_PTR->succ; *pe1; pe1 = &(*pe1)->succ_next)
934 if (*pe1 == e)
935 {
936 *pe1 = e->succ_next;
937 break;
938 }
939 e->succ_next = 0;
940 bb->succ = e;
941 make_single_succ_edge (ENTRY_BLOCK_PTR, bb, EDGE_FALLTHRU);
942 }
943
944 if (e->src->succ->succ_next)
ca6c03ca
JH
945 {
946 /* Create the new structures. */
947 note = last_loop_beg_note (e->src->end);
5f0d2358
RK
948 jump_block
949 = create_basic_block (e->src->index + 1, NEXT_INSN (note), NULL);
ca6c03ca
JH
950 jump_block->count = e->count;
951 jump_block->frequency = EDGE_FREQUENCY (e);
952 jump_block->loop_depth = target->loop_depth;
953
954 if (target->global_live_at_start)
955 {
5f0d2358
RK
956 jump_block->global_live_at_start
957 = OBSTACK_ALLOC_REG_SET (&flow_obstack);
958 jump_block->global_live_at_end
959 = OBSTACK_ALLOC_REG_SET (&flow_obstack);
ca6c03ca
JH
960 COPY_REG_SET (jump_block->global_live_at_start,
961 target->global_live_at_start);
962 COPY_REG_SET (jump_block->global_live_at_end,
963 target->global_live_at_start);
964 }
965
966 /* Wire edge in. */
967 new_edge = make_edge (e->src, jump_block, EDGE_FALLTHRU);
968 new_edge->probability = e->probability;
969 new_edge->count = e->count;
970
971 /* Redirect old edge. */
972 redirect_edge_pred (e, jump_block);
973 e->probability = REG_BR_PROB_BASE;
974
975 new_bb = jump_block;
976 }
977 else
978 jump_block = e->src;
5f0d2358 979
ca6c03ca
JH
980 e->flags &= ~EDGE_FALLTHRU;
981 if (target == EXIT_BLOCK_PTR)
982 {
983 if (HAVE_return)
984 emit_jump_insn_after (gen_return (), jump_block->end);
985 else
986 abort ();
987 }
988 else
989 {
990 rtx label = block_label (target);
991 emit_jump_insn_after (gen_jump (label), jump_block->end);
992 JUMP_LABEL (jump_block->end) = label;
993 LABEL_NUSES (label)++;
994 }
5f0d2358 995
ca6c03ca
JH
996 emit_barrier_after (jump_block->end);
997 redirect_edge_succ_nodup (e, target);
998
999 return new_bb;
1000}
1001
1002/* Edge E is assumed to be fallthru edge. Emit needed jump instruction
1003 (and possibly create new basic block) to make edge non-fallthru.
1004 Return newly created BB or NULL if none. */
5f0d2358 1005
ca6c03ca
JH
1006basic_block
1007force_nonfallthru (e)
1008 edge e;
1009{
1010 return force_nonfallthru_and_redirect (e, e->dest);
1011}
1012
1013/* Redirect edge even at the expense of creating new jump insn or
1014 basic block. Return new basic block if created, NULL otherwise.
eaec9b3d 1015 Abort if conversion is impossible. */
ca6c03ca
JH
1016
1017basic_block
1018redirect_edge_and_branch_force (e, target)
1019 edge e;
1020 basic_block target;
1021{
5f0d2358
RK
1022 if (redirect_edge_and_branch (e, target)
1023 || e->dest == target)
ca6c03ca
JH
1024 return NULL;
1025
1026 /* In case the edge redirection failed, try to force it to be non-fallthru
1027 and redirect newly created simplejump. */
5f0d2358 1028 return force_nonfallthru_and_redirect (e, target);
ca6c03ca
JH
1029}
1030
1031/* The given edge should potentially be a fallthru edge. If that is in
1032 fact true, delete the jump and barriers that are in the way. */
1033
1034void
1035tidy_fallthru_edge (e, b, c)
1036 edge e;
1037 basic_block b, c;
1038{
1039 rtx q;
1040
1041 /* ??? In a late-running flow pass, other folks may have deleted basic
1042 blocks by nopping out blocks, leaving multiple BARRIERs between here
1043 and the target label. They ought to be chastized and fixed.
1044
1045 We can also wind up with a sequence of undeletable labels between
1046 one block and the next.
1047
1048 So search through a sequence of barriers, labels, and notes for
1049 the head of block C and assert that we really do fall through. */
1050
1051 if (next_real_insn (b->end) != next_real_insn (PREV_INSN (c->head)))
1052 return;
1053
1054 /* Remove what will soon cease being the jump insn from the source block.
1055 If block B consisted only of this single jump, turn it into a deleted
1056 note. */
1057 q = b->end;
1058 if (GET_CODE (q) == JUMP_INSN
1059 && onlyjump_p (q)
1060 && (any_uncondjump_p (q)
1061 || (b->succ == e && e->succ_next == NULL)))
1062 {
1063#ifdef HAVE_cc0
1064 /* If this was a conditional jump, we need to also delete
1065 the insn that set cc0. */
1066 if (any_condjump_p (q) && only_sets_cc0_p (PREV_INSN (q)))
1067 q = PREV_INSN (q);
1068#endif
1069
1070 q = PREV_INSN (q);
1071
1072 /* We don't want a block to end on a line-number note since that has
1073 the potential of changing the code between -g and not -g. */
1074 while (GET_CODE (q) == NOTE && NOTE_LINE_NUMBER (q) >= 0)
1075 q = PREV_INSN (q);
1076 }
1077
1078 /* Selectively unlink the sequence. */
1079 if (q != PREV_INSN (c->head))
1080 delete_insn_chain (NEXT_INSN (q), PREV_INSN (c->head));
1081
1082 e->flags |= EDGE_FALLTHRU;
1083}
1084
1085/* Fix up edges that now fall through, or rather should now fall through
1086 but previously required a jump around now deleted blocks. Simplify
1087 the search by only examining blocks numerically adjacent, since this
1088 is how find_basic_blocks created them. */
1089
1090void
1091tidy_fallthru_edges ()
1092{
1093 int i;
1094
5f0d2358 1095 for (i = 1; i < n_basic_blocks; i++)
ca6c03ca
JH
1096 {
1097 basic_block b = BASIC_BLOCK (i - 1);
1098 basic_block c = BASIC_BLOCK (i);
1099 edge s;
1100
1101 /* We care about simple conditional or unconditional jumps with
1102 a single successor.
1103
1104 If we had a conditional branch to the next instruction when
1105 find_basic_blocks was called, then there will only be one
1106 out edge for the block which ended with the conditional
1107 branch (since we do not create duplicate edges).
1108
1109 Furthermore, the edge will be marked as a fallthru because we
1110 merge the flags for the duplicate edges. So we do not want to
1111 check that the edge is not a FALLTHRU edge. */
5f0d2358 1112
ca6c03ca
JH
1113 if ((s = b->succ) != NULL
1114 && ! (s->flags & EDGE_COMPLEX)
1115 && s->succ_next == NULL
1116 && s->dest == c
1117 /* If the jump insn has side effects, we can't tidy the edge. */
1118 && (GET_CODE (b->end) != JUMP_INSN
1119 || onlyjump_p (b->end)))
1120 tidy_fallthru_edge (s, b, c);
1121 }
1122}
1123\f
1124/* Helper function for split_edge. Return true in case edge BB2 to BB1
1125 is back edge of syntactic loop. */
1126
1127static bool
1128back_edge_of_syntactic_loop_p (bb1, bb2)
1129 basic_block bb1, bb2;
1130{
1131 rtx insn;
1132 int count = 0;
1133
1134 if (bb1->index > bb2->index)
1135 return false;
5f0d2358 1136 else if (bb1->index == bb2->index)
ca6c03ca
JH
1137 return true;
1138
1139 for (insn = bb1->end; insn != bb2->head && count >= 0;
1140 insn = NEXT_INSN (insn))
1141 if (GET_CODE (insn) == NOTE)
1142 {
1143 if (NOTE_LINE_NUMBER (insn) == NOTE_INSN_LOOP_BEG)
1144 count++;
5f0d2358 1145 else if (NOTE_LINE_NUMBER (insn) == NOTE_INSN_LOOP_END)
ca6c03ca
JH
1146 count--;
1147 }
1148
1149 return count >= 0;
1150}
1151
1152/* Split a (typically critical) edge. Return the new block.
1153 Abort on abnormal edges.
1154
1155 ??? The code generally expects to be called on critical edges.
1156 The case of a block ending in an unconditional jump to a
1157 block with multiple predecessors is not handled optimally. */
1158
1159basic_block
1160split_edge (edge_in)
1161 edge edge_in;
1162{
1163 basic_block bb;
1164 edge edge_out;
1165 rtx before;
1166
1167 /* Abnormal edges cannot be split. */
1168 if ((edge_in->flags & EDGE_ABNORMAL) != 0)
1169 abort ();
1170
1171 /* We are going to place the new block in front of edge destination.
eaec9b3d 1172 Avoid existence of fallthru predecessors. */
ca6c03ca
JH
1173 if ((edge_in->flags & EDGE_FALLTHRU) == 0)
1174 {
1175 edge e;
5f0d2358 1176
ca6c03ca
JH
1177 for (e = edge_in->dest->pred; e; e = e->pred_next)
1178 if (e->flags & EDGE_FALLTHRU)
1179 break;
1180
1181 if (e)
1182 force_nonfallthru (e);
1183 }
1184
1185 /* Create the basic block note.
1186
f63d1bf7 1187 Where we place the note can have a noticeable impact on the generated
ca6c03ca
JH
1188 code. Consider this cfg:
1189
1190 E
1191 |
1192 0
1193 / \
1194 +->1-->2--->E
1195 | |
1196 +--+
1197
1198 If we need to insert an insn on the edge from block 0 to block 1,
1199 we want to ensure the instructions we insert are outside of any
1200 loop notes that physically sit between block 0 and block 1. Otherwise
1201 we confuse the loop optimizer into thinking the loop is a phony. */
1202
1203 if (edge_in->dest != EXIT_BLOCK_PTR
1204 && PREV_INSN (edge_in->dest->head)
1205 && GET_CODE (PREV_INSN (edge_in->dest->head)) == NOTE
5f0d2358
RK
1206 && (NOTE_LINE_NUMBER (PREV_INSN (edge_in->dest->head))
1207 == NOTE_INSN_LOOP_BEG)
ca6c03ca
JH
1208 && !back_edge_of_syntactic_loop_p (edge_in->dest, edge_in->src))
1209 before = PREV_INSN (edge_in->dest->head);
1210 else if (edge_in->dest != EXIT_BLOCK_PTR)
1211 before = edge_in->dest->head;
1212 else
1213 before = NULL_RTX;
1214
1215 bb = create_basic_block (edge_in->dest == EXIT_BLOCK_PTR ? n_basic_blocks
1216 : edge_in->dest->index, before, NULL);
1217 bb->count = edge_in->count;
1218 bb->frequency = EDGE_FREQUENCY (edge_in);
1219
1220 /* ??? This info is likely going to be out of date very soon. */
1221 if (edge_in->dest->global_live_at_start)
1222 {
1223 bb->global_live_at_start = OBSTACK_ALLOC_REG_SET (&flow_obstack);
1224 bb->global_live_at_end = OBSTACK_ALLOC_REG_SET (&flow_obstack);
5f0d2358
RK
1225 COPY_REG_SET (bb->global_live_at_start,
1226 edge_in->dest->global_live_at_start);
1227 COPY_REG_SET (bb->global_live_at_end,
1228 edge_in->dest->global_live_at_start);
ca6c03ca
JH
1229 }
1230
1231 edge_out = make_single_succ_edge (bb, edge_in->dest, EDGE_FALLTHRU);
1232
1233 /* For non-fallthry edges, we must adjust the predecessor's
1234 jump instruction to target our new block. */
1235 if ((edge_in->flags & EDGE_FALLTHRU) == 0)
1236 {
1237 if (!redirect_edge_and_branch (edge_in, bb))
1238 abort ();
1239 }
1240 else
1241 redirect_edge_succ (edge_in, bb);
1242
1243 return bb;
1244}
1245
1246/* Queue instructions for insertion on an edge between two basic blocks.
1247 The new instructions and basic blocks (if any) will not appear in the
1248 CFG until commit_edge_insertions is called. */
1249
1250void
1251insert_insn_on_edge (pattern, e)
1252 rtx pattern;
1253 edge e;
1254{
1255 /* We cannot insert instructions on an abnormal critical edge.
1256 It will be easier to find the culprit if we die now. */
1257 if ((e->flags & EDGE_ABNORMAL) && EDGE_CRITICAL_P (e))
1258 abort ();
1259
1260 if (e->insns == NULL_RTX)
1261 start_sequence ();
1262 else
1263 push_to_sequence (e->insns);
1264
1265 emit_insn (pattern);
1266
1267 e->insns = get_insns ();
1268 end_sequence ();
1269}
1270
1271/* Update the CFG for the instructions queued on edge E. */
1272
1273static void
1274commit_one_edge_insertion (e)
1275 edge e;
1276{
1277 rtx before = NULL_RTX, after = NULL_RTX, insns, tmp, last;
1278 basic_block bb;
1279
1280 /* Pull the insns off the edge now since the edge might go away. */
1281 insns = e->insns;
1282 e->insns = NULL_RTX;
1283
1284 /* Figure out where to put these things. If the destination has
1285 one predecessor, insert there. Except for the exit block. */
1286 if (e->dest->pred->pred_next == NULL
1287 && e->dest != EXIT_BLOCK_PTR)
1288 {
1289 bb = e->dest;
1290
1291 /* Get the location correct wrt a code label, and "nice" wrt
1292 a basic block note, and before everything else. */
1293 tmp = bb->head;
1294 if (GET_CODE (tmp) == CODE_LABEL)
1295 tmp = NEXT_INSN (tmp);
1296 if (NOTE_INSN_BASIC_BLOCK_P (tmp))
1297 tmp = NEXT_INSN (tmp);
1298 if (tmp == bb->head)
1299 before = tmp;
1300 else
1301 after = PREV_INSN (tmp);
1302 }
1303
1304 /* If the source has one successor and the edge is not abnormal,
1305 insert there. Except for the entry block. */
1306 else if ((e->flags & EDGE_ABNORMAL) == 0
1307 && e->src->succ->succ_next == NULL
1308 && e->src != ENTRY_BLOCK_PTR)
1309 {
1310 bb = e->src;
5f0d2358 1311
ca6c03ca
JH
1312 /* It is possible to have a non-simple jump here. Consider a target
1313 where some forms of unconditional jumps clobber a register. This
1314 happens on the fr30 for example.
1315
1316 We know this block has a single successor, so we can just emit
1317 the queued insns before the jump. */
1318 if (GET_CODE (bb->end) == JUMP_INSN)
5f0d2358
RK
1319 for (before = bb->end;
1320 GET_CODE (PREV_INSN (before)) == NOTE
1321 && NOTE_LINE_NUMBER (PREV_INSN (before)) == NOTE_INSN_LOOP_BEG;
1322 before = PREV_INSN (before))
1323 ;
ca6c03ca
JH
1324 else
1325 {
1326 /* We'd better be fallthru, or we've lost track of what's what. */
1327 if ((e->flags & EDGE_FALLTHRU) == 0)
1328 abort ();
1329
1330 after = bb->end;
1331 }
1332 }
1333
1334 /* Otherwise we must split the edge. */
1335 else
1336 {
1337 bb = split_edge (e);
1338 after = bb->end;
1339 }
1340
1341 /* Now that we've found the spot, do the insertion. */
1342
1343 if (before)
1344 {
1345 emit_insns_before (insns, before);
1346 last = prev_nonnote_insn (before);
1347 }
1348 else
1349 last = emit_insns_after (insns, after);
1350
1351 if (returnjump_p (last))
1352 {
1353 /* ??? Remove all outgoing edges from BB and add one for EXIT.
1354 This is not currently a problem because this only happens
1355 for the (single) epilogue, which already has a fallthru edge
1356 to EXIT. */
1357
1358 e = bb->succ;
1359 if (e->dest != EXIT_BLOCK_PTR
1360 || e->succ_next != NULL
1361 || (e->flags & EDGE_FALLTHRU) == 0)
1362 abort ();
ca6c03ca 1363
5f0d2358 1364 e->flags &= ~EDGE_FALLTHRU;
ca6c03ca
JH
1365 emit_barrier_after (last);
1366
1367 if (before)
1368 delete_insn (before);
1369 }
1370 else if (GET_CODE (last) == JUMP_INSN)
1371 abort ();
5f0d2358 1372
ca6c03ca
JH
1373 find_sub_basic_blocks (bb);
1374}
1375
1376/* Update the CFG for all queued instructions. */
1377
1378void
1379commit_edge_insertions ()
1380{
1381 int i;
1382 basic_block bb;
1383
1384#ifdef ENABLE_CHECKING
1385 verify_flow_info ();
1386#endif
1387
1388 i = -1;
1389 bb = ENTRY_BLOCK_PTR;
1390 while (1)
1391 {
1392 edge e, next;
1393
1394 for (e = bb->succ; e; e = next)
1395 {
1396 next = e->succ_next;
1397 if (e->insns)
1398 commit_one_edge_insertion (e);
1399 }
1400
1401 if (++i >= n_basic_blocks)
1402 break;
1403 bb = BASIC_BLOCK (i);
1404 }
1405}
1406\f
1407/* Print out one basic block with live information at start and end. */
1408
1409void
1410dump_bb (bb, outf)
1411 basic_block bb;
1412 FILE *outf;
1413{
1414 rtx insn;
1415 rtx last;
1416 edge e;
1417
1418 fprintf (outf, ";; Basic block %d, loop depth %d, count ",
1419 bb->index, bb->loop_depth);
1420 fprintf (outf, HOST_WIDEST_INT_PRINT_DEC, (HOST_WIDEST_INT) bb->count);
1421 putc ('\n', outf);
1422
1423 fputs (";; Predecessors: ", outf);
1424 for (e = bb->pred; e; e = e->pred_next)
1425 dump_edge_info (outf, e, 0);
1426 putc ('\n', outf);
1427
1428 fputs (";; Registers live at start:", outf);
1429 dump_regset (bb->global_live_at_start, outf);
1430 putc ('\n', outf);
1431
5f0d2358 1432 for (insn = bb->head, last = NEXT_INSN (bb->end); insn != last;
ca6c03ca
JH
1433 insn = NEXT_INSN (insn))
1434 print_rtl_single (outf, insn);
1435
1436 fputs (";; Registers live at end:", outf);
1437 dump_regset (bb->global_live_at_end, outf);
1438 putc ('\n', outf);
1439
1440 fputs (";; Successors: ", outf);
1441 for (e = bb->succ; e; e = e->succ_next)
1442 dump_edge_info (outf, e, 1);
1443 putc ('\n', outf);
1444}
1445
1446void
1447debug_bb (bb)
1448 basic_block bb;
1449{
1450 dump_bb (bb, stderr);
1451}
1452
1453void
1454debug_bb_n (n)
1455 int n;
1456{
1457 dump_bb (BASIC_BLOCK (n), stderr);
1458}
1459\f
1460/* Like print_rtl, but also print out live information for the start of each
1461 basic block. */
1462
1463void
1464print_rtl_with_bb (outf, rtx_first)
1465 FILE *outf;
1466 rtx rtx_first;
1467{
b3694847 1468 rtx tmp_rtx;
ca6c03ca
JH
1469
1470 if (rtx_first == 0)
1471 fprintf (outf, "(nil)\n");
1472 else
1473 {
1474 int i;
1475 enum bb_state { NOT_IN_BB, IN_ONE_BB, IN_MULTIPLE_BB };
1476 int max_uid = get_max_uid ();
5f0d2358
RK
1477 basic_block *start
1478 = (basic_block *) xcalloc (max_uid, sizeof (basic_block));
1479 basic_block *end
1480 = (basic_block *) xcalloc (max_uid, sizeof (basic_block));
1481 enum bb_state *in_bb_p
1482 = (enum bb_state *) xcalloc (max_uid, sizeof (enum bb_state));
ca6c03ca
JH
1483
1484 for (i = n_basic_blocks - 1; i >= 0; i--)
1485 {
1486 basic_block bb = BASIC_BLOCK (i);
1487 rtx x;
1488
1489 start[INSN_UID (bb->head)] = bb;
1490 end[INSN_UID (bb->end)] = bb;
1491 for (x = bb->head; x != NULL_RTX; x = NEXT_INSN (x))
1492 {
1493 enum bb_state state = IN_MULTIPLE_BB;
5f0d2358 1494
ca6c03ca
JH
1495 if (in_bb_p[INSN_UID (x)] == NOT_IN_BB)
1496 state = IN_ONE_BB;
1497 in_bb_p[INSN_UID (x)] = state;
1498
1499 if (x == bb->end)
1500 break;
1501 }
1502 }
1503
1504 for (tmp_rtx = rtx_first; NULL != tmp_rtx; tmp_rtx = NEXT_INSN (tmp_rtx))
1505 {
1506 int did_output;
1507 basic_block bb;
1508
1509 if ((bb = start[INSN_UID (tmp_rtx)]) != NULL)
1510 {
1511 fprintf (outf, ";; Start of basic block %d, registers live:",
1512 bb->index);
1513 dump_regset (bb->global_live_at_start, outf);
1514 putc ('\n', outf);
1515 }
1516
1517 if (in_bb_p[INSN_UID (tmp_rtx)] == NOT_IN_BB
1518 && GET_CODE (tmp_rtx) != NOTE
1519 && GET_CODE (tmp_rtx) != BARRIER)
1520 fprintf (outf, ";; Insn is not within a basic block\n");
1521 else if (in_bb_p[INSN_UID (tmp_rtx)] == IN_MULTIPLE_BB)
1522 fprintf (outf, ";; Insn is in multiple basic blocks\n");
1523
1524 did_output = print_rtl_single (outf, tmp_rtx);
1525
1526 if ((bb = end[INSN_UID (tmp_rtx)]) != NULL)
1527 {
1528 fprintf (outf, ";; End of basic block %d, registers live:\n",
1529 bb->index);
1530 dump_regset (bb->global_live_at_end, outf);
1531 putc ('\n', outf);
1532 }
1533
1534 if (did_output)
1535 putc ('\n', outf);
1536 }
1537
1538 free (start);
1539 free (end);
1540 free (in_bb_p);
1541 }
1542
1543 if (current_function_epilogue_delay_list != 0)
1544 {
1545 fprintf (outf, "\n;; Insns in epilogue delay list:\n\n");
1546 for (tmp_rtx = current_function_epilogue_delay_list; tmp_rtx != 0;
1547 tmp_rtx = XEXP (tmp_rtx, 1))
1548 print_rtl_single (outf, XEXP (tmp_rtx, 0));
1549 }
1550}
1551\f
b446e5a2
JH
1552void
1553update_br_prob_note (bb)
1554 basic_block bb;
1555{
1556 rtx note;
1557 if (GET_CODE (bb->end) != JUMP_INSN)
1558 return;
1559 note = find_reg_note (bb->end, REG_BR_PROB, NULL_RTX);
1560 if (!note || INTVAL (XEXP (note, 0)) == BRANCH_EDGE (bb)->probability)
1561 return;
1562 XEXP (note, 0) = GEN_INT (BRANCH_EDGE (bb)->probability);
1563}
1564\f
ca6c03ca
JH
1565/* Verify the CFG consistency. This function check some CFG invariants and
1566 aborts when something is wrong. Hope that this function will help to
1567 convert many optimization passes to preserve CFG consistent.
1568
1569 Currently it does following checks:
1570
1571 - test head/end pointers
1572 - overlapping of basic blocks
1573 - edge list correctness
1574 - headers of basic blocks (the NOTE_INSN_BASIC_BLOCK note)
f63d1bf7 1575 - tails of basic blocks (ensure that boundary is necessary)
ca6c03ca
JH
1576 - scans body of the basic block for JUMP_INSN, CODE_LABEL
1577 and NOTE_INSN_BASIC_BLOCK
1578 - check that all insns are in the basic blocks
5f0d2358 1579 (except the switch handling code, barriers and notes)
ca6c03ca
JH
1580 - check that all returns are followed by barriers
1581
1582 In future it can be extended check a lot of other stuff as well
1583 (reachability of basic blocks, life information, etc. etc.). */
1584
1585void
1586verify_flow_info ()
1587{
1588 const int max_uid = get_max_uid ();
1589 const rtx rtx_first = get_insns ();
1590 rtx last_head = get_last_insn ();
1591 basic_block *bb_info, *last_visited;
1592 size_t *edge_checksum;
1593 rtx x;
1594 int i, last_bb_num_seen, num_bb_notes, err = 0;
1595
1596 bb_info = (basic_block *) xcalloc (max_uid, sizeof (basic_block));
1597 last_visited = (basic_block *) xcalloc (n_basic_blocks + 2,
1598 sizeof (basic_block));
1599 edge_checksum = (size_t *) xcalloc (n_basic_blocks + 2, sizeof (size_t));
1600
1601 for (i = n_basic_blocks - 1; i >= 0; i--)
1602 {
1603 basic_block bb = BASIC_BLOCK (i);
1604 rtx head = bb->head;
1605 rtx end = bb->end;
1606
1607 /* Verify the end of the basic block is in the INSN chain. */
1608 for (x = last_head; x != NULL_RTX; x = PREV_INSN (x))
1609 if (x == end)
1610 break;
5f0d2358 1611
ca6c03ca
JH
1612 if (!x)
1613 {
1f978f5f 1614 error ("end insn %d for block %d not found in the insn stream",
ca6c03ca
JH
1615 INSN_UID (end), bb->index);
1616 err = 1;
1617 }
1618
1619 /* Work backwards from the end to the head of the basic block
1620 to verify the head is in the RTL chain. */
1621 for (; x != NULL_RTX; x = PREV_INSN (x))
1622 {
1623 /* While walking over the insn chain, verify insns appear
1624 in only one basic block and initialize the BB_INFO array
1625 used by other passes. */
1626 if (bb_info[INSN_UID (x)] != NULL)
1627 {
1f978f5f 1628 error ("insn %d is in multiple basic blocks (%d and %d)",
ca6c03ca
JH
1629 INSN_UID (x), bb->index, bb_info[INSN_UID (x)]->index);
1630 err = 1;
1631 }
5f0d2358 1632
ca6c03ca
JH
1633 bb_info[INSN_UID (x)] = bb;
1634
1635 if (x == head)
1636 break;
1637 }
1638 if (!x)
1639 {
1f978f5f 1640 error ("head insn %d for block %d not found in the insn stream",
ca6c03ca
JH
1641 INSN_UID (head), bb->index);
1642 err = 1;
1643 }
1644
1645 last_head = x;
1646 }
1647
1648 /* Now check the basic blocks (boundaries etc.) */
1649 for (i = n_basic_blocks - 1; i >= 0; i--)
1650 {
1651 basic_block bb = BASIC_BLOCK (i);
1652 int has_fallthru = 0;
1653 edge e;
1654
5f0d2358 1655 for (e = bb->succ; e; e = e->succ_next)
ca6c03ca
JH
1656 {
1657 if (last_visited [e->dest->index + 2] == bb)
1658 {
1659 error ("verify_flow_info: Duplicate edge %i->%i",
1660 e->src->index, e->dest->index);
1661 err = 1;
1662 }
5f0d2358 1663
ca6c03ca
JH
1664 last_visited [e->dest->index + 2] = bb;
1665
1666 if (e->flags & EDGE_FALLTHRU)
1667 has_fallthru = 1;
1668
1669 if ((e->flags & EDGE_FALLTHRU)
1670 && e->src != ENTRY_BLOCK_PTR
1671 && e->dest != EXIT_BLOCK_PTR)
1672 {
1673 rtx insn;
5f0d2358 1674
ca6c03ca
JH
1675 if (e->src->index + 1 != e->dest->index)
1676 {
5f0d2358
RK
1677 error
1678 ("verify_flow_info: Incorrect blocks for fallthru %i->%i",
1679 e->src->index, e->dest->index);
1680 err = 1;
ca6c03ca
JH
1681 }
1682 else
1683 for (insn = NEXT_INSN (e->src->end); insn != e->dest->head;
1684 insn = NEXT_INSN (insn))
32a6f30e
JDA
1685 if (GET_CODE (insn) == BARRIER
1686#ifndef CASE_DROPS_THROUGH
5f0d2358 1687 || INSN_P (insn)
32a6f30e 1688#else
5f0d2358 1689 || (INSN_P (insn) && ! JUMP_TABLE_DATA_P (insn))
32a6f30e 1690#endif
5f0d2358 1691 )
ca6c03ca
JH
1692 {
1693 error ("verify_flow_info: Incorrect fallthru %i->%i",
1694 e->src->index, e->dest->index);
1f978f5f 1695 fatal_insn ("wrong insn in the fallthru edge", insn);
ca6c03ca
JH
1696 err = 1;
1697 }
1698 }
5f0d2358 1699
ca6c03ca
JH
1700 if (e->src != bb)
1701 {
1702 error ("verify_flow_info: Basic block %d succ edge is corrupted",
1703 bb->index);
1704 fprintf (stderr, "Predecessor: ");
1705 dump_edge_info (stderr, e, 0);
1706 fprintf (stderr, "\nSuccessor: ");
1707 dump_edge_info (stderr, e, 1);
1708 fprintf (stderr, "\n");
1709 err = 1;
1710 }
5f0d2358 1711
ca6c03ca 1712 edge_checksum[e->dest->index + 2] += (size_t) e;
ca6c03ca 1713 }
5f0d2358 1714
ca6c03ca
JH
1715 if (!has_fallthru)
1716 {
09eb1aab 1717 rtx insn;
ca6c03ca
JH
1718
1719 /* Ensure existence of barrier in BB with no fallthru edges. */
09eb1aab 1720 for (insn = bb->end; !insn || GET_CODE (insn) != BARRIER;
ca6c03ca
JH
1721 insn = NEXT_INSN (insn))
1722 if (!insn
1723 || (GET_CODE (insn) == NOTE
1724 && NOTE_LINE_NUMBER (insn) == NOTE_INSN_BASIC_BLOCK))
1725 {
1f978f5f 1726 error ("missing barrier after block %i", bb->index);
ca6c03ca 1727 err = 1;
09eb1aab 1728 break;
ca6c03ca
JH
1729 }
1730 }
1731
5f0d2358 1732 for (e = bb->pred; e; e = e->pred_next)
ca6c03ca
JH
1733 {
1734 if (e->dest != bb)
1735 {
1f978f5f 1736 error ("basic block %d pred edge is corrupted", bb->index);
ca6c03ca
JH
1737 fputs ("Predecessor: ", stderr);
1738 dump_edge_info (stderr, e, 0);
1739 fputs ("\nSuccessor: ", stderr);
1740 dump_edge_info (stderr, e, 1);
1741 fputc ('\n', stderr);
1742 err = 1;
1743 }
1744 edge_checksum[e->dest->index + 2] -= (size_t) e;
ca6c03ca 1745 }
5f0d2358
RK
1746
1747 for (x = bb->head; x != NEXT_INSN (bb->end); x = NEXT_INSN (x))
1748 if (basic_block_for_insn && BLOCK_FOR_INSN (x) != bb)
1749 {
1750 debug_rtx (x);
1751 if (! BLOCK_FOR_INSN (x))
1752 error
1753 ("insn %d inside basic block %d but block_for_insn is NULL",
1754 INSN_UID (x), bb->index);
1755 else
1756 error
1757 ("insn %d inside basic block %d but block_for_insn is %i",
1758 INSN_UID (x), bb->index, BLOCK_FOR_INSN (x)->index);
1759
1760 err = 1;
1761 }
ca6c03ca
JH
1762
1763 /* OK pointers are correct. Now check the header of basic
1764 block. It ought to contain optional CODE_LABEL followed
1765 by NOTE_BASIC_BLOCK. */
1766 x = bb->head;
1767 if (GET_CODE (x) == CODE_LABEL)
1768 {
1769 if (bb->end == x)
1770 {
1771 error ("NOTE_INSN_BASIC_BLOCK is missing for block %d",
1772 bb->index);
1773 err = 1;
1774 }
5f0d2358 1775
ca6c03ca
JH
1776 x = NEXT_INSN (x);
1777 }
5f0d2358 1778
ca6c03ca
JH
1779 if (!NOTE_INSN_BASIC_BLOCK_P (x) || NOTE_BASIC_BLOCK (x) != bb)
1780 {
1781 error ("NOTE_INSN_BASIC_BLOCK is missing for block %d",
1782 bb->index);
1783 err = 1;
1784 }
1785
1786 if (bb->end == x)
5f0d2358
RK
1787 /* Do checks for empty blocks her. e */
1788 ;
ca6c03ca 1789 else
5f0d2358
RK
1790 for (x = NEXT_INSN (x); x; x = NEXT_INSN (x))
1791 {
1792 if (NOTE_INSN_BASIC_BLOCK_P (x))
1793 {
1794 error ("NOTE_INSN_BASIC_BLOCK %d in middle of basic block %d",
1795 INSN_UID (x), bb->index);
1796 err = 1;
1797 }
1798
1799 if (x == bb->end)
1800 break;
ca6c03ca 1801
5f0d2358
RK
1802 if (GET_CODE (x) == JUMP_INSN
1803 || GET_CODE (x) == CODE_LABEL
1804 || GET_CODE (x) == BARRIER)
1805 {
1806 error ("in basic block %d:", bb->index);
1807 fatal_insn ("flow control insn inside a basic block", x);
1808 }
1809 }
ca6c03ca
JH
1810 }
1811
1812 /* Complete edge checksumming for ENTRY and EXIT. */
1813 {
1814 edge e;
5f0d2358 1815
ca6c03ca
JH
1816 for (e = ENTRY_BLOCK_PTR->succ; e ; e = e->succ_next)
1817 edge_checksum[e->dest->index + 2] += (size_t) e;
5f0d2358 1818
ca6c03ca
JH
1819 for (e = EXIT_BLOCK_PTR->pred; e ; e = e->pred_next)
1820 edge_checksum[e->dest->index + 2] -= (size_t) e;
1821 }
1822
1823 for (i = -2; i < n_basic_blocks; ++i)
1824 if (edge_checksum[i + 2])
1825 {
1f978f5f 1826 error ("basic block %i edge lists are corrupted", i);
ca6c03ca
JH
1827 err = 1;
1828 }
1829
1830 last_bb_num_seen = -1;
1831 num_bb_notes = 0;
5f0d2358 1832 for (x = rtx_first; x; x = NEXT_INSN (x))
ca6c03ca
JH
1833 {
1834 if (NOTE_INSN_BASIC_BLOCK_P (x))
1835 {
1836 basic_block bb = NOTE_BASIC_BLOCK (x);
5f0d2358 1837
ca6c03ca
JH
1838 num_bb_notes++;
1839 if (bb->index != last_bb_num_seen + 1)
c725bd79 1840 internal_error ("basic blocks not numbered consecutively");
ca6c03ca
JH
1841
1842 last_bb_num_seen = bb->index;
1843 }
1844
1845 if (!bb_info[INSN_UID (x)])
1846 {
1847 switch (GET_CODE (x))
1848 {
1849 case BARRIER:
1850 case NOTE:
1851 break;
1852
1853 case CODE_LABEL:
1854 /* An addr_vec is placed outside any block block. */
1855 if (NEXT_INSN (x)
1856 && GET_CODE (NEXT_INSN (x)) == JUMP_INSN
1857 && (GET_CODE (PATTERN (NEXT_INSN (x))) == ADDR_DIFF_VEC
1858 || GET_CODE (PATTERN (NEXT_INSN (x))) == ADDR_VEC))
5f0d2358 1859 x = NEXT_INSN (x);
ca6c03ca
JH
1860
1861 /* But in any case, non-deletable labels can appear anywhere. */
1862 break;
1863
1864 default:
1f978f5f 1865 fatal_insn ("insn outside basic block", x);
ca6c03ca
JH
1866 }
1867 }
1868
1869 if (INSN_P (x)
1870 && GET_CODE (x) == JUMP_INSN
1871 && returnjump_p (x) && ! condjump_p (x)
1872 && ! (NEXT_INSN (x) && GET_CODE (NEXT_INSN (x)) == BARRIER))
1f978f5f 1873 fatal_insn ("return not followed by barrier", x);
ca6c03ca
JH
1874 }
1875
1876 if (num_bb_notes != n_basic_blocks)
1877 internal_error
1878 ("number of bb notes in insn chain (%d) != n_basic_blocks (%d)",
1879 num_bb_notes, n_basic_blocks);
1880
1881 if (err)
c725bd79 1882 internal_error ("verify_flow_info failed");
ca6c03ca
JH
1883
1884 /* Clean up. */
1885 free (bb_info);
1886 free (last_visited);
1887 free (edge_checksum);
1888}
1889\f
eaec9b3d 1890/* Assume that the preceding pass has possibly eliminated jump instructions
ca6c03ca
JH
1891 or converted the unconditional jumps. Eliminate the edges from CFG.
1892 Return true if any edges are eliminated. */
1893
1894bool
1895purge_dead_edges (bb)
1896 basic_block bb;
1897{
1898 edge e, next;
89753b3a 1899 rtx insn = bb->end, note;
ca6c03ca
JH
1900 bool purged = false;
1901
70da1d03
JH
1902 /* If this instruction cannot trap, remove REG_EH_REGION notes. */
1903 if (GET_CODE (insn) == INSN
1904 && (note = find_reg_note (insn, REG_EH_REGION, NULL)))
1905 {
1906 rtx eqnote;
1907
1908 if (! may_trap_p (PATTERN (insn))
1909 || ((eqnote = find_reg_equal_equiv_note (insn))
1910 && ! may_trap_p (XEXP (eqnote, 0))))
1911 remove_note (insn, note);
1912 }
1913
1914 /* Cleanup abnormal edges caused by throwing insns that have been
1915 eliminated. */
1916 if (! can_throw_internal (bb->end))
1917 for (e = bb->succ; e; e = next)
1918 {
1919 next = e->succ_next;
1920 if (e->flags & EDGE_EH)
1921 {
1922 remove_edge (e);
1923 purged = true;
1924 }
1925 }
5f0d2358 1926
ca6c03ca
JH
1927 if (GET_CODE (insn) == JUMP_INSN)
1928 {
1929 rtx note;
1930 edge b,f;
5f0d2358 1931
ca6c03ca
JH
1932 /* We do care only about conditional jumps and simplejumps. */
1933 if (!any_condjump_p (insn)
1934 && !returnjump_p (insn)
1935 && !simplejump_p (insn))
1936 return false;
5f0d2358 1937
ca6c03ca
JH
1938 for (e = bb->succ; e; e = next)
1939 {
1940 next = e->succ_next;
1941
7fcd7218
JH
1942 /* Avoid abnormal flags to leak from computed jumps turned
1943 into simplejumps. */
1944
0e1638d4 1945 e->flags &= ~EDGE_ABNORMAL;
7fcd7218 1946
ca6c03ca
JH
1947 /* Check purposes we can have edge. */
1948 if ((e->flags & EDGE_FALLTHRU)
1949 && any_condjump_p (insn))
1950 continue;
5f0d2358
RK
1951 else if (e->dest != EXIT_BLOCK_PTR
1952 && e->dest->head == JUMP_LABEL (insn))
ca6c03ca 1953 continue;
5f0d2358
RK
1954 else if (e->dest == EXIT_BLOCK_PTR
1955 && returnjump_p (insn))
ca6c03ca 1956 continue;
5f0d2358 1957
ca6c03ca
JH
1958 purged = true;
1959 remove_edge (e);
1960 }
5f0d2358 1961
ca6c03ca
JH
1962 if (!bb->succ || !purged)
1963 return false;
5f0d2358 1964
ca6c03ca
JH
1965 if (rtl_dump_file)
1966 fprintf (rtl_dump_file, "Purged edges from bb %i\n", bb->index);
5f0d2358 1967
ca6c03ca
JH
1968 if (!optimize)
1969 return purged;
1970
1971 /* Redistribute probabilities. */
1972 if (!bb->succ->succ_next)
1973 {
1974 bb->succ->probability = REG_BR_PROB_BASE;
1975 bb->succ->count = bb->count;
1976 }
1977 else
1978 {
1979 note = find_reg_note (insn, REG_BR_PROB, NULL);
1980 if (!note)
1981 return purged;
5f0d2358 1982
ca6c03ca
JH
1983 b = BRANCH_EDGE (bb);
1984 f = FALLTHRU_EDGE (bb);
1985 b->probability = INTVAL (XEXP (note, 0));
1986 f->probability = REG_BR_PROB_BASE - b->probability;
1987 b->count = bb->count * b->probability / REG_BR_PROB_BASE;
1988 f->count = bb->count * f->probability / REG_BR_PROB_BASE;
1989 }
5f0d2358 1990
ca6c03ca
JH
1991 return purged;
1992 }
1993
ca6c03ca
JH
1994 /* If we don't see a jump insn, we don't know exactly why the block would
1995 have been broken at this point. Look for a simple, non-fallthru edge,
1996 as these are only created by conditional branches. If we find such an
1997 edge we know that there used to be a jump here and can then safely
1998 remove all non-fallthru edges. */
1999 for (e = bb->succ; e && (e->flags & (EDGE_COMPLEX | EDGE_FALLTHRU));
5f0d2358
RK
2000 e = e->succ_next)
2001 ;
2002
ca6c03ca
JH
2003 if (!e)
2004 return purged;
5f0d2358 2005
ca6c03ca
JH
2006 for (e = bb->succ; e; e = next)
2007 {
2008 next = e->succ_next;
2009 if (!(e->flags & EDGE_FALLTHRU))
2010 remove_edge (e), purged = true;
2011 }
5f0d2358 2012
ca6c03ca
JH
2013 if (!bb->succ || bb->succ->succ_next)
2014 abort ();
5f0d2358 2015
ca6c03ca
JH
2016 bb->succ->probability = REG_BR_PROB_BASE;
2017 bb->succ->count = bb->count;
2018
2019 if (rtl_dump_file)
2020 fprintf (rtl_dump_file, "Purged non-fallthru edges from bb %i\n",
2021 bb->index);
2022 return purged;
2023}
2024
5f0d2358
RK
2025/* Search all basic blocks for potentially dead edges and purge them. Return
2026 true if some edge has been eliminated. */
ca6c03ca
JH
2027
2028bool
473fb060 2029purge_all_dead_edges (update_life_p)
00baba68 2030 int update_life_p;
ca6c03ca
JH
2031{
2032 int i, purged = false;
710af899 2033 sbitmap blocks = 0;
473fb060
JH
2034
2035 if (update_life_p)
2036 {
2037 blocks = sbitmap_alloc (n_basic_blocks);
2038 sbitmap_zero (blocks);
2039 }
5f0d2358 2040
ca6c03ca 2041 for (i = 0; i < n_basic_blocks; i++)
473fb060 2042 {
5f0d2358
RK
2043 bool purged_here = purge_dead_edges (BASIC_BLOCK (i));
2044
473fb060
JH
2045 purged |= purged_here;
2046 if (purged_here && update_life_p)
2047 SET_BIT (blocks, i);
2048 }
5f0d2358 2049
473fb060
JH
2050 if (update_life_p && purged)
2051 update_life_info (blocks, UPDATE_LIFE_GLOBAL,
2052 PROP_DEATH_NOTES | PROP_SCAN_DEAD_CODE
2053 | PROP_KILL_DEAD_CODE);
5f0d2358 2054
473fb060
JH
2055 if (update_life_p)
2056 sbitmap_free (blocks);
ca6c03ca
JH
2057 return purged;
2058}