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