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