OSDN Git Service

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