OSDN Git Service

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