cfgcleanup.c 94.7 KB
Newer Older
1
/* Control flow optimization code for GNU compiler.
2
   Copyright (C) 1987-2019 Free Software Foundation, Inc.
3 4 5 6 7

This file is part of GCC.

GCC is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free
8
Software Foundation; either version 3, or (at your option) any later
9 10 11 12 13 14 15 16
version.

GCC is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
for more details.

You should have received a copy of the GNU General Public License
17 18
along with GCC; see the file COPYING3.  If not see
<http://www.gnu.org/licenses/>.  */
19

20
/* This file contains optimizer of the control flow.  The main entry point is
21 22 23
   cleanup_cfg.  Following optimizations are performed:

   - Unreachable blocks removal
24
   - Edge forwarding (edge to the forwarder block is forwarded to its
25
     successor.  Simplification of the branch instruction is performed by
26
     underlying infrastructure so branch can be converted to simplejump or
27
     eliminated).
28 29 30 31 32 33
   - Cross jumping (tail merging)
   - Conditional jump-around-simplejump simplification
   - Basic block merging.  */

#include "config.h"
#include "system.h"
34
#include "coretypes.h"
35
#include "backend.h"
36
#include "target.h"
37
#include "rtl.h"
38 39
#include "tree.h"
#include "cfghooks.h"
40
#include "df.h"
41
#include "memmodel.h"
42
#include "tm_p.h"
43
#include "insn-config.h"
44
#include "emit-rtl.h"
45
#include "cselib.h"
46
#include "params.h"
47 48
#include "tree-pass.h"
#include "cfgloop.h"
49 50 51 52
#include "cfgrtl.h"
#include "cfganal.h"
#include "cfgbuild.h"
#include "cfgcleanup.h"
53
#include "dce.h"
54
#include "dbgcnt.h"
55
#include "rtl-iter.h"
56

57
#define FORWARDER_BLOCK_P(BB) ((BB)->flags & BB_FORWARDER_BLOCK)
Mike Stump committed
58

59 60
/* Set to true when we are running first pass of try_optimize_cfg loop.  */
static bool first_pass;
61

Joseph Myers committed
62
/* Set to true if crossjumps occurred in the latest run of try_optimize_cfg.  */
63
static bool crossjumps_occurred;
64

65 66 67 68
/* Set to true if we couldn't run an optimization due to stale liveness
   information; we should run df_analyze to enable more opportunities.  */
static bool block_was_dirty;

69
static bool try_crossjump_to_edge (int, edge, edge, enum replace_direction);
70
static bool try_crossjump_bb (int, basic_block);
71
static bool outgoing_edges_match (int, basic_block, basic_block);
72
static enum replace_direction old_insns_match_p (int, rtx_insn *, rtx_insn *);
73 74 75 76 77 78

static void merge_blocks_move_predecessor_nojumps (basic_block, basic_block);
static void merge_blocks_move_successor_nojumps (basic_block, basic_block);
static bool try_optimize_cfg (int);
static bool try_simplify_condjump (basic_block);
static bool try_forward_edges (int, basic_block);
79
static edge thread_jump (edge, basic_block);
80 81 82
static bool mark_effect (rtx, bitmap);
static void notice_new_block (basic_block);
static void update_forwarder_flag (basic_block);
83
static void merge_memattrs (rtx, rtx);
84 85 86 87

/* Set flags for newly created block.  */

static void
88
notice_new_block (basic_block bb)
89 90 91
{
  if (!bb)
    return;
92

93
  if (forwarder_block_p (bb))
94
    bb->flags |= BB_FORWARDER_BLOCK;
95 96 97 98 99
}

/* Recompute forwarder flag after block has been modified.  */

static void
100
update_forwarder_flag (basic_block bb)
101 102
{
  if (forwarder_block_p (bb))
103
    bb->flags |= BB_FORWARDER_BLOCK;
104
  else
105
    bb->flags &= ~BB_FORWARDER_BLOCK;
106
}
107 108 109 110 111

/* Simplify a conditional jump around an unconditional jump.
   Return true if something changed.  */

static bool
112
try_simplify_condjump (basic_block cbranch_block)
113 114 115
{
  basic_block jump_block, jump_dest_block, cbranch_dest_block;
  edge cbranch_jump_edge, cbranch_fallthru_edge;
116
  rtx_insn *cbranch_insn;
117 118

  /* Verify that there are exactly two successors.  */
119
  if (EDGE_COUNT (cbranch_block->succs) != 2)
120 121 122 123
    return false;

  /* Verify that we've got a normal conditional branch at the end
     of the block.  */
124
  cbranch_insn = BB_END (cbranch_block);
125 126 127 128 129 130 131 132 133 134
  if (!any_condjump_p (cbranch_insn))
    return false;

  cbranch_fallthru_edge = FALLTHRU_EDGE (cbranch_block);
  cbranch_jump_edge = BRANCH_EDGE (cbranch_block);

  /* The next block must not have multiple predecessors, must not
     be the last block in the function, and must contain just the
     unconditional jump.  */
  jump_block = cbranch_fallthru_edge->dest;
135
  if (!single_pred_p (jump_block)
136
      || jump_block->next_bb == EXIT_BLOCK_PTR_FOR_FN (cfun)
137
      || !FORWARDER_BLOCK_P (jump_block))
138
    return false;
139
  jump_dest_block = single_succ (jump_block);
140

141 142
  /* If we are partitioning hot/cold basic blocks, we don't want to
     mess up unconditional or indirect jumps that cross between hot
Mike Stump committed
143
     and cold sections.
144 145

     Basic block partitioning may result in some jumps that appear to
Mike Stump committed
146 147 148
     be optimizable (or blocks that appear to be mergeable), but which really
     must be left untouched (they are required to make it safely across
     partition boundaries).  See the comments at the top of
149
     bb-reorder.c:partition_hot_cold_basic_blocks for complete details.  */
150

151 152
  if (BB_PARTITION (jump_block) != BB_PARTITION (jump_dest_block)
      || (cbranch_jump_edge->flags & EDGE_CROSSING))
153 154
    return false;

155 156 157 158
  /* The conditional branch must target the block after the
     unconditional branch.  */
  cbranch_dest_block = cbranch_jump_edge->dest;

159
  if (cbranch_dest_block == EXIT_BLOCK_PTR_FOR_FN (cfun)
160
      || jump_dest_block == EXIT_BLOCK_PTR_FOR_FN (cfun)
161
      || !can_fallthru (jump_block, cbranch_dest_block))
162 163
    return false;

164
  /* Invert the conditional branch.  */
165 166
  if (!invert_jump (as_a <rtx_jump_insn *> (cbranch_insn),
		    block_label (jump_dest_block), 0))
167
    return false;
168

169 170
  if (dump_file)
    fprintf (dump_file, "Simplifying condjump %i around jump %i\n",
171
	     INSN_UID (cbranch_insn), INSN_UID (BB_END (jump_block)));
172 173 174 175 176 177 178 179 180 181

  /* Success.  Update the CFG to match.  Note that after this point
     the edge variable names appear backwards; the redirection is done
     this way to preserve edge profile data.  */
  cbranch_jump_edge = redirect_edge_succ_nodup (cbranch_jump_edge,
						cbranch_dest_block);
  cbranch_fallthru_edge = redirect_edge_succ_nodup (cbranch_fallthru_edge,
						    jump_dest_block);
  cbranch_jump_edge->flags |= EDGE_FALLTHRU;
  cbranch_fallthru_edge->flags &= ~EDGE_FALLTHRU;
182
  update_br_prob_note (cbranch_block);
183 184

  /* Delete the block with the unconditional jump, and clean up the mess.  */
185 186
  delete_basic_block (jump_block);
  tidy_fallthru_edge (cbranch_jump_edge);
187
  update_forwarder_flag (cbranch_block);
188 189 190 191

  return true;
}

192 193
/* Attempt to prove that operation is NOOP using CSElib or mark the effect
   on register.  Used by jump threading.  */
194

195
static bool
196
mark_effect (rtx exp, regset nonequal)
197
{
198
  rtx dest;
199 200 201
  switch (GET_CODE (exp))
    {
      /* In case we do clobber the register, mark it as equal, as we know the
Mike Stump committed
202
	 value is dead so it don't have to match.  */
203
    case CLOBBER:
204 205 206
      dest = XEXP (exp, 0);
      if (REG_P (dest))
	bitmap_clear_range (nonequal, REGNO (dest), REG_NREGS (dest));
207
      return false;
208

209 210
    case SET:
      if (rtx_equal_for_cselib_p (SET_DEST (exp), SET_SRC (exp)))
211
	return false;
212 213
      dest = SET_DEST (exp);
      if (dest == pc_rtx)
214
	return false;
215 216
      if (!REG_P (dest))
	return true;
217
      bitmap_set_range (nonequal, REGNO (dest), REG_NREGS (dest));
218 219 220 221
      return false;

    default:
      return false;
222 223
    }
}
224

225 226 227
/* Return true if X contains a register in NONEQUAL.  */
static bool
mentions_nonequal_regs (const_rtx x, regset nonequal)
228
{
229 230
  subrtx_iterator::array_type array;
  FOR_EACH_SUBRTX (iter, array, x, NONCONST)
231
    {
232 233
      const_rtx x = *iter;
      if (REG_P (x))
234
	{
235 236 237 238
	  unsigned int end_regno = END_REGNO (x);
	  for (unsigned int regno = REGNO (x); regno < end_regno; ++regno)
	    if (REGNO_REG_SET_P (nonequal, regno))
	      return true;
239 240
	}
    }
241
  return false;
242
}
243

244
/* Attempt to prove that the basic block B will have no side effects and
245
   always continues in the same edge if reached via E.  Return the edge
246 247 248
   if exist, NULL otherwise.  */

static edge
249
thread_jump (edge e, basic_block b)
250
{
251 252
  rtx set1, set2, cond1, cond2;
  rtx_insn *insn;
253 254
  enum rtx_code code1, code2, reversed_code2;
  bool reverse1 = false;
255
  unsigned i;
256 257
  regset nonequal;
  bool failed = false;
258
  reg_set_iterator rsi;
259

260
  if (b->flags & BB_NONTHREADABLE_BLOCK)
261 262
    return NULL;

263 264
  /* At the moment, we do handle only conditional jumps, but later we may
     want to extend this code to tablejumps and others.  */
265
  if (EDGE_COUNT (e->src->succs) != 2)
266
    return NULL;
267
  if (EDGE_COUNT (b->succs) != 2)
268
    {
269
      b->flags |= BB_NONTHREADABLE_BLOCK;
270 271
      return NULL;
    }
272 273

  /* Second branch must end with onlyjump, as we will eliminate the jump.  */
274
  if (!any_condjump_p (BB_END (e->src)))
275
    return NULL;
276

277
  if (!any_condjump_p (BB_END (b)) || !onlyjump_p (BB_END (b)))
278
    {
279
      b->flags |= BB_NONTHREADABLE_BLOCK;
280 281
      return NULL;
    }
282

283 284
  set1 = pc_set (BB_END (e->src));
  set2 = pc_set (BB_END (b));
285
  if (((e->flags & EDGE_FALLTHRU) != 0)
286
      != (XEXP (SET_SRC (set1), 1) == pc_rtx))
287 288 289 290 291
    reverse1 = true;

  cond1 = XEXP (SET_SRC (set1), 0);
  cond2 = XEXP (SET_SRC (set2), 0);
  if (reverse1)
292
    code1 = reversed_comparison_code (cond1, BB_END (e->src));
293 294 295 296
  else
    code1 = GET_CODE (cond1);

  code2 = GET_CODE (cond2);
297
  reversed_code2 = reversed_comparison_code (cond2, BB_END (b));
298 299 300 301 302 303

  if (!comparison_dominates_p (code1, code2)
      && !comparison_dominates_p (code1, reversed_code2))
    return NULL;

  /* Ensure that the comparison operators are equivalent.
304
     ??? This is far too pessimistic.  We should allow swapped operands,
305 306 307 308 309 310 311 312
     different CCmodes, or for example comparisons for interval, that
     dominate even when operands are not equivalent.  */
  if (!rtx_equal_p (XEXP (cond1, 0), XEXP (cond2, 0))
      || !rtx_equal_p (XEXP (cond1, 1), XEXP (cond2, 1)))
    return NULL;

  /* Short circuit cases where block B contains some side effects, as we can't
     safely bypass it.  */
313
  for (insn = NEXT_INSN (BB_HEAD (b)); insn != NEXT_INSN (BB_END (b));
314 315
       insn = NEXT_INSN (insn))
    if (INSN_P (insn) && side_effects_p (PATTERN (insn)))
316
      {
317
	b->flags |= BB_NONTHREADABLE_BLOCK;
318 319
	return NULL;
      }
320

321
  cselib_init (0);
322 323

  /* First process all values computed in the source basic block.  */
324 325
  for (insn = NEXT_INSN (BB_HEAD (e->src));
       insn != NEXT_INSN (BB_END (e->src));
326 327 328 329
       insn = NEXT_INSN (insn))
    if (INSN_P (insn))
      cselib_process_insn (insn);

330
  nonequal = BITMAP_ALLOC (NULL);
331
  CLEAR_REG_SET (nonequal);
332

333 334 335
  /* Now assume that we've continued by the edge E to B and continue
     processing as if it were same basic block.
     Our goal is to prove that whole block is an NOOP.  */
336

337 338
  for (insn = NEXT_INSN (BB_HEAD (b));
       insn != NEXT_INSN (BB_END (b)) && !failed;
339
       insn = NEXT_INSN (insn))
340
    {
341 342 343 344 345 346 347
      /* cond2 must not mention any register that is not equal to the
	 former block.  Check this before processing that instruction,
	 as BB_END (b) could contain also clobbers.  */
      if (insn == BB_END (b)
	  && mentions_nonequal_regs (cond2, nonequal))
	goto failed_exit;

348 349 350 351 352 353
      if (INSN_P (insn))
	{
	  rtx pat = PATTERN (insn);

	  if (GET_CODE (pat) == PARALLEL)
	    {
354
	      for (i = 0; i < (unsigned)XVECLEN (pat, 0); i++)
355 356 357 358 359
		failed |= mark_effect (XVECEXP (pat, 0, i), nonequal);
	    }
	  else
	    failed |= mark_effect (pat, nonequal);
	}
360

361 362
      cselib_process_insn (insn);
    }
363 364 365 366

  /* Later we should clear nonequal of dead registers.  So far we don't
     have life information in cfg_cleanup.  */
  if (failed)
367
    {
368
      b->flags |= BB_NONTHREADABLE_BLOCK;
369 370
      goto failed_exit;
    }
371

372 373
  EXECUTE_IF_SET_IN_REG_SET (nonequal, 0, i, rsi)
    goto failed_exit;
374

375
  BITMAP_FREE (nonequal);
376 377
  cselib_finish ();
  if ((comparison_dominates_p (code1, code2) != 0)
378
      != (XEXP (SET_SRC (set2), 1) == pc_rtx))
379 380 381 382 383
    return BRANCH_EDGE (b);
  else
    return FALLTHRU_EDGE (b);

failed_exit:
384
  BITMAP_FREE (nonequal);
385 386 387 388
  cselib_finish ();
  return NULL;
}

389
/* Attempt to forward edges leaving basic block B.
390
   Return true if successful.  */
391 392

