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