1 /* Control flow optimization code for GNU compiler.
2    Copyright (C) 1987-2013 Free Software Foundation, Inc.
3 
4 This file is part of GCC.
5 
6 GCC is free software; you can redistribute it and/or modify it under
7 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 version.
10 
11 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
12 WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14 for more details.
15 
16 You should have received a copy of the GNU General Public License
17 along with GCC; see the file COPYING3.  If not see
18 <http://www.gnu.org/licenses/>.  */
19 
20 /* This file contains optimizer of the control flow.  The main entry point is
21    cleanup_cfg.  Following optimizations are performed:
22 
23    - 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    - Cross jumping (tail merging)
29    - Conditional jump-around-simplejump simplification
30    - Basic block merging.  */
31 
32 #include "config.h"
33 #include "system.h"
34 #include "coretypes.h"
35 #include "tm.h"
36 #include "rtl.h"
37 #include "hard-reg-set.h"
38 #include "regs.h"
39 #include "insn-config.h"
40 #include "flags.h"
41 #include "recog.h"
42 #include "diagnostic-core.h"
43 #include "cselib.h"
44 #include "params.h"
45 #include "tm_p.h"
46 #include "target.h"
47 #include "function.h" /* For inline functions in emit-rtl.h they need crtl.  */
48 #include "emit-rtl.h"
49 #include "tree-pass.h"
50 #include "cfgloop.h"
51 #include "expr.h"
52 #include "df.h"
53 #include "dce.h"
54 #include "dbgcnt.h"
55 
56 #define FORWARDER_BLOCK_P(BB) ((BB)->flags & BB_FORWARDER_BLOCK)
57 
58 /* Set to true when we are running first pass of try_optimize_cfg loop.  */
59 static bool first_pass;
60 
61 /* Set to true if crossjumps occurred in the latest run of try_optimize_cfg.  */
62 static bool crossjumps_occured;
63 
64 /* Set to true if we couldn't run an optimization due to stale liveness
65    information; we should run df_analyze to enable more opportunities.  */
66 static bool block_was_dirty;
67 
68 static bool try_crossjump_to_edge (int, edge, edge, enum replace_direction);
69 static bool try_crossjump_bb (int, basic_block);
70 static bool outgoing_edges_match (int, basic_block, basic_block);
71 static enum replace_direction old_insns_match_p (int, rtx, rtx);
72 
73 static void merge_blocks_move_predecessor_nojumps (basic_block, basic_block);
74 static void merge_blocks_move_successor_nojumps (basic_block, basic_block);
75 static bool try_optimize_cfg (int);
76 static bool try_simplify_condjump (basic_block);
77 static bool try_forward_edges (int, basic_block);
78 static edge thread_jump (edge, basic_block);
79 static bool mark_effect (rtx, bitmap);
80 static void notice_new_block (basic_block);
81 static void update_forwarder_flag (basic_block);
82 static int mentions_nonequal_regs (rtx *, void *);
83 static void merge_memattrs (rtx, rtx);
84 
85 /* Set flags for newly created block.  */
86 
87 static void
notice_new_block(basic_block bb)88 notice_new_block (basic_block bb)
89 {
90   if (!bb)
91     return;
92 
93   if (forwarder_block_p (bb))
94     bb->flags |= BB_FORWARDER_BLOCK;
95 }
96 
97 /* Recompute forwarder flag after block has been modified.  */
98 
99 static void
update_forwarder_flag(basic_block bb)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 /* Simplify a conditional jump around an unconditional jump.
109    Return true if something changed.  */
110 
111 static bool
try_simplify_condjump(basic_block cbranch_block)112 try_simplify_condjump (basic_block cbranch_block)
113 {
114   basic_block jump_block, jump_dest_block, cbranch_dest_block;
115   edge cbranch_jump_edge, cbranch_fallthru_edge;
116   rtx cbranch_insn;
117 
118   /* Verify that there are exactly two successors.  */
119   if (EDGE_COUNT (cbranch_block->succs) != 2)
120     return false;
121 
122   /* Verify that we've got a normal conditional branch at the end
123      of the block.  */
124   cbranch_insn = BB_END (cbranch_block);
125   if (!any_condjump_p (cbranch_insn))
126     return false;
127 
128   cbranch_fallthru_edge = FALLTHRU_EDGE (cbranch_block);
129   cbranch_jump_edge = BRANCH_EDGE (cbranch_block);
130 
131   /* The next block must not have multiple predecessors, must not
132      be the last block in the function, and must contain just the
133      unconditional jump.  */
134   jump_block = cbranch_fallthru_edge->dest;
135   if (!single_pred_p (jump_block)
136       || jump_block->next_bb == EXIT_BLOCK_PTR
137       || !FORWARDER_BLOCK_P (jump_block))
138     return false;
139   jump_dest_block = single_succ (jump_block);
140 
141   /* If we are partitioning hot/cold basic blocks, we don't want to
142      mess up unconditional or indirect jumps that cross between hot
143      and cold sections.
144 
145      Basic block partitioning may result in some jumps that appear to
146      be optimizable (or blocks that appear to be mergeable), but which really
147      must be left untouched (they are required to make it safely across
148      partition boundaries).  See the comments at the top of
149      bb-reorder.c:partition_hot_cold_basic_blocks for complete details.  */
150 
151   if (BB_PARTITION (jump_block) != BB_PARTITION (jump_dest_block)
152       || (cbranch_jump_edge->flags & EDGE_CROSSING))
153     return false;
154 
155   /* The conditional branch must target the block after the
156      unconditional branch.  */
157   cbranch_dest_block = cbranch_jump_edge->dest;
158 
159   if (cbranch_dest_block == EXIT_BLOCK_PTR
160       || !can_fallthru (jump_block, cbranch_dest_block))
161     return false;
162 
163   /* Invert the conditional branch.  */
164   if (!invert_jump (cbranch_insn, block_label (jump_dest_block), 0))
165     return false;
166 
167   if (dump_file)
168     fprintf (dump_file, "Simplifying condjump %i around jump %i\n",
169 	     INSN_UID (cbranch_insn), INSN_UID (BB_END (jump_block)));
170 
171   /* Success.  Update the CFG to match.  Note that after this point
172      the edge variable names appear backwards; the redirection is done
173      this way to preserve edge profile data.  */
174   cbranch_jump_edge = redirect_edge_succ_nodup (cbranch_jump_edge,
175 						cbranch_dest_block);
176   cbranch_fallthru_edge = redirect_edge_succ_nodup (cbranch_fallthru_edge,
177 						    jump_dest_block);
178   cbranch_jump_edge->flags |= EDGE_FALLTHRU;
179   cbranch_fallthru_edge->flags &= ~EDGE_FALLTHRU;
180   update_br_prob_note (cbranch_block);
181 
182   /* Delete the block with the unconditional jump, and clean up the mess.  */
183   delete_basic_block (jump_block);
184   tidy_fallthru_edge (cbranch_jump_edge);
185   update_forwarder_flag (cbranch_block);
186 
187   return true;
188 }
189 
190 /* Attempt to prove that operation is NOOP using CSElib or mark the effect
191    on register.  Used by jump threading.  */
192 
193 static bool
mark_effect(rtx exp,regset nonequal)194 mark_effect (rtx exp, regset nonequal)
195 {
196   int regno;
197   rtx dest;
198   switch (GET_CODE (exp))
199     {
200       /* In case we do clobber the register, mark it as equal, as we know the
201 	 value is dead so it don't have to match.  */
202     case CLOBBER:
203       if (REG_P (XEXP (exp, 0)))
204 	{
205 	  dest = XEXP (exp, 0);
206 	  regno = REGNO (dest);
207 	  if (HARD_REGISTER_NUM_P (regno))
208 	    bitmap_clear_range (nonequal, regno,
209 				hard_regno_nregs[regno][GET_MODE (dest)]);
210 	  else
211 	    bitmap_clear_bit (nonequal, regno);
212 	}
213       return false;
214 
215     case SET:
216       if (rtx_equal_for_cselib_p (SET_DEST (exp), SET_SRC (exp)))
217 	return false;
218       dest = SET_DEST (exp);
219       if (dest == pc_rtx)
220 	return false;
221       if (!REG_P (dest))
222 	return true;
223       regno = REGNO (dest);
224       if (HARD_REGISTER_NUM_P (regno))
225 	bitmap_set_range (nonequal, regno,
226 			  hard_regno_nregs[regno][GET_MODE (dest)]);
227       else
228 	bitmap_set_bit (nonequal, regno);
229       return false;
230 
231     default:
232       return false;
233     }
234 }
235 
236 /* Return nonzero if X is a register set in regset DATA.
237    Called via for_each_rtx.  */
238 static int
mentions_nonequal_regs(rtx * x,void * data)239 mentions_nonequal_regs (rtx *x, void *data)
240 {
241   regset nonequal = (regset) data;
242   if (REG_P (*x))
243     {
244       int regno;
245 
246       regno = REGNO (*x);
247       if (REGNO_REG_SET_P (nonequal, regno))
248 	return 1;
249       if (regno < FIRST_PSEUDO_REGISTER)
250 	{
251 	  int n = hard_regno_nregs[regno][GET_MODE (*x)];
252 	  while (--n > 0)
253 	    if (REGNO_REG_SET_P (nonequal, regno + n))
254 	      return 1;
255 	}
256     }
257   return 0;
258 }
259 /* Attempt to prove that the basic block B will have no side effects and
260    always continues in the same edge if reached via E.  Return the edge
261    if exist, NULL otherwise.  */
262 
263 static edge
thread_jump(edge e,basic_block b)264 thread_jump (edge e, basic_block b)
265 {
266   rtx set1, set2, cond1, cond2, insn;
267   enum rtx_code code1, code2, reversed_code2;
268   bool reverse1 = false;
269   unsigned i;
270   regset nonequal;
271   bool failed = false;
272   reg_set_iterator rsi;
273 
274   if (b->flags & BB_NONTHREADABLE_BLOCK)
275     return NULL;
276 
277   /* At the moment, we do handle only conditional jumps, but later we may
278      want to extend this code to tablejumps and others.  */
279   if (EDGE_COUNT (e->src->succs) != 2)
280     return NULL;
281   if (EDGE_COUNT (b->succs) != 2)
282     {
283       b->flags |= BB_NONTHREADABLE_BLOCK;
284       return NULL;
285     }
286 
287   /* Second branch must end with onlyjump, as we will eliminate the jump.  */
288   if (!any_condjump_p (BB_END (e->src)))
289     return NULL;
290 
291   if (!any_condjump_p (BB_END (b)) || !onlyjump_p (BB_END (b)))
292     {
293       b->flags |= BB_NONTHREADABLE_BLOCK;
294       return NULL;
295     }
296 
297   set1 = pc_set (BB_END (e->src));
298   set2 = pc_set (BB_END (b));
299   if (((e->flags & EDGE_FALLTHRU) != 0)
300       != (XEXP (SET_SRC (set1), 1) == pc_rtx))
301     reverse1 = true;
302 
303   cond1 = XEXP (SET_SRC (set1), 0);
304   cond2 = XEXP (SET_SRC (set2), 0);
305   if (reverse1)
306     code1 = reversed_comparison_code (cond1, BB_END (e->src));
307   else
308     code1 = GET_CODE (cond1);
309 
310   code2 = GET_CODE (cond2);
311   reversed_code2 = reversed_comparison_code (cond2, BB_END (b));
312 
313   if (!comparison_dominates_p (code1, code2)
314       && !comparison_dominates_p (code1, reversed_code2))
315     return NULL;
316 
317   /* Ensure that the comparison operators are equivalent.
318      ??? This is far too pessimistic.  We should allow swapped operands,
319      different CCmodes, or for example comparisons for interval, that
320      dominate even when operands are not equivalent.  */
321   if (!rtx_equal_p (XEXP (cond1, 0), XEXP (cond2, 0))
322       || !rtx_equal_p (XEXP (cond1, 1), XEXP (cond2, 1)))
323     return NULL;
324 
325   /* Short circuit cases where block B contains some side effects, as we can't
326      safely bypass it.  */
327   for (insn = NEXT_INSN (BB_HEAD (b)); insn != NEXT_INSN (BB_END (b));
328        insn = NEXT_INSN (insn))
329     if (INSN_P (insn) && side_effects_p (PATTERN (insn)))
330       {
331 	b->flags |= BB_NONTHREADABLE_BLOCK;
332 	return NULL;
333       }
334 
335   cselib_init (0);
336 
337   /* First process all values computed in the source basic block.  */
338   for (insn = NEXT_INSN (BB_HEAD (e->src));
339        insn != NEXT_INSN (BB_END (e->src));
340        insn = NEXT_INSN (insn))
341     if (INSN_P (insn))
342       cselib_process_insn (insn);
343 
344   nonequal = BITMAP_ALLOC (NULL);
345   CLEAR_REG_SET (nonequal);
346 
347   /* Now assume that we've continued by the edge E to B and continue
348      processing as if it were same basic block.
349      Our goal is to prove that whole block is an NOOP.  */
350 
351   for (insn = NEXT_INSN (BB_HEAD (b));
352        insn != NEXT_INSN (BB_END (b)) && !failed;
353        insn = NEXT_INSN (insn))
354     {
355       if (INSN_P (insn))
356 	{
357 	  rtx pat = PATTERN (insn);
358 
359 	  if (GET_CODE (pat) == PARALLEL)
360 	    {
361 	      for (i = 0; i < (unsigned)XVECLEN (pat, 0); i++)
362 		failed |= mark_effect (XVECEXP (pat, 0, i), nonequal);
363 	    }
364 	  else
365 	    failed |= mark_effect (pat, nonequal);
366 	}
367 
368       cselib_process_insn (insn);
369     }
370 
371   /* Later we should clear nonequal of dead registers.  So far we don't
372      have life information in cfg_cleanup.  */
373   if (failed)
374     {
375       b->flags |= BB_NONTHREADABLE_BLOCK;
376       goto failed_exit;
377     }
378 
379   /* cond2 must not mention any register that is not equal to the
380      former block.  */
381   if (for_each_rtx (&cond2, mentions_nonequal_regs, nonequal))
382     goto failed_exit;
383 
384   EXECUTE_IF_SET_IN_REG_SET (nonequal, 0, i, rsi)
385     goto failed_exit;
386 
387   BITMAP_FREE (nonequal);
388   cselib_finish ();
389   if ((comparison_dominates_p (code1, code2) != 0)
390       != (XEXP (SET_SRC (set2), 1) == pc_rtx))
391     return BRANCH_EDGE (b);
392   else
393     return FALLTHRU_EDGE (b);
394 
395 failed_exit:
396   BITMAP_FREE (nonequal);
397   cselib_finish ();
398   return NULL;
399 }
400 
401 /* Attempt to forward edges leaving basic block B.
402    Return true if successful.  */
403 
404 static bool
try_forward_edges(int mode,basic_block b)405 try_forward_edges (int mode, basic_block b)
406 {
407   bool changed = false;
408   edge_iterator ei;
409   edge e, *threaded_edges = NULL;
410 
411   /* If we are partitioning hot/cold basic blocks, we don't want to
412      mess up unconditional or indirect jumps that cross between hot
413      and cold sections.
414 
415      Basic block partitioning may result in some jumps that appear to
416      be optimizable (or blocks that appear to be mergeable), but which really
417      must be left untouched (they are required to make it safely across
418      partition boundaries).  See the comments at the top of
419      bb-reorder.c:partition_hot_cold_basic_blocks for complete details.  */
420 
421   if (find_reg_note (BB_END (b), REG_CROSSING_JUMP, NULL_RTX))
422     return false;
423 
424   for (ei = ei_start (b->succs); (e = ei_safe_edge (ei)); )
425     {
426       basic_block target, first;
427       int counter, goto_locus;
428       bool threaded = false;
429       int nthreaded_edges = 0;
430       bool may_thread = first_pass || (b->flags & BB_MODIFIED) != 0;
431 
432       /* Skip complex edges because we don't know how to update them.
433 
434 	 Still handle fallthru edges, as we can succeed to forward fallthru
435 	 edge to the same place as the branch edge of conditional branch
436 	 and turn conditional branch to an unconditional branch.  */
437       if (e->flags & EDGE_COMPLEX)
438 	{
439 	  ei_next (&ei);
440 	  continue;
441 	}
442 
443       target = first = e->dest;
444       counter = NUM_FIXED_BLOCKS;
445       goto_locus = e->goto_locus;
446 
447       /* If we are partitioning hot/cold basic_blocks, we don't want to mess
448 	 up jumps that cross between hot/cold sections.
449 
450 	 Basic block partitioning may result in some jumps that appear
451 	 to be optimizable (or blocks that appear to be mergeable), but which
452 	 really must be left untouched (they are required to make it safely
453 	 across partition boundaries).  See the comments at the top of
454 	 bb-reorder.c:partition_hot_cold_basic_blocks for complete
455 	 details.  */
456 
457       if (first != EXIT_BLOCK_PTR
458 	  && find_reg_note (BB_END (first), REG_CROSSING_JUMP, NULL_RTX))
459 	return false;
460 
461       while (counter < n_basic_blocks)
462 	{
463 	  basic_block new_target = NULL;
464 	  bool new_target_threaded = false;
465 	  may_thread |= (target->flags & BB_MODIFIED) != 0;
466 
467 	  if (FORWARDER_BLOCK_P (target)
468 	      && !(single_succ_edge (target)->flags & EDGE_CROSSING)
469 	      && single_succ (target) != EXIT_BLOCK_PTR)
470 	    {
471 	      /* Bypass trivial infinite loops.  */
472 	      new_target = single_succ (target);
473 	      if (target == new_target)
474 		counter = n_basic_blocks;
475 	      else if (!optimize)
476 		{
477 		  /* When not optimizing, ensure that edges or forwarder
478 		     blocks with different locus are not optimized out.  */
479 		  int new_locus = single_succ_edge (target)->goto_locus;
480 		  int locus = goto_locus;
481 
482 		  if (new_locus != UNKNOWN_LOCATION
483 		      && locus != UNKNOWN_LOCATION
484 		      && new_locus != locus)
485 		    new_target = NULL;
486 		  else
487 		    {
488 		      rtx last;
489 
490 		      if (new_locus != UNKNOWN_LOCATION)
491 			locus = new_locus;
492 
493 		      last = BB_END (target);
494 		      if (DEBUG_INSN_P (last))
495 			last = prev_nondebug_insn (last);
496 
497 		      new_locus = last && INSN_P (last)
498 				  ? INSN_LOCATION (last) : 0;
499 
500 		      if (new_locus != UNKNOWN_LOCATION
501 			  && locus != UNKNOWN_LOCATION
502 			  && new_locus != locus)
503 			new_target = NULL;
504 		      else
505 			{
506 			  if (new_locus != UNKNOWN_LOCATION)
507 			    locus = new_locus;
508 
509 			  goto_locus = locus;
510 			}
511 		    }
512 		}
513 	    }
514 
515 	  /* Allow to thread only over one edge at time to simplify updating
516 	     of probabilities.  */
517 	  else if ((mode & CLEANUP_THREADING) && may_thread)
518 	    {
519 	      edge t = thread_jump (e, target);
520 	      if (t)
521 		{
522 		  if (!threaded_edges)
523 		    threaded_edges = XNEWVEC (edge, n_basic_blocks);
524 		  else
525 		    {
526 		      int i;
527 
528 		      /* Detect an infinite loop across blocks not
529 			 including the start block.  */
530 		      for (i = 0; i < nthreaded_edges; ++i)
531 			if (threaded_edges[i] == t)
532 			  break;
533 		      if (i < nthreaded_edges)
534 			{
535 			  counter = n_basic_blocks;
536 			  break;
537 			}
538 		    }
539 
540 		  /* Detect an infinite loop across the start block.  */
541 		  if (t->dest == b)
542 		    break;
543 
544 		  gcc_assert (nthreaded_edges < n_basic_blocks - NUM_FIXED_BLOCKS);
545 		  threaded_edges[nthreaded_edges++] = t;
546 
547 		  new_target = t->dest;
548 		  new_target_threaded = true;
549 		}
550 	    }
551 
552 	  if (!new_target)
553 	    break;
554 
555 	  counter++;
556 	  target = new_target;
557 	  threaded |= new_target_threaded;
558 	}
559 
560       if (counter >= n_basic_blocks)
561 	{
562 	  if (dump_file)
563 	    fprintf (dump_file, "Infinite loop in BB %i.\n",
564 		     target->index);
565 	}
566       else if (target == first)
567 	; /* We didn't do anything.  */
568       else
569 	{
570 	  /* Save the values now, as the edge may get removed.  */
571 	  gcov_type edge_count = e->count;
572 	  int edge_probability = e->probability;
573 	  int edge_frequency;
574 	  int n = 0;
575 
576 	  e->goto_locus = goto_locus;
577 
578 	  /* Don't force if target is exit block.  */
579 	  if (threaded && target != EXIT_BLOCK_PTR)
580 	    {
581 	      notice_new_block (redirect_edge_and_branch_force (e, target));
582 	      if (dump_file)
583 		fprintf (dump_file, "Conditionals threaded.\n");
584 	    }
585 	  else if (!redirect_edge_and_branch (e, target))
586 	    {
587 	      if (dump_file)
588 		fprintf (dump_file,
589 			 "Forwarding edge %i->%i to %i failed.\n",
590 			 b->index, e->dest->index, target->index);
591 	      ei_next (&ei);
592 	      continue;
593 	    }
594 
595 	  /* We successfully forwarded the edge.  Now update profile
596 	     data: for each edge we traversed in the chain, remove
597 	     the original edge's execution count.  */
598 	  edge_frequency = ((edge_probability * b->frequency
599 			     + REG_BR_PROB_BASE / 2)
600 			    / REG_BR_PROB_BASE);
601 
602 	  do
603 	    {
604 	      edge t;
605 
606 	      if (!single_succ_p (first))
607 		{
608 		  gcc_assert (n < nthreaded_edges);
609 		  t = threaded_edges [n++];
610 		  gcc_assert (t->src == first);
611 		  update_bb_profile_for_threading (first, edge_frequency,
612 						   edge_count, t);
613 		  update_br_prob_note (first);
614 		}
615 	      else
616 		{
617 		  first->count -= edge_count;
618 		  if (first->count < 0)
619 		    first->count = 0;
620 		  first->frequency -= edge_frequency;
621 		  if (first->frequency < 0)
622 		    first->frequency = 0;
623 		  /* It is possible that as the result of
624 		     threading we've removed edge as it is
625 		     threaded to the fallthru edge.  Avoid
626 		     getting out of sync.  */
627 		  if (n < nthreaded_edges
628 		      && first == threaded_edges [n]->src)
629 		    n++;
630 		  t = single_succ_edge (first);
631 		}
632 
633 	      t->count -= edge_count;
634 	      if (t->count < 0)
635 		t->count = 0;
636 	      first = t->dest;
637 	    }
638 	  while (first != target);
639 
640 	  changed = true;
641 	  continue;
642 	}
643       ei_next (&ei);
644     }
645 
646   free (threaded_edges);
647   return changed;
648 }
649 
650 
651 /* Blocks A and B are to be merged into a single block.  A has no incoming
652    fallthru edge, so it can be moved before B without adding or modifying
653    any jumps (aside from the jump from A to B).  */
654 
655 static void
merge_blocks_move_predecessor_nojumps(basic_block a,basic_block b)656 merge_blocks_move_predecessor_nojumps (basic_block a, basic_block b)
657 {
658   rtx barrier;
659 
660   /* If we are partitioning hot/cold basic blocks, we don't want to
661      mess up unconditional or indirect jumps that cross between hot
662      and cold sections.
663 
664      Basic block partitioning may result in some jumps that appear to
665      be optimizable (or blocks that appear to be mergeable), but which really
666      must be left untouched (they are required to make it safely across
667      partition boundaries).  See the comments at the top of
668      bb-reorder.c:partition_hot_cold_basic_blocks for complete details.  */
669 
670   if (BB_PARTITION (a) != BB_PARTITION (b))
671     return;
672 
673   barrier = next_nonnote_insn (BB_END (a));
674   gcc_assert (BARRIER_P (barrier));
675   delete_insn (barrier);
676 
677   /* Scramble the insn chain.  */
678   if (BB_END (a) != PREV_INSN (BB_HEAD (b)))
679     reorder_insns_nobb (BB_HEAD (a), BB_END (a), PREV_INSN (BB_HEAD (b)));
680   df_set_bb_dirty (a);
681 
682   if (dump_file)
683     fprintf (dump_file, "Moved block %d before %d and merged.\n",
684 	     a->index, b->index);
685 
686   /* Swap the records for the two blocks around.  */
687 
688   unlink_block (a);
689   link_block (a, b->prev_bb);
690 
691   /* Now blocks A and B are contiguous.  Merge them.  */
692   merge_blocks (a, b);
693 }
694 
695 /* Blocks A and B are to be merged into a single block.  B has no outgoing
696    fallthru edge, so it can be moved after A without adding or modifying
697    any jumps (aside from the jump from A to B).  */
698 
699 static void
merge_blocks_move_successor_nojumps(basic_block a,basic_block b)700 merge_blocks_move_successor_nojumps (basic_block a, basic_block b)
701 {
702   rtx barrier, real_b_end;
703   rtx label, table;
704 
705   /* If we are partitioning hot/cold basic blocks, we don't want to
706      mess up unconditional or indirect jumps that cross between hot
707      and cold sections.
708 
709      Basic block partitioning may result in some jumps that appear to
710      be optimizable (or blocks that appear to be mergeable), but which really
711      must be left untouched (they are required to make it safely across
712      partition boundaries).  See the comments at the top of
713      bb-reorder.c:partition_hot_cold_basic_blocks for complete details.  */
714 
715   if (BB_PARTITION (a) != BB_PARTITION (b))
716     return;
717 
718   real_b_end = BB_END (b);
719 
720   /* If there is a jump table following block B temporarily add the jump table
721      to block B so that it will also be moved to the correct location.  */
722   if (tablejump_p (BB_END (b), &label, &table)
723       && prev_active_insn (label) == BB_END (b))
724     {
725       BB_END (b) = table;
726     }
727 
728   /* There had better have been a barrier there.  Delete it.  */
729   barrier = NEXT_INSN (BB_END (b));
730   if (barrier && BARRIER_P (barrier))
731     delete_insn (barrier);
732 
733 
734   /* Scramble the insn chain.  */
735   reorder_insns_nobb (BB_HEAD (b), BB_END (b), BB_END (a));
736 
737   /* Restore the real end of b.  */
738   BB_END (b) = real_b_end;
739 
740   if (dump_file)
741     fprintf (dump_file, "Moved block %d after %d and merged.\n",
742 	     b->index, a->index);
743 
744   /* Now blocks A and B are contiguous.  Merge them.  */
745   merge_blocks (a, b);
746 }
747 
748 /* Attempt to merge basic blocks that are potentially non-adjacent.
749    Return NULL iff the attempt failed, otherwise return basic block
750    where cleanup_cfg should continue.  Because the merging commonly
751    moves basic block away or introduces another optimization
752    possibility, return basic block just before B so cleanup_cfg don't
753    need to iterate.
754 
755    It may be good idea to return basic block before C in the case
756    C has been moved after B and originally appeared earlier in the
757    insn sequence, but we have no information available about the
758    relative ordering of these two.  Hopefully it is not too common.  */
759 
760 static basic_block
merge_blocks_move(edge e,basic_block b,basic_block c,int mode)761 merge_blocks_move (edge e, basic_block b, basic_block c, int mode)
762 {
763   basic_block next;
764 
765   /* If we are partitioning hot/cold basic blocks, we don't want to
766      mess up unconditional or indirect jumps that cross between hot
767      and cold sections.
768 
769      Basic block partitioning may result in some jumps that appear to
770      be optimizable (or blocks that appear to be mergeable), but which really
771      must be left untouched (they are required to make it safely across
772      partition boundaries).  See the comments at the top of
773      bb-reorder.c:partition_hot_cold_basic_blocks for complete details.  */
774 
775   if (BB_PARTITION (b) != BB_PARTITION (c))
776     return NULL;
777 
778   /* If B has a fallthru edge to C, no need to move anything.  */
779   if (e->flags & EDGE_FALLTHRU)
780     {
781       int b_index = b->index, c_index = c->index;
782 
783       /* Protect the loop latches.  */
784       if (current_loops && c->loop_father->latch == c)
785 	return NULL;
786 
787       merge_blocks (b, c);
788       update_forwarder_flag (b);
789 
790       if (dump_file)
791 	fprintf (dump_file, "Merged %d and %d without moving.\n",
792 		 b_index, c_index);
793 
794       return b->prev_bb == ENTRY_BLOCK_PTR ? b : b->prev_bb;
795     }
796 
797   /* Otherwise we will need to move code around.  Do that only if expensive
798      transformations are allowed.  */
799   else if (mode & CLEANUP_EXPENSIVE)
800     {
801       edge tmp_edge, b_fallthru_edge;
802       bool c_has_outgoing_fallthru;
803       bool b_has_incoming_fallthru;
804 
805       /* Avoid overactive code motion, as the forwarder blocks should be
806 	 eliminated by edge redirection instead.  One exception might have
807 	 been if B is a forwarder block and C has no fallthru edge, but
808 	 that should be cleaned up by bb-reorder instead.  */
809       if (FORWARDER_BLOCK_P (b) || FORWARDER_BLOCK_P (c))
810 	return NULL;
811 
812       /* We must make sure to not munge nesting of lexical blocks,
813 	 and loop notes.  This is done by squeezing out all the notes
814 	 and leaving them there to lie.  Not ideal, but functional.  */
815 
816       tmp_edge = find_fallthru_edge (c->succs);
817       c_has_outgoing_fallthru = (tmp_edge != NULL);
818 
819       tmp_edge = find_fallthru_edge (b->preds);
820       b_has_incoming_fallthru = (tmp_edge != NULL);
821       b_fallthru_edge = tmp_edge;
822       next = b->prev_bb;
823       if (next == c)
824 	next = next->prev_bb;
825 
826       /* Otherwise, we're going to try to move C after B.  If C does
827 	 not have an outgoing fallthru, then it can be moved
828 	 immediately after B without introducing or modifying jumps.  */
829       if (! c_has_outgoing_fallthru)
830 	{
831 	  merge_blocks_move_successor_nojumps (b, c);
832 	  return next == ENTRY_BLOCK_PTR ? next->next_bb : next;
833 	}
834 
835       /* If B does not have an incoming fallthru, then it can be moved
836 	 immediately before C without introducing or modifying jumps.
837 	 C cannot be the first block, so we do not have to worry about
838 	 accessing a non-existent block.  */
839 
840       if (b_has_incoming_fallthru)
841 	{
842 	  basic_block bb;
843 
844 	  if (b_fallthru_edge->src == ENTRY_BLOCK_PTR)
845 	    return NULL;
846 	  bb = force_nonfallthru (b_fallthru_edge);
847 	  if (bb)
848 	    notice_new_block (bb);
849 	}
850 
851       merge_blocks_move_predecessor_nojumps (b, c);
852       return next == ENTRY_BLOCK_PTR ? next->next_bb : next;
853     }
854 
855   return NULL;
856 }
857 
858 
859 /* Removes the memory attributes of MEM expression
860    if they are not equal.  */
861 
862 void
merge_memattrs(rtx x,rtx y)863 merge_memattrs (rtx x, rtx y)
864 {
865   int i;
866   int j;
867   enum rtx_code code;
868   const char *fmt;
869 
870   if (x == y)
871     return;
872   if (x == 0 || y == 0)
873     return;
874 
875   code = GET_CODE (x);
876 
877   if (code != GET_CODE (y))
878     return;
879 
880   if (GET_MODE (x) != GET_MODE (y))
881     return;
882 
883   if (code == MEM && MEM_ATTRS (x) != MEM_ATTRS (y))
884     {
885       if (! MEM_ATTRS (x))
886 	MEM_ATTRS (y) = 0;
887       else if (! MEM_ATTRS (y))
888 	MEM_ATTRS (x) = 0;
889       else
890 	{
891 	  HOST_WIDE_INT mem_size;
892 
893 	  if (MEM_ALIAS_SET (x) != MEM_ALIAS_SET (y))
894 	    {
895 	      set_mem_alias_set (x, 0);
896 	      set_mem_alias_set (y, 0);
897 	    }
898 
899 	  if (! mem_expr_equal_p (MEM_EXPR (x), MEM_EXPR (y)))
900 	    {
901 	      set_mem_expr (x, 0);
902 	      set_mem_expr (y, 0);
903 	      clear_mem_offset (x);
904 	      clear_mem_offset (y);
905 	    }
906 	  else if (MEM_OFFSET_KNOWN_P (x) != MEM_OFFSET_KNOWN_P (y)
907 		   || (MEM_OFFSET_KNOWN_P (x)
908 		       && MEM_OFFSET (x) != MEM_OFFSET (y)))
909 	    {
910 	      clear_mem_offset (x);
911 	      clear_mem_offset (y);
912 	    }
913 
914 	  if (MEM_SIZE_KNOWN_P (x) && MEM_SIZE_KNOWN_P (y))
915 	    {
916 	      mem_size = MAX (MEM_SIZE (x), MEM_SIZE (y));
917 	      set_mem_size (x, mem_size);
918 	      set_mem_size (y, mem_size);
919 	    }
920 	  else
921 	    {
922 	      clear_mem_size (x);
923 	      clear_mem_size (y);
924 	    }
925 
926 	  set_mem_align (x, MIN (MEM_ALIGN (x), MEM_ALIGN (y)));
927 	  set_mem_align (y, MEM_ALIGN (x));
928 	}
929     }
930 
931   fmt = GET_RTX_FORMAT (code);
932   for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
933     {
934       switch (fmt[i])
935 	{
936 	case 'E':
937 	  /* Two vectors must have the same length.  */
938 	  if (XVECLEN (x, i) != XVECLEN (y, i))
939 	    return;
940 
941 	  for (j = 0; j < XVECLEN (x, i); j++)
942 	    merge_memattrs (XVECEXP (x, i, j), XVECEXP (y, i, j));
943 
944 	  break;
945 
946 	case 'e':
947 	  merge_memattrs (XEXP (x, i), XEXP (y, i));
948 	}
949     }
950   return;
951 }
952 
953 
954  /* Checks if patterns P1 and P2 are equivalent, apart from the possibly
955     different single sets S1 and S2.  */
956 
957 static bool
equal_different_set_p(rtx p1,rtx s1,rtx p2,rtx s2)958 equal_different_set_p (rtx p1, rtx s1, rtx p2, rtx s2)
959 {
960   int i;
961   rtx e1, e2;
962 
963   if (p1 == s1 && p2 == s2)
964     return true;
965 
966   if (GET_CODE (p1) != PARALLEL || GET_CODE (p2) != PARALLEL)
967     return false;
968 
969   if (XVECLEN (p1, 0) != XVECLEN (p2, 0))
970     return false;
971 
972   for (i = 0; i < XVECLEN (p1, 0); i++)
973     {
974       e1 = XVECEXP (p1, 0, i);
975       e2 = XVECEXP (p2, 0, i);
976       if (e1 == s1 && e2 == s2)
977         continue;
978       if (reload_completed
979           ? rtx_renumbered_equal_p (e1, e2) : rtx_equal_p (e1, e2))
980         continue;
981 
982         return false;
983     }
984 
985   return true;
986 }
987 
988 /* Examine register notes on I1 and I2 and return:
989    - dir_forward if I1 can be replaced by I2, or
990    - dir_backward if I2 can be replaced by I1, or
991    - dir_both if both are the case.  */
992 
993 static enum replace_direction
can_replace_by(rtx i1,rtx i2)994 can_replace_by (rtx i1, rtx i2)
995 {
996   rtx s1, s2, d1, d2, src1, src2, note1, note2;
997   bool c1, c2;
998 
999   /* Check for 2 sets.  */
1000   s1 = single_set (i1);
1001   s2 = single_set (i2);
1002   if (s1 == NULL_RTX || s2 == NULL_RTX)
1003     return dir_none;
1004 
1005   /* Check that the 2 sets set the same dest.  */
1006   d1 = SET_DEST (s1);
1007   d2 = SET_DEST (s2);
1008   if (!(reload_completed
1009         ? rtx_renumbered_equal_p (d1, d2) : rtx_equal_p (d1, d2)))
1010     return dir_none;
1011 
1012   /* Find identical req_equiv or reg_equal note, which implies that the 2 sets
1013      set dest to the same value.  */
1014   note1 = find_reg_equal_equiv_note (i1);
1015   note2 = find_reg_equal_equiv_note (i2);
1016   if (!note1 || !note2 || !rtx_equal_p (XEXP (note1, 0), XEXP (note2, 0))
1017       || !CONST_INT_P (XEXP (note1, 0)))
1018     return dir_none;
1019 
1020   if (!equal_different_set_p (PATTERN (i1), s1, PATTERN (i2), s2))
1021     return dir_none;
1022 
1023   /* Although the 2 sets set dest to the same value, we cannot replace
1024        (set (dest) (const_int))
1025      by
1026        (set (dest) (reg))
1027      because we don't know if the reg is live and has the same value at the
1028      location of replacement.  */
1029   src1 = SET_SRC (s1);
1030   src2 = SET_SRC (s2);
1031   c1 = CONST_INT_P (src1);
1032   c2 = CONST_INT_P (src2);
1033   if (c1 && c2)
1034     return dir_both;
1035   else if (c2)
1036     return dir_forward;
1037   else if (c1)
1038     return dir_backward;
1039 
1040   return dir_none;
1041 }
1042 
1043 /* Merges directions A and B.  */
1044 
1045 static enum replace_direction
merge_dir(enum replace_direction a,enum replace_direction b)1046 merge_dir (enum replace_direction a, enum replace_direction b)
1047 {
1048   /* Implements the following table:
1049         |bo fw bw no
1050      ---+-----------
1051      bo |bo fw bw no
1052      fw |-- fw no no
1053      bw |-- -- bw no
1054      no |-- -- -- no.  */
1055 
1056   if (a == b)
1057     return a;
1058 
1059   if (a == dir_both)
1060     return b;
1061   if (b == dir_both)
1062     return a;
1063 
1064   return dir_none;
1065 }
1066 
1067 /* Examine I1 and I2 and return:
1068    - dir_forward if I1 can be replaced by I2, or
1069    - dir_backward if I2 can be replaced by I1, or
1070    - dir_both if both are the case.  */
1071 
1072 static enum replace_direction
old_insns_match_p(int mode ATTRIBUTE_UNUSED,rtx i1,rtx i2)1073 old_insns_match_p (int mode ATTRIBUTE_UNUSED, rtx i1, rtx i2)
1074 {
1075   rtx p1, p2;
1076 
1077   /* Verify that I1 and I2 are equivalent.  */
1078   if (GET_CODE (i1) != GET_CODE (i2))
1079     return dir_none;
1080 
1081   /* __builtin_unreachable() may lead to empty blocks (ending with
1082      NOTE_INSN_BASIC_BLOCK).  They may be crossjumped. */
1083   if (NOTE_INSN_BASIC_BLOCK_P (i1) && NOTE_INSN_BASIC_BLOCK_P (i2))
1084     return dir_both;
1085 
1086   /* ??? Do not allow cross-jumping between different stack levels.  */
1087   p1 = find_reg_note (i1, REG_ARGS_SIZE, NULL);
1088   p2 = find_reg_note (i2, REG_ARGS_SIZE, NULL);
1089   if (p1 && p2)
1090     {
1091       p1 = XEXP (p1, 0);
1092       p2 = XEXP (p2, 0);
1093       if (!rtx_equal_p (p1, p2))
1094         return dir_none;
1095 
1096       /* ??? Worse, this adjustment had better be constant lest we
1097          have differing incoming stack levels.  */
1098       if (!frame_pointer_needed
1099           && find_args_size_adjust (i1) == HOST_WIDE_INT_MIN)
1100 	return dir_none;
1101     }
1102   else if (p1 || p2)
1103     return dir_none;
1104 
1105   p1 = PATTERN (i1);
1106   p2 = PATTERN (i2);
1107 
1108   if (GET_CODE (p1) != GET_CODE (p2))
1109     return dir_none;
1110 
1111   /* If this is a CALL_INSN, compare register usage information.
1112      If we don't check this on stack register machines, the two
1113      CALL_INSNs might be merged leaving reg-stack.c with mismatching
1114      numbers of stack registers in the same basic block.
1115      If we don't check this on machines with delay slots, a delay slot may
1116      be filled that clobbers a parameter expected by the subroutine.
1117 
1118      ??? We take the simple route for now and assume that if they're
1119      equal, they were constructed identically.
1120 
1121      Also check for identical exception regions.  */
1122 
1123   if (CALL_P (i1))
1124     {
1125       /* Ensure the same EH region.  */
1126       rtx n1 = find_reg_note (i1, REG_EH_REGION, 0);
1127       rtx n2 = find_reg_note (i2, REG_EH_REGION, 0);
1128 
1129       if (!n1 && n2)
1130 	return dir_none;
1131 
1132       if (n1 && (!n2 || XEXP (n1, 0) != XEXP (n2, 0)))
1133 	return dir_none;
1134 
1135       if (!rtx_equal_p (CALL_INSN_FUNCTION_USAGE (i1),
1136 			CALL_INSN_FUNCTION_USAGE (i2))
1137 	  || SIBLING_CALL_P (i1) != SIBLING_CALL_P (i2))
1138 	return dir_none;
1139 
1140       /* For address sanitizer, never crossjump __asan_report_* builtins,
1141 	 otherwise errors might be reported on incorrect lines.  */
1142       if (flag_asan)
1143 	{
1144 	  rtx call = get_call_rtx_from (i1);
1145 	  if (call && GET_CODE (XEXP (XEXP (call, 0), 0)) == SYMBOL_REF)
1146 	    {
1147 	      rtx symbol = XEXP (XEXP (call, 0), 0);
1148 	      if (SYMBOL_REF_DECL (symbol)
1149 		  && TREE_CODE (SYMBOL_REF_DECL (symbol)) == FUNCTION_DECL)
1150 		{
1151 		  if ((DECL_BUILT_IN_CLASS (SYMBOL_REF_DECL (symbol))
1152 		       == BUILT_IN_NORMAL)
1153 		      && DECL_FUNCTION_CODE (SYMBOL_REF_DECL (symbol))
1154 			 >= BUILT_IN_ASAN_REPORT_LOAD1
1155 		      && DECL_FUNCTION_CODE (SYMBOL_REF_DECL (symbol))
1156 			 <= BUILT_IN_ASAN_REPORT_STORE16)
1157 		    return dir_none;
1158 		}
1159 	    }
1160 	}
1161     }
1162 
1163 #ifdef STACK_REGS
1164   /* If cross_jump_death_matters is not 0, the insn's mode
1165      indicates whether or not the insn contains any stack-like
1166      regs.  */
1167 
1168   if ((mode & CLEANUP_POST_REGSTACK) && stack_regs_mentioned (i1))
1169     {
1170       /* If register stack conversion has already been done, then
1171 	 death notes must also be compared before it is certain that
1172 	 the two instruction streams match.  */
1173 
1174       rtx note;
1175       HARD_REG_SET i1_regset, i2_regset;
1176 
1177       CLEAR_HARD_REG_SET (i1_regset);
1178       CLEAR_HARD_REG_SET (i2_regset);
1179 
1180       for (note = REG_NOTES (i1); note; note = XEXP (note, 1))
1181 	if (REG_NOTE_KIND (note) == REG_DEAD && STACK_REG_P (XEXP (note, 0)))
1182 	  SET_HARD_REG_BIT (i1_regset, REGNO (XEXP (note, 0)));
1183 
1184       for (note = REG_NOTES (i2); note; note = XEXP (note, 1))
1185 	if (REG_NOTE_KIND (note) == REG_DEAD && STACK_REG_P (XEXP (note, 0)))
1186 	  SET_HARD_REG_BIT (i2_regset, REGNO (XEXP (note, 0)));
1187 
1188       if (!hard_reg_set_equal_p (i1_regset, i2_regset))
1189 	return dir_none;
1190     }
1191 #endif
1192 
1193   if (reload_completed
1194       ? rtx_renumbered_equal_p (p1, p2) : rtx_equal_p (p1, p2))
1195     return dir_both;
1196 
1197   return can_replace_by (i1, i2);
1198 }
1199 
1200 /* When comparing insns I1 and I2 in flow_find_cross_jump or
1201    flow_find_head_matching_sequence, ensure the notes match.  */
1202 
1203 static void
merge_notes(rtx i1,rtx i2)1204 merge_notes (rtx i1, rtx i2)
1205 {
1206   /* If the merged insns have different REG_EQUAL notes, then
1207      remove them.  */
1208   rtx equiv1 = find_reg_equal_equiv_note (i1);
1209   rtx equiv2 = find_reg_equal_equiv_note (i2);
1210 
1211   if (equiv1 && !equiv2)
1212     remove_note (i1, equiv1);
1213   else if (!equiv1 && equiv2)
1214     remove_note (i2, equiv2);
1215   else if (equiv1 && equiv2
1216 	   && !rtx_equal_p (XEXP (equiv1, 0), XEXP (equiv2, 0)))
1217     {
1218       remove_note (i1, equiv1);
1219       remove_note (i2, equiv2);
1220     }
1221 }
1222 
1223  /* Walks from I1 in BB1 backward till the next non-debug insn, and returns the
1224     resulting insn in I1, and the corresponding bb in BB1.  At the head of a
1225     bb, if there is a predecessor bb that reaches this bb via fallthru, and
1226     FOLLOW_FALLTHRU, walks further in the predecessor bb and registers this in
1227     DID_FALLTHRU.  Otherwise, stops at the head of the bb.  */
1228 
1229 static void
walk_to_nondebug_insn(rtx * i1,basic_block * bb1,bool follow_fallthru,bool * did_fallthru)1230 walk_to_nondebug_insn (rtx *i1, basic_block *bb1, bool follow_fallthru,
1231                        bool *did_fallthru)
1232 {
1233   edge fallthru;
1234 
1235   *did_fallthru = false;
1236 
1237   /* Ignore notes.  */
1238   while (!NONDEBUG_INSN_P (*i1))
1239     {
1240       if (*i1 != BB_HEAD (*bb1))
1241         {
1242           *i1 = PREV_INSN (*i1);
1243           continue;
1244         }
1245 
1246       if (!follow_fallthru)
1247         return;
1248 
1249       fallthru = find_fallthru_edge ((*bb1)->preds);
1250       if (!fallthru || fallthru->src == ENTRY_BLOCK_PTR_FOR_FUNCTION (cfun)
1251           || !single_succ_p (fallthru->src))
1252         return;
1253 
1254       *bb1 = fallthru->src;
1255       *i1 = BB_END (*bb1);
1256       *did_fallthru = true;
1257      }
1258 }
1259 
1260 /* Look through the insns at the end of BB1 and BB2 and find the longest
1261    sequence that are either equivalent, or allow forward or backward
1262    replacement.  Store the first insns for that sequence in *F1 and *F2 and
1263    return the sequence length.
1264 
1265    DIR_P indicates the allowed replacement direction on function entry, and
1266    the actual replacement direction on function exit.  If NULL, only equivalent
1267    sequences are allowed.
1268 
1269    To simplify callers of this function, if the blocks match exactly,
1270    store the head of the blocks in *F1 and *F2.  */
1271 
1272 int
flow_find_cross_jump(basic_block bb1,basic_block bb2,rtx * f1,rtx * f2,enum replace_direction * dir_p)1273 flow_find_cross_jump (basic_block bb1, basic_block bb2, rtx *f1, rtx *f2,
1274                       enum replace_direction *dir_p)
1275 {
1276   rtx i1, i2, last1, last2, afterlast1, afterlast2;
1277   int ninsns = 0;
1278   rtx p1;
1279   enum replace_direction dir, last_dir, afterlast_dir;
1280   bool follow_fallthru, did_fallthru;
1281 
1282   if (dir_p)
1283     dir = *dir_p;
1284   else
1285     dir = dir_both;
1286   afterlast_dir = dir;
1287   last_dir = afterlast_dir;
1288 
1289   /* Skip simple jumps at the end of the blocks.  Complex jumps still
1290      need to be compared for equivalence, which we'll do below.  */
1291 
1292   i1 = BB_END (bb1);
1293   last1 = afterlast1 = last2 = afterlast2 = NULL_RTX;
1294   if (onlyjump_p (i1)
1295       || (returnjump_p (i1) && !side_effects_p (PATTERN (i1))))
1296     {
1297       last1 = i1;
1298       i1 = PREV_INSN (i1);
1299     }
1300 
1301   i2 = BB_END (bb2);
1302   if (onlyjump_p (i2)
1303       || (returnjump_p (i2) && !side_effects_p (PATTERN (i2))))
1304     {
1305       last2 = i2;
1306       /* Count everything except for unconditional jump as insn.  */
1307       if (!simplejump_p (i2) && !returnjump_p (i2) && last1)
1308 	ninsns++;
1309       i2 = PREV_INSN (i2);
1310     }
1311 
1312   while (true)
1313     {
1314       /* In the following example, we can replace all jumps to C by jumps to A.
1315 
1316          This removes 4 duplicate insns.
1317          [bb A] insn1            [bb C] insn1
1318                 insn2                   insn2
1319          [bb B] insn3                   insn3
1320                 insn4                   insn4
1321                 jump_insn               jump_insn
1322 
1323          We could also replace all jumps to A by jumps to C, but that leaves B
1324          alive, and removes only 2 duplicate insns.  In a subsequent crossjump
1325          step, all jumps to B would be replaced with jumps to the middle of C,
1326          achieving the same result with more effort.
1327          So we allow only the first possibility, which means that we don't allow
1328          fallthru in the block that's being replaced.  */
1329 
1330       follow_fallthru = dir_p && dir != dir_forward;
1331       walk_to_nondebug_insn (&i1, &bb1, follow_fallthru, &did_fallthru);
1332       if (did_fallthru)
1333         dir = dir_backward;
1334 
1335       follow_fallthru = dir_p && dir != dir_backward;
1336       walk_to_nondebug_insn (&i2, &bb2, follow_fallthru, &did_fallthru);
1337       if (did_fallthru)
1338         dir = dir_forward;
1339 
1340       if (i1 == BB_HEAD (bb1) || i2 == BB_HEAD (bb2))
1341 	break;
1342 
1343       dir = merge_dir (dir, old_insns_match_p (0, i1, i2));
1344       if (dir == dir_none || (!dir_p && dir != dir_both))
1345 	break;
1346 
1347       merge_memattrs (i1, i2);
1348 
1349       /* Don't begin a cross-jump with a NOTE insn.  */
1350       if (INSN_P (i1))
1351 	{
1352 	  merge_notes (i1, i2);
1353 
1354 	  afterlast1 = last1, afterlast2 = last2;
1355 	  last1 = i1, last2 = i2;
1356 	  afterlast_dir = last_dir;
1357 	  last_dir = dir;
1358 	  p1 = PATTERN (i1);
1359 	  if (!(GET_CODE (p1) == USE || GET_CODE (p1) == CLOBBER))
1360 	    ninsns++;
1361 	}
1362 
1363       i1 = PREV_INSN (i1);
1364       i2 = PREV_INSN (i2);
1365     }
1366 
1367 #ifdef HAVE_cc0
1368   /* Don't allow the insn after a compare to be shared by
1369      cross-jumping unless the compare is also shared.  */
1370   if (ninsns && reg_mentioned_p (cc0_rtx, last1) && ! sets_cc0_p (last1))
1371     last1 = afterlast1, last2 = afterlast2, last_dir = afterlast_dir, ninsns--;
1372 #endif
1373 
1374   /* Include preceding notes and labels in the cross-jump.  One,
1375      this may bring us to the head of the blocks as requested above.
1376      Two, it keeps line number notes as matched as may be.  */
1377   if (ninsns)
1378     {
1379       bb1 = BLOCK_FOR_INSN (last1);
1380       while (last1 != BB_HEAD (bb1) && !NONDEBUG_INSN_P (PREV_INSN (last1)))
1381 	last1 = PREV_INSN (last1);
1382 
1383       if (last1 != BB_HEAD (bb1) && LABEL_P (PREV_INSN (last1)))
1384 	last1 = PREV_INSN (last1);
1385 
1386       bb2 = BLOCK_FOR_INSN (last2);
1387       while (last2 != BB_HEAD (bb2) && !NONDEBUG_INSN_P (PREV_INSN (last2)))
1388 	last2 = PREV_INSN (last2);
1389 
1390       if (last2 != BB_HEAD (bb2) && LABEL_P (PREV_INSN (last2)))
1391 	last2 = PREV_INSN (last2);
1392 
1393       *f1 = last1;
1394       *f2 = last2;
1395     }
1396 
1397   if (dir_p)
1398     *dir_p = last_dir;
1399   return ninsns;
1400 }
1401 
1402 /* Like flow_find_cross_jump, except start looking for a matching sequence from
1403    the head of the two blocks.  Do not include jumps at the end.
1404    If STOP_AFTER is nonzero, stop after finding that many matching
1405    instructions.  */
1406 
1407 int
flow_find_head_matching_sequence(basic_block bb1,basic_block bb2,rtx * f1,rtx * f2,int stop_after)1408 flow_find_head_matching_sequence (basic_block bb1, basic_block bb2, rtx *f1,
1409 				  rtx *f2, int stop_after)
1410 {
1411   rtx i1, i2, last1, last2, beforelast1, beforelast2;
1412   int ninsns = 0;
1413   edge e;
1414   edge_iterator ei;
1415   int nehedges1 = 0, nehedges2 = 0;
1416 
1417   FOR_EACH_EDGE (e, ei, bb1->succs)
1418     if (e->flags & EDGE_EH)
1419       nehedges1++;
1420   FOR_EACH_EDGE (e, ei, bb2->succs)
1421     if (e->flags & EDGE_EH)
1422       nehedges2++;
1423 
1424   i1 = BB_HEAD (bb1);
1425   i2 = BB_HEAD (bb2);
1426   last1 = beforelast1 = last2 = beforelast2 = NULL_RTX;
1427 
1428   while (true)
1429     {
1430       /* Ignore notes, except NOTE_INSN_EPILOGUE_BEG.  */
1431       while (!NONDEBUG_INSN_P (i1) && i1 != BB_END (bb1))
1432 	{
1433 	  if (NOTE_P (i1) && NOTE_KIND (i1) == NOTE_INSN_EPILOGUE_BEG)
1434 	    break;
1435 	  i1 = NEXT_INSN (i1);
1436 	}
1437 
1438       while (!NONDEBUG_INSN_P (i2) && i2 != BB_END (bb2))
1439 	{
1440 	  if (NOTE_P (i2) && NOTE_KIND (i2) == NOTE_INSN_EPILOGUE_BEG)
1441 	    break;
1442 	  i2 = NEXT_INSN (i2);
1443 	}
1444 
1445       if ((i1 == BB_END (bb1) && !NONDEBUG_INSN_P (i1))
1446 	  || (i2 == BB_END (bb2) && !NONDEBUG_INSN_P (i2)))
1447 	break;
1448 
1449       if (NOTE_P (i1) || NOTE_P (i2)
1450 	  || JUMP_P (i1) || JUMP_P (i2))
1451 	break;
1452 
1453       /* A sanity check to make sure we're not merging insns with different
1454 	 effects on EH.  If only one of them ends a basic block, it shouldn't
1455 	 have an EH edge; if both end a basic block, there should be the same
1456 	 number of EH edges.  */
1457       if ((i1 == BB_END (bb1) && i2 != BB_END (bb2)
1458 	   && nehedges1 > 0)
1459 	  || (i2 == BB_END (bb2) && i1 != BB_END (bb1)
1460 	      && nehedges2 > 0)
1461 	  || (i1 == BB_END (bb1) && i2 == BB_END (bb2)
1462 	      && nehedges1 != nehedges2))
1463 	break;
1464 
1465       if (old_insns_match_p (0, i1, i2) != dir_both)
1466 	break;
1467 
1468       merge_memattrs (i1, i2);
1469 
1470       /* Don't begin a cross-jump with a NOTE insn.  */
1471       if (INSN_P (i1))
1472 	{
1473 	  merge_notes (i1, i2);
1474 
1475 	  beforelast1 = last1, beforelast2 = last2;
1476 	  last1 = i1, last2 = i2;
1477 	  ninsns++;
1478 	}
1479 
1480       if (i1 == BB_END (bb1) || i2 == BB_END (bb2)
1481 	  || (stop_after > 0 && ninsns == stop_after))
1482 	break;
1483 
1484       i1 = NEXT_INSN (i1);
1485       i2 = NEXT_INSN (i2);
1486     }
1487 
1488 #ifdef HAVE_cc0
1489   /* Don't allow a compare to be shared by cross-jumping unless the insn
1490      after the compare is also shared.  */
1491   if (ninsns && reg_mentioned_p (cc0_rtx, last1) && sets_cc0_p (last1))
1492     last1 = beforelast1, last2 = beforelast2, ninsns--;
1493 #endif
1494 
1495   if (ninsns)
1496     {
1497       *f1 = last1;
1498       *f2 = last2;
1499     }
1500 
1501   return ninsns;
1502 }
1503 
1504 /* Return true iff outgoing edges of BB1 and BB2 match, together with
1505    the branch instruction.  This means that if we commonize the control
1506    flow before end of the basic block, the semantic remains unchanged.
1507 
1508    We may assume that there exists one edge with a common destination.  */
1509 
1510 static bool
outgoing_edges_match(int mode,basic_block bb1,basic_block bb2)1511 outgoing_edges_match (int mode, basic_block bb1, basic_block bb2)
1512 {
1513   int nehedges1 = 0, nehedges2 = 0;
1514   edge fallthru1 = 0, fallthru2 = 0;
1515   edge e1, e2;
1516   edge_iterator ei;
1517 
1518   /* If we performed shrink-wrapping, edges to the EXIT_BLOCK_PTR can
1519      only be distinguished for JUMP_INSNs.  The two paths may differ in
1520      whether they went through the prologue.  Sibcalls are fine, we know
1521      that we either didn't need or inserted an epilogue before them.  */
1522   if (crtl->shrink_wrapped
1523       && single_succ_p (bb1) && single_succ (bb1) == EXIT_BLOCK_PTR
1524       && !JUMP_P (BB_END (bb1))
1525       && !(CALL_P (BB_END (bb1)) && SIBLING_CALL_P (BB_END (bb1))))
1526     return false;
1527 
1528   /* If BB1 has only one successor, we may be looking at either an
1529      unconditional jump, or a fake edge to exit.  */
1530   if (single_succ_p (bb1)
1531       && (single_succ_edge (bb1)->flags & (EDGE_COMPLEX | EDGE_FAKE)) == 0
1532       && (!JUMP_P (BB_END (bb1)) || simplejump_p (BB_END (bb1))))
1533     return (single_succ_p (bb2)
1534 	    && (single_succ_edge (bb2)->flags
1535 		& (EDGE_COMPLEX | EDGE_FAKE)) == 0
1536 	    && (!JUMP_P (BB_END (bb2)) || simplejump_p (BB_END (bb2))));
1537 
1538   /* Match conditional jumps - this may get tricky when fallthru and branch
1539      edges are crossed.  */
1540   if (EDGE_COUNT (bb1->succs) == 2
1541       && any_condjump_p (BB_END (bb1))
1542       && onlyjump_p (BB_END (bb1)))
1543     {
1544       edge b1, f1, b2, f2;
1545       bool reverse, match;
1546       rtx set1, set2, cond1, cond2;
1547       enum rtx_code code1, code2;
1548 
1549       if (EDGE_COUNT (bb2->succs) != 2
1550 	  || !any_condjump_p (BB_END (bb2))
1551 	  || !onlyjump_p (BB_END (bb2)))
1552 	return false;
1553 
1554       b1 = BRANCH_EDGE (bb1);
1555       b2 = BRANCH_EDGE (bb2);
1556       f1 = FALLTHRU_EDGE (bb1);
1557       f2 = FALLTHRU_EDGE (bb2);
1558 
1559       /* Get around possible forwarders on fallthru edges.  Other cases
1560 	 should be optimized out already.  */
1561       if (FORWARDER_BLOCK_P (f1->dest))
1562 	f1 = single_succ_edge (f1->dest);
1563 
1564       if (FORWARDER_BLOCK_P (f2->dest))
1565 	f2 = single_succ_edge (f2->dest);
1566 
1567       /* To simplify use of this function, return false if there are
1568 	 unneeded forwarder blocks.  These will get eliminated later
1569 	 during cleanup_cfg.  */
1570       if (FORWARDER_BLOCK_P (f1->dest)
1571 	  || FORWARDER_BLOCK_P (f2->dest)
1572 	  || FORWARDER_BLOCK_P (b1->dest)
1573 	  || FORWARDER_BLOCK_P (b2->dest))
1574 	return false;
1575 
1576       if (f1->dest == f2->dest && b1->dest == b2->dest)
1577 	reverse = false;
1578       else if (f1->dest == b2->dest && b1->dest == f2->dest)
1579 	reverse = true;
1580       else
1581 	return false;
1582 
1583       set1 = pc_set (BB_END (bb1));
1584       set2 = pc_set (BB_END (bb2));
1585       if ((XEXP (SET_SRC (set1), 1) == pc_rtx)
1586 	  != (XEXP (SET_SRC (set2), 1) == pc_rtx))
1587 	reverse = !reverse;
1588 
1589       cond1 = XEXP (SET_SRC (set1), 0);
1590       cond2 = XEXP (SET_SRC (set2), 0);
1591       code1 = GET_CODE (cond1);
1592       if (reverse)
1593 	code2 = reversed_comparison_code (cond2, BB_END (bb2));
1594       else
1595 	code2 = GET_CODE (cond2);
1596 
1597       if (code2 == UNKNOWN)
1598 	return false;
1599 
1600       /* Verify codes and operands match.  */
1601       match = ((code1 == code2
1602 		&& rtx_renumbered_equal_p (XEXP (cond1, 0), XEXP (cond2, 0))
1603 		&& rtx_renumbered_equal_p (XEXP (cond1, 1), XEXP (cond2, 1)))
1604 	       || (code1 == swap_condition (code2)
1605 		   && rtx_renumbered_equal_p (XEXP (cond1, 1),
1606 					      XEXP (cond2, 0))
1607 		   && rtx_renumbered_equal_p (XEXP (cond1, 0),
1608 					      XEXP (cond2, 1))));
1609 
1610       /* If we return true, we will join the blocks.  Which means that
1611 	 we will only have one branch prediction bit to work with.  Thus
1612 	 we require the existing branches to have probabilities that are
1613 	 roughly similar.  */
1614       if (match
1615 	  && optimize_bb_for_speed_p (bb1)
1616 	  && optimize_bb_for_speed_p (bb2))
1617 	{
1618 	  int prob2;
1619 
1620 	  if (b1->dest == b2->dest)
1621 	    prob2 = b2->probability;
1622 	  else
1623 	    /* Do not use f2 probability as f2 may be forwarded.  */
1624 	    prob2 = REG_BR_PROB_BASE - b2->probability;
1625 
1626 	  /* Fail if the difference in probabilities is greater than 50%.
1627 	     This rules out two well-predicted branches with opposite
1628 	     outcomes.  */
1629 	  if (abs (b1->probability - prob2) > REG_BR_PROB_BASE / 2)
1630 	    {
1631 	      if (dump_file)
1632 		fprintf (dump_file,
1633 			 "Outcomes of branch in bb %i and %i differ too much (%i %i)\n",
1634 			 bb1->index, bb2->index, b1->probability, prob2);
1635 
1636 	      return false;
1637 	    }
1638 	}
1639 
1640       if (dump_file && match)
1641 	fprintf (dump_file, "Conditionals in bb %i and %i match.\n",
1642 		 bb1->index, bb2->index);
1643 
1644       return match;
1645     }
1646 
1647   /* Generic case - we are seeing a computed jump, table jump or trapping
1648      instruction.  */
1649 
1650   /* Check whether there are tablejumps in the end of BB1 and BB2.
1651      Return true if they are identical.  */
1652     {
1653       rtx label1, label2;
1654       rtx table1, table2;
1655 
1656       if (tablejump_p (BB_END (bb1), &label1, &table1)
1657 	  && tablejump_p (BB_END (bb2), &label2, &table2)
1658 	  && GET_CODE (PATTERN (table1)) == GET_CODE (PATTERN (table2)))
1659 	{
1660 	  /* The labels should never be the same rtx.  If they really are same
1661 	     the jump tables are same too. So disable crossjumping of blocks BB1
1662 	     and BB2 because when deleting the common insns in the end of BB1
1663 	     by delete_basic_block () the jump table would be deleted too.  */
1664 	  /* If LABEL2 is referenced in BB1->END do not do anything
1665 	     because we would loose information when replacing
1666 	     LABEL1 by LABEL2 and then LABEL2 by LABEL1 in BB1->END.  */
1667 	  if (label1 != label2 && !rtx_referenced_p (label2, BB_END (bb1)))
1668 	    {
1669 	      /* Set IDENTICAL to true when the tables are identical.  */
1670 	      bool identical = false;
1671 	      rtx p1, p2;
1672 
1673 	      p1 = PATTERN (table1);
1674 	      p2 = PATTERN (table2);
1675 	      if (GET_CODE (p1) == ADDR_VEC && rtx_equal_p (p1, p2))
1676 		{
1677 		  identical = true;
1678 		}
1679 	      else if (GET_CODE (p1) == ADDR_DIFF_VEC
1680 		       && (XVECLEN (p1, 1) == XVECLEN (p2, 1))
1681 		       && rtx_equal_p (XEXP (p1, 2), XEXP (p2, 2))
1682 		       && rtx_equal_p (XEXP (p1, 3), XEXP (p2, 3)))
1683 		{
1684 		  int i;
1685 
1686 		  identical = true;
1687 		  for (i = XVECLEN (p1, 1) - 1; i >= 0 && identical; i--)
1688 		    if (!rtx_equal_p (XVECEXP (p1, 1, i), XVECEXP (p2, 1, i)))
1689 		      identical = false;
1690 		}
1691 
1692 	      if (identical)
1693 		{
1694 		  replace_label_data rr;
1695 		  bool match;
1696 
1697 		  /* Temporarily replace references to LABEL1 with LABEL2
1698 		     in BB1->END so that we could compare the instructions.  */
1699 		  rr.r1 = label1;
1700 		  rr.r2 = label2;
1701 		  rr.update_label_nuses = false;
1702 		  for_each_rtx (&BB_END (bb1), replace_label, &rr);
1703 
1704 		  match = (old_insns_match_p (mode, BB_END (bb1), BB_END (bb2))
1705 			   == dir_both);
1706 		  if (dump_file && match)
1707 		    fprintf (dump_file,
1708 			     "Tablejumps in bb %i and %i match.\n",
1709 			     bb1->index, bb2->index);
1710 
1711 		  /* Set the original label in BB1->END because when deleting
1712 		     a block whose end is a tablejump, the tablejump referenced
1713 		     from the instruction is deleted too.  */
1714 		  rr.r1 = label2;
1715 		  rr.r2 = label1;
1716 		  for_each_rtx (&BB_END (bb1), replace_label, &rr);
1717 
1718 		  return match;
1719 		}
1720 	    }
1721 	  return false;
1722 	}
1723     }
1724 
1725   rtx last1 = BB_END (bb1);
1726   rtx last2 = BB_END (bb2);
1727   if (DEBUG_INSN_P (last1))
1728     last1 = prev_nondebug_insn (last1);
1729   if (DEBUG_INSN_P (last2))
1730     last2 = prev_nondebug_insn (last2);
1731   /* First ensure that the instructions match.  There may be many outgoing
1732      edges so this test is generally cheaper.  */
1733   if (old_insns_match_p (mode, last1, last2) != dir_both)
1734     return false;
1735 
1736   /* Search the outgoing edges, ensure that the counts do match, find possible
1737      fallthru and exception handling edges since these needs more
1738      validation.  */
1739   if (EDGE_COUNT (bb1->succs) != EDGE_COUNT (bb2->succs))
1740     return false;
1741 
1742   bool nonfakeedges = false;
1743   FOR_EACH_EDGE (e1, ei, bb1->succs)
1744     {
1745       e2 = EDGE_SUCC (bb2, ei.index);
1746 
1747       if ((e1->flags & EDGE_FAKE) == 0)
1748 	nonfakeedges = true;
1749 
1750       if (e1->flags & EDGE_EH)
1751 	nehedges1++;
1752 
1753       if (e2->flags & EDGE_EH)
1754 	nehedges2++;
1755 
1756       if (e1->flags & EDGE_FALLTHRU)
1757 	fallthru1 = e1;
1758       if (e2->flags & EDGE_FALLTHRU)
1759 	fallthru2 = e2;
1760     }
1761 
1762   /* If number of edges of various types does not match, fail.  */
1763   if (nehedges1 != nehedges2
1764       || (fallthru1 != 0) != (fallthru2 != 0))
1765     return false;
1766 
1767   /* If !ACCUMULATE_OUTGOING_ARGS, bb1 (and bb2) have no successors
1768      and the last real insn doesn't have REG_ARGS_SIZE note, don't
1769      attempt to optimize, as the two basic blocks might have different
1770      REG_ARGS_SIZE depths.  For noreturn calls and unconditional
1771      traps there should be REG_ARG_SIZE notes, they could be missing
1772      for __builtin_unreachable () uses though.  */
1773   if (!nonfakeedges
1774       && !ACCUMULATE_OUTGOING_ARGS
1775       && (!INSN_P (last1)
1776           || !find_reg_note (last1, REG_ARGS_SIZE, NULL)))
1777     return false;
1778 
1779   /* fallthru edges must be forwarded to the same destination.  */
1780   if (fallthru1)
1781     {
1782       basic_block d1 = (forwarder_block_p (fallthru1->dest)
1783 			? single_succ (fallthru1->dest): fallthru1->dest);
1784       basic_block d2 = (forwarder_block_p (fallthru2->dest)
1785 			? single_succ (fallthru2->dest): fallthru2->dest);
1786 
1787       if (d1 != d2)
1788 	return false;
1789     }
1790 
1791   /* Ensure the same EH region.  */
1792   {
1793     rtx n1 = find_reg_note (BB_END (bb1), REG_EH_REGION, 0);
1794     rtx n2 = find_reg_note (BB_END (bb2), REG_EH_REGION, 0);
1795 
1796     if (!n1 && n2)
1797       return false;
1798 
1799     if (n1 && (!n2 || XEXP (n1, 0) != XEXP (n2, 0)))
1800       return false;
1801   }
1802 
1803   /* The same checks as in try_crossjump_to_edge. It is required for RTL
1804      version of sequence abstraction.  */
1805   FOR_EACH_EDGE (e1, ei, bb2->succs)
1806     {
1807       edge e2;
1808       edge_iterator ei;
1809       basic_block d1 = e1->dest;
1810 
1811       if (FORWARDER_BLOCK_P (d1))
1812         d1 = EDGE_SUCC (d1, 0)->dest;
1813 
1814       FOR_EACH_EDGE (e2, ei, bb1->succs)
1815         {
1816           basic_block d2 = e2->dest;
1817           if (FORWARDER_BLOCK_P (d2))
1818             d2 = EDGE_SUCC (d2, 0)->dest;
1819           if (d1 == d2)
1820             break;
1821         }
1822 
1823       if (!e2)
1824         return false;
1825     }
1826 
1827   return true;
1828 }
1829 
1830 /* Returns true if BB basic block has a preserve label.  */
1831 
1832 static bool
block_has_preserve_label(basic_block bb)1833 block_has_preserve_label (basic_block bb)
1834 {
1835   return (bb
1836           && block_label (bb)
1837           && LABEL_PRESERVE_P (block_label (bb)));
1838 }
1839 
1840 /* E1 and E2 are edges with the same destination block.  Search their
1841    predecessors for common code.  If found, redirect control flow from
1842    (maybe the middle of) E1->SRC to (maybe the middle of) E2->SRC (dir_forward),
1843    or the other way around (dir_backward).  DIR specifies the allowed
1844    replacement direction.  */
1845 
1846 static bool
try_crossjump_to_edge(int mode,edge e1,edge e2,enum replace_direction dir)1847 try_crossjump_to_edge (int mode, edge e1, edge e2,
1848                        enum replace_direction dir)
1849 {
1850   int nmatch;
1851   basic_block src1 = e1->src, src2 = e2->src;
1852   basic_block redirect_to, redirect_from, to_remove;
1853   basic_block osrc1, osrc2, redirect_edges_to, tmp;
1854   rtx newpos1, newpos2;
1855   edge s;
1856   edge_iterator ei;
1857 
1858   newpos1 = newpos2 = NULL_RTX;
1859 
1860   /* If we have partitioned hot/cold basic blocks, it is a bad idea
1861      to try this optimization.
1862 
1863      Basic block partitioning may result in some jumps that appear to
1864      be optimizable (or blocks that appear to be mergeable), but which really
1865      must be left untouched (they are required to make it safely across
1866      partition boundaries).  See the comments at the top of
1867      bb-reorder.c:partition_hot_cold_basic_blocks for complete details.  */
1868 
1869   if (flag_reorder_blocks_and_partition && reload_completed)
1870     return false;
1871 
1872   /* Search backward through forwarder blocks.  We don't need to worry
1873      about multiple entry or chained forwarders, as they will be optimized
1874      away.  We do this to look past the unconditional jump following a
1875      conditional jump that is required due to the current CFG shape.  */
1876   if (single_pred_p (src1)
1877       && FORWARDER_BLOCK_P (src1))
1878     e1 = single_pred_edge (src1), src1 = e1->src;
1879 
1880   if (single_pred_p (src2)
1881       && FORWARDER_BLOCK_P (src2))
1882     e2 = single_pred_edge (src2), src2 = e2->src;
1883 
1884   /* Nothing to do if we reach ENTRY, or a common source block.  */
1885   if (src1 == ENTRY_BLOCK_PTR || src2 == ENTRY_BLOCK_PTR)
1886     return false;
1887   if (src1 == src2)
1888     return false;
1889 
1890   /* Seeing more than 1 forwarder blocks would confuse us later...  */
1891   if (FORWARDER_BLOCK_P (e1->dest)
1892       && FORWARDER_BLOCK_P (single_succ (e1->dest)))
1893     return false;
1894 
1895   if (FORWARDER_BLOCK_P (e2->dest)
1896       && FORWARDER_BLOCK_P (single_succ (e2->dest)))
1897     return false;
1898 
1899   /* Likewise with dead code (possibly newly created by the other optimizations
1900      of cfg_cleanup).  */
1901   if (EDGE_COUNT (src1->preds) == 0 || EDGE_COUNT (src2->preds) == 0)
1902     return false;
1903 
1904   /* Look for the common insn sequence, part the first ...  */
1905   if (!outgoing_edges_match (mode, src1, src2))
1906     return false;
1907 
1908   /* ... and part the second.  */
1909   nmatch = flow_find_cross_jump (src1, src2, &newpos1, &newpos2, &dir);
1910 
1911   osrc1 = src1;
1912   osrc2 = src2;
1913   if (newpos1 != NULL_RTX)
1914     src1 = BLOCK_FOR_INSN (newpos1);
1915   if (newpos2 != NULL_RTX)
1916     src2 = BLOCK_FOR_INSN (newpos2);
1917 
1918   if (dir == dir_backward)
1919     {
1920 #define SWAP(T, X, Y) do { T tmp = (X); (X) = (Y); (Y) = tmp; } while (0)
1921       SWAP (basic_block, osrc1, osrc2);
1922       SWAP (basic_block, src1, src2);
1923       SWAP (edge, e1, e2);
1924       SWAP (rtx, newpos1, newpos2);
1925 #undef SWAP
1926     }
1927 
1928   /* Don't proceed with the crossjump unless we found a sufficient number
1929      of matching instructions or the 'from' block was totally matched
1930      (such that its predecessors will hopefully be redirected and the
1931      block removed).  */
1932   if ((nmatch < PARAM_VALUE (PARAM_MIN_CROSSJUMP_INSNS))
1933       && (newpos1 != BB_HEAD (src1)))
1934     return false;
1935 
1936   /* Avoid deleting preserve label when redirecting ABNORMAL edges.  */
1937   if (block_has_preserve_label (e1->dest)
1938       && (e1->flags & EDGE_ABNORMAL))
1939     return false;
1940 
1941   /* Here we know that the insns in the end of SRC1 which are common with SRC2
1942      will be deleted.
1943      If we have tablejumps in the end of SRC1 and SRC2
1944      they have been already compared for equivalence in outgoing_edges_match ()
1945      so replace the references to TABLE1 by references to TABLE2.  */
1946     {
1947       rtx label1, label2;
1948       rtx table1, table2;
1949 
1950       if (tablejump_p (BB_END (osrc1), &label1, &table1)
1951 	  && tablejump_p (BB_END (osrc2), &label2, &table2)
1952 	  && label1 != label2)
1953 	{
1954 	  replace_label_data rr;
1955 	  rtx insn;
1956 
1957 	  /* Replace references to LABEL1 with LABEL2.  */
1958 	  rr.r1 = label1;
1959 	  rr.r2 = label2;
1960 	  rr.update_label_nuses = true;
1961 	  for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
1962 	    {
1963 	      /* Do not replace the label in SRC1->END because when deleting
1964 		 a block whose end is a tablejump, the tablejump referenced
1965 		 from the instruction is deleted too.  */
1966 	      if (insn != BB_END (osrc1))
1967 		for_each_rtx (&insn, replace_label, &rr);
1968 	    }
1969 	}
1970     }
1971 
1972   /* Avoid splitting if possible.  We must always split when SRC2 has
1973      EH predecessor edges, or we may end up with basic blocks with both
1974      normal and EH predecessor edges.  */
1975   if (newpos2 == BB_HEAD (src2)
1976       && !(EDGE_PRED (src2, 0)->flags & EDGE_EH))
1977     redirect_to = src2;
1978   else
1979     {
1980       if (newpos2 == BB_HEAD (src2))
1981 	{
1982 	  /* Skip possible basic block header.  */
1983 	  if (LABEL_P (newpos2))
1984 	    newpos2 = NEXT_INSN (newpos2);
1985 	  while (DEBUG_INSN_P (newpos2))
1986 	    newpos2 = NEXT_INSN (newpos2);
1987 	  if (NOTE_P (newpos2))
1988 	    newpos2 = NEXT_INSN (newpos2);
1989 	  while (DEBUG_INSN_P (newpos2))
1990 	    newpos2 = NEXT_INSN (newpos2);
1991 	}
1992 
1993       if (dump_file)
1994 	fprintf (dump_file, "Splitting bb %i before %i insns\n",
1995 		 src2->index, nmatch);
1996       redirect_to = split_block (src2, PREV_INSN (newpos2))->dest;
1997     }
1998 
1999   if (dump_file)
2000     fprintf (dump_file,
2001 	     "Cross jumping from bb %i to bb %i; %i common insns\n",
2002 	     src1->index, src2->index, nmatch);
2003 
2004   /* We may have some registers visible through the block.  */
2005   df_set_bb_dirty (redirect_to);
2006 
2007   if (osrc2 == src2)
2008     redirect_edges_to = redirect_to;
2009   else
2010     redirect_edges_to = osrc2;
2011 
2012   /* Recompute the frequencies and counts of outgoing edges.  */
2013   FOR_EACH_EDGE (s, ei, redirect_edges_to->succs)
2014     {
2015       edge s2;
2016       edge_iterator ei;
2017       basic_block d = s->dest;
2018 
2019       if (FORWARDER_BLOCK_P (d))
2020 	d = single_succ (d);
2021 
2022       FOR_EACH_EDGE (s2, ei, src1->succs)
2023 	{
2024 	  basic_block d2 = s2->dest;
2025 	  if (FORWARDER_BLOCK_P (d2))
2026 	    d2 = single_succ (d2);
2027 	  if (d == d2)
2028 	    break;
2029 	}
2030 
2031       s->count += s2->count;
2032 
2033       /* Take care to update possible forwarder blocks.  We verified
2034 	 that there is no more than one in the chain, so we can't run
2035 	 into infinite loop.  */
2036       if (FORWARDER_BLOCK_P (s->dest))
2037 	{
2038 	  single_succ_edge (s->dest)->count += s2->count;
2039 	  s->dest->count += s2->count;
2040 	  s->dest->frequency += EDGE_FREQUENCY (s);
2041 	}
2042 
2043       if (FORWARDER_BLOCK_P (s2->dest))
2044 	{
2045 	  single_succ_edge (s2->dest)->count -= s2->count;
2046 	  if (single_succ_edge (s2->dest)->count < 0)
2047 	    single_succ_edge (s2->dest)->count = 0;
2048 	  s2->dest->count -= s2->count;
2049 	  s2->dest->frequency -= EDGE_FREQUENCY (s);
2050 	  if (s2->dest->frequency < 0)
2051 	    s2->dest->frequency = 0;
2052 	  if (s2->dest->count < 0)
2053 	    s2->dest->count = 0;
2054 	}
2055 
2056       if (!redirect_edges_to->frequency && !src1->frequency)
2057 	s->probability = (s->probability + s2->probability) / 2;
2058       else
2059 	s->probability
2060 	  = ((s->probability * redirect_edges_to->frequency +
2061 	      s2->probability * src1->frequency)
2062 	     / (redirect_edges_to->frequency + src1->frequency));
2063     }
2064 
2065   /* Adjust count and frequency for the block.  An earlier jump
2066      threading pass may have left the profile in an inconsistent
2067      state (see update_bb_profile_for_threading) so we must be
2068      prepared for overflows.  */
2069   tmp = redirect_to;
2070   do
2071     {
2072       tmp->count += src1->count;
2073       tmp->frequency += src1->frequency;
2074       if (tmp->frequency > BB_FREQ_MAX)
2075         tmp->frequency = BB_FREQ_MAX;
2076       if (tmp == redirect_edges_to)
2077         break;
2078       tmp = find_fallthru_edge (tmp->succs)->dest;
2079     }
2080   while (true);
2081   update_br_prob_note (redirect_edges_to);
2082 
2083   /* Edit SRC1 to go to REDIRECT_TO at NEWPOS1.  */
2084 
2085   /* Skip possible basic block header.  */
2086   if (LABEL_P (newpos1))
2087     newpos1 = NEXT_INSN (newpos1);
2088 
2089   while (DEBUG_INSN_P (newpos1))
2090     newpos1 = NEXT_INSN (newpos1);
2091 
2092   if (NOTE_INSN_BASIC_BLOCK_P (newpos1))
2093     newpos1 = NEXT_INSN (newpos1);
2094 
2095   while (DEBUG_INSN_P (newpos1))
2096     newpos1 = NEXT_INSN (newpos1);
2097 
2098   redirect_from = split_block (src1, PREV_INSN (newpos1))->src;
2099   to_remove = single_succ (redirect_from);
2100 
2101   redirect_edge_and_branch_force (single_succ_edge (redirect_from), redirect_to);
2102   delete_basic_block (to_remove);
2103 
2104   update_forwarder_flag (redirect_from);
2105   if (redirect_to != src2)
2106     update_forwarder_flag (src2);
2107 
2108   return true;
2109 }
2110 
2111 /* Search the predecessors of BB for common insn sequences.  When found,
2112    share code between them by redirecting control flow.  Return true if
2113    any changes made.  */
2114 
2115 static bool
try_crossjump_bb(int mode,basic_block bb)2116 try_crossjump_bb (int mode, basic_block bb)
2117 {
2118   edge e, e2, fallthru;
2119   bool changed;
2120   unsigned max, ix, ix2;
2121 
2122   /* Nothing to do if there is not at least two incoming edges.  */
2123   if (EDGE_COUNT (bb->preds) < 2)
2124     return false;
2125 
2126   /* Don't crossjump if this block ends in a computed jump,
2127      unless we are optimizing for size.  */
2128   if (optimize_bb_for_size_p (bb)
2129       && bb != EXIT_BLOCK_PTR
2130       && computed_jump_p (BB_END (bb)))
2131     return false;
2132 
2133   /* If we are partitioning hot/cold basic blocks, we don't want to
2134      mess up unconditional or indirect jumps that cross between hot
2135      and cold sections.
2136 
2137      Basic block partitioning may result in some jumps that appear to
2138      be optimizable (or blocks that appear to be mergeable), but which really
2139      must be left untouched (they are required to make it safely across
2140      partition boundaries).  See the comments at the top of
2141      bb-reorder.c:partition_hot_cold_basic_blocks for complete details.  */
2142 
2143   if (BB_PARTITION (EDGE_PRED (bb, 0)->src) !=
2144 					BB_PARTITION (EDGE_PRED (bb, 1)->src)
2145       || (EDGE_PRED (bb, 0)->flags & EDGE_CROSSING))
2146     return false;
2147 
2148   /* It is always cheapest to redirect a block that ends in a branch to
2149      a block that falls through into BB, as that adds no branches to the
2150      program.  We'll try that combination first.  */
2151   fallthru = NULL;
2152   max = PARAM_VALUE (PARAM_MAX_CROSSJUMP_EDGES);
2153 
2154   if (EDGE_COUNT (bb->preds) > max)
2155     return false;
2156 
2157   fallthru = find_fallthru_edge (bb->preds);
2158 
2159   changed = false;
2160   for (ix = 0; ix < EDGE_COUNT (bb->preds);)
2161     {
2162       e = EDGE_PRED (bb, ix);
2163       ix++;
2164 
2165       /* As noted above, first try with the fallthru predecessor (or, a
2166 	 fallthru predecessor if we are in cfglayout mode).  */
2167       if (fallthru)
2168 	{
2169 	  /* Don't combine the fallthru edge into anything else.
2170 	     If there is a match, we'll do it the other way around.  */
2171 	  if (e == fallthru)
2172 	    continue;
2173 	  /* If nothing changed since the last attempt, there is nothing
2174 	     we can do.  */
2175 	  if (!first_pass
2176 	      && !((e->src->flags & BB_MODIFIED)
2177 		   || (fallthru->src->flags & BB_MODIFIED)))
2178 	    continue;
2179 
2180 	  if (try_crossjump_to_edge (mode, e, fallthru, dir_forward))
2181 	    {
2182 	      changed = true;
2183 	      ix = 0;
2184 	      continue;
2185 	    }
2186 	}
2187 
2188       /* Non-obvious work limiting check: Recognize that we're going
2189 	 to call try_crossjump_bb on every basic block.  So if we have
2190 	 two blocks with lots of outgoing edges (a switch) and they
2191 	 share lots of common destinations, then we would do the
2192 	 cross-jump check once for each common destination.
2193 
2194 	 Now, if the blocks actually are cross-jump candidates, then
2195 	 all of their destinations will be shared.  Which means that
2196 	 we only need check them for cross-jump candidacy once.  We
2197 	 can eliminate redundant checks of crossjump(A,B) by arbitrarily
2198 	 choosing to do the check from the block for which the edge
2199 	 in question is the first successor of A.  */
2200       if (EDGE_SUCC (e->src, 0) != e)
2201 	continue;
2202 
2203       for (ix2 = 0; ix2 < EDGE_COUNT (bb->preds); ix2++)
2204 	{
2205 	  e2 = EDGE_PRED (bb, ix2);
2206 
2207 	  if (e2 == e)
2208 	    continue;
2209 
2210 	  /* We've already checked the fallthru edge above.  */
2211 	  if (e2 == fallthru)
2212 	    continue;
2213 
2214 	  /* The "first successor" check above only prevents multiple
2215 	     checks of crossjump(A,B).  In order to prevent redundant
2216 	     checks of crossjump(B,A), require that A be the block
2217 	     with the lowest index.  */
2218 	  if (e->src->index > e2->src->index)
2219 	    continue;
2220 
2221 	  /* If nothing changed since the last attempt, there is nothing
2222 	     we can do.  */
2223 	  if (!first_pass
2224 	      && !((e->src->flags & BB_MODIFIED)
2225 		   || (e2->src->flags & BB_MODIFIED)))
2226 	    continue;
2227 
2228 	  /* Both e and e2 are not fallthru edges, so we can crossjump in either
2229 	     direction.  */
2230 	  if (try_crossjump_to_edge (mode, e, e2, dir_both))
2231 	    {
2232 	      changed = true;
2233 	      ix = 0;
2234 	      break;
2235 	    }
2236 	}
2237     }
2238 
2239   if (changed)
2240     crossjumps_occured = true;
2241 
2242   return changed;
2243 }
2244 
2245 /* Search the successors of BB for common insn sequences.  When found,
2246    share code between them by moving it across the basic block
2247    boundary.  Return true if any changes made.  */
2248 
2249 static bool
try_head_merge_bb(basic_block bb)2250 try_head_merge_bb (basic_block bb)
2251 {
2252   basic_block final_dest_bb = NULL;
2253   int max_match = INT_MAX;
2254   edge e0;
2255   rtx *headptr, *currptr, *nextptr;
2256   bool changed, moveall;
2257   unsigned ix;
2258   rtx e0_last_head, cond, move_before;
2259   unsigned nedges = EDGE_COUNT (bb->succs);
2260   rtx jump = BB_END (bb);
2261   regset live, live_union;
2262 
2263   /* Nothing to do if there is not at least two outgoing edges.  */
2264   if (nedges < 2)
2265     return false;
2266 
2267   /* Don't crossjump if this block ends in a computed jump,
2268      unless we are optimizing for size.  */
2269   if (optimize_bb_for_size_p (bb)
2270       && bb != EXIT_BLOCK_PTR
2271       && computed_jump_p (BB_END (bb)))
2272     return false;
2273 
2274   cond = get_condition (jump, &move_before, true, false);
2275   if (cond == NULL_RTX)
2276     {
2277 #ifdef HAVE_cc0
2278       if (reg_mentioned_p (cc0_rtx, jump))
2279 	move_before = prev_nonnote_nondebug_insn (jump);
2280       else
2281 #endif
2282 	move_before = jump;
2283     }
2284 
2285   for (ix = 0; ix < nedges; ix++)
2286     if (EDGE_SUCC (bb, ix)->dest == EXIT_BLOCK_PTR)
2287       return false;
2288 
2289   for (ix = 0; ix < nedges; ix++)
2290     {
2291       edge e = EDGE_SUCC (bb, ix);
2292       basic_block other_bb = e->dest;
2293 
2294       if (df_get_bb_dirty (other_bb))
2295 	{
2296 	  block_was_dirty = true;
2297 	  return false;
2298 	}
2299 
2300       if (e->flags & EDGE_ABNORMAL)
2301 	return false;
2302 
2303       /* Normally, all destination blocks must only be reachable from this
2304 	 block, i.e. they must have one incoming edge.
2305 
2306 	 There is one special case we can handle, that of multiple consecutive
2307 	 jumps where the first jumps to one of the targets of the second jump.
2308 	 This happens frequently in switch statements for default labels.
2309 	 The structure is as follows:
2310 	 FINAL_DEST_BB
2311 	 ....
2312 	 if (cond) jump A;
2313 	 fall through
2314 	 BB
2315 	 jump with targets A, B, C, D...
2316 	 A
2317 	 has two incoming edges, from FINAL_DEST_BB and BB
2318 
2319 	 In this case, we can try to move the insns through BB and into
2320 	 FINAL_DEST_BB.  */
2321       if (EDGE_COUNT (other_bb->preds) != 1)
2322 	{
2323 	  edge incoming_edge, incoming_bb_other_edge;
2324 	  edge_iterator ei;
2325 
2326 	  if (final_dest_bb != NULL
2327 	      || EDGE_COUNT (other_bb->preds) != 2)
2328 	    return false;
2329 
2330 	  /* We must be able to move the insns across the whole block.  */
2331 	  move_before = BB_HEAD (bb);
2332 	  while (!NONDEBUG_INSN_P (move_before))
2333 	    move_before = NEXT_INSN (move_before);
2334 
2335 	  if (EDGE_COUNT (bb->preds) != 1)
2336 	    return false;
2337 	  incoming_edge = EDGE_PRED (bb, 0);
2338 	  final_dest_bb = incoming_edge->src;
2339 	  if (EDGE_COUNT (final_dest_bb->succs) != 2)
2340 	    return false;
2341 	  FOR_EACH_EDGE (incoming_bb_other_edge, ei, final_dest_bb->succs)
2342 	    if (incoming_bb_other_edge != incoming_edge)
2343 	      break;
2344 	  if (incoming_bb_other_edge->dest != other_bb)
2345 	    return false;
2346 	}
2347     }
2348 
2349   e0 = EDGE_SUCC (bb, 0);
2350   e0_last_head = NULL_RTX;
2351   changed = false;
2352 
2353   for (ix = 1; ix < nedges; ix++)
2354     {
2355       edge e = EDGE_SUCC (bb, ix);
2356       rtx e0_last, e_last;
2357       int nmatch;
2358 
2359       nmatch = flow_find_head_matching_sequence (e0->dest, e->dest,
2360 						 &e0_last, &e_last, 0);
2361       if (nmatch == 0)
2362 	return false;
2363 
2364       if (nmatch < max_match)
2365 	{
2366 	  max_match = nmatch;
2367 	  e0_last_head = e0_last;
2368 	}
2369     }
2370 
2371   /* If we matched an entire block, we probably have to avoid moving the
2372      last insn.  */
2373   if (max_match > 0
2374       && e0_last_head == BB_END (e0->dest)
2375       && (find_reg_note (e0_last_head, REG_EH_REGION, 0)
2376 	  || control_flow_insn_p (e0_last_head)))
2377     {
2378       max_match--;
2379       if (max_match == 0)
2380 	return false;
2381       do
2382 	e0_last_head = prev_real_insn (e0_last_head);
2383       while (DEBUG_INSN_P (e0_last_head));
2384     }
2385 
2386   if (max_match == 0)
2387     return false;
2388 
2389   /* We must find a union of the live registers at each of the end points.  */
2390   live = BITMAP_ALLOC (NULL);
2391   live_union = BITMAP_ALLOC (NULL);
2392 
2393   currptr = XNEWVEC (rtx, nedges);
2394   headptr = XNEWVEC (rtx, nedges);
2395   nextptr = XNEWVEC (rtx, nedges);
2396 
2397   for (ix = 0; ix < nedges; ix++)
2398     {
2399       int j;
2400       basic_block merge_bb = EDGE_SUCC (bb, ix)->dest;
2401       rtx head = BB_HEAD (merge_bb);
2402 
2403       while (!NONDEBUG_INSN_P (head))
2404 	head = NEXT_INSN (head);
2405       headptr[ix] = head;
2406       currptr[ix] = head;
2407 
2408       /* Compute the end point and live information  */
2409       for (j = 1; j < max_match; j++)
2410 	do
2411 	  head = NEXT_INSN (head);
2412 	while (!NONDEBUG_INSN_P (head));
2413       simulate_backwards_to_point (merge_bb, live, head);
2414       IOR_REG_SET (live_union, live);
2415     }
2416 
2417   /* If we're moving across two blocks, verify the validity of the
2418      first move, then adjust the target and let the loop below deal
2419      with the final move.  */
2420   if (final_dest_bb != NULL)
2421     {
2422       rtx move_upto;
2423 
2424       moveall = can_move_insns_across (currptr[0], e0_last_head, move_before,
2425 				       jump, e0->dest, live_union,
2426 				       NULL, &move_upto);
2427       if (!moveall)
2428 	{
2429 	  if (move_upto == NULL_RTX)
2430 	    goto out;
2431 
2432 	  while (e0_last_head != move_upto)
2433 	    {
2434 	      df_simulate_one_insn_backwards (e0->dest, e0_last_head,
2435 					      live_union);
2436 	      e0_last_head = PREV_INSN (e0_last_head);
2437 	    }
2438 	}
2439       if (e0_last_head == NULL_RTX)
2440 	goto out;
2441 
2442       jump = BB_END (final_dest_bb);
2443       cond = get_condition (jump, &move_before, true, false);
2444       if (cond == NULL_RTX)
2445 	{
2446 #ifdef HAVE_cc0
2447 	  if (reg_mentioned_p (cc0_rtx, jump))
2448 	    move_before = prev_nonnote_nondebug_insn (jump);
2449 	  else
2450 #endif
2451 	    move_before = jump;
2452 	}
2453     }
2454 
2455   do
2456     {
2457       rtx move_upto;
2458       moveall = can_move_insns_across (currptr[0], e0_last_head,
2459 				       move_before, jump, e0->dest, live_union,
2460 				       NULL, &move_upto);
2461       if (!moveall && move_upto == NULL_RTX)
2462 	{
2463 	  if (jump == move_before)
2464 	    break;
2465 
2466 	  /* Try again, using a different insertion point.  */
2467 	  move_before = jump;
2468 
2469 #ifdef HAVE_cc0
2470 	  /* Don't try moving before a cc0 user, as that may invalidate
2471 	     the cc0.  */
2472 	  if (reg_mentioned_p (cc0_rtx, jump))
2473 	    break;
2474 #endif
2475 
2476 	  continue;
2477 	}
2478 
2479       if (final_dest_bb && !moveall)
2480 	/* We haven't checked whether a partial move would be OK for the first
2481 	   move, so we have to fail this case.  */
2482 	break;
2483 
2484       changed = true;
2485       for (;;)
2486 	{
2487 	  if (currptr[0] == move_upto)
2488 	    break;
2489 	  for (ix = 0; ix < nedges; ix++)
2490 	    {
2491 	      rtx curr = currptr[ix];
2492 	      do
2493 		curr = NEXT_INSN (curr);
2494 	      while (!NONDEBUG_INSN_P (curr));
2495 	      currptr[ix] = curr;
2496 	    }
2497 	}
2498 
2499       /* If we can't currently move all of the identical insns, remember
2500 	 each insn after the range that we'll merge.  */
2501       if (!moveall)
2502 	for (ix = 0; ix < nedges; ix++)
2503 	  {
2504 	    rtx curr = currptr[ix];
2505 	    do
2506 	      curr = NEXT_INSN (curr);
2507 	    while (!NONDEBUG_INSN_P (curr));
2508 	    nextptr[ix] = curr;
2509 	  }
2510 
2511       reorder_insns (headptr[0], currptr[0], PREV_INSN (move_before));
2512       df_set_bb_dirty (EDGE_SUCC (bb, 0)->dest);
2513       if (final_dest_bb != NULL)
2514 	df_set_bb_dirty (final_dest_bb);
2515       df_set_bb_dirty (bb);
2516       for (ix = 1; ix < nedges; ix++)
2517 	{
2518 	  df_set_bb_dirty (EDGE_SUCC (bb, ix)->dest);
2519 	  delete_insn_chain (headptr[ix], currptr[ix], false);
2520 	}
2521       if (!moveall)
2522 	{
2523 	  if (jump == move_before)
2524 	    break;
2525 
2526 	  /* For the unmerged insns, try a different insertion point.  */
2527 	  move_before = jump;
2528 
2529 #ifdef HAVE_cc0
2530 	  /* Don't try moving before a cc0 user, as that may invalidate
2531 	     the cc0.  */
2532 	  if (reg_mentioned_p (cc0_rtx, jump))
2533 	    break;
2534 #endif
2535 
2536 	  for (ix = 0; ix < nedges; ix++)
2537 	    currptr[ix] = headptr[ix] = nextptr[ix];
2538 	}
2539     }
2540   while (!moveall);
2541 
2542  out:
2543   free (currptr);
2544   free (headptr);
2545   free (nextptr);
2546 
2547   crossjumps_occured |= changed;
2548 
2549   return changed;
2550 }
2551 
2552 /* Return true if BB contains just bb note, or bb note followed
2553    by only DEBUG_INSNs.  */
2554 
2555 static bool
trivially_empty_bb_p(basic_block bb)2556 trivially_empty_bb_p (basic_block bb)
2557 {
2558   rtx insn = BB_END (bb);
2559 
2560   while (1)
2561     {
2562       if (insn == BB_HEAD (bb))
2563 	return true;
2564       if (!DEBUG_INSN_P (insn))
2565 	return false;
2566       insn = PREV_INSN (insn);
2567     }
2568 }
2569 
2570 /* Do simple CFG optimizations - basic block merging, simplifying of jump
2571    instructions etc.  Return nonzero if changes were made.  */
2572 
2573 static bool
try_optimize_cfg(int mode)2574 try_optimize_cfg (int mode)
2575 {
2576   bool changed_overall = false;
2577   bool changed;
2578   int iterations = 0;
2579   basic_block bb, b, next;
2580 
2581   if (mode & (CLEANUP_CROSSJUMP | CLEANUP_THREADING))
2582     clear_bb_flags ();
2583 
2584   crossjumps_occured = false;
2585 
2586   FOR_EACH_BB (bb)
2587     update_forwarder_flag (bb);
2588 
2589   if (! targetm.cannot_modify_jumps_p ())
2590     {
2591       first_pass = true;
2592       /* Attempt to merge blocks as made possible by edge removal.  If
2593 	 a block has only one successor, and the successor has only
2594 	 one predecessor, they may be combined.  */
2595       do
2596 	{
2597 	  block_was_dirty = false;
2598 	  changed = false;
2599 	  iterations++;
2600 
2601 	  if (dump_file)
2602 	    fprintf (dump_file,
2603 		     "\n\ntry_optimize_cfg iteration %i\n\n",
2604 		     iterations);
2605 
2606 	  for (b = ENTRY_BLOCK_PTR->next_bb; b != EXIT_BLOCK_PTR;)
2607 	    {
2608 	      basic_block c;
2609 	      edge s;
2610 	      bool changed_here = false;
2611 
2612 	      /* Delete trivially dead basic blocks.  This is either
2613 		 blocks with no predecessors, or empty blocks with no
2614 		 successors.  However if the empty block with no
2615 		 successors is the successor of the ENTRY_BLOCK, it is
2616 		 kept.  This ensures that the ENTRY_BLOCK will have a
2617 		 successor which is a precondition for many RTL
2618 		 passes.  Empty blocks may result from expanding
2619 		 __builtin_unreachable ().  */
2620 	      if (EDGE_COUNT (b->preds) == 0
2621 		  || (EDGE_COUNT (b->succs) == 0
2622 		      && trivially_empty_bb_p (b)
2623 		      && single_succ_edge (ENTRY_BLOCK_PTR)->dest != b))
2624 		{
2625 		  c = b->prev_bb;
2626 		  if (EDGE_COUNT (b->preds) > 0)
2627 		    {
2628 		      edge e;
2629 		      edge_iterator ei;
2630 
2631 		      if (current_ir_type () == IR_RTL_CFGLAYOUT)
2632 			{
2633 			  if (BB_FOOTER (b)
2634 			      && BARRIER_P (BB_FOOTER (b)))
2635 			    FOR_EACH_EDGE (e, ei, b->preds)
2636 			      if ((e->flags & EDGE_FALLTHRU)
2637 				  && BB_FOOTER (e->src) == NULL)
2638 				{
2639 				  if (BB_FOOTER (b))
2640 				    {
2641 				      BB_FOOTER (e->src) = BB_FOOTER (b);
2642 				      BB_FOOTER (b) = NULL;
2643 				    }
2644 				  else
2645 				    {
2646 				      start_sequence ();
2647 				      BB_FOOTER (e->src) = emit_barrier ();
2648 				      end_sequence ();
2649 				    }
2650 				}
2651 			}
2652 		      else
2653 			{
2654 			  rtx last = get_last_bb_insn (b);
2655 			  if (last && BARRIER_P (last))
2656 			    FOR_EACH_EDGE (e, ei, b->preds)
2657 			      if ((e->flags & EDGE_FALLTHRU))
2658 				emit_barrier_after (BB_END (e->src));
2659 			}
2660 		    }
2661 		  delete_basic_block (b);
2662 		  changed = true;
2663 		  /* Avoid trying to remove ENTRY_BLOCK_PTR.  */
2664 		  b = (c == ENTRY_BLOCK_PTR ? c->next_bb : c);
2665 		  continue;
2666 		}
2667 
2668 	      /* Remove code labels no longer used.  */
2669 	      if (single_pred_p (b)
2670 		  && (single_pred_edge (b)->flags & EDGE_FALLTHRU)
2671 		  && !(single_pred_edge (b)->flags & EDGE_COMPLEX)
2672 		  && LABEL_P (BB_HEAD (b))
2673 		  /* If the previous block ends with a branch to this
2674 		     block, we can't delete the label.  Normally this
2675 		     is a condjump that is yet to be simplified, but
2676 		     if CASE_DROPS_THRU, this can be a tablejump with
2677 		     some element going to the same place as the
2678 		     default (fallthru).  */
2679 		  && (single_pred (b) == ENTRY_BLOCK_PTR
2680 		      || !JUMP_P (BB_END (single_pred (b)))
2681 		      || ! label_is_jump_target_p (BB_HEAD (b),
2682 						   BB_END (single_pred (b)))))
2683 		{
2684 		  delete_insn (BB_HEAD (b));
2685 		  if (dump_file)
2686 		    fprintf (dump_file, "Deleted label in block %i.\n",
2687 			     b->index);
2688 		}
2689 
2690 	      /* If we fall through an empty block, we can remove it.  */
2691 	      if (!(mode & (CLEANUP_CFGLAYOUT | CLEANUP_NO_INSN_DEL))
2692 		  && single_pred_p (b)
2693 		  && (single_pred_edge (b)->flags & EDGE_FALLTHRU)
2694 		  && !LABEL_P (BB_HEAD (b))
2695 		  && FORWARDER_BLOCK_P (b)
2696 		  /* Note that forwarder_block_p true ensures that
2697 		     there is a successor for this block.  */
2698 		  && (single_succ_edge (b)->flags & EDGE_FALLTHRU)
2699 		  && n_basic_blocks > NUM_FIXED_BLOCKS + 1)
2700 		{
2701 		  if (dump_file)
2702 		    fprintf (dump_file,
2703 			     "Deleting fallthru block %i.\n",
2704 			     b->index);
2705 
2706 		  c = b->prev_bb == ENTRY_BLOCK_PTR ? b->next_bb : b->prev_bb;
2707 		  redirect_edge_succ_nodup (single_pred_edge (b),
2708 					    single_succ (b));
2709 		  delete_basic_block (b);
2710 		  changed = true;
2711 		  b = c;
2712 		  continue;
2713 		}
2714 
2715 	      /* Merge B with its single successor, if any.  */
2716 	      if (single_succ_p (b)
2717 		  && (s = single_succ_edge (b))
2718 		  && !(s->flags & EDGE_COMPLEX)
2719 		  && (c = s->dest) != EXIT_BLOCK_PTR
2720 		  && single_pred_p (c)
2721 		  && b != c)
2722 		{
2723 		  /* When not in cfg_layout mode use code aware of reordering
2724 		     INSN.  This code possibly creates new basic blocks so it
2725 		     does not fit merge_blocks interface and is kept here in
2726 		     hope that it will become useless once more of compiler
2727 		     is transformed to use cfg_layout mode.  */
2728 
2729 		  if ((mode & CLEANUP_CFGLAYOUT)
2730 		      && can_merge_blocks_p (b, c))
2731 		    {
2732 		      merge_blocks (b, c);
2733 		      update_forwarder_flag (b);
2734 		      changed_here = true;
2735 		    }
2736 		  else if (!(mode & CLEANUP_CFGLAYOUT)
2737 			   /* If the jump insn has side effects,
2738 			      we can't kill the edge.  */
2739 			   && (!JUMP_P (BB_END (b))
2740 			       || (reload_completed
2741 				   ? simplejump_p (BB_END (b))
2742 				   : (onlyjump_p (BB_END (b))
2743 				      && !tablejump_p (BB_END (b),
2744 						       NULL, NULL))))
2745 			   && (next = merge_blocks_move (s, b, c, mode)))
2746 		      {
2747 			b = next;
2748 			changed_here = true;
2749 		      }
2750 		}
2751 
2752 	      /* Simplify branch over branch.  */
2753 	      if ((mode & CLEANUP_EXPENSIVE)
2754 		   && !(mode & CLEANUP_CFGLAYOUT)
2755 		   && try_simplify_condjump (b))
2756 		changed_here = true;
2757 
2758 	      /* If B has a single outgoing edge, but uses a
2759 		 non-trivial jump instruction without side-effects, we
2760 		 can either delete the jump entirely, or replace it
2761 		 with a simple unconditional jump.  */
2762 	      if (single_succ_p (b)
2763 		  && single_succ (b) != EXIT_BLOCK_PTR
2764 		  && onlyjump_p (BB_END (b))
2765 		  && !find_reg_note (BB_END (b), REG_CROSSING_JUMP, NULL_RTX)
2766 		  && try_redirect_by_replacing_jump (single_succ_edge (b),
2767 						     single_succ (b),
2768 						     (mode & CLEANUP_CFGLAYOUT) != 0))
2769 		{
2770 		  update_forwarder_flag (b);
2771 		  changed_here = true;
2772 		}
2773 
2774 	      /* Simplify branch to branch.  */
2775 	      if (try_forward_edges (mode, b))
2776 		{
2777 		  update_forwarder_flag (b);
2778 		  changed_here = true;
2779 		}
2780 
2781 	      /* Look for shared code between blocks.  */
2782 	      if ((mode & CLEANUP_CROSSJUMP)
2783 		  && try_crossjump_bb (mode, b))
2784 		changed_here = true;
2785 
2786 	      if ((mode & CLEANUP_CROSSJUMP)
2787 		  /* This can lengthen register lifetimes.  Do it only after
2788 		     reload.  */
2789 		  && reload_completed
2790 		  && try_head_merge_bb (b))
2791 		changed_here = true;
2792 
2793 	      /* Don't get confused by the index shift caused by
2794 		 deleting blocks.  */
2795 	      if (!changed_here)
2796 		b = b->next_bb;
2797 	      else
2798 		changed = true;
2799 	    }
2800 
2801 	  if ((mode & CLEANUP_CROSSJUMP)
2802 	      && try_crossjump_bb (mode, EXIT_BLOCK_PTR))
2803 	    changed = true;
2804 
2805 	  if (block_was_dirty)
2806 	    {
2807 	      /* This should only be set by head-merging.  */
2808 	      gcc_assert (mode & CLEANUP_CROSSJUMP);
2809 	      df_analyze ();
2810 	    }
2811 
2812 #ifdef ENABLE_CHECKING
2813 	  if (changed)
2814 	    verify_flow_info ();
2815 #endif
2816 
2817 	  changed_overall |= changed;
2818 	  first_pass = false;
2819 	}
2820       while (changed);
2821     }
2822 
2823   FOR_ALL_BB (b)
2824     b->flags &= ~(BB_FORWARDER_BLOCK | BB_NONTHREADABLE_BLOCK);
2825 
2826   return changed_overall;
2827 }
2828 
2829 /* Delete all unreachable basic blocks.  */
2830 
2831 bool
delete_unreachable_blocks(void)2832 delete_unreachable_blocks (void)
2833 {
2834   bool changed = false;
2835   basic_block b, prev_bb;
2836 
2837   find_unreachable_blocks ();
2838 
2839   /* When we're in GIMPLE mode and there may be debug insns, we should
2840      delete blocks in reverse dominator order, so as to get a chance
2841      to substitute all released DEFs into debug stmts.  If we don't
2842      have dominators information, walking blocks backward gets us a
2843      better chance of retaining most debug information than
2844      otherwise.  */
2845   if (MAY_HAVE_DEBUG_INSNS && current_ir_type () == IR_GIMPLE
2846       && dom_info_available_p (CDI_DOMINATORS))
2847     {
2848       for (b = EXIT_BLOCK_PTR->prev_bb; b != ENTRY_BLOCK_PTR; b = prev_bb)
2849 	{
2850 	  prev_bb = b->prev_bb;
2851 
2852 	  if (!(b->flags & BB_REACHABLE))
2853 	    {
2854 	      /* Speed up the removal of blocks that don't dominate
2855 		 others.  Walking backwards, this should be the common
2856 		 case.  */
2857 	      if (!first_dom_son (CDI_DOMINATORS, b))
2858 		delete_basic_block (b);
2859 	      else
2860 		{
2861 		  vec<basic_block> h
2862 		    = get_all_dominated_blocks (CDI_DOMINATORS, b);
2863 
2864 		  while (h.length ())
2865 		    {
2866 		      b = h.pop ();
2867 
2868 		      prev_bb = b->prev_bb;
2869 
2870 		      gcc_assert (!(b->flags & BB_REACHABLE));
2871 
2872 		      delete_basic_block (b);
2873 		    }
2874 
2875 		  h.release ();
2876 		}
2877 
2878 	      changed = true;
2879 	    }
2880 	}
2881     }
2882   else
2883     {
2884       for (b = EXIT_BLOCK_PTR->prev_bb; b != ENTRY_BLOCK_PTR; b = prev_bb)
2885 	{
2886 	  prev_bb = b->prev_bb;
2887 
2888 	  if (!(b->flags & BB_REACHABLE))
2889 	    {
2890 	      delete_basic_block (b);
2891 	      changed = true;
2892 	    }
2893 	}
2894     }
2895 
2896   if (changed)
2897     tidy_fallthru_edges ();
2898   return changed;
2899 }
2900 
2901 /* Delete any jump tables never referenced.  We can't delete them at the
2902    time of removing tablejump insn as they are referenced by the preceding
2903    insns computing the destination, so we delay deleting and garbagecollect
2904    them once life information is computed.  */
2905 void
delete_dead_jumptables(void)2906 delete_dead_jumptables (void)
2907 {
2908   basic_block bb;
2909 
2910   /* A dead jump table does not belong to any basic block.  Scan insns
2911      between two adjacent basic blocks.  */
2912   FOR_EACH_BB (bb)
2913     {
2914       rtx insn, next;
2915 
2916       for (insn = NEXT_INSN (BB_END (bb));
2917 	   insn && !NOTE_INSN_BASIC_BLOCK_P (insn);
2918 	   insn = next)
2919 	{
2920 	  next = NEXT_INSN (insn);
2921 	  if (LABEL_P (insn)
2922 	      && LABEL_NUSES (insn) == LABEL_PRESERVE_P (insn)
2923 	      && JUMP_TABLE_DATA_P (next))
2924 	    {
2925 	      rtx label = insn, jump = next;
2926 
2927 	      if (dump_file)
2928 		fprintf (dump_file, "Dead jumptable %i removed\n",
2929 			 INSN_UID (insn));
2930 
2931 	      next = NEXT_INSN (next);
2932 	      delete_insn (jump);
2933 	      delete_insn (label);
2934 	    }
2935 	}
2936     }
2937 }
2938 
2939 
2940 /* Tidy the CFG by deleting unreachable code and whatnot.  */
2941 
2942 bool
cleanup_cfg(int mode)2943 cleanup_cfg (int mode)
2944 {
2945   bool changed = false;
2946 
2947   /* Set the cfglayout mode flag here.  We could update all the callers
2948      but that is just inconvenient, especially given that we eventually
2949      want to have cfglayout mode as the default.  */
2950   if (current_ir_type () == IR_RTL_CFGLAYOUT)
2951     mode |= CLEANUP_CFGLAYOUT;
2952 
2953   timevar_push (TV_CLEANUP_CFG);
2954   if (delete_unreachable_blocks ())
2955     {
2956       changed = true;
2957       /* We've possibly created trivially dead code.  Cleanup it right
2958 	 now to introduce more opportunities for try_optimize_cfg.  */
2959       if (!(mode & (CLEANUP_NO_INSN_DEL))
2960 	  && !reload_completed)
2961 	delete_trivially_dead_insns (get_insns (), max_reg_num ());
2962     }
2963 
2964   compact_blocks ();
2965 
2966   /* To tail-merge blocks ending in the same noreturn function (e.g.
2967      a call to abort) we have to insert fake edges to exit.  Do this
2968      here once.  The fake edges do not interfere with any other CFG
2969      cleanups.  */
2970   if (mode & CLEANUP_CROSSJUMP)
2971     add_noreturn_fake_exit_edges ();
2972 
2973   if (!dbg_cnt (cfg_cleanup))
2974     return changed;
2975 
2976   while (try_optimize_cfg (mode))
2977     {
2978       delete_unreachable_blocks (), changed = true;
2979       if (!(mode & CLEANUP_NO_INSN_DEL))
2980 	{
2981 	  /* Try to remove some trivially dead insns when doing an expensive
2982 	     cleanup.  But delete_trivially_dead_insns doesn't work after
2983 	     reload (it only handles pseudos) and run_fast_dce is too costly
2984 	     to run in every iteration.
2985 
2986 	     For effective cross jumping, we really want to run a fast DCE to
2987 	     clean up any dead conditions, or they get in the way of performing
2988 	     useful tail merges.
2989 
2990 	     Other transformations in cleanup_cfg are not so sensitive to dead
2991 	     code, so delete_trivially_dead_insns or even doing nothing at all
2992 	     is good enough.  */
2993 	  if ((mode & CLEANUP_EXPENSIVE) && !reload_completed
2994 	      && !delete_trivially_dead_insns (get_insns (), max_reg_num ()))
2995 	    break;
2996 	  if ((mode & CLEANUP_CROSSJUMP) && crossjumps_occured)
2997 	    run_fast_dce ();
2998 	}
2999       else
3000 	break;
3001     }
3002 
3003   if (mode & CLEANUP_CROSSJUMP)
3004     remove_fake_exit_edges ();
3005 
3006   /* Don't call delete_dead_jumptables in cfglayout mode, because
3007      that function assumes that jump tables are in the insns stream.
3008      But we also don't _have_ to delete dead jumptables in cfglayout
3009      mode because we shouldn't even be looking at things that are
3010      not in a basic block.  Dead jumptables are cleaned up when
3011      going out of cfglayout mode.  */
3012   if (!(mode & CLEANUP_CFGLAYOUT))
3013     delete_dead_jumptables ();
3014 
3015   /* ???  We probably do this way too often.  */
3016   if (current_loops
3017       && (changed
3018 	  || (mode & CLEANUP_CFG_CHANGED)))
3019     {
3020       timevar_push (TV_REPAIR_LOOPS);
3021       /* The above doesn't preserve dominance info if available.  */
3022       gcc_assert (!dom_info_available_p (CDI_DOMINATORS));
3023       calculate_dominance_info (CDI_DOMINATORS);
3024       fix_loop_structure (NULL);
3025       free_dominance_info (CDI_DOMINATORS);
3026       timevar_pop (TV_REPAIR_LOOPS);
3027     }
3028 
3029   timevar_pop (TV_CLEANUP_CFG);
3030 
3031   return changed;
3032 }
3033 
3034 static unsigned int
execute_jump(void)3035 execute_jump (void)
3036 {
3037   delete_trivially_dead_insns (get_insns (), max_reg_num ());
3038   if (dump_file)
3039     dump_flow_info (dump_file, dump_flags);
3040   cleanup_cfg ((optimize ? CLEANUP_EXPENSIVE : 0)
3041 	       | (flag_thread_jumps ? CLEANUP_THREADING : 0));
3042   return 0;
3043 }
3044 
3045 struct rtl_opt_pass pass_jump =
3046 {
3047  {
3048   RTL_PASS,
3049   "jump",				/* name */
3050   OPTGROUP_NONE,                        /* optinfo_flags */
3051   NULL,					/* gate */
3052   execute_jump,				/* execute */
3053   NULL,					/* sub */
3054   NULL,					/* next */
3055   0,					/* static_pass_number */
3056   TV_JUMP,				/* tv_id */
3057   0,					/* properties_required */
3058   0,					/* properties_provided */
3059   0,					/* properties_destroyed */
3060   TODO_ggc_collect,			/* todo_flags_start */
3061   TODO_verify_rtl_sharing,		/* todo_flags_finish */
3062  }
3063 };
3064 
3065 static unsigned int
execute_jump2(void)3066 execute_jump2 (void)
3067 {
3068   cleanup_cfg (flag_crossjumping ? CLEANUP_CROSSJUMP : 0);
3069   return 0;
3070 }
3071 
3072 struct rtl_opt_pass pass_jump2 =
3073 {
3074  {
3075   RTL_PASS,
3076   "jump2",				/* name */
3077   OPTGROUP_NONE,                        /* optinfo_flags */
3078   NULL,					/* gate */
3079   execute_jump2,			/* execute */
3080   NULL,					/* sub */
3081   NULL,					/* next */
3082   0,					/* static_pass_number */
3083   TV_JUMP,				/* tv_id */
3084   0,					/* properties_required */
3085   0,					/* properties_provided */
3086   0,					/* properties_destroyed */
3087   TODO_ggc_collect,			/* todo_flags_start */
3088   TODO_verify_rtl_sharing,		/* todo_flags_finish */
3089  }
3090 };
3091