static bool
393
try_forward_edges (int mode, basic_block b)
394 395
{
  bool changed = false;
396 397
  edge_iterator ei;
  edge e, *threaded_edges = NULL;
398

399
  for (ei = ei_start (b->succs); (e = ei_safe_edge (ei)); )
400 401
    {
      basic_block target, first;
402 403
      location_t goto_locus;
      int counter;
404
      bool threaded = false;
405
      int nthreaded_edges = 0;
406
      bool may_thread = first_pass || (b->flags & BB_MODIFIED) != 0;
407
      bool new_target_threaded = false;
408 409 410

      /* Skip complex edges because we don't know how to update them.

Mike Stump committed
411 412 413
	 Still handle fallthru edges, as we can succeed to forward fallthru
	 edge to the same place as the branch edge of conditional branch
	 and turn conditional branch to an unconditional branch.  */
414
      if (e->flags & EDGE_COMPLEX)
415 416 417 418
	{
	  ei_next (&ei);
	  continue;
	}
419 420

      target = first = e->dest;
421
      counter = NUM_FIXED_BLOCKS;
422
      goto_locus = e->goto_locus;
423

424
      while (counter < n_basic_blocks_for_fn (cfun))
425
	{
426
	  basic_block new_target = NULL;
427
	  may_thread |= (target->flags & BB_MODIFIED) != 0;
428 429

	  if (FORWARDER_BLOCK_P (target)
430
	      && single_succ (target) != EXIT_BLOCK_PTR_FOR_FN (cfun))
431 432
	    {
	      /* Bypass trivial infinite loops.  */
433 434
	      new_target = single_succ (target);
	      if (target == new_target)
435
		counter = n_basic_blocks_for_fn (cfun);
436 437 438 439
	      else if (!optimize)
		{
		  /* When not optimizing, ensure that edges or forwarder
		     blocks with different locus are not optimized out.  */
440 441
		  location_t new_locus = single_succ_edge (target)->goto_locus;
		  location_t locus = goto_locus;
442

443 444
		  if (LOCATION_LOCUS (new_locus) != UNKNOWN_LOCATION
		      && LOCATION_LOCUS (locus) != UNKNOWN_LOCATION
445
		      && new_locus != locus)
446 447
		    new_target = NULL;
		  else
448
		    {
449
		      if (LOCATION_LOCUS (new_locus) != UNKNOWN_LOCATION)
450
			locus = new_locus;
451

452
		      rtx_insn *last = BB_END (target);
453 454
		      if (DEBUG_INSN_P (last))
			last = prev_nondebug_insn (last);
455 456 457 458
		      if (last && INSN_P (last))
			new_locus = INSN_LOCATION (last);
		      else
			new_locus = UNKNOWN_LOCATION;
459

460 461
		      if (LOCATION_LOCUS (new_locus) != UNKNOWN_LOCATION
			  && LOCATION_LOCUS (locus) != UNKNOWN_LOCATION
462
			  && new_locus != locus)
463 464 465
			new_target = NULL;
		      else
			{
466
			  if (LOCATION_LOCUS (new_locus) != UNKNOWN_LOCATION)
467 468 469 470
			    locus = new_locus;

			  goto_locus = locus;
			}
471 472
		    }
		}
473
	    }
474

475 476
	  /* Allow to thread only over one edge at time to simplify updating
	     of probabilities.  */
477
	  else if ((mode & CLEANUP_THREADING) && may_thread)
478
	    {
479
	      edge t = thread_jump (e, target);
480
	      if (t)
481
		{
482
		  if (!threaded_edges)
483 484
		    threaded_edges = XNEWVEC (edge,
					      n_basic_blocks_for_fn (cfun));
485 486 487 488 489 490 491 492 493 494
		  else
		    {
		      int i;

		      /* Detect an infinite loop across blocks not
			 including the start block.  */
		      for (i = 0; i < nthreaded_edges; ++i)
			if (threaded_edges[i] == t)
			  break;
		      if (i < nthreaded_edges)
495
			{
496
			  counter = n_basic_blocks_for_fn (cfun);
497 498
			  break;
			}
499 500 501 502 503 504
		    }

		  /* Detect an infinite loop across the start block.  */
		  if (t->dest == b)
		    break;

505 506 507
		  gcc_assert (nthreaded_edges
			      < (n_basic_blocks_for_fn (cfun)
				 - NUM_FIXED_BLOCKS));
508
		  threaded_edges[nthreaded_edges++] = t;
509 510 511

		  new_target = t->dest;
		  new_target_threaded = true;
512 513
		}
	    }
514

515 516
	  if (!new_target)
	    break;
517

518
	  counter++;
519 520 521 522 523 524 525 526
	  /* Do not turn non-crossing jump to crossing.  Depending on target
	     it may require different instruction pattern.  */
	  if ((e->flags & EDGE_CROSSING)
	      || BB_PARTITION (first) == BB_PARTITION (new_target))
	    {
	      target = new_target;
	      threaded |= new_target_threaded;
	    }
527
	}
528

529
      if (counter >= n_basic_blocks_for_fn (cfun))
530
	{
531 532
	  if (dump_file)
	    fprintf (dump_file, "Infinite loop in BB %i.\n",
533
		     target->index);
534 535 536 537 538 539
	}
      else if (target == first)
	; /* We didn't do anything.  */
      else
	{
	  /* Save the values now, as the edge may get removed.  */
540
	  profile_count edge_count = e->count ();
541
	  int n = 0;
542

543 544
	  e->goto_locus = goto_locus;

545
	  /* Don't force if target is exit block.  */
546
	  if (threaded && target != EXIT_BLOCK_PTR_FOR_FN (cfun))
547
	    {
548
	      notice_new_block (redirect_edge_and_branch_force (e, target));
549 550
	      if (dump_file)
		fprintf (dump_file, "Conditionals threaded.\n");
551
	    }
552
	  else if (!redirect_edge_and_branch (e, target))
553
	    {
554 555
	      if (dump_file)
		fprintf (dump_file,
556
			 "Forwarding edge %i->%i to %i failed.\n",
557
			 b->index, e->dest->index, target->index);
558
	      ei_next (&ei);
559
	      continue;
560
	    }
561

562 563 564 565 566 567
	  /* We successfully forwarded the edge.  Now update profile
	     data: for each edge we traversed in the chain, remove
	     the original edge's execution count.  */
	  do
	    {
	      edge t;
568

569
	      if (!single_succ_p (first))
570
		{
571
		  gcc_assert (n < nthreaded_edges);
572
		  t = threaded_edges [n++];
573
		  gcc_assert (t->src == first);
574
		  update_bb_profile_for_threading (first, edge_count, t);
575
		  update_br_prob_note (first);
576
		}
577
	      else
578
		{
579
		  first->count -= edge_count;
580 581 582 583 584 585 586
		  /* It is possible that as the result of
		     threading we've removed edge as it is
		     threaded to the fallthru edge.  Avoid
		     getting out of sync.  */
		  if (n < nthreaded_edges
		      && first == threaded_edges [n]->src)
		    n++;
587
		  t = single_succ_edge (first);
588
		}
589

590 591 592 593 594
	      first = t->dest;
	    }
	  while (first != target);

	  changed = true;
595
	  continue;
596
	}
597
      ei_next (&ei);
598 599
    }

600
  free (threaded_edges);
601 602 603 604 605 606 607 608
  return changed;
}


/* Blocks A and B are to be merged into a single block.  A has no incoming
   fallthru edge, so it can be moved before B without adding or modifying
   any jumps (aside from the jump from A to B).  */

609
static void
610
merge_blocks_move_predecessor_nojumps (basic_block a, basic_block b)
611
{
612
  rtx_insn *barrier;
613

614 615
  /* If we are partitioning hot/cold basic blocks, we don't want to
     mess up unconditional or indirect jumps that cross between hot
616
     and cold sections.
Mike Stump committed
617

618
     Basic block partitioning may result in some jumps that appear to
Mike Stump committed
619 620 621
     be optimizable (or blocks that appear to be mergeable), but which really
     must be left untouched (they are required to make it safely across
     partition boundaries).  See the comments at the top of
622 623
     bb-reorder.c:partition_hot_cold_basic_blocks for complete details.  */

624
  if (BB_PARTITION (a) != BB_PARTITION (b))
625 626
    return;

627
  barrier = next_nonnote_insn (BB_END (a));
628
  gcc_assert (BARRIER_P (barrier));
629
  delete_insn (barrier);
630 631

  /* Scramble the insn chain.  */
632 633
  if (BB_END (a) != PREV_INSN (BB_HEAD (b)))
    reorder_insns_nobb (BB_HEAD (a), BB_END (a), PREV_INSN (BB_HEAD (b)));
634
  df_set_bb_dirty (a);
635

636 637
  if (dump_file)
    fprintf (dump_file, "Moved block %d before %d and merged.\n",
638
	     a->index, b->index);
639

640
  /* Swap the records for the two blocks around.  */
641

642 643 644
  unlink_block (a);
  link_block (a, b->prev_bb);

645
  /* Now blocks A and B are contiguous.  Merge them.  */
646
  merge_blocks (a, b);
647 648 649 650 651 652
}

/* Blocks A and B are to be merged into a single block.  B has no outgoing
   fallthru edge, so it can be moved after A without adding or modifying
   any jumps (aside from the jump from A to B).  */

653
static void
654
merge_blocks_move_successor_nojumps (basic_block a, basic_block b)
655
{
656
  rtx_insn *barrier, *real_b_end;
657
  rtx_insn *label;
658
  rtx_jump_table_data *table;
659

660 661
  /* If we are partitioning hot/cold basic blocks, we don't want to
     mess up unconditional or indirect jumps that cross between hot
Mike Stump committed
662 663
     and cold sections.

664
     Basic block partitioning may result in some jumps that appear to
Mike Stump committed
665 666 667
     be optimizable (or blocks that appear to be mergeable), but which really
     must be left untouched (they are required to make it safely across
     partition boundaries).  See the comments at the top of
668 669
     bb-reorder.c:partition_hot_cold_basic_blocks for complete details.  */

670
  if (BB_PARTITION (a) != BB_PARTITION (b))
671 672
    return;

673
  real_b_end = BB_END (b);
674

675 676
  /* If there is a jump table following block B temporarily add the jump table
     to block B so that it will also be moved to the correct location.  */
677
  if (tablejump_p (BB_END (b), &label, &table)
678
      && prev_active_insn (label) == BB_END (b))
679
    {
680
      BB_END (b) = table;
681 682 683
    }

  /* There had better have been a barrier there.  Delete it.  */
684
  barrier = NEXT_INSN (BB_END (b));
685
  if (barrier && BARRIER_P (barrier))
686
    delete_insn (barrier);
687 688 689


  /* Scramble the insn chain.  */
690
  reorder_insns_nobb (BB_HEAD (b), BB_END (b), BB_END (a));
691

692
  /* Restore the real end of b.  */
693
  BB_END (b) = real_b_end;
694

695 696
  if (dump_file)
    fprintf (dump_file, "Moved block %d after %d and merged.\n",
697
	     b->index, a->index);
698 699

  /* Now blocks A and B are contiguous.  Merge them.  */
700
  merge_blocks (a, b);
701 702 703
}

/* Attempt to merge basic blocks that are potentially non-adjacent.
704 705 706
   Return NULL iff the attempt failed, otherwise return basic block
   where cleanup_cfg should continue.  Because the merging commonly
   moves basic block away or introduces another optimization
707
   possibility, return basic block just before B so cleanup_cfg don't
708 709 710 711
   need to iterate.

   It may be good idea to return basic block before C in the case
   C has been moved after B and originally appeared earlier in the
712
   insn sequence, but we have no information available about the
713 714 715
   relative ordering of these two.  Hopefully it is not too common.  */

static basic_block
716
merge_blocks_move (edge e, basic_block b, basic_block c, int mode)
717
{
718
  basic_block next;
719

720 721
  /* If we are partitioning hot/cold basic blocks, we don't want to
     mess up unconditional or indirect jumps that cross between hot
Mike Stump committed
722 723
     and cold sections.

724
     Basic block partitioning may result in some jumps that appear to
Mike Stump committed
725 726 727
     be optimizable (or blocks that appear to be mergeable), but which really
     must be left untouched (they are required to make it safely across
     partition boundaries).  See the comments at the top of
728 729
     bb-reorder.c:partition_hot_cold_basic_blocks for complete details.  */

730
  if (BB_PARTITION (b) != BB_PARTITION (c))
731
    return NULL;
Mike Stump committed
732

733 734 735
  /* If B has a fallthru edge to C, no need to move anything.  */
  if (e->flags & EDGE_FALLTHRU)
    {
736
      int b_index = b->index, c_index = c->index;
737 738 739 740 741

      /* Protect the loop latches.  */
      if (current_loops && c->loop_father->latch == c)
	return NULL;

742
      merge_blocks (b, c);
743
      update_forwarder_flag (b);
744

745 746
      if (dump_file)
	fprintf (dump_file, "Merged %d and %d without moving.\n",
747
		 b_index, c_index);
748

749
      return b->prev_bb == ENTRY_BLOCK_PTR_FOR_FN (cfun) ? b : b->prev_bb;
750
    }
751

752 753 754 755
  /* Otherwise we will need to move code around.  Do that only if expensive
     transformations are allowed.  */
  else if (mode & CLEANUP_EXPENSIVE)
    {
756 757 758
      edge tmp_edge, b_fallthru_edge;
      bool c_has_outgoing_fallthru;
      bool b_has_incoming_fallthru;
759 760

      /* Avoid overactive code motion, as the forwarder blocks should be
Mike Stump committed
761
	 eliminated by edge redirection instead.  One exception might have
762 763
	 been if B is a forwarder block and C has no fallthru edge, but
	 that should be cleaned up by bb-reorder instead.  */
764
      if (FORWARDER_BLOCK_P (b) || FORWARDER_BLOCK_P (c))
765
	return NULL;
766 767 768 769 770

      /* We must make sure to not munge nesting of lexical blocks,
	 and loop notes.  This is done by squeezing out all the notes
	 and leaving them there to lie.  Not ideal, but functional.  */

771
      tmp_edge = find_fallthru_edge (c->succs);
772 773
      c_has_outgoing_fallthru = (tmp_edge != NULL);

774
      tmp_edge = find_fallthru_edge (b->preds);
775
      b_has_incoming_fallthru = (tmp_edge != NULL);
776
      b_fallthru_edge = tmp_edge;
777
      next = b->prev_bb;
778 779
      if (next == c)
	next = next->prev_bb;
780 781 782 783 784 785 786

      /* Otherwise, we're going to try to move C after B.  If C does
	 not have an outgoing fallthru, then it can be moved
	 immediately after B without introducing or modifying jumps.  */
      if (! c_has_outgoing_fallthru)
	{
	  merge_blocks_move_successor_nojumps (b, c);
787
	  return next == ENTRY_BLOCK_PTR_FOR_FN (cfun) ? next->next_bb : next;
788
	}
789 790 791 792 793 794

      /* If B does not have an incoming fallthru, then it can be moved
	 immediately before C without introducing or modifying jumps.
	 C cannot be the first block, so we do not have to worry about
	 accessing a non-existent block.  */

795 796
      if (b_has_incoming_fallthru)
	{
797
	  basic_block bb;
798

799
	  if (b_fallthru_edge->src == ENTRY_BLOCK_PTR_FOR_FN (cfun))
800
	    return NULL;
801 802 803
	  bb = force_nonfallthru (b_fallthru_edge);
	  if (bb)
	    notice_new_block (bb);
804
	}
805

806
      merge_blocks_move_predecessor_nojumps (b, c);
807
      return next == ENTRY_BLOCK_PTR_FOR_FN (cfun) ? next->next_bb : next;
808
    }
809

810
  return NULL;
811 812
}

813 814 815 816

/* Removes the memory attributes of MEM expression
   if they are not equal.  */

Andrew MacLeod committed
817
static void
818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837
merge_memattrs (rtx x, rtx y)
{
  int i;
  int j;
  enum rtx_code code;
  const char *fmt;

  if (x == y)
    return;
  if (x == 0 || y == 0)
    return;

  code = GET_CODE (x);

  if (code != GET_CODE (y))
    return;

  if (GET_MODE (x) != GET_MODE (y))
    return;

838
  if (code == MEM && !mem_attrs_eq_p (MEM_ATTRS (x), MEM_ATTRS (y)))
839 840 841 842 843
    {
      if (! MEM_ATTRS (x))
	MEM_ATTRS (y) = 0;
      else if (! MEM_ATTRS (y))
	MEM_ATTRS (x) = 0;
Mike Stump committed
844
      else
845 846 847 848 849 850
	{
	  if (MEM_ALIAS_SET (x) != MEM_ALIAS_SET (y))
	    {
	      set_mem_alias_set (x, 0);
	      set_mem_alias_set (y, 0);
	    }
Mike Stump committed
851

852 853 854 855
	  if (! mem_expr_equal_p (MEM_EXPR (x), MEM_EXPR (y)))
	    {
	      set_mem_expr (x, 0);
	      set_mem_expr (y, 0);
856 857
	      clear_mem_offset (x);
	      clear_mem_offset (y);
858
	    }
859 860
	  else if (MEM_OFFSET_KNOWN_P (x) != MEM_OFFSET_KNOWN_P (y)
		   || (MEM_OFFSET_KNOWN_P (x)
861
		       && maybe_ne (MEM_OFFSET (x), MEM_OFFSET (y))))
862
	    {
863 864
	      clear_mem_offset (x);
	      clear_mem_offset (y);
865
	    }
Mike Stump committed
866

867 868 869 870 871 872 873 874
	  if (!MEM_SIZE_KNOWN_P (x))
	    clear_mem_size (y);
	  else if (!MEM_SIZE_KNOWN_P (y))
	    clear_mem_size (x);
	  else if (known_le (MEM_SIZE (x), MEM_SIZE (y)))
	    set_mem_size (x, MEM_SIZE (y));
	  else if (known_le (MEM_SIZE (y), MEM_SIZE (x)))
	    set_mem_size (y, MEM_SIZE (x));
875
	  else
876
	    {
877
	      /* The sizes aren't ordered, so we can't merge them.  */
878 879 880
	      clear_mem_size (x);
	      clear_mem_size (y);
	    }
881 882 883 884 885

	  set_mem_align (x, MIN (MEM_ALIGN (x), MEM_ALIGN (y)));
	  set_mem_align (y, MEM_ALIGN (x));
	}
    }
886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903
  if (code == MEM)
    {
      if (MEM_READONLY_P (x) != MEM_READONLY_P (y))
	{
	  MEM_READONLY_P (x) = 0;
	  MEM_READONLY_P (y) = 0;
	}
      if (MEM_NOTRAP_P (x) != MEM_NOTRAP_P (y))
	{
	  MEM_NOTRAP_P (x) = 0;
	  MEM_NOTRAP_P (y) = 0;
	}
      if (MEM_VOLATILE_P (x) != MEM_VOLATILE_P (y))
	{
	  MEM_VOLATILE_P (x) = 1;
	  MEM_VOLATILE_P (y) = 1;
	}
    }
Mike Stump committed
904

905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927
  fmt = GET_RTX_FORMAT (code);
  for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
    {
      switch (fmt[i])
	{
	case 'E':
	  /* Two vectors must have the same length.  */
	  if (XVECLEN (x, i) != XVECLEN (y, i))
	    return;

	  for (j = 0; j < XVECLEN (x, i); j++)
	    merge_memattrs (XVECEXP (x, i, j), XVECEXP (y, i, j));

	  break;

	case 'e':
	  merge_memattrs (XEXP (x, i), XEXP (y, i));
	}
    }
  return;
}


