]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/cfg.c
Put the CL into the right dir.
[thirdparty/gcc.git] / gcc / cfg.c
CommitLineData
65f34de5 1/* Control flow graph manipulation code for GNU compiler.
fbd26352 2 Copyright (C) 1987-2019 Free Software Foundation, Inc.
65f34de5 3
4This file is part of GCC.
5
6GCC is free software; you can redistribute it and/or modify it under
7the terms of the GNU General Public License as published by the Free
8c4c00c1 8Software Foundation; either version 3, or (at your option) any later
65f34de5 9version.
10
11GCC is distributed in the hope that it will be useful, but WITHOUT ANY
12WARRANTY; without even the implied warranty of MERCHANTABILITY or
13FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14for more details.
15
16You should have received a copy of the GNU General Public License
8c4c00c1 17along with GCC; see the file COPYING3. If not see
18<http://www.gnu.org/licenses/>. */
65f34de5 19
9b21b64d 20/* This file contains low level functions to manipulate the CFG and
917bbcab 21 analyze it. All other modules should not transform the data structure
9b21b64d 22 directly and use abstraction instead. The file is supposed to be
23 ordered bottom-up and should not contain any code dependent on a
24 particular intermediate language (RTL or trees).
65f34de5 25
26 Available functionality:
27 - Initialization/deallocation
28 init_flow, clear_edges
b36d64df 29 - Low level basic block manipulation
30 alloc_block, expunge_block
65f34de5 31 - Edge manipulation
7392df29 32 make_edge, make_single_succ_edge, cached_make_edge, remove_edge
65f34de5 33 - Low level edge redirection (without updating instruction chain)
34 redirect_edge_succ, redirect_edge_succ_nodup, redirect_edge_pred
4a82352a 35 - Dumping and debugging
b36d64df 36 dump_flow_info, debug_flow_info, dump_edge_info
37 - Allocation of AUX fields for basic blocks
38 alloc_aux_for_blocks, free_aux_for_blocks, alloc_aux_for_block
308f9b79 39 - clear_bb_flags
028f8cc7 40 - Consistency checking
41 verify_flow_info
42 - Dumping and debugging
43 print_rtl_with_bb, dump_bb, debug_bb, debug_bb_n
4a020a8c 44
45 TODO: Document these "Available functionality" functions in the files
46 that implement them.
65f34de5 47 */
48\f
49#include "config.h"
50#include "system.h"
805e22b2 51#include "coretypes.h"
b5dddea9 52#include "backend.h"
94ea8568 53#include "hard-reg-set.h"
7c29e30e 54#include "tree.h"
55#include "cfghooks.h"
3072d30e 56#include "df.h"
9ef16211 57#include "cfganal.h"
4a020a8c 58#include "cfgloop.h" /* FIXME: For struct loop. */
b9ed1410 59#include "dumpfile.h"
65f34de5 60
65f34de5 61\f
4d6b11ab 62
4a82352a 63/* Called once at initialization time. */
65f34de5 64
65void
c27baad4 66init_flow (struct function *the_fun)
65f34de5 67{
c27baad4 68 if (!the_fun->cfg)
25a27413 69 the_fun->cfg = ggc_cleared_alloc<control_flow_graph> ();
f1955b22 70 n_edges_for_fn (the_fun) = 0;
205ce1aa 71 the_fun->cfg->count_max = profile_count::uninitialized ();
34154e27 72 ENTRY_BLOCK_PTR_FOR_FN (the_fun)
db9cef39 73 = alloc_block ();
34154e27 74 ENTRY_BLOCK_PTR_FOR_FN (the_fun)->index = ENTRY_BLOCK;
75 EXIT_BLOCK_PTR_FOR_FN (the_fun)
db9cef39 76 = alloc_block ();
34154e27 77 EXIT_BLOCK_PTR_FOR_FN (the_fun)->index = EXIT_BLOCK;
78 ENTRY_BLOCK_PTR_FOR_FN (the_fun)->next_bb
79 = EXIT_BLOCK_PTR_FOR_FN (the_fun);
80 EXIT_BLOCK_PTR_FOR_FN (the_fun)->prev_bb
81 = ENTRY_BLOCK_PTR_FOR_FN (the_fun);
2515797e 82 the_fun->cfg->edge_flags_allocated = EDGE_ALL_FLAGS;
83 the_fun->cfg->bb_flags_allocated = BB_ALL_FLAGS;
65f34de5 84}
85\f
2fb0fd15 86/* Helper function for remove_edge and clear_edges. Frees edge structure
4a020a8c 87 without actually removing it from the pred/succ arrays. */
2fb0fd15 88
89static void
d4f078b5 90free_edge (function *fn, edge e)
2fb0fd15 91{
d4f078b5 92 n_edges_for_fn (fn)--;
ac6db781 93 ggc_free (e);
2fb0fd15 94}
95
65f34de5 96/* Free the memory associated with the edge structures. */
97
98void
d4f078b5 99clear_edges (struct function *fn)
65f34de5 100{
4c26117a 101 basic_block bb;
2fb0fd15 102 edge e;
cd665a06 103 edge_iterator ei;
65f34de5 104
d4f078b5 105 FOR_EACH_BB_FN (bb, fn)
65f34de5 106 {
cd665a06 107 FOR_EACH_EDGE (e, ei, bb->succs)
d4f078b5 108 free_edge (fn, e);
f1f41a6c 109 vec_safe_truncate (bb->succs, 0);
110 vec_safe_truncate (bb->preds, 0);
2fb0fd15 111 }
e4fc8aad 112
d4f078b5 113 FOR_EACH_EDGE (e, ei, ENTRY_BLOCK_PTR_FOR_FN (fn)->succs)
114 free_edge (fn, e);
115 vec_safe_truncate (EXIT_BLOCK_PTR_FOR_FN (fn)->preds, 0);
116 vec_safe_truncate (ENTRY_BLOCK_PTR_FOR_FN (fn)->succs, 0);
65f34de5 117
d4f078b5 118 gcc_assert (!n_edges_for_fn (fn));
65f34de5 119}
120\f
b36d64df 121/* Allocate memory for basic_block. */
65f34de5 122
e76f35e8 123basic_block
4c9e08a4 124alloc_block (void)
65f34de5 125{
126 basic_block bb;
25a27413 127 bb = ggc_cleared_alloc<basic_block_def> ();
db9cef39 128 bb->count = profile_count::uninitialized ();
e76f35e8 129 return bb;
65f34de5 130}
131
7fa55aef 132/* Link block B to chain after AFTER. */
133void
4c9e08a4 134link_block (basic_block b, basic_block after)
7fa55aef 135{
136 b->next_bb = after->next_bb;
137 b->prev_bb = after;
138 after->next_bb = b;
139 b->next_bb->prev_bb = b;
140}
db34a109 141
7fa55aef 142/* Unlink block B from chain. */
143void
4c9e08a4 144unlink_block (basic_block b)
7fa55aef 145{
146 b->next_bb->prev_bb = b->prev_bb;
147 b->prev_bb->next_bb = b->next_bb;
4ee9c684 148 b->prev_bb = NULL;
149 b->next_bb = NULL;
7fa55aef 150}
db34a109 151
3c0a32c9 152/* Sequentially order blocks and compact the arrays. */
153void
4c9e08a4 154compact_blocks (void)
3c0a32c9 155{
156 int i;
4c9e08a4 157
f64d2ca4 158 SET_BASIC_BLOCK_FOR_FN (cfun, ENTRY_BLOCK, ENTRY_BLOCK_PTR_FOR_FN (cfun));
159 SET_BASIC_BLOCK_FOR_FN (cfun, EXIT_BLOCK, EXIT_BLOCK_PTR_FOR_FN (cfun));
48e1416a 160
3072d30e 161 if (df)
162 df_compact_blocks ();
48e1416a 163 else
3c0a32c9 164 {
3072d30e 165 basic_block bb;
48e1416a 166
3072d30e 167 i = NUM_FIXED_BLOCKS;
fc00614f 168 FOR_EACH_BB_FN (bb, cfun)
3072d30e 169 {
f64d2ca4 170 SET_BASIC_BLOCK_FOR_FN (cfun, i, bb);
3072d30e 171 bb->index = i;
172 i++;
173 }
a28770e1 174 gcc_assert (i == n_basic_blocks_for_fn (cfun));
4ee9c684 175
fe672ac0 176 for (; i < last_basic_block_for_fn (cfun); i++)
f64d2ca4 177 SET_BASIC_BLOCK_FOR_FN (cfun, i, NULL);
3072d30e 178 }
fe672ac0 179 last_basic_block_for_fn (cfun) = n_basic_blocks_for_fn (cfun);
3c0a32c9 180}
181
3c0a32c9 182/* Remove block B from the basic block array. */
65f34de5 183
8f8dcce4 184void
4c9e08a4 185expunge_block (basic_block b)
8f8dcce4 186{
7fa55aef 187 unlink_block (b);
f64d2ca4 188 SET_BASIC_BLOCK_FOR_FN (cfun, b->index, NULL);
a28770e1 189 n_basic_blocks_for_fn (cfun)--;
937f771b 190 /* We should be able to ggc_free here, but we are not.
191 The dead SSA_NAMES are left pointing to dead statements that are pointing
192 to dead basic blocks making garbage collector to die.
193 We should be able to release all dead SSA_NAMES and at the same time we should
194 clear out BB pointer of dead statements consistently. */
8f8dcce4 195}
65f34de5 196\f
4dafd3e4 197/* Connect E to E->src. */
198
199static inline void
200connect_src (edge e)
201{
f1f41a6c 202 vec_safe_push (e->src->succs, e);
3072d30e 203 df_mark_solutions_dirty ();
4dafd3e4 204}
205
206/* Connect E to E->dest. */
207
208static inline void
209connect_dest (edge e)
210{
211 basic_block dest = e->dest;
f1f41a6c 212 vec_safe_push (dest->preds, e);
4dafd3e4 213 e->dest_idx = EDGE_COUNT (dest->preds) - 1;
3072d30e 214 df_mark_solutions_dirty ();
4dafd3e4 215}
216
217/* Disconnect edge E from E->src. */
218
219static inline void
220disconnect_src (edge e)
221{
222 basic_block src = e->src;
223 edge_iterator ei;
224 edge tmp;
225
226 for (ei = ei_start (src->succs); (tmp = ei_safe_edge (ei)); )
227 {
228 if (tmp == e)
229 {
f1f41a6c 230 src->succs->unordered_remove (ei.index);
845b40c8 231 df_mark_solutions_dirty ();
4dafd3e4 232 return;
233 }
234 else
235 ei_next (&ei);
236 }
237
238 gcc_unreachable ();
239}
240
241/* Disconnect edge E from E->dest. */
242
243static inline void
244disconnect_dest (edge e)
245{
246 basic_block dest = e->dest;
247 unsigned int dest_idx = e->dest_idx;
248
f1f41a6c 249 dest->preds->unordered_remove (dest_idx);
4dafd3e4 250
251 /* If we removed an edge in the middle of the edge vector, we need
252 to update dest_idx of the edge that moved into the "hole". */
253 if (dest_idx < EDGE_COUNT (dest->preds))
254 EDGE_PRED (dest, dest_idx)->dest_idx = dest_idx;
3072d30e 255 df_mark_solutions_dirty ();
4dafd3e4 256}
257
ccad1933 258/* Create an edge connecting SRC and DEST with flags FLAGS. Return newly
259 created edge. Use this only if you are sure that this edge can't
260 possibly already exist. */
261
262edge
4c9e08a4 263unchecked_make_edge (basic_block src, basic_block dst, int flags)
ccad1933 264{
265 edge e;
25a27413 266 e = ggc_cleared_alloc<edge_def> ();
f1955b22 267 n_edges_for_fn (cfun)++;
ccad1933 268
720cfc43 269 e->probability = profile_probability::uninitialized ();
ccad1933 270 e->src = src;
271 e->dest = dst;
272 e->flags = flags;
4dafd3e4 273
274 connect_src (e);
275 connect_dest (e);
ccad1933 276
26b12c91 277 execute_on_growing_pred (e);
ccad1933 278 return e;
279}
280
7392df29 281/* Create an edge connecting SRC and DST with FLAGS optionally using
88b5b080 282 edge cache CACHE. Return the new edge, NULL if already exist. */
e76f35e8 283
7392df29 284edge
841999ef 285cached_make_edge (sbitmap edge_cache, basic_block src, basic_block dst, int flags)
65f34de5 286{
59948e03 287 if (edge_cache == NULL
34154e27 288 || src == ENTRY_BLOCK_PTR_FOR_FN (cfun)
289 || dst == EXIT_BLOCK_PTR_FOR_FN (cfun))
59948e03 290 return make_edge (src, dst, flags);
65f34de5 291
59948e03 292 /* Does the requested edge already exist? */
08b7917c 293 if (! bitmap_bit_p (edge_cache, dst->index))
65f34de5 294 {
59948e03 295 /* The edge does not exist. Create one and update the
296 cache. */
08b7917c 297 bitmap_set_bit (edge_cache, dst->index);
59948e03 298 return unchecked_make_edge (src, dst, flags);
65f34de5 299 }
4c9e08a4 300
59948e03 301 /* At this point, we know that the requested edge exists. Adjust
302 flags if necessary. */
303 if (flags)
304 {
305 edge e = find_edge (src, dst);
306 e->flags |= flags;
307 }
7392df29 308
59948e03 309 return NULL;
7392df29 310}
311
312/* Create an edge connecting SRC and DEST with flags FLAGS. Return newly
313 created edge or NULL if already exist. */
314
315edge
4c9e08a4 316make_edge (basic_block src, basic_block dest, int flags)
7392df29 317{
59948e03 318 edge e = find_edge (src, dest);
319
320 /* Make sure we don't add duplicate edges. */
321 if (e)
322 {
323 e->flags |= flags;
324 return NULL;
325 }
326
327 return unchecked_make_edge (src, dest, flags);
7392df29 328}
329
4a82352a 330/* Create an edge connecting SRC to DEST and set probability by knowing
7392df29 331 that it is the single edge leaving SRC. */
332
333edge
4c9e08a4 334make_single_succ_edge (basic_block src, basic_block dest, int flags)
7392df29 335{
336 edge e = make_edge (src, dest, flags);
337
720cfc43 338 e->probability = profile_probability::always ();
7392df29 339 return e;
65f34de5 340}
341
342/* This function will remove an edge from the flow graph. */
343
344void
c8e41bd9 345remove_edge_raw (edge e)
65f34de5 346{
631fa7de 347 remove_predictions_associated_with_edge (e);
26b12c91 348 execute_on_shrinking_pred (e);
349
4dafd3e4 350 disconnect_src (e);
351 disconnect_dest (e);
65f34de5 352
d4f078b5 353 free_edge (cfun, e);
65f34de5 354}
355
356/* Redirect an edge's successor from one block to another. */
357
358void
4c9e08a4 359redirect_edge_succ (edge e, basic_block new_succ)
65f34de5 360{
26b12c91 361 execute_on_shrinking_pred (e);
362
4dafd3e4 363 disconnect_dest (e);
cd665a06 364
4dafd3e4 365 e->dest = new_succ;
65f34de5 366
367 /* Reconnect the edge to the new successor block. */
4dafd3e4 368 connect_dest (e);
369
26b12c91 370 execute_on_growing_pred (e);
65f34de5 371}
372
65f34de5 373/* Redirect an edge's predecessor from one block to another. */
374
375void
4c9e08a4 376redirect_edge_pred (edge e, basic_block new_pred)
65f34de5 377{
4dafd3e4 378 disconnect_src (e);
65f34de5 379
4dafd3e4 380 e->src = new_pred;
65f34de5 381
382 /* Reconnect the edge to the new predecessor block. */
4dafd3e4 383 connect_src (e);
65f34de5 384}
308f9b79 385
bec2cf98 386/* Clear all basic block flags that do not have to be preserved. */
308f9b79 387void
4c9e08a4 388clear_bb_flags (void)
308f9b79 389{
4c26117a 390 basic_block bb;
d2377f21 391 int flags_to_preserve = BB_FLAGS_TO_PRESERVE;
392 if (current_loops
393 && loops_state_satisfies_p (cfun, LOOPS_HAVE_MARKED_IRREDUCIBLE_REGIONS))
394 flags_to_preserve |= BB_IRREDUCIBLE_LOOP;
4c26117a 395
19591744 396 FOR_ALL_BB_FN (bb, cfun)
d2377f21 397 bb->flags &= flags_to_preserve;
308f9b79 398}
65f34de5 399\f
020c749b 400/* Check the consistency of profile information. We can't do that
401 in verify_flow_info, as the counts may get invalid for incompletely
402 solved graphs, later eliminating of conditionals or roundoff errors.
403 It is still practical to have them reported for debugging of simple
404 testcases. */
bec2cf98 405static void
7f337d45 406check_bb_profile (basic_block bb, FILE * file, int indent)
020c749b 407{
408 edge e;
cd665a06 409 edge_iterator ei;
8d672d12 410 struct function *fun = DECL_STRUCT_FUNCTION (current_function_decl);
bec2cf98 411 char *s_indent = (char *) alloca ((size_t) indent + 1);
412 memset ((void *) s_indent, ' ', (size_t) indent);
413 s_indent[indent] = '\0';
020c749b 414
3bedbae3 415 if (profile_status_for_fn (fun) == PROFILE_ABSENT)
020c749b 416 return;
417
34154e27 418 if (bb != EXIT_BLOCK_PTR_FOR_FN (fun))
020c749b 419 {
2bc8182c 420 bool found = false;
720cfc43 421 profile_probability sum = profile_probability::never ();
422 int isum = 0;
423
cd665a06 424 FOR_EACH_EDGE (e, ei, bb->succs)
2bc8182c 425 {
720cfc43 426 if (!(e->flags & (EDGE_EH | EDGE_FAKE)))
2bc8182c 427 found = true;
428 sum += e->probability;
720cfc43 429 if (e->probability.initialized_p ())
430 isum += e->probability.to_reg_br_prob_base ();
2bc8182c 431 }
432 /* Only report mismatches for non-EH control flow. If there are only EH
433 edges it means that the BB ends by noreturn call. Here the control
434 flow may just terminate. */
435 if (found)
436 {
720cfc43 437 if (sum.differs_from_p (profile_probability::always ()))
438 {
439 fprintf (file,
440 ";; %sInvalid sum of outgoing probabilities ",
441 s_indent);
442 sum.dump (file);
443 fprintf (file, "\n");
444 }
445 /* Probabilities caps to 100% and thus the previous test will never
446 fire if the sum of probabilities is too large. */
447 else if (isum > REG_BR_PROB_BASE + 100)
448 {
449 fprintf (file,
450 ";; %sInvalid sum of outgoing probabilities %.1f%%\n",
451 s_indent, isum * 100.0 / REG_BR_PROB_BASE);
452 }
2bc8182c 453 }
020c749b 454 }
720cfc43 455 if (bb != ENTRY_BLOCK_PTR_FOR_FN (fun))
020c749b 456 {
205ce1aa 457 profile_count sum = profile_count::zero ();
cd665a06 458 FOR_EACH_EDGE (e, ei, bb->preds)
205ce1aa 459 sum += e->count ();
460 if (sum.differs_from_p (bb->count))
461 {
462 fprintf (file, ";; %sInvalid sum of incoming counts ",
463 s_indent);
464 sum.dump (file);
465 fprintf (file, ", should be ");
466 bb->count.dump (file);
467 fprintf (file, "\n");
468 }
020c749b 469 }
80adc5a6 470 if (BB_PARTITION (bb) == BB_COLD_PARTITION)
471 {
472 /* Warn about inconsistencies in the partitioning that are
473 currently caused by profile insanities created via optimization. */
474 if (!probably_never_executed_bb_p (fun, bb))
7f337d45 475 fprintf (file, ";; %sBlock in cold partition with hot count\n",
476 s_indent);
80adc5a6 477 FOR_EACH_EDGE (e, ei, bb->preds)
478 {
479 if (!probably_never_executed_edge_p (fun, e))
480 fprintf (file,
7f337d45 481 ";; %sBlock in cold partition with incoming hot edge\n",
482 s_indent);
80adc5a6 483 }
484 }
020c749b 485}
486\f
65f34de5 487void
3f6e5ced 488dump_edge_info (FILE *file, edge e, dump_flags_t flags, int do_succ)
65f34de5 489{
b36d64df 490 basic_block side = (do_succ ? e->dest : e->src);
5147ec07 491 bool do_details = false;
492
493 if ((flags & TDF_DETAILS) != 0
494 && (flags & TDF_SLIM) == 0)
495 do_details = true;
496
4a020a8c 497 if (side->index == ENTRY_BLOCK)
b36d64df 498 fputs (" ENTRY", file);
4a020a8c 499 else if (side->index == EXIT_BLOCK)
b36d64df 500 fputs (" EXIT", file);
501 else
b3d6de89 502 fprintf (file, " %d", side->index);
b36d64df 503
720cfc43 504 if (e->probability.initialized_p () && do_details)
505 {
506 fprintf (file, " [");
507 e->probability.dump (file);
508 fprintf (file, "] ");
509 }
65f34de5 510
ea5d3981 511 if (e->count ().initialized_p () && do_details)
65f34de5 512 {
609e7ca1 513 fputs (" count:", file);
ea5d3981 514 e->count ().dump (file);
65f34de5 515 }
516
5147ec07 517 if (e->flags && do_details)
65f34de5 518 {
5147ec07 519 static const char * const bitnames[] =
520 {
521#define DEF_EDGE_FLAG(NAME,IDX) #NAME ,
522#include "cfg-flags.def"
523 NULL
524#undef DEF_EDGE_FLAG
525 };
526 bool comma = false;
b36d64df 527 int i, flags = e->flags;
65f34de5 528
5147ec07 529 gcc_assert (e->flags <= EDGE_ALL_FLAGS);
e4fc8aad 530 fputs (" (", file);
65f34de5 531 for (i = 0; flags; i++)
532 if (flags & (1 << i))
533 {
534 flags &= ~(1 << i);
535
536 if (comma)
537 fputc (',', file);
5147ec07 538 fputs (bitnames[i], file);
539 comma = true;
65f34de5 540 }
e4fc8aad 541
65f34de5 542 fputc (')', file);
543 }
544}
c7d89805 545
546DEBUG_FUNCTION void
547debug (edge_def &ref)
548{
0f455859 549 fprintf (stderr, "<edge (%d -> %d)>\n",
550 ref.src->index, ref.dest->index);
551 dump_edge_info (stderr, &ref, TDF_DETAILS, false);
552 fprintf (stderr, "\n");
c7d89805 553}
554
555DEBUG_FUNCTION void
556debug (edge_def *ptr)
557{
558 if (ptr)
559 debug (*ptr);
560 else
561 fprintf (stderr, "<nil>\n");
562}
487fbf05 563
564static void
565debug_slim (edge e)
566{
567 fprintf (stderr, "<edge 0x%p (%d -> %d)>", (void *) e,
568 e->src->index, e->dest->index);
569}
570
571DEFINE_DEBUG_VEC (edge)
572DEFINE_DEBUG_HASH_SET (edge)
65f34de5 573\f
424da949 574/* Simple routines to easily allocate AUX fields of basic blocks. */
e4fc8aad 575
b36d64df 576static struct obstack block_aux_obstack;
577static void *first_block_aux_obj = 0;
578static struct obstack edge_aux_obstack;
579static void *first_edge_aux_obj = 0;
65f34de5 580
edc2a478 581/* Allocate a memory block of SIZE as BB->aux. The obstack must
b36d64df 582 be first initialized by alloc_aux_for_blocks. */
65f34de5 583
ec972558 584static void
4c9e08a4 585alloc_aux_for_block (basic_block bb, int size)
65f34de5 586{
b36d64df 587 /* Verify that aux field is clear. */
cc636d56 588 gcc_assert (!bb->aux && first_block_aux_obj);
b36d64df 589 bb->aux = obstack_alloc (&block_aux_obstack, size);
590 memset (bb->aux, 0, size);
65f34de5 591}
592
b36d64df 593/* Initialize the block_aux_obstack and if SIZE is nonzero, call
594 alloc_aux_for_block for each basic block. */
65f34de5 595
596void
4c9e08a4 597alloc_aux_for_blocks (int size)
65f34de5 598{
b36d64df 599 static int initialized;
65f34de5 600
b36d64df 601 if (!initialized)
65f34de5 602 {
b36d64df 603 gcc_obstack_init (&block_aux_obstack);
604 initialized = 1;
65f34de5 605 }
cc636d56 606 else
607 /* Check whether AUX data are still allocated. */
608 gcc_assert (!first_block_aux_obj);
a0c938f0 609
f0af5a88 610 first_block_aux_obj = obstack_alloc (&block_aux_obstack, 0);
b36d64df 611 if (size)
65f34de5 612 {
4c26117a 613 basic_block bb;
e4fc8aad 614
ed7d889a 615 FOR_ALL_BB_FN (bb, cfun)
4c26117a 616 alloc_aux_for_block (bb, size);
65f34de5 617 }
618}
b36d64df 619
82f7392b 620/* Clear AUX pointers of all blocks. */
65f34de5 621
622void
4c9e08a4 623clear_aux_for_blocks (void)
65f34de5 624{
4c26117a 625 basic_block bb;
e4fc8aad 626
ed7d889a 627 FOR_ALL_BB_FN (bb, cfun)
4c26117a 628 bb->aux = NULL;
82f7392b 629}
630
631/* Free data allocated in block_aux_obstack and clear AUX pointers
632 of all blocks. */
633
634void
4c9e08a4 635free_aux_for_blocks (void)
82f7392b 636{
cc636d56 637 gcc_assert (first_block_aux_obj);
82f7392b 638 obstack_free (&block_aux_obstack, first_block_aux_obj);
b36d64df 639 first_block_aux_obj = NULL;
82f7392b 640
641 clear_aux_for_blocks ();
b36d64df 642}
65f34de5 643
61025ec0 644/* Allocate a memory edge of SIZE as E->aux. The obstack must
b36d64df 645 be first initialized by alloc_aux_for_edges. */
65f34de5 646
61025ec0 647void
4c9e08a4 648alloc_aux_for_edge (edge e, int size)
b36d64df 649{
650 /* Verify that aux field is clear. */
cc636d56 651 gcc_assert (!e->aux && first_edge_aux_obj);
b36d64df 652 e->aux = obstack_alloc (&edge_aux_obstack, size);
653 memset (e->aux, 0, size);
654}
65f34de5 655
b36d64df 656/* Initialize the edge_aux_obstack and if SIZE is nonzero, call
657 alloc_aux_for_edge for each basic edge. */
65f34de5 658
b36d64df 659void
4c9e08a4 660alloc_aux_for_edges (int size)
b36d64df 661{
662 static int initialized;
65f34de5 663
b36d64df 664 if (!initialized)
665 {
666 gcc_obstack_init (&edge_aux_obstack);
667 initialized = 1;
65f34de5 668 }
cc636d56 669 else
670 /* Check whether AUX data are still allocated. */
671 gcc_assert (!first_edge_aux_obj);
e4fc8aad 672
f0af5a88 673 first_edge_aux_obj = obstack_alloc (&edge_aux_obstack, 0);
b36d64df 674 if (size)
65f34de5 675 {
4c26117a 676 basic_block bb;
677
34154e27 678 FOR_BB_BETWEEN (bb, ENTRY_BLOCK_PTR_FOR_FN (cfun),
679 EXIT_BLOCK_PTR_FOR_FN (cfun), next_bb)
65f34de5 680 {
b36d64df 681 edge e;
cd665a06 682 edge_iterator ei;
b36d64df 683
cd665a06 684 FOR_EACH_EDGE (e, ei, bb->succs)
b36d64df 685 alloc_aux_for_edge (e, size);
65f34de5 686 }
65f34de5 687 }
65f34de5 688}
65f34de5 689
82f7392b 690/* Clear AUX pointers of all edges. */
b36d64df 691
692void
4c9e08a4 693clear_aux_for_edges (void)
65f34de5 694{
4c26117a 695 basic_block bb;
696 edge e;
65f34de5 697
34154e27 698 FOR_BB_BETWEEN (bb, ENTRY_BLOCK_PTR_FOR_FN (cfun),
699 EXIT_BLOCK_PTR_FOR_FN (cfun), next_bb)
65f34de5 700 {
cd665a06 701 edge_iterator ei;
702 FOR_EACH_EDGE (e, ei, bb->succs)
b36d64df 703 e->aux = NULL;
65f34de5 704 }
82f7392b 705}
706
707/* Free data allocated in edge_aux_obstack and clear AUX pointers
708 of all edges. */
709
710void
4c9e08a4 711free_aux_for_edges (void)
82f7392b 712{
cc636d56 713 gcc_assert (first_edge_aux_obj);
82f7392b 714 obstack_free (&edge_aux_obstack, first_edge_aux_obj);
b36d64df 715 first_edge_aux_obj = NULL;
82f7392b 716
717 clear_aux_for_edges ();
65f34de5 718}
1026363d 719
4b987fac 720DEBUG_FUNCTION void
4c9e08a4 721debug_bb (basic_block bb)
028f8cc7 722{
5f7f600e 723 dump_bb (stderr, bb, 0, dump_flags);
028f8cc7 724}
725
4b987fac 726DEBUG_FUNCTION basic_block
4c9e08a4 727debug_bb_n (int n)
028f8cc7 728{
f5a6b05f 729 basic_block bb = BASIC_BLOCK_FOR_FN (cfun, n);
5147ec07 730 debug_bb (bb);
028f8cc7 731 return bb;
1026363d 732}
4ee9c684 733
5147ec07 734/* Dumps cfg related information about basic block BB to OUTF.
735 If HEADER is true, dump things that appear before the instructions
736 contained in BB. If FOOTER is true, dump things that appear after.
737 Flags are the TDF_* masks as documented in dumpfile.h.
738 NB: With TDF_DETAILS, it is assumed that cfun is available, so
739 that maybe_hot_bb_p and probably_never_executed_bb_p don't ICE. */
4ee9c684 740
5147ec07 741void
3f6e5ced 742dump_bb_info (FILE *outf, basic_block bb, int indent, dump_flags_t flags,
5147ec07 743 bool do_header, bool do_footer)
4ee9c684 744{
cd665a06 745 edge_iterator ei;
5147ec07 746 edge e;
4ee9c684 747 static const char * const bb_bitnames[] =
748 {
5147ec07 749#define DEF_BASIC_BLOCK_FLAG(NAME,IDX) #NAME ,
750#include "cfg-flags.def"
751 NULL
752#undef DEF_BASIC_BLOCK_FLAG
4ee9c684 753 };
754 const unsigned n_bitnames = sizeof (bb_bitnames) / sizeof (char *);
bec2cf98 755 bool first;
5147ec07 756 char *s_indent = (char *) alloca ((size_t) indent + 1);
757 memset ((void *) s_indent, ' ', (size_t) indent);
758 s_indent[indent] = '\0';
4ee9c684 759
5147ec07 760 gcc_assert (bb->flags <= BB_ALL_FLAGS);
761
762 if (do_header)
763 {
764 unsigned i;
765
7f337d45 766 fputs (";; ", outf);
bec2cf98 767 fprintf (outf, "%sbasic block %d, loop depth %d",
6b42039a 768 s_indent, bb->index, bb_loop_depth (bb));
5147ec07 769 if (flags & TDF_DETAILS)
770 {
8d672d12 771 struct function *fun = DECL_STRUCT_FUNCTION (current_function_decl);
db9cef39 772 if (bb->count.initialized_p ())
773 {
774 fputs (", count ", outf);
775 bb->count.dump (outf);
776 }
8d672d12 777 if (maybe_hot_bb_p (fun, bb))
5147ec07 778 fputs (", maybe hot", outf);
8d672d12 779 if (probably_never_executed_bb_p (fun, bb))
5147ec07 780 fputs (", probably never executed", outf);
781 }
782 fputc ('\n', outf);
783
784 if (flags & TDF_DETAILS)
785 {
7f337d45 786 check_bb_profile (bb, outf, indent);
787 fputs (";; ", outf);
5147ec07 788 fprintf (outf, "%s prev block ", s_indent);
789 if (bb->prev_bb)
790 fprintf (outf, "%d", bb->prev_bb->index);
791 else
792 fprintf (outf, "(nil)");
793 fprintf (outf, ", next block ");
794 if (bb->next_bb)
795 fprintf (outf, "%d", bb->next_bb->index);
796 else
797 fprintf (outf, "(nil)");
798
799 fputs (", flags:", outf);
bec2cf98 800 first = true;
5147ec07 801 for (i = 0; i < n_bitnames; i++)
802 if (bb->flags & (1 << i))
803 {
804 if (first)
805 fputs (" (", outf);
806 else
807 fputs (", ", outf);
808 first = false;
809 fputs (bb_bitnames[i], outf);
810 }
811 if (!first)
812 fputc (')', outf);
bec2cf98 813 fputc ('\n', outf);
5147ec07 814 }
5147ec07 815
7f337d45 816 fputs (";; ", outf);
5147ec07 817 fprintf (outf, "%s pred: ", s_indent);
bec2cf98 818 first = true;
5147ec07 819 FOR_EACH_EDGE (e, ei, bb->preds)
bec2cf98 820 {
821 if (! first)
822 {
7f337d45 823 fputs (";; ", outf);
bec2cf98 824 fprintf (outf, "%s ", s_indent);
825 }
826 first = false;
827 dump_edge_info (outf, e, flags, 0);
828 fputc ('\n', outf);
829 }
90e2513f 830 if (first)
831 fputc ('\n', outf);
5147ec07 832 }
833
834 if (do_footer)
835 {
7f337d45 836 fputs (";; ", outf);
5147ec07 837 fprintf (outf, "%s succ: ", s_indent);
bec2cf98 838 first = true;
5147ec07 839 FOR_EACH_EDGE (e, ei, bb->succs)
bec2cf98 840 {
841 if (! first)
842 {
7f337d45 843 fputs (";; ", outf);
bec2cf98 844 fprintf (outf, "%s ", s_indent);
845 }
846 first = false;
847 dump_edge_info (outf, e, flags, 1);
848 fputc ('\n', outf);
849 }
90e2513f 850 if (first)
851 fputc ('\n', outf);
5147ec07 852 }
4ee9c684 853}
854
855/* Dumps a brief description of cfg to FILE. */
856
857void
3f6e5ced 858brief_dump_cfg (FILE *file, dump_flags_t flags)
4ee9c684 859{
860 basic_block bb;
861
fc00614f 862 FOR_EACH_BB_FN (bb, cfun)
4ee9c684 863 {
7f337d45 864 dump_bb_info (file, bb, 0, flags & TDF_DETAILS, true, true);
4ee9c684 865 }
866}
615dd397 867
205ce1aa 868/* An edge originally destinating BB of COUNT has been proved to
615dd397 869 leave the block by TAKEN_EDGE. Update profile of BB such that edge E can be
a0c938f0 870 redirected to destination of TAKEN_EDGE.
615dd397 871
872 This function may leave the profile inconsistent in the case TAKEN_EDGE
205ce1aa 873 frequency or count is believed to be lower than COUNT
7a635e9c 874 respectively. */
615dd397 875void
205ce1aa 876update_bb_profile_for_threading (basic_block bb,
db9cef39 877 profile_count count, edge taken_edge)
615dd397 878{
879 edge c;
720cfc43 880 profile_probability prob;
cd665a06 881 edge_iterator ei;
615dd397 882
db9cef39 883 if (bb->count < count)
3ec32924 884 {
885 if (dump_file)
886 fprintf (dump_file, "bb %i count became negative after threading",
887 bb->index);
3ec32924 888 }
db9cef39 889 bb->count -= count;
615dd397 890
891 /* Compute the probability of TAKEN_EDGE being reached via threaded edge.
892 Watch for overflows. */
205ce1aa 893 if (bb->count.nonzero_p ())
894 prob = count.probability_in (bb->count);
615dd397 895 else
720cfc43 896 prob = profile_probability::never ();
615dd397 897 if (prob > taken_edge->probability)
898 {
899 if (dump_file)
720cfc43 900 {
901 fprintf (dump_file, "Jump threading proved probability of edge "
902 "%i->%i too small (it is ",
903 taken_edge->src->index, taken_edge->dest->index);
904 taken_edge->probability.dump (dump_file);
905 fprintf (dump_file, " should be ");
906 prob.dump (dump_file);
907 fprintf (dump_file, ")\n");
908 }
909 prob = taken_edge->probability.apply_scale (6, 8);
615dd397 910 }
911
912 /* Now rescale the probabilities. */
913 taken_edge->probability -= prob;
720cfc43 914 prob = prob.invert ();
915 if (prob == profile_probability::never ())
615dd397 916 {
917 if (dump_file)
205ce1aa 918 fprintf (dump_file, "Edge probabilities of bb %i has been reset, "
919 "count of block should end up being 0, it is non-zero\n",
920 bb->index);
720cfc43 921 EDGE_SUCC (bb, 0)->probability = profile_probability::guessed_always ();
cd665a06 922 ei = ei_start (bb->succs);
923 ei_next (&ei);
924 for (; (c = ei_safe_edge (ei)); ei_next (&ei))
720cfc43 925 c->probability = profile_probability::guessed_never ();
615dd397 926 }
720cfc43 927 else if (!(prob == profile_probability::always ()))
2260bbe1 928 {
2260bbe1 929 FOR_EACH_EDGE (c, ei, bb->succs)
720cfc43 930 c->probability /= prob;
2260bbe1 931 }
615dd397 932
a53ff4c1 933 gcc_assert (bb == taken_edge->src);
615dd397 934}
4d6b11ab 935
db9cef39 936/* Multiply all frequencies of basic blocks in array BBS of length NBBS
937 by NUM/DEN, in profile_count arithmetic. More accurate than previous
938 function but considerably slower. */
939void
940scale_bbs_frequencies_profile_count (basic_block *bbs, int nbbs,
941 profile_count num, profile_count den)
942{
943 int i;
205ce1aa 944 if (num == profile_count::zero () || den.nonzero_p ())
945 for (i = 0; i < nbbs; i++)
db9cef39 946 bbs[i]->count = bbs[i]->count.apply_scale (num, den);
db9cef39 947}
948
ca69b069 949/* Multiply all frequencies of basic blocks in array BBS of length NBBS
950 by NUM/DEN, in profile_count arithmetic. More accurate than previous
951 function but considerably slower. */
952void
953scale_bbs_frequencies (basic_block *bbs, int nbbs,
954 profile_probability p)
955{
956 int i;
ca69b069 957
958 for (i = 0; i < nbbs; i++)
205ce1aa 959 bbs[i]->count = bbs[i]->count.apply_probability (p);
ca69b069 960}
961
d1455aa3 962/* Helper types for hash tables. */
01020a5f 963
964struct htab_bb_copy_original_entry
965{
966 /* Block we are attaching info to. */
967 int index1;
968 /* Index of original or copy (depending on the hashtable) */
969 int index2;
970};
971
770ff93b 972struct bb_copy_hasher : nofree_ptr_hash <htab_bb_copy_original_entry>
01020a5f 973{
9969c043 974 static inline hashval_t hash (const htab_bb_copy_original_entry *);
975 static inline bool equal (const htab_bb_copy_original_entry *existing,
976 const htab_bb_copy_original_entry * candidate);
d1455aa3 977};
01020a5f 978
d1455aa3 979inline hashval_t
9969c043 980bb_copy_hasher::hash (const htab_bb_copy_original_entry *data)
d1455aa3 981{
01020a5f 982 return data->index1;
983}
01020a5f 984
d1455aa3 985inline bool
9969c043 986bb_copy_hasher::equal (const htab_bb_copy_original_entry *data,
987 const htab_bb_copy_original_entry *data2)
d1455aa3 988{
01020a5f 989 return data->index1 == data2->index1;
990}
991
d1455aa3 992/* Data structures used to maintain mapping between basic blocks and
993 copies. */
c1f445d2 994static hash_table<bb_copy_hasher> *bb_original;
995static hash_table<bb_copy_hasher> *bb_copy;
d1455aa3 996
997/* And between loops and copies. */
c1f445d2 998static hash_table<bb_copy_hasher> *loop_copy;
e16712b1 999static object_allocator<htab_bb_copy_original_entry> *original_copy_bb_pool;
d1455aa3 1000
a92c20c4 1001/* Initialize the data structures to maintain mapping between blocks
1002 and its copies. */
01020a5f 1003void
1004initialize_original_copy_tables (void)
1005{
e16712b1 1006 original_copy_bb_pool = new object_allocator<htab_bb_copy_original_entry>
1dc6c44d 1007 ("original_copy");
c1f445d2 1008 bb_original = new hash_table<bb_copy_hasher> (10);
1009 bb_copy = new hash_table<bb_copy_hasher> (10);
1010 loop_copy = new hash_table<bb_copy_hasher> (10);
01020a5f 1011}
1012
1d67a054 1013/* Reset the data structures to maintain mapping between blocks and
1014 its copies. */
1015
1016void
1017reset_original_copy_tables (void)
1018{
1019 gcc_assert (original_copy_bb_pool);
1020 bb_original->empty ();
1021 bb_copy->empty ();
1022 loop_copy->empty ();
1023}
1024
a92c20c4 1025/* Free the data structures to maintain mapping between blocks and
1026 its copies. */
01020a5f 1027void
1028free_original_copy_tables (void)
1029{
1030 gcc_assert (original_copy_bb_pool);
c1f445d2 1031 delete bb_copy;
1032 bb_copy = NULL;
1033 delete bb_original;
43b84493 1034 bb_original = NULL;
c1f445d2 1035 delete loop_copy;
1036 loop_copy = NULL;
1394066b 1037 delete original_copy_bb_pool;
01020a5f 1038 original_copy_bb_pool = NULL;
1039}
1040
175e0d6b 1041/* Return true iff we have had a call to initialize_original_copy_tables
1042 without a corresponding call to free_original_copy_tables. */
1043
1044bool
1045original_copy_tables_initialized_p (void)
1046{
1047 return original_copy_bb_pool != NULL;
1048}
1049
96c90e5e 1050/* Removes the value associated with OBJ from table TAB. */
1051
1052static void
c1f445d2 1053copy_original_table_clear (hash_table<bb_copy_hasher> *tab, unsigned obj)
96c90e5e 1054{
d1455aa3 1055 htab_bb_copy_original_entry **slot;
96c90e5e 1056 struct htab_bb_copy_original_entry key, *elt;
1057
1058 if (!original_copy_bb_pool)
1059 return;
1060
1061 key.index1 = obj;
c1f445d2 1062 slot = tab->find_slot (&key, NO_INSERT);
96c90e5e 1063 if (!slot)
1064 return;
1065
d1455aa3 1066 elt = *slot;
c1f445d2 1067 tab->clear_slot (slot);
1394066b 1068 original_copy_bb_pool->remove (elt);
96c90e5e 1069}
1070
1071/* Sets the value associated with OBJ in table TAB to VAL.
1072 Do nothing when data structures are not initialized. */
1073
1074static void
c1f445d2 1075copy_original_table_set (hash_table<bb_copy_hasher> *tab,
d1455aa3 1076 unsigned obj, unsigned val)
96c90e5e 1077{
1078 struct htab_bb_copy_original_entry **slot;
1079 struct htab_bb_copy_original_entry key;
1080
1081 if (!original_copy_bb_pool)
1082 return;
1083
1084 key.index1 = obj;
c1f445d2 1085 slot = tab->find_slot (&key, INSERT);
96c90e5e 1086 if (!*slot)
1087 {
1394066b 1088 *slot = original_copy_bb_pool->allocate ();
96c90e5e 1089 (*slot)->index1 = obj;
1090 }
1091 (*slot)->index2 = val;
1092}
1093
a92c20c4 1094/* Set original for basic block. Do nothing when data structures are not
1095 initialized so passes not needing this don't need to care. */
01020a5f 1096void
1097set_bb_original (basic_block bb, basic_block original)
1098{
96c90e5e 1099 copy_original_table_set (bb_original, bb->index, original->index);
01020a5f 1100}
1101
1102/* Get the original basic block. */
1103basic_block
1104get_bb_original (basic_block bb)
1105{
1106 struct htab_bb_copy_original_entry *entry;
1107 struct htab_bb_copy_original_entry key;
1108
1109 gcc_assert (original_copy_bb_pool);
1110
1111 key.index1 = bb->index;
c1f445d2 1112 entry = bb_original->find (&key);
01020a5f 1113 if (entry)
f5a6b05f 1114 return BASIC_BLOCK_FOR_FN (cfun, entry->index2);
01020a5f 1115 else
1116 return NULL;
1117}
1118
a92c20c4 1119/* Set copy for basic block. Do nothing when data structures are not
1120 initialized so passes not needing this don't need to care. */
01020a5f 1121void
1122set_bb_copy (basic_block bb, basic_block copy)
1123{
96c90e5e 1124 copy_original_table_set (bb_copy, bb->index, copy->index);
01020a5f 1125}
1126
1127/* Get the copy of basic block. */
1128basic_block
1129get_bb_copy (basic_block bb)
1130{
1131 struct htab_bb_copy_original_entry *entry;
1132 struct htab_bb_copy_original_entry key;
1133
1134 gcc_assert (original_copy_bb_pool);
1135
1136 key.index1 = bb->index;
c1f445d2 1137 entry = bb_copy->find (&key);
01020a5f 1138 if (entry)
f5a6b05f 1139 return BASIC_BLOCK_FOR_FN (cfun, entry->index2);
01020a5f 1140 else
1141 return NULL;
1142}
96c90e5e 1143
1144/* Set copy for LOOP to COPY. Do nothing when data structures are not
1145 initialized so passes not needing this don't need to care. */
1146
1147void
2e966e2a 1148set_loop_copy (class loop *loop, class loop *copy)
96c90e5e 1149{
1150 if (!copy)
1151 copy_original_table_clear (loop_copy, loop->num);
1152 else
1153 copy_original_table_set (loop_copy, loop->num, copy->num);
1154}
1155
1156/* Get the copy of LOOP. */
1157
2e966e2a 1158class loop *
1159get_loop_copy (class loop *loop)
96c90e5e 1160{
1161 struct htab_bb_copy_original_entry *entry;
1162 struct htab_bb_copy_original_entry key;
1163
1164 gcc_assert (original_copy_bb_pool);
1165
1166 key.index1 = loop->num;
c1f445d2 1167 entry = loop_copy->find (&key);
96c90e5e 1168 if (entry)
41f75a99 1169 return get_loop (cfun, entry->index2);
96c90e5e 1170 else
1171 return NULL;
1172}