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