928 929
 /* Checks if patterns P1 and P2 are equivalent, apart from the possibly
    different single sets S1 and S2.  */
930 931

static bool
932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955
equal_different_set_p (rtx p1, rtx s1, rtx p2, rtx s2)
{
  int i;
  rtx e1, e2;

  if (p1 == s1 && p2 == s2)
    return true;

  if (GET_CODE (p1) != PARALLEL || GET_CODE (p2) != PARALLEL)
    return false;

  if (XVECLEN (p1, 0) != XVECLEN (p2, 0))
    return false;

  for (i = 0; i < XVECLEN (p1, 0); i++)
    {
      e1 = XVECEXP (p1, 0, i);
      e2 = XVECEXP (p2, 0, i);
      if (e1 == s1 && e2 == s2)
        continue;
      if (reload_completed
          ? rtx_renumbered_equal_p (e1, e2) : rtx_equal_p (e1, e2))
        continue;

956
      return false;
957 958 959 960 961
    }

  return true;
}

962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000

/* NOTE1 is the REG_EQUAL note, if any, attached to an insn
   that is a single_set with a SET_SRC of SRC1.  Similarly
   for NOTE2/SRC2.

   So effectively NOTE1/NOTE2 are an alternate form of 
   SRC1/SRC2 respectively.

   Return nonzero if SRC1 or NOTE1 has the same constant
   integer value as SRC2 or NOTE2.   Else return zero.  */
static int
values_equal_p (rtx note1, rtx note2, rtx src1, rtx src2)
{
  if (note1
      && note2
      && CONST_INT_P (XEXP (note1, 0))
      && rtx_equal_p (XEXP (note1, 0), XEXP (note2, 0)))
    return 1;

  if (!note1
      && !note2
      && CONST_INT_P (src1)
      && CONST_INT_P (src2)
      && rtx_equal_p (src1, src2))
    return 1;

  if (note1
      && CONST_INT_P (src2)
      && rtx_equal_p (XEXP (note1, 0), src2))
    return 1;

  if (note2
      && CONST_INT_P (src1)
      && rtx_equal_p (XEXP (note2, 0), src1))
    return 1;

  return 0;
}

1001 1002 1003 1004 1005 1006
/* Examine register notes on I1 and I2 and return:
   - dir_forward if I1 can be replaced by I2, or
   - dir_backward if I2 can be replaced by I1, or
   - dir_both if both are the case.  */

static enum replace_direction
1007
can_replace_by (rtx_insn *i1, rtx_insn *i2)
1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028
{
  rtx s1, s2, d1, d2, src1, src2, note1, note2;
  bool c1, c2;

  /* Check for 2 sets.  */
  s1 = single_set (i1);
  s2 = single_set (i2);
  if (s1 == NULL_RTX || s2 == NULL_RTX)
    return dir_none;

  /* Check that the 2 sets set the same dest.  */
  d1 = SET_DEST (s1);
  d2 = SET_DEST (s2);
  if (!(reload_completed
        ? rtx_renumbered_equal_p (d1, d2) : rtx_equal_p (d1, d2)))
    return dir_none;

  /* Find identical req_equiv or reg_equal note, which implies that the 2 sets
     set dest to the same value.  */
  note1 = find_reg_equal_equiv_note (i1);
  note2 = find_reg_equal_equiv_note (i2);
1029 1030 1031 1032 1033

  src1 = SET_SRC (s1);
  src2 = SET_SRC (s2);

  if (!values_equal_p (note1, note2, src1, src2))
1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080
    return dir_none;

  if (!equal_different_set_p (PATTERN (i1), s1, PATTERN (i2), s2))
    return dir_none;

  /* Although the 2 sets set dest to the same value, we cannot replace
       (set (dest) (const_int))
     by
       (set (dest) (reg))
     because we don't know if the reg is live and has the same value at the
     location of replacement.  */
  c1 = CONST_INT_P (src1);
  c2 = CONST_INT_P (src2);
  if (c1 && c2)
    return dir_both;
  else if (c2)
    return dir_forward;
  else if (c1)
    return dir_backward;

  return dir_none;
}

/* Merges directions A and B.  */

static enum replace_direction
merge_dir (enum replace_direction a, enum replace_direction b)
{
  /* Implements the following table:
        |bo fw bw no
     ---+-----------
     bo |bo fw bw no
     fw |-- fw no no
     bw |-- -- bw no
     no |-- -- -- no.  */

  if (a == b)
    return a;

  if (a == dir_both)
    return b;
  if (b == dir_both)
    return a;

  return dir_none;
}

1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122
/* Array of flags indexed by reg note kind, true if the given
   reg note is CFA related.  */
static const bool reg_note_cfa_p[] = {
#undef REG_CFA_NOTE
#define DEF_REG_NOTE(NAME) false,
#define REG_CFA_NOTE(NAME) true,
#include "reg-notes.def"
#undef REG_CFA_NOTE
#undef DEF_REG_NOTE
  false
};

/* Return true if I1 and I2 have identical CFA notes (the same order
   and equivalent content).  */

static bool
insns_have_identical_cfa_notes (rtx_insn *i1, rtx_insn *i2)
{
  rtx n1, n2;
  for (n1 = REG_NOTES (i1), n2 = REG_NOTES (i2); ;
       n1 = XEXP (n1, 1), n2 = XEXP (n2, 1))
    {
      /* Skip over reg notes not related to CFI information.  */
      while (n1 && !reg_note_cfa_p[REG_NOTE_KIND (n1)])
	n1 = XEXP (n1, 1);
      while (n2 && !reg_note_cfa_p[REG_NOTE_KIND (n2)])
	n2 = XEXP (n2, 1);
      if (n1 == NULL_RTX && n2 == NULL_RTX)
	return true;
      if (n1 == NULL_RTX || n2 == NULL_RTX)
	return false;
      if (XEXP (n1, 0) == XEXP (n2, 0))
	;
      else if (XEXP (n1, 0) == NULL_RTX || XEXP (n2, 0) == NULL_RTX)
	return false;
      else if (!(reload_completed
		 ? rtx_renumbered_equal_p (XEXP (n1, 0), XEXP (n2, 0))
		 : rtx_equal_p (XEXP (n1, 0), XEXP (n2, 0))))
	return false;
    }
}

1123 1124 1125 1126 1127 1128
/* Examine I1 and I2 and return:
   - dir_forward if I1 can be replaced by I2, or
   - dir_backward if I2 can be replaced by I1, or
   - dir_both if both are the case.  */

static enum replace_direction
1129
old_insns_match_p (int mode ATTRIBUTE_UNUSED, rtx_insn *i1, rtx_insn *i2)
1130 1131 1132 1133 1134
{
  rtx p1, p2;

  /* Verify that I1 and I2 are equivalent.  */
  if (GET_CODE (i1) != GET_CODE (i2))
1135
    return dir_none;
1136

1137 1138 1139
  /* __builtin_unreachable() may lead to empty blocks (ending with
     NOTE_INSN_BASIC_BLOCK).  They may be crossjumped. */
  if (NOTE_INSN_BASIC_BLOCK_P (i1) && NOTE_INSN_BASIC_BLOCK_P (i2))
1140
    return dir_both;
1141

1142 1143 1144
  /* ??? Do not allow cross-jumping between different stack levels.  */
  p1 = find_reg_note (i1, REG_ARGS_SIZE, NULL);
  p2 = find_reg_note (i2, REG_ARGS_SIZE, NULL);
1145 1146 1147 1148 1149 1150 1151 1152 1153 1154
  if (p1 && p2)
    {
      p1 = XEXP (p1, 0);
      p2 = XEXP (p2, 0);
      if (!rtx_equal_p (p1, p2))
        return dir_none;

      /* ??? Worse, this adjustment had better be constant lest we
         have differing incoming stack levels.  */
      if (!frame_pointer_needed
1155
	  && known_eq (find_args_size_adjust (i1), HOST_WIDE_INT_MIN))
1156 1157 1158
	return dir_none;
    }
  else if (p1 || p2)
1159 1160
    return dir_none;

1161 1162 1163 1164 1165
  /* Do not allow cross-jumping between frame related insns and other
     insns.  */
  if (RTX_FRAME_RELATED_P (i1) != RTX_FRAME_RELATED_P (i2))
    return dir_none;

1166
  p1 = PATTERN (i1);
1167 1168 1169
  p2 = PATTERN (i2);

  if (GET_CODE (p1) != GET_CODE (p2))
1170
    return dir_none;
1171 1172 1173 1174 1175 1176 1177 1178 1179

  /* If this is a CALL_INSN, compare register usage information.
     If we don't check this on stack register machines, the two
     CALL_INSNs might be merged leaving reg-stack.c with mismatching
     numbers of stack registers in the same basic block.
     If we don't check this on machines with delay slots, a delay slot may
     be filled that clobbers a parameter expected by the subroutine.

     ??? We take the simple route for now and assume that if they're
1180
     equal, they were constructed identically.
1181

1182 1183 1184 1185 1186 1187 1188 1189 1190
     Also check for identical exception regions.  */

  if (CALL_P (i1))
    {
      /* Ensure the same EH region.  */
      rtx n1 = find_reg_note (i1, REG_EH_REGION, 0);
      rtx n2 = find_reg_note (i2, REG_EH_REGION, 0);

      if (!n1 && n2)
1191
	return dir_none;
1192 1193

      if (n1 && (!n2 || XEXP (n1, 0) != XEXP (n2, 0)))
1194
	return dir_none;
1195 1196

      if (!rtx_equal_p (CALL_INSN_FUNCTION_USAGE (i1),
Mike Stump committed
1197
			CALL_INSN_FUNCTION_USAGE (i2))
1198
	  || SIBLING_CALL_P (i1) != SIBLING_CALL_P (i2))
1199
	return dir_none;
1200 1201 1202

      /* For address sanitizer, never crossjump __asan_report_* builtins,
	 otherwise errors might be reported on incorrect lines.  */
Marek Polacek committed
1203
      if (flag_sanitize & SANITIZE_ADDRESS)
1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216
	{
	  rtx call = get_call_rtx_from (i1);
	  if (call && GET_CODE (XEXP (XEXP (call, 0), 0)) == SYMBOL_REF)
	    {
	      rtx symbol = XEXP (XEXP (call, 0), 0);
	      if (SYMBOL_REF_DECL (symbol)
		  && TREE_CODE (SYMBOL_REF_DECL (symbol)) == FUNCTION_DECL)
		{
		  if ((DECL_BUILT_IN_CLASS (SYMBOL_REF_DECL (symbol))
		       == BUILT_IN_NORMAL)
		      && DECL_FUNCTION_CODE (SYMBOL_REF_DECL (symbol))
			 >= BUILT_IN_ASAN_REPORT_LOAD1
		      && DECL_FUNCTION_CODE (SYMBOL_REF_DECL (symbol))
1217
			 <= BUILT_IN_ASAN_STOREN)
1218 1219 1220 1221
		    return dir_none;
		}
	    }
	}
1222
    }
1223

1224 1225 1226 1227 1228
  /* If both i1 and i2 are frame related, verify all the CFA notes
     in the same order and with the same content.  */
  if (RTX_FRAME_RELATED_P (i1) && !insns_have_identical_cfa_notes (i1, i2))
    return dir_none;

1229 1230 1231 1232 1233 1234 1235 1236
#ifdef STACK_REGS
  /* If cross_jump_death_matters is not 0, the insn's mode
     indicates whether or not the insn contains any stack-like
     regs.  */

  if ((mode & CLEANUP_POST_REGSTACK) && stack_regs_mentioned (i1))
    {
      /* If register stack conversion has already been done, then
Mike Stump committed
1237 1238
	 death notes must also be compared before it is certain that
	 the two instruction streams match.  */
1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253

      rtx note;
      HARD_REG_SET i1_regset, i2_regset;

      CLEAR_HARD_REG_SET (i1_regset);
      CLEAR_HARD_REG_SET (i2_regset);

      for (note = REG_NOTES (i1); note; note = XEXP (note, 1))
	if (REG_NOTE_KIND (note) == REG_DEAD && STACK_REG_P (XEXP (note, 0)))
	  SET_HARD_REG_BIT (i1_regset, REGNO (XEXP (note, 0)));

      for (note = REG_NOTES (i2); note; note = XEXP (note, 1))
	if (REG_NOTE_KIND (note) == REG_DEAD && STACK_REG_P (XEXP (note, 0)))
	  SET_HARD_REG_BIT (i2_regset, REGNO (XEXP (note, 0)));

1254
      if (!hard_reg_set_equal_p (i1_regset, i2_regset))
1255
	return dir_none;
1256 1257 1258 1259 1260
    }
#endif

  if (reload_completed
      ? rtx_renumbered_equal_p (p1, p2) : rtx_equal_p (p1, p2))
1261
    return dir_both;
1262

1263
  return can_replace_by (i1, i2);
1264 1265
}

1266 1267 1268 1269
/* When comparing insns I1 and I2 in flow_find_cross_jump or
   flow_find_head_matching_sequence, ensure the notes match.  */

static void
1270
merge_notes (rtx_insn *i1, rtx_insn *i2)
1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288
{
  /* If the merged insns have different REG_EQUAL notes, then
     remove them.  */
  rtx equiv1 = find_reg_equal_equiv_note (i1);
  rtx equiv2 = find_reg_equal_equiv_note (i2);

  if (equiv1 && !equiv2)
    remove_note (i1, equiv1);
  else if (!equiv1 && equiv2)
    remove_note (i2, equiv2);
  else if (equiv1 && equiv2
	   && !rtx_equal_p (XEXP (equiv1, 0), XEXP (equiv2, 0)))
    {
      remove_note (i1, equiv1);
      remove_note (i2, equiv2);
    }
}

1289 1290 1291 1292 1293 1294 1295
 /* Walks from I1 in BB1 backward till the next non-debug insn, and returns the
    resulting insn in I1, and the corresponding bb in BB1.  At the head of a
    bb, if there is a predecessor bb that reaches this bb via fallthru, and
    FOLLOW_FALLTHRU, walks further in the predecessor bb and registers this in
    DID_FALLTHRU.  Otherwise, stops at the head of the bb.  */

static void
1296
walk_to_nondebug_insn (rtx_insn **i1, basic_block *bb1, bool follow_fallthru,
1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315
                       bool *did_fallthru)
{
  edge fallthru;

  *did_fallthru = false;

  /* Ignore notes.  */
  while (!NONDEBUG_INSN_P (*i1))
    {
      if (*i1 != BB_HEAD (*bb1))
        {
          *i1 = PREV_INSN (*i1);
          continue;
        }

      if (!follow_fallthru)
        return;

      fallthru = find_fallthru_edge ((*bb1)->preds);
1316
      if (!fallthru || fallthru->src == ENTRY_BLOCK_PTR_FOR_FN (cfun)
1317 1318 1319 1320 1321 1322 1323 1324 1325
          || !single_succ_p (fallthru->src))
        return;

      *bb1 = fallthru->src;
      *i1 = BB_END (*bb1);
      *did_fallthru = true;
     }
}

1326
/* Look through the insns at the end of BB1 and BB2 and find the longest
1327 1328 1329 1330 1331 1332 1333
   sequence that are either equivalent, or allow forward or backward
   replacement.  Store the first insns for that sequence in *F1 and *F2 and
   return the sequence length.

   DIR_P indicates the allowed replacement direction on function entry, and
   the actual replacement direction on function exit.  If NULL, only equivalent
   sequences are allowed.
1334 1335 1336 1337

   To simplify callers of this function, if the blocks match exactly,
   store the head of the blocks in *F1 and *F2.  */

