OSDN Git Service

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