OSDN Git Service

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