Home | History | Annotate | Line # | Download | only in gcc
      1  1.1  mrg /* Store motion via Lazy Code Motion on the reverse CFG.
      2  1.1  mrg    Copyright (C) 1997-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 #include "config.h"
     21  1.1  mrg #include "system.h"
     22  1.1  mrg #include "coretypes.h"
     23  1.1  mrg #include "backend.h"
     24  1.1  mrg #include "rtl.h"
     25  1.1  mrg #include "tree.h"
     26  1.1  mrg #include "predict.h"
     27  1.1  mrg #include "df.h"
     28  1.1  mrg #include "toplev.h"
     29  1.1  mrg 
     30  1.1  mrg #include "cfgrtl.h"
     31  1.1  mrg #include "cfganal.h"
     32  1.1  mrg #include "lcm.h"
     33  1.1  mrg #include "cfgcleanup.h"
     34  1.1  mrg #include "expr.h"
     35  1.1  mrg #include "tree-pass.h"
     36  1.1  mrg #include "dbgcnt.h"
     37  1.1  mrg #include "rtl-iter.h"
     38  1.1  mrg #include "print-rtl.h"
     39  1.1  mrg 
     40  1.1  mrg /* This pass implements downward store motion.
     41  1.1  mrg    As of May 1, 2009, the pass is not enabled by default on any target,
     42  1.1  mrg    but bootstrap completes on ia64 and x86_64 with the pass enabled.  */
     43  1.1  mrg 
     44  1.1  mrg /* TODO:
     45  1.1  mrg    - remove_reachable_equiv_notes is an incomprehensible pile of goo and
     46  1.1  mrg      a compile time hog that needs a rewrite (maybe cache st_exprs to
     47  1.1  mrg      invalidate REG_EQUAL/REG_EQUIV notes for?).
     48  1.1  mrg    - pattern_regs in st_expr should be a regset (on its own obstack).
     49  1.1  mrg    - store_motion_mems should be a vec instead of a list.
     50  1.1  mrg    - there should be an alloc pool for struct st_expr objects.
     51  1.1  mrg    - investigate whether it is helpful to make the address of an st_expr
     52  1.1  mrg      a cselib VALUE.
     53  1.1  mrg    - when GIMPLE alias information is exported, the effectiveness of this
     54  1.1  mrg      pass should be re-evaluated.
     55  1.1  mrg */
     56  1.1  mrg 
     57  1.1  mrg /* This is a list of store expressions (MEMs).  The structure is used
     58  1.1  mrg    as an expression table to track stores which look interesting, and
     59  1.1  mrg    might be moveable towards the exit block.  */
     60  1.1  mrg 
     61  1.1  mrg struct st_expr
     62  1.1  mrg {
     63  1.1  mrg   /* Pattern of this mem.  */
     64  1.1  mrg   rtx pattern;
     65  1.1  mrg   /* List of registers mentioned by the mem.  */
     66  1.1  mrg   vec<rtx> pattern_regs;
     67  1.1  mrg   /* INSN list of stores that are locally anticipatable.  */
     68  1.1  mrg   vec<rtx_insn *> antic_stores;
     69  1.1  mrg   /* INSN list of stores that are locally available.  */
     70  1.1  mrg   vec<rtx_insn *> avail_stores;
     71  1.1  mrg   /* Next in the list.  */
     72  1.1  mrg   struct st_expr * next;
     73  1.1  mrg   /* Store ID in the dataflow bitmaps.  */
     74  1.1  mrg   int index;
     75  1.1  mrg   /* Hash value for the hash table.  */
     76  1.1  mrg   unsigned int hash_index;
     77  1.1  mrg   /* Register holding the stored expression when a store is moved.
     78  1.1  mrg      This field is also used as a cache in find_moveable_store, see
     79  1.1  mrg      LAST_AVAIL_CHECK_FAILURE below.  */
     80  1.1  mrg   rtx reaching_reg;
     81  1.1  mrg };
     82  1.1  mrg 
     83  1.1  mrg /* Head of the list of load/store memory refs.  */
     84  1.1  mrg static struct st_expr * store_motion_mems = NULL;
     85  1.1  mrg 
     86  1.1  mrg /* These bitmaps will hold the local dataflow properties per basic block.  */
     87  1.1  mrg static sbitmap *st_kill, *st_avloc, *st_antloc, *st_transp;
     88  1.1  mrg 
     89  1.1  mrg /* Nonzero for expressions which should be inserted on a specific edge.  */
     90  1.1  mrg static sbitmap *st_insert_map;
     91  1.1  mrg 
     92  1.1  mrg /* Nonzero for expressions which should be deleted in a specific block.  */
     93  1.1  mrg static sbitmap *st_delete_map;
     94  1.1  mrg 
     95  1.1  mrg /* Global holding the number of store expressions we are dealing with.  */
     96  1.1  mrg static int num_stores;
     97  1.1  mrg 
     98  1.1  mrg /* Contains the edge_list returned by pre_edge_lcm.  */
     99  1.1  mrg static struct edge_list *edge_list;
    100  1.1  mrg 
    101  1.1  mrg /* Hashtable helpers.  */
    102  1.1  mrg 
    103  1.1  mrg struct st_expr_hasher : nofree_ptr_hash <st_expr>
    104  1.1  mrg {
    105  1.1  mrg   static inline hashval_t hash (const st_expr *);
    106  1.1  mrg   static inline bool equal (const st_expr *, const st_expr *);
    107  1.1  mrg };
    108  1.1  mrg 
    109  1.1  mrg inline hashval_t
    110  1.1  mrg st_expr_hasher::hash (const st_expr *x)
    111  1.1  mrg {
    112  1.1  mrg   int do_not_record_p = 0;
    113  1.1  mrg   return hash_rtx (x->pattern, GET_MODE (x->pattern), &do_not_record_p, NULL, false);
    114  1.1  mrg }
    115  1.1  mrg 
    116  1.1  mrg inline bool
    117  1.1  mrg st_expr_hasher::equal (const st_expr *ptr1, const st_expr *ptr2)
    118  1.1  mrg {
    119  1.1  mrg   return exp_equiv_p (ptr1->pattern, ptr2->pattern, 0, true);
    120  1.1  mrg }
    121  1.1  mrg 
    122  1.1  mrg /* Hashtable for the load/store memory refs.  */
    123  1.1  mrg static hash_table<st_expr_hasher> *store_motion_mems_table;
    124  1.1  mrg 
    125  1.1  mrg /* This will search the st_expr list for a matching expression. If it
    126  1.1  mrg    doesn't find one, we create one and initialize it.  */
    127  1.1  mrg 
    128  1.1  mrg static struct st_expr *
    129  1.1  mrg st_expr_entry (rtx x)
    130  1.1  mrg {
    131  1.1  mrg   int do_not_record_p = 0;
    132  1.1  mrg   struct st_expr * ptr;
    133  1.1  mrg   unsigned int hash;
    134  1.1  mrg   st_expr **slot;
    135  1.1  mrg   struct st_expr e;
    136  1.1  mrg 
    137  1.1  mrg   hash = hash_rtx (x, GET_MODE (x), &do_not_record_p,
    138  1.1  mrg 		   NULL,  /*have_reg_qty=*/false);
    139  1.1  mrg 
    140  1.1  mrg   e.pattern = x;
    141  1.1  mrg   slot = store_motion_mems_table->find_slot_with_hash (&e, hash, INSERT);
    142  1.1  mrg   if (*slot)
    143  1.1  mrg     return *slot;
    144  1.1  mrg 
    145  1.1  mrg   ptr = XNEW (struct st_expr);
    146  1.1  mrg 
    147  1.1  mrg   ptr->next         = store_motion_mems;
    148  1.1  mrg   ptr->pattern      = x;
    149  1.1  mrg   ptr->pattern_regs.create (0);
    150  1.1  mrg   ptr->antic_stores.create (0);
    151  1.1  mrg   ptr->avail_stores.create (0);
    152  1.1  mrg   ptr->reaching_reg = NULL_RTX;
    153  1.1  mrg   ptr->index        = 0;
    154  1.1  mrg   ptr->hash_index   = hash;
    155  1.1  mrg   store_motion_mems = ptr;
    156  1.1  mrg   *slot = ptr;
    157  1.1  mrg 
    158  1.1  mrg   return ptr;
    159  1.1  mrg }
    160  1.1  mrg 
    161  1.1  mrg /* Free up an individual st_expr entry.  */
    162  1.1  mrg 
    163  1.1  mrg static void
    164  1.1  mrg free_st_expr_entry (struct st_expr * ptr)
    165  1.1  mrg {
    166  1.1  mrg   ptr->antic_stores.release ();
    167  1.1  mrg   ptr->avail_stores.release ();
    168  1.1  mrg   ptr->pattern_regs.release ();
    169  1.1  mrg 
    170  1.1  mrg   free (ptr);
    171  1.1  mrg }
    172  1.1  mrg 
    173  1.1  mrg /* Free up all memory associated with the st_expr list.  */
    174  1.1  mrg 
    175  1.1  mrg static void
    176  1.1  mrg free_store_motion_mems (void)
    177  1.1  mrg {
    178  1.1  mrg   delete store_motion_mems_table;
    179  1.1  mrg   store_motion_mems_table = NULL;
    180  1.1  mrg 
    181  1.1  mrg   while (store_motion_mems)
    182  1.1  mrg     {
    183  1.1  mrg       struct st_expr * tmp = store_motion_mems;
    184  1.1  mrg       store_motion_mems = store_motion_mems->next;
    185  1.1  mrg       free_st_expr_entry (tmp);
    186  1.1  mrg     }
    187  1.1  mrg   store_motion_mems = NULL;
    188  1.1  mrg }
    189  1.1  mrg 
    190  1.1  mrg /* Assign each element of the list of mems a monotonically increasing value.  */
    191  1.1  mrg 
    192  1.1  mrg static int
    193  1.1  mrg enumerate_store_motion_mems (void)
    194  1.1  mrg {
    195  1.1  mrg   struct st_expr * ptr;
    196  1.1  mrg   int n = 0;
    197  1.1  mrg 
    198  1.1  mrg   for (ptr = store_motion_mems; ptr != NULL; ptr = ptr->next)
    199  1.1  mrg     ptr->index = n++;
    200  1.1  mrg 
    201  1.1  mrg   return n;
    202  1.1  mrg }
    203  1.1  mrg 
    204  1.1  mrg /* Return first item in the list.  */
    205  1.1  mrg 
    206  1.1  mrg static inline struct st_expr *
    207  1.1  mrg first_st_expr (void)
    208  1.1  mrg {
    209  1.1  mrg   return store_motion_mems;
    210  1.1  mrg }
    211  1.1  mrg 
    212  1.1  mrg /* Return the next item in the list after the specified one.  */
    213  1.1  mrg 
    214  1.1  mrg static inline struct st_expr *
    215  1.1  mrg next_st_expr (struct st_expr * ptr)
    216  1.1  mrg {
    217  1.1  mrg   return ptr->next;
    218  1.1  mrg }
    219  1.1  mrg 
    220  1.1  mrg /* Dump debugging info about the store_motion_mems list.  */
    221  1.1  mrg 
    222  1.1  mrg static void
    223  1.1  mrg print_store_motion_mems (FILE * file)
    224  1.1  mrg {
    225  1.1  mrg   struct st_expr * ptr;
    226  1.1  mrg 
    227  1.1  mrg   fprintf (dump_file, "STORE_MOTION list of MEM exprs considered:\n");
    228  1.1  mrg 
    229  1.1  mrg   for (ptr = first_st_expr (); ptr != NULL; ptr = next_st_expr (ptr))
    230  1.1  mrg     {
    231  1.1  mrg       fprintf (file, "  Pattern (%3d): ", ptr->index);
    232  1.1  mrg 
    233  1.1  mrg       print_rtl (file, ptr->pattern);
    234  1.1  mrg 
    235  1.1  mrg       fprintf (file, "\n	 ANTIC stores : ");
    236  1.1  mrg       print_rtx_insn_vec (file, ptr->antic_stores);
    237  1.1  mrg 
    238  1.1  mrg       fprintf (file, "\n	 AVAIL stores : ");
    239  1.1  mrg 
    240  1.1  mrg 	print_rtx_insn_vec (file, ptr->avail_stores);
    241  1.1  mrg 
    242  1.1  mrg       fprintf (file, "\n\n");
    243  1.1  mrg     }
    244  1.1  mrg 
    245  1.1  mrg   fprintf (file, "\n");
    246  1.1  mrg }
    247  1.1  mrg 
    248  1.1  mrg /* Return zero if some of the registers in list X are killed
    250  1.1  mrg    due to set of registers in bitmap REGS_SET.  */
    251  1.1  mrg 
    252  1.1  mrg static bool
    253  1.1  mrg store_ops_ok (const vec<rtx> &x, int *regs_set)
    254  1.1  mrg {
    255  1.1  mrg   for (rtx temp : x)
    256  1.1  mrg     if (regs_set[REGNO (temp)])
    257  1.1  mrg       return false;
    258  1.1  mrg 
    259  1.1  mrg   return true;
    260  1.1  mrg }
    261  1.1  mrg 
    262  1.1  mrg /* Returns a list of registers mentioned in X.
    263  1.1  mrg    FIXME: A regset would be prettier and less expensive.  */
    264  1.1  mrg 
    265  1.1  mrg static void
    266  1.1  mrg extract_mentioned_regs (rtx x, vec<rtx> *mentioned_regs)
    267  1.1  mrg {
    268  1.1  mrg   subrtx_var_iterator::array_type array;
    269  1.1  mrg   FOR_EACH_SUBRTX_VAR (iter, array, x, NONCONST)
    270  1.1  mrg     {
    271  1.1  mrg       rtx x = *iter;
    272  1.1  mrg       if (REG_P (x))
    273  1.1  mrg 	mentioned_regs->safe_push (x);
    274  1.1  mrg     }
    275  1.1  mrg }
    276  1.1  mrg 
    277  1.1  mrg /* Check to see if the load X is aliased with STORE_PATTERN.
    278  1.1  mrg    AFTER is true if we are checking the case when STORE_PATTERN occurs
    279  1.1  mrg    after the X.  */
    280  1.1  mrg 
    281  1.1  mrg static bool
    282  1.1  mrg load_kills_store (const_rtx x, const_rtx store_pattern, int after)
    283  1.1  mrg {
    284  1.1  mrg   if (after)
    285  1.1  mrg     return anti_dependence (x, store_pattern);
    286  1.1  mrg   else
    287  1.1  mrg     return true_dependence (store_pattern, GET_MODE (store_pattern), x);
    288  1.1  mrg }
    289  1.1  mrg 
    290  1.1  mrg /* Go through the entire rtx X, looking for any loads which might alias
    291  1.1  mrg    STORE_PATTERN.  Return true if found.
    292  1.1  mrg    AFTER is true if we are checking the case when STORE_PATTERN occurs
    293  1.1  mrg    after the insn X.  */
    294  1.1  mrg 
    295  1.1  mrg static bool
    296  1.1  mrg find_loads (const_rtx x, const_rtx store_pattern, int after)
    297  1.1  mrg {
    298  1.1  mrg   const char * fmt;
    299  1.1  mrg   int i, j;
    300  1.1  mrg   int ret = false;
    301  1.1  mrg 
    302  1.1  mrg   if (!x)
    303  1.1  mrg     return false;
    304  1.1  mrg 
    305  1.1  mrg   if (GET_CODE (x) == SET)
    306  1.1  mrg     x = SET_SRC (x);
    307  1.1  mrg 
    308  1.1  mrg   if (MEM_P (x))
    309  1.1  mrg     {
    310  1.1  mrg       if (load_kills_store (x, store_pattern, after))
    311  1.1  mrg 	return true;
    312  1.1  mrg     }
    313  1.1  mrg 
    314  1.1  mrg   /* Recursively process the insn.  */
    315  1.1  mrg   fmt = GET_RTX_FORMAT (GET_CODE (x));
    316  1.1  mrg 
    317  1.1  mrg   for (i = GET_RTX_LENGTH (GET_CODE (x)) - 1; i >= 0 && !ret; i--)
    318  1.1  mrg     {
    319  1.1  mrg       if (fmt[i] == 'e')
    320  1.1  mrg 	ret |= find_loads (XEXP (x, i), store_pattern, after);
    321  1.1  mrg       else if (fmt[i] == 'E')
    322  1.1  mrg 	for (j = XVECLEN (x, i) - 1; j >= 0; j--)
    323  1.1  mrg 	  ret |= find_loads (XVECEXP (x, i, j), store_pattern, after);
    324  1.1  mrg     }
    325  1.1  mrg   return ret;
    326  1.1  mrg }
    327  1.1  mrg 
    328  1.1  mrg /* Go through pattern PAT looking for any loads which might kill the
    329  1.1  mrg    store in X.  Return true if found.
    330  1.1  mrg    AFTER is true if we are checking the case when loads kill X occurs
    331  1.1  mrg    after the insn for PAT.  */
    332  1.1  mrg 
    333  1.1  mrg static inline bool
    334  1.1  mrg store_killed_in_pat (const_rtx x, const_rtx pat, int after)
    335  1.1  mrg {
    336  1.1  mrg   if (GET_CODE (pat) == SET)
    337  1.1  mrg     {
    338  1.1  mrg       rtx dest = SET_DEST (pat);
    339  1.1  mrg 
    340  1.1  mrg       if (GET_CODE (dest) == ZERO_EXTRACT)
    341  1.1  mrg 	dest = XEXP (dest, 0);
    342  1.1  mrg 
    343  1.1  mrg       /* Check for memory stores to aliased objects.  */
    344  1.1  mrg       if (MEM_P (dest)
    345  1.1  mrg 	  && !exp_equiv_p (dest, x, 0, true))
    346  1.1  mrg 	{
    347  1.1  mrg 	  if (after)
    348  1.1  mrg 	    {
    349  1.1  mrg 	      if (output_dependence (dest, x))
    350  1.1  mrg 		return true;
    351  1.1  mrg 	    }
    352  1.1  mrg 	  else
    353  1.1  mrg 	    {
    354  1.1  mrg 	      if (output_dependence (x, dest))
    355  1.1  mrg 		return true;
    356  1.1  mrg 	    }
    357  1.1  mrg 	}
    358  1.1  mrg     }
    359  1.1  mrg 
    360  1.1  mrg   if (find_loads (pat, x, after))
    361  1.1  mrg     return true;
    362  1.1  mrg 
    363  1.1  mrg   return false;
    364  1.1  mrg }
    365  1.1  mrg 
    366  1.1  mrg /* Check if INSN kills the store pattern X (is aliased with it).
    367  1.1  mrg    AFTER is true if we are checking the case when store X occurs
    368  1.1  mrg    after the insn.  Return true if it does.  */
    369  1.1  mrg 
    370  1.1  mrg static bool
    371  1.1  mrg store_killed_in_insn (const_rtx x, const vec<rtx> &x_regs,
    372  1.1  mrg 		      const rtx_insn *insn, int after)
    373  1.1  mrg {
    374  1.1  mrg   const_rtx note, pat;
    375  1.1  mrg 
    376  1.1  mrg   if (! NONDEBUG_INSN_P (insn))
    377  1.1  mrg     return false;
    378  1.1  mrg 
    379  1.1  mrg   if (CALL_P (insn))
    380  1.1  mrg     {
    381  1.1  mrg       /* A normal or pure call might read from pattern,
    382  1.1  mrg 	 but a const call will not.  */
    383  1.1  mrg       if (!RTL_CONST_CALL_P (insn))
    384  1.1  mrg 	return true;
    385  1.1  mrg 
    386  1.1  mrg       /* But even a const call reads its parameters.  Check whether the
    387  1.1  mrg 	 base of some of registers used in mem is stack pointer.  */
    388  1.1  mrg       for (rtx temp : x_regs)
    389  1.1  mrg 	if (may_be_sp_based_p (temp))
    390  1.1  mrg 	  return true;
    391  1.1  mrg 
    392  1.1  mrg       return false;
    393  1.1  mrg     }
    394  1.1  mrg 
    395  1.1  mrg   pat = PATTERN (insn);
    396  1.1  mrg   if (GET_CODE (pat) == SET)
    397  1.1  mrg     {
    398  1.1  mrg       if (store_killed_in_pat (x, pat, after))
    399  1.1  mrg 	return true;
    400  1.1  mrg     }
    401  1.1  mrg   else if (GET_CODE (pat) == PARALLEL)
    402  1.1  mrg     {
    403  1.1  mrg       int i;
    404  1.1  mrg 
    405  1.1  mrg       for (i = 0; i < XVECLEN (pat, 0); i++)
    406  1.1  mrg 	if (store_killed_in_pat (x, XVECEXP (pat, 0, i), after))
    407  1.1  mrg 	  return true;
    408  1.1  mrg     }
    409  1.1  mrg   else if (find_loads (PATTERN (insn), x, after))
    410  1.1  mrg     return true;
    411  1.1  mrg 
    412  1.1  mrg   /* If this insn has a REG_EQUAL or REG_EQUIV note referencing a memory
    413  1.1  mrg      location aliased with X, then this insn kills X.  */
    414  1.1  mrg   note = find_reg_equal_equiv_note (insn);
    415  1.1  mrg   if (! note)
    416  1.1  mrg     return false;
    417  1.1  mrg   note = XEXP (note, 0);
    418  1.1  mrg 
    419  1.1  mrg   /* However, if the note represents a must alias rather than a may
    420  1.1  mrg      alias relationship, then it does not kill X.  */
    421  1.1  mrg   if (exp_equiv_p (note, x, 0, true))
    422  1.1  mrg     return false;
    423  1.1  mrg 
    424  1.1  mrg   /* See if there are any aliased loads in the note.  */
    425  1.1  mrg   return find_loads (note, x, after);
    426  1.1  mrg }
    427  1.1  mrg 
    428  1.1  mrg /* Returns true if the expression X is loaded or clobbered on or after INSN
    429  1.1  mrg    within basic block BB.  REGS_SET_AFTER is bitmap of registers set in
    430  1.1  mrg    or after the insn.  X_REGS is list of registers mentioned in X. If the store
    431  1.1  mrg    is killed, return the last insn in that it occurs in FAIL_INSN.  */
    432  1.1  mrg 
    433  1.1  mrg static bool
    434  1.1  mrg store_killed_after (const_rtx x, const vec<rtx> &x_regs,
    435  1.1  mrg 		    const rtx_insn *insn, const_basic_block bb,
    436  1.1  mrg 		    int *regs_set_after, rtx *fail_insn)
    437  1.1  mrg {
    438  1.1  mrg   rtx_insn *last = BB_END (bb), *act;
    439  1.1  mrg 
    440  1.1  mrg   if (!store_ops_ok (x_regs, regs_set_after))
    441  1.1  mrg     {
    442  1.1  mrg       /* We do not know where it will happen.  */
    443  1.1  mrg       if (fail_insn)
    444  1.1  mrg 	*fail_insn = NULL_RTX;
    445  1.1  mrg       return true;
    446  1.1  mrg     }
    447  1.1  mrg 
    448  1.1  mrg   /* Scan from the end, so that fail_insn is determined correctly.  */
    449  1.1  mrg   for (act = last; act != PREV_INSN (insn); act = PREV_INSN (act))
    450  1.1  mrg     if (store_killed_in_insn (x, x_regs, act, false))
    451  1.1  mrg       {
    452  1.1  mrg 	if (fail_insn)
    453  1.1  mrg 	  *fail_insn = act;
    454  1.1  mrg 	return true;
    455  1.1  mrg       }
    456  1.1  mrg 
    457  1.1  mrg   return false;
    458  1.1  mrg }
    459  1.1  mrg 
    460  1.1  mrg /* Returns true if the expression X is loaded or clobbered on or before INSN
    461  1.1  mrg    within basic block BB. X_REGS is list of registers mentioned in X.
    462  1.1  mrg    REGS_SET_BEFORE is bitmap of registers set before or in this insn.  */
    463  1.1  mrg static bool
    464  1.1  mrg store_killed_before (const_rtx x, const vec<rtx> &x_regs,
    465  1.1  mrg 		     const rtx_insn *insn, const_basic_block bb,
    466  1.1  mrg 		     int *regs_set_before)
    467  1.1  mrg {
    468  1.1  mrg   rtx_insn *first = BB_HEAD (bb);
    469  1.1  mrg 
    470  1.1  mrg   if (!store_ops_ok (x_regs, regs_set_before))
    471  1.1  mrg     return true;
    472  1.1  mrg 
    473  1.1  mrg   for ( ; insn != PREV_INSN (first); insn = PREV_INSN (insn))
    474  1.1  mrg     if (store_killed_in_insn (x, x_regs, insn, true))
    475  1.1  mrg       return true;
    476  1.1  mrg 
    477  1.1  mrg   return false;
    478  1.1  mrg }
    479  1.1  mrg 
    480  1.1  mrg /* The last insn in the basic block that compute_store_table is processing,
    481  1.1  mrg    where store_killed_after is true for X.
    482  1.1  mrg    Since we go through the basic block from BB_END to BB_HEAD, this is
    483  1.1  mrg    also the available store at the end of the basic block.  Therefore
    484  1.1  mrg    this is in effect a cache, to avoid calling store_killed_after for
    485  1.1  mrg    equivalent aliasing store expressions.
    486  1.1  mrg    This value is only meaningful during the computation of the store
    487  1.1  mrg    table.  We hi-jack the REACHING_REG field of struct st_expr to save
    488  1.1  mrg    a bit of memory.  */
    489  1.1  mrg #define LAST_AVAIL_CHECK_FAILURE(x)	((x)->reaching_reg)
    490  1.1  mrg 
    491  1.1  mrg /* Determine whether INSN is MEM store pattern that we will consider moving.
    492  1.1  mrg    REGS_SET_BEFORE is bitmap of registers set before (and including) the
    493  1.1  mrg    current insn, REGS_SET_AFTER is bitmap of registers set after (and
    494  1.1  mrg    including) the insn in this basic block.  We must be passing through BB from
    495  1.1  mrg    head to end, as we are using this fact to speed things up.
    496  1.1  mrg 
    497  1.1  mrg    The results are stored this way:
    498  1.1  mrg 
    499  1.1  mrg    -- the first anticipatable expression is added into ANTIC_STORES
    500  1.1  mrg    -- if the processed expression is not anticipatable, NULL_RTX is added
    501  1.1  mrg       there instead, so that we can use it as indicator that no further
    502  1.1  mrg       expression of this type may be anticipatable
    503  1.1  mrg    -- if the expression is available, it is added as head of AVAIL_STORES;
    504  1.1  mrg       consequently, all of them but this head are dead and may be deleted.
    505  1.1  mrg    -- if the expression is not available, the insn due to that it fails to be
    506  1.1  mrg       available is stored in REACHING_REG (via LAST_AVAIL_CHECK_FAILURE).
    507  1.1  mrg 
    508  1.1  mrg    The things are complicated a bit by fact that there already may be stores
    509  1.1  mrg    to the same MEM from other blocks; also caller must take care of the
    510  1.1  mrg    necessary cleanup of the temporary markers after end of the basic block.
    511  1.1  mrg    */
    512  1.1  mrg 
    513  1.1  mrg static void
    514  1.1  mrg find_moveable_store (rtx_insn *insn, int *regs_set_before, int *regs_set_after)
    515  1.1  mrg {
    516  1.1  mrg   struct st_expr * ptr;
    517  1.1  mrg   rtx dest, set;
    518  1.1  mrg   int check_anticipatable, check_available;
    519  1.1  mrg   basic_block bb = BLOCK_FOR_INSN (insn);
    520  1.1  mrg 
    521  1.1  mrg   set = single_set (insn);
    522  1.1  mrg   if (!set)
    523  1.1  mrg     return;
    524  1.1  mrg 
    525  1.1  mrg   dest = SET_DEST (set);
    526  1.1  mrg 
    527  1.1  mrg   if (! MEM_P (dest) || MEM_VOLATILE_P (dest)
    528  1.1  mrg       || GET_MODE (dest) == BLKmode)
    529  1.1  mrg     return;
    530  1.1  mrg 
    531  1.1  mrg   if (side_effects_p (dest))
    532  1.1  mrg     return;
    533  1.1  mrg 
    534  1.1  mrg   /* If we are handling exceptions, we must be careful with memory references
    535  1.1  mrg      that may trap.  If we are not, the behavior is undefined, so we may just
    536  1.1  mrg      continue.  */
    537  1.1  mrg   if (cfun->can_throw_non_call_exceptions && may_trap_p (dest))
    538  1.1  mrg     return;
    539  1.1  mrg 
    540  1.1  mrg   /* Even if the destination cannot trap, the source may.  In this case we'd
    541  1.1  mrg      need to handle updating the REG_EH_REGION note.  */
    542  1.1  mrg   if (find_reg_note (insn, REG_EH_REGION, NULL_RTX))
    543  1.1  mrg     return;
    544  1.1  mrg 
    545  1.1  mrg   /* Make sure that the SET_SRC of this store insns can be assigned to
    546  1.1  mrg      a register, or we will fail later on in replace_store_insn, which
    547  1.1  mrg      assumes that we can do this.  But sometimes the target machine has
    548  1.1  mrg      oddities like MEM read-modify-write instruction.  See for example
    549  1.1  mrg      PR24257.  */
    550  1.1  mrg   if (!can_assign_to_reg_without_clobbers_p (SET_SRC (set),
    551  1.1  mrg 					      GET_MODE (SET_SRC (set))))
    552  1.1  mrg     return;
    553  1.1  mrg 
    554  1.1  mrg   ptr = st_expr_entry (dest);
    555  1.1  mrg   if (ptr->pattern_regs.is_empty ())
    556  1.1  mrg     extract_mentioned_regs (dest, &ptr->pattern_regs);
    557  1.1  mrg 
    558  1.1  mrg   /* Do not check for anticipatability if we either found one anticipatable
    559  1.1  mrg      store already, or tested for one and found out that it was killed.  */
    560  1.1  mrg   check_anticipatable = 0;
    561  1.1  mrg   if (ptr->antic_stores.is_empty ())
    562  1.1  mrg     check_anticipatable = 1;
    563  1.1  mrg   else
    564  1.1  mrg     {
    565  1.1  mrg       rtx_insn *tmp = ptr->antic_stores.last ();
    566  1.1  mrg       if (tmp != NULL_RTX
    567  1.1  mrg 	  && BLOCK_FOR_INSN (tmp) != bb)
    568  1.1  mrg 	check_anticipatable = 1;
    569  1.1  mrg     }
    570  1.1  mrg   if (check_anticipatable)
    571  1.1  mrg     {
    572  1.1  mrg       rtx_insn *tmp;
    573  1.1  mrg       if (store_killed_before (dest, ptr->pattern_regs, insn, bb, regs_set_before))
    574  1.1  mrg 	tmp = NULL;
    575  1.1  mrg       else
    576  1.1  mrg 	tmp = insn;
    577  1.1  mrg       ptr->antic_stores.safe_push (tmp);
    578  1.1  mrg     }
    579  1.1  mrg 
    580  1.1  mrg   /* It is not necessary to check whether store is available if we did
    581  1.1  mrg      it successfully before; if we failed before, do not bother to check
    582  1.1  mrg      until we reach the insn that caused us to fail.  */
    583  1.1  mrg   check_available = 0;
    584  1.1  mrg   if (ptr->avail_stores.is_empty ())
    585  1.1  mrg     check_available = 1;
    586  1.1  mrg   else
    587  1.1  mrg     {
    588  1.1  mrg       rtx_insn *tmp = ptr->avail_stores.last ();
    589  1.1  mrg       if (BLOCK_FOR_INSN (tmp) != bb)
    590  1.1  mrg 	check_available = 1;
    591  1.1  mrg     }
    592  1.1  mrg   if (check_available)
    593  1.1  mrg     {
    594  1.1  mrg       /* Check that we have already reached the insn at that the check
    595  1.1  mrg 	 failed last time.  */
    596  1.1  mrg       if (LAST_AVAIL_CHECK_FAILURE (ptr))
    597  1.1  mrg 	{
    598  1.1  mrg 	  rtx_insn *tmp;
    599  1.1  mrg 	  for (tmp = BB_END (bb);
    600  1.1  mrg 	       tmp != insn && tmp != LAST_AVAIL_CHECK_FAILURE (ptr);
    601  1.1  mrg 	       tmp = PREV_INSN (tmp))
    602  1.1  mrg 	    continue;
    603  1.1  mrg 	  if (tmp == insn)
    604  1.1  mrg 	    check_available = 0;
    605  1.1  mrg 	}
    606  1.1  mrg       else
    607  1.1  mrg 	check_available = store_killed_after (dest, ptr->pattern_regs, insn,
    608  1.1  mrg 					      bb, regs_set_after,
    609  1.1  mrg 					      &LAST_AVAIL_CHECK_FAILURE (ptr));
    610  1.1  mrg     }
    611  1.1  mrg   if (!check_available)
    612  1.1  mrg     ptr->avail_stores.safe_push (insn);
    613  1.1  mrg }
    614  1.1  mrg 
    615  1.1  mrg /* Find available and anticipatable stores.  */
    616  1.1  mrg 
    617  1.1  mrg static int
    618  1.1  mrg compute_store_table (void)
    619  1.1  mrg {
    620  1.1  mrg   int ret;
    621  1.1  mrg   basic_block bb;
    622  1.1  mrg   rtx_insn *insn;
    623  1.1  mrg   rtx_insn *tmp;
    624  1.1  mrg   df_ref def;
    625  1.1  mrg   int *last_set_in, *already_set;
    626  1.1  mrg   struct st_expr * ptr, **prev_next_ptr_ptr;
    627  1.1  mrg   unsigned int max_gcse_regno = max_reg_num ();
    628  1.1  mrg 
    629  1.1  mrg   store_motion_mems = NULL;
    630  1.1  mrg   store_motion_mems_table = new hash_table<st_expr_hasher> (13);
    631  1.1  mrg   last_set_in = XCNEWVEC (int, max_gcse_regno);
    632  1.1  mrg   already_set = XNEWVEC (int, max_gcse_regno);
    633  1.1  mrg 
    634  1.1  mrg   /* Find all the stores we care about.  */
    635  1.1  mrg   FOR_EACH_BB_FN (bb, cfun)
    636  1.1  mrg     {
    637  1.1  mrg       /* First compute the registers set in this block.  */
    638  1.1  mrg       FOR_BB_INSNS (bb, insn)
    639  1.1  mrg 	{
    640  1.1  mrg 
    641  1.1  mrg 	  if (! NONDEBUG_INSN_P (insn))
    642  1.1  mrg 	    continue;
    643  1.1  mrg 
    644  1.1  mrg 	  FOR_EACH_INSN_DEF (def, insn)
    645  1.1  mrg 	    last_set_in[DF_REF_REGNO (def)] = INSN_UID (insn);
    646  1.1  mrg 	}
    647  1.1  mrg 
    648  1.1  mrg       /* Now find the stores.  */
    649  1.1  mrg       memset (already_set, 0, sizeof (int) * max_gcse_regno);
    650  1.1  mrg       FOR_BB_INSNS (bb, insn)
    651  1.1  mrg 	{
    652  1.1  mrg 	  if (! NONDEBUG_INSN_P (insn))
    653  1.1  mrg 	    continue;
    654  1.1  mrg 
    655  1.1  mrg 	  FOR_EACH_INSN_DEF (def, insn)
    656  1.1  mrg 	    already_set[DF_REF_REGNO (def)] = INSN_UID (insn);
    657  1.1  mrg 
    658  1.1  mrg 	  /* Now that we've marked regs, look for stores.  */
    659  1.1  mrg 	  find_moveable_store (insn, already_set, last_set_in);
    660  1.1  mrg 
    661  1.1  mrg 	  /* Unmark regs that are no longer set.  */
    662  1.1  mrg 	  FOR_EACH_INSN_DEF (def, insn)
    663  1.1  mrg 	    if (last_set_in[DF_REF_REGNO (def)] == INSN_UID (insn))
    664  1.1  mrg 	      last_set_in[DF_REF_REGNO (def)] = 0;
    665  1.1  mrg 	}
    666  1.1  mrg 
    667  1.1  mrg       if (flag_checking)
    668  1.1  mrg 	{
    669  1.1  mrg 	  /* last_set_in should now be all-zero.  */
    670  1.1  mrg 	  for (unsigned regno = 0; regno < max_gcse_regno; regno++)
    671  1.1  mrg 	    gcc_assert (!last_set_in[regno]);
    672  1.1  mrg 	}
    673  1.1  mrg 
    674  1.1  mrg       /* Clear temporary marks.  */
    675  1.1  mrg       for (ptr = first_st_expr (); ptr != NULL; ptr = next_st_expr (ptr))
    676  1.1  mrg 	{
    677  1.1  mrg 	  LAST_AVAIL_CHECK_FAILURE (ptr) = NULL_RTX;
    678  1.1  mrg 	  if (!ptr->antic_stores.is_empty ()
    679  1.1  mrg 	      && (tmp = ptr->antic_stores.last ()) == NULL)
    680  1.1  mrg 	    ptr->antic_stores.pop ();
    681  1.1  mrg 	}
    682  1.1  mrg     }
    683  1.1  mrg 
    684  1.1  mrg   /* Remove the stores that are not available anywhere, as there will
    685  1.1  mrg      be no opportunity to optimize them.  */
    686  1.1  mrg   for (ptr = store_motion_mems, prev_next_ptr_ptr = &store_motion_mems;
    687  1.1  mrg        ptr != NULL;
    688  1.1  mrg        ptr = *prev_next_ptr_ptr)
    689  1.1  mrg     {
    690  1.1  mrg       if (ptr->avail_stores.is_empty ())
    691  1.1  mrg 	{
    692  1.1  mrg 	  *prev_next_ptr_ptr = ptr->next;
    693  1.1  mrg 	  store_motion_mems_table->remove_elt_with_hash (ptr, ptr->hash_index);
    694  1.1  mrg 	  free_st_expr_entry (ptr);
    695  1.1  mrg 	}
    696  1.1  mrg       else
    697  1.1  mrg 	prev_next_ptr_ptr = &ptr->next;
    698  1.1  mrg     }
    699  1.1  mrg 
    700  1.1  mrg   ret = enumerate_store_motion_mems ();
    701  1.1  mrg 
    702  1.1  mrg   if (dump_file)
    703  1.1  mrg     print_store_motion_mems (dump_file);
    704  1.1  mrg 
    705  1.1  mrg   free (last_set_in);
    706  1.1  mrg   free (already_set);
    707  1.1  mrg   return ret;
    708  1.1  mrg }
    709  1.1  mrg 
    710  1.1  mrg /* In all code following after this, REACHING_REG has its original
    711  1.1  mrg    meaning again.  Avoid confusion, and undef the accessor macro for
    712  1.1  mrg    the temporary marks usage in compute_store_table.  */
    713  1.1  mrg #undef LAST_AVAIL_CHECK_FAILURE
    714  1.1  mrg 
    715  1.1  mrg /* Insert an instruction at the beginning of a basic block, and update
    716  1.1  mrg    the BB_HEAD if needed.  */
    717  1.1  mrg 
    718  1.1  mrg static void
    719  1.1  mrg insert_insn_start_basic_block (rtx_insn *insn, basic_block bb)
    720  1.1  mrg {
    721  1.1  mrg   /* Insert at start of successor block.  */
    722  1.1  mrg   rtx_insn *prev = PREV_INSN (BB_HEAD (bb));
    723  1.1  mrg   rtx_insn *before = BB_HEAD (bb);
    724  1.1  mrg   while (before != 0)
    725  1.1  mrg     {
    726  1.1  mrg       if (! LABEL_P (before)
    727  1.1  mrg 	  && !NOTE_INSN_BASIC_BLOCK_P (before))
    728  1.1  mrg 	break;
    729  1.1  mrg       prev = before;
    730  1.1  mrg       if (prev == BB_END (bb))
    731  1.1  mrg 	break;
    732  1.1  mrg       before = NEXT_INSN (before);
    733  1.1  mrg     }
    734  1.1  mrg 
    735  1.1  mrg   insn = emit_insn_after_noloc (insn, prev, bb);
    736  1.1  mrg 
    737  1.1  mrg   if (dump_file)
    738  1.1  mrg     {
    739  1.1  mrg       fprintf (dump_file, "STORE_MOTION  insert store at start of BB %d:\n",
    740  1.1  mrg 	       bb->index);
    741  1.1  mrg       print_inline_rtx (dump_file, insn, 6);
    742  1.1  mrg       fprintf (dump_file, "\n");
    743  1.1  mrg     }
    744  1.1  mrg }
    745  1.1  mrg 
    746  1.1  mrg /* This routine will insert a store on an edge. EXPR is the st_expr entry for
    747  1.1  mrg    the memory reference, and E is the edge to insert it on.  Returns nonzero
    748  1.1  mrg    if an edge insertion was performed.  */
    749  1.1  mrg 
    750  1.1  mrg static int
    751  1.1  mrg insert_store (struct st_expr * expr, edge e)
    752  1.1  mrg {
    753  1.1  mrg   rtx reg;
    754  1.1  mrg   rtx_insn *insn;
    755  1.1  mrg   basic_block bb;
    756  1.1  mrg   edge tmp;
    757  1.1  mrg   edge_iterator ei;
    758  1.1  mrg 
    759  1.1  mrg   /* We did all the deleted before this insert, so if we didn't delete a
    760  1.1  mrg      store, then we haven't set the reaching reg yet either.  */
    761  1.1  mrg   if (expr->reaching_reg == NULL_RTX)
    762  1.1  mrg     return 0;
    763  1.1  mrg 
    764  1.1  mrg   if (e->flags & EDGE_FAKE)
    765  1.1  mrg     return 0;
    766  1.1  mrg 
    767  1.1  mrg   reg = expr->reaching_reg;
    768  1.1  mrg   insn = gen_move_insn (copy_rtx (expr->pattern), reg);
    769  1.1  mrg 
    770  1.1  mrg   /* If we are inserting this expression on ALL predecessor edges of a BB,
    771  1.1  mrg      insert it at the start of the BB, and reset the insert bits on the other
    772  1.1  mrg      edges so we don't try to insert it on the other edges.  */
    773  1.1  mrg   bb = e->dest;
    774  1.1  mrg   FOR_EACH_EDGE (tmp, ei, e->dest->preds)
    775  1.1  mrg     if (!(tmp->flags & EDGE_FAKE))
    776  1.1  mrg       {
    777  1.1  mrg 	int index = EDGE_INDEX (edge_list, tmp->src, tmp->dest);
    778  1.1  mrg 
    779  1.1  mrg 	gcc_assert (index != EDGE_INDEX_NO_EDGE);
    780  1.1  mrg 	if (! bitmap_bit_p (st_insert_map[index], expr->index))
    781  1.1  mrg 	  break;
    782  1.1  mrg       }
    783  1.1  mrg 
    784  1.1  mrg   /* If tmp is NULL, we found an insertion on every edge, blank the
    785  1.1  mrg      insertion vector for these edges, and insert at the start of the BB.  */
    786  1.1  mrg   if (!tmp && bb != EXIT_BLOCK_PTR_FOR_FN (cfun))
    787  1.1  mrg     {
    788  1.1  mrg       FOR_EACH_EDGE (tmp, ei, e->dest->preds)
    789  1.1  mrg 	{
    790  1.1  mrg 	  int index = EDGE_INDEX (edge_list, tmp->src, tmp->dest);
    791  1.1  mrg 	  bitmap_clear_bit (st_insert_map[index], expr->index);
    792  1.1  mrg 	}
    793  1.1  mrg       insert_insn_start_basic_block (insn, bb);
    794  1.1  mrg       return 0;
    795  1.1  mrg     }
    796  1.1  mrg 
    797  1.1  mrg   /* We can't put stores in the front of blocks pointed to by abnormal
    798  1.1  mrg      edges since that may put a store where one didn't used to be.  */
    799  1.1  mrg   gcc_assert (!(e->flags & EDGE_ABNORMAL));
    800  1.1  mrg 
    801  1.1  mrg   insert_insn_on_edge (insn, e);
    802  1.1  mrg 
    803  1.1  mrg   if (dump_file)
    804  1.1  mrg     {
    805  1.1  mrg       fprintf (dump_file, "STORE_MOTION  insert insn on edge (%d, %d):\n",
    806  1.1  mrg 	       e->src->index, e->dest->index);
    807  1.1  mrg       print_inline_rtx (dump_file, insn, 6);
    808  1.1  mrg       fprintf (dump_file, "\n");
    809  1.1  mrg     }
    810  1.1  mrg 
    811  1.1  mrg   return 1;
    812  1.1  mrg }
    813  1.1  mrg 
    814  1.1  mrg /* Remove any REG_EQUAL or REG_EQUIV notes containing a reference to the
    815  1.1  mrg    memory location in SMEXPR set in basic block BB.
    816  1.1  mrg 
    817  1.1  mrg    This could be rather expensive.  */
    818  1.1  mrg 
    819  1.1  mrg static void
    820  1.1  mrg remove_reachable_equiv_notes (basic_block bb, struct st_expr *smexpr)
    821  1.1  mrg {
    822  1.1  mrg   edge_iterator *stack, ei;
    823  1.1  mrg   int sp;
    824  1.1  mrg   edge act;
    825  1.1  mrg   auto_sbitmap visited (last_basic_block_for_fn (cfun));
    826  1.1  mrg   rtx note;
    827  1.1  mrg   rtx_insn *insn;
    828  1.1  mrg   rtx mem = smexpr->pattern;
    829  1.1  mrg 
    830  1.1  mrg   stack = XNEWVEC (edge_iterator, n_basic_blocks_for_fn (cfun));
    831  1.1  mrg   sp = 0;
    832  1.1  mrg   ei = ei_start (bb->succs);
    833  1.1  mrg 
    834  1.1  mrg   bitmap_clear (visited);
    835  1.1  mrg 
    836  1.1  mrg   act = (EDGE_COUNT (ei_container (ei))
    837  1.1  mrg 	 ? EDGE_I (ei_container (ei), 0)
    838  1.1  mrg 	 : NULL);
    839  1.1  mrg   for (;;)
    840  1.1  mrg     {
    841  1.1  mrg       if (!act)
    842  1.1  mrg 	{
    843  1.1  mrg 	  if (!sp)
    844  1.1  mrg 	    {
    845  1.1  mrg 	      free (stack);
    846  1.1  mrg 	      return;
    847  1.1  mrg 	    }
    848  1.1  mrg 	  act = ei_edge (stack[--sp]);
    849  1.1  mrg 	}
    850  1.1  mrg       bb = act->dest;
    851  1.1  mrg 
    852  1.1  mrg       if (bb == EXIT_BLOCK_PTR_FOR_FN (cfun)
    853  1.1  mrg 	  || bitmap_bit_p (visited, bb->index))
    854  1.1  mrg 	{
    855  1.1  mrg 	  if (!ei_end_p (ei))
    856  1.1  mrg 	      ei_next (&ei);
    857  1.1  mrg 	  act = (! ei_end_p (ei)) ? ei_edge (ei) : NULL;
    858  1.1  mrg 	  continue;
    859  1.1  mrg 	}
    860  1.1  mrg       bitmap_set_bit (visited, bb->index);
    861  1.1  mrg 
    862  1.1  mrg       rtx_insn *last;
    863  1.1  mrg       if (bitmap_bit_p (st_antloc[bb->index], smexpr->index))
    864  1.1  mrg 	{
    865  1.1  mrg 	  unsigned int i;
    866  1.1  mrg 	  FOR_EACH_VEC_ELT_REVERSE (smexpr->antic_stores, i, last)
    867  1.1  mrg 	    if (BLOCK_FOR_INSN (last) == bb)
    868  1.1  mrg 	      break;
    869  1.1  mrg 	}
    870  1.1  mrg       else
    871  1.1  mrg 	last = NEXT_INSN (BB_END (bb));
    872  1.1  mrg 
    873  1.1  mrg       for (insn = BB_HEAD (bb); insn != last; insn = NEXT_INSN (insn))
    874  1.1  mrg 	if (NONDEBUG_INSN_P (insn))
    875  1.1  mrg 	  {
    876  1.1  mrg 	    note = find_reg_equal_equiv_note (insn);
    877  1.1  mrg 	    if (!note || !exp_equiv_p (XEXP (note, 0), mem, 0, true))
    878  1.1  mrg 	      continue;
    879  1.1  mrg 
    880  1.1  mrg 	    if (dump_file)
    881  1.1  mrg 	      fprintf (dump_file,
    882  1.1  mrg 		       "STORE_MOTION  drop REG_EQUAL note at insn %d:\n",
    883  1.1  mrg 		       INSN_UID (insn));
    884  1.1  mrg 	    remove_note (insn, note);
    885  1.1  mrg 	  }
    886  1.1  mrg 
    887  1.1  mrg       if (!ei_end_p (ei))
    888  1.1  mrg 	ei_next (&ei);
    889  1.1  mrg       act = (! ei_end_p (ei)) ? ei_edge (ei) : NULL;
    890  1.1  mrg 
    891  1.1  mrg       if (EDGE_COUNT (bb->succs) > 0)
    892  1.1  mrg 	{
    893  1.1  mrg 	  if (act)
    894  1.1  mrg 	    stack[sp++] = ei;
    895  1.1  mrg 	  ei = ei_start (bb->succs);
    896  1.1  mrg 	  act = (EDGE_COUNT (ei_container (ei))
    897  1.1  mrg 		 ? EDGE_I (ei_container (ei), 0)
    898  1.1  mrg 		 : NULL);
    899  1.1  mrg 	}
    900  1.1  mrg     }
    901  1.1  mrg }
    902  1.1  mrg 
    903  1.1  mrg /* This routine will replace a store with a SET to a specified register.  */
    904  1.1  mrg 
    905  1.1  mrg static void
    906  1.1  mrg replace_store_insn (rtx reg, rtx_insn *del, basic_block bb,
    907  1.1  mrg 		    struct st_expr *smexpr)
    908  1.1  mrg {
    909  1.1  mrg   rtx_insn *insn;
    910  1.1  mrg   rtx mem, note, set;
    911  1.1  mrg 
    912  1.1  mrg   insn = prepare_copy_insn (reg, SET_SRC (single_set (del)));
    913  1.1  mrg 
    914  1.1  mrg   unsigned int i;
    915  1.1  mrg   rtx_insn *temp;
    916  1.1  mrg   FOR_EACH_VEC_ELT_REVERSE (smexpr->antic_stores, i, temp)
    917  1.1  mrg     if (temp == del)
    918  1.1  mrg       {
    919  1.1  mrg 	smexpr->antic_stores[i] = insn;
    920  1.1  mrg 	break;
    921  1.1  mrg       }
    922  1.1  mrg 
    923  1.1  mrg   /* Move the notes from the deleted insn to its replacement.  */
    924  1.1  mrg   REG_NOTES (insn) = REG_NOTES (del);
    925  1.1  mrg 
    926  1.1  mrg   /* Emit the insn AFTER all the notes are transferred.
    927  1.1  mrg      This is cheaper since we avoid df rescanning for the note change.  */
    928  1.1  mrg   insn = emit_insn_after (insn, del);
    929  1.1  mrg 
    930  1.1  mrg   if (dump_file)
    931  1.1  mrg     {
    932  1.1  mrg       fprintf (dump_file,
    933  1.1  mrg 	       "STORE_MOTION  delete insn in BB %d:\n      ", bb->index);
    934  1.1  mrg       print_inline_rtx (dump_file, del, 6);
    935  1.1  mrg       fprintf (dump_file, "\nSTORE_MOTION  replaced with insn:\n      ");
    936  1.1  mrg       print_inline_rtx (dump_file, insn, 6);
    937  1.1  mrg       fprintf (dump_file, "\n");
    938  1.1  mrg     }
    939  1.1  mrg 
    940  1.1  mrg   delete_insn (del);
    941  1.1  mrg 
    942  1.1  mrg   /* Now we must handle REG_EQUAL notes whose contents is equal to the mem;
    943  1.1  mrg      they are no longer accurate provided that they are reached by this
    944  1.1  mrg      definition, so drop them.  */
    945  1.1  mrg   mem = smexpr->pattern;
    946  1.1  mrg   for (; insn != NEXT_INSN (BB_END (bb)); insn = NEXT_INSN (insn))
    947  1.1  mrg     if (NONDEBUG_INSN_P (insn))
    948  1.1  mrg       {
    949  1.1  mrg 	set = single_set (insn);
    950  1.1  mrg 	if (!set)
    951  1.1  mrg 	  continue;
    952  1.1  mrg 	if (exp_equiv_p (SET_DEST (set), mem, 0, true))
    953  1.1  mrg 	  return;
    954  1.1  mrg 	note = find_reg_equal_equiv_note (insn);
    955  1.1  mrg 	if (!note || !exp_equiv_p (XEXP (note, 0), mem, 0, true))
    956  1.1  mrg 	  continue;
    957  1.1  mrg 
    958  1.1  mrg 	if (dump_file)
    959  1.1  mrg 	  fprintf (dump_file, "STORE_MOTION  drop REG_EQUAL note at insn %d:\n",
    960  1.1  mrg 		   INSN_UID (insn));
    961  1.1  mrg 	remove_note (insn, note);
    962  1.1  mrg       }
    963  1.1  mrg   remove_reachable_equiv_notes (bb, smexpr);
    964  1.1  mrg }
    965  1.1  mrg 
    966  1.1  mrg 
    967  1.1  mrg /* Delete a store, but copy the value that would have been stored into
    968  1.1  mrg    the reaching_reg for later storing.  */
    969  1.1  mrg 
    970  1.1  mrg static void
    971  1.1  mrg delete_store (struct st_expr * expr, basic_block bb)
    972  1.1  mrg {
    973  1.1  mrg   rtx reg;
    974  1.1  mrg 
    975  1.1  mrg   if (expr->reaching_reg == NULL_RTX)
    976  1.1  mrg     expr->reaching_reg = gen_reg_rtx_and_attrs (expr->pattern);
    977  1.1  mrg 
    978  1.1  mrg   reg = expr->reaching_reg;
    979  1.1  mrg 
    980  1.1  mrg   unsigned int len = expr->avail_stores.length ();
    981  1.1  mrg   for (unsigned int i = len - 1; i < len; i--)
    982  1.1  mrg     {
    983  1.1  mrg       rtx_insn *del = expr->avail_stores[i];
    984  1.1  mrg       if (BLOCK_FOR_INSN (del) == bb)
    985  1.1  mrg 	{
    986  1.1  mrg 	  /* We know there is only one since we deleted redundant
    987  1.1  mrg 	     ones during the available computation.  */
    988  1.1  mrg 	  replace_store_insn (reg, del, bb, expr);
    989  1.1  mrg 	  break;
    990  1.1  mrg 	}
    991  1.1  mrg     }
    992  1.1  mrg }
    993  1.1  mrg 
    994  1.1  mrg /* Fill in available, anticipatable, transparent and kill vectors in
    995  1.1  mrg    STORE_DATA, based on lists of available and anticipatable stores.  */
    996  1.1  mrg static void
    997  1.1  mrg build_store_vectors (void)
    998  1.1  mrg {
    999  1.1  mrg   basic_block bb;
   1000  1.1  mrg   int *regs_set_in_block;
   1001  1.1  mrg   rtx_insn *insn;
   1002  1.1  mrg   struct st_expr * ptr;
   1003  1.1  mrg   unsigned int max_gcse_regno = max_reg_num ();
   1004  1.1  mrg 
   1005  1.1  mrg   /* Build the gen_vector. This is any store in the table which is not killed
   1006  1.1  mrg      by aliasing later in its block.  */
   1007  1.1  mrg   st_avloc = sbitmap_vector_alloc (last_basic_block_for_fn (cfun),
   1008  1.1  mrg 				   num_stores);
   1009  1.1  mrg   bitmap_vector_clear (st_avloc, last_basic_block_for_fn (cfun));
   1010  1.1  mrg 
   1011  1.1  mrg   st_antloc = sbitmap_vector_alloc (last_basic_block_for_fn (cfun),
   1012  1.1  mrg 				    num_stores);
   1013  1.1  mrg   bitmap_vector_clear (st_antloc, last_basic_block_for_fn (cfun));
   1014  1.1  mrg 
   1015  1.1  mrg   for (ptr = first_st_expr (); ptr != NULL; ptr = next_st_expr (ptr))
   1016  1.1  mrg     {
   1017  1.1  mrg       unsigned int len = ptr->avail_stores.length ();
   1018  1.1  mrg       for (unsigned int i = len - 1; i < len; i--)
   1019  1.1  mrg 	{
   1020  1.1  mrg 	  insn = ptr->avail_stores[i];
   1021  1.1  mrg 	  bb = BLOCK_FOR_INSN (insn);
   1022  1.1  mrg 
   1023  1.1  mrg 	  /* If we've already seen an available expression in this block,
   1024  1.1  mrg 	     we can delete this one (It occurs earlier in the block). We'll
   1025  1.1  mrg 	     copy the SRC expression to an unused register in case there
   1026  1.1  mrg 	     are any side effects.  */
   1027  1.1  mrg 	  if (bitmap_bit_p (st_avloc[bb->index], ptr->index))
   1028  1.1  mrg 	    {
   1029  1.1  mrg 	      rtx r = gen_reg_rtx_and_attrs (ptr->pattern);
   1030  1.1  mrg 	      if (dump_file)
   1031  1.1  mrg 		fprintf (dump_file, "Removing redundant store:\n");
   1032  1.1  mrg 	      replace_store_insn (r, insn, bb, ptr);
   1033  1.1  mrg 	      continue;
   1034  1.1  mrg 	    }
   1035  1.1  mrg 	  bitmap_set_bit (st_avloc[bb->index], ptr->index);
   1036  1.1  mrg 	}
   1037  1.1  mrg 
   1038  1.1  mrg       unsigned int i;
   1039  1.1  mrg       FOR_EACH_VEC_ELT_REVERSE (ptr->antic_stores, i, insn)
   1040  1.1  mrg 	{
   1041  1.1  mrg 	  bb = BLOCK_FOR_INSN (insn);
   1042  1.1  mrg 	  bitmap_set_bit (st_antloc[bb->index], ptr->index);
   1043  1.1  mrg 	}
   1044  1.1  mrg     }
   1045  1.1  mrg 
   1046  1.1  mrg   st_kill = sbitmap_vector_alloc (last_basic_block_for_fn (cfun), num_stores);
   1047  1.1  mrg   bitmap_vector_clear (st_kill, last_basic_block_for_fn (cfun));
   1048  1.1  mrg 
   1049  1.1  mrg   st_transp = sbitmap_vector_alloc (last_basic_block_for_fn (cfun), num_stores);
   1050  1.1  mrg   bitmap_vector_clear (st_transp, last_basic_block_for_fn (cfun));
   1051  1.1  mrg   regs_set_in_block = XNEWVEC (int, max_gcse_regno);
   1052  1.1  mrg 
   1053  1.1  mrg   FOR_EACH_BB_FN (bb, cfun)
   1054  1.1  mrg     {
   1055  1.1  mrg       memset (regs_set_in_block, 0, sizeof (int) * max_gcse_regno);
   1056  1.1  mrg 
   1057  1.1  mrg       FOR_BB_INSNS (bb, insn)
   1058  1.1  mrg 	if (NONDEBUG_INSN_P (insn))
   1059  1.1  mrg 	  {
   1060  1.1  mrg 	    df_ref def;
   1061  1.1  mrg 	    FOR_EACH_INSN_DEF (def, insn)
   1062  1.1  mrg 	      {
   1063  1.1  mrg 		unsigned int ref_regno = DF_REF_REGNO (def);
   1064  1.1  mrg 		if (ref_regno < max_gcse_regno)
   1065  1.1  mrg 		  regs_set_in_block[DF_REF_REGNO (def)] = 1;
   1066  1.1  mrg 	      }
   1067  1.1  mrg 	  }
   1068  1.1  mrg 
   1069  1.1  mrg       for (ptr = first_st_expr (); ptr != NULL; ptr = next_st_expr (ptr))
   1070  1.1  mrg 	{
   1071  1.1  mrg 	  if (store_killed_after (ptr->pattern, ptr->pattern_regs, BB_HEAD (bb),
   1072  1.1  mrg 				  bb, regs_set_in_block, NULL))
   1073  1.1  mrg 	    {
   1074  1.1  mrg 	      /* It should not be necessary to consider the expression
   1075  1.1  mrg 		 killed if it is both anticipatable and available.  */
   1076  1.1  mrg 	      if (!bitmap_bit_p (st_antloc[bb->index], ptr->index)
   1077  1.1  mrg 		  || !bitmap_bit_p (st_avloc[bb->index], ptr->index))
   1078  1.1  mrg 		bitmap_set_bit (st_kill[bb->index], ptr->index);
   1079  1.1  mrg 	    }
   1080  1.1  mrg 	  else
   1081  1.1  mrg 	    bitmap_set_bit (st_transp[bb->index], ptr->index);
   1082  1.1  mrg 	}
   1083  1.1  mrg     }
   1084  1.1  mrg 
   1085  1.1  mrg   free (regs_set_in_block);
   1086  1.1  mrg 
   1087  1.1  mrg   if (dump_file)
   1088  1.1  mrg     {
   1089  1.1  mrg       dump_bitmap_vector (dump_file, "st_antloc", "", st_antloc,
   1090  1.1  mrg 			  last_basic_block_for_fn (cfun));
   1091  1.1  mrg       dump_bitmap_vector (dump_file, "st_kill", "", st_kill,
   1092  1.1  mrg 			  last_basic_block_for_fn (cfun));
   1093  1.1  mrg       dump_bitmap_vector (dump_file, "st_transp", "", st_transp,
   1094  1.1  mrg 			  last_basic_block_for_fn (cfun));
   1095  1.1  mrg       dump_bitmap_vector (dump_file, "st_avloc", "", st_avloc,
   1096  1.1  mrg 			  last_basic_block_for_fn (cfun));
   1097  1.1  mrg     }
   1098  1.1  mrg }
   1099  1.1  mrg 
   1100  1.1  mrg /* Free memory used by store motion.  */
   1101  1.1  mrg 
   1102  1.1  mrg static void
   1103  1.1  mrg free_store_memory (void)
   1104  1.1  mrg {
   1105  1.1  mrg   free_store_motion_mems ();
   1106  1.1  mrg 
   1107  1.1  mrg   if (st_avloc)
   1108  1.1  mrg     sbitmap_vector_free (st_avloc);
   1109  1.1  mrg   if (st_kill)
   1110  1.1  mrg     sbitmap_vector_free (st_kill);
   1111  1.1  mrg   if (st_transp)
   1112  1.1  mrg     sbitmap_vector_free (st_transp);
   1113  1.1  mrg   if (st_antloc)
   1114  1.1  mrg     sbitmap_vector_free (st_antloc);
   1115  1.1  mrg   if (st_insert_map)
   1116  1.1  mrg     sbitmap_vector_free (st_insert_map);
   1117  1.1  mrg   if (st_delete_map)
   1118  1.1  mrg     sbitmap_vector_free (st_delete_map);
   1119  1.1  mrg 
   1120  1.1  mrg   st_avloc = st_kill = st_transp = st_antloc = NULL;
   1121  1.1  mrg   st_insert_map = st_delete_map = NULL;
   1122  1.1  mrg }
   1123  1.1  mrg 
   1124  1.1  mrg /* Perform store motion. Much like gcse, except we move expressions the
   1125  1.1  mrg    other way by looking at the flowgraph in reverse.
   1126  1.1  mrg    Return non-zero if transformations are performed by the pass.  */
   1127  1.1  mrg 
   1128  1.1  mrg static int
   1129  1.1  mrg one_store_motion_pass (void)
   1130  1.1  mrg {
   1131  1.1  mrg   basic_block bb;
   1132  1.1  mrg   int x;
   1133  1.1  mrg   struct st_expr * ptr;
   1134  1.1  mrg   int did_edge_inserts = 0;
   1135  1.1  mrg   int n_stores_deleted = 0;
   1136  1.1  mrg   int n_stores_created = 0;
   1137  1.1  mrg 
   1138  1.1  mrg   init_alias_analysis ();
   1139  1.1  mrg 
   1140  1.1  mrg   /* Find all the available and anticipatable stores.  */
   1141  1.1  mrg   num_stores = compute_store_table ();
   1142  1.1  mrg   if (num_stores == 0)
   1143  1.1  mrg     {
   1144  1.1  mrg       delete store_motion_mems_table;
   1145  1.1  mrg       store_motion_mems_table = NULL;
   1146  1.1  mrg       end_alias_analysis ();
   1147  1.1  mrg       return 0;
   1148  1.1  mrg     }
   1149  1.1  mrg 
   1150  1.1  mrg   /* Now compute kill & transp vectors.  */
   1151  1.1  mrg   build_store_vectors ();
   1152  1.1  mrg   connect_infinite_loops_to_exit ();
   1153  1.1  mrg 
   1154  1.1  mrg   edge_list = pre_edge_rev_lcm (num_stores, st_transp, st_avloc,
   1155  1.1  mrg 				st_antloc, st_kill, &st_insert_map,
   1156  1.1  mrg 				&st_delete_map);
   1157  1.1  mrg 
   1158  1.1  mrg   /* Now we want to insert the new stores which are going to be needed.  */
   1159  1.1  mrg   for (ptr = first_st_expr (); ptr != NULL; ptr = next_st_expr (ptr))
   1160  1.1  mrg     {
   1161  1.1  mrg       /* If any of the edges we have above are abnormal, we can't move this
   1162  1.1  mrg 	 store.  */
   1163  1.1  mrg       for (x = NUM_EDGES (edge_list) - 1; x >= 0; x--)
   1164  1.1  mrg 	if (bitmap_bit_p (st_insert_map[x], ptr->index)
   1165  1.1  mrg 	    && (INDEX_EDGE (edge_list, x)->flags & EDGE_ABNORMAL))
   1166  1.1  mrg 	  break;
   1167  1.1  mrg 
   1168  1.1  mrg       if (x >= 0)
   1169  1.1  mrg 	{
   1170  1.1  mrg 	  if (dump_file != NULL)
   1171  1.1  mrg 	    fprintf (dump_file,
   1172  1.1  mrg 		     "Can't replace store %d: abnormal edge from %d to %d\n",
   1173  1.1  mrg 		     ptr->index, INDEX_EDGE (edge_list, x)->src->index,
   1174  1.1  mrg 		     INDEX_EDGE (edge_list, x)->dest->index);
   1175  1.1  mrg 	  continue;
   1176  1.1  mrg 	}
   1177  1.1  mrg 
   1178  1.1  mrg       /* Now we want to insert the new stores which are going to be needed.  */
   1179  1.1  mrg 
   1180  1.1  mrg       FOR_EACH_BB_FN (bb, cfun)
   1181  1.1  mrg 	if (bitmap_bit_p (st_delete_map[bb->index], ptr->index))
   1182  1.1  mrg 	  {
   1183  1.1  mrg 	    delete_store (ptr, bb);
   1184  1.1  mrg 	    n_stores_deleted++;
   1185  1.1  mrg 	  }
   1186  1.1  mrg 
   1187  1.1  mrg       for (x = 0; x < NUM_EDGES (edge_list); x++)
   1188  1.1  mrg 	if (bitmap_bit_p (st_insert_map[x], ptr->index))
   1189  1.1  mrg 	  {
   1190  1.1  mrg 	    did_edge_inserts |= insert_store (ptr, INDEX_EDGE (edge_list, x));
   1191  1.1  mrg 	    n_stores_created++;
   1192  1.1  mrg 	  }
   1193  1.1  mrg     }
   1194  1.1  mrg 
   1195  1.1  mrg   if (did_edge_inserts)
   1196  1.1  mrg     commit_edge_insertions ();
   1197  1.1  mrg 
   1198  1.1  mrg   free_store_memory ();
   1199  1.1  mrg   free_edge_list (edge_list);
   1200  1.1  mrg   remove_fake_exit_edges ();
   1201  1.1  mrg   end_alias_analysis ();
   1202  1.1  mrg 
   1203  1.1  mrg   if (dump_file)
   1204  1.1  mrg     {
   1205  1.1  mrg       fprintf (dump_file, "STORE_MOTION of %s, %d basic blocks, ",
   1206  1.1  mrg 	       current_function_name (), n_basic_blocks_for_fn (cfun));
   1207  1.1  mrg       fprintf (dump_file, "%d insns deleted, %d insns created\n",
   1208  1.1  mrg 	       n_stores_deleted, n_stores_created);
   1209  1.1  mrg     }
   1210  1.1  mrg 
   1211  1.1  mrg   return (n_stores_deleted > 0 || n_stores_created > 0);
   1212  1.1  mrg }
   1213  1.1  mrg 
   1214  1.1  mrg 
   1215  1.1  mrg static unsigned int
   1217  1.1  mrg execute_rtl_store_motion (void)
   1218  1.1  mrg {
   1219  1.1  mrg   delete_unreachable_blocks ();
   1220  1.1  mrg   df_analyze ();
   1221  1.1  mrg   flag_rerun_cse_after_global_opts |= one_store_motion_pass ();
   1222  1.1  mrg   return 0;
   1223  1.1  mrg }
   1224  1.1  mrg 
   1225  1.1  mrg namespace {
   1226  1.1  mrg 
   1227  1.1  mrg const pass_data pass_data_rtl_store_motion =
   1228  1.1  mrg {
   1229  1.1  mrg   RTL_PASS, /* type */
   1230  1.1  mrg   "store_motion", /* name */
   1231  1.1  mrg   OPTGROUP_NONE, /* optinfo_flags */
   1232  1.1  mrg   TV_LSM, /* tv_id */
   1233  1.1  mrg   PROP_cfglayout, /* properties_required */
   1234  1.1  mrg   0, /* properties_provided */
   1235  1.1  mrg   0, /* properties_destroyed */
   1236  1.1  mrg   0, /* todo_flags_start */
   1237  1.1  mrg   TODO_df_finish, /* todo_flags_finish */
   1238  1.1  mrg };
   1239  1.1  mrg 
   1240  1.1  mrg class pass_rtl_store_motion : public rtl_opt_pass
   1241  1.1  mrg {
   1242  1.1  mrg public:
   1243  1.1  mrg   pass_rtl_store_motion (gcc::context *ctxt)
   1244  1.1  mrg     : rtl_opt_pass (pass_data_rtl_store_motion, ctxt)
   1245  1.1  mrg   {}
   1246  1.1  mrg 
   1247  1.1  mrg   /* opt_pass methods: */
   1248  1.1  mrg   virtual bool gate (function *);
   1249  1.1  mrg   virtual unsigned int execute (function *)
   1250  1.1  mrg     {
   1251  1.1  mrg       return execute_rtl_store_motion ();
   1252  1.1  mrg     }
   1253  1.1  mrg 
   1254  1.1  mrg }; // class pass_rtl_store_motion
   1255  1.1  mrg 
   1256  1.1  mrg bool
   1257  1.1  mrg pass_rtl_store_motion::gate (function *fun)
   1258  1.1  mrg {
   1259  1.1  mrg   return optimize > 0 && flag_gcse_sm
   1260  1.1  mrg     && !fun->calls_setjmp
   1261  1.1  mrg     && optimize_function_for_speed_p (fun)
   1262  1.1  mrg     && dbg_cnt (store_motion);
   1263  1.1  mrg }
   1264  1.1  mrg 
   1265  1.1  mrg } // anon namespace
   1266  1.1  mrg 
   1267  1.1  mrg rtl_opt_pass *
   1268  1.1  mrg make_pass_rtl_store_motion (gcc::context *ctxt)
   1269  1.1  mrg {
   1270             return new pass_rtl_store_motion (ctxt);
   1271           }
   1272