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