OSDN Git Service

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