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