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