]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/cfghooks.c
i386.c (make_resolver_func): Update.
[thirdparty/gcc.git] / gcc / cfghooks.c
CommitLineData
9ee634e3 1/* Hooks for cfg representation specific functions.
cbe34bb5 2 Copyright (C) 2003-2017 Free Software Foundation, Inc.
9ee634e3
JH
3 Contributed by Sebastian Pop <s.pop@laposte.net>
4
5This file is part of GCC.
6
7GCC is free software; you can redistribute it and/or modify
8it under the terms of the GNU General Public License as published by
9dcd6f09 9the Free Software Foundation; either version 3, or (at your option)
9ee634e3
JH
10any later version.
11
12GCC is distributed in the hope that it will be useful,
13but WITHOUT ANY WARRANTY; without even the implied warranty of
14MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15GNU General Public License for more details.
16
17You should have received a copy of the GNU General Public License
9dcd6f09
NC
18along with GCC; see the file COPYING3. If not see
19<http://www.gnu.org/licenses/>. */
9ee634e3
JH
20
21#include "config.h"
22#include "system.h"
23#include "coretypes.h"
c7131fb2 24#include "backend.h"
957060b5 25#include "rtl.h"
9fdcd34e 26#include "cfghooks.h"
957060b5
AM
27#include "timevar.h"
28#include "pretty-print.h"
29#include "diagnostic-core.h"
30#include "dumpfile.h"
60393bbc 31#include "cfganal.h"
7a300452 32#include "tree-ssa.h"
598ec7bd 33#include "cfgloop.h"
9ee634e3
JH
34
35/* A pointer to one of the hooks containers. */
f470c378 36static struct cfg_hooks *cfg_hooks;
9ee634e3
JH
37
38/* Initialization of functions specific to the rtl IR. */
d329e058
AJ
39void
40rtl_register_cfg_hooks (void)
9ee634e3
JH
41{
42 cfg_hooks = &rtl_cfg_hooks;
43}
44
45/* Initialization of functions specific to the rtl IR. */
d329e058
AJ
46void
47cfg_layout_rtl_register_cfg_hooks (void)
9ee634e3
JH
48{
49 cfg_hooks = &cfg_layout_rtl_cfg_hooks;
50}
f470c378 51
6de9cd9a
DN
52/* Initialization of functions specific to the tree IR. */
53
54void
726a989a 55gimple_register_cfg_hooks (void)
6de9cd9a 56{
726a989a 57 cfg_hooks = &gimple_cfg_hooks;
6de9cd9a
DN
58}
59
e855c69d
AB
60struct cfg_hooks
61get_cfg_hooks (void)
62{
63 return *cfg_hooks;
64}
65
66void
67set_cfg_hooks (struct cfg_hooks new_cfg_hooks)
68{
69 *cfg_hooks = new_cfg_hooks;
70}
71
52bca999 72/* Returns current ir type. */
6de9cd9a 73
52bca999
SB
74enum ir_type
75current_ir_type (void)
6de9cd9a 76{
726a989a 77 if (cfg_hooks == &gimple_cfg_hooks)
52bca999
SB
78 return IR_GIMPLE;
79 else if (cfg_hooks == &rtl_cfg_hooks)
80 return IR_RTL_CFGRTL;
81 else if (cfg_hooks == &cfg_layout_rtl_cfg_hooks)
82 return IR_RTL_CFGLAYOUT;
83 else
84 gcc_unreachable ();
6de9cd9a
DN
85}
86
f470c378
ZD
87/* Verify the CFG consistency.
88
89 Currently it does following: checks edge and basic block list correctness
90 and calls into IL dependent checking then. */
91
24e47c76 92DEBUG_FUNCTION void
f470c378
ZD
93verify_flow_info (void)
94{
95 size_t *edge_checksum;
50f63b1a 96 int err = 0;
f470c378
ZD
97 basic_block bb, last_bb_seen;
98 basic_block *last_visited;
99
100 timevar_push (TV_CFG_VERIFY);
8b1c6fd7
DM
101 last_visited = XCNEWVEC (basic_block, last_basic_block_for_fn (cfun));
102 edge_checksum = XCNEWVEC (size_t, last_basic_block_for_fn (cfun));
f470c378
ZD
103
104 /* Check bb chain & numbers. */
fefa31b5
DM
105 last_bb_seen = ENTRY_BLOCK_PTR_FOR_FN (cfun);
106 FOR_BB_BETWEEN (bb, ENTRY_BLOCK_PTR_FOR_FN (cfun)->next_bb, NULL, next_bb)
f470c378 107 {
fefa31b5 108 if (bb != EXIT_BLOCK_PTR_FOR_FN (cfun)
06e28de2 109 && bb != BASIC_BLOCK_FOR_FN (cfun, bb->index))
f470c378
ZD
110 {
111 error ("bb %d on wrong place", bb->index);
112 err = 1;
113 }
114
115 if (bb->prev_bb != last_bb_seen)
116 {
117 error ("prev_bb of %d should be %d, not %d",
118 bb->index, last_bb_seen->index, bb->prev_bb->index);
119 err = 1;
120 }
121
122 last_bb_seen = bb;
123 }
124
125 /* Now check the basic blocks (boundaries etc.) */
4f42035e 126 FOR_EACH_BB_REVERSE_FN (bb, cfun)
f470c378
ZD
127 {
128 int n_fallthru = 0;
129 edge e;
628f6a4e 130 edge_iterator ei;
f470c378 131
598ec7bd
ZD
132 if (bb->loop_father != NULL && current_loops == NULL)
133 {
134 error ("verify_flow_info: Block %i has loop_father, but there are no loops",
135 bb->index);
136 err = 1;
137 }
138 if (bb->loop_father == NULL && current_loops != NULL)
139 {
140 error ("verify_flow_info: Block %i lacks loop_father", bb->index);
141 err = 1;
142 }
143
3995f3a2 144 if (!bb->count.verify ())
f470c378 145 {
3995f3a2 146 error ("verify_flow_info: Wrong count of block %i", bb->index);
f470c378
ZD
147 err = 1;
148 }
149 if (bb->frequency < 0)
150 {
151 error ("verify_flow_info: Wrong frequency of block %i %i",
c22cacf3 152 bb->index, bb->frequency);
f470c378
ZD
153 err = 1;
154 }
628f6a4e 155 FOR_EACH_EDGE (e, ei, bb->succs)
f470c378 156 {
24bd1a0b 157 if (last_visited [e->dest->index] == bb)
f470c378
ZD
158 {
159 error ("verify_flow_info: Duplicate edge %i->%i",
160 e->src->index, e->dest->index);
161 err = 1;
162 }
163 if (e->probability < 0 || e->probability > REG_BR_PROB_BASE)
164 {
165 error ("verify_flow_info: Wrong probability of edge %i->%i %i",
166 e->src->index, e->dest->index, e->probability);
167 err = 1;
168 }
3995f3a2 169 if (!e->count.verify ())
f470c378 170 {
3995f3a2
JH
171 error ("verify_flow_info: Wrong count of edge %i->%i",
172 e->src->index, e->dest->index);
f470c378
ZD
173 err = 1;
174 }
175
24bd1a0b 176 last_visited [e->dest->index] = bb;
f470c378
ZD
177
178 if (e->flags & EDGE_FALLTHRU)
179 n_fallthru++;
180
181 if (e->src != bb)
182 {
183 error ("verify_flow_info: Basic block %d succ edge is corrupted",
184 bb->index);
185 fprintf (stderr, "Predecessor: ");
a315c44c 186 dump_edge_info (stderr, e, TDF_DETAILS, 0);
f470c378 187 fprintf (stderr, "\nSuccessor: ");
a315c44c 188 dump_edge_info (stderr, e, TDF_DETAILS, 1);
f470c378
ZD
189 fprintf (stderr, "\n");
190 err = 1;
191 }
192
24bd1a0b 193 edge_checksum[e->dest->index] += (size_t) e;
f470c378
ZD
194 }
195 if (n_fallthru > 1)
196 {
ab532386 197 error ("wrong amount of branch edges after unconditional jump %i", bb->index);
f470c378
ZD
198 err = 1;
199 }
200
628f6a4e 201 FOR_EACH_EDGE (e, ei, bb->preds)
f470c378
ZD
202 {
203 if (e->dest != bb)
204 {
205 error ("basic block %d pred edge is corrupted", bb->index);
206 fputs ("Predecessor: ", stderr);
a315c44c 207 dump_edge_info (stderr, e, TDF_DETAILS, 0);
f470c378 208 fputs ("\nSuccessor: ", stderr);
a315c44c 209 dump_edge_info (stderr, e, TDF_DETAILS, 1);
f470c378
ZD
210 fputc ('\n', stderr);
211 err = 1;
212 }
73553871
KH
213
214 if (ei.index != e->dest_idx)
215 {
216 error ("basic block %d pred edge is corrupted", bb->index);
217 error ("its dest_idx should be %d, not %d",
218 ei.index, e->dest_idx);
219 fputs ("Predecessor: ", stderr);
a315c44c 220 dump_edge_info (stderr, e, TDF_DETAILS, 0);
73553871 221 fputs ("\nSuccessor: ", stderr);
a315c44c 222 dump_edge_info (stderr, e, TDF_DETAILS, 1);
73553871
KH
223 fputc ('\n', stderr);
224 err = 1;
225 }
226
24bd1a0b 227 edge_checksum[e->dest->index] -= (size_t) e;
f470c378
ZD
228 }
229 }
230
231 /* Complete edge checksumming for ENTRY and EXIT. */
232 {
233 edge e;
628f6a4e 234 edge_iterator ei;
f470c378 235
fefa31b5 236 FOR_EACH_EDGE (e, ei, ENTRY_BLOCK_PTR_FOR_FN (cfun)->succs)
24bd1a0b 237 edge_checksum[e->dest->index] += (size_t) e;
f470c378 238
fefa31b5 239 FOR_EACH_EDGE (e, ei, EXIT_BLOCK_PTR_FOR_FN (cfun)->preds)
24bd1a0b 240 edge_checksum[e->dest->index] -= (size_t) e;
f470c378
ZD
241 }
242
fefa31b5 243 FOR_BB_BETWEEN (bb, ENTRY_BLOCK_PTR_FOR_FN (cfun), NULL, next_bb)
24bd1a0b 244 if (edge_checksum[bb->index])
f470c378
ZD
245 {
246 error ("basic block %i edge lists are corrupted", bb->index);
247 err = 1;
248 }
249
fefa31b5 250 last_bb_seen = ENTRY_BLOCK_PTR_FOR_FN (cfun);
f470c378
ZD
251
252 /* Clean up. */
253 free (last_visited);
254 free (edge_checksum);
255
256 if (cfg_hooks->verify_flow_info)
257 err |= cfg_hooks->verify_flow_info ();
258 if (err)
259 internal_error ("verify_flow_info failed");
260 timevar_pop (TV_CFG_VERIFY);
261}
262
a315c44c
SB
263/* Print out one basic block BB to file OUTF. INDENT is printed at the
264 start of each new line. FLAGS are the TDF_* flags in dumpfile.h.
265
266 This function takes care of the purely graph related information.
267 The cfg hook for the active representation should dump
268 representation-specific information. */
f470c378
ZD
269
270void
1a817418 271dump_bb (FILE *outf, basic_block bb, int indent, dump_flags_t flags)
f470c378 272{
f8923f7e
SB
273 if (flags & TDF_BLOCKS)
274 dump_bb_info (outf, bb, indent, flags, true, false);
a315c44c
SB
275 if (cfg_hooks->dump_bb)
276 cfg_hooks->dump_bb (outf, bb, indent, flags);
f8923f7e
SB
277 if (flags & TDF_BLOCKS)
278 dump_bb_info (outf, bb, indent, flags, false, true);
c4669594 279 fputc ('\n', outf);
a315c44c
SB
280}
281
7b3b6ae4
LC
282DEBUG_FUNCTION void
283debug (basic_block_def &ref)
284{
285 dump_bb (stderr, &ref, 0, 0);
286}
287
288DEBUG_FUNCTION void
289debug (basic_block_def *ptr)
290{
291 if (ptr)
292 debug (*ptr);
293 else
294 fprintf (stderr, "<nil>\n");
295}
296
297
2c895bd1
SB
298/* Dumps basic block BB to pretty-printer PP, for use as a label of
299 a DOT graph record-node. The implementation of this hook is
300 expected to write the label to the stream that is attached to PP.
301 Field separators between instructions are pipe characters printed
302 verbatim. Instructions should be written with some characters
303 escaped, using pp_write_text_as_dot_label_to_stream(). */
304
305void
306dump_bb_for_graph (pretty_printer *pp, basic_block bb)
307{
308 if (!cfg_hooks->dump_bb_for_graph)
309 internal_error ("%s does not support dump_bb_for_graph",
310 cfg_hooks->name);
3995f3a2
JH
311 /* TODO: Add pretty printer for counter. */
312 if (bb->count.initialized_p ())
313 pp_printf (pp, "COUNT:" "%" PRId64, bb->count.to_gcov_type ());
473b1e05
XDL
314 pp_printf (pp, " FREQ:%i |", bb->frequency);
315 pp_write_text_to_stream (pp);
ecd14de9
XDL
316 if (!(dump_flags & TDF_SLIM))
317 cfg_hooks->dump_bb_for_graph (pp, bb);
2c895bd1
SB
318}
319
a315c44c
SB
320/* Dump the complete CFG to FILE. FLAGS are the TDF_* flags in dumpfile.h. */
321void
1a817418 322dump_flow_info (FILE *file, dump_flags_t flags)
a315c44c
SB
323{
324 basic_block bb;
f470c378 325
0cae8d31 326 fprintf (file, "\n%d basic blocks, %d edges.\n", n_basic_blocks_for_fn (cfun),
dc936fb2 327 n_edges_for_fn (cfun));
04a90bec 328 FOR_ALL_BB_FN (bb, cfun)
c4669594 329 dump_bb (file, bb, 0, flags);
f470c378 330
a315c44c
SB
331 putc ('\n', file);
332}
f470c378 333
a315c44c
SB
334/* Like above, but dump to stderr. To be called from debuggers. */
335void debug_flow_info (void);
336DEBUG_FUNCTION void
337debug_flow_info (void)
338{
339 dump_flow_info (stderr, TDF_DETAILS);
f470c378
ZD
340}
341
342/* Redirect edge E to the given basic block DEST and update underlying program
343 representation. Returns edge representing redirected branch (that may not
344 be equivalent to E in the case of duplicate edges being removed) or NULL
345 if edge is not easily redirectable for whatever reason. */
346
6de9cd9a 347edge
f470c378
ZD
348redirect_edge_and_branch (edge e, basic_block dest)
349{
6de9cd9a 350 edge ret;
f470c378
ZD
351
352 if (!cfg_hooks->redirect_edge_and_branch)
ab532386 353 internal_error ("%s does not support redirect_edge_and_branch",
f470c378
ZD
354 cfg_hooks->name);
355
356 ret = cfg_hooks->redirect_edge_and_branch (e, dest);
357
452ba14d
ZD
358 /* If RET != E, then either the redirection failed, or the edge E
359 was removed since RET already lead to the same destination. */
360 if (current_loops != NULL && ret == e)
361 rescan_loop_exit (e, false, false);
6270df4c 362
f470c378
ZD
363 return ret;
364}
365
14fa2cc0
ZD
366/* Returns true if it is possible to remove the edge E by redirecting it
367 to the destination of the other edge going from its source. */
368
369bool
9678086d 370can_remove_branch_p (const_edge e)
14fa2cc0
ZD
371{
372 if (!cfg_hooks->can_remove_branch_p)
373 internal_error ("%s does not support can_remove_branch_p",
374 cfg_hooks->name);
375
376 if (EDGE_COUNT (e->src->succs) != 2)
377 return false;
378
379 return cfg_hooks->can_remove_branch_p (e);
380}
381
382/* Removes E, by redirecting it to the destination of the other edge going
383 from its source. Can_remove_branch_p must be true for E, hence this
384 operation cannot fail. */
385
386void
387remove_branch (edge e)
388{
389 edge other;
390 basic_block src = e->src;
391 int irr;
392
393 gcc_assert (EDGE_COUNT (e->src->succs) == 2);
394
395 other = EDGE_SUCC (src, EDGE_SUCC (src, 0) == e);
396 irr = other->flags & EDGE_IRREDUCIBLE_LOOP;
397
14fa2cc0
ZD
398 e = redirect_edge_and_branch (e, other->dest);
399 gcc_assert (e != NULL);
400
401 e->flags &= ~EDGE_IRREDUCIBLE_LOOP;
402 e->flags |= irr;
403}
404
452ba14d
ZD
405/* Removes edge E from cfg. Unlike remove_branch, it does not update IL. */
406
407void
408remove_edge (edge e)
409{
410 if (current_loops != NULL)
a84a49b7
RB
411 {
412 rescan_loop_exit (e, false, true);
413
414 /* Removal of an edge inside an irreducible region or which leads
415 to an irreducible region can turn the region into a natural loop.
416 In that case, ask for the loop structure fixups.
417
418 FIXME: Note that LOOPS_HAVE_MARKED_IRREDUCIBLE_REGIONS is not always
419 set, so always ask for fixups when removing an edge in that case. */
420 if (!loops_state_satisfies_p (LOOPS_HAVE_MARKED_IRREDUCIBLE_REGIONS)
421 || (e->flags & EDGE_IRREDUCIBLE_LOOP)
422 || (e->dest->flags & BB_IRREDUCIBLE_LOOP))
423 loops_state_set (LOOPS_NEED_FIXUP);
424 }
452ba14d 425
532aafad
SB
426 /* This is probably not needed, but it doesn't hurt. */
427 /* FIXME: This should be called via a remove_edge hook. */
428 if (current_ir_type () == IR_GIMPLE)
429 redirect_edge_var_map_clear (e);
430
452ba14d
ZD
431 remove_edge_raw (e);
432}
433
532aafad
SB
434/* Like redirect_edge_succ but avoid possible duplicate edge. */
435
436edge
437redirect_edge_succ_nodup (edge e, basic_block new_succ)
438{
439 edge s;
440
441 s = find_edge (e->src, new_succ);
442 if (s && s != e)
443 {
444 s->flags |= e->flags;
445 s->probability += e->probability;
446 if (s->probability > REG_BR_PROB_BASE)
447 s->probability = REG_BR_PROB_BASE;
448 s->count += e->count;
449 /* FIXME: This should be called via a hook and only for IR_GIMPLE. */
450 redirect_edge_var_map_dup (s, e);
451 remove_edge (e);
452 e = s;
453 }
454 else
455 redirect_edge_succ (e, new_succ);
456
457 return e;
458}
459
f470c378
ZD
460/* Redirect the edge E to basic block DEST even if it requires creating
461 of a new basic block; then it returns the newly created basic block.
462 Aborts when redirection is impossible. */
463
464basic_block
465redirect_edge_and_branch_force (edge e, basic_block dest)
466{
6270df4c 467 basic_block ret, src = e->src;
f470c378
ZD
468
469 if (!cfg_hooks->redirect_edge_and_branch_force)
ab532386 470 internal_error ("%s does not support redirect_edge_and_branch_force",
f470c378
ZD
471 cfg_hooks->name);
472
6270df4c
ZD
473 if (current_loops != NULL)
474 rescan_loop_exit (e, false, true);
475
f470c378 476 ret = cfg_hooks->redirect_edge_and_branch_force (e, dest);
1e6d1da0 477
cf103ca4 478 if (ret != NULL && dom_info_available_p (CDI_DOMINATORS))
89f8f30f
ZD
479 set_immediate_dominator (CDI_DOMINATORS, ret, src);
480
6270df4c 481 if (current_loops != NULL)
598ec7bd 482 {
6270df4c
ZD
483 if (ret != NULL)
484 {
1e6d1da0
EB
485 struct loop *loop
486 = find_common_loop (single_pred (ret)->loop_father,
487 single_succ (ret)->loop_father);
6270df4c
ZD
488 add_bb_to_loop (ret, loop);
489 }
490 else if (find_edge (src, dest) == e)
491 rescan_loop_exit (e, true, false);
598ec7bd 492 }
f470c378
ZD
493
494 return ret;
495}
496
497/* Splits basic block BB after the specified instruction I (but at least after
498 the labels). If I is NULL, splits just after labels. The newly created edge
499 is returned. The new basic block is created just after the old one. */
500
c4d281b2
RB
501static edge
502split_block_1 (basic_block bb, void *i)
f470c378
ZD
503{
504 basic_block new_bb;
ede7cba0 505 edge res;
f470c378
ZD
506
507 if (!cfg_hooks->split_block)
ab532386 508 internal_error ("%s does not support split_block", cfg_hooks->name);
f470c378
ZD
509
510 new_bb = cfg_hooks->split_block (bb, i);
511 if (!new_bb)
512 return NULL;
513
514 new_bb->count = bb->count;
515 new_bb->frequency = bb->frequency;
cbea518e 516 new_bb->discriminator = bb->discriminator;
f470c378 517
fce22de5 518 if (dom_info_available_p (CDI_DOMINATORS))
f470c378
ZD
519 {
520 redirect_immediate_dominators (CDI_DOMINATORS, bb, new_bb);
521 set_immediate_dominator (CDI_DOMINATORS, new_bb, bb);
522 }
523
598ec7bd 524 if (current_loops != NULL)
dbdc7f97 525 {
1f3388fe
RB
526 edge_iterator ei;
527 edge e;
dbdc7f97 528 add_bb_to_loop (new_bb, bb->loop_father);
1f3388fe
RB
529 /* Identify all loops bb may have been the latch of and adjust them. */
530 FOR_EACH_EDGE (e, ei, new_bb->succs)
531 if (e->dest->loop_father->latch == bb)
532 e->dest->loop_father->latch = new_bb;
dbdc7f97 533 }
598ec7bd 534
ede7cba0
SP
535 res = make_single_succ_edge (bb, new_bb, EDGE_FALLTHRU);
536
537 if (bb->flags & BB_IRREDUCIBLE_LOOP)
538 {
539 new_bb->flags |= BB_IRREDUCIBLE_LOOP;
540 res->flags |= EDGE_IRREDUCIBLE_LOOP;
541 }
542
543 return res;
f470c378
ZD
544}
545
c4d281b2 546edge
355fe088 547split_block (basic_block bb, gimple *i)
c4d281b2
RB
548{
549 return split_block_1 (bb, i);
550}
551
552edge
553split_block (basic_block bb, rtx i)
554{
555 return split_block_1 (bb, i);
556}
557
f470c378
ZD
558/* Splits block BB just after labels. The newly created edge is returned. */
559
560edge
561split_block_after_labels (basic_block bb)
562{
c4d281b2 563 return split_block_1 (bb, NULL);
f470c378
ZD
564}
565
321440fd 566/* Moves block BB immediately after block AFTER. Returns false if the
f470c378
ZD
567 movement was impossible. */
568
569bool
570move_block_after (basic_block bb, basic_block after)
571{
572 bool ret;
573
574 if (!cfg_hooks->move_block_after)
ab532386 575 internal_error ("%s does not support move_block_after", cfg_hooks->name);
f470c378
ZD
576
577 ret = cfg_hooks->move_block_after (bb, after);
578
579 return ret;
580}
581
582/* Deletes the basic block BB. */
583
584void
585delete_basic_block (basic_block bb)
586{
587 if (!cfg_hooks->delete_basic_block)
ab532386 588 internal_error ("%s does not support delete_basic_block", cfg_hooks->name);
f470c378
ZD
589
590 cfg_hooks->delete_basic_block (bb);
591
598ec7bd
ZD
592 if (current_loops != NULL)
593 {
594 struct loop *loop = bb->loop_father;
595
596 /* If we remove the header or the latch of a loop, mark the loop for
08c13199 597 removal. */
598ec7bd
ZD
598 if (loop->latch == bb
599 || loop->header == bb)
08c13199 600 mark_loop_for_removal (loop);
598ec7bd
ZD
601
602 remove_bb_from_loops (bb);
603 }
604
f470c378
ZD
605 /* Remove the edges into and out of this block. Note that there may
606 indeed be edges in, if we are removing an unreachable loop. */
628f6a4e
BE
607 while (EDGE_COUNT (bb->preds) != 0)
608 remove_edge (EDGE_PRED (bb, 0));
609 while (EDGE_COUNT (bb->succs) != 0)
610 remove_edge (EDGE_SUCC (bb, 0));
f470c378 611
2b28c07a 612 if (dom_info_available_p (CDI_DOMINATORS))
f470c378 613 delete_from_dominance_info (CDI_DOMINATORS, bb);
2b28c07a 614 if (dom_info_available_p (CDI_POST_DOMINATORS))
f470c378
ZD
615 delete_from_dominance_info (CDI_POST_DOMINATORS, bb);
616
617 /* Remove the basic block from the array. */
618 expunge_block (bb);
619}
620
621/* Splits edge E and returns the newly created basic block. */
622
623basic_block
624split_edge (edge e)
625{
626 basic_block ret;
3995f3a2 627 profile_count count = e->count;
f470c378 628 int freq = EDGE_FREQUENCY (e);
017b3258 629 edge f;
a746fd8c 630 bool irr = (e->flags & EDGE_IRREDUCIBLE_LOOP) != 0;
598ec7bd
ZD
631 struct loop *loop;
632 basic_block src = e->src, dest = e->dest;
f470c378
ZD
633
634 if (!cfg_hooks->split_edge)
ab532386 635 internal_error ("%s does not support split_edge", cfg_hooks->name);
f470c378 636
6270df4c
ZD
637 if (current_loops != NULL)
638 rescan_loop_exit (e, false, true);
639
f470c378
ZD
640 ret = cfg_hooks->split_edge (e);
641 ret->count = count;
642 ret->frequency = freq;
c5cbcccf
ZD
643 single_succ_edge (ret)->probability = REG_BR_PROB_BASE;
644 single_succ_edge (ret)->count = count;
f470c378 645
a746fd8c
ZD
646 if (irr)
647 {
648 ret->flags |= BB_IRREDUCIBLE_LOOP;
c5cbcccf
ZD
649 single_pred_edge (ret)->flags |= EDGE_IRREDUCIBLE_LOOP;
650 single_succ_edge (ret)->flags |= EDGE_IRREDUCIBLE_LOOP;
a746fd8c
ZD
651 }
652
2b28c07a 653 if (dom_info_available_p (CDI_DOMINATORS))
c5cbcccf 654 set_immediate_dominator (CDI_DOMINATORS, ret, single_pred (ret));
f470c378 655
2b28c07a 656 if (dom_info_state (CDI_DOMINATORS) >= DOM_NO_FAST_QUERY)
017b3258
ZD
657 {
658 /* There are two cases:
659
660 If the immediate dominator of e->dest is not e->src, it
661 remains unchanged.
662
663 If immediate dominator of e->dest is e->src, it may become
664 ret, provided that all other predecessors of e->dest are
665 dominated by e->dest. */
666
c5cbcccf
ZD
667 if (get_immediate_dominator (CDI_DOMINATORS, single_succ (ret))
668 == single_pred (ret))
017b3258 669 {
628f6a4e 670 edge_iterator ei;
c5cbcccf 671 FOR_EACH_EDGE (f, ei, single_succ (ret)->preds)
017b3258 672 {
c5cbcccf 673 if (f == single_succ_edge (ret))
017b3258
ZD
674 continue;
675
676 if (!dominated_by_p (CDI_DOMINATORS, f->src,
c5cbcccf 677 single_succ (ret)))
017b3258
ZD
678 break;
679 }
680
681 if (!f)
c5cbcccf 682 set_immediate_dominator (CDI_DOMINATORS, single_succ (ret), ret);
017b3258 683 }
598ec7bd
ZD
684 }
685
686 if (current_loops != NULL)
687 {
688 loop = find_common_loop (src->loop_father, dest->loop_father);
689 add_bb_to_loop (ret, loop);
690
3551257c
RB
691 /* If we split the latch edge of loop adjust the latch block. */
692 if (loop->latch == src
693 && loop->header == dest)
598ec7bd
ZD
694 loop->latch = ret;
695 }
f470c378
ZD
696
697 return ret;
698}
699
700/* Creates a new basic block just after the basic block AFTER.
701 HEAD and END are the first and the last statement belonging
702 to the block. If both are NULL, an empty block is created. */
703
c4d281b2
RB
704static basic_block
705create_basic_block_1 (void *head, void *end, basic_block after)
f470c378
ZD
706{
707 basic_block ret;
708
709 if (!cfg_hooks->create_basic_block)
ab532386 710 internal_error ("%s does not support create_basic_block", cfg_hooks->name);
f470c378
ZD
711
712 ret = cfg_hooks->create_basic_block (head, end, after);
713
2b28c07a 714 if (dom_info_available_p (CDI_DOMINATORS))
f470c378 715 add_to_dominance_info (CDI_DOMINATORS, ret);
2b28c07a 716 if (dom_info_available_p (CDI_POST_DOMINATORS))
f470c378
ZD
717 add_to_dominance_info (CDI_POST_DOMINATORS, ret);
718
719 return ret;
720}
721
c4d281b2
RB
722basic_block
723create_basic_block (gimple_seq seq, basic_block after)
724{
725 return create_basic_block_1 (seq, NULL, after);
726}
727
728basic_block
729create_basic_block (rtx head, rtx end, basic_block after)
730{
731 return create_basic_block_1 (head, end, after);
732}
733
734
f470c378
ZD
735/* Creates an empty basic block just after basic block AFTER. */
736
737basic_block
738create_empty_bb (basic_block after)
739{
c4d281b2 740 return create_basic_block_1 (NULL, NULL, after);
f470c378
ZD
741}
742
743/* Checks whether we may merge blocks BB1 and BB2. */
744
745bool
b48d0358 746can_merge_blocks_p (basic_block bb1, basic_block bb2)
f470c378
ZD
747{
748 bool ret;
749
750 if (!cfg_hooks->can_merge_blocks_p)
ab532386 751 internal_error ("%s does not support can_merge_blocks_p", cfg_hooks->name);
f470c378
ZD
752
753 ret = cfg_hooks->can_merge_blocks_p (bb1, bb2);
754
755 return ret;
756}
757
6de9cd9a
DN
758void
759predict_edge (edge e, enum br_predictor predictor, int probability)
760{
761 if (!cfg_hooks->predict_edge)
ab532386 762 internal_error ("%s does not support predict_edge", cfg_hooks->name);
6de9cd9a
DN
763
764 cfg_hooks->predict_edge (e, predictor, probability);
765}
766
767bool
9678086d 768predicted_by_p (const_basic_block bb, enum br_predictor predictor)
6de9cd9a
DN
769{
770 if (!cfg_hooks->predict_edge)
ab532386 771 internal_error ("%s does not support predicted_by_p", cfg_hooks->name);
6de9cd9a
DN
772
773 return cfg_hooks->predicted_by_p (bb, predictor);
774}
775
f470c378
ZD
776/* Merges basic block B into basic block A. */
777
778void
779merge_blocks (basic_block a, basic_block b)
780{
781 edge e;
628f6a4e 782 edge_iterator ei;
f470c378
ZD
783
784 if (!cfg_hooks->merge_blocks)
ab532386 785 internal_error ("%s does not support merge_blocks", cfg_hooks->name);
f470c378 786
9e824336
ZD
787 cfg_hooks->merge_blocks (a, b);
788
598ec7bd 789 if (current_loops != NULL)
7d776ee2 790 {
63f2ff0f
RB
791 /* If the block we merge into is a loop header do nothing unless ... */
792 if (a->loop_father->header == a)
793 {
794 /* ... we merge two loop headers, in which case we kill
795 the inner loop. */
796 if (b->loop_father->header == b)
08c13199 797 mark_loop_for_removal (b->loop_father);
63f2ff0f
RB
798 }
799 /* If we merge a loop header into its predecessor, update the loop
800 structure. */
801 else if (b->loop_father->header == b)
7d776ee2
RG
802 {
803 remove_bb_from_loops (a);
804 add_bb_to_loop (a, b->loop_father);
805 a->loop_father->header = a;
806 }
93a95abe
RB
807 /* If we merge a loop latch into its predecessor, update the loop
808 structure. */
809 if (b->loop_father->latch
810 && b->loop_father->latch == b)
811 b->loop_father->latch = a;
7d776ee2
RG
812 remove_bb_from_loops (b);
813 }
598ec7bd 814
f470c378
ZD
815 /* Normally there should only be one successor of A and that is B, but
816 partway though the merge of blocks for conditional_execution we'll
817 be merging a TEST block with THEN and ELSE successors. Free the
818 whole lot of them and hope the caller knows what they're doing. */
628f6a4e
BE
819
820 while (EDGE_COUNT (a->succs) != 0)
452ba14d 821 remove_edge (EDGE_SUCC (a, 0));
f470c378
ZD
822
823 /* Adjust the edges out of B for the new owner. */
628f6a4e 824 FOR_EACH_EDGE (e, ei, b->succs)
6270df4c
ZD
825 {
826 e->src = a;
827 if (current_loops != NULL)
6aaf596b
RB
828 {
829 /* If b was a latch, a now is. */
830 if (e->dest->loop_father->latch == b)
831 e->dest->loop_father->latch = a;
832 rescan_loop_exit (e, true, false);
833 }
6270df4c 834 }
628f6a4e 835 a->succs = b->succs;
f470c378
ZD
836 a->flags |= b->flags;
837
838 /* B hasn't quite yet ceased to exist. Attempt to prevent mishap. */
628f6a4e 839 b->preds = b->succs = NULL;
f470c378 840
2b28c07a 841 if (dom_info_available_p (CDI_DOMINATORS))
f470c378
ZD
842 redirect_immediate_dominators (CDI_DOMINATORS, b, a);
843
2b28c07a 844 if (dom_info_available_p (CDI_DOMINATORS))
f470c378 845 delete_from_dominance_info (CDI_DOMINATORS, b);
2b28c07a 846 if (dom_info_available_p (CDI_POST_DOMINATORS))
f470c378
ZD
847 delete_from_dominance_info (CDI_POST_DOMINATORS, b);
848
849 expunge_block (b);
850}
851
852/* Split BB into entry part and the rest (the rest is the newly created block).
853 Redirect those edges for that REDIRECT_EDGE_P returns true to the entry
854 part. Returns the edge connecting the entry part to the rest. */
855
856edge
857make_forwarder_block (basic_block bb, bool (*redirect_edge_p) (edge),
858 void (*new_bb_cbk) (basic_block))
859{
628f6a4e
BE
860 edge e, fallthru;
861 edge_iterator ei;
f470c378 862 basic_block dummy, jump;
598ec7bd 863 struct loop *loop, *ploop, *cloop;
f470c378
ZD
864
865 if (!cfg_hooks->make_forwarder_block)
ab532386 866 internal_error ("%s does not support make_forwarder_block",
f470c378
ZD
867 cfg_hooks->name);
868
869 fallthru = split_block_after_labels (bb);
870 dummy = fallthru->src;
3995f3a2 871 dummy->count = profile_count::zero ();
b0e66512 872 dummy->frequency = 0;
3995f3a2 873 fallthru->count = profile_count::zero ();
f470c378
ZD
874 bb = fallthru->dest;
875
876 /* Redirect back edges we want to keep. */
628f6a4e 877 for (ei = ei_start (dummy->preds); (e = ei_safe_edge (ei)); )
f470c378 878 {
e855c69d
AB
879 basic_block e_src;
880
f470c378 881 if (redirect_edge_p (e))
628f6a4e 882 {
b0e66512 883 dummy->frequency += EDGE_FREQUENCY (e);
11f3ac49
TS
884 if (dummy->frequency > BB_FREQ_MAX)
885 dummy->frequency = BB_FREQ_MAX;
886
b0e66512
DC
887 dummy->count += e->count;
888 fallthru->count += e->count;
628f6a4e
BE
889 ei_next (&ei);
890 continue;
891 }
f470c378 892
e855c69d 893 e_src = e->src;
f470c378 894 jump = redirect_edge_and_branch_force (e, bb);
e855c69d
AB
895 if (jump != NULL)
896 {
897 /* If we redirected the loop latch edge, the JUMP block now acts like
898 the new latch of the loop. */
899 if (current_loops != NULL
900 && dummy->loop_father != NULL
901 && dummy->loop_father->header == dummy
902 && dummy->loop_father->latch == e_src)
903 dummy->loop_father->latch = jump;
b8698a0f 904
e855c69d
AB
905 if (new_bb_cbk != NULL)
906 new_bb_cbk (jump);
907 }
f470c378
ZD
908 }
909
fce22de5 910 if (dom_info_available_p (CDI_DOMINATORS))
f470c378 911 {
9771b263
DN
912 vec<basic_block> doms_to_fix;
913 doms_to_fix.create (2);
914 doms_to_fix.quick_push (dummy);
915 doms_to_fix.quick_push (bb);
66f97d31 916 iterate_fix_dominators (CDI_DOMINATORS, doms_to_fix, false);
9771b263 917 doms_to_fix.release ();
f470c378
ZD
918 }
919
598ec7bd
ZD
920 if (current_loops != NULL)
921 {
922 /* If we do not split a loop header, then both blocks belong to the
923 same loop. In case we split loop header and do not redirect the
924 latch edge to DUMMY, then DUMMY belongs to the outer loop, and
89f8f30f
ZD
925 BB becomes the new header. If latch is not recorded for the loop,
926 we leave this updating on the caller (this may only happen during
927 loop analysis). */
598ec7bd
ZD
928 loop = dummy->loop_father;
929 if (loop->header == dummy
89f8f30f 930 && loop->latch != NULL
598ec7bd
ZD
931 && find_edge (loop->latch, dummy) == NULL)
932 {
933 remove_bb_from_loops (dummy);
934 loop->header = bb;
935
936 cloop = loop;
937 FOR_EACH_EDGE (e, ei, dummy->preds)
938 {
939 cloop = find_common_loop (cloop, e->src->loop_father);
940 }
941 add_bb_to_loop (dummy, cloop);
942 }
943
944 /* In case we split loop latch, update it. */
9ba025a2 945 for (ploop = loop; ploop; ploop = loop_outer (ploop))
598ec7bd
ZD
946 if (ploop->latch == dummy)
947 ploop->latch = bb;
948 }
949
f470c378
ZD
950 cfg_hooks->make_forwarder_block (fallthru);
951
952 return fallthru;
953}
954
cf103ca4
EB
955/* Try to make the edge fallthru. */
956
f470c378
ZD
957void
958tidy_fallthru_edge (edge e)
959{
960 if (cfg_hooks->tidy_fallthru_edge)
961 cfg_hooks->tidy_fallthru_edge (e);
962}
963
964/* Fix up edges that now fall through, or rather should now fall through
965 but previously required a jump around now deleted blocks. Simplify
966 the search by only examining blocks numerically adjacent, since this
8effe856
EB
967 is how they were created.
968
969 ??? This routine is currently RTL specific. */
f470c378
ZD
970
971void
972tidy_fallthru_edges (void)
973{
974 basic_block b, c;
975
976 if (!cfg_hooks->tidy_fallthru_edge)
977 return;
978
fefa31b5 979 if (ENTRY_BLOCK_PTR_FOR_FN (cfun)->next_bb == EXIT_BLOCK_PTR_FOR_FN (cfun))
f470c378
ZD
980 return;
981
fefa31b5
DM
982 FOR_BB_BETWEEN (b, ENTRY_BLOCK_PTR_FOR_FN (cfun)->next_bb,
983 EXIT_BLOCK_PTR_FOR_FN (cfun)->prev_bb, next_bb)
f470c378
ZD
984 {
985 edge s;
986
987 c = b->next_bb;
988
989 /* We care about simple conditional or unconditional jumps with
990 a single successor.
991
992 If we had a conditional branch to the next instruction when
3cabd6d1
LB
993 CFG was built, then there will only be one out edge for the
994 block which ended with the conditional branch (since we do
995 not create duplicate edges).
f470c378
ZD
996
997 Furthermore, the edge will be marked as a fallthru because we
998 merge the flags for the duplicate edges. So we do not want to
999 check that the edge is not a FALLTHRU edge. */
1000
c5cbcccf 1001 if (single_succ_p (b))
628f6a4e 1002 {
c5cbcccf 1003 s = single_succ_edge (b);
628f6a4e
BE
1004 if (! (s->flags & EDGE_COMPLEX)
1005 && s->dest == c
339ba33b 1006 && !(JUMP_P (BB_END (b)) && CROSSING_JUMP_P (BB_END (b))))
628f6a4e
BE
1007 tidy_fallthru_edge (s);
1008 }
f470c378
ZD
1009 }
1010}
6de9cd9a 1011
cf103ca4
EB
1012/* Edge E is assumed to be fallthru edge. Emit needed jump instruction
1013 (and possibly create new basic block) to make edge non-fallthru.
1014 Return newly created BB or NULL if none. */
1015
1016basic_block
1017force_nonfallthru (edge e)
1018{
1e6d1da0 1019 basic_block ret, src = e->src;
cf103ca4
EB
1020
1021 if (!cfg_hooks->force_nonfallthru)
1022 internal_error ("%s does not support force_nonfallthru",
1023 cfg_hooks->name);
1024
cf103ca4 1025 ret = cfg_hooks->force_nonfallthru (e);
1e6d1da0 1026 if (ret != NULL)
cf103ca4 1027 {
1e6d1da0
EB
1028 if (dom_info_available_p (CDI_DOMINATORS))
1029 set_immediate_dominator (CDI_DOMINATORS, ret, src);
1030
1031 if (current_loops != NULL)
cf103ca4 1032 {
ee281008
RB
1033 basic_block pred = single_pred (ret);
1034 basic_block succ = single_succ (ret);
1e6d1da0 1035 struct loop *loop
ee281008 1036 = find_common_loop (pred->loop_father, succ->loop_father);
1e6d1da0 1037 rescan_loop_exit (e, false, true);
cf103ca4 1038 add_bb_to_loop (ret, loop);
ee281008
RB
1039
1040 /* If we split the latch edge of loop adjust the latch block. */
1041 if (loop->latch == pred
1042 && loop->header == succ)
1043 loop->latch = ret;
cf103ca4 1044 }
cf103ca4
EB
1045 }
1046
1047 return ret;
1048}
1049
6de9cd9a
DN
1050/* Returns true if we can duplicate basic block BB. */
1051
1052bool
9678086d 1053can_duplicate_block_p (const_basic_block bb)
6de9cd9a 1054{
6de9cd9a 1055 if (!cfg_hooks->can_duplicate_block_p)
ab532386 1056 internal_error ("%s does not support can_duplicate_block_p",
6de9cd9a
DN
1057 cfg_hooks->name);
1058
fefa31b5 1059 if (bb == EXIT_BLOCK_PTR_FOR_FN (cfun) || bb == ENTRY_BLOCK_PTR_FOR_FN (cfun))
6de9cd9a
DN
1060 return false;
1061
6de9cd9a
DN
1062 return cfg_hooks->can_duplicate_block_p (bb);
1063}
1064
1065/* Duplicates basic block BB and redirects edge E to it. Returns the
b9a66240
ZD
1066 new basic block. The new basic block is placed after the basic block
1067 AFTER. */
6de9cd9a
DN
1068
1069basic_block
b9a66240 1070duplicate_block (basic_block bb, edge e, basic_block after)
6de9cd9a
DN
1071{
1072 edge s, n;
1073 basic_block new_bb;
3995f3a2 1074 profile_count new_count = e ? e->count : profile_count::uninitialized ();
628f6a4e 1075 edge_iterator ei;
6de9cd9a
DN
1076
1077 if (!cfg_hooks->duplicate_block)
ab532386 1078 internal_error ("%s does not support duplicate_block",
6de9cd9a
DN
1079 cfg_hooks->name);
1080
1081 if (bb->count < new_count)
1082 new_count = bb->count;
e376fe58 1083
77a74ed7 1084 gcc_checking_assert (can_duplicate_block_p (bb));
6de9cd9a
DN
1085
1086 new_bb = cfg_hooks->duplicate_block (bb);
b9a66240
ZD
1087 if (after)
1088 move_block_after (new_bb, after);
6de9cd9a 1089
6de9cd9a 1090 new_bb->flags = bb->flags;
628f6a4e 1091 FOR_EACH_EDGE (s, ei, bb->succs)
6de9cd9a
DN
1092 {
1093 /* Since we are creating edges from a new block to successors
1094 of another block (which therefore are known to be disjoint), there
1095 is no need to actually check for duplicated edges. */
1096 n = unchecked_make_edge (new_bb, s->dest, s->flags);
1097 n->probability = s->probability;
3995f3a2 1098 if (e && bb->count > profile_count::zero ())
6de9cd9a 1099 {
3995f3a2 1100 n->count = s->count.apply_scale (new_count, bb->count);
6de9cd9a
DN
1101 s->count -= n->count;
1102 }
1103 else
1104 n->count = s->count;
1105 n->aux = s->aux;
1106 }
1107
1108 if (e)
1109 {
1110 new_bb->count = new_count;
1111 bb->count -= new_count;
1112
1113 new_bb->frequency = EDGE_FREQUENCY (e);
1114 bb->frequency -= EDGE_FREQUENCY (e);
1115
1116 redirect_edge_and_branch_force (e, new_bb);
1117
6de9cd9a
DN
1118 if (bb->frequency < 0)
1119 bb->frequency = 0;
1120 }
1121 else
1122 {
1123 new_bb->count = bb->count;
1124 new_bb->frequency = bb->frequency;
1125 }
1126
6580ee77
JH
1127 set_bb_original (new_bb, bb);
1128 set_bb_copy (bb, new_bb);
6de9cd9a 1129
b02b9b53
ZD
1130 /* Add the new block to the copy of the loop of BB, or directly to the loop
1131 of BB if the loop is not being copied. */
598ec7bd 1132 if (current_loops != NULL)
b02b9b53
ZD
1133 {
1134 struct loop *cloop = bb->loop_father;
561e8a90 1135 struct loop *copy = get_loop_copy (cloop);
07b1bf20
RG
1136 /* If we copied the loop header block but not the loop
1137 we have created a loop with multiple entries. Ditch the loop,
1138 add the new block to the outer loop and arrange for a fixup. */
7d776ee2 1139 if (!copy
07b1bf20 1140 && cloop->header == bb)
7d776ee2 1141 {
07b1bf20 1142 add_bb_to_loop (new_bb, loop_outer (cloop));
08c13199 1143 mark_loop_for_removal (cloop);
07b1bf20
RG
1144 }
1145 else
1146 {
1147 add_bb_to_loop (new_bb, copy ? copy : cloop);
1148 /* If we copied the loop latch block but not the loop, adjust
1149 loop state. */
1150 if (!copy
1151 && cloop->latch == bb)
1152 {
1153 cloop->latch = NULL;
1154 loops_state_set (LOOPS_MAY_HAVE_MULTIPLE_LATCHES);
1155 }
7d776ee2 1156 }
b02b9b53 1157 }
598ec7bd 1158
6de9cd9a
DN
1159 return new_bb;
1160}
1161
1162/* Return 1 if BB ends with a call, possibly followed by some
1163 instructions that must stay with the call, 0 otherwise. */
1164
c22cacf3 1165bool
b48d0358 1166block_ends_with_call_p (basic_block bb)
6de9cd9a
DN
1167{
1168 if (!cfg_hooks->block_ends_with_call_p)
1169 internal_error ("%s does not support block_ends_with_call_p", cfg_hooks->name);
1170
1171 return (cfg_hooks->block_ends_with_call_p) (bb);
1172}
1173
1174/* Return 1 if BB ends with a conditional branch, 0 otherwise. */
1175
c22cacf3 1176bool
9678086d 1177block_ends_with_condjump_p (const_basic_block bb)
6de9cd9a
DN
1178{
1179 if (!cfg_hooks->block_ends_with_condjump_p)
1180 internal_error ("%s does not support block_ends_with_condjump_p",
1181 cfg_hooks->name);
1182
1183 return (cfg_hooks->block_ends_with_condjump_p) (bb);
1184}
1185
1186/* Add fake edges to the function exit for any non constant and non noreturn
1187 calls, volatile inline assembly in the bitmap of blocks specified by
1188 BLOCKS or to the whole CFG if BLOCKS is zero. Return the number of blocks
1189 that were split.
1190
1191 The goal is to expose cases in which entering a basic block does not imply
1192 that all subsequent instructions must be executed. */
1193
1194int
1195flow_call_edges_add (sbitmap blocks)
1196{
1197 if (!cfg_hooks->flow_call_edges_add)
c22cacf3 1198 internal_error ("%s does not support flow_call_edges_add",
6de9cd9a
DN
1199 cfg_hooks->name);
1200
1201 return (cfg_hooks->flow_call_edges_add) (blocks);
1202}
d9d4706f
KH
1203
1204/* This function is called immediately after edge E is added to the
1205 edge vector E->dest->preds. */
1206
1207void
1208execute_on_growing_pred (edge e)
1209{
1210 if (cfg_hooks->execute_on_growing_pred)
1211 cfg_hooks->execute_on_growing_pred (e);
1212}
1213
1214/* This function is called immediately before edge E is removed from
1215 the edge vector E->dest->preds. */
1216
1217void
1218execute_on_shrinking_pred (edge e)
1219{
1220 if (cfg_hooks->execute_on_shrinking_pred)
1221 cfg_hooks->execute_on_shrinking_pred (e);
1222}
1cb7dfc3 1223
c22cacf3
MS
1224/* This is used inside loop versioning when we want to insert
1225 stmts/insns on the edges, which have a different behavior
1cb7dfc3
MH
1226 in tree's and in RTL, so we made a CFG hook. */
1227void
1228lv_flush_pending_stmts (edge e)
1229{
1230 if (cfg_hooks->flush_pending_stmts)
1231 cfg_hooks->flush_pending_stmts (e);
1232}
1233
1234/* Loop versioning uses the duplicate_loop_to_header_edge to create
1235 a new version of the loop basic-blocks, the parameters here are
1236 exactly the same as in duplicate_loop_to_header_edge or
1237 tree_duplicate_loop_to_header_edge; while in tree-ssa there is
1238 additional work to maintain ssa information that's why there is
1239 a need to call the tree_duplicate_loop_to_header_edge rather
1240 than duplicate_loop_to_header_edge when we are in tree mode. */
1241bool
1242cfg_hook_duplicate_loop_to_header_edge (struct loop *loop, edge e,
d73be268 1243 unsigned int ndupl,
1cb7dfc3 1244 sbitmap wont_exit, edge orig,
9771b263 1245 vec<edge> *to_remove,
ee8c1b05 1246 int flags)
1cb7dfc3
MH
1247{
1248 gcc_assert (cfg_hooks->cfg_hook_duplicate_loop_to_header_edge);
d73be268 1249 return cfg_hooks->cfg_hook_duplicate_loop_to_header_edge (loop, e,
1cb7dfc3
MH
1250 ndupl, wont_exit,
1251 orig, to_remove,
ee8c1b05 1252 flags);
1cb7dfc3
MH
1253}
1254
1255/* Conditional jumps are represented differently in trees and RTL,
1256 this hook takes a basic block that is known to have a cond jump
fa10beec 1257 at its end and extracts the taken and not taken edges out of it
1cb7dfc3
MH
1258 and store it in E1 and E2 respectively. */
1259void
1260extract_cond_bb_edges (basic_block b, edge *e1, edge *e2)
1261{
1262 gcc_assert (cfg_hooks->extract_cond_bb_edges);
1263 cfg_hooks->extract_cond_bb_edges (b, e1, e2);
1264}
1265
1266/* Responsible for updating the ssa info (PHI nodes) on the
315682fb 1267 new condition basic block that guards the versioned loop. */
1cb7dfc3
MH
1268void
1269lv_adjust_loop_header_phi (basic_block first, basic_block second,
ae50c0cb 1270 basic_block new_block, edge e)
1cb7dfc3
MH
1271{
1272 if (cfg_hooks->lv_adjust_loop_header_phi)
ae50c0cb 1273 cfg_hooks->lv_adjust_loop_header_phi (first, second, new_block, e);
1cb7dfc3
MH
1274}
1275
1276/* Conditions in trees and RTL are different so we need
1277 a different handling when we add the condition to the
1278 versioning code. */
1279void
1280lv_add_condition_to_bb (basic_block first, basic_block second,
ae50c0cb 1281 basic_block new_block, void *cond)
1cb7dfc3
MH
1282{
1283 gcc_assert (cfg_hooks->lv_add_condition_to_bb);
ae50c0cb 1284 cfg_hooks->lv_add_condition_to_bb (first, second, new_block, cond);
c22cacf3 1285}
78bde837
SB
1286
1287/* Checks whether all N blocks in BBS array can be copied. */
1288bool
1289can_copy_bbs_p (basic_block *bbs, unsigned n)
1290{
1291 unsigned i;
1292 edge e;
1293 int ret = true;
1294
1295 for (i = 0; i < n; i++)
1296 bbs[i]->flags |= BB_DUPLICATED;
1297
1298 for (i = 0; i < n; i++)
1299 {
1300 /* In case we should redirect abnormal edge during duplication, fail. */
1301 edge_iterator ei;
1302 FOR_EACH_EDGE (e, ei, bbs[i]->succs)
1303 if ((e->flags & EDGE_ABNORMAL)
1304 && (e->dest->flags & BB_DUPLICATED))
1305 {
1306 ret = false;
1307 goto end;
1308 }
1309
1310 if (!can_duplicate_block_p (bbs[i]))
1311 {
1312 ret = false;
1313 break;
1314 }
1315 }
1316
1317end:
1318 for (i = 0; i < n; i++)
1319 bbs[i]->flags &= ~BB_DUPLICATED;
1320
1321 return ret;
1322}
1323
1324/* Duplicates N basic blocks stored in array BBS. Newly created basic blocks
1325 are placed into array NEW_BBS in the same order. Edges from basic blocks
f14540b6
SE
1326 in BBS are also duplicated and copies of those that lead into BBS are
1327 redirected to appropriate newly created block. The function assigns bbs
1328 into loops (copy of basic block bb is assigned to bb->loop_father->copy
1329 loop, so this must be set up correctly in advance)
1330
1331 If UPDATE_DOMINANCE is true then this function updates dominators locally
1332 (LOOPS structure that contains the information about dominators is passed
1333 to enable this), otherwise it does not update the dominator information
1334 and it assumed that the caller will do this, perhaps by destroying and
1335 recreating it instead of trying to do an incremental update like this
1336 function does when update_dominance is true.
78bde837
SB
1337
1338 BASE is the superloop to that basic block belongs; if its header or latch
1339 is copied, we do not set the new blocks as header or latch.
1340
1341 Created copies of N_EDGES edges in array EDGES are stored in array NEW_EDGES,
1342 also in the same order.
1343
1344 Newly created basic blocks are put after the basic block AFTER in the
1345 instruction stream, and the order of the blocks in BBS array is preserved. */
1346
1347void
1348copy_bbs (basic_block *bbs, unsigned n, basic_block *new_bbs,
1349 edge *edges, unsigned num_edges, edge *new_edges,
f14540b6 1350 struct loop *base, basic_block after, bool update_dominance)
78bde837
SB
1351{
1352 unsigned i, j;
1353 basic_block bb, new_bb, dom_bb;
1354 edge e;
1355
1356 /* Duplicate bbs, update dominators, assign bbs to loops. */
1357 for (i = 0; i < n; i++)
1358 {
1359 /* Duplicate. */
1360 bb = bbs[i];
1361 new_bb = new_bbs[i] = duplicate_block (bb, NULL, after);
1362 after = new_bb;
1363 bb->flags |= BB_DUPLICATED;
066b8354
AH
1364 if (bb->loop_father)
1365 {
1366 /* Possibly set loop header. */
1367 if (bb->loop_father->header == bb && bb->loop_father != base)
1368 new_bb->loop_father->header = new_bb;
1369 /* Or latch. */
1370 if (bb->loop_father->latch == bb && bb->loop_father != base)
1371 new_bb->loop_father->latch = new_bb;
1372 }
78bde837
SB
1373 }
1374
1375 /* Set dominators. */
f14540b6 1376 if (update_dominance)
78bde837 1377 {
f14540b6 1378 for (i = 0; i < n; i++)
78bde837 1379 {
f14540b6
SE
1380 bb = bbs[i];
1381 new_bb = new_bbs[i];
1382
1383 dom_bb = get_immediate_dominator (CDI_DOMINATORS, bb);
1384 if (dom_bb->flags & BB_DUPLICATED)
1385 {
1386 dom_bb = get_bb_copy (dom_bb);
1387 set_immediate_dominator (CDI_DOMINATORS, new_bb, dom_bb);
1388 }
78bde837
SB
1389 }
1390 }
1391
1392 /* Redirect edges. */
1393 for (j = 0; j < num_edges; j++)
1394 new_edges[j] = NULL;
1395 for (i = 0; i < n; i++)
1396 {
1397 edge_iterator ei;
1398 new_bb = new_bbs[i];
1399 bb = bbs[i];
1400
1401 FOR_EACH_EDGE (e, ei, new_bb->succs)
1402 {
1403 for (j = 0; j < num_edges; j++)
1404 if (edges[j] && edges[j]->src == bb && edges[j]->dest == e->dest)
1405 new_edges[j] = e;
1406
1407 if (!(e->dest->flags & BB_DUPLICATED))
1408 continue;
1409 redirect_edge_and_branch_force (e, get_bb_copy (e->dest));
1410 }
1411 }
1412
1413 /* Clear information about duplicates. */
1414 for (i = 0; i < n; i++)
1415 bbs[i]->flags &= ~BB_DUPLICATED;
1416}
1417
df92c640
SB
1418/* Return true if BB contains only labels or non-executable
1419 instructions */
1420bool
1421empty_block_p (basic_block bb)
1422{
1423 gcc_assert (cfg_hooks->empty_block_p);
1424 return cfg_hooks->empty_block_p (bb);
1425}
1426
1427/* Split a basic block if it ends with a conditional branch and if
1428 the other part of the block is not empty. */
1429basic_block
1430split_block_before_cond_jump (basic_block bb)
1431{
1432 gcc_assert (cfg_hooks->split_block_before_cond_jump);
1433 return cfg_hooks->split_block_before_cond_jump (bb);
1434}
1435
aa4723d7
SB
1436/* Work-horse for passes.c:check_profile_consistency.
1437 Do book-keeping of the CFG for the profile consistency checker.
1438 If AFTER_PASS is 0, do pre-pass accounting, or if AFTER_PASS is 1
1439 then do post-pass accounting. Store the counting in RECORD. */
1440
1441void
1442account_profile_record (struct profile_record *record, int after_pass)
1443{
1444 basic_block bb;
1445 edge_iterator ei;
1446 edge e;
1447 int sum;
aa4723d7 1448
04a90bec 1449 FOR_ALL_BB_FN (bb, cfun)
aa4723d7 1450 {
fefa31b5 1451 if (bb != EXIT_BLOCK_PTR_FOR_FN (cfun)
0a6a6ac9 1452 && profile_status_for_fn (cfun) != PROFILE_ABSENT)
aa4723d7
SB
1453 {
1454 sum = 0;
1455 FOR_EACH_EDGE (e, ei, bb->succs)
1456 sum += e->probability;
1457 if (EDGE_COUNT (bb->succs) && abs (sum - REG_BR_PROB_BASE) > 100)
1458 record->num_mismatched_freq_out[after_pass]++;
3995f3a2 1459 profile_count lsum = profile_count::zero ();
aa4723d7
SB
1460 FOR_EACH_EDGE (e, ei, bb->succs)
1461 lsum += e->count;
3995f3a2 1462 if (EDGE_COUNT (bb->succs) && (lsum.differs_from_p (bb->count)))
aa4723d7
SB
1463 record->num_mismatched_count_out[after_pass]++;
1464 }
fefa31b5 1465 if (bb != ENTRY_BLOCK_PTR_FOR_FN (cfun)
0a6a6ac9 1466 && profile_status_for_fn (cfun) != PROFILE_ABSENT)
aa4723d7
SB
1467 {
1468 sum = 0;
1469 FOR_EACH_EDGE (e, ei, bb->preds)
1470 sum += EDGE_FREQUENCY (e);
1471 if (abs (sum - bb->frequency) > 100
1472 || (MAX (sum, bb->frequency) > 10
1473 && abs ((sum - bb->frequency) * 100 / (MAX (sum, bb->frequency) + 1)) > 10))
1474 record->num_mismatched_freq_in[after_pass]++;
3995f3a2 1475 profile_count lsum = profile_count::zero ();
aa4723d7
SB
1476 FOR_EACH_EDGE (e, ei, bb->preds)
1477 lsum += e->count;
3995f3a2 1478 if (lsum.differs_from_p (bb->count))
aa4723d7
SB
1479 record->num_mismatched_count_in[after_pass]++;
1480 }
fefa31b5
DM
1481 if (bb == ENTRY_BLOCK_PTR_FOR_FN (cfun)
1482 || bb == EXIT_BLOCK_PTR_FOR_FN (cfun))
aa4723d7
SB
1483 continue;
1484 gcc_assert (cfg_hooks->account_profile_record);
c3284718 1485 cfg_hooks->account_profile_record (bb, after_pass, record);
aa4723d7
SB
1486 }
1487}