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