OSDN Git Service

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