OSDN Git Service

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