OSDN Git Service

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