OSDN Git Service

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