OSDN Git Service

02a179e08a02ad2cb2e4419b9b17d577c333d705
[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.  */