OSDN Git Service

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