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