1338
int
1339 1340
flow_find_cross_jump (basic_block bb1, basic_block bb2, rtx_insn **f1,
		      rtx_insn **f2, enum replace_direction *dir_p)
1341
{
1342
  rtx_insn *i1, *i2, *last1, *last2, *afterlast1, *afterlast2;
1343
  int ninsns = 0;
1344
  enum replace_direction dir, last_dir, afterlast_dir;
1345
  bool follow_fallthru, did_fallthru;
1346 1347 1348 1349 1350 1351 1352

  if (dir_p)
    dir = *dir_p;
  else
    dir = dir_both;
  afterlast_dir = dir;
  last_dir = afterlast_dir;
1353 1354 1355 1356 1357

  /* Skip simple jumps at the end of the blocks.  Complex jumps still
     need to be compared for equivalence, which we'll do below.  */

  i1 = BB_END (bb1);
1358
  last1 = afterlast1 = last2 = afterlast2 = NULL;
1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370
  if (onlyjump_p (i1)
      || (returnjump_p (i1) && !side_effects_p (PATTERN (i1))))
    {
      last1 = i1;
      i1 = PREV_INSN (i1);
    }

  i2 = BB_END (bb2);
  if (onlyjump_p (i2)
      || (returnjump_p (i2) && !side_effects_p (PATTERN (i2))))
    {
      last2 = i2;
1371 1372 1373
      /* Count everything except for unconditional jump as insn.
	 Don't count any jumps if dir_p is NULL.  */
      if (!simplejump_p (i2) && !returnjump_p (i2) && last1 && dir_p)
1374 1375 1376 1377 1378 1379
	ninsns++;
      i2 = PREV_INSN (i2);
    }

  while (true)
    {
1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404
      /* In the following example, we can replace all jumps to C by jumps to A.

         This removes 4 duplicate insns.
         [bb A] insn1            [bb C] insn1
                insn2                   insn2
         [bb B] insn3                   insn3
                insn4                   insn4
                jump_insn               jump_insn

         We could also replace all jumps to A by jumps to C, but that leaves B
         alive, and removes only 2 duplicate insns.  In a subsequent crossjump
         step, all jumps to B would be replaced with jumps to the middle of C,
         achieving the same result with more effort.
         So we allow only the first possibility, which means that we don't allow
         fallthru in the block that's being replaced.  */

      follow_fallthru = dir_p && dir != dir_forward;
      walk_to_nondebug_insn (&i1, &bb1, follow_fallthru, &did_fallthru);
      if (did_fallthru)
        dir = dir_backward;

      follow_fallthru = dir_p && dir != dir_backward;
      walk_to_nondebug_insn (&i2, &bb2, follow_fallthru, &did_fallthru);
      if (did_fallthru)
        dir = dir_forward;
1405 1406 1407 1408

      if (i1 == BB_HEAD (bb1) || i2 == BB_HEAD (bb2))
	break;

1409 1410 1411 1412 1413 1414 1415
      /* Do not turn corssing edge to non-crossing or vice versa after
	 reload. */
      if (BB_PARTITION (BLOCK_FOR_INSN (i1))
	  != BB_PARTITION (BLOCK_FOR_INSN (i2))
	  && reload_completed)
	break;

1416 1417
      dir = merge_dir (dir, old_insns_match_p (0, i1, i2));
      if (dir == dir_none || (!dir_p && dir != dir_both))
1418 1419 1420 1421 1422 1423 1424
	break;

      merge_memattrs (i1, i2);

      /* Don't begin a cross-jump with a NOTE insn.  */
      if (INSN_P (i1))
	{
1425
	  merge_notes (i1, i2);
1426 1427 1428

	  afterlast1 = last1, afterlast2 = last2;
	  last1 = i1, last2 = i2;
1429 1430
	  afterlast_dir = last_dir;
	  last_dir = dir;
1431
	  if (active_insn_p (i1))
1432
	    ninsns++;
1433 1434 1435 1436 1437 1438 1439 1440
	}

      i1 = PREV_INSN (i1);
      i2 = PREV_INSN (i2);
    }

  /* Don't allow the insn after a compare to be shared by
     cross-jumping unless the compare is also shared.  */
1441 1442
  if (HAVE_cc0 && ninsns && reg_mentioned_p (cc0_rtx, last1)
      && ! sets_cc0_p (last1))
1443
    last1 = afterlast1, last2 = afterlast2, last_dir = afterlast_dir, ninsns--;
1444 1445 1446 1447 1448 1449

  /* Include preceding notes and labels in the cross-jump.  One,
     this may bring us to the head of the blocks as requested above.
     Two, it keeps line number notes as matched as may be.  */
  if (ninsns)
    {
1450
      bb1 = BLOCK_FOR_INSN (last1);
1451
      while (last1 != BB_HEAD (bb1) && !NONDEBUG_INSN_P (PREV_INSN (last1)))
1452 1453 1454 1455 1456
	last1 = PREV_INSN (last1);

      if (last1 != BB_HEAD (bb1) && LABEL_P (PREV_INSN (last1)))
	last1 = PREV_INSN (last1);

1457
      bb2 = BLOCK_FOR_INSN (last2);
1458
      while (last2 != BB_HEAD (bb2) && !NONDEBUG_INSN_P (PREV_INSN (last2)))
1459 1460 1461 1462 1463 1464 1465 1466 1467
	last2 = PREV_INSN (last2);

      if (last2 != BB_HEAD (bb2) && LABEL_P (PREV_INSN (last2)))
	last2 = PREV_INSN (last2);

      *f1 = last1;
      *f2 = last2;
    }

1468 1469
  if (dir_p)
    *dir_p = last_dir;
1470 1471 1472
  return ninsns;
}

1473 1474 1475
/* Like flow_find_cross_jump, except start looking for a matching sequence from
   the head of the two blocks.  Do not include jumps at the end.
   If STOP_AFTER is nonzero, stop after finding that many matching
1476 1477
   instructions.  If STOP_AFTER is zero, count all INSN_P insns, if it is
   non-zero, only count active insns.  */
1478 1479

int
1480 1481
flow_find_head_matching_sequence (basic_block bb1, basic_block bb2, rtx_insn **f1,
				  rtx_insn **f2, int stop_after)
1482
{
1483
  rtx_insn *i1, *i2, *last1, *last2, *beforelast1, *beforelast2;
1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497
  int ninsns = 0;
  edge e;
  edge_iterator ei;
  int nehedges1 = 0, nehedges2 = 0;

  FOR_EACH_EDGE (e, ei, bb1->succs)
    if (e->flags & EDGE_EH)
      nehedges1++;
  FOR_EACH_EDGE (e, ei, bb2->succs)
    if (e->flags & EDGE_EH)
      nehedges2++;

  i1 = BB_HEAD (bb1);
  i2 = BB_HEAD (bb2);
1498
  last1 = beforelast1 = last2 = beforelast2 = NULL;
1499 1500 1501

  while (true)
    {
1502
      /* Ignore notes, except NOTE_INSN_EPILOGUE_BEG.  */
1503
      while (!NONDEBUG_INSN_P (i1) && i1 != BB_END (bb1))
1504 1505 1506 1507 1508
	{
	  if (NOTE_P (i1) && NOTE_KIND (i1) == NOTE_INSN_EPILOGUE_BEG)
	    break;
	  i1 = NEXT_INSN (i1);
	}
1509 1510

      while (!NONDEBUG_INSN_P (i2) && i2 != BB_END (bb2))
1511 1512 1513 1514 1515
	{
	  if (NOTE_P (i2) && NOTE_KIND (i2) == NOTE_INSN_EPILOGUE_BEG)
	    break;
	  i2 = NEXT_INSN (i2);
	}
1516

1517 1518 1519 1520
      if ((i1 == BB_END (bb1) && !NONDEBUG_INSN_P (i1))
	  || (i2 == BB_END (bb2) && !NONDEBUG_INSN_P (i2)))
	break;

1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 1536
      if (NOTE_P (i1) || NOTE_P (i2)
	  || JUMP_P (i1) || JUMP_P (i2))
	break;

      /* A sanity check to make sure we're not merging insns with different
	 effects on EH.  If only one of them ends a basic block, it shouldn't
	 have an EH edge; if both end a basic block, there should be the same
	 number of EH edges.  */
      if ((i1 == BB_END (bb1) && i2 != BB_END (bb2)
	   && nehedges1 > 0)
	  || (i2 == BB_END (bb2) && i1 != BB_END (bb1)
	      && nehedges2 > 0)
	  || (i1 == BB_END (bb1) && i2 == BB_END (bb2)
	      && nehedges1 != nehedges2))
	break;

1537
      if (old_insns_match_p (0, i1, i2) != dir_both)
1538 1539 1540 1541 1542 1543 1544 1545 1546 1547 1548
	break;

      merge_memattrs (i1, i2);

      /* Don't begin a cross-jump with a NOTE insn.  */
      if (INSN_P (i1))
	{
	  merge_notes (i1, i2);

	  beforelast1 = last1, beforelast2 = last2;
	  last1 = i1, last2 = i2;
1549
	  if (!stop_after || active_insn_p (i1))
1550
	    ninsns++;
1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 1562
	}

      if (i1 == BB_END (bb1) || i2 == BB_END (bb2)
	  || (stop_after > 0 && ninsns == stop_after))
	break;

      i1 = NEXT_INSN (i1);
      i2 = NEXT_INSN (i2);
    }

  /* Don't allow a compare to be shared by cross-jumping unless the insn
     after the compare is also shared.  */
1563 1564
  if (HAVE_cc0 && ninsns && reg_mentioned_p (cc0_rtx, last1)
      && sets_cc0_p (last1))
1565 1566 1567 1568 1569 1570 1571 1572 1573 1574 1575
    last1 = beforelast1, last2 = beforelast2, ninsns--;

  if (ninsns)
    {
      *f1 = last1;
      *f2 = last2;
    }

  return ninsns;
}

1576 1577 1578
/* Return true iff outgoing edges of BB1 and BB2 match, together with
   the branch instruction.  This means that if we commonize the control
   flow before end of the basic block, the semantic remains unchanged.
1579 1580 1581 1582

   We may assume that there exists one edge with a common destination.  */

