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