]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/cfg.cc
inter-procedural value range propagation
[thirdparty/gcc.git] / gcc / cfg.cc
CommitLineData
402209ff 1/* Control flow graph manipulation code for GNU compiler.
aeee4812 2 Copyright (C) 1987-2023 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
45281f12 28 init_flow, free_cfg
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;
0c78240f 84 the_fun->cfg->full_profile = false;
402209ff
JH
85}
86\f
45281f12 87/* Helper function for remove_edge and free_cffg. Frees edge structure
532aafad 88 without actually removing it from the pred/succ arrays. */
d39ac0fd
JH
89
90static void
61183076 91free_edge (function *fn, edge e)
d39ac0fd 92{
61183076 93 n_edges_for_fn (fn)--;
80d8221e 94 ggc_free (e);
d39ac0fd
JH
95}
96
45281f12
JH
97/* Free basic block BB. */
98
99static void
100free_block (basic_block bb)
101{
102 vec_free (bb->succs);
103 bb->succs = NULL;
104 vec_free (bb->preds);
105 bb->preds = NULL;
ae99b315 106 ggc_free (bb);
45281f12
JH
107}
108
109/* Free the memory associated with the CFG in FN. */
402209ff
JH
110
111void
45281f12 112free_cfg (struct function *fn)
402209ff 113{
d39ac0fd 114 edge e;
628f6a4e 115 edge_iterator ei;
45281f12 116 basic_block next;
402209ff 117
45281f12 118 for (basic_block bb = ENTRY_BLOCK_PTR_FOR_FN (fn); bb; bb = next)
402209ff 119 {
45281f12 120 next = bb->next_bb;
628f6a4e 121 FOR_EACH_EDGE (e, ei, bb->succs)
61183076 122 free_edge (fn, e);
45281f12 123 free_block (bb);
d39ac0fd 124 }
4891442b 125
61183076 126 gcc_assert (!n_edges_for_fn (fn));
45281f12
JH
127 /* Sanity check that dominance tree is freed. */
128 gcc_assert (!fn->cfg->x_dom_computed[0] && !fn->cfg->x_dom_computed[1]);
129
130 vec_free (fn->cfg->x_label_to_block_map);
131 vec_free (basic_block_info_for_fn (fn));
132 ggc_free (fn->cfg);
133 fn->cfg = NULL;
402209ff
JH
134}
135\f
ca6c03ca 136/* Allocate memory for basic_block. */
402209ff 137
4262e623 138basic_block
d329e058 139alloc_block (void)
402209ff
JH
140{
141 basic_block bb;
766090c2 142 bb = ggc_cleared_alloc<basic_block_def> ();
3995f3a2 143 bb->count = profile_count::uninitialized ();
4262e623 144 return bb;
402209ff
JH
145}
146
918ed612
ZD
147/* Link block B to chain after AFTER. */
148void
d329e058 149link_block (basic_block b, basic_block after)
918ed612
ZD
150{
151 b->next_bb = after->next_bb;
152 b->prev_bb = after;
153 after->next_bb = b;
154 b->next_bb->prev_bb = b;
155}
f87c27b4 156
918ed612
ZD
157/* Unlink block B from chain. */
158void
d329e058 159unlink_block (basic_block b)
918ed612
ZD
160{
161 b->next_bb->prev_bb = b->prev_bb;
162 b->prev_bb->next_bb = b->next_bb;
6de9cd9a
DN
163 b->prev_bb = NULL;
164 b->next_bb = NULL;
918ed612 165}
f87c27b4 166
bf77398c
ZD
167/* Sequentially order blocks and compact the arrays. */
168void
d329e058 169compact_blocks (void)
bf77398c
ZD
170{
171 int i;
d329e058 172
557c4b49
DM
173 SET_BASIC_BLOCK_FOR_FN (cfun, ENTRY_BLOCK, ENTRY_BLOCK_PTR_FOR_FN (cfun));
174 SET_BASIC_BLOCK_FOR_FN (cfun, EXIT_BLOCK, EXIT_BLOCK_PTR_FOR_FN (cfun));
b8698a0f 175
6fb5fa3c
DB
176 if (df)
177 df_compact_blocks ();
b8698a0f 178 else
bf77398c 179 {
6fb5fa3c 180 basic_block bb;
b8698a0f 181
6fb5fa3c 182 i = NUM_FIXED_BLOCKS;
11cd3bed 183 FOR_EACH_BB_FN (bb, cfun)
6fb5fa3c 184 {
557c4b49 185 SET_BASIC_BLOCK_FOR_FN (cfun, i, bb);
6fb5fa3c
DB
186 bb->index = i;
187 i++;
188 }
0cae8d31 189 gcc_assert (i == n_basic_blocks_for_fn (cfun));
6de9cd9a 190
8b1c6fd7 191 for (; i < last_basic_block_for_fn (cfun); i++)
557c4b49 192 SET_BASIC_BLOCK_FOR_FN (cfun, i, NULL);
6fb5fa3c 193 }
8b1c6fd7 194 last_basic_block_for_fn (cfun) = n_basic_blocks_for_fn (cfun);
bf77398c
ZD
195}
196
bf77398c 197/* Remove block B from the basic block array. */
402209ff 198
6a58eee9 199void
d329e058 200expunge_block (basic_block b)
6a58eee9 201{
918ed612 202 unlink_block (b);
557c4b49 203 SET_BASIC_BLOCK_FOR_FN (cfun, b->index, NULL);
0cae8d31 204 n_basic_blocks_for_fn (cfun)--;
ab3b6795
JH
205 /* We should be able to ggc_free here, but we are not.
206 The dead SSA_NAMES are left pointing to dead statements that are pointing
207 to dead basic blocks making garbage collector to die.
45281f12
JH
208 We should be able to release all dead SSA_NAMES and at the same time we
209 should clear out BB pointer of dead statements consistently. */
6a58eee9 210}
402209ff 211\f
adf4a335
KH
212/* Connect E to E->src. */
213
214static inline void
215connect_src (edge e)
216{
9771b263 217 vec_safe_push (e->src->succs, e);
6fb5fa3c 218 df_mark_solutions_dirty ();
adf4a335
KH
219}
220
221/* Connect E to E->dest. */
222
223static inline void
224connect_dest (edge e)
225{
226 basic_block dest = e->dest;
9771b263 227 vec_safe_push (dest->preds, e);
adf4a335 228 e->dest_idx = EDGE_COUNT (dest->preds) - 1;
6fb5fa3c 229 df_mark_solutions_dirty ();
adf4a335
KH
230}
231
232/* Disconnect edge E from E->src. */
233
234static inline void
235disconnect_src (edge e)
236{
237 basic_block src = e->src;
238 edge_iterator ei;
239 edge tmp;
240
241 for (ei = ei_start (src->succs); (tmp = ei_safe_edge (ei)); )
242 {
243 if (tmp == e)
244 {
9771b263 245 src->succs->unordered_remove (ei.index);
c813039d 246 df_mark_solutions_dirty ();
adf4a335
KH
247 return;
248 }
249 else
250 ei_next (&ei);
251 }
252
253 gcc_unreachable ();
254}
255
256/* Disconnect edge E from E->dest. */
257
258static inline void
259disconnect_dest (edge e)
260{
261 basic_block dest = e->dest;
262 unsigned int dest_idx = e->dest_idx;
263
9771b263 264 dest->preds->unordered_remove (dest_idx);
adf4a335
KH
265
266 /* If we removed an edge in the middle of the edge vector, we need
267 to update dest_idx of the edge that moved into the "hole". */
268 if (dest_idx < EDGE_COUNT (dest->preds))
269 EDGE_PRED (dest, dest_idx)->dest_idx = dest_idx;
6fb5fa3c 270 df_mark_solutions_dirty ();
adf4a335
KH
271}
272
e0fd3e7a
MM
273/* Create an edge connecting SRC and DEST with flags FLAGS. Return newly
274 created edge. Use this only if you are sure that this edge can't
275 possibly already exist. */
276
277edge
d329e058 278unchecked_make_edge (basic_block src, basic_block dst, int flags)
e0fd3e7a
MM
279{
280 edge e;
766090c2 281 e = ggc_cleared_alloc<edge_def> ();
dc936fb2 282 n_edges_for_fn (cfun)++;
e0fd3e7a 283
357067f2 284 e->probability = profile_probability::uninitialized ();
e0fd3e7a
MM
285 e->src = src;
286 e->dest = dst;
287 e->flags = flags;
adf4a335
KH
288
289 connect_src (e);
290 connect_dest (e);
e0fd3e7a 291
d9d4706f 292 execute_on_growing_pred (e);
e0fd3e7a
MM
293 return e;
294}
295
7ded4467 296/* Create an edge connecting SRC and DST with FLAGS optionally using
2ba84f36 297 edge cache CACHE. Return the new edge, NULL if already exist. */
4262e623 298
7ded4467 299edge
a6ee1a15 300cached_make_edge (sbitmap edge_cache, basic_block src, basic_block dst, int flags)
402209ff 301{
e2c879a1 302 if (edge_cache == NULL
fefa31b5
DM
303 || src == ENTRY_BLOCK_PTR_FOR_FN (cfun)
304 || dst == EXIT_BLOCK_PTR_FOR_FN (cfun))
e2c879a1 305 return make_edge (src, dst, flags);
402209ff 306
e2c879a1 307 /* Does the requested edge already exist? */
d7c028c0 308 if (! bitmap_bit_p (edge_cache, dst->index))
402209ff 309 {
e2c879a1
KH
310 /* The edge does not exist. Create one and update the
311 cache. */
d7c028c0 312 bitmap_set_bit (edge_cache, dst->index);
e2c879a1 313 return unchecked_make_edge (src, dst, flags);
402209ff 314 }
d329e058 315
e2c879a1
KH
316 /* At this point, we know that the requested edge exists. Adjust
317 flags if necessary. */
318 if (flags)
319 {
320 edge e = find_edge (src, dst);
321 e->flags |= flags;
322 }
7ded4467 323
e2c879a1 324 return NULL;
7ded4467
JH
325}
326
327/* Create an edge connecting SRC and DEST with flags FLAGS. Return newly
328 created edge or NULL if already exist. */
329
330edge
d329e058 331make_edge (basic_block src, basic_block dest, int flags)
7ded4467 332{
e2c879a1
KH
333 edge e = find_edge (src, dest);
334
335 /* Make sure we don't add duplicate edges. */
336 if (e)
337 {
338 e->flags |= flags;
339 return NULL;
340 }
341
342 return unchecked_make_edge (src, dest, flags);
7ded4467
JH
343}
344
eaec9b3d 345/* Create an edge connecting SRC to DEST and set probability by knowing
7ded4467
JH
346 that it is the single edge leaving SRC. */
347
348edge
d329e058 349make_single_succ_edge (basic_block src, basic_block dest, int flags)
7ded4467
JH
350{
351 edge e = make_edge (src, dest, flags);
352
357067f2 353 e->probability = profile_probability::always ();
7ded4467 354 return e;
402209ff
JH
355}
356
357/* This function will remove an edge from the flow graph. */
358
359void
452ba14d 360remove_edge_raw (edge e)
402209ff 361{
3809e990 362 remove_predictions_associated_with_edge (e);
d9d4706f
KH
363 execute_on_shrinking_pred (e);
364
adf4a335
KH
365 disconnect_src (e);
366 disconnect_dest (e);
402209ff 367
61183076 368 free_edge (cfun, e);
402209ff
JH
369}
370
371/* Redirect an edge's successor from one block to another. */
372
373void
d329e058 374redirect_edge_succ (edge e, basic_block new_succ)
402209ff 375{
d9d4706f
KH
376 execute_on_shrinking_pred (e);
377
adf4a335 378 disconnect_dest (e);
628f6a4e 379
adf4a335 380 e->dest = new_succ;
402209ff
JH
381
382 /* Reconnect the edge to the new successor block. */
adf4a335
KH
383 connect_dest (e);
384
d9d4706f 385 execute_on_growing_pred (e);
402209ff
JH
386}
387
402209ff
JH
388/* Redirect an edge's predecessor from one block to another. */
389
390void
d329e058 391redirect_edge_pred (edge e, basic_block new_pred)
402209ff 392{
adf4a335 393 disconnect_src (e);
402209ff 394
adf4a335 395 e->src = new_pred;
402209ff
JH
396
397 /* Reconnect the edge to the new predecessor block. */
adf4a335 398 connect_src (e);
402209ff 399}
38c1593d 400
c4669594 401/* Clear all basic block flags that do not have to be preserved. */
38c1593d 402void
d329e058 403clear_bb_flags (void)
38c1593d 404{
e0082a72 405 basic_block bb;
ca98e4c5
RB
406 int flags_to_preserve = BB_FLAGS_TO_PRESERVE;
407 if (current_loops
408 && loops_state_satisfies_p (cfun, LOOPS_HAVE_MARKED_IRREDUCIBLE_REGIONS))
409 flags_to_preserve |= BB_IRREDUCIBLE_LOOP;
e0082a72 410
2300c332 411 FOR_ALL_BB_FN (bb, cfun)
ca98e4c5 412 bb->flags &= flags_to_preserve;
38c1593d 413}
402209ff 414\f
878f99d2
JH
415/* Check the consistency of profile information. We can't do that
416 in verify_flow_info, as the counts may get invalid for incompletely
417 solved graphs, later eliminating of conditionals or roundoff errors.
418 It is still practical to have them reported for debugging of simple
419 testcases. */
c4669594 420static void
9d9573d5 421check_bb_profile (basic_block bb, FILE * file, int indent)
878f99d2
JH
422{
423 edge e;
628f6a4e 424 edge_iterator ei;
2eb712b4 425 struct function *fun = DECL_STRUCT_FUNCTION (current_function_decl);
c4669594
SB
426 char *s_indent = (char *) alloca ((size_t) indent + 1);
427 memset ((void *) s_indent, ' ', (size_t) indent);
428 s_indent[indent] = '\0';
878f99d2 429
ea19eb9f 430 if (profile_status_for_fn (fun) == PROFILE_ABSENT)
878f99d2
JH
431 return;
432
fefa31b5 433 if (bb != EXIT_BLOCK_PTR_FOR_FN (fun))
878f99d2 434 {
46f1f3c1 435 bool found = false;
357067f2
JH
436 profile_probability sum = profile_probability::never ();
437 int isum = 0;
438
628f6a4e 439 FOR_EACH_EDGE (e, ei, bb->succs)
46f1f3c1 440 {
357067f2 441 if (!(e->flags & (EDGE_EH | EDGE_FAKE)))
46f1f3c1
JH
442 found = true;
443 sum += e->probability;
357067f2
JH
444 if (e->probability.initialized_p ())
445 isum += e->probability.to_reg_br_prob_base ();
46f1f3c1
JH
446 }
447 /* Only report mismatches for non-EH control flow. If there are only EH
448 edges it means that the BB ends by noreturn call. Here the control
449 flow may just terminate. */
450 if (found)
451 {
357067f2
JH
452 if (sum.differs_from_p (profile_probability::always ()))
453 {
454 fprintf (file,
455 ";; %sInvalid sum of outgoing probabilities ",
456 s_indent);
457 sum.dump (file);
458 fprintf (file, "\n");
459 }
460 /* Probabilities caps to 100% and thus the previous test will never
461 fire if the sum of probabilities is too large. */
462 else if (isum > REG_BR_PROB_BASE + 100)
463 {
464 fprintf (file,
465 ";; %sInvalid sum of outgoing probabilities %.1f%%\n",
466 s_indent, isum * 100.0 / REG_BR_PROB_BASE);
467 }
46f1f3c1 468 }
878f99d2 469 }
357067f2 470 if (bb != ENTRY_BLOCK_PTR_FOR_FN (fun))
878f99d2 471 {
e7a74006 472 profile_count sum = profile_count::zero ();
628f6a4e 473 FOR_EACH_EDGE (e, ei, bb->preds)
e7a74006
JH
474 sum += e->count ();
475 if (sum.differs_from_p (bb->count))
476 {
477 fprintf (file, ";; %sInvalid sum of incoming counts ",
478 s_indent);
d6c1d7c4 479 sum.dump (file, fun);
e7a74006 480 fprintf (file, ", should be ");
d6c1d7c4 481 bb->count.dump (file, fun);
e7a74006
JH
482 fprintf (file, "\n");
483 }
878f99d2 484 }
600b5b1d
TJ
485 if (BB_PARTITION (bb) == BB_COLD_PARTITION)
486 {
487 /* Warn about inconsistencies in the partitioning that are
488 currently caused by profile insanities created via optimization. */
489 if (!probably_never_executed_bb_p (fun, bb))
9d9573d5
ML
490 fprintf (file, ";; %sBlock in cold partition with hot count\n",
491 s_indent);
600b5b1d
TJ
492 FOR_EACH_EDGE (e, ei, bb->preds)
493 {
494 if (!probably_never_executed_edge_p (fun, e))
495 fprintf (file,
9d9573d5
ML
496 ";; %sBlock in cold partition with incoming hot edge\n",
497 s_indent);
600b5b1d
TJ
498 }
499 }
878f99d2
JH
500}
501\f
402209ff 502void
1a817418 503dump_edge_info (FILE *file, edge e, dump_flags_t flags, int do_succ)
402209ff 504{
ca6c03ca 505 basic_block side = (do_succ ? e->dest : e->src);
a315c44c
SB
506 bool do_details = false;
507
508 if ((flags & TDF_DETAILS) != 0
509 && (flags & TDF_SLIM) == 0)
510 do_details = true;
511
532aafad 512 if (side->index == ENTRY_BLOCK)
ca6c03ca 513 fputs (" ENTRY", file);
532aafad 514 else if (side->index == EXIT_BLOCK)
ca6c03ca
JH
515 fputs (" EXIT", file);
516 else
0b17ab2f 517 fprintf (file, " %d", side->index);
ca6c03ca 518
357067f2
JH
519 if (e->probability.initialized_p () && do_details)
520 {
521 fprintf (file, " [");
522 e->probability.dump (file);
523 fprintf (file, "] ");
524 }
402209ff 525
ef30ab83 526 if (e->count ().initialized_p () && do_details)
402209ff 527 {
edb30094 528 fputs (" count:", file);
d6c1d7c4 529 e->count ().dump (file, cfun);
402209ff
JH
530 }
531
a315c44c 532 if (e->flags && do_details)
402209ff 533 {
a315c44c
SB
534 static const char * const bitnames[] =
535 {
536#define DEF_EDGE_FLAG(NAME,IDX) #NAME ,
537#include "cfg-flags.def"
538 NULL
539#undef DEF_EDGE_FLAG
540 };
541 bool comma = false;
ca6c03ca 542 int i, flags = e->flags;
402209ff 543
a315c44c 544 gcc_assert (e->flags <= EDGE_ALL_FLAGS);
4891442b 545 fputs (" (", file);
402209ff
JH
546 for (i = 0; flags; i++)
547 if (flags & (1 << i))
548 {
549 flags &= ~(1 << i);
550
551 if (comma)
552 fputc (',', file);
a315c44c
SB
553 fputs (bitnames[i], file);
554 comma = true;
402209ff 555 }
4891442b 556
402209ff
JH
557 fputc (')', file);
558 }
58394373
JJ
559
560 if (do_details && LOCATION_LOCUS (e->goto_locus) > BUILTINS_LOCATION)
561 fprintf (file, " %s:%d:%d", LOCATION_FILE (e->goto_locus),
562 LOCATION_LINE (e->goto_locus), LOCATION_COLUMN (e->goto_locus));
402209ff 563}
7b3b6ae4
LC
564
565DEBUG_FUNCTION void
566debug (edge_def &ref)
567{
6eb3cadb
ML
568 fprintf (stderr, "<edge (%d -> %d)>\n",
569 ref.src->index, ref.dest->index);
570 dump_edge_info (stderr, &ref, TDF_DETAILS, false);
571 fprintf (stderr, "\n");
7b3b6ae4
LC
572}
573
574DEBUG_FUNCTION void
575debug (edge_def *ptr)
576{
577 if (ptr)
578 debug (*ptr);
579 else
580 fprintf (stderr, "<nil>\n");
581}
19a30b71
AH
582
583static void
584debug_slim (edge e)
585{
586 fprintf (stderr, "<edge 0x%p (%d -> %d)>", (void *) e,
587 e->src->index, e->dest->index);
588}
589
590DEFINE_DEBUG_VEC (edge)
591DEFINE_DEBUG_HASH_SET (edge)
402209ff 592\f
ff7cc307 593/* Simple routines to easily allocate AUX fields of basic blocks. */
4891442b 594
ca6c03ca
JH
595static struct obstack block_aux_obstack;
596static void *first_block_aux_obj = 0;
597static struct obstack edge_aux_obstack;
598static void *first_edge_aux_obj = 0;
402209ff 599
09da1532 600/* Allocate a memory block of SIZE as BB->aux. The obstack must
ca6c03ca 601 be first initialized by alloc_aux_for_blocks. */
402209ff 602
a398224a 603static void
d329e058 604alloc_aux_for_block (basic_block bb, int size)
402209ff 605{
ca6c03ca 606 /* Verify that aux field is clear. */
341c100f 607 gcc_assert (!bb->aux && first_block_aux_obj);
ca6c03ca
JH
608 bb->aux = obstack_alloc (&block_aux_obstack, size);
609 memset (bb->aux, 0, size);
402209ff
JH
610}
611
ca6c03ca
JH
612/* Initialize the block_aux_obstack and if SIZE is nonzero, call
613 alloc_aux_for_block for each basic block. */
402209ff
JH
614
615void
d329e058 616alloc_aux_for_blocks (int size)
402209ff 617{
ca6c03ca 618 static int initialized;
402209ff 619
ca6c03ca 620 if (!initialized)
402209ff 621 {
ca6c03ca
JH
622 gcc_obstack_init (&block_aux_obstack);
623 initialized = 1;
402209ff 624 }
341c100f
NS
625 else
626 /* Check whether AUX data are still allocated. */
627 gcc_assert (!first_block_aux_obj);
c22cacf3 628
703ad42b 629 first_block_aux_obj = obstack_alloc (&block_aux_obstack, 0);
ca6c03ca 630 if (size)
402209ff 631 {
e0082a72 632 basic_block bb;
4891442b 633
04a90bec 634 FOR_ALL_BB_FN (bb, cfun)
e0082a72 635 alloc_aux_for_block (bb, size);
402209ff
JH
636 }
637}
ca6c03ca 638
108c1afc 639/* Clear AUX pointers of all blocks. */
402209ff
JH
640
641void
d329e058 642clear_aux_for_blocks (void)
402209ff 643{
e0082a72 644 basic_block bb;
4891442b 645
04a90bec 646 FOR_ALL_BB_FN (bb, cfun)
e0082a72 647 bb->aux = NULL;
108c1afc
RH
648}
649
650/* Free data allocated in block_aux_obstack and clear AUX pointers
651 of all blocks. */
652
653void
d329e058 654free_aux_for_blocks (void)
108c1afc 655{
341c100f 656 gcc_assert (first_block_aux_obj);
108c1afc 657 obstack_free (&block_aux_obstack, first_block_aux_obj);
ca6c03ca 658 first_block_aux_obj = NULL;
108c1afc
RH
659
660 clear_aux_for_blocks ();
ca6c03ca 661}
402209ff 662
039496da 663/* Allocate a memory edge of SIZE as E->aux. The obstack must
ca6c03ca 664 be first initialized by alloc_aux_for_edges. */
402209ff 665
039496da 666void
d329e058 667alloc_aux_for_edge (edge e, int size)
ca6c03ca
JH
668{
669 /* Verify that aux field is clear. */
341c100f 670 gcc_assert (!e->aux && first_edge_aux_obj);
ca6c03ca
JH
671 e->aux = obstack_alloc (&edge_aux_obstack, size);
672 memset (e->aux, 0, size);
673}
402209ff 674
ca6c03ca
JH
675/* Initialize the edge_aux_obstack and if SIZE is nonzero, call
676 alloc_aux_for_edge for each basic edge. */
402209ff 677
ca6c03ca 678void
d329e058 679alloc_aux_for_edges (int size)
ca6c03ca
JH
680{
681 static int initialized;
402209ff 682
ca6c03ca
JH
683 if (!initialized)
684 {
685 gcc_obstack_init (&edge_aux_obstack);
686 initialized = 1;
402209ff 687 }
341c100f
NS
688 else
689 /* Check whether AUX data are still allocated. */
690 gcc_assert (!first_edge_aux_obj);
4891442b 691
703ad42b 692 first_edge_aux_obj = obstack_alloc (&edge_aux_obstack, 0);
ca6c03ca 693 if (size)
402209ff 694 {
e0082a72
ZD
695 basic_block bb;
696
fefa31b5
DM
697 FOR_BB_BETWEEN (bb, ENTRY_BLOCK_PTR_FOR_FN (cfun),
698 EXIT_BLOCK_PTR_FOR_FN (cfun), next_bb)
402209ff 699 {
ca6c03ca 700 edge e;
628f6a4e 701 edge_iterator ei;
ca6c03ca 702
628f6a4e 703 FOR_EACH_EDGE (e, ei, bb->succs)
ca6c03ca 704 alloc_aux_for_edge (e, size);
402209ff 705 }
402209ff 706 }
402209ff 707}
402209ff 708
108c1afc 709/* Clear AUX pointers of all edges. */
ca6c03ca
JH
710
711void
d329e058 712clear_aux_for_edges (void)
402209ff 713{
e0082a72
ZD
714 basic_block bb;
715 edge e;
402209ff 716
fefa31b5
DM
717 FOR_BB_BETWEEN (bb, ENTRY_BLOCK_PTR_FOR_FN (cfun),
718 EXIT_BLOCK_PTR_FOR_FN (cfun), next_bb)
402209ff 719 {
628f6a4e
BE
720 edge_iterator ei;
721 FOR_EACH_EDGE (e, ei, bb->succs)
ca6c03ca 722 e->aux = NULL;
402209ff 723 }
108c1afc
RH
724}
725
726/* Free data allocated in edge_aux_obstack and clear AUX pointers
727 of all edges. */
728
729void
d329e058 730free_aux_for_edges (void)
108c1afc 731{
341c100f 732 gcc_assert (first_edge_aux_obj);
108c1afc 733 obstack_free (&edge_aux_obstack, first_edge_aux_obj);
ca6c03ca 734 first_edge_aux_obj = NULL;
108c1afc
RH
735
736 clear_aux_for_edges ();
402209ff 737}
9ee634e3 738
24e47c76 739DEBUG_FUNCTION void
d329e058 740debug_bb (basic_block bb)
10e9fecc 741{
a7d153ab 742 debug_bb (bb, dump_flags);
10e9fecc
JH
743}
744
24e47c76 745DEBUG_FUNCTION basic_block
d329e058 746debug_bb_n (int n)
10e9fecc 747{
06e28de2 748 basic_block bb = BASIC_BLOCK_FOR_FN (cfun, n);
a315c44c 749 debug_bb (bb);
10e9fecc 750 return bb;
9ee634e3 751}
6de9cd9a 752
a7d153ab
XL
753/* Print BB with specified FLAGS. */
754
755DEBUG_FUNCTION void
756debug_bb (basic_block bb, dump_flags_t flags)
757{
758 dump_bb (stderr, bb, 0, flags);
759}
760
761/* Print basic block numbered N with specified FLAGS. */
762
763DEBUG_FUNCTION basic_block
764debug_bb_n (int n, dump_flags_t flags)
765{
766 basic_block bb = BASIC_BLOCK_FOR_FN (cfun, n);
767 debug_bb (bb, flags);
768 return bb;
769}
770
a315c44c
SB
771/* Dumps cfg related information about basic block BB to OUTF.
772 If HEADER is true, dump things that appear before the instructions
773 contained in BB. If FOOTER is true, dump things that appear after.
774 Flags are the TDF_* masks as documented in dumpfile.h.
775 NB: With TDF_DETAILS, it is assumed that cfun is available, so
776 that maybe_hot_bb_p and probably_never_executed_bb_p don't ICE. */
6de9cd9a 777
a315c44c 778void
1a817418 779dump_bb_info (FILE *outf, basic_block bb, int indent, dump_flags_t flags,
a315c44c 780 bool do_header, bool do_footer)
6de9cd9a 781{
628f6a4e 782 edge_iterator ei;
a315c44c 783 edge e;
6de9cd9a
DN
784 static const char * const bb_bitnames[] =
785 {
a315c44c
SB
786#define DEF_BASIC_BLOCK_FLAG(NAME,IDX) #NAME ,
787#include "cfg-flags.def"
788 NULL
789#undef DEF_BASIC_BLOCK_FLAG
6de9cd9a 790 };
ca32b29e 791 const unsigned n_bitnames = ARRAY_SIZE (bb_bitnames);
c4669594 792 bool first;
a315c44c
SB
793 char *s_indent = (char *) alloca ((size_t) indent + 1);
794 memset ((void *) s_indent, ' ', (size_t) indent);
795 s_indent[indent] = '\0';
6de9cd9a 796
a315c44c
SB
797 gcc_assert (bb->flags <= BB_ALL_FLAGS);
798
799 if (do_header)
800 {
801 unsigned i;
802
9d9573d5 803 fputs (";; ", outf);
c4669594 804 fprintf (outf, "%sbasic block %d, loop depth %d",
391886c8 805 s_indent, bb->index, bb_loop_depth (bb));
a315c44c
SB
806 if (flags & TDF_DETAILS)
807 {
2eb712b4 808 struct function *fun = DECL_STRUCT_FUNCTION (current_function_decl);
3995f3a2
JH
809 if (bb->count.initialized_p ())
810 {
811 fputs (", count ", outf);
d6c1d7c4 812 bb->count.dump (outf, cfun);
3995f3a2 813 }
2eb712b4 814 if (maybe_hot_bb_p (fun, bb))
a315c44c 815 fputs (", maybe hot", outf);
2eb712b4 816 if (probably_never_executed_bb_p (fun, bb))
a315c44c
SB
817 fputs (", probably never executed", outf);
818 }
819 fputc ('\n', outf);
820
821 if (flags & TDF_DETAILS)
822 {
9d9573d5
ML
823 check_bb_profile (bb, outf, indent);
824 fputs (";; ", outf);
a315c44c
SB
825 fprintf (outf, "%s prev block ", s_indent);
826 if (bb->prev_bb)
827 fprintf (outf, "%d", bb->prev_bb->index);
828 else
829 fprintf (outf, "(nil)");
830 fprintf (outf, ", next block ");
831 if (bb->next_bb)
832 fprintf (outf, "%d", bb->next_bb->index);
833 else
834 fprintf (outf, "(nil)");
835
836 fputs (", flags:", outf);
c4669594 837 first = true;
a315c44c
SB
838 for (i = 0; i < n_bitnames; i++)
839 if (bb->flags & (1 << i))
840 {
841 if (first)
842 fputs (" (", outf);
843 else
844 fputs (", ", outf);
845 first = false;
846 fputs (bb_bitnames[i], outf);
847 }
848 if (!first)
849 fputc (')', outf);
c4669594 850 fputc ('\n', outf);
a315c44c 851 }
a315c44c 852
9d9573d5 853 fputs (";; ", outf);
a315c44c 854 fprintf (outf, "%s pred: ", s_indent);
c4669594 855 first = true;
a315c44c 856 FOR_EACH_EDGE (e, ei, bb->preds)
c4669594
SB
857 {
858 if (! first)
859 {
9d9573d5 860 fputs (";; ", outf);
c4669594
SB
861 fprintf (outf, "%s ", s_indent);
862 }
863 first = false;
864 dump_edge_info (outf, e, flags, 0);
865 fputc ('\n', outf);
866 }
1dd5907e
SB
867 if (first)
868 fputc ('\n', outf);
a315c44c
SB
869 }
870
871 if (do_footer)
872 {
9d9573d5 873 fputs (";; ", outf);
a315c44c 874 fprintf (outf, "%s succ: ", s_indent);
c4669594 875 first = true;
a315c44c 876 FOR_EACH_EDGE (e, ei, bb->succs)
c4669594
SB
877 {
878 if (! first)
879 {
9d9573d5 880 fputs (";; ", outf);
c4669594
SB
881 fprintf (outf, "%s ", s_indent);
882 }
883 first = false;
884 dump_edge_info (outf, e, flags, 1);
885 fputc ('\n', outf);
886 }
1dd5907e
SB
887 if (first)
888 fputc ('\n', outf);
a315c44c 889 }
6de9cd9a
DN
890}
891
892/* Dumps a brief description of cfg to FILE. */
893
894void
1a817418 895brief_dump_cfg (FILE *file, dump_flags_t flags)
6de9cd9a
DN
896{
897 basic_block bb;
898
11cd3bed 899 FOR_EACH_BB_FN (bb, cfun)
6de9cd9a 900 {
9d9573d5 901 dump_bb_info (file, bb, 0, flags & TDF_DETAILS, true, true);
6de9cd9a
DN
902 }
903}
15db5571 904
2e406f07
JH
905/* Set probability of E to NEW_PROB and rescale other edges
906 from E->src so their sum remains the same. */
907
908void
909set_edge_probability_and_rescale_others (edge e, profile_probability new_prob)
910{
911 edge e2;
912 edge_iterator ei;
913 if (e->probability == new_prob)
914 return;
915 /* If we made E unconditional, drop other frequencies to 0. */
916 if (new_prob == profile_probability::always ())
917 {
918 FOR_EACH_EDGE (e2, ei, e->src->succs)
919 if (e2 != e)
920 e2->probability = profile_probability::never ();
921 }
922 else
923 {
924 int n = 0;
925 edge other_e = NULL;
926
927 /* See how many other edges are leaving exit_edge->src. */
928 FOR_EACH_EDGE (e2, ei, e->src->succs)
929 if (e2 != e && !(e2->flags & EDGE_FAKE))
930 {
931 other_e = e2;
932 n++;
933 }
934 /* If there is only one other edge with non-zero probability we do not
935 need to scale which drops quality of profile from precise
936 to adjusted. */
937 if (n == 1)
938 other_e->probability = new_prob.invert ();
939 /* Nothing to do if there are no other edges. */
940 else if (!n)
941 ;
942 /* Do scaling if possible. */
943 else if (e->probability.invert ().nonzero_p ())
944 {
945 profile_probability num = new_prob.invert (),
946 den = e->probability.invert ();
947 FOR_EACH_EDGE (e2, ei, e->src->succs)
948 if (e2 != e && !(e2->flags & EDGE_FAKE))
949 e2->probability = e2->probability.apply_scale (num, den);
950 }
951 else
952 {
953 if (dump_file && (dump_flags & TDF_DETAILS))
954 fprintf (dump_file,
955 ";; probability of edge %i->%i set reduced from 1."
956 " The remaining edges are left inconsistent.\n",
957 e->src->index, e->dest->index);
958 FOR_EACH_EDGE (e2, ei, e->src->succs)
959 if (e2 != e && !(e2->flags & EDGE_FAKE))
960 e2->probability = new_prob.invert ().guessed () / n;
961 }
962 }
963 e->probability = new_prob;
964}
965
e7a74006 966/* An edge originally destinating BB of COUNT has been proved to
15db5571 967 leave the block by TAKEN_EDGE. Update profile of BB such that edge E can be
c22cacf3 968 redirected to destination of TAKEN_EDGE.
15db5571
JH
969
970 This function may leave the profile inconsistent in the case TAKEN_EDGE
e7a74006 971 frequency or count is believed to be lower than COUNT
d4a9b3a3 972 respectively. */
15db5571 973void
e7a74006 974update_bb_profile_for_threading (basic_block bb,
3995f3a2 975 profile_count count, edge taken_edge)
15db5571 976{
2e406f07
JH
977 gcc_assert (bb == taken_edge->src);
978
979 /* If there is no profile or the threaded path is never executed
980 we don't need to upate. */
981 if (!bb->count.initialized_p ()
982 || count == profile_count::zero ())
983 return;
15db5571 984
3995f3a2 985 if (bb->count < count)
2b151cb2
JH
986 {
987 if (dump_file)
988 fprintf (dump_file, "bb %i count became negative after threading",
989 bb->index);
2e406f07
JH
990 /* If probabilities looks very off, scale down and reduce to guesses
991 to avoid dropping the other path close to zero. */
992 if (bb->count < count.apply_scale (7, 8))
993 count = bb->count.apply_scale (1, 2).guessed ();
2b151cb2 994 }
15db5571 995
2e406f07
JH
996 /* If bb->count will become zero, the probabilities on the original path
997 are not really known, but it is probably better to keep original ones
998 then try to invent something new. */
999 if (!(bb->count <= count))
15db5571 1000 {
2e406f07
JH
1001 profile_probability prob;
1002 /* Compute the probability of TAKEN_EDGE being reached via threaded edge.
1003 Watch for overflows. */
1004 if (bb->count.nonzero_p ())
1005 prob = count.probability_in (bb->count);
1006 else
1007 prob = taken_edge->probability.apply_scale (1, 2).guessed ();
1008 if (prob > taken_edge->probability)
357067f2 1009 {
2e406f07
JH
1010 if (dump_file)
1011 {
1012 fprintf (dump_file, "Jump threading proved that the probability "
1013 "of edge %i->%i was originally estimated too small. "
1014 "(it is ",
1015 taken_edge->src->index, taken_edge->dest->index);
1016 taken_edge->probability.dump (dump_file);
1017 fprintf (dump_file, " should be ");
1018 prob.dump (dump_file);
1019 fprintf (dump_file, ")\n");
1020 }
1021 prob = taken_edge->probability.apply_scale (6, 8).guessed ();
357067f2 1022 }
2e406f07
JH
1023 set_edge_probability_and_rescale_others (taken_edge,
1024 (taken_edge->probability - prob)
1025 / prob.invert ());
15db5571 1026 }
02460c0b 1027 bb->count -= count;
15db5571 1028}
33156717 1029
3995f3a2
JH
1030/* Multiply all frequencies of basic blocks in array BBS of length NBBS
1031 by NUM/DEN, in profile_count arithmetic. More accurate than previous
1032 function but considerably slower. */
1033void
1034scale_bbs_frequencies_profile_count (basic_block *bbs, int nbbs,
1035 profile_count num, profile_count den)
1036{
1037 int i;
e7a74006
JH
1038 if (num == profile_count::zero () || den.nonzero_p ())
1039 for (i = 0; i < nbbs; i++)
3995f3a2 1040 bbs[i]->count = bbs[i]->count.apply_scale (num, den);
3995f3a2
JH
1041}
1042
af2bbc51
JH
1043/* Multiply all frequencies of basic blocks in array BBS of length NBBS
1044 by NUM/DEN, in profile_count arithmetic. More accurate than previous
1045 function but considerably slower. */
1046void
1047scale_bbs_frequencies (basic_block *bbs, int nbbs,
1048 profile_probability p)
1049{
1050 int i;
af2bbc51
JH
1051
1052 for (i = 0; i < nbbs; i++)
e7a74006 1053 bbs[i]->count = bbs[i]->count.apply_probability (p);
af2bbc51
JH
1054}
1055
703c8606
LC
1056/* Data structures used to maintain mapping between basic blocks and
1057 copies. */
028a4074
RB
1058typedef hash_map<int_hash<int, -1, -2>, int> copy_map_t;
1059static copy_map_t *bb_original;
1060static copy_map_t *bb_copy;
703c8606
LC
1061
1062/* And between loops and copies. */
028a4074 1063static copy_map_t *loop_copy;
703c8606 1064
f341de7b
KH
1065/* Initialize the data structures to maintain mapping between blocks
1066 and its copies. */
6580ee77
JH
1067void
1068initialize_original_copy_tables (void)
1069{
028a4074
RB
1070 bb_original = new copy_map_t (10);
1071 bb_copy = new copy_map_t (10);
1072 loop_copy = new copy_map_t (10);
6580ee77
JH
1073}
1074
d96004b8
BC
1075/* Reset the data structures to maintain mapping between blocks and
1076 its copies. */
1077
1078void
1079reset_original_copy_tables (void)
1080{
d96004b8
BC
1081 bb_original->empty ();
1082 bb_copy->empty ();
1083 loop_copy->empty ();
1084}
1085
f341de7b
KH
1086/* Free the data structures to maintain mapping between blocks and
1087 its copies. */
6580ee77
JH
1088void
1089free_original_copy_tables (void)
1090{
c203e8a7
TS
1091 delete bb_copy;
1092 bb_copy = NULL;
1093 delete bb_original;
af711c23 1094 bb_original = NULL;
c203e8a7
TS
1095 delete loop_copy;
1096 loop_copy = NULL;
6580ee77
JH
1097}
1098
c2e84327
DM
1099/* Return true iff we have had a call to initialize_original_copy_tables
1100 without a corresponding call to free_original_copy_tables. */
1101
1102bool
1103original_copy_tables_initialized_p (void)
1104{
028a4074 1105 return bb_copy != NULL;
c2e84327
DM
1106}
1107
561e8a90
ZD
1108/* Removes the value associated with OBJ from table TAB. */
1109
1110static void
028a4074 1111copy_original_table_clear (copy_map_t *tab, unsigned obj)
561e8a90 1112{
028a4074 1113 if (!original_copy_tables_initialized_p ())
561e8a90
ZD
1114 return;
1115
028a4074 1116 tab->remove (obj);
561e8a90
ZD
1117}
1118
1119/* Sets the value associated with OBJ in table TAB to VAL.
1120 Do nothing when data structures are not initialized. */
1121
1122static void
028a4074 1123copy_original_table_set (copy_map_t *tab,
703c8606 1124 unsigned obj, unsigned val)
561e8a90 1125{
028a4074 1126 if (!original_copy_tables_initialized_p ())
561e8a90
ZD
1127 return;
1128
028a4074 1129 tab->put (obj, val);
561e8a90
ZD
1130}
1131
f341de7b
KH
1132/* Set original for basic block. Do nothing when data structures are not
1133 initialized so passes not needing this don't need to care. */
6580ee77
JH
1134void
1135set_bb_original (basic_block bb, basic_block original)
1136{
561e8a90 1137 copy_original_table_set (bb_original, bb->index, original->index);
6580ee77
JH
1138}
1139
1140/* Get the original basic block. */
1141basic_block
1142get_bb_original (basic_block bb)
1143{
028a4074 1144 gcc_assert (original_copy_tables_initialized_p ());
6580ee77 1145
028a4074 1146 int *entry = bb_original->get (bb->index);
6580ee77 1147 if (entry)
028a4074 1148 return BASIC_BLOCK_FOR_FN (cfun, *entry);
6580ee77
JH
1149 else
1150 return NULL;
1151}
1152
f341de7b
KH
1153/* Set copy for basic block. Do nothing when data structures are not
1154 initialized so passes not needing this don't need to care. */
6580ee77
JH
1155void
1156set_bb_copy (basic_block bb, basic_block copy)
1157{
561e8a90 1158 copy_original_table_set (bb_copy, bb->index, copy->index);
6580ee77
JH
1159}
1160
1161/* Get the copy of basic block. */
1162basic_block
1163get_bb_copy (basic_block bb)
1164{
028a4074 1165 gcc_assert (original_copy_tables_initialized_p ());
6580ee77 1166
028a4074 1167 int *entry = bb_copy->get (bb->index);
6580ee77 1168 if (entry)
028a4074 1169 return BASIC_BLOCK_FOR_FN (cfun, *entry);
6580ee77
JH
1170 else
1171 return NULL;
1172}
561e8a90
ZD
1173
1174/* Set copy for LOOP to COPY. Do nothing when data structures are not
1175 initialized so passes not needing this don't need to care. */
1176
1177void
99b1c316 1178set_loop_copy (class loop *loop, class loop *copy)
561e8a90
ZD
1179{
1180 if (!copy)
1181 copy_original_table_clear (loop_copy, loop->num);
1182 else
1183 copy_original_table_set (loop_copy, loop->num, copy->num);
1184}
1185
1186/* Get the copy of LOOP. */
1187
99b1c316
MS
1188class loop *
1189get_loop_copy (class loop *loop)
561e8a90 1190{
028a4074 1191 gcc_assert (original_copy_tables_initialized_p ());
561e8a90 1192
028a4074 1193 int *entry = loop_copy->get (loop->num);
561e8a90 1194 if (entry)
028a4074 1195 return get_loop (cfun, *entry);
561e8a90
ZD
1196 else
1197 return NULL;
1198}
2e93b92c
JH
1199
1200/* Scales the frequencies of all basic blocks that are strictly
1201 dominated by BB by NUM/DEN. */
1202
1203void
1204scale_strictly_dominated_blocks (basic_block bb,
1205 profile_count num, profile_count den)
1206{
1207 basic_block son;
1208
1209 if (!den.nonzero_p () && !(num == profile_count::zero ()))
1210 return;
1211 auto_vec <basic_block, 8> worklist;
1212 worklist.safe_push (bb);
1213
1214 while (!worklist.is_empty ())
1215 for (son = first_dom_son (CDI_DOMINATORS, worklist.pop ());
1216 son;
1217 son = next_dom_son (CDI_DOMINATORS, son))
1218 {
1219 son->count = son->count.apply_scale (num, den);
1220 worklist.safe_push (son);
1221 }
1222}