OSDN Git Service

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