analyzer: fix feasibility false +ve on jumps through function ptrs [PR107582]
[platform/upstream/gcc.git] / gcc / dse.cc
1 /* RTL dead store elimination.
2    Copyright (C) 2005-2022 Free Software Foundation, Inc.
3
4    Contributed by Richard Sandiford <rsandifor@codesourcery.com>
5    and Kenneth Zadeck <zadeck@naturalbridge.com>
6
7 This file is part of GCC.
8
9 GCC is free software; you can redistribute it and/or modify it under
10 the terms of the GNU General Public License as published by the Free
11 Software Foundation; either version 3, or (at your option) any later
12 version.
13
14 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
15 WARRANTY; without even the implied warranty of MERCHANTABILITY or
16 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
17 for more details.
18
19 You should have received a copy of the GNU General Public License
20 along with GCC; see the file COPYING3.  If not see
21 <http://www.gnu.org/licenses/>.  */
22
23 #undef BASELINE
24
25 #include "config.h"
26 #include "system.h"
27 #include "coretypes.h"
28 #include "backend.h"
29 #include "target.h"
30 #include "rtl.h"
31 #include "tree.h"
32 #include "gimple.h"
33 #include "predict.h"
34 #include "df.h"
35 #include "memmodel.h"
36 #include "tm_p.h"
37 #include "gimple-ssa.h"
38 #include "expmed.h"
39 #include "optabs.h"
40 #include "emit-rtl.h"
41 #include "recog.h"
42 #include "alias.h"
43 #include "stor-layout.h"
44 #include "cfgrtl.h"
45 #include "cselib.h"
46 #include "tree-pass.h"
47 #include "explow.h"
48 #include "expr.h"
49 #include "dbgcnt.h"
50 #include "rtl-iter.h"
51 #include "cfgcleanup.h"
52 #include "calls.h"
53
54 /* This file contains three techniques for performing Dead Store
55    Elimination (dse).
56
57    * The first technique performs dse locally on any base address.  It
58    is based on the cselib which is a local value numbering technique.
59    This technique is local to a basic block but deals with a fairly
60    general addresses.
61
62    * The second technique performs dse globally but is restricted to
63    base addresses that are either constant or are relative to the
64    frame_pointer.
65
66    * The third technique, (which is only done after register allocation)
67    processes the spill slots.  This differs from the second
68    technique because it takes advantage of the fact that spilling is
69    completely free from the effects of aliasing.
70
71    Logically, dse is a backwards dataflow problem.  A store can be
72    deleted if it if cannot be reached in the backward direction by any
73    use of the value being stored.  However, the local technique uses a
74    forwards scan of the basic block because cselib requires that the
75    block be processed in that order.
76
77    The pass is logically broken into 7 steps:
78
79    0) Initialization.
80
81    1) The local algorithm, as well as scanning the insns for the two
82    global algorithms.
83
84    2) Analysis to see if the global algs are necessary.  In the case
85    of stores base on a constant address, there must be at least two
86    stores to that address, to make it possible to delete some of the
87    stores.  In the case of stores off of the frame or spill related
88    stores, only one store to an address is necessary because those
89    stores die at the end of the function.
90
91    3) Set up the global dataflow equations based on processing the
92    info parsed in the first step.
93
94    4) Solve the dataflow equations.
95
96    5) Delete the insns that the global analysis has indicated are
97    unnecessary.
98
99    6) Delete insns that store the same value as preceding store
100    where the earlier store couldn't be eliminated.
101
102    7) Cleanup.
103
104    This step uses cselib and canon_rtx to build the largest expression
105    possible for each address.  This pass is a forwards pass through
106    each basic block.  From the point of view of the global technique,
107    the first pass could examine a block in either direction.  The
108    forwards ordering is to accommodate cselib.
109
110    We make a simplifying assumption: addresses fall into four broad
111    categories:
112
113    1) base has rtx_varies_p == false, offset is constant.
114    2) base has rtx_varies_p == false, offset variable.
115    3) base has rtx_varies_p == true, offset constant.
116    4) base has rtx_varies_p == true, offset variable.
117
118    The local passes are able to process all 4 kinds of addresses.  The
119    global pass only handles 1).
120
121    The global problem is formulated as follows:
122
123      A store, S1, to address A, where A is not relative to the stack
124      frame, can be eliminated if all paths from S1 to the end of the
125      function contain another store to A before a read to A.
126
127      If the address A is relative to the stack frame, a store S2 to A
128      can be eliminated if there are no paths from S2 that reach the
129      end of the function that read A before another store to A.  In
130      this case S2 can be deleted if there are paths from S2 to the
131      end of the function that have no reads or writes to A.  This
132      second case allows stores to the stack frame to be deleted that
133      would otherwise die when the function returns.  This cannot be
134      done if stores_off_frame_dead_at_return is not true.  See the doc
135      for that variable for when this variable is false.
136
137      The global problem is formulated as a backwards set union
138      dataflow problem where the stores are the gens and reads are the
139      kills.  Set union problems are rare and require some special
140      handling given our representation of bitmaps.  A straightforward
141      implementation requires a lot of bitmaps filled with 1s.
142      These are expensive and cumbersome in our bitmap formulation so
143      care has been taken to avoid large vectors filled with 1s.  See
144      the comments in bb_info and in the dataflow confluence functions
145      for details.
146
147    There are two places for further enhancements to this algorithm:
148
149    1) The original dse which was embedded in a pass called flow also
150    did local address forwarding.  For example in
151
152    A <- r100
153    ... <- A
154
155    flow would replace the right hand side of the second insn with a
156    reference to r100.  Most of the information is available to add this
157    to this pass.  It has not done it because it is a lot of work in
158    the case that either r100 is assigned to between the first and
159    second insn and/or the second insn is a load of part of the value
160    stored by the first insn.
161
162    insn 5 in gcc.c-torture/compile/990203-1.c simple case.
163    insn 15 in gcc.c-torture/execute/20001017-2.c simple case.
164    insn 25 in gcc.c-torture/execute/20001026-1.c simple case.
165    insn 44 in gcc.c-torture/execute/20010910-1.c simple case.
166
167    2) The cleaning up of spill code is quite profitable.  It currently
168    depends on reading tea leaves and chicken entrails left by reload.
169    This pass depends on reload creating a singleton alias set for each
170    spill slot and telling the next dse pass which of these alias sets
171    are the singletons.  Rather than analyze the addresses of the
172    spills, dse's spill processing just does analysis of the loads and
173    stores that use those alias sets.  There are three cases where this
174    falls short:
175
176      a) Reload sometimes creates the slot for one mode of access, and
177      then inserts loads and/or stores for a smaller mode.  In this
178      case, the current code just punts on the slot.  The proper thing
179      to do is to back out and use one bit vector position for each
180      byte of the entity associated with the slot.  This depends on
181      KNOWING that reload always generates the accesses for each of the
182      bytes in some canonical (read that easy to understand several
183      passes after reload happens) way.
184
185      b) Reload sometimes decides that spill slot it allocated was not
186      large enough for the mode and goes back and allocates more slots
187      with the same mode and alias set.  The backout in this case is a
188      little more graceful than (a).  In this case the slot is unmarked
189      as being a spill slot and if final address comes out to be based
190      off the frame pointer, the global algorithm handles this slot.
191
192      c) For any pass that may prespill, there is currently no
193      mechanism to tell the dse pass that the slot being used has the
194      special properties that reload uses.  It may be that all that is
195      required is to have those passes make the same calls that reload
196      does, assuming that the alias sets can be manipulated in the same
197      way.  */
198
199 /* There are limits to the size of constant offsets we model for the
200    global problem.  There are certainly test cases, that exceed this
201    limit, however, it is unlikely that there are important programs
202    that really have constant offsets this size.  */
203 #define MAX_OFFSET (64 * 1024)
204
205 /* Obstack for the DSE dataflow bitmaps.  We don't want to put these
206    on the default obstack because these bitmaps can grow quite large
207    (~2GB for the small (!) test case of PR54146) and we'll hold on to
208    all that memory until the end of the compiler run.
209    As a bonus, delete_tree_live_info can destroy all the bitmaps by just
210    releasing the whole obstack.  */
211 static bitmap_obstack dse_bitmap_obstack;
212
213 /* Obstack for other data.  As for above: Kinda nice to be able to
214    throw it all away at the end in one big sweep.  */
215 static struct obstack dse_obstack;
216
217 /* Scratch bitmap for cselib's cselib_expand_value_rtx.  */
218 static bitmap scratch = NULL;
219
220 struct insn_info_type;
221
222 /* This structure holds information about a candidate store.  */
223 class store_info
224 {
225 public:
226
227   /* False means this is a clobber.  */
228   bool is_set;
229
230   /* False if a single HOST_WIDE_INT bitmap is used for positions_needed.  */
231   bool is_large;
232
233   /* The id of the mem group of the base address.  If rtx_varies_p is
234      true, this is -1.  Otherwise, it is the index into the group
235      table.  */
236   int group_id;
237
238   /* This is the cselib value.  */
239   cselib_val *cse_base;
240
241   /* This canonized mem.  */
242   rtx mem;
243
244   /* Canonized MEM address for use by canon_true_dependence.  */
245   rtx mem_addr;
246
247   /* The offset of the first byte associated with the operation.  */
248   poly_int64 offset;
249
250   /* The number of bytes covered by the operation.  This is always exact
251      and known (rather than -1).  */
252   poly_int64 width;
253
254   union
255     {
256       /* A bitmask as wide as the number of bytes in the word that
257          contains a 1 if the byte may be needed.  The store is unused if
258          all of the bits are 0.  This is used if IS_LARGE is false.  */
259       unsigned HOST_WIDE_INT small_bitmask;
260
261       struct
262         {
263           /* A bitmap with one bit per byte, or null if the number of
264              bytes isn't known at compile time.  A cleared bit means
265              the position is needed.  Used if IS_LARGE is true.  */
266           bitmap bmap;
267
268           /* When BITMAP is nonnull, this counts the number of set bits
269              (i.e. unneeded bytes) in the bitmap.  If it is equal to
270              WIDTH, the whole store is unused.
271
272              When BITMAP is null:
273              - the store is definitely not needed when COUNT == 1
274              - all the store is needed when COUNT == 0 and RHS is nonnull
275              - otherwise we don't know which parts of the store are needed.  */
276           int count;
277         } large;
278     } positions_needed;
279
280   /* The next store info for this insn.  */
281   class store_info *next;
282
283   /* The right hand side of the store.  This is used if there is a
284      subsequent reload of the mems address somewhere later in the
285      basic block.  */
286   rtx rhs;
287
288   /* If rhs is or holds a constant, this contains that constant,
289      otherwise NULL.  */
290   rtx const_rhs;
291
292   /* Set if this store stores the same constant value as REDUNDANT_REASON
293      insn stored.  These aren't eliminated early, because doing that
294      might prevent the earlier larger store to be eliminated.  */
295   struct insn_info_type *redundant_reason;
296 };
297
298 /* Return a bitmask with the first N low bits set.  */
299
300 static unsigned HOST_WIDE_INT
301 lowpart_bitmask (int n)
302 {
303   unsigned HOST_WIDE_INT mask = HOST_WIDE_INT_M1U;
304   return mask >> (HOST_BITS_PER_WIDE_INT - n);
305 }
306
307 static object_allocator<store_info> cse_store_info_pool ("cse_store_info_pool");
308
309 static object_allocator<store_info> rtx_store_info_pool ("rtx_store_info_pool");
310
311 /* This structure holds information about a load.  These are only
312    built for rtx bases.  */
313 class read_info_type
314 {
315 public:
316   /* The id of the mem group of the base address.  */
317   int group_id;
318
319   /* The offset of the first byte associated with the operation.  */
320   poly_int64 offset;
321
322   /* The number of bytes covered by the operation, or -1 if not known.  */
323   poly_int64 width;
324
325   /* The mem being read.  */
326   rtx mem;
327
328   /* The next read_info for this insn.  */
329   class read_info_type *next;
330 };
331 typedef class read_info_type *read_info_t;
332
333 static object_allocator<read_info_type> read_info_type_pool ("read_info_pool");
334
335 /* One of these records is created for each insn.  */
336
337 struct insn_info_type
338 {
339   /* Set true if the insn contains a store but the insn itself cannot
340      be deleted.  This is set if the insn is a parallel and there is
341      more than one non dead output or if the insn is in some way
342      volatile.  */
343   bool cannot_delete;
344
345   /* This field is only used by the global algorithm.  It is set true
346      if the insn contains any read of mem except for a (1).  This is
347      also set if the insn is a call or has a clobber mem.  If the insn
348      contains a wild read, the use_rec will be null.  */
349   bool wild_read;
350
351   /* This is true only for CALL instructions which could potentially read
352      any non-frame memory location. This field is used by the global
353      algorithm.  */
354   bool non_frame_wild_read;
355
356   /* This field is only used for the processing of const functions.
357      These functions cannot read memory, but they can read the stack
358      because that is where they may get their parms.  We need to be
359      this conservative because, like the store motion pass, we don't
360      consider CALL_INSN_FUNCTION_USAGE when processing call insns.
361      Moreover, we need to distinguish two cases:
362      1. Before reload (register elimination), the stores related to
363         outgoing arguments are stack pointer based and thus deemed
364         of non-constant base in this pass.  This requires special
365         handling but also means that the frame pointer based stores
366         need not be killed upon encountering a const function call.
367      2. After reload, the stores related to outgoing arguments can be
368         either stack pointer or hard frame pointer based.  This means
369         that we have no other choice than also killing all the frame
370         pointer based stores upon encountering a const function call.
371      This field is set after reload for const function calls and before
372      reload for const tail function calls on targets where arg pointer
373      is the frame pointer.  Having this set is less severe than a wild
374      read, it just means that all the frame related stores are killed
375      rather than all the stores.  */
376   bool frame_read;
377
378   /* This field is only used for the processing of const functions.
379      It is set if the insn may contain a stack pointer based store.  */
380   bool stack_pointer_based;
381
382   /* This is true if any of the sets within the store contains a
383      cselib base.  Such stores can only be deleted by the local
384      algorithm.  */
385   bool contains_cselib_groups;
386
387   /* The insn. */
388   rtx_insn *insn;
389
390   /* The list of mem sets or mem clobbers that are contained in this
391      insn.  If the insn is deletable, it contains only one mem set.
392      But it could also contain clobbers.  Insns that contain more than
393      one mem set are not deletable, but each of those mems are here in
394      order to provide info to delete other insns.  */
395   store_info *store_rec;
396
397   /* The linked list of mem uses in this insn.  Only the reads from
398      rtx bases are listed here.  The reads to cselib bases are
399      completely processed during the first scan and so are never
400      created.  */
401   read_info_t read_rec;
402
403   /* The live fixed registers.  We assume only fixed registers can
404      cause trouble by being clobbered from an expanded pattern;
405      storing only the live fixed registers (rather than all registers)
406      means less memory needs to be allocated / copied for the individual
407      stores.  */
408   regset fixed_regs_live;
409
410   /* The prev insn in the basic block.  */
411   struct insn_info_type * prev_insn;
412
413   /* The linked list of insns that are in consideration for removal in
414      the forwards pass through the basic block.  This pointer may be
415      trash as it is not cleared when a wild read occurs.  The only
416      time it is guaranteed to be correct is when the traversal starts
417      at active_local_stores.  */
418   struct insn_info_type * next_local_store;
419 };
420 typedef struct insn_info_type *insn_info_t;
421
422 static object_allocator<insn_info_type> insn_info_type_pool ("insn_info_pool");
423
424 /* The linked list of stores that are under consideration in this
425    basic block.  */
426 static insn_info_t active_local_stores;
427 static int active_local_stores_len;
428
429 struct dse_bb_info_type
430 {
431   /* Pointer to the insn info for the last insn in the block.  These
432      are linked so this is how all of the insns are reached.  During
433      scanning this is the current insn being scanned.  */
434   insn_info_t last_insn;
435
436   /* The info for the global dataflow problem.  */
437
438
439   /* This is set if the transfer function should and in the wild_read
440      bitmap before applying the kill and gen sets.  That vector knocks
441      out most of the bits in the bitmap and thus speeds up the
442      operations.  */
443   bool apply_wild_read;
444
445   /* The following 4 bitvectors hold information about which positions
446      of which stores are live or dead.  They are indexed by
447      get_bitmap_index.  */
448
449   /* The set of store positions that exist in this block before a wild read.  */
450   bitmap gen;
451
452   /* The set of load positions that exist in this block above the
453      same position of a store.  */
454   bitmap kill;
455
456   /* The set of stores that reach the top of the block without being
457      killed by a read.
458
459      Do not represent the in if it is all ones.  Note that this is
460      what the bitvector should logically be initialized to for a set
461      intersection problem.  However, like the kill set, this is too
462      expensive.  So initially, the in set will only be created for the
463      exit block and any block that contains a wild read.  */
464   bitmap in;
465
466   /* The set of stores that reach the bottom of the block from it's
467      successors.
468
469      Do not represent the in if it is all ones.  Note that this is
470      what the bitvector should logically be initialized to for a set
471      intersection problem.  However, like the kill and in set, this is
472      too expensive.  So what is done is that the confluence operator
473      just initializes the vector from one of the out sets of the
474      successors of the block.  */
475   bitmap out;
476
477   /* The following bitvector is indexed by the reg number.  It
478      contains the set of regs that are live at the current instruction
479      being processed.  While it contains info for all of the
480      registers, only the hard registers are actually examined.  It is used
481      to assure that shift and/or add sequences that are inserted do not
482      accidentally clobber live hard regs.  */
483   bitmap regs_live;
484 };
485
486 typedef struct dse_bb_info_type *bb_info_t;
487
488 static object_allocator<dse_bb_info_type> dse_bb_info_type_pool
489   ("bb_info_pool");
490
491 /* Table to hold all bb_infos.  */
492 static bb_info_t *bb_table;
493
494 /* There is a group_info for each rtx base that is used to reference
495    memory.  There are also not many of the rtx bases because they are
496    very limited in scope.  */
497
498 struct group_info
499 {
500   /* The actual base of the address.  */
501   rtx rtx_base;
502
503   /* The sequential id of the base.  This allows us to have a
504      canonical ordering of these that is not based on addresses.  */
505   int id;
506
507   /* True if there are any positions that are to be processed
508      globally.  */
509   bool process_globally;
510
511   /* True if the base of this group is either the frame_pointer or
512      hard_frame_pointer.  */
513   bool frame_related;
514
515   /* A mem wrapped around the base pointer for the group in order to do
516      read dependency.  It must be given BLKmode in order to encompass all
517      the possible offsets from the base.  */
518   rtx base_mem;
519
520   /* Canonized version of base_mem's address.  */
521   rtx canon_base_addr;
522
523   /* These two sets of two bitmaps are used to keep track of how many
524      stores are actually referencing that position from this base.  We
525      only do this for rtx bases as this will be used to assign
526      positions in the bitmaps for the global problem.  Bit N is set in
527      store1 on the first store for offset N.  Bit N is set in store2
528      for the second store to offset N.  This is all we need since we
529      only care about offsets that have two or more stores for them.
530
531      The "_n" suffix is for offsets less than 0 and the "_p" suffix is
532      for 0 and greater offsets.
533
534      There is one special case here, for stores into the stack frame,
535      we will or store1 into store2 before deciding which stores look
536      at globally.  This is because stores to the stack frame that have
537      no other reads before the end of the function can also be
538      deleted.  */
539   bitmap store1_n, store1_p, store2_n, store2_p;
540
541   /* These bitmaps keep track of offsets in this group escape this function.
542      An offset escapes if it corresponds to a named variable whose
543      addressable flag is set.  */
544   bitmap escaped_n, escaped_p;
545
546   /* The positions in this bitmap have the same assignments as the in,
547      out, gen and kill bitmaps.  This bitmap is all zeros except for
548      the positions that are occupied by stores for this group.  */
549   bitmap group_kill;
550
551   /* The offset_map is used to map the offsets from this base into
552      positions in the global bitmaps.  It is only created after all of
553      the all of stores have been scanned and we know which ones we
554      care about.  */
555   int *offset_map_n, *offset_map_p;
556   int offset_map_size_n, offset_map_size_p;
557 };
558
559 static object_allocator<group_info> group_info_pool ("rtx_group_info_pool");
560
561 /* Index into the rtx_group_vec.  */
562 static int rtx_group_next_id;
563
564
565 static vec<group_info *> rtx_group_vec;
566
567
568 /* This structure holds the set of changes that are being deferred
569    when removing read operation.  See replace_read.  */
570 struct deferred_change
571 {
572
573   /* The mem that is being replaced.  */
574   rtx *loc;
575
576   /* The reg it is being replaced with.  */
577   rtx reg;
578
579   struct deferred_change *next;
580 };
581
582 static object_allocator<deferred_change> deferred_change_pool
583   ("deferred_change_pool");
584
585 static deferred_change *deferred_change_list = NULL;
586
587 /* This is true except if cfun->stdarg -- i.e. we cannot do
588    this for vararg functions because they play games with the frame.  */
589 static bool stores_off_frame_dead_at_return;
590
591 /* Counter for stats.  */
592 static int globally_deleted;
593 static int locally_deleted;
594
595 static bitmap all_blocks;
596
597 /* Locations that are killed by calls in the global phase.  */
598 static bitmap kill_on_calls;
599
600 /* The number of bits used in the global bitmaps.  */
601 static unsigned int current_position;
602
603 /* Print offset range [OFFSET, OFFSET + WIDTH) to FILE.  */
604
605 static void
606 print_range (FILE *file, poly_int64 offset, poly_int64 width)
607 {
608   fprintf (file, "[");
609   print_dec (offset, file, SIGNED);
610   fprintf (file, "..");
611   print_dec (offset + width, file, SIGNED);
612   fprintf (file, ")");
613 }
614 \f
615 /*----------------------------------------------------------------------------
616    Zeroth step.
617
618    Initialization.
619 ----------------------------------------------------------------------------*/
620
621
622 /* Hashtable callbacks for maintaining the "bases" field of
623    store_group_info, given that the addresses are function invariants.  */
624
625 struct invariant_group_base_hasher : nofree_ptr_hash <group_info>
626 {
627   static inline hashval_t hash (const group_info *);
628   static inline bool equal (const group_info *, const group_info *);
629 };
630
631 inline bool
632 invariant_group_base_hasher::equal (const group_info *gi1,
633                                     const group_info *gi2)
634 {
635   return rtx_equal_p (gi1->rtx_base, gi2->rtx_base);
636 }
637
638 inline hashval_t
639 invariant_group_base_hasher::hash (const group_info *gi)
640 {
641   int do_not_record;
642   return hash_rtx (gi->rtx_base, Pmode, &do_not_record, NULL, false);
643 }
644
645 /* Tables of group_info structures, hashed by base value.  */
646 static hash_table<invariant_group_base_hasher> *rtx_group_table;
647
648
649 /* Get the GROUP for BASE.  Add a new group if it is not there.  */
650
651 static group_info *
652 get_group_info (rtx base)
653 {
654   struct group_info tmp_gi;
655   group_info *gi;
656   group_info **slot;
657
658   gcc_assert (base != NULL_RTX);
659
660   /* Find the store_base_info structure for BASE, creating a new one
661      if necessary.  */
662   tmp_gi.rtx_base = base;
663   slot = rtx_group_table->find_slot (&tmp_gi, INSERT);
664   gi = *slot;
665
666   if (gi == NULL)
667     {
668       *slot = gi = group_info_pool.allocate ();
669       gi->rtx_base = base;
670       gi->id = rtx_group_next_id++;
671       gi->base_mem = gen_rtx_MEM (BLKmode, base);
672       gi->canon_base_addr = canon_rtx (base);
673       gi->store1_n = BITMAP_ALLOC (&dse_bitmap_obstack);
674       gi->store1_p = BITMAP_ALLOC (&dse_bitmap_obstack);
675       gi->store2_n = BITMAP_ALLOC (&dse_bitmap_obstack);
676       gi->store2_p = BITMAP_ALLOC (&dse_bitmap_obstack);
677       gi->escaped_p = BITMAP_ALLOC (&dse_bitmap_obstack);
678       gi->escaped_n = BITMAP_ALLOC (&dse_bitmap_obstack);
679       gi->group_kill = BITMAP_ALLOC (&dse_bitmap_obstack);
680       gi->process_globally = false;
681       gi->frame_related =
682         (base == frame_pointer_rtx) || (base == hard_frame_pointer_rtx);
683       gi->offset_map_size_n = 0;
684       gi->offset_map_size_p = 0;
685       gi->offset_map_n = NULL;
686       gi->offset_map_p = NULL;
687       rtx_group_vec.safe_push (gi);
688     }
689
690   return gi;
691 }
692
693
694 /* Initialization of data structures.  */
695
696 static void
697 dse_step0 (void)
698 {
699   locally_deleted = 0;
700   globally_deleted = 0;
701
702   bitmap_obstack_initialize (&dse_bitmap_obstack);
703   gcc_obstack_init (&dse_obstack);
704
705   scratch = BITMAP_ALLOC (&reg_obstack);
706   kill_on_calls = BITMAP_ALLOC (&dse_bitmap_obstack);
707
708
709   rtx_group_table = new hash_table<invariant_group_base_hasher> (11);
710
711   bb_table = XNEWVEC (bb_info_t, last_basic_block_for_fn (cfun));
712   rtx_group_next_id = 0;
713
714   stores_off_frame_dead_at_return = !cfun->stdarg;
715
716   init_alias_analysis ();
717 }
718
719
720 \f
721 /*----------------------------------------------------------------------------
722    First step.
723
724    Scan all of the insns.  Any random ordering of the blocks is fine.
725    Each block is scanned in forward order to accommodate cselib which
726    is used to remove stores with non-constant bases.
727 ----------------------------------------------------------------------------*/
728
729 /* Delete all of the store_info recs from INSN_INFO.  */
730
731 static void
732 free_store_info (insn_info_t insn_info)
733 {
734   store_info *cur = insn_info->store_rec;
735   while (cur)
736     {
737       store_info *next = cur->next;
738       if (cur->is_large)
739         BITMAP_FREE (cur->positions_needed.large.bmap);
740       if (cur->cse_base)
741         cse_store_info_pool.remove (cur);
742       else
743         rtx_store_info_pool.remove (cur);
744       cur = next;
745     }
746
747   insn_info->cannot_delete = true;
748   insn_info->contains_cselib_groups = false;
749   insn_info->store_rec = NULL;
750 }
751
752 struct note_add_store_info
753 {
754   rtx_insn *first, *current;
755   regset fixed_regs_live;
756   bool failure;
757 };
758
759 /* Callback for emit_inc_dec_insn_before via note_stores.
760    Check if a register is clobbered which is live afterwards.  */
761
762 static void
763 note_add_store (rtx loc, const_rtx expr ATTRIBUTE_UNUSED, void *data)
764 {
765   rtx_insn *insn;
766   note_add_store_info *info = (note_add_store_info *) data;
767
768   if (!REG_P (loc))
769     return;
770
771   /* If this register is referenced by the current or an earlier insn,
772      that's OK.  E.g. this applies to the register that is being incremented
773      with this addition.  */
774   for (insn = info->first;
775        insn != NEXT_INSN (info->current);
776        insn = NEXT_INSN (insn))
777     if (reg_referenced_p (loc, PATTERN (insn)))
778       return;
779
780   /* If we come here, we have a clobber of a register that's only OK
781      if that register is not live.  If we don't have liveness information
782      available, fail now.  */
783   if (!info->fixed_regs_live)
784     {
785       info->failure = true;
786       return;
787     }
788   /* Now check if this is a live fixed register.  */
789   unsigned int end_regno = END_REGNO (loc);
790   for (unsigned int regno = REGNO (loc); regno < end_regno; ++regno)
791     if (REGNO_REG_SET_P (info->fixed_regs_live, regno))
792       info->failure = true;
793 }
794
795 /* Callback for for_each_inc_dec that emits an INSN that sets DEST to
796    SRC + SRCOFF before insn ARG.  */
797
798 static int
799 emit_inc_dec_insn_before (rtx mem ATTRIBUTE_UNUSED,
800                           rtx op ATTRIBUTE_UNUSED,
801                           rtx dest, rtx src, rtx srcoff, void *arg)
802 {
803   insn_info_t insn_info = (insn_info_t) arg;
804   rtx_insn *insn = insn_info->insn, *new_insn, *cur;
805   note_add_store_info info;
806
807   /* We can reuse all operands without copying, because we are about
808      to delete the insn that contained it.  */
809   if (srcoff)
810     {
811       start_sequence ();
812       emit_insn (gen_add3_insn (dest, src, srcoff));
813       new_insn = get_insns ();
814       end_sequence ();
815     }
816   else
817     new_insn = gen_move_insn (dest, src);
818   info.first = new_insn;
819   info.fixed_regs_live = insn_info->fixed_regs_live;
820   info.failure = false;
821   for (cur = new_insn; cur; cur = NEXT_INSN (cur))
822     {
823       info.current = cur;
824       note_stores (cur, note_add_store, &info);
825     }
826
827   /* If a failure was flagged above, return 1 so that for_each_inc_dec will
828      return it immediately, communicating the failure to its caller.  */
829   if (info.failure)
830     return 1;
831
832   emit_insn_before (new_insn, insn);
833
834   return 0;
835 }
836
837 /* Before we delete INSN_INFO->INSN, make sure that the auto inc/dec, if it
838    is there, is split into a separate insn.
839    Return true on success (or if there was nothing to do), false on failure.  */
840
841 static bool
842 check_for_inc_dec_1 (insn_info_t insn_info)
843 {
844   rtx_insn *insn = insn_info->insn;
845   rtx note = find_reg_note (insn, REG_INC, NULL_RTX);
846   if (note)
847     return for_each_inc_dec (PATTERN (insn), emit_inc_dec_insn_before,
848                              insn_info) == 0;
849
850   /* Punt on stack pushes, those don't have REG_INC notes and we are
851      unprepared to deal with distribution of REG_ARGS_SIZE notes etc.  */
852   subrtx_iterator::array_type array;
853   FOR_EACH_SUBRTX (iter, array, PATTERN (insn), NONCONST)
854     {
855       const_rtx x = *iter;
856       if (GET_RTX_CLASS (GET_CODE (x)) == RTX_AUTOINC)
857         return false;
858     }
859
860   return true;
861 }
862
863
864 /* Entry point for postreload.  If you work on reload_cse, or you need this
865    anywhere else, consider if you can provide register liveness information
866    and add a parameter to this function so that it can be passed down in
867    insn_info.fixed_regs_live.  */
868 bool
869 check_for_inc_dec (rtx_insn *insn)
870 {
871   insn_info_type insn_info;
872   rtx note;
873
874   insn_info.insn = insn;
875   insn_info.fixed_regs_live = NULL;
876   note = find_reg_note (insn, REG_INC, NULL_RTX);
877   if (note)
878     return for_each_inc_dec (PATTERN (insn), emit_inc_dec_insn_before,
879                              &insn_info) == 0;
880
881   /* Punt on stack pushes, those don't have REG_INC notes and we are
882      unprepared to deal with distribution of REG_ARGS_SIZE notes etc.  */
883   subrtx_iterator::array_type array;
884   FOR_EACH_SUBRTX (iter, array, PATTERN (insn), NONCONST)
885     {
886       const_rtx x = *iter;
887       if (GET_RTX_CLASS (GET_CODE (x)) == RTX_AUTOINC)
888         return false;
889     }
890
891   return true;
892 }
893
894 /* Delete the insn and free all of the fields inside INSN_INFO.  */
895
896 static void
897 delete_dead_store_insn (insn_info_t insn_info)
898 {
899   read_info_t read_info;
900
901   if (!dbg_cnt (dse))
902     return;
903
904   if (!check_for_inc_dec_1 (insn_info))
905     return;
906   if (dump_file && (dump_flags & TDF_DETAILS))
907     fprintf (dump_file, "Locally deleting insn %d\n",
908              INSN_UID (insn_info->insn));
909
910   free_store_info (insn_info);
911   read_info = insn_info->read_rec;
912
913   while (read_info)
914     {
915       read_info_t next = read_info->next;
916       read_info_type_pool.remove (read_info);
917       read_info = next;
918     }
919   insn_info->read_rec = NULL;
920
921   delete_insn (insn_info->insn);
922   locally_deleted++;
923   insn_info->insn = NULL;
924
925   insn_info->wild_read = false;
926 }
927
928 /* Return whether DECL, a local variable, can possibly escape the current
929    function scope.  */
930
931 static bool
932 local_variable_can_escape (tree decl)
933 {
934   if (TREE_ADDRESSABLE (decl))
935     return true;
936
937   /* If this is a partitioned variable, we need to consider all the variables
938      in the partition.  This is necessary because a store into one of them can
939      be replaced with a store into another and this may not change the outcome
940      of the escape analysis.  */
941   if (cfun->gimple_df->decls_to_pointers != NULL)
942     {
943       tree *namep = cfun->gimple_df->decls_to_pointers->get (decl);
944       if (namep)
945         return TREE_ADDRESSABLE (*namep);
946     }
947
948   return false;
949 }
950
951 /* Return whether EXPR can possibly escape the current function scope.  */
952
953 static bool
954 can_escape (tree expr)
955 {
956   tree base;
957   if (!expr)
958     return true;
959   base = get_base_address (expr);
960   if (DECL_P (base)
961       && !may_be_aliased (base)
962       && !(VAR_P (base)
963            && !DECL_EXTERNAL (base)
964            && !TREE_STATIC (base)
965            && local_variable_can_escape (base)))
966     return false;
967   return true;
968 }
969
970 /* Set the store* bitmaps offset_map_size* fields in GROUP based on
971    OFFSET and WIDTH.  */
972
973 static void
974 set_usage_bits (group_info *group, poly_int64 offset, poly_int64 width,
975                 tree expr)
976 {
977   /* Non-constant offsets and widths act as global kills, so there's no point
978      trying to use them to derive global DSE candidates.  */
979   HOST_WIDE_INT i, const_offset, const_width;
980   bool expr_escapes = can_escape (expr);
981   if (offset.is_constant (&const_offset)
982       && width.is_constant (&const_width)
983       && const_offset > -MAX_OFFSET
984       && const_offset + const_width < MAX_OFFSET)
985     for (i = const_offset; i < const_offset + const_width; ++i)
986       {
987         bitmap store1;
988         bitmap store2;
989         bitmap escaped;
990         int ai;
991         if (i < 0)
992           {
993             store1 = group->store1_n;
994             store2 = group->store2_n;
995             escaped = group->escaped_n;
996             ai = -i;
997           }
998         else
999           {
1000             store1 = group->store1_p;
1001             store2 = group->store2_p;
1002             escaped = group->escaped_p;
1003             ai = i;
1004           }
1005
1006         if (!bitmap_set_bit (store1, ai))
1007           bitmap_set_bit (store2, ai);
1008         else
1009           {
1010             if (i < 0)
1011               {
1012                 if (group->offset_map_size_n < ai)
1013                   group->offset_map_size_n = ai;
1014               }
1015             else
1016               {
1017                 if (group->offset_map_size_p < ai)
1018                   group->offset_map_size_p = ai;
1019               }
1020           }
1021         if (expr_escapes)
1022           bitmap_set_bit (escaped, ai);
1023       }
1024 }
1025
1026 static void
1027 reset_active_stores (void)
1028 {
1029   active_local_stores = NULL;
1030   active_local_stores_len = 0;
1031 }
1032
1033 /* Free all READ_REC of the LAST_INSN of BB_INFO.  */
1034
1035 static void
1036 free_read_records (bb_info_t bb_info)
1037 {
1038   insn_info_t insn_info = bb_info->last_insn;
1039   read_info_t *ptr = &insn_info->read_rec;
1040   while (*ptr)
1041     {
1042       read_info_t next = (*ptr)->next;
1043       read_info_type_pool.remove (*ptr);
1044       *ptr = next;
1045     }
1046 }
1047
1048 /* Set the BB_INFO so that the last insn is marked as a wild read.  */
1049
1050 static void
1051 add_wild_read (bb_info_t bb_info)
1052 {
1053   insn_info_t insn_info = bb_info->last_insn;
1054   insn_info->wild_read = true;
1055   free_read_records (bb_info);
1056   reset_active_stores ();
1057 }
1058
1059 /* Set the BB_INFO so that the last insn is marked as a wild read of
1060    non-frame locations.  */
1061
1062 static void
1063 add_non_frame_wild_read (bb_info_t bb_info)
1064 {
1065   insn_info_t insn_info = bb_info->last_insn;
1066   insn_info->non_frame_wild_read = true;
1067   free_read_records (bb_info);
1068   reset_active_stores ();
1069 }
1070
1071 /* Return true if X is a constant or one of the registers that behave
1072    as a constant over the life of a function.  This is equivalent to
1073    !rtx_varies_p for memory addresses.  */
1074
1075 static bool
1076 const_or_frame_p (rtx x)
1077 {
1078   if (CONSTANT_P (x))
1079     return true;
1080
1081   if (GET_CODE (x) == REG)
1082     {
1083       /* Note that we have to test for the actual rtx used for the frame
1084          and arg pointers and not just the register number in case we have
1085          eliminated the frame and/or arg pointer and are using it
1086          for pseudos.  */
1087       if (x == frame_pointer_rtx || x == hard_frame_pointer_rtx
1088           /* The arg pointer varies if it is not a fixed register.  */
1089           || (x == arg_pointer_rtx && fixed_regs[ARG_POINTER_REGNUM])
1090           || x == pic_offset_table_rtx)
1091         return true;
1092       return false;
1093     }
1094
1095   return false;
1096 }
1097
1098 /* Take all reasonable action to put the address of MEM into the form
1099    that we can do analysis on.
1100
1101    The gold standard is to get the address into the form: address +
1102    OFFSET where address is something that rtx_varies_p considers a
1103    constant.  When we can get the address in this form, we can do
1104    global analysis on it.  Note that for constant bases, address is
1105    not actually returned, only the group_id.  The address can be
1106    obtained from that.
1107
1108    If that fails, we try cselib to get a value we can at least use
1109    locally.  If that fails we return false.
1110
1111    The GROUP_ID is set to -1 for cselib bases and the index of the
1112    group for non_varying bases.
1113
1114    FOR_READ is true if this is a mem read and false if not.  */
1115
1116 static bool
1117 canon_address (rtx mem,
1118                int *group_id,
1119                poly_int64 *offset,
1120                cselib_val **base)
1121 {
1122   machine_mode address_mode = get_address_mode (mem);
1123   rtx mem_address = XEXP (mem, 0);
1124   rtx expanded_address, address;
1125   int expanded;
1126
1127   cselib_lookup (mem_address, address_mode, 1, GET_MODE (mem));
1128
1129   if (dump_file && (dump_flags & TDF_DETAILS))
1130     {
1131       fprintf (dump_file, "  mem: ");
1132       print_inline_rtx (dump_file, mem_address, 0);
1133       fprintf (dump_file, "\n");
1134     }
1135
1136   /* First see if just canon_rtx (mem_address) is const or frame,
1137      if not, try cselib_expand_value_rtx and call canon_rtx on that.  */
1138   address = NULL_RTX;
1139   for (expanded = 0; expanded < 2; expanded++)
1140     {
1141       if (expanded)
1142         {
1143           /* Use cselib to replace all of the reg references with the full
1144              expression.  This will take care of the case where we have
1145
1146              r_x = base + offset;
1147              val = *r_x;
1148
1149              by making it into
1150
1151              val = *(base + offset);  */
1152
1153           expanded_address = cselib_expand_value_rtx (mem_address,
1154                                                       scratch, 5);
1155
1156           /* If this fails, just go with the address from first
1157              iteration.  */
1158           if (!expanded_address)
1159             break;
1160         }
1161       else
1162         expanded_address = mem_address;
1163
1164       /* Split the address into canonical BASE + OFFSET terms.  */
1165       address = canon_rtx (expanded_address);
1166
1167       *offset = 0;
1168
1169       if (dump_file && (dump_flags & TDF_DETAILS))
1170         {
1171           if (expanded)
1172             {
1173               fprintf (dump_file, "\n   after cselib_expand address: ");
1174               print_inline_rtx (dump_file, expanded_address, 0);
1175               fprintf (dump_file, "\n");
1176             }
1177
1178           fprintf (dump_file, "\n   after canon_rtx address: ");
1179           print_inline_rtx (dump_file, address, 0);
1180           fprintf (dump_file, "\n");
1181         }
1182
1183       if (GET_CODE (address) == CONST)
1184         address = XEXP (address, 0);
1185
1186       address = strip_offset_and_add (address, offset);
1187
1188       if (ADDR_SPACE_GENERIC_P (MEM_ADDR_SPACE (mem))
1189           && const_or_frame_p (address))
1190         {
1191           group_info *group = get_group_info (address);
1192
1193           if (dump_file && (dump_flags & TDF_DETAILS))
1194             {
1195               fprintf (dump_file, "  gid=%d offset=", group->id);
1196               print_dec (*offset, dump_file);
1197               fprintf (dump_file, "\n");
1198             }
1199           *base = NULL;
1200           *group_id = group->id;
1201           return true;
1202         }
1203     }
1204
1205   *base = cselib_lookup (address, address_mode, true, GET_MODE (mem));
1206   *group_id = -1;
1207
1208   if (*base == NULL)
1209     {
1210       if (dump_file && (dump_flags & TDF_DETAILS))
1211         fprintf (dump_file, " no cselib val - should be a wild read.\n");
1212       return false;
1213     }
1214   if (dump_file && (dump_flags & TDF_DETAILS))
1215     {
1216       fprintf (dump_file, "  varying cselib base=%u:%u offset = ",
1217                (*base)->uid, (*base)->hash);
1218       print_dec (*offset, dump_file);
1219       fprintf (dump_file, "\n");
1220     }
1221   return true;
1222 }
1223
1224
1225 /* Clear the rhs field from the active_local_stores array.  */
1226
1227 static void
1228 clear_rhs_from_active_local_stores (void)
1229 {
1230   insn_info_t ptr = active_local_stores;
1231
1232   while (ptr)
1233     {
1234       store_info *store_info = ptr->store_rec;
1235       /* Skip the clobbers.  */
1236       while (!store_info->is_set)
1237         store_info = store_info->next;
1238
1239       store_info->rhs = NULL;
1240       store_info->const_rhs = NULL;
1241
1242       ptr = ptr->next_local_store;
1243     }
1244 }
1245
1246
1247 /* Mark byte POS bytes from the beginning of store S_INFO as unneeded.  */
1248
1249 static inline void
1250 set_position_unneeded (store_info *s_info, int pos)
1251 {
1252   if (UNLIKELY (s_info->is_large))
1253     {
1254       if (bitmap_set_bit (s_info->positions_needed.large.bmap, pos))
1255         s_info->positions_needed.large.count++;
1256     }
1257   else
1258     s_info->positions_needed.small_bitmask
1259       &= ~(HOST_WIDE_INT_1U << pos);
1260 }
1261
1262 /* Mark the whole store S_INFO as unneeded.  */
1263
1264 static inline void
1265 set_all_positions_unneeded (store_info *s_info)
1266 {
1267   if (UNLIKELY (s_info->is_large))
1268     {
1269       HOST_WIDE_INT width;
1270       if (s_info->width.is_constant (&width))
1271         {
1272           bitmap_set_range (s_info->positions_needed.large.bmap, 0, width);
1273           s_info->positions_needed.large.count = width;
1274         }
1275       else
1276         {
1277           gcc_checking_assert (!s_info->positions_needed.large.bmap);
1278           s_info->positions_needed.large.count = 1;
1279         }
1280     }
1281   else
1282     s_info->positions_needed.small_bitmask = HOST_WIDE_INT_0U;
1283 }
1284
1285 /* Return TRUE if any bytes from S_INFO store are needed.  */
1286
1287 static inline bool
1288 any_positions_needed_p (store_info *s_info)
1289 {
1290   if (UNLIKELY (s_info->is_large))
1291     {
1292       HOST_WIDE_INT width;
1293       if (s_info->width.is_constant (&width))
1294         {
1295           gcc_checking_assert (s_info->positions_needed.large.bmap);
1296           return s_info->positions_needed.large.count < width;
1297         }
1298       else
1299         {
1300           gcc_checking_assert (!s_info->positions_needed.large.bmap);
1301           return s_info->positions_needed.large.count == 0;
1302         }
1303     }
1304   else
1305     return (s_info->positions_needed.small_bitmask != HOST_WIDE_INT_0U);
1306 }
1307
1308 /* Return TRUE if all bytes START through START+WIDTH-1 from S_INFO
1309    store are known to be needed.  */
1310
1311 static inline bool
1312 all_positions_needed_p (store_info *s_info, poly_int64 start,
1313                         poly_int64 width)
1314 {
1315   gcc_assert (s_info->rhs);
1316   if (!s_info->width.is_constant ())
1317     {
1318       gcc_assert (s_info->is_large
1319                   && !s_info->positions_needed.large.bmap);
1320       return s_info->positions_needed.large.count == 0;
1321     }
1322
1323   /* Otherwise, if START and WIDTH are non-constant, we're asking about
1324      a non-constant region of a constant-sized store.  We can't say for
1325      sure that all positions are needed.  */
1326   HOST_WIDE_INT const_start, const_width;
1327   if (!start.is_constant (&const_start)
1328       || !width.is_constant (&const_width))
1329     return false;
1330
1331   if (UNLIKELY (s_info->is_large))
1332     {
1333       for (HOST_WIDE_INT i = const_start; i < const_start + const_width; ++i)
1334         if (bitmap_bit_p (s_info->positions_needed.large.bmap, i))
1335           return false;
1336       return true;
1337     }
1338   else
1339     {
1340       unsigned HOST_WIDE_INT mask
1341         = lowpart_bitmask (const_width) << const_start;
1342       return (s_info->positions_needed.small_bitmask & mask) == mask;
1343     }
1344 }
1345
1346
1347 static rtx get_stored_val (store_info *, machine_mode, poly_int64,
1348                            poly_int64, basic_block, bool);
1349
1350
1351 /* BODY is an instruction pattern that belongs to INSN.  Return 1 if
1352    there is a candidate store, after adding it to the appropriate
1353    local store group if so.  */
1354
1355 static int
1356 record_store (rtx body, bb_info_t bb_info)
1357 {
1358   rtx mem, rhs, const_rhs, mem_addr;
1359   poly_int64 offset = 0;
1360   poly_int64 width = 0;
1361   insn_info_t insn_info = bb_info->last_insn;
1362   store_info *store_info = NULL;
1363   int group_id;
1364   cselib_val *base = NULL;
1365   insn_info_t ptr, last, redundant_reason;
1366   bool store_is_unused;
1367
1368   if (GET_CODE (body) != SET && GET_CODE (body) != CLOBBER)
1369     return 0;
1370
1371   mem = SET_DEST (body);
1372
1373   /* If this is not used, then this cannot be used to keep the insn
1374      from being deleted.  On the other hand, it does provide something
1375      that can be used to prove that another store is dead.  */
1376   store_is_unused
1377     = (find_reg_note (insn_info->insn, REG_UNUSED, mem) != NULL);
1378
1379   /* Check whether that value is a suitable memory location.  */
1380   if (!MEM_P (mem))
1381     {
1382       /* If the set or clobber is unused, then it does not effect our
1383          ability to get rid of the entire insn.  */
1384       if (!store_is_unused)
1385         insn_info->cannot_delete = true;
1386       return 0;
1387     }
1388
1389   /* At this point we know mem is a mem. */
1390   if (GET_MODE (mem) == BLKmode)
1391     {
1392       HOST_WIDE_INT const_size;
1393       if (GET_CODE (XEXP (mem, 0)) == SCRATCH)
1394         {
1395           if (dump_file && (dump_flags & TDF_DETAILS))
1396             fprintf (dump_file, " adding wild read for (clobber (mem:BLK (scratch))\n");
1397           add_wild_read (bb_info);
1398           insn_info->cannot_delete = true;
1399           return 0;
1400         }
1401       /* Handle (set (mem:BLK (addr) [... S36 ...]) (const_int 0))
1402          as memset (addr, 0, 36);  */
1403       else if (!MEM_SIZE_KNOWN_P (mem)
1404                || maybe_le (MEM_SIZE (mem), 0)
1405                /* This is a limit on the bitmap size, which is only relevant
1406                   for constant-sized MEMs.  */
1407                || (MEM_SIZE (mem).is_constant (&const_size)
1408                    && const_size > MAX_OFFSET)
1409                || GET_CODE (body) != SET
1410                || !CONST_INT_P (SET_SRC (body)))
1411         {
1412           if (!store_is_unused)
1413             {
1414               /* If the set or clobber is unused, then it does not effect our
1415                  ability to get rid of the entire insn.  */
1416               insn_info->cannot_delete = true;
1417               clear_rhs_from_active_local_stores ();
1418             }
1419           return 0;
1420         }
1421     }
1422
1423   /* We can still process a volatile mem, we just cannot delete it.  */
1424   if (MEM_VOLATILE_P (mem))
1425     insn_info->cannot_delete = true;
1426
1427   if (!canon_address (mem, &group_id, &offset, &base))
1428     {
1429       clear_rhs_from_active_local_stores ();
1430       return 0;
1431     }
1432
1433   if (GET_MODE (mem) == BLKmode)
1434     width = MEM_SIZE (mem);
1435   else
1436     width = GET_MODE_SIZE (GET_MODE (mem));
1437
1438   if (!endpoint_representable_p (offset, width))
1439     {
1440       clear_rhs_from_active_local_stores ();
1441       return 0;
1442     }
1443
1444   if (known_eq (width, 0))
1445     return 0;
1446
1447   if (group_id >= 0)
1448     {
1449       /* In the restrictive case where the base is a constant or the
1450          frame pointer we can do global analysis.  */
1451
1452       group_info *group
1453         = rtx_group_vec[group_id];
1454       tree expr = MEM_EXPR (mem);
1455
1456       store_info = rtx_store_info_pool.allocate ();
1457       set_usage_bits (group, offset, width, expr);
1458
1459       if (dump_file && (dump_flags & TDF_DETAILS))
1460         {
1461           fprintf (dump_file, " processing const base store gid=%d",
1462                    group_id);
1463           print_range (dump_file, offset, width);
1464           fprintf (dump_file, "\n");
1465         }
1466     }
1467   else
1468     {
1469       if (may_be_sp_based_p (XEXP (mem, 0)))
1470         insn_info->stack_pointer_based = true;
1471       insn_info->contains_cselib_groups = true;
1472
1473       store_info = cse_store_info_pool.allocate ();
1474       group_id = -1;
1475
1476       if (dump_file && (dump_flags & TDF_DETAILS))
1477         {
1478           fprintf (dump_file, " processing cselib store ");
1479           print_range (dump_file, offset, width);
1480           fprintf (dump_file, "\n");
1481         }
1482     }
1483
1484   const_rhs = rhs = NULL_RTX;
1485   if (GET_CODE (body) == SET
1486       /* No place to keep the value after ra.  */
1487       && !reload_completed
1488       && (REG_P (SET_SRC (body))
1489           || GET_CODE (SET_SRC (body)) == SUBREG
1490           || CONSTANT_P (SET_SRC (body)))
1491       && !MEM_VOLATILE_P (mem)
1492       /* Sometimes the store and reload is used for truncation and
1493          rounding.  */
1494       && !(FLOAT_MODE_P (GET_MODE (mem)) && (flag_float_store)))
1495     {
1496       rhs = SET_SRC (body);
1497       if (CONSTANT_P (rhs))
1498         const_rhs = rhs;
1499       else if (body == PATTERN (insn_info->insn))
1500         {
1501           rtx tem = find_reg_note (insn_info->insn, REG_EQUAL, NULL_RTX);
1502           if (tem && CONSTANT_P (XEXP (tem, 0)))
1503             const_rhs = XEXP (tem, 0);
1504         }
1505       if (const_rhs == NULL_RTX && REG_P (rhs))
1506         {
1507           rtx tem = cselib_expand_value_rtx (rhs, scratch, 5);
1508
1509           if (tem && CONSTANT_P (tem))
1510             const_rhs = tem;
1511           else
1512             {
1513               /* If RHS is set only once to a constant, set CONST_RHS
1514                  to the constant.  */
1515               rtx def_src = df_find_single_def_src (rhs);
1516               if (def_src != nullptr && CONSTANT_P (def_src))
1517                 const_rhs = def_src;
1518             }
1519         }
1520     }
1521
1522   /* Check to see if this stores causes some other stores to be
1523      dead.  */
1524   ptr = active_local_stores;
1525   last = NULL;
1526   redundant_reason = NULL;
1527   mem = canon_rtx (mem);
1528
1529   if (group_id < 0)
1530     mem_addr = base->val_rtx;
1531   else
1532     {
1533       group_info *group = rtx_group_vec[group_id];
1534       mem_addr = group->canon_base_addr;
1535     }
1536   if (maybe_ne (offset, 0))
1537     mem_addr = plus_constant (get_address_mode (mem), mem_addr, offset);
1538
1539   while (ptr)
1540     {
1541       insn_info_t next = ptr->next_local_store;
1542       class store_info *s_info = ptr->store_rec;
1543       bool del = true;
1544
1545       /* Skip the clobbers. We delete the active insn if this insn
1546          shadows the set.  To have been put on the active list, it
1547          has exactly on set. */
1548       while (!s_info->is_set)
1549         s_info = s_info->next;
1550
1551       if (s_info->group_id == group_id && s_info->cse_base == base)
1552         {
1553           HOST_WIDE_INT i;
1554           if (dump_file && (dump_flags & TDF_DETAILS))
1555             {
1556               fprintf (dump_file, "    trying store in insn=%d gid=%d",
1557                        INSN_UID (ptr->insn), s_info->group_id);
1558               print_range (dump_file, s_info->offset, s_info->width);
1559               fprintf (dump_file, "\n");
1560             }
1561
1562           /* Even if PTR won't be eliminated as unneeded, if both
1563              PTR and this insn store the same constant value, we might
1564              eliminate this insn instead.  */
1565           if (s_info->const_rhs
1566               && const_rhs
1567               && known_subrange_p (offset, width,
1568                                    s_info->offset, s_info->width)
1569               && all_positions_needed_p (s_info, offset - s_info->offset,
1570                                          width)
1571               /* We can only remove the later store if the earlier aliases
1572                  at least all accesses the later one.  */
1573               && mems_same_for_tbaa_p (s_info->mem, mem))
1574             {
1575               if (GET_MODE (mem) == BLKmode)
1576                 {
1577                   if (GET_MODE (s_info->mem) == BLKmode
1578                       && s_info->const_rhs == const_rhs)
1579                     redundant_reason = ptr;
1580                 }
1581               else if (s_info->const_rhs == const0_rtx
1582                        && const_rhs == const0_rtx)
1583                 redundant_reason = ptr;
1584               else
1585                 {
1586                   rtx val;
1587                   start_sequence ();
1588                   val = get_stored_val (s_info, GET_MODE (mem), offset, width,
1589                                         BLOCK_FOR_INSN (insn_info->insn),
1590                                         true);
1591                   if (get_insns () != NULL)
1592                     val = NULL_RTX;
1593                   end_sequence ();
1594                   if (val && rtx_equal_p (val, const_rhs))
1595                     redundant_reason = ptr;
1596                 }
1597             }
1598
1599           HOST_WIDE_INT begin_unneeded, const_s_width, const_width;
1600           if (known_subrange_p (s_info->offset, s_info->width, offset, width))
1601             /* The new store touches every byte that S_INFO does.  */
1602             set_all_positions_unneeded (s_info);
1603           else if ((offset - s_info->offset).is_constant (&begin_unneeded)
1604                    && s_info->width.is_constant (&const_s_width)
1605                    && width.is_constant (&const_width))
1606             {
1607               HOST_WIDE_INT end_unneeded = begin_unneeded + const_width;
1608               begin_unneeded = MAX (begin_unneeded, 0);
1609               end_unneeded = MIN (end_unneeded, const_s_width);
1610               for (i = begin_unneeded; i < end_unneeded; ++i)
1611                 set_position_unneeded (s_info, i);
1612             }
1613           else
1614             {
1615               /* We don't know which parts of S_INFO are needed and
1616                  which aren't, so invalidate the RHS.  */
1617               s_info->rhs = NULL;
1618               s_info->const_rhs = NULL;
1619             }
1620         }
1621       else if (s_info->rhs)
1622         /* Need to see if it is possible for this store to overwrite
1623            the value of store_info.  If it is, set the rhs to NULL to
1624            keep it from being used to remove a load.  */
1625         {
1626           if (canon_output_dependence (s_info->mem, true,
1627                                        mem, GET_MODE (mem),
1628                                        mem_addr))
1629             {
1630               s_info->rhs = NULL;
1631               s_info->const_rhs = NULL;
1632             }
1633         }
1634
1635       /* An insn can be deleted if every position of every one of
1636          its s_infos is zero.  */
1637       if (any_positions_needed_p (s_info))
1638         del = false;
1639
1640       if (del)
1641         {
1642           insn_info_t insn_to_delete = ptr;
1643
1644           active_local_stores_len--;
1645           if (last)
1646             last->next_local_store = ptr->next_local_store;
1647           else
1648             active_local_stores = ptr->next_local_store;
1649
1650           if (!insn_to_delete->cannot_delete)
1651             delete_dead_store_insn (insn_to_delete);
1652         }
1653       else
1654         last = ptr;
1655
1656       ptr = next;
1657     }
1658
1659   /* Finish filling in the store_info.  */
1660   store_info->next = insn_info->store_rec;
1661   insn_info->store_rec = store_info;
1662   store_info->mem = mem;
1663   store_info->mem_addr = mem_addr;
1664   store_info->cse_base = base;
1665   HOST_WIDE_INT const_width;
1666   if (!width.is_constant (&const_width))
1667     {
1668       store_info->is_large = true;
1669       store_info->positions_needed.large.count = 0;
1670       store_info->positions_needed.large.bmap = NULL;
1671     }
1672   else if (const_width > HOST_BITS_PER_WIDE_INT)
1673     {
1674       store_info->is_large = true;
1675       store_info->positions_needed.large.count = 0;
1676       store_info->positions_needed.large.bmap = BITMAP_ALLOC (&dse_bitmap_obstack);
1677     }
1678   else
1679     {
1680       store_info->is_large = false;
1681       store_info->positions_needed.small_bitmask
1682         = lowpart_bitmask (const_width);
1683     }
1684   store_info->group_id = group_id;
1685   store_info->offset = offset;
1686   store_info->width = width;
1687   store_info->is_set = GET_CODE (body) == SET;
1688   store_info->rhs = rhs;
1689   store_info->const_rhs = const_rhs;
1690   store_info->redundant_reason = redundant_reason;
1691
1692   /* If this is a clobber, we return 0.  We will only be able to
1693      delete this insn if there is only one store USED store, but we
1694      can use the clobber to delete other stores earlier.  */
1695   return store_info->is_set ? 1 : 0;
1696 }
1697
1698
1699 static void
1700 dump_insn_info (const char * start, insn_info_t insn_info)
1701 {
1702   fprintf (dump_file, "%s insn=%d %s\n", start,
1703            INSN_UID (insn_info->insn),
1704            insn_info->store_rec ? "has store" : "naked");
1705 }
1706
1707
1708 /* If the modes are different and the value's source and target do not
1709    line up, we need to extract the value from lower part of the rhs of
1710    the store, shift it, and then put it into a form that can be shoved
1711    into the read_insn.  This function generates a right SHIFT of a
1712    value that is at least ACCESS_SIZE bytes wide of READ_MODE.  The
1713    shift sequence is returned or NULL if we failed to find a
1714    shift.  */
1715
1716 static rtx
1717 find_shift_sequence (poly_int64 access_size,
1718                      store_info *store_info,
1719                      machine_mode read_mode,
1720                      poly_int64 shift, bool speed, bool require_cst)
1721 {
1722   machine_mode store_mode = GET_MODE (store_info->mem);
1723   scalar_int_mode new_mode;
1724   rtx read_reg = NULL;
1725
1726   /* If a constant was stored into memory, try to simplify it here,
1727      otherwise the cost of the shift might preclude this optimization
1728      e.g. at -Os, even when no actual shift will be needed.  */
1729   if (store_info->const_rhs)
1730     {
1731       auto new_mode = smallest_int_mode_for_size (access_size * BITS_PER_UNIT);
1732       auto byte = subreg_lowpart_offset (new_mode, store_mode);
1733       rtx ret
1734         = simplify_subreg (new_mode, store_info->const_rhs, store_mode, byte);
1735       if (ret && CONSTANT_P (ret))
1736         {
1737           rtx shift_rtx = gen_int_shift_amount (new_mode, shift);
1738           ret = simplify_const_binary_operation (LSHIFTRT, new_mode, ret,
1739                                                  shift_rtx);
1740           if (ret && CONSTANT_P (ret))
1741             {
1742               byte = subreg_lowpart_offset (read_mode, new_mode);
1743               ret = simplify_subreg (read_mode, ret, new_mode, byte);
1744               if (ret && CONSTANT_P (ret)
1745                   && (set_src_cost (ret, read_mode, speed)
1746                       <= COSTS_N_INSNS (1)))
1747                 return ret;
1748             }
1749         }
1750     }
1751
1752   if (require_cst)
1753     return NULL_RTX;
1754
1755   /* Some machines like the x86 have shift insns for each size of
1756      operand.  Other machines like the ppc or the ia-64 may only have
1757      shift insns that shift values within 32 or 64 bit registers.
1758      This loop tries to find the smallest shift insn that will right
1759      justify the value we want to read but is available in one insn on
1760      the machine.  */
1761
1762   opt_scalar_int_mode new_mode_iter;
1763   FOR_EACH_MODE_IN_CLASS (new_mode_iter, MODE_INT)
1764     {
1765       rtx target, new_reg, new_lhs;
1766       rtx_insn *shift_seq, *insn;
1767       int cost;
1768
1769       new_mode = new_mode_iter.require ();
1770       if (GET_MODE_BITSIZE (new_mode) > BITS_PER_WORD)
1771         break;
1772       if (maybe_lt (GET_MODE_SIZE (new_mode), GET_MODE_SIZE (read_mode)))
1773         continue;
1774
1775       /* Try a wider mode if truncating the store mode to NEW_MODE
1776          requires a real instruction.  */
1777       if (maybe_lt (GET_MODE_SIZE (new_mode), GET_MODE_SIZE (store_mode))
1778           && !TRULY_NOOP_TRUNCATION_MODES_P (new_mode, store_mode))
1779         continue;
1780
1781       /* Also try a wider mode if the necessary punning is either not
1782          desirable or not possible.  */
1783       if (!CONSTANT_P (store_info->rhs)
1784           && !targetm.modes_tieable_p (new_mode, store_mode))
1785         continue;
1786
1787       if (multiple_p (shift, GET_MODE_BITSIZE (new_mode))
1788           && known_le (GET_MODE_SIZE (new_mode), GET_MODE_SIZE (store_mode)))
1789         {
1790           /* Try to implement the shift using a subreg.  */
1791           poly_int64 offset
1792             = subreg_offset_from_lsb (new_mode, store_mode, shift);
1793           rtx rhs_subreg = simplify_gen_subreg (new_mode, store_info->rhs,
1794                                                 store_mode, offset);
1795           if (rhs_subreg)
1796             {
1797               read_reg
1798                 = extract_low_bits (read_mode, new_mode, copy_rtx (rhs_subreg));
1799               break;
1800             }
1801         }
1802
1803       if (maybe_lt (GET_MODE_SIZE (new_mode), access_size))
1804         continue;
1805
1806       new_reg = gen_reg_rtx (new_mode);
1807
1808       start_sequence ();
1809
1810       /* In theory we could also check for an ashr.  Ian Taylor knows
1811          of one dsp where the cost of these two was not the same.  But
1812          this really is a rare case anyway.  */
1813       target = expand_binop (new_mode, lshr_optab, new_reg,
1814                              gen_int_shift_amount (new_mode, shift),
1815                              new_reg, 1, OPTAB_DIRECT);
1816
1817       shift_seq = get_insns ();
1818       end_sequence ();
1819
1820       if (target != new_reg || shift_seq == NULL)
1821         continue;
1822
1823       cost = 0;
1824       for (insn = shift_seq; insn != NULL_RTX; insn = NEXT_INSN (insn))
1825         if (INSN_P (insn))
1826           cost += insn_cost (insn, speed);
1827
1828       /* The computation up to here is essentially independent
1829          of the arguments and could be precomputed.  It may
1830          not be worth doing so.  We could precompute if
1831          worthwhile or at least cache the results.  The result
1832          technically depends on both SHIFT and ACCESS_SIZE,
1833          but in practice the answer will depend only on ACCESS_SIZE.  */
1834
1835       if (cost > COSTS_N_INSNS (1))
1836         continue;
1837
1838       new_lhs = extract_low_bits (new_mode, store_mode,
1839                                   copy_rtx (store_info->rhs));
1840       if (new_lhs == NULL_RTX)
1841         continue;
1842
1843       /* We found an acceptable shift.  Generate a move to
1844          take the value from the store and put it into the
1845          shift pseudo, then shift it, then generate another
1846          move to put in into the target of the read.  */
1847       emit_move_insn (new_reg, new_lhs);
1848       emit_insn (shift_seq);
1849       read_reg = extract_low_bits (read_mode, new_mode, new_reg);
1850       break;
1851     }
1852
1853   return read_reg;
1854 }
1855
1856
1857 /* Call back for note_stores to find the hard regs set or clobbered by
1858    insn.  Data is a bitmap of the hardregs set so far.  */
1859
1860 static void
1861 look_for_hardregs (rtx x, const_rtx pat ATTRIBUTE_UNUSED, void *data)
1862 {
1863   bitmap regs_set = (bitmap) data;
1864
1865   if (REG_P (x)
1866       && HARD_REGISTER_P (x))
1867     bitmap_set_range (regs_set, REGNO (x), REG_NREGS (x));
1868 }
1869
1870 /* Helper function for replace_read and record_store.
1871    Attempt to return a value of mode READ_MODE stored in STORE_INFO,
1872    consisting of READ_WIDTH bytes starting from READ_OFFSET.  Return NULL
1873    if not successful.  If REQUIRE_CST is true, return always constant.  */
1874
1875 static rtx
1876 get_stored_val (store_info *store_info, machine_mode read_mode,
1877                 poly_int64 read_offset, poly_int64 read_width,
1878                 basic_block bb, bool require_cst)
1879 {
1880   machine_mode store_mode = GET_MODE (store_info->mem);
1881   poly_int64 gap;
1882   rtx read_reg;
1883
1884   /* To get here the read is within the boundaries of the write so
1885      shift will never be negative.  Start out with the shift being in
1886      bytes.  */
1887   if (store_mode == BLKmode)
1888     gap = 0;
1889   else if (BYTES_BIG_ENDIAN)
1890     gap = ((store_info->offset + store_info->width)
1891            - (read_offset + read_width));
1892   else
1893     gap = read_offset - store_info->offset;
1894
1895   if (gap.is_constant () && maybe_ne (gap, 0))
1896     {
1897       poly_int64 shift = gap * BITS_PER_UNIT;
1898       poly_int64 access_size = GET_MODE_SIZE (read_mode) + gap;
1899       read_reg = find_shift_sequence (access_size, store_info, read_mode,
1900                                       shift, optimize_bb_for_speed_p (bb),
1901                                       require_cst);
1902     }
1903   else if (store_mode == BLKmode)
1904     {
1905       /* The store is a memset (addr, const_val, const_size).  */
1906       gcc_assert (CONST_INT_P (store_info->rhs));
1907       scalar_int_mode int_store_mode;
1908       if (!int_mode_for_mode (read_mode).exists (&int_store_mode))
1909         read_reg = NULL_RTX;
1910       else if (store_info->rhs == const0_rtx)
1911         read_reg = extract_low_bits (read_mode, int_store_mode, const0_rtx);
1912       else if (GET_MODE_BITSIZE (int_store_mode) > HOST_BITS_PER_WIDE_INT
1913                || BITS_PER_UNIT >= HOST_BITS_PER_WIDE_INT)
1914         read_reg = NULL_RTX;
1915       else
1916         {
1917           unsigned HOST_WIDE_INT c
1918             = INTVAL (store_info->rhs)
1919               & ((HOST_WIDE_INT_1 << BITS_PER_UNIT) - 1);
1920           int shift = BITS_PER_UNIT;
1921           while (shift < HOST_BITS_PER_WIDE_INT)
1922             {
1923               c |= (c << shift);
1924               shift <<= 1;
1925             }
1926           read_reg = gen_int_mode (c, int_store_mode);
1927           read_reg = extract_low_bits (read_mode, int_store_mode, read_reg);
1928         }
1929     }
1930   else if (store_info->const_rhs
1931            && (require_cst
1932                || GET_MODE_CLASS (read_mode) != GET_MODE_CLASS (store_mode)))
1933     read_reg = extract_low_bits (read_mode, store_mode,
1934                                  copy_rtx (store_info->const_rhs));
1935   else
1936     read_reg = extract_low_bits (read_mode, store_mode,
1937                                  copy_rtx (store_info->rhs));
1938   if (require_cst && read_reg && !CONSTANT_P (read_reg))
1939     read_reg = NULL_RTX;
1940   return read_reg;
1941 }
1942
1943 /* Take a sequence of:
1944      A <- r1
1945      ...
1946      ... <- A
1947
1948    and change it into
1949    r2 <- r1
1950    A <- r1
1951    ...
1952    ... <- r2
1953
1954    or
1955
1956    r3 <- extract (r1)
1957    r3 <- r3 >> shift
1958    r2 <- extract (r3)
1959    ... <- r2
1960
1961    or
1962
1963    r2 <- extract (r1)
1964    ... <- r2
1965
1966    Depending on the alignment and the mode of the store and
1967    subsequent load.
1968
1969
1970    The STORE_INFO and STORE_INSN are for the store and READ_INFO
1971    and READ_INSN are for the read.  Return true if the replacement
1972    went ok.  */
1973
1974 static bool
1975 replace_read (store_info *store_info, insn_info_t store_insn,
1976               read_info_t read_info, insn_info_t read_insn, rtx *loc)
1977 {
1978   machine_mode store_mode = GET_MODE (store_info->mem);
1979   machine_mode read_mode = GET_MODE (read_info->mem);
1980   rtx_insn *insns, *this_insn;
1981   rtx read_reg;
1982   basic_block bb;
1983
1984   if (!dbg_cnt (dse))
1985     return false;
1986
1987   /* Create a sequence of instructions to set up the read register.
1988      This sequence goes immediately before the store and its result
1989      is read by the load.
1990
1991      We need to keep this in perspective.  We are replacing a read
1992      with a sequence of insns, but the read will almost certainly be
1993      in cache, so it is not going to be an expensive one.  Thus, we
1994      are not willing to do a multi insn shift or worse a subroutine
1995      call to get rid of the read.  */
1996   if (dump_file && (dump_flags & TDF_DETAILS))
1997     fprintf (dump_file, "trying to replace %smode load in insn %d"
1998              " from %smode store in insn %d\n",
1999              GET_MODE_NAME (read_mode), INSN_UID (read_insn->insn),
2000              GET_MODE_NAME (store_mode), INSN_UID (store_insn->insn));
2001   start_sequence ();
2002   bb = BLOCK_FOR_INSN (read_insn->insn);
2003   read_reg = get_stored_val (store_info,
2004                              read_mode, read_info->offset, read_info->width,
2005                              bb, false);
2006   if (read_reg == NULL_RTX)
2007     {
2008       end_sequence ();
2009       if (dump_file && (dump_flags & TDF_DETAILS))
2010         fprintf (dump_file, " -- could not extract bits of stored value\n");
2011       return false;
2012     }
2013   /* Force the value into a new register so that it won't be clobbered
2014      between the store and the load.  */
2015   read_reg = copy_to_mode_reg (read_mode, read_reg);
2016   insns = get_insns ();
2017   end_sequence ();
2018
2019   if (insns != NULL_RTX)
2020     {
2021       /* Now we have to scan the set of new instructions to see if the
2022          sequence contains and sets of hardregs that happened to be
2023          live at this point.  For instance, this can happen if one of
2024          the insns sets the CC and the CC happened to be live at that
2025          point.  This does occasionally happen, see PR 37922.  */
2026       bitmap regs_set = BITMAP_ALLOC (&reg_obstack);
2027
2028       for (this_insn = insns;
2029            this_insn != NULL_RTX; this_insn = NEXT_INSN (this_insn))
2030         {
2031           if (insn_invalid_p (this_insn, false))
2032             {
2033               if (dump_file && (dump_flags & TDF_DETAILS))
2034                 {
2035                   fprintf (dump_file, " -- replacing the loaded MEM with ");
2036                   print_simple_rtl (dump_file, read_reg);
2037                   fprintf (dump_file, " led to an invalid instruction\n");
2038                 }
2039               BITMAP_FREE (regs_set);
2040               return false;
2041             }
2042           note_stores (this_insn, look_for_hardregs, regs_set);
2043         }
2044
2045       if (store_insn->fixed_regs_live)
2046         bitmap_and_into (regs_set, store_insn->fixed_regs_live);
2047       if (!bitmap_empty_p (regs_set))
2048         {
2049           if (dump_file && (dump_flags & TDF_DETAILS))
2050             {
2051               fprintf (dump_file, "abandoning replacement because sequence "
2052                                   "clobbers live hardregs:");
2053               df_print_regset (dump_file, regs_set);
2054             }
2055
2056           BITMAP_FREE (regs_set);
2057           return false;
2058         }
2059       BITMAP_FREE (regs_set);
2060     }
2061
2062   subrtx_iterator::array_type array;
2063   FOR_EACH_SUBRTX (iter, array, *loc, NONCONST)
2064     {
2065       const_rtx x = *iter;
2066       if (GET_RTX_CLASS (GET_CODE (x)) == RTX_AUTOINC)
2067         {
2068           if (dump_file && (dump_flags & TDF_DETAILS))
2069             fprintf (dump_file, " -- replacing the MEM failed due to address "
2070                                 "side-effects\n");
2071           return false;
2072         }
2073     }
2074
2075   if (validate_change (read_insn->insn, loc, read_reg, 0))
2076     {
2077       deferred_change *change = deferred_change_pool.allocate ();
2078
2079       /* Insert this right before the store insn where it will be safe
2080          from later insns that might change it before the read.  */
2081       emit_insn_before (insns, store_insn->insn);
2082
2083       /* And now for the kludge part: cselib croaks if you just
2084          return at this point.  There are two reasons for this:
2085
2086          1) Cselib has an idea of how many pseudos there are and
2087          that does not include the new ones we just added.
2088
2089          2) Cselib does not know about the move insn we added
2090          above the store_info, and there is no way to tell it
2091          about it, because it has "moved on".
2092
2093          Problem (1) is fixable with a certain amount of engineering.
2094          Problem (2) is requires starting the bb from scratch.  This
2095          could be expensive.
2096
2097          So we are just going to have to lie.  The move/extraction
2098          insns are not really an issue, cselib did not see them.  But
2099          the use of the new pseudo read_insn is a real problem because
2100          cselib has not scanned this insn.  The way that we solve this
2101          problem is that we are just going to put the mem back for now
2102          and when we are finished with the block, we undo this.  We
2103          keep a table of mems to get rid of.  At the end of the basic
2104          block we can put them back.  */
2105
2106       *loc = read_info->mem;
2107       change->next = deferred_change_list;
2108       deferred_change_list = change;
2109       change->loc = loc;
2110       change->reg = read_reg;
2111
2112       /* Get rid of the read_info, from the point of view of the
2113          rest of dse, play like this read never happened.  */
2114       read_insn->read_rec = read_info->next;
2115       read_info_type_pool.remove (read_info);
2116       if (dump_file && (dump_flags & TDF_DETAILS))
2117         {
2118           fprintf (dump_file, " -- replaced the loaded MEM with ");
2119           print_simple_rtl (dump_file, read_reg);
2120           fprintf (dump_file, "\n");
2121         }
2122       return true;
2123     }
2124   else
2125     {
2126       if (dump_file && (dump_flags & TDF_DETAILS))
2127         {
2128           fprintf (dump_file, " -- replacing the loaded MEM with ");
2129           print_simple_rtl (dump_file, read_reg);
2130           fprintf (dump_file, " led to an invalid instruction\n");
2131         }
2132       return false;
2133     }
2134 }
2135
2136 /* Check the address of MEM *LOC and kill any appropriate stores that may
2137    be active.  */
2138
2139 static void
2140 check_mem_read_rtx (rtx *loc, bb_info_t bb_info)
2141 {
2142   rtx mem = *loc, mem_addr;
2143   insn_info_t insn_info;
2144   poly_int64 offset = 0;
2145   poly_int64 width = 0;
2146   cselib_val *base = NULL;
2147   int group_id;
2148   read_info_t read_info;
2149
2150   insn_info = bb_info->last_insn;
2151
2152   if ((MEM_ALIAS_SET (mem) == ALIAS_SET_MEMORY_BARRIER)
2153       || MEM_VOLATILE_P (mem))
2154     {
2155       if (crtl->stack_protect_guard
2156           && (MEM_EXPR (mem) == crtl->stack_protect_guard
2157               || (crtl->stack_protect_guard_decl
2158                   && MEM_EXPR (mem) == crtl->stack_protect_guard_decl))
2159           && MEM_VOLATILE_P (mem))
2160         {
2161           /* This is either the stack protector canary on the stack,
2162              which ought to be written by a MEM_VOLATILE_P store and
2163              thus shouldn't be deleted and is read at the very end of
2164              function, but shouldn't conflict with any other store.
2165              Or it is __stack_chk_guard variable or TLS or whatever else
2166              MEM holding the canary value, which really shouldn't be
2167              ever modified in -fstack-protector* protected functions,
2168              otherwise the prologue store wouldn't match the epilogue
2169              check.  */
2170           if (dump_file && (dump_flags & TDF_DETAILS))
2171             fprintf (dump_file, " stack protector canary read ignored.\n");
2172           insn_info->cannot_delete = true;
2173           return;
2174         }
2175
2176       if (dump_file && (dump_flags & TDF_DETAILS))
2177         fprintf (dump_file, " adding wild read, volatile or barrier.\n");
2178       add_wild_read (bb_info);
2179       insn_info->cannot_delete = true;
2180       return;
2181     }
2182
2183   /* If it is reading readonly mem, then there can be no conflict with
2184      another write. */
2185   if (MEM_READONLY_P (mem))
2186     return;
2187
2188   if (!canon_address (mem, &group_id, &offset, &base))
2189     {
2190       if (dump_file && (dump_flags & TDF_DETAILS))
2191         fprintf (dump_file, " adding wild read, canon_address failure.\n");
2192       add_wild_read (bb_info);
2193       return;
2194     }
2195
2196   if (GET_MODE (mem) == BLKmode)
2197     width = -1;
2198   else
2199     width = GET_MODE_SIZE (GET_MODE (mem));
2200
2201   if (!endpoint_representable_p (offset, known_eq (width, -1) ? 1 : width))
2202     {
2203       if (dump_file && (dump_flags & TDF_DETAILS))
2204         fprintf (dump_file, " adding wild read, due to overflow.\n");
2205       add_wild_read (bb_info);
2206       return;
2207     }
2208
2209   read_info = read_info_type_pool.allocate ();
2210   read_info->group_id = group_id;
2211   read_info->mem = mem;
2212   read_info->offset = offset;
2213   read_info->width = width;
2214   read_info->next = insn_info->read_rec;
2215   insn_info->read_rec = read_info;
2216   if (group_id < 0)
2217     mem_addr = base->val_rtx;
2218   else
2219     {
2220       group_info *group = rtx_group_vec[group_id];
2221       mem_addr = group->canon_base_addr;
2222     }
2223   if (maybe_ne (offset, 0))
2224     mem_addr = plus_constant (get_address_mode (mem), mem_addr, offset);
2225   /* Avoid passing VALUE RTXen as mem_addr to canon_true_dependence
2226      which will over and over re-create proper RTL and re-apply the
2227      offset above.  See PR80960 where we almost allocate 1.6GB of PLUS
2228      RTXen that way.  */
2229   mem_addr = get_addr (mem_addr);
2230
2231   if (group_id >= 0)
2232     {
2233       /* This is the restricted case where the base is a constant or
2234          the frame pointer and offset is a constant.  */
2235       insn_info_t i_ptr = active_local_stores;
2236       insn_info_t last = NULL;
2237
2238       if (dump_file && (dump_flags & TDF_DETAILS))
2239         {
2240           if (!known_size_p (width))
2241             fprintf (dump_file, " processing const load gid=%d[BLK]\n",
2242                      group_id);
2243           else
2244             {
2245               fprintf (dump_file, " processing const load gid=%d", group_id);
2246               print_range (dump_file, offset, width);
2247               fprintf (dump_file, "\n");
2248             }
2249         }
2250
2251       while (i_ptr)
2252         {
2253           bool remove = false;
2254           store_info *store_info = i_ptr->store_rec;
2255
2256           /* Skip the clobbers.  */
2257           while (!store_info->is_set)
2258             store_info = store_info->next;
2259
2260           /* There are three cases here.  */
2261           if (store_info->group_id < 0)
2262             /* We have a cselib store followed by a read from a
2263                const base. */
2264             remove
2265               = canon_true_dependence (store_info->mem,
2266                                        GET_MODE (store_info->mem),
2267                                        store_info->mem_addr,
2268                                        mem, mem_addr);
2269
2270           else if (group_id == store_info->group_id)
2271             {
2272               /* This is a block mode load.  We may get lucky and
2273                  canon_true_dependence may save the day.  */
2274               if (!known_size_p (width))
2275                 remove
2276                   = canon_true_dependence (store_info->mem,
2277                                            GET_MODE (store_info->mem),
2278                                            store_info->mem_addr,
2279                                            mem, mem_addr);
2280
2281               /* If this read is just reading back something that we just
2282                  stored, rewrite the read.  */
2283               else
2284                 {
2285                   if (store_info->rhs
2286                       && known_subrange_p (offset, width, store_info->offset,
2287                                            store_info->width)
2288                       && all_positions_needed_p (store_info,
2289                                                  offset - store_info->offset,
2290                                                  width)
2291                       && replace_read (store_info, i_ptr, read_info,
2292                                        insn_info, loc))
2293                     return;
2294
2295                   /* The bases are the same, just see if the offsets
2296                      could overlap.  */
2297                   if (ranges_maybe_overlap_p (offset, width,
2298                                               store_info->offset,
2299                                               store_info->width))
2300                     remove = true;
2301                 }
2302             }
2303
2304           /* else
2305              The else case that is missing here is that the
2306              bases are constant but different.  There is nothing
2307              to do here because there is no overlap.  */
2308
2309           if (remove)
2310             {
2311               if (dump_file && (dump_flags & TDF_DETAILS))
2312                 dump_insn_info ("removing from active", i_ptr);
2313
2314               active_local_stores_len--;
2315               if (last)
2316                 last->next_local_store = i_ptr->next_local_store;
2317               else
2318                 active_local_stores = i_ptr->next_local_store;
2319             }
2320           else
2321             last = i_ptr;
2322           i_ptr = i_ptr->next_local_store;
2323         }
2324     }
2325   else
2326     {
2327       insn_info_t i_ptr = active_local_stores;
2328       insn_info_t last = NULL;
2329       if (dump_file && (dump_flags & TDF_DETAILS))
2330         {
2331           fprintf (dump_file, " processing cselib load mem:");
2332           print_inline_rtx (dump_file, mem, 0);
2333           fprintf (dump_file, "\n");
2334         }
2335
2336       while (i_ptr)
2337         {
2338           bool remove = false;
2339           store_info *store_info = i_ptr->store_rec;
2340
2341           if (dump_file && (dump_flags & TDF_DETAILS))
2342             fprintf (dump_file, " processing cselib load against insn %d\n",
2343                      INSN_UID (i_ptr->insn));
2344
2345           /* Skip the clobbers.  */
2346           while (!store_info->is_set)
2347             store_info = store_info->next;
2348
2349           /* If this read is just reading back something that we just
2350              stored, rewrite the read.  */
2351           if (store_info->rhs
2352               && store_info->group_id == -1
2353               && store_info->cse_base == base
2354               && known_subrange_p (offset, width, store_info->offset,
2355                                    store_info->width)
2356               && all_positions_needed_p (store_info,
2357                                          offset - store_info->offset, width)
2358               && replace_read (store_info, i_ptr,  read_info, insn_info, loc))
2359             return;
2360
2361           remove = canon_true_dependence (store_info->mem,
2362                                           GET_MODE (store_info->mem),
2363                                           store_info->mem_addr,
2364                                           mem, mem_addr);
2365
2366           if (remove)
2367             {
2368               if (dump_file && (dump_flags & TDF_DETAILS))
2369                 dump_insn_info ("removing from active", i_ptr);
2370
2371               active_local_stores_len--;
2372               if (last)
2373                 last->next_local_store = i_ptr->next_local_store;
2374               else
2375                 active_local_stores = i_ptr->next_local_store;
2376             }
2377           else
2378             last = i_ptr;
2379           i_ptr = i_ptr->next_local_store;
2380         }
2381     }
2382 }
2383
2384 /* A note_uses callback in which DATA points the INSN_INFO for
2385    as check_mem_read_rtx.  Nullify the pointer if i_m_r_m_r returns
2386    true for any part of *LOC.  */
2387
2388 static void
2389 check_mem_read_use (rtx *loc, void *data)
2390 {
2391   subrtx_ptr_iterator::array_type array;
2392   FOR_EACH_SUBRTX_PTR (iter, array, loc, NONCONST)
2393     {
2394       rtx *loc = *iter;
2395       if (MEM_P (*loc))
2396         check_mem_read_rtx (loc, (bb_info_t) data);
2397     }
2398 }
2399
2400
2401 /* Get arguments passed to CALL_INSN.  Return TRUE if successful.
2402    So far it only handles arguments passed in registers.  */
2403
2404 static bool
2405 get_call_args (rtx call_insn, tree fn, rtx *args, int nargs)
2406 {
2407   CUMULATIVE_ARGS args_so_far_v;
2408   cumulative_args_t args_so_far;
2409   tree arg;
2410   int idx;
2411
2412   INIT_CUMULATIVE_ARGS (args_so_far_v, TREE_TYPE (fn), NULL_RTX, 0, 3);
2413   args_so_far = pack_cumulative_args (&args_so_far_v);
2414
2415   arg = TYPE_ARG_TYPES (TREE_TYPE (fn));
2416   for (idx = 0;
2417        arg != void_list_node && idx < nargs;
2418        arg = TREE_CHAIN (arg), idx++)
2419     {
2420       scalar_int_mode mode;
2421       rtx reg, link, tmp;
2422
2423       if (!is_int_mode (TYPE_MODE (TREE_VALUE (arg)), &mode))
2424         return false;
2425
2426       function_arg_info arg (mode, /*named=*/true);
2427       reg = targetm.calls.function_arg (args_so_far, arg);
2428       if (!reg || !REG_P (reg) || GET_MODE (reg) != mode)
2429         return false;
2430
2431       for (link = CALL_INSN_FUNCTION_USAGE (call_insn);
2432            link;
2433            link = XEXP (link, 1))
2434         if (GET_CODE (XEXP (link, 0)) == USE)
2435           {
2436             scalar_int_mode arg_mode;
2437             args[idx] = XEXP (XEXP (link, 0), 0);
2438             if (REG_P (args[idx])
2439                 && REGNO (args[idx]) == REGNO (reg)
2440                 && (GET_MODE (args[idx]) == mode
2441                     || (is_int_mode (GET_MODE (args[idx]), &arg_mode)
2442                         && (GET_MODE_SIZE (arg_mode) <= UNITS_PER_WORD)
2443                         && (GET_MODE_SIZE (arg_mode) > GET_MODE_SIZE (mode)))))
2444               break;
2445           }
2446       if (!link)
2447         return false;
2448
2449       tmp = cselib_expand_value_rtx (args[idx], scratch, 5);
2450       if (GET_MODE (args[idx]) != mode)
2451         {
2452           if (!tmp || !CONST_INT_P (tmp))
2453             return false;
2454           tmp = gen_int_mode (INTVAL (tmp), mode);
2455         }
2456       if (tmp)
2457         args[idx] = tmp;
2458
2459       targetm.calls.function_arg_advance (args_so_far, arg);
2460     }
2461   if (arg != void_list_node || idx != nargs)
2462     return false;
2463   return true;
2464 }
2465
2466 /* Return a bitmap of the fixed registers contained in IN.  */
2467
2468 static bitmap
2469 copy_fixed_regs (const_bitmap in)
2470 {
2471   bitmap ret;
2472
2473   ret = ALLOC_REG_SET (NULL);
2474   bitmap_and (ret, in, bitmap_view<HARD_REG_SET> (fixed_reg_set));
2475   return ret;
2476 }
2477
2478 /* Apply record_store to all candidate stores in INSN.  Mark INSN
2479    if some part of it is not a candidate store and assigns to a
2480    non-register target.  */
2481
2482 static void
2483 scan_insn (bb_info_t bb_info, rtx_insn *insn, int max_active_local_stores)
2484 {
2485   rtx body;
2486   insn_info_type *insn_info = insn_info_type_pool.allocate ();
2487   int mems_found = 0;
2488   memset (insn_info, 0, sizeof (struct insn_info_type));
2489
2490   if (dump_file && (dump_flags & TDF_DETAILS))
2491     fprintf (dump_file, "\n**scanning insn=%d\n",
2492              INSN_UID (insn));
2493
2494   insn_info->prev_insn = bb_info->last_insn;
2495   insn_info->insn = insn;
2496   bb_info->last_insn = insn_info;
2497
2498   if (DEBUG_INSN_P (insn))
2499     {
2500       insn_info->cannot_delete = true;
2501       return;
2502     }
2503
2504   /* Look at all of the uses in the insn.  */
2505   note_uses (&PATTERN (insn), check_mem_read_use, bb_info);
2506
2507   if (CALL_P (insn))
2508     {
2509       bool const_call;
2510       rtx call, sym;
2511       tree memset_call = NULL_TREE;
2512
2513       insn_info->cannot_delete = true;
2514
2515       /* Const functions cannot do anything bad i.e. read memory,
2516          however, they can read their parameters which may have
2517          been pushed onto the stack.
2518          memset and bzero don't read memory either.  */
2519       const_call = RTL_CONST_CALL_P (insn);
2520       if (!const_call
2521           && (call = get_call_rtx_from (insn))
2522           && (sym = XEXP (XEXP (call, 0), 0))
2523           && GET_CODE (sym) == SYMBOL_REF
2524           && SYMBOL_REF_DECL (sym)
2525           && TREE_CODE (SYMBOL_REF_DECL (sym)) == FUNCTION_DECL
2526           && fndecl_built_in_p (SYMBOL_REF_DECL (sym), BUILT_IN_MEMSET))
2527         memset_call = SYMBOL_REF_DECL (sym);
2528
2529       if (const_call || memset_call)
2530         {
2531           insn_info_t i_ptr = active_local_stores;
2532           insn_info_t last = NULL;
2533
2534           if (dump_file && (dump_flags & TDF_DETAILS))
2535             fprintf (dump_file, "%s call %d\n",
2536                      const_call ? "const" : "memset", INSN_UID (insn));
2537
2538           /* See the head comment of the frame_read field.  */
2539           if (reload_completed
2540               /* Tail calls are storing their arguments using
2541                  arg pointer.  If it is a frame pointer on the target,
2542                  even before reload we need to kill frame pointer based
2543                  stores.  */
2544               || (SIBLING_CALL_P (insn)
2545                   && HARD_FRAME_POINTER_IS_ARG_POINTER))
2546             insn_info->frame_read = true;
2547
2548           /* Loop over the active stores and remove those which are
2549              killed by the const function call.  */
2550           while (i_ptr)
2551             {
2552               bool remove_store = false;
2553
2554               /* The stack pointer based stores are always killed.  */
2555               if (i_ptr->stack_pointer_based)
2556                 remove_store = true;
2557
2558               /* If the frame is read, the frame related stores are killed.  */
2559               else if (insn_info->frame_read)
2560                 {
2561                   store_info *store_info = i_ptr->store_rec;
2562
2563                   /* Skip the clobbers.  */
2564                   while (!store_info->is_set)
2565                     store_info = store_info->next;
2566
2567                   if (store_info->group_id >= 0
2568                       && rtx_group_vec[store_info->group_id]->frame_related)
2569                     remove_store = true;
2570                 }
2571
2572               if (remove_store)
2573                 {
2574                   if (dump_file && (dump_flags & TDF_DETAILS))
2575                     dump_insn_info ("removing from active", i_ptr);
2576
2577                   active_local_stores_len--;
2578                   if (last)
2579                     last->next_local_store = i_ptr->next_local_store;
2580                   else
2581                     active_local_stores = i_ptr->next_local_store;
2582                 }
2583               else
2584                 last = i_ptr;
2585
2586               i_ptr = i_ptr->next_local_store;
2587             }
2588
2589           if (memset_call)
2590             {
2591               rtx args[3];
2592               if (get_call_args (insn, memset_call, args, 3)
2593                   && CONST_INT_P (args[1])
2594                   && CONST_INT_P (args[2])
2595                   && INTVAL (args[2]) > 0)
2596                 {
2597                   rtx mem = gen_rtx_MEM (BLKmode, args[0]);
2598                   set_mem_size (mem, INTVAL (args[2]));
2599                   body = gen_rtx_SET (mem, args[1]);
2600                   mems_found += record_store (body, bb_info);
2601                   if (dump_file && (dump_flags & TDF_DETAILS))
2602                     fprintf (dump_file, "handling memset as BLKmode store\n");
2603                   if (mems_found == 1)
2604                     {
2605                       if (active_local_stores_len++ >= max_active_local_stores)
2606                         {
2607                           active_local_stores_len = 1;
2608                           active_local_stores = NULL;
2609                         }
2610                       insn_info->fixed_regs_live
2611                         = copy_fixed_regs (bb_info->regs_live);
2612                       insn_info->next_local_store = active_local_stores;
2613                       active_local_stores = insn_info;
2614                     }
2615                 }
2616               else
2617                 clear_rhs_from_active_local_stores ();
2618             }
2619         }
2620       else if (SIBLING_CALL_P (insn)
2621                && (reload_completed || HARD_FRAME_POINTER_IS_ARG_POINTER))
2622         /* Arguments for a sibling call that are pushed to memory are passed
2623            using the incoming argument pointer of the current function.  After
2624            reload that might be (and likely is) frame pointer based.  And, if
2625            it is a frame pointer on the target, even before reload we need to
2626            kill frame pointer based stores.  */
2627         add_wild_read (bb_info);
2628       else
2629         /* Every other call, including pure functions, may read any memory
2630            that is not relative to the frame.  */
2631         add_non_frame_wild_read (bb_info);
2632
2633       return;
2634     }
2635
2636   /* Assuming that there are sets in these insns, we cannot delete
2637      them.  */
2638   if ((GET_CODE (PATTERN (insn)) == CLOBBER)
2639       || volatile_refs_p (PATTERN (insn))
2640       || (!cfun->can_delete_dead_exceptions && !insn_nothrow_p (insn))
2641       || (RTX_FRAME_RELATED_P (insn))
2642       || find_reg_note (insn, REG_FRAME_RELATED_EXPR, NULL_RTX))
2643     insn_info->cannot_delete = true;
2644
2645   body = PATTERN (insn);
2646   if (GET_CODE (body) == PARALLEL)
2647     {
2648       int i;
2649       for (i = 0; i < XVECLEN (body, 0); i++)
2650         mems_found += record_store (XVECEXP (body, 0, i), bb_info);
2651     }
2652   else
2653     mems_found += record_store (body, bb_info);
2654
2655   if (dump_file && (dump_flags & TDF_DETAILS))
2656     fprintf (dump_file, "mems_found = %d, cannot_delete = %s\n",
2657              mems_found, insn_info->cannot_delete ? "true" : "false");
2658
2659   /* If we found some sets of mems, add it into the active_local_stores so
2660      that it can be locally deleted if found dead or used for
2661      replace_read and redundant constant store elimination.  Otherwise mark
2662      it as cannot delete.  This simplifies the processing later.  */
2663   if (mems_found == 1)
2664     {
2665       if (active_local_stores_len++ >= max_active_local_stores)
2666         {
2667           active_local_stores_len = 1;
2668           active_local_stores = NULL;
2669         }
2670       insn_info->fixed_regs_live = copy_fixed_regs (bb_info->regs_live);
2671       insn_info->next_local_store = active_local_stores;
2672       active_local_stores = insn_info;
2673     }
2674   else
2675     insn_info->cannot_delete = true;
2676 }
2677
2678
2679 /* Remove BASE from the set of active_local_stores.  This is a
2680    callback from cselib that is used to get rid of the stores in
2681    active_local_stores.  */
2682
2683 static void
2684 remove_useless_values (cselib_val *base)
2685 {
2686   insn_info_t insn_info = active_local_stores;
2687   insn_info_t last = NULL;
2688
2689   while (insn_info)
2690     {
2691       store_info *store_info = insn_info->store_rec;
2692       bool del = false;
2693
2694       /* If ANY of the store_infos match the cselib group that is
2695          being deleted, then the insn cannot be deleted.  */
2696       while (store_info)
2697         {
2698           if ((store_info->group_id == -1)
2699               && (store_info->cse_base == base))
2700             {
2701               del = true;
2702               break;
2703             }
2704           store_info = store_info->next;
2705         }
2706
2707       if (del)
2708         {
2709           active_local_stores_len--;
2710           if (last)
2711             last->next_local_store = insn_info->next_local_store;
2712           else
2713             active_local_stores = insn_info->next_local_store;
2714           free_store_info (insn_info);
2715         }
2716       else
2717         last = insn_info;
2718
2719       insn_info = insn_info->next_local_store;
2720     }
2721 }
2722
2723
2724 /* Do all of step 1.  */
2725
2726 static void
2727 dse_step1 (void)
2728 {
2729   basic_block bb;
2730   bitmap regs_live = BITMAP_ALLOC (&reg_obstack);
2731
2732   cselib_init (0);
2733   all_blocks = BITMAP_ALLOC (NULL);
2734   bitmap_set_bit (all_blocks, ENTRY_BLOCK);
2735   bitmap_set_bit (all_blocks, EXIT_BLOCK);
2736
2737   /* For -O1 reduce the maximum number of active local stores for RTL DSE
2738      since this can consume huge amounts of memory (PR89115).  */
2739   int max_active_local_stores = param_max_dse_active_local_stores;
2740   if (optimize < 2)
2741     max_active_local_stores /= 10;
2742
2743   FOR_ALL_BB_FN (bb, cfun)
2744     {
2745       insn_info_t ptr;
2746       bb_info_t bb_info = dse_bb_info_type_pool.allocate ();
2747
2748       memset (bb_info, 0, sizeof (dse_bb_info_type));
2749       bitmap_set_bit (all_blocks, bb->index);
2750       bb_info->regs_live = regs_live;
2751
2752       bitmap_copy (regs_live, DF_LR_IN (bb));
2753       df_simulate_initialize_forwards (bb, regs_live);
2754
2755       bb_table[bb->index] = bb_info;
2756       cselib_discard_hook = remove_useless_values;
2757
2758       if (bb->index >= NUM_FIXED_BLOCKS)
2759         {
2760           rtx_insn *insn;
2761
2762           active_local_stores = NULL;
2763           active_local_stores_len = 0;
2764           cselib_clear_table ();
2765
2766           /* Scan the insns.  */
2767           FOR_BB_INSNS (bb, insn)
2768             {
2769               if (INSN_P (insn))
2770                 scan_insn (bb_info, insn, max_active_local_stores);
2771               cselib_process_insn (insn);
2772               if (INSN_P (insn))
2773                 df_simulate_one_insn_forwards (bb, insn, regs_live);
2774             }
2775
2776           /* This is something of a hack, because the global algorithm
2777              is supposed to take care of the case where stores go dead
2778              at the end of the function.  However, the global
2779              algorithm must take a more conservative view of block
2780              mode reads than the local alg does.  So to get the case
2781              where you have a store to the frame followed by a non
2782              overlapping block more read, we look at the active local
2783              stores at the end of the function and delete all of the
2784              frame and spill based ones.  */
2785           if (stores_off_frame_dead_at_return
2786               && (EDGE_COUNT (bb->succs) == 0
2787                   || (single_succ_p (bb)
2788                       && single_succ (bb) == EXIT_BLOCK_PTR_FOR_FN (cfun)
2789                       && ! crtl->calls_eh_return)))
2790             {
2791               insn_info_t i_ptr = active_local_stores;
2792               while (i_ptr)
2793                 {
2794                   store_info *store_info = i_ptr->store_rec;
2795
2796                   /* Skip the clobbers.  */
2797                   while (!store_info->is_set)
2798                     store_info = store_info->next;
2799                   if (store_info->group_id >= 0)
2800                     {
2801                       group_info *group = rtx_group_vec[store_info->group_id];
2802                       if (group->frame_related && !i_ptr->cannot_delete)
2803                         delete_dead_store_insn (i_ptr);
2804                     }
2805
2806                   i_ptr = i_ptr->next_local_store;
2807                 }
2808             }
2809
2810           /* Get rid of the loads that were discovered in
2811              replace_read.  Cselib is finished with this block.  */
2812           while (deferred_change_list)
2813             {
2814               deferred_change *next = deferred_change_list->next;
2815
2816               /* There is no reason to validate this change.  That was
2817                  done earlier.  */
2818               *deferred_change_list->loc = deferred_change_list->reg;
2819               deferred_change_pool.remove (deferred_change_list);
2820               deferred_change_list = next;
2821             }
2822
2823           /* Get rid of all of the cselib based store_infos in this
2824              block and mark the containing insns as not being
2825              deletable.  */
2826           ptr = bb_info->last_insn;
2827           while (ptr)
2828             {
2829               if (ptr->contains_cselib_groups)
2830                 {
2831                   store_info *s_info = ptr->store_rec;
2832                   while (s_info && !s_info->is_set)
2833                     s_info = s_info->next;
2834                   if (s_info
2835                       && s_info->redundant_reason
2836                       && s_info->redundant_reason->insn
2837                       && !ptr->cannot_delete)
2838                     {
2839                       if (dump_file && (dump_flags & TDF_DETAILS))
2840                         fprintf (dump_file, "Locally deleting insn %d "
2841                                             "because insn %d stores the "
2842                                             "same value and couldn't be "
2843                                             "eliminated\n",
2844                                  INSN_UID (ptr->insn),
2845                                  INSN_UID (s_info->redundant_reason->insn));
2846                       delete_dead_store_insn (ptr);
2847                     }
2848                   free_store_info (ptr);
2849                 }
2850               else
2851                 {
2852                   store_info *s_info;
2853
2854                   /* Free at least positions_needed bitmaps.  */
2855                   for (s_info = ptr->store_rec; s_info; s_info = s_info->next)
2856                     if (s_info->is_large)
2857                       {
2858                         BITMAP_FREE (s_info->positions_needed.large.bmap);
2859                         s_info->is_large = false;
2860                       }
2861                 }
2862               ptr = ptr->prev_insn;
2863             }
2864
2865           cse_store_info_pool.release ();
2866         }
2867       bb_info->regs_live = NULL;
2868     }
2869
2870   BITMAP_FREE (regs_live);
2871   cselib_finish ();
2872   rtx_group_table->empty ();
2873 }
2874
2875 \f
2876 /*----------------------------------------------------------------------------
2877    Second step.
2878
2879    Assign each byte position in the stores that we are going to
2880    analyze globally to a position in the bitmaps.  Returns true if
2881    there are any bit positions assigned.
2882 ----------------------------------------------------------------------------*/
2883
2884 static void
2885 dse_step2_init (void)
2886 {
2887   unsigned int i;
2888   group_info *group;
2889
2890   FOR_EACH_VEC_ELT (rtx_group_vec, i, group)
2891     {
2892       /* For all non stack related bases, we only consider a store to
2893          be deletable if there are two or more stores for that
2894          position.  This is because it takes one store to make the
2895          other store redundant.  However, for the stores that are
2896          stack related, we consider them if there is only one store
2897          for the position.  We do this because the stack related
2898          stores can be deleted if their is no read between them and
2899          the end of the function.
2900
2901          To make this work in the current framework, we take the stack
2902          related bases add all of the bits from store1 into store2.
2903          This has the effect of making the eligible even if there is
2904          only one store.   */
2905
2906       if (stores_off_frame_dead_at_return && group->frame_related)
2907         {
2908           bitmap_ior_into (group->store2_n, group->store1_n);
2909           bitmap_ior_into (group->store2_p, group->store1_p);
2910           if (dump_file && (dump_flags & TDF_DETAILS))
2911             fprintf (dump_file, "group %d is frame related ", i);
2912         }
2913
2914       group->offset_map_size_n++;
2915       group->offset_map_n = XOBNEWVEC (&dse_obstack, int,
2916                                        group->offset_map_size_n);
2917       group->offset_map_size_p++;
2918       group->offset_map_p = XOBNEWVEC (&dse_obstack, int,
2919                                        group->offset_map_size_p);
2920       group->process_globally = false;
2921       if (dump_file && (dump_flags & TDF_DETAILS))
2922         {
2923           fprintf (dump_file, "group %d(%d+%d): ", i,
2924                    (int)bitmap_count_bits (group->store2_n),
2925                    (int)bitmap_count_bits (group->store2_p));
2926           bitmap_print (dump_file, group->store2_n, "n ", " ");
2927           bitmap_print (dump_file, group->store2_p, "p ", "\n");
2928         }
2929     }
2930 }
2931
2932
2933 /* Init the offset tables.  */
2934
2935 static bool
2936 dse_step2 (void)
2937 {
2938   unsigned int i;
2939   group_info *group;
2940   /* Position 0 is unused because 0 is used in the maps to mean
2941      unused.  */
2942   current_position = 1;
2943   FOR_EACH_VEC_ELT (rtx_group_vec, i, group)
2944     {
2945       bitmap_iterator bi;
2946       unsigned int j;
2947
2948       memset (group->offset_map_n, 0, sizeof (int) * group->offset_map_size_n);
2949       memset (group->offset_map_p, 0, sizeof (int) * group->offset_map_size_p);
2950       bitmap_clear (group->group_kill);
2951
2952       EXECUTE_IF_SET_IN_BITMAP (group->store2_n, 0, j, bi)
2953         {
2954           bitmap_set_bit (group->group_kill, current_position);
2955           if (bitmap_bit_p (group->escaped_n, j))
2956             bitmap_set_bit (kill_on_calls, current_position);
2957           group->offset_map_n[j] = current_position++;
2958           group->process_globally = true;
2959         }
2960       EXECUTE_IF_SET_IN_BITMAP (group->store2_p, 0, j, bi)
2961         {
2962           bitmap_set_bit (group->group_kill, current_position);
2963           if (bitmap_bit_p (group->escaped_p, j))
2964             bitmap_set_bit (kill_on_calls, current_position);
2965           group->offset_map_p[j] = current_position++;
2966           group->process_globally = true;
2967         }
2968     }
2969   return current_position != 1;
2970 }
2971
2972
2973 \f
2974 /*----------------------------------------------------------------------------
2975   Third step.
2976
2977   Build the bit vectors for the transfer functions.
2978 ----------------------------------------------------------------------------*/
2979
2980
2981 /* Look up the bitmap index for OFFSET in GROUP_INFO.  If it is not
2982    there, return 0.  */
2983
2984 static int
2985 get_bitmap_index (group_info *group_info, HOST_WIDE_INT offset)
2986 {
2987   if (offset < 0)
2988     {
2989       HOST_WIDE_INT offset_p = -offset;
2990       if (offset_p >= group_info->offset_map_size_n)
2991         return 0;
2992       return group_info->offset_map_n[offset_p];
2993     }
2994   else
2995     {
2996       if (offset >= group_info->offset_map_size_p)
2997         return 0;
2998       return group_info->offset_map_p[offset];
2999     }
3000 }
3001
3002
3003 /* Process the STORE_INFOs into the bitmaps into GEN and KILL.  KILL
3004    may be NULL. */
3005
3006 static void
3007 scan_stores (store_info *store_info, bitmap gen, bitmap kill)
3008 {
3009   while (store_info)
3010     {
3011       HOST_WIDE_INT i, offset, width;
3012       group_info *group_info
3013         = rtx_group_vec[store_info->group_id];
3014       /* We can (conservatively) ignore stores whose bounds aren't known;
3015          they simply don't generate new global dse opportunities.  */
3016       if (group_info->process_globally
3017           && store_info->offset.is_constant (&offset)
3018           && store_info->width.is_constant (&width))
3019         {
3020           HOST_WIDE_INT end = offset + width;
3021           for (i = offset; i < end; i++)
3022             {
3023               int index = get_bitmap_index (group_info, i);
3024               if (index != 0)
3025                 {
3026                   bitmap_set_bit (gen, index);
3027                   if (kill)
3028                     bitmap_clear_bit (kill, index);
3029                 }
3030             }
3031         }
3032       store_info = store_info->next;
3033     }
3034 }
3035
3036
3037 /* Process the READ_INFOs into the bitmaps into GEN and KILL.  KILL
3038    may be NULL.  */
3039
3040 static void
3041 scan_reads (insn_info_t insn_info, bitmap gen, bitmap kill)
3042 {
3043   read_info_t read_info = insn_info->read_rec;
3044   int i;
3045   group_info *group;
3046
3047   /* If this insn reads the frame, kill all the frame related stores.  */
3048   if (insn_info->frame_read)
3049     {
3050       FOR_EACH_VEC_ELT (rtx_group_vec, i, group)
3051         if (group->process_globally && group->frame_related)
3052           {
3053             if (kill)
3054               bitmap_ior_into (kill, group->group_kill);
3055             bitmap_and_compl_into (gen, group->group_kill);
3056           }
3057     }
3058   if (insn_info->non_frame_wild_read)
3059     {
3060       /* Kill all non-frame related stores.  Kill all stores of variables that
3061          escape.  */
3062       if (kill)
3063         bitmap_ior_into (kill, kill_on_calls);
3064       bitmap_and_compl_into (gen, kill_on_calls);
3065       FOR_EACH_VEC_ELT (rtx_group_vec, i, group)
3066         if (group->process_globally && !group->frame_related)
3067           {
3068             if (kill)
3069               bitmap_ior_into (kill, group->group_kill);
3070             bitmap_and_compl_into (gen, group->group_kill);
3071           }
3072     }
3073   while (read_info)
3074     {
3075       FOR_EACH_VEC_ELT (rtx_group_vec, i, group)
3076         {
3077           if (group->process_globally)
3078             {
3079               if (i == read_info->group_id)
3080                 {
3081                   HOST_WIDE_INT offset, width;
3082                   /* Reads with non-constant size kill all DSE opportunities
3083                      in the group.  */
3084                   if (!read_info->offset.is_constant (&offset)
3085                       || !read_info->width.is_constant (&width)
3086                       || !known_size_p (width))
3087                     {
3088                       /* Handle block mode reads.  */
3089                       if (kill)
3090                         bitmap_ior_into (kill, group->group_kill);
3091                       bitmap_and_compl_into (gen, group->group_kill);
3092                     }
3093                   else
3094                     {
3095                       /* The groups are the same, just process the
3096                          offsets.  */
3097                       HOST_WIDE_INT j;
3098                       HOST_WIDE_INT end = offset + width;
3099                       for (j = offset; j < end; j++)
3100                         {
3101                           int index = get_bitmap_index (group, j);
3102                           if (index != 0)
3103                             {
3104                               if (kill)
3105                                 bitmap_set_bit (kill, index);
3106                               bitmap_clear_bit (gen, index);
3107                             }
3108                         }
3109                     }
3110                 }
3111               else
3112                 {
3113                   /* The groups are different, if the alias sets
3114                      conflict, clear the entire group.  We only need
3115                      to apply this test if the read_info is a cselib
3116                      read.  Anything with a constant base cannot alias
3117                      something else with a different constant
3118                      base.  */
3119                   if ((read_info->group_id < 0)
3120                       && canon_true_dependence (group->base_mem,
3121                                                 GET_MODE (group->base_mem),
3122                                                 group->canon_base_addr,
3123                                                 read_info->mem, NULL_RTX))
3124                     {
3125                       if (kill)
3126                         bitmap_ior_into (kill, group->group_kill);
3127                       bitmap_and_compl_into (gen, group->group_kill);
3128                     }
3129                 }
3130             }
3131         }
3132
3133       read_info = read_info->next;
3134     }
3135 }
3136
3137
3138 /* Return the insn in BB_INFO before the first wild read or if there
3139    are no wild reads in the block, return the last insn.  */
3140
3141 static insn_info_t
3142 find_insn_before_first_wild_read (bb_info_t bb_info)
3143 {
3144   insn_info_t insn_info = bb_info->last_insn;
3145   insn_info_t last_wild_read = NULL;
3146
3147   while (insn_info)
3148     {
3149       if (insn_info->wild_read)
3150         {
3151           last_wild_read = insn_info->prev_insn;
3152           /* Block starts with wild read.  */
3153           if (!last_wild_read)
3154             return NULL;
3155         }
3156
3157       insn_info = insn_info->prev_insn;
3158     }
3159
3160   if (last_wild_read)
3161     return last_wild_read;
3162   else
3163     return bb_info->last_insn;
3164 }
3165
3166
3167 /* Scan the insns in BB_INFO starting at PTR and going to the top of
3168    the block in order to build the gen and kill sets for the block.
3169    We start at ptr which may be the last insn in the block or may be
3170    the first insn with a wild read.  In the latter case we are able to
3171    skip the rest of the block because it just does not matter:
3172    anything that happens is hidden by the wild read.  */
3173
3174 static void
3175 dse_step3_scan (basic_block bb)
3176 {
3177   bb_info_t bb_info = bb_table[bb->index];
3178   insn_info_t insn_info;
3179
3180   insn_info = find_insn_before_first_wild_read (bb_info);
3181
3182   /* In the spill case or in the no_spill case if there is no wild
3183      read in the block, we will need a kill set.  */
3184   if (insn_info == bb_info->last_insn)
3185     {
3186       if (bb_info->kill)
3187         bitmap_clear (bb_info->kill);
3188       else
3189         bb_info->kill = BITMAP_ALLOC (&dse_bitmap_obstack);
3190     }
3191   else
3192     if (bb_info->kill)
3193       BITMAP_FREE (bb_info->kill);
3194
3195   while (insn_info)
3196     {
3197       /* There may have been code deleted by the dce pass run before
3198          this phase.  */
3199       if (insn_info->insn && INSN_P (insn_info->insn))
3200         {
3201           scan_stores (insn_info->store_rec, bb_info->gen, bb_info->kill);
3202           scan_reads (insn_info, bb_info->gen, bb_info->kill);
3203         }
3204
3205       insn_info = insn_info->prev_insn;
3206     }
3207 }
3208
3209
3210 /* Set the gen set of the exit block, and also any block with no
3211    successors that does not have a wild read.  */
3212
3213 static void
3214 dse_step3_exit_block_scan (bb_info_t bb_info)
3215 {
3216   /* The gen set is all 0's for the exit block except for the
3217      frame_pointer_group.  */
3218
3219   if (stores_off_frame_dead_at_return)
3220     {
3221       unsigned int i;
3222       group_info *group;
3223
3224       FOR_EACH_VEC_ELT (rtx_group_vec, i, group)
3225         {
3226           if (group->process_globally && group->frame_related)
3227             bitmap_ior_into (bb_info->gen, group->group_kill);
3228         }
3229     }
3230 }
3231
3232
3233 /* Find all of the blocks that are not backwards reachable from the
3234    exit block or any block with no successors (BB).  These are the
3235    infinite loops or infinite self loops.  These blocks will still
3236    have their bits set in UNREACHABLE_BLOCKS.  */
3237
3238 static void
3239 mark_reachable_blocks (sbitmap unreachable_blocks, basic_block bb)
3240 {
3241   edge e;
3242   edge_iterator ei;
3243
3244   if (bitmap_bit_p (unreachable_blocks, bb->index))
3245     {
3246       bitmap_clear_bit (unreachable_blocks, bb->index);
3247       FOR_EACH_EDGE (e, ei, bb->preds)
3248         {
3249           mark_reachable_blocks (unreachable_blocks, e->src);
3250         }
3251     }
3252 }
3253
3254 /* Build the transfer functions for the function.  */
3255
3256 static void
3257 dse_step3 ()
3258 {
3259   basic_block bb;
3260   sbitmap_iterator sbi;
3261   bitmap all_ones = NULL;
3262   unsigned int i;
3263
3264   auto_sbitmap unreachable_blocks (last_basic_block_for_fn (cfun));
3265   bitmap_ones (unreachable_blocks);
3266
3267   FOR_ALL_BB_FN (bb, cfun)
3268     {
3269       bb_info_t bb_info = bb_table[bb->index];
3270       if (bb_info->gen)
3271         bitmap_clear (bb_info->gen);
3272       else
3273         bb_info->gen = BITMAP_ALLOC (&dse_bitmap_obstack);
3274
3275       if (bb->index == ENTRY_BLOCK)
3276         ;
3277       else if (bb->index == EXIT_BLOCK)
3278         dse_step3_exit_block_scan (bb_info);
3279       else
3280         dse_step3_scan (bb);
3281       if (EDGE_COUNT (bb->succs) == 0)
3282         mark_reachable_blocks (unreachable_blocks, bb);
3283
3284       /* If this is the second time dataflow is run, delete the old
3285          sets.  */
3286       if (bb_info->in)
3287         BITMAP_FREE (bb_info->in);
3288       if (bb_info->out)
3289         BITMAP_FREE (bb_info->out);
3290     }
3291
3292   /* For any block in an infinite loop, we must initialize the out set
3293      to all ones.  This could be expensive, but almost never occurs in
3294      practice. However, it is common in regression tests.  */
3295   EXECUTE_IF_SET_IN_BITMAP (unreachable_blocks, 0, i, sbi)
3296     {
3297       if (bitmap_bit_p (all_blocks, i))
3298         {
3299           bb_info_t bb_info = bb_table[i];
3300           if (!all_ones)
3301             {
3302               unsigned int j;
3303               group_info *group;
3304
3305               all_ones = BITMAP_ALLOC (&dse_bitmap_obstack);
3306               FOR_EACH_VEC_ELT (rtx_group_vec, j, group)
3307                 bitmap_ior_into (all_ones, group->group_kill);
3308             }
3309           if (!bb_info->out)
3310             {
3311               bb_info->out = BITMAP_ALLOC (&dse_bitmap_obstack);
3312               bitmap_copy (bb_info->out, all_ones);
3313             }
3314         }
3315     }
3316
3317   if (all_ones)
3318     BITMAP_FREE (all_ones);
3319 }
3320
3321
3322 \f
3323 /*----------------------------------------------------------------------------
3324    Fourth step.
3325
3326    Solve the bitvector equations.
3327 ----------------------------------------------------------------------------*/
3328
3329
3330 /* Confluence function for blocks with no successors.  Create an out
3331    set from the gen set of the exit block.  This block logically has
3332    the exit block as a successor.  */
3333
3334
3335
3336 static void
3337 dse_confluence_0 (basic_block bb)
3338 {
3339   bb_info_t bb_info = bb_table[bb->index];
3340
3341   if (bb->index == EXIT_BLOCK)
3342     return;
3343
3344   if (!bb_info->out)
3345     {
3346       bb_info->out = BITMAP_ALLOC (&dse_bitmap_obstack);
3347       bitmap_copy (bb_info->out, bb_table[EXIT_BLOCK]->gen);
3348     }
3349 }
3350
3351 /* Propagate the information from the in set of the dest of E to the
3352    out set of the src of E.  If the various in or out sets are not
3353    there, that means they are all ones.  */
3354
3355 static bool
3356 dse_confluence_n (edge e)
3357 {
3358   bb_info_t src_info = bb_table[e->src->index];
3359   bb_info_t dest_info = bb_table[e->dest->index];
3360
3361   if (dest_info->in)
3362     {
3363       if (src_info->out)
3364         bitmap_and_into (src_info->out, dest_info->in);
3365       else
3366         {
3367           src_info->out = BITMAP_ALLOC (&dse_bitmap_obstack);
3368           bitmap_copy (src_info->out, dest_info->in);
3369         }
3370     }
3371   return true;
3372 }
3373
3374
3375 /* Propagate the info from the out to the in set of BB_INDEX's basic
3376    block.  There are three cases:
3377
3378    1) The block has no kill set.  In this case the kill set is all
3379    ones.  It does not matter what the out set of the block is, none of
3380    the info can reach the top.  The only thing that reaches the top is
3381    the gen set and we just copy the set.
3382
3383    2) There is a kill set but no out set and bb has successors.  In
3384    this case we just return. Eventually an out set will be created and
3385    it is better to wait than to create a set of ones.
3386
3387    3) There is both a kill and out set.  We apply the obvious transfer
3388    function.
3389 */
3390
3391 static bool
3392 dse_transfer_function (int bb_index)
3393 {
3394   bb_info_t bb_info = bb_table[bb_index];
3395
3396   if (bb_info->kill)
3397     {
3398       if (bb_info->out)
3399         {
3400           /* Case 3 above.  */
3401           if (bb_info->in)
3402             return bitmap_ior_and_compl (bb_info->in, bb_info->gen,
3403                                          bb_info->out, bb_info->kill);
3404           else
3405             {
3406               bb_info->in = BITMAP_ALLOC (&dse_bitmap_obstack);
3407               bitmap_ior_and_compl (bb_info->in, bb_info->gen,
3408                                     bb_info->out, bb_info->kill);
3409               return true;
3410             }
3411         }
3412       else
3413         /* Case 2 above.  */
3414         return false;
3415     }
3416   else
3417     {
3418       /* Case 1 above.  If there is already an in set, nothing
3419          happens.  */
3420       if (bb_info->in)
3421         return false;
3422       else
3423         {
3424           bb_info->in = BITMAP_ALLOC (&dse_bitmap_obstack);
3425           bitmap_copy (bb_info->in, bb_info->gen);
3426           return true;
3427         }
3428     }
3429 }
3430
3431 /* Solve the dataflow equations.  */
3432
3433 static void
3434 dse_step4 (void)
3435 {
3436   df_simple_dataflow (DF_BACKWARD, NULL, dse_confluence_0,
3437                       dse_confluence_n, dse_transfer_function,
3438                       all_blocks, df_get_postorder (DF_BACKWARD),
3439                       df_get_n_blocks (DF_BACKWARD));
3440   if (dump_file && (dump_flags & TDF_DETAILS))
3441     {
3442       basic_block bb;
3443
3444       fprintf (dump_file, "\n\n*** Global dataflow info after analysis.\n");
3445       FOR_ALL_BB_FN (bb, cfun)
3446         {
3447           bb_info_t bb_info = bb_table[bb->index];
3448
3449           df_print_bb_index (bb, dump_file);
3450           if (bb_info->in)
3451             bitmap_print (dump_file, bb_info->in, "  in:   ", "\n");
3452           else
3453             fprintf (dump_file, "  in:   *MISSING*\n");
3454           if (bb_info->gen)
3455             bitmap_print (dump_file, bb_info->gen, "  gen:  ", "\n");
3456           else
3457             fprintf (dump_file, "  gen:  *MISSING*\n");
3458           if (bb_info->kill)
3459             bitmap_print (dump_file, bb_info->kill, "  kill: ", "\n");
3460           else
3461             fprintf (dump_file, "  kill: *MISSING*\n");
3462           if (bb_info->out)
3463             bitmap_print (dump_file, bb_info->out, "  out:  ", "\n");
3464           else
3465             fprintf (dump_file, "  out:  *MISSING*\n\n");
3466         }
3467     }
3468 }
3469
3470
3471 \f
3472 /*----------------------------------------------------------------------------
3473    Fifth step.
3474
3475    Delete the stores that can only be deleted using the global information.
3476 ----------------------------------------------------------------------------*/
3477
3478
3479 static void
3480 dse_step5 (void)
3481 {
3482   basic_block bb;
3483   FOR_EACH_BB_FN (bb, cfun)
3484     {
3485       bb_info_t bb_info = bb_table[bb->index];
3486       insn_info_t insn_info = bb_info->last_insn;
3487       bitmap v = bb_info->out;
3488
3489       while (insn_info)
3490         {
3491           bool deleted = false;
3492           if (dump_file && insn_info->insn)
3493             {
3494               fprintf (dump_file, "starting to process insn %d\n",
3495                        INSN_UID (insn_info->insn));
3496               bitmap_print (dump_file, v, "  v:  ", "\n");
3497             }
3498
3499           /* There may have been code deleted by the dce pass run before
3500              this phase.  */
3501           if (insn_info->insn
3502               && INSN_P (insn_info->insn)
3503               && (!insn_info->cannot_delete)
3504               && (!bitmap_empty_p (v)))
3505             {
3506               store_info *store_info = insn_info->store_rec;
3507
3508               /* Try to delete the current insn.  */
3509               deleted = true;
3510
3511               /* Skip the clobbers.  */
3512               while (!store_info->is_set)
3513                 store_info = store_info->next;
3514
3515               HOST_WIDE_INT i, offset, width;
3516               group_info *group_info = rtx_group_vec[store_info->group_id];
3517
3518               if (!store_info->offset.is_constant (&offset)
3519                   || !store_info->width.is_constant (&width))
3520                 deleted = false;
3521               else
3522                 {
3523                   HOST_WIDE_INT end = offset + width;
3524                   for (i = offset; i < end; i++)
3525                     {
3526                       int index = get_bitmap_index (group_info, i);
3527
3528                       if (dump_file && (dump_flags & TDF_DETAILS))
3529                         fprintf (dump_file, "i = %d, index = %d\n",
3530                                  (int) i, index);
3531                       if (index == 0 || !bitmap_bit_p (v, index))
3532                         {
3533                           if (dump_file && (dump_flags & TDF_DETAILS))
3534                             fprintf (dump_file, "failing at i = %d\n",
3535                                      (int) i);
3536                           deleted = false;
3537                           break;
3538                         }
3539                     }
3540                 }
3541               if (deleted)
3542                 {
3543                   if (dbg_cnt (dse)
3544                       && check_for_inc_dec_1 (insn_info))
3545                     {
3546                       delete_insn (insn_info->insn);
3547                       insn_info->insn = NULL;
3548                       globally_deleted++;
3549                     }
3550                 }
3551             }
3552           /* We do want to process the local info if the insn was
3553              deleted.  For instance, if the insn did a wild read, we
3554              no longer need to trash the info.  */
3555           if (insn_info->insn
3556               && INSN_P (insn_info->insn)
3557               && (!deleted))
3558             {
3559               scan_stores (insn_info->store_rec, v, NULL);
3560               if (insn_info->wild_read)
3561                 {
3562                   if (dump_file && (dump_flags & TDF_DETAILS))
3563                     fprintf (dump_file, "wild read\n");
3564                   bitmap_clear (v);
3565                 }
3566               else if (insn_info->read_rec
3567                        || insn_info->non_frame_wild_read
3568                        || insn_info->frame_read)
3569                 {
3570                   if (dump_file && (dump_flags & TDF_DETAILS))
3571                     {
3572                       if (!insn_info->non_frame_wild_read
3573                           && !insn_info->frame_read)
3574                         fprintf (dump_file, "regular read\n");
3575                       if (insn_info->non_frame_wild_read)
3576                         fprintf (dump_file, "non-frame wild read\n");
3577                       if (insn_info->frame_read)
3578                         fprintf (dump_file, "frame read\n");
3579                     }
3580                   scan_reads (insn_info, v, NULL);
3581                 }
3582             }
3583
3584           insn_info = insn_info->prev_insn;
3585         }
3586     }
3587 }
3588
3589
3590 \f
3591 /*----------------------------------------------------------------------------
3592    Sixth step.
3593
3594    Delete stores made redundant by earlier stores (which store the same
3595    value) that couldn't be eliminated.
3596 ----------------------------------------------------------------------------*/
3597
3598 static void
3599 dse_step6 (void)
3600 {
3601   basic_block bb;
3602
3603   FOR_ALL_BB_FN (bb, cfun)
3604     {
3605       bb_info_t bb_info = bb_table[bb->index];
3606       insn_info_t insn_info = bb_info->last_insn;
3607
3608       while (insn_info)
3609         {
3610           /* There may have been code deleted by the dce pass run before
3611              this phase.  */
3612           if (insn_info->insn
3613               && INSN_P (insn_info->insn)
3614               && !insn_info->cannot_delete)
3615             {
3616               store_info *s_info = insn_info->store_rec;
3617
3618               while (s_info && !s_info->is_set)
3619                 s_info = s_info->next;
3620               if (s_info
3621                   && s_info->redundant_reason
3622                   && s_info->redundant_reason->insn
3623                   && INSN_P (s_info->redundant_reason->insn))
3624                 {
3625                   rtx_insn *rinsn = s_info->redundant_reason->insn;
3626                   if (dump_file && (dump_flags & TDF_DETAILS))
3627                     fprintf (dump_file, "Locally deleting insn %d "
3628                                         "because insn %d stores the "
3629                                         "same value and couldn't be "
3630                                         "eliminated\n",
3631                                         INSN_UID (insn_info->insn),
3632                                         INSN_UID (rinsn));
3633                   delete_dead_store_insn (insn_info);
3634                 }
3635             }
3636           insn_info = insn_info->prev_insn;
3637         }
3638     }
3639 }
3640 \f
3641 /*----------------------------------------------------------------------------
3642    Seventh step.
3643
3644    Destroy everything left standing.
3645 ----------------------------------------------------------------------------*/
3646
3647 static void
3648 dse_step7 (void)
3649 {
3650   bitmap_obstack_release (&dse_bitmap_obstack);
3651   obstack_free (&dse_obstack, NULL);
3652
3653   end_alias_analysis ();
3654   free (bb_table);
3655   delete rtx_group_table;
3656   rtx_group_table = NULL;
3657   rtx_group_vec.release ();
3658   BITMAP_FREE (all_blocks);
3659   BITMAP_FREE (scratch);
3660
3661   rtx_store_info_pool.release ();
3662   read_info_type_pool.release ();
3663   insn_info_type_pool.release ();
3664   dse_bb_info_type_pool.release ();
3665   group_info_pool.release ();
3666   deferred_change_pool.release ();
3667 }
3668
3669
3670 /* -------------------------------------------------------------------------
3671    DSE
3672    ------------------------------------------------------------------------- */
3673
3674 /* Callback for running pass_rtl_dse.  */
3675
3676 static unsigned int
3677 rest_of_handle_dse (void)
3678 {
3679   df_set_flags (DF_DEFER_INSN_RESCAN);
3680
3681   /* Need the notes since we must track live hardregs in the forwards
3682      direction.  */
3683   df_note_add_problem ();
3684   df_analyze ();
3685
3686   dse_step0 ();
3687   dse_step1 ();
3688   /* DSE can eliminate potentially-trapping MEMs.
3689      Remove any EH edges associated with them, since otherwise
3690      DF_LR_RUN_DCE will complain later.  */
3691   if ((locally_deleted || globally_deleted)
3692       && cfun->can_throw_non_call_exceptions
3693       && purge_all_dead_edges ())
3694     {
3695       free_dominance_info (CDI_DOMINATORS);
3696       delete_unreachable_blocks ();
3697     }
3698   dse_step2_init ();
3699   if (dse_step2 ())
3700     {
3701       df_set_flags (DF_LR_RUN_DCE);
3702       df_analyze ();
3703       if (dump_file && (dump_flags & TDF_DETAILS))
3704         fprintf (dump_file, "doing global processing\n");
3705       dse_step3 ();
3706       dse_step4 ();
3707       dse_step5 ();
3708     }
3709
3710   dse_step6 ();
3711   dse_step7 ();
3712
3713   if (dump_file)
3714     fprintf (dump_file, "dse: local deletions = %d, global deletions = %d\n",
3715              locally_deleted, globally_deleted);
3716
3717   /* DSE can eliminate potentially-trapping MEMs.
3718      Remove any EH edges associated with them.  */
3719   if ((locally_deleted || globally_deleted)
3720       && cfun->can_throw_non_call_exceptions
3721       && purge_all_dead_edges ())
3722     {
3723       free_dominance_info (CDI_DOMINATORS);
3724       cleanup_cfg (0);
3725     }
3726
3727   return 0;
3728 }
3729
3730 namespace {
3731
3732 const pass_data pass_data_rtl_dse1 =
3733 {
3734   RTL_PASS, /* type */
3735   "dse1", /* name */
3736   OPTGROUP_NONE, /* optinfo_flags */
3737   TV_DSE1, /* tv_id */
3738   0, /* properties_required */
3739   0, /* properties_provided */
3740   0, /* properties_destroyed */
3741   0, /* todo_flags_start */
3742   TODO_df_finish, /* todo_flags_finish */
3743 };
3744
3745 class pass_rtl_dse1 : public rtl_opt_pass
3746 {
3747 public:
3748   pass_rtl_dse1 (gcc::context *ctxt)
3749     : rtl_opt_pass (pass_data_rtl_dse1, ctxt)
3750   {}
3751
3752   /* opt_pass methods: */
3753   bool gate (function *) final override
3754     {
3755       return optimize > 0 && flag_dse && dbg_cnt (dse1);
3756     }
3757
3758   unsigned int execute (function *) final override
3759   {
3760     return rest_of_handle_dse ();
3761   }
3762
3763 }; // class pass_rtl_dse1
3764
3765 } // anon namespace
3766
3767 rtl_opt_pass *
3768 make_pass_rtl_dse1 (gcc::context *ctxt)
3769 {
3770   return new pass_rtl_dse1 (ctxt);
3771 }
3772
3773 namespace {
3774
3775 const pass_data pass_data_rtl_dse2 =
3776 {
3777   RTL_PASS, /* type */
3778   "dse2", /* name */
3779   OPTGROUP_NONE, /* optinfo_flags */
3780   TV_DSE2, /* tv_id */
3781   0, /* properties_required */
3782   0, /* properties_provided */
3783   0, /* properties_destroyed */
3784   0, /* todo_flags_start */
3785   TODO_df_finish, /* todo_flags_finish */
3786 };
3787
3788 class pass_rtl_dse2 : public rtl_opt_pass
3789 {
3790 public:
3791   pass_rtl_dse2 (gcc::context *ctxt)
3792     : rtl_opt_pass (pass_data_rtl_dse2, ctxt)
3793   {}
3794
3795   /* opt_pass methods: */
3796   bool gate (function *) final override
3797     {
3798       return optimize > 0 && flag_dse && dbg_cnt (dse2);
3799     }
3800
3801   unsigned int execute (function *) final override
3802   {
3803     return rest_of_handle_dse ();
3804   }
3805
3806 }; // class pass_rtl_dse2
3807
3808 } // anon namespace
3809
3810 rtl_opt_pass *
3811 make_pass_rtl_dse2 (gcc::context *ctxt)
3812 {
3813   return new pass_rtl_dse2 (ctxt);
3814 }