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