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