Home | History | Annotate | Line # | Download | only in gcc
tree-ssa-tail-merge.cc revision 1.1
      1  1.1  mrg /* Tail merging for gimple.
      2  1.1  mrg    Copyright (C) 2011-2022 Free Software Foundation, Inc.
      3  1.1  mrg    Contributed by Tom de Vries (tom (at) codesourcery.com)
      4  1.1  mrg 
      5  1.1  mrg This file is part of GCC.
      6  1.1  mrg 
      7  1.1  mrg GCC is free software; you can redistribute it and/or modify
      8  1.1  mrg it under the terms of the GNU General Public License as published by
      9  1.1  mrg the Free Software Foundation; either version 3, or (at your option)
     10  1.1  mrg any later version.
     11  1.1  mrg 
     12  1.1  mrg GCC is distributed in the hope that it will be useful,
     13  1.1  mrg but WITHOUT ANY WARRANTY; without even the implied warranty of
     14  1.1  mrg MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     15  1.1  mrg GNU General Public License for more details.
     16  1.1  mrg 
     17  1.1  mrg You should have received a copy of the GNU General Public License
     18  1.1  mrg along with GCC; see the file COPYING3.  If not see
     19  1.1  mrg <http://www.gnu.org/licenses/>.  */
     20  1.1  mrg 
     21  1.1  mrg /* Pass overview.
     22  1.1  mrg 
     23  1.1  mrg 
     24  1.1  mrg    MOTIVATIONAL EXAMPLE
     25  1.1  mrg 
     26  1.1  mrg    gimple representation of gcc/testsuite/gcc.dg/pr43864.c at
     27  1.1  mrg 
     28  1.1  mrg    hprofStartupp (charD.1 * outputFileNameD.2600, charD.1 * ctxD.2601)
     29  1.1  mrg    {
     30  1.1  mrg      struct FILED.1638 * fpD.2605;
     31  1.1  mrg      charD.1 fileNameD.2604[1000];
     32  1.1  mrg      intD.0 D.3915;
     33  1.1  mrg      const charD.1 * restrict outputFileName.0D.3914;
     34  1.1  mrg 
     35  1.1  mrg      # BLOCK 2 freq:10000
     36  1.1  mrg      # PRED: ENTRY [100.0%]  (fallthru,exec)
     37  1.1  mrg      # PT = nonlocal { D.3926 } (restr)
     38  1.1  mrg      outputFileName.0D.3914_3
     39  1.1  mrg        = (const charD.1 * restrict) outputFileNameD.2600_2(D);
     40  1.1  mrg      # .MEMD.3923_13 = VDEF <.MEMD.3923_12(D)>
     41  1.1  mrg      # USE = nonlocal null { fileNameD.2604 D.3926 } (restr)
     42  1.1  mrg      # CLB = nonlocal null { fileNameD.2604 D.3926 } (restr)
     43  1.1  mrg      sprintfD.759 (&fileNameD.2604, outputFileName.0D.3914_3);
     44  1.1  mrg      # .MEMD.3923_14 = VDEF <.MEMD.3923_13>
     45  1.1  mrg      # USE = nonlocal null { fileNameD.2604 D.3926 } (restr)
     46  1.1  mrg      # CLB = nonlocal null { fileNameD.2604 D.3926 } (restr)
     47  1.1  mrg      D.3915_4 = accessD.2606 (&fileNameD.2604, 1);
     48  1.1  mrg      if (D.3915_4 == 0)
     49  1.1  mrg        goto <bb 3>;
     50  1.1  mrg      else
     51  1.1  mrg        goto <bb 4>;
     52  1.1  mrg      # SUCC: 3 [10.0%]  (true,exec) 4 [90.0%]  (false,exec)
     53  1.1  mrg 
     54  1.1  mrg      # BLOCK 3 freq:1000
     55  1.1  mrg      # PRED: 2 [10.0%]  (true,exec)
     56  1.1  mrg      # .MEMD.3923_15 = VDEF <.MEMD.3923_14>
     57  1.1  mrg      # USE = nonlocal null { fileNameD.2604 D.3926 } (restr)
     58  1.1  mrg      # CLB = nonlocal null { fileNameD.2604 D.3926 } (restr)
     59  1.1  mrg      freeD.898 (ctxD.2601_5(D));
     60  1.1  mrg      goto <bb 7>;
     61  1.1  mrg      # SUCC: 7 [100.0%]  (fallthru,exec)
     62  1.1  mrg 
     63  1.1  mrg      # BLOCK 4 freq:9000
     64  1.1  mrg      # PRED: 2 [90.0%]  (false,exec)
     65  1.1  mrg      # .MEMD.3923_16 = VDEF <.MEMD.3923_14>
     66  1.1  mrg      # PT = nonlocal escaped
     67  1.1  mrg      # USE = nonlocal null { fileNameD.2604 D.3926 } (restr)
     68  1.1  mrg      # CLB = nonlocal null { fileNameD.2604 D.3926 } (restr)
     69  1.1  mrg      fpD.2605_8 = fopenD.1805 (&fileNameD.2604[0], 0B);
     70  1.1  mrg      if (fpD.2605_8 == 0B)
     71  1.1  mrg        goto <bb 5>;
     72  1.1  mrg      else
     73  1.1  mrg        goto <bb 6>;
     74  1.1  mrg      # SUCC: 5 [1.9%]  (true,exec) 6 [98.1%]  (false,exec)
     75  1.1  mrg 
     76  1.1  mrg      # BLOCK 5 freq:173
     77  1.1  mrg      # PRED: 4 [1.9%]  (true,exec)
     78  1.1  mrg      # .MEMD.3923_17 = VDEF <.MEMD.3923_16>
     79  1.1  mrg      # USE = nonlocal null { fileNameD.2604 D.3926 } (restr)
     80  1.1  mrg      # CLB = nonlocal null { fileNameD.2604 D.3926 } (restr)
     81  1.1  mrg      freeD.898 (ctxD.2601_5(D));
     82  1.1  mrg      goto <bb 7>;
     83  1.1  mrg      # SUCC: 7 [100.0%]  (fallthru,exec)
     84  1.1  mrg 
     85  1.1  mrg      # BLOCK 6 freq:8827
     86  1.1  mrg      # PRED: 4 [98.1%]  (false,exec)
     87  1.1  mrg      # .MEMD.3923_18 = VDEF <.MEMD.3923_16>
     88  1.1  mrg      # USE = nonlocal null { fileNameD.2604 D.3926 } (restr)
     89  1.1  mrg      # CLB = nonlocal null { fileNameD.2604 D.3926 } (restr)
     90  1.1  mrg      fooD.2599 (outputFileNameD.2600_2(D), fpD.2605_8);
     91  1.1  mrg      # SUCC: 7 [100.0%]  (fallthru,exec)
     92  1.1  mrg 
     93  1.1  mrg      # BLOCK 7 freq:10000
     94  1.1  mrg      # PRED: 3 [100.0%]  (fallthru,exec) 5 [100.0%]  (fallthru,exec)
     95  1.1  mrg 	     6 [100.0%]  (fallthru,exec)
     96  1.1  mrg      # PT = nonlocal null
     97  1.1  mrg 
     98  1.1  mrg      # ctxD.2601_1 = PHI <0B(3), 0B(5), ctxD.2601_5(D)(6)>
     99  1.1  mrg      # .MEMD.3923_11 = PHI <.MEMD.3923_15(3), .MEMD.3923_17(5),
    100  1.1  mrg 			    .MEMD.3923_18(6)>
    101  1.1  mrg      # VUSE <.MEMD.3923_11>
    102  1.1  mrg      return ctxD.2601_1;
    103  1.1  mrg      # SUCC: EXIT [100.0%]
    104  1.1  mrg    }
    105  1.1  mrg 
    106  1.1  mrg    bb 3 and bb 5 can be merged.  The blocks have different predecessors, but the
    107  1.1  mrg    same successors, and the same operations.
    108  1.1  mrg 
    109  1.1  mrg 
    110  1.1  mrg    CONTEXT
    111  1.1  mrg 
    112  1.1  mrg    A technique called tail merging (or cross jumping) can fix the example
    113  1.1  mrg    above.  For a block, we look for common code at the end (the tail) of the
    114  1.1  mrg    predecessor blocks, and insert jumps from one block to the other.
    115  1.1  mrg    The example is a special case for tail merging, in that 2 whole blocks
    116  1.1  mrg    can be merged, rather than just the end parts of it.
    117  1.1  mrg    We currently only focus on whole block merging, so in that sense
    118  1.1  mrg    calling this pass tail merge is a bit of a misnomer.
    119  1.1  mrg 
    120  1.1  mrg    We distinguish 2 kinds of situations in which blocks can be merged:
    121  1.1  mrg    - same operations, same predecessors.  The successor edges coming from one
    122  1.1  mrg      block are redirected to come from the other block.
    123  1.1  mrg    - same operations, same successors.  The predecessor edges entering one block
    124  1.1  mrg      are redirected to enter the other block.  Note that this operation might
    125  1.1  mrg      involve introducing phi operations.
    126  1.1  mrg 
    127  1.1  mrg    For efficient implementation, we would like to value numbers the blocks, and
    128  1.1  mrg    have a comparison operator that tells us whether the blocks are equal.
    129  1.1  mrg    Besides being runtime efficient, block value numbering should also abstract
    130  1.1  mrg    from irrelevant differences in order of operations, much like normal value
    131  1.1  mrg    numbering abstracts from irrelevant order of operations.
    132  1.1  mrg 
    133  1.1  mrg    For the first situation (same_operations, same predecessors), normal value
    134  1.1  mrg    numbering fits well.  We can calculate a block value number based on the
    135  1.1  mrg    value numbers of the defs and vdefs.
    136  1.1  mrg 
    137  1.1  mrg    For the second situation (same operations, same successors), this approach
    138  1.1  mrg    doesn't work so well.  We can illustrate this using the example.  The calls
    139  1.1  mrg    to free use different vdefs: MEMD.3923_16 and MEMD.3923_14, and these will
    140  1.1  mrg    remain different in value numbering, since they represent different memory
    141  1.1  mrg    states.  So the resulting vdefs of the frees will be different in value
    142  1.1  mrg    numbering, so the block value numbers will be different.
    143  1.1  mrg 
    144  1.1  mrg    The reason why we call the blocks equal is not because they define the same
    145  1.1  mrg    values, but because uses in the blocks use (possibly different) defs in the
    146  1.1  mrg    same way.  To be able to detect this efficiently, we need to do some kind of
    147  1.1  mrg    reverse value numbering, meaning number the uses rather than the defs, and
    148  1.1  mrg    calculate a block value number based on the value number of the uses.
    149  1.1  mrg    Ideally, a block comparison operator will also indicate which phis are needed
    150  1.1  mrg    to merge the blocks.
    151  1.1  mrg 
    152  1.1  mrg    For the moment, we don't do block value numbering, but we do insn-by-insn
    153  1.1  mrg    matching, using scc value numbers to match operations with results, and
    154  1.1  mrg    structural comparison otherwise, while ignoring vop mismatches.
    155  1.1  mrg 
    156  1.1  mrg 
    157  1.1  mrg    IMPLEMENTATION
    158  1.1  mrg 
    159  1.1  mrg    1. The pass first determines all groups of blocks with the same successor
    160  1.1  mrg       blocks.
    161  1.1  mrg    2. Within each group, it tries to determine clusters of equal basic blocks.
    162  1.1  mrg    3. The clusters are applied.
    163  1.1  mrg    4. The same successor groups are updated.
    164  1.1  mrg    5. This process is repeated from 2 onwards, until no more changes.
    165  1.1  mrg 
    166  1.1  mrg 
    167  1.1  mrg    LIMITATIONS/TODO
    168  1.1  mrg 
    169  1.1  mrg    - block only
    170  1.1  mrg    - handles only 'same operations, same successors'.
    171  1.1  mrg      It handles same predecessors as a special subcase though.
    172  1.1  mrg    - does not implement the reverse value numbering and block value numbering.
    173  1.1  mrg    - improve memory allocation: use garbage collected memory, obstacks,
    174  1.1  mrg      allocpools where appropriate.
    175  1.1  mrg    - no insertion of gimple_reg phis,  We only introduce vop-phis.
    176  1.1  mrg    - handle blocks with gimple_reg phi_nodes.
    177  1.1  mrg 
    178  1.1  mrg 
    179  1.1  mrg    PASS PLACEMENT
    180  1.1  mrg    This 'pass' is not a stand-alone gimple pass, but runs as part of
    181  1.1  mrg    pass_pre, in order to share the value numbering.
    182  1.1  mrg 
    183  1.1  mrg 
    184  1.1  mrg    SWITCHES
    185  1.1  mrg 
    186  1.1  mrg    - ftree-tail-merge.  On at -O2.  We may have to enable it only at -Os.  */
    187  1.1  mrg 
    188  1.1  mrg #include "config.h"
    189  1.1  mrg #include "system.h"
    190  1.1  mrg #include "coretypes.h"
    191  1.1  mrg #include "backend.h"
    192  1.1  mrg #include "tree.h"
    193  1.1  mrg #include "gimple.h"
    194  1.1  mrg #include "cfghooks.h"
    195  1.1  mrg #include "tree-pass.h"
    196  1.1  mrg #include "ssa.h"
    197  1.1  mrg #include "fold-const.h"
    198  1.1  mrg #include "trans-mem.h"
    199  1.1  mrg #include "cfganal.h"
    200  1.1  mrg #include "cfgcleanup.h"
    201  1.1  mrg #include "gimple-iterator.h"
    202  1.1  mrg #include "tree-cfg.h"
    203  1.1  mrg #include "tree-into-ssa.h"
    204  1.1  mrg #include "tree-ssa-sccvn.h"
    205  1.1  mrg #include "cfgloop.h"
    206  1.1  mrg #include "tree-eh.h"
    207  1.1  mrg #include "tree-cfgcleanup.h"
    208  1.1  mrg 
    209  1.1  mrg const int ignore_edge_flags = EDGE_DFS_BACK | EDGE_EXECUTABLE;
    210  1.1  mrg 
    211  1.1  mrg /* Describes a group of bbs with the same successors.  The successor bbs are
    212  1.1  mrg    cached in succs, and the successor edge flags are cached in succ_flags.
    213  1.1  mrg    If a bb has the EDGE_TRUE/FALSE_VALUE flags swapped compared to succ_flags,
    214  1.1  mrg    it's marked in inverse.
    215  1.1  mrg    Additionally, the hash value for the struct is cached in hashval, and
    216  1.1  mrg    in_worklist indicates whether it's currently part of worklist.  */
    217  1.1  mrg 
    218  1.1  mrg struct same_succ : pointer_hash <same_succ>
    219  1.1  mrg {
    220  1.1  mrg   /* The bbs that have the same successor bbs.  */
    221  1.1  mrg   bitmap bbs;
    222  1.1  mrg   /* The successor bbs.  */
    223  1.1  mrg   bitmap succs;
    224  1.1  mrg   /* Indicates whether the EDGE_TRUE/FALSE_VALUEs of succ_flags are swapped for
    225  1.1  mrg      bb.  */
    226  1.1  mrg   bitmap inverse;
    227  1.1  mrg   /* The edge flags for each of the successor bbs.  */
    228  1.1  mrg   vec<int> succ_flags;
    229  1.1  mrg   /* Indicates whether the struct is currently in the worklist.  */
    230  1.1  mrg   bool in_worklist;
    231  1.1  mrg   /* The hash value of the struct.  */
    232  1.1  mrg   hashval_t hashval;
    233  1.1  mrg 
    234  1.1  mrg   /* hash_table support.  */
    235  1.1  mrg   static inline hashval_t hash (const same_succ *);
    236  1.1  mrg   static int equal (const same_succ *, const same_succ *);
    237  1.1  mrg   static void remove (same_succ *);
    238  1.1  mrg };
    239  1.1  mrg 
    240  1.1  mrg /* hash routine for hash_table support, returns hashval of E.  */
    241  1.1  mrg 
    242  1.1  mrg inline hashval_t
    243  1.1  mrg same_succ::hash (const same_succ *e)
    244  1.1  mrg {
    245  1.1  mrg   return e->hashval;
    246  1.1  mrg }
    247  1.1  mrg 
    248  1.1  mrg /* A group of bbs where 1 bb from bbs can replace the other bbs.  */
    249  1.1  mrg 
    250  1.1  mrg struct bb_cluster
    251  1.1  mrg {
    252  1.1  mrg   /* The bbs in the cluster.  */
    253  1.1  mrg   bitmap bbs;
    254  1.1  mrg   /* The preds of the bbs in the cluster.  */
    255  1.1  mrg   bitmap preds;
    256  1.1  mrg   /* Index in all_clusters vector.  */
    257  1.1  mrg   int index;
    258  1.1  mrg   /* The bb to replace the cluster with.  */
    259  1.1  mrg   basic_block rep_bb;
    260  1.1  mrg };
    261  1.1  mrg 
    262  1.1  mrg /* Per bb-info.  */
    263  1.1  mrg 
    264  1.1  mrg struct aux_bb_info
    265  1.1  mrg {
    266  1.1  mrg   /* The number of non-debug statements in the bb.  */
    267  1.1  mrg   int size;
    268  1.1  mrg   /* The same_succ that this bb is a member of.  */
    269  1.1  mrg   same_succ *bb_same_succ;
    270  1.1  mrg   /* The cluster that this bb is a member of.  */
    271  1.1  mrg   bb_cluster *cluster;
    272  1.1  mrg   /* The vop state at the exit of a bb.  This is shortlived data, used to
    273  1.1  mrg      communicate data between update_block_by and update_vuses.  */
    274  1.1  mrg   tree vop_at_exit;
    275  1.1  mrg   /* The bb that either contains or is dominated by the dependencies of the
    276  1.1  mrg      bb.  */
    277  1.1  mrg   basic_block dep_bb;
    278  1.1  mrg };
    279  1.1  mrg 
    280  1.1  mrg /* Macros to access the fields of struct aux_bb_info.  */
    281  1.1  mrg 
    282  1.1  mrg #define BB_SIZE(bb) (((struct aux_bb_info *)bb->aux)->size)
    283  1.1  mrg #define BB_SAME_SUCC(bb) (((struct aux_bb_info *)bb->aux)->bb_same_succ)
    284  1.1  mrg #define BB_CLUSTER(bb) (((struct aux_bb_info *)bb->aux)->cluster)
    285  1.1  mrg #define BB_VOP_AT_EXIT(bb) (((struct aux_bb_info *)bb->aux)->vop_at_exit)
    286  1.1  mrg #define BB_DEP_BB(bb) (((struct aux_bb_info *)bb->aux)->dep_bb)
    287  1.1  mrg 
    288  1.1  mrg /* Valueization helper querying the VN lattice.  */
    289  1.1  mrg 
    290  1.1  mrg static tree
    291  1.1  mrg tail_merge_valueize (tree name)
    292  1.1  mrg {
    293  1.1  mrg   if (TREE_CODE (name) == SSA_NAME
    294  1.1  mrg       && has_VN_INFO (name))
    295  1.1  mrg     {
    296  1.1  mrg       tree tem = VN_INFO (name)->valnum;
    297  1.1  mrg       if (tem != VN_TOP)
    298  1.1  mrg 	return tem;
    299  1.1  mrg     }
    300  1.1  mrg   return name;
    301  1.1  mrg }
    302  1.1  mrg 
    303  1.1  mrg /* Returns true if the only effect a statement STMT has, is to define locally
    304  1.1  mrg    used SSA_NAMEs.  */
    305  1.1  mrg 
    306  1.1  mrg static bool
    307  1.1  mrg stmt_local_def (gimple *stmt)
    308  1.1  mrg {
    309  1.1  mrg   basic_block bb, def_bb;
    310  1.1  mrg   imm_use_iterator iter;
    311  1.1  mrg   use_operand_p use_p;
    312  1.1  mrg   tree val;
    313  1.1  mrg   def_operand_p def_p;
    314  1.1  mrg 
    315  1.1  mrg   if (gimple_vdef (stmt) != NULL_TREE
    316  1.1  mrg       || gimple_has_side_effects (stmt)
    317  1.1  mrg       || gimple_could_trap_p_1 (stmt, false, false)
    318  1.1  mrg       || gimple_vuse (stmt) != NULL_TREE
    319  1.1  mrg       /* Copied from tree-ssa-ifcombine.cc:bb_no_side_effects_p():
    320  1.1  mrg 	 const calls don't match any of the above, yet they could
    321  1.1  mrg 	 still have some side-effects - they could contain
    322  1.1  mrg 	 gimple_could_trap_p statements, like floating point
    323  1.1  mrg 	 exceptions or integer division by zero.  See PR70586.
    324  1.1  mrg 	 FIXME: perhaps gimple_has_side_effects or gimple_could_trap_p
    325  1.1  mrg 	 should handle this.  */
    326  1.1  mrg       || is_gimple_call (stmt))
    327  1.1  mrg     return false;
    328  1.1  mrg 
    329  1.1  mrg   def_p = SINGLE_SSA_DEF_OPERAND (stmt, SSA_OP_DEF);
    330  1.1  mrg   if (def_p == NULL)
    331  1.1  mrg     return false;
    332  1.1  mrg 
    333  1.1  mrg   val = DEF_FROM_PTR (def_p);
    334  1.1  mrg   if (val == NULL_TREE || TREE_CODE (val) != SSA_NAME)
    335  1.1  mrg     return false;
    336  1.1  mrg 
    337  1.1  mrg   def_bb = gimple_bb (stmt);
    338  1.1  mrg 
    339  1.1  mrg   FOR_EACH_IMM_USE_FAST (use_p, iter, val)
    340  1.1  mrg     {
    341  1.1  mrg       if (is_gimple_debug (USE_STMT (use_p)))
    342  1.1  mrg 	continue;
    343  1.1  mrg       bb = gimple_bb (USE_STMT (use_p));
    344  1.1  mrg       if (bb == def_bb)
    345  1.1  mrg 	continue;
    346  1.1  mrg 
    347  1.1  mrg       if (gimple_code (USE_STMT (use_p)) == GIMPLE_PHI
    348  1.1  mrg 	  && EDGE_PRED (bb, PHI_ARG_INDEX_FROM_USE (use_p))->src == def_bb)
    349  1.1  mrg 	continue;
    350  1.1  mrg 
    351  1.1  mrg       return false;
    352  1.1  mrg     }
    353  1.1  mrg 
    354  1.1  mrg   return true;
    355  1.1  mrg }
    356  1.1  mrg 
    357  1.1  mrg /* Let GSI skip forwards over local defs.  */
    358  1.1  mrg 
    359  1.1  mrg static void
    360  1.1  mrg gsi_advance_fw_nondebug_nonlocal (gimple_stmt_iterator *gsi)
    361  1.1  mrg {
    362  1.1  mrg   gimple *stmt;
    363  1.1  mrg 
    364  1.1  mrg   while (true)
    365  1.1  mrg     {
    366  1.1  mrg       if (gsi_end_p (*gsi))
    367  1.1  mrg 	return;
    368  1.1  mrg       stmt = gsi_stmt (*gsi);
    369  1.1  mrg       if (!stmt_local_def (stmt))
    370  1.1  mrg 	return;
    371  1.1  mrg       gsi_next_nondebug (gsi);
    372  1.1  mrg     }
    373  1.1  mrg }
    374  1.1  mrg 
    375  1.1  mrg /* VAL1 and VAL2 are either:
    376  1.1  mrg    - uses in BB1 and BB2, or
    377  1.1  mrg    - phi alternatives for BB1 and BB2.
    378  1.1  mrg    Return true if the uses have the same gvn value.  */
    379  1.1  mrg 
    380  1.1  mrg static bool
    381  1.1  mrg gvn_uses_equal (tree val1, tree val2)
    382  1.1  mrg {
    383  1.1  mrg   gcc_checking_assert (val1 != NULL_TREE && val2 != NULL_TREE);
    384  1.1  mrg 
    385  1.1  mrg   if (val1 == val2)
    386  1.1  mrg     return true;
    387  1.1  mrg 
    388  1.1  mrg   if (tail_merge_valueize (val1) != tail_merge_valueize (val2))
    389  1.1  mrg     return false;
    390  1.1  mrg 
    391  1.1  mrg   return ((TREE_CODE (val1) == SSA_NAME || CONSTANT_CLASS_P (val1))
    392  1.1  mrg 	  && (TREE_CODE (val2) == SSA_NAME || CONSTANT_CLASS_P (val2)));
    393  1.1  mrg }
    394  1.1  mrg 
    395  1.1  mrg /* Prints E to FILE.  */
    396  1.1  mrg 
    397  1.1  mrg static void
    398  1.1  mrg same_succ_print (FILE *file, const same_succ *e)
    399  1.1  mrg {
    400  1.1  mrg   unsigned int i;
    401  1.1  mrg   bitmap_print (file, e->bbs, "bbs:", "\n");
    402  1.1  mrg   bitmap_print (file, e->succs, "succs:", "\n");
    403  1.1  mrg   bitmap_print (file, e->inverse, "inverse:", "\n");
    404  1.1  mrg   fprintf (file, "flags:");
    405  1.1  mrg   for (i = 0; i < e->succ_flags.length (); ++i)
    406  1.1  mrg     fprintf (file, " %x", e->succ_flags[i]);
    407  1.1  mrg   fprintf (file, "\n");
    408  1.1  mrg }
    409  1.1  mrg 
    410  1.1  mrg /* Prints same_succ VE to VFILE.  */
    411  1.1  mrg 
    412  1.1  mrg inline int
    413  1.1  mrg ssa_same_succ_print_traverse (same_succ **pe, FILE *file)
    414  1.1  mrg {
    415  1.1  mrg   const same_succ *e = *pe;
    416  1.1  mrg   same_succ_print (file, e);
    417  1.1  mrg   return 1;
    418  1.1  mrg }
    419  1.1  mrg 
    420  1.1  mrg /* Update BB_DEP_BB (USE_BB), given a use of VAL in USE_BB.  */
    421  1.1  mrg 
    422  1.1  mrg static void
    423  1.1  mrg update_dep_bb (basic_block use_bb, tree val)
    424  1.1  mrg {
    425  1.1  mrg   basic_block dep_bb;
    426  1.1  mrg 
    427  1.1  mrg   /* Not a dep.  */
    428  1.1  mrg   if (TREE_CODE (val) != SSA_NAME)
    429  1.1  mrg     return;
    430  1.1  mrg 
    431  1.1  mrg   /* Skip use of global def.  */
    432  1.1  mrg   if (SSA_NAME_IS_DEFAULT_DEF (val))
    433  1.1  mrg     return;
    434  1.1  mrg 
    435  1.1  mrg   /* Skip use of local def.  */
    436  1.1  mrg   dep_bb = gimple_bb (SSA_NAME_DEF_STMT (val));
    437  1.1  mrg   if (dep_bb == use_bb)
    438  1.1  mrg     return;
    439  1.1  mrg 
    440  1.1  mrg   if (BB_DEP_BB (use_bb) == NULL
    441  1.1  mrg       || dominated_by_p (CDI_DOMINATORS, dep_bb, BB_DEP_BB (use_bb)))
    442  1.1  mrg     BB_DEP_BB (use_bb) = dep_bb;
    443  1.1  mrg }
    444  1.1  mrg 
    445  1.1  mrg /* Update BB_DEP_BB, given the dependencies in STMT.  */
    446  1.1  mrg 
    447  1.1  mrg static void
    448  1.1  mrg stmt_update_dep_bb (gimple *stmt)
    449  1.1  mrg {
    450  1.1  mrg   ssa_op_iter iter;
    451  1.1  mrg   use_operand_p use;
    452  1.1  mrg 
    453  1.1  mrg   FOR_EACH_SSA_USE_OPERAND (use, stmt, iter, SSA_OP_USE)
    454  1.1  mrg     update_dep_bb (gimple_bb (stmt), USE_FROM_PTR (use));
    455  1.1  mrg }
    456  1.1  mrg 
    457  1.1  mrg /* Calculates hash value for same_succ VE.  */
    458  1.1  mrg 
    459  1.1  mrg static hashval_t
    460  1.1  mrg same_succ_hash (const same_succ *e)
    461  1.1  mrg {
    462  1.1  mrg   inchash::hash hstate (bitmap_hash (e->succs));
    463  1.1  mrg   int flags;
    464  1.1  mrg   unsigned int i;
    465  1.1  mrg   unsigned int first = bitmap_first_set_bit (e->bbs);
    466  1.1  mrg   basic_block bb = BASIC_BLOCK_FOR_FN (cfun, first);
    467  1.1  mrg   int size = 0;
    468  1.1  mrg   gimple *stmt;
    469  1.1  mrg   tree arg;
    470  1.1  mrg   unsigned int s;
    471  1.1  mrg   bitmap_iterator bs;
    472  1.1  mrg 
    473  1.1  mrg   for (gimple_stmt_iterator gsi = gsi_start_nondebug_bb (bb);
    474  1.1  mrg        !gsi_end_p (gsi); gsi_next_nondebug (&gsi))
    475  1.1  mrg     {
    476  1.1  mrg       stmt = gsi_stmt (gsi);
    477  1.1  mrg       stmt_update_dep_bb (stmt);
    478  1.1  mrg       if (stmt_local_def (stmt))
    479  1.1  mrg 	continue;
    480  1.1  mrg       size++;
    481  1.1  mrg 
    482  1.1  mrg       hstate.add_int (gimple_code (stmt));
    483  1.1  mrg       if (is_gimple_assign (stmt))
    484  1.1  mrg 	hstate.add_int (gimple_assign_rhs_code (stmt));
    485  1.1  mrg       if (!is_gimple_call (stmt))
    486  1.1  mrg 	continue;
    487  1.1  mrg       if (gimple_call_internal_p (stmt))
    488  1.1  mrg 	hstate.add_int (gimple_call_internal_fn (stmt));
    489  1.1  mrg       else
    490  1.1  mrg 	{
    491  1.1  mrg 	  inchash::add_expr (gimple_call_fn (stmt), hstate);
    492  1.1  mrg 	  if (gimple_call_chain (stmt))
    493  1.1  mrg 	    inchash::add_expr (gimple_call_chain (stmt), hstate);
    494  1.1  mrg 	}
    495  1.1  mrg       for (i = 0; i < gimple_call_num_args (stmt); i++)
    496  1.1  mrg 	{
    497  1.1  mrg 	  arg = gimple_call_arg (stmt, i);
    498  1.1  mrg 	  arg = tail_merge_valueize (arg);
    499  1.1  mrg 	  inchash::add_expr (arg, hstate);
    500  1.1  mrg 	}
    501  1.1  mrg     }
    502  1.1  mrg 
    503  1.1  mrg   hstate.add_int (size);
    504  1.1  mrg   BB_SIZE (bb) = size;
    505  1.1  mrg 
    506  1.1  mrg   hstate.add_int (bb->loop_father->num);
    507  1.1  mrg 
    508  1.1  mrg   for (i = 0; i < e->succ_flags.length (); ++i)
    509  1.1  mrg     {
    510  1.1  mrg       flags = e->succ_flags[i];
    511  1.1  mrg       flags = flags & ~(EDGE_TRUE_VALUE | EDGE_FALSE_VALUE);
    512  1.1  mrg       hstate.add_int (flags);
    513  1.1  mrg     }
    514  1.1  mrg 
    515  1.1  mrg   EXECUTE_IF_SET_IN_BITMAP (e->succs, 0, s, bs)
    516  1.1  mrg     {
    517  1.1  mrg       int n = find_edge (bb, BASIC_BLOCK_FOR_FN (cfun, s))->dest_idx;
    518  1.1  mrg       for (gphi_iterator gsi = gsi_start_phis (BASIC_BLOCK_FOR_FN (cfun, s));
    519  1.1  mrg 	   !gsi_end_p (gsi);
    520  1.1  mrg 	   gsi_next (&gsi))
    521  1.1  mrg 	{
    522  1.1  mrg 	  gphi *phi = gsi.phi ();
    523  1.1  mrg 	  tree lhs = gimple_phi_result (phi);
    524  1.1  mrg 	  tree val = gimple_phi_arg_def (phi, n);
    525  1.1  mrg 
    526  1.1  mrg 	  if (virtual_operand_p (lhs))
    527  1.1  mrg 	    continue;
    528  1.1  mrg 	  update_dep_bb (bb, val);
    529  1.1  mrg 	}
    530  1.1  mrg     }
    531  1.1  mrg 
    532  1.1  mrg   return hstate.end ();
    533  1.1  mrg }
    534  1.1  mrg 
    535  1.1  mrg /* Returns true if E1 and E2 have 2 successors, and if the successor flags
    536  1.1  mrg    are inverse for the EDGE_TRUE_VALUE and EDGE_FALSE_VALUE flags, and equal for
    537  1.1  mrg    the other edge flags.  */
    538  1.1  mrg 
    539  1.1  mrg static bool
    540  1.1  mrg inverse_flags (const same_succ *e1, const same_succ *e2)
    541  1.1  mrg {
    542  1.1  mrg   int f1a, f1b, f2a, f2b;
    543  1.1  mrg   int mask = ~(EDGE_TRUE_VALUE | EDGE_FALSE_VALUE);
    544  1.1  mrg 
    545  1.1  mrg   if (e1->succ_flags.length () != 2)
    546  1.1  mrg     return false;
    547  1.1  mrg 
    548  1.1  mrg   f1a = e1->succ_flags[0];
    549  1.1  mrg   f1b = e1->succ_flags[1];
    550  1.1  mrg   f2a = e2->succ_flags[0];
    551  1.1  mrg   f2b = e2->succ_flags[1];
    552  1.1  mrg 
    553  1.1  mrg   if (f1a == f2a && f1b == f2b)
    554  1.1  mrg     return false;
    555  1.1  mrg 
    556  1.1  mrg   return (f1a & mask) == (f2a & mask) && (f1b & mask) == (f2b & mask);
    557  1.1  mrg }
    558  1.1  mrg 
    559  1.1  mrg /* Compares SAME_SUCCs E1 and E2.  */
    560  1.1  mrg 
    561  1.1  mrg int
    562  1.1  mrg same_succ::equal (const same_succ *e1, const same_succ *e2)
    563  1.1  mrg {
    564  1.1  mrg   unsigned int i, first1, first2;
    565  1.1  mrg   gimple_stmt_iterator gsi1, gsi2;
    566  1.1  mrg   gimple *s1, *s2;
    567  1.1  mrg   basic_block bb1, bb2;
    568  1.1  mrg 
    569  1.1  mrg   if (e1 == e2)
    570  1.1  mrg     return 1;
    571  1.1  mrg 
    572  1.1  mrg   if (e1->hashval != e2->hashval)
    573  1.1  mrg     return 0;
    574  1.1  mrg 
    575  1.1  mrg   if (e1->succ_flags.length () != e2->succ_flags.length ())
    576  1.1  mrg     return 0;
    577  1.1  mrg 
    578  1.1  mrg   if (!bitmap_equal_p (e1->succs, e2->succs))
    579  1.1  mrg     return 0;
    580  1.1  mrg 
    581  1.1  mrg   if (!inverse_flags (e1, e2))
    582  1.1  mrg     {
    583  1.1  mrg       for (i = 0; i < e1->succ_flags.length (); ++i)
    584  1.1  mrg 	if (e1->succ_flags[i] != e2->succ_flags[i])
    585  1.1  mrg 	  return 0;
    586  1.1  mrg     }
    587  1.1  mrg 
    588  1.1  mrg   first1 = bitmap_first_set_bit (e1->bbs);
    589  1.1  mrg   first2 = bitmap_first_set_bit (e2->bbs);
    590  1.1  mrg 
    591  1.1  mrg   bb1 = BASIC_BLOCK_FOR_FN (cfun, first1);
    592  1.1  mrg   bb2 = BASIC_BLOCK_FOR_FN (cfun, first2);
    593  1.1  mrg 
    594  1.1  mrg   if (BB_SIZE (bb1) != BB_SIZE (bb2))
    595  1.1  mrg     return 0;
    596  1.1  mrg 
    597  1.1  mrg   if (bb1->loop_father != bb2->loop_father)
    598  1.1  mrg     return 0;
    599  1.1  mrg 
    600  1.1  mrg   gsi1 = gsi_start_nondebug_bb (bb1);
    601  1.1  mrg   gsi2 = gsi_start_nondebug_bb (bb2);
    602  1.1  mrg   gsi_advance_fw_nondebug_nonlocal (&gsi1);
    603  1.1  mrg   gsi_advance_fw_nondebug_nonlocal (&gsi2);
    604  1.1  mrg   while (!(gsi_end_p (gsi1) || gsi_end_p (gsi2)))
    605  1.1  mrg     {
    606  1.1  mrg       s1 = gsi_stmt (gsi1);
    607  1.1  mrg       s2 = gsi_stmt (gsi2);
    608  1.1  mrg       if (gimple_code (s1) != gimple_code (s2))
    609  1.1  mrg 	return 0;
    610  1.1  mrg       if (is_gimple_call (s1) && !gimple_call_same_target_p (s1, s2))
    611  1.1  mrg 	return 0;
    612  1.1  mrg       gsi_next_nondebug (&gsi1);
    613  1.1  mrg       gsi_next_nondebug (&gsi2);
    614  1.1  mrg       gsi_advance_fw_nondebug_nonlocal (&gsi1);
    615  1.1  mrg       gsi_advance_fw_nondebug_nonlocal (&gsi2);
    616  1.1  mrg     }
    617  1.1  mrg 
    618  1.1  mrg   return 1;
    619  1.1  mrg }
    620  1.1  mrg 
    621  1.1  mrg /* Alloc and init a new SAME_SUCC.  */
    622  1.1  mrg 
    623  1.1  mrg static same_succ *
    624  1.1  mrg same_succ_alloc (void)
    625  1.1  mrg {
    626  1.1  mrg   same_succ *same = XNEW (struct same_succ);
    627  1.1  mrg 
    628  1.1  mrg   same->bbs = BITMAP_ALLOC (NULL);
    629  1.1  mrg   same->succs = BITMAP_ALLOC (NULL);
    630  1.1  mrg   same->inverse = BITMAP_ALLOC (NULL);
    631  1.1  mrg   same->succ_flags.create (10);
    632  1.1  mrg   same->in_worklist = false;
    633  1.1  mrg 
    634  1.1  mrg   return same;
    635  1.1  mrg }
    636  1.1  mrg 
    637  1.1  mrg /* Delete same_succ E.  */
    638  1.1  mrg 
    639  1.1  mrg void
    640  1.1  mrg same_succ::remove (same_succ *e)
    641  1.1  mrg {
    642  1.1  mrg   BITMAP_FREE (e->bbs);
    643  1.1  mrg   BITMAP_FREE (e->succs);
    644  1.1  mrg   BITMAP_FREE (e->inverse);
    645  1.1  mrg   e->succ_flags.release ();
    646  1.1  mrg 
    647  1.1  mrg   XDELETE (e);
    648  1.1  mrg }
    649  1.1  mrg 
    650  1.1  mrg /* Reset same_succ SAME.  */
    651  1.1  mrg 
    652  1.1  mrg static void
    653  1.1  mrg same_succ_reset (same_succ *same)
    654  1.1  mrg {
    655  1.1  mrg   bitmap_clear (same->bbs);
    656  1.1  mrg   bitmap_clear (same->succs);
    657  1.1  mrg   bitmap_clear (same->inverse);
    658  1.1  mrg   same->succ_flags.truncate (0);
    659  1.1  mrg }
    660  1.1  mrg 
    661  1.1  mrg static hash_table<same_succ> *same_succ_htab;
    662  1.1  mrg 
    663  1.1  mrg /* Array that is used to store the edge flags for a successor.  */
    664  1.1  mrg 
    665  1.1  mrg static int *same_succ_edge_flags;
    666  1.1  mrg 
    667  1.1  mrg /* Bitmap that is used to mark bbs that are recently deleted.  */
    668  1.1  mrg 
    669  1.1  mrg static bitmap deleted_bbs;
    670  1.1  mrg 
    671  1.1  mrg /* Bitmap that is used to mark predecessors of bbs that are
    672  1.1  mrg    deleted.  */
    673  1.1  mrg 
    674  1.1  mrg static bitmap deleted_bb_preds;
    675  1.1  mrg 
    676  1.1  mrg /* Prints same_succ_htab to stderr.  */
    677  1.1  mrg 
    678  1.1  mrg extern void debug_same_succ (void);
    679  1.1  mrg DEBUG_FUNCTION void
    680  1.1  mrg debug_same_succ ( void)
    681  1.1  mrg {
    682  1.1  mrg   same_succ_htab->traverse <FILE *, ssa_same_succ_print_traverse> (stderr);
    683  1.1  mrg }
    684  1.1  mrg 
    685  1.1  mrg 
    686  1.1  mrg /* Vector of bbs to process.  */
    687  1.1  mrg 
    688  1.1  mrg static vec<same_succ *> worklist;
    689  1.1  mrg 
    690  1.1  mrg /* Prints worklist to FILE.  */
    691  1.1  mrg 
    692  1.1  mrg static void
    693  1.1  mrg print_worklist (FILE *file)
    694  1.1  mrg {
    695  1.1  mrg   unsigned int i;
    696  1.1  mrg   for (i = 0; i < worklist.length (); ++i)
    697  1.1  mrg     same_succ_print (file, worklist[i]);
    698  1.1  mrg }
    699  1.1  mrg 
    700  1.1  mrg /* Adds SAME to worklist.  */
    701  1.1  mrg 
    702  1.1  mrg static void
    703  1.1  mrg add_to_worklist (same_succ *same)
    704  1.1  mrg {
    705  1.1  mrg   if (same->in_worklist)
    706  1.1  mrg     return;
    707  1.1  mrg 
    708  1.1  mrg   if (bitmap_count_bits (same->bbs) < 2)
    709  1.1  mrg     return;
    710  1.1  mrg 
    711  1.1  mrg   same->in_worklist = true;
    712  1.1  mrg   worklist.safe_push (same);
    713  1.1  mrg }
    714  1.1  mrg 
    715  1.1  mrg /* Add BB to same_succ_htab.  */
    716  1.1  mrg 
    717  1.1  mrg static void
    718  1.1  mrg find_same_succ_bb (basic_block bb, same_succ **same_p)
    719  1.1  mrg {
    720  1.1  mrg   unsigned int j;
    721  1.1  mrg   bitmap_iterator bj;
    722  1.1  mrg   same_succ *same = *same_p;
    723  1.1  mrg   same_succ **slot;
    724  1.1  mrg   edge_iterator ei;
    725  1.1  mrg   edge e;
    726  1.1  mrg 
    727  1.1  mrg   if (bb == NULL)
    728  1.1  mrg     return;
    729  1.1  mrg   bitmap_set_bit (same->bbs, bb->index);
    730  1.1  mrg   FOR_EACH_EDGE (e, ei, bb->succs)
    731  1.1  mrg     {
    732  1.1  mrg       int index = e->dest->index;
    733  1.1  mrg       bitmap_set_bit (same->succs, index);
    734  1.1  mrg       same_succ_edge_flags[index] = (e->flags & ~ignore_edge_flags);
    735  1.1  mrg     }
    736  1.1  mrg   EXECUTE_IF_SET_IN_BITMAP (same->succs, 0, j, bj)
    737  1.1  mrg     same->succ_flags.safe_push (same_succ_edge_flags[j]);
    738  1.1  mrg 
    739  1.1  mrg   same->hashval = same_succ_hash (same);
    740  1.1  mrg 
    741  1.1  mrg   slot = same_succ_htab->find_slot_with_hash (same, same->hashval, INSERT);
    742  1.1  mrg   if (*slot == NULL)
    743  1.1  mrg     {
    744  1.1  mrg       *slot = same;
    745  1.1  mrg       BB_SAME_SUCC (bb) = same;
    746  1.1  mrg       add_to_worklist (same);
    747  1.1  mrg       *same_p = NULL;
    748  1.1  mrg     }
    749  1.1  mrg   else
    750  1.1  mrg     {
    751  1.1  mrg       bitmap_set_bit ((*slot)->bbs, bb->index);
    752  1.1  mrg       BB_SAME_SUCC (bb) = *slot;
    753  1.1  mrg       add_to_worklist (*slot);
    754  1.1  mrg       if (inverse_flags (same, *slot))
    755  1.1  mrg 	bitmap_set_bit ((*slot)->inverse, bb->index);
    756  1.1  mrg       same_succ_reset (same);
    757  1.1  mrg     }
    758  1.1  mrg }
    759  1.1  mrg 
    760  1.1  mrg /* Find bbs with same successors.  */
    761  1.1  mrg 
    762  1.1  mrg static void
    763  1.1  mrg find_same_succ (void)
    764  1.1  mrg {
    765  1.1  mrg   same_succ *same = same_succ_alloc ();
    766  1.1  mrg   basic_block bb;
    767  1.1  mrg 
    768  1.1  mrg   FOR_EACH_BB_FN (bb, cfun)
    769  1.1  mrg     {
    770  1.1  mrg       find_same_succ_bb (bb, &same);
    771  1.1  mrg       if (same == NULL)
    772  1.1  mrg 	same = same_succ_alloc ();
    773  1.1  mrg     }
    774  1.1  mrg 
    775  1.1  mrg   same_succ::remove (same);
    776  1.1  mrg }
    777  1.1  mrg 
    778  1.1  mrg /* Initializes worklist administration.  */
    779  1.1  mrg 
    780  1.1  mrg static void
    781  1.1  mrg init_worklist (void)
    782  1.1  mrg {
    783  1.1  mrg   alloc_aux_for_blocks (sizeof (struct aux_bb_info));
    784  1.1  mrg   same_succ_htab = new hash_table<same_succ> (n_basic_blocks_for_fn (cfun));
    785  1.1  mrg   same_succ_edge_flags = XCNEWVEC (int, last_basic_block_for_fn (cfun));
    786  1.1  mrg   deleted_bbs = BITMAP_ALLOC (NULL);
    787  1.1  mrg   deleted_bb_preds = BITMAP_ALLOC (NULL);
    788  1.1  mrg   worklist.create (n_basic_blocks_for_fn (cfun));
    789  1.1  mrg   find_same_succ ();
    790  1.1  mrg 
    791  1.1  mrg   if (dump_file && (dump_flags & TDF_DETAILS))
    792  1.1  mrg     {
    793  1.1  mrg       fprintf (dump_file, "initial worklist:\n");
    794  1.1  mrg       print_worklist (dump_file);
    795  1.1  mrg     }
    796  1.1  mrg }
    797  1.1  mrg 
    798  1.1  mrg /* Deletes worklist administration.  */
    799  1.1  mrg 
    800  1.1  mrg static void
    801  1.1  mrg delete_worklist (void)
    802  1.1  mrg {
    803  1.1  mrg   free_aux_for_blocks ();
    804  1.1  mrg   delete same_succ_htab;
    805  1.1  mrg   same_succ_htab = NULL;
    806  1.1  mrg   XDELETEVEC (same_succ_edge_flags);
    807  1.1  mrg   same_succ_edge_flags = NULL;
    808  1.1  mrg   BITMAP_FREE (deleted_bbs);
    809  1.1  mrg   BITMAP_FREE (deleted_bb_preds);
    810  1.1  mrg   worklist.release ();
    811  1.1  mrg }
    812  1.1  mrg 
    813  1.1  mrg /* Mark BB as deleted, and mark its predecessors.  */
    814  1.1  mrg 
    815  1.1  mrg static void
    816  1.1  mrg mark_basic_block_deleted (basic_block bb)
    817  1.1  mrg {
    818  1.1  mrg   edge e;
    819  1.1  mrg   edge_iterator ei;
    820  1.1  mrg 
    821  1.1  mrg   bitmap_set_bit (deleted_bbs, bb->index);
    822  1.1  mrg 
    823  1.1  mrg   FOR_EACH_EDGE (e, ei, bb->preds)
    824  1.1  mrg     bitmap_set_bit (deleted_bb_preds, e->src->index);
    825  1.1  mrg }
    826  1.1  mrg 
    827  1.1  mrg /* Removes BB from its corresponding same_succ.  */
    828  1.1  mrg 
    829  1.1  mrg static void
    830  1.1  mrg same_succ_flush_bb (basic_block bb)
    831  1.1  mrg {
    832  1.1  mrg   same_succ *same = BB_SAME_SUCC (bb);
    833  1.1  mrg   if (! same)
    834  1.1  mrg     return;
    835  1.1  mrg 
    836  1.1  mrg   BB_SAME_SUCC (bb) = NULL;
    837  1.1  mrg   if (bitmap_single_bit_set_p (same->bbs))
    838  1.1  mrg     same_succ_htab->remove_elt_with_hash (same, same->hashval);
    839  1.1  mrg   else
    840  1.1  mrg     bitmap_clear_bit (same->bbs, bb->index);
    841  1.1  mrg }
    842  1.1  mrg 
    843  1.1  mrg /* Removes all bbs in BBS from their corresponding same_succ.  */
    844  1.1  mrg 
    845  1.1  mrg static void
    846  1.1  mrg same_succ_flush_bbs (bitmap bbs)
    847  1.1  mrg {
    848  1.1  mrg   unsigned int i;
    849  1.1  mrg   bitmap_iterator bi;
    850  1.1  mrg 
    851  1.1  mrg   EXECUTE_IF_SET_IN_BITMAP (bbs, 0, i, bi)
    852  1.1  mrg     same_succ_flush_bb (BASIC_BLOCK_FOR_FN (cfun, i));
    853  1.1  mrg }
    854  1.1  mrg 
    855  1.1  mrg /* Release the last vdef in BB, either normal or phi result.  */
    856  1.1  mrg 
    857  1.1  mrg static void
    858  1.1  mrg release_last_vdef (basic_block bb)
    859  1.1  mrg {
    860  1.1  mrg   for (gimple_stmt_iterator i = gsi_last_bb (bb); !gsi_end_p (i);
    861  1.1  mrg        gsi_prev_nondebug (&i))
    862  1.1  mrg     {
    863  1.1  mrg       gimple *stmt = gsi_stmt (i);
    864  1.1  mrg       if (gimple_vdef (stmt) == NULL_TREE)
    865  1.1  mrg 	continue;
    866  1.1  mrg 
    867  1.1  mrg       mark_virtual_operand_for_renaming (gimple_vdef (stmt));
    868  1.1  mrg       return;
    869  1.1  mrg     }
    870  1.1  mrg 
    871  1.1  mrg   for (gphi_iterator i = gsi_start_phis (bb); !gsi_end_p (i);
    872  1.1  mrg        gsi_next (&i))
    873  1.1  mrg     {
    874  1.1  mrg       gphi *phi = i.phi ();
    875  1.1  mrg       tree res = gimple_phi_result (phi);
    876  1.1  mrg 
    877  1.1  mrg       if (!virtual_operand_p (res))
    878  1.1  mrg 	continue;
    879  1.1  mrg 
    880  1.1  mrg       mark_virtual_phi_result_for_renaming (phi);
    881  1.1  mrg       return;
    882  1.1  mrg     }
    883  1.1  mrg }
    884  1.1  mrg 
    885  1.1  mrg /* For deleted_bb_preds, find bbs with same successors.  */
    886  1.1  mrg 
    887  1.1  mrg static void
    888  1.1  mrg update_worklist (void)
    889  1.1  mrg {
    890  1.1  mrg   unsigned int i;
    891  1.1  mrg   bitmap_iterator bi;
    892  1.1  mrg   basic_block bb;
    893  1.1  mrg   same_succ *same;
    894  1.1  mrg 
    895  1.1  mrg   bitmap_and_compl_into (deleted_bb_preds, deleted_bbs);
    896  1.1  mrg   bitmap_clear (deleted_bbs);
    897  1.1  mrg 
    898  1.1  mrg   bitmap_clear_bit (deleted_bb_preds, ENTRY_BLOCK);
    899  1.1  mrg   same_succ_flush_bbs (deleted_bb_preds);
    900  1.1  mrg 
    901  1.1  mrg   same = same_succ_alloc ();
    902  1.1  mrg   EXECUTE_IF_SET_IN_BITMAP (deleted_bb_preds, 0, i, bi)
    903  1.1  mrg     {
    904  1.1  mrg       bb = BASIC_BLOCK_FOR_FN (cfun, i);
    905  1.1  mrg       gcc_assert (bb != NULL);
    906  1.1  mrg       find_same_succ_bb (bb, &same);
    907  1.1  mrg       if (same == NULL)
    908  1.1  mrg 	same = same_succ_alloc ();
    909  1.1  mrg     }
    910  1.1  mrg   same_succ::remove (same);
    911  1.1  mrg   bitmap_clear (deleted_bb_preds);
    912  1.1  mrg }
    913  1.1  mrg 
    914  1.1  mrg /* Prints cluster C to FILE.  */
    915  1.1  mrg 
    916  1.1  mrg static void
    917  1.1  mrg print_cluster (FILE *file, bb_cluster *c)
    918  1.1  mrg {
    919  1.1  mrg   if (c == NULL)
    920  1.1  mrg     return;
    921  1.1  mrg   bitmap_print (file, c->bbs, "bbs:", "\n");
    922  1.1  mrg   bitmap_print (file, c->preds, "preds:", "\n");
    923  1.1  mrg }
    924  1.1  mrg 
    925  1.1  mrg /* Prints cluster C to stderr.  */
    926  1.1  mrg 
    927  1.1  mrg extern void debug_cluster (bb_cluster *);
    928  1.1  mrg DEBUG_FUNCTION void
    929  1.1  mrg debug_cluster (bb_cluster *c)
    930  1.1  mrg {
    931  1.1  mrg   print_cluster (stderr, c);
    932  1.1  mrg }
    933  1.1  mrg 
    934  1.1  mrg /* Update C->rep_bb, given that BB is added to the cluster.  */
    935  1.1  mrg 
    936  1.1  mrg static void
    937  1.1  mrg update_rep_bb (bb_cluster *c, basic_block bb)
    938  1.1  mrg {
    939  1.1  mrg   /* Initial.  */
    940  1.1  mrg   if (c->rep_bb == NULL)
    941  1.1  mrg     {
    942  1.1  mrg       c->rep_bb = bb;
    943  1.1  mrg       return;
    944  1.1  mrg     }
    945  1.1  mrg 
    946  1.1  mrg   /* Current needs no deps, keep it.  */
    947  1.1  mrg   if (BB_DEP_BB (c->rep_bb) == NULL)
    948  1.1  mrg     return;
    949  1.1  mrg 
    950  1.1  mrg   /* Bb needs no deps, change rep_bb.  */
    951  1.1  mrg   if (BB_DEP_BB (bb) == NULL)
    952  1.1  mrg     {
    953  1.1  mrg       c->rep_bb = bb;
    954  1.1  mrg       return;
    955  1.1  mrg     }
    956  1.1  mrg 
    957  1.1  mrg   /* Bb needs last deps earlier than current, change rep_bb.  A potential
    958  1.1  mrg      problem with this, is that the first deps might also be earlier, which
    959  1.1  mrg      would mean we prefer longer lifetimes for the deps.  To be able to check
    960  1.1  mrg      for this, we would have to trace BB_FIRST_DEP_BB as well, besides
    961  1.1  mrg      BB_DEP_BB, which is really BB_LAST_DEP_BB.
    962  1.1  mrg      The benefit of choosing the bb with last deps earlier, is that it can
    963  1.1  mrg      potentially be used as replacement for more bbs.  */
    964  1.1  mrg   if (dominated_by_p (CDI_DOMINATORS, BB_DEP_BB (c->rep_bb), BB_DEP_BB (bb)))
    965  1.1  mrg     c->rep_bb = bb;
    966  1.1  mrg }
    967  1.1  mrg 
    968  1.1  mrg /* Add BB to cluster C.  Sets BB in C->bbs, and preds of BB in C->preds.  */
    969  1.1  mrg 
    970  1.1  mrg static void
    971  1.1  mrg add_bb_to_cluster (bb_cluster *c, basic_block bb)
    972  1.1  mrg {
    973  1.1  mrg   edge e;
    974  1.1  mrg   edge_iterator ei;
    975  1.1  mrg 
    976  1.1  mrg   bitmap_set_bit (c->bbs, bb->index);
    977  1.1  mrg 
    978  1.1  mrg   FOR_EACH_EDGE (e, ei, bb->preds)
    979  1.1  mrg     bitmap_set_bit (c->preds, e->src->index);
    980  1.1  mrg 
    981  1.1  mrg   update_rep_bb (c, bb);
    982  1.1  mrg }
    983  1.1  mrg 
    984  1.1  mrg /* Allocate and init new cluster.  */
    985  1.1  mrg 
    986  1.1  mrg static bb_cluster *
    987  1.1  mrg new_cluster (void)
    988  1.1  mrg {
    989  1.1  mrg   bb_cluster *c;
    990  1.1  mrg   c = XCNEW (bb_cluster);
    991  1.1  mrg   c->bbs = BITMAP_ALLOC (NULL);
    992  1.1  mrg   c->preds = BITMAP_ALLOC (NULL);
    993  1.1  mrg   c->rep_bb = NULL;
    994  1.1  mrg   return c;
    995  1.1  mrg }
    996  1.1  mrg 
    997  1.1  mrg /* Delete clusters.  */
    998  1.1  mrg 
    999  1.1  mrg static void
   1000  1.1  mrg delete_cluster (bb_cluster *c)
   1001  1.1  mrg {
   1002  1.1  mrg   if (c == NULL)
   1003  1.1  mrg     return;
   1004  1.1  mrg   BITMAP_FREE (c->bbs);
   1005  1.1  mrg   BITMAP_FREE (c->preds);
   1006  1.1  mrg   XDELETE (c);
   1007  1.1  mrg }
   1008  1.1  mrg 
   1009  1.1  mrg 
   1010  1.1  mrg /* Array that contains all clusters.  */
   1011  1.1  mrg 
   1012  1.1  mrg static vec<bb_cluster *> all_clusters;
   1013  1.1  mrg 
   1014  1.1  mrg /* Allocate all cluster vectors.  */
   1015  1.1  mrg 
   1016  1.1  mrg static void
   1017  1.1  mrg alloc_cluster_vectors (void)
   1018  1.1  mrg {
   1019  1.1  mrg   all_clusters.create (n_basic_blocks_for_fn (cfun));
   1020  1.1  mrg }
   1021  1.1  mrg 
   1022  1.1  mrg /* Reset all cluster vectors.  */
   1023  1.1  mrg 
   1024  1.1  mrg static void
   1025  1.1  mrg reset_cluster_vectors (void)
   1026  1.1  mrg {
   1027  1.1  mrg   unsigned int i;
   1028  1.1  mrg   basic_block bb;
   1029  1.1  mrg   for (i = 0; i < all_clusters.length (); ++i)
   1030  1.1  mrg     delete_cluster (all_clusters[i]);
   1031  1.1  mrg   all_clusters.truncate (0);
   1032  1.1  mrg   FOR_EACH_BB_FN (bb, cfun)
   1033  1.1  mrg     BB_CLUSTER (bb) = NULL;
   1034  1.1  mrg }
   1035  1.1  mrg 
   1036  1.1  mrg /* Delete all cluster vectors.  */
   1037  1.1  mrg 
   1038  1.1  mrg static void
   1039  1.1  mrg delete_cluster_vectors (void)
   1040  1.1  mrg {
   1041  1.1  mrg   unsigned int i;
   1042  1.1  mrg   for (i = 0; i < all_clusters.length (); ++i)
   1043  1.1  mrg     delete_cluster (all_clusters[i]);
   1044  1.1  mrg   all_clusters.release ();
   1045  1.1  mrg }
   1046  1.1  mrg 
   1047  1.1  mrg /* Merge cluster C2 into C1.  */
   1048  1.1  mrg 
   1049  1.1  mrg static void
   1050  1.1  mrg merge_clusters (bb_cluster *c1, bb_cluster *c2)
   1051  1.1  mrg {
   1052  1.1  mrg   bitmap_ior_into (c1->bbs, c2->bbs);
   1053  1.1  mrg   bitmap_ior_into (c1->preds, c2->preds);
   1054  1.1  mrg }
   1055  1.1  mrg 
   1056  1.1  mrg /* Register equivalence of BB1 and BB2 (members of cluster C).  Store c in
   1057  1.1  mrg    all_clusters, or merge c with existing cluster.  */
   1058  1.1  mrg 
   1059  1.1  mrg static void
   1060  1.1  mrg set_cluster (basic_block bb1, basic_block bb2)
   1061  1.1  mrg {
   1062  1.1  mrg   basic_block merge_bb, other_bb;
   1063  1.1  mrg   bb_cluster *merge, *old, *c;
   1064  1.1  mrg 
   1065  1.1  mrg   if (BB_CLUSTER (bb1) == NULL && BB_CLUSTER (bb2) == NULL)
   1066  1.1  mrg     {
   1067  1.1  mrg       c = new_cluster ();
   1068  1.1  mrg       add_bb_to_cluster (c, bb1);
   1069  1.1  mrg       add_bb_to_cluster (c, bb2);
   1070  1.1  mrg       BB_CLUSTER (bb1) = c;
   1071  1.1  mrg       BB_CLUSTER (bb2) = c;
   1072  1.1  mrg       c->index = all_clusters.length ();
   1073  1.1  mrg       all_clusters.safe_push (c);
   1074  1.1  mrg     }
   1075  1.1  mrg   else if (BB_CLUSTER (bb1) == NULL || BB_CLUSTER (bb2) == NULL)
   1076  1.1  mrg     {
   1077  1.1  mrg       merge_bb = BB_CLUSTER (bb1) == NULL ? bb2 : bb1;
   1078  1.1  mrg       other_bb = BB_CLUSTER (bb1) == NULL ? bb1 : bb2;
   1079  1.1  mrg       merge = BB_CLUSTER (merge_bb);
   1080  1.1  mrg       add_bb_to_cluster (merge, other_bb);
   1081  1.1  mrg       BB_CLUSTER (other_bb) = merge;
   1082  1.1  mrg     }
   1083  1.1  mrg   else if (BB_CLUSTER (bb1) != BB_CLUSTER (bb2))
   1084  1.1  mrg     {
   1085  1.1  mrg       unsigned int i;
   1086  1.1  mrg       bitmap_iterator bi;
   1087  1.1  mrg 
   1088  1.1  mrg       old = BB_CLUSTER (bb2);
   1089  1.1  mrg       merge = BB_CLUSTER (bb1);
   1090  1.1  mrg       merge_clusters (merge, old);
   1091  1.1  mrg       EXECUTE_IF_SET_IN_BITMAP (old->bbs, 0, i, bi)
   1092  1.1  mrg 	BB_CLUSTER (BASIC_BLOCK_FOR_FN (cfun, i)) = merge;
   1093  1.1  mrg       all_clusters[old->index] = NULL;
   1094  1.1  mrg       update_rep_bb (merge, old->rep_bb);
   1095  1.1  mrg       delete_cluster (old);
   1096  1.1  mrg     }
   1097  1.1  mrg   else
   1098  1.1  mrg     gcc_unreachable ();
   1099  1.1  mrg }
   1100  1.1  mrg 
   1101  1.1  mrg /* Return true if gimple operands T1 and T2 have the same value.  */
   1102  1.1  mrg 
   1103  1.1  mrg static bool
   1104  1.1  mrg gimple_operand_equal_value_p (tree t1, tree t2)
   1105  1.1  mrg {
   1106  1.1  mrg   if (t1 == t2)
   1107  1.1  mrg     return true;
   1108  1.1  mrg 
   1109  1.1  mrg   if (t1 == NULL_TREE
   1110  1.1  mrg       || t2 == NULL_TREE)
   1111  1.1  mrg     return false;
   1112  1.1  mrg 
   1113  1.1  mrg   if (operand_equal_p (t1, t2, OEP_MATCH_SIDE_EFFECTS))
   1114  1.1  mrg     return true;
   1115  1.1  mrg 
   1116  1.1  mrg   return gvn_uses_equal (t1, t2);
   1117  1.1  mrg }
   1118  1.1  mrg 
   1119  1.1  mrg /* Return true if gimple statements S1 and S2 are equal.  Gimple_bb (s1) and
   1120  1.1  mrg    gimple_bb (s2) are members of SAME_SUCC.  */
   1121  1.1  mrg 
   1122  1.1  mrg static bool
   1123  1.1  mrg gimple_equal_p (same_succ *same_succ, gimple *s1, gimple *s2)
   1124  1.1  mrg {
   1125  1.1  mrg   unsigned int i;
   1126  1.1  mrg   tree lhs1, lhs2;
   1127  1.1  mrg   basic_block bb1 = gimple_bb (s1), bb2 = gimple_bb (s2);
   1128  1.1  mrg   tree t1, t2;
   1129  1.1  mrg   bool inv_cond;
   1130  1.1  mrg   enum tree_code code1, code2;
   1131  1.1  mrg 
   1132  1.1  mrg   if (gimple_code (s1) != gimple_code (s2))
   1133  1.1  mrg     return false;
   1134  1.1  mrg 
   1135  1.1  mrg   switch (gimple_code (s1))
   1136  1.1  mrg     {
   1137  1.1  mrg     case GIMPLE_CALL:
   1138  1.1  mrg       if (!gimple_call_same_target_p (s1, s2))
   1139  1.1  mrg 	return false;
   1140  1.1  mrg 
   1141  1.1  mrg       t1 = gimple_call_chain (s1);
   1142  1.1  mrg       t2 = gimple_call_chain (s2);
   1143  1.1  mrg       if (!gimple_operand_equal_value_p (t1, t2))
   1144  1.1  mrg 	return false;
   1145  1.1  mrg 
   1146  1.1  mrg       if (gimple_call_num_args (s1) != gimple_call_num_args (s2))
   1147  1.1  mrg 	return false;
   1148  1.1  mrg 
   1149  1.1  mrg       for (i = 0; i < gimple_call_num_args (s1); ++i)
   1150  1.1  mrg 	{
   1151  1.1  mrg 	  t1 = gimple_call_arg (s1, i);
   1152  1.1  mrg 	  t2 = gimple_call_arg (s2, i);
   1153  1.1  mrg 	  if (!gimple_operand_equal_value_p (t1, t2))
   1154  1.1  mrg 	    return false;
   1155  1.1  mrg 	}
   1156  1.1  mrg 
   1157  1.1  mrg       lhs1 = gimple_get_lhs (s1);
   1158  1.1  mrg       lhs2 = gimple_get_lhs (s2);
   1159  1.1  mrg       if (lhs1 == NULL_TREE && lhs2 == NULL_TREE)
   1160  1.1  mrg 	return true;
   1161  1.1  mrg       if (lhs1 == NULL_TREE || lhs2 == NULL_TREE)
   1162  1.1  mrg 	return false;
   1163  1.1  mrg       if (TREE_CODE (lhs1) == SSA_NAME && TREE_CODE (lhs2) == SSA_NAME)
   1164  1.1  mrg 	return tail_merge_valueize (lhs1) == tail_merge_valueize (lhs2);
   1165  1.1  mrg       return operand_equal_p (lhs1, lhs2, 0);
   1166  1.1  mrg 
   1167  1.1  mrg     case GIMPLE_ASSIGN:
   1168  1.1  mrg       if (gimple_assign_rhs_code (s1) != gimple_assign_rhs_code (s2))
   1169  1.1  mrg 	return false;
   1170  1.1  mrg 
   1171  1.1  mrg       lhs1 = gimple_get_lhs (s1);
   1172  1.1  mrg       lhs2 = gimple_get_lhs (s2);
   1173  1.1  mrg       if (TREE_CODE (lhs1) != SSA_NAME
   1174  1.1  mrg 	  && TREE_CODE (lhs2) != SSA_NAME)
   1175  1.1  mrg 	return (operand_equal_p (lhs1, lhs2, 0)
   1176  1.1  mrg 		&& gimple_operand_equal_value_p (gimple_assign_rhs1 (s1),
   1177  1.1  mrg 						 gimple_assign_rhs1 (s2)));
   1178  1.1  mrg 
   1179  1.1  mrg       if (TREE_CODE (lhs1) != SSA_NAME
   1180  1.1  mrg 	  || TREE_CODE (lhs2) != SSA_NAME)
   1181  1.1  mrg 	return false;
   1182  1.1  mrg 
   1183  1.1  mrg       gcc_checking_assert (gimple_num_args (s1) == gimple_num_args (s2));
   1184  1.1  mrg       for (i = 0; i < gimple_num_args (s1); ++i)
   1185  1.1  mrg 	{
   1186  1.1  mrg 	  t1 = gimple_arg (s1, i);
   1187  1.1  mrg 	  t2 = gimple_arg (s2, i);
   1188  1.1  mrg 	  if (!gimple_operand_equal_value_p (t1, t2))
   1189  1.1  mrg 	    return false;
   1190  1.1  mrg 	}
   1191  1.1  mrg       return true;
   1192  1.1  mrg 
   1193  1.1  mrg     case GIMPLE_COND:
   1194  1.1  mrg       t1 = gimple_cond_lhs (s1);
   1195  1.1  mrg       t2 = gimple_cond_lhs (s2);
   1196  1.1  mrg       if (!gimple_operand_equal_value_p (t1, t2))
   1197  1.1  mrg 	return false;
   1198  1.1  mrg 
   1199  1.1  mrg       t1 = gimple_cond_rhs (s1);
   1200  1.1  mrg       t2 = gimple_cond_rhs (s2);
   1201  1.1  mrg       if (!gimple_operand_equal_value_p (t1, t2))
   1202  1.1  mrg 	return false;
   1203  1.1  mrg 
   1204  1.1  mrg       code1 = gimple_cond_code (s1);
   1205  1.1  mrg       code2 = gimple_cond_code (s2);
   1206  1.1  mrg       inv_cond = (bitmap_bit_p (same_succ->inverse, bb1->index)
   1207  1.1  mrg 		  != bitmap_bit_p (same_succ->inverse, bb2->index));
   1208  1.1  mrg       if (inv_cond)
   1209  1.1  mrg 	{
   1210  1.1  mrg 	  bool honor_nans = HONOR_NANS (t1);
   1211  1.1  mrg 	  code2 = invert_tree_comparison (code2, honor_nans);
   1212  1.1  mrg 	}
   1213  1.1  mrg       return code1 == code2;
   1214  1.1  mrg 
   1215  1.1  mrg     default:
   1216  1.1  mrg       return false;
   1217  1.1  mrg     }
   1218  1.1  mrg }
   1219  1.1  mrg 
   1220  1.1  mrg /* Let GSI skip backwards over local defs.  Return the earliest vuse in VUSE.
   1221  1.1  mrg    Return true in VUSE_ESCAPED if the vuse influenced a SSA_OP_DEF of one of the
   1222  1.1  mrg    processed statements.  */
   1223  1.1  mrg 
   1224  1.1  mrg static void
   1225  1.1  mrg gsi_advance_bw_nondebug_nonlocal (gimple_stmt_iterator *gsi, tree *vuse,
   1226  1.1  mrg 				  bool *vuse_escaped)
   1227  1.1  mrg {
   1228  1.1  mrg   gimple *stmt;
   1229  1.1  mrg   tree lvuse;
   1230  1.1  mrg 
   1231  1.1  mrg   while (true)
   1232  1.1  mrg     {
   1233  1.1  mrg       if (gsi_end_p (*gsi))
   1234  1.1  mrg 	return;
   1235  1.1  mrg       stmt = gsi_stmt (*gsi);
   1236  1.1  mrg 
   1237  1.1  mrg       lvuse = gimple_vuse (stmt);
   1238  1.1  mrg       if (lvuse != NULL_TREE)
   1239  1.1  mrg 	{
   1240  1.1  mrg 	  *vuse = lvuse;
   1241  1.1  mrg 	  if (!ZERO_SSA_OPERANDS (stmt, SSA_OP_DEF))
   1242  1.1  mrg 	    *vuse_escaped = true;
   1243  1.1  mrg 	}
   1244  1.1  mrg 
   1245  1.1  mrg       if (!stmt_local_def (stmt))
   1246  1.1  mrg 	return;
   1247  1.1  mrg       gsi_prev_nondebug (gsi);
   1248  1.1  mrg     }
   1249  1.1  mrg }
   1250  1.1  mrg 
   1251  1.1  mrg /* Return true if equal (in the sense of gimple_equal_p) statements STMT1 and
   1252  1.1  mrg    STMT2 are allowed to be merged.  */
   1253  1.1  mrg 
   1254  1.1  mrg static bool
   1255  1.1  mrg merge_stmts_p (gimple *stmt1, gimple *stmt2)
   1256  1.1  mrg {
   1257  1.1  mrg   /* What could be better than this here is to blacklist the bb
   1258  1.1  mrg      containing the stmt, when encountering the stmt f.i. in
   1259  1.1  mrg      same_succ_hash.  */
   1260  1.1  mrg   if (is_tm_ending (stmt1))
   1261  1.1  mrg     return false;
   1262  1.1  mrg 
   1263  1.1  mrg   /* Verify EH landing pads.  */
   1264  1.1  mrg   if (lookup_stmt_eh_lp_fn (cfun, stmt1) != lookup_stmt_eh_lp_fn (cfun, stmt2))
   1265  1.1  mrg     return false;
   1266  1.1  mrg 
   1267  1.1  mrg   if (is_gimple_call (stmt1)
   1268  1.1  mrg       && gimple_call_internal_p (stmt1))
   1269  1.1  mrg     switch (gimple_call_internal_fn (stmt1))
   1270  1.1  mrg       {
   1271  1.1  mrg       case IFN_UBSAN_NULL:
   1272  1.1  mrg       case IFN_UBSAN_BOUNDS:
   1273  1.1  mrg       case IFN_UBSAN_VPTR:
   1274  1.1  mrg       case IFN_UBSAN_CHECK_ADD:
   1275  1.1  mrg       case IFN_UBSAN_CHECK_SUB:
   1276  1.1  mrg       case IFN_UBSAN_CHECK_MUL:
   1277  1.1  mrg       case IFN_UBSAN_OBJECT_SIZE:
   1278  1.1  mrg       case IFN_UBSAN_PTR:
   1279  1.1  mrg       case IFN_ASAN_CHECK:
   1280  1.1  mrg 	/* For these internal functions, gimple_location is an implicit
   1281  1.1  mrg 	   parameter, which will be used explicitly after expansion.
   1282  1.1  mrg 	   Merging these statements may cause confusing line numbers in
   1283  1.1  mrg 	   sanitizer messages.  */
   1284  1.1  mrg 	return gimple_location (stmt1) == gimple_location (stmt2);
   1285  1.1  mrg       default:
   1286  1.1  mrg 	break;
   1287  1.1  mrg       }
   1288  1.1  mrg 
   1289  1.1  mrg   return true;
   1290  1.1  mrg }
   1291  1.1  mrg 
   1292  1.1  mrg /* Determines whether BB1 and BB2 (members of same_succ) are duplicates.  If so,
   1293  1.1  mrg    clusters them.  */
   1294  1.1  mrg 
   1295  1.1  mrg static void
   1296  1.1  mrg find_duplicate (same_succ *same_succ, basic_block bb1, basic_block bb2)
   1297  1.1  mrg {
   1298  1.1  mrg   gimple_stmt_iterator gsi1 = gsi_last_nondebug_bb (bb1);
   1299  1.1  mrg   gimple_stmt_iterator gsi2 = gsi_last_nondebug_bb (bb2);
   1300  1.1  mrg   tree vuse1 = NULL_TREE, vuse2 = NULL_TREE;
   1301  1.1  mrg   bool vuse_escaped = false;
   1302  1.1  mrg 
   1303  1.1  mrg   gsi_advance_bw_nondebug_nonlocal (&gsi1, &vuse1, &vuse_escaped);
   1304  1.1  mrg   gsi_advance_bw_nondebug_nonlocal (&gsi2, &vuse2, &vuse_escaped);
   1305  1.1  mrg 
   1306  1.1  mrg   while (!gsi_end_p (gsi1) && !gsi_end_p (gsi2))
   1307  1.1  mrg     {
   1308  1.1  mrg       gimple *stmt1 = gsi_stmt (gsi1);
   1309  1.1  mrg       gimple *stmt2 = gsi_stmt (gsi2);
   1310  1.1  mrg 
   1311  1.1  mrg       if (gimple_code (stmt1) == GIMPLE_LABEL
   1312  1.1  mrg 	  && gimple_code (stmt2) == GIMPLE_LABEL)
   1313  1.1  mrg 	break;
   1314  1.1  mrg 
   1315  1.1  mrg       if (!gimple_equal_p (same_succ, stmt1, stmt2))
   1316  1.1  mrg 	return;
   1317  1.1  mrg 
   1318  1.1  mrg       if (!merge_stmts_p (stmt1, stmt2))
   1319  1.1  mrg 	return;
   1320  1.1  mrg 
   1321  1.1  mrg       gsi_prev_nondebug (&gsi1);
   1322  1.1  mrg       gsi_prev_nondebug (&gsi2);
   1323  1.1  mrg       gsi_advance_bw_nondebug_nonlocal (&gsi1, &vuse1, &vuse_escaped);
   1324  1.1  mrg       gsi_advance_bw_nondebug_nonlocal (&gsi2, &vuse2, &vuse_escaped);
   1325  1.1  mrg     }
   1326  1.1  mrg 
   1327  1.1  mrg   while (!gsi_end_p (gsi1) && gimple_code (gsi_stmt (gsi1)) == GIMPLE_LABEL)
   1328  1.1  mrg     {
   1329  1.1  mrg       tree label = gimple_label_label (as_a <glabel *> (gsi_stmt (gsi1)));
   1330  1.1  mrg       if (DECL_NONLOCAL (label) || FORCED_LABEL (label))
   1331  1.1  mrg 	return;
   1332  1.1  mrg       gsi_prev (&gsi1);
   1333  1.1  mrg     }
   1334  1.1  mrg   while (!gsi_end_p (gsi2) && gimple_code (gsi_stmt (gsi2)) == GIMPLE_LABEL)
   1335  1.1  mrg     {
   1336  1.1  mrg       tree label = gimple_label_label (as_a <glabel *> (gsi_stmt (gsi2)));
   1337  1.1  mrg       if (DECL_NONLOCAL (label) || FORCED_LABEL (label))
   1338  1.1  mrg 	return;
   1339  1.1  mrg       gsi_prev (&gsi2);
   1340  1.1  mrg     }
   1341  1.1  mrg   if (!(gsi_end_p (gsi1) && gsi_end_p (gsi2)))
   1342  1.1  mrg     return;
   1343  1.1  mrg 
   1344  1.1  mrg   /* If the incoming vuses are not the same, and the vuse escaped into an
   1345  1.1  mrg      SSA_OP_DEF, then merging the 2 blocks will change the value of the def,
   1346  1.1  mrg      which potentially means the semantics of one of the blocks will be changed.
   1347  1.1  mrg      TODO: make this check more precise.  */
   1348  1.1  mrg   if (vuse_escaped && vuse1 != vuse2)
   1349  1.1  mrg     return;
   1350  1.1  mrg 
   1351  1.1  mrg   if (dump_file)
   1352  1.1  mrg     fprintf (dump_file, "find_duplicates: <bb %d> duplicate of <bb %d>\n",
   1353  1.1  mrg 	     bb1->index, bb2->index);
   1354  1.1  mrg 
   1355  1.1  mrg   set_cluster (bb1, bb2);
   1356  1.1  mrg }
   1357  1.1  mrg 
   1358  1.1  mrg /* Returns whether for all phis in DEST the phi alternatives for E1 and
   1359  1.1  mrg    E2 are equal.  */
   1360  1.1  mrg 
   1361  1.1  mrg static bool
   1362  1.1  mrg same_phi_alternatives_1 (basic_block dest, edge e1, edge e2)
   1363  1.1  mrg {
   1364  1.1  mrg   int n1 = e1->dest_idx, n2 = e2->dest_idx;
   1365  1.1  mrg   gphi_iterator gsi;
   1366  1.1  mrg 
   1367  1.1  mrg   for (gsi = gsi_start_phis (dest); !gsi_end_p (gsi); gsi_next (&gsi))
   1368  1.1  mrg     {
   1369  1.1  mrg       gphi *phi = gsi.phi ();
   1370  1.1  mrg       tree lhs = gimple_phi_result (phi);
   1371  1.1  mrg       tree val1 = gimple_phi_arg_def (phi, n1);
   1372  1.1  mrg       tree val2 = gimple_phi_arg_def (phi, n2);
   1373  1.1  mrg 
   1374  1.1  mrg       if (virtual_operand_p (lhs))
   1375  1.1  mrg 	continue;
   1376  1.1  mrg 
   1377  1.1  mrg       if (operand_equal_for_phi_arg_p (val1, val2))
   1378  1.1  mrg 	continue;
   1379  1.1  mrg       if (gvn_uses_equal (val1, val2))
   1380  1.1  mrg 	continue;
   1381  1.1  mrg 
   1382  1.1  mrg       return false;
   1383  1.1  mrg     }
   1384  1.1  mrg 
   1385  1.1  mrg   return true;
   1386  1.1  mrg }
   1387  1.1  mrg 
   1388  1.1  mrg /* Returns whether for all successors of BB1 and BB2 (members of SAME_SUCC), the
   1389  1.1  mrg    phi alternatives for BB1 and BB2 are equal.  */
   1390  1.1  mrg 
   1391  1.1  mrg static bool
   1392  1.1  mrg same_phi_alternatives (same_succ *same_succ, basic_block bb1, basic_block bb2)
   1393  1.1  mrg {
   1394  1.1  mrg   unsigned int s;
   1395  1.1  mrg   bitmap_iterator bs;
   1396  1.1  mrg   edge e1, e2;
   1397  1.1  mrg   basic_block succ;
   1398  1.1  mrg 
   1399  1.1  mrg   EXECUTE_IF_SET_IN_BITMAP (same_succ->succs, 0, s, bs)
   1400  1.1  mrg     {
   1401  1.1  mrg       succ = BASIC_BLOCK_FOR_FN (cfun, s);
   1402  1.1  mrg       e1 = find_edge (bb1, succ);
   1403  1.1  mrg       e2 = find_edge (bb2, succ);
   1404  1.1  mrg       if (e1->flags & EDGE_COMPLEX
   1405  1.1  mrg 	  || e2->flags & EDGE_COMPLEX)
   1406  1.1  mrg 	return false;
   1407  1.1  mrg 
   1408  1.1  mrg       /* For all phis in bb, the phi alternatives for e1 and e2 need to have
   1409  1.1  mrg 	 the same value.  */
   1410  1.1  mrg       if (!same_phi_alternatives_1 (succ, e1, e2))
   1411  1.1  mrg 	return false;
   1412  1.1  mrg     }
   1413  1.1  mrg 
   1414  1.1  mrg   return true;
   1415  1.1  mrg }
   1416  1.1  mrg 
   1417  1.1  mrg /* Return true if BB has non-vop phis.  */
   1418  1.1  mrg 
   1419  1.1  mrg static bool
   1420  1.1  mrg bb_has_non_vop_phi (basic_block bb)
   1421  1.1  mrg {
   1422  1.1  mrg   gimple_seq phis = phi_nodes (bb);
   1423  1.1  mrg   gimple *phi;
   1424  1.1  mrg 
   1425  1.1  mrg   if (phis == NULL)
   1426  1.1  mrg     return false;
   1427  1.1  mrg 
   1428  1.1  mrg   if (!gimple_seq_singleton_p (phis))
   1429  1.1  mrg     return true;
   1430  1.1  mrg 
   1431  1.1  mrg   phi = gimple_seq_first_stmt (phis);
   1432  1.1  mrg   return !virtual_operand_p (gimple_phi_result (phi));
   1433  1.1  mrg }
   1434  1.1  mrg 
   1435  1.1  mrg /* Returns true if redirecting the incoming edges of FROM to TO maintains the
   1436  1.1  mrg    invariant that uses in FROM are dominates by their defs.  */
   1437  1.1  mrg 
   1438  1.1  mrg static bool
   1439  1.1  mrg deps_ok_for_redirect_from_bb_to_bb (basic_block from, basic_block to)
   1440  1.1  mrg {
   1441  1.1  mrg   basic_block cd, dep_bb = BB_DEP_BB (to);
   1442  1.1  mrg   edge_iterator ei;
   1443  1.1  mrg   edge e;
   1444  1.1  mrg 
   1445  1.1  mrg   if (dep_bb == NULL)
   1446  1.1  mrg     return true;
   1447  1.1  mrg 
   1448  1.1  mrg   bitmap from_preds = BITMAP_ALLOC (NULL);
   1449  1.1  mrg   FOR_EACH_EDGE (e, ei, from->preds)
   1450  1.1  mrg     bitmap_set_bit (from_preds, e->src->index);
   1451  1.1  mrg   cd = nearest_common_dominator_for_set (CDI_DOMINATORS, from_preds);
   1452  1.1  mrg   BITMAP_FREE (from_preds);
   1453  1.1  mrg 
   1454  1.1  mrg   return dominated_by_p (CDI_DOMINATORS, dep_bb, cd);
   1455  1.1  mrg }
   1456  1.1  mrg 
   1457  1.1  mrg /* Returns true if replacing BB1 (or its replacement bb) by BB2 (or its
   1458  1.1  mrg    replacement bb) and vice versa maintains the invariant that uses in the
   1459  1.1  mrg    replacement are dominates by their defs.  */
   1460  1.1  mrg 
   1461  1.1  mrg static bool
   1462  1.1  mrg deps_ok_for_redirect (basic_block bb1, basic_block bb2)
   1463  1.1  mrg {
   1464  1.1  mrg   if (BB_CLUSTER (bb1) != NULL)
   1465  1.1  mrg     bb1 = BB_CLUSTER (bb1)->rep_bb;
   1466  1.1  mrg 
   1467  1.1  mrg   if (BB_CLUSTER (bb2) != NULL)
   1468  1.1  mrg     bb2 = BB_CLUSTER (bb2)->rep_bb;
   1469  1.1  mrg 
   1470  1.1  mrg   return (deps_ok_for_redirect_from_bb_to_bb (bb1, bb2)
   1471  1.1  mrg 	  && deps_ok_for_redirect_from_bb_to_bb (bb2, bb1));
   1472  1.1  mrg }
   1473  1.1  mrg 
   1474  1.1  mrg /* Within SAME_SUCC->bbs, find clusters of bbs which can be merged.  */
   1475  1.1  mrg 
   1476  1.1  mrg static void
   1477  1.1  mrg find_clusters_1 (same_succ *same_succ)
   1478  1.1  mrg {
   1479  1.1  mrg   basic_block bb1, bb2;
   1480  1.1  mrg   unsigned int i, j;
   1481  1.1  mrg   bitmap_iterator bi, bj;
   1482  1.1  mrg   int nr_comparisons;
   1483  1.1  mrg   int max_comparisons = param_max_tail_merge_comparisons;
   1484  1.1  mrg 
   1485  1.1  mrg   EXECUTE_IF_SET_IN_BITMAP (same_succ->bbs, 0, i, bi)
   1486  1.1  mrg     {
   1487  1.1  mrg       bb1 = BASIC_BLOCK_FOR_FN (cfun, i);
   1488  1.1  mrg 
   1489  1.1  mrg       /* TODO: handle blocks with phi-nodes.  We'll have to find corresponding
   1490  1.1  mrg 	 phi-nodes in bb1 and bb2, with the same alternatives for the same
   1491  1.1  mrg 	 preds.  */
   1492  1.1  mrg       if (bb_has_non_vop_phi (bb1) || bb_has_eh_pred (bb1)
   1493  1.1  mrg 	  || bb_has_abnormal_pred (bb1))
   1494  1.1  mrg 	continue;
   1495  1.1  mrg 
   1496  1.1  mrg       nr_comparisons = 0;
   1497  1.1  mrg       EXECUTE_IF_SET_IN_BITMAP (same_succ->bbs, i + 1, j, bj)
   1498  1.1  mrg 	{
   1499  1.1  mrg 	  bb2 = BASIC_BLOCK_FOR_FN (cfun, j);
   1500  1.1  mrg 
   1501  1.1  mrg 	  if (bb_has_non_vop_phi (bb2) || bb_has_eh_pred (bb2)
   1502  1.1  mrg 	      || bb_has_abnormal_pred (bb2))
   1503  1.1  mrg 	    continue;
   1504  1.1  mrg 
   1505  1.1  mrg 	  if (BB_CLUSTER (bb1) != NULL && BB_CLUSTER (bb1) == BB_CLUSTER (bb2))
   1506  1.1  mrg 	    continue;
   1507  1.1  mrg 
   1508  1.1  mrg 	  /* Limit quadratic behavior.  */
   1509  1.1  mrg 	  nr_comparisons++;
   1510  1.1  mrg 	  if (nr_comparisons > max_comparisons)
   1511  1.1  mrg 	    break;
   1512  1.1  mrg 
   1513  1.1  mrg 	  /* This is a conservative dependency check.  We could test more
   1514  1.1  mrg 	     precise for allowed replacement direction.  */
   1515  1.1  mrg 	  if (!deps_ok_for_redirect (bb1, bb2))
   1516  1.1  mrg 	    continue;
   1517  1.1  mrg 
   1518  1.1  mrg 	  if (!(same_phi_alternatives (same_succ, bb1, bb2)))
   1519  1.1  mrg 	    continue;
   1520  1.1  mrg 
   1521  1.1  mrg 	  find_duplicate (same_succ, bb1, bb2);
   1522  1.1  mrg 	}
   1523  1.1  mrg     }
   1524  1.1  mrg }
   1525  1.1  mrg 
   1526  1.1  mrg /* Find clusters of bbs which can be merged.  */
   1527  1.1  mrg 
   1528  1.1  mrg static void
   1529  1.1  mrg find_clusters (void)
   1530  1.1  mrg {
   1531  1.1  mrg   same_succ *same;
   1532  1.1  mrg 
   1533  1.1  mrg   while (!worklist.is_empty ())
   1534  1.1  mrg     {
   1535  1.1  mrg       same = worklist.pop ();
   1536  1.1  mrg       same->in_worklist = false;
   1537  1.1  mrg       if (dump_file && (dump_flags & TDF_DETAILS))
   1538  1.1  mrg 	{
   1539  1.1  mrg 	  fprintf (dump_file, "processing worklist entry\n");
   1540  1.1  mrg 	  same_succ_print (dump_file, same);
   1541  1.1  mrg 	}
   1542  1.1  mrg       find_clusters_1 (same);
   1543  1.1  mrg     }
   1544  1.1  mrg }
   1545  1.1  mrg 
   1546  1.1  mrg /* Returns the vop phi of BB, if any.  */
   1547  1.1  mrg 
   1548  1.1  mrg static gphi *
   1549  1.1  mrg vop_phi (basic_block bb)
   1550  1.1  mrg {
   1551  1.1  mrg   gphi *stmt;
   1552  1.1  mrg   gphi_iterator gsi;
   1553  1.1  mrg   for (gsi = gsi_start_phis (bb); !gsi_end_p (gsi); gsi_next (&gsi))
   1554  1.1  mrg     {
   1555  1.1  mrg       stmt = gsi.phi ();
   1556  1.1  mrg       if (! virtual_operand_p (gimple_phi_result (stmt)))
   1557  1.1  mrg 	continue;
   1558  1.1  mrg       return stmt;
   1559  1.1  mrg     }
   1560  1.1  mrg   return NULL;
   1561  1.1  mrg }
   1562  1.1  mrg 
   1563  1.1  mrg /* Redirect all edges from BB1 to BB2, removes BB1 and marks it as removed.  */
   1564  1.1  mrg 
   1565  1.1  mrg static void
   1566  1.1  mrg replace_block_by (basic_block bb1, basic_block bb2)
   1567  1.1  mrg {
   1568  1.1  mrg   edge pred_edge;
   1569  1.1  mrg   unsigned int i;
   1570  1.1  mrg   gphi *bb2_phi;
   1571  1.1  mrg 
   1572  1.1  mrg   bb2_phi = vop_phi (bb2);
   1573  1.1  mrg 
   1574  1.1  mrg   /* Mark the basic block as deleted.  */
   1575  1.1  mrg   mark_basic_block_deleted (bb1);
   1576  1.1  mrg 
   1577  1.1  mrg   /* Redirect the incoming edges of bb1 to bb2.  */
   1578  1.1  mrg   for (i = EDGE_COUNT (bb1->preds); i > 0 ; --i)
   1579  1.1  mrg     {
   1580  1.1  mrg       pred_edge = EDGE_PRED (bb1, i - 1);
   1581  1.1  mrg       pred_edge = redirect_edge_and_branch (pred_edge, bb2);
   1582  1.1  mrg       gcc_assert (pred_edge != NULL);
   1583  1.1  mrg 
   1584  1.1  mrg       if (bb2_phi == NULL)
   1585  1.1  mrg 	continue;
   1586  1.1  mrg 
   1587  1.1  mrg       /* The phi might have run out of capacity when the redirect added an
   1588  1.1  mrg 	 argument, which means it could have been replaced.  Refresh it.  */
   1589  1.1  mrg       bb2_phi = vop_phi (bb2);
   1590  1.1  mrg 
   1591  1.1  mrg       add_phi_arg (bb2_phi, SSA_NAME_VAR (gimple_phi_result (bb2_phi)),
   1592  1.1  mrg 		   pred_edge, UNKNOWN_LOCATION);
   1593  1.1  mrg     }
   1594  1.1  mrg 
   1595  1.1  mrg 
   1596  1.1  mrg   /* Merge the outgoing edge counts from bb1 onto bb2.  */
   1597  1.1  mrg   edge e1, e2;
   1598  1.1  mrg   edge_iterator ei;
   1599  1.1  mrg 
   1600  1.1  mrg   if (bb2->count.initialized_p ())
   1601  1.1  mrg     FOR_EACH_EDGE (e1, ei, bb1->succs)
   1602  1.1  mrg       {
   1603  1.1  mrg         e2 = find_edge (bb2, e1->dest);
   1604  1.1  mrg         gcc_assert (e2);
   1605  1.1  mrg 
   1606  1.1  mrg 	/* If probabilities are same, we are done.
   1607  1.1  mrg 	   If counts are nonzero we can distribute accordingly. In remaining
   1608  1.1  mrg 	   cases just avreage the values and hope for the best.  */
   1609  1.1  mrg 	e2->probability = e1->probability.combine_with_count
   1610  1.1  mrg 	                     (bb1->count, e2->probability, bb2->count);
   1611  1.1  mrg       }
   1612  1.1  mrg   bb2->count += bb1->count;
   1613  1.1  mrg 
   1614  1.1  mrg   /* Move over any user labels from bb1 after the bb2 labels.  */
   1615  1.1  mrg   gimple_stmt_iterator gsi1 = gsi_start_bb (bb1);
   1616  1.1  mrg   if (!gsi_end_p (gsi1) && gimple_code (gsi_stmt (gsi1)) == GIMPLE_LABEL)
   1617  1.1  mrg     {
   1618  1.1  mrg       gimple_stmt_iterator gsi2 = gsi_after_labels (bb2);
   1619  1.1  mrg       while (!gsi_end_p (gsi1)
   1620  1.1  mrg 	     && gimple_code (gsi_stmt (gsi1)) == GIMPLE_LABEL)
   1621  1.1  mrg 	{
   1622  1.1  mrg 	  tree label = gimple_label_label (as_a <glabel *> (gsi_stmt (gsi1)));
   1623  1.1  mrg 	  gcc_assert (!DECL_NONLOCAL (label) && !FORCED_LABEL (label));
   1624  1.1  mrg 	  if (DECL_ARTIFICIAL (label))
   1625  1.1  mrg 	    gsi_next (&gsi1);
   1626  1.1  mrg 	  else
   1627  1.1  mrg 	    gsi_move_before (&gsi1, &gsi2);
   1628  1.1  mrg 	}
   1629  1.1  mrg     }
   1630  1.1  mrg 
   1631  1.1  mrg   /* Clear range info from all stmts in BB2 -- this transformation
   1632  1.1  mrg      could make them out of date.  */
   1633  1.1  mrg   reset_flow_sensitive_info_in_bb (bb2);
   1634  1.1  mrg 
   1635  1.1  mrg   /* Do updates that use bb1, before deleting bb1.  */
   1636  1.1  mrg   release_last_vdef (bb1);
   1637  1.1  mrg   same_succ_flush_bb (bb1);
   1638  1.1  mrg 
   1639  1.1  mrg   delete_basic_block (bb1);
   1640  1.1  mrg }
   1641  1.1  mrg 
   1642  1.1  mrg /* Bbs for which update_debug_stmt need to be called.  */
   1643  1.1  mrg 
   1644  1.1  mrg static bitmap update_bbs;
   1645  1.1  mrg 
   1646  1.1  mrg /* For each cluster in all_clusters, merge all cluster->bbs.  Returns
   1647  1.1  mrg    number of bbs removed.  */
   1648  1.1  mrg 
   1649  1.1  mrg static int
   1650  1.1  mrg apply_clusters (void)
   1651  1.1  mrg {
   1652  1.1  mrg   basic_block bb1, bb2;
   1653  1.1  mrg   bb_cluster *c;
   1654  1.1  mrg   unsigned int i, j;
   1655  1.1  mrg   bitmap_iterator bj;
   1656  1.1  mrg   int nr_bbs_removed = 0;
   1657  1.1  mrg 
   1658  1.1  mrg   for (i = 0; i < all_clusters.length (); ++i)
   1659  1.1  mrg     {
   1660  1.1  mrg       c = all_clusters[i];
   1661  1.1  mrg       if (c == NULL)
   1662  1.1  mrg 	continue;
   1663  1.1  mrg 
   1664  1.1  mrg       bb2 = c->rep_bb;
   1665  1.1  mrg       bitmap_set_bit (update_bbs, bb2->index);
   1666  1.1  mrg 
   1667  1.1  mrg       bitmap_clear_bit (c->bbs, bb2->index);
   1668  1.1  mrg       EXECUTE_IF_SET_IN_BITMAP (c->bbs, 0, j, bj)
   1669  1.1  mrg 	{
   1670  1.1  mrg 	  bb1 = BASIC_BLOCK_FOR_FN (cfun, j);
   1671  1.1  mrg 	  bitmap_clear_bit (update_bbs, bb1->index);
   1672  1.1  mrg 
   1673  1.1  mrg 	  replace_block_by (bb1, bb2);
   1674  1.1  mrg 	  nr_bbs_removed++;
   1675  1.1  mrg 	}
   1676  1.1  mrg     }
   1677  1.1  mrg 
   1678  1.1  mrg   return nr_bbs_removed;
   1679  1.1  mrg }
   1680  1.1  mrg 
   1681  1.1  mrg /* Resets debug statement STMT if it has uses that are not dominated by their
   1682  1.1  mrg    defs.  */
   1683  1.1  mrg 
   1684  1.1  mrg static void
   1685  1.1  mrg update_debug_stmt (gimple *stmt)
   1686  1.1  mrg {
   1687  1.1  mrg   use_operand_p use_p;
   1688  1.1  mrg   ssa_op_iter oi;
   1689  1.1  mrg   basic_block bbuse;
   1690  1.1  mrg 
   1691  1.1  mrg   if (!gimple_debug_bind_p (stmt))
   1692  1.1  mrg     return;
   1693  1.1  mrg 
   1694  1.1  mrg   bbuse = gimple_bb (stmt);
   1695  1.1  mrg   FOR_EACH_PHI_OR_STMT_USE (use_p, stmt, oi, SSA_OP_USE)
   1696  1.1  mrg     {
   1697  1.1  mrg       tree name = USE_FROM_PTR (use_p);
   1698  1.1  mrg       gimple *def_stmt = SSA_NAME_DEF_STMT (name);
   1699  1.1  mrg       basic_block bbdef = gimple_bb (def_stmt);
   1700  1.1  mrg       if (bbdef == NULL || bbuse == bbdef
   1701  1.1  mrg 	  || dominated_by_p (CDI_DOMINATORS, bbuse, bbdef))
   1702  1.1  mrg 	continue;
   1703  1.1  mrg 
   1704  1.1  mrg       gimple_debug_bind_reset_value (stmt);
   1705  1.1  mrg       update_stmt (stmt);
   1706  1.1  mrg       break;
   1707  1.1  mrg     }
   1708  1.1  mrg }
   1709  1.1  mrg 
   1710  1.1  mrg /* Resets all debug statements that have uses that are not
   1711  1.1  mrg    dominated by their defs.  */
   1712  1.1  mrg 
   1713  1.1  mrg static void
   1714  1.1  mrg update_debug_stmts (void)
   1715  1.1  mrg {
   1716  1.1  mrg   basic_block bb;
   1717  1.1  mrg   bitmap_iterator bi;
   1718  1.1  mrg   unsigned int i;
   1719  1.1  mrg 
   1720  1.1  mrg   EXECUTE_IF_SET_IN_BITMAP (update_bbs, 0, i, bi)
   1721  1.1  mrg     {
   1722  1.1  mrg       gimple *stmt;
   1723  1.1  mrg       gimple_stmt_iterator gsi;
   1724  1.1  mrg 
   1725  1.1  mrg       bb = BASIC_BLOCK_FOR_FN (cfun, i);
   1726  1.1  mrg       for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
   1727  1.1  mrg 	{
   1728  1.1  mrg 	  stmt = gsi_stmt (gsi);
   1729  1.1  mrg 	  if (!is_gimple_debug (stmt))
   1730  1.1  mrg 	    continue;
   1731  1.1  mrg 	  update_debug_stmt (stmt);
   1732  1.1  mrg 	}
   1733  1.1  mrg     }
   1734  1.1  mrg }
   1735  1.1  mrg 
   1736  1.1  mrg /* Runs tail merge optimization.  */
   1737  1.1  mrg 
   1738  1.1  mrg unsigned int
   1739  1.1  mrg tail_merge_optimize (bool need_crit_edge_split)
   1740  1.1  mrg {
   1741  1.1  mrg   int nr_bbs_removed_total = 0;
   1742  1.1  mrg   int nr_bbs_removed;
   1743  1.1  mrg   bool loop_entered = false;
   1744  1.1  mrg   int iteration_nr = 0;
   1745  1.1  mrg   int max_iterations = param_max_tail_merge_iterations;
   1746  1.1  mrg 
   1747  1.1  mrg   if (!flag_tree_tail_merge
   1748  1.1  mrg       || max_iterations == 0)
   1749  1.1  mrg     return 0;
   1750  1.1  mrg 
   1751  1.1  mrg   timevar_push (TV_TREE_TAIL_MERGE);
   1752  1.1  mrg 
   1753  1.1  mrg   /* Re-split critical edges when PRE did a CFG cleanup.  */
   1754  1.1  mrg   if (need_crit_edge_split)
   1755  1.1  mrg     split_edges_for_insertion ();
   1756  1.1  mrg 
   1757  1.1  mrg   if (!dom_info_available_p (CDI_DOMINATORS))
   1758  1.1  mrg     {
   1759  1.1  mrg       /* PRE can leave us with unreachable blocks, remove them now.  */
   1760  1.1  mrg       delete_unreachable_blocks ();
   1761  1.1  mrg       calculate_dominance_info (CDI_DOMINATORS);
   1762  1.1  mrg     }
   1763  1.1  mrg   init_worklist ();
   1764  1.1  mrg 
   1765  1.1  mrg   while (!worklist.is_empty ())
   1766  1.1  mrg     {
   1767  1.1  mrg       if (!loop_entered)
   1768  1.1  mrg 	{
   1769  1.1  mrg 	  loop_entered = true;
   1770  1.1  mrg 	  alloc_cluster_vectors ();
   1771  1.1  mrg 	  update_bbs = BITMAP_ALLOC (NULL);
   1772  1.1  mrg 	}
   1773  1.1  mrg       else
   1774  1.1  mrg 	reset_cluster_vectors ();
   1775  1.1  mrg 
   1776  1.1  mrg       iteration_nr++;
   1777  1.1  mrg       if (dump_file && (dump_flags & TDF_DETAILS))
   1778  1.1  mrg 	fprintf (dump_file, "worklist iteration #%d\n", iteration_nr);
   1779  1.1  mrg 
   1780  1.1  mrg       find_clusters ();
   1781  1.1  mrg       gcc_assert (worklist.is_empty ());
   1782  1.1  mrg       if (all_clusters.is_empty ())
   1783  1.1  mrg 	break;
   1784  1.1  mrg 
   1785  1.1  mrg       nr_bbs_removed = apply_clusters ();
   1786  1.1  mrg       nr_bbs_removed_total += nr_bbs_removed;
   1787  1.1  mrg       if (nr_bbs_removed == 0)
   1788  1.1  mrg 	break;
   1789  1.1  mrg 
   1790  1.1  mrg       free_dominance_info (CDI_DOMINATORS);
   1791  1.1  mrg 
   1792  1.1  mrg       if (iteration_nr == max_iterations)
   1793  1.1  mrg 	break;
   1794  1.1  mrg 
   1795  1.1  mrg       calculate_dominance_info (CDI_DOMINATORS);
   1796  1.1  mrg       update_worklist ();
   1797  1.1  mrg     }
   1798  1.1  mrg 
   1799  1.1  mrg   if (dump_file && (dump_flags & TDF_DETAILS))
   1800  1.1  mrg     fprintf (dump_file, "htab collision / search: %f\n",
   1801  1.1  mrg 	     same_succ_htab->collisions ());
   1802  1.1  mrg 
   1803  1.1  mrg   if (nr_bbs_removed_total > 0)
   1804  1.1  mrg     {
   1805  1.1  mrg       if (MAY_HAVE_DEBUG_BIND_STMTS)
   1806  1.1  mrg 	{
   1807  1.1  mrg 	  calculate_dominance_info (CDI_DOMINATORS);
   1808  1.1  mrg 	  update_debug_stmts ();
   1809  1.1  mrg 	}
   1810  1.1  mrg 
   1811  1.1  mrg       if (dump_file && (dump_flags & TDF_DETAILS))
   1812  1.1  mrg 	{
   1813  1.1  mrg 	  fprintf (dump_file, "Before TODOs.\n");
   1814  1.1  mrg 	  dump_function_to_file (current_function_decl, dump_file, dump_flags);
   1815  1.1  mrg 	}
   1816  1.1  mrg 
   1817  1.1  mrg       mark_virtual_operands_for_renaming (cfun);
   1818  1.1  mrg     }
   1819  1.1  mrg 
   1820  1.1  mrg   delete_worklist ();
   1821  1.1  mrg   if (loop_entered)
   1822  1.1  mrg     {
   1823  1.1  mrg       delete_cluster_vectors ();
   1824  1.1  mrg       BITMAP_FREE (update_bbs);
   1825  1.1  mrg     }
   1826  1.1  mrg 
   1827  1.1  mrg   timevar_pop (TV_TREE_TAIL_MERGE);
   1828  1.1  mrg 
   1829  1.1  mrg   return 0;
   1830  1.1  mrg }
   1831