]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/cfg.c
re PR testsuite/27476 (ACATS: Ada testsuite Bourne shell compatibility problem on...
[thirdparty/gcc.git] / gcc / cfg.c
CommitLineData
402209ff
JH
1/* Control flow graph manipulation code for GNU compiler.
2 Copyright (C) 1987, 1988, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
778f72f2
RS
3 1999, 2000, 2001, 2002, 2003, 2004, 2005
4 Free Software Foundation, Inc.
402209ff
JH
5
6This file is part of GCC.
7
8GCC is free software; you can redistribute it and/or modify it under
9the terms of the GNU General Public License as published by the Free
10Software Foundation; either version 2, or (at your option) any later
11version.
12
13GCC is distributed in the hope that it will be useful, but WITHOUT ANY
14WARRANTY; without even the implied warranty of MERCHANTABILITY or
15FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
16for more details.
17
18You should have received a copy of the GNU General Public License
19along with GCC; see the file COPYING. If not, write to the Free
366ccddb
KC
20Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
2102110-1301, USA. */
402209ff 22
9d083c8c 23/* This file contains low level functions to manipulate the CFG and
4d6922ee 24 analyze it. All other modules should not transform the data structure
9d083c8c
RS
25 directly and use abstraction instead. The file is supposed to be
26 ordered bottom-up and should not contain any code dependent on a
27 particular intermediate language (RTL or trees).
402209ff
JH
28
29 Available functionality:
30 - Initialization/deallocation
31 init_flow, clear_edges
ca6c03ca
JH
32 - Low level basic block manipulation
33 alloc_block, expunge_block
402209ff 34 - Edge manipulation
7ded4467 35 make_edge, make_single_succ_edge, cached_make_edge, remove_edge
402209ff
JH
36 - Low level edge redirection (without updating instruction chain)
37 redirect_edge_succ, redirect_edge_succ_nodup, redirect_edge_pred
eaec9b3d 38 - Dumping and debugging
ca6c03ca
JH
39 dump_flow_info, debug_flow_info, dump_edge_info
40 - Allocation of AUX fields for basic blocks
41 alloc_aux_for_blocks, free_aux_for_blocks, alloc_aux_for_block
38c1593d 42 - clear_bb_flags
10e9fecc
JH
43 - Consistency checking
44 verify_flow_info
45 - Dumping and debugging
46 print_rtl_with_bb, dump_bb, debug_bb, debug_bb_n
402209ff
JH
47 */
48\f
49#include "config.h"
50#include "system.h"
4977bab6
ZW
51#include "coretypes.h"
52#include "tm.h"
402209ff
JH
53#include "tree.h"
54#include "rtl.h"
55#include "hard-reg-set.h"
402209ff
JH
56#include "regs.h"
57#include "flags.h"
58#include "output.h"
59#include "function.h"
60#include "except.h"
61#include "toplev.h"
3d9339a9 62#include "tm_p.h"
997de8ed 63#include "obstack.h"
6de9cd9a 64#include "timevar.h"
a68e7e6c 65#include "tree-pass.h"
6de9cd9a 66#include "ggc.h"
6580ee77
JH
67#include "hashtab.h"
68#include "alloc-pool.h"
402209ff
JH
69
70/* The obstack on which the flow graph components are allocated. */
71
7932a3db 72struct bitmap_obstack reg_obstack;
402209ff 73
d329e058
AJ
74void debug_flow_info (void);
75static void free_edge (edge);
402209ff 76\f
33156717
JH
77#define RDIV(X,Y) (((X) + (Y) / 2) / (Y))
78
eaec9b3d 79/* Called once at initialization time. */
402209ff
JH
80
81void
d329e058 82init_flow (void)
402209ff 83{
a930a4ef
JH
84 if (!cfun->cfg)
85 cfun->cfg = ggc_alloc_cleared (sizeof (struct control_flow_graph));
86 n_edges = 0;
997de8ed 87 ENTRY_BLOCK_PTR = ggc_alloc_cleared (sizeof (struct basic_block_def));
6de9cd9a 88 ENTRY_BLOCK_PTR->index = ENTRY_BLOCK;
997de8ed 89 EXIT_BLOCK_PTR = ggc_alloc_cleared (sizeof (struct basic_block_def));
6de9cd9a
DN
90 EXIT_BLOCK_PTR->index = EXIT_BLOCK;
91 ENTRY_BLOCK_PTR->next_bb = EXIT_BLOCK_PTR;
92 EXIT_BLOCK_PTR->prev_bb = ENTRY_BLOCK_PTR;
402209ff
JH
93}
94\f
d39ac0fd
JH
95/* Helper function for remove_edge and clear_edges. Frees edge structure
96 without actually unlinking it from the pred/succ lists. */
97
98static void
6de9cd9a 99free_edge (edge e ATTRIBUTE_UNUSED)
d39ac0fd
JH
100{
101 n_edges--;
80d8221e 102 ggc_free (e);
d39ac0fd
JH
103}
104
402209ff
JH
105/* Free the memory associated with the edge structures. */
106
107void
d329e058 108clear_edges (void)
402209ff 109{
e0082a72 110 basic_block bb;
d39ac0fd 111 edge e;
628f6a4e 112 edge_iterator ei;
402209ff 113
e0082a72 114 FOR_EACH_BB (bb)
402209ff 115 {
628f6a4e
BE
116 FOR_EACH_EDGE (e, ei, bb->succs)
117 free_edge (e);
118 VEC_truncate (edge, bb->succs, 0);
119 VEC_truncate (edge, bb->preds, 0);
d39ac0fd 120 }
4891442b 121
628f6a4e
BE
122 FOR_EACH_EDGE (e, ei, ENTRY_BLOCK_PTR->succs)
123 free_edge (e);
124 VEC_truncate (edge, EXIT_BLOCK_PTR->preds, 0);
125 VEC_truncate (edge, ENTRY_BLOCK_PTR->succs, 0);
402209ff 126
341c100f 127 gcc_assert (!n_edges);
402209ff
JH
128}
129\f
ca6c03ca 130/* Allocate memory for basic_block. */
402209ff 131
4262e623 132basic_block
d329e058 133alloc_block (void)
402209ff
JH
134{
135 basic_block bb;
6de9cd9a 136 bb = ggc_alloc_cleared (sizeof (*bb));
4262e623 137 return bb;
402209ff
JH
138}
139
918ed612
ZD
140/* Link block B to chain after AFTER. */
141void
d329e058 142link_block (basic_block b, basic_block after)
918ed612
ZD
143{
144 b->next_bb = after->next_bb;
145 b->prev_bb = after;
146 after->next_bb = b;
147 b->next_bb->prev_bb = b;
148}
f87c27b4 149
918ed612
ZD
150/* Unlink block B from chain. */
151void
d329e058 152unlink_block (basic_block b)
918ed612
ZD
153{
154 b->next_bb->prev_bb = b->prev_bb;
155 b->prev_bb->next_bb = b->next_bb;
6de9cd9a
DN
156 b->prev_bb = NULL;
157 b->next_bb = NULL;
918ed612 158}
f87c27b4 159
bf77398c
ZD
160/* Sequentially order blocks and compact the arrays. */
161void
d329e058 162compact_blocks (void)
bf77398c
ZD
163{
164 int i;
165 basic_block bb;
d329e058 166
68f9b844
KH
167 SET_BASIC_BLOCK (ENTRY_BLOCK, ENTRY_BLOCK_PTR);
168 SET_BASIC_BLOCK (EXIT_BLOCK, EXIT_BLOCK_PTR);
24bd1a0b
DB
169
170 i = NUM_FIXED_BLOCKS;
171 FOR_EACH_BB (bb)
bf77398c 172 {
68f9b844 173 SET_BASIC_BLOCK (i, bb);
bf77398c
ZD
174 bb->index = i;
175 i++;
176 }
177
341c100f 178 gcc_assert (i == n_basic_blocks);
bf77398c 179
6de9cd9a 180 for (; i < last_basic_block; i++)
68f9b844 181 SET_BASIC_BLOCK (i, NULL);
6de9cd9a 182
bf77398c
ZD
183 last_basic_block = n_basic_blocks;
184}
185
bf77398c 186/* Remove block B from the basic block array. */
402209ff 187
6a58eee9 188void
d329e058 189expunge_block (basic_block b)
6a58eee9 190{
918ed612 191 unlink_block (b);
68f9b844 192 SET_BASIC_BLOCK (b->index, NULL);
bf77398c 193 n_basic_blocks--;
ab3b6795
JH
194 /* We should be able to ggc_free here, but we are not.
195 The dead SSA_NAMES are left pointing to dead statements that are pointing
196 to dead basic blocks making garbage collector to die.
197 We should be able to release all dead SSA_NAMES and at the same time we should
198 clear out BB pointer of dead statements consistently. */
6a58eee9 199}
402209ff 200\f
adf4a335
KH
201/* Connect E to E->src. */
202
203static inline void
204connect_src (edge e)
205{
d4e6fecb 206 VEC_safe_push (edge, gc, e->src->succs, e);
adf4a335
KH
207}
208
209/* Connect E to E->dest. */
210
211static inline void
212connect_dest (edge e)
213{
214 basic_block dest = e->dest;
d4e6fecb 215 VEC_safe_push (edge, gc, dest->preds, e);
adf4a335
KH
216 e->dest_idx = EDGE_COUNT (dest->preds) - 1;
217}
218
219/* Disconnect edge E from E->src. */
220
221static inline void
222disconnect_src (edge e)
223{
224 basic_block src = e->src;
225 edge_iterator ei;
226 edge tmp;
227
228 for (ei = ei_start (src->succs); (tmp = ei_safe_edge (ei)); )
229 {
230 if (tmp == e)
231 {
232 VEC_unordered_remove (edge, src->succs, ei.index);
233 return;
234 }
235 else
236 ei_next (&ei);
237 }
238
239 gcc_unreachable ();
240}
241
242/* Disconnect edge E from E->dest. */
243
244static inline void
245disconnect_dest (edge e)
246{
247 basic_block dest = e->dest;
248 unsigned int dest_idx = e->dest_idx;
249
250 VEC_unordered_remove (edge, dest->preds, dest_idx);
251
252 /* If we removed an edge in the middle of the edge vector, we need
253 to update dest_idx of the edge that moved into the "hole". */
254 if (dest_idx < EDGE_COUNT (dest->preds))
255 EDGE_PRED (dest, dest_idx)->dest_idx = dest_idx;
256}
257
e0fd3e7a
MM
258/* Create an edge connecting SRC and DEST with flags FLAGS. Return newly
259 created edge. Use this only if you are sure that this edge can't
260 possibly already exist. */
261
262edge
d329e058 263unchecked_make_edge (basic_block src, basic_block dst, int flags)
e0fd3e7a
MM
264{
265 edge e;
6de9cd9a 266 e = ggc_alloc_cleared (sizeof (*e));
e0fd3e7a
MM
267 n_edges++;
268
e0fd3e7a
MM
269 e->src = src;
270 e->dest = dst;
271 e->flags = flags;
adf4a335
KH
272
273 connect_src (e);
274 connect_dest (e);
e0fd3e7a 275
d9d4706f
KH
276 execute_on_growing_pred (e);
277
e0fd3e7a
MM
278 return e;
279}
280
7ded4467 281/* Create an edge connecting SRC and DST with FLAGS optionally using
2ba84f36 282 edge cache CACHE. Return the new edge, NULL if already exist. */
4262e623 283
7ded4467 284edge
a6ee1a15 285cached_make_edge (sbitmap edge_cache, basic_block src, basic_block dst, int flags)
402209ff 286{
e2c879a1
KH
287 if (edge_cache == NULL
288 || src == ENTRY_BLOCK_PTR
289 || dst == EXIT_BLOCK_PTR)
290 return make_edge (src, dst, flags);
402209ff 291
e2c879a1 292 /* Does the requested edge already exist? */
a6ee1a15 293 if (! TEST_BIT (edge_cache, dst->index))
402209ff 294 {
e2c879a1
KH
295 /* The edge does not exist. Create one and update the
296 cache. */
a6ee1a15 297 SET_BIT (edge_cache, dst->index);
e2c879a1 298 return unchecked_make_edge (src, dst, flags);
402209ff 299 }
d329e058 300
e2c879a1
KH
301 /* At this point, we know that the requested edge exists. Adjust
302 flags if necessary. */
303 if (flags)
304 {
305 edge e = find_edge (src, dst);
306 e->flags |= flags;
307 }
7ded4467 308
e2c879a1 309 return NULL;
7ded4467
JH
310}
311
312/* Create an edge connecting SRC and DEST with flags FLAGS. Return newly
313 created edge or NULL if already exist. */
314
315edge
d329e058 316make_edge (basic_block src, basic_block dest, int flags)
7ded4467 317{
e2c879a1
KH
318 edge e = find_edge (src, dest);
319
320 /* Make sure we don't add duplicate edges. */
321 if (e)
322 {
323 e->flags |= flags;
324 return NULL;
325 }
326
327 return unchecked_make_edge (src, dest, flags);
7ded4467
JH
328}
329
eaec9b3d 330/* Create an edge connecting SRC to DEST and set probability by knowing
7ded4467
JH
331 that it is the single edge leaving SRC. */
332
333edge
d329e058 334make_single_succ_edge (basic_block src, basic_block dest, int flags)
7ded4467
JH
335{
336 edge e = make_edge (src, dest, flags);
337
338 e->probability = REG_BR_PROB_BASE;
339 e->count = src->count;
340 return e;
402209ff
JH
341}
342
343/* This function will remove an edge from the flow graph. */
344
345void
d329e058 346remove_edge (edge e)
402209ff 347{
3809e990 348 remove_predictions_associated_with_edge (e);
d9d4706f
KH
349 execute_on_shrinking_pred (e);
350
adf4a335
KH
351 disconnect_src (e);
352 disconnect_dest (e);
402209ff 353
d39ac0fd 354 free_edge (e);
402209ff
JH
355}
356
357/* Redirect an edge's successor from one block to another. */
358
359void
d329e058 360redirect_edge_succ (edge e, basic_block new_succ)
402209ff 361{
d9d4706f
KH
362 execute_on_shrinking_pred (e);
363
adf4a335 364 disconnect_dest (e);
628f6a4e 365
adf4a335 366 e->dest = new_succ;
402209ff
JH
367
368 /* Reconnect the edge to the new successor block. */
adf4a335
KH
369 connect_dest (e);
370
d9d4706f 371 execute_on_growing_pred (e);
402209ff
JH
372}
373
eaec9b3d 374/* Like previous but avoid possible duplicate edge. */
402209ff
JH
375
376edge
d329e058 377redirect_edge_succ_nodup (edge e, basic_block new_succ)
402209ff
JH
378{
379 edge s;
4891442b 380
df95526b
JL
381 s = find_edge (e->src, new_succ);
382 if (s && s != e)
402209ff
JH
383 {
384 s->flags |= e->flags;
385 s->probability += e->probability;
77abb5d8
JH
386 if (s->probability > REG_BR_PROB_BASE)
387 s->probability = REG_BR_PROB_BASE;
402209ff
JH
388 s->count += e->count;
389 remove_edge (e);
390 e = s;
391 }
392 else
393 redirect_edge_succ (e, new_succ);
4891442b 394
402209ff
JH
395 return e;
396}
397
398/* Redirect an edge's predecessor from one block to another. */
399
400void
d329e058 401redirect_edge_pred (edge e, basic_block new_pred)
402209ff 402{
adf4a335 403 disconnect_src (e);
402209ff 404
adf4a335 405 e->src = new_pred;
402209ff
JH
406
407 /* Reconnect the edge to the new predecessor block. */
adf4a335 408 connect_src (e);
402209ff 409}
38c1593d 410
51a904c9 411/* Clear all basic block flags, with the exception of partitioning. */
38c1593d 412void
d329e058 413clear_bb_flags (void)
38c1593d 414{
e0082a72
ZD
415 basic_block bb;
416
417 FOR_BB_BETWEEN (bb, ENTRY_BLOCK_PTR, NULL, next_bb)
5e2d947c
JH
418 bb->flags = (BB_PARTITION (bb) | (bb->flags & BB_DISABLE_SCHEDULE)
419 | (bb->flags & BB_RTL));
38c1593d 420}
402209ff 421\f
878f99d2
JH
422/* Check the consistency of profile information. We can't do that
423 in verify_flow_info, as the counts may get invalid for incompletely
424 solved graphs, later eliminating of conditionals or roundoff errors.
425 It is still practical to have them reported for debugging of simple
426 testcases. */
427void
428check_bb_profile (basic_block bb, FILE * file)
429{
430 edge e;
431 int sum = 0;
432 gcov_type lsum;
628f6a4e 433 edge_iterator ei;
878f99d2
JH
434
435 if (profile_status == PROFILE_ABSENT)
436 return;
437
438 if (bb != EXIT_BLOCK_PTR)
439 {
628f6a4e 440 FOR_EACH_EDGE (e, ei, bb->succs)
878f99d2 441 sum += e->probability;
628f6a4e 442 if (EDGE_COUNT (bb->succs) && abs (sum - REG_BR_PROB_BASE) > 100)
878f99d2
JH
443 fprintf (file, "Invalid sum of outgoing probabilities %.1f%%\n",
444 sum * 100.0 / REG_BR_PROB_BASE);
445 lsum = 0;
628f6a4e 446 FOR_EACH_EDGE (e, ei, bb->succs)
878f99d2 447 lsum += e->count;
628f6a4e
BE
448 if (EDGE_COUNT (bb->succs)
449 && (lsum - bb->count > 100 || lsum - bb->count < -100))
878f99d2
JH
450 fprintf (file, "Invalid sum of outgoing counts %i, should be %i\n",
451 (int) lsum, (int) bb->count);
452 }
453 if (bb != ENTRY_BLOCK_PTR)
454 {
455 sum = 0;
628f6a4e 456 FOR_EACH_EDGE (e, ei, bb->preds)
878f99d2
JH
457 sum += EDGE_FREQUENCY (e);
458 if (abs (sum - bb->frequency) > 100)
459 fprintf (file,
2e6ae27f 460 "Invalid sum of incoming frequencies %i, should be %i\n",
878f99d2
JH
461 sum, bb->frequency);
462 lsum = 0;
628f6a4e 463 FOR_EACH_EDGE (e, ei, bb->preds)
878f99d2
JH
464 lsum += e->count;
465 if (lsum - bb->count > 100 || lsum - bb->count < -100)
2e6ae27f 466 fprintf (file, "Invalid sum of incoming counts %i, should be %i\n",
878f99d2
JH
467 (int) lsum, (int) bb->count);
468 }
469}
470\f
a68e7e6c
PB
471/* Emit basic block information for BB. HEADER is true if the user wants
472 the generic information and the predecessors, FOOTER is true if they want
473 the successors. FLAGS is the dump flags of interest; TDF_DETAILS emit
474 global register liveness information. PREFIX is put in front of every
475 line. The output is emitted to FILE. */
476void
477dump_bb_info (basic_block bb, bool header, bool footer, int flags,
478 const char *prefix, FILE *file)
479{
480 edge e;
481 edge_iterator ei;
482
483 if (header)
484 {
485 fprintf (file, "\n%sBasic block %d ", prefix, bb->index);
486 if (bb->prev_bb)
487 fprintf (file, ", prev %d", bb->prev_bb->index);
488 if (bb->next_bb)
489 fprintf (file, ", next %d", bb->next_bb->index);
490 fprintf (file, ", loop_depth %d, count ", bb->loop_depth);
491 fprintf (file, HOST_WIDEST_INT_PRINT_DEC, bb->count);
492 fprintf (file, ", freq %i", bb->frequency);
493 if (maybe_hot_bb_p (bb))
494 fprintf (file, ", maybe hot");
495 if (probably_never_executed_bb_p (bb))
496 fprintf (file, ", probably never executed");
497 fprintf (file, ".\n");
498
499 fprintf (file, "%sPredecessors: ", prefix);
500 FOR_EACH_EDGE (e, ei, bb->preds)
501 dump_edge_info (file, e, 0);
502 }
503
504 if (footer)
505 {
506 fprintf (file, "\n%sSuccessors: ", prefix);
507 FOR_EACH_EDGE (e, ei, bb->succs)
508 dump_edge_info (file, e, 1);
509 }
510
511 if ((flags & TDF_DETAILS)
512 && (bb->flags & BB_RTL))
513 {
514 if (bb->il.rtl->global_live_at_start && header)
515 {
516 fprintf (file, "\n%sRegisters live at start:", prefix);
517 dump_regset (bb->il.rtl->global_live_at_start, file);
518 }
519
520 if (bb->il.rtl->global_live_at_end && footer)
521 {
522 fprintf (file, "\n%sRegisters live at end:", prefix);
523 dump_regset (bb->il.rtl->global_live_at_end, file);
524 }
525 }
526
527 putc ('\n', file);
528}
529
ca6c03ca 530void
5b4fdb20 531dump_flow_info (FILE *file, int flags)
402209ff 532{
e0082a72 533 basic_block bb;
ca6c03ca 534
57d52c81 535 /* There are no pseudo registers after reload. Don't dump them. */
5b4fdb20
PB
536 if (reg_n_info && !reload_completed
537 && (flags & TDF_DETAILS) != 0)
6de9cd9a 538 {
f34ac626
RH
539 unsigned int i, max = max_reg_num ();
540 fprintf (file, "%d registers.\n", max);
541 for (i = FIRST_PSEUDO_REGISTER; i < max; i++)
6de9cd9a
DN
542 if (REG_N_REFS (i))
543 {
544 enum reg_class class, altclass;
545
546 fprintf (file, "\nRegister %d used %d times across %d insns",
547 i, REG_N_REFS (i), REG_LIVE_LENGTH (i));
548 if (REG_BASIC_BLOCK (i) >= 0)
549 fprintf (file, " in block %d", REG_BASIC_BLOCK (i));
550 if (REG_N_SETS (i))
551 fprintf (file, "; set %d time%s", REG_N_SETS (i),
552 (REG_N_SETS (i) == 1) ? "" : "s");
553 if (regno_reg_rtx[i] != NULL && REG_USERVAR_P (regno_reg_rtx[i]))
554 fprintf (file, "; user var");
555 if (REG_N_DEATHS (i) != 1)
556 fprintf (file, "; dies in %d places", REG_N_DEATHS (i));
557 if (REG_N_CALLS_CROSSED (i) == 1)
558 fprintf (file, "; crosses 1 call");
559 else if (REG_N_CALLS_CROSSED (i))
560 fprintf (file, "; crosses %d calls", REG_N_CALLS_CROSSED (i));
561 if (regno_reg_rtx[i] != NULL
562 && PSEUDO_REGNO_BYTES (i) != UNITS_PER_WORD)
563 fprintf (file, "; %d bytes", PSEUDO_REGNO_BYTES (i));
564
565 class = reg_preferred_class (i);
566 altclass = reg_alternate_class (i);
567 if (class != GENERAL_REGS || altclass != ALL_REGS)
568 {
569 if (altclass == ALL_REGS || class == ALL_REGS)
570 fprintf (file, "; pref %s", reg_class_names[(int) class]);
571 else if (altclass == NO_REGS)
572 fprintf (file, "; %s or none", reg_class_names[(int) class]);
573 else
574 fprintf (file, "; pref %s, else %s",
575 reg_class_names[(int) class],
576 reg_class_names[(int) altclass]);
577 }
578
579 if (regno_reg_rtx[i] != NULL && REG_POINTER (regno_reg_rtx[i]))
580 fprintf (file, "; pointer");
581 fprintf (file, ".\n");
582 }
583 }
ca6c03ca 584
0b17ab2f 585 fprintf (file, "\n%d basic blocks, %d edges.\n", n_basic_blocks, n_edges);
e0082a72 586 FOR_EACH_BB (bb)
ca6c03ca 587 {
5b4fdb20 588 dump_bb_info (bb, true, true, flags, "", file);
878f99d2 589 check_bb_profile (bb, file);
402209ff
JH
590 }
591
ca6c03ca 592 putc ('\n', file);
402209ff
JH
593}
594
ca6c03ca 595void
d329e058 596debug_flow_info (void)
ca6c03ca 597{
5b4fdb20 598 dump_flow_info (stderr, TDF_DETAILS);
ca6c03ca 599}
402209ff
JH
600
601void
d329e058 602dump_edge_info (FILE *file, edge e, int do_succ)
402209ff 603{
ca6c03ca
JH
604 basic_block side = (do_succ ? e->dest : e->src);
605
606 if (side == ENTRY_BLOCK_PTR)
607 fputs (" ENTRY", file);
608 else if (side == EXIT_BLOCK_PTR)
609 fputs (" EXIT", file);
610 else
0b17ab2f 611 fprintf (file, " %d", side->index);
ca6c03ca
JH
612
613 if (e->probability)
614 fprintf (file, " [%.1f%%] ", e->probability * 100.0 / REG_BR_PROB_BASE);
402209ff 615
ca6c03ca 616 if (e->count)
402209ff 617 {
ca6c03ca 618 fprintf (file, " count:");
4891442b 619 fprintf (file, HOST_WIDEST_INT_PRINT_DEC, e->count);
402209ff
JH
620 }
621
ca6c03ca 622 if (e->flags)
402209ff 623 {
1722c2c8
RH
624 static const char * const bitnames[] = {
625 "fallthru", "ab", "abcall", "eh", "fake", "dfs_back",
6de9cd9a
DN
626 "can_fallthru", "irreducible", "sibcall", "loop_exit",
627 "true", "false", "exec"
1722c2c8 628 };
ca6c03ca
JH
629 int comma = 0;
630 int i, flags = e->flags;
402209ff 631
4891442b 632 fputs (" (", file);
402209ff
JH
633 for (i = 0; flags; i++)
634 if (flags & (1 << i))
635 {
636 flags &= ~(1 << i);
637
638 if (comma)
639 fputc (',', file);
640 if (i < (int) ARRAY_SIZE (bitnames))
641 fputs (bitnames[i], file);
642 else
643 fprintf (file, "%d", i);
644 comma = 1;
645 }
4891442b 646
402209ff
JH
647 fputc (')', file);
648 }
649}
650\f
ff7cc307 651/* Simple routines to easily allocate AUX fields of basic blocks. */
4891442b 652
ca6c03ca
JH
653static struct obstack block_aux_obstack;
654static void *first_block_aux_obj = 0;
655static struct obstack edge_aux_obstack;
656static void *first_edge_aux_obj = 0;
402209ff 657
09da1532 658/* Allocate a memory block of SIZE as BB->aux. The obstack must
ca6c03ca 659 be first initialized by alloc_aux_for_blocks. */
402209ff 660
ca6c03ca 661inline void
d329e058 662alloc_aux_for_block (basic_block bb, int size)
402209ff 663{
ca6c03ca 664 /* Verify that aux field is clear. */
341c100f 665 gcc_assert (!bb->aux && first_block_aux_obj);
ca6c03ca
JH
666 bb->aux = obstack_alloc (&block_aux_obstack, size);
667 memset (bb->aux, 0, size);
402209ff
JH
668}
669
ca6c03ca
JH
670/* Initialize the block_aux_obstack and if SIZE is nonzero, call
671 alloc_aux_for_block for each basic block. */
402209ff
JH
672
673void
d329e058 674alloc_aux_for_blocks (int size)
402209ff 675{
ca6c03ca 676 static int initialized;
402209ff 677
ca6c03ca 678 if (!initialized)
402209ff 679 {
ca6c03ca
JH
680 gcc_obstack_init (&block_aux_obstack);
681 initialized = 1;
402209ff 682 }
341c100f
NS
683 else
684 /* Check whether AUX data are still allocated. */
685 gcc_assert (!first_block_aux_obj);
686
703ad42b 687 first_block_aux_obj = obstack_alloc (&block_aux_obstack, 0);
ca6c03ca 688 if (size)
402209ff 689 {
e0082a72 690 basic_block bb;
4891442b 691
e0082a72
ZD
692 FOR_BB_BETWEEN (bb, ENTRY_BLOCK_PTR, NULL, next_bb)
693 alloc_aux_for_block (bb, size);
402209ff
JH
694 }
695}
ca6c03ca 696
108c1afc 697/* Clear AUX pointers of all blocks. */
402209ff
JH
698
699void
d329e058 700clear_aux_for_blocks (void)
402209ff 701{
e0082a72 702 basic_block bb;
4891442b 703
e0082a72
ZD
704 FOR_BB_BETWEEN (bb, ENTRY_BLOCK_PTR, NULL, next_bb)
705 bb->aux = NULL;
108c1afc
RH
706}
707
708/* Free data allocated in block_aux_obstack and clear AUX pointers
709 of all blocks. */
710
711void
d329e058 712free_aux_for_blocks (void)
108c1afc 713{
341c100f 714 gcc_assert (first_block_aux_obj);
108c1afc 715 obstack_free (&block_aux_obstack, first_block_aux_obj);
ca6c03ca 716 first_block_aux_obj = NULL;
108c1afc
RH
717
718 clear_aux_for_blocks ();
ca6c03ca 719}
402209ff 720
09da1532 721/* Allocate a memory edge of SIZE as BB->aux. The obstack must
ca6c03ca 722 be first initialized by alloc_aux_for_edges. */
402209ff 723
ca6c03ca 724inline void
d329e058 725alloc_aux_for_edge (edge e, int size)
ca6c03ca
JH
726{
727 /* Verify that aux field is clear. */
341c100f 728 gcc_assert (!e->aux && first_edge_aux_obj);
ca6c03ca
JH
729 e->aux = obstack_alloc (&edge_aux_obstack, size);
730 memset (e->aux, 0, size);
731}
402209ff 732
ca6c03ca
JH
733/* Initialize the edge_aux_obstack and if SIZE is nonzero, call
734 alloc_aux_for_edge for each basic edge. */
402209ff 735
ca6c03ca 736void
d329e058 737alloc_aux_for_edges (int size)
ca6c03ca
JH
738{
739 static int initialized;
402209ff 740
ca6c03ca
JH
741 if (!initialized)
742 {
743 gcc_obstack_init (&edge_aux_obstack);
744 initialized = 1;
402209ff 745 }
341c100f
NS
746 else
747 /* Check whether AUX data are still allocated. */
748 gcc_assert (!first_edge_aux_obj);
4891442b 749
703ad42b 750 first_edge_aux_obj = obstack_alloc (&edge_aux_obstack, 0);
ca6c03ca 751 if (size)
402209ff 752 {
e0082a72
ZD
753 basic_block bb;
754
755 FOR_BB_BETWEEN (bb, ENTRY_BLOCK_PTR, EXIT_BLOCK_PTR, next_bb)
402209ff 756 {
ca6c03ca 757 edge e;
628f6a4e 758 edge_iterator ei;
ca6c03ca 759
628f6a4e 760 FOR_EACH_EDGE (e, ei, bb->succs)
ca6c03ca 761 alloc_aux_for_edge (e, size);
402209ff 762 }
402209ff 763 }
402209ff 764}
402209ff 765
108c1afc 766/* Clear AUX pointers of all edges. */
ca6c03ca
JH
767
768void
d329e058 769clear_aux_for_edges (void)
402209ff 770{
e0082a72
ZD
771 basic_block bb;
772 edge e;
402209ff 773
e0082a72 774 FOR_BB_BETWEEN (bb, ENTRY_BLOCK_PTR, EXIT_BLOCK_PTR, next_bb)
402209ff 775 {
628f6a4e
BE
776 edge_iterator ei;
777 FOR_EACH_EDGE (e, ei, bb->succs)
ca6c03ca 778 e->aux = NULL;
402209ff 779 }
108c1afc
RH
780}
781
782/* Free data allocated in edge_aux_obstack and clear AUX pointers
783 of all edges. */
784
785void
d329e058 786free_aux_for_edges (void)
108c1afc 787{
341c100f 788 gcc_assert (first_edge_aux_obj);
108c1afc 789 obstack_free (&edge_aux_obstack, first_edge_aux_obj);
ca6c03ca 790 first_edge_aux_obj = NULL;
108c1afc
RH
791
792 clear_aux_for_edges ();
402209ff 793}
9ee634e3 794
10e9fecc 795void
d329e058 796debug_bb (basic_block bb)
10e9fecc 797{
f470c378 798 dump_bb (bb, stderr, 0);
10e9fecc
JH
799}
800
801basic_block
d329e058 802debug_bb_n (int n)
10e9fecc
JH
803{
804 basic_block bb = BASIC_BLOCK (n);
f470c378 805 dump_bb (bb, stderr, 0);
10e9fecc 806 return bb;
9ee634e3 807}
6de9cd9a
DN
808
809/* Dumps cfg related information about basic block BB to FILE. */
810
811static void
812dump_cfg_bb_info (FILE *file, basic_block bb)
813{
814 unsigned i;
628f6a4e 815 edge_iterator ei;
6de9cd9a
DN
816 bool first = true;
817 static const char * const bb_bitnames[] =
818 {
819 "dirty", "new", "reachable", "visited", "irreducible_loop", "superblock"
820 };
821 const unsigned n_bitnames = sizeof (bb_bitnames) / sizeof (char *);
822 edge e;
823
824 fprintf (file, "Basic block %d", bb->index);
825 for (i = 0; i < n_bitnames; i++)
826 if (bb->flags & (1 << i))
827 {
828 if (first)
829 fprintf (file, " (");
830 else
831 fprintf (file, ", ");
832 first = false;
833 fprintf (file, bb_bitnames[i]);
834 }
835 if (!first)
836 fprintf (file, ")");
837 fprintf (file, "\n");
838
839 fprintf (file, "Predecessors: ");
628f6a4e 840 FOR_EACH_EDGE (e, ei, bb->preds)
6de9cd9a
DN
841 dump_edge_info (file, e, 0);
842
843 fprintf (file, "\nSuccessors: ");
628f6a4e 844 FOR_EACH_EDGE (e, ei, bb->succs)
6de9cd9a
DN
845 dump_edge_info (file, e, 1);
846 fprintf (file, "\n\n");
847}
848
849/* Dumps a brief description of cfg to FILE. */
850
851void
852brief_dump_cfg (FILE *file)
853{
854 basic_block bb;
855
856 FOR_EACH_BB (bb)
857 {
858 dump_cfg_bb_info (file, bb);
859 }
860}
15db5571
JH
861
862/* An edge originally destinating BB of FREQUENCY and COUNT has been proved to
863 leave the block by TAKEN_EDGE. Update profile of BB such that edge E can be
d4a9b3a3 864 redirected to destination of TAKEN_EDGE.
15db5571
JH
865
866 This function may leave the profile inconsistent in the case TAKEN_EDGE
867 frequency or count is believed to be lower than FREQUENCY or COUNT
d4a9b3a3 868 respectively. */
15db5571
JH
869void
870update_bb_profile_for_threading (basic_block bb, int edge_frequency,
871 gcov_type count, edge taken_edge)
872{
873 edge c;
874 int prob;
628f6a4e 875 edge_iterator ei;
15db5571
JH
876
877 bb->count -= count;
878 if (bb->count < 0)
2b151cb2
JH
879 {
880 if (dump_file)
881 fprintf (dump_file, "bb %i count became negative after threading",
882 bb->index);
883 bb->count = 0;
884 }
15db5571
JH
885
886 /* Compute the probability of TAKEN_EDGE being reached via threaded edge.
887 Watch for overflows. */
888 if (bb->frequency)
889 prob = edge_frequency * REG_BR_PROB_BASE / bb->frequency;
890 else
891 prob = 0;
892 if (prob > taken_edge->probability)
893 {
894 if (dump_file)
895 fprintf (dump_file, "Jump threading proved probability of edge "
896 "%i->%i too small (it is %i, should be %i).\n",
897 taken_edge->src->index, taken_edge->dest->index,
898 taken_edge->probability, prob);
899 prob = taken_edge->probability;
900 }
901
902 /* Now rescale the probabilities. */
903 taken_edge->probability -= prob;
904 prob = REG_BR_PROB_BASE - prob;
905 bb->frequency -= edge_frequency;
906 if (bb->frequency < 0)
907 bb->frequency = 0;
908 if (prob <= 0)
909 {
910 if (dump_file)
911 fprintf (dump_file, "Edge frequencies of bb %i has been reset, "
912 "frequency of block should end up being 0, it is %i\n",
913 bb->index, bb->frequency);
628f6a4e
BE
914 EDGE_SUCC (bb, 0)->probability = REG_BR_PROB_BASE;
915 ei = ei_start (bb->succs);
916 ei_next (&ei);
917 for (; (c = ei_safe_edge (ei)); ei_next (&ei))
15db5571
JH
918 c->probability = 0;
919 }
763ea904
JL
920 else if (prob != REG_BR_PROB_BASE)
921 {
09bac500 922 int scale = RDIV (65536 * REG_BR_PROB_BASE, prob);
763ea904
JL
923
924 FOR_EACH_EDGE (c, ei, bb->succs)
84fc24e8 925 {
09bac500 926 c->probability = RDIV (c->probability * scale, 65536);
84fc24e8
JH
927 if (c->probability > REG_BR_PROB_BASE)
928 c->probability = REG_BR_PROB_BASE;
929 }
763ea904 930 }
15db5571 931
41806d92 932 gcc_assert (bb == taken_edge->src);
15db5571
JH
933 taken_edge->count -= count;
934 if (taken_edge->count < 0)
2b151cb2
JH
935 {
936 if (dump_file)
937 fprintf (dump_file, "edge %i->%i count became negative after threading",
938 taken_edge->src->index, taken_edge->dest->index);
939 taken_edge->count = 0;
940 }
15db5571 941}
33156717
JH
942
943/* Multiply all frequencies of basic blocks in array BBS of length NBBS
944 by NUM/DEN, in int arithmetic. May lose some accuracy. */
945void
946scale_bbs_frequencies_int (basic_block *bbs, int nbbs, int num, int den)
947{
948 int i;
949 edge e;
84fc24e8
JH
950 if (num < 0)
951 num = 0;
952 if (num > den)
953 return;
09bac500 954 /* Assume that the users are producing the fraction from frequencies
536fa7b7 955 that never grow far enough to risk arithmetic overflow. */
09bac500 956 gcc_assert (num < 65536);
33156717
JH
957 for (i = 0; i < nbbs; i++)
958 {
959 edge_iterator ei;
09bac500 960 bbs[i]->frequency = RDIV (bbs[i]->frequency * num, den);
33156717
JH
961 bbs[i]->count = RDIV (bbs[i]->count * num, den);
962 FOR_EACH_EDGE (e, ei, bbs[i]->succs)
09bac500 963 e->count = RDIV (e->count * num, den);
33156717
JH
964 }
965}
966
09bac500
JH
967/* numbers smaller than this value are safe to multiply without getting
968 64bit overflow. */
969#define MAX_SAFE_MULTIPLIER (1 << (sizeof (HOST_WIDEST_INT) * 4 - 1))
970
33156717
JH
971/* Multiply all frequencies of basic blocks in array BBS of length NBBS
972 by NUM/DEN, in gcov_type arithmetic. More accurate than previous
973 function but considerably slower. */
974void
975scale_bbs_frequencies_gcov_type (basic_block *bbs, int nbbs, gcov_type num,
976 gcov_type den)
977{
978 int i;
979 edge e;
09bac500 980 gcov_type fraction = RDIV (num * 65536, den);
33156717 981
09bac500
JH
982 gcc_assert (fraction >= 0);
983
984 if (num < MAX_SAFE_MULTIPLIER)
985 for (i = 0; i < nbbs; i++)
986 {
987 edge_iterator ei;
988 bbs[i]->frequency = RDIV (bbs[i]->frequency * num, den);
989 if (bbs[i]->count <= MAX_SAFE_MULTIPLIER)
990 bbs[i]->count = RDIV (bbs[i]->count * num, den);
991 else
992 bbs[i]->count = RDIV (bbs[i]->count * fraction, 65536);
993 FOR_EACH_EDGE (e, ei, bbs[i]->succs)
994 if (bbs[i]->count <= MAX_SAFE_MULTIPLIER)
995 e->count = RDIV (e->count * num, den);
996 else
997 e->count = RDIV (e->count * fraction, 65536);
998 }
999 else
1000 for (i = 0; i < nbbs; i++)
1001 {
1002 edge_iterator ei;
1003 if (sizeof (gcov_type) > sizeof (int))
1004 bbs[i]->frequency = RDIV (bbs[i]->frequency * num, den);
1005 else
1006 bbs[i]->frequency = RDIV (bbs[i]->frequency * fraction, 65536);
1007 bbs[i]->count = RDIV (bbs[i]->count * fraction, 65536);
1008 FOR_EACH_EDGE (e, ei, bbs[i]->succs)
1009 e->count = RDIV (e->count * fraction, 65536);
1010 }
33156717 1011}
6580ee77 1012
f341de7b
KH
1013/* Data structures used to maintain mapping between basic blocks and
1014 copies. */
6580ee77
JH
1015static htab_t bb_original;
1016static htab_t bb_copy;
1017static alloc_pool original_copy_bb_pool;
1018
1019struct htab_bb_copy_original_entry
1020{
1021 /* Block we are attaching info to. */
1022 int index1;
1023 /* Index of original or copy (depending on the hashtable) */
1024 int index2;
1025};
1026
1027static hashval_t
1028bb_copy_original_hash (const void *p)
1029{
1030 struct htab_bb_copy_original_entry *data
1031 = ((struct htab_bb_copy_original_entry *)p);
1032
1033 return data->index1;
1034}
1035static int
1036bb_copy_original_eq (const void *p, const void *q)
1037{
1038 struct htab_bb_copy_original_entry *data
1039 = ((struct htab_bb_copy_original_entry *)p);
1040 struct htab_bb_copy_original_entry *data2
1041 = ((struct htab_bb_copy_original_entry *)q);
1042
1043 return data->index1 == data2->index1;
1044}
1045
f341de7b
KH
1046/* Initialize the data structures to maintain mapping between blocks
1047 and its copies. */
6580ee77
JH
1048void
1049initialize_original_copy_tables (void)
1050{
1051 gcc_assert (!original_copy_bb_pool);
1052 original_copy_bb_pool
1053 = create_alloc_pool ("original_copy",
1054 sizeof (struct htab_bb_copy_original_entry), 10);
1055 bb_original = htab_create (10, bb_copy_original_hash,
1056 bb_copy_original_eq, NULL);
1057 bb_copy = htab_create (10, bb_copy_original_hash, bb_copy_original_eq, NULL);
1058}
1059
f341de7b
KH
1060/* Free the data structures to maintain mapping between blocks and
1061 its copies. */
6580ee77
JH
1062void
1063free_original_copy_tables (void)
1064{
1065 gcc_assert (original_copy_bb_pool);
1066 htab_delete (bb_copy);
1067 htab_delete (bb_original);
1068 free_alloc_pool (original_copy_bb_pool);
1069 bb_copy = NULL;
1070 bb_original = NULL;
1071 original_copy_bb_pool = NULL;
1072}
1073
f341de7b
KH
1074/* Set original for basic block. Do nothing when data structures are not
1075 initialized so passes not needing this don't need to care. */
6580ee77
JH
1076void
1077set_bb_original (basic_block bb, basic_block original)
1078{
1079 if (original_copy_bb_pool)
1080 {
1081 struct htab_bb_copy_original_entry **slot;
1082 struct htab_bb_copy_original_entry key;
1083
1084 key.index1 = bb->index;
1085 slot =
1086 (struct htab_bb_copy_original_entry **) htab_find_slot (bb_original,
1087 &key, INSERT);
1088 if (*slot)
1089 (*slot)->index2 = original->index;
1090 else
1091 {
1092 *slot = pool_alloc (original_copy_bb_pool);
1093 (*slot)->index1 = bb->index;
1094 (*slot)->index2 = original->index;
1095 }
1096 }
1097}
1098
1099/* Get the original basic block. */
1100basic_block
1101get_bb_original (basic_block bb)
1102{
1103 struct htab_bb_copy_original_entry *entry;
1104 struct htab_bb_copy_original_entry key;
1105
1106 gcc_assert (original_copy_bb_pool);
1107
1108 key.index1 = bb->index;
1109 entry = (struct htab_bb_copy_original_entry *) htab_find (bb_original, &key);
1110 if (entry)
1111 return BASIC_BLOCK (entry->index2);
1112 else
1113 return NULL;
1114}
1115
f341de7b
KH
1116/* Set copy for basic block. Do nothing when data structures are not
1117 initialized so passes not needing this don't need to care. */
6580ee77
JH
1118void
1119set_bb_copy (basic_block bb, basic_block copy)
1120{
1121 if (original_copy_bb_pool)
1122 {
1123 struct htab_bb_copy_original_entry **slot;
1124 struct htab_bb_copy_original_entry key;
1125
1126 key.index1 = bb->index;
1127 slot =
1128 (struct htab_bb_copy_original_entry **) htab_find_slot (bb_copy,
1129 &key, INSERT);
1130 if (*slot)
1131 (*slot)->index2 = copy->index;
1132 else
1133 {
1134 *slot = pool_alloc (original_copy_bb_pool);
1135 (*slot)->index1 = bb->index;
1136 (*slot)->index2 = copy->index;
1137 }
1138 }
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;
1151 entry = (struct htab_bb_copy_original_entry *) htab_find (bb_copy, &key);
1152 if (entry)
1153 return BASIC_BLOCK (entry->index2);
1154 else
1155 return NULL;
1156}