static bool
1583
outgoing_edges_match (int mode, basic_block bb1, basic_block bb2)
1584
{
1585 1586 1587
  int nehedges1 = 0, nehedges2 = 0;
  edge fallthru1 = 0, fallthru2 = 0;
  edge e1, e2;
1588
  edge_iterator ei;
1589

1590
  /* If we performed shrink-wrapping, edges to the exit block can
1591 1592 1593 1594
     only be distinguished for JUMP_INSNs.  The two paths may differ in
     whether they went through the prologue.  Sibcalls are fine, we know
     that we either didn't need or inserted an epilogue before them.  */
  if (crtl->shrink_wrapped
1595 1596
      && single_succ_p (bb1)
      && single_succ (bb1) == EXIT_BLOCK_PTR_FOR_FN (cfun)
1597 1598 1599 1600
      && (!JUMP_P (BB_END (bb1))
	  /* Punt if the only successor is a fake edge to exit, the jump
	     must be some weird one.  */
	  || (single_succ_edge (bb1)->flags & EDGE_FAKE) != 0)
1601 1602
      && !(CALL_P (BB_END (bb1)) && SIBLING_CALL_P (BB_END (bb1))))
    return false;
1603

1604 1605
  /* If BB1 has only one successor, we may be looking at either an
     unconditional jump, or a fake edge to exit.  */
1606 1607
  if (single_succ_p (bb1)
      && (single_succ_edge (bb1)->flags & (EDGE_COMPLEX | EDGE_FAKE)) == 0
1608
      && (!JUMP_P (BB_END (bb1)) || simplejump_p (BB_END (bb1))))
1609 1610 1611
    return (single_succ_p (bb2)
	    && (single_succ_edge (bb2)->flags
		& (EDGE_COMPLEX | EDGE_FAKE)) == 0
1612
	    && (!JUMP_P (BB_END (bb2)) || simplejump_p (BB_END (bb2))));
1613 1614 1615

  /* Match conditional jumps - this may get tricky when fallthru and branch
     edges are crossed.  */
1616
  if (EDGE_COUNT (bb1->succs) == 2
1617 1618
      && any_condjump_p (BB_END (bb1))
      && onlyjump_p (BB_END (bb1)))
1619
    {
1620 1621 1622 1623 1624
      edge b1, f1, b2, f2;
      bool reverse, match;
      rtx set1, set2, cond1, cond2;
      enum rtx_code code1, code2;

1625
      if (EDGE_COUNT (bb2->succs) != 2
1626 1627
	  || !any_condjump_p (BB_END (bb2))
	  || !onlyjump_p (BB_END (bb2)))
1628
	return false;
1629 1630 1631 1632 1633 1634 1635

      b1 = BRANCH_EDGE (bb1);
      b2 = BRANCH_EDGE (bb2);
      f1 = FALLTHRU_EDGE (bb1);
      f2 = FALLTHRU_EDGE (bb2);

      /* Get around possible forwarders on fallthru edges.  Other cases
Mike Stump committed
1636
	 should be optimized out already.  */
1637 1638 1639 1640 1641 1642 1643 1644 1645 1646 1647 1648 1649 1650 1651 1652 1653 1654 1655 1656 1657 1658 1659 1660 1661 1662 1663 1664 1665 1666 1667 1668 1669 1670 1671 1672 1673 1674 1675 1676 1677 1678 1679 1680 1681 1682 1683 1684 1685 1686 1687 1688 1689 1690
      if (FORWARDER_BLOCK_P (f1->dest))
	f1 = single_succ_edge (f1->dest);

      if (FORWARDER_BLOCK_P (f2->dest))
	f2 = single_succ_edge (f2->dest);

      /* To simplify use of this function, return false if there are
	 unneeded forwarder blocks.  These will get eliminated later
	 during cleanup_cfg.  */
      if (FORWARDER_BLOCK_P (f1->dest)
	  || FORWARDER_BLOCK_P (f2->dest)
	  || FORWARDER_BLOCK_P (b1->dest)
	  || FORWARDER_BLOCK_P (b2->dest))
	return false;

      if (f1->dest == f2->dest && b1->dest == b2->dest)
	reverse = false;
      else if (f1->dest == b2->dest && b1->dest == f2->dest)
	reverse = true;
      else
	return false;

      set1 = pc_set (BB_END (bb1));
      set2 = pc_set (BB_END (bb2));
      if ((XEXP (SET_SRC (set1), 1) == pc_rtx)
	  != (XEXP (SET_SRC (set2), 1) == pc_rtx))
	reverse = !reverse;

      cond1 = XEXP (SET_SRC (set1), 0);
      cond2 = XEXP (SET_SRC (set2), 0);
      code1 = GET_CODE (cond1);
      if (reverse)
	code2 = reversed_comparison_code (cond2, BB_END (bb2));
      else
	code2 = GET_CODE (cond2);

      if (code2 == UNKNOWN)
	return false;

      /* Verify codes and operands match.  */
      match = ((code1 == code2
		&& rtx_renumbered_equal_p (XEXP (cond1, 0), XEXP (cond2, 0))
		&& rtx_renumbered_equal_p (XEXP (cond1, 1), XEXP (cond2, 1)))
	       || (code1 == swap_condition (code2)
		   && rtx_renumbered_equal_p (XEXP (cond1, 1),
					      XEXP (cond2, 0))
		   && rtx_renumbered_equal_p (XEXP (cond1, 0),
					      XEXP (cond2, 1))));

      /* If we return true, we will join the blocks.  Which means that
	 we will only have one branch prediction bit to work with.  Thus
	 we require the existing branches to have probabilities that are
	 roughly similar.  */
      if (match
1691 1692
	  && optimize_bb_for_speed_p (bb1)
	  && optimize_bb_for_speed_p (bb2))
1693
	{
1694
	  profile_probability prob2;
1695 1696 1697 1698 1699

	  if (b1->dest == b2->dest)
	    prob2 = b2->probability;
	  else
	    /* Do not use f2 probability as f2 may be forwarded.  */
1700
	    prob2 = b2->probability.invert ();
1701 1702 1703 1704

	  /* Fail if the difference in probabilities is greater than 50%.
	     This rules out two well-predicted branches with opposite
	     outcomes.  */
1705
	  if (b1->probability.differs_lot_from_p (prob2))
1706 1707
	    {
	      if (dump_file)
1708 1709 1710 1711 1712 1713 1714 1715
		{
		  fprintf (dump_file,
			   "Outcomes of branch in bb %i and %i differ too"
			   " much (", bb1->index, bb2->index);
		  b1->probability.dump (dump_file);
		  prob2.dump (dump_file);
		  fprintf (dump_file, ")\n");
		}
1716 1717 1718 1719 1720 1721 1722 1723 1724
	      return false;
	    }
	}

      if (dump_file && match)
	fprintf (dump_file, "Conditionals in bb %i and %i match.\n",
		 bb1->index, bb2->index);

      return match;
1725 1726
    }

1727
  /* Generic case - we are seeing a computed jump, table jump or trapping
1728 1729
     instruction.  */

1730 1731 1732
  /* Check whether there are tablejumps in the end of BB1 and BB2.
     Return true if they are identical.  */
    {
1733
      rtx_insn *label1, *label2;
1734
      rtx_jump_table_data *table1, *table2;
1735

1736 1737
      if (tablejump_p (BB_END (bb1), &label1, &table1)
	  && tablejump_p (BB_END (bb2), &label2, &table2)
1738 1739 1740 1741 1742
	  && GET_CODE (PATTERN (table1)) == GET_CODE (PATTERN (table2)))
	{
	  /* The labels should never be the same rtx.  If they really are same
	     the jump tables are same too. So disable crossjumping of blocks BB1
	     and BB2 because when deleting the common insns in the end of BB1
1743
	     by delete_basic_block () the jump table would be deleted too.  */
1744
	  /* If LABEL2 is referenced in BB1->END do not do anything
1745 1746
	     because we would loose information when replacing
	     LABEL1 by LABEL2 and then LABEL2 by LABEL1 in BB1->END.  */
1747
	  if (label1 != label2 && !rtx_referenced_p (label2, BB_END (bb1)))
1748 1749 1750 1751 1752 1753 1754 1755 1756 1757 1758 1759 1760 1761 1762 1763 1764 1765 1766 1767 1768 1769 1770 1771
	    {
	      /* Set IDENTICAL to true when the tables are identical.  */
	      bool identical = false;
	      rtx p1, p2;

	      p1 = PATTERN (table1);
	      p2 = PATTERN (table2);
	      if (GET_CODE (p1) == ADDR_VEC && rtx_equal_p (p1, p2))
		{
		  identical = true;
		}
	      else if (GET_CODE (p1) == ADDR_DIFF_VEC
		       && (XVECLEN (p1, 1) == XVECLEN (p2, 1))
		       && rtx_equal_p (XEXP (p1, 2), XEXP (p2, 2))
		       && rtx_equal_p (XEXP (p1, 3), XEXP (p2, 3)))
		{
		  int i;

		  identical = true;
		  for (i = XVECLEN (p1, 1) - 1; i >= 0 && identical; i--)
		    if (!rtx_equal_p (XVECEXP (p1, 1, i), XVECEXP (p2, 1, i)))
		      identical = false;
		}

1772
	      if (identical)
1773 1774 1775
		{
		  bool match;

1776
		  /* Temporarily replace references to LABEL1 with LABEL2
1777
		     in BB1->END so that we could compare the instructions.  */
1778
		  replace_label_in_insn (BB_END (bb1), label1, label2, false);
1779

1780 1781
		  match = (old_insns_match_p (mode, BB_END (bb1), BB_END (bb2))
			   == dir_both);
1782 1783
		  if (dump_file && match)
		    fprintf (dump_file,
1784 1785 1786
			     "Tablejumps in bb %i and %i match.\n",
			     bb1->index, bb2->index);

1787 1788 1789
		  /* Set the original label in BB1->END because when deleting
		     a block whose end is a tablejump, the tablejump referenced
		     from the instruction is deleted too.  */
1790
		  replace_label_in_insn (BB_END (bb1), label2, label1, false);
1791

1792 1793 1794 1795 1796 1797 1798
		  return match;
		}
	    }
	  return false;
	}
    }

1799 1800 1801 1802
  /* Find the last non-debug non-note instruction in each bb, except
     stop when we see the NOTE_INSN_BASIC_BLOCK, as old_insns_match_p
     handles that case specially. old_insns_match_p does not handle
     other types of instruction notes.  */
1803 1804
  rtx_insn *last1 = BB_END (bb1);
  rtx_insn *last2 = BB_END (bb2);
1805 1806 1807 1808 1809 1810 1811 1812
  while (!NOTE_INSN_BASIC_BLOCK_P (last1) &&
         (DEBUG_INSN_P (last1) || NOTE_P (last1)))
    last1 = PREV_INSN (last1);
  while (!NOTE_INSN_BASIC_BLOCK_P (last2) &&
         (DEBUG_INSN_P (last2) || NOTE_P (last2)))
    last2 = PREV_INSN (last2);
  gcc_assert (last1 && last2);

1813
  /* First ensure that the instructions match.  There may be many outgoing
1814
     edges so this test is generally cheaper.  */
1815
  if (old_insns_match_p (mode, last1, last2) != dir_both)
1816 1817 1818 1819 1820
    return false;

  /* Search the outgoing edges, ensure that the counts do match, find possible
     fallthru and exception handling edges since these needs more
     validation.  */
1821 1822 1823
  if (EDGE_COUNT (bb1->succs) != EDGE_COUNT (bb2->succs))
    return false;

1824
  bool nonfakeedges = false;
1825
  FOR_EACH_EDGE (e1, ei, bb1->succs)
1826
    {
1827
      e2 = EDGE_SUCC (bb2, ei.index);
Mike Stump committed
1828

1829 1830 1831
      if ((e1->flags & EDGE_FAKE) == 0)
	nonfakeedges = true;

1832 1833
      if (e1->flags & EDGE_EH)
	nehedges1++;
1834

1835 1836
      if (e2->flags & EDGE_EH)
	nehedges2++;
1837

1838 1839 1840 1841 1842
      if (e1->flags & EDGE_FALLTHRU)
	fallthru1 = e1;
      if (e2->flags & EDGE_FALLTHRU)
	fallthru2 = e2;
    }
1843

1844
  /* If number of edges of various types does not match, fail.  */
1845
  if (nehedges1 != nehedges2
1846
      || (fallthru1 != 0) != (fallthru2 != 0))
1847 1848
    return false;

1849 1850 1851 1852 1853 1854 1855 1856 1857 1858 1859 1860
  /* If !ACCUMULATE_OUTGOING_ARGS, bb1 (and bb2) have no successors
     and the last real insn doesn't have REG_ARGS_SIZE note, don't
     attempt to optimize, as the two basic blocks might have different
     REG_ARGS_SIZE depths.  For noreturn calls and unconditional
     traps there should be REG_ARG_SIZE notes, they could be missing
     for __builtin_unreachable () uses though.  */
  if (!nonfakeedges
      && !ACCUMULATE_OUTGOING_ARGS
      && (!INSN_P (last1)
          || !find_reg_note (last1, REG_ARGS_SIZE, NULL)))
    return false;

1861 1862 1863 1864
  /* fallthru edges must be forwarded to the same destination.  */
  if (fallthru1)
    {
      basic_block d1 = (forwarder_block_p (fallthru1->dest)
1865
			? single_succ (fallthru1->dest): fallthru1->dest);
1866
      basic_block d2 = (forwarder_block_p (fallthru2->dest)
1867
			? single_succ (fallthru2->dest): fallthru2->dest);
1868

1869 1870 1871
      if (d1 != d2)
	return false;
    }
1872

1873 1874
  /* Ensure the same EH region.  */
  {
1875 1876
    rtx n1 = find_reg_note (BB_END (bb1), REG_EH_REGION, 0);
    rtx n2 = find_reg_note (BB_END (bb2), REG_EH_REGION, 0);
1877

1878 1879 1880 1881 1882 1883
    if (!n1 && n2)
      return false;

    if (n1 && (!n2 || XEXP (n1, 0) != XEXP (n2, 0)))
      return false;
  }
1884

1885 1886 1887 1888 1889 1890 1891 1892 1893 1894 1895 1896 1897 1898 1899 1900 1901 1902 1903 1904 1905 1906 1907 1908
  /* The same checks as in try_crossjump_to_edge. It is required for RTL
     version of sequence abstraction.  */
  FOR_EACH_EDGE (e1, ei, bb2->succs)
    {
      edge e2;
      edge_iterator ei;
      basic_block d1 = e1->dest;

      if (FORWARDER_BLOCK_P (d1))
        d1 = EDGE_SUCC (d1, 0)->dest;

      FOR_EACH_EDGE (e2, ei, bb1->succs)
        {
          basic_block d2 = e2->dest;
          if (FORWARDER_BLOCK_P (d2))
            d2 = EDGE_SUCC (d2, 0)->dest;
          if (d1 == d2)
            break;
        }

      if (!e2)
        return false;
    }

1909
  return true;
1910 1911
}

1912 1913 1914 1915 1916 1917 1918 1919 1920 1921
/* Returns true if BB basic block has a preserve label.  */

static bool
block_has_preserve_label (basic_block bb)
{
  return (bb
          && block_label (bb)
          && LABEL_PRESERVE_P (block_label (bb)));
}

1922 1923
/* E1 and E2 are edges with the same destination block.  Search their
   predecessors for common code.  If found, redirect control flow from
1924 1925 1926
   (maybe the middle of) E1->SRC to (maybe the middle of) E2->SRC (dir_forward),
   or the other way around (dir_backward).  DIR specifies the allowed
   replacement direction.  */
1927 1928

static bool
1929 1930
try_crossjump_to_edge (int mode, edge e1, edge e2,
                       enum replace_direction dir)
1931
{
1932
  int nmatch;
1933
  basic_block src1 = e1->src, src2 = e2->src;
1934
  basic_block redirect_to, redirect_from, to_remove;
1935
  basic_block osrc1, osrc2, redirect_edges_to, tmp;
1936
  rtx_insn *newpos1, *newpos2;
1937
  edge s;
1938
  edge_iterator ei;
1939

1940
  newpos1 = newpos2 = NULL;
1941

1942 1943 1944 1945
  /* Search backward through forwarder blocks.  We don't need to worry
     about multiple entry or chained forwarders, as they will be optimized
     away.  We do this to look past the unconditional jump following a
     conditional jump that is required due to the current CFG shape.  */
1946
  if (single_pred_p (src1)
1947
      && FORWARDER_BLOCK_P (src1))
1948
    e1 = single_pred_edge (src1), src1 = e1->src;
1949

1950
  if (single_pred_p (src2)
1951
      && FORWARDER_BLOCK_P (src2))
1952
    e2 = single_pred_edge (src2), src2 = e2->src;
1953 1954

  /* Nothing to do if we reach ENTRY, or a common source block.  */
1955 1956
  if (src1 == ENTRY_BLOCK_PTR_FOR_FN (cfun) || src2
      == ENTRY_BLOCK_PTR_FOR_FN (cfun))
1957 1958 1959 1960 1961
    return false;
  if (src1 == src2)
    return false;

  /* Seeing more than 1 forwarder blocks would confuse us later...  */
1962
  if (FORWARDER_BLOCK_P (e1->dest)
1963
      && FORWARDER_BLOCK_P (single_succ (e1->dest)))
1964
    return false;
1965

1966
  if (FORWARDER_BLOCK_P (e2->dest)
1967
      && FORWARDER_BLOCK_P (single_succ (e2->dest)))
1968 1969 1970 1971
    return false;

  /* Likewise with dead code (possibly newly created by the other optimizations
     of cfg_cleanup).  */
1972
  if (EDGE_COUNT (src1->preds) == 0 || EDGE_COUNT (src2->preds) == 0)
1973 1974
    return false;

1975 1976 1977 1978 1979
  /* Do not turn corssing edge to non-crossing or vice versa after reload.  */
  if (BB_PARTITION (src1) != BB_PARTITION (src2)
      && reload_completed)
    return false;

1980
  /* Look for the common insn sequence, part the first ...  */
1981
  if (!outgoing_edges_match (mode, src1, src2))
1982 1983 1984
    return false;

  /* ... and part the second.  */
1985
  nmatch = flow_find_cross_jump (src1, src2, &newpos1, &newpos2, &dir);
1986

1987 1988 1989 1990 1991 1992 1993
  osrc1 = src1;
  osrc2 = src2;
  if (newpos1 != NULL_RTX)
    src1 = BLOCK_FOR_INSN (newpos1);
  if (newpos2 != NULL_RTX)
    src2 = BLOCK_FOR_INSN (newpos2);

1994 1995 1996 1997 1998
  /* Check that SRC1 and SRC2 have preds again.  They may have changed
     above due to the call to flow_find_cross_jump.  */
  if (EDGE_COUNT (src1->preds) == 0 || EDGE_COUNT (src2->preds) == 0)
    return false;

1999 2000
  if (dir == dir_backward)
    {
2001 2002 2003 2004
      std::swap (osrc1, osrc2);
      std::swap (src1, src2);
      std::swap (e1, e2);
      std::swap (newpos1, newpos2);
2005 2006
    }

2007 2008 2009 2010
  /* Don't proceed with the crossjump unless we found a sufficient number
     of matching instructions or the 'from' block was totally matched
     (such that its predecessors will hopefully be redirected and the
     block removed).  */
2011 2012
  if ((nmatch < PARAM_VALUE (PARAM_MIN_CROSSJUMP_INSNS))
      && (newpos1 != BB_HEAD (src1)))
2013
    return false;
2014

2015
  /* Avoid deleting preserve label when redirecting ABNORMAL edges.  */
2016 2017 2018 2019
  if (block_has_preserve_label (e1->dest)
      && (e1->flags & EDGE_ABNORMAL))
    return false;

2020 2021 2022 2023 2024
  /* Here we know that the insns in the end of SRC1 which are common with SRC2
     will be deleted.
     If we have tablejumps in the end of SRC1 and SRC2
     they have been already compared for equivalence in outgoing_edges_match ()
     so replace the references to TABLE1 by references to TABLE2.  */
2025
  {
2026
      rtx_insn *label1, *label2;
2027
      rtx_jump_table_data *table1, *table2;
2028

2029 2030
      if (tablejump_p (BB_END (osrc1), &label1, &table1)
	  && tablejump_p (BB_END (osrc2), &label2, &table2)
2031 2032
	  && label1 != label2)
	{
2033
	  rtx_insn *insn;
2034 2035 2036 2037 2038 2039 2040

	  /* Replace references to LABEL1 with LABEL2.  */
	  for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
	    {
	      /* Do not replace the label in SRC1->END because when deleting
		 a block whose end is a tablejump, the tablejump referenced
		 from the instruction is deleted too.  */
2041
	      if (insn != BB_END (osrc1))
2042
		replace_label_in_insn (insn, label1, label2, true);
2043 2044
	    }
	}
2045
  }
2046

2047 2048 2049
  /* Avoid splitting if possible.  We must always split when SRC2 has
     EH predecessor edges, or we may end up with basic blocks with both
     normal and EH predecessor edges.  */
2050
  if (newpos2 == BB_HEAD (src2)
2051
      && !(EDGE_PRED (src2, 0)->flags & EDGE_EH))
2052 2053 2054
    redirect_to = src2;
  else
    {
2055
      if (newpos2 == BB_HEAD (src2))
2056 2057
	{
	  /* Skip possible basic block header.  */
2058 2059
	  if (LABEL_P (newpos2))
	    newpos2 = NEXT_INSN (newpos2);
2060 2061
	  while (DEBUG_INSN_P (newpos2))
	    newpos2 = NEXT_INSN (newpos2);
2062 2063
	  if (NOTE_P (newpos2))
	    newpos2 = NEXT_INSN (newpos2);
2064 2065
	  while (DEBUG_INSN_P (newpos2))
	    newpos2 = NEXT_INSN (newpos2);
2066 2067
	}

2068 2069
      if (dump_file)
	fprintf (dump_file, "Splitting bb %i before %i insns\n",
2070
		 src2->index, nmatch);
2071
      redirect_to = split_block (src2, PREV_INSN (newpos2))->dest;
2072 2073
    }

2074
  if (dump_file)
2075 2076 2077
    fprintf (dump_file,
	     "Cross jumping from bb %i to bb %i; %i common insns\n",
	     src1->index, src2->index, nmatch);
2078

2079
  /* We may have some registers visible through the block.  */
2080
  df_set_bb_dirty (redirect_to);
2081

2082 2083 2084 2085 2086
  if (osrc2 == src2)
    redirect_edges_to = redirect_to;
  else
    redirect_edges_to = osrc2;

2087
  /* Recompute the counts of destinations of outgoing edges.  */
2088
  FOR_EACH_EDGE (s, ei, redirect_edges_to->succs)
2089 2090
    {
      edge s2;
2091
      edge_iterator ei;
2092 2093
      basic_block d = s->dest;

2094
      if (FORWARDER_BLOCK_P (d))
2095
	d = single_succ (d);
2096

2097
      FOR_EACH_EDGE (s2, ei, src1->succs)
2098 2099
	{
	  basic_block d2 = s2->dest;
2100
	  if (FORWARDER_BLOCK_P (d2))
2101
	    d2 = single_succ (d2);
2102 2103 2104
	  if (d == d2)
	    break;
	}
2105

2106
      /* Take care to update possible forwarder blocks.  We verified
Mike Stump committed
2107 2108
	 that there is no more than one in the chain, so we can't run
	 into infinite loop.  */
2109
      if (FORWARDER_BLOCK_P (s->dest))
2110
	s->dest->count += s->count ();
2111

2112
      if (FORWARDER_BLOCK_P (s2->dest))
2113
	s2->dest->count -= s->count ();
2114

2115 2116 2117
      s->probability = s->probability.combine_with_count
			  (redirect_edges_to->count,
			   s2->probability, src1->count);
2118 2119
    }

2120
  /* Adjust count for the block.  An earlier jump
2121 2122 2123
     threading pass may have left the profile in an inconsistent
     state (see update_bb_profile_for_threading) so we must be
     prepared for overflows.  */
2124 2125 2126 2127 2128 2129 2130 2131 2132 2133
  tmp = redirect_to;
  do
    {
      tmp->count += src1->count;
      if (tmp == redirect_edges_to)
        break;
      tmp = find_fallthru_edge (tmp->succs)->dest;
    }
  while (true);
  update_br_prob_note (redirect_edges_to);
2134 2135 2136

  /* Edit SRC1 to go to REDIRECT_TO at NEWPOS1.  */

2137 2138 2139
  /* Skip possible basic block header.  */
  if (LABEL_P (newpos1))
    newpos1 = NEXT_INSN (newpos1);
2140 2141 2142 2143

  while (DEBUG_INSN_P (newpos1))
    newpos1 = NEXT_INSN (newpos1);

2144
  if (NOTE_INSN_BASIC_BLOCK_P (newpos1))
2145 2146
    newpos1 = NEXT_INSN (newpos1);

2147 2148 2149
  while (DEBUG_INSN_P (newpos1))
    newpos1 = NEXT_INSN (newpos1);

2150
  redirect_from = split_block (src1, PREV_INSN (newpos1))->src;
2151
  to_remove = single_succ (redirect_from);
2152

2153
  redirect_edge_and_branch_force (single_succ_edge (redirect_from), redirect_to);
2154
  delete_basic_block (to_remove);
2155

2156
  update_forwarder_flag (redirect_from);
2157 2158
  if (redirect_to != src2)
    update_forwarder_flag (src2);
2159

2160 2161 2162 2163 2164 2165 2166 2167
  return true;
}

