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