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