/* Search the predecessors of BB for common insn sequences.  When found,
   share code between them by redirecting control flow.  Return true if
   any changes made.  */

static bool
2168
try_crossjump_bb (int mode, basic_block bb)
2169
{
2170
  edge e, e2, fallthru;
2171
  bool changed;
2172
  unsigned max, ix, ix2;
2173

2174
  /* Nothing to do if there is not at least two incoming edges.  */
2175
  if (EDGE_COUNT (bb->preds) < 2)
2176 2177
    return false;

2178 2179
  /* Don't crossjump if this block ends in a computed jump,
     unless we are optimizing for size.  */
2180
  if (optimize_bb_for_size_p (bb)
2181
      && bb != EXIT_BLOCK_PTR_FOR_FN (cfun)
2182 2183 2184
      && computed_jump_p (BB_END (bb)))
    return false;

2185 2186
  /* If we are partitioning hot/cold basic blocks, we don't want to
     mess up unconditional or indirect jumps that cross between hot
Mike Stump committed
2187 2188
     and cold sections.

2189
     Basic block partitioning may result in some jumps that appear to
Mike Stump committed
2190 2191 2192
     be optimizable (or blocks that appear to be mergeable), but which really
     must be left untouched (they are required to make it safely across
     partition boundaries).  See the comments at the top of
2193 2194
     bb-reorder.c:partition_hot_cold_basic_blocks for complete details.  */

Mike Stump committed
2195 2196
  if (BB_PARTITION (EDGE_PRED (bb, 0)->src) !=
					BB_PARTITION (EDGE_PRED (bb, 1)->src)
2197
      || (EDGE_PRED (bb, 0)->flags & EDGE_CROSSING))
2198 2199
    return false;

2200 2201 2202
  /* It is always cheapest to redirect a block that ends in a branch to
     a block that falls through into BB, as that adds no branches to the
     program.  We'll try that combination first.  */
2203 2204
  fallthru = NULL;
  max = PARAM_VALUE (PARAM_MAX_CROSSJUMP_EDGES);
2205 2206 2207 2208

  if (EDGE_COUNT (bb->preds) > max)
    return false;

2209
  fallthru = find_fallthru_edge (bb->preds);
2210 2211

  changed = false;
2212
  for (ix = 0; ix < EDGE_COUNT (bb->preds);)
2213
    {
2214
      e = EDGE_PRED (bb, ix);
2215
      ix++;
2216

2217 2218
      /* As noted above, first try with the fallthru predecessor (or, a
	 fallthru predecessor if we are in cfglayout mode).  */
2219 2220 2221 2222 2223 2224
      if (fallthru)
	{
	  /* Don't combine the fallthru edge into anything else.
	     If there is a match, we'll do it the other way around.  */
	  if (e == fallthru)
	    continue;
2225 2226 2227
	  /* If nothing changed since the last attempt, there is nothing
	     we can do.  */
	  if (!first_pass
2228 2229
	      && !((e->src->flags & BB_MODIFIED)
		   || (fallthru->src->flags & BB_MODIFIED)))
2230
	    continue;
2231

2232
	  if (try_crossjump_to_edge (mode, e, fallthru, dir_forward))
2233 2234
	    {
	      changed = true;
2235
	      ix = 0;
2236 2237 2238 2239 2240 2241 2242 2243 2244 2245 2246 2247 2248 2249 2250 2251
	      continue;
	    }
	}

      /* Non-obvious work limiting check: Recognize that we're going
	 to call try_crossjump_bb on every basic block.  So if we have
	 two blocks with lots of outgoing edges (a switch) and they
	 share lots of common destinations, then we would do the
	 cross-jump check once for each common destination.

	 Now, if the blocks actually are cross-jump candidates, then
	 all of their destinations will be shared.  Which means that
	 we only need check them for cross-jump candidacy once.  We
	 can eliminate redundant checks of crossjump(A,B) by arbitrarily
	 choosing to do the check from the block for which the edge
	 in question is the first successor of A.  */
2252
      if (EDGE_SUCC (e->src, 0) != e)
2253 2254
	continue;

2255
      for (ix2 = 0; ix2 < EDGE_COUNT (bb->preds); ix2++)
2256
	{
2257
	  e2 = EDGE_PRED (bb, ix2);
2258 2259 2260 2261 2262 2263 2264 2265 2266 2267 2268 2269

	  if (e2 == e)
	    continue;

	  /* We've already checked the fallthru edge above.  */
	  if (e2 == fallthru)
	    continue;

	  /* The "first successor" check above only prevents multiple
	     checks of crossjump(A,B).  In order to prevent redundant
	     checks of crossjump(B,A), require that A be the block
	     with the lowest index.  */
2270
	  if (e->src->index > e2->src->index)
2271 2272
	    continue;

2273 2274 2275
	  /* If nothing changed since the last attempt, there is nothing
	     we can do.  */
	  if (!first_pass
2276 2277
	      && !((e->src->flags & BB_MODIFIED)
		   || (e2->src->flags & BB_MODIFIED)))
2278 2279
	    continue;

2280 2281 2282
	  /* Both e and e2 are not fallthru edges, so we can crossjump in either
	     direction.  */
	  if (try_crossjump_to_edge (mode, e, e2, dir_both))
2283 2284
	    {
	      changed = true;
2285
	      ix = 0;
2286 2287 2288 2289 2290
	      break;
	    }
	}
    }

2291
  if (changed)
2292
    crossjumps_occurred = true;
2293

2294 2295 2296
  return changed;
}

2297 2298 2299 2300 2301 2302 2303 2304 2305 2306
/* Search the successors of BB for common insn sequences.  When found,
   share code between them by moving it across the basic block
   boundary.  Return true if any changes made.  */

static bool
try_head_merge_bb (basic_block bb)
{
  basic_block final_dest_bb = NULL;
  int max_match = INT_MAX;
  edge e0;
2307
  rtx_insn **headptr, **currptr, **nextptr;
2308 2309
  bool changed, moveall;
  unsigned ix;
2310
  rtx_insn *e0_last_head;
2311 2312
  rtx cond;
  rtx_insn *move_before;
2313
  unsigned nedges = EDGE_COUNT (bb->succs);
2314
  rtx_insn *jump = BB_END (bb);
2315 2316 2317 2318 2319 2320 2321 2322 2323
  regset live, live_union;

  /* Nothing to do if there is not at least two outgoing edges.  */
  if (nedges < 2)
    return false;

  /* Don't crossjump if this block ends in a computed jump,
     unless we are optimizing for size.  */
  if (optimize_bb_for_size_p (bb)
2324
      && bb != EXIT_BLOCK_PTR_FOR_FN (cfun)
2325 2326 2327 2328 2329
      && computed_jump_p (BB_END (bb)))
    return false;

  cond = get_condition (jump, &move_before, true, false);
  if (cond == NULL_RTX)
2330
    {
2331
      if (HAVE_cc0 && reg_mentioned_p (cc0_rtx, jump))
2332 2333 2334 2335
	move_before = prev_nonnote_nondebug_insn (jump);
      else
	move_before = jump;
    }
2336 2337

  for (ix = 0; ix < nedges; ix++)
2338
    if (EDGE_SUCC (bb, ix)->dest == EXIT_BLOCK_PTR_FOR_FN (cfun))
2339 2340 2341 2342 2343 2344 2345 2346 2347 2348 2349 2350 2351 2352 2353 2354 2355 2356 2357 2358 2359 2360 2361 2362 2363 2364 2365 2366 2367 2368 2369 2370 2371 2372 2373 2374 2375 2376 2377 2378 2379 2380 2381 2382 2383 2384 2385 2386 2387 2388 2389 2390 2391 2392 2393 2394 2395 2396 2397 2398 2399 2400 2401
      return false;

  for (ix = 0; ix < nedges; ix++)
    {
      edge e = EDGE_SUCC (bb, ix);
      basic_block other_bb = e->dest;

      if (df_get_bb_dirty (other_bb))
	{
	  block_was_dirty = true;
	  return false;
	}

      if (e->flags & EDGE_ABNORMAL)
	return false;

      /* Normally, all destination blocks must only be reachable from this
	 block, i.e. they must have one incoming edge.

	 There is one special case we can handle, that of multiple consecutive
	 jumps where the first jumps to one of the targets of the second jump.
	 This happens frequently in switch statements for default labels.
	 The structure is as follows:
	 FINAL_DEST_BB
	 ....
	 if (cond) jump A;
	 fall through
	 BB
	 jump with targets A, B, C, D...
	 A
	 has two incoming edges, from FINAL_DEST_BB and BB

	 In this case, we can try to move the insns through BB and into
	 FINAL_DEST_BB.  */
      if (EDGE_COUNT (other_bb->preds) != 1)
	{
	  edge incoming_edge, incoming_bb_other_edge;
	  edge_iterator ei;

	  if (final_dest_bb != NULL
	      || EDGE_COUNT (other_bb->preds) != 2)
	    return false;

	  /* We must be able to move the insns across the whole block.  */
	  move_before = BB_HEAD (bb);
	  while (!NONDEBUG_INSN_P (move_before))
	    move_before = NEXT_INSN (move_before);

	  if (EDGE_COUNT (bb->preds) != 1)
	    return false;
	  incoming_edge = EDGE_PRED (bb, 0);
	  final_dest_bb = incoming_edge->src;
	  if (EDGE_COUNT (final_dest_bb->succs) != 2)
	    return false;
	  FOR_EACH_EDGE (incoming_bb_other_edge, ei, final_dest_bb->succs)
	    if (incoming_bb_other_edge != incoming_edge)
	      break;
	  if (incoming_bb_other_edge->dest != other_bb)
	    return false;
	}
    }

  e0 = EDGE_SUCC (bb, 0);
2402
  e0_last_head = NULL;
2403 2404 2405 2406 2407
  changed = false;

  for (ix = 1; ix < nedges; ix++)
    {
      edge e = EDGE_SUCC (bb, ix);
2408
      rtx_insn *e0_last, *e_last;
2409 2410 2411 2412 2413 2414 2415 2416 2417 2418 2419 2420 2421 2422 2423 2424 2425 2426 2427 2428 2429 2430 2431 2432
      int nmatch;

      nmatch = flow_find_head_matching_sequence (e0->dest, e->dest,
						 &e0_last, &e_last, 0);
      if (nmatch == 0)
	return false;

      if (nmatch < max_match)
	{
	  max_match = nmatch;
	  e0_last_head = e0_last;
	}
    }

  /* If we matched an entire block, we probably have to avoid moving the
     last insn.  */
  if (max_match > 0
      && e0_last_head == BB_END (e0->dest)
      && (find_reg_note (e0_last_head, REG_EH_REGION, 0)
	  || control_flow_insn_p (e0_last_head)))
    {
      max_match--;
      if (max_match == 0)
	return false;
2433
      e0_last_head = prev_real_nondebug_insn (e0_last_head);
2434 2435 2436 2437 2438 2439 2440 2441 2442
    }

  if (max_match == 0)
    return false;

  /* We must find a union of the live registers at each of the end points.  */
  live = BITMAP_ALLOC (NULL);
  live_union = BITMAP_ALLOC (NULL);

2443 2444 2445
  currptr = XNEWVEC (rtx_insn *, nedges);
  headptr = XNEWVEC (rtx_insn *, nedges);
  nextptr = XNEWVEC (rtx_insn *, nedges);
2446 2447 2448 2449 2450

  for (ix = 0; ix < nedges; ix++)
    {
      int j;
      basic_block merge_bb = EDGE_SUCC (bb, ix)->dest;
2451
      rtx_insn *head = BB_HEAD (merge_bb);
2452

2453 2454
      while (!NONDEBUG_INSN_P (head))
	head = NEXT_INSN (head);
2455 2456 2457 2458 2459
      headptr[ix] = head;
      currptr[ix] = head;

      /* Compute the end point and live information  */
      for (j = 1; j < max_match; j++)
2460 2461 2462
	do
	  head = NEXT_INSN (head);
	while (!NONDEBUG_INSN_P (head));
2463 2464 2465 2466 2467 2468 2469 2470 2471
      simulate_backwards_to_point (merge_bb, live, head);
      IOR_REG_SET (live_union, live);
    }

  /* If we're moving across two blocks, verify the validity of the
     first move, then adjust the target and let the loop below deal
     with the final move.  */
  if (final_dest_bb != NULL)
    {
2472
      rtx_insn *move_upto;
2473 2474 2475 2476 2477 2478 2479 2480 2481 2482 2483 2484 2485 2486 2487 2488 2489 2490 2491 2492 2493 2494

      moveall = can_move_insns_across (currptr[0], e0_last_head, move_before,
				       jump, e0->dest, live_union,
				       NULL, &move_upto);
      if (!moveall)
	{
	  if (move_upto == NULL_RTX)
	    goto out;

	  while (e0_last_head != move_upto)
	    {
	      df_simulate_one_insn_backwards (e0->dest, e0_last_head,
					      live_union);
	      e0_last_head = PREV_INSN (e0_last_head);
	    }
	}
      if (e0_last_head == NULL_RTX)
	goto out;

      jump = BB_END (final_dest_bb);
      cond = get_condition (jump, &move_before, true, false);
      if (cond == NULL_RTX)
2495
	{
2496
	  if (HAVE_cc0 && reg_mentioned_p (cc0_rtx, jump))
2497 2498 2499 2500
	    move_before = prev_nonnote_nondebug_insn (jump);
	  else
	    move_before = jump;
	}
2501 2502 2503 2504
    }

  do
    {
2505
      rtx_insn *move_upto;
2506 2507 2508 2509 2510 2511 2512 2513 2514 2515 2516 2517 2518
      moveall = can_move_insns_across (currptr[0], e0_last_head,
				       move_before, jump, e0->dest, live_union,
				       NULL, &move_upto);
      if (!moveall && move_upto == NULL_RTX)
	{
	  if (jump == move_before)
	    break;

	  /* Try again, using a different insertion point.  */
	  move_before = jump;

	  /* Don't try moving before a cc0 user, as that may invalidate
	     the cc0.  */
2519
	  if (HAVE_cc0 && reg_mentioned_p (cc0_rtx, jump))
2520 2521 2522 2523 2524 2525 2526 2527 2528 2529 2530 2531 2532 2533 2534 2535 2536
	    break;

	  continue;
	}

      if (final_dest_bb && !moveall)
	/* We haven't checked whether a partial move would be OK for the first
	   move, so we have to fail this case.  */
	break;

      changed = true;
      for (;;)
	{
	  if (currptr[0] == move_upto)
	    break;
	  for (ix = 0; ix < nedges; ix++)
	    {
2537
	      rtx_insn *curr = currptr[ix];
2538 2539 2540 2541 2542 2543 2544 2545 2546 2547 2548 2549
	      do
		curr = NEXT_INSN (curr);
	      while (!NONDEBUG_INSN_P (curr));
	      currptr[ix] = curr;
	    }
	}

      /* If we can't currently move all of the identical insns, remember
	 each insn after the range that we'll merge.  */
      if (!moveall)
	for (ix = 0; ix < nedges; ix++)
	  {
2550
	    rtx_insn *curr = currptr[ix];
2551 2552 2553 2554 2555 2556 2557 2558 2559 2560 2561 2562 2563 2564 2565 2566 2567 2568 2569 2570 2571 2572 2573 2574 2575 2576
	    do
	      curr = NEXT_INSN (curr);
	    while (!NONDEBUG_INSN_P (curr));
	    nextptr[ix] = curr;
	  }

      reorder_insns (headptr[0], currptr[0], PREV_INSN (move_before));
      df_set_bb_dirty (EDGE_SUCC (bb, 0)->dest);
      if (final_dest_bb != NULL)
	df_set_bb_dirty (final_dest_bb);
      df_set_bb_dirty (bb);
      for (ix = 1; ix < nedges; ix++)
	{
	  df_set_bb_dirty (EDGE_SUCC (bb, ix)->dest);
	  delete_insn_chain (headptr[ix], currptr[ix], false);
	}
      if (!moveall)
	{
	  if (jump == move_before)
	    break;

	  /* For the unmerged insns, try a different insertion point.  */
	  move_before = jump;

	  /* Don't try moving before a cc0 user, as that may invalidate
	     the cc0.  */
2577
	  if (HAVE_cc0 && reg_mentioned_p (cc0_rtx, jump))
2578 2579 2580 2581 2582 2583 2584 2585 2586 2587 2588 2589 2590
	    break;

	  for (ix = 0; ix < nedges; ix++)
	    currptr[ix] = headptr[ix] = nextptr[ix];
	}
    }
  while (!moveall);

 out:
  free (currptr);
  free (headptr);
  free (nextptr);

2591
  crossjumps_occurred |= changed;
2592 2593 2594 2595

  return changed;
}

