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