OSDN Git Service

2004-05-17 Steve Kargl <kargls@comcast.net>
[pf3gnuchains/gcc-fork.git] / gcc / gcse.c
1 /* Global common subexpression elimination/Partial redundancy elimination
2    and global constant/copy propagation for GNU compiler.
3    Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004
4    Free Software Foundation, Inc.
5
6 This file is part of GCC.
7
8 GCC is free software; you can redistribute it and/or modify it under
9 the terms of the GNU General Public License as published by the Free
10 Software Foundation; either version 2, or (at your option) any later
11 version.
12
13 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
14 WARRANTY; without even the implied warranty of MERCHANTABILITY or
15 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
16 for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with GCC; see the file COPYING.  If not, write to the Free
20 Software Foundation, 59 Temple Place - Suite 330, Boston, MA
21 02111-1307, USA.  */
22
23 /* TODO
24    - reordering of memory allocation and freeing to be more space efficient
25    - do rough calc of how many regs are needed in each block, and a rough
26      calc of how many regs are available in each class and use that to
27      throttle back the code in cases where RTX_COST is minimal.
28    - a store to the same address as a load does not kill the load if the
29      source of the store is also the destination of the load.  Handling this
30      allows more load motion, particularly out of loops.
31    - ability to realloc sbitmap vectors would allow one initial computation
32      of reg_set_in_block with only subsequent additions, rather than
33      recomputing it for each pass
34
35 */
36
37 /* References searched while implementing this.
38
39    Compilers Principles, Techniques and Tools
40    Aho, Sethi, Ullman
41    Addison-Wesley, 1988
42
43    Global Optimization by Suppression of Partial Redundancies
44    E. Morel, C. Renvoise
45    communications of the acm, Vol. 22, Num. 2, Feb. 1979
46
47    A Portable Machine-Independent Global Optimizer - Design and Measurements
48    Frederick Chow
49    Stanford Ph.D. thesis, Dec. 1983
50
51    A Fast Algorithm for Code Movement Optimization
52    D.M. Dhamdhere
53    SIGPLAN Notices, Vol. 23, Num. 10, Oct. 1988
54
55    A Solution to a Problem with Morel and Renvoise's
56    Global Optimization by Suppression of Partial Redundancies
57    K-H Drechsler, M.P. Stadel
58    ACM TOPLAS, Vol. 10, Num. 4, Oct. 1988
59
60    Practical Adaptation of the Global Optimization
61    Algorithm of Morel and Renvoise
62    D.M. Dhamdhere
63    ACM TOPLAS, Vol. 13, Num. 2. Apr. 1991
64
65    Efficiently Computing Static Single Assignment Form and the Control
66    Dependence Graph
67    R. Cytron, J. Ferrante, B.K. Rosen, M.N. Wegman, and F.K. Zadeck
68    ACM TOPLAS, Vol. 13, Num. 4, Oct. 1991
69
70    Lazy Code Motion
71    J. Knoop, O. Ruthing, B. Steffen
72    ACM SIGPLAN Notices Vol. 27, Num. 7, Jul. 1992, '92 Conference on PLDI
73
74    What's In a Region?  Or Computing Control Dependence Regions in Near-Linear
75    Time for Reducible Flow Control
76    Thomas Ball
77    ACM Letters on Programming Languages and Systems,
78    Vol. 2, Num. 1-4, Mar-Dec 1993
79
80    An Efficient Representation for Sparse Sets
81    Preston Briggs, Linda Torczon
82    ACM Letters on Programming Languages and Systems,
83    Vol. 2, Num. 1-4, Mar-Dec 1993
84
85    A Variation of Knoop, Ruthing, and Steffen's Lazy Code Motion
86    K-H Drechsler, M.P. Stadel
87    ACM SIGPLAN Notices, Vol. 28, Num. 5, May 1993
88
89    Partial Dead Code Elimination
90    J. Knoop, O. Ruthing, B. Steffen
91    ACM SIGPLAN Notices, Vol. 29, Num. 6, Jun. 1994
92
93    Effective Partial Redundancy Elimination
94    P. Briggs, K.D. Cooper
95    ACM SIGPLAN Notices, Vol. 29, Num. 6, Jun. 1994
96
97    The Program Structure Tree: Computing Control Regions in Linear Time
98    R. Johnson, D. Pearson, K. Pingali
99    ACM SIGPLAN Notices, Vol. 29, Num. 6, Jun. 1994
100
101    Optimal Code Motion: Theory and Practice
102    J. Knoop, O. Ruthing, B. Steffen
103    ACM TOPLAS, Vol. 16, Num. 4, Jul. 1994
104
105    The power of assignment motion
106    J. Knoop, O. Ruthing, B. Steffen
107    ACM SIGPLAN Notices Vol. 30, Num. 6, Jun. 1995, '95 Conference on PLDI
108
109    Global code motion / global value numbering
110    C. Click
111    ACM SIGPLAN Notices Vol. 30, Num. 6, Jun. 1995, '95 Conference on PLDI
112
113    Value Driven Redundancy Elimination
114    L.T. Simpson
115    Rice University Ph.D. thesis, Apr. 1996
116
117    Value Numbering
118    L.T. Simpson
119    Massively Scalar Compiler Project, Rice University, Sep. 1996
120
121    High Performance Compilers for Parallel Computing
122    Michael Wolfe
123    Addison-Wesley, 1996
124
125    Advanced Compiler Design and Implementation
126    Steven Muchnick
127    Morgan Kaufmann, 1997
128
129    Building an Optimizing Compiler
130    Robert Morgan
131    Digital Press, 1998
132
133    People wishing to speed up the code here should read:
134      Elimination Algorithms for Data Flow Analysis
135      B.G. Ryder, M.C. Paull
136      ACM Computing Surveys, Vol. 18, Num. 3, Sep. 1986
137
138      How to Analyze Large Programs Efficiently and Informatively
139      D.M. Dhamdhere, B.K. Rosen, F.K. Zadeck
140      ACM SIGPLAN Notices Vol. 27, Num. 7, Jul. 1992, '92 Conference on PLDI
141
142    People wishing to do something different can find various possibilities
143    in the above papers and elsewhere.
144 */
145
146 #include "config.h"
147 #include "system.h"
148 #include "coretypes.h"
149 #include "tm.h"
150 #include "toplev.h"
151
152 #include "rtl.h"
153 #include "tree.h"
154 #include "tm_p.h"
155 #include "regs.h"
156 #include "hard-reg-set.h"
157 #include "flags.h"
158 #include "real.h"
159 #include "insn-config.h"
160 #include "recog.h"
161 #include "basic-block.h"
162 #include "output.h"
163 #include "function.h"
164 #include "expr.h"
165 #include "except.h"
166 #include "ggc.h"
167 #include "params.h"
168 #include "cselib.h"
169 #include "intl.h"
170 #include "obstack.h"
171
172 /* Propagate flow information through back edges and thus enable PRE's
173    moving loop invariant calculations out of loops.
174
175    Originally this tended to create worse overall code, but several
176    improvements during the development of PRE seem to have made following
177    back edges generally a win.
178
179    Note much of the loop invariant code motion done here would normally
180    be done by loop.c, which has more heuristics for when to move invariants
181    out of loops.  At some point we might need to move some of those
182    heuristics into gcse.c.  */
183
184 /* We support GCSE via Partial Redundancy Elimination.  PRE optimizations
185    are a superset of those done by GCSE.
186
187    We perform the following steps:
188
189    1) Compute basic block information.
190
191    2) Compute table of places where registers are set.
192
193    3) Perform copy/constant propagation.
194
195    4) Perform global cse using lazy code motion if not optimizing
196       for size, or code hoisting if we are.
197
198    5) Perform another pass of copy/constant propagation.
199
200    Two passes of copy/constant propagation are done because the first one
201    enables more GCSE and the second one helps to clean up the copies that
202    GCSE creates.  This is needed more for PRE than for Classic because Classic
203    GCSE will try to use an existing register containing the common
204    subexpression rather than create a new one.  This is harder to do for PRE
205    because of the code motion (which Classic GCSE doesn't do).
206
207    Expressions we are interested in GCSE-ing are of the form
208    (set (pseudo-reg) (expression)).
209    Function want_to_gcse_p says what these are.
210
211    PRE handles moving invariant expressions out of loops (by treating them as
212    partially redundant).
213
214    Eventually it would be nice to replace cse.c/gcse.c with SSA (static single
215    assignment) based GVN (global value numbering).  L. T. Simpson's paper
216    (Rice University) on value numbering is a useful reference for this.
217
218    **********************
219
220    We used to support multiple passes but there are diminishing returns in
221    doing so.  The first pass usually makes 90% of the changes that are doable.
222    A second pass can make a few more changes made possible by the first pass.
223    Experiments show any further passes don't make enough changes to justify
224    the expense.
225
226    A study of spec92 using an unlimited number of passes:
227    [1 pass] = 1208 substitutions, [2] = 577, [3] = 202, [4] = 192, [5] = 83,
228    [6] = 34, [7] = 17, [8] = 9, [9] = 4, [10] = 4, [11] = 2,
229    [12] = 2, [13] = 1, [15] = 1, [16] = 2, [41] = 1
230
231    It was found doing copy propagation between each pass enables further
232    substitutions.
233
234    PRE is quite expensive in complicated functions because the DFA can take
235    awhile to converge.  Hence we only perform one pass.  The parameter max-gcse-passes can
236    be modified if one wants to experiment.
237
238    **********************
239
240    The steps for PRE are:
241
242    1) Build the hash table of expressions we wish to GCSE (expr_hash_table).
243
244    2) Perform the data flow analysis for PRE.
245
246    3) Delete the redundant instructions
247
248    4) Insert the required copies [if any] that make the partially
249       redundant instructions fully redundant.
250
251    5) For other reaching expressions, insert an instruction to copy the value
252       to a newly created pseudo that will reach the redundant instruction.
253
254    The deletion is done first so that when we do insertions we
255    know which pseudo reg to use.
256
257    Various papers have argued that PRE DFA is expensive (O(n^2)) and others
258    argue it is not.  The number of iterations for the algorithm to converge
259    is typically 2-4 so I don't view it as that expensive (relatively speaking).
260
261    PRE GCSE depends heavily on the second CSE pass to clean up the copies
262    we create.  To make an expression reach the place where it's redundant,
263    the result of the expression is copied to a new register, and the redundant
264    expression is deleted by replacing it with this new register.  Classic GCSE
265    doesn't have this problem as much as it computes the reaching defs of
266    each register in each block and thus can try to use an existing register.
267
268    **********************
269
270    A fair bit of simplicity is created by creating small functions for simple
271    tasks, even when the function is only called in one place.  This may
272    measurably slow things down [or may not] by creating more function call
273    overhead than is necessary.  The source is laid out so that it's trivial
274    to make the affected functions inline so that one can measure what speed
275    up, if any, can be achieved, and maybe later when things settle things can
276    be rearranged.
277
278    Help stamp out big monolithic functions!  */
279 \f
280 /* GCSE global vars.  */
281
282 /* -dG dump file.  */
283 static FILE *gcse_file;
284
285 /* Note whether or not we should run jump optimization after gcse.  We
286    want to do this for two cases.
287
288     * If we changed any jumps via cprop.
289
290     * If we added any labels via edge splitting.  */
291
292 static int run_jump_opt_after_gcse;
293
294 /* Bitmaps are normally not included in debugging dumps.
295    However it's useful to be able to print them from GDB.
296    We could create special functions for this, but it's simpler to
297    just allow passing stderr to the dump_foo fns.  Since stderr can
298    be a macro, we store a copy here.  */
299 static FILE *debug_stderr;
300
301 /* An obstack for our working variables.  */
302 static struct obstack gcse_obstack;
303
304 struct reg_use {rtx reg_rtx; };
305
306 /* Hash table of expressions.  */
307
308 struct expr
309 {
310   /* The expression (SET_SRC for expressions, PATTERN for assignments).  */
311   rtx expr;
312   /* Index in the available expression bitmaps.  */
313   int bitmap_index;
314   /* Next entry with the same hash.  */
315   struct expr *next_same_hash;
316   /* List of anticipatable occurrences in basic blocks in the function.
317      An "anticipatable occurrence" is one that is the first occurrence in the
318      basic block, the operands are not modified in the basic block prior
319      to the occurrence and the output is not used between the start of
320      the block and the occurrence.  */
321   struct occr *antic_occr;
322   /* List of available occurrence in basic blocks in the function.
323      An "available occurrence" is one that is the last occurrence in the
324      basic block and the operands are not modified by following statements in
325      the basic block [including this insn].  */
326   struct occr *avail_occr;
327   /* Non-null if the computation is PRE redundant.
328      The value is the newly created pseudo-reg to record a copy of the
329      expression in all the places that reach the redundant copy.  */
330   rtx reaching_reg;
331 };
332
333 /* Occurrence of an expression.
334    There is one per basic block.  If a pattern appears more than once the
335    last appearance is used [or first for anticipatable expressions].  */
336
337 struct occr
338 {
339   /* Next occurrence of this expression.  */
340   struct occr *next;
341   /* The insn that computes the expression.  */
342   rtx insn;
343   /* Nonzero if this [anticipatable] occurrence has been deleted.  */
344   char deleted_p;
345   /* Nonzero if this [available] occurrence has been copied to
346      reaching_reg.  */
347   /* ??? This is mutually exclusive with deleted_p, so they could share
348      the same byte.  */
349   char copied_p;
350 };
351
352 /* Expression and copy propagation hash tables.
353    Each hash table is an array of buckets.
354    ??? It is known that if it were an array of entries, structure elements
355    `next_same_hash' and `bitmap_index' wouldn't be necessary.  However, it is
356    not clear whether in the final analysis a sufficient amount of memory would
357    be saved as the size of the available expression bitmaps would be larger
358    [one could build a mapping table without holes afterwards though].
359    Someday I'll perform the computation and figure it out.  */
360
361 struct hash_table
362 {
363   /* The table itself.
364      This is an array of `expr_hash_table_size' elements.  */
365   struct expr **table;
366
367   /* Size of the hash table, in elements.  */
368   unsigned int size;
369
370   /* Number of hash table elements.  */
371   unsigned int n_elems;
372
373   /* Whether the table is expression of copy propagation one.  */
374   int set_p;
375 };
376
377 /* Expression hash table.  */
378 static struct hash_table expr_hash_table;
379
380 /* Copy propagation hash table.  */
381 static struct hash_table set_hash_table;
382
383 /* Mapping of uids to cuids.
384    Only real insns get cuids.  */
385 static int *uid_cuid;
386
387 /* Highest UID in UID_CUID.  */
388 static int max_uid;
389
390 /* Get the cuid of an insn.  */
391 #ifdef ENABLE_CHECKING
392 #define INSN_CUID(INSN) (INSN_UID (INSN) > max_uid ? (abort (), 0) : uid_cuid[INSN_UID (INSN)])
393 #else
394 #define INSN_CUID(INSN) (uid_cuid[INSN_UID (INSN)])
395 #endif
396
397 /* Number of cuids.  */
398 static int max_cuid;
399
400 /* Mapping of cuids to insns.  */
401 static rtx *cuid_insn;
402
403 /* Get insn from cuid.  */
404 #define CUID_INSN(CUID) (cuid_insn[CUID])
405
406 /* Maximum register number in function prior to doing gcse + 1.
407    Registers created during this pass have regno >= max_gcse_regno.
408    This is named with "gcse" to not collide with global of same name.  */
409 static unsigned int max_gcse_regno;
410
411 /* Table of registers that are modified.
412
413    For each register, each element is a list of places where the pseudo-reg
414    is set.
415
416    For simplicity, GCSE is done on sets of pseudo-regs only.  PRE GCSE only
417    requires knowledge of which blocks kill which regs [and thus could use
418    a bitmap instead of the lists `reg_set_table' uses].
419
420    `reg_set_table' and could be turned into an array of bitmaps (num-bbs x
421    num-regs) [however perhaps it may be useful to keep the data as is].  One
422    advantage of recording things this way is that `reg_set_table' is fairly
423    sparse with respect to pseudo regs but for hard regs could be fairly dense
424    [relatively speaking].  And recording sets of pseudo-regs in lists speeds
425    up functions like compute_transp since in the case of pseudo-regs we only
426    need to iterate over the number of times a pseudo-reg is set, not over the
427    number of basic blocks [clearly there is a bit of a slow down in the cases
428    where a pseudo is set more than once in a block, however it is believed
429    that the net effect is to speed things up].  This isn't done for hard-regs
430    because recording call-clobbered hard-regs in `reg_set_table' at each
431    function call can consume a fair bit of memory, and iterating over
432    hard-regs stored this way in compute_transp will be more expensive.  */
433
434 typedef struct reg_set
435 {
436   /* The next setting of this register.  */
437   struct reg_set *next;
438   /* The insn where it was set.  */
439   rtx insn;
440 } reg_set;
441
442 static reg_set **reg_set_table;
443
444 /* Size of `reg_set_table'.
445    The table starts out at max_gcse_regno + slop, and is enlarged as
446    necessary.  */
447 static int reg_set_table_size;
448
449 /* Amount to grow `reg_set_table' by when it's full.  */
450 #define REG_SET_TABLE_SLOP 100
451
452 /* This is a list of expressions which are MEMs and will be used by load
453    or store motion.
454    Load motion tracks MEMs which aren't killed by
455    anything except itself. (ie, loads and stores to a single location).
456    We can then allow movement of these MEM refs with a little special
457    allowance. (all stores copy the same value to the reaching reg used
458    for the loads).  This means all values used to store into memory must have
459    no side effects so we can re-issue the setter value.
460    Store Motion uses this structure as an expression table to track stores
461    which look interesting, and might be moveable towards the exit block.  */
462
463 struct ls_expr
464 {
465   struct expr * expr;           /* Gcse expression reference for LM.  */
466   rtx pattern;                  /* Pattern of this mem.  */
467   rtx pattern_regs;             /* List of registers mentioned by the mem.  */
468   rtx loads;                    /* INSN list of loads seen.  */
469   rtx stores;                   /* INSN list of stores seen.  */
470   struct ls_expr * next;        /* Next in the list.  */
471   int invalid;                  /* Invalid for some reason.  */
472   int index;                    /* If it maps to a bitmap index.  */
473   unsigned int hash_index;      /* Index when in a hash table.  */
474   rtx reaching_reg;             /* Register to use when re-writing.  */
475 };
476
477 /* Array of implicit set patterns indexed by basic block index.  */
478 static rtx *implicit_sets;
479
480 /* Head of the list of load/store memory refs.  */
481 static struct ls_expr * pre_ldst_mems = NULL;
482
483 /* Bitmap containing one bit for each register in the program.
484    Used when performing GCSE to track which registers have been set since
485    the start of the basic block.  */
486 static regset reg_set_bitmap;
487
488 /* For each block, a bitmap of registers set in the block.
489    This is used by compute_transp.
490    It is computed during hash table computation and not by compute_sets
491    as it includes registers added since the last pass (or between cprop and
492    gcse) and it's currently not easy to realloc sbitmap vectors.  */
493 static sbitmap *reg_set_in_block;
494
495 /* Array, indexed by basic block number for a list of insns which modify
496    memory within that block.  */
497 static rtx * modify_mem_list;
498 bitmap modify_mem_list_set;
499
500 /* This array parallels modify_mem_list, but is kept canonicalized.  */
501 static rtx * canon_modify_mem_list;
502 bitmap canon_modify_mem_list_set;
503 /* Various variables for statistics gathering.  */
504
505 /* Memory used in a pass.
506    This isn't intended to be absolutely precise.  Its intent is only
507    to keep an eye on memory usage.  */
508 static int bytes_used;
509
510 /* GCSE substitutions made.  */
511 static int gcse_subst_count;
512 /* Number of copy instructions created.  */
513 static int gcse_create_count;
514 /* Number of constants propagated.  */
515 static int const_prop_count;
516 /* Number of copys propagated.  */
517 static int copy_prop_count;
518 \f
519 /* For available exprs */
520 static sbitmap *ae_kill, *ae_gen;
521
522 /* Objects of this type are passed around by the null-pointer check
523    removal routines.  */
524 struct null_pointer_info
525 {
526   /* The basic block being processed.  */
527   basic_block current_block;
528   /* The first register to be handled in this pass.  */
529   unsigned int min_reg;
530   /* One greater than the last register to be handled in this pass.  */
531   unsigned int max_reg;
532   sbitmap *nonnull_local;
533   sbitmap *nonnull_killed;
534 };
535 \f
536 static void compute_can_copy (void);
537 static void *gmalloc (size_t) ATTRIBUTE_MALLOC;
538 static void *gcalloc (size_t, size_t) ATTRIBUTE_MALLOC;
539 static void *grealloc (void *, size_t);
540 static void *gcse_alloc (unsigned long);
541 static void alloc_gcse_mem (rtx);
542 static void free_gcse_mem (void);
543 static void alloc_reg_set_mem (int);
544 static void free_reg_set_mem (void);
545 static void record_one_set (int, rtx);
546 static void replace_one_set (int, rtx, rtx);
547 static void record_set_info (rtx, rtx, void *);
548 static void compute_sets (rtx);
549 static void hash_scan_insn (rtx, struct hash_table *, int);
550 static void hash_scan_set (rtx, rtx, struct hash_table *);
551 static void hash_scan_clobber (rtx, rtx, struct hash_table *);
552 static void hash_scan_call (rtx, rtx, struct hash_table *);
553 static int want_to_gcse_p (rtx);
554 static bool can_assign_to_reg_p (rtx);
555 static bool gcse_constant_p (rtx);
556 static int oprs_unchanged_p (rtx, rtx, int);
557 static int oprs_anticipatable_p (rtx, rtx);
558 static int oprs_available_p (rtx, rtx);
559 static void insert_expr_in_table (rtx, enum machine_mode, rtx, int, int,
560                                   struct hash_table *);
561 static void insert_set_in_table (rtx, rtx, struct hash_table *);
562 static unsigned int hash_expr (rtx, enum machine_mode, int *, int);
563 static unsigned int hash_expr_1 (rtx, enum machine_mode, int *);
564 static unsigned int hash_string_1 (const char *);
565 static unsigned int hash_set (int, int);
566 static int expr_equiv_p (rtx, rtx);
567 static void record_last_reg_set_info (rtx, int);
568 static void record_last_mem_set_info (rtx);
569 static void record_last_set_info (rtx, rtx, void *);
570 static void compute_hash_table (struct hash_table *);
571 static void alloc_hash_table (int, struct hash_table *, int);
572 static void free_hash_table (struct hash_table *);
573 static void compute_hash_table_work (struct hash_table *);
574 static void dump_hash_table (FILE *, const char *, struct hash_table *);
575 static struct expr *lookup_expr (rtx, struct hash_table *);
576 static struct expr *lookup_set (unsigned int, struct hash_table *);
577 static struct expr *next_set (unsigned int, struct expr *);
578 static void reset_opr_set_tables (void);
579 static int oprs_not_set_p (rtx, rtx);
580 static void mark_call (rtx);
581 static void mark_set (rtx, rtx);
582 static void mark_clobber (rtx, rtx);
583 static void mark_oprs_set (rtx);
584 static void alloc_cprop_mem (int, int);
585 static void free_cprop_mem (void);
586 static void compute_transp (rtx, int, sbitmap *, int);
587 static void compute_transpout (void);
588 static void compute_local_properties (sbitmap *, sbitmap *, sbitmap *,
589                                       struct hash_table *);
590 static void compute_cprop_data (void);
591 static void find_used_regs (rtx *, void *);
592 static int try_replace_reg (rtx, rtx, rtx);
593 static struct expr *find_avail_set (int, rtx);
594 static int cprop_jump (basic_block, rtx, rtx, rtx, rtx);
595 static void mems_conflict_for_gcse_p (rtx, rtx, void *);
596 static int load_killed_in_block_p (basic_block, int, rtx, int);
597 static void canon_list_insert (rtx, rtx, void *);
598 static int cprop_insn (rtx, int);
599 static int cprop (int);
600 static void find_implicit_sets (void);
601 static int one_cprop_pass (int, int, int);
602 static bool constprop_register (rtx, rtx, rtx, int);
603 static struct expr *find_bypass_set (int, int);
604 static bool reg_killed_on_edge (rtx, edge);
605 static int bypass_block (basic_block, rtx, rtx);
606 static int bypass_conditional_jumps (void);
607 static void alloc_pre_mem (int, int);
608 static void free_pre_mem (void);
609 static void compute_pre_data (void);
610 static int pre_expr_reaches_here_p (basic_block, struct expr *,
611                                     basic_block);
612 static void insert_insn_end_bb (struct expr *, basic_block, int);
613 static void pre_insert_copy_insn (struct expr *, rtx);
614 static void pre_insert_copies (void);
615 static int pre_delete (void);
616 static int pre_gcse (void);
617 static int one_pre_gcse_pass (int);
618 static void add_label_notes (rtx, rtx);
619 static void alloc_code_hoist_mem (int, int);
620 static void free_code_hoist_mem (void);
621 static void compute_code_hoist_vbeinout (void);
622 static void compute_code_hoist_data (void);
623 static int hoist_expr_reaches_here_p (basic_block, int, basic_block, char *);
624 static void hoist_code (void);
625 static int one_code_hoisting_pass (void);
626 static rtx process_insert_insn (struct expr *);
627 static int pre_edge_insert (struct edge_list *, struct expr **);
628 static int pre_expr_reaches_here_p_work (basic_block, struct expr *,
629                                          basic_block, char *);
630 static struct ls_expr * ldst_entry (rtx);
631 static void free_ldst_entry (struct ls_expr *);
632 static void free_ldst_mems (void);
633 static void print_ldst_list (FILE *);
634 static struct ls_expr * find_rtx_in_ldst (rtx);
635 static int enumerate_ldsts (void);
636 static inline struct ls_expr * first_ls_expr (void);
637 static inline struct ls_expr * next_ls_expr (struct ls_expr *);
638 static int simple_mem (rtx);
639 static void invalidate_any_buried_refs (rtx);
640 static void compute_ld_motion_mems (void);
641 static void trim_ld_motion_mems (void);
642 static void update_ld_motion_stores (struct expr *);
643 static void reg_set_info (rtx, rtx, void *);
644 static void reg_clear_last_set (rtx, rtx, void *);
645 static bool store_ops_ok (rtx, int *);
646 static rtx extract_mentioned_regs (rtx);
647 static rtx extract_mentioned_regs_helper (rtx, rtx);
648 static void find_moveable_store (rtx, int *, int *);
649 static int compute_store_table (void);
650 static bool load_kills_store (rtx, rtx, int);
651 static bool find_loads (rtx, rtx, int);
652 static bool store_killed_in_insn (rtx, rtx, rtx, int);
653 static bool store_killed_after (rtx, rtx, rtx, basic_block, int *, rtx *);
654 static bool store_killed_before (rtx, rtx, rtx, basic_block, int *);
655 static void build_store_vectors (void);
656 static void insert_insn_start_bb (rtx, basic_block);
657 static int insert_store (struct ls_expr *, edge);
658 static void remove_reachable_equiv_notes (basic_block, struct ls_expr *);
659 static void replace_store_insn (rtx, rtx, basic_block, struct ls_expr *);
660 static void delete_store (struct ls_expr *, basic_block);
661 static void free_store_memory (void);
662 static void store_motion (void);
663 static void free_insn_expr_list_list (rtx *);
664 static void clear_modify_mem_tables (void);
665 static void free_modify_mem_tables (void);
666 static rtx gcse_emit_move_after (rtx, rtx, rtx);
667 static void local_cprop_find_used_regs (rtx *, void *);
668 static bool do_local_cprop (rtx, rtx, int, rtx*);
669 static bool adjust_libcall_notes (rtx, rtx, rtx, rtx*);
670 static void local_cprop_pass (int);
671 static bool is_too_expensive (const char *);
672 \f
673
674 /* Entry point for global common subexpression elimination.
675    F is the first instruction in the function.  */
676
677 int
678 gcse_main (rtx f, FILE *file)
679 {
680   int changed, pass;
681   /* Bytes used at start of pass.  */
682   int initial_bytes_used;
683   /* Maximum number of bytes used by a pass.  */
684   int max_pass_bytes;
685   /* Point to release obstack data from for each pass.  */
686   char *gcse_obstack_bottom;
687
688   /* We do not construct an accurate cfg in functions which call
689      setjmp, so just punt to be safe.  */
690   if (current_function_calls_setjmp)
691     return 0;
692
693   /* Assume that we do not need to run jump optimizations after gcse.  */
694   run_jump_opt_after_gcse = 0;
695
696   /* For calling dump_foo fns from gdb.  */
697   debug_stderr = stderr;
698   gcse_file = file;
699
700   /* Identify the basic block information for this function, including
701      successors and predecessors.  */
702   max_gcse_regno = max_reg_num ();
703
704   if (file)
705     dump_flow_info (file);
706
707   /* Return if there's nothing to do, or it is too expensive.  */
708   if (n_basic_blocks <= 1 || is_too_expensive (_("GCSE disabled")))
709     return 0;
710   
711   gcc_obstack_init (&gcse_obstack);
712   bytes_used = 0;
713
714   /* We need alias.  */
715   init_alias_analysis ();
716   /* Record where pseudo-registers are set.  This data is kept accurate
717      during each pass.  ??? We could also record hard-reg information here
718      [since it's unchanging], however it is currently done during hash table
719      computation.
720
721      It may be tempting to compute MEM set information here too, but MEM sets
722      will be subject to code motion one day and thus we need to compute
723      information about memory sets when we build the hash tables.  */
724
725   alloc_reg_set_mem (max_gcse_regno);
726   compute_sets (f);
727
728   pass = 0;
729   initial_bytes_used = bytes_used;
730   max_pass_bytes = 0;
731   gcse_obstack_bottom = gcse_alloc (1);
732   changed = 1;
733   while (changed && pass < MAX_GCSE_PASSES)
734     {
735       changed = 0;
736       if (file)
737         fprintf (file, "GCSE pass %d\n\n", pass + 1);
738
739       /* Initialize bytes_used to the space for the pred/succ lists,
740          and the reg_set_table data.  */
741       bytes_used = initial_bytes_used;
742
743       /* Each pass may create new registers, so recalculate each time.  */
744       max_gcse_regno = max_reg_num ();
745
746       alloc_gcse_mem (f);
747
748       /* Don't allow constant propagation to modify jumps
749          during this pass.  */
750       changed = one_cprop_pass (pass + 1, 0, 0);
751
752       if (optimize_size)
753         /* Do nothing.  */ ;
754       else
755         {
756           changed |= one_pre_gcse_pass (pass + 1);
757           /* We may have just created new basic blocks.  Release and
758              recompute various things which are sized on the number of
759              basic blocks.  */
760           if (changed)
761             {
762               free_modify_mem_tables ();
763               modify_mem_list = gcalloc (last_basic_block, sizeof (rtx));
764               canon_modify_mem_list = gcalloc (last_basic_block, sizeof (rtx));
765             }
766           free_reg_set_mem ();
767           alloc_reg_set_mem (max_reg_num ());
768           compute_sets (f);
769           run_jump_opt_after_gcse = 1;
770         }
771
772       if (max_pass_bytes < bytes_used)
773         max_pass_bytes = bytes_used;
774
775       /* Free up memory, then reallocate for code hoisting.  We can
776          not re-use the existing allocated memory because the tables
777          will not have info for the insns or registers created by
778          partial redundancy elimination.  */
779       free_gcse_mem ();
780
781       /* It does not make sense to run code hoisting unless we are optimizing
782          for code size -- it rarely makes programs faster, and can make
783          them bigger if we did partial redundancy elimination (when optimizing
784          for space, we don't run the partial redundancy algorithms).  */
785       if (optimize_size)
786         {
787           max_gcse_regno = max_reg_num ();
788           alloc_gcse_mem (f);
789           changed |= one_code_hoisting_pass ();
790           free_gcse_mem ();
791
792           if (max_pass_bytes < bytes_used)
793             max_pass_bytes = bytes_used;
794         }
795
796       if (file)
797         {
798           fprintf (file, "\n");
799           fflush (file);
800         }
801
802       obstack_free (&gcse_obstack, gcse_obstack_bottom);
803       pass++;
804     }
805
806   /* Do one last pass of copy propagation, including cprop into
807      conditional jumps.  */
808
809   max_gcse_regno = max_reg_num ();
810   alloc_gcse_mem (f);
811   /* This time, go ahead and allow cprop to alter jumps.  */
812   one_cprop_pass (pass + 1, 1, 0);
813   free_gcse_mem ();
814
815   if (file)
816     {
817       fprintf (file, "GCSE of %s: %d basic blocks, ",
818                current_function_name (), n_basic_blocks);
819       fprintf (file, "%d pass%s, %d bytes\n\n",
820                pass, pass > 1 ? "es" : "", max_pass_bytes);
821     }
822
823   obstack_free (&gcse_obstack, NULL);
824   free_reg_set_mem ();
825   /* We are finished with alias.  */
826   end_alias_analysis ();
827   allocate_reg_info (max_reg_num (), FALSE, FALSE);
828
829   if (!optimize_size && flag_gcse_sm)
830     store_motion ();
831
832   /* Record where pseudo-registers are set.  */
833   return run_jump_opt_after_gcse;
834 }
835 \f
836 /* Misc. utilities.  */
837
838 /* Nonzero for each mode that supports (set (reg) (reg)).
839    This is trivially true for integer and floating point values.
840    It may or may not be true for condition codes.  */
841 static char can_copy[(int) NUM_MACHINE_MODES];
842
843 /* Compute which modes support reg/reg copy operations.  */
844
845 static void
846 compute_can_copy (void)
847 {
848   int i;
849 #ifndef AVOID_CCMODE_COPIES
850   rtx reg, insn;
851 #endif
852   memset (can_copy, 0, NUM_MACHINE_MODES);
853
854   start_sequence ();
855   for (i = 0; i < NUM_MACHINE_MODES; i++)
856     if (GET_MODE_CLASS (i) == MODE_CC)
857       {
858 #ifdef AVOID_CCMODE_COPIES
859         can_copy[i] = 0;
860 #else
861         reg = gen_rtx_REG ((enum machine_mode) i, LAST_VIRTUAL_REGISTER + 1);
862         insn = emit_insn (gen_rtx_SET (VOIDmode, reg, reg));
863         if (recog (PATTERN (insn), insn, NULL) >= 0)
864           can_copy[i] = 1;
865 #endif
866       }
867     else
868       can_copy[i] = 1;
869
870   end_sequence ();
871 }
872
873 /* Returns whether the mode supports reg/reg copy operations.  */
874
875 bool
876 can_copy_p (enum machine_mode mode)
877 {
878   static bool can_copy_init_p = false;
879
880   if (! can_copy_init_p)
881     {
882       compute_can_copy ();
883       can_copy_init_p = true;
884     }
885
886   return can_copy[mode] != 0;
887 }
888 \f
889 /* Cover function to xmalloc to record bytes allocated.  */
890
891 static void *
892 gmalloc (size_t size)
893 {
894   bytes_used += size;
895   return xmalloc (size);
896 }
897
898 /* Cover function to xcalloc to record bytes allocated.  */
899
900 static void *
901 gcalloc (size_t nelem, size_t elsize)
902 {
903   bytes_used += nelem * elsize;
904   return xcalloc (nelem, elsize);
905 }
906
907 /* Cover function to xrealloc.
908    We don't record the additional size since we don't know it.
909    It won't affect memory usage stats much anyway.  */
910
911 static void *
912 grealloc (void *ptr, size_t size)
913 {
914   return xrealloc (ptr, size);
915 }
916
917 /* Cover function to obstack_alloc.  */
918
919 static void *
920 gcse_alloc (unsigned long size)
921 {
922   bytes_used += size;
923   return obstack_alloc (&gcse_obstack, size);
924 }
925
926 /* Allocate memory for the cuid mapping array,
927    and reg/memory set tracking tables.
928
929    This is called at the start of each pass.  */
930
931 static void
932 alloc_gcse_mem (rtx f)
933 {
934   int i;
935   rtx insn;
936
937   /* Find the largest UID and create a mapping from UIDs to CUIDs.
938      CUIDs are like UIDs except they increase monotonically, have no gaps,
939      and only apply to real insns.  */
940
941   max_uid = get_max_uid ();
942   uid_cuid = gcalloc (max_uid + 1, sizeof (int));
943   for (insn = f, i = 0; insn; insn = NEXT_INSN (insn))
944     {
945       if (INSN_P (insn))
946         uid_cuid[INSN_UID (insn)] = i++;
947       else
948         uid_cuid[INSN_UID (insn)] = i;
949     }
950
951   /* Create a table mapping cuids to insns.  */
952
953   max_cuid = i;
954   cuid_insn = gcalloc (max_cuid + 1, sizeof (rtx));
955   for (insn = f, i = 0; insn; insn = NEXT_INSN (insn))
956     if (INSN_P (insn))
957       CUID_INSN (i++) = insn;
958
959   /* Allocate vars to track sets of regs.  */
960   reg_set_bitmap = BITMAP_XMALLOC ();
961
962   /* Allocate vars to track sets of regs, memory per block.  */
963   reg_set_in_block = sbitmap_vector_alloc (last_basic_block, max_gcse_regno);
964   /* Allocate array to keep a list of insns which modify memory in each
965      basic block.  */
966   modify_mem_list = gcalloc (last_basic_block, sizeof (rtx));
967   canon_modify_mem_list = gcalloc (last_basic_block, sizeof (rtx));
968   modify_mem_list_set = BITMAP_XMALLOC ();
969   canon_modify_mem_list_set = BITMAP_XMALLOC ();
970 }
971
972 /* Free memory allocated by alloc_gcse_mem.  */
973
974 static void
975 free_gcse_mem (void)
976 {
977   free (uid_cuid);
978   free (cuid_insn);
979
980   BITMAP_XFREE (reg_set_bitmap);
981
982   sbitmap_vector_free (reg_set_in_block);
983   free_modify_mem_tables ();
984   BITMAP_XFREE (modify_mem_list_set);
985   BITMAP_XFREE (canon_modify_mem_list_set);
986 }
987 \f
988 /* Compute the local properties of each recorded expression.
989
990    Local properties are those that are defined by the block, irrespective of
991    other blocks.
992
993    An expression is transparent in a block if its operands are not modified
994    in the block.
995
996    An expression is computed (locally available) in a block if it is computed
997    at least once and expression would contain the same value if the
998    computation was moved to the end of the block.
999
1000    An expression is locally anticipatable in a block if it is computed at
1001    least once and expression would contain the same value if the computation
1002    was moved to the beginning of the block.
1003
1004    We call this routine for cprop, pre and code hoisting.  They all compute
1005    basically the same information and thus can easily share this code.
1006
1007    TRANSP, COMP, and ANTLOC are destination sbitmaps for recording local
1008    properties.  If NULL, then it is not necessary to compute or record that
1009    particular property.
1010
1011    TABLE controls which hash table to look at.  If it is  set hash table,
1012    additionally, TRANSP is computed as ~TRANSP, since this is really cprop's
1013    ABSALTERED.  */
1014
1015 static void
1016 compute_local_properties (sbitmap *transp, sbitmap *comp, sbitmap *antloc, struct hash_table *table)
1017 {
1018   unsigned int i;
1019
1020   /* Initialize any bitmaps that were passed in.  */
1021   if (transp)
1022     {
1023       if (table->set_p)
1024         sbitmap_vector_zero (transp, last_basic_block);
1025       else
1026         sbitmap_vector_ones (transp, last_basic_block);
1027     }
1028
1029   if (comp)
1030     sbitmap_vector_zero (comp, last_basic_block);
1031   if (antloc)
1032     sbitmap_vector_zero (antloc, last_basic_block);
1033
1034   for (i = 0; i < table->size; i++)
1035     {
1036       struct expr *expr;
1037
1038       for (expr = table->table[i]; expr != NULL; expr = expr->next_same_hash)
1039         {
1040           int indx = expr->bitmap_index;
1041           struct occr *occr;
1042
1043           /* The expression is transparent in this block if it is not killed.
1044              We start by assuming all are transparent [none are killed], and
1045              then reset the bits for those that are.  */
1046           if (transp)
1047             compute_transp (expr->expr, indx, transp, table->set_p);
1048
1049           /* The occurrences recorded in antic_occr are exactly those that
1050              we want to set to nonzero in ANTLOC.  */
1051           if (antloc)
1052             for (occr = expr->antic_occr; occr != NULL; occr = occr->next)
1053               {
1054                 SET_BIT (antloc[BLOCK_NUM (occr->insn)], indx);
1055
1056                 /* While we're scanning the table, this is a good place to
1057                    initialize this.  */
1058                 occr->deleted_p = 0;
1059               }
1060
1061           /* The occurrences recorded in avail_occr are exactly those that
1062              we want to set to nonzero in COMP.  */
1063           if (comp)
1064             for (occr = expr->avail_occr; occr != NULL; occr = occr->next)
1065               {
1066                 SET_BIT (comp[BLOCK_NUM (occr->insn)], indx);
1067
1068                 /* While we're scanning the table, this is a good place to
1069                    initialize this.  */
1070                 occr->copied_p = 0;
1071               }
1072
1073           /* While we're scanning the table, this is a good place to
1074              initialize this.  */
1075           expr->reaching_reg = 0;
1076         }
1077     }
1078 }
1079 \f
1080 /* Register set information.
1081
1082    `reg_set_table' records where each register is set or otherwise
1083    modified.  */
1084
1085 static struct obstack reg_set_obstack;
1086
1087 static void
1088 alloc_reg_set_mem (int n_regs)
1089 {
1090   reg_set_table_size = n_regs + REG_SET_TABLE_SLOP;
1091   reg_set_table = gcalloc (reg_set_table_size, sizeof (struct reg_set *));
1092
1093   gcc_obstack_init (&reg_set_obstack);
1094 }
1095
1096 static void
1097 free_reg_set_mem (void)
1098 {
1099   free (reg_set_table);
1100   obstack_free (&reg_set_obstack, NULL);
1101 }
1102
1103 /* An OLD_INSN that used to set REGNO was replaced by NEW_INSN.
1104    Update the corresponding `reg_set_table' entry accordingly.
1105    We assume that NEW_INSN is not already recorded in reg_set_table[regno].  */
1106
1107 static void
1108 replace_one_set (int regno, rtx old_insn, rtx new_insn)
1109 {
1110   struct reg_set *reg_info;
1111   if (regno >= reg_set_table_size)
1112     return;
1113   for (reg_info = reg_set_table[regno]; reg_info; reg_info = reg_info->next)
1114     if (reg_info->insn == old_insn)
1115       {
1116         reg_info->insn = new_insn;
1117         break;
1118       }
1119 }
1120
1121 /* Record REGNO in the reg_set table.  */
1122
1123 static void
1124 record_one_set (int regno, rtx insn)
1125 {
1126   /* Allocate a new reg_set element and link it onto the list.  */
1127   struct reg_set *new_reg_info;
1128
1129   /* If the table isn't big enough, enlarge it.  */
1130   if (regno >= reg_set_table_size)
1131     {
1132       int new_size = regno + REG_SET_TABLE_SLOP;
1133
1134       reg_set_table = grealloc (reg_set_table,
1135                                 new_size * sizeof (struct reg_set *));
1136       memset (reg_set_table + reg_set_table_size, 0,
1137               (new_size - reg_set_table_size) * sizeof (struct reg_set *));
1138       reg_set_table_size = new_size;
1139     }
1140
1141   new_reg_info = obstack_alloc (&reg_set_obstack, sizeof (struct reg_set));
1142   bytes_used += sizeof (struct reg_set);
1143   new_reg_info->insn = insn;
1144   new_reg_info->next = reg_set_table[regno];
1145   reg_set_table[regno] = new_reg_info;
1146 }
1147
1148 /* Called from compute_sets via note_stores to handle one SET or CLOBBER in
1149    an insn.  The DATA is really the instruction in which the SET is
1150    occurring.  */
1151
1152 static void
1153 record_set_info (rtx dest, rtx setter ATTRIBUTE_UNUSED, void *data)
1154 {
1155   rtx record_set_insn = (rtx) data;
1156
1157   if (GET_CODE (dest) == REG && REGNO (dest) >= FIRST_PSEUDO_REGISTER)
1158     record_one_set (REGNO (dest), record_set_insn);
1159 }
1160
1161 /* Scan the function and record each set of each pseudo-register.
1162
1163    This is called once, at the start of the gcse pass.  See the comments for
1164    `reg_set_table' for further documentation.  */
1165
1166 static void
1167 compute_sets (rtx f)
1168 {
1169   rtx insn;
1170
1171   for (insn = f; insn != 0; insn = NEXT_INSN (insn))
1172     if (INSN_P (insn))
1173       note_stores (PATTERN (insn), record_set_info, insn);
1174 }
1175 \f
1176 /* Hash table support.  */
1177
1178 struct reg_avail_info
1179 {
1180   basic_block last_bb;
1181   int first_set;
1182   int last_set;
1183 };
1184
1185 static struct reg_avail_info *reg_avail_info;
1186 static basic_block current_bb;
1187
1188
1189 /* See whether X, the source of a set, is something we want to consider for
1190    GCSE.  */
1191
1192 static int
1193 want_to_gcse_p (rtx x)
1194 {
1195   switch (GET_CODE (x))
1196     {
1197     case REG:
1198     case SUBREG:
1199     case CONST_INT:
1200     case CONST_DOUBLE:
1201     case CONST_VECTOR:
1202     case CALL:
1203       return 0;
1204
1205     default:
1206       return can_assign_to_reg_p (x);
1207     }
1208 }
1209
1210 /* Used internally by can_assign_to_reg_p.  */
1211
1212 static GTY(()) rtx test_insn;
1213
1214 /* Return true if we can assign X to a pseudo register.  */
1215
1216 static bool
1217 can_assign_to_reg_p (rtx x)
1218 {
1219   int num_clobbers = 0;
1220   int icode;
1221
1222   /* If this is a valid operand, we are OK.  If it's VOIDmode, we aren't.  */
1223   if (general_operand (x, GET_MODE (x)))
1224     return 1;
1225   else if (GET_MODE (x) == VOIDmode)
1226     return 0;
1227
1228   /* Otherwise, check if we can make a valid insn from it.  First initialize
1229      our test insn if we haven't already.  */
1230   if (test_insn == 0)
1231     {
1232       test_insn
1233         = make_insn_raw (gen_rtx_SET (VOIDmode,
1234                                       gen_rtx_REG (word_mode,
1235                                                    FIRST_PSEUDO_REGISTER * 2),
1236                                       const0_rtx));
1237       NEXT_INSN (test_insn) = PREV_INSN (test_insn) = 0;
1238     }
1239
1240   /* Now make an insn like the one we would make when GCSE'ing and see if
1241      valid.  */
1242   PUT_MODE (SET_DEST (PATTERN (test_insn)), GET_MODE (x));
1243   SET_SRC (PATTERN (test_insn)) = x;
1244   return ((icode = recog (PATTERN (test_insn), test_insn, &num_clobbers)) >= 0
1245           && (num_clobbers == 0 || ! added_clobbers_hard_reg_p (icode)));
1246 }
1247
1248 /* Return nonzero if the operands of expression X are unchanged from the
1249    start of INSN's basic block up to but not including INSN (if AVAIL_P == 0),
1250    or from INSN to the end of INSN's basic block (if AVAIL_P != 0).  */
1251
1252 static int
1253 oprs_unchanged_p (rtx x, rtx insn, int avail_p)
1254 {
1255   int i, j;
1256   enum rtx_code code;
1257   const char *fmt;
1258
1259   if (x == 0)
1260     return 1;
1261
1262   code = GET_CODE (x);
1263   switch (code)
1264     {
1265     case REG:
1266       {
1267         struct reg_avail_info *info = &reg_avail_info[REGNO (x)];
1268
1269         if (info->last_bb != current_bb)
1270           return 1;
1271         if (avail_p)
1272           return info->last_set < INSN_CUID (insn);
1273         else
1274           return info->first_set >= INSN_CUID (insn);
1275       }
1276
1277     case MEM:
1278       if (load_killed_in_block_p (current_bb, INSN_CUID (insn),
1279                                   x, avail_p))
1280         return 0;
1281       else
1282         return oprs_unchanged_p (XEXP (x, 0), insn, avail_p);
1283
1284     case PRE_DEC:
1285     case PRE_INC:
1286     case POST_DEC:
1287     case POST_INC:
1288     case PRE_MODIFY:
1289     case POST_MODIFY:
1290       return 0;
1291
1292     case PC:
1293     case CC0: /*FIXME*/
1294     case CONST:
1295     case CONST_INT:
1296     case CONST_DOUBLE:
1297     case CONST_VECTOR:
1298     case SYMBOL_REF:
1299     case LABEL_REF:
1300     case ADDR_VEC:
1301     case ADDR_DIFF_VEC:
1302       return 1;
1303
1304     default:
1305       break;
1306     }
1307
1308   for (i = GET_RTX_LENGTH (code) - 1, fmt = GET_RTX_FORMAT (code); i >= 0; i--)
1309     {
1310       if (fmt[i] == 'e')
1311         {
1312           /* If we are about to do the last recursive call needed at this
1313              level, change it into iteration.  This function is called enough
1314              to be worth it.  */
1315           if (i == 0)
1316             return oprs_unchanged_p (XEXP (x, i), insn, avail_p);
1317
1318           else if (! oprs_unchanged_p (XEXP (x, i), insn, avail_p))
1319             return 0;
1320         }
1321       else if (fmt[i] == 'E')
1322         for (j = 0; j < XVECLEN (x, i); j++)
1323           if (! oprs_unchanged_p (XVECEXP (x, i, j), insn, avail_p))
1324             return 0;
1325     }
1326
1327   return 1;
1328 }
1329
1330 /* Used for communication between mems_conflict_for_gcse_p and
1331    load_killed_in_block_p.  Nonzero if mems_conflict_for_gcse_p finds a
1332    conflict between two memory references.  */
1333 static int gcse_mems_conflict_p;
1334
1335 /* Used for communication between mems_conflict_for_gcse_p and
1336    load_killed_in_block_p.  A memory reference for a load instruction,
1337    mems_conflict_for_gcse_p will see if a memory store conflicts with
1338    this memory load.  */
1339 static rtx gcse_mem_operand;
1340
1341 /* DEST is the output of an instruction.  If it is a memory reference, and
1342    possibly conflicts with the load found in gcse_mem_operand, then set
1343    gcse_mems_conflict_p to a nonzero value.  */
1344
1345 static void
1346 mems_conflict_for_gcse_p (rtx dest, rtx setter ATTRIBUTE_UNUSED,
1347                           void *data ATTRIBUTE_UNUSED)
1348 {
1349   while (GET_CODE (dest) == SUBREG
1350          || GET_CODE (dest) == ZERO_EXTRACT
1351          || GET_CODE (dest) == SIGN_EXTRACT
1352          || GET_CODE (dest) == STRICT_LOW_PART)
1353     dest = XEXP (dest, 0);
1354
1355   /* If DEST is not a MEM, then it will not conflict with the load.  Note
1356      that function calls are assumed to clobber memory, but are handled
1357      elsewhere.  */
1358   if (GET_CODE (dest) != MEM)
1359     return;
1360
1361   /* If we are setting a MEM in our list of specially recognized MEMs,
1362      don't mark as killed this time.  */
1363
1364   if (expr_equiv_p (dest, gcse_mem_operand) && pre_ldst_mems != NULL)
1365     {
1366       if (!find_rtx_in_ldst (dest))
1367         gcse_mems_conflict_p = 1;
1368       return;
1369     }
1370
1371   if (true_dependence (dest, GET_MODE (dest), gcse_mem_operand,
1372                        rtx_addr_varies_p))
1373     gcse_mems_conflict_p = 1;
1374 }
1375
1376 /* Return nonzero if the expression in X (a memory reference) is killed
1377    in block BB before or after the insn with the CUID in UID_LIMIT.
1378    AVAIL_P is nonzero for kills after UID_LIMIT, and zero for kills
1379    before UID_LIMIT.
1380
1381    To check the entire block, set UID_LIMIT to max_uid + 1 and
1382    AVAIL_P to 0.  */
1383
1384 static int
1385 load_killed_in_block_p (basic_block bb, int uid_limit, rtx x, int avail_p)
1386 {
1387   rtx list_entry = modify_mem_list[bb->index];
1388   while (list_entry)
1389     {
1390       rtx setter;
1391       /* Ignore entries in the list that do not apply.  */
1392       if ((avail_p
1393            && INSN_CUID (XEXP (list_entry, 0)) < uid_limit)
1394           || (! avail_p
1395               && INSN_CUID (XEXP (list_entry, 0)) > uid_limit))
1396         {
1397           list_entry = XEXP (list_entry, 1);
1398           continue;
1399         }
1400
1401       setter = XEXP (list_entry, 0);
1402
1403       /* If SETTER is a call everything is clobbered.  Note that calls
1404          to pure functions are never put on the list, so we need not
1405          worry about them.  */
1406       if (GET_CODE (setter) == CALL_INSN)
1407         return 1;
1408
1409       /* SETTER must be an INSN of some kind that sets memory.  Call
1410          note_stores to examine each hunk of memory that is modified.
1411
1412          The note_stores interface is pretty limited, so we have to
1413          communicate via global variables.  Yuk.  */
1414       gcse_mem_operand = x;
1415       gcse_mems_conflict_p = 0;
1416       note_stores (PATTERN (setter), mems_conflict_for_gcse_p, NULL);
1417       if (gcse_mems_conflict_p)
1418         return 1;
1419       list_entry = XEXP (list_entry, 1);
1420     }
1421   return 0;
1422 }
1423
1424 /* Return nonzero if the operands of expression X are unchanged from
1425    the start of INSN's basic block up to but not including INSN.  */
1426
1427 static int
1428 oprs_anticipatable_p (rtx x, rtx insn)
1429 {
1430   return oprs_unchanged_p (x, insn, 0);
1431 }
1432
1433 /* Return nonzero if the operands of expression X are unchanged from
1434    INSN to the end of INSN's basic block.  */
1435
1436 static int
1437 oprs_available_p (rtx x, rtx insn)
1438 {
1439   return oprs_unchanged_p (x, insn, 1);
1440 }
1441
1442 /* Hash expression X.
1443
1444    MODE is only used if X is a CONST_INT.  DO_NOT_RECORD_P is a boolean
1445    indicating if a volatile operand is found or if the expression contains
1446    something we don't want to insert in the table.  HASH_TABLE_SIZE is
1447    the current size of the hash table to be probed.
1448
1449    ??? One might want to merge this with canon_hash.  Later.  */
1450
1451 static unsigned int
1452 hash_expr (rtx x, enum machine_mode mode, int *do_not_record_p,
1453            int hash_table_size)
1454 {
1455   unsigned int hash;
1456
1457   *do_not_record_p = 0;
1458
1459   hash = hash_expr_1 (x, mode, do_not_record_p);
1460   return hash % hash_table_size;
1461 }
1462
1463 /* Hash a string.  Just add its bytes up.  */
1464
1465 static inline unsigned
1466 hash_string_1 (const char *ps)
1467 {
1468   unsigned hash = 0;
1469   const unsigned char *p = (const unsigned char *) ps;
1470
1471   if (p)
1472     while (*p)
1473       hash += *p++;
1474
1475   return hash;
1476 }
1477
1478 /* Subroutine of hash_expr to do the actual work.  */
1479
1480 static unsigned int
1481 hash_expr_1 (rtx x, enum machine_mode mode, int *do_not_record_p)
1482 {
1483   int i, j;
1484   unsigned hash = 0;
1485   enum rtx_code code;
1486   const char *fmt;
1487
1488   /* Used to turn recursion into iteration.  We can't rely on GCC's
1489      tail-recursion elimination since we need to keep accumulating values
1490      in HASH.  */
1491
1492   if (x == 0)
1493     return hash;
1494
1495  repeat:
1496   code = GET_CODE (x);
1497   switch (code)
1498     {
1499     case REG:
1500       hash += ((unsigned int) REG << 7) + REGNO (x);
1501       return hash;
1502
1503     case CONST_INT:
1504       hash += (((unsigned int) CONST_INT << 7) + (unsigned int) mode
1505                + (unsigned int) INTVAL (x));
1506       return hash;
1507
1508     case CONST_DOUBLE:
1509       /* This is like the general case, except that it only counts
1510          the integers representing the constant.  */
1511       hash += (unsigned int) code + (unsigned int) GET_MODE (x);
1512       if (GET_MODE (x) != VOIDmode)
1513         for (i = 2; i < GET_RTX_LENGTH (CONST_DOUBLE); i++)
1514           hash += (unsigned int) XWINT (x, i);
1515       else
1516         hash += ((unsigned int) CONST_DOUBLE_LOW (x)
1517                  + (unsigned int) CONST_DOUBLE_HIGH (x));
1518       return hash;
1519
1520     case CONST_VECTOR:
1521       {
1522         int units;
1523         rtx elt;
1524
1525         units = CONST_VECTOR_NUNITS (x);
1526
1527         for (i = 0; i < units; ++i)
1528           {
1529             elt = CONST_VECTOR_ELT (x, i);
1530             hash += hash_expr_1 (elt, GET_MODE (elt), do_not_record_p);
1531           }
1532
1533         return hash;
1534       }
1535
1536       /* Assume there is only one rtx object for any given label.  */
1537     case LABEL_REF:
1538       /* We don't hash on the address of the CODE_LABEL to avoid bootstrap
1539          differences and differences between each stage's debugging dumps.  */
1540       hash += (((unsigned int) LABEL_REF << 7)
1541                + CODE_LABEL_NUMBER (XEXP (x, 0)));
1542       return hash;
1543
1544     case SYMBOL_REF:
1545       {
1546         /* Don't hash on the symbol's address to avoid bootstrap differences.
1547            Different hash values may cause expressions to be recorded in
1548            different orders and thus different registers to be used in the
1549            final assembler.  This also avoids differences in the dump files
1550            between various stages.  */
1551         unsigned int h = 0;
1552         const unsigned char *p = (const unsigned char *) XSTR (x, 0);
1553
1554         while (*p)
1555           h += (h << 7) + *p++; /* ??? revisit */
1556
1557         hash += ((unsigned int) SYMBOL_REF << 7) + h;
1558         return hash;
1559       }
1560
1561     case MEM:
1562       if (MEM_VOLATILE_P (x))
1563         {
1564           *do_not_record_p = 1;
1565           return 0;
1566         }
1567
1568       hash += (unsigned int) MEM;
1569       /* We used alias set for hashing, but this is not good, since the alias
1570          set may differ in -fprofile-arcs and -fbranch-probabilities compilation
1571          causing the profiles to fail to match.  */
1572       x = XEXP (x, 0);
1573       goto repeat;
1574
1575     case PRE_DEC:
1576     case PRE_INC:
1577     case POST_DEC:
1578     case POST_INC:
1579     case PC:
1580     case CC0:
1581     case CALL:
1582     case UNSPEC_VOLATILE:
1583       *do_not_record_p = 1;
1584       return 0;
1585
1586     case ASM_OPERANDS:
1587       if (MEM_VOLATILE_P (x))
1588         {
1589           *do_not_record_p = 1;
1590           return 0;
1591         }
1592       else
1593         {
1594           /* We don't want to take the filename and line into account.  */
1595           hash += (unsigned) code + (unsigned) GET_MODE (x)
1596             + hash_string_1 (ASM_OPERANDS_TEMPLATE (x))
1597             + hash_string_1 (ASM_OPERANDS_OUTPUT_CONSTRAINT (x))
1598             + (unsigned) ASM_OPERANDS_OUTPUT_IDX (x);
1599
1600           if (ASM_OPERANDS_INPUT_LENGTH (x))
1601             {
1602               for (i = 1; i < ASM_OPERANDS_INPUT_LENGTH (x); i++)
1603                 {
1604                   hash += (hash_expr_1 (ASM_OPERANDS_INPUT (x, i),
1605                                         GET_MODE (ASM_OPERANDS_INPUT (x, i)),
1606                                         do_not_record_p)
1607                            + hash_string_1 (ASM_OPERANDS_INPUT_CONSTRAINT
1608                                             (x, i)));
1609                 }
1610
1611               hash += hash_string_1 (ASM_OPERANDS_INPUT_CONSTRAINT (x, 0));
1612               x = ASM_OPERANDS_INPUT (x, 0);
1613               mode = GET_MODE (x);
1614               goto repeat;
1615             }
1616           return hash;
1617         }
1618
1619     default:
1620       break;
1621     }
1622
1623   hash += (unsigned) code + (unsigned) GET_MODE (x);
1624   for (i = GET_RTX_LENGTH (code) - 1, fmt = GET_RTX_FORMAT (code); i >= 0; i--)
1625     {
1626       if (fmt[i] == 'e')
1627         {
1628           /* If we are about to do the last recursive call
1629              needed at this level, change it into iteration.
1630              This function is called enough to be worth it.  */
1631           if (i == 0)
1632             {
1633               x = XEXP (x, i);
1634               goto repeat;
1635             }
1636
1637           hash += hash_expr_1 (XEXP (x, i), 0, do_not_record_p);
1638           if (*do_not_record_p)
1639             return 0;
1640         }
1641
1642       else if (fmt[i] == 'E')
1643         for (j = 0; j < XVECLEN (x, i); j++)
1644           {
1645             hash += hash_expr_1 (XVECEXP (x, i, j), 0, do_not_record_p);
1646             if (*do_not_record_p)
1647               return 0;
1648           }
1649
1650       else if (fmt[i] == 's')
1651         hash += hash_string_1 (XSTR (x, i));
1652       else if (fmt[i] == 'i')
1653         hash += (unsigned int) XINT (x, i);
1654       else
1655         abort ();
1656     }
1657
1658   return hash;
1659 }
1660
1661 /* Hash a set of register REGNO.
1662
1663    Sets are hashed on the register that is set.  This simplifies the PRE copy
1664    propagation code.
1665
1666    ??? May need to make things more elaborate.  Later, as necessary.  */
1667
1668 static unsigned int
1669 hash_set (int regno, int hash_table_size)
1670 {
1671   unsigned int hash;
1672
1673   hash = regno;
1674   return hash % hash_table_size;
1675 }
1676
1677 /* Return nonzero if exp1 is equivalent to exp2.
1678    ??? Borrowed from cse.c.  Might want to remerge with cse.c.  Later.  */
1679
1680 static int
1681 expr_equiv_p (rtx x, rtx y)
1682 {
1683   int i, j;
1684   enum rtx_code code;
1685   const char *fmt;
1686
1687   if (x == y)
1688     return 1;
1689
1690   if (x == 0 || y == 0)
1691     return 0;
1692
1693   code = GET_CODE (x);
1694   if (code != GET_CODE (y))
1695     return 0;
1696
1697   /* (MULT:SI x y) and (MULT:HI x y) are NOT equivalent.  */
1698   if (GET_MODE (x) != GET_MODE (y))
1699     return 0;
1700
1701   switch (code)
1702     {
1703     case PC:
1704     case CC0:
1705     case CONST_INT:
1706       return 0;
1707
1708     case LABEL_REF:
1709       return XEXP (x, 0) == XEXP (y, 0);
1710
1711     case SYMBOL_REF:
1712       return XSTR (x, 0) == XSTR (y, 0);
1713
1714     case REG:
1715       return REGNO (x) == REGNO (y);
1716
1717     case MEM:
1718       /* Can't merge two expressions in different alias sets, since we can
1719          decide that the expression is transparent in a block when it isn't,
1720          due to it being set with the different alias set.  */
1721       if (MEM_ALIAS_SET (x) != MEM_ALIAS_SET (y))
1722         return 0;
1723
1724       /* A volatile mem should not be considered equivalent to any other.  */
1725       if (MEM_VOLATILE_P (x) || MEM_VOLATILE_P (y))
1726         return 0;
1727       break;
1728
1729     /*  For commutative operations, check both orders.  */
1730     case PLUS:
1731     case MULT:
1732     case AND:
1733     case IOR:
1734     case XOR:
1735     case NE:
1736     case EQ:
1737       return ((expr_equiv_p (XEXP (x, 0), XEXP (y, 0))
1738                && expr_equiv_p (XEXP (x, 1), XEXP (y, 1)))
1739               || (expr_equiv_p (XEXP (x, 0), XEXP (y, 1))
1740                   && expr_equiv_p (XEXP (x, 1), XEXP (y, 0))));
1741
1742     case ASM_OPERANDS:
1743       /* We don't use the generic code below because we want to
1744          disregard filename and line numbers.  */
1745
1746       /* A volatile asm isn't equivalent to any other.  */
1747       if (MEM_VOLATILE_P (x) || MEM_VOLATILE_P (y))
1748         return 0;
1749
1750       if (GET_MODE (x) != GET_MODE (y)
1751           || strcmp (ASM_OPERANDS_TEMPLATE (x), ASM_OPERANDS_TEMPLATE (y))
1752           || strcmp (ASM_OPERANDS_OUTPUT_CONSTRAINT (x),
1753                      ASM_OPERANDS_OUTPUT_CONSTRAINT (y))
1754           || ASM_OPERANDS_OUTPUT_IDX (x) != ASM_OPERANDS_OUTPUT_IDX (y)
1755           || ASM_OPERANDS_INPUT_LENGTH (x) != ASM_OPERANDS_INPUT_LENGTH (y))
1756         return 0;
1757
1758       if (ASM_OPERANDS_INPUT_LENGTH (x))
1759         {
1760           for (i = ASM_OPERANDS_INPUT_LENGTH (x) - 1; i >= 0; i--)
1761             if (! expr_equiv_p (ASM_OPERANDS_INPUT (x, i),
1762                                 ASM_OPERANDS_INPUT (y, i))
1763                 || strcmp (ASM_OPERANDS_INPUT_CONSTRAINT (x, i),
1764                            ASM_OPERANDS_INPUT_CONSTRAINT (y, i)))
1765               return 0;
1766         }
1767
1768       return 1;
1769
1770     default:
1771       break;
1772     }
1773
1774   /* Compare the elements.  If any pair of corresponding elements
1775      fail to match, return 0 for the whole thing.  */
1776
1777   fmt = GET_RTX_FORMAT (code);
1778   for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
1779     {
1780       switch (fmt[i])
1781         {
1782         case 'e':
1783           if (! expr_equiv_p (XEXP (x, i), XEXP (y, i)))
1784             return 0;
1785           break;
1786
1787         case 'E':
1788           if (XVECLEN (x, i) != XVECLEN (y, i))
1789             return 0;
1790           for (j = 0; j < XVECLEN (x, i); j++)
1791             if (! expr_equiv_p (XVECEXP (x, i, j), XVECEXP (y, i, j)))
1792               return 0;
1793           break;
1794
1795         case 's':
1796           if (strcmp (XSTR (x, i), XSTR (y, i)))
1797             return 0;
1798           break;
1799
1800         case 'i':
1801           if (XINT (x, i) != XINT (y, i))
1802             return 0;
1803           break;
1804
1805         case 'w':
1806           if (XWINT (x, i) != XWINT (y, i))
1807             return 0;
1808         break;
1809
1810         case '0':
1811           break;
1812
1813         default:
1814           abort ();
1815         }
1816     }
1817
1818   return 1;
1819 }
1820
1821 /* Insert expression X in INSN in the hash TABLE.
1822    If it is already present, record it as the last occurrence in INSN's
1823    basic block.
1824
1825    MODE is the mode of the value X is being stored into.
1826    It is only used if X is a CONST_INT.
1827
1828    ANTIC_P is nonzero if X is an anticipatable expression.
1829    AVAIL_P is nonzero if X is an available expression.  */
1830
1831 static void
1832 insert_expr_in_table (rtx x, enum machine_mode mode, rtx insn, int antic_p,
1833                       int avail_p, struct hash_table *table)
1834 {
1835   int found, do_not_record_p;
1836   unsigned int hash;
1837   struct expr *cur_expr, *last_expr = NULL;
1838   struct occr *antic_occr, *avail_occr;
1839   struct occr *last_occr = NULL;
1840
1841   hash = hash_expr (x, mode, &do_not_record_p, table->size);
1842
1843   /* Do not insert expression in table if it contains volatile operands,
1844      or if hash_expr determines the expression is something we don't want
1845      to or can't handle.  */
1846   if (do_not_record_p)
1847     return;
1848
1849   cur_expr = table->table[hash];
1850   found = 0;
1851
1852   while (cur_expr && 0 == (found = expr_equiv_p (cur_expr->expr, x)))
1853     {
1854       /* If the expression isn't found, save a pointer to the end of
1855          the list.  */
1856       last_expr = cur_expr;
1857       cur_expr = cur_expr->next_same_hash;
1858     }
1859
1860   if (! found)
1861     {
1862       cur_expr = gcse_alloc (sizeof (struct expr));
1863       bytes_used += sizeof (struct expr);
1864       if (table->table[hash] == NULL)
1865         /* This is the first pattern that hashed to this index.  */
1866         table->table[hash] = cur_expr;
1867       else
1868         /* Add EXPR to end of this hash chain.  */
1869         last_expr->next_same_hash = cur_expr;
1870
1871       /* Set the fields of the expr element.  */
1872       cur_expr->expr = x;
1873       cur_expr->bitmap_index = table->n_elems++;
1874       cur_expr->next_same_hash = NULL;
1875       cur_expr->antic_occr = NULL;
1876       cur_expr->avail_occr = NULL;
1877     }
1878
1879   /* Now record the occurrence(s).  */
1880   if (antic_p)
1881     {
1882       antic_occr = cur_expr->antic_occr;
1883
1884       /* Search for another occurrence in the same basic block.  */
1885       while (antic_occr && BLOCK_NUM (antic_occr->insn) != BLOCK_NUM (insn))
1886         {
1887           /* If an occurrence isn't found, save a pointer to the end of
1888              the list.  */
1889           last_occr = antic_occr;
1890           antic_occr = antic_occr->next;
1891         }
1892
1893       if (antic_occr)
1894         /* Found another instance of the expression in the same basic block.
1895            Prefer the currently recorded one.  We want the first one in the
1896            block and the block is scanned from start to end.  */
1897         ; /* nothing to do */
1898       else
1899         {
1900           /* First occurrence of this expression in this basic block.  */
1901           antic_occr = gcse_alloc (sizeof (struct occr));
1902           bytes_used += sizeof (struct occr);
1903           /* First occurrence of this expression in any block?  */
1904           if (cur_expr->antic_occr == NULL)
1905             cur_expr->antic_occr = antic_occr;
1906           else
1907             last_occr->next = antic_occr;
1908
1909           antic_occr->insn = insn;
1910           antic_occr->next = NULL;
1911           antic_occr->deleted_p = 0;
1912         }
1913     }
1914
1915   if (avail_p)
1916     {
1917       avail_occr = cur_expr->avail_occr;
1918
1919       /* Search for another occurrence in the same basic block.  */
1920       while (avail_occr && BLOCK_NUM (avail_occr->insn) != BLOCK_NUM (insn))
1921         {
1922           /* If an occurrence isn't found, save a pointer to the end of
1923              the list.  */
1924           last_occr = avail_occr;
1925           avail_occr = avail_occr->next;
1926         }
1927
1928       if (avail_occr)
1929         /* Found another instance of the expression in the same basic block.
1930            Prefer this occurrence to the currently recorded one.  We want
1931            the last one in the block and the block is scanned from start
1932            to end.  */
1933         avail_occr->insn = insn;
1934       else
1935         {
1936           /* First occurrence of this expression in this basic block.  */
1937           avail_occr = gcse_alloc (sizeof (struct occr));
1938           bytes_used += sizeof (struct occr);
1939
1940           /* First occurrence of this expression in any block?  */
1941           if (cur_expr->avail_occr == NULL)
1942             cur_expr->avail_occr = avail_occr;
1943           else
1944             last_occr->next = avail_occr;
1945
1946           avail_occr->insn = insn;
1947           avail_occr->next = NULL;
1948           avail_occr->deleted_p = 0;
1949         }
1950     }
1951 }
1952
1953 /* Insert pattern X in INSN in the hash table.
1954    X is a SET of a reg to either another reg or a constant.
1955    If it is already present, record it as the last occurrence in INSN's
1956    basic block.  */
1957
1958 static void
1959 insert_set_in_table (rtx x, rtx insn, struct hash_table *table)
1960 {
1961   int found;
1962   unsigned int hash;
1963   struct expr *cur_expr, *last_expr = NULL;
1964   struct occr *cur_occr, *last_occr = NULL;
1965
1966   if (GET_CODE (x) != SET
1967       || GET_CODE (SET_DEST (x)) != REG)
1968     abort ();
1969
1970   hash = hash_set (REGNO (SET_DEST (x)), table->size);
1971
1972   cur_expr = table->table[hash];
1973   found = 0;
1974
1975   while (cur_expr && 0 == (found = expr_equiv_p (cur_expr->expr, x)))
1976     {
1977       /* If the expression isn't found, save a pointer to the end of
1978          the list.  */
1979       last_expr = cur_expr;
1980       cur_expr = cur_expr->next_same_hash;
1981     }
1982
1983   if (! found)
1984     {
1985       cur_expr = gcse_alloc (sizeof (struct expr));
1986       bytes_used += sizeof (struct expr);
1987       if (table->table[hash] == NULL)
1988         /* This is the first pattern that hashed to this index.  */
1989         table->table[hash] = cur_expr;
1990       else
1991         /* Add EXPR to end of this hash chain.  */
1992         last_expr->next_same_hash = cur_expr;
1993
1994       /* Set the fields of the expr element.
1995          We must copy X because it can be modified when copy propagation is
1996          performed on its operands.  */
1997       cur_expr->expr = copy_rtx (x);
1998       cur_expr->bitmap_index = table->n_elems++;
1999       cur_expr->next_same_hash = NULL;
2000       cur_expr->antic_occr = NULL;
2001       cur_expr->avail_occr = NULL;
2002     }
2003
2004   /* Now record the occurrence.  */
2005   cur_occr = cur_expr->avail_occr;
2006
2007   /* Search for another occurrence in the same basic block.  */
2008   while (cur_occr && BLOCK_NUM (cur_occr->insn) != BLOCK_NUM (insn))
2009     {
2010       /* If an occurrence isn't found, save a pointer to the end of
2011          the list.  */
2012       last_occr = cur_occr;
2013       cur_occr = cur_occr->next;
2014     }
2015
2016   if (cur_occr)
2017     /* Found another instance of the expression in the same basic block.
2018        Prefer this occurrence to the currently recorded one.  We want the
2019        last one in the block and the block is scanned from start to end.  */
2020     cur_occr->insn = insn;
2021   else
2022     {
2023       /* First occurrence of this expression in this basic block.  */
2024       cur_occr = gcse_alloc (sizeof (struct occr));
2025       bytes_used += sizeof (struct occr);
2026
2027       /* First occurrence of this expression in any block?  */
2028       if (cur_expr->avail_occr == NULL)
2029         cur_expr->avail_occr = cur_occr;
2030       else
2031         last_occr->next = cur_occr;
2032
2033       cur_occr->insn = insn;
2034       cur_occr->next = NULL;
2035       cur_occr->deleted_p = 0;
2036     }
2037 }
2038
2039 /* Determine whether the rtx X should be treated as a constant for
2040    the purposes of GCSE's constant propagation.  */
2041
2042 static bool
2043 gcse_constant_p (rtx x)
2044 {
2045   /* Consider a COMPARE of two integers constant.  */
2046   if (GET_CODE (x) == COMPARE
2047       && GET_CODE (XEXP (x, 0)) == CONST_INT
2048       && GET_CODE (XEXP (x, 1)) == CONST_INT)
2049     return true;
2050
2051
2052   /* Consider a COMPARE of the same registers is a constant
2053     if they are not floating point registers.  */
2054   if (GET_CODE(x) == COMPARE
2055       && GET_CODE (XEXP (x, 0)) == REG
2056       && GET_CODE (XEXP (x, 1)) == REG
2057       && REGNO (XEXP (x, 0)) == REGNO (XEXP (x, 1))
2058       && ! FLOAT_MODE_P (GET_MODE (XEXP (x, 0)))
2059       && ! FLOAT_MODE_P (GET_MODE (XEXP (x, 1))))
2060     return true;
2061
2062   return CONSTANT_P (x);
2063 }
2064
2065 /* Scan pattern PAT of INSN and add an entry to the hash TABLE (set or
2066    expression one).  */
2067
2068 static void
2069 hash_scan_set (rtx pat, rtx insn, struct hash_table *table)
2070 {
2071   rtx src = SET_SRC (pat);
2072   rtx dest = SET_DEST (pat);
2073   rtx note;
2074
2075   if (GET_CODE (src) == CALL)
2076     hash_scan_call (src, insn, table);
2077
2078   else if (GET_CODE (dest) == REG)
2079     {
2080       unsigned int regno = REGNO (dest);
2081       rtx tmp;
2082
2083       /* If this is a single set and we are doing constant propagation,
2084          see if a REG_NOTE shows this equivalent to a constant.  */
2085       if (table->set_p && (note = find_reg_equal_equiv_note (insn)) != 0
2086           && gcse_constant_p (XEXP (note, 0)))
2087         src = XEXP (note, 0), pat = gen_rtx_SET (VOIDmode, dest, src);
2088
2089       /* Only record sets of pseudo-regs in the hash table.  */
2090       if (! table->set_p
2091           && regno >= FIRST_PSEUDO_REGISTER
2092           /* Don't GCSE something if we can't do a reg/reg copy.  */
2093           && can_copy_p (GET_MODE (dest))
2094           /* GCSE commonly inserts instruction after the insn.  We can't
2095              do that easily for EH_REGION notes so disable GCSE on these
2096              for now.  */
2097           && !find_reg_note (insn, REG_EH_REGION, NULL_RTX)
2098           /* Is SET_SRC something we want to gcse?  */
2099           && want_to_gcse_p (src)
2100           /* Don't CSE a nop.  */
2101           && ! set_noop_p (pat)
2102           /* Don't GCSE if it has attached REG_EQUIV note.
2103              At this point this only function parameters should have
2104              REG_EQUIV notes and if the argument slot is used somewhere
2105              explicitly, it means address of parameter has been taken,
2106              so we should not extend the lifetime of the pseudo.  */
2107           && ((note = find_reg_note (insn, REG_EQUIV, NULL_RTX)) == 0
2108               || GET_CODE (XEXP (note, 0)) != MEM))
2109         {
2110           /* An expression is not anticipatable if its operands are
2111              modified before this insn or if this is not the only SET in
2112              this insn.  */
2113           int antic_p = oprs_anticipatable_p (src, insn) && single_set (insn);
2114           /* An expression is not available if its operands are
2115              subsequently modified, including this insn.  It's also not
2116              available if this is a branch, because we can't insert
2117              a set after the branch.  */
2118           int avail_p = (oprs_available_p (src, insn)
2119                          && ! JUMP_P (insn));
2120
2121           insert_expr_in_table (src, GET_MODE (dest), insn, antic_p, avail_p, table);
2122         }
2123
2124       /* Record sets for constant/copy propagation.  */
2125       else if (table->set_p
2126                && regno >= FIRST_PSEUDO_REGISTER
2127                && ((GET_CODE (src) == REG
2128                     && REGNO (src) >= FIRST_PSEUDO_REGISTER
2129                     && can_copy_p (GET_MODE (dest))
2130                     && REGNO (src) != regno)
2131                    || gcse_constant_p (src))
2132                /* A copy is not available if its src or dest is subsequently
2133                   modified.  Here we want to search from INSN+1 on, but
2134                   oprs_available_p searches from INSN on.  */
2135                && (insn == BB_END (BLOCK_FOR_INSN (insn))
2136                    || ((tmp = next_nonnote_insn (insn)) != NULL_RTX
2137                        && oprs_available_p (pat, tmp))))
2138         insert_set_in_table (pat, insn, table);
2139     }
2140   /* In case of store we want to consider the memory value as available in
2141      the REG stored in that memory. This makes it possible to remove
2142      redundant loads from due to stores to the same location.  */
2143   else if (flag_gcse_las && GET_CODE (src) == REG && GET_CODE (dest) == MEM)
2144       {
2145         unsigned int regno = REGNO (src);
2146
2147         /* Do not do this for constant/copy propagation.  */
2148         if (! table->set_p
2149             /* Only record sets of pseudo-regs in the hash table.  */
2150             && regno >= FIRST_PSEUDO_REGISTER
2151            /* Don't GCSE something if we can't do a reg/reg copy.  */
2152            && can_copy_p (GET_MODE (src))
2153            /* GCSE commonly inserts instruction after the insn.  We can't
2154               do that easily for EH_REGION notes so disable GCSE on these
2155               for now.  */
2156            && ! find_reg_note (insn, REG_EH_REGION, NULL_RTX)
2157            /* Is SET_DEST something we want to gcse?  */
2158            && want_to_gcse_p (dest)
2159            /* Don't CSE a nop.  */
2160            && ! set_noop_p (pat)
2161            /* Don't GCSE if it has attached REG_EQUIV note.
2162               At this point this only function parameters should have
2163               REG_EQUIV notes and if the argument slot is used somewhere
2164               explicitly, it means address of parameter has been taken,
2165               so we should not extend the lifetime of the pseudo.  */
2166            && ((note = find_reg_note (insn, REG_EQUIV, NULL_RTX)) == 0
2167                || GET_CODE (XEXP (note, 0)) != MEM))
2168              {
2169                /* Stores are never anticipatable.  */
2170                int antic_p = 0;
2171                /* An expression is not available if its operands are
2172                   subsequently modified, including this insn.  It's also not
2173                   available if this is a branch, because we can't insert
2174                   a set after the branch.  */
2175                int avail_p = oprs_available_p (dest, insn)
2176                              && ! JUMP_P (insn);
2177
2178                /* Record the memory expression (DEST) in the hash table.  */
2179                insert_expr_in_table (dest, GET_MODE (dest), insn,
2180                                      antic_p, avail_p, table);
2181              }
2182       }
2183 }
2184
2185 static void
2186 hash_scan_clobber (rtx x ATTRIBUTE_UNUSED, rtx insn ATTRIBUTE_UNUSED,
2187                    struct hash_table *table ATTRIBUTE_UNUSED)
2188 {
2189   /* Currently nothing to do.  */
2190 }
2191
2192 static void
2193 hash_scan_call (rtx x ATTRIBUTE_UNUSED, rtx insn ATTRIBUTE_UNUSED,
2194                 struct hash_table *table ATTRIBUTE_UNUSED)
2195 {
2196   /* Currently nothing to do.  */
2197 }
2198
2199 /* Process INSN and add hash table entries as appropriate.
2200
2201    Only available expressions that set a single pseudo-reg are recorded.
2202
2203    Single sets in a PARALLEL could be handled, but it's an extra complication
2204    that isn't dealt with right now.  The trick is handling the CLOBBERs that
2205    are also in the PARALLEL.  Later.
2206
2207    If SET_P is nonzero, this is for the assignment hash table,
2208    otherwise it is for the expression hash table.
2209    If IN_LIBCALL_BLOCK nonzero, we are in a libcall block, and should
2210    not record any expressions.  */
2211
2212 static void
2213 hash_scan_insn (rtx insn, struct hash_table *table, int in_libcall_block)
2214 {
2215   rtx pat = PATTERN (insn);
2216   int i;
2217
2218   if (in_libcall_block)
2219     return;
2220
2221   /* Pick out the sets of INSN and for other forms of instructions record
2222      what's been modified.  */
2223
2224   if (GET_CODE (pat) == SET)
2225     hash_scan_set (pat, insn, table);
2226   else if (GET_CODE (pat) == PARALLEL)
2227     for (i = 0; i < XVECLEN (pat, 0); i++)
2228       {
2229         rtx x = XVECEXP (pat, 0, i);
2230
2231         if (GET_CODE (x) == SET)
2232           hash_scan_set (x, insn, table);
2233         else if (GET_CODE (x) == CLOBBER)
2234           hash_scan_clobber (x, insn, table);
2235         else if (GET_CODE (x) == CALL)
2236           hash_scan_call (x, insn, table);
2237       }
2238
2239   else if (GET_CODE (pat) == CLOBBER)
2240     hash_scan_clobber (pat, insn, table);
2241   else if (GET_CODE (pat) == CALL)
2242     hash_scan_call (pat, insn, table);
2243 }
2244
2245 static void
2246 dump_hash_table (FILE *file, const char *name, struct hash_table *table)
2247 {
2248   int i;
2249   /* Flattened out table, so it's printed in proper order.  */
2250   struct expr **flat_table;
2251   unsigned int *hash_val;
2252   struct expr *expr;
2253
2254   flat_table = xcalloc (table->n_elems, sizeof (struct expr *));
2255   hash_val = xmalloc (table->n_elems * sizeof (unsigned int));
2256
2257   for (i = 0; i < (int) table->size; i++)
2258     for (expr = table->table[i]; expr != NULL; expr = expr->next_same_hash)
2259       {
2260         flat_table[expr->bitmap_index] = expr;
2261         hash_val[expr->bitmap_index] = i;
2262       }
2263
2264   fprintf (file, "%s hash table (%d buckets, %d entries)\n",
2265            name, table->size, table->n_elems);
2266
2267   for (i = 0; i < (int) table->n_elems; i++)
2268     if (flat_table[i] != 0)
2269       {
2270         expr = flat_table[i];
2271         fprintf (file, "Index %d (hash value %d)\n  ",
2272                  expr->bitmap_index, hash_val[i]);
2273         print_rtl (file, expr->expr);
2274         fprintf (file, "\n");
2275       }
2276
2277   fprintf (file, "\n");
2278
2279   free (flat_table);
2280   free (hash_val);
2281 }
2282
2283 /* Record register first/last/block set information for REGNO in INSN.
2284
2285    first_set records the first place in the block where the register
2286    is set and is used to compute "anticipatability".
2287
2288    last_set records the last place in the block where the register
2289    is set and is used to compute "availability".
2290
2291    last_bb records the block for which first_set and last_set are
2292    valid, as a quick test to invalidate them.
2293
2294    reg_set_in_block records whether the register is set in the block
2295    and is used to compute "transparency".  */
2296
2297 static void
2298 record_last_reg_set_info (rtx insn, int regno)
2299 {
2300   struct reg_avail_info *info = &reg_avail_info[regno];
2301   int cuid = INSN_CUID (insn);
2302
2303   info->last_set = cuid;
2304   if (info->last_bb != current_bb)
2305     {
2306       info->last_bb = current_bb;
2307       info->first_set = cuid;
2308       SET_BIT (reg_set_in_block[current_bb->index], regno);
2309     }
2310 }
2311
2312
2313 /* Record all of the canonicalized MEMs of record_last_mem_set_info's insn.
2314    Note we store a pair of elements in the list, so they have to be
2315    taken off pairwise.  */
2316
2317 static void
2318 canon_list_insert (rtx dest ATTRIBUTE_UNUSED, rtx unused1 ATTRIBUTE_UNUSED,
2319                    void * v_insn)
2320 {
2321   rtx dest_addr, insn;
2322   int bb;
2323
2324   while (GET_CODE (dest) == SUBREG
2325       || GET_CODE (dest) == ZERO_EXTRACT
2326       || GET_CODE (dest) == SIGN_EXTRACT
2327       || GET_CODE (dest) == STRICT_LOW_PART)
2328     dest = XEXP (dest, 0);
2329
2330   /* If DEST is not a MEM, then it will not conflict with a load.  Note
2331      that function calls are assumed to clobber memory, but are handled
2332      elsewhere.  */
2333
2334   if (GET_CODE (dest) != MEM)
2335     return;
2336
2337   dest_addr = get_addr (XEXP (dest, 0));
2338   dest_addr = canon_rtx (dest_addr);
2339   insn = (rtx) v_insn;
2340   bb = BLOCK_NUM (insn);
2341
2342   canon_modify_mem_list[bb] =
2343     alloc_EXPR_LIST (VOIDmode, dest_addr, canon_modify_mem_list[bb]);
2344   canon_modify_mem_list[bb] =
2345     alloc_EXPR_LIST (VOIDmode, dest, canon_modify_mem_list[bb]);
2346   bitmap_set_bit (canon_modify_mem_list_set, bb);
2347 }
2348
2349 /* Record memory modification information for INSN.  We do not actually care
2350    about the memory location(s) that are set, or even how they are set (consider
2351    a CALL_INSN).  We merely need to record which insns modify memory.  */
2352
2353 static void
2354 record_last_mem_set_info (rtx insn)
2355 {
2356   int bb = BLOCK_NUM (insn);
2357
2358   /* load_killed_in_block_p will handle the case of calls clobbering
2359      everything.  */
2360   modify_mem_list[bb] = alloc_INSN_LIST (insn, modify_mem_list[bb]);
2361   bitmap_set_bit (modify_mem_list_set, bb);
2362
2363   if (GET_CODE (insn) == CALL_INSN)
2364     {
2365       /* Note that traversals of this loop (other than for free-ing)
2366          will break after encountering a CALL_INSN.  So, there's no
2367          need to insert a pair of items, as canon_list_insert does.  */
2368       canon_modify_mem_list[bb] =
2369         alloc_INSN_LIST (insn, canon_modify_mem_list[bb]);
2370       bitmap_set_bit (canon_modify_mem_list_set, bb);
2371     }
2372   else
2373     note_stores (PATTERN (insn), canon_list_insert, (void*) insn);
2374 }
2375
2376 /* Called from compute_hash_table via note_stores to handle one
2377    SET or CLOBBER in an insn.  DATA is really the instruction in which
2378    the SET is taking place.  */
2379
2380 static void
2381 record_last_set_info (rtx dest, rtx setter ATTRIBUTE_UNUSED, void *data)
2382 {
2383   rtx last_set_insn = (rtx) data;
2384
2385   if (GET_CODE (dest) == SUBREG)
2386     dest = SUBREG_REG (dest);
2387
2388   if (GET_CODE (dest) == REG)
2389     record_last_reg_set_info (last_set_insn, REGNO (dest));
2390   else if (GET_CODE (dest) == MEM
2391            /* Ignore pushes, they clobber nothing.  */
2392            && ! push_operand (dest, GET_MODE (dest)))
2393     record_last_mem_set_info (last_set_insn);
2394 }
2395
2396 /* Top level function to create an expression or assignment hash table.
2397
2398    Expression entries are placed in the hash table if
2399    - they are of the form (set (pseudo-reg) src),
2400    - src is something we want to perform GCSE on,
2401    - none of the operands are subsequently modified in the block
2402
2403    Assignment entries are placed in the hash table if
2404    - they are of the form (set (pseudo-reg) src),
2405    - src is something we want to perform const/copy propagation on,
2406    - none of the operands or target are subsequently modified in the block
2407
2408    Currently src must be a pseudo-reg or a const_int.
2409
2410    TABLE is the table computed.  */
2411
2412 static void
2413 compute_hash_table_work (struct hash_table *table)
2414 {
2415   unsigned int i;
2416
2417   /* While we compute the hash table we also compute a bit array of which
2418      registers are set in which blocks.
2419      ??? This isn't needed during const/copy propagation, but it's cheap to
2420      compute.  Later.  */
2421   sbitmap_vector_zero (reg_set_in_block, last_basic_block);
2422
2423   /* re-Cache any INSN_LIST nodes we have allocated.  */
2424   clear_modify_mem_tables ();
2425   /* Some working arrays used to track first and last set in each block.  */
2426   reg_avail_info = gmalloc (max_gcse_regno * sizeof (struct reg_avail_info));
2427
2428   for (i = 0; i < max_gcse_regno; ++i)
2429     reg_avail_info[i].last_bb = NULL;
2430
2431   FOR_EACH_BB (current_bb)
2432     {
2433       rtx insn;
2434       unsigned int regno;
2435       int in_libcall_block;
2436
2437       /* First pass over the instructions records information used to
2438          determine when registers and memory are first and last set.
2439          ??? hard-reg reg_set_in_block computation
2440          could be moved to compute_sets since they currently don't change.  */
2441
2442       for (insn = BB_HEAD (current_bb);
2443            insn && insn != NEXT_INSN (BB_END (current_bb));
2444            insn = NEXT_INSN (insn))
2445         {
2446           if (! INSN_P (insn))
2447             continue;
2448
2449           if (GET_CODE (insn) == CALL_INSN)
2450             {
2451               bool clobbers_all = false;
2452 #ifdef NON_SAVING_SETJMP
2453               if (NON_SAVING_SETJMP
2454                   && find_reg_note (insn, REG_SETJMP, NULL_RTX))
2455                 clobbers_all = true;
2456 #endif
2457
2458               for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
2459                 if (clobbers_all
2460                     || TEST_HARD_REG_BIT (regs_invalidated_by_call, regno))
2461                   record_last_reg_set_info (insn, regno);
2462
2463               mark_call (insn);
2464             }
2465
2466           note_stores (PATTERN (insn), record_last_set_info, insn);
2467         }
2468
2469       /* Insert implicit sets in the hash table.  */
2470       if (table->set_p
2471           && implicit_sets[current_bb->index] != NULL_RTX)
2472         hash_scan_set (implicit_sets[current_bb->index],
2473                        BB_HEAD (current_bb), table);
2474
2475       /* The next pass builds the hash table.  */
2476
2477       for (insn = BB_HEAD (current_bb), in_libcall_block = 0;
2478            insn && insn != NEXT_INSN (BB_END (current_bb));
2479            insn = NEXT_INSN (insn))
2480         if (INSN_P (insn))
2481           {
2482             if (find_reg_note (insn, REG_LIBCALL, NULL_RTX))
2483               in_libcall_block = 1;
2484             else if (table->set_p && find_reg_note (insn, REG_RETVAL, NULL_RTX))
2485               in_libcall_block = 0;
2486             hash_scan_insn (insn, table, in_libcall_block);
2487             if (!table->set_p && find_reg_note (insn, REG_RETVAL, NULL_RTX))
2488               in_libcall_block = 0;
2489           }
2490     }
2491
2492   free (reg_avail_info);
2493   reg_avail_info = NULL;
2494 }
2495
2496 /* Allocate space for the set/expr hash TABLE.
2497    N_INSNS is the number of instructions in the function.
2498    It is used to determine the number of buckets to use.
2499    SET_P determines whether set or expression table will
2500    be created.  */
2501
2502 static void
2503 alloc_hash_table (int n_insns, struct hash_table *table, int set_p)
2504 {
2505   int n;
2506
2507   table->size = n_insns / 4;
2508   if (table->size < 11)
2509     table->size = 11;
2510
2511   /* Attempt to maintain efficient use of hash table.
2512      Making it an odd number is simplest for now.
2513      ??? Later take some measurements.  */
2514   table->size |= 1;
2515   n = table->size * sizeof (struct expr *);
2516   table->table = gmalloc (n);
2517   table->set_p = set_p;
2518 }
2519
2520 /* Free things allocated by alloc_hash_table.  */
2521
2522 static void
2523 free_hash_table (struct hash_table *table)
2524 {
2525   free (table->table);
2526 }
2527
2528 /* Compute the hash TABLE for doing copy/const propagation or
2529    expression hash table.  */
2530
2531 static void
2532 compute_hash_table (struct hash_table *table)
2533 {
2534   /* Initialize count of number of entries in hash table.  */
2535   table->n_elems = 0;
2536   memset (table->table, 0, table->size * sizeof (struct expr *));
2537
2538   compute_hash_table_work (table);
2539 }
2540 \f
2541 /* Expression tracking support.  */
2542
2543 /* Lookup pattern PAT in the expression TABLE.
2544    The result is a pointer to the table entry, or NULL if not found.  */
2545
2546 static struct expr *
2547 lookup_expr (rtx pat, struct hash_table *table)
2548 {
2549   int do_not_record_p;
2550   unsigned int hash = hash_expr (pat, GET_MODE (pat), &do_not_record_p,
2551                                  table->size);
2552   struct expr *expr;
2553
2554   if (do_not_record_p)
2555     return NULL;
2556
2557   expr = table->table[hash];
2558
2559   while (expr && ! expr_equiv_p (expr->expr, pat))
2560     expr = expr->next_same_hash;
2561
2562   return expr;
2563 }
2564
2565 /* Lookup REGNO in the set TABLE.  The result is a pointer to the
2566    table entry, or NULL if not found.  */
2567
2568 static struct expr *
2569 lookup_set (unsigned int regno, struct hash_table *table)
2570 {
2571   unsigned int hash = hash_set (regno, table->size);
2572   struct expr *expr;
2573
2574   expr = table->table[hash];
2575
2576   while (expr && REGNO (SET_DEST (expr->expr)) != regno)
2577     expr = expr->next_same_hash;
2578
2579   return expr;
2580 }
2581
2582 /* Return the next entry for REGNO in list EXPR.  */
2583
2584 static struct expr *
2585 next_set (unsigned int regno, struct expr *expr)
2586 {
2587   do
2588     expr = expr->next_same_hash;
2589   while (expr && REGNO (SET_DEST (expr->expr)) != regno);
2590
2591   return expr;
2592 }
2593
2594 /* Like free_INSN_LIST_list or free_EXPR_LIST_list, except that the node
2595    types may be mixed.  */
2596
2597 static void
2598 free_insn_expr_list_list (rtx *listp)
2599 {
2600   rtx list, next;
2601
2602   for (list = *listp; list ; list = next)
2603     {
2604       next = XEXP (list, 1);
2605       if (GET_CODE (list) == EXPR_LIST)
2606         free_EXPR_LIST_node (list);
2607       else
2608         free_INSN_LIST_node (list);
2609     }
2610
2611   *listp = NULL;
2612 }
2613
2614 /* Clear canon_modify_mem_list and modify_mem_list tables.  */
2615 static void
2616 clear_modify_mem_tables (void)
2617 {
2618   int i;
2619
2620   EXECUTE_IF_SET_IN_BITMAP
2621     (modify_mem_list_set, 0, i, free_INSN_LIST_list (modify_mem_list + i));
2622   bitmap_clear (modify_mem_list_set);
2623
2624   EXECUTE_IF_SET_IN_BITMAP
2625     (canon_modify_mem_list_set, 0, i,
2626      free_insn_expr_list_list (canon_modify_mem_list + i));
2627   bitmap_clear (canon_modify_mem_list_set);
2628 }
2629
2630 /* Release memory used by modify_mem_list_set and canon_modify_mem_list_set.  */
2631
2632 static void
2633 free_modify_mem_tables (void)
2634 {
2635   clear_modify_mem_tables ();
2636   free (modify_mem_list);
2637   free (canon_modify_mem_list);
2638   modify_mem_list = 0;
2639   canon_modify_mem_list = 0;
2640 }
2641
2642 /* Reset tables used to keep track of what's still available [since the
2643    start of the block].  */
2644
2645 static void
2646 reset_opr_set_tables (void)
2647 {
2648   /* Maintain a bitmap of which regs have been set since beginning of
2649      the block.  */
2650   CLEAR_REG_SET (reg_set_bitmap);
2651
2652   /* Also keep a record of the last instruction to modify memory.
2653      For now this is very trivial, we only record whether any memory
2654      location has been modified.  */
2655   clear_modify_mem_tables ();
2656 }
2657
2658 /* Return nonzero if the operands of X are not set before INSN in
2659    INSN's basic block.  */
2660
2661 static int
2662 oprs_not_set_p (rtx x, rtx insn)
2663 {
2664   int i, j;
2665   enum rtx_code code;
2666   const char *fmt;
2667
2668   if (x == 0)
2669     return 1;
2670
2671   code = GET_CODE (x);
2672   switch (code)
2673     {
2674     case PC:
2675     case CC0:
2676     case CONST:
2677     case CONST_INT:
2678     case CONST_DOUBLE:
2679     case CONST_VECTOR:
2680     case SYMBOL_REF:
2681     case LABEL_REF:
2682     case ADDR_VEC:
2683     case ADDR_DIFF_VEC:
2684       return 1;
2685
2686     case MEM:
2687       if (load_killed_in_block_p (BLOCK_FOR_INSN (insn),
2688                                   INSN_CUID (insn), x, 0))
2689         return 0;
2690       else
2691         return oprs_not_set_p (XEXP (x, 0), insn);
2692
2693     case REG:
2694       return ! REGNO_REG_SET_P (reg_set_bitmap, REGNO (x));
2695
2696     default:
2697       break;
2698     }
2699
2700   for (i = GET_RTX_LENGTH (code) - 1, fmt = GET_RTX_FORMAT (code); i >= 0; i--)
2701     {
2702       if (fmt[i] == 'e')
2703         {
2704           /* If we are about to do the last recursive call
2705              needed at this level, change it into iteration.
2706              This function is called enough to be worth it.  */
2707           if (i == 0)
2708             return oprs_not_set_p (XEXP (x, i), insn);
2709
2710           if (! oprs_not_set_p (XEXP (x, i), insn))
2711             return 0;
2712         }
2713       else if (fmt[i] == 'E')
2714         for (j = 0; j < XVECLEN (x, i); j++)
2715           if (! oprs_not_set_p (XVECEXP (x, i, j), insn))
2716             return 0;
2717     }
2718
2719   return 1;
2720 }
2721
2722 /* Mark things set by a CALL.  */
2723
2724 static void
2725 mark_call (rtx insn)
2726 {
2727   if (! CONST_OR_PURE_CALL_P (insn))
2728     record_last_mem_set_info (insn);
2729 }
2730
2731 /* Mark things set by a SET.  */
2732
2733 static void
2734 mark_set (rtx pat, rtx insn)
2735 {
2736   rtx dest = SET_DEST (pat);
2737
2738   while (GET_CODE (dest) == SUBREG
2739          || GET_CODE (dest) == ZERO_EXTRACT
2740          || GET_CODE (dest) == SIGN_EXTRACT
2741          || GET_CODE (dest) == STRICT_LOW_PART)
2742     dest = XEXP (dest, 0);
2743
2744   if (GET_CODE (dest) == REG)
2745     SET_REGNO_REG_SET (reg_set_bitmap, REGNO (dest));
2746   else if (GET_CODE (dest) == MEM)
2747     record_last_mem_set_info (insn);
2748
2749   if (GET_CODE (SET_SRC (pat)) == CALL)
2750     mark_call (insn);
2751 }
2752
2753 /* Record things set by a CLOBBER.  */
2754
2755 static void
2756 mark_clobber (rtx pat, rtx insn)
2757 {
2758   rtx clob = XEXP (pat, 0);
2759
2760   while (GET_CODE (clob) == SUBREG || GET_CODE (clob) == STRICT_LOW_PART)
2761     clob = XEXP (clob, 0);
2762
2763   if (GET_CODE (clob) == REG)
2764     SET_REGNO_REG_SET (reg_set_bitmap, REGNO (clob));
2765   else
2766     record_last_mem_set_info (insn);
2767 }
2768
2769 /* Record things set by INSN.
2770    This data is used by oprs_not_set_p.  */
2771
2772 static void
2773 mark_oprs_set (rtx insn)
2774 {
2775   rtx pat = PATTERN (insn);
2776   int i;
2777
2778   if (GET_CODE (pat) == SET)
2779     mark_set (pat, insn);
2780   else if (GET_CODE (pat) == PARALLEL)
2781     for (i = 0; i < XVECLEN (pat, 0); i++)
2782       {
2783         rtx x = XVECEXP (pat, 0, i);
2784
2785         if (GET_CODE (x) == SET)
2786           mark_set (x, insn);
2787         else if (GET_CODE (x) == CLOBBER)
2788           mark_clobber (x, insn);
2789         else if (GET_CODE (x) == CALL)
2790           mark_call (insn);
2791       }
2792
2793   else if (GET_CODE (pat) == CLOBBER)
2794     mark_clobber (pat, insn);
2795   else if (GET_CODE (pat) == CALL)
2796     mark_call (insn);
2797 }
2798
2799 \f
2800 /* Compute copy/constant propagation working variables.  */
2801
2802 /* Local properties of assignments.  */
2803 static sbitmap *cprop_pavloc;
2804 static sbitmap *cprop_absaltered;
2805
2806 /* Global properties of assignments (computed from the local properties).  */
2807 static sbitmap *cprop_avin;
2808 static sbitmap *cprop_avout;
2809
2810 /* Allocate vars used for copy/const propagation.  N_BLOCKS is the number of
2811    basic blocks.  N_SETS is the number of sets.  */
2812
2813 static void
2814 alloc_cprop_mem (int n_blocks, int n_sets)
2815 {
2816   cprop_pavloc = sbitmap_vector_alloc (n_blocks, n_sets);
2817   cprop_absaltered = sbitmap_vector_alloc (n_blocks, n_sets);
2818
2819   cprop_avin = sbitmap_vector_alloc (n_blocks, n_sets);
2820   cprop_avout = sbitmap_vector_alloc (n_blocks, n_sets);
2821 }
2822
2823 /* Free vars used by copy/const propagation.  */
2824
2825 static void
2826 free_cprop_mem (void)
2827 {
2828   sbitmap_vector_free (cprop_pavloc);
2829   sbitmap_vector_free (cprop_absaltered);
2830   sbitmap_vector_free (cprop_avin);
2831   sbitmap_vector_free (cprop_avout);
2832 }
2833
2834 /* For each block, compute whether X is transparent.  X is either an
2835    expression or an assignment [though we don't care which, for this context
2836    an assignment is treated as an expression].  For each block where an
2837    element of X is modified, set (SET_P == 1) or reset (SET_P == 0) the INDX
2838    bit in BMAP.  */
2839
2840 static void
2841 compute_transp (rtx x, int indx, sbitmap *bmap, int set_p)
2842 {
2843   int i, j;
2844   basic_block bb;
2845   enum rtx_code code;
2846   reg_set *r;
2847   const char *fmt;
2848
2849   /* repeat is used to turn tail-recursion into iteration since GCC
2850      can't do it when there's no return value.  */
2851  repeat:
2852
2853   if (x == 0)
2854     return;
2855
2856   code = GET_CODE (x);
2857   switch (code)
2858     {
2859     case REG:
2860       if (set_p)
2861         {
2862           if (REGNO (x) < FIRST_PSEUDO_REGISTER)
2863             {
2864               FOR_EACH_BB (bb)
2865                 if (TEST_BIT (reg_set_in_block[bb->index], REGNO (x)))
2866                   SET_BIT (bmap[bb->index], indx);
2867             }
2868           else
2869             {
2870               for (r = reg_set_table[REGNO (x)]; r != NULL; r = r->next)
2871                 SET_BIT (bmap[BLOCK_NUM (r->insn)], indx);
2872             }
2873         }
2874       else
2875         {
2876           if (REGNO (x) < FIRST_PSEUDO_REGISTER)
2877             {
2878               FOR_EACH_BB (bb)
2879                 if (TEST_BIT (reg_set_in_block[bb->index], REGNO (x)))
2880                   RESET_BIT (bmap[bb->index], indx);
2881             }
2882           else
2883             {
2884               for (r = reg_set_table[REGNO (x)]; r != NULL; r = r->next)
2885                 RESET_BIT (bmap[BLOCK_NUM (r->insn)], indx);
2886             }
2887         }
2888
2889       return;
2890
2891     case MEM:
2892       FOR_EACH_BB (bb)
2893         {
2894           rtx list_entry = canon_modify_mem_list[bb->index];
2895
2896           while (list_entry)
2897             {
2898               rtx dest, dest_addr;
2899
2900               if (GET_CODE (XEXP (list_entry, 0)) == CALL_INSN)
2901                 {
2902                   if (set_p)
2903                     SET_BIT (bmap[bb->index], indx);
2904                   else
2905                     RESET_BIT (bmap[bb->index], indx);
2906                   break;
2907                 }
2908               /* LIST_ENTRY must be an INSN of some kind that sets memory.
2909                  Examine each hunk of memory that is modified.  */
2910
2911               dest = XEXP (list_entry, 0);
2912               list_entry = XEXP (list_entry, 1);
2913               dest_addr = XEXP (list_entry, 0);
2914
2915               if (canon_true_dependence (dest, GET_MODE (dest), dest_addr,
2916                                          x, rtx_addr_varies_p))
2917                 {
2918                   if (set_p)
2919                     SET_BIT (bmap[bb->index], indx);
2920                   else
2921                     RESET_BIT (bmap[bb->index], indx);
2922                   break;
2923                 }
2924               list_entry = XEXP (list_entry, 1);
2925             }
2926         }
2927
2928       x = XEXP (x, 0);
2929       goto repeat;
2930
2931     case PC:
2932     case CC0: /*FIXME*/
2933     case CONST:
2934     case CONST_INT:
2935     case CONST_DOUBLE:
2936     case CONST_VECTOR:
2937     case SYMBOL_REF:
2938     case LABEL_REF:
2939     case ADDR_VEC:
2940     case ADDR_DIFF_VEC:
2941       return;
2942
2943     default:
2944       break;
2945     }
2946
2947   for (i = GET_RTX_LENGTH (code) - 1, fmt = GET_RTX_FORMAT (code); i >= 0; i--)
2948     {
2949       if (fmt[i] == 'e')
2950         {
2951           /* If we are about to do the last recursive call
2952              needed at this level, change it into iteration.
2953              This function is called enough to be worth it.  */
2954           if (i == 0)
2955             {
2956               x = XEXP (x, i);
2957               goto repeat;
2958             }
2959
2960           compute_transp (XEXP (x, i), indx, bmap, set_p);
2961         }
2962       else if (fmt[i] == 'E')
2963         for (j = 0; j < XVECLEN (x, i); j++)
2964           compute_transp (XVECEXP (x, i, j), indx, bmap, set_p);
2965     }
2966 }
2967
2968 /* Top level routine to do the dataflow analysis needed by copy/const
2969    propagation.  */
2970
2971 static void
2972 compute_cprop_data (void)
2973 {
2974   compute_local_properties (cprop_absaltered, cprop_pavloc, NULL, &set_hash_table);
2975   compute_available (cprop_pavloc, cprop_absaltered,
2976                      cprop_avout, cprop_avin);
2977 }
2978 \f
2979 /* Copy/constant propagation.  */
2980
2981 /* Maximum number of register uses in an insn that we handle.  */
2982 #define MAX_USES 8
2983
2984 /* Table of uses found in an insn.
2985    Allocated statically to avoid alloc/free complexity and overhead.  */
2986 static struct reg_use reg_use_table[MAX_USES];
2987
2988 /* Index into `reg_use_table' while building it.  */
2989 static int reg_use_count;
2990
2991 /* Set up a list of register numbers used in INSN.  The found uses are stored
2992    in `reg_use_table'.  `reg_use_count' is initialized to zero before entry,
2993    and contains the number of uses in the table upon exit.
2994
2995    ??? If a register appears multiple times we will record it multiple times.
2996    This doesn't hurt anything but it will slow things down.  */
2997
2998 static void
2999 find_used_regs (rtx *xptr, void *data ATTRIBUTE_UNUSED)
3000 {
3001   int i, j;
3002   enum rtx_code code;
3003   const char *fmt;
3004   rtx x = *xptr;
3005
3006   /* repeat is used to turn tail-recursion into iteration since GCC
3007      can't do it when there's no return value.  */
3008  repeat:
3009   if (x == 0)
3010     return;
3011
3012   code = GET_CODE (x);
3013   if (REG_P (x))
3014     {
3015       if (reg_use_count == MAX_USES)
3016         return;
3017
3018       reg_use_table[reg_use_count].reg_rtx = x;
3019       reg_use_count++;
3020     }
3021
3022   /* Recursively scan the operands of this expression.  */
3023
3024   for (i = GET_RTX_LENGTH (code) - 1, fmt = GET_RTX_FORMAT (code); i >= 0; i--)
3025     {
3026       if (fmt[i] == 'e')
3027         {
3028           /* If we are about to do the last recursive call
3029              needed at this level, change it into iteration.
3030              This function is called enough to be worth it.  */
3031           if (i == 0)
3032             {
3033               x = XEXP (x, 0);
3034               goto repeat;
3035             }
3036
3037           find_used_regs (&XEXP (x, i), data);
3038         }
3039       else if (fmt[i] == 'E')
3040         for (j = 0; j < XVECLEN (x, i); j++)
3041           find_used_regs (&XVECEXP (x, i, j), data);
3042     }
3043 }
3044
3045 /* Try to replace all non-SET_DEST occurrences of FROM in INSN with TO.
3046    Returns nonzero is successful.  */
3047
3048 static int
3049 try_replace_reg (rtx from, rtx to, rtx insn)
3050 {
3051   rtx note = find_reg_equal_equiv_note (insn);
3052   rtx src = 0;
3053   int success = 0;
3054   rtx set = single_set (insn);
3055
3056   validate_replace_src_group (from, to, insn);
3057   if (num_changes_pending () && apply_change_group ())
3058     success = 1;
3059
3060   /* Try to simplify SET_SRC if we have substituted a constant.  */
3061   if (success && set && CONSTANT_P (to))
3062     {
3063       src = simplify_rtx (SET_SRC (set));
3064
3065       if (src)
3066         validate_change (insn, &SET_SRC (set), src, 0);
3067     }
3068
3069   /* If there is already a NOTE, update the expression in it with our
3070      replacement.  */
3071   if (note != 0)
3072     XEXP (note, 0) = simplify_replace_rtx (XEXP (note, 0), from, to);
3073
3074   if (!success && set && reg_mentioned_p (from, SET_SRC (set)))
3075     {
3076       /* If above failed and this is a single set, try to simplify the source of
3077          the set given our substitution.  We could perhaps try this for multiple
3078          SETs, but it probably won't buy us anything.  */
3079       src = simplify_replace_rtx (SET_SRC (set), from, to);
3080
3081       if (!rtx_equal_p (src, SET_SRC (set))
3082           && validate_change (insn, &SET_SRC (set), src, 0))
3083         success = 1;
3084
3085       /* If we've failed to do replacement, have a single SET, don't already
3086          have a note, and have no special SET, add a REG_EQUAL note to not
3087          lose information.  */
3088       if (!success && note == 0 && set != 0
3089           && GET_CODE (XEXP (set, 0)) != ZERO_EXTRACT
3090           && GET_CODE (XEXP (set, 0)) != SIGN_EXTRACT)
3091         note = set_unique_reg_note (insn, REG_EQUAL, copy_rtx (src));
3092     }
3093
3094   /* REG_EQUAL may get simplified into register.
3095      We don't allow that. Remove that note. This code ought
3096      not to happen, because previous code ought to synthesize
3097      reg-reg move, but be on the safe side.  */
3098   if (note && REG_P (XEXP (note, 0)))
3099     remove_note (insn, note);
3100
3101   return success;
3102 }
3103
3104 /* Find a set of REGNOs that are available on entry to INSN's block.  Returns
3105    NULL no such set is found.  */
3106
3107 static struct expr *
3108 find_avail_set (int regno, rtx insn)
3109 {
3110   /* SET1 contains the last set found that can be returned to the caller for
3111      use in a substitution.  */
3112   struct expr *set1 = 0;
3113
3114   /* Loops are not possible here.  To get a loop we would need two sets
3115      available at the start of the block containing INSN.  ie we would
3116      need two sets like this available at the start of the block:
3117
3118        (set (reg X) (reg Y))
3119        (set (reg Y) (reg X))
3120
3121      This can not happen since the set of (reg Y) would have killed the
3122      set of (reg X) making it unavailable at the start of this block.  */
3123   while (1)
3124     {
3125       rtx src;
3126       struct expr *set = lookup_set (regno, &set_hash_table);
3127
3128       /* Find a set that is available at the start of the block
3129          which contains INSN.  */
3130       while (set)
3131         {
3132           if (TEST_BIT (cprop_avin[BLOCK_NUM (insn)], set->bitmap_index))
3133             break;
3134           set = next_set (regno, set);
3135         }
3136
3137       /* If no available set was found we've reached the end of the
3138          (possibly empty) copy chain.  */
3139       if (set == 0)
3140         break;
3141
3142       if (GET_CODE (set->expr) != SET)
3143         abort ();
3144
3145       src = SET_SRC (set->expr);
3146
3147       /* We know the set is available.
3148          Now check that SRC is ANTLOC (i.e. none of the source operands
3149          have changed since the start of the block).
3150
3151          If the source operand changed, we may still use it for the next
3152          iteration of this loop, but we may not use it for substitutions.  */
3153
3154       if (gcse_constant_p (src) || oprs_not_set_p (src, insn))
3155         set1 = set;
3156
3157       /* If the source of the set is anything except a register, then
3158          we have reached the end of the copy chain.  */
3159       if (GET_CODE (src) != REG)
3160         break;
3161
3162       /* Follow the copy chain, ie start another iteration of the loop
3163          and see if we have an available copy into SRC.  */
3164       regno = REGNO (src);
3165     }
3166
3167   /* SET1 holds the last set that was available and anticipatable at
3168      INSN.  */
3169   return set1;
3170 }
3171
3172 /* Subroutine of cprop_insn that tries to propagate constants into
3173    JUMP_INSNS.  JUMP must be a conditional jump.  If SETCC is non-NULL
3174    it is the instruction that immediately precedes JUMP, and must be a
3175    single SET of a register.  FROM is what we will try to replace,
3176    SRC is the constant we will try to substitute for it.  Returns nonzero
3177    if a change was made.  */
3178
3179 static int
3180 cprop_jump (basic_block bb, rtx setcc, rtx jump, rtx from, rtx src)
3181 {
3182   rtx new, set_src, note_src;
3183   rtx set = pc_set (jump);
3184   rtx note = find_reg_equal_equiv_note (jump);
3185
3186   if (note)
3187     {
3188       note_src = XEXP (note, 0);
3189       if (GET_CODE (note_src) == EXPR_LIST)
3190         note_src = NULL_RTX;
3191     }
3192   else note_src = NULL_RTX;
3193
3194   /* Prefer REG_EQUAL notes except those containing EXPR_LISTs.  */
3195   set_src = note_src ? note_src : SET_SRC (set);
3196
3197   /* First substitute the SETCC condition into the JUMP instruction,
3198      then substitute that given values into this expanded JUMP.  */
3199   if (setcc != NULL_RTX
3200       && !modified_between_p (from, setcc, jump)
3201       && !modified_between_p (src, setcc, jump))
3202     {
3203       rtx setcc_src;
3204       rtx setcc_set = single_set (setcc);
3205       rtx setcc_note = find_reg_equal_equiv_note (setcc);
3206       setcc_src = (setcc_note && GET_CODE (XEXP (setcc_note, 0)) != EXPR_LIST)
3207                 ? XEXP (setcc_note, 0) : SET_SRC (setcc_set);
3208       set_src = simplify_replace_rtx (set_src, SET_DEST (setcc_set),
3209                                       setcc_src);
3210     }
3211   else
3212     setcc = NULL_RTX;
3213
3214   new = simplify_replace_rtx (set_src, from, src);
3215
3216   /* If no simplification can be made, then try the next register.  */
3217   if (rtx_equal_p (new, SET_SRC (set)))
3218     return 0;
3219
3220   /* If this is now a no-op delete it, otherwise this must be a valid insn.  */
3221   if (new == pc_rtx)
3222     delete_insn (jump);
3223   else
3224     {
3225       /* Ensure the value computed inside the jump insn to be equivalent
3226          to one computed by setcc.  */
3227       if (setcc && modified_in_p (new, setcc))
3228         return 0;
3229       if (! validate_change (jump, &SET_SRC (set), new, 0))
3230         {
3231           /* When (some) constants are not valid in a comparison, and there
3232              are two registers to be replaced by constants before the entire
3233              comparison can be folded into a constant, we need to keep
3234              intermediate information in REG_EQUAL notes.  For targets with
3235              separate compare insns, such notes are added by try_replace_reg.
3236              When we have a combined compare-and-branch instruction, however,
3237              we need to attach a note to the branch itself to make this
3238              optimization work.  */
3239
3240           if (!rtx_equal_p (new, note_src))
3241             set_unique_reg_note (jump, REG_EQUAL, copy_rtx (new));
3242           return 0;
3243         }
3244
3245       /* Remove REG_EQUAL note after simplification.  */
3246       if (note_src)
3247         remove_note (jump, note);
3248
3249       /* If this has turned into an unconditional jump,
3250          then put a barrier after it so that the unreachable
3251          code will be deleted.  */
3252       if (GET_CODE (SET_SRC (set)) == LABEL_REF)
3253         emit_barrier_after (jump);
3254      }
3255
3256 #ifdef HAVE_cc0
3257   /* Delete the cc0 setter.  */
3258   if (setcc != NULL && CC0_P (SET_DEST (single_set (setcc))))
3259     delete_insn (setcc);
3260 #endif
3261
3262   run_jump_opt_after_gcse = 1;
3263
3264   const_prop_count++;
3265   if (gcse_file != NULL)
3266     {
3267       fprintf (gcse_file,
3268                "CONST-PROP: Replacing reg %d in jump_insn %d with constant ",
3269                REGNO (from), INSN_UID (jump));
3270       print_rtl (gcse_file, src);
3271       fprintf (gcse_file, "\n");
3272     }
3273   purge_dead_edges (bb);
3274
3275   return 1;
3276 }
3277
3278 static bool
3279 constprop_register (rtx insn, rtx from, rtx to, int alter_jumps)
3280 {
3281   rtx sset;
3282
3283   /* Check for reg or cc0 setting instructions followed by
3284      conditional branch instructions first.  */
3285   if (alter_jumps
3286       && (sset = single_set (insn)) != NULL
3287       && NEXT_INSN (insn)
3288       && any_condjump_p (NEXT_INSN (insn)) && onlyjump_p (NEXT_INSN (insn)))
3289     {
3290       rtx dest = SET_DEST (sset);
3291       if ((REG_P (dest) || CC0_P (dest))
3292           && cprop_jump (BLOCK_FOR_INSN (insn), insn, NEXT_INSN (insn), from, to))
3293         return 1;
3294     }
3295
3296   /* Handle normal insns next.  */
3297   if (GET_CODE (insn) == INSN
3298       && try_replace_reg (from, to, insn))
3299     return 1;
3300
3301   /* Try to propagate a CONST_INT into a conditional jump.
3302      We're pretty specific about what we will handle in this
3303      code, we can extend this as necessary over time.
3304
3305      Right now the insn in question must look like
3306      (set (pc) (if_then_else ...))  */
3307   else if (alter_jumps && any_condjump_p (insn) && onlyjump_p (insn))
3308     return cprop_jump (BLOCK_FOR_INSN (insn), NULL, insn, from, to);
3309   return 0;
3310 }
3311
3312 /* Perform constant and copy propagation on INSN.
3313    The result is nonzero if a change was made.  */
3314
3315 static int
3316 cprop_insn (rtx insn, int alter_jumps)
3317 {
3318   struct reg_use *reg_used;
3319   int changed = 0;
3320   rtx note;
3321
3322   if (!INSN_P (insn))
3323     return 0;
3324
3325   reg_use_count = 0;
3326   note_uses (&PATTERN (insn), find_used_regs, NULL);
3327
3328   note = find_reg_equal_equiv_note (insn);
3329
3330   /* We may win even when propagating constants into notes.  */
3331   if (note)
3332     find_used_regs (&XEXP (note, 0), NULL);
3333
3334   for (reg_used = &reg_use_table[0]; reg_use_count > 0;
3335        reg_used++, reg_use_count--)
3336     {
3337       unsigned int regno = REGNO (reg_used->reg_rtx);
3338       rtx pat, src;
3339       struct expr *set;
3340
3341       /* Ignore registers created by GCSE.
3342          We do this because ...  */
3343       if (regno >= max_gcse_regno)
3344         continue;
3345
3346       /* If the register has already been set in this block, there's
3347          nothing we can do.  */
3348       if (! oprs_not_set_p (reg_used->reg_rtx, insn))
3349         continue;
3350
3351       /* Find an assignment that sets reg_used and is available
3352          at the start of the block.  */
3353       set = find_avail_set (regno, insn);
3354       if (! set)
3355         continue;
3356
3357       pat = set->expr;
3358       /* ??? We might be able to handle PARALLELs.  Later.  */
3359       if (GET_CODE (pat) != SET)
3360         abort ();
3361
3362       src = SET_SRC (pat);
3363
3364       /* Constant propagation.  */
3365       if (gcse_constant_p (src))
3366         {
3367           if (constprop_register (insn, reg_used->reg_rtx, src, alter_jumps))
3368             {
3369               changed = 1;
3370               const_prop_count++;
3371               if (gcse_file != NULL)
3372                 {
3373                   fprintf (gcse_file, "GLOBAL CONST-PROP: Replacing reg %d in ", regno);
3374                   fprintf (gcse_file, "insn %d with constant ", INSN_UID (insn));
3375                   print_rtl (gcse_file, src);
3376                   fprintf (gcse_file, "\n");
3377                 }
3378               if (INSN_DELETED_P (insn))
3379                 return 1;
3380             }
3381         }
3382       else if (GET_CODE (src) == REG
3383                && REGNO (src) >= FIRST_PSEUDO_REGISTER
3384                && REGNO (src) != regno)
3385         {
3386           if (try_replace_reg (reg_used->reg_rtx, src, insn))
3387             {
3388               changed = 1;
3389               copy_prop_count++;
3390               if (gcse_file != NULL)
3391                 {
3392                   fprintf (gcse_file, "GLOBAL COPY-PROP: Replacing reg %d in insn %d",
3393                            regno, INSN_UID (insn));
3394                   fprintf (gcse_file, " with reg %d\n", REGNO (src));
3395                 }
3396
3397               /* The original insn setting reg_used may or may not now be
3398                  deletable.  We leave the deletion to flow.  */
3399               /* FIXME: If it turns out that the insn isn't deletable,
3400                  then we may have unnecessarily extended register lifetimes
3401                  and made things worse.  */
3402             }
3403         }
3404     }
3405
3406   return changed;
3407 }
3408
3409 /* Like find_used_regs, but avoid recording uses that appear in
3410    input-output contexts such as zero_extract or pre_dec.  This
3411    restricts the cases we consider to those for which local cprop
3412    can legitimately make replacements.  */
3413
3414 static void
3415 local_cprop_find_used_regs (rtx *xptr, void *data)
3416 {
3417   rtx x = *xptr;
3418
3419   if (x == 0)
3420     return;
3421
3422   switch (GET_CODE (x))
3423     {
3424     case ZERO_EXTRACT:
3425     case SIGN_EXTRACT:
3426     case STRICT_LOW_PART:
3427       return;
3428
3429     case PRE_DEC:
3430     case PRE_INC:
3431     case POST_DEC:
3432     case POST_INC:
3433     case PRE_MODIFY:
3434     case POST_MODIFY:
3435       /* Can only legitimately appear this early in the context of
3436          stack pushes for function arguments, but handle all of the
3437          codes nonetheless.  */
3438       return;
3439
3440     case SUBREG:
3441       /* Setting a subreg of a register larger than word_mode leaves
3442          the non-written words unchanged.  */
3443       if (GET_MODE_BITSIZE (GET_MODE (SUBREG_REG (x))) > BITS_PER_WORD)
3444         return;
3445       break;
3446
3447     default:
3448       break;
3449     }
3450
3451   find_used_regs (xptr, data);
3452 }
3453
3454 /* LIBCALL_SP is a zero-terminated array of insns at the end of a libcall;
3455    their REG_EQUAL notes need updating.  */
3456
3457 static bool
3458 do_local_cprop (rtx x, rtx insn, int alter_jumps, rtx *libcall_sp)
3459 {
3460   rtx newreg = NULL, newcnst = NULL;
3461
3462   /* Rule out USE instructions and ASM statements as we don't want to
3463      change the hard registers mentioned.  */
3464   if (GET_CODE (x) == REG
3465       && (REGNO (x) >= FIRST_PSEUDO_REGISTER
3466           || (GET_CODE (PATTERN (insn)) != USE
3467               && asm_noperands (PATTERN (insn)) < 0)))
3468     {
3469       cselib_val *val = cselib_lookup (x, GET_MODE (x), 0);
3470       struct elt_loc_list *l;
3471
3472       if (!val)
3473         return false;
3474       for (l = val->locs; l; l = l->next)
3475         {
3476           rtx this_rtx = l->loc;
3477           rtx note;
3478
3479           if (l->in_libcall)
3480             continue;
3481
3482           if (gcse_constant_p (this_rtx))
3483             newcnst = this_rtx;
3484           if (REG_P (this_rtx) && REGNO (this_rtx) >= FIRST_PSEUDO_REGISTER
3485               /* Don't copy propagate if it has attached REG_EQUIV note.
3486                  At this point this only function parameters should have
3487                  REG_EQUIV notes and if the argument slot is used somewhere
3488                  explicitly, it means address of parameter has been taken,
3489                  so we should not extend the lifetime of the pseudo.  */
3490               && (!(note = find_reg_note (l->setting_insn, REG_EQUIV, NULL_RTX))
3491                   || GET_CODE (XEXP (note, 0)) != MEM))
3492             newreg = this_rtx;
3493         }
3494       if (newcnst && constprop_register (insn, x, newcnst, alter_jumps))
3495         {
3496           /* If we find a case where we can't fix the retval REG_EQUAL notes
3497              match the new register, we either have to abandon this replacement
3498              or fix delete_trivially_dead_insns to preserve the setting insn,
3499              or make it delete the REG_EUAQL note, and fix up all passes that
3500              require the REG_EQUAL note there.  */
3501           if (!adjust_libcall_notes (x, newcnst, insn, libcall_sp))
3502             abort ();
3503           if (gcse_file != NULL)
3504             {
3505               fprintf (gcse_file, "LOCAL CONST-PROP: Replacing reg %d in ",
3506                        REGNO (x));
3507               fprintf (gcse_file, "insn %d with constant ",
3508                        INSN_UID (insn));
3509               print_rtl (gcse_file, newcnst);
3510               fprintf (gcse_file, "\n");
3511             }
3512           const_prop_count++;
3513           return true;
3514         }
3515       else if (newreg && newreg != x && try_replace_reg (x, newreg, insn))
3516         {
3517           adjust_libcall_notes (x, newreg, insn, libcall_sp);
3518           if (gcse_file != NULL)
3519             {
3520               fprintf (gcse_file,
3521                        "LOCAL COPY-PROP: Replacing reg %d in insn %d",
3522                        REGNO (x), INSN_UID (insn));
3523               fprintf (gcse_file, " with reg %d\n", REGNO (newreg));
3524             }
3525           copy_prop_count++;
3526           return true;
3527         }
3528     }
3529   return false;
3530 }
3531
3532 /* LIBCALL_SP is a zero-terminated array of insns at the end of a libcall;
3533    their REG_EQUAL notes need updating to reflect that OLDREG has been
3534    replaced with NEWVAL in INSN.  Return true if all substitutions could
3535    be made.  */
3536 static bool
3537 adjust_libcall_notes (rtx oldreg, rtx newval, rtx insn, rtx *libcall_sp)
3538 {
3539   rtx end;
3540
3541   while ((end = *libcall_sp++))
3542     {
3543       rtx note = find_reg_equal_equiv_note (end);
3544
3545       if (! note)
3546         continue;
3547
3548       if (REG_P (newval))
3549         {
3550           if (reg_set_between_p (newval, PREV_INSN (insn), end))
3551             {
3552               do
3553                 {
3554                   note = find_reg_equal_equiv_note (end);
3555                   if (! note)
3556                     continue;
3557                   if (reg_mentioned_p (newval, XEXP (note, 0)))
3558                     return false;
3559                 }
3560               while ((end = *libcall_sp++));
3561               return true;
3562             }
3563         }
3564       XEXP (note, 0) = replace_rtx (XEXP (note, 0), oldreg, newval);
3565       insn = end;
3566     }
3567   return true;
3568 }
3569
3570 #define MAX_NESTED_LIBCALLS 9
3571
3572 static void
3573 local_cprop_pass (int alter_jumps)
3574 {
3575   rtx insn;
3576   struct reg_use *reg_used;
3577   rtx libcall_stack[MAX_NESTED_LIBCALLS + 1], *libcall_sp;
3578   bool changed = false;
3579
3580   cselib_init (false);
3581   libcall_sp = &libcall_stack[MAX_NESTED_LIBCALLS];
3582   *libcall_sp = 0;
3583   for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
3584     {
3585       if (INSN_P (insn))
3586         {
3587           rtx note = find_reg_note (insn, REG_LIBCALL, NULL_RTX);
3588
3589           if (note)
3590             {
3591               if (libcall_sp == libcall_stack)
3592                 abort ();
3593               *--libcall_sp = XEXP (note, 0);
3594             }
3595           note = find_reg_note (insn, REG_RETVAL, NULL_RTX);
3596           if (note)
3597             libcall_sp++;
3598           note = find_reg_equal_equiv_note (insn);
3599           do
3600             {
3601               reg_use_count = 0;
3602               note_uses (&PATTERN (insn), local_cprop_find_used_regs, NULL);
3603               if (note)
3604                 local_cprop_find_used_regs (&XEXP (note, 0), NULL);
3605
3606               for (reg_used = &reg_use_table[0]; reg_use_count > 0;
3607                    reg_used++, reg_use_count--)
3608                 if (do_local_cprop (reg_used->reg_rtx, insn, alter_jumps,
3609                     libcall_sp))
3610                   {
3611                     changed = true;
3612                     break;
3613                   }
3614               if (INSN_DELETED_P (insn))
3615                 break;
3616             }
3617           while (reg_use_count);
3618         }
3619       cselib_process_insn (insn);
3620     }
3621   cselib_finish ();
3622   /* Global analysis may get into infinite loops for unreachable blocks.  */
3623   if (changed && alter_jumps)
3624     {
3625       delete_unreachable_blocks ();
3626       free_reg_set_mem ();
3627       alloc_reg_set_mem (max_reg_num ());
3628       compute_sets (get_insns ());
3629     }
3630 }
3631
3632 /* Forward propagate copies.  This includes copies and constants.  Return
3633    nonzero if a change was made.  */
3634
3635 static int
3636 cprop (int alter_jumps)
3637 {
3638   int changed;
3639   basic_block bb;
3640   rtx insn;
3641
3642   /* Note we start at block 1.  */
3643   if (ENTRY_BLOCK_PTR->next_bb == EXIT_BLOCK_PTR)
3644     {
3645       if (gcse_file != NULL)
3646         fprintf (gcse_file, "\n");
3647       return 0;
3648     }
3649
3650   changed = 0;
3651   FOR_BB_BETWEEN (bb, ENTRY_BLOCK_PTR->next_bb->next_bb, EXIT_BLOCK_PTR, next_bb)
3652     {
3653       /* Reset tables used to keep track of what's still valid [since the
3654          start of the block].  */
3655       reset_opr_set_tables ();
3656
3657       for (insn = BB_HEAD (bb);
3658            insn != NULL && insn != NEXT_INSN (BB_END (bb));
3659            insn = NEXT_INSN (insn))
3660         if (INSN_P (insn))
3661           {
3662             changed |= cprop_insn (insn, alter_jumps);
3663
3664             /* Keep track of everything modified by this insn.  */
3665             /* ??? Need to be careful w.r.t. mods done to INSN.  Don't
3666                call mark_oprs_set if we turned the insn into a NOTE.  */
3667             if (GET_CODE (insn) != NOTE)
3668               mark_oprs_set (insn);
3669           }
3670     }
3671
3672   if (gcse_file != NULL)
3673     fprintf (gcse_file, "\n");
3674
3675   return changed;
3676 }
3677
3678 /* Similar to get_condition, only the resulting condition must be
3679    valid at JUMP, instead of at EARLIEST.
3680
3681    This differs from noce_get_condition in ifcvt.c in that we prefer not to
3682    settle for the condition variable in the jump instruction being integral.
3683    We prefer to be able to record the value of a user variable, rather than
3684    the value of a temporary used in a condition.  This could be solved by
3685    recording the value of *every* register scaned by canonicalize_condition,
3686    but this would require some code reorganization.  */
3687
3688 rtx
3689 fis_get_condition (rtx jump)
3690 {
3691   rtx cond, set, tmp, insn, earliest;
3692   bool reverse;
3693
3694   if (! any_condjump_p (jump))
3695     return NULL_RTX;
3696
3697   set = pc_set (jump);
3698   cond = XEXP (SET_SRC (set), 0);
3699
3700   /* If this branches to JUMP_LABEL when the condition is false,
3701      reverse the condition.  */
3702   reverse = (GET_CODE (XEXP (SET_SRC (set), 2)) == LABEL_REF
3703              && XEXP (XEXP (SET_SRC (set), 2), 0) == JUMP_LABEL (jump));
3704
3705   /* Use canonicalize_condition to do the dirty work of manipulating
3706      MODE_CC values and COMPARE rtx codes.  */
3707   tmp = canonicalize_condition (jump, cond, reverse, &earliest, NULL_RTX,
3708                                 false);
3709   if (!tmp)
3710     return NULL_RTX;
3711
3712   /* Verify that the given condition is valid at JUMP by virtue of not
3713      having been modified since EARLIEST.  */
3714   for (insn = earliest; insn != jump; insn = NEXT_INSN (insn))
3715     if (INSN_P (insn) && modified_in_p (tmp, insn))
3716       break;
3717   if (insn == jump)
3718     return tmp;
3719
3720   /* The condition was modified.  See if we can get a partial result
3721      that doesn't follow all the reversals.  Perhaps combine can fold
3722      them together later.  */
3723   tmp = XEXP (tmp, 0);
3724   if (!REG_P (tmp) || GET_MODE_CLASS (GET_MODE (tmp)) != MODE_INT)
3725     return NULL_RTX;
3726   tmp = canonicalize_condition (jump, cond, reverse, &earliest, tmp,
3727                                 false);
3728   if (!tmp)
3729     return NULL_RTX;
3730
3731   /* For sanity's sake, re-validate the new result.  */
3732   for (insn = earliest; insn != jump; insn = NEXT_INSN (insn))
3733     if (INSN_P (insn) && modified_in_p (tmp, insn))
3734       return NULL_RTX;
3735
3736   return tmp;
3737 }
3738
3739 /* Check the comparison COND to see if we can safely form an implicit set from
3740    it.  COND is either an EQ or NE comparison.  */
3741
3742 static bool
3743 implicit_set_cond_p (rtx cond)
3744 {
3745   enum machine_mode mode = GET_MODE (XEXP (cond, 0));
3746   rtx cst = XEXP (cond, 1);
3747
3748   /* We can't perform this optimization if either operand might be or might
3749      contain a signed zero.  */
3750   if (HONOR_SIGNED_ZEROS (mode))
3751     {
3752       /* It is sufficient to check if CST is or contains a zero.  We must
3753          handle float, complex, and vector.  If any subpart is a zero, then
3754          the optimization can't be performed.  */
3755       /* ??? The complex and vector checks are not implemented yet.  We just
3756          always return zero for them.  */
3757       if (GET_CODE (cst) == CONST_DOUBLE)
3758         {
3759           REAL_VALUE_TYPE d;
3760           REAL_VALUE_FROM_CONST_DOUBLE (d, cst);
3761           if (REAL_VALUES_EQUAL (d, dconst0))
3762             return 0;
3763         }
3764       else
3765         return 0;
3766     }
3767
3768   return gcse_constant_p (cst);
3769 }
3770
3771 /* Find the implicit sets of a function.  An "implicit set" is a constraint
3772    on the value of a variable, implied by a conditional jump.  For example,
3773    following "if (x == 2)", the then branch may be optimized as though the
3774    conditional performed an "explicit set", in this example, "x = 2".  This
3775    function records the set patterns that are implicit at the start of each
3776    basic block.  */
3777
3778 static void
3779 find_implicit_sets (void)
3780 {
3781   basic_block bb, dest;
3782   unsigned int count;
3783   rtx cond, new;
3784
3785   count = 0;
3786   FOR_EACH_BB (bb)
3787     /* Check for more than one successor.  */
3788     if (bb->succ && bb->succ->succ_next)
3789       {
3790         cond = fis_get_condition (BB_END (bb));
3791
3792         if (cond
3793             && (GET_CODE (cond) == EQ || GET_CODE (cond) == NE)
3794             && GET_CODE (XEXP (cond, 0)) == REG
3795             && REGNO (XEXP (cond, 0)) >= FIRST_PSEUDO_REGISTER
3796             && implicit_set_cond_p (cond))
3797           {
3798             dest = GET_CODE (cond) == EQ ? BRANCH_EDGE (bb)->dest
3799                                          : FALLTHRU_EDGE (bb)->dest;
3800
3801             if (dest && ! dest->pred->pred_next
3802                 && dest != EXIT_BLOCK_PTR)
3803               {
3804                 new = gen_rtx_SET (VOIDmode, XEXP (cond, 0),
3805                                              XEXP (cond, 1));
3806                 implicit_sets[dest->index] = new;
3807                 if (gcse_file)
3808                   {
3809                     fprintf(gcse_file, "Implicit set of reg %d in ",
3810                             REGNO (XEXP (cond, 0)));
3811                     fprintf(gcse_file, "basic block %d\n", dest->index);
3812                   }
3813                 count++;
3814               }
3815           }
3816       }
3817
3818   if (gcse_file)
3819     fprintf (gcse_file, "Found %d implicit sets\n", count);
3820 }
3821
3822 /* Perform one copy/constant propagation pass.
3823    PASS is the pass count.  If CPROP_JUMPS is true, perform constant
3824    propagation into conditional jumps.  If BYPASS_JUMPS is true,
3825    perform conditional jump bypassing optimizations.  */
3826
3827 static int
3828 one_cprop_pass (int pass, int cprop_jumps, int bypass_jumps)
3829 {
3830   int changed = 0;
3831
3832   const_prop_count = 0;
3833   copy_prop_count = 0;
3834
3835   local_cprop_pass (cprop_jumps);
3836
3837   /* Determine implicit sets.  */
3838   implicit_sets = xcalloc (last_basic_block, sizeof (rtx));
3839   find_implicit_sets ();
3840
3841   alloc_hash_table (max_cuid, &set_hash_table, 1);
3842   compute_hash_table (&set_hash_table);
3843
3844   /* Free implicit_sets before peak usage.  */
3845   free (implicit_sets);
3846   implicit_sets = NULL;
3847
3848   if (gcse_file)
3849     dump_hash_table (gcse_file, "SET", &set_hash_table);
3850   if (set_hash_table.n_elems > 0)
3851     {
3852       alloc_cprop_mem (last_basic_block, set_hash_table.n_elems);
3853       compute_cprop_data ();
3854       changed = cprop (cprop_jumps);
3855       if (bypass_jumps)
3856         changed |= bypass_conditional_jumps ();
3857       free_cprop_mem ();
3858     }
3859
3860   free_hash_table (&set_hash_table);
3861
3862   if (gcse_file)
3863     {
3864       fprintf (gcse_file, "CPROP of %s, pass %d: %d bytes needed, ",
3865                current_function_name (), pass, bytes_used);
3866       fprintf (gcse_file, "%d const props, %d copy props\n\n",
3867                const_prop_count, copy_prop_count);
3868     }
3869   /* Global analysis may get into infinite loops for unreachable blocks.  */
3870   if (changed && cprop_jumps)
3871     delete_unreachable_blocks ();
3872
3873   return changed;
3874 }
3875 \f
3876 /* Bypass conditional jumps.  */
3877
3878 /* The value of last_basic_block at the beginning of the jump_bypass
3879    pass.  The use of redirect_edge_and_branch_force may introduce new
3880    basic blocks, but the data flow analysis is only valid for basic
3881    block indices less than bypass_last_basic_block.  */
3882
3883 static int bypass_last_basic_block;
3884
3885 /* Find a set of REGNO to a constant that is available at the end of basic
3886    block BB.  Returns NULL if no such set is found.  Based heavily upon
3887    find_avail_set.  */
3888
3889 static struct expr *
3890 find_bypass_set (int regno, int bb)
3891 {
3892   struct expr *result = 0;
3893
3894   for (;;)
3895     {
3896       rtx src;
3897       struct expr *set = lookup_set (regno, &set_hash_table);
3898
3899       while (set)
3900         {
3901           if (TEST_BIT (cprop_avout[bb], set->bitmap_index))
3902             break;
3903           set = next_set (regno, set);
3904         }
3905
3906       if (set == 0)
3907         break;
3908
3909       if (GET_CODE (set->expr) != SET)
3910         abort ();
3911
3912       src = SET_SRC (set->expr);
3913       if (gcse_constant_p (src))
3914         result = set;
3915
3916       if (GET_CODE (src) != REG)
3917         break;
3918
3919       regno = REGNO (src);
3920     }
3921   return result;
3922 }
3923
3924
3925 /* Subroutine of bypass_block that checks whether a pseudo is killed by
3926    any of the instructions inserted on an edge.  Jump bypassing places
3927    condition code setters on CFG edges using insert_insn_on_edge.  This
3928    function is required to check that our data flow analysis is still
3929    valid prior to commit_edge_insertions.  */
3930
3931 static bool
3932 reg_killed_on_edge (rtx reg, edge e)
3933 {
3934   rtx insn;
3935
3936   for (insn = e->insns.r; insn; insn = NEXT_INSN (insn))
3937     if (INSN_P (insn) && reg_set_p (reg, insn))
3938       return true;
3939
3940   return false;
3941 }
3942
3943 /* Subroutine of bypass_conditional_jumps that attempts to bypass the given
3944    basic block BB which has more than one predecessor.  If not NULL, SETCC
3945    is the first instruction of BB, which is immediately followed by JUMP_INSN
3946    JUMP.  Otherwise, SETCC is NULL, and JUMP is the first insn of BB.
3947    Returns nonzero if a change was made.
3948
3949    During the jump bypassing pass, we may place copies of SETCC instructions
3950    on CFG edges.  The following routine must be careful to pay attention to
3951    these inserted insns when performing its transformations.  */
3952
3953 static int
3954 bypass_block (basic_block bb, rtx setcc, rtx jump)
3955 {
3956   rtx insn, note;
3957   edge e, enext, edest;
3958   int i, change;
3959   int may_be_loop_header;
3960
3961   insn = (setcc != NULL) ? setcc : jump;
3962
3963   /* Determine set of register uses in INSN.  */
3964   reg_use_count = 0;
3965   note_uses (&PATTERN (insn), find_used_regs, NULL);
3966   note = find_reg_equal_equiv_note (insn);
3967   if (note)
3968     find_used_regs (&XEXP (note, 0), NULL);
3969
3970   may_be_loop_header = false;
3971   for (e = bb->pred; e; e = e->pred_next)
3972     if (e->flags & EDGE_DFS_BACK)
3973       {
3974         may_be_loop_header = true;
3975         break;
3976       }
3977
3978   change = 0;
3979   for (e = bb->pred; e; e = enext)
3980     {
3981       enext = e->pred_next;
3982       if (e->flags & EDGE_COMPLEX)
3983         continue;
3984
3985       /* We can't redirect edges from new basic blocks.  */
3986       if (e->src->index >= bypass_last_basic_block)
3987         continue;
3988
3989       /* The irreducible loops created by redirecting of edges entering the
3990          loop from outside would decrease effectiveness of some of the following
3991          optimizations, so prevent this.  */
3992       if (may_be_loop_header
3993           && !(e->flags & EDGE_DFS_BACK))
3994         continue;
3995
3996       for (i = 0; i < reg_use_count; i++)
3997         {
3998           struct reg_use *reg_used = &reg_use_table[i];
3999           unsigned int regno = REGNO (reg_used->reg_rtx);
4000           basic_block dest, old_dest;
4001           struct expr *set;
4002           rtx src, new;
4003
4004           if (regno >= max_gcse_regno)
4005             continue;
4006
4007           set = find_bypass_set (regno, e->src->index);
4008
4009           if (! set)
4010             continue;
4011
4012           /* Check the data flow is valid after edge insertions.  */
4013           if (e->insns.r && reg_killed_on_edge (reg_used->reg_rtx, e))
4014             continue;
4015
4016           src = SET_SRC (pc_set (jump));
4017
4018           if (setcc != NULL)
4019               src = simplify_replace_rtx (src,
4020                                           SET_DEST (PATTERN (setcc)),
4021                                           SET_SRC (PATTERN (setcc)));
4022
4023           new = simplify_replace_rtx (src, reg_used->reg_rtx,
4024                                       SET_SRC (set->expr));
4025
4026           /* Jump bypassing may have already placed instructions on
4027              edges of the CFG.  We can't bypass an outgoing edge that
4028              has instructions associated with it, as these insns won't
4029              get executed if the incoming edge is redirected.  */
4030
4031           if (new == pc_rtx)
4032             {
4033               edest = FALLTHRU_EDGE (bb);
4034               dest = edest->insns.r ? NULL : edest->dest;
4035             }
4036           else if (GET_CODE (new) == LABEL_REF)
4037             {
4038               dest = BLOCK_FOR_INSN (XEXP (new, 0));
4039               /* Don't bypass edges containing instructions.  */
4040               for (edest = bb->succ; edest; edest = edest->succ_next)
4041                 if (edest->dest == dest && edest->insns.r)
4042                   {
4043                     dest = NULL;
4044                     break;
4045                   }
4046             }
4047           else
4048             dest = NULL;
4049
4050           /* Avoid unification of the edge with other edges from original
4051              branch.  We would end up emitting the instruction on "both"
4052              edges.  */
4053             
4054           if (dest && setcc && !CC0_P (SET_DEST (PATTERN (setcc))))
4055             {
4056               edge e2;
4057               for (e2 = e->src->succ; e2; e2 = e2->succ_next)
4058                 if (e2->dest == dest)
4059                   {
4060                     dest = NULL;
4061                     break;
4062                   }
4063             }
4064
4065           old_dest = e->dest;
4066           if (dest != NULL
4067               && dest != old_dest
4068               && dest != EXIT_BLOCK_PTR)
4069             {
4070               redirect_edge_and_branch_force (e, dest);
4071
4072               /* Copy the register setter to the redirected edge.
4073                  Don't copy CC0 setters, as CC0 is dead after jump.  */
4074               if (setcc)
4075                 {
4076                   rtx pat = PATTERN (setcc);
4077                   if (!CC0_P (SET_DEST (pat)))
4078                     insert_insn_on_edge (copy_insn (pat), e);
4079                 }
4080
4081               if (gcse_file != NULL)
4082                 {
4083                   fprintf (gcse_file, "JUMP-BYPASS: Proved reg %d in jump_insn %d equals constant ",
4084                            regno, INSN_UID (jump));
4085                   print_rtl (gcse_file, SET_SRC (set->expr));
4086                   fprintf (gcse_file, "\nBypass edge from %d->%d to %d\n",
4087                            e->src->index, old_dest->index, dest->index);
4088                 }
4089               change = 1;
4090               break;
4091             }
4092         }
4093     }
4094   return change;
4095 }
4096
4097 /* Find basic blocks with more than one predecessor that only contain a
4098    single conditional jump.  If the result of the comparison is known at
4099    compile-time from any incoming edge, redirect that edge to the
4100    appropriate target.  Returns nonzero if a change was made.
4101
4102    This function is now mis-named, because we also handle indirect jumps.  */
4103
4104 static int
4105 bypass_conditional_jumps (void)
4106 {
4107   basic_block bb;
4108   int changed;
4109   rtx setcc;
4110   rtx insn;
4111   rtx dest;
4112
4113   /* Note we start at block 1.  */
4114   if (ENTRY_BLOCK_PTR->next_bb == EXIT_BLOCK_PTR)
4115     return 0;
4116
4117   bypass_last_basic_block = last_basic_block;
4118   mark_dfs_back_edges ();
4119
4120   changed = 0;
4121   FOR_BB_BETWEEN (bb, ENTRY_BLOCK_PTR->next_bb->next_bb,
4122                   EXIT_BLOCK_PTR, next_bb)
4123     {
4124       /* Check for more than one predecessor.  */
4125       if (bb->pred && bb->pred->pred_next)
4126         {
4127           setcc = NULL_RTX;
4128           for (insn = BB_HEAD (bb);
4129                insn != NULL && insn != NEXT_INSN (BB_END (bb));
4130                insn = NEXT_INSN (insn))
4131             if (GET_CODE (insn) == INSN)
4132               {
4133                 if (setcc)
4134                   break;
4135                 if (GET_CODE (PATTERN (insn)) != SET)
4136                   break;
4137
4138                 dest = SET_DEST (PATTERN (insn));
4139                 if (REG_P (dest) || CC0_P (dest))
4140                   setcc = insn;
4141                 else
4142                   break;
4143               }
4144             else if (GET_CODE (insn) == JUMP_INSN)
4145               {
4146                 if ((any_condjump_p (insn) || computed_jump_p (insn))
4147                     && onlyjump_p (insn))
4148                   changed |= bypass_block (bb, setcc, insn);
4149                 break;
4150               }
4151             else if (INSN_P (insn))
4152               break;
4153         }
4154     }
4155
4156   /* If we bypassed any register setting insns, we inserted a
4157      copy on the redirected edge.  These need to be committed.  */
4158   if (changed)
4159     commit_edge_insertions();
4160
4161   return changed;
4162 }
4163 \f
4164 /* Compute PRE+LCM working variables.  */
4165
4166 /* Local properties of expressions.  */
4167 /* Nonzero for expressions that are transparent in the block.  */
4168 static sbitmap *transp;
4169
4170 /* Nonzero for expressions that are transparent at the end of the block.
4171    This is only zero for expressions killed by abnormal critical edge
4172    created by a calls.  */
4173 static sbitmap *transpout;
4174
4175 /* Nonzero for expressions that are computed (available) in the block.  */
4176 static sbitmap *comp;
4177
4178 /* Nonzero for expressions that are locally anticipatable in the block.  */
4179 static sbitmap *antloc;
4180
4181 /* Nonzero for expressions where this block is an optimal computation
4182    point.  */
4183 static sbitmap *pre_optimal;
4184
4185 /* Nonzero for expressions which are redundant in a particular block.  */
4186 static sbitmap *pre_redundant;
4187
4188 /* Nonzero for expressions which should be inserted on a specific edge.  */
4189 static sbitmap *pre_insert_map;
4190
4191 /* Nonzero for expressions which should be deleted in a specific block.  */
4192 static sbitmap *pre_delete_map;
4193
4194 /* Contains the edge_list returned by pre_edge_lcm.  */
4195 static struct edge_list *edge_list;
4196
4197 /* Redundant insns.  */
4198 static sbitmap pre_redundant_insns;
4199
4200 /* Allocate vars used for PRE analysis.  */
4201
4202 static void
4203 alloc_pre_mem (int n_blocks, int n_exprs)
4204 {
4205   transp = sbitmap_vector_alloc (n_blocks, n_exprs);
4206   comp = sbitmap_vector_alloc (n_blocks, n_exprs);
4207   antloc = sbitmap_vector_alloc (n_blocks, n_exprs);
4208
4209   pre_optimal = NULL;
4210   pre_redundant = NULL;
4211   pre_insert_map = NULL;
4212   pre_delete_map = NULL;
4213   ae_kill = sbitmap_vector_alloc (n_blocks, n_exprs);
4214
4215   /* pre_insert and pre_delete are allocated later.  */
4216 }
4217
4218 /* Free vars used for PRE analysis.  */
4219
4220 static void
4221 free_pre_mem (void)
4222 {
4223   sbitmap_vector_free (transp);
4224   sbitmap_vector_free (comp);
4225
4226   /* ANTLOC and AE_KILL are freed just after pre_lcm finishes.  */
4227
4228   if (pre_optimal)
4229     sbitmap_vector_free (pre_optimal);
4230   if (pre_redundant)
4231     sbitmap_vector_free (pre_redundant);
4232   if (pre_insert_map)
4233     sbitmap_vector_free (pre_insert_map);
4234   if (pre_delete_map)
4235     sbitmap_vector_free (pre_delete_map);
4236
4237   transp = comp = NULL;
4238   pre_optimal = pre_redundant = pre_insert_map = pre_delete_map = NULL;
4239 }
4240
4241 /* Top level routine to do the dataflow analysis needed by PRE.  */
4242
4243 static void
4244 compute_pre_data (void)
4245 {
4246   sbitmap trapping_expr;
4247   basic_block bb;
4248   unsigned int ui;
4249
4250   compute_local_properties (transp, comp, antloc, &expr_hash_table);
4251   sbitmap_vector_zero (ae_kill, last_basic_block);
4252
4253   /* Collect expressions which might trap.  */
4254   trapping_expr = sbitmap_alloc (expr_hash_table.n_elems);
4255   sbitmap_zero (trapping_expr);
4256   for (ui = 0; ui < expr_hash_table.size; ui++)
4257     {
4258       struct expr *e;
4259       for (e = expr_hash_table.table[ui]; e != NULL; e = e->next_same_hash)
4260         if (may_trap_p (e->expr))
4261           SET_BIT (trapping_expr, e->bitmap_index);
4262     }
4263
4264   /* Compute ae_kill for each basic block using:
4265
4266      ~(TRANSP | COMP)
4267   */
4268
4269   FOR_EACH_BB (bb)
4270     {
4271       edge e;
4272
4273       /* If the current block is the destination of an abnormal edge, we
4274          kill all trapping expressions because we won't be able to properly
4275          place the instruction on the edge.  So make them neither
4276          anticipatable nor transparent.  This is fairly conservative.  */
4277       for (e = bb->pred; e ; e = e->pred_next)
4278         if (e->flags & EDGE_ABNORMAL)
4279           {
4280             sbitmap_difference (antloc[bb->index], antloc[bb->index], trapping_expr);
4281             sbitmap_difference (transp[bb->index], transp[bb->index], trapping_expr);
4282             break;
4283           }
4284
4285       sbitmap_a_or_b (ae_kill[bb->index], transp[bb->index], comp[bb->index]);
4286       sbitmap_not (ae_kill[bb->index], ae_kill[bb->index]);
4287     }
4288
4289   edge_list = pre_edge_lcm (gcse_file, expr_hash_table.n_elems, transp, comp, antloc,
4290                             ae_kill, &pre_insert_map, &pre_delete_map);
4291   sbitmap_vector_free (antloc);
4292   antloc = NULL;
4293   sbitmap_vector_free (ae_kill);
4294   ae_kill = NULL;
4295   sbitmap_free (trapping_expr);
4296 }
4297 \f
4298 /* PRE utilities */
4299
4300 /* Return nonzero if an occurrence of expression EXPR in OCCR_BB would reach
4301    block BB.
4302
4303    VISITED is a pointer to a working buffer for tracking which BB's have
4304    been visited.  It is NULL for the top-level call.
4305
4306    We treat reaching expressions that go through blocks containing the same
4307    reaching expression as "not reaching".  E.g. if EXPR is generated in blocks
4308    2 and 3, INSN is in block 4, and 2->3->4, we treat the expression in block
4309    2 as not reaching.  The intent is to improve the probability of finding
4310    only one reaching expression and to reduce register lifetimes by picking
4311    the closest such expression.  */
4312
4313 static int
4314 pre_expr_reaches_here_p_work (basic_block occr_bb, struct expr *expr, basic_block bb, char *visited)
4315 {
4316   edge pred;
4317
4318   for (pred = bb->pred; pred != NULL; pred = pred->pred_next)
4319     {
4320       basic_block pred_bb = pred->src;
4321
4322       if (pred->src == ENTRY_BLOCK_PTR
4323           /* Has predecessor has already been visited?  */
4324           || visited[pred_bb->index])
4325         ;/* Nothing to do.  */
4326
4327       /* Does this predecessor generate this expression?  */
4328       else if (TEST_BIT (comp[pred_bb->index], expr->bitmap_index))
4329         {
4330           /* Is this the occurrence we're looking for?
4331              Note that there's only one generating occurrence per block
4332              so we just need to check the block number.  */
4333           if (occr_bb == pred_bb)
4334             return 1;
4335
4336           visited[pred_bb->index] = 1;
4337         }
4338       /* Ignore this predecessor if it kills the expression.  */
4339       else if (! TEST_BIT (transp[pred_bb->index], expr->bitmap_index))
4340         visited[pred_bb->index] = 1;
4341
4342       /* Neither gen nor kill.  */
4343       else
4344         {
4345           visited[pred_bb->index] = 1;
4346           if (pre_expr_reaches_here_p_work (occr_bb, expr, pred_bb, visited))
4347             return 1;
4348         }
4349     }
4350
4351   /* All paths have been checked.  */
4352   return 0;
4353 }
4354
4355 /* The wrapper for pre_expr_reaches_here_work that ensures that any
4356    memory allocated for that function is returned.  */
4357
4358 static int
4359 pre_expr_reaches_here_p (basic_block occr_bb, struct expr *expr, basic_block bb)
4360 {
4361   int rval;
4362   char *visited = xcalloc (last_basic_block, 1);
4363
4364   rval = pre_expr_reaches_here_p_work (occr_bb, expr, bb, visited);
4365
4366   free (visited);
4367   return rval;
4368 }
4369 \f
4370
4371 /* Given an expr, generate RTL which we can insert at the end of a BB,
4372    or on an edge.  Set the block number of any insns generated to
4373    the value of BB.  */
4374
4375 static rtx
4376 process_insert_insn (struct expr *expr)
4377 {
4378   rtx reg = expr->reaching_reg;
4379   rtx exp = copy_rtx (expr->expr);
4380   rtx pat;
4381
4382   start_sequence ();
4383
4384   /* If the expression is something that's an operand, like a constant,
4385      just copy it to a register.  */
4386   if (general_operand (exp, GET_MODE (reg)))
4387     emit_move_insn (reg, exp);
4388
4389   /* Otherwise, make a new insn to compute this expression and make sure the
4390      insn will be recognized (this also adds any needed CLOBBERs).  Copy the
4391      expression to make sure we don't have any sharing issues.  */
4392   else if (insn_invalid_p (emit_insn (gen_rtx_SET (VOIDmode, reg, exp))))
4393     abort ();
4394
4395   pat = get_insns ();
4396   end_sequence ();
4397
4398   return pat;
4399 }
4400
4401 /* Add EXPR to the end of basic block BB.
4402
4403    This is used by both the PRE and code hoisting.
4404
4405    For PRE, we want to verify that the expr is either transparent
4406    or locally anticipatable in the target block.  This check makes
4407    no sense for code hoisting.  */
4408
4409 static void
4410 insert_insn_end_bb (struct expr *expr, basic_block bb, int pre)
4411 {
4412   rtx insn = BB_END (bb);
4413   rtx new_insn;
4414   rtx reg = expr->reaching_reg;
4415   int regno = REGNO (reg);
4416   rtx pat, pat_end;
4417
4418   pat = process_insert_insn (expr);
4419   if (pat == NULL_RTX || ! INSN_P (pat))
4420     abort ();
4421
4422   pat_end = pat;
4423   while (NEXT_INSN (pat_end) != NULL_RTX)
4424     pat_end = NEXT_INSN (pat_end);
4425
4426   /* If the last insn is a jump, insert EXPR in front [taking care to
4427      handle cc0, etc. properly].  Similarly we need to care trapping
4428      instructions in presence of non-call exceptions.  */
4429
4430   if (GET_CODE (insn) == JUMP_INSN
4431       || (GET_CODE (insn) == INSN
4432           && (bb->succ->succ_next || (bb->succ->flags & EDGE_ABNORMAL))))
4433     {
4434 #ifdef HAVE_cc0
4435       rtx note;
4436 #endif
4437       /* It should always be the case that we can put these instructions
4438          anywhere in the basic block with performing PRE optimizations.
4439          Check this.  */
4440       if (GET_CODE (insn) == INSN && pre
4441           && !TEST_BIT (antloc[bb->index], expr->bitmap_index)
4442           && !TEST_BIT (transp[bb->index], expr->bitmap_index))
4443         abort ();
4444
4445       /* If this is a jump table, then we can't insert stuff here.  Since
4446          we know the previous real insn must be the tablejump, we insert
4447          the new instruction just before the tablejump.  */
4448       if (GET_CODE (PATTERN (insn)) == ADDR_VEC
4449           || GET_CODE (PATTERN (insn)) == ADDR_DIFF_VEC)
4450         insn = prev_real_insn (insn);
4451
4452 #ifdef HAVE_cc0
4453       /* FIXME: 'twould be nice to call prev_cc0_setter here but it aborts
4454          if cc0 isn't set.  */
4455       note = find_reg_note (insn, REG_CC_SETTER, NULL_RTX);
4456       if (note)
4457         insn = XEXP (note, 0);
4458       else
4459         {
4460           rtx maybe_cc0_setter = prev_nonnote_insn (insn);
4461           if (maybe_cc0_setter
4462               && INSN_P (maybe_cc0_setter)
4463               && sets_cc0_p (PATTERN (maybe_cc0_setter)))
4464             insn = maybe_cc0_setter;
4465         }
4466 #endif
4467       /* FIXME: What if something in cc0/jump uses value set in new insn?  */
4468       new_insn = emit_insn_before (pat, insn);
4469     }
4470
4471   /* Likewise if the last insn is a call, as will happen in the presence
4472      of exception handling.  */
4473   else if (GET_CODE (insn) == CALL_INSN
4474            && (bb->succ->succ_next || (bb->succ->flags & EDGE_ABNORMAL)))
4475     {
4476       /* Keeping in mind SMALL_REGISTER_CLASSES and parameters in registers,
4477          we search backward and place the instructions before the first
4478          parameter is loaded.  Do this for everyone for consistency and a
4479          presumption that we'll get better code elsewhere as well.
4480
4481          It should always be the case that we can put these instructions
4482          anywhere in the basic block with performing PRE optimizations.
4483          Check this.  */
4484
4485       if (pre
4486           && !TEST_BIT (antloc[bb->index], expr->bitmap_index)
4487           && !TEST_BIT (transp[bb->index], expr->bitmap_index))
4488         abort ();
4489
4490       /* Since different machines initialize their parameter registers
4491          in different orders, assume nothing.  Collect the set of all
4492          parameter registers.  */
4493       insn = find_first_parameter_load (insn, BB_HEAD (bb));
4494
4495       /* If we found all the parameter loads, then we want to insert
4496          before the first parameter load.
4497
4498          If we did not find all the parameter loads, then we might have
4499          stopped on the head of the block, which could be a CODE_LABEL.
4500          If we inserted before the CODE_LABEL, then we would be putting
4501          the insn in the wrong basic block.  In that case, put the insn
4502          after the CODE_LABEL.  Also, respect NOTE_INSN_BASIC_BLOCK.  */
4503       while (GET_CODE (insn) == CODE_LABEL
4504              || NOTE_INSN_BASIC_BLOCK_P (insn))
4505         insn = NEXT_INSN (insn);
4506
4507       new_insn = emit_insn_before (pat, insn);
4508     }
4509   else
4510     new_insn = emit_insn_after (pat, insn);
4511
4512   while (1)
4513     {
4514       if (INSN_P (pat))
4515         {
4516           add_label_notes (PATTERN (pat), new_insn);
4517           note_stores (PATTERN (pat), record_set_info, pat);
4518         }
4519       if (pat == pat_end)
4520         break;
4521       pat = NEXT_INSN (pat);
4522     }
4523
4524   gcse_create_count++;
4525
4526   if (gcse_file)
4527     {
4528       fprintf (gcse_file, "PRE/HOIST: end of bb %d, insn %d, ",
4529                bb->index, INSN_UID (new_insn));
4530       fprintf (gcse_file, "copying expression %d to reg %d\n",
4531                expr->bitmap_index, regno);
4532     }
4533 }
4534
4535 /* Insert partially redundant expressions on edges in the CFG to make
4536    the expressions fully redundant.  */
4537
4538 static int
4539 pre_edge_insert (struct edge_list *edge_list, struct expr **index_map)
4540 {
4541   int e, i, j, num_edges, set_size, did_insert = 0;
4542   sbitmap *inserted;
4543
4544   /* Where PRE_INSERT_MAP is nonzero, we add the expression on that edge
4545      if it reaches any of the deleted expressions.  */
4546
4547   set_size = pre_insert_map[0]->size;
4548   num_edges = NUM_EDGES (edge_list);
4549   inserted = sbitmap_vector_alloc (num_edges, expr_hash_table.n_elems);
4550   sbitmap_vector_zero (inserted, num_edges);
4551
4552   for (e = 0; e < num_edges; e++)
4553     {
4554       int indx;
4555       basic_block bb = INDEX_EDGE_PRED_BB (edge_list, e);
4556
4557       for (i = indx = 0; i < set_size; i++, indx += SBITMAP_ELT_BITS)
4558         {
4559           SBITMAP_ELT_TYPE insert = pre_insert_map[e]->elms[i];
4560
4561           for (j = indx; insert && j < (int) expr_hash_table.n_elems; j++, insert >>= 1)
4562             if ((insert & 1) != 0 && index_map[j]->reaching_reg != NULL_RTX)
4563               {
4564                 struct expr *expr = index_map[j];
4565                 struct occr *occr;
4566
4567                 /* Now look at each deleted occurrence of this expression.  */
4568                 for (occr = expr->antic_occr; occr != NULL; occr = occr->next)
4569                   {
4570                     if (! occr->deleted_p)
4571                       continue;
4572
4573                     /* Insert this expression on this edge if if it would
4574                        reach the deleted occurrence in BB.  */
4575                     if (!TEST_BIT (inserted[e], j))
4576                       {
4577                         rtx insn;
4578                         edge eg = INDEX_EDGE (edge_list, e);
4579
4580                         /* We can't insert anything on an abnormal and
4581                            critical edge, so we insert the insn at the end of
4582                            the previous block. There are several alternatives
4583                            detailed in Morgans book P277 (sec 10.5) for
4584                            handling this situation.  This one is easiest for
4585                            now.  */
4586
4587                         if ((eg->flags & EDGE_ABNORMAL) == EDGE_ABNORMAL)
4588                           insert_insn_end_bb (index_map[j], bb, 0);
4589                         else
4590                           {
4591                             insn = process_insert_insn (index_map[j]);
4592                             insert_insn_on_edge (insn, eg);
4593                           }
4594
4595                         if (gcse_file)
4596                           {
4597                             fprintf (gcse_file, "PRE/HOIST: edge (%d,%d), ",
4598                                      bb->index,
4599                                      INDEX_EDGE_SUCC_BB (edge_list, e)->index);
4600                             fprintf (gcse_file, "copy expression %d\n",
4601                                      expr->bitmap_index);
4602                           }
4603
4604                         update_ld_motion_stores (expr);
4605                         SET_BIT (inserted[e], j);
4606                         did_insert = 1;
4607                         gcse_create_count++;
4608                       }
4609                   }
4610               }
4611         }
4612     }
4613
4614   sbitmap_vector_free (inserted);
4615   return did_insert;
4616 }
4617
4618 /* Copy the result of EXPR->EXPR generated by INSN to EXPR->REACHING_REG.
4619    Given "old_reg <- expr" (INSN), instead of adding after it
4620      reaching_reg <- old_reg
4621    it's better to do the following:
4622      reaching_reg <- expr
4623      old_reg      <- reaching_reg
4624    because this way copy propagation can discover additional PRE
4625    opportunities.  But if this fails, we try the old way.
4626    When "expr" is a store, i.e.
4627    given "MEM <- old_reg", instead of adding after it
4628      reaching_reg <- old_reg
4629    it's better to add it before as follows:
4630      reaching_reg <- old_reg
4631      MEM          <- reaching_reg.  */
4632
4633 static void
4634 pre_insert_copy_insn (struct expr *expr, rtx insn)
4635 {
4636   rtx reg = expr->reaching_reg;
4637   int regno = REGNO (reg);
4638   int indx = expr->bitmap_index;
4639   rtx pat = PATTERN (insn);
4640   rtx set, new_insn;
4641   rtx old_reg;
4642   int i;
4643
4644   /* This block matches the logic in hash_scan_insn.  */
4645   if (GET_CODE (pat) == SET)
4646     set = pat;
4647   else if (GET_CODE (pat) == PARALLEL)
4648     {
4649       /* Search through the parallel looking for the set whose
4650          source was the expression that we're interested in.  */
4651       set = NULL_RTX;
4652       for (i = 0; i < XVECLEN (pat, 0); i++)
4653         {
4654           rtx x = XVECEXP (pat, 0, i);
4655           if (GET_CODE (x) == SET
4656               && expr_equiv_p (SET_SRC (x), expr->expr))
4657             {
4658               set = x;
4659               break;
4660             }
4661         }
4662     }
4663   else
4664     abort ();
4665
4666   if (GET_CODE (SET_DEST (set)) == REG)
4667     {
4668       old_reg = SET_DEST (set);
4669       /* Check if we can modify the set destination in the original insn.  */
4670       if (validate_change (insn, &SET_DEST (set), reg, 0))
4671         {
4672           new_insn = gen_move_insn (old_reg, reg);
4673           new_insn = emit_insn_after (new_insn, insn);
4674
4675           /* Keep register set table up to date.  */
4676           replace_one_set (REGNO (old_reg), insn, new_insn);
4677           record_one_set (regno, insn);
4678         }
4679       else
4680         {
4681           new_insn = gen_move_insn (reg, old_reg);
4682           new_insn = emit_insn_after (new_insn, insn);
4683
4684           /* Keep register set table up to date.  */
4685           record_one_set (regno, new_insn);
4686         }
4687     }
4688   else /* This is possible only in case of a store to memory.  */
4689     {
4690       old_reg = SET_SRC (set);
4691       new_insn = gen_move_insn (reg, old_reg);
4692
4693       /* Check if we can modify the set source in the original insn.  */
4694       if (validate_change (insn, &SET_SRC (set), reg, 0))
4695         new_insn = emit_insn_before (new_insn, insn);
4696       else
4697         new_insn = emit_insn_after (new_insn, insn);
4698
4699       /* Keep register set table up to date.  */
4700       record_one_set (regno, new_insn);
4701     }
4702
4703   gcse_create_count++;
4704
4705   if (gcse_file)
4706     fprintf (gcse_file,
4707              "PRE: bb %d, insn %d, copy expression %d in insn %d to reg %d\n",
4708               BLOCK_NUM (insn), INSN_UID (new_insn), indx,
4709               INSN_UID (insn), regno);
4710 }
4711
4712 /* Copy available expressions that reach the redundant expression
4713    to `reaching_reg'.  */
4714
4715 static void
4716 pre_insert_copies (void)
4717 {
4718   unsigned int i, added_copy;
4719   struct expr *expr;
4720   struct occr *occr;
4721   struct occr *avail;
4722
4723   /* For each available expression in the table, copy the result to
4724      `reaching_reg' if the expression reaches a deleted one.
4725
4726      ??? The current algorithm is rather brute force.
4727      Need to do some profiling.  */
4728
4729   for (i = 0; i < expr_hash_table.size; i++)
4730     for (expr = expr_hash_table.table[i]; expr != NULL; expr = expr->next_same_hash)
4731       {
4732         /* If the basic block isn't reachable, PPOUT will be TRUE.  However,
4733            we don't want to insert a copy here because the expression may not
4734            really be redundant.  So only insert an insn if the expression was
4735            deleted.  This test also avoids further processing if the
4736            expression wasn't deleted anywhere.  */
4737         if (expr->reaching_reg == NULL)
4738           continue;
4739         
4740         /* Set when we add a copy for that expression.  */
4741         added_copy = 0; 
4742
4743         for (occr = expr->antic_occr; occr != NULL; occr = occr->next)
4744           {
4745             if (! occr->deleted_p)
4746               continue;
4747
4748             for (avail = expr->avail_occr; avail != NULL; avail = avail->next)
4749               {
4750                 rtx insn = avail->insn;
4751
4752                 /* No need to handle this one if handled already.  */
4753                 if (avail->copied_p)
4754                   continue;
4755
4756                 /* Don't handle this one if it's a redundant one.  */
4757                 if (TEST_BIT (pre_redundant_insns, INSN_CUID (insn)))
4758                   continue;
4759
4760                 /* Or if the expression doesn't reach the deleted one.  */
4761                 if (! pre_expr_reaches_here_p (BLOCK_FOR_INSN (avail->insn),
4762                                                expr,
4763                                                BLOCK_FOR_INSN (occr->insn)))
4764                   continue;
4765
4766                 added_copy = 1;
4767
4768                 /* Copy the result of avail to reaching_reg.  */
4769                 pre_insert_copy_insn (expr, insn);
4770                 avail->copied_p = 1;
4771               }
4772           }
4773
4774           if (added_copy)
4775             update_ld_motion_stores (expr);
4776       }
4777 }
4778
4779 /* Emit move from SRC to DEST noting the equivalence with expression computed
4780    in INSN.  */
4781 static rtx
4782 gcse_emit_move_after (rtx src, rtx dest, rtx insn)
4783 {
4784   rtx new;
4785   rtx set = single_set (insn), set2;
4786   rtx note;
4787   rtx eqv;
4788
4789   /* This should never fail since we're creating a reg->reg copy
4790      we've verified to be valid.  */
4791
4792   new = emit_insn_after (gen_move_insn (dest, src), insn);
4793
4794   /* Note the equivalence for local CSE pass.  */
4795   set2 = single_set (new);
4796   if (!set2 || !rtx_equal_p (SET_DEST (set2), dest))
4797     return new;
4798   if ((note = find_reg_equal_equiv_note (insn)))
4799     eqv = XEXP (note, 0);
4800   else
4801     eqv = SET_SRC (set);
4802
4803   set_unique_reg_note (new, REG_EQUAL, copy_insn_1 (eqv));
4804
4805   return new;
4806 }
4807
4808 /* Delete redundant computations.
4809    Deletion is done by changing the insn to copy the `reaching_reg' of
4810    the expression into the result of the SET.  It is left to later passes
4811    (cprop, cse2, flow, combine, regmove) to propagate the copy or eliminate it.
4812
4813    Returns nonzero if a change is made.  */
4814
4815 static int
4816 pre_delete (void)
4817 {
4818   unsigned int i;
4819   int changed;
4820   struct expr *expr;
4821   struct occr *occr;
4822
4823   changed = 0;
4824   for (i = 0; i < expr_hash_table.size; i++)
4825     for (expr = expr_hash_table.table[i];
4826          expr != NULL;
4827          expr = expr->next_same_hash)
4828       {
4829         int indx = expr->bitmap_index;
4830
4831         /* We only need to search antic_occr since we require
4832            ANTLOC != 0.  */
4833
4834         for (occr = expr->antic_occr; occr != NULL; occr = occr->next)
4835           {
4836             rtx insn = occr->insn;
4837             rtx set;
4838             basic_block bb = BLOCK_FOR_INSN (insn);
4839
4840             /* We only delete insns that have a single_set.  */
4841             if (TEST_BIT (pre_delete_map[bb->index], indx)
4842                 && (set = single_set (insn)) != 0)
4843               {
4844                 /* Create a pseudo-reg to store the result of reaching
4845                    expressions into.  Get the mode for the new pseudo from
4846                    the mode of the original destination pseudo.  */
4847                 if (expr->reaching_reg == NULL)
4848                   expr->reaching_reg
4849                     = gen_reg_rtx (GET_MODE (SET_DEST (set)));
4850
4851                 gcse_emit_move_after (expr->reaching_reg, SET_DEST (set), insn);
4852                 delete_insn (insn);
4853                 occr->deleted_p = 1;
4854                 SET_BIT (pre_redundant_insns, INSN_CUID (insn));
4855                 changed = 1;
4856                 gcse_subst_count++;
4857
4858                 if (gcse_file)
4859                   {
4860                     fprintf (gcse_file,
4861                              "PRE: redundant insn %d (expression %d) in ",
4862                                INSN_UID (insn), indx);
4863                     fprintf (gcse_file, "bb %d, reaching reg is %d\n",
4864                              bb->index, REGNO (expr->reaching_reg));
4865                   }
4866               }
4867           }
4868       }
4869
4870   return changed;
4871 }
4872
4873 /* Perform GCSE optimizations using PRE.
4874    This is called by one_pre_gcse_pass after all the dataflow analysis
4875    has been done.
4876
4877    This is based on the original Morel-Renvoise paper Fred Chow's thesis, and
4878    lazy code motion from Knoop, Ruthing and Steffen as described in Advanced
4879    Compiler Design and Implementation.
4880
4881    ??? A new pseudo reg is created to hold the reaching expression.  The nice
4882    thing about the classical approach is that it would try to use an existing
4883    reg.  If the register can't be adequately optimized [i.e. we introduce
4884    reload problems], one could add a pass here to propagate the new register
4885    through the block.
4886
4887    ??? We don't handle single sets in PARALLELs because we're [currently] not
4888    able to copy the rest of the parallel when we insert copies to create full
4889    redundancies from partial redundancies.  However, there's no reason why we
4890    can't handle PARALLELs in the cases where there are no partial
4891    redundancies.  */
4892
4893 static int
4894 pre_gcse (void)
4895 {
4896   unsigned int i;
4897   int did_insert, changed;
4898   struct expr **index_map;
4899   struct expr *expr;
4900
4901   /* Compute a mapping from expression number (`bitmap_index') to
4902      hash table entry.  */
4903
4904   index_map = xcalloc (expr_hash_table.n_elems, sizeof (struct expr *));
4905   for (i = 0; i < expr_hash_table.size; i++)
4906     for (expr = expr_hash_table.table[i]; expr != NULL; expr = expr->next_same_hash)
4907       index_map[expr->bitmap_index] = expr;
4908
4909   /* Reset bitmap used to track which insns are redundant.  */
4910   pre_redundant_insns = sbitmap_alloc (max_cuid);
4911   sbitmap_zero (pre_redundant_insns);
4912
4913   /* Delete the redundant insns first so that
4914      - we know what register to use for the new insns and for the other
4915        ones with reaching expressions
4916      - we know which insns are redundant when we go to create copies  */
4917
4918   changed = pre_delete ();
4919
4920   did_insert = pre_edge_insert (edge_list, index_map);
4921
4922   /* In other places with reaching expressions, copy the expression to the
4923      specially allocated pseudo-reg that reaches the redundant expr.  */
4924   pre_insert_copies ();
4925   if (did_insert)
4926     {
4927       commit_edge_insertions ();
4928       changed = 1;
4929     }
4930
4931   free (index_map);
4932   sbitmap_free (pre_redundant_insns);
4933   return changed;
4934 }
4935
4936 /* Top level routine to perform one PRE GCSE pass.
4937
4938    Return nonzero if a change was made.  */
4939
4940 static int
4941 one_pre_gcse_pass (int pass)
4942 {
4943   int changed = 0;
4944
4945   gcse_subst_count = 0;
4946   gcse_create_count = 0;
4947
4948   alloc_hash_table (max_cuid, &expr_hash_table, 0);
4949   add_noreturn_fake_exit_edges ();
4950   if (flag_gcse_lm)
4951     compute_ld_motion_mems ();
4952
4953   compute_hash_table (&expr_hash_table);
4954   trim_ld_motion_mems ();
4955   if (gcse_file)
4956     dump_hash_table (gcse_file, "Expression", &expr_hash_table);
4957
4958   if (expr_hash_table.n_elems > 0)
4959     {
4960       alloc_pre_mem (last_basic_block, expr_hash_table.n_elems);
4961       compute_pre_data ();
4962       changed |= pre_gcse ();
4963       free_edge_list (edge_list);
4964       free_pre_mem ();
4965     }
4966
4967   free_ldst_mems ();
4968   remove_fake_edges ();
4969   free_hash_table (&expr_hash_table);
4970
4971   if (gcse_file)
4972     {
4973       fprintf (gcse_file, "\nPRE GCSE of %s, pass %d: %d bytes needed, ",
4974                current_function_name (), pass, bytes_used);
4975       fprintf (gcse_file, "%d substs, %d insns created\n",
4976                gcse_subst_count, gcse_create_count);
4977     }
4978
4979   return changed;
4980 }
4981 \f
4982 /* If X contains any LABEL_REF's, add REG_LABEL notes for them to INSN.
4983    If notes are added to an insn which references a CODE_LABEL, the
4984    LABEL_NUSES count is incremented.  We have to add REG_LABEL notes,
4985    because the following loop optimization pass requires them.  */
4986
4987 /* ??? This is very similar to the loop.c add_label_notes function.  We
4988    could probably share code here.  */
4989
4990 /* ??? If there was a jump optimization pass after gcse and before loop,
4991    then we would not need to do this here, because jump would add the
4992    necessary REG_LABEL notes.  */
4993
4994 static void
4995 add_label_notes (rtx x, rtx insn)
4996 {
4997   enum rtx_code code = GET_CODE (x);
4998   int i, j;
4999   const char *fmt;
5000
5001   if (code == LABEL_REF && !LABEL_REF_NONLOCAL_P (x))
5002     {
5003       /* This code used to ignore labels that referred to dispatch tables to
5004          avoid flow generating (slightly) worse code.
5005
5006          We no longer ignore such label references (see LABEL_REF handling in
5007          mark_jump_label for additional information).  */
5008
5009       REG_NOTES (insn) = gen_rtx_INSN_LIST (REG_LABEL, XEXP (x, 0),
5010                                             REG_NOTES (insn));
5011       if (LABEL_P (XEXP (x, 0)))
5012         LABEL_NUSES (XEXP (x, 0))++;
5013       return;
5014     }
5015
5016   for (i = GET_RTX_LENGTH (code) - 1, fmt = GET_RTX_FORMAT (code); i >= 0; i--)
5017     {
5018       if (fmt[i] == 'e')
5019         add_label_notes (XEXP (x, i), insn);
5020       else if (fmt[i] == 'E')
5021         for (j = XVECLEN (x, i) - 1; j >= 0; j--)
5022           add_label_notes (XVECEXP (x, i, j), insn);
5023     }
5024 }
5025
5026 /* Compute transparent outgoing information for each block.
5027
5028    An expression is transparent to an edge unless it is killed by
5029    the edge itself.  This can only happen with abnormal control flow,
5030    when the edge is traversed through a call.  This happens with
5031    non-local labels and exceptions.
5032
5033    This would not be necessary if we split the edge.  While this is
5034    normally impossible for abnormal critical edges, with some effort
5035    it should be possible with exception handling, since we still have
5036    control over which handler should be invoked.  But due to increased
5037    EH table sizes, this may not be worthwhile.  */
5038
5039 static void
5040 compute_transpout (void)
5041 {
5042   basic_block bb;
5043   unsigned int i;
5044   struct expr *expr;
5045
5046   sbitmap_vector_ones (transpout, last_basic_block);
5047
5048   FOR_EACH_BB (bb)
5049     {
5050       /* Note that flow inserted a nop a the end of basic blocks that
5051          end in call instructions for reasons other than abnormal
5052          control flow.  */
5053       if (GET_CODE (BB_END (bb)) != CALL_INSN)
5054         continue;
5055
5056       for (i = 0; i < expr_hash_table.size; i++)
5057         for (expr = expr_hash_table.table[i]; expr ; expr = expr->next_same_hash)
5058           if (GET_CODE (expr->expr) == MEM)
5059             {
5060               if (GET_CODE (XEXP (expr->expr, 0)) == SYMBOL_REF
5061                   && CONSTANT_POOL_ADDRESS_P (XEXP (expr->expr, 0)))
5062                 continue;
5063
5064               /* ??? Optimally, we would use interprocedural alias
5065                  analysis to determine if this mem is actually killed
5066                  by this call.  */
5067               RESET_BIT (transpout[bb->index], expr->bitmap_index);
5068             }
5069     }
5070 }
5071
5072 /* Code Hoisting variables and subroutines.  */
5073
5074 /* Very busy expressions.  */
5075 static sbitmap *hoist_vbein;
5076 static sbitmap *hoist_vbeout;
5077
5078 /* Hoistable expressions.  */
5079 static sbitmap *hoist_exprs;
5080
5081 /* ??? We could compute post dominators and run this algorithm in
5082    reverse to perform tail merging, doing so would probably be
5083    more effective than the tail merging code in jump.c.
5084
5085    It's unclear if tail merging could be run in parallel with
5086    code hoisting.  It would be nice.  */
5087
5088 /* Allocate vars used for code hoisting analysis.  */
5089
5090 static void
5091 alloc_code_hoist_mem (int n_blocks, int n_exprs)
5092 {
5093   antloc = sbitmap_vector_alloc (n_blocks, n_exprs);
5094   transp = sbitmap_vector_alloc (n_blocks, n_exprs);
5095   comp = sbitmap_vector_alloc (n_blocks, n_exprs);
5096
5097   hoist_vbein = sbitmap_vector_alloc (n_blocks, n_exprs);
5098   hoist_vbeout = sbitmap_vector_alloc (n_blocks, n_exprs);
5099   hoist_exprs = sbitmap_vector_alloc (n_blocks, n_exprs);
5100   transpout = sbitmap_vector_alloc (n_blocks, n_exprs);
5101 }
5102
5103 /* Free vars used for code hoisting analysis.  */
5104
5105 static void
5106 free_code_hoist_mem (void)
5107 {
5108   sbitmap_vector_free (antloc);
5109   sbitmap_vector_free (transp);
5110   sbitmap_vector_free (comp);
5111
5112   sbitmap_vector_free (hoist_vbein);
5113   sbitmap_vector_free (hoist_vbeout);
5114   sbitmap_vector_free (hoist_exprs);
5115   sbitmap_vector_free (transpout);
5116
5117   free_dominance_info (CDI_DOMINATORS);
5118 }
5119
5120 /* Compute the very busy expressions at entry/exit from each block.
5121
5122    An expression is very busy if all paths from a given point
5123    compute the expression.  */
5124
5125 static void
5126 compute_code_hoist_vbeinout (void)
5127 {
5128   int changed, passes;
5129   basic_block bb;
5130
5131   sbitmap_vector_zero (hoist_vbeout, last_basic_block);
5132   sbitmap_vector_zero (hoist_vbein, last_basic_block);
5133
5134   passes = 0;
5135   changed = 1;
5136
5137   while (changed)
5138     {
5139       changed = 0;
5140
5141       /* We scan the blocks in the reverse order to speed up
5142          the convergence.  */
5143       FOR_EACH_BB_REVERSE (bb)
5144         {
5145           changed |= sbitmap_a_or_b_and_c_cg (hoist_vbein[bb->index], antloc[bb->index],
5146                                               hoist_vbeout[bb->index], transp[bb->index]);
5147           if (bb->next_bb != EXIT_BLOCK_PTR)
5148             sbitmap_intersection_of_succs (hoist_vbeout[bb->index], hoist_vbein, bb->index);
5149         }
5150
5151       passes++;
5152     }
5153
5154   if (gcse_file)
5155     fprintf (gcse_file, "hoisting vbeinout computation: %d passes\n", passes);
5156 }
5157
5158 /* Top level routine to do the dataflow analysis needed by code hoisting.  */
5159
5160 static void
5161 compute_code_hoist_data (void)
5162 {
5163   compute_local_properties (transp, comp, antloc, &expr_hash_table);
5164   compute_transpout ();
5165   compute_code_hoist_vbeinout ();
5166   calculate_dominance_info (CDI_DOMINATORS);
5167   if (gcse_file)
5168     fprintf (gcse_file, "\n");
5169 }
5170
5171 /* Determine if the expression identified by EXPR_INDEX would
5172    reach BB unimpared if it was placed at the end of EXPR_BB.
5173
5174    It's unclear exactly what Muchnick meant by "unimpared".  It seems
5175    to me that the expression must either be computed or transparent in
5176    *every* block in the path(s) from EXPR_BB to BB.  Any other definition
5177    would allow the expression to be hoisted out of loops, even if
5178    the expression wasn't a loop invariant.
5179
5180    Contrast this to reachability for PRE where an expression is
5181    considered reachable if *any* path reaches instead of *all*
5182    paths.  */
5183
5184 static int
5185 hoist_expr_reaches_here_p (basic_block expr_bb, int expr_index, basic_block bb, char *visited)
5186 {
5187   edge pred;
5188   int visited_allocated_locally = 0;
5189
5190
5191   if (visited == NULL)
5192     {
5193       visited_allocated_locally = 1;
5194       visited = xcalloc (last_basic_block, 1);
5195     }
5196
5197   for (pred = bb->pred; pred != NULL; pred = pred->pred_next)
5198     {
5199       basic_block pred_bb = pred->src;
5200
5201       if (pred->src == ENTRY_BLOCK_PTR)
5202         break;
5203       else if (pred_bb == expr_bb)
5204         continue;
5205       else if (visited[pred_bb->index])
5206         continue;
5207
5208       /* Does this predecessor generate this expression?  */
5209       else if (TEST_BIT (comp[pred_bb->index], expr_index))
5210         break;
5211       else if (! TEST_BIT (transp[pred_bb->index], expr_index))
5212         break;
5213
5214       /* Not killed.  */
5215       else
5216         {
5217           visited[pred_bb->index] = 1;
5218           if (! hoist_expr_reaches_here_p (expr_bb, expr_index,
5219                                            pred_bb, visited))
5220             break;
5221         }
5222     }
5223   if (visited_allocated_locally)
5224     free (visited);
5225
5226   return (pred == NULL);
5227 }
5228 \f
5229 /* Actually perform code hoisting.  */
5230
5231 static void
5232 hoist_code (void)
5233 {
5234   basic_block bb, dominated;
5235   basic_block *domby;
5236   unsigned int domby_len;
5237   unsigned int i,j;
5238   struct expr **index_map;
5239   struct expr *expr;
5240
5241   sbitmap_vector_zero (hoist_exprs, last_basic_block);
5242
5243   /* Compute a mapping from expression number (`bitmap_index') to
5244      hash table entry.  */
5245
5246   index_map = xcalloc (expr_hash_table.n_elems, sizeof (struct expr *));
5247   for (i = 0; i < expr_hash_table.size; i++)
5248     for (expr = expr_hash_table.table[i]; expr != NULL; expr = expr->next_same_hash)
5249       index_map[expr->bitmap_index] = expr;
5250
5251   /* Walk over each basic block looking for potentially hoistable
5252      expressions, nothing gets hoisted from the entry block.  */
5253   FOR_EACH_BB (bb)
5254     {
5255       int found = 0;
5256       int insn_inserted_p;
5257
5258       domby_len = get_dominated_by (CDI_DOMINATORS, bb, &domby);
5259       /* Examine each expression that is very busy at the exit of this
5260          block.  These are the potentially hoistable expressions.  */
5261       for (i = 0; i < hoist_vbeout[bb->index]->n_bits; i++)
5262         {
5263           int hoistable = 0;
5264
5265           if (TEST_BIT (hoist_vbeout[bb->index], i)
5266               && TEST_BIT (transpout[bb->index], i))
5267             {
5268               /* We've found a potentially hoistable expression, now
5269                  we look at every block BB dominates to see if it
5270                  computes the expression.  */
5271               for (j = 0; j < domby_len; j++)
5272                 {
5273                   dominated = domby[j];
5274                   /* Ignore self dominance.  */
5275                   if (bb == dominated)
5276                     continue;
5277                   /* We've found a dominated block, now see if it computes
5278                      the busy expression and whether or not moving that
5279                      expression to the "beginning" of that block is safe.  */
5280                   if (!TEST_BIT (antloc[dominated->index], i))
5281                     continue;
5282
5283                   /* Note if the expression would reach the dominated block
5284                      unimpared if it was placed at the end of BB.
5285
5286                      Keep track of how many times this expression is hoistable
5287                      from a dominated block into BB.  */
5288                   if (hoist_expr_reaches_here_p (bb, i, dominated, NULL))
5289                     hoistable++;
5290                 }
5291
5292               /* If we found more than one hoistable occurrence of this
5293                  expression, then note it in the bitmap of expressions to
5294                  hoist.  It makes no sense to hoist things which are computed
5295                  in only one BB, and doing so tends to pessimize register
5296                  allocation.  One could increase this value to try harder
5297                  to avoid any possible code expansion due to register
5298                  allocation issues; however experiments have shown that
5299                  the vast majority of hoistable expressions are only movable
5300                  from two successors, so raising this threshold is likely
5301                  to nullify any benefit we get from code hoisting.  */
5302               if (hoistable > 1)
5303                 {
5304                   SET_BIT (hoist_exprs[bb->index], i);
5305                   found = 1;
5306                 }
5307             }
5308         }
5309       /* If we found nothing to hoist, then quit now.  */
5310       if (! found)
5311         {
5312           free (domby);
5313         continue;
5314         }
5315
5316       /* Loop over all the hoistable expressions.  */
5317       for (i = 0; i < hoist_exprs[bb->index]->n_bits; i++)
5318         {
5319           /* We want to insert the expression into BB only once, so
5320              note when we've inserted it.  */
5321           insn_inserted_p = 0;
5322
5323           /* These tests should be the same as the tests above.  */
5324           if (TEST_BIT (hoist_vbeout[bb->index], i))
5325             {
5326               /* We've found a potentially hoistable expression, now
5327                  we look at every block BB dominates to see if it
5328                  computes the expression.  */
5329               for (j = 0; j < domby_len; j++)
5330                 {
5331                   dominated = domby[j];
5332                   /* Ignore self dominance.  */
5333                   if (bb == dominated)
5334                     continue;
5335
5336                   /* We've found a dominated block, now see if it computes
5337                      the busy expression and whether or not moving that
5338                      expression to the "beginning" of that block is safe.  */
5339                   if (!TEST_BIT (antloc[dominated->index], i))
5340                     continue;
5341
5342                   /* The expression is computed in the dominated block and
5343                      it would be safe to compute it at the start of the
5344                      dominated block.  Now we have to determine if the
5345                      expression would reach the dominated block if it was
5346                      placed at the end of BB.  */
5347                   if (hoist_expr_reaches_here_p (bb, i, dominated, NULL))
5348                     {
5349                       struct expr *expr = index_map[i];
5350                       struct occr *occr = expr->antic_occr;
5351                       rtx insn;
5352                       rtx set;
5353
5354                       /* Find the right occurrence of this expression.  */
5355                       while (BLOCK_FOR_INSN (occr->insn) != dominated && occr)
5356                         occr = occr->next;
5357
5358                       /* Should never happen.  */
5359                       if (!occr)
5360                         abort ();
5361
5362                       insn = occr->insn;
5363
5364                       set = single_set (insn);
5365                       if (! set)
5366                         abort ();
5367
5368                       /* Create a pseudo-reg to store the result of reaching
5369                          expressions into.  Get the mode for the new pseudo
5370                          from the mode of the original destination pseudo.  */
5371                       if (expr->reaching_reg == NULL)
5372                         expr->reaching_reg
5373                           = gen_reg_rtx (GET_MODE (SET_DEST (set)));
5374
5375                       gcse_emit_move_after (expr->reaching_reg, SET_DEST (set), insn);
5376                       delete_insn (insn);
5377                       occr->deleted_p = 1;
5378                       if (!insn_inserted_p)
5379                         {
5380                           insert_insn_end_bb (index_map[i], bb, 0);
5381                           insn_inserted_p = 1;
5382                         }
5383                     }
5384                 }
5385             }
5386         }
5387       free (domby);
5388     }
5389
5390   free (index_map);
5391 }
5392
5393 /* Top level routine to perform one code hoisting (aka unification) pass
5394
5395    Return nonzero if a change was made.  */
5396
5397 static int
5398 one_code_hoisting_pass (void)
5399 {
5400   int changed = 0;
5401
5402   alloc_hash_table (max_cuid, &expr_hash_table, 0);
5403   compute_hash_table (&expr_hash_table);
5404   if (gcse_file)
5405     dump_hash_table (gcse_file, "Code Hosting Expressions", &expr_hash_table);
5406
5407   if (expr_hash_table.n_elems > 0)
5408     {
5409       alloc_code_hoist_mem (last_basic_block, expr_hash_table.n_elems);
5410       compute_code_hoist_data ();
5411       hoist_code ();
5412       free_code_hoist_mem ();
5413     }
5414
5415   free_hash_table (&expr_hash_table);
5416
5417   return changed;
5418 }
5419 \f
5420 /*  Here we provide the things required to do store motion towards
5421     the exit. In order for this to be effective, gcse also needed to
5422     be taught how to move a load when it is kill only by a store to itself.
5423
5424             int i;
5425             float a[10];
5426
5427             void foo(float scale)
5428             {
5429               for (i=0; i<10; i++)
5430                 a[i] *= scale;
5431             }
5432
5433     'i' is both loaded and stored to in the loop. Normally, gcse cannot move
5434     the load out since its live around the loop, and stored at the bottom
5435     of the loop.
5436
5437       The 'Load Motion' referred to and implemented in this file is
5438     an enhancement to gcse which when using edge based lcm, recognizes
5439     this situation and allows gcse to move the load out of the loop.
5440
5441       Once gcse has hoisted the load, store motion can then push this
5442     load towards the exit, and we end up with no loads or stores of 'i'
5443     in the loop.  */
5444
5445 /* This will search the ldst list for a matching expression. If it
5446    doesn't find one, we create one and initialize it.  */
5447
5448 static struct ls_expr *
5449 ldst_entry (rtx x)
5450 {
5451   int do_not_record_p = 0;
5452   struct ls_expr * ptr;
5453   unsigned int hash;
5454
5455   hash = hash_expr_1 (x, GET_MODE (x), & do_not_record_p);
5456
5457   for (ptr = pre_ldst_mems; ptr != NULL; ptr = ptr->next)
5458     if (ptr->hash_index == hash && expr_equiv_p (ptr->pattern, x))
5459       return ptr;
5460
5461   ptr = xmalloc (sizeof (struct ls_expr));
5462
5463   ptr->next         = pre_ldst_mems;
5464   ptr->expr         = NULL;
5465   ptr->pattern      = x;
5466   ptr->pattern_regs = NULL_RTX;
5467   ptr->loads        = NULL_RTX;
5468   ptr->stores       = NULL_RTX;
5469   ptr->reaching_reg = NULL_RTX;
5470   ptr->invalid      = 0;
5471   ptr->index        = 0;
5472   ptr->hash_index   = hash;
5473   pre_ldst_mems     = ptr;
5474
5475   return ptr;
5476 }
5477
5478 /* Free up an individual ldst entry.  */
5479
5480 static void
5481 free_ldst_entry (struct ls_expr * ptr)
5482 {
5483   free_INSN_LIST_list (& ptr->loads);
5484   free_INSN_LIST_list (& ptr->stores);
5485
5486   free (ptr);
5487 }
5488
5489 /* Free up all memory associated with the ldst list.  */
5490
5491 static void
5492 free_ldst_mems (void)
5493 {
5494   while (pre_ldst_mems)
5495     {
5496       struct ls_expr * tmp = pre_ldst_mems;
5497
5498       pre_ldst_mems = pre_ldst_mems->next;
5499
5500       free_ldst_entry (tmp);
5501     }
5502
5503   pre_ldst_mems = NULL;
5504 }
5505
5506 /* Dump debugging info about the ldst list.  */
5507
5508 static void
5509 print_ldst_list (FILE * file)
5510 {
5511   struct ls_expr * ptr;
5512
5513   fprintf (file, "LDST list: \n");
5514
5515   for (ptr = first_ls_expr(); ptr != NULL; ptr = next_ls_expr (ptr))
5516     {
5517       fprintf (file, "  Pattern (%3d): ", ptr->index);
5518
5519       print_rtl (file, ptr->pattern);
5520
5521       fprintf (file, "\n         Loads : ");
5522
5523       if (ptr->loads)
5524         print_rtl (file, ptr->loads);
5525       else
5526         fprintf (file, "(nil)");
5527
5528       fprintf (file, "\n        Stores : ");
5529
5530       if (ptr->stores)
5531         print_rtl (file, ptr->stores);
5532       else
5533         fprintf (file, "(nil)");
5534
5535       fprintf (file, "\n\n");
5536     }
5537
5538   fprintf (file, "\n");
5539 }
5540
5541 /* Returns 1 if X is in the list of ldst only expressions.  */
5542
5543 static struct ls_expr *
5544 find_rtx_in_ldst (rtx x)
5545 {
5546   struct ls_expr * ptr;
5547
5548   for (ptr = pre_ldst_mems; ptr != NULL; ptr = ptr->next)
5549     if (expr_equiv_p (ptr->pattern, x) && ! ptr->invalid)
5550       return ptr;
5551
5552   return NULL;
5553 }
5554
5555 /* Assign each element of the list of mems a monotonically increasing value.  */
5556
5557 static int
5558 enumerate_ldsts (void)
5559 {
5560   struct ls_expr * ptr;
5561   int n = 0;
5562
5563   for (ptr = pre_ldst_mems; ptr != NULL; ptr = ptr->next)
5564     ptr->index = n++;
5565
5566   return n;
5567 }
5568
5569 /* Return first item in the list.  */
5570
5571 static inline struct ls_expr *
5572 first_ls_expr (void)
5573 {
5574   return pre_ldst_mems;
5575 }
5576
5577 /* Return the next item in the list after the specified one.  */
5578
5579 static inline struct ls_expr *
5580 next_ls_expr (struct ls_expr * ptr)
5581 {
5582   return ptr->next;
5583 }
5584 \f
5585 /* Load Motion for loads which only kill themselves.  */
5586
5587 /* Return true if x is a simple MEM operation, with no registers or
5588    side effects. These are the types of loads we consider for the
5589    ld_motion list, otherwise we let the usual aliasing take care of it.  */
5590
5591 static int
5592 simple_mem (rtx x)
5593 {
5594   if (GET_CODE (x) != MEM)
5595     return 0;
5596
5597   if (MEM_VOLATILE_P (x))
5598     return 0;
5599
5600   if (GET_MODE (x) == BLKmode)
5601     return 0;
5602
5603   /* If we are handling exceptions, we must be careful with memory references
5604      that may trap. If we are not, the behavior is undefined, so we may just
5605      continue.  */
5606   if (flag_non_call_exceptions && may_trap_p (x))
5607     return 0;
5608
5609   if (side_effects_p (x))
5610     return 0;
5611
5612   /* Do not consider function arguments passed on stack.  */
5613   if (reg_mentioned_p (stack_pointer_rtx, x))
5614     return 0;
5615
5616   if (flag_float_store && FLOAT_MODE_P (GET_MODE (x)))
5617     return 0;
5618
5619   return 1;
5620 }
5621
5622 /* Make sure there isn't a buried reference in this pattern anywhere.
5623    If there is, invalidate the entry for it since we're not capable
5624    of fixing it up just yet.. We have to be sure we know about ALL
5625    loads since the aliasing code will allow all entries in the
5626    ld_motion list to not-alias itself.  If we miss a load, we will get
5627    the wrong value since gcse might common it and we won't know to
5628    fix it up.  */
5629
5630 static void
5631 invalidate_any_buried_refs (rtx x)
5632 {
5633   const char * fmt;
5634   int i, j;
5635   struct ls_expr * ptr;
5636
5637   /* Invalidate it in the list.  */
5638   if (GET_CODE (x) == MEM && simple_mem (x))
5639     {
5640       ptr = ldst_entry (x);
5641       ptr->invalid = 1;
5642     }
5643
5644   /* Recursively process the insn.  */
5645   fmt = GET_RTX_FORMAT (GET_CODE (x));
5646
5647   for (i = GET_RTX_LENGTH (GET_CODE (x)) - 1; i >= 0; i--)
5648     {
5649       if (fmt[i] == 'e')
5650         invalidate_any_buried_refs (XEXP (x, i));
5651       else if (fmt[i] == 'E')
5652         for (j = XVECLEN (x, i) - 1; j >= 0; j--)
5653           invalidate_any_buried_refs (XVECEXP (x, i, j));
5654     }
5655 }
5656
5657 /* Find all the 'simple' MEMs which are used in LOADs and STORES.  Simple
5658    being defined as MEM loads and stores to symbols, with no side effects
5659    and no registers in the expression.  For a MEM destination, we also
5660    check that the insn is still valid if we replace the destination with a
5661    REG, as is done in update_ld_motion_stores.  If there are any uses/defs
5662    which don't match this criteria, they are invalidated and trimmed out
5663    later.  */
5664
5665 static void
5666 compute_ld_motion_mems (void)
5667 {
5668   struct ls_expr * ptr;
5669   basic_block bb;
5670   rtx insn;
5671
5672   pre_ldst_mems = NULL;
5673
5674   FOR_EACH_BB (bb)
5675     {
5676       for (insn = BB_HEAD (bb);
5677            insn && insn != NEXT_INSN (BB_END (bb));
5678            insn = NEXT_INSN (insn))
5679         {
5680           if (INSN_P (insn))
5681             {
5682               if (GET_CODE (PATTERN (insn)) == SET)
5683                 {
5684                   rtx src = SET_SRC (PATTERN (insn));
5685                   rtx dest = SET_DEST (PATTERN (insn));
5686
5687                   /* Check for a simple LOAD...  */
5688                   if (GET_CODE (src) == MEM && simple_mem (src))
5689                     {
5690                       ptr = ldst_entry (src);
5691                       if (GET_CODE (dest) == REG)
5692                         ptr->loads = alloc_INSN_LIST (insn, ptr->loads);
5693                       else
5694                         ptr->invalid = 1;
5695                     }
5696                   else
5697                     {
5698                       /* Make sure there isn't a buried load somewhere.  */
5699                       invalidate_any_buried_refs (src);
5700                     }
5701
5702                   /* Check for stores. Don't worry about aliased ones, they
5703                      will block any movement we might do later. We only care
5704                      about this exact pattern since those are the only
5705                      circumstance that we will ignore the aliasing info.  */
5706                   if (GET_CODE (dest) == MEM && simple_mem (dest))
5707                     {
5708                       ptr = ldst_entry (dest);
5709
5710                       if (GET_CODE (src) != MEM
5711                           && GET_CODE (src) != ASM_OPERANDS
5712                           /* Check for REG manually since want_to_gcse_p
5713                              returns 0 for all REGs.  */
5714                           && can_assign_to_reg_p (src))
5715                         ptr->stores = alloc_INSN_LIST (insn, ptr->stores);
5716                       else
5717                         ptr->invalid = 1;
5718                     }
5719                 }
5720               else
5721                 invalidate_any_buried_refs (PATTERN (insn));
5722             }
5723         }
5724     }
5725 }
5726
5727 /* Remove any references that have been either invalidated or are not in the
5728    expression list for pre gcse.  */
5729
5730 static void
5731 trim_ld_motion_mems (void)
5732 {
5733   struct ls_expr * * last = & pre_ldst_mems;
5734   struct ls_expr * ptr = pre_ldst_mems;
5735
5736   while (ptr != NULL)
5737     {
5738       struct expr * expr;
5739
5740       /* Delete if entry has been made invalid.  */
5741       if (! ptr->invalid)
5742         {
5743           /* Delete if we cannot find this mem in the expression list.  */
5744           unsigned int hash = ptr->hash_index % expr_hash_table.size;
5745
5746           for (expr = expr_hash_table.table[hash];
5747                expr != NULL;
5748                expr = expr->next_same_hash)
5749             if (expr_equiv_p (expr->expr, ptr->pattern))
5750               break;
5751         }
5752       else
5753         expr = (struct expr *) 0;
5754
5755       if (expr)
5756         {
5757           /* Set the expression field if we are keeping it.  */
5758           ptr->expr = expr;
5759           last = & ptr->next;
5760           ptr = ptr->next;
5761         }
5762       else
5763         {
5764           *last = ptr->next;
5765           free_ldst_entry (ptr);
5766           ptr = * last;
5767         }
5768     }
5769
5770   /* Show the world what we've found.  */
5771   if (gcse_file && pre_ldst_mems != NULL)
5772     print_ldst_list (gcse_file);
5773 }
5774
5775 /* This routine will take an expression which we are replacing with
5776    a reaching register, and update any stores that are needed if
5777    that expression is in the ld_motion list.  Stores are updated by
5778    copying their SRC to the reaching register, and then storing
5779    the reaching register into the store location. These keeps the
5780    correct value in the reaching register for the loads.  */
5781
5782 static void
5783 update_ld_motion_stores (struct expr * expr)
5784 {
5785   struct ls_expr * mem_ptr;
5786
5787   if ((mem_ptr = find_rtx_in_ldst (expr->expr)))
5788     {
5789       /* We can try to find just the REACHED stores, but is shouldn't
5790          matter to set the reaching reg everywhere...  some might be
5791          dead and should be eliminated later.  */
5792
5793       /* We replace (set mem expr) with (set reg expr) (set mem reg)
5794          where reg is the reaching reg used in the load.  We checked in
5795          compute_ld_motion_mems that we can replace (set mem expr) with
5796          (set reg expr) in that insn.  */
5797       rtx list = mem_ptr->stores;
5798
5799       for ( ; list != NULL_RTX; list = XEXP (list, 1))
5800         {
5801           rtx insn = XEXP (list, 0);
5802           rtx pat = PATTERN (insn);
5803           rtx src = SET_SRC (pat);
5804           rtx reg = expr->reaching_reg;
5805           rtx copy, new;
5806
5807           /* If we've already copied it, continue.  */
5808           if (expr->reaching_reg == src)
5809             continue;
5810
5811           if (gcse_file)
5812             {
5813               fprintf (gcse_file, "PRE:  store updated with reaching reg ");
5814               print_rtl (gcse_file, expr->reaching_reg);
5815               fprintf (gcse_file, ":\n  ");
5816               print_inline_rtx (gcse_file, insn, 8);
5817               fprintf (gcse_file, "\n");
5818             }
5819
5820           copy = gen_move_insn ( reg, copy_rtx (SET_SRC (pat)));
5821           new = emit_insn_before (copy, insn);
5822           record_one_set (REGNO (reg), new);
5823           SET_SRC (pat) = reg;
5824
5825           /* un-recognize this pattern since it's probably different now.  */
5826           INSN_CODE (insn) = -1;
5827           gcse_create_count++;
5828         }
5829     }
5830 }
5831 \f
5832 /* Store motion code.  */
5833
5834 #define ANTIC_STORE_LIST(x)             ((x)->loads)
5835 #define AVAIL_STORE_LIST(x)             ((x)->stores)
5836 #define LAST_AVAIL_CHECK_FAILURE(x)     ((x)->reaching_reg)
5837
5838 /* This is used to communicate the target bitvector we want to use in the
5839    reg_set_info routine when called via the note_stores mechanism.  */
5840 static int * regvec;
5841
5842 /* And current insn, for the same routine.  */
5843 static rtx compute_store_table_current_insn;
5844
5845 /* Used in computing the reverse edge graph bit vectors.  */
5846 static sbitmap * st_antloc;
5847
5848 /* Global holding the number of store expressions we are dealing with.  */
5849 static int num_stores;
5850
5851 /* Checks to set if we need to mark a register set.  Called from
5852    note_stores.  */
5853
5854 static void
5855 reg_set_info (rtx dest, rtx setter ATTRIBUTE_UNUSED,
5856               void *data)
5857 {
5858   sbitmap bb_reg = data;
5859
5860   if (GET_CODE (dest) == SUBREG)
5861     dest = SUBREG_REG (dest);
5862
5863   if (GET_CODE (dest) == REG)
5864     {
5865       regvec[REGNO (dest)] = INSN_UID (compute_store_table_current_insn);
5866       if (bb_reg)
5867         SET_BIT (bb_reg, REGNO (dest));
5868     }
5869 }
5870
5871 /* Clear any mark that says that this insn sets dest.  Called from
5872    note_stores.  */
5873
5874 static void
5875 reg_clear_last_set (rtx dest, rtx setter ATTRIBUTE_UNUSED,
5876               void *data)
5877 {
5878   int *dead_vec = data;
5879
5880   if (GET_CODE (dest) == SUBREG)
5881     dest = SUBREG_REG (dest);
5882
5883   if (GET_CODE (dest) == REG &&
5884       dead_vec[REGNO (dest)] == INSN_UID (compute_store_table_current_insn))
5885     dead_vec[REGNO (dest)] = 0;
5886 }
5887
5888 /* Return zero if some of the registers in list X are killed
5889    due to set of registers in bitmap REGS_SET.  */
5890
5891 static bool
5892 store_ops_ok (rtx x, int *regs_set)
5893 {
5894   rtx reg;
5895
5896   for (; x; x = XEXP (x, 1))
5897     {
5898       reg = XEXP (x, 0);
5899       if (regs_set[REGNO(reg)])
5900         return false;
5901     }
5902
5903   return true;
5904 }
5905
5906 /* Returns a list of registers mentioned in X.  */
5907 static rtx
5908 extract_mentioned_regs (rtx x)
5909 {
5910   return extract_mentioned_regs_helper (x, NULL_RTX);
5911 }
5912
5913 /* Helper for extract_mentioned_regs; ACCUM is used to accumulate used
5914    registers.  */
5915 static rtx
5916 extract_mentioned_regs_helper (rtx x, rtx accum)
5917 {
5918   int i;
5919   enum rtx_code code;
5920   const char * fmt;
5921
5922   /* Repeat is used to turn tail-recursion into iteration.  */
5923  repeat:
5924
5925   if (x == 0)
5926     return accum;
5927
5928   code = GET_CODE (x);
5929   switch (code)
5930     {
5931     case REG:
5932       return alloc_EXPR_LIST (0, x, accum);
5933
5934     case MEM:
5935       x = XEXP (x, 0);
5936       goto repeat;
5937
5938     case PRE_DEC:
5939     case PRE_INC:
5940     case POST_DEC:
5941     case POST_INC:
5942       /* We do not run this function with arguments having side effects.  */
5943       abort ();
5944
5945     case PC:
5946     case CC0: /*FIXME*/
5947     case CONST:
5948     case CONST_INT:
5949     case CONST_DOUBLE:
5950     case CONST_VECTOR:
5951     case SYMBOL_REF:
5952     case LABEL_REF:
5953     case ADDR_VEC:
5954     case ADDR_DIFF_VEC:
5955       return accum;
5956
5957     default:
5958       break;
5959     }
5960
5961   i = GET_RTX_LENGTH (code) - 1;
5962   fmt = GET_RTX_FORMAT (code);
5963
5964   for (; i >= 0; i--)
5965     {
5966       if (fmt[i] == 'e')
5967         {
5968           rtx tem = XEXP (x, i);
5969
5970           /* If we are about to do the last recursive call
5971              needed at this level, change it into iteration.  */
5972           if (i == 0)
5973             {
5974               x = tem;
5975               goto repeat;
5976             }
5977
5978           accum = extract_mentioned_regs_helper (tem, accum);
5979         }
5980       else if (fmt[i] == 'E')
5981         {
5982           int j;
5983
5984           for (j = 0; j < XVECLEN (x, i); j++)
5985             accum = extract_mentioned_regs_helper (XVECEXP (x, i, j), accum);
5986         }
5987     }
5988
5989   return accum;
5990 }
5991
5992 /* Determine whether INSN is MEM store pattern that we will consider moving.
5993    REGS_SET_BEFORE is bitmap of registers set before (and including) the
5994    current insn, REGS_SET_AFTER is bitmap of registers set after (and
5995    including) the insn in this basic block.  We must be passing through BB from
5996    head to end, as we are using this fact to speed things up.
5997
5998    The results are stored this way:
5999
6000    -- the first anticipatable expression is added into ANTIC_STORE_LIST
6001    -- if the processed expression is not anticipatable, NULL_RTX is added
6002       there instead, so that we can use it as indicator that no further
6003       expression of this type may be anticipatable
6004    -- if the expression is available, it is added as head of AVAIL_STORE_LIST;
6005       consequently, all of them but this head are dead and may be deleted.
6006    -- if the expression is not available, the insn due to that it fails to be
6007       available is stored in reaching_reg.
6008
6009    The things are complicated a bit by fact that there already may be stores
6010    to the same MEM from other blocks; also caller must take care of the
6011    necessary cleanup of the temporary markers after end of the basic block.
6012    */
6013
6014 static void
6015 find_moveable_store (rtx insn, int *regs_set_before, int *regs_set_after)
6016 {
6017   struct ls_expr * ptr;
6018   rtx dest, set, tmp;
6019   int check_anticipatable, check_available;
6020   basic_block bb = BLOCK_FOR_INSN (insn);
6021
6022   set = single_set (insn);
6023   if (!set)
6024     return;
6025
6026   dest = SET_DEST (set);
6027
6028   if (GET_CODE (dest) != MEM || MEM_VOLATILE_P (dest)
6029       || GET_MODE (dest) == BLKmode)
6030     return;
6031
6032   if (side_effects_p (dest))
6033     return;
6034
6035   /* If we are handling exceptions, we must be careful with memory references
6036      that may trap. If we are not, the behavior is undefined, so we may just
6037      continue.  */
6038   if (flag_non_call_exceptions && may_trap_p (dest))
6039     return;
6040
6041   /* Even if the destination cannot trap, the source may.  In this case we'd
6042      need to handle updating the REG_EH_REGION note.  */
6043   if (find_reg_note (insn, REG_EH_REGION, NULL_RTX))
6044     return;
6045
6046   ptr = ldst_entry (dest);
6047   if (!ptr->pattern_regs)
6048     ptr->pattern_regs = extract_mentioned_regs (dest);
6049
6050   /* Do not check for anticipatability if we either found one anticipatable
6051      store already, or tested for one and found out that it was killed.  */
6052   check_anticipatable = 0;
6053   if (!ANTIC_STORE_LIST (ptr))
6054     check_anticipatable = 1;
6055   else
6056     {
6057       tmp = XEXP (ANTIC_STORE_LIST (ptr), 0);
6058       if (tmp != NULL_RTX
6059           && BLOCK_FOR_INSN (tmp) != bb)
6060         check_anticipatable = 1;
6061     }
6062   if (check_anticipatable)
6063     {
6064       if (store_killed_before (dest, ptr->pattern_regs, insn, bb, regs_set_before))
6065         tmp = NULL_RTX;
6066       else
6067         tmp = insn;
6068       ANTIC_STORE_LIST (ptr) = alloc_INSN_LIST (tmp,
6069                                                 ANTIC_STORE_LIST (ptr));
6070     }
6071
6072   /* It is not necessary to check whether store is available if we did
6073      it successfully before; if we failed before, do not bother to check
6074      until we reach the insn that caused us to fail.  */
6075   check_available = 0;
6076   if (!AVAIL_STORE_LIST (ptr))
6077     check_available = 1;
6078   else
6079     {
6080       tmp = XEXP (AVAIL_STORE_LIST (ptr), 0);
6081       if (BLOCK_FOR_INSN (tmp) != bb)
6082         check_available = 1;
6083     }
6084   if (check_available)
6085     {
6086       /* Check that we have already reached the insn at that the check
6087          failed last time.  */
6088       if (LAST_AVAIL_CHECK_FAILURE (ptr))
6089         {
6090           for (tmp = BB_END (bb);
6091                tmp != insn && tmp != LAST_AVAIL_CHECK_FAILURE (ptr);
6092                tmp = PREV_INSN (tmp))
6093             continue;
6094           if (tmp == insn)
6095             check_available = 0;
6096         }
6097       else
6098         check_available = store_killed_after (dest, ptr->pattern_regs, insn,
6099                                               bb, regs_set_after,
6100                                               &LAST_AVAIL_CHECK_FAILURE (ptr));
6101     }
6102   if (!check_available)
6103     AVAIL_STORE_LIST (ptr) = alloc_INSN_LIST (insn, AVAIL_STORE_LIST (ptr));
6104 }
6105
6106 /* Find available and anticipatable stores.  */
6107
6108 static int
6109 compute_store_table (void)
6110 {
6111   int ret;
6112   basic_block bb;
6113   unsigned regno;
6114   rtx insn, pat, tmp;
6115   int *last_set_in, *already_set;
6116   struct ls_expr * ptr, **prev_next_ptr_ptr;
6117
6118   max_gcse_regno = max_reg_num ();
6119
6120   reg_set_in_block = sbitmap_vector_alloc (last_basic_block,
6121                                                        max_gcse_regno);
6122   sbitmap_vector_zero (reg_set_in_block, last_basic_block);
6123   pre_ldst_mems = 0;
6124   last_set_in = xcalloc (max_gcse_regno, sizeof (int));
6125   already_set = xmalloc (sizeof (int) * max_gcse_regno);
6126
6127   /* Find all the stores we care about.  */
6128   FOR_EACH_BB (bb)
6129     {
6130       /* First compute the registers set in this block.  */
6131       regvec = last_set_in;
6132
6133       for (insn = BB_HEAD (bb);
6134            insn != NEXT_INSN (BB_END (bb));
6135            insn = NEXT_INSN (insn))
6136         {
6137           if (! INSN_P (insn))
6138             continue;
6139
6140           if (GET_CODE (insn) == CALL_INSN)
6141             {
6142               bool clobbers_all = false;
6143 #ifdef NON_SAVING_SETJMP
6144               if (NON_SAVING_SETJMP
6145                   && find_reg_note (insn, REG_SETJMP, NULL_RTX))
6146                 clobbers_all = true;
6147 #endif
6148
6149               for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
6150                 if (clobbers_all
6151                     || TEST_HARD_REG_BIT (regs_invalidated_by_call, regno))
6152                   {
6153                     last_set_in[regno] = INSN_UID (insn);
6154                     SET_BIT (reg_set_in_block[bb->index], regno);
6155                   }
6156             }
6157
6158           pat = PATTERN (insn);
6159           compute_store_table_current_insn = insn;
6160           note_stores (pat, reg_set_info, reg_set_in_block[bb->index]);
6161         }
6162
6163       /* Now find the stores.  */
6164       memset (already_set, 0, sizeof (int) * max_gcse_regno);
6165       regvec = already_set;
6166       for (insn = BB_HEAD (bb);
6167            insn != NEXT_INSN (BB_END (bb));
6168            insn = NEXT_INSN (insn))
6169         {
6170           if (! INSN_P (insn))
6171             continue;
6172
6173           if (GET_CODE (insn) == CALL_INSN)
6174             {
6175               bool clobbers_all = false;
6176 #ifdef NON_SAVING_SETJMP
6177               if (NON_SAVING_SETJMP
6178                   && find_reg_note (insn, REG_SETJMP, NULL_RTX))
6179                 clobbers_all = true;
6180 #endif
6181
6182               for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
6183                 if (clobbers_all
6184                     || TEST_HARD_REG_BIT (regs_invalidated_by_call, regno))
6185                   already_set[regno] = 1;
6186             }
6187
6188           pat = PATTERN (insn);
6189           note_stores (pat, reg_set_info, NULL);
6190
6191           /* Now that we've marked regs, look for stores.  */
6192           find_moveable_store (insn, already_set, last_set_in);
6193
6194           /* Unmark regs that are no longer set.  */
6195           compute_store_table_current_insn = insn;
6196           note_stores (pat, reg_clear_last_set, last_set_in);
6197           if (GET_CODE (insn) == CALL_INSN)
6198             {
6199               bool clobbers_all = false;
6200 #ifdef NON_SAVING_SETJMP
6201               if (NON_SAVING_SETJMP
6202                   && find_reg_note (insn, REG_SETJMP, NULL_RTX))
6203                 clobbers_all = true;
6204 #endif
6205
6206               for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
6207                 if ((clobbers_all
6208                      || TEST_HARD_REG_BIT (regs_invalidated_by_call, regno))
6209                     && last_set_in[regno] == INSN_UID (insn))
6210                   last_set_in[regno] = 0;
6211             }
6212         }
6213
6214 #ifdef ENABLE_CHECKING
6215       /* last_set_in should now be all-zero.  */
6216       for (regno = 0; regno < max_gcse_regno; regno++)
6217         if (last_set_in[regno] != 0)
6218           abort ();
6219 #endif
6220
6221       /* Clear temporary marks.  */
6222       for (ptr = first_ls_expr (); ptr != NULL; ptr = next_ls_expr (ptr))
6223         {
6224           LAST_AVAIL_CHECK_FAILURE(ptr) = NULL_RTX;
6225           if (ANTIC_STORE_LIST (ptr)
6226               && (tmp = XEXP (ANTIC_STORE_LIST (ptr), 0)) == NULL_RTX)
6227             ANTIC_STORE_LIST (ptr) = XEXP (ANTIC_STORE_LIST (ptr), 1);
6228         }
6229     }
6230
6231   /* Remove the stores that are not available anywhere, as there will
6232      be no opportunity to optimize them.  */
6233   for (ptr = pre_ldst_mems, prev_next_ptr_ptr = &pre_ldst_mems;
6234        ptr != NULL;
6235        ptr = *prev_next_ptr_ptr)
6236     {
6237       if (!AVAIL_STORE_LIST (ptr))
6238         {
6239           *prev_next_ptr_ptr = ptr->next;
6240           free_ldst_entry (ptr);
6241         }
6242       else
6243         prev_next_ptr_ptr = &ptr->next;
6244     }
6245
6246   ret = enumerate_ldsts ();
6247
6248   if (gcse_file)
6249     {
6250       fprintf (gcse_file, "ST_avail and ST_antic (shown under loads..)\n");
6251       print_ldst_list (gcse_file);
6252     }
6253
6254   free (last_set_in);
6255   free (already_set);
6256   return ret;
6257 }
6258
6259 /* Check to see if the load X is aliased with STORE_PATTERN.
6260    AFTER is true if we are checking the case when STORE_PATTERN occurs
6261    after the X.  */
6262
6263 static bool
6264 load_kills_store (rtx x, rtx store_pattern, int after)
6265 {
6266   if (after)
6267     return anti_dependence (x, store_pattern);
6268   else
6269     return true_dependence (store_pattern, GET_MODE (store_pattern), x,
6270                             rtx_addr_varies_p);
6271 }
6272
6273 /* Go through the entire insn X, looking for any loads which might alias
6274    STORE_PATTERN.  Return true if found.
6275    AFTER is true if we are checking the case when STORE_PATTERN occurs
6276    after the insn X.  */
6277
6278 static bool
6279 find_loads (rtx x, rtx store_pattern, int after)
6280 {
6281   const char * fmt;
6282   int i, j;
6283   int ret = false;
6284
6285   if (!x)
6286     return false;
6287
6288   if (GET_CODE (x) == SET)
6289     x = SET_SRC (x);
6290
6291   if (GET_CODE (x) == MEM)
6292     {
6293       if (load_kills_store (x, store_pattern, after))
6294         return true;
6295     }
6296
6297   /* Recursively process the insn.  */
6298   fmt = GET_RTX_FORMAT (GET_CODE (x));
6299
6300   for (i = GET_RTX_LENGTH (GET_CODE (x)) - 1; i >= 0 && !ret; i--)
6301     {
6302       if (fmt[i] == 'e')
6303         ret |= find_loads (XEXP (x, i), store_pattern, after);
6304       else if (fmt[i] == 'E')
6305         for (j = XVECLEN (x, i) - 1; j >= 0; j--)
6306           ret |= find_loads (XVECEXP (x, i, j), store_pattern, after);
6307     }
6308   return ret;
6309 }
6310
6311 /* Check if INSN kills the store pattern X (is aliased with it).
6312    AFTER is true if we are checking the case when store X occurs
6313    after the insn.  Return true if it it does.  */
6314
6315 static bool
6316 store_killed_in_insn (rtx x, rtx x_regs, rtx insn, int after)
6317 {
6318   rtx reg, base, note;
6319
6320   if (!INSN_P (insn))
6321     return false;
6322
6323   if (GET_CODE (insn) == CALL_INSN)
6324     {
6325       /* A normal or pure call might read from pattern,
6326          but a const call will not.  */
6327       if (! CONST_OR_PURE_CALL_P (insn) || pure_call_p (insn))
6328         return true;
6329
6330       /* But even a const call reads its parameters.  Check whether the
6331          base of some of registers used in mem is stack pointer.  */
6332       for (reg = x_regs; reg; reg = XEXP (reg, 1))
6333         {
6334           base = find_base_term (XEXP (reg, 0));
6335           if (!base
6336               || (GET_CODE (base) == ADDRESS
6337                   && GET_MODE (base) == Pmode
6338                   && XEXP (base, 0) == stack_pointer_rtx))
6339             return true;
6340         }
6341
6342       return false;
6343     }
6344
6345   if (GET_CODE (PATTERN (insn)) == SET)
6346     {
6347       rtx pat = PATTERN (insn);
6348       rtx dest = SET_DEST (pat);
6349
6350       if (GET_CODE (dest) == SIGN_EXTRACT
6351           || GET_CODE (dest) == ZERO_EXTRACT)
6352         dest = XEXP (dest, 0);
6353
6354       /* Check for memory stores to aliased objects.  */
6355       if (GET_CODE (dest) == MEM
6356           && !expr_equiv_p (dest, x))
6357         {
6358           if (after)
6359             {
6360               if (output_dependence (dest, x))
6361                 return true;
6362             }
6363           else
6364             {
6365               if (output_dependence (x, dest))
6366                 return true;
6367             }
6368         }
6369       if (find_loads (SET_SRC (pat), x, after))
6370         return true;
6371     }
6372   else if (find_loads (PATTERN (insn), x, after))
6373     return true;
6374
6375   /* If this insn has a REG_EQUAL or REG_EQUIV note referencing a memory
6376      location aliased with X, then this insn kills X.  */
6377   note = find_reg_equal_equiv_note (insn);
6378   if (! note)
6379     return false;
6380   note = XEXP (note, 0);
6381
6382   /* However, if the note represents a must alias rather than a may
6383      alias relationship, then it does not kill X.  */
6384   if (expr_equiv_p (note, x))
6385     return false;
6386
6387   /* See if there are any aliased loads in the note.  */
6388   return find_loads (note, x, after);
6389 }
6390
6391 /* Returns true if the expression X is loaded or clobbered on or after INSN
6392    within basic block BB.  REGS_SET_AFTER is bitmap of registers set in
6393    or after the insn.  X_REGS is list of registers mentioned in X. If the store
6394    is killed, return the last insn in that it occurs in FAIL_INSN.  */
6395
6396 static bool
6397 store_killed_after (rtx x, rtx x_regs, rtx insn, basic_block bb,
6398                     int *regs_set_after, rtx *fail_insn)
6399 {
6400   rtx last = BB_END (bb), act;
6401
6402   if (!store_ops_ok (x_regs, regs_set_after))
6403     {
6404       /* We do not know where it will happen.  */
6405       if (fail_insn)
6406         *fail_insn = NULL_RTX;
6407       return true;
6408     }
6409
6410   /* Scan from the end, so that fail_insn is determined correctly.  */
6411   for (act = last; act != PREV_INSN (insn); act = PREV_INSN (act))
6412     if (store_killed_in_insn (x, x_regs, act, false))
6413       {
6414         if (fail_insn)
6415           *fail_insn = act;
6416         return true;
6417       }
6418
6419   return false;
6420 }
6421
6422 /* Returns true if the expression X is loaded or clobbered on or before INSN
6423    within basic block BB. X_REGS is list of registers mentioned in X.
6424    REGS_SET_BEFORE is bitmap of registers set before or in this insn.  */
6425 static bool
6426 store_killed_before (rtx x, rtx x_regs, rtx insn, basic_block bb,
6427                      int *regs_set_before)
6428 {
6429   rtx first = BB_HEAD (bb);
6430
6431   if (!store_ops_ok (x_regs, regs_set_before))
6432     return true;
6433
6434   for ( ; insn != PREV_INSN (first); insn = PREV_INSN (insn))
6435     if (store_killed_in_insn (x, x_regs, insn, true))
6436       return true;
6437
6438   return false;
6439 }
6440
6441 /* Fill in available, anticipatable, transparent and kill vectors in
6442    STORE_DATA, based on lists of available and anticipatable stores.  */
6443 static void
6444 build_store_vectors (void)
6445 {
6446   basic_block bb;
6447   int *regs_set_in_block;
6448   rtx insn, st;
6449   struct ls_expr * ptr;
6450   unsigned regno;
6451
6452   /* Build the gen_vector. This is any store in the table which is not killed
6453      by aliasing later in its block.  */
6454   ae_gen = sbitmap_vector_alloc (last_basic_block, num_stores);
6455   sbitmap_vector_zero (ae_gen, last_basic_block);
6456
6457   st_antloc = sbitmap_vector_alloc (last_basic_block, num_stores);
6458   sbitmap_vector_zero (st_antloc, last_basic_block);
6459
6460   for (ptr = first_ls_expr (); ptr != NULL; ptr = next_ls_expr (ptr))
6461     {
6462       for (st = AVAIL_STORE_LIST (ptr); st != NULL; st = XEXP (st, 1))
6463         {
6464           insn = XEXP (st, 0);
6465           bb = BLOCK_FOR_INSN (insn);
6466
6467           /* If we've already seen an available expression in this block,
6468              we can delete this one (It occurs earlier in the block). We'll
6469              copy the SRC expression to an unused register in case there
6470              are any side effects.  */
6471           if (TEST_BIT (ae_gen[bb->index], ptr->index))
6472             {
6473               rtx r = gen_reg_rtx (GET_MODE (ptr->pattern));
6474               if (gcse_file)
6475                 fprintf (gcse_file, "Removing redundant store:\n");
6476               replace_store_insn (r, XEXP (st, 0), bb, ptr);
6477               continue;
6478             }
6479           SET_BIT (ae_gen[bb->index], ptr->index);
6480         }
6481
6482       for (st = ANTIC_STORE_LIST (ptr); st != NULL; st = XEXP (st, 1))
6483         {
6484           insn = XEXP (st, 0);
6485           bb = BLOCK_FOR_INSN (insn);
6486           SET_BIT (st_antloc[bb->index], ptr->index);
6487         }
6488     }
6489
6490   ae_kill = sbitmap_vector_alloc (last_basic_block, num_stores);
6491   sbitmap_vector_zero (ae_kill, last_basic_block);
6492
6493   transp = sbitmap_vector_alloc (last_basic_block, num_stores);
6494   sbitmap_vector_zero (transp, last_basic_block);
6495   regs_set_in_block = xmalloc (sizeof (int) * max_gcse_regno);
6496
6497   FOR_EACH_BB (bb)
6498     {
6499       for (regno = 0; regno < max_gcse_regno; regno++)
6500         regs_set_in_block[regno] = TEST_BIT (reg_set_in_block[bb->index], regno);
6501
6502       for (ptr = first_ls_expr (); ptr != NULL; ptr = next_ls_expr (ptr))
6503         {
6504           if (store_killed_after (ptr->pattern, ptr->pattern_regs, BB_HEAD (bb),
6505                                   bb, regs_set_in_block, NULL))
6506             {
6507               /* It should not be necessary to consider the expression
6508                  killed if it is both anticipatable and available.  */
6509               if (!TEST_BIT (st_antloc[bb->index], ptr->index)
6510                   || !TEST_BIT (ae_gen[bb->index], ptr->index))
6511                 SET_BIT (ae_kill[bb->index], ptr->index);
6512             }
6513           else
6514             SET_BIT (transp[bb->index], ptr->index);
6515         }
6516     }
6517
6518   free (regs_set_in_block);
6519
6520   if (gcse_file)
6521     {
6522       dump_sbitmap_vector (gcse_file, "st_antloc", "", st_antloc, last_basic_block);
6523       dump_sbitmap_vector (gcse_file, "st_kill", "", ae_kill, last_basic_block);
6524       dump_sbitmap_vector (gcse_file, "Transpt", "", transp, last_basic_block);
6525       dump_sbitmap_vector (gcse_file, "st_avloc", "", ae_gen, last_basic_block);
6526     }
6527 }
6528
6529 /* Insert an instruction at the beginning of a basic block, and update
6530    the BB_HEAD if needed.  */
6531
6532 static void
6533 insert_insn_start_bb (rtx insn, basic_block bb)
6534 {
6535   /* Insert at start of successor block.  */
6536   rtx prev = PREV_INSN (BB_HEAD (bb));
6537   rtx before = BB_HEAD (bb);
6538   while (before != 0)
6539     {
6540       if (GET_CODE (before) != CODE_LABEL
6541           && (GET_CODE (before) != NOTE
6542               || NOTE_LINE_NUMBER (before) != NOTE_INSN_BASIC_BLOCK))
6543         break;
6544       prev = before;
6545       if (prev == BB_END (bb))
6546         break;
6547       before = NEXT_INSN (before);
6548     }
6549
6550   insn = emit_insn_after (insn, prev);
6551
6552   if (gcse_file)
6553     {
6554       fprintf (gcse_file, "STORE_MOTION  insert store at start of BB %d:\n",
6555                bb->index);
6556       print_inline_rtx (gcse_file, insn, 6);
6557       fprintf (gcse_file, "\n");
6558     }
6559 }
6560
6561 /* This routine will insert a store on an edge. EXPR is the ldst entry for
6562    the memory reference, and E is the edge to insert it on.  Returns nonzero
6563    if an edge insertion was performed.  */
6564
6565 static int
6566 insert_store (struct ls_expr * expr, edge e)
6567 {
6568   rtx reg, insn;
6569   basic_block bb;
6570   edge tmp;
6571
6572   /* We did all the deleted before this insert, so if we didn't delete a
6573      store, then we haven't set the reaching reg yet either.  */
6574   if (expr->reaching_reg == NULL_RTX)
6575     return 0;
6576
6577   if (e->flags & EDGE_FAKE)
6578     return 0;
6579
6580   reg = expr->reaching_reg;
6581   insn = gen_move_insn (copy_rtx (expr->pattern), reg);
6582
6583   /* If we are inserting this expression on ALL predecessor edges of a BB,
6584      insert it at the start of the BB, and reset the insert bits on the other
6585      edges so we don't try to insert it on the other edges.  */
6586   bb = e->dest;
6587   for (tmp = e->dest->pred; tmp ; tmp = tmp->pred_next)
6588     if (!(tmp->flags & EDGE_FAKE))
6589       {
6590         int index = EDGE_INDEX (edge_list, tmp->src, tmp->dest);
6591         if (index == EDGE_INDEX_NO_EDGE)
6592           abort ();
6593         if (! TEST_BIT (pre_insert_map[index], expr->index))
6594           break;
6595       }
6596
6597   /* If tmp is NULL, we found an insertion on every edge, blank the
6598      insertion vector for these edges, and insert at the start of the BB.  */
6599   if (!tmp && bb != EXIT_BLOCK_PTR)
6600     {
6601       for (tmp = e->dest->pred; tmp ; tmp = tmp->pred_next)
6602         {
6603           int index = EDGE_INDEX (edge_list, tmp->src, tmp->dest);
6604           RESET_BIT (pre_insert_map[index], expr->index);
6605         }
6606       insert_insn_start_bb (insn, bb);
6607       return 0;
6608     }
6609
6610   /* We can't insert on this edge, so we'll insert at the head of the
6611      successors block.  See Morgan, sec 10.5.  */
6612   if ((e->flags & EDGE_ABNORMAL) == EDGE_ABNORMAL)
6613     {
6614       insert_insn_start_bb (insn, bb);
6615       return 0;
6616     }
6617
6618   insert_insn_on_edge (insn, e);
6619
6620   if (gcse_file)
6621     {
6622       fprintf (gcse_file, "STORE_MOTION  insert insn on edge (%d, %d):\n",
6623                e->src->index, e->dest->index);
6624       print_inline_rtx (gcse_file, insn, 6);
6625       fprintf (gcse_file, "\n");
6626     }
6627
6628   return 1;
6629 }
6630
6631 /* Remove any REG_EQUAL or REG_EQUIV notes containing a reference to the
6632    memory location in SMEXPR set in basic block BB.
6633
6634    This could be rather expensive.  */
6635
6636 static void
6637 remove_reachable_equiv_notes (basic_block bb, struct ls_expr *smexpr)
6638 {
6639   edge *stack = xmalloc (sizeof (edge) * n_basic_blocks), act;
6640   sbitmap visited = sbitmap_alloc (last_basic_block);
6641   int stack_top = 0;
6642   rtx last, insn, note;
6643   rtx mem = smexpr->pattern;
6644
6645   sbitmap_zero (visited);
6646   act = bb->succ;
6647
6648   while (1)
6649     {
6650       if (!act)
6651         {
6652           if (!stack_top)
6653             {
6654               free (stack);
6655               sbitmap_free (visited);
6656               return;
6657             }
6658           act = stack[--stack_top];
6659         }
6660       bb = act->dest;
6661       
6662       if (bb == EXIT_BLOCK_PTR
6663           || TEST_BIT (visited, bb->index))
6664         {
6665           act = act->succ_next;
6666           continue;
6667         }
6668       SET_BIT (visited, bb->index);
6669
6670       if (TEST_BIT (st_antloc[bb->index], smexpr->index))
6671         {
6672           for (last = ANTIC_STORE_LIST (smexpr);
6673                BLOCK_FOR_INSN (XEXP (last, 0)) != bb;
6674                last = XEXP (last, 1))
6675             continue;
6676           last = XEXP (last, 0);
6677         }
6678       else
6679         last = NEXT_INSN (BB_END (bb));
6680   
6681       for (insn = BB_HEAD (bb); insn != last; insn = NEXT_INSN (insn))
6682         if (INSN_P (insn))
6683           {
6684             note = find_reg_equal_equiv_note (insn);
6685             if (!note || !expr_equiv_p (XEXP (note, 0), mem))
6686               continue;
6687
6688             if (gcse_file)
6689               fprintf (gcse_file, "STORE_MOTION  drop REG_EQUAL note at insn %d:\n",
6690                        INSN_UID (insn));
6691             remove_note (insn, note);
6692           }
6693       act = act->succ_next;
6694       if (bb->succ)
6695         {
6696           if (act)
6697             stack[stack_top++] = act;
6698           act = bb->succ;
6699         }
6700     }
6701 }
6702
6703 /* This routine will replace a store with a SET to a specified register.  */
6704
6705 static void
6706 replace_store_insn (rtx reg, rtx del, basic_block bb, struct ls_expr *smexpr)
6707 {
6708   rtx insn, mem, note, set, ptr;
6709
6710   mem = smexpr->pattern;
6711   insn = gen_move_insn (reg, SET_SRC (single_set (del)));
6712   insn = emit_insn_after (insn, del);
6713
6714   if (gcse_file)
6715     {
6716       fprintf (gcse_file,
6717                "STORE_MOTION  delete insn in BB %d:\n      ", bb->index);
6718       print_inline_rtx (gcse_file, del, 6);
6719       fprintf (gcse_file, "\nSTORE MOTION  replaced with insn:\n      ");
6720       print_inline_rtx (gcse_file, insn, 6);
6721       fprintf (gcse_file, "\n");
6722     }
6723
6724   for (ptr = ANTIC_STORE_LIST (smexpr); ptr; ptr = XEXP (ptr, 1))
6725     if (XEXP (ptr, 0) == del)
6726       {
6727         XEXP (ptr, 0) = insn;
6728         break;
6729       }
6730   delete_insn (del);
6731
6732   /* Now we must handle REG_EQUAL notes whose contents is equal to the mem;
6733      they are no longer accurate provided that they are reached by this
6734      definition, so drop them.  */
6735   for (; insn != NEXT_INSN (BB_END (bb)); insn = NEXT_INSN (insn))
6736     if (INSN_P (insn))
6737       {
6738         set = single_set (insn);
6739         if (!set)
6740           continue;
6741         if (expr_equiv_p (SET_DEST (set), mem))
6742           return;
6743         note = find_reg_equal_equiv_note (insn);
6744         if (!note || !expr_equiv_p (XEXP (note, 0), mem))
6745           continue;
6746
6747         if (gcse_file)
6748           fprintf (gcse_file, "STORE_MOTION  drop REG_EQUAL note at insn %d:\n",
6749                    INSN_UID (insn));
6750         remove_note (insn, note);
6751       }
6752   remove_reachable_equiv_notes (bb, smexpr);
6753 }
6754
6755
6756 /* Delete a store, but copy the value that would have been stored into
6757    the reaching_reg for later storing.  */
6758
6759 static void
6760 delete_store (struct ls_expr * expr, basic_block bb)
6761 {
6762   rtx reg, i, del;
6763
6764   if (expr->reaching_reg == NULL_RTX)
6765     expr->reaching_reg = gen_reg_rtx (GET_MODE (expr->pattern));
6766
6767   reg = expr->reaching_reg;
6768
6769   for (i = AVAIL_STORE_LIST (expr); i; i = XEXP (i, 1))
6770     {
6771       del = XEXP (i, 0);
6772       if (BLOCK_FOR_INSN (del) == bb)
6773         {
6774           /* We know there is only one since we deleted redundant
6775              ones during the available computation.  */
6776           replace_store_insn (reg, del, bb, expr);
6777           break;
6778         }
6779     }
6780 }
6781
6782 /* Free memory used by store motion.  */
6783
6784 static void
6785 free_store_memory (void)
6786 {
6787   free_ldst_mems ();
6788
6789   if (ae_gen)
6790     sbitmap_vector_free (ae_gen);
6791   if (ae_kill)
6792     sbitmap_vector_free (ae_kill);
6793   if (transp)
6794     sbitmap_vector_free (transp);
6795   if (st_antloc)
6796     sbitmap_vector_free (st_antloc);
6797   if (pre_insert_map)
6798     sbitmap_vector_free (pre_insert_map);
6799   if (pre_delete_map)
6800     sbitmap_vector_free (pre_delete_map);
6801   if (reg_set_in_block)
6802     sbitmap_vector_free (reg_set_in_block);
6803
6804   ae_gen = ae_kill = transp = st_antloc = NULL;
6805   pre_insert_map = pre_delete_map = reg_set_in_block = NULL;
6806 }
6807
6808 /* Perform store motion. Much like gcse, except we move expressions the
6809    other way by looking at the flowgraph in reverse.  */
6810
6811 static void
6812 store_motion (void)
6813 {
6814   basic_block bb;
6815   int x;
6816   struct ls_expr * ptr;
6817   int update_flow = 0;
6818
6819   if (gcse_file)
6820     {
6821       fprintf (gcse_file, "before store motion\n");
6822       print_rtl (gcse_file, get_insns ());
6823     }
6824
6825   init_alias_analysis ();
6826
6827   /* Find all the available and anticipatable stores.  */
6828   num_stores = compute_store_table ();
6829   if (num_stores == 0)
6830     {
6831       sbitmap_vector_free (reg_set_in_block);
6832       end_alias_analysis ();
6833       return;
6834     }
6835
6836   /* Now compute kill & transp vectors.  */
6837   build_store_vectors ();
6838   add_noreturn_fake_exit_edges ();
6839   connect_infinite_loops_to_exit ();
6840
6841   edge_list = pre_edge_rev_lcm (gcse_file, num_stores, transp, ae_gen,
6842                                 st_antloc, ae_kill, &pre_insert_map,
6843                                 &pre_delete_map);
6844
6845   /* Now we want to insert the new stores which are going to be needed.  */
6846   for (ptr = first_ls_expr (); ptr != NULL; ptr = next_ls_expr (ptr))
6847     {
6848       FOR_EACH_BB (bb)
6849         if (TEST_BIT (pre_delete_map[bb->index], ptr->index))
6850           delete_store (ptr, bb);
6851
6852       for (x = 0; x < NUM_EDGES (edge_list); x++)
6853         if (TEST_BIT (pre_insert_map[x], ptr->index))
6854           update_flow |= insert_store (ptr, INDEX_EDGE (edge_list, x));
6855     }
6856
6857   if (update_flow)
6858     commit_edge_insertions ();
6859
6860   free_store_memory ();
6861   free_edge_list (edge_list);
6862   remove_fake_edges ();
6863   end_alias_analysis ();
6864 }
6865
6866 \f
6867 /* Entry point for jump bypassing optimization pass.  */
6868
6869 int
6870 bypass_jumps (FILE *file)
6871 {
6872   int changed;
6873
6874   /* We do not construct an accurate cfg in functions which call
6875      setjmp, so just punt to be safe.  */
6876   if (current_function_calls_setjmp)
6877     return 0;
6878
6879   /* For calling dump_foo fns from gdb.  */
6880   debug_stderr = stderr;
6881   gcse_file = file;
6882
6883   /* Identify the basic block information for this function, including
6884      successors and predecessors.  */
6885   max_gcse_regno = max_reg_num ();
6886
6887   if (file)
6888     dump_flow_info (file);
6889
6890   /* Return if there's nothing to do, or it is too expensive.  */
6891   if (n_basic_blocks <= 1 || is_too_expensive (_ ("jump bypassing disabled")))
6892     return 0;
6893
6894   gcc_obstack_init (&gcse_obstack);
6895   bytes_used = 0;
6896
6897   /* We need alias.  */
6898   init_alias_analysis ();
6899
6900   /* Record where pseudo-registers are set.  This data is kept accurate
6901      during each pass.  ??? We could also record hard-reg information here
6902      [since it's unchanging], however it is currently done during hash table
6903      computation.
6904
6905      It may be tempting to compute MEM set information here too, but MEM sets
6906      will be subject to code motion one day and thus we need to compute
6907      information about memory sets when we build the hash tables.  */
6908
6909   alloc_reg_set_mem (max_gcse_regno);
6910   compute_sets (get_insns ());
6911
6912   max_gcse_regno = max_reg_num ();
6913   alloc_gcse_mem (get_insns ());
6914   changed = one_cprop_pass (1, 1, 1);
6915   free_gcse_mem ();
6916
6917   if (file)
6918     {
6919       fprintf (file, "BYPASS of %s: %d basic blocks, ",
6920                current_function_name (), n_basic_blocks);
6921       fprintf (file, "%d bytes\n\n", bytes_used);
6922     }
6923
6924   obstack_free (&gcse_obstack, NULL);
6925   free_reg_set_mem ();
6926
6927   /* We are finished with alias.  */
6928   end_alias_analysis ();
6929   allocate_reg_info (max_reg_num (), FALSE, FALSE);
6930
6931   return changed;
6932 }
6933
6934 /* Return true if the graph is too expensive to optimize. PASS is the
6935    optimization about to be performed.  */
6936
6937 static bool
6938 is_too_expensive (const char *pass)
6939 {
6940   /* Trying to perform global optimizations on flow graphs which have
6941      a high connectivity will take a long time and is unlikely to be
6942      particularly useful.
6943      
6944      In normal circumstances a cfg should have about twice as many
6945      edges as blocks.  But we do not want to punish small functions
6946      which have a couple switch statements.  Rather than simply
6947      threshold the number of blocks, uses something with a more
6948      graceful degradation.  */
6949   if (n_edges > 20000 + n_basic_blocks * 4)
6950     {
6951       if (warn_disabled_optimization)
6952         warning ("%s: %d basic blocks and %d edges/basic block",
6953                  pass, n_basic_blocks, n_edges / n_basic_blocks);
6954       
6955       return true;
6956     }
6957
6958   /* If allocating memory for the cprop bitmap would take up too much
6959      storage it's better just to disable the optimization.  */
6960   if ((n_basic_blocks
6961        * SBITMAP_SET_SIZE (max_reg_num ())
6962        * sizeof (SBITMAP_ELT_TYPE)) > MAX_GCSE_MEMORY)
6963     {
6964       if (warn_disabled_optimization)
6965         warning ("%s: %d basic blocks and %d registers",
6966                  pass, n_basic_blocks, max_reg_num ());
6967
6968       return true;
6969     }
6970
6971   return false;
6972 }
6973
6974 /* The following code implements gcse after reload, the purpose of this
6975    pass is to cleanup redundant loads generated by reload and other
6976    optimizations that come after gcse. It searches for simple inter-block
6977    redundancies and tries to eliminate them by adding moves and loads
6978    in cold places.  */
6979
6980 /* The following structure holds the information about the occurrences of
6981    the redundant instructions.  */
6982 struct unoccr
6983 {
6984   struct unoccr *next;
6985   edge pred;
6986   rtx insn;
6987 };
6988
6989 static bool reg_used_on_edge (rtx, edge);
6990 static rtx reg_set_between_after_reload_p (rtx, rtx, rtx);
6991 static rtx reg_used_between_after_reload_p (rtx, rtx, rtx);
6992 static rtx get_avail_load_store_reg (rtx);
6993 static bool is_jump_table_basic_block (basic_block);
6994 static bool bb_has_well_behaved_predecessors (basic_block);
6995 static struct occr* get_bb_avail_insn (basic_block, struct occr *);
6996 static void hash_scan_set_after_reload (rtx, rtx, struct hash_table *);
6997 static void compute_hash_table_after_reload (struct hash_table *);
6998 static void eliminate_partially_redundant_loads (basic_block,
6999                                                 rtx,
7000                                                 struct expr *);
7001 static void gcse_after_reload (void);
7002 static struct occr* get_bb_avail_insn (basic_block, struct occr *);
7003 void gcse_after_reload_main (rtx, FILE *);
7004
7005
7006 /* Check if register REG is used in any insn waiting to be inserted on E.
7007    Assumes no such insn can be a CALL_INSN; if so call reg_used_between_p
7008    with PREV(insn),NEXT(insn) instead of calling
7009    reg_overlap_mentioned_p.  */
7010
7011 static bool
7012 reg_used_on_edge (rtx reg, edge e)
7013 {
7014   rtx insn;
7015
7016   for (insn = e->insns.r; insn; insn = NEXT_INSN (insn))
7017     if (INSN_P (insn) && reg_overlap_mentioned_p (reg, PATTERN (insn)))
7018       return true;
7019
7020   return false;
7021 }
7022
7023 /* Return the insn that sets register REG or clobbers it in between
7024    FROM_INSN and TO_INSN (exclusive of those two).
7025    Just like reg_set_between but for hard registers and not pseudos.  */
7026
7027 static rtx
7028 reg_set_between_after_reload_p (rtx reg, rtx from_insn, rtx to_insn)
7029 {
7030   rtx insn;
7031   int regno;
7032
7033   if (GET_CODE (reg) != REG)
7034     abort ();
7035   regno = REGNO (reg);
7036
7037   /* We are called after register allocation.  */
7038   if (regno >= FIRST_PSEUDO_REGISTER)
7039     abort ();
7040
7041   if (from_insn == to_insn)
7042     return NULL_RTX;
7043
7044   for (insn = NEXT_INSN (from_insn);
7045        insn != to_insn;
7046        insn = NEXT_INSN (insn))
7047     {
7048       if (INSN_P (insn))
7049         {
7050           if (FIND_REG_INC_NOTE (insn, reg)
7051               || (GET_CODE (insn) == CALL_INSN
7052                   && call_used_regs[regno])
7053               || find_reg_fusage (insn, CLOBBER, reg))
7054             return insn;
7055         }
7056       if (set_of (reg, insn) != NULL_RTX)
7057         return insn;
7058     }
7059   return NULL_RTX;
7060 }
7061
7062 /* Return the insn that uses register REG in between FROM_INSN and TO_INSN
7063    (exclusive of those two). Similar to reg_used_between but for hard
7064    registers and not pseudos.  */
7065
7066 static rtx
7067 reg_used_between_after_reload_p (rtx reg, rtx from_insn, rtx to_insn)
7068 {
7069   rtx insn;
7070   int regno;
7071
7072   if (GET_CODE (reg) != REG)
7073     return to_insn;
7074   regno = REGNO (reg);
7075
7076   /* We are called after register allocation.  */
7077   if (regno >= FIRST_PSEUDO_REGISTER)
7078     abort ();
7079   if (from_insn == to_insn)
7080     return NULL_RTX;
7081
7082   for (insn = NEXT_INSN (from_insn);
7083        insn != to_insn;
7084        insn = NEXT_INSN (insn))
7085     if (INSN_P (insn)
7086         && (reg_overlap_mentioned_p (reg, PATTERN (insn))
7087             || (GET_CODE (insn) == CALL_INSN
7088                 && call_used_regs[regno])
7089             || find_reg_fusage (insn, USE, reg)
7090             || find_reg_fusage (insn, CLOBBER, reg)))
7091       return insn;
7092   return NULL_RTX;
7093 }
7094
7095 /* Return the loaded/stored register of a load/store instruction.  */
7096
7097 static rtx
7098 get_avail_load_store_reg (rtx insn)
7099 {
7100   if (GET_CODE (SET_DEST (PATTERN (insn))) == REG)  /* A load.  */
7101     return SET_DEST(PATTERN(insn));
7102   if (GET_CODE (SET_SRC (PATTERN (insn))) == REG)  /* A store.  */
7103     return SET_SRC (PATTERN (insn));
7104   abort ();
7105 }
7106
7107 /* Don't handle ABNORMAL edges or jump tables.  */
7108
7109 static bool
7110 is_jump_table_basic_block (basic_block bb)
7111 {
7112   rtx insn = BB_END (bb);
7113
7114   if (GET_CODE (insn) == JUMP_INSN &&
7115       (GET_CODE (PATTERN (insn)) == ADDR_VEC
7116        || GET_CODE (PATTERN (insn)) == ADDR_DIFF_VEC))
7117     return true;
7118   return false;
7119 }
7120
7121 /* Return nonzero if the predecessors of BB are "well behaved".  */
7122
7123 static bool
7124 bb_has_well_behaved_predecessors (basic_block bb)
7125 {
7126   edge pred;
7127
7128   if (! bb->pred)
7129     return false;
7130   for (pred = bb->pred; pred != NULL; pred = pred->pred_next)
7131     if (((pred->flags & EDGE_ABNORMAL) && EDGE_CRITICAL_P (pred))
7132         || is_jump_table_basic_block (pred->src))
7133       return false;
7134   return true;
7135 }
7136
7137
7138 /* Search for the occurrences of expression in BB.  */
7139
7140 static struct occr*
7141 get_bb_avail_insn (basic_block bb, struct occr *occr)
7142 {
7143   for (; occr != NULL; occr = occr->next)
7144     if (BLOCK_FOR_INSN (occr->insn)->index == bb->index)
7145       return occr;
7146   return NULL;
7147 }
7148
7149 /* Perform partial GCSE pass after reload, try to eliminate redundant loads
7150    created by the reload pass. We try to look for a full or partial
7151    redundant loads fed by one or more loads/stores in predecessor BBs,
7152    and try adding loads to make them fully redundant. We also check if
7153    it's worth adding loads to be able to delete the redundant load.
7154
7155    Algorithm:
7156    1. Build available expressions hash table:
7157        For each load/store instruction, if the loaded/stored memory didn't
7158        change until the end of the basic block add this memory expression to
7159        the hash table.
7160    2. Perform Redundancy elimination:
7161       For each load instruction do the following:
7162          perform partial redundancy elimination, check if it's worth adding
7163          loads to make the load fully redundant. If so add loads and
7164          register copies and delete the load.
7165
7166    Future enhancement:
7167      if loaded register is used/defined between load and some store,
7168      look for some other free register between load and all its stores,
7169      and replace load with a copy from this register to the loaded
7170      register.  */
7171
7172
7173 /* This handles the case where several stores feed a partially redundant
7174    load. It checks if the redundancy elimination is possible and if it's
7175    worth it.  */
7176
7177 static void
7178 eliminate_partially_redundant_loads (basic_block bb, rtx insn,
7179                                      struct expr *expr)
7180 {
7181   edge pred;
7182   rtx avail_insn = NULL_RTX;
7183   rtx avail_reg;
7184   rtx dest, pat;
7185   struct occr *a_occr;
7186   struct unoccr *occr, *avail_occrs = NULL;
7187   struct unoccr *unoccr, *unavail_occrs = NULL;
7188   int npred_ok = 0;
7189   gcov_type ok_count = 0; /* Redundant load execution count.  */
7190   gcov_type critical_count = 0; /* Execution count of critical edges.  */
7191
7192   /* The execution count of the loads to be added to make the
7193      load fully redundant.  */
7194   gcov_type not_ok_count = 0;
7195   basic_block pred_bb;
7196
7197   pat = PATTERN (insn);
7198   dest = SET_DEST (pat);
7199   /* Check that the loaded register is not used, set, or killed from the
7200      beginning of the block.  */
7201   if (reg_used_between_after_reload_p (dest,
7202                                        PREV_INSN (BB_HEAD (bb)), insn)
7203       || reg_set_between_after_reload_p (dest,
7204                                          PREV_INSN (BB_HEAD (bb)), insn))
7205     return;
7206
7207   /* Check potential for replacing load with copy for predecessors.  */
7208   for (pred = bb->pred; pred; pred = pred->pred_next)
7209     {
7210       rtx next_pred_bb_end;
7211
7212       avail_insn = NULL_RTX;
7213       pred_bb = pred->src;
7214       next_pred_bb_end = NEXT_INSN (BB_END (pred_bb));
7215       for (a_occr = get_bb_avail_insn (pred_bb, expr->avail_occr); a_occr;
7216            a_occr = get_bb_avail_insn (pred_bb, a_occr->next))
7217         {
7218           /* Check if the loaded register is not used.  */
7219           avail_insn = a_occr->insn;
7220           if (! (avail_reg = get_avail_load_store_reg (avail_insn)))
7221             abort ();
7222           /* Make sure we can generate a move from register avail_reg to
7223              dest.  */
7224           extract_insn (gen_move_insn (copy_rtx (dest),
7225                                        copy_rtx (avail_reg)));
7226           if (! constrain_operands (1)
7227               || reg_killed_on_edge (avail_reg, pred)
7228               || reg_used_on_edge (dest, pred))
7229             {
7230               avail_insn = NULL;
7231               continue;
7232             }
7233           if (! reg_set_between_after_reload_p (avail_reg, avail_insn,
7234                                                 next_pred_bb_end))
7235             /* AVAIL_INSN remains non-null.  */
7236             break;
7237           else
7238             avail_insn = NULL;
7239         }
7240       if (avail_insn != NULL_RTX)
7241         {
7242           npred_ok++;
7243           ok_count += pred->count;
7244           if (EDGE_CRITICAL_P (pred))
7245             critical_count += pred->count;
7246           occr = gmalloc (sizeof (struct unoccr));
7247           occr->insn = avail_insn;
7248           occr->pred = pred;
7249           occr->next = avail_occrs;
7250           avail_occrs = occr;
7251         }
7252       else
7253         {
7254           not_ok_count += pred->count;
7255           if (EDGE_CRITICAL_P (pred))
7256             critical_count += pred->count;
7257           unoccr = gmalloc (sizeof (struct unoccr));
7258           unoccr->insn = NULL_RTX;
7259           unoccr->pred = pred;
7260           unoccr->next = unavail_occrs;
7261           unavail_occrs = unoccr;
7262         }
7263     }
7264
7265   if (npred_ok == 0    /* No load can be replaced by copy.  */
7266       || (optimize_size && npred_ok > 1)) /* Prevent exploding the code.  */
7267     goto cleanup;
7268
7269   /* Check if it's worth applying the partial redundancy elimination.  */
7270   if (ok_count < GCSE_AFTER_RELOAD_PARTIAL_FRACTION * not_ok_count)
7271     goto cleanup;
7272
7273   if (ok_count < GCSE_AFTER_RELOAD_CRITICAL_FRACTION * critical_count)
7274     goto cleanup;
7275
7276   /* Generate moves to the loaded register from where
7277      the memory is available.  */
7278   for (occr = avail_occrs; occr; occr = occr->next)
7279     {
7280       avail_insn = occr->insn;
7281       pred = occr->pred;
7282       /* Set avail_reg to be the register having the value of the
7283          memory.  */
7284       avail_reg = get_avail_load_store_reg (avail_insn);
7285       if (! avail_reg)
7286         abort ();
7287
7288       insert_insn_on_edge (gen_move_insn (copy_rtx (dest),
7289                                           copy_rtx (avail_reg)),
7290                            pred);
7291
7292       if (gcse_file)
7293         fprintf (gcse_file,
7294                  "GCSE AFTER reload generating move from %d to %d on \
7295                  edge from %d to %d\n",
7296                  REGNO (avail_reg),
7297                  REGNO (dest),
7298                  pred->src->index,
7299                  pred->dest->index);
7300     }
7301
7302   /* Regenerate loads where the memory is unavailable.  */
7303   for (unoccr = unavail_occrs; unoccr; unoccr = unoccr->next)
7304     {
7305       pred = unoccr->pred;
7306       insert_insn_on_edge (copy_insn (PATTERN (insn)), pred);
7307
7308       if (gcse_file)
7309         fprintf (gcse_file,
7310                  "GCSE AFTER reload: generating on edge from %d to %d\
7311                   a copy of load:\n",
7312                  pred->src->index,
7313                  pred->dest->index);
7314     }
7315
7316   /* Delete the insn if it is not available in this block and mark it
7317      for deletion if it is available. If insn is available it may help
7318      discover additional redundancies, so mark it for later deletion.*/
7319   for (a_occr = get_bb_avail_insn (bb, expr->avail_occr);
7320        a_occr && (a_occr->insn != insn);
7321        a_occr = get_bb_avail_insn (bb, a_occr->next));
7322
7323   if (!a_occr)
7324     delete_insn (insn);
7325   else
7326     a_occr->deleted_p = 1;
7327   
7328 cleanup:
7329
7330   while (unavail_occrs)
7331     {
7332       struct unoccr *temp = unavail_occrs->next;
7333       free (unavail_occrs);
7334       unavail_occrs = temp;
7335     }
7336
7337   while (avail_occrs)
7338     {
7339       struct unoccr *temp = avail_occrs->next;
7340       free (avail_occrs);
7341       avail_occrs = temp;
7342     }
7343 }
7344
7345 /* Performing the redundancy elimination as described before.  */
7346
7347 static void
7348 gcse_after_reload (void)
7349 {
7350   unsigned int i;
7351   rtx insn;
7352   basic_block bb;
7353   struct expr *expr;
7354   struct occr *occr;
7355
7356   /* Note we start at block 1.  */
7357
7358   if (ENTRY_BLOCK_PTR->next_bb == EXIT_BLOCK_PTR)
7359     return;
7360
7361   FOR_BB_BETWEEN (bb,
7362                   ENTRY_BLOCK_PTR->next_bb->next_bb,
7363                   EXIT_BLOCK_PTR,
7364                   next_bb)
7365     {
7366       if (! bb_has_well_behaved_predecessors (bb))
7367         continue;
7368
7369       /* Do not try this optimization on cold basic blocks.  */
7370       if (probably_cold_bb_p (bb))
7371         continue;
7372
7373       reset_opr_set_tables ();
7374
7375       for (insn = BB_HEAD (bb);
7376            insn != NULL
7377            && insn != NEXT_INSN (BB_END (bb));
7378            insn = NEXT_INSN (insn))
7379         {
7380           /* Is it a load - of the form (set (reg) (mem))?  */
7381           if (GET_CODE (insn) == INSN
7382               && GET_CODE (PATTERN (insn)) == SET
7383               && GET_CODE (SET_DEST (PATTERN (insn))) == REG
7384               && GET_CODE (SET_SRC (PATTERN (insn))) == MEM)
7385             {
7386               rtx pat = PATTERN (insn);
7387               rtx src = SET_SRC (pat);
7388               struct expr *expr;
7389
7390               if (general_operand (src, GET_MODE (src))
7391                   /* Is the expression recorded?  */
7392                   && (expr = lookup_expr (src, &expr_hash_table)) != NULL
7393                   /* Are the operands unchanged since the start of the
7394                      block?  */
7395                   && oprs_not_set_p (src, insn)
7396                   && ! MEM_VOLATILE_P (src)
7397                   && GET_MODE (src) != BLKmode
7398                   && !(flag_non_call_exceptions && may_trap_p (src))
7399                   && !side_effects_p (src))
7400                 {
7401                   /* We now have a load (insn) and an available memory at
7402                      its BB start (expr). Try to remove the loads if it is
7403                      redundant.  */
7404                   eliminate_partially_redundant_loads (bb, insn, expr);
7405                 }
7406             }
7407
7408             /* Keep track of everything modified by this insn.  */
7409             if (INSN_P (insn))
7410               mark_oprs_set (insn);
7411         }
7412     }
7413
7414   commit_edge_insertions ();
7415
7416   /* Go over the expression hash table and delete insns that were
7417      marked for later deletion.  */
7418   for (i = 0; i < expr_hash_table.size; i++)
7419     {
7420       for (expr = expr_hash_table.table[i];
7421            expr != NULL;
7422            expr = expr->next_same_hash)
7423         for (occr = expr->avail_occr; occr; occr = occr->next)
7424           if (occr->deleted_p)
7425             delete_insn (occr->insn);
7426     }
7427 }
7428
7429 /* Scan pattern PAT of INSN and add an entry to the hash TABLE.
7430    After reload we are interested in loads/stores only.  */
7431
7432 static void
7433 hash_scan_set_after_reload (rtx pat, rtx insn, struct hash_table *table)
7434 {
7435   rtx src = SET_SRC (pat);
7436   rtx dest = SET_DEST (pat);
7437
7438   if (GET_CODE (src) != MEM && GET_CODE (dest) != MEM)
7439     return;
7440
7441   if (GET_CODE (dest) == REG)
7442     {
7443       if (/* Don't GCSE something if we can't do a reg/reg copy.  */
7444           can_copy_p (GET_MODE (dest))
7445           /* GCSE commonly inserts instruction after the insn.  We can't
7446              do that easily for EH_REGION notes so disable GCSE on these
7447              for now.  */
7448           && ! find_reg_note (insn, REG_EH_REGION, NULL_RTX)
7449           /* Is SET_SRC something we want to gcse?  */
7450           && general_operand (src, GET_MODE (src))
7451           /* Don't CSE a nop.  */
7452           && ! set_noop_p (pat)
7453           && ! JUMP_P (insn))
7454         {
7455           /* An expression is not available if its operands are
7456              subsequently modified, including this insn.  */
7457           if (oprs_available_p (src, insn))
7458             insert_expr_in_table (src, GET_MODE (dest), insn, 0, 1, table);
7459         }
7460     }
7461   else if ((GET_CODE (src) == REG))
7462     {
7463       /* Only record sets of pseudo-regs in the hash table.  */
7464       if (/* Don't GCSE something if we can't do a reg/reg copy.  */
7465           can_copy_p (GET_MODE (src))
7466           /* GCSE commonly inserts instruction after the insn.  We can't
7467              do that easily for EH_REGION notes so disable GCSE on these
7468              for now.  */
7469           && ! find_reg_note (insn, REG_EH_REGION, NULL_RTX)
7470           /* Is SET_DEST something we want to gcse?  */
7471           && general_operand (dest, GET_MODE (dest))
7472           /* Don't CSE a nop.  */
7473           && ! set_noop_p (pat)
7474           &&! JUMP_P (insn)
7475           && ! (flag_float_store && FLOAT_MODE_P (GET_MODE (dest)))
7476           /* Check if the memory expression is killed after insn.  */
7477           && ! load_killed_in_block_p (BLOCK_FOR_INSN (insn),
7478                                        INSN_CUID (insn) + 1,
7479                                        dest,
7480                                        1)
7481           && oprs_unchanged_p (XEXP (dest, 0), insn, 1))
7482         {
7483           insert_expr_in_table (dest, GET_MODE (dest), insn, 0, 1, table);
7484         }
7485     }
7486 }
7487
7488
7489 /* Create hash table of memory expressions available at end of basic
7490    blocks.  */
7491
7492 static void
7493 compute_hash_table_after_reload (struct hash_table *table)
7494 {
7495   unsigned int i;
7496
7497   table->set_p = 0;
7498
7499   /* Initialize count of number of entries in hash table.  */
7500   table->n_elems = 0;
7501   memset ((char *) table->table, 0,
7502           table->size * sizeof (struct expr *));
7503
7504   /* While we compute the hash table we also compute a bit array of which
7505      registers are set in which blocks.  */
7506   sbitmap_vector_zero (reg_set_in_block, last_basic_block);
7507
7508   /* Re-cache any INSN_LIST nodes we have allocated.  */
7509   clear_modify_mem_tables ();
7510
7511   /* Some working arrays used to track first and last set in each block.  */
7512   reg_avail_info = gmalloc (max_gcse_regno * sizeof (struct reg_avail_info));
7513
7514   for (i = 0; i < max_gcse_regno; ++i)
7515     reg_avail_info[i].last_bb = NULL;
7516
7517   FOR_EACH_BB (current_bb)
7518     {
7519       rtx insn;
7520       unsigned int regno;
7521
7522       /* First pass over the instructions records information used to
7523          determine when registers and memory are first and last set.  */
7524       for (insn = BB_HEAD (current_bb);
7525            insn && insn != NEXT_INSN (BB_END (current_bb));
7526            insn = NEXT_INSN (insn))
7527         {
7528           if (! INSN_P (insn))
7529             continue;
7530
7531           if (GET_CODE (insn) == CALL_INSN)
7532             {
7533               bool clobbers_all = false;
7534
7535 #ifdef NON_SAVING_SETJMP
7536               if (NON_SAVING_SETJMP
7537                   && find_reg_note (insn, REG_SETJMP, NULL_RTX))
7538                 clobbers_all = true;
7539 #endif
7540
7541               for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
7542                 if (clobbers_all
7543                     || TEST_HARD_REG_BIT (regs_invalidated_by_call,
7544                                           regno))
7545                   record_last_reg_set_info (insn, regno);
7546
7547               mark_call (insn);
7548             }
7549
7550             note_stores (PATTERN (insn), record_last_set_info, insn);
7551
7552             if (GET_CODE (PATTERN (insn)) == SET)
7553               {
7554                 rtx src, dest;
7555
7556                 src = SET_SRC (PATTERN (insn));
7557                 dest = SET_DEST (PATTERN (insn));
7558                 if (GET_CODE (src) == MEM && auto_inc_p (XEXP (src, 0)))
7559                   {
7560                     regno = REGNO (XEXP (XEXP (src, 0), 0));
7561                     record_last_reg_set_info (insn, regno);
7562                   }
7563                 if (GET_CODE (dest) == MEM && auto_inc_p (XEXP (dest, 0)))
7564                   {
7565                     regno = REGNO (XEXP (XEXP (dest, 0), 0));
7566                     record_last_reg_set_info (insn, regno);
7567                   }
7568                 }
7569           }
7570
7571         /* The next pass builds the hash table.  */
7572         for (insn = BB_HEAD (current_bb);
7573              insn && insn != NEXT_INSN (BB_END (current_bb));
7574              insn = NEXT_INSN (insn))
7575           if (INSN_P (insn) && GET_CODE (PATTERN (insn)) == SET)
7576             if (! find_reg_note (insn, REG_LIBCALL, NULL_RTX))
7577               hash_scan_set_after_reload (PATTERN (insn), insn, table);
7578     }
7579
7580   free (reg_avail_info);
7581   reg_avail_info = NULL;
7582 }
7583
7584
7585 /* Main entry point of the GCSE after reload - clean some redundant loads
7586    due to spilling.  */
7587
7588 void
7589 gcse_after_reload_main (rtx f, FILE* file)
7590 {
7591   gcse_subst_count = 0;
7592   gcse_create_count = 0;
7593
7594   gcse_file = file;
7595
7596   gcc_obstack_init (&gcse_obstack);
7597   bytes_used = 0;
7598
7599   /* We need alias.  */
7600   init_alias_analysis ();
7601
7602   max_gcse_regno = max_reg_num ();
7603
7604   alloc_reg_set_mem (max_gcse_regno);
7605   alloc_gcse_mem (f);
7606   alloc_hash_table (max_cuid, &expr_hash_table, 0);
7607   compute_hash_table_after_reload (&expr_hash_table);
7608
7609   if (gcse_file)
7610     dump_hash_table (gcse_file, "Expression", &expr_hash_table);
7611
7612   if (expr_hash_table.n_elems > 0)
7613     gcse_after_reload ();
7614
7615   free_hash_table (&expr_hash_table);
7616
7617   free_gcse_mem ();
7618   free_reg_set_mem ();
7619
7620   /* We are finished with alias.  */
7621   end_alias_analysis ();
7622
7623   obstack_free (&gcse_obstack, NULL);
7624 }
7625
7626 #include "gt-gcse.h"