2596 2597 2598 2599 2600 2601
/* Return true if BB contains just bb note, or bb note followed
   by only DEBUG_INSNs.  */

static bool
trivially_empty_bb_p (basic_block bb)
{
2602
  rtx_insn *insn = BB_END (bb);
2603 2604 2605 2606 2607 2608 2609 2610 2611 2612 2613

  while (1)
    {
      if (insn == BB_HEAD (bb))
	return true;
      if (!DEBUG_INSN_P (insn))
	return false;
      insn = PREV_INSN (insn);
    }
}

2614 2615
/* Return true if BB contains just a return and possibly a USE of the
   return value.  Fill in *RET and *USE with the return and use insns
2616
   if any found, otherwise NULL.  All CLOBBERs are ignored.  */
2617 2618 2619 2620 2621 2622 2623 2624 2625 2626 2627 2628 2629

static bool
bb_is_just_return (basic_block bb, rtx_insn **ret, rtx_insn **use)
{
  *ret = *use = NULL;
  rtx_insn *insn;

  if (bb == EXIT_BLOCK_PTR_FOR_FN (cfun))
    return false;

  FOR_BB_INSNS (bb, insn)
    if (NONDEBUG_INSN_P (insn))
      {
2630 2631 2632
	rtx pat = PATTERN (insn);

	if (!*ret && ANY_RETURN_P (pat))
2633
	  *ret = insn;
2634 2635 2636
	else if (!*ret && !*use && GET_CODE (pat) == USE
	    && REG_P (XEXP (pat, 0))
	    && REG_FUNCTION_VALUE_P (XEXP (pat, 0)))
2637
	  *use = insn;
2638
	else if (GET_CODE (pat) != CLOBBER)
2639 2640 2641 2642 2643 2644
	  return false;
      }

  return !!*ret;
}

2645 2646 2647 2648
/* Do simple CFG optimizations - basic block merging, simplifying of jump
   instructions etc.  Return nonzero if changes were made.  */

static bool
2649
try_optimize_cfg (int mode)
2650 2651 2652 2653
{
  bool changed_overall = false;
  bool changed;
  int iterations = 0;
2654
  basic_block bb, b, next;
2655

2656
  if (mode & (CLEANUP_CROSSJUMP | CLEANUP_THREADING))
2657 2658
    clear_bb_flags ();

2659
  crossjumps_occurred = false;
2660

2661
  FOR_EACH_BB_FN (bb, cfun)
2662 2663
    update_forwarder_flag (bb);

2664
  if (! targetm.cannot_modify_jumps_p ())
2665
    {
2666
      first_pass = true;
Alexandre Oliva committed
2667 2668 2669 2670
      /* Attempt to merge blocks as made possible by edge removal.  If
	 a block has only one successor, and the successor has only
	 one predecessor, they may be combined.  */
      do
2671
	{
2672
	  block_was_dirty = false;
Alexandre Oliva committed
2673 2674 2675
	  changed = false;
	  iterations++;

2676 2677
	  if (dump_file)
	    fprintf (dump_file,
Alexandre Oliva committed
2678 2679
		     "\n\ntry_optimize_cfg iteration %i\n\n",
		     iterations);
2680

2681 2682
	  for (b = ENTRY_BLOCK_PTR_FOR_FN (cfun)->next_bb; b
	       != EXIT_BLOCK_PTR_FOR_FN (cfun);)
2683
	    {
2684
	      basic_block c;
Alexandre Oliva committed
2685 2686
	      edge s;
	      bool changed_here = false;
2687

2688 2689
	      /* Delete trivially dead basic blocks.  This is either
		 blocks with no predecessors, or empty blocks with no
2690 2691 2692 2693 2694
		 successors.  However if the empty block with no
		 successors is the successor of the ENTRY_BLOCK, it is
		 kept.  This ensures that the ENTRY_BLOCK will have a
		 successor which is a precondition for many RTL
		 passes.  Empty blocks may result from expanding
2695 2696
		 __builtin_unreachable ().  */
	      if (EDGE_COUNT (b->preds) == 0
2697
		  || (EDGE_COUNT (b->succs) == 0
2698
		      && trivially_empty_bb_p (b)
2699 2700
		      && single_succ_edge (ENTRY_BLOCK_PTR_FOR_FN (cfun))->dest
		      != b))
Alexandre Oliva committed
2701
		{
2702
		  c = b->prev_bb;
2703
		  if (EDGE_COUNT (b->preds) > 0)
2704 2705 2706 2707
		    {
		      edge e;
		      edge_iterator ei;

2708 2709
		      if (current_ir_type () == IR_RTL_CFGLAYOUT)
			{
2710 2711
			  if (BB_FOOTER (b)
			      && BARRIER_P (BB_FOOTER (b)))
2712 2713
			    FOR_EACH_EDGE (e, ei, b->preds)
			      if ((e->flags & EDGE_FALLTHRU)
2714
				  && BB_FOOTER (e->src) == NULL)
2715
				{
2716
				  if (BB_FOOTER (b))
2717
				    {
2718 2719
				      BB_FOOTER (e->src) = BB_FOOTER (b);
				      BB_FOOTER (b) = NULL;
2720 2721 2722 2723
				    }
				  else
				    {
				      start_sequence ();
2724
				      BB_FOOTER (e->src) = emit_barrier ();
2725 2726 2727 2728 2729 2730
				      end_sequence ();
				    }
				}
			}
		      else
			{
2731
			  rtx_insn *last = get_last_bb_insn (b);
2732 2733 2734 2735 2736
			  if (last && BARRIER_P (last))
			    FOR_EACH_EDGE (e, ei, b->preds)
			      if ((e->flags & EDGE_FALLTHRU))
				emit_barrier_after (BB_END (e->src));
			}
2737
		    }
2738
		  delete_basic_block (b);
2739
		  changed = true;
2740
		  /* Avoid trying to remove the exit block.  */
2741
		  b = (c == ENTRY_BLOCK_PTR_FOR_FN (cfun) ? c->next_bb : c);
2742
		  continue;
Alexandre Oliva committed
2743
		}
2744

2745
	      /* Remove code labels no longer used.  */
2746 2747 2748
	      if (single_pred_p (b)
		  && (single_pred_edge (b)->flags & EDGE_FALLTHRU)
		  && !(single_pred_edge (b)->flags & EDGE_COMPLEX)
2749
		  && LABEL_P (BB_HEAD (b))
2750
		  && !LABEL_PRESERVE_P (BB_HEAD (b))
Alexandre Oliva committed
2751 2752 2753 2754 2755 2756
		  /* If the previous block ends with a branch to this
		     block, we can't delete the label.  Normally this
		     is a condjump that is yet to be simplified, but
		     if CASE_DROPS_THRU, this can be a tablejump with
		     some element going to the same place as the
		     default (fallthru).  */
2757
		  && (single_pred (b) == ENTRY_BLOCK_PTR_FOR_FN (cfun)
2758
		      || !JUMP_P (BB_END (single_pred (b)))
2759
		      || ! label_is_jump_target_p (BB_HEAD (b),
2760
						   BB_END (single_pred (b)))))
Alexandre Oliva committed
2761
		{
2762
		  delete_insn (BB_HEAD (b));
2763 2764
		  if (dump_file)
		    fprintf (dump_file, "Deleted label in block %i.\n",
2765
			     b->index);
Alexandre Oliva committed
2766
		}
2767

Alexandre Oliva committed
2768
	      /* If we fall through an empty block, we can remove it.  */
2769
	      if (!(mode & (CLEANUP_CFGLAYOUT | CLEANUP_NO_INSN_DEL))
2770 2771
		  && single_pred_p (b)
		  && (single_pred_edge (b)->flags & EDGE_FALLTHRU)
2772
		  && !LABEL_P (BB_HEAD (b))
Alexandre Oliva committed
2773 2774 2775
		  && FORWARDER_BLOCK_P (b)
		  /* Note that forwarder_block_p true ensures that
		     there is a successor for this block.  */
2776
		  && (single_succ_edge (b)->flags & EDGE_FALLTHRU)
2777
		  && n_basic_blocks_for_fn (cfun) > NUM_FIXED_BLOCKS + 1)
Alexandre Oliva committed
2778
		{
2779 2780
		  if (dump_file)
		    fprintf (dump_file,
Alexandre Oliva committed
2781
			     "Deleting fallthru block %i.\n",
2782
			     b->index);
Alexandre Oliva committed
2783

2784 2785
		  c = ((b->prev_bb == ENTRY_BLOCK_PTR_FOR_FN (cfun))
		       ? b->next_bb : b->prev_bb);
2786 2787
		  redirect_edge_succ_nodup (single_pred_edge (b),
					    single_succ (b));
2788
		  delete_basic_block (b);
Alexandre Oliva committed
2789 2790
		  changed = true;
		  b = c;
2791
		  continue;
Alexandre Oliva committed
2792
		}
2793

2794
	      /* Merge B with its single successor, if any.  */
2795 2796
	      if (single_succ_p (b)
		  && (s = single_succ_edge (b))
2797
		  && !(s->flags & EDGE_COMPLEX)
2798
		  && (c = s->dest) != EXIT_BLOCK_PTR_FOR_FN (cfun)
2799
		  && single_pred_p (c)
2800 2801 2802 2803 2804 2805 2806
		  && b != c)
		{
		  /* When not in cfg_layout mode use code aware of reordering
		     INSN.  This code possibly creates new basic blocks so it
		     does not fit merge_blocks interface and is kept here in
		     hope that it will become useless once more of compiler
		     is transformed to use cfg_layout mode.  */
Mike Stump committed
2807

2808 2809 2810 2811 2812 2813 2814 2815 2816 2817
		  if ((mode & CLEANUP_CFGLAYOUT)
		      && can_merge_blocks_p (b, c))
		    {
		      merge_blocks (b, c);
		      update_forwarder_flag (b);
		      changed_here = true;
		    }
		  else if (!(mode & CLEANUP_CFGLAYOUT)
			   /* If the jump insn has side effects,
			      we can't kill the edge.  */
2818
			   && (!JUMP_P (BB_END (b))
2819
			       || (reload_completed
2820
				   ? simplejump_p (BB_END (b))
2821 2822 2823
				   : (onlyjump_p (BB_END (b))
				      && !tablejump_p (BB_END (b),
						       NULL, NULL))))
2824 2825 2826 2827 2828
			   && (next = merge_blocks_move (s, b, c, mode)))
		      {
			b = next;
			changed_here = true;
		      }
2829
		}
Alexandre Oliva committed
2830

2831 2832 2833 2834 2835 2836 2837 2838 2839 2840 2841 2842 2843 2844 2845 2846 2847 2848 2849 2850 2851 2852 2853 2854 2855 2856 2857 2858 2859 2860 2861 2862 2863 2864 2865 2866 2867 2868 2869 2870 2871 2872 2873 2874 2875 2876 2877 2878 2879
	      /* Try to change a branch to a return to just that return.  */
	      rtx_insn *ret, *use;
	      if (single_succ_p (b)
		  && onlyjump_p (BB_END (b))
		  && bb_is_just_return (single_succ (b), &ret, &use))
		{
		  if (redirect_jump (as_a <rtx_jump_insn *> (BB_END (b)),
				     PATTERN (ret), 0))
		    {
		      if (use)
			emit_insn_before (copy_insn (PATTERN (use)),
					  BB_END (b));
		      if (dump_file)
			fprintf (dump_file, "Changed jump %d->%d to return.\n",
				 b->index, single_succ (b)->index);
		      redirect_edge_succ (single_succ_edge (b),
					  EXIT_BLOCK_PTR_FOR_FN (cfun));
		      single_succ_edge (b)->flags &= ~EDGE_CROSSING;
		      changed_here = true;
		    }
		}

	      /* Try to change a conditional branch to a return to the
		 respective conditional return.  */
	      if (EDGE_COUNT (b->succs) == 2
		  && any_condjump_p (BB_END (b))
		  && bb_is_just_return (BRANCH_EDGE (b)->dest, &ret, &use))
		{
		  if (redirect_jump (as_a <rtx_jump_insn *> (BB_END (b)),
				     PATTERN (ret), 0))
		    {
		      if (use)
			emit_insn_before (copy_insn (PATTERN (use)),
					  BB_END (b));
		      if (dump_file)
			fprintf (dump_file, "Changed conditional jump %d->%d "
				 "to conditional return.\n",
				 b->index, BRANCH_EDGE (b)->dest->index);
		      redirect_edge_succ (BRANCH_EDGE (b),
					  EXIT_BLOCK_PTR_FOR_FN (cfun));
		      BRANCH_EDGE (b)->flags &= ~EDGE_CROSSING;
		      changed_here = true;
		    }
		}

	      /* Try to flip a conditional branch that falls through to
		 a return so that it becomes a conditional return and a
		 new jump to the original branch target.  */
	      if (EDGE_COUNT (b->succs) == 2
2880
		  && BRANCH_EDGE (b)->dest != EXIT_BLOCK_PTR_FOR_FN (cfun)
2881 2882 2883 2884 2885 2886 2887 2888 2889 2890 2891 2892 2893 2894 2895 2896 2897 2898 2899 2900 2901 2902 2903 2904 2905 2906 2907 2908 2909 2910 2911 2912 2913 2914 2915 2916 2917 2918 2919 2920 2921 2922 2923
		  && any_condjump_p (BB_END (b))
		  && bb_is_just_return (FALLTHRU_EDGE (b)->dest, &ret, &use))
		{
		  if (invert_jump (as_a <rtx_jump_insn *> (BB_END (b)),
				   JUMP_LABEL (BB_END (b)), 0))
		    {
		      basic_block new_ft = BRANCH_EDGE (b)->dest;
		      if (redirect_jump (as_a <rtx_jump_insn *> (BB_END (b)),
					 PATTERN (ret), 0))
			{
			  if (use)
			    emit_insn_before (copy_insn (PATTERN (use)),
					      BB_END (b));
			  if (dump_file)
			    fprintf (dump_file, "Changed conditional jump "
				     "%d->%d to conditional return, adding "
				     "fall-through jump.\n",
				     b->index, BRANCH_EDGE (b)->dest->index);
			  redirect_edge_succ (BRANCH_EDGE (b),
					      EXIT_BLOCK_PTR_FOR_FN (cfun));
			  BRANCH_EDGE (b)->flags &= ~EDGE_CROSSING;
			  std::swap (BRANCH_EDGE (b)->probability,
				     FALLTHRU_EDGE (b)->probability);
			  update_br_prob_note (b);
			  basic_block jb = force_nonfallthru (FALLTHRU_EDGE (b));
			  notice_new_block (jb);
			  if (!redirect_jump (as_a <rtx_jump_insn *> (BB_END (jb)),
					      block_label (new_ft), 0))
			    gcc_unreachable ();
			  redirect_edge_succ (single_succ_edge (jb), new_ft);
			  changed_here = true;
			}
		      else
			{
			  /* Invert the jump back to what it was.  This should
			     never fail.  */
			  if (!invert_jump (as_a <rtx_jump_insn *> (BB_END (b)),
					    JUMP_LABEL (BB_END (b)), 0))
			    gcc_unreachable ();
			}
		    }
		}

Alexandre Oliva committed
2924
	      /* Simplify branch over branch.  */
2925 2926 2927
	      if ((mode & CLEANUP_EXPENSIVE)
		   && !(mode & CLEANUP_CFGLAYOUT)
		   && try_simplify_condjump (b))
2928
		changed_here = true;
2929

Alexandre Oliva committed
2930 2931 2932
	      /* If B has a single outgoing edge, but uses a
		 non-trivial jump instruction without side-effects, we
		 can either delete the jump entirely, or replace it
2933
		 with a simple unconditional jump.  */
2934
	      if (single_succ_p (b)
2935
		  && single_succ (b) != EXIT_BLOCK_PTR_FOR_FN (cfun)
2936
		  && onlyjump_p (BB_END (b))
2937
		  && !CROSSING_JUMP_P (BB_END (b))
2938 2939
		  && try_redirect_by_replacing_jump (single_succ_edge (b),
						     single_succ (b),
2940
						     (mode & CLEANUP_CFGLAYOUT) != 0))
Alexandre Oliva committed
2941 2942 2943 2944
		{
		  update_forwarder_flag (b);
		  changed_here = true;
		}
2945

Alexandre Oliva committed
2946 2947
	      /* Simplify branch to branch.  */
	      if (try_forward_edges (mode, b))
2948 2949 2950 2951
		{
		  update_forwarder_flag (b);
		  changed_here = true;
		}
2952

Alexandre Oliva committed
2953 2954 2955 2956
	      /* Look for shared code between blocks.  */
	      if ((mode & CLEANUP_CROSSJUMP)
		  && try_crossjump_bb (mode, b))
		changed_here = true;
2957

2958 2959 2960 2961 2962 2963 2964
	      if ((mode & CLEANUP_CROSSJUMP)
		  /* This can lengthen register lifetimes.  Do it only after
		     reload.  */
		  && reload_completed
		  && try_head_merge_bb (b))
		changed_here = true;

Alexandre Oliva committed
2965 2966 2967
	      /* Don't get confused by the index shift caused by
		 deleting blocks.  */
	      if (!changed_here)
2968
		b = b->next_bb;
Alexandre Oliva committed
2969 2970 2971
	      else
		changed = true;
	    }
2972

Alexandre Oliva committed
2973
	  if ((mode & CLEANUP_CROSSJUMP)
2974
	      && try_crossjump_bb (mode, EXIT_BLOCK_PTR_FOR_FN (cfun)))
2975 2976
	    changed = true;

2977 2978 2979 2980 2981 2982 2983
	  if (block_was_dirty)
	    {
	      /* This should only be set by head-merging.  */
	      gcc_assert (mode & CLEANUP_CROSSJUMP);
	      df_analyze ();
	    }

Alexandre Oliva committed
2984
	  if (changed)
2985 2986 2987 2988 2989 2990 2991 2992
            {
              /* Edge forwarding in particular can cause hot blocks previously
                 reached by both hot and cold blocks to become dominated only
                 by cold blocks. This will cause the verification below to fail,
                 and lead to now cold code in the hot section. This is not easy
                 to detect and fix during edge forwarding, and in some cases
                 is only visible after newly unreachable blocks are deleted,
                 which will be done in fixup_partitions.  */
2993
	      if ((mode & CLEANUP_NO_PARTITIONING) == 0)
2994 2995 2996 2997
		{
		  fixup_partitions ();
	          checking_verify_flow_info ();
		}
2998
            }
2999

Alexandre Oliva committed
3000
	  changed_overall |= changed;
3001
	  first_pass = false;
Alexandre Oliva committed
3002 3003
	}
      while (changed);
3004
    }
3005

3006
  FOR_ALL_BB_FN (b, cfun)
3007
    b->flags &= ~(BB_FORWARDER_BLOCK | BB_NONTHREADABLE_BLOCK);
3008

3009 3010 3011
  return changed_overall;
}

