OSDN Git Service

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