]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/cfg.c
gcc: arm: linux-eabi: fix handling of armv4 bx fixups when linking
[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 ();
9defb1fe
DN
72 n_edges_for_function (the_fun) = 0;
73 ENTRY_BLOCK_PTR_FOR_FUNCTION (the_fun)
a9429e29 74 = ggc_alloc_cleared_basic_block_def ();
9defb1fe
DN
75 ENTRY_BLOCK_PTR_FOR_FUNCTION (the_fun)->index = ENTRY_BLOCK;
76 EXIT_BLOCK_PTR_FOR_FUNCTION (the_fun)
a9429e29 77 = ggc_alloc_cleared_basic_block_def ();
9defb1fe 78 EXIT_BLOCK_PTR_FOR_FUNCTION (the_fun)->index = EXIT_BLOCK;
b8698a0f 79 ENTRY_BLOCK_PTR_FOR_FUNCTION (the_fun)->next_bb
9defb1fe 80 = EXIT_BLOCK_PTR_FOR_FUNCTION (the_fun);
b8698a0f 81 EXIT_BLOCK_PTR_FOR_FUNCTION (the_fun)->prev_bb
9defb1fe 82 = ENTRY_BLOCK_PTR_FOR_FUNCTION (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
JH
90{
91 n_edges--;
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
628f6a4e
BE
112 FOR_EACH_EDGE (e, ei, ENTRY_BLOCK_PTR->succs)
113 free_edge (e);
9771b263
DN
114 vec_safe_truncate (EXIT_BLOCK_PTR->preds, 0);
115 vec_safe_truncate (ENTRY_BLOCK_PTR->succs, 0);
402209ff 116
341c100f 117 gcc_assert (!n_edges);
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
68f9b844
KH
156 SET_BASIC_BLOCK (ENTRY_BLOCK, ENTRY_BLOCK_PTR);
157 SET_BASIC_BLOCK (EXIT_BLOCK, EXIT_BLOCK_PTR);
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 }
172 gcc_assert (i == n_basic_blocks);
6de9cd9a 173
6fb5fa3c
DB
174 for (; i < last_basic_block; i++)
175 SET_BASIC_BLOCK (i, NULL);
176 }
bf77398c
ZD
177 last_basic_block = n_basic_blocks;
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);
bf77398c 187 n_basic_blocks--;
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 ();
e0fd3e7a
MM
265 n_edges++;
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
KH
284 if (edge_cache == NULL
285 || src == ENTRY_BLOCK_PTR
286 || dst == EXIT_BLOCK_PTR)
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
390 FOR_BB_BETWEEN (bb, ENTRY_BLOCK_PTR, 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
2eb712b4 414 if (bb != EXIT_BLOCK_PTR_FOR_FUNCTION (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 }
2eb712b4 431 if (bb != ENTRY_BLOCK_PTR_FOR_FUNCTION (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 }
449}
450\f
402209ff 451void
a315c44c 452dump_edge_info (FILE *file, edge e, int flags, int do_succ)
402209ff 453{
ca6c03ca 454 basic_block side = (do_succ ? e->dest : e->src);
a315c44c
SB
455 bool do_details = false;
456
457 if ((flags & TDF_DETAILS) != 0
458 && (flags & TDF_SLIM) == 0)
459 do_details = true;
460
532aafad
SB
461 /* ENTRY_BLOCK_PTR/EXIT_BLOCK_PTR depend on cfun.
462 Compare against ENTRY_BLOCK/EXIT_BLOCK to avoid that dependency. */
463 if (side->index == ENTRY_BLOCK)
ca6c03ca 464 fputs (" ENTRY", file);
532aafad 465 else if (side->index == EXIT_BLOCK)
ca6c03ca
JH
466 fputs (" EXIT", file);
467 else
0b17ab2f 468 fprintf (file, " %d", side->index);
ca6c03ca 469
a315c44c 470 if (e->probability && do_details)
ca6c03ca 471 fprintf (file, " [%.1f%%] ", e->probability * 100.0 / REG_BR_PROB_BASE);
402209ff 472
a315c44c 473 if (e->count && do_details)
402209ff 474 {
edb30094 475 fputs (" count:", file);
4891442b 476 fprintf (file, HOST_WIDEST_INT_PRINT_DEC, e->count);
402209ff
JH
477 }
478
a315c44c 479 if (e->flags && do_details)
402209ff 480 {
a315c44c
SB
481 static const char * const bitnames[] =
482 {
483#define DEF_EDGE_FLAG(NAME,IDX) #NAME ,
484#include "cfg-flags.def"
485 NULL
486#undef DEF_EDGE_FLAG
487 };
488 bool comma = false;
ca6c03ca 489 int i, flags = e->flags;
402209ff 490
a315c44c 491 gcc_assert (e->flags <= EDGE_ALL_FLAGS);
4891442b 492 fputs (" (", file);
402209ff
JH
493 for (i = 0; flags; i++)
494 if (flags & (1 << i))
495 {
496 flags &= ~(1 << i);
497
498 if (comma)
499 fputc (',', file);
a315c44c
SB
500 fputs (bitnames[i], file);
501 comma = true;
402209ff 502 }
4891442b 503
402209ff
JH
504 fputc (')', file);
505 }
506}
7b3b6ae4
LC
507
508DEBUG_FUNCTION void
509debug (edge_def &ref)
510{
511 /* FIXME (crowl): Is this desireable? */
512 dump_edge_info (stderr, &ref, 0, false);
513 dump_edge_info (stderr, &ref, 0, true);
514}
515
516DEBUG_FUNCTION void
517debug (edge_def *ptr)
518{
519 if (ptr)
520 debug (*ptr);
521 else
522 fprintf (stderr, "<nil>\n");
523}
402209ff 524\f
ff7cc307 525/* Simple routines to easily allocate AUX fields of basic blocks. */
4891442b 526
ca6c03ca
JH
527static struct obstack block_aux_obstack;
528static void *first_block_aux_obj = 0;
529static struct obstack edge_aux_obstack;
530static void *first_edge_aux_obj = 0;
402209ff 531
09da1532 532/* Allocate a memory block of SIZE as BB->aux. The obstack must
ca6c03ca 533 be first initialized by alloc_aux_for_blocks. */
402209ff 534
a398224a 535static void
d329e058 536alloc_aux_for_block (basic_block bb, int size)
402209ff 537{
ca6c03ca 538 /* Verify that aux field is clear. */
341c100f 539 gcc_assert (!bb->aux && first_block_aux_obj);
ca6c03ca
JH
540 bb->aux = obstack_alloc (&block_aux_obstack, size);
541 memset (bb->aux, 0, size);
402209ff
JH
542}
543
ca6c03ca
JH
544/* Initialize the block_aux_obstack and if SIZE is nonzero, call
545 alloc_aux_for_block for each basic block. */
402209ff
JH
546
547void
d329e058 548alloc_aux_for_blocks (int size)
402209ff 549{
ca6c03ca 550 static int initialized;
402209ff 551
ca6c03ca 552 if (!initialized)
402209ff 553 {
ca6c03ca
JH
554 gcc_obstack_init (&block_aux_obstack);
555 initialized = 1;
402209ff 556 }
341c100f
NS
557 else
558 /* Check whether AUX data are still allocated. */
559 gcc_assert (!first_block_aux_obj);
c22cacf3 560
703ad42b 561 first_block_aux_obj = obstack_alloc (&block_aux_obstack, 0);
ca6c03ca 562 if (size)
402209ff 563 {
e0082a72 564 basic_block bb;
4891442b 565
a398224a 566 FOR_ALL_BB (bb)
e0082a72 567 alloc_aux_for_block (bb, size);
402209ff
JH
568 }
569}
ca6c03ca 570
108c1afc 571/* Clear AUX pointers of all blocks. */
402209ff
JH
572
573void
d329e058 574clear_aux_for_blocks (void)
402209ff 575{
e0082a72 576 basic_block bb;
4891442b 577
a398224a 578 FOR_ALL_BB (bb)
e0082a72 579 bb->aux = NULL;
108c1afc
RH
580}
581
582/* Free data allocated in block_aux_obstack and clear AUX pointers
583 of all blocks. */
584
585void
d329e058 586free_aux_for_blocks (void)
108c1afc 587{
341c100f 588 gcc_assert (first_block_aux_obj);
108c1afc 589 obstack_free (&block_aux_obstack, first_block_aux_obj);
ca6c03ca 590 first_block_aux_obj = NULL;
108c1afc
RH
591
592 clear_aux_for_blocks ();
ca6c03ca 593}
402209ff 594
039496da 595/* Allocate a memory edge of SIZE as E->aux. The obstack must
ca6c03ca 596 be first initialized by alloc_aux_for_edges. */
402209ff 597
039496da 598void
d329e058 599alloc_aux_for_edge (edge e, int size)
ca6c03ca
JH
600{
601 /* Verify that aux field is clear. */
341c100f 602 gcc_assert (!e->aux && first_edge_aux_obj);
ca6c03ca
JH
603 e->aux = obstack_alloc (&edge_aux_obstack, size);
604 memset (e->aux, 0, size);
605}
402209ff 606
ca6c03ca
JH
607/* Initialize the edge_aux_obstack and if SIZE is nonzero, call
608 alloc_aux_for_edge for each basic edge. */
402209ff 609
ca6c03ca 610void
d329e058 611alloc_aux_for_edges (int size)
ca6c03ca
JH
612{
613 static int initialized;
402209ff 614
ca6c03ca
JH
615 if (!initialized)
616 {
617 gcc_obstack_init (&edge_aux_obstack);
618 initialized = 1;
402209ff 619 }
341c100f
NS
620 else
621 /* Check whether AUX data are still allocated. */
622 gcc_assert (!first_edge_aux_obj);
4891442b 623
703ad42b 624 first_edge_aux_obj = obstack_alloc (&edge_aux_obstack, 0);
ca6c03ca 625 if (size)
402209ff 626 {
e0082a72
ZD
627 basic_block bb;
628
629 FOR_BB_BETWEEN (bb, ENTRY_BLOCK_PTR, EXIT_BLOCK_PTR, next_bb)
402209ff 630 {
ca6c03ca 631 edge e;
628f6a4e 632 edge_iterator ei;
ca6c03ca 633
628f6a4e 634 FOR_EACH_EDGE (e, ei, bb->succs)
ca6c03ca 635 alloc_aux_for_edge (e, size);
402209ff 636 }
402209ff 637 }
402209ff 638}
402209ff 639
108c1afc 640/* Clear AUX pointers of all edges. */
ca6c03ca
JH
641
642void
d329e058 643clear_aux_for_edges (void)
402209ff 644{
e0082a72
ZD
645 basic_block bb;
646 edge e;
402209ff 647
e0082a72 648 FOR_BB_BETWEEN (bb, ENTRY_BLOCK_PTR, EXIT_BLOCK_PTR, next_bb)
402209ff 649 {
628f6a4e
BE
650 edge_iterator ei;
651 FOR_EACH_EDGE (e, ei, bb->succs)
ca6c03ca 652 e->aux = NULL;
402209ff 653 }
108c1afc
RH
654}
655
656/* Free data allocated in edge_aux_obstack and clear AUX pointers
657 of all edges. */
658
659void
d329e058 660free_aux_for_edges (void)
108c1afc 661{
341c100f 662 gcc_assert (first_edge_aux_obj);
108c1afc 663 obstack_free (&edge_aux_obstack, first_edge_aux_obj);
ca6c03ca 664 first_edge_aux_obj = NULL;
108c1afc
RH
665
666 clear_aux_for_edges ();
402209ff 667}
9ee634e3 668
24e47c76 669DEBUG_FUNCTION void
d329e058 670debug_bb (basic_block bb)
10e9fecc 671{
f8923f7e 672 dump_bb (stderr, bb, 0, dump_flags);
10e9fecc
JH
673}
674
24e47c76 675DEBUG_FUNCTION basic_block
d329e058 676debug_bb_n (int n)
10e9fecc
JH
677{
678 basic_block bb = BASIC_BLOCK (n);
a315c44c 679 debug_bb (bb);
10e9fecc 680 return bb;
9ee634e3 681}
6de9cd9a 682
a315c44c
SB
683/* Dumps cfg related information about basic block BB to OUTF.
684 If HEADER is true, dump things that appear before the instructions
685 contained in BB. If FOOTER is true, dump things that appear after.
686 Flags are the TDF_* masks as documented in dumpfile.h.
687 NB: With TDF_DETAILS, it is assumed that cfun is available, so
688 that maybe_hot_bb_p and probably_never_executed_bb_p don't ICE. */
6de9cd9a 689
a315c44c
SB
690void
691dump_bb_info (FILE *outf, basic_block bb, int indent, int flags,
692 bool do_header, bool do_footer)
6de9cd9a 693{
628f6a4e 694 edge_iterator ei;
a315c44c 695 edge e;
6de9cd9a
DN
696 static const char * const bb_bitnames[] =
697 {
a315c44c
SB
698#define DEF_BASIC_BLOCK_FLAG(NAME,IDX) #NAME ,
699#include "cfg-flags.def"
700 NULL
701#undef DEF_BASIC_BLOCK_FLAG
6de9cd9a
DN
702 };
703 const unsigned n_bitnames = sizeof (bb_bitnames) / sizeof (char *);
c4669594 704 bool first;
a315c44c
SB
705 char *s_indent = (char *) alloca ((size_t) indent + 1);
706 memset ((void *) s_indent, ' ', (size_t) indent);
707 s_indent[indent] = '\0';
6de9cd9a 708
a315c44c
SB
709 gcc_assert (bb->flags <= BB_ALL_FLAGS);
710
711 if (do_header)
712 {
713 unsigned i;
714
715 if (flags & TDF_COMMENT)
716 fputs (";; ", outf);
c4669594 717 fprintf (outf, "%sbasic block %d, loop depth %d",
391886c8 718 s_indent, bb->index, bb_loop_depth (bb));
a315c44c
SB
719 if (flags & TDF_DETAILS)
720 {
2eb712b4 721 struct function *fun = DECL_STRUCT_FUNCTION (current_function_decl);
c4669594
SB
722 fprintf (outf, ", count " HOST_WIDEST_INT_PRINT_DEC,
723 (HOST_WIDEST_INT) bb->count);
a315c44c 724 fprintf (outf, ", freq %i", bb->frequency);
2eb712b4 725 if (maybe_hot_bb_p (fun, bb))
a315c44c 726 fputs (", maybe hot", outf);
2eb712b4 727 if (probably_never_executed_bb_p (fun, bb))
a315c44c
SB
728 fputs (", probably never executed", outf);
729 }
730 fputc ('\n', outf);
c4669594
SB
731 if (TDF_DETAILS)
732 check_bb_profile (bb, outf, indent, flags);
a315c44c
SB
733
734 if (flags & TDF_DETAILS)
735 {
a315c44c
SB
736 if (flags & TDF_COMMENT)
737 fputs (";; ", outf);
738 fprintf (outf, "%s prev block ", s_indent);
739 if (bb->prev_bb)
740 fprintf (outf, "%d", bb->prev_bb->index);
741 else
742 fprintf (outf, "(nil)");
743 fprintf (outf, ", next block ");
744 if (bb->next_bb)
745 fprintf (outf, "%d", bb->next_bb->index);
746 else
747 fprintf (outf, "(nil)");
748
749 fputs (", flags:", outf);
c4669594 750 first = true;
a315c44c
SB
751 for (i = 0; i < n_bitnames; i++)
752 if (bb->flags & (1 << i))
753 {
754 if (first)
755 fputs (" (", outf);
756 else
757 fputs (", ", outf);
758 first = false;
759 fputs (bb_bitnames[i], outf);
760 }
761 if (!first)
762 fputc (')', outf);
c4669594 763 fputc ('\n', outf);
a315c44c 764 }
a315c44c
SB
765
766 if (flags & TDF_COMMENT)
767 fputs (";; ", outf);
768 fprintf (outf, "%s pred: ", s_indent);
c4669594 769 first = true;
a315c44c 770 FOR_EACH_EDGE (e, ei, bb->preds)
c4669594
SB
771 {
772 if (! first)
773 {
774 if (flags & TDF_COMMENT)
775 fputs (";; ", outf);
776 fprintf (outf, "%s ", s_indent);
777 }
778 first = false;
779 dump_edge_info (outf, e, flags, 0);
780 fputc ('\n', outf);
781 }
1dd5907e
SB
782 if (first)
783 fputc ('\n', outf);
a315c44c
SB
784 }
785
786 if (do_footer)
787 {
a315c44c
SB
788 if (flags & TDF_COMMENT)
789 fputs (";; ", outf);
790 fprintf (outf, "%s succ: ", s_indent);
c4669594 791 first = true;
a315c44c 792 FOR_EACH_EDGE (e, ei, bb->succs)
c4669594
SB
793 {
794 if (! first)
795 {
796 if (flags & TDF_COMMENT)
797 fputs (";; ", outf);
798 fprintf (outf, "%s ", s_indent);
799 }
800 first = false;
801 dump_edge_info (outf, e, flags, 1);
802 fputc ('\n', outf);
803 }
1dd5907e
SB
804 if (first)
805 fputc ('\n', outf);
a315c44c 806 }
6de9cd9a
DN
807}
808
809/* Dumps a brief description of cfg to FILE. */
810
811void
c4669594 812brief_dump_cfg (FILE *file, int flags)
6de9cd9a
DN
813{
814 basic_block bb;
815
816 FOR_EACH_BB (bb)
817 {
c4669594
SB
818 dump_bb_info (file, bb, 0,
819 flags & (TDF_COMMENT | TDF_DETAILS),
820 true, true);
6de9cd9a
DN
821 }
822}
15db5571
JH
823
824/* An edge originally destinating BB of FREQUENCY and COUNT has been proved to
825 leave the block by TAKEN_EDGE. Update profile of BB such that edge E can be
c22cacf3 826 redirected to destination of TAKEN_EDGE.
15db5571
JH
827
828 This function may leave the profile inconsistent in the case TAKEN_EDGE
829 frequency or count is believed to be lower than FREQUENCY or COUNT
d4a9b3a3 830 respectively. */
15db5571
JH
831void
832update_bb_profile_for_threading (basic_block bb, int edge_frequency,
833 gcov_type count, edge taken_edge)
834{
835 edge c;
836 int prob;
628f6a4e 837 edge_iterator ei;
15db5571
JH
838
839 bb->count -= count;
840 if (bb->count < 0)
2b151cb2
JH
841 {
842 if (dump_file)
843 fprintf (dump_file, "bb %i count became negative after threading",
844 bb->index);
845 bb->count = 0;
846 }
15db5571
JH
847
848 /* Compute the probability of TAKEN_EDGE being reached via threaded edge.
849 Watch for overflows. */
850 if (bb->frequency)
8ddb5a29 851 /* Update to use GCOV_COMPUTE_SCALE. */
15db5571
JH
852 prob = edge_frequency * REG_BR_PROB_BASE / bb->frequency;
853 else
854 prob = 0;
855 if (prob > taken_edge->probability)
856 {
857 if (dump_file)
858 fprintf (dump_file, "Jump threading proved probability of edge "
859 "%i->%i too small (it is %i, should be %i).\n",
860 taken_edge->src->index, taken_edge->dest->index,
861 taken_edge->probability, prob);
862 prob = taken_edge->probability;
863 }
864
865 /* Now rescale the probabilities. */
866 taken_edge->probability -= prob;
867 prob = REG_BR_PROB_BASE - prob;
868 bb->frequency -= edge_frequency;
869 if (bb->frequency < 0)
870 bb->frequency = 0;
871 if (prob <= 0)
872 {
873 if (dump_file)
874 fprintf (dump_file, "Edge frequencies of bb %i has been reset, "
875 "frequency of block should end up being 0, it is %i\n",
876 bb->index, bb->frequency);
628f6a4e
BE
877 EDGE_SUCC (bb, 0)->probability = REG_BR_PROB_BASE;
878 ei = ei_start (bb->succs);
879 ei_next (&ei);
880 for (; (c = ei_safe_edge (ei)); ei_next (&ei))
15db5571
JH
881 c->probability = 0;
882 }
763ea904
JL
883 else if (prob != REG_BR_PROB_BASE)
884 {
09bac500 885 int scale = RDIV (65536 * REG_BR_PROB_BASE, prob);
763ea904
JL
886
887 FOR_EACH_EDGE (c, ei, bb->succs)
84fc24e8 888 {
3bc8ba25
EB
889 /* Protect from overflow due to additional scaling. */
890 if (c->probability > prob)
84fc24e8 891 c->probability = REG_BR_PROB_BASE;
3bc8ba25
EB
892 else
893 {
894 c->probability = RDIV (c->probability * scale, 65536);
895 if (c->probability > REG_BR_PROB_BASE)
896 c->probability = REG_BR_PROB_BASE;
897 }
84fc24e8 898 }
763ea904 899 }
15db5571 900
41806d92 901 gcc_assert (bb == taken_edge->src);
15db5571
JH
902 taken_edge->count -= count;
903 if (taken_edge->count < 0)
2b151cb2
JH
904 {
905 if (dump_file)
906 fprintf (dump_file, "edge %i->%i count became negative after threading",
907 taken_edge->src->index, taken_edge->dest->index);
908 taken_edge->count = 0;
909 }
15db5571 910}
33156717
JH
911
912/* Multiply all frequencies of basic blocks in array BBS of length NBBS
913 by NUM/DEN, in int arithmetic. May lose some accuracy. */
914void
915scale_bbs_frequencies_int (basic_block *bbs, int nbbs, int num, int den)
916{
917 int i;
918 edge e;
84fc24e8
JH
919 if (num < 0)
920 num = 0;
03cb2019
ZD
921
922 /* Scale NUM and DEN to avoid overflows. Frequencies are in order of
923 10^4, if we make DEN <= 10^3, we can afford to upscale by 100
924 and still safely fit in int during calculations. */
925 if (den > 1000)
926 {
927 if (num > 1000000)
928 return;
929
930 num = RDIV (1000 * num, den);
931 den = 1000;
932 }
933 if (num > 100 * den)
84fc24e8 934 return;
03cb2019 935
33156717
JH
936 for (i = 0; i < nbbs; i++)
937 {
938 edge_iterator ei;
09bac500 939 bbs[i]->frequency = RDIV (bbs[i]->frequency * num, den);
03cb2019
ZD
940 /* Make sure the frequencies do not grow over BB_FREQ_MAX. */
941 if (bbs[i]->frequency > BB_FREQ_MAX)
942 bbs[i]->frequency = BB_FREQ_MAX;
33156717
JH
943 bbs[i]->count = RDIV (bbs[i]->count * num, den);
944 FOR_EACH_EDGE (e, ei, bbs[i]->succs)
09bac500 945 e->count = RDIV (e->count * num, den);
33156717
JH
946 }
947}
948
09bac500
JH
949/* numbers smaller than this value are safe to multiply without getting
950 64bit overflow. */
951#define MAX_SAFE_MULTIPLIER (1 << (sizeof (HOST_WIDEST_INT) * 4 - 1))
952
33156717
JH
953/* Multiply all frequencies of basic blocks in array BBS of length NBBS
954 by NUM/DEN, in gcov_type arithmetic. More accurate than previous
955 function but considerably slower. */
956void
c22cacf3
MS
957scale_bbs_frequencies_gcov_type (basic_block *bbs, int nbbs, gcov_type num,
958 gcov_type den)
33156717
JH
959{
960 int i;
961 edge e;
09bac500 962 gcov_type fraction = RDIV (num * 65536, den);
33156717 963
09bac500
JH
964 gcc_assert (fraction >= 0);
965
966 if (num < MAX_SAFE_MULTIPLIER)
967 for (i = 0; i < nbbs; i++)
968 {
969 edge_iterator ei;
970 bbs[i]->frequency = RDIV (bbs[i]->frequency * num, den);
971 if (bbs[i]->count <= MAX_SAFE_MULTIPLIER)
972 bbs[i]->count = RDIV (bbs[i]->count * num, den);
973 else
974 bbs[i]->count = RDIV (bbs[i]->count * fraction, 65536);
975 FOR_EACH_EDGE (e, ei, bbs[i]->succs)
976 if (bbs[i]->count <= MAX_SAFE_MULTIPLIER)
977 e->count = RDIV (e->count * num, den);
978 else
979 e->count = RDIV (e->count * fraction, 65536);
980 }
981 else
982 for (i = 0; i < nbbs; i++)
983 {
984 edge_iterator ei;
985 if (sizeof (gcov_type) > sizeof (int))
986 bbs[i]->frequency = RDIV (bbs[i]->frequency * num, den);
987 else
988 bbs[i]->frequency = RDIV (bbs[i]->frequency * fraction, 65536);
989 bbs[i]->count = RDIV (bbs[i]->count * fraction, 65536);
990 FOR_EACH_EDGE (e, ei, bbs[i]->succs)
991 e->count = RDIV (e->count * fraction, 65536);
992 }
33156717 993}
6580ee77 994
703c8606 995/* Helper types for hash tables. */
6580ee77
JH
996
997struct htab_bb_copy_original_entry
998{
999 /* Block we are attaching info to. */
1000 int index1;
1001 /* Index of original or copy (depending on the hashtable) */
1002 int index2;
1003};
1004
703c8606 1005struct bb_copy_hasher : typed_noop_remove <htab_bb_copy_original_entry>
6580ee77 1006{
5831a5f0
LC
1007 typedef htab_bb_copy_original_entry value_type;
1008 typedef htab_bb_copy_original_entry compare_type;
1009 static inline hashval_t hash (const value_type *);
1010 static inline bool equal (const value_type *existing,
1011 const compare_type * candidate);
703c8606 1012};
6580ee77 1013
703c8606 1014inline hashval_t
5831a5f0 1015bb_copy_hasher::hash (const value_type *data)
703c8606 1016{
6580ee77
JH
1017 return data->index1;
1018}
6580ee77 1019
703c8606 1020inline bool
5831a5f0 1021bb_copy_hasher::equal (const value_type *data, const compare_type *data2)
703c8606 1022{
6580ee77
JH
1023 return data->index1 == data2->index1;
1024}
1025
703c8606
LC
1026/* Data structures used to maintain mapping between basic blocks and
1027 copies. */
1028static hash_table <bb_copy_hasher> bb_original;
1029static hash_table <bb_copy_hasher> bb_copy;
1030
1031/* And between loops and copies. */
1032static hash_table <bb_copy_hasher> loop_copy;
1033static alloc_pool original_copy_bb_pool;
1034
1035
f341de7b
KH
1036/* Initialize the data structures to maintain mapping between blocks
1037 and its copies. */
6580ee77
JH
1038void
1039initialize_original_copy_tables (void)
1040{
1041 gcc_assert (!original_copy_bb_pool);
1042 original_copy_bb_pool
1043 = create_alloc_pool ("original_copy",
1044 sizeof (struct htab_bb_copy_original_entry), 10);
703c8606
LC
1045 bb_original.create (10);
1046 bb_copy.create (10);
1047 loop_copy.create (10);
6580ee77
JH
1048}
1049
f341de7b
KH
1050/* Free the data structures to maintain mapping between blocks and
1051 its copies. */
6580ee77
JH
1052void
1053free_original_copy_tables (void)
1054{
1055 gcc_assert (original_copy_bb_pool);
703c8606
LC
1056 bb_copy.dispose ();
1057 bb_original.dispose ();
1058 loop_copy.dispose ();
6580ee77 1059 free_alloc_pool (original_copy_bb_pool);
6580ee77
JH
1060 original_copy_bb_pool = NULL;
1061}
1062
561e8a90
ZD
1063/* Removes the value associated with OBJ from table TAB. */
1064
1065static void
703c8606 1066copy_original_table_clear (hash_table <bb_copy_hasher> tab, unsigned obj)
561e8a90 1067{
703c8606 1068 htab_bb_copy_original_entry **slot;
561e8a90
ZD
1069 struct htab_bb_copy_original_entry key, *elt;
1070
1071 if (!original_copy_bb_pool)
1072 return;
1073
1074 key.index1 = obj;
703c8606 1075 slot = tab.find_slot (&key, NO_INSERT);
561e8a90
ZD
1076 if (!slot)
1077 return;
1078
703c8606
LC
1079 elt = *slot;
1080 tab.clear_slot (slot);
561e8a90
ZD
1081 pool_free (original_copy_bb_pool, elt);
1082}
1083
1084/* Sets the value associated with OBJ in table TAB to VAL.
1085 Do nothing when data structures are not initialized. */
1086
1087static void
703c8606
LC
1088copy_original_table_set (hash_table <bb_copy_hasher> tab,
1089 unsigned obj, unsigned val)
561e8a90
ZD
1090{
1091 struct htab_bb_copy_original_entry **slot;
1092 struct htab_bb_copy_original_entry key;
1093
1094 if (!original_copy_bb_pool)
1095 return;
1096
1097 key.index1 = obj;
703c8606 1098 slot = tab.find_slot (&key, INSERT);
561e8a90
ZD
1099 if (!*slot)
1100 {
ae50c0cb
TN
1101 *slot = (struct htab_bb_copy_original_entry *)
1102 pool_alloc (original_copy_bb_pool);
561e8a90
ZD
1103 (*slot)->index1 = obj;
1104 }
1105 (*slot)->index2 = val;
1106}
1107
f341de7b
KH
1108/* Set original for basic block. Do nothing when data structures are not
1109 initialized so passes not needing this don't need to care. */
6580ee77
JH
1110void
1111set_bb_original (basic_block bb, basic_block original)
1112{
561e8a90 1113 copy_original_table_set (bb_original, bb->index, original->index);
6580ee77
JH
1114}
1115
1116/* Get the original basic block. */
1117basic_block
1118get_bb_original (basic_block bb)
1119{
1120 struct htab_bb_copy_original_entry *entry;
1121 struct htab_bb_copy_original_entry key;
1122
1123 gcc_assert (original_copy_bb_pool);
1124
1125 key.index1 = bb->index;
703c8606 1126 entry = bb_original.find (&key);
6580ee77
JH
1127 if (entry)
1128 return BASIC_BLOCK (entry->index2);
1129 else
1130 return NULL;
1131}
1132
f341de7b
KH
1133/* Set copy for basic block. Do nothing when data structures are not
1134 initialized so passes not needing this don't need to care. */
6580ee77
JH
1135void
1136set_bb_copy (basic_block bb, basic_block copy)
1137{
561e8a90 1138 copy_original_table_set (bb_copy, bb->index, copy->index);
6580ee77
JH
1139}
1140
1141/* Get the copy of basic block. */
1142basic_block
1143get_bb_copy (basic_block bb)
1144{
1145 struct htab_bb_copy_original_entry *entry;
1146 struct htab_bb_copy_original_entry key;
1147
1148 gcc_assert (original_copy_bb_pool);
1149
1150 key.index1 = bb->index;
703c8606 1151 entry = bb_copy.find (&key);
6580ee77
JH
1152 if (entry)
1153 return BASIC_BLOCK (entry->index2);
1154 else
1155 return NULL;
1156}
561e8a90
ZD
1157
1158/* Set copy for LOOP to COPY. Do nothing when data structures are not
1159 initialized so passes not needing this don't need to care. */
1160
1161void
1162set_loop_copy (struct loop *loop, struct loop *copy)
1163{
1164 if (!copy)
1165 copy_original_table_clear (loop_copy, loop->num);
1166 else
1167 copy_original_table_set (loop_copy, loop->num, copy->num);
1168}
1169
1170/* Get the copy of LOOP. */
1171
1172struct loop *
1173get_loop_copy (struct loop *loop)
1174{
1175 struct htab_bb_copy_original_entry *entry;
1176 struct htab_bb_copy_original_entry key;
1177
1178 gcc_assert (original_copy_bb_pool);
1179
1180 key.index1 = loop->num;
703c8606 1181 entry = loop_copy.find (&key);
561e8a90
ZD
1182 if (entry)
1183 return get_loop (entry->index2);
1184 else
1185 return NULL;
1186}