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