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