OSDN Git Service

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