]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/cfg.c
PR fortran/95090 - ICE: identifier overflow
[thirdparty/gcc.git] / gcc / cfg.c
CommitLineData
402209ff 1/* Control flow graph manipulation code for GNU compiler.
8d9254fc 2 Copyright (C) 1987-2020 Free Software Foundation, Inc.
402209ff
JH
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
9dcd6f09 8Software Foundation; either version 3, or (at your option) any later
402209ff
JH
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
9dcd6f09
NC
17along with GCC; see the file COPYING3. If not see
18<http://www.gnu.org/licenses/>. */
402209ff 19
9d083c8c 20/* This file contains low level functions to manipulate the CFG and
4d6922ee 21 analyze it. All other modules should not transform the data structure
9d083c8c
RS
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).
402209ff
JH
25
26 Available functionality:
27 - Initialization/deallocation
28 init_flow, clear_edges
ca6c03ca
JH
29 - Low level basic block manipulation
30 alloc_block, expunge_block
402209ff 31 - Edge manipulation
7ded4467 32 make_edge, make_single_succ_edge, cached_make_edge, remove_edge
402209ff
JH
33 - Low level edge redirection (without updating instruction chain)
34 redirect_edge_succ, redirect_edge_succ_nodup, redirect_edge_pred
eaec9b3d 35 - Dumping and debugging
ca6c03ca
JH
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
38c1593d 39 - clear_bb_flags
10e9fecc
JH
40 - Consistency checking
41 verify_flow_info
42 - Dumping and debugging
43 print_rtl_with_bb, dump_bb, debug_bb, debug_bb_n
532aafad
SB
44
45 TODO: Document these "Available functionality" functions in the files
46 that implement them.
402209ff
JH
47 */
48\f
49#include "config.h"
50#include "system.h"
4977bab6 51#include "coretypes.h"
5d85afe9 52#include "backend.h"
60393bbc 53#include "hard-reg-set.h"
957060b5
AM
54#include "tree.h"
55#include "cfghooks.h"
6fb5fa3c 56#include "df.h"
c7131fb2 57#include "cfganal.h"
532aafad 58#include "cfgloop.h" /* FIXME: For struct loop. */
7ee2468b 59#include "dumpfile.h"
402209ff 60
402209ff 61\f
33156717 62
eaec9b3d 63/* Called once at initialization time. */
402209ff
JH
64
65void
9defb1fe 66init_flow (struct function *the_fun)
402209ff 67{
9defb1fe 68 if (!the_fun->cfg)
766090c2 69 the_fun->cfg = ggc_cleared_alloc<control_flow_graph> ();
dc936fb2 70 n_edges_for_fn (the_fun) = 0;
e7a74006 71 the_fun->cfg->count_max = profile_count::uninitialized ();
fefa31b5 72 ENTRY_BLOCK_PTR_FOR_FN (the_fun)
3995f3a2 73 = alloc_block ();
fefa31b5
DM
74 ENTRY_BLOCK_PTR_FOR_FN (the_fun)->index = ENTRY_BLOCK;
75 EXIT_BLOCK_PTR_FOR_FN (the_fun)
3995f3a2 76 = alloc_block ();
fefa31b5
DM
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);
e144a2b3
RB
82 the_fun->cfg->edge_flags_allocated = EDGE_ALL_FLAGS;
83 the_fun->cfg->bb_flags_allocated = BB_ALL_FLAGS;
402209ff
JH
84}
85\f
d39ac0fd 86/* Helper function for remove_edge and clear_edges. Frees edge structure
532aafad 87 without actually removing it from the pred/succ arrays. */
d39ac0fd
JH
88
89static void
61183076 90free_edge (function *fn, edge e)
d39ac0fd 91{
61183076 92 n_edges_for_fn (fn)--;
80d8221e 93 ggc_free (e);
d39ac0fd
JH
94}
95
402209ff
JH
96/* Free the memory associated with the edge structures. */
97
98void
61183076 99clear_edges (struct function *fn)
402209ff 100{
e0082a72 101 basic_block bb;
d39ac0fd 102 edge e;
628f6a4e 103 edge_iterator ei;
402209ff 104
61183076 105 FOR_EACH_BB_FN (bb, fn)
402209ff 106 {
628f6a4e 107 FOR_EACH_EDGE (e, ei, bb->succs)
61183076 108 free_edge (fn, e);
9771b263
DN
109 vec_safe_truncate (bb->succs, 0);
110 vec_safe_truncate (bb->preds, 0);
d39ac0fd 111 }
4891442b 112
61183076
RB
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);
402209ff 117
61183076 118 gcc_assert (!n_edges_for_fn (fn));
402209ff
JH
119}
120\f
ca6c03ca 121/* Allocate memory for basic_block. */
402209ff 122
4262e623 123basic_block
d329e058 124alloc_block (void)
402209ff
JH
125{
126 basic_block bb;
766090c2 127 bb = ggc_cleared_alloc<basic_block_def> ();
3995f3a2 128 bb->count = profile_count::uninitialized ();
4262e623 129 return bb;
402209ff
JH
130}
131
918ed612
ZD
132/* Link block B to chain after AFTER. */
133void
d329e058 134link_block (basic_block b, basic_block after)
918ed612
ZD
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}
f87c27b4 141
918ed612
ZD
142/* Unlink block B from chain. */
143void
d329e058 144unlink_block (basic_block b)
918ed612
ZD
145{
146 b->next_bb->prev_bb = b->prev_bb;
147 b->prev_bb->next_bb = b->next_bb;
6de9cd9a
DN
148 b->prev_bb = NULL;
149 b->next_bb = NULL;
918ed612 150}
f87c27b4 151
bf77398c
ZD
152/* Sequentially order blocks and compact the arrays. */
153void
d329e058 154compact_blocks (void)
bf77398c
ZD
155{
156 int i;
d329e058 157
557c4b49
DM
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));
b8698a0f 160
6fb5fa3c
DB
161 if (df)
162 df_compact_blocks ();
b8698a0f 163 else
bf77398c 164 {
6fb5fa3c 165 basic_block bb;
b8698a0f 166
6fb5fa3c 167 i = NUM_FIXED_BLOCKS;
11cd3bed 168 FOR_EACH_BB_FN (bb, cfun)
6fb5fa3c 169 {
557c4b49 170 SET_BASIC_BLOCK_FOR_FN (cfun, i, bb);
6fb5fa3c
DB
171 bb->index = i;
172 i++;
173 }
0cae8d31 174 gcc_assert (i == n_basic_blocks_for_fn (cfun));
6de9cd9a 175
8b1c6fd7 176 for (; i < last_basic_block_for_fn (cfun); i++)
557c4b49 177 SET_BASIC_BLOCK_FOR_FN (cfun, i, NULL);
6fb5fa3c 178 }
8b1c6fd7 179 last_basic_block_for_fn (cfun) = n_basic_blocks_for_fn (cfun);
bf77398c
ZD
180}
181
bf77398c 182/* Remove block B from the basic block array. */
402209ff 183
6a58eee9 184void
d329e058 185expunge_block (basic_block b)
6a58eee9 186{
918ed612 187 unlink_block (b);
557c4b49 188 SET_BASIC_BLOCK_FOR_FN (cfun, b->index, NULL);
0cae8d31 189 n_basic_blocks_for_fn (cfun)--;
ab3b6795
JH
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. */
6a58eee9 195}
402209ff 196\f
adf4a335
KH
197/* Connect E to E->src. */
198
199static inline void
200connect_src (edge e)
201{
9771b263 202 vec_safe_push (e->src->succs, e);
6fb5fa3c 203 df_mark_solutions_dirty ();
adf4a335
KH
204}
205
206/* Connect E to E->dest. */
207
208static inline void
209connect_dest (edge e)
210{
211 basic_block dest = e->dest;
9771b263 212 vec_safe_push (dest->preds, e);
adf4a335 213 e->dest_idx = EDGE_COUNT (dest->preds) - 1;
6fb5fa3c 214 df_mark_solutions_dirty ();
adf4a335
KH
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 {
9771b263 230 src->succs->unordered_remove (ei.index);
c813039d 231 df_mark_solutions_dirty ();
adf4a335
KH
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
9771b263 249 dest->preds->unordered_remove (dest_idx);
adf4a335
KH
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;
6fb5fa3c 255 df_mark_solutions_dirty ();
adf4a335
KH
256}
257
e0fd3e7a
MM
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
d329e058 263unchecked_make_edge (basic_block src, basic_block dst, int flags)
e0fd3e7a
MM
264{
265 edge e;
766090c2 266 e = ggc_cleared_alloc<edge_def> ();
dc936fb2 267 n_edges_for_fn (cfun)++;
e0fd3e7a 268
357067f2 269 e->probability = profile_probability::uninitialized ();
e0fd3e7a
MM
270 e->src = src;
271 e->dest = dst;
272 e->flags = flags;
adf4a335
KH
273
274 connect_src (e);
275 connect_dest (e);
e0fd3e7a 276
d9d4706f 277 execute_on_growing_pred (e);
e0fd3e7a
MM
278 return e;
279}
280
7ded4467 281/* Create an edge connecting SRC and DST with FLAGS optionally using
2ba84f36 282 edge cache CACHE. Return the new edge, NULL if already exist. */
4262e623 283
7ded4467 284edge
a6ee1a15 285cached_make_edge (sbitmap edge_cache, basic_block src, basic_block dst, int flags)
402209ff 286{
e2c879a1 287 if (edge_cache == NULL
fefa31b5
DM
288 || src == ENTRY_BLOCK_PTR_FOR_FN (cfun)
289 || dst == EXIT_BLOCK_PTR_FOR_FN (cfun))
e2c879a1 290 return make_edge (src, dst, flags);
402209ff 291
e2c879a1 292 /* Does the requested edge already exist? */
d7c028c0 293 if (! bitmap_bit_p (edge_cache, dst->index))
402209ff 294 {
e2c879a1
KH
295 /* The edge does not exist. Create one and update the
296 cache. */
d7c028c0 297 bitmap_set_bit (edge_cache, dst->index);
e2c879a1 298 return unchecked_make_edge (src, dst, flags);
402209ff 299 }
d329e058 300
e2c879a1
KH
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 }
7ded4467 308
e2c879a1 309 return NULL;
7ded4467
JH
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
d329e058 316make_edge (basic_block src, basic_block dest, int flags)
7ded4467 317{
e2c879a1
KH
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);
7ded4467
JH
328}
329
eaec9b3d 330/* Create an edge connecting SRC to DEST and set probability by knowing
7ded4467
JH
331 that it is the single edge leaving SRC. */
332
333edge
d329e058 334make_single_succ_edge (basic_block src, basic_block dest, int flags)
7ded4467
JH
335{
336 edge e = make_edge (src, dest, flags);
337
357067f2 338 e->probability = profile_probability::always ();
7ded4467 339 return e;
402209ff
JH
340}
341
342/* This function will remove an edge from the flow graph. */
343
344void
452ba14d 345remove_edge_raw (edge e)
402209ff 346{
3809e990 347 remove_predictions_associated_with_edge (e);
d9d4706f
KH
348 execute_on_shrinking_pred (e);
349
adf4a335
KH
350 disconnect_src (e);
351 disconnect_dest (e);
402209ff 352
61183076 353 free_edge (cfun, e);
402209ff
JH
354}
355
356/* Redirect an edge's successor from one block to another. */
357
358void
d329e058 359redirect_edge_succ (edge e, basic_block new_succ)
402209ff 360{
d9d4706f
KH
361 execute_on_shrinking_pred (e);
362
adf4a335 363 disconnect_dest (e);
628f6a4e 364
adf4a335 365 e->dest = new_succ;
402209ff
JH
366
367 /* Reconnect the edge to the new successor block. */
adf4a335
KH
368 connect_dest (e);
369
d9d4706f 370 execute_on_growing_pred (e);
402209ff
JH
371}
372
402209ff
JH
373/* Redirect an edge's predecessor from one block to another. */
374
375void
d329e058 376redirect_edge_pred (edge e, basic_block new_pred)
402209ff 377{
adf4a335 378 disconnect_src (e);
402209ff 379
adf4a335 380 e->src = new_pred;
402209ff
JH
381
382 /* Reconnect the edge to the new predecessor block. */
adf4a335 383 connect_src (e);
402209ff 384}
38c1593d 385
c4669594 386/* Clear all basic block flags that do not have to be preserved. */
38c1593d 387void
d329e058 388clear_bb_flags (void)
38c1593d 389{
e0082a72 390 basic_block bb;
ca98e4c5
RB
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;
e0082a72 395
2300c332 396 FOR_ALL_BB_FN (bb, cfun)
ca98e4c5 397 bb->flags &= flags_to_preserve;
38c1593d 398}
402209ff 399\f
878f99d2
JH
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. */
c4669594 405static void
9d9573d5 406check_bb_profile (basic_block bb, FILE * file, int indent)
878f99d2
JH
407{
408 edge e;
628f6a4e 409 edge_iterator ei;
2eb712b4 410 struct function *fun = DECL_STRUCT_FUNCTION (current_function_decl);
c4669594
SB
411 char *s_indent = (char *) alloca ((size_t) indent + 1);
412 memset ((void *) s_indent, ' ', (size_t) indent);
413 s_indent[indent] = '\0';
878f99d2 414
ea19eb9f 415 if (profile_status_for_fn (fun) == PROFILE_ABSENT)
878f99d2
JH
416 return;
417
fefa31b5 418 if (bb != EXIT_BLOCK_PTR_FOR_FN (fun))
878f99d2 419 {
46f1f3c1 420 bool found = false;
357067f2
JH
421 profile_probability sum = profile_probability::never ();
422 int isum = 0;
423
628f6a4e 424 FOR_EACH_EDGE (e, ei, bb->succs)
46f1f3c1 425 {
357067f2 426 if (!(e->flags & (EDGE_EH | EDGE_FAKE)))
46f1f3c1
JH
427 found = true;
428 sum += e->probability;
357067f2
JH
429 if (e->probability.initialized_p ())
430 isum += e->probability.to_reg_br_prob_base ();
46f1f3c1
JH
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 {
357067f2
JH
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 }
46f1f3c1 453 }
878f99d2 454 }
357067f2 455 if (bb != ENTRY_BLOCK_PTR_FOR_FN (fun))
878f99d2 456 {
e7a74006 457 profile_count sum = profile_count::zero ();
628f6a4e 458 FOR_EACH_EDGE (e, ei, bb->preds)
e7a74006
JH
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 }
878f99d2 469 }
600b5b1d
TJ
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))
9d9573d5
ML
475 fprintf (file, ";; %sBlock in cold partition with hot count\n",
476 s_indent);
600b5b1d
TJ
477 FOR_EACH_EDGE (e, ei, bb->preds)
478 {
479 if (!probably_never_executed_edge_p (fun, e))
480 fprintf (file,
9d9573d5
ML
481 ";; %sBlock in cold partition with incoming hot edge\n",
482 s_indent);
600b5b1d
TJ
483 }
484 }
878f99d2
JH
485}
486\f
402209ff 487void
1a817418 488dump_edge_info (FILE *file, edge e, dump_flags_t flags, int do_succ)
402209ff 489{
ca6c03ca 490 basic_block side = (do_succ ? e->dest : e->src);
a315c44c
SB
491 bool do_details = false;
492
493 if ((flags & TDF_DETAILS) != 0
494 && (flags & TDF_SLIM) == 0)
495 do_details = true;
496
532aafad 497 if (side->index == ENTRY_BLOCK)
ca6c03ca 498 fputs (" ENTRY", file);
532aafad 499 else if (side->index == EXIT_BLOCK)
ca6c03ca
JH
500 fputs (" EXIT", file);
501 else
0b17ab2f 502 fprintf (file, " %d", side->index);
ca6c03ca 503
357067f2
JH
504 if (e->probability.initialized_p () && do_details)
505 {
506 fprintf (file, " [");
507 e->probability.dump (file);
508 fprintf (file, "] ");
509 }
402209ff 510
ef30ab83 511 if (e->count ().initialized_p () && do_details)
402209ff 512 {
edb30094 513 fputs (" count:", file);
ef30ab83 514 e->count ().dump (file);
402209ff
JH
515 }
516
a315c44c 517 if (e->flags && do_details)
402209ff 518 {
a315c44c
SB
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;
ca6c03ca 527 int i, flags = e->flags;
402209ff 528
a315c44c 529 gcc_assert (e->flags <= EDGE_ALL_FLAGS);
4891442b 530 fputs (" (", file);
402209ff
JH
531 for (i = 0; flags; i++)
532 if (flags & (1 << i))
533 {
534 flags &= ~(1 << i);
535
536 if (comma)
537 fputc (',', file);
a315c44c
SB
538 fputs (bitnames[i], file);
539 comma = true;
402209ff 540 }
4891442b 541
402209ff
JH
542 fputc (')', file);
543 }
544}
7b3b6ae4
LC
545
546DEBUG_FUNCTION void
547debug (edge_def &ref)
548{
6eb3cadb
ML
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");
7b3b6ae4
LC
553}
554
555DEBUG_FUNCTION void
556debug (edge_def *ptr)
557{
558 if (ptr)
559 debug (*ptr);
560 else
561 fprintf (stderr, "<nil>\n");
562}
19a30b71
AH
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)
402209ff 573\f
ff7cc307 574/* Simple routines to easily allocate AUX fields of basic blocks. */
4891442b 575
ca6c03ca
JH
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;
402209ff 580
09da1532 581/* Allocate a memory block of SIZE as BB->aux. The obstack must
ca6c03ca 582 be first initialized by alloc_aux_for_blocks. */
402209ff 583
a398224a 584static void
d329e058 585alloc_aux_for_block (basic_block bb, int size)
402209ff 586{
ca6c03ca 587 /* Verify that aux field is clear. */
341c100f 588 gcc_assert (!bb->aux && first_block_aux_obj);
ca6c03ca
JH
589 bb->aux = obstack_alloc (&block_aux_obstack, size);
590 memset (bb->aux, 0, size);
402209ff
JH
591}
592
ca6c03ca
JH
593/* Initialize the block_aux_obstack and if SIZE is nonzero, call
594 alloc_aux_for_block for each basic block. */
402209ff
JH
595
596void
d329e058 597alloc_aux_for_blocks (int size)
402209ff 598{
ca6c03ca 599 static int initialized;
402209ff 600
ca6c03ca 601 if (!initialized)
402209ff 602 {
ca6c03ca
JH
603 gcc_obstack_init (&block_aux_obstack);
604 initialized = 1;
402209ff 605 }
341c100f
NS
606 else
607 /* Check whether AUX data are still allocated. */
608 gcc_assert (!first_block_aux_obj);
c22cacf3 609
703ad42b 610 first_block_aux_obj = obstack_alloc (&block_aux_obstack, 0);
ca6c03ca 611 if (size)
402209ff 612 {
e0082a72 613 basic_block bb;
4891442b 614
04a90bec 615 FOR_ALL_BB_FN (bb, cfun)
e0082a72 616 alloc_aux_for_block (bb, size);
402209ff
JH
617 }
618}
ca6c03ca 619
108c1afc 620/* Clear AUX pointers of all blocks. */
402209ff
JH
621
622void
d329e058 623clear_aux_for_blocks (void)
402209ff 624{
e0082a72 625 basic_block bb;
4891442b 626
04a90bec 627 FOR_ALL_BB_FN (bb, cfun)
e0082a72 628 bb->aux = NULL;
108c1afc
RH
629}
630
631/* Free data allocated in block_aux_obstack and clear AUX pointers
632 of all blocks. */
633
634void
d329e058 635free_aux_for_blocks (void)
108c1afc 636{
341c100f 637 gcc_assert (first_block_aux_obj);
108c1afc 638 obstack_free (&block_aux_obstack, first_block_aux_obj);
ca6c03ca 639 first_block_aux_obj = NULL;
108c1afc
RH
640
641 clear_aux_for_blocks ();
ca6c03ca 642}
402209ff 643
039496da 644/* Allocate a memory edge of SIZE as E->aux. The obstack must
ca6c03ca 645 be first initialized by alloc_aux_for_edges. */
402209ff 646
039496da 647void
d329e058 648alloc_aux_for_edge (edge e, int size)
ca6c03ca
JH
649{
650 /* Verify that aux field is clear. */
341c100f 651 gcc_assert (!e->aux && first_edge_aux_obj);
ca6c03ca
JH
652 e->aux = obstack_alloc (&edge_aux_obstack, size);
653 memset (e->aux, 0, size);
654}
402209ff 655
ca6c03ca
JH
656/* Initialize the edge_aux_obstack and if SIZE is nonzero, call
657 alloc_aux_for_edge for each basic edge. */
402209ff 658
ca6c03ca 659void
d329e058 660alloc_aux_for_edges (int size)
ca6c03ca
JH
661{
662 static int initialized;
402209ff 663
ca6c03ca
JH
664 if (!initialized)
665 {
666 gcc_obstack_init (&edge_aux_obstack);
667 initialized = 1;
402209ff 668 }
341c100f
NS
669 else
670 /* Check whether AUX data are still allocated. */
671 gcc_assert (!first_edge_aux_obj);
4891442b 672
703ad42b 673 first_edge_aux_obj = obstack_alloc (&edge_aux_obstack, 0);
ca6c03ca 674 if (size)
402209ff 675 {
e0082a72
ZD
676 basic_block bb;
677
fefa31b5
DM
678 FOR_BB_BETWEEN (bb, ENTRY_BLOCK_PTR_FOR_FN (cfun),
679 EXIT_BLOCK_PTR_FOR_FN (cfun), next_bb)
402209ff 680 {
ca6c03ca 681 edge e;
628f6a4e 682 edge_iterator ei;
ca6c03ca 683
628f6a4e 684 FOR_EACH_EDGE (e, ei, bb->succs)
ca6c03ca 685 alloc_aux_for_edge (e, size);
402209ff 686 }
402209ff 687 }
402209ff 688}
402209ff 689
108c1afc 690/* Clear AUX pointers of all edges. */
ca6c03ca
JH
691
692void
d329e058 693clear_aux_for_edges (void)
402209ff 694{
e0082a72
ZD
695 basic_block bb;
696 edge e;
402209ff 697
fefa31b5
DM
698 FOR_BB_BETWEEN (bb, ENTRY_BLOCK_PTR_FOR_FN (cfun),
699 EXIT_BLOCK_PTR_FOR_FN (cfun), next_bb)
402209ff 700 {
628f6a4e
BE
701 edge_iterator ei;
702 FOR_EACH_EDGE (e, ei, bb->succs)
ca6c03ca 703 e->aux = NULL;
402209ff 704 }
108c1afc
RH
705}
706
707/* Free data allocated in edge_aux_obstack and clear AUX pointers
708 of all edges. */
709
710void
d329e058 711free_aux_for_edges (void)
108c1afc 712{
341c100f 713 gcc_assert (first_edge_aux_obj);
108c1afc 714 obstack_free (&edge_aux_obstack, first_edge_aux_obj);
ca6c03ca 715 first_edge_aux_obj = NULL;
108c1afc
RH
716
717 clear_aux_for_edges ();
402209ff 718}
9ee634e3 719
24e47c76 720DEBUG_FUNCTION void
d329e058 721debug_bb (basic_block bb)
10e9fecc 722{
f8923f7e 723 dump_bb (stderr, bb, 0, dump_flags);
10e9fecc
JH
724}
725
24e47c76 726DEBUG_FUNCTION basic_block
d329e058 727debug_bb_n (int n)
10e9fecc 728{
06e28de2 729 basic_block bb = BASIC_BLOCK_FOR_FN (cfun, n);
a315c44c 730 debug_bb (bb);
10e9fecc 731 return bb;
9ee634e3 732}
6de9cd9a 733
a315c44c
SB
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. */
6de9cd9a 740
a315c44c 741void
1a817418 742dump_bb_info (FILE *outf, basic_block bb, int indent, dump_flags_t flags,
a315c44c 743 bool do_header, bool do_footer)
6de9cd9a 744{
628f6a4e 745 edge_iterator ei;
a315c44c 746 edge e;
6de9cd9a
DN
747 static const char * const bb_bitnames[] =
748 {
a315c44c
SB
749#define DEF_BASIC_BLOCK_FLAG(NAME,IDX) #NAME ,
750#include "cfg-flags.def"
751 NULL
752#undef DEF_BASIC_BLOCK_FLAG
6de9cd9a
DN
753 };
754 const unsigned n_bitnames = sizeof (bb_bitnames) / sizeof (char *);
c4669594 755 bool first;
a315c44c
SB
756 char *s_indent = (char *) alloca ((size_t) indent + 1);
757 memset ((void *) s_indent, ' ', (size_t) indent);
758 s_indent[indent] = '\0';
6de9cd9a 759
a315c44c
SB
760 gcc_assert (bb->flags <= BB_ALL_FLAGS);
761
762 if (do_header)
763 {
764 unsigned i;
765
9d9573d5 766 fputs (";; ", outf);
c4669594 767 fprintf (outf, "%sbasic block %d, loop depth %d",
391886c8 768 s_indent, bb->index, bb_loop_depth (bb));
a315c44c
SB
769 if (flags & TDF_DETAILS)
770 {
2eb712b4 771 struct function *fun = DECL_STRUCT_FUNCTION (current_function_decl);
3995f3a2
JH
772 if (bb->count.initialized_p ())
773 {
774 fputs (", count ", outf);
775 bb->count.dump (outf);
776 }
2eb712b4 777 if (maybe_hot_bb_p (fun, bb))
a315c44c 778 fputs (", maybe hot", outf);
2eb712b4 779 if (probably_never_executed_bb_p (fun, bb))
a315c44c
SB
780 fputs (", probably never executed", outf);
781 }
782 fputc ('\n', outf);
783
784 if (flags & TDF_DETAILS)
785 {
9d9573d5
ML
786 check_bb_profile (bb, outf, indent);
787 fputs (";; ", outf);
a315c44c
SB
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);
c4669594 800 first = true;
a315c44c
SB
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);
c4669594 813 fputc ('\n', outf);
a315c44c 814 }
a315c44c 815
9d9573d5 816 fputs (";; ", outf);
a315c44c 817 fprintf (outf, "%s pred: ", s_indent);
c4669594 818 first = true;
a315c44c 819 FOR_EACH_EDGE (e, ei, bb->preds)
c4669594
SB
820 {
821 if (! first)
822 {
9d9573d5 823 fputs (";; ", outf);
c4669594
SB
824 fprintf (outf, "%s ", s_indent);
825 }
826 first = false;
827 dump_edge_info (outf, e, flags, 0);
828 fputc ('\n', outf);
829 }
1dd5907e
SB
830 if (first)
831 fputc ('\n', outf);
a315c44c
SB
832 }
833
834 if (do_footer)
835 {
9d9573d5 836 fputs (";; ", outf);
a315c44c 837 fprintf (outf, "%s succ: ", s_indent);
c4669594 838 first = true;
a315c44c 839 FOR_EACH_EDGE (e, ei, bb->succs)
c4669594
SB
840 {
841 if (! first)
842 {
9d9573d5 843 fputs (";; ", outf);
c4669594
SB
844 fprintf (outf, "%s ", s_indent);
845 }
846 first = false;
847 dump_edge_info (outf, e, flags, 1);
848 fputc ('\n', outf);
849 }
1dd5907e
SB
850 if (first)
851 fputc ('\n', outf);
a315c44c 852 }
6de9cd9a
DN
853}
854
855/* Dumps a brief description of cfg to FILE. */
856
857void
1a817418 858brief_dump_cfg (FILE *file, dump_flags_t flags)
6de9cd9a
DN
859{
860 basic_block bb;
861
11cd3bed 862 FOR_EACH_BB_FN (bb, cfun)
6de9cd9a 863 {
9d9573d5 864 dump_bb_info (file, bb, 0, flags & TDF_DETAILS, true, true);
6de9cd9a
DN
865 }
866}
15db5571 867
e7a74006 868/* An edge originally destinating BB of COUNT has been proved to
15db5571 869 leave the block by TAKEN_EDGE. Update profile of BB such that edge E can be
c22cacf3 870 redirected to destination of TAKEN_EDGE.
15db5571
JH
871
872 This function may leave the profile inconsistent in the case TAKEN_EDGE
e7a74006 873 frequency or count is believed to be lower than COUNT
d4a9b3a3 874 respectively. */
15db5571 875void
e7a74006 876update_bb_profile_for_threading (basic_block bb,
3995f3a2 877 profile_count count, edge taken_edge)
15db5571
JH
878{
879 edge c;
357067f2 880 profile_probability prob;
628f6a4e 881 edge_iterator ei;
15db5571 882
3995f3a2 883 if (bb->count < count)
2b151cb2
JH
884 {
885 if (dump_file)
886 fprintf (dump_file, "bb %i count became negative after threading",
887 bb->index);
2b151cb2 888 }
3995f3a2 889 bb->count -= count;
15db5571
JH
890
891 /* Compute the probability of TAKEN_EDGE being reached via threaded edge.
892 Watch for overflows. */
e7a74006
JH
893 if (bb->count.nonzero_p ())
894 prob = count.probability_in (bb->count);
15db5571 895 else
357067f2 896 prob = profile_probability::never ();
15db5571
JH
897 if (prob > taken_edge->probability)
898 {
899 if (dump_file)
357067f2
JH
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);
15db5571
JH
910 }
911
912 /* Now rescale the probabilities. */
913 taken_edge->probability -= prob;
357067f2
JH
914 prob = prob.invert ();
915 if (prob == profile_probability::never ())
15db5571
JH
916 {
917 if (dump_file)
e7a74006
JH
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);
357067f2 921 EDGE_SUCC (bb, 0)->probability = profile_probability::guessed_always ();
628f6a4e
BE
922 ei = ei_start (bb->succs);
923 ei_next (&ei);
924 for (; (c = ei_safe_edge (ei)); ei_next (&ei))
357067f2 925 c->probability = profile_probability::guessed_never ();
15db5571 926 }
357067f2 927 else if (!(prob == profile_probability::always ()))
763ea904 928 {
763ea904 929 FOR_EACH_EDGE (c, ei, bb->succs)
357067f2 930 c->probability /= prob;
763ea904 931 }
15db5571 932
41806d92 933 gcc_assert (bb == taken_edge->src);
15db5571 934}
33156717 935
3995f3a2
JH
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;
e7a74006
JH
944 if (num == profile_count::zero () || den.nonzero_p ())
945 for (i = 0; i < nbbs; i++)
3995f3a2 946 bbs[i]->count = bbs[i]->count.apply_scale (num, den);
3995f3a2
JH
947}
948
af2bbc51
JH
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;
af2bbc51
JH
957
958 for (i = 0; i < nbbs; i++)
e7a74006 959 bbs[i]->count = bbs[i]->count.apply_probability (p);
af2bbc51
JH
960}
961
703c8606 962/* Helper types for hash tables. */
6580ee77
JH
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
8d67ee55 972struct bb_copy_hasher : nofree_ptr_hash <htab_bb_copy_original_entry>
6580ee77 973{
67f58944
TS
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);
703c8606 977};
6580ee77 978
703c8606 979inline hashval_t
67f58944 980bb_copy_hasher::hash (const htab_bb_copy_original_entry *data)
703c8606 981{
6580ee77
JH
982 return data->index1;
983}
6580ee77 984
703c8606 985inline bool
67f58944
TS
986bb_copy_hasher::equal (const htab_bb_copy_original_entry *data,
987 const htab_bb_copy_original_entry *data2)
703c8606 988{
6580ee77
JH
989 return data->index1 == data2->index1;
990}
991
703c8606
LC
992/* Data structures used to maintain mapping between basic blocks and
993 copies. */
c203e8a7
TS
994static hash_table<bb_copy_hasher> *bb_original;
995static hash_table<bb_copy_hasher> *bb_copy;
703c8606
LC
996
997/* And between loops and copies. */
c203e8a7 998static hash_table<bb_copy_hasher> *loop_copy;
fb0b2914 999static object_allocator<htab_bb_copy_original_entry> *original_copy_bb_pool;
703c8606 1000
f341de7b
KH
1001/* Initialize the data structures to maintain mapping between blocks
1002 and its copies. */
6580ee77
JH
1003void
1004initialize_original_copy_tables (void)
1005{
fb0b2914 1006 original_copy_bb_pool = new object_allocator<htab_bb_copy_original_entry>
fcb87c50 1007 ("original_copy");
c203e8a7
TS
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);
6580ee77
JH
1011}
1012
d96004b8
BC
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
f341de7b
KH
1025/* Free the data structures to maintain mapping between blocks and
1026 its copies. */
6580ee77
JH
1027void
1028free_original_copy_tables (void)
1029{
1030 gcc_assert (original_copy_bb_pool);
c203e8a7
TS
1031 delete bb_copy;
1032 bb_copy = NULL;
1033 delete bb_original;
af711c23 1034 bb_original = NULL;
c203e8a7
TS
1035 delete loop_copy;
1036 loop_copy = NULL;
ac0539d7 1037 delete original_copy_bb_pool;
6580ee77
JH
1038 original_copy_bb_pool = NULL;
1039}
1040
c2e84327
DM
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
561e8a90
ZD
1050/* Removes the value associated with OBJ from table TAB. */
1051
1052static void
c203e8a7 1053copy_original_table_clear (hash_table<bb_copy_hasher> *tab, unsigned obj)
561e8a90 1054{
703c8606 1055 htab_bb_copy_original_entry **slot;
561e8a90
ZD
1056 struct htab_bb_copy_original_entry key, *elt;
1057
1058 if (!original_copy_bb_pool)
1059 return;
1060
1061 key.index1 = obj;
c203e8a7 1062 slot = tab->find_slot (&key, NO_INSERT);
561e8a90
ZD
1063 if (!slot)
1064 return;
1065
703c8606 1066 elt = *slot;
c203e8a7 1067 tab->clear_slot (slot);
ac0539d7 1068 original_copy_bb_pool->remove (elt);
561e8a90
ZD
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
c203e8a7 1075copy_original_table_set (hash_table<bb_copy_hasher> *tab,
703c8606 1076 unsigned obj, unsigned val)
561e8a90
ZD
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;
c203e8a7 1085 slot = tab->find_slot (&key, INSERT);
561e8a90
ZD
1086 if (!*slot)
1087 {
ac0539d7 1088 *slot = original_copy_bb_pool->allocate ();
561e8a90
ZD
1089 (*slot)->index1 = obj;
1090 }
1091 (*slot)->index2 = val;
1092}
1093
f341de7b
KH
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. */
6580ee77
JH
1096void
1097set_bb_original (basic_block bb, basic_block original)
1098{
561e8a90 1099 copy_original_table_set (bb_original, bb->index, original->index);
6580ee77
JH
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;
c203e8a7 1112 entry = bb_original->find (&key);
6580ee77 1113 if (entry)
06e28de2 1114 return BASIC_BLOCK_FOR_FN (cfun, entry->index2);
6580ee77
JH
1115 else
1116 return NULL;
1117}
1118
f341de7b
KH
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. */
6580ee77
JH
1121void
1122set_bb_copy (basic_block bb, basic_block copy)
1123{
561e8a90 1124 copy_original_table_set (bb_copy, bb->index, copy->index);
6580ee77
JH
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;
c203e8a7 1137 entry = bb_copy->find (&key);
6580ee77 1138 if (entry)
06e28de2 1139 return BASIC_BLOCK_FOR_FN (cfun, entry->index2);
6580ee77
JH
1140 else
1141 return NULL;
1142}
561e8a90
ZD
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
99b1c316 1148set_loop_copy (class loop *loop, class loop *copy)
561e8a90
ZD
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
99b1c316
MS
1158class loop *
1159get_loop_copy (class loop *loop)
561e8a90
ZD
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;
c203e8a7 1167 entry = loop_copy->find (&key);
561e8a90 1168 if (entry)
0fc822d0 1169 return get_loop (cfun, entry->index2);
561e8a90
ZD
1170 else
1171 return NULL;
1172}