]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/cfgcleanup.c
basic-block.h (flow_delete_block_noexpunge): Declare.
[thirdparty/gcc.git] / gcc / cfgcleanup.c
CommitLineData
402209ff
JH
1/* Control flow optimization code for GNU compiler.
2 Copyright (C) 1987, 1988, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
6a58eee9 3 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
402209ff
JH
4
5This file is part of GCC.
6
7GCC is free software; you can redistribute it and/or modify it under
8the terms of the GNU General Public License as published by the Free
9Software Foundation; either version 2, or (at your option) any later
10version.
11
12GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13WARRANTY; without even the implied warranty of MERCHANTABILITY or
14FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
15for more details.
16
17You should have received a copy of the GNU General Public License
18along with GCC; see the file COPYING. If not, write to the Free
19Software Foundation, 59 Temple Place - Suite 330, Boston, MA
2002111-1307, USA. */
21
22/* This file contains optimizer of the control flow. The main entrypoint is
23 cleanup_cfg. Following optimizations are performed:
24
25 - Unreachable blocks removal
26 - Edge forwarding (edge to the forwarder block is forwarded to it's
eaec9b3d 27 successor. Simplification of the branch instruction is performed by
402209ff 28 underlying infrastructure so branch can be converted to simplejump or
f5143c46 29 eliminated).
402209ff
JH
30 - Cross jumping (tail merging)
31 - Conditional jump-around-simplejump simplification
32 - Basic block merging. */
33
34#include "config.h"
35#include "system.h"
36#include "rtl.h"
37#include "hard-reg-set.h"
38#include "basic-block.h"
39#include "timevar.h"
40#include "output.h"
41#include "insn-config.h"
42#include "flags.h"
43#include "recog.h"
44#include "toplev.h"
8ecba28a 45#include "cselib.h"
9f16e871 46#include "tm_p.h"
e4ec2cac 47#include "target.h"
402209ff
JH
48
49#include "obstack.h"
50
79f5e6be 51/* cleanup_cfg maintains following flags for each basic block. */
5f0d2358
RK
52
53enum bb_flags
54{
635559ab
JH
55 /* Set if BB is the forwarder block to avoid too many
56 forwarder_block_p calls. */
1540f9eb
JH
57 BB_FORWARDER_BLOCK = 1,
58 BB_NONTHREADABLE_BLOCK = 2
5f0d2358 59};
635559ab 60
5f0d2358
RK
61#define BB_FLAGS(BB) (enum bb_flags) (BB)->aux
62#define BB_SET_FLAG(BB, FLAG) \
63 (BB)->aux = (void *) (long) ((enum bb_flags) (BB)->aux | (FLAG))
64#define BB_CLEAR_FLAG(BB, FLAG) \
65 (BB)->aux = (void *) (long) ((enum bb_flags) (BB)->aux & ~(FLAG))
635559ab 66
5f0d2358 67#define FORWARDER_BLOCK_P(BB) (BB_FLAGS (BB) & BB_FORWARDER_BLOCK)
635559ab 68
402209ff
JH
69static bool try_crossjump_to_edge PARAMS ((int, edge, edge));
70static bool try_crossjump_bb PARAMS ((int, basic_block));
0dd0e980
JH
71static bool outgoing_edges_match PARAMS ((int,
72 basic_block, basic_block));
402209ff
JH
73static int flow_find_cross_jump PARAMS ((int, basic_block, basic_block,
74 rtx *, rtx *));
0dd0e980 75static bool insns_match_p PARAMS ((int, rtx, rtx));
402209ff
JH
76
77static bool delete_unreachable_blocks PARAMS ((void));
ec10f7c7 78static bool label_is_jump_target_p PARAMS ((rtx, rtx));
4262e623
JH
79static bool tail_recursion_label_p PARAMS ((rtx));
80static void merge_blocks_move_predecessor_nojumps PARAMS ((basic_block,
402209ff 81 basic_block));
4262e623 82static void merge_blocks_move_successor_nojumps PARAMS ((basic_block,
402209ff 83 basic_block));
4262e623 84static bool merge_blocks PARAMS ((edge,basic_block,basic_block,
402209ff
JH
85 int));
86static bool try_optimize_cfg PARAMS ((int));
87static bool try_simplify_condjump PARAMS ((basic_block));
88static bool try_forward_edges PARAMS ((int, basic_block));
8ecba28a
JH
89static edge thread_jump PARAMS ((int, edge, basic_block));
90static bool mark_effect PARAMS ((rtx, bitmap));
635559ab
JH
91static void notice_new_block PARAMS ((basic_block));
92static void update_forwarder_flag PARAMS ((basic_block));
fe477d8b 93static int mentions_nonequal_regs PARAMS ((rtx *, void *));
635559ab
JH
94\f
95/* Set flags for newly created block. */
96
97static void
98notice_new_block (bb)
99 basic_block bb;
100{
101 if (!bb)
102 return;
5f0d2358 103
635559ab
JH
104 if (forwarder_block_p (bb))
105 BB_SET_FLAG (bb, BB_FORWARDER_BLOCK);
106}
107
108/* Recompute forwarder flag after block has been modified. */
109
110static void
111update_forwarder_flag (bb)
112 basic_block bb;
113{
114 if (forwarder_block_p (bb))
115 BB_SET_FLAG (bb, BB_FORWARDER_BLOCK);
116 else
117 BB_CLEAR_FLAG (bb, BB_FORWARDER_BLOCK);
118}
402209ff
JH
119\f
120/* Simplify a conditional jump around an unconditional jump.
121 Return true if something changed. */
122
123static bool
124try_simplify_condjump (cbranch_block)
125 basic_block cbranch_block;
126{
127 basic_block jump_block, jump_dest_block, cbranch_dest_block;
128 edge cbranch_jump_edge, cbranch_fallthru_edge;
129 rtx cbranch_insn;
130
131 /* Verify that there are exactly two successors. */
132 if (!cbranch_block->succ
133 || !cbranch_block->succ->succ_next
134 || cbranch_block->succ->succ_next->succ_next)
135 return false;
136
137 /* Verify that we've got a normal conditional branch at the end
138 of the block. */
139 cbranch_insn = cbranch_block->end;
140 if (!any_condjump_p (cbranch_insn))
141 return false;
142
143 cbranch_fallthru_edge = FALLTHRU_EDGE (cbranch_block);
144 cbranch_jump_edge = BRANCH_EDGE (cbranch_block);
145
146 /* The next block must not have multiple predecessors, must not
147 be the last block in the function, and must contain just the
148 unconditional jump. */
149 jump_block = cbranch_fallthru_edge->dest;
150 if (jump_block->pred->pred_next
151 || jump_block->index == n_basic_blocks - 1
635559ab 152 || !FORWARDER_BLOCK_P (jump_block))
402209ff
JH
153 return false;
154 jump_dest_block = jump_block->succ->dest;
155
156 /* The conditional branch must target the block after the
157 unconditional branch. */
158 cbranch_dest_block = cbranch_jump_edge->dest;
159
160 if (!can_fallthru (jump_block, cbranch_dest_block))
161 return false;
162
ca6c03ca
JH
163 /* Invert the conditional branch. */
164 if (!invert_jump (cbranch_insn, block_label (jump_dest_block), 0))
165 return false;
402209ff
JH
166
167 if (rtl_dump_file)
168 fprintf (rtl_dump_file, "Simplifying condjump %i around jump %i\n",
169 INSN_UID (cbranch_insn), INSN_UID (jump_block->end));
170
171 /* Success. Update the CFG to match. Note that after this point
172 the edge variable names appear backwards; the redirection is done
173 this way to preserve edge profile data. */
174 cbranch_jump_edge = redirect_edge_succ_nodup (cbranch_jump_edge,
175 cbranch_dest_block);
176 cbranch_fallthru_edge = redirect_edge_succ_nodup (cbranch_fallthru_edge,
177 jump_dest_block);
178 cbranch_jump_edge->flags |= EDGE_FALLTHRU;
179 cbranch_fallthru_edge->flags &= ~EDGE_FALLTHRU;
b446e5a2 180 update_br_prob_note (cbranch_block);
402209ff
JH
181
182 /* Delete the block with the unconditional jump, and clean up the mess. */
183 flow_delete_block (jump_block);
184 tidy_fallthru_edge (cbranch_jump_edge, cbranch_block, cbranch_dest_block);
185
186 return true;
187}
188\f
8ecba28a
JH
189/* Attempt to prove that operation is NOOP using CSElib or mark the effect
190 on register. Used by jump threading. */
5f0d2358 191
8ecba28a
JH
192static bool
193mark_effect (exp, nonequal)
194 rtx exp;
195 regset nonequal;
196{
9f16e871
JH
197 int regno;
198 rtx dest;
8ecba28a
JH
199 switch (GET_CODE (exp))
200 {
201 /* In case we do clobber the register, mark it as equal, as we know the
202 value is dead so it don't have to match. */
203 case CLOBBER:
204 if (REG_P (XEXP (exp, 0)))
9f16e871
JH
205 {
206 dest = XEXP (exp, 0);
207 regno = REGNO (dest);
208 CLEAR_REGNO_REG_SET (nonequal, regno);
209 if (regno < FIRST_PSEUDO_REGISTER)
210 {
211 int n = HARD_REGNO_NREGS (regno, GET_MODE (dest));
212 while (--n > 0)
213 CLEAR_REGNO_REG_SET (nonequal, regno + n);
214 }
215 }
8ecba28a 216 return false;
5f0d2358 217
8ecba28a
JH
218 case SET:
219 if (rtx_equal_for_cselib_p (SET_DEST (exp), SET_SRC (exp)))
220 return false;
9f16e871
JH
221 dest = SET_DEST (exp);
222 if (dest == pc_rtx)
223 return false;
224 if (!REG_P (dest))
8ecba28a 225 return true;
9f16e871
JH
226 regno = REGNO (dest);
227 SET_REGNO_REG_SET (nonequal, regno);
228 if (regno < FIRST_PSEUDO_REGISTER)
229 {
230 int n = HARD_REGNO_NREGS (regno, GET_MODE (dest));
231 while (--n > 0)
232 SET_REGNO_REG_SET (nonequal, regno + n);
233 }
8ecba28a 234 return false;
5f0d2358 235
8ecba28a
JH
236 default:
237 return false;
238 }
239}
fe477d8b
JH
240
241/* Return nonzero if X is an register set in regset DATA.
242 Called via for_each_rtx. */
243static int
244mentions_nonequal_regs (x, data)
245 rtx *x;
246 void *data;
247{
248 regset nonequal = (regset) data;
249 if (REG_P (*x))
250 {
251 int regno;
252
253 regno = REGNO (*x);
254 if (REGNO_REG_SET_P (nonequal, regno))
255 return 1;
256 if (regno < FIRST_PSEUDO_REGISTER)
257 {
258 int n = HARD_REGNO_NREGS (regno, GET_MODE (*x));
259 while (--n > 0)
260 if (REGNO_REG_SET_P (nonequal, regno + n))
261 return 1;
262 }
263 }
264 return 0;
265}
8ecba28a
JH
266/* Attempt to prove that the basic block B will have no side effects and
267 allways continues in the same edge if reached via E. Return the edge
268 if exist, NULL otherwise. */
269
270static edge
271thread_jump (mode, e, b)
272 int mode;
273 edge e;
274 basic_block b;
275{
276 rtx set1, set2, cond1, cond2, insn;
277 enum rtx_code code1, code2, reversed_code2;
278 bool reverse1 = false;
279 int i;
280 regset nonequal;
281 bool failed = false;
282
1540f9eb
JH
283 if (BB_FLAGS (b) & BB_NONTHREADABLE_BLOCK)
284 return NULL;
285
8ecba28a
JH
286 /* At the moment, we do handle only conditional jumps, but later we may
287 want to extend this code to tablejumps and others. */
288 if (!e->src->succ->succ_next || e->src->succ->succ_next->succ_next)
289 return NULL;
290 if (!b->succ || !b->succ->succ_next || b->succ->succ_next->succ_next)
1540f9eb
JH
291 {
292 BB_SET_FLAG (b, BB_NONTHREADABLE_BLOCK);
293 return NULL;
294 }
8ecba28a
JH
295
296 /* Second branch must end with onlyjump, as we will eliminate the jump. */
1540f9eb 297 if (!any_condjump_p (e->src->end))
8ecba28a 298 return NULL;
1540f9eb
JH
299
300 if (!any_condjump_p (b->end) || !onlyjump_p (b->end))
301 {
302 BB_SET_FLAG (b, BB_NONTHREADABLE_BLOCK);
303 return NULL;
304 }
8ecba28a
JH
305
306 set1 = pc_set (e->src->end);
307 set2 = pc_set (b->end);
308 if (((e->flags & EDGE_FALLTHRU) != 0)
68f3f6f1 309 != (XEXP (SET_SRC (set1), 1) == pc_rtx))
8ecba28a
JH
310 reverse1 = true;
311
312 cond1 = XEXP (SET_SRC (set1), 0);
313 cond2 = XEXP (SET_SRC (set2), 0);
314 if (reverse1)
68f3f6f1 315 code1 = reversed_comparison_code (cond1, e->src->end);
8ecba28a
JH
316 else
317 code1 = GET_CODE (cond1);
318
319 code2 = GET_CODE (cond2);
320 reversed_code2 = reversed_comparison_code (cond2, b->end);
321
322 if (!comparison_dominates_p (code1, code2)
323 && !comparison_dominates_p (code1, reversed_code2))
324 return NULL;
325
326 /* Ensure that the comparison operators are equivalent.
327 ??? This is far too pesimistic. We should allow swapped operands,
328 different CCmodes, or for example comparisons for interval, that
329 dominate even when operands are not equivalent. */
330 if (!rtx_equal_p (XEXP (cond1, 0), XEXP (cond2, 0))
331 || !rtx_equal_p (XEXP (cond1, 1), XEXP (cond2, 1)))
332 return NULL;
333
334 /* Short circuit cases where block B contains some side effects, as we can't
335 safely bypass it. */
336 for (insn = NEXT_INSN (b->head); insn != NEXT_INSN (b->end);
337 insn = NEXT_INSN (insn))
338 if (INSN_P (insn) && side_effects_p (PATTERN (insn)))
1540f9eb
JH
339 {
340 BB_SET_FLAG (b, BB_NONTHREADABLE_BLOCK);
341 return NULL;
342 }
8ecba28a
JH
343
344 cselib_init ();
345
346 /* First process all values computed in the source basic block. */
347 for (insn = NEXT_INSN (e->src->head); insn != NEXT_INSN (e->src->end);
348 insn = NEXT_INSN (insn))
349 if (INSN_P (insn))
350 cselib_process_insn (insn);
351
352 nonequal = BITMAP_XMALLOC();
353 CLEAR_REG_SET (nonequal);
5f0d2358 354
8ecba28a
JH
355 /* Now assume that we've continued by the edge E to B and continue
356 processing as if it were same basic block.
8ecba28a 357 Our goal is to prove that whole block is an NOOP. */
5f0d2358 358
9f16e871 359 for (insn = NEXT_INSN (b->head); insn != NEXT_INSN (b->end) && !failed;
8ecba28a
JH
360 insn = NEXT_INSN (insn))
361 {
362 if (INSN_P (insn))
363 {
364 rtx pat = PATTERN (insn);
365
366 if (GET_CODE (pat) == PARALLEL)
367 {
368 for (i = 0; i < XVECLEN (pat, 0); i++)
369 failed |= mark_effect (XVECEXP (pat, 0, i), nonequal);
370 }
371 else
372 failed |= mark_effect (pat, nonequal);
373 }
5f0d2358 374
8ecba28a
JH
375 cselib_process_insn (insn);
376 }
377
378 /* Later we should clear nonequal of dead registers. So far we don't
379 have life information in cfg_cleanup. */
380 if (failed)
1540f9eb
JH
381 {
382 BB_SET_FLAG (b, BB_NONTHREADABLE_BLOCK);
383 goto failed_exit;
384 }
8ecba28a 385
fe477d8b
JH
386 /* cond2 must not mention any register that is not equal to the
387 former block. */
388 if (for_each_rtx (&cond2, mentions_nonequal_regs, nonequal))
389 goto failed_exit;
390
8ecba28a
JH
391 /* In case liveness information is available, we need to prove equivalence
392 only of the live values. */
393 if (mode & CLEANUP_UPDATE_LIFE)
394 AND_REG_SET (nonequal, b->global_live_at_end);
395
396 EXECUTE_IF_SET_IN_REG_SET (nonequal, 0, i, goto failed_exit;);
397
398 BITMAP_XFREE (nonequal);
399 cselib_finish ();
400 if ((comparison_dominates_p (code1, code2) != 0)
4deaa2f8 401 != (XEXP (SET_SRC (set2), 1) == pc_rtx))
8ecba28a
JH
402 return BRANCH_EDGE (b);
403 else
404 return FALLTHRU_EDGE (b);
405
406failed_exit:
407 BITMAP_XFREE (nonequal);
408 cselib_finish ();
409 return NULL;
410}
411\f
402209ff 412/* Attempt to forward edges leaving basic block B.
eaec9b3d 413 Return true if successful. */
402209ff
JH
414
415static bool
416try_forward_edges (mode, b)
417 basic_block b;
418 int mode;
419{
420 bool changed = false;
1c570418 421 edge e, next, *threaded_edges = NULL;
402209ff 422
5f0d2358 423 for (e = b->succ; e; e = next)
402209ff
JH
424 {
425 basic_block target, first;
426 int counter;
8ecba28a 427 bool threaded = false;
bcb3bc6d 428 int nthreaded_edges = 0;
402209ff
JH
429
430 next = e->succ_next;
431
432 /* Skip complex edges because we don't know how to update them.
433
eaec9b3d 434 Still handle fallthru edges, as we can succeed to forward fallthru
402209ff 435 edge to the same place as the branch edge of conditional branch
eaec9b3d 436 and turn conditional branch to an unconditional branch. */
402209ff
JH
437 if (e->flags & EDGE_COMPLEX)
438 continue;
439
440 target = first = e->dest;
441 counter = 0;
442
8ecba28a 443 while (counter < n_basic_blocks)
402209ff 444 {
8ecba28a
JH
445 basic_block new_target = NULL;
446 bool new_target_threaded = false;
447
448 if (FORWARDER_BLOCK_P (target)
449 && target->succ->dest != EXIT_BLOCK_PTR)
450 {
451 /* Bypass trivial infinite loops. */
452 if (target == target->succ->dest)
453 counter = n_basic_blocks;
454 new_target = target->succ->dest;
455 }
5f0d2358 456
8ecba28a
JH
457 /* Allow to thread only over one edge at time to simplify updating
458 of probabilities. */
1c570418 459 else if (mode & CLEANUP_THREADING)
8ecba28a 460 {
1c570418
JH
461 edge t = thread_jump (mode, e, target);
462 if (t)
8ecba28a 463 {
bcb3bc6d 464 if (!threaded_edges)
1c570418
JH
465 threaded_edges = xmalloc (sizeof (*threaded_edges)
466 * n_basic_blocks);
3b3b1e32
RH
467 else
468 {
469 int i;
470
471 /* Detect an infinite loop across blocks not
472 including the start block. */
473 for (i = 0; i < nthreaded_edges; ++i)
474 if (threaded_edges[i] == t)
475 break;
476 if (i < nthreaded_edges)
b90e45ae
JH
477 {
478 counter = n_basic_blocks;
479 break;
480 }
3b3b1e32
RH
481 }
482
483 /* Detect an infinite loop across the start block. */
484 if (t->dest == b)
485 break;
486
487 if (nthreaded_edges >= n_basic_blocks)
488 abort ();
1c570418 489 threaded_edges[nthreaded_edges++] = t;
3b3b1e32
RH
490
491 new_target = t->dest;
492 new_target_threaded = true;
8ecba28a
JH
493 }
494 }
5f0d2358 495
8ecba28a
JH
496 if (!new_target)
497 break;
402209ff
JH
498
499 /* Avoid killing of loop pre-headers, as it is the place loop
500 optimizer wants to hoist code to.
501
502 For fallthru forwarders, the LOOP_BEG note must appear between
503 the header of block and CODE_LABEL of the loop, for non forwarders
504 it must appear before the JUMP_INSN. */
505 if (mode & CLEANUP_PRE_LOOP)
506 {
507 rtx insn = (target->succ->flags & EDGE_FALLTHRU
508 ? target->head : prev_nonnote_insn (target->end));
509
510 if (GET_CODE (insn) != NOTE)
511 insn = NEXT_INSN (insn);
512
5f0d2358 513 for (; insn && GET_CODE (insn) != CODE_LABEL && !INSN_P (insn);
402209ff
JH
514 insn = NEXT_INSN (insn))
515 if (GET_CODE (insn) == NOTE
516 && NOTE_LINE_NUMBER (insn) == NOTE_INSN_LOOP_BEG)
517 break;
518
519 if (GET_CODE (insn) == NOTE)
520 break;
521 }
5f0d2358 522
8ecba28a
JH
523 counter++;
524 target = new_target;
525 threaded |= new_target_threaded;
526 }
402209ff
JH
527
528 if (counter >= n_basic_blocks)
529 {
530 if (rtl_dump_file)
531 fprintf (rtl_dump_file, "Infinite loop in BB %i.\n",
532 target->index);
533 }
534 else if (target == first)
535 ; /* We didn't do anything. */
536 else
537 {
538 /* Save the values now, as the edge may get removed. */
539 gcov_type edge_count = e->count;
540 int edge_probability = e->probability;
8ecba28a 541 int edge_frequency;
1c570418 542 int n = 0;
402209ff 543
6ee3c8e4
JJ
544 /* Don't force if target is exit block. */
545 if (threaded && target != EXIT_BLOCK_PTR)
402209ff 546 {
8ecba28a
JH
547 notice_new_block (redirect_edge_and_branch_force (e, target));
548 if (rtl_dump_file)
549 fprintf (rtl_dump_file, "Conditionals threaded.\n");
402209ff 550 }
8ecba28a 551 else if (!redirect_edge_and_branch (e, target))
402209ff
JH
552 {
553 if (rtl_dump_file)
5f0d2358
RK
554 fprintf (rtl_dump_file,
555 "Forwarding edge %i->%i to %i failed.\n",
402209ff 556 b->index, e->dest->index, target->index);
8ecba28a 557 continue;
402209ff 558 }
5f0d2358 559
8ecba28a
JH
560 /* We successfully forwarded the edge. Now update profile
561 data: for each edge we traversed in the chain, remove
562 the original edge's execution count. */
563 edge_frequency = ((edge_probability * b->frequency
564 + REG_BR_PROB_BASE / 2)
565 / REG_BR_PROB_BASE);
566
567 if (!FORWARDER_BLOCK_P (b) && forwarder_block_p (b))
568 BB_SET_FLAG (b, BB_FORWARDER_BLOCK);
8ecba28a
JH
569
570 do
571 {
572 edge t;
5f0d2358 573
8ecba28a 574 first->count -= edge_count;
b446e5a2
JH
575 if (first->count < 0)
576 first->count = 0;
8ecba28a 577 first->frequency -= edge_frequency;
b446e5a2
JH
578 if (first->frequency < 0)
579 first->frequency = 0;
8ecba28a 580 if (first->succ->succ_next)
3b3b1e32 581 {
bcb3bc6d
JH
582 edge e;
583 int prob;
3b3b1e32
RH
584 if (n >= nthreaded_edges)
585 abort ();
586 t = threaded_edges [n++];
bcb3bc6d
JH
587 if (t->src != first)
588 abort ();
589 if (first->frequency)
590 prob = edge_frequency * REG_BR_PROB_BASE / first->frequency;
591 else
592 prob = 0;
b446e5a2
JH
593 if (prob > t->probability)
594 prob = t->probability;
bcb3bc6d
JH
595 t->probability -= prob;
596 prob = REG_BR_PROB_BASE - prob;
b446e5a2 597 if (prob <= 0)
bcb3bc6d
JH
598 {
599 first->succ->probability = REG_BR_PROB_BASE;
600 first->succ->succ_next->probability = 0;
601 }
602 else
603 for (e = first->succ; e; e = e->succ_next)
604 e->probability = ((e->probability * REG_BR_PROB_BASE)
605 / (double) prob);
b446e5a2 606 update_br_prob_note (first);
3b3b1e32 607 }
8ecba28a 608 else
bcb3bc6d
JH
609 {
610 /* It is possible that as the result of
611 threading we've removed edge as it is
612 threaded to the fallthru edge. Avoid
613 getting out of sync. */
614 if (n < nthreaded_edges
615 && first == threaded_edges [n]->src)
616 n++;
617 t = first->succ;
618 }
5f0d2358 619
b446e5a2
JH
620 t->count -= edge_count;
621 if (t->count < 0)
622 t->count = 0;
8ecba28a
JH
623 first = t->dest;
624 }
625 while (first != target);
626
627 changed = true;
402209ff
JH
628 }
629 }
630
1c570418
JH
631 if (threaded_edges)
632 free (threaded_edges);
402209ff
JH
633 return changed;
634}
635\f
ec10f7c7
RH
636/* Return true if LABEL is a target of JUMP_INSN. This applies only
637 to non-complex jumps. That is, direct unconditional, conditional,
638 and tablejumps, but not computed jumps or returns. It also does
639 not apply to the fallthru case of a conditional jump. */
640
641static bool
642label_is_jump_target_p (label, jump_insn)
643 rtx label, jump_insn;
644{
645 rtx tmp = JUMP_LABEL (jump_insn);
646
647 if (label == tmp)
648 return true;
649
650 if (tmp != NULL_RTX
651 && (tmp = NEXT_INSN (tmp)) != NULL_RTX
652 && GET_CODE (tmp) == JUMP_INSN
653 && (tmp = PATTERN (tmp),
654 GET_CODE (tmp) == ADDR_VEC
655 || GET_CODE (tmp) == ADDR_DIFF_VEC))
656 {
657 rtvec vec = XVEC (tmp, GET_CODE (tmp) == ADDR_DIFF_VEC);
658 int i, veclen = GET_NUM_ELEM (vec);
659
660 for (i = 0; i < veclen; ++i)
661 if (XEXP (RTVEC_ELT (vec, i), 0) == label)
662 return true;
663 }
664
665 return false;
666}
667
4262e623
JH
668/* Return true if LABEL is used for tail recursion. */
669
670static bool
402209ff
JH
671tail_recursion_label_p (label)
672 rtx label;
673{
674 rtx x;
675
676 for (x = tail_recursion_label_list; x; x = XEXP (x, 1))
677 if (label == XEXP (x, 0))
4262e623 678 return true;
402209ff 679
4262e623 680 return false;
402209ff
JH
681}
682
683/* Blocks A and B are to be merged into a single block. A has no incoming
684 fallthru edge, so it can be moved before B without adding or modifying
685 any jumps (aside from the jump from A to B). */
686
4262e623 687static void
402209ff
JH
688merge_blocks_move_predecessor_nojumps (a, b)
689 basic_block a, b;
690{
691 rtx barrier;
692 int index;
693
694 barrier = next_nonnote_insn (a->end);
695 if (GET_CODE (barrier) != BARRIER)
696 abort ();
53c17031 697 delete_insn (barrier);
402209ff
JH
698
699 /* Move block and loop notes out of the chain so that we do not
700 disturb their order.
701
702 ??? A better solution would be to squeeze out all the non-nested notes
703 and adjust the block trees appropriately. Even better would be to have
704 a tighter connection between block trees and rtl so that this is not
705 necessary. */
2b7d71b2
JJ
706 if (squeeze_notes (&a->head, &a->end))
707 abort ();
402209ff
JH
708
709 /* Scramble the insn chain. */
710 if (a->end != PREV_INSN (b->head))
3c030e88 711 reorder_insns_nobb (a->head, a->end, PREV_INSN (b->head));
38c1593d 712 a->flags |= BB_DIRTY;
402209ff
JH
713
714 if (rtl_dump_file)
5f0d2358
RK
715 fprintf (rtl_dump_file, "Moved block %d before %d and merged.\n",
716 a->index, b->index);
402209ff
JH
717
718 /* Swap the records for the two blocks around. Although we are deleting B,
719 A is now where B was and we want to compact the BB array from where
720 A used to be. */
721 BASIC_BLOCK (a->index) = b;
722 BASIC_BLOCK (b->index) = a;
723 index = a->index;
724 a->index = b->index;
725 b->index = index;
726
727 /* Now blocks A and B are contiguous. Merge them. */
728 merge_blocks_nomove (a, b);
402209ff
JH
729}
730
731/* Blocks A and B are to be merged into a single block. B has no outgoing
732 fallthru edge, so it can be moved after A without adding or modifying
733 any jumps (aside from the jump from A to B). */
734
4262e623 735static void
402209ff
JH
736merge_blocks_move_successor_nojumps (a, b)
737 basic_block a, b;
738{
f62ce55b 739 rtx barrier, real_b_end;
402209ff 740
f62ce55b 741 real_b_end = b->end;
402209ff
JH
742 barrier = NEXT_INSN (b->end);
743
744 /* Recognize a jump table following block B. */
745 if (barrier
746 && GET_CODE (barrier) == CODE_LABEL
747 && NEXT_INSN (barrier)
748 && GET_CODE (NEXT_INSN (barrier)) == JUMP_INSN
749 && (GET_CODE (PATTERN (NEXT_INSN (barrier))) == ADDR_VEC
750 || GET_CODE (PATTERN (NEXT_INSN (barrier))) == ADDR_DIFF_VEC))
751 {
f62ce55b
RE
752 /* Temporarily add the table jump insn to b, so that it will also
753 be moved to the correct location. */
402209ff
JH
754 b->end = NEXT_INSN (barrier);
755 barrier = NEXT_INSN (b->end);
756 }
757
758 /* There had better have been a barrier there. Delete it. */
759 if (barrier && GET_CODE (barrier) == BARRIER)
53c17031 760 delete_insn (barrier);
402209ff
JH
761
762 /* Move block and loop notes out of the chain so that we do not
763 disturb their order.
764
765 ??? A better solution would be to squeeze out all the non-nested notes
766 and adjust the block trees appropriately. Even better would be to have
767 a tighter connection between block trees and rtl so that this is not
768 necessary. */
2b7d71b2
JJ
769 if (squeeze_notes (&b->head, &b->end))
770 abort ();
402209ff
JH
771
772 /* Scramble the insn chain. */
3c030e88 773 reorder_insns_nobb (b->head, b->end, a->end);
402209ff 774
f62ce55b
RE
775 /* Restore the real end of b. */
776 b->end = real_b_end;
777
402209ff
JH
778 /* Now blocks A and B are contiguous. Merge them. */
779 merge_blocks_nomove (a, b);
780
781 if (rtl_dump_file)
5f0d2358
RK
782 fprintf (rtl_dump_file, "Moved block %d after %d and merged.\n",
783 b->index, a->index);
402209ff
JH
784}
785
786/* Attempt to merge basic blocks that are potentially non-adjacent.
787 Return true iff the attempt succeeded. */
788
4262e623 789static bool
402209ff
JH
790merge_blocks (e, b, c, mode)
791 edge e;
792 basic_block b, c;
793 int mode;
794{
795 /* If C has a tail recursion label, do not merge. There is no
796 edge recorded from the call_placeholder back to this label, as
797 that would make optimize_sibling_and_tail_recursive_calls more
798 complex for no gain. */
4262e623
JH
799 if ((mode & CLEANUP_PRE_SIBCALL)
800 && GET_CODE (c->head) == CODE_LABEL
402209ff 801 && tail_recursion_label_p (c->head))
4262e623 802 return false;
402209ff
JH
803
804 /* If B has a fallthru edge to C, no need to move anything. */
805 if (e->flags & EDGE_FALLTHRU)
806 {
b446e5a2 807 int b_index = b->index, c_index = c->index;
402209ff 808 merge_blocks_nomove (b, c);
635559ab 809 update_forwarder_flag (b);
402209ff
JH
810
811 if (rtl_dump_file)
5f0d2358 812 fprintf (rtl_dump_file, "Merged %d and %d without moving.\n",
b446e5a2 813 b_index, c_index);
402209ff 814
4262e623 815 return true;
402209ff 816 }
5f0d2358 817
402209ff
JH
818 /* Otherwise we will need to move code around. Do that only if expensive
819 transformations are allowed. */
820 else if (mode & CLEANUP_EXPENSIVE)
821 {
4262e623
JH
822 edge tmp_edge, b_fallthru_edge;
823 bool c_has_outgoing_fallthru;
824 bool b_has_incoming_fallthru;
402209ff
JH
825
826 /* Avoid overactive code motion, as the forwarder blocks should be
827 eliminated by edge redirection instead. One exception might have
828 been if B is a forwarder block and C has no fallthru edge, but
829 that should be cleaned up by bb-reorder instead. */
635559ab 830 if (FORWARDER_BLOCK_P (b) || FORWARDER_BLOCK_P (c))
4262e623 831 return false;
402209ff
JH
832
833 /* We must make sure to not munge nesting of lexical blocks,
834 and loop notes. This is done by squeezing out all the notes
835 and leaving them there to lie. Not ideal, but functional. */
836
837 for (tmp_edge = c->succ; tmp_edge; tmp_edge = tmp_edge->succ_next)
838 if (tmp_edge->flags & EDGE_FALLTHRU)
839 break;
5f0d2358 840
402209ff 841 c_has_outgoing_fallthru = (tmp_edge != NULL);
402209ff
JH
842
843 for (tmp_edge = b->pred; tmp_edge; tmp_edge = tmp_edge->pred_next)
844 if (tmp_edge->flags & EDGE_FALLTHRU)
845 break;
5f0d2358 846
402209ff 847 b_has_incoming_fallthru = (tmp_edge != NULL);
4262e623
JH
848 b_fallthru_edge = tmp_edge;
849
850 /* Otherwise, we're going to try to move C after B. If C does
851 not have an outgoing fallthru, then it can be moved
852 immediately after B without introducing or modifying jumps. */
853 if (! c_has_outgoing_fallthru)
854 {
855 merge_blocks_move_successor_nojumps (b, c);
856 return true;
857 }
402209ff
JH
858
859 /* If B does not have an incoming fallthru, then it can be moved
860 immediately before C without introducing or modifying jumps.
861 C cannot be the first block, so we do not have to worry about
862 accessing a non-existent block. */
402209ff 863
4262e623
JH
864 if (b_has_incoming_fallthru)
865 {
473fb060 866 basic_block bb;
5f0d2358 867
4262e623
JH
868 if (b_fallthru_edge->src == ENTRY_BLOCK_PTR)
869 return false;
7dddfb65
JH
870 bb = force_nonfallthru (b_fallthru_edge);
871 if (bb)
872 notice_new_block (bb);
4262e623 873 }
5f0d2358 874
4262e623
JH
875 merge_blocks_move_predecessor_nojumps (b, c);
876 return true;
402209ff 877 }
5f0d2358 878
4262e623 879 return false;
402209ff
JH
880}
881\f
0dd0e980
JH
882
883/* Return true if I1 and I2 are equivalent and thus can be crossjumped. */
884
885static bool
886insns_match_p (mode, i1, i2)
88f92c0f 887 int mode ATTRIBUTE_UNUSED;
0dd0e980
JH
888 rtx i1, i2;
889{
890 rtx p1, p2;
891
892 /* Verify that I1 and I2 are equivalent. */
893 if (GET_CODE (i1) != GET_CODE (i2))
894 return false;
895
896 p1 = PATTERN (i1);
897 p2 = PATTERN (i2);
898
899 if (GET_CODE (p1) != GET_CODE (p2))
900 return false;
901
902 /* If this is a CALL_INSN, compare register usage information.
903 If we don't check this on stack register machines, the two
904 CALL_INSNs might be merged leaving reg-stack.c with mismatching
905 numbers of stack registers in the same basic block.
906 If we don't check this on machines with delay slots, a delay slot may
907 be filled that clobbers a parameter expected by the subroutine.
908
909 ??? We take the simple route for now and assume that if they're
910 equal, they were constructed identically. */
911
912 if (GET_CODE (i1) == CALL_INSN
913 && !rtx_equal_p (CALL_INSN_FUNCTION_USAGE (i1),
914 CALL_INSN_FUNCTION_USAGE (i2)))
915 return false;
916
917#ifdef STACK_REGS
918 /* If cross_jump_death_matters is not 0, the insn's mode
919 indicates whether or not the insn contains any stack-like
920 regs. */
921
922 if ((mode & CLEANUP_POST_REGSTACK) && stack_regs_mentioned (i1))
923 {
924 /* If register stack conversion has already been done, then
925 death notes must also be compared before it is certain that
926 the two instruction streams match. */
927
928 rtx note;
929 HARD_REG_SET i1_regset, i2_regset;
930
931 CLEAR_HARD_REG_SET (i1_regset);
932 CLEAR_HARD_REG_SET (i2_regset);
933
934 for (note = REG_NOTES (i1); note; note = XEXP (note, 1))
935 if (REG_NOTE_KIND (note) == REG_DEAD && STACK_REG_P (XEXP (note, 0)))
936 SET_HARD_REG_BIT (i1_regset, REGNO (XEXP (note, 0)));
937
938 for (note = REG_NOTES (i2); note; note = XEXP (note, 1))
939 if (REG_NOTE_KIND (note) == REG_DEAD && STACK_REG_P (XEXP (note, 0)))
940 SET_HARD_REG_BIT (i2_regset, REGNO (XEXP (note, 0)));
941
942 GO_IF_HARD_REG_EQUAL (i1_regset, i2_regset, done);
943
944 return false;
945
946 done:
947 ;
948 }
949#endif
950
951 if (reload_completed
952 ? ! rtx_renumbered_equal_p (p1, p2) : ! rtx_equal_p (p1, p2))
953 {
954 /* The following code helps take care of G++ cleanups. */
955 rtx equiv1 = find_reg_equal_equiv_note (i1);
956 rtx equiv2 = find_reg_equal_equiv_note (i2);
957
958 if (equiv1 && equiv2
959 /* If the equivalences are not to a constant, they may
960 reference pseudos that no longer exist, so we can't
961 use them. */
962 && (! reload_completed
963 || (CONSTANT_P (XEXP (equiv1, 0))
964 && rtx_equal_p (XEXP (equiv1, 0), XEXP (equiv2, 0)))))
965 {
966 rtx s1 = single_set (i1);
967 rtx s2 = single_set (i2);
968 if (s1 != 0 && s2 != 0
969 && rtx_renumbered_equal_p (SET_DEST (s1), SET_DEST (s2)))
970 {
971 validate_change (i1, &SET_SRC (s1), XEXP (equiv1, 0), 1);
972 validate_change (i2, &SET_SRC (s2), XEXP (equiv2, 0), 1);
973 if (! rtx_renumbered_equal_p (p1, p2))
974 cancel_changes (0);
975 else if (apply_change_group ())
976 return true;
977 }
978 }
5f0d2358 979
0dd0e980
JH
980 return false;
981 }
5f0d2358 982
0dd0e980
JH
983 return true;
984}
985\f
402209ff
JH
986/* Look through the insns at the end of BB1 and BB2 and find the longest
987 sequence that are equivalent. Store the first insns for that sequence
988 in *F1 and *F2 and return the sequence length.
989
990 To simplify callers of this function, if the blocks match exactly,
991 store the head of the blocks in *F1 and *F2. */
992
993static int
994flow_find_cross_jump (mode, bb1, bb2, f1, f2)
995 int mode ATTRIBUTE_UNUSED;
996 basic_block bb1, bb2;
997 rtx *f1, *f2;
998{
0dd0e980 999 rtx i1, i2, last1, last2, afterlast1, afterlast2;
402209ff
JH
1000 int ninsns = 0;
1001
1002 /* Skip simple jumps at the end of the blocks. Complex jumps still
1003 need to be compared for equivalence, which we'll do below. */
1004
1005 i1 = bb1->end;
08f7f057 1006 last1 = afterlast1 = last2 = afterlast2 = NULL_RTX;
402209ff
JH
1007 if (onlyjump_p (i1)
1008 || (returnjump_p (i1) && !side_effects_p (PATTERN (i1))))
08f7f057
JH
1009 {
1010 last1 = i1;
08f7f057
JH
1011 i1 = PREV_INSN (i1);
1012 }
5f0d2358 1013
402209ff
JH
1014 i2 = bb2->end;
1015 if (onlyjump_p (i2)
1016 || (returnjump_p (i2) && !side_effects_p (PATTERN (i2))))
08f7f057
JH
1017 {
1018 last2 = i2;
d1ee6d9b
JH
1019 /* Count everything except for unconditional jump as insn. */
1020 if (!simplejump_p (i2) && !returnjump_p (i2) && last1)
1021 ninsns++;
08f7f057
JH
1022 i2 = PREV_INSN (i2);
1023 }
402209ff 1024
402209ff
JH
1025 while (true)
1026 {
1027 /* Ignore notes. */
08f7f057 1028 while (!active_insn_p (i1) && i1 != bb1->head)
402209ff 1029 i1 = PREV_INSN (i1);
5f0d2358 1030
08f7f057 1031 while (!active_insn_p (i2) && i2 != bb2->head)
402209ff
JH
1032 i2 = PREV_INSN (i2);
1033
1034 if (i1 == bb1->head || i2 == bb2->head)
1035 break;
1036
0dd0e980 1037 if (!insns_match_p (mode, i1, i2))
402209ff
JH
1038 break;
1039
402209ff 1040 /* Don't begin a cross-jump with a USE or CLOBBER insn. */
0dd0e980 1041 if (active_insn_p (i1))
402209ff 1042 {
7106d491
RE
1043 /* If the merged insns have different REG_EQUAL notes, then
1044 remove them. */
1045 rtx equiv1 = find_reg_equal_equiv_note (i1);
1046 rtx equiv2 = find_reg_equal_equiv_note (i2);
1047
1048 if (equiv1 && !equiv2)
1049 remove_note (i1, equiv1);
1050 else if (!equiv1 && equiv2)
1051 remove_note (i2, equiv2);
1052 else if (equiv1 && equiv2
1053 && !rtx_equal_p (XEXP (equiv1, 0), XEXP (equiv2, 0)))
1054 {
1055 remove_note (i1, equiv1);
1056 remove_note (i2, equiv2);
1057 }
1058
402209ff
JH
1059 afterlast1 = last1, afterlast2 = last2;
1060 last1 = i1, last2 = i2;
1061 ninsns++;
1062 }
5f0d2358 1063
402209ff
JH
1064 i1 = PREV_INSN (i1);
1065 i2 = PREV_INSN (i2);
1066 }
1067
1068#ifdef HAVE_cc0
5f0d2358
RK
1069 /* Don't allow the insn after a compare to be shared by
1070 cross-jumping unless the compare is also shared. */
1071 if (ninsns && reg_mentioned_p (cc0_rtx, last1) && ! sets_cc0_p (last1))
1072 last1 = afterlast1, last2 = afterlast2, ninsns--;
402209ff
JH
1073#endif
1074
eaec9b3d 1075 /* Include preceding notes and labels in the cross-jump. One,
402209ff
JH
1076 this may bring us to the head of the blocks as requested above.
1077 Two, it keeps line number notes as matched as may be. */
1078 if (ninsns)
1079 {
08f7f057 1080 while (last1 != bb1->head && !active_insn_p (PREV_INSN (last1)))
402209ff 1081 last1 = PREV_INSN (last1);
5f0d2358 1082
402209ff
JH
1083 if (last1 != bb1->head && GET_CODE (PREV_INSN (last1)) == CODE_LABEL)
1084 last1 = PREV_INSN (last1);
5f0d2358 1085
08f7f057 1086 while (last2 != bb2->head && !active_insn_p (PREV_INSN (last2)))
402209ff 1087 last2 = PREV_INSN (last2);
5f0d2358 1088
402209ff
JH
1089 if (last2 != bb2->head && GET_CODE (PREV_INSN (last2)) == CODE_LABEL)
1090 last2 = PREV_INSN (last2);
1091
1092 *f1 = last1;
1093 *f2 = last2;
1094 }
1095
1096 return ninsns;
1097}
1098
1099/* Return true iff outgoing edges of BB1 and BB2 match, together with
1100 the branch instruction. This means that if we commonize the control
1101 flow before end of the basic block, the semantic remains unchanged.
1102
1103 We may assume that there exists one edge with a common destination. */
1104
1105static bool
0dd0e980
JH
1106outgoing_edges_match (mode, bb1, bb2)
1107 int mode;
402209ff
JH
1108 basic_block bb1;
1109 basic_block bb2;
1110{
0dd0e980
JH
1111 int nehedges1 = 0, nehedges2 = 0;
1112 edge fallthru1 = 0, fallthru2 = 0;
1113 edge e1, e2;
1114
c04cf67b
RH
1115 /* If BB1 has only one successor, we may be looking at either an
1116 unconditional jump, or a fake edge to exit. */
d1ee6d9b
JH
1117 if (bb1->succ && !bb1->succ->succ_next
1118 && !(bb1->succ->flags & (EDGE_COMPLEX | EDGE_FAKE)))
5f0d2358
RK
1119 return (bb2->succ && !bb2->succ->succ_next
1120 && (bb2->succ->flags & (EDGE_COMPLEX | EDGE_FAKE)) == 0);
402209ff
JH
1121
1122 /* Match conditional jumps - this may get tricky when fallthru and branch
1123 edges are crossed. */
1124 if (bb1->succ
1125 && bb1->succ->succ_next
1126 && !bb1->succ->succ_next->succ_next
d1ee6d9b
JH
1127 && any_condjump_p (bb1->end)
1128 && onlyjump_p (bb1->end))
402209ff
JH
1129 {
1130 edge b1, f1, b2, f2;
1131 bool reverse, match;
1132 rtx set1, set2, cond1, cond2;
1133 enum rtx_code code1, code2;
1134
1135 if (!bb2->succ
1136 || !bb2->succ->succ_next
0a2ed1f1 1137 || bb2->succ->succ_next->succ_next
d1ee6d9b 1138 || !any_condjump_p (bb2->end)
0a2ed1f1
JH
1139 || !onlyjump_p (bb2->end))
1140 return false;
1141
1142 /* Do not crossjump across loop boundaries. This is a temporary
1143 workaround for the common scenario in which crossjumping results
1144 in killing the duplicated loop condition, making bb-reorder rotate
1145 the loop incorectly, leaving an extra unconditional jump inside
1146 the loop.
1147
1148 This check should go away once bb-reorder knows how to duplicate
1149 code in this case or rotate the loops to avoid this scenario. */
1150 if (bb1->loop_depth != bb2->loop_depth)
402209ff
JH
1151 return false;
1152
1153 b1 = BRANCH_EDGE (bb1);
1154 b2 = BRANCH_EDGE (bb2);
1155 f1 = FALLTHRU_EDGE (bb1);
1156 f2 = FALLTHRU_EDGE (bb2);
1157
1158 /* Get around possible forwarders on fallthru edges. Other cases
1159 should be optimized out already. */
635559ab 1160 if (FORWARDER_BLOCK_P (f1->dest))
402209ff 1161 f1 = f1->dest->succ;
5f0d2358 1162
635559ab 1163 if (FORWARDER_BLOCK_P (f2->dest))
402209ff
JH
1164 f2 = f2->dest->succ;
1165
1166 /* To simplify use of this function, return false if there are
1167 unneeded forwarder blocks. These will get eliminated later
1168 during cleanup_cfg. */
635559ab
JH
1169 if (FORWARDER_BLOCK_P (f1->dest)
1170 || FORWARDER_BLOCK_P (f2->dest)
1171 || FORWARDER_BLOCK_P (b1->dest)
1172 || FORWARDER_BLOCK_P (b2->dest))
402209ff
JH
1173 return false;
1174
1175 if (f1->dest == f2->dest && b1->dest == b2->dest)
1176 reverse = false;
1177 else if (f1->dest == b2->dest && b1->dest == f2->dest)
1178 reverse = true;
1179 else
1180 return false;
1181
1182 set1 = pc_set (bb1->end);
1183 set2 = pc_set (bb2->end);
1184 if ((XEXP (SET_SRC (set1), 1) == pc_rtx)
1185 != (XEXP (SET_SRC (set2), 1) == pc_rtx))
1186 reverse = !reverse;
1187
1188 cond1 = XEXP (SET_SRC (set1), 0);
1189 cond2 = XEXP (SET_SRC (set2), 0);
1190 code1 = GET_CODE (cond1);
1191 if (reverse)
1192 code2 = reversed_comparison_code (cond2, bb2->end);
1193 else
1194 code2 = GET_CODE (cond2);
5f0d2358 1195
402209ff
JH
1196 if (code2 == UNKNOWN)
1197 return false;
1198
1199 /* Verify codes and operands match. */
1200 match = ((code1 == code2
1201 && rtx_renumbered_equal_p (XEXP (cond1, 0), XEXP (cond2, 0))
1202 && rtx_renumbered_equal_p (XEXP (cond1, 1), XEXP (cond2, 1)))
1203 || (code1 == swap_condition (code2)
1204 && rtx_renumbered_equal_p (XEXP (cond1, 1),
1205 XEXP (cond2, 0))
1206 && rtx_renumbered_equal_p (XEXP (cond1, 0),
1207 XEXP (cond2, 1))));
1208
1209 /* If we return true, we will join the blocks. Which means that
1210 we will only have one branch prediction bit to work with. Thus
1211 we require the existing branches to have probabilities that are
1212 roughly similar. */
b446e5a2
JH
1213 if (match
1214 && !optimize_size
1215 && bb1->frequency > BB_FREQ_MAX / 1000
1216 && bb2->frequency > BB_FREQ_MAX / 1000)
402209ff 1217 {
b446e5a2 1218 int prob2;
5f0d2358 1219
b446e5a2
JH
1220 if (b1->dest == b2->dest)
1221 prob2 = b2->probability;
1222 else
1223 /* Do not use f2 probability as f2 may be forwarded. */
1224 prob2 = REG_BR_PROB_BASE - b2->probability;
402209ff 1225
0a2ed1f1
JH
1226 /* Fail if the difference in probabilities is greater than 50%.
1227 This rules out two well-predicted branches with opposite
1228 outcomes. */
7225b8ec 1229 if (abs (b1->probability - prob2) > REG_BR_PROB_BASE / 2)
402209ff 1230 {
b446e5a2
JH
1231 if (rtl_dump_file)
1232 fprintf (rtl_dump_file,
1233 "Outcomes of branch in bb %i and %i differs to much (%i %i)\n",
1234 bb1->index, bb2->index, b1->probability, prob2);
5f0d2358 1235
b446e5a2
JH
1236 return false;
1237 }
402209ff
JH
1238 }
1239
1240 if (rtl_dump_file && match)
1241 fprintf (rtl_dump_file, "Conditionals in bb %i and %i match.\n",
1242 bb1->index, bb2->index);
1243
1244 return match;
1245 }
1246
0dd0e980
JH
1247 /* Generic case - we are seeing an computed jump, table jump or trapping
1248 instruction. */
1249
1250 /* First ensure that the instructions match. There may be many outgoing
1251 edges so this test is generally cheaper.
1252 ??? Currently the tablejumps will never match, as they do have
1253 different tables. */
1254 if (!insns_match_p (mode, bb1->end, bb2->end))
1255 return false;
1256
1257 /* Search the outgoing edges, ensure that the counts do match, find possible
1258 fallthru and exception handling edges since these needs more
1259 validation. */
1260 for (e1 = bb1->succ, e2 = bb2->succ; e1 && e2;
1261 e1 = e1->succ_next, e2 = e2->succ_next)
1262 {
1263 if (e1->flags & EDGE_EH)
1264 nehedges1++;
5f0d2358 1265
0dd0e980
JH
1266 if (e2->flags & EDGE_EH)
1267 nehedges2++;
5f0d2358 1268
0dd0e980
JH
1269 if (e1->flags & EDGE_FALLTHRU)
1270 fallthru1 = e1;
1271 if (e2->flags & EDGE_FALLTHRU)
1272 fallthru2 = e2;
1273 }
5f0d2358 1274
0dd0e980 1275 /* If number of edges of various types does not match, fail. */
5f0d2358
RK
1276 if (e1 || e2
1277 || nehedges1 != nehedges2
1278 || (fallthru1 != 0) != (fallthru2 != 0))
0dd0e980
JH
1279 return false;
1280
1281 /* fallthru edges must be forwarded to the same destination. */
1282 if (fallthru1)
1283 {
1284 basic_block d1 = (forwarder_block_p (fallthru1->dest)
1285 ? fallthru1->dest->succ->dest: fallthru1->dest);
1286 basic_block d2 = (forwarder_block_p (fallthru2->dest)
1287 ? fallthru2->dest->succ->dest: fallthru2->dest);
5f0d2358 1288
0dd0e980
JH
1289 if (d1 != d2)
1290 return false;
1291 }
5f0d2358 1292
0dd0e980
JH
1293 /* In case we do have EH edges, ensure we are in the same region. */
1294 if (nehedges1)
1295 {
1296 rtx n1 = find_reg_note (bb1->end, REG_EH_REGION, 0);
1297 rtx n2 = find_reg_note (bb2->end, REG_EH_REGION, 0);
5f0d2358 1298
0dd0e980
JH
1299 if (XEXP (n1, 0) != XEXP (n2, 0))
1300 return false;
1301 }
5f0d2358 1302
0dd0e980
JH
1303 /* We don't need to match the rest of edges as above checks should be enought
1304 to ensure that they are equivalent. */
1305 return true;
402209ff
JH
1306}
1307
1308/* E1 and E2 are edges with the same destination block. Search their
1309 predecessors for common code. If found, redirect control flow from
1310 (maybe the middle of) E1->SRC to (maybe the middle of) E2->SRC. */
1311
1312static bool
1313try_crossjump_to_edge (mode, e1, e2)
1314 int mode;
1315 edge e1, e2;
1316{
1317 int nmatch;
1318 basic_block src1 = e1->src, src2 = e2->src;
1319 basic_block redirect_to;
1320 rtx newpos1, newpos2;
1321 edge s;
1322 rtx last;
1323 rtx label;
402209ff
JH
1324
1325 /* Search backward through forwarder blocks. We don't need to worry
1326 about multiple entry or chained forwarders, as they will be optimized
1327 away. We do this to look past the unconditional jump following a
1328 conditional jump that is required due to the current CFG shape. */
1329 if (src1->pred
1330 && !src1->pred->pred_next
635559ab 1331 && FORWARDER_BLOCK_P (src1))
5f0d2358
RK
1332 e1 = src1->pred, src1 = e1->src;
1333
402209ff
JH
1334 if (src2->pred
1335 && !src2->pred->pred_next
635559ab 1336 && FORWARDER_BLOCK_P (src2))
5f0d2358 1337 e2 = src2->pred, src2 = e2->src;
402209ff
JH
1338
1339 /* Nothing to do if we reach ENTRY, or a common source block. */
1340 if (src1 == ENTRY_BLOCK_PTR || src2 == ENTRY_BLOCK_PTR)
1341 return false;
1342 if (src1 == src2)
1343 return false;
1344
1345 /* Seeing more than 1 forwarder blocks would confuse us later... */
635559ab
JH
1346 if (FORWARDER_BLOCK_P (e1->dest)
1347 && FORWARDER_BLOCK_P (e1->dest->succ->dest))
402209ff 1348 return false;
5f0d2358 1349
635559ab
JH
1350 if (FORWARDER_BLOCK_P (e2->dest)
1351 && FORWARDER_BLOCK_P (e2->dest->succ->dest))
402209ff
JH
1352 return false;
1353
1354 /* Likewise with dead code (possibly newly created by the other optimizations
1355 of cfg_cleanup). */
1356 if (!src1->pred || !src2->pred)
1357 return false;
1358
402209ff 1359 /* Look for the common insn sequence, part the first ... */
0dd0e980 1360 if (!outgoing_edges_match (mode, src1, src2))
402209ff
JH
1361 return false;
1362
1363 /* ... and part the second. */
1364 nmatch = flow_find_cross_jump (mode, src1, src2, &newpos1, &newpos2);
1365 if (!nmatch)
1366 return false;
1367
1368 /* Avoid splitting if possible. */
1369 if (newpos2 == src2->head)
1370 redirect_to = src2;
1371 else
1372 {
1373 if (rtl_dump_file)
1374 fprintf (rtl_dump_file, "Splitting bb %i before %i insns\n",
1375 src2->index, nmatch);
1376 redirect_to = split_block (src2, PREV_INSN (newpos2))->dest;
1377 }
1378
1379 if (rtl_dump_file)
1380 fprintf (rtl_dump_file,
1381 "Cross jumping from bb %i to bb %i; %i common insns\n",
1382 src1->index, src2->index, nmatch);
1383
1384 redirect_to->count += src1->count;
1385 redirect_to->frequency += src1->frequency;
2ca6672b
JH
1386 /* We may have some registers visible trought the block. */
1387 redirect_to->flags |= BB_DIRTY;
402209ff
JH
1388
1389 /* Recompute the frequencies and counts of outgoing edges. */
1390 for (s = redirect_to->succ; s; s = s->succ_next)
1391 {
1392 edge s2;
1393 basic_block d = s->dest;
1394
635559ab 1395 if (FORWARDER_BLOCK_P (d))
402209ff 1396 d = d->succ->dest;
5f0d2358 1397
402209ff
JH
1398 for (s2 = src1->succ; ; s2 = s2->succ_next)
1399 {
1400 basic_block d2 = s2->dest;
635559ab 1401 if (FORWARDER_BLOCK_P (d2))
402209ff
JH
1402 d2 = d2->succ->dest;
1403 if (d == d2)
1404 break;
1405 }
5f0d2358 1406
402209ff
JH
1407 s->count += s2->count;
1408
1409 /* Take care to update possible forwarder blocks. We verified
1410 that there is no more than one in the chain, so we can't run
1411 into infinite loop. */
635559ab 1412 if (FORWARDER_BLOCK_P (s->dest))
402209ff
JH
1413 {
1414 s->dest->succ->count += s2->count;
1415 s->dest->count += s2->count;
1416 s->dest->frequency += EDGE_FREQUENCY (s);
1417 }
5f0d2358 1418
635559ab 1419 if (FORWARDER_BLOCK_P (s2->dest))
402209ff
JH
1420 {
1421 s2->dest->succ->count -= s2->count;
b446e5a2
JH
1422 if (s2->dest->succ->count < 0)
1423 s2->dest->succ->count = 0;
402209ff
JH
1424 s2->dest->count -= s2->count;
1425 s2->dest->frequency -= EDGE_FREQUENCY (s);
b446e5a2
JH
1426 if (s2->dest->frequency < 0)
1427 s2->dest->frequency = 0;
1428 if (s2->dest->count < 0)
1429 s2->dest->count = 0;
402209ff 1430 }
5f0d2358 1431
402209ff
JH
1432 if (!redirect_to->frequency && !src1->frequency)
1433 s->probability = (s->probability + s2->probability) / 2;
1434 else
5f0d2358
RK
1435 s->probability
1436 = ((s->probability * redirect_to->frequency +
1437 s2->probability * src1->frequency)
1438 / (redirect_to->frequency + src1->frequency));
402209ff
JH
1439 }
1440
b446e5a2 1441 update_br_prob_note (redirect_to);
402209ff
JH
1442
1443 /* Edit SRC1 to go to REDIRECT_TO at NEWPOS1. */
1444
1445 /* Skip possible basic block header. */
1446 if (GET_CODE (newpos1) == CODE_LABEL)
1447 newpos1 = NEXT_INSN (newpos1);
5f0d2358 1448
402209ff
JH
1449 if (GET_CODE (newpos1) == NOTE)
1450 newpos1 = NEXT_INSN (newpos1);
1451 last = src1->end;
1452
6d2f8887 1453 /* Emit the jump insn. */
402209ff 1454 label = block_label (redirect_to);
53c17031 1455 emit_jump_insn_after (gen_jump (label), src1->end);
402209ff
JH
1456 JUMP_LABEL (src1->end) = label;
1457 LABEL_NUSES (label)++;
402209ff
JH
1458
1459 /* Delete the now unreachable instructions. */
53c17031 1460 delete_insn_chain (newpos1, last);
402209ff
JH
1461
1462 /* Make sure there is a barrier after the new jump. */
1463 last = next_nonnote_insn (src1->end);
1464 if (!last || GET_CODE (last) != BARRIER)
1465 emit_barrier_after (src1->end);
1466
1467 /* Update CFG. */
1468 while (src1->succ)
1469 remove_edge (src1->succ);
7ded4467 1470 make_single_succ_edge (src1, redirect_to, 0);
402209ff 1471
635559ab
JH
1472 update_forwarder_flag (src1);
1473
402209ff
JH
1474 return true;
1475}
1476
1477/* Search the predecessors of BB for common insn sequences. When found,
1478 share code between them by redirecting control flow. Return true if
1479 any changes made. */
1480
1481static bool
1482try_crossjump_bb (mode, bb)
1483 int mode;
1484 basic_block bb;
1485{
1486 edge e, e2, nexte2, nexte, fallthru;
1487 bool changed;
f5eb5fd0 1488 int n = 0;
402209ff 1489
f63d1bf7 1490 /* Nothing to do if there is not at least two incoming edges. */
402209ff
JH
1491 if (!bb->pred || !bb->pred->pred_next)
1492 return false;
1493
1494 /* It is always cheapest to redirect a block that ends in a branch to
1495 a block that falls through into BB, as that adds no branches to the
1496 program. We'll try that combination first. */
f5eb5fd0
JH
1497 for (fallthru = bb->pred; fallthru; fallthru = fallthru->pred_next, n++)
1498 {
1499 if (fallthru->flags & EDGE_FALLTHRU)
1500 break;
1501 if (n > 100)
1502 return false;
1503 }
402209ff
JH
1504
1505 changed = false;
1506 for (e = bb->pred; e; e = nexte)
1507 {
1508 nexte = e->pred_next;
1509
402209ff
JH
1510 /* As noted above, first try with the fallthru predecessor. */
1511 if (fallthru)
1512 {
1513 /* Don't combine the fallthru edge into anything else.
1514 If there is a match, we'll do it the other way around. */
1515 if (e == fallthru)
1516 continue;
1517
1518 if (try_crossjump_to_edge (mode, e, fallthru))
1519 {
1520 changed = true;
1521 nexte = bb->pred;
1522 continue;
1523 }
1524 }
1525
1526 /* Non-obvious work limiting check: Recognize that we're going
1527 to call try_crossjump_bb on every basic block. So if we have
1528 two blocks with lots of outgoing edges (a switch) and they
1529 share lots of common destinations, then we would do the
1530 cross-jump check once for each common destination.
1531
1532 Now, if the blocks actually are cross-jump candidates, then
1533 all of their destinations will be shared. Which means that
1534 we only need check them for cross-jump candidacy once. We
1535 can eliminate redundant checks of crossjump(A,B) by arbitrarily
1536 choosing to do the check from the block for which the edge
1537 in question is the first successor of A. */
1538 if (e->src->succ != e)
1539 continue;
1540
1541 for (e2 = bb->pred; e2; e2 = nexte2)
1542 {
1543 nexte2 = e2->pred_next;
1544
1545 if (e2 == e)
1546 continue;
1547
1548 /* We've already checked the fallthru edge above. */
1549 if (e2 == fallthru)
1550 continue;
1551
402209ff
JH
1552 /* The "first successor" check above only prevents multiple
1553 checks of crossjump(A,B). In order to prevent redundant
1554 checks of crossjump(B,A), require that A be the block
1555 with the lowest index. */
1556 if (e->src->index > e2->src->index)
1557 continue;
1558
1559 if (try_crossjump_to_edge (mode, e, e2))
1560 {
1561 changed = true;
1562 nexte = bb->pred;
1563 break;
1564 }
1565 }
1566 }
1567
1568 return changed;
1569}
1570
1571/* Do simple CFG optimizations - basic block merging, simplifying of jump
1572 instructions etc. Return nonzero if changes were made. */
1573
1574static bool
1575try_optimize_cfg (mode)
1576 int mode;
1577{
1578 int i;
1579 bool changed_overall = false;
1580 bool changed;
1581 int iterations = 0;
1582
ca6c03ca
JH
1583 if (mode & CLEANUP_CROSSJUMP)
1584 add_noreturn_fake_exit_edges ();
1585
635559ab
JH
1586 for (i = 0; i < n_basic_blocks; i++)
1587 update_forwarder_flag (BASIC_BLOCK (i));
1588
38c1593d
JH
1589 if (mode & CLEANUP_UPDATE_LIFE)
1590 clear_bb_flags ();
1591
e4ec2cac 1592 if (! (* targetm.cannot_modify_jumps_p) ())
402209ff 1593 {
e4ec2cac
AO
1594 /* Attempt to merge blocks as made possible by edge removal. If
1595 a block has only one successor, and the successor has only
1596 one predecessor, they may be combined. */
1597 do
402209ff 1598 {
e4ec2cac
AO
1599 changed = false;
1600 iterations++;
1601
1602 if (rtl_dump_file)
1603 fprintf (rtl_dump_file,
1604 "\n\ntry_optimize_cfg iteration %i\n\n",
1605 iterations);
402209ff 1606
e4ec2cac 1607 for (i = 0; i < n_basic_blocks;)
402209ff 1608 {
e4ec2cac
AO
1609 basic_block c, b = BASIC_BLOCK (i);
1610 edge s;
1611 bool changed_here = false;
5f0d2358 1612
e4ec2cac
AO
1613 /* Delete trivially dead basic blocks. */
1614 while (b->pred == NULL)
1615 {
1616 c = BASIC_BLOCK (b->index - 1);
1617 if (rtl_dump_file)
1618 fprintf (rtl_dump_file, "Deleting block %i.\n",
1619 b->index);
1620
1621 flow_delete_block (b);
1622 changed = true;
1623 b = c;
1624 }
402209ff 1625
e4ec2cac
AO
1626 /* Remove code labels no longer used. Don't do this
1627 before CALL_PLACEHOLDER is removed, as some branches
1628 may be hidden within. */
1629 if (b->pred->pred_next == NULL
1630 && (b->pred->flags & EDGE_FALLTHRU)
1631 && !(b->pred->flags & EDGE_COMPLEX)
1632 && GET_CODE (b->head) == CODE_LABEL
1633 && (!(mode & CLEANUP_PRE_SIBCALL)
1634 || !tail_recursion_label_p (b->head))
1635 /* If the previous block ends with a branch to this
1636 block, we can't delete the label. Normally this
1637 is a condjump that is yet to be simplified, but
1638 if CASE_DROPS_THRU, this can be a tablejump with
1639 some element going to the same place as the
1640 default (fallthru). */
1641 && (b->pred->src == ENTRY_BLOCK_PTR
1642 || GET_CODE (b->pred->src->end) != JUMP_INSN
1643 || ! label_is_jump_target_p (b->head,
1644 b->pred->src->end)))
1645 {
1646 rtx label = b->head;
5f0d2358 1647
e4ec2cac
AO
1648 b->head = NEXT_INSN (b->head);
1649 delete_insn_chain (label, label);
1650 if (rtl_dump_file)
1651 fprintf (rtl_dump_file, "Deleted label in block %i.\n",
1652 b->index);
1653 }
402209ff 1654
e4ec2cac
AO
1655 /* If we fall through an empty block, we can remove it. */
1656 if (b->pred->pred_next == NULL
1657 && (b->pred->flags & EDGE_FALLTHRU)
1658 && GET_CODE (b->head) != CODE_LABEL
1659 && FORWARDER_BLOCK_P (b)
1660 /* Note that forwarder_block_p true ensures that
1661 there is a successor for this block. */
1662 && (b->succ->flags & EDGE_FALLTHRU)
1663 && n_basic_blocks > 1)
1664 {
1665 if (rtl_dump_file)
1666 fprintf (rtl_dump_file,
1667 "Deleting fallthru block %i.\n",
1668 b->index);
1669
1670 c = BASIC_BLOCK (b->index ? b->index - 1 : 1);
1671 redirect_edge_succ_nodup (b->pred, b->succ->dest);
1672 flow_delete_block (b);
1673 changed = true;
1674 b = c;
1675 }
5f0d2358 1676
e4ec2cac
AO
1677 /* Merge blocks. Loop because chains of blocks might be
1678 combineable. */
1679 while ((s = b->succ) != NULL
1680 && s->succ_next == NULL
1681 && !(s->flags & EDGE_COMPLEX)
1682 && (c = s->dest) != EXIT_BLOCK_PTR
1683 && c->pred->pred_next == NULL
1684 /* If the jump insn has side effects,
1685 we can't kill the edge. */
1686 && (GET_CODE (b->end) != JUMP_INSN
1687 || onlyjump_p (b->end))
1688 && merge_blocks (s, b, c, mode))
1689 changed_here = true;
1690
1691 /* Simplify branch over branch. */
1692 if ((mode & CLEANUP_EXPENSIVE) && try_simplify_condjump (b))
38c1593d 1693 changed_here = true;
402209ff 1694
e4ec2cac
AO
1695 /* If B has a single outgoing edge, but uses a
1696 non-trivial jump instruction without side-effects, we
1697 can either delete the jump entirely, or replace it
1698 with a simple unconditional jump. Use
1699 redirect_edge_and_branch to do the dirty work. */
1700 if (b->succ
1701 && ! b->succ->succ_next
1702 && b->succ->dest != EXIT_BLOCK_PTR
1703 && onlyjump_p (b->end)
1704 && redirect_edge_and_branch (b->succ, b->succ->dest))
1705 {
e4ec2cac
AO
1706 update_forwarder_flag (b);
1707 changed_here = true;
1708 }
402209ff 1709
e4ec2cac
AO
1710 /* Simplify branch to branch. */
1711 if (try_forward_edges (mode, b))
1712 changed_here = true;
402209ff 1713
e4ec2cac
AO
1714 /* Look for shared code between blocks. */
1715 if ((mode & CLEANUP_CROSSJUMP)
1716 && try_crossjump_bb (mode, b))
1717 changed_here = true;
402209ff 1718
e4ec2cac
AO
1719 /* Don't get confused by the index shift caused by
1720 deleting blocks. */
1721 if (!changed_here)
1722 i = b->index + 1;
1723 else
1724 changed = true;
1725 }
402209ff 1726
e4ec2cac
AO
1727 if ((mode & CLEANUP_CROSSJUMP)
1728 && try_crossjump_bb (mode, EXIT_BLOCK_PTR))
402209ff 1729 changed = true;
402209ff
JH
1730
1731#ifdef ENABLE_CHECKING
e4ec2cac
AO
1732 if (changed)
1733 verify_flow_info ();
402209ff
JH
1734#endif
1735
e4ec2cac
AO
1736 changed_overall |= changed;
1737 }
1738 while (changed);
402209ff 1739 }
ca6c03ca
JH
1740
1741 if (mode & CLEANUP_CROSSJUMP)
1742 remove_fake_edges ();
1743
1540f9eb 1744 clear_aux_for_blocks ();
635559ab 1745
402209ff
JH
1746 return changed_overall;
1747}
1748\f
6d2f8887 1749/* Delete all unreachable basic blocks. */
4262e623 1750
402209ff
JH
1751static bool
1752delete_unreachable_blocks ()
1753{
6a58eee9 1754 int i, j;
402209ff
JH
1755 bool changed = false;
1756
1757 find_unreachable_blocks ();
1758
6a58eee9
RH
1759 /* Delete all unreachable basic blocks. Do compaction concurrently,
1760 as otherwise we can wind up with O(N^2) behaviour here when we
1761 have oodles of dead code. */
402209ff 1762
6a58eee9 1763 for (i = j = 0; i < n_basic_blocks; ++i)
402209ff
JH
1764 {
1765 basic_block b = BASIC_BLOCK (i);
1766
1767 if (!(b->flags & BB_REACHABLE))
6a58eee9
RH
1768 {
1769 flow_delete_block_noexpunge (b);
1770 expunge_block_nocompact (b);
1771 changed = true;
1772 }
1773 else
1774 {
1775 BASIC_BLOCK (j) = b;
1776 b->index = j++;
1777 }
402209ff 1778 }
6a58eee9
RH
1779 n_basic_blocks = j;
1780 basic_block_info->num_elements = j;
402209ff
JH
1781
1782 if (changed)
1783 tidy_fallthru_edges ();
1784 return changed;
1785}
402209ff
JH
1786\f
1787/* Tidy the CFG by deleting unreachable code and whatnot. */
1788
1789bool
1790cleanup_cfg (mode)
1791 int mode;
1792{
402209ff
JH
1793 bool changed = false;
1794
1795 timevar_push (TV_CLEANUP_CFG);
3dec4024
JH
1796 if (delete_unreachable_blocks ())
1797 {
1798 changed = true;
1799 /* We've possibly created trivially dead code. Cleanup it right
1800 now to introduce more oppurtunities for try_optimize_cfg. */
1801 if (!(mode & (CLEANUP_UPDATE_LIFE | CLEANUP_PRE_SIBCALL))
1802 && !reload_completed)
1803 delete_trivially_dead_insns (get_insns(), max_reg_num ());
1804 }
1805 while (try_optimize_cfg (mode))
1806 {
1807 delete_unreachable_blocks (), changed = true;
1808 if (mode & CLEANUP_UPDATE_LIFE)
1809 {
1810 /* Cleaning up CFG introduces more oppurtunities for dead code
1811 removal that in turn may introduce more oppurtunities for
1812 cleaning up the CFG. */
e41f3392 1813 if (!update_life_info_in_dirty_blocks (UPDATE_LIFE_GLOBAL_RM_NOTES,
3dec4024
JH
1814 PROP_DEATH_NOTES
1815 | PROP_SCAN_DEAD_CODE
1816 | PROP_KILL_DEAD_CODE
1817 | PROP_LOG_LINKS))
1818 break;
1819 }
1820 else if (!(mode & CLEANUP_PRE_SIBCALL) && !reload_completed)
1821 {
1822 if (!delete_trivially_dead_insns (get_insns(), max_reg_num ()))
1823 break;
1824 }
1825 else
1826 break;
1827 delete_dead_jumptables ();
1828 }
402209ff 1829
402209ff
JH
1830 /* Kill the data we won't maintain. */
1831 free_EXPR_LIST_list (&label_value_list);
1832 free_EXPR_LIST_list (&tail_recursion_label_list);
1833 timevar_pop (TV_CLEANUP_CFG);
1834
402209ff
JH
1835 return changed;
1836}