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