Kazu Hirata committed
3012
/* Delete all unreachable basic blocks.  */
3013

3014
bool
3015
delete_unreachable_blocks (void)
3016 3017
{
  bool changed = false;
3018
  basic_block b, prev_bb;
3019 3020 3021

  find_unreachable_blocks ();

3022 3023 3024 3025 3026
  /* When we're in GIMPLE mode and there may be debug bind insns, we
     should delete blocks in reverse dominator order, so as to get a
     chance to substitute all released DEFs into debug bind stmts.  If
     we don't have dominators information, walking blocks backward
     gets us a better chance of retaining most debug information than
3027
     otherwise.  */
3028
  if (MAY_HAVE_DEBUG_BIND_INSNS && current_ir_type () == IR_GIMPLE
3029
      && dom_info_available_p (CDI_DOMINATORS))
3030
    {
3031 3032
      for (b = EXIT_BLOCK_PTR_FOR_FN (cfun)->prev_bb;
	   b != ENTRY_BLOCK_PTR_FOR_FN (cfun); b = prev_bb)
3033 3034 3035 3036 3037 3038 3039 3040 3041 3042 3043 3044
	{
	  prev_bb = b->prev_bb;

	  if (!(b->flags & BB_REACHABLE))
	    {
	      /* Speed up the removal of blocks that don't dominate
		 others.  Walking backwards, this should be the common
		 case.  */
	      if (!first_dom_son (CDI_DOMINATORS, b))
		delete_basic_block (b);
	      else
		{
3045
		  vec<basic_block> h
3046 3047
		    = get_all_dominated_blocks (CDI_DOMINATORS, b);

3048
		  while (h.length ())
3049
		    {
3050
		      b = h.pop ();
3051 3052

		      prev_bb = b->prev_bb;
3053

3054 3055 3056 3057 3058
		      gcc_assert (!(b->flags & BB_REACHABLE));

		      delete_basic_block (b);
		    }

3059
		  h.release ();
3060 3061 3062 3063 3064 3065 3066 3067
		}

	      changed = true;
	    }
	}
    }
  else
    {
3068 3069
      for (b = EXIT_BLOCK_PTR_FOR_FN (cfun)->prev_bb;
	   b != ENTRY_BLOCK_PTR_FOR_FN (cfun); b = prev_bb)
3070
	{
3071 3072 3073 3074 3075 3076 3077
	  prev_bb = b->prev_bb;

	  if (!(b->flags & BB_REACHABLE))
	    {
	      delete_basic_block (b);
	      changed = true;
	    }
3078
	}
3079 3080 3081 3082 3083 3084
    }

  if (changed)
    tidy_fallthru_edges ();
  return changed;
}
3085 3086

/* Delete any jump tables never referenced.  We can't delete them at the
3087 3088 3089
   time of removing tablejump insn as they are referenced by the preceding
   insns computing the destination, so we delay deleting and garbagecollect
   them once life information is computed.  */
3090 3091 3092 3093 3094
void
delete_dead_jumptables (void)
{
  basic_block bb;

3095 3096
  /* A dead jump table does not belong to any basic block.  Scan insns
     between two adjacent basic blocks.  */
3097
  FOR_EACH_BB_FN (bb, cfun)
3098
    {
3099
      rtx_insn *insn, *next;
3100 3101 3102 3103

      for (insn = NEXT_INSN (BB_END (bb));
	   insn && !NOTE_INSN_BASIC_BLOCK_P (insn);
	   insn = next)
3104
	{
3105 3106 3107 3108 3109
	  next = NEXT_INSN (insn);
	  if (LABEL_P (insn)
	      && LABEL_NUSES (insn) == LABEL_PRESERVE_P (insn)
	      && JUMP_TABLE_DATA_P (next))
	    {
3110
	      rtx_insn *label = insn, *jump = next;
3111 3112 3113 3114 3115 3116 3117 3118 3119

	      if (dump_file)
		fprintf (dump_file, "Dead jumptable %i removed\n",
			 INSN_UID (insn));

	      next = NEXT_INSN (next);
	      delete_insn (jump);
	      delete_insn (label);
	    }
3120 3121 3122 3123
	}
    }
}

3124 3125 3126 3127

/* Tidy the CFG by deleting unreachable code and whatnot.  */

bool
3128
cleanup_cfg (int mode)
3129 3130 3131
{
  bool changed = false;

3132 3133 3134 3135 3136 3137
  /* Set the cfglayout mode flag here.  We could update all the callers
     but that is just inconvenient, especially given that we eventually
     want to have cfglayout mode as the default.  */
  if (current_ir_type () == IR_RTL_CFGLAYOUT)
    mode |= CLEANUP_CFGLAYOUT;

3138
  timevar_push (TV_CLEANUP_CFG);
3139 3140 3141 3142
  if (delete_unreachable_blocks ())
    {
      changed = true;
      /* We've possibly created trivially dead code.  Cleanup it right
3143
	 now to introduce more opportunities for try_optimize_cfg.  */
3144
      if (!(mode & (CLEANUP_NO_INSN_DEL))
3145
	  && !reload_completed)
3146
	delete_trivially_dead_insns (get_insns (), max_reg_num ());
3147
    }
3148 3149 3150

  compact_blocks ();

3151 3152 3153 3154 3155 3156 3157
  /* To tail-merge blocks ending in the same noreturn function (e.g.
     a call to abort) we have to insert fake edges to exit.  Do this
     here once.  The fake edges do not interfere with any other CFG
     cleanups.  */
  if (mode & CLEANUP_CROSSJUMP)
    add_noreturn_fake_exit_edges ();

3158 3159 3160
  if (!dbg_cnt (cfg_cleanup))
    return changed;

3161 3162 3163
  while (try_optimize_cfg (mode))
    {
      delete_unreachable_blocks (), changed = true;
3164
      if (!(mode & CLEANUP_NO_INSN_DEL))
3165
	{
3166 3167 3168 3169 3170 3171 3172 3173 3174 3175 3176 3177 3178 3179
	  /* Try to remove some trivially dead insns when doing an expensive
	     cleanup.  But delete_trivially_dead_insns doesn't work after
	     reload (it only handles pseudos) and run_fast_dce is too costly
	     to run in every iteration.

	     For effective cross jumping, we really want to run a fast DCE to
	     clean up any dead conditions, or they get in the way of performing
	     useful tail merges.

	     Other transformations in cleanup_cfg are not so sensitive to dead
	     code, so delete_trivially_dead_insns or even doing nothing at all
	     is good enough.  */
	  if ((mode & CLEANUP_EXPENSIVE) && !reload_completed
	      && !delete_trivially_dead_insns (get_insns (), max_reg_num ()))
3180
	    break;
3181
	  if ((mode & CLEANUP_CROSSJUMP) && crossjumps_occurred)
Jan Hubicka committed
3182
	    run_fast_dce ();
3183 3184 3185 3186
	}
      else
	break;
    }
3187

3188 3189 3190
  if (mode & CLEANUP_CROSSJUMP)
    remove_fake_exit_edges ();

3191 3192 3193 3194 3195 3196 3197
  /* Don't call delete_dead_jumptables in cfglayout mode, because
     that function assumes that jump tables are in the insns stream.
     But we also don't _have_ to delete dead jumptables in cfglayout
     mode because we shouldn't even be looking at things that are
     not in a basic block.  Dead jumptables are cleaned up when
     going out of cfglayout mode.  */
  if (!(mode & CLEANUP_CFGLAYOUT))
3198 3199
    delete_dead_jumptables ();

3200 3201 3202 3203 3204 3205 3206 3207 3208
  /* ???  We probably do this way too often.  */
  if (current_loops
      && (changed
	  || (mode & CLEANUP_CFG_CHANGED)))
    {
      timevar_push (TV_REPAIR_LOOPS);
      /* The above doesn't preserve dominance info if available.  */
      gcc_assert (!dom_info_available_p (CDI_DOMINATORS));
      calculate_dominance_info (CDI_DOMINATORS);
3209
      fix_loop_structure (NULL);
3210 3211 3212 3213
      free_dominance_info (CDI_DOMINATORS);
      timevar_pop (TV_REPAIR_LOOPS);
    }

3214 3215 3216 3217
  timevar_pop (TV_CLEANUP_CFG);

  return changed;
}
3218

3219 3220 3221
namespace {

const pass_data pass_data_jump =
3222
{
3223 3224 3225 3226 3227 3228 3229 3230
  RTL_PASS, /* type */
  "jump", /* name */
  OPTGROUP_NONE, /* optinfo_flags */
  TV_JUMP, /* tv_id */
  0, /* properties_required */
  0, /* properties_provided */
  0, /* properties_destroyed */
  0, /* todo_flags_start */
3231
  0, /* todo_flags_finish */
3232
};
3233 3234 3235 3236

class pass_jump : public rtl_opt_pass
{
public:
3237 3238
  pass_jump (gcc::context *ctxt)
    : rtl_opt_pass (pass_data_jump, ctxt)
3239 3240 3241
  {}

  /* opt_pass methods: */
3242
  virtual unsigned int execute (function *);
3243 3244 3245

}; // class pass_jump

3246 3247 3248 3249 3250 3251 3252 3253 3254 3255 3256
unsigned int
pass_jump::execute (function *)
{
  delete_trivially_dead_insns (get_insns (), max_reg_num ());
  if (dump_file)
    dump_flow_info (dump_file, dump_flags);
  cleanup_cfg ((optimize ? CLEANUP_EXPENSIVE : 0)
	       | (flag_thread_jumps ? CLEANUP_THREADING : 0));
  return 0;
}

3257 3258 3259 3260 3261 3262 3263
} // anon namespace

rtl_opt_pass *
make_pass_jump (gcc::context *ctxt)
{
  return new pass_jump (ctxt);
}
3264

3265 3266
namespace {

3267 3268 3269 3270 3271 3272 3273 3274 3275 3276 3277 3278 3279 3280 3281 3282 3283 3284 3285 3286 3287 3288 3289 3290 3291 3292 3293 3294 3295 3296 3297 3298 3299 3300 3301 3302 3303 3304 3305 3306 3307 3308
const pass_data pass_data_postreload_jump =
{
  RTL_PASS, /* type */
  "postreload_jump", /* name */
  OPTGROUP_NONE, /* optinfo_flags */
  TV_JUMP, /* tv_id */
  0, /* properties_required */
  0, /* properties_provided */
  0, /* properties_destroyed */
  0, /* todo_flags_start */
  0, /* todo_flags_finish */
};

class pass_postreload_jump : public rtl_opt_pass
{
public:
  pass_postreload_jump (gcc::context *ctxt)
    : rtl_opt_pass (pass_data_postreload_jump, ctxt)
  {}

  /* opt_pass methods: */
  virtual unsigned int execute (function *);

}; // class pass_postreload_jump

unsigned int
pass_postreload_jump::execute (function *)
{
  cleanup_cfg (flag_thread_jumps ? CLEANUP_THREADING : 0);
  return 0;
}

} // anon namespace

rtl_opt_pass *
make_pass_postreload_jump (gcc::context *ctxt)
{
  return new pass_postreload_jump (ctxt);
}

namespace {

3309
const pass_data pass_data_jump2 =
3310
{
3311 3312 3313 3314 3315 3316 3317 3318
  RTL_PASS, /* type */
  "jump2", /* name */
  OPTGROUP_NONE, /* optinfo_flags */
  TV_JUMP, /* tv_id */
  0, /* properties_required */
  0, /* properties_provided */
  0, /* properties_destroyed */
  0, /* todo_flags_start */
3319
  0, /* todo_flags_finish */
3320
};
3321 3322 3323 3324

class pass_jump2 : public rtl_opt_pass
{
public:
3325 3326
  pass_jump2 (gcc::context *ctxt)
    : rtl_opt_pass (pass_data_jump2, ctxt)
3327 3328 3329
  {}

  /* opt_pass methods: */
3330 3331 3332 3333 3334
  virtual unsigned int execute (function *)
    {
      cleanup_cfg (flag_crossjumping ? CLEANUP_CROSSJUMP : 0);
      return 0;
    }
3335 3336 3337 3338 3339 3340 3341 3342 3343 3344

}; // class pass_jump2

} // anon namespace

rtl_opt_pass *
make_pass_jump2 (gcc::context *ctxt)
{
  return new pass_jump2 (